1 #ifdef _WIN32
2 #include "windows.h"
3 #endif
4
5 #include "string.h"
6 #include "stdio.h"
7 #include "math.h"
8
9 #include "GL/gl.h"
10 #include "GL/glu.h"
11 #include "GL/glut.h"
12 #include "SDL/SDL.h"
13 #include "SDL/SDL_mixer.h"
14
15 #include "list.h"
16 #include "vector.h"
17 #include "cmc.h"
18 #include "3dobject.h"
19 #include "shadow3dobject.h"
20 #include "piece3dobject.h"
21 #include "myglutaux.h"
22 #include "nether.h"
23
24 #include "glprintf.h"
25
26
27 extern int frames_per_sec;
28 extern bool fullscreen;
29 extern int shadows;
30 extern bool sound;
31 extern int up_key,down_key,left_key,right_key,fire_key,pause_key;
32 extern int level;
33
34
save_game(char * filename)35 bool NETHER::save_game(char *filename)
36 {
37 int i,j;
38 FILE *fp;
39 BUILDING *b;
40 ROBOT *r;
41 BULLET *bul;
42 EXPLOSION *e;
43
44 fp=fopen(filename,"w");
45 if (fp==0) return false;
46
47 /*
48 int map_w,map_h;
49 int *map;
50 float lightpos[4];
51 Vector lightposv;
52 */
53
54 fprintf(fp,"%i %i\n",map_w,map_h);
55
56 for(i=0;i<map_h;i++) {
57 for(j=0;j<map_w;j++) {
58 fprintf(fp,"%i ",map[j+i*map_w]);
59 } /* for */
60 fprintf(fp,"\n");
61 } /* for */
62
63 fprintf(fp,"%.8f %.8f %.8f %.8f\n",lightpos[0],lightpos[1],lightpos[2],lightpos[3]);
64 lightposv.save(fp);
65
66 /*
67 Vector camera,viewp;
68 Vector shipp;
69 bool shiplanded;
70 int ship_op,ship_op2,ship_op3;
71 */
72
73 camera.save(fp);
74 viewp.save(fp);
75 shipp.save(fp);
76 if (shiplanded) fprintf(fp,"1\n");
77 else fprintf(fp,"0\n");
78
79 /*
80 List<BUILDING> buildings;
81 List<ROBOT> robots[2];
82 List<BULLET> bullets;
83 List<EXPLOSION> explosions;
84 */
85
86 fprintf(fp,"%i\n",buildings.Length());
87 buildings.Rewind();
88 while(buildings.Iterate(b)) {
89 /*
90 int type;
91 Vector pos;
92 int owner;
93 int status;
94 */
95 fprintf(fp,"%i %i %i\n",b->type,b->owner,b->status);
96 b->pos.save(fp);
97 } /* while */
98
99 for(i=0;i<2;i++) {
100 fprintf(fp,"%i\n",robots[i].Length());
101 robots[i].Rewind();
102 while(robots[i].Iterate(r)) {
103 /*
104 int traction;
105 bool pieces[5];
106 int program;
107 int program_parameter;
108 Vector program_goal;
109 int op;
110 bool shipover;
111 int firetimer;
112 int strength;
113 Vector pos;
114 int angle;
115 CMC cmc;
116 */
117 fprintf(fp,"%i\n",r->traction);
118 for(j=0;j<5;j++) {
119 if (r->pieces[j]) fprintf(fp,"1\n");
120 else fprintf(fp,"0\n");
121 } /* for */
122 fprintf(fp,"%i %i\n",r->program,r->program_parameter);
123 r->program_goal.save(fp);
124 fprintf(fp,"%i\n",r->op);
125 if (r->shipover) fprintf(fp,"1\n");
126 else fprintf(fp,"0\n");
127 fprintf(fp,"%i %i\n",r->firetimer,r->strength);
128 r->pos.save(fp);
129 fprintf(fp,"%i\n",r->angle);
130 r->cmc.save(fp);
131
132 fprintf(fp,"%i %i\n",r->electronics_state,r->chassis_state);
133 } /* while */
134 } /* for */
135
136 fprintf(fp,"%i\n",bullets.Length());
137
138 bullets.Rewind();
139 while(bullets.Iterate(bul)) {
140 /*
141 int type;
142 int step;
143 Vector pos;
144 int angle;
145 ROBOT *owner;
146 CMC cmc;
147 */
148 fprintf(fp,"%i %i %i\n",bul->type,bul->step,bul->angle);
149
150 bul->pos.save(fp);
151 i=robots[0].SearchObjRef(bul->owner);
152 if (i==-1) {
153 i=robots[1].SearchObjRef(bul->owner);
154 fprintf(fp,"1 %i\n",i);
155 } else {
156 fprintf(fp,"0 %i\n",i);
157 } /* if */
158
159 bul->cmc.save(fp);
160 } /* while */
161
162 fprintf(fp,"%i\n",explosions.Length());
163 explosions.Rewind();
164 while(explosions.Iterate(e)) {
165 /*
166 Vector pos;
167 int step;
168 int size;
169 */
170 e->pos.save(fp);
171 fprintf(fp,"%i %i\n",e->step,e->size);
172 } /* while */
173
174 /*
175 int day,hour,minute,second;
176 int resources[2][7];
177 ROBOT *controlled;
178 */
179
180 fprintf(fp,"%i %i %i %i\n",day,hour,minute,second);
181 for(i=0;i<2;i++) {
182 for(j=0;j<7;j++) {
183 fprintf(fp,"%i ",resources[i][j]);
184 } /* for */
185 fprintf(fp,"\n");
186 } /* for */
187 fprintf(fp,"%i\n",robots[0].SearchObjRef(controlled));
188
189 /*
190 int act_menu;
191 int act_button;
192 */
193 fprintf(fp,"%i %i\n",act_menu,act_button);
194
195 fclose(fp);
196 return true;
197 } /* NETHER::save_game */
198
199
load_game(char * filename)200 bool NETHER::load_game(char *filename)
201 {
202 int i,j,k,booltmp,length;
203 FILE *fp;
204 BUILDING *b;
205 ROBOT *r;
206 BULLET *bul;
207 EXPLOSION *e;
208
209 fp=fopen(filename,"r");
210 if (fp==0) return false;
211
212 /*
213 int map_w,map_h;
214 int *map;
215 float lightpos[4];
216 Vector lightposv;
217 */
218
219 AI_deleteprecomputations();
220 if (2!=fscanf(fp,"%i %i",&map_w,&map_h)) return false;
221
222 explosions.Delete();
223 buildings.Delete();
224 for(i=0;i<2;i++) robots[i].Delete();
225 bullets.Delete();
226 delete map;
227 map=new int[map_w*map_h];
228 for(i=0;i<map_h;i++) {
229 for(j=0;j<map_w;j++) {
230 if (1!=fscanf(fp,"%i",&(map[j+i*map_w]))) return false;
231 } /* for */
232 } /* for */
233 if (4!=fscanf(fp,"%f %f %f %f",&(lightpos[0]),&(lightpos[1]),&(lightpos[2]),&(lightpos[3]))) return false;
234 lightposv.load(fp);
235
236 /*
237 Vector camera,viewp;
238 Vector shipp;
239 bool shiplanded;
240 int ship_op,ship_op2,ship_op3;
241 */
242
243 if (!camera.load(fp) ||
244 !viewp.load(fp) ||
245 !shipp.load(fp)) return false;
246 if (1!=fscanf(fp,"%i",&booltmp)) return false;
247 if (booltmp==1) shiplanded=true;
248 else shiplanded=false;
249
250 /*
251 List<BUILDING> buildings;
252 List<ROBOT> robots[2];
253 List<BULLET> bullets;
254 List<EXPLOSION> explosions;
255 */
256
257 if (1!=fscanf(fp,"%i",&length)) return false;
258 for(k=0;k<length;k++) {
259 /*
260 int type;
261 Vector pos;
262 int owner;
263 int status;
264 */
265 b=new BUILDING();
266 if (3!=fscanf(fp,"%i %i %i",&b->type,&b->owner,&b->status)) return false;
267 if (!b->pos.load(fp)) return false;
268 buildings.Add(b);
269 } /* for */
270
271 for(i=0;i<2;i++) {
272
273 if (1!=fscanf(fp,"%i",&length)) return false;
274 for(k=0;k<length;k++) {
275 /*
276 int traction;
277 bool pieces[5];
278 int program;
279 int program_parameter;
280 Vector program_goal;
281 int op;
282 bool shipover;
283 int firetimer;
284 int strength;
285 Vector pos;
286 int angle;
287 CMC cmc;
288 */
289 r=new ROBOT();
290 if (1!=fscanf(fp,"%i",&r->traction)) return false;
291 for(j=0;j<5;j++) {
292 if (1!=fscanf(fp,"%i",&booltmp)) return false;
293 if (booltmp==1) r->pieces[j]=true;
294 else r->pieces[j]=false;
295 } /* for */
296 if (2!=fscanf(fp,"%i %i",&r->program,&r->program_parameter)) return false;
297 r->program_goal.load(fp);
298 if (1!=fscanf(fp,"%i\n",&r->op)) return false;
299 if (1!=fscanf(fp,"%i",&booltmp)) return false;
300 if (booltmp==1) r->shipover=true;
301 else r->shipover=false;
302 if (2!=fscanf(fp,"%i %i",&r->firetimer,&r->strength)) return false;
303 r->pos.load(fp);
304 if (1!=fscanf(fp,"%i",&r->angle)) return false;
305 r->cmc.load(fp);
306
307 if (2!=fscanf(fp,"%i %i",&r->electronics_state,&r->chassis_state)) return false;
308
309 robots[i].Add(r);
310 } /* for */
311 } /* for */
312
313 if (1!=fscanf(fp,"%i",&length)) return false;
314 for(k=0;k<length;k++) {
315 /*
316 int type;
317 int step;
318 Vector pos;
319 int angle;
320 ROBOT *owner;
321 CMC cmc;
322 */
323 bul=new BULLET();
324 if (3!=fscanf(fp,"%i %i %i",&bul->type,&bul->step,&bul->angle)) return false;
325
326 bul->pos.load(fp);
327 if (2!=fscanf(fp,"%i %i",&j,&i)) return false;
328 if (i>=0) bul->owner=robots[j][i];
329 else bul->owner=0;
330 bul->cmc.load(fp);
331 bullets.Add(bul);
332 } /* while */
333
334 if (1!=fscanf(fp,"%i",&length)) return false;
335 for(k=0;k<length;k++) {
336 /*
337 Vector pos;
338 int step;
339 int size;
340 */
341 e=new EXPLOSION();
342
343 e->pos.load(fp);
344 if (2!=fscanf(fp,"%i %i",&e->step,&e->size)) return false;
345 explosions.Add(e);
346 } /* while */
347
348 /*
349 int day,hour,minute,second;
350 int resources[2][7];
351 ROBOT *controlled;
352 */
353
354 if (4!=fscanf(fp,"%i %i %i %i",&day,&hour,&minute,&second)) return false;
355 for(i=0;i<2;i++) {
356 for(j=0;j<7;j++) {
357 if (1!=fscanf(fp,"%i",&(resources[i][j]))) return false;
358 } /* for */
359 } /* for */
360 if (1!=fscanf(fp,"%i",&i)) return false;
361 if (i>=0) controlled=robots[0][i];
362 else controlled=0;
363
364 /*
365 int act_menu;
366 int act_button;
367 */
368 if (2!=fscanf(fp,"%i %i",&act_menu,&act_button)) return false;
369
370 fclose(fp);
371 AI_precomputations();
372 return true;
373 } /* NETHER::load_game */
374