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