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