1 // Untahris (Common Playground)
2 // copyright (C) 2006 longuens@users.sourceforge.net
3 // Released under GNU General Public License (see the file COPYING)
4 // --------------------------------------------------------------
5 // Main file.
6 
7 #include <unistd.h>
8 #include <time.h>
9 
10 #include "untahris.h"
11 
12 char *configfile = ".untahris.config";
13 
14 #include "tools.cpp"
15 #include "intface.cpp"
16 #include "net.cpp"
17 
18 #undef main
19 
20 #include "bullet.cpp"
21 #include "castle.cpp"
22 #include "thrust.cpp"
23 #include "ball.cpp"
24 #include "snake.cpp"
25 #include "tetris.cpp"
26 #include "bomber.cpp"
27 #include "worm.cpp"
28 #include "xunux.cpp"
29 
30 #include "player.cpp"
31 #include "pground.cpp"
32 
defaultConfig()33 void defaultConfig() {
34   lps.clear();
35   c.server = "localhost";
36   c.mapname = "saved";
37   c.pctX  = 100;
38   c.pctY  = 100;
39   c.scorelines = 3;
40   c.res   = 16;
41   c.resX  = 800;
42   c.resY  = 600;
43   c.port  = 5790;
44 
45   c.initialWorld = 0;
46   c.initBonus = 2;
47   c.background = bgGradient;
48   c.graphicsType = gtGradient;
49 
50   c.fs    = false;
51   c.centered = false;
52 
53   TLocalPlayer lp;
54   lp.color = randColor();
55   lp.keys[int(keyLeft )] = 'o';
56   lp.keys[int(keyRight)] = 'p';
57   lp.keys[int(keyUp   )] = 'q';
58   lp.keys[int(keyDown )] = 'a';
59   lp.keys[int(keyFire )] = ' ';
60   lp.keys[int(keyEarth)] = '1';
61   lp.keys[int(keyAir  )] = '2';
62   lp.keys[int(keyWater)] = '3';
63   lps.push_back(lp);
64 
65   TLocalPlayer lq;
66   lq.color = randColor();
67   lq.keys[int(keyLeft )] = SDLK_LEFT;
68   lq.keys[int(keyRight)] = SDLK_RIGHT;
69   lq.keys[int(keyUp   )] = SDLK_UP;
70   lq.keys[int(keyDown )] = SDLK_DOWN;
71   lq.keys[int(keyFire )] = SDLK_RETURN;
72   lq.keys[int(keyEarth)] = SDLK_INSERT;
73   lq.keys[int(keyAir  )] = SDLK_HOME;
74   lq.keys[int(keyWater)] = SDLK_PAGEUP;
75   lps.push_back(lq);
76 
77   for(int et=0; et<9; et++) {
78     gc.ec[et].initSpeed    = 200;
79     gc.ec[et].speedBonus   = 10;
80     gc.ec[et].maxSpeed     = 999;
81     gc.ec[et].initAmmo     = 10;
82     gc.ec[et].bonusAmmo    = 10;
83     gc.ec[et].ammoPerShoot = 2;
84     }
85 
86   gc.ec[tnSNAKE].ammoPerShoot = 5;
87   gc.ec[tnUTRON].ammoPerShoot = 5;
88   gc.ec[tnXUNUX].ammoPerShoot = 5;
89   gc.ec[tnPAD].ammoPerShoot = 2;
90   gc.ec[tnCASTLE].ammoPerShoot = 5;
91   gc.ec[tnCASTLE].speedBonus = 100;
92   gc.ec[tnCASTLE].bonusAmmo = 1;
93   gc.ec[tnXUNUX].initSpeed = 100;
94   gc.ec[tnXUNUX].speedBonus = 5;
95   gc.ec[tnBOMBER].ammoPerShoot = 10;
96   gc.ec[tnUTETRIS].speedBonus = 1;
97 
98   gc.ballSpeed = 7;
99 
100   gc.bombInitRange = 1;
101   gc.bombBonusRange = 1;
102 
103   gc.castleInitEnergy = 1000;
104   gc.castleRotSpeed = 10;
105   gc.castleRegenSpeed = 25;
106   gc.castlePowerBase = 500;
107   gc.ammoPerCannon = 50;
108 
109   gc.utetrisMinLength = 15;
110 
111   gc.initFuel = 5000;
112   gc.bonusFuel = 1000;
113   gc.thrustAcc = 50;
114   gc.fuelUseSpeed = 20;
115 
116   gc.wormFlySpeed = 12;
117   gc.wormWalkSpeed = 24;
118   gc.ninjaRopeLength = 40;
119   gc.ninjaPullSpeed = 18;
120 
121   gc.ballsTakeBonuses = true;
122   gc.regenerateLevel = gc.regenerateScore = gc.regenerateAmmo = gc.regenerateDestroyed = true;
123 
124   gc.bulletsKillBalls = gc.cannonsKillBalls = gc.explosionsDestroyBalls = false;
125 
126   gc.ballsDestroyXunux = gc.ballsDestroyWalls = true;
127 
128   gc.xunuxKillsSnake = gc.xunuxKillsThruster = gc.xunuxKillsXunux = false;
129 
130   gc.xunuxAttacksXunux = true;
131   }
132 
133 FILE *cfgfile;
134 
135 bool saving;
136 
137 string currmsg, currval;
138 
139 int lpid = 0;
140 
save(char * msg,int & i)141 void save(char *msg, int& i) {
142   if(saving) fprintf(cfgfile, "%s=%d\n", msg, i);
143   else if(currmsg == msg) i = atoi(currval.c_str());
144   }
145 
save(char * msg,int32 & i)146 void save(char *msg, int32& i) {
147   if(saving) fprintf(cfgfile, "%s=%d\n", msg, i);
148   else if(currmsg == msg) i = atoi(currval.c_str());
149   }
150 
save(char * msg,TEntityConfig & ec)151 void save(char *msg, TEntityConfig& ec) {
152   if(saving)
153     fprintf(cfgfile, "%s=%d %d %d %d %d %d\n", msg, ec.initSpeed, ec.speedBonus, ec.maxSpeed, ec.initAmmo, ec.bonusAmmo, ec.ammoPerShoot);
154   else if(currmsg == msg)
155     sscanf(currval.c_str(), "%d%d%d%d%d%d", &ec.initSpeed, &ec.speedBonus, &ec.maxSpeed, &ec.initAmmo, &ec.bonusAmmo, &ec.ammoPerShoot);
156   }
157 
save(char * msg,bool & b)158 void save(char *msg, bool& b) {
159   if(saving) fprintf(cfgfile, "%s=%s\n", msg, b ? "yes" : "no");
160   else if(currmsg == msg) b = currval.size() && (currval[0] & 1);
161   }
162 
saveHex(char * msg,int & i)163 void saveHex(char *msg, int& i) {
164   if(saving) fprintf(cfgfile, "%s=%06x\n", msg, i);
165   else if(currmsg == msg) sscanf(currval.c_str(), "%x", &i);
166   }
167 
save(char * msg,string & s)168 void save(char *msg, string& s) {
169   if(saving) fprintf(cfgfile, "%s=%s\n", msg, s.c_str());
170   else if(currmsg == msg) s = currval;
171   }
172 
eline()173 void eline() { if(saving) fprintf(cfgfile, "\n"); }
174 
cmt(char * cmt)175 void cmt(char *cmt) { if(saving) fprintf(cfgfile, "# %s\n", cmt); }
176 
saveloadConfig()177 void saveloadConfig() {
178   cmt("Untahris Common Playground 3.1 configuration file");
179   eline();
180 
181   cmt("Network settings");
182   save("gametype", (int&) c.gt);
183   save("server", c.server);
184   save("port", c.port);
185   eline();
186 
187   cmt("Screen settings");
188   save("resx", c.resX);
189   save("resy", c.resY);
190   save("fullscreen", c.fs);
191   save("resolution", c.res);
192   save("pctx", c.pctX);
193   save("pcty", c.pctY);
194   save("scorelines", c.scorelines);
195   eline();
196 
197   cmt("Map settings");
198   save("initial world", c.initialWorld);
199   save("mapname", c.mapname);
200   save("initial bonuses", c.initBonus);
201   save("background", c.background);
202   save("graphics type", c.graphicsType);
203   eline();
204 
205   cmt("For each player type: init speed, speed bonus, max speed bonuses, init ammo, bonus ammo, ammo per shoot");
206   for(int i=0; i<9; i++)
207     save(charnames[i], gc.ec[i]);
208   eline();
209 
210   cmt("Other game variables");
211   save("thruster initFuel", gc.initFuel);
212   save("thruster bonusFuel", gc.bonusFuel);
213   save("thruster acceleration", gc.thrustAcc);
214   save("thruster fuel usage", gc.fuelUseSpeed);
215   save("bomber initRange", gc.bombInitRange);
216   save("bomber bonusRange", gc.bombBonusRange);
217   save("utetris minLength", gc.utetrisMinLength);
218   save("castle initEnergy", gc.castleInitEnergy);
219   save("castle rotSpeed", gc.castleRotSpeed);
220   save("castle regeneration", gc.castleRegenSpeed);
221   save("castle power per bonus", gc.castlePowerBase);
222   save("castle ammo per cannon", gc.ammoPerCannon);
223   save("worm fly speed", gc.wormFlySpeed);
224   save("worm walk speed", gc.wormWalkSpeed);
225   save("worm ninja rope length", gc.ninjaRopeLength);
226   save("worm ninja rope pull speed", gc.ninjaPullSpeed);
227 
228   save("ball speed", gc.ballSpeed);
229 
230   save("regenerate level", gc.regenerateLevel);
231   save("regenerate score", gc.regenerateScore);
232   save("regenerate ammo", gc.regenerateAmmo);
233   save("regenerate destroyed by bombs", gc.regenerateDestroyed);
234   save("balls killed by bullets", gc.bulletsKillBalls);
235   save("balls killed by cannons", gc.cannonsKillBalls);
236   save("balls killed by explosions", gc.explosionsDestroyBalls);
237   save("balls destroy xunux walls", gc.ballsDestroyXunux);
238   save("balls destroy other walls", gc.ballsDestroyWalls);
239   save("balls take bonuses", gc.ballsTakeBonuses);
240 
241   save("unstable xunux kills snake/tron", gc.xunuxKillsSnake);
242   save("unstable xunux kills thruster", gc.xunuxKillsThruster);
243   save("unstable xunux kills xunux", gc.xunuxKillsXunux);
244   save("xunux may attack xunux", gc.xunuxAttacksXunux);
245   eline();
246 
247   for(int i=0; i<size(lps); i++) {
248     if(saving) lpid = i;
249 
250     lpid++;
251     save("player", lpid);
252     if(!saving && currmsg == "player") lps.resize(lpid);
253     lpid--;
254 
255     saveHex("color", lps[lpid].color);
256     save("keyUp", lps[lpid].keys[0]);
257     save("keyRight", lps[lpid].keys[1]);
258     save("keyDown", lps[lpid].keys[2]);
259     save("keyLeft", lps[lpid].keys[3]);
260     save("keyFire", lps[lpid].keys[4]);
261     save("keyEarth", lps[lpid].keys[5]);
262     save("keyAir", lps[lpid].keys[6]);
263     save("keyWater", lps[lpid].keys[7]);
264     eline();
265 
266     if(!saving) break;
267     }
268   }
269 
saveConfig()270 void saveConfig() {
271   cfgfile = fopen(configfile, "wt");
272   if(!cfgfile) return;
273   saving = true;
274   saveloadConfig();
275   fclose(cfgfile);
276   }
277 
loadConfig()278 void loadConfig() {
279   defaultConfig();
280   FILE *cfgfile = fopen(configfile, "rt");
281   if(!cfgfile) return;
282   saving = false;
283 
284   string s;
285   while((s = readStr(cfgfile)) != "") {
286     if(s[0] == '#') continue;
287     int pos = s.find("=");
288     currmsg = s.substr(0, pos);
289     currval = s.substr(pos+1);
290 
291     saveloadConfig();
292     }
293   fclose(cfgfile);
294   }
295 
main(int argc,char ** argv)296 int main(int argc, char **argv) {
297   chdir(getenv("HOME"));
298 
299   g.sizeX = 0;
300   g.sizeY = 0;
301   d.ofsX = 0;
302   d.ofsY = 0;
303   d.Res = 16;
304   if(argc == 2) configfile = argv[1];
305   initDegs();
306 
307   printf("Untahris (Common Playground) v3.1\n");
308   printf("copyright (C) 2006, 2007, 2009 longuens@users.sourceforge.net\n");
309   printf("Released under GNU General Public License (see the file COPYING)\n");
310 
311   try {
312     srand(time(NULL));
313     loadConfig();
314 
315     d.init();
316 
317     printf("Running.\n");
318     checkConfig();
319     d.menuLoop();
320 
321     saveConfig();
322     }
323   catch(TException e) {
324     printf("Exception catched\n");
325     printf("%s/%d/%s\n", e.msg.c_str(), e.data, e.ds.c_str());
326     }
327   }
328