1 #ifdef _WIN32
2 #include "windows.h"
3 #endif
4 
5 #include "stdio.h"
6 #include "string.h"
7 
8 #include "GL/gl.h"
9 #include "GL/glu.h"
10 #include "SDL/SDL.h"
11 #include "SDL/SDL_mixer.h"
12 
13 #include "list.h"
14 #include "vector.h"
15 #include "cmc.h"
16 #include "3dobject.h"
17 #include "shadow3dobject.h"
18 #include "piece3dobject.h"
19 #include "nether.h"
20 
21 #include "glprintf.h"
22 
23 extern int detaillevel;
24 extern float MINY,MAXY,MINX,MAXX;
25 
26 
loadmap(char * file)27 bool NETHER::loadmap(char *file)
28 {
29 	FILE *fp;
30 	int i;
31 
32 	fp=fopen(file,"r");
33 	if (fp==0) return false;
34 
35 	if (2!=fscanf(fp,"%i %i",&map_w,&map_h)) {
36 		fclose(fp);
37 		return false;
38 	} /* if */
39 	map=new int[map_w*map_h];
40 	if (map==0) {
41 		fclose(fp);
42 		return false;
43 	} /* if */
44 
45 	for(i=0;i<map_w*map_h;i++) {
46 		int tile;
47 		char tilestr[16];
48 		char *tiles[]={"G","S","S2","M","H1",
49 			           "H2","H3","H4","H5","H6",
50 					   "GG","SS","MM","?"};
51 		bool found;
52 
53 		if (1!=fscanf(fp,"%s",tilestr)) {
54 			fclose(fp);
55 			return false;
56 		} /* if */
57 
58 		tile=0;
59 		found=false;
60 		while(!found && tiles[tile][0]!='?') {
61 			if (strcmp(tiles[tile],tilestr)==0) found=true;
62 			if (!found) tile++;
63 		} /* while */
64 		if (tile==10) tile=0;
65 		if (tile==11) tile=1;
66 		if (tile==12) tile=3;
67 
68 		map[i]=tile;
69 	} /* for */
70 
71 	{
72 		char tmp[80];
73 
74 		while(1==fscanf(fp,"%s",tmp)) {
75 			BUILDING *b;
76 			float x,y;
77 
78 			if (strcmp(tmp,"fence")==0) {
79 				if (2!=fscanf(fp,"%f %f",&x,&y)) {
80 					fclose(fp);
81 					return false;
82 				} /* if */
83 				b=new BUILDING();
84 				b->pos.x=x;
85 				b->pos.y=y;
86 				b->pos.z=0;
87 				b->type=B_FENCE;
88 				b->owner=0;
89 				b->status=0;
90 				buildings.Add(b);
91 			} /* if */
92 			if (strcmp(tmp,"wall1")==0) {
93 				if (2!=fscanf(fp,"%f %f",&x,&y)) {
94 					fclose(fp);
95 					return false;
96 				} /* if */
97 				b=new BUILDING();
98 				b->pos.x=x;
99 				b->pos.y=y;
100 				b->pos.z=0;
101 				b->type=B_WALL1;
102 				b->owner=0;
103 				b->status=0;
104 				buildings.Add(b);
105 			} /* if */
106 			if (strcmp(tmp,"wall2")==0) {
107 				if (2!=fscanf(fp,"%f %f",&x,&y)) {
108 					fclose(fp);
109 					return false;
110 				} /* if */
111 				b=new BUILDING();
112 				b->pos.x=x;
113 				b->pos.y=y;
114 				b->pos.z=0;
115 				b->type=B_WALL2;
116 				b->owner=0;
117 				b->status=0;
118 				buildings.Add(b);
119 			} /* if */
120 			if (strcmp(tmp,"wall3")==0) {
121 				if (2!=fscanf(fp,"%f %f",&x,&y)) {
122 					fclose(fp);
123 					return false;
124 				} /* if */
125 				b=new BUILDING();
126 				b->pos.x=x;
127 				b->pos.y=y;
128 				b->pos.z=0;
129 				b->type=B_WALL3;
130 				b->owner=0;
131 				b->status=0;
132 				buildings.Add(b);
133 			} /* if */
134 			if (strcmp(tmp,"wall4")==0) {
135 				if (2!=fscanf(fp,"%f %f",&x,&y)) {
136 					fclose(fp);
137 					return false;
138 				} /* if */
139 				b=new BUILDING();
140 				b->pos.x=x;
141 				b->pos.y=y;
142 				b->pos.z=0;
143 				b->type=B_WALL4;
144 				b->owner=0;
145 				b->status=0;
146 				buildings.Add(b);
147 			} /* if */
148 			if (strcmp(tmp,"wall6")==0) {
149 				if (2!=fscanf(fp,"%f %f",&x,&y)) {
150 					fclose(fp);
151 					return false;
152 				} /* if */
153 				b=new BUILDING();
154 				b->pos.x=x;
155 				b->pos.y=y;
156 				b->pos.z=0;
157 				b->type=B_WALL6;
158 				b->owner=0;
159 				b->status=0;
160 				buildings.Add(b);
161 			} /* if */
162 			if (strcmp(tmp,"factory")==0) {
163 				char tmp2[80];
164 				int obj[4]={B_WALL4,B_WALL4,B_WALL2,B_WALL2},i;
165 				float xo[4]={0,0,1,1};
166 				float yo[4]={0,2,0,2};
167 
168 				if (3!=fscanf(fp,"%f %f %s",&x,&y,tmp2)) {
169 					fclose(fp);
170 					return false;
171 				} /* if */
172 
173 				for(i=0;i<4;i++) {
174 					b=new BUILDING();
175 					b->pos.x=x+xo[i];
176 					b->pos.y=y+yo[i];
177 					b->pos.z=0;
178 					b->type=obj[i];
179 					b->owner=0;
180 					b->status=0;
181 					buildings.Add(b);
182 				} /* for */
183 
184 				b=new BUILDING();
185 				b->pos.x=x;
186 				b->pos.y=y+1;
187 				b->pos.z=0;
188 				b->type=B_FACTORY_ELECTRONICS;
189 				b->owner=0;
190 				b->status=0;
191 				if (strcmp(tmp2,"electronics")==0) b->type=B_FACTORY_ELECTRONICS;
192 				if (strcmp(tmp2,"nuclear")==0) b->type=B_FACTORY_NUCLEAR;
193 				if (strcmp(tmp2,"phasers")==0) b->type=B_FACTORY_PHASERS;
194 				if (strcmp(tmp2,"missiles")==0) b->type=B_FACTORY_MISSILES;
195 				if (strcmp(tmp2,"cannons")==0) b->type=B_FACTORY_CANNONS;
196 				if (strcmp(tmp2,"chassis")==0) b->type=B_FACTORY_CHASSIS;
197 				buildings.Add(b);
198 			} /* if */
199 			if (strcmp(tmp,"warbase")==0) {
200 				int obj[15]={B_WALL4,B_WALL5,
201 							 B_WALL4,B_WALL1,B_WALL1,B_WALL2,
202 							 B_WALL4,B_WARBASE,B_WALL2,
203 							 B_WALL4,B_WALL1,B_WALL1,B_WALL2,
204 							 B_WALL4,B_WALL5},i;
205 				float xo[15]={0.5,1.5,
206 						 	  0,1,2,3,
207 							  0.5,1.5,2.5,
208 							  0,1,2,3,
209 							  0.5,1.5};
210 				float yo[15]={0,0,
211 							  1,1,1,1,
212 							  2,2,2,
213 							  3,3,3,3,
214 							  4,4};
215 				int o=0;
216 
217 				if (3!=fscanf(fp,"%f %f %i",&x,&y,&o)) {
218 					fclose(fp);
219 					return false;
220 				} /* if */
221 
222 				for(i=0;i<15;i++) {
223 					b=new BUILDING();
224 					b->pos.x=x+xo[i];
225 					b->pos.y=y+yo[i];
226 					b->pos.z=0;
227 					b->type=obj[i];
228 					b->owner=o;
229 					b->status=0;
230 					buildings.Add(b);
231 				} /* for */
232 			} /* if */
233 		} /* while */
234 	}
235 
236 	fclose(fp);
237 	return true;
238 } /* NETHER::loadmap */
239 
240 
drawmap(bool shadows)241 void NETHER::drawmap(bool shadows)
242 {
243 	int i,j;
244 	int o,m[8]={13,15,17,19,7,23,21,25};
245 	List<BUILDING> l;
246 	BUILDING *b;
247 	Vector light;
248 
249 	light.x=lightpos[0];
250 	light.y=lightpos[1];
251 	light.z=lightpos[2];
252 	light=light/light.z;
253 
254 	glMatrixMode(GL_MODELVIEW);
255 
256 	if (!shadows) {
257 		glPushMatrix();
258 		for(j=0;j<map_h;j++) {
259 			if (j>=(viewp.y+MINY) &&
260 				j<=(viewp.y+MAXY)) {
261 				glPushMatrix();
262 				for(i=0;i<map_w;i++) {
263 					if (i>=(viewp.x+MINX) &&
264 						i<=(viewp.x+MAXX)) {
265 						o=map[i+j*map_w];
266 
267 						if (o==0) {
268 							/* GRASS: */
269 							if (((i*3+j*7)%m[(i+j)%8])==0) o=10;
270 							if (((i*3+j*7)%m[(i+j+1)%8])==0) o=11;
271 						} else {
272 						} /* if */
273 						if (detaillevel>=1) tile[o]->draw(tile_r[o],tile_g[o],tile_b[o]);
274 									    else tile[o]->draw_notexture(tile_r[o],tile_g[o],tile_b[o]);
275 					} /* if */
276 					glTranslatef(1.0,0.0,0.0);
277 				} /* for */
278 				glPopMatrix();
279 			} /* if */
280 			glTranslatef(0.0,1.0,0.0);
281 		} /* for */
282 		glPopMatrix();
283 	} /* if */
284 
285 	l.Instance(buildings);
286 	l.Rewind();
287 	while(l.Iterate(b)) {
288 
289 		if (b->pos.y>=(viewp.y+MINY) &&
290 			b->pos.y<=(viewp.y+MAXY) &&
291 			b->pos.x>=(viewp.x+MINX) &&
292 			b->pos.x<=(viewp.x+MAXX)) {
293 			glPushMatrix();
294 			glTranslatef(float(b->pos.x),float(b->pos.y),float(b->pos.z));
295 			switch(b->type) {
296 			case B_FENCE:if (!shadows) {
297 							if (detaillevel>=2) building_tile[5]->draw(0.2f,0.2f,0.2f);
298 											else building_tile[5]->draw_notexture(0.2f,0.2f,0.2f);
299 						 } else {
300 							 glTranslatef(0,0,0.05f);
301 							 building_tile[5]->DrawShadow(0,0,0,0.5);
302 						 } /* if */
303 						 break;
304 			case B_WALL1:if (!shadows) {
305 							if (detaillevel>=2) building_tile[0]->draw(0.5,0.5,0.5);
306 											else building_tile[0]->draw_notexture(0.5,0.5,0.5);
307 						 } else {
308 							 glTranslatef(0,0,0.05f);
309 							 building_tile[0]->DrawShadow(0,0,0,0.5);
310 						 } /* if */
311 						 break;
312 			case B_WALL2:if (!shadows) {
313 							if (detaillevel>=2) building_tile[1]->draw(0.5,0.5,0.5);
314 											else building_tile[1]->draw_notexture(0.5,0.5,0.5);
315 						 } else {
316 							 glTranslatef(0,0,0.05f);
317 							 building_tile[1]->DrawShadow(0,0,0,0.5);
318 						 } /* if */
319 						 break;
320 			case B_WALL3:if (!shadows) {
321 							if (detaillevel>=2) building_tile[2]->draw(0.3f,0.3f,0.3f);
322 											else building_tile[2]->draw_notexture(0.5,0.5,0.5);
323 						 } else {
324 							 glTranslatef(0,0,0.05f);
325 							 building_tile[2]->DrawShadow(0,0,0,0.5);
326 						 } /* if */
327 						 break;
328 			case B_WALL4:if (!shadows) {
329 							if (detaillevel>=2) building_tile[3]->draw(0.5,0.5,0.5);
330 											else building_tile[3]->draw_notexture(0.5,0.5,0.5);
331 						 } else {
332 							 glTranslatef(0,0,0.05f);
333 							 building_tile[3]->DrawShadow(0,0,0,0.5);
334 						 } /* if */
335 						 break;
336 			case B_WALL5:if (!shadows) {
337 							if (detaillevel>=2) building_tile[4]->draw(0.5,0.5,0.5);
338 											else building_tile[4]->draw_notexture(0.5,0.5,0.5);
339 						 } else {
340 							 glTranslatef(0,0,0.05f);
341 							 building_tile[4]->DrawShadow(0,0,0,0.5);
342 						 } /* if */
343 						 break;
344 			case B_WALL6:if (!shadows) {
345 							if (detaillevel>=2) building_tile[7]->draw(0.3f,0.3f,0.3f);
346 											else building_tile[7]->draw_notexture(0.5,0.5,0.5);
347 						 } else {
348 							 glTranslatef(0,0,0.05f);
349 							 building_tile[7]->DrawShadow(0,0,0,0.5);
350 						 } /* if */
351 						 break;
352 			case B_FACTORY_ELECTRONICS:
353 						 if (!shadows) {
354 							 if (detaillevel>=2) building_tile[4]->draw(0.5,0.5,0.5);
355 											 else building_tile[4]->draw_notexture(0.5,0.5,0.5);
356 							 glPushMatrix();
357 							 glTranslatef(0.5,0.5,1);
358 							 piece_tile[0][7]->draw_notexture(0.8f,0.8f,0.8f);
359 							 glPopMatrix();
360 						 } else {
361 							 glPushMatrix();
362 							 glTranslatef(0,0,0.05f);
363 							 building_tile[4]->DrawShadow(0,0,0,0.5);
364 							 glTranslatef(float(-light.x),float(-light.y),0);
365 							 piece_tile[0][7]->DrawShadow(0,lightposv,0,0,0,0.5);
366 							 glPopMatrix();
367 						 } /* if */
368 
369 						 if (b->owner==1) {
370 							if (!shadows) {
371 								glTranslatef(0,-1,1);
372 								building_tile[6]->draw(0.3f,0.3f,0.8f);
373 							} else {
374 								glTranslatef(float(-light.x),float(-light.y)-1,0.05f);
375 								building_tile[6]->DrawShadow(0,0,0,0.5);
376 							} /* if */
377 						 } /* if */
378 						 if (b->owner==2) {
379 							if (!shadows) {
380 								glTranslatef(0,-1,1);
381 								building_tile[6]->draw(0.8f,0.3f,0.3f);
382 							} else {
383 								glTranslatef(float(-light.x),float(-light.y)-1,0.05f);
384 								building_tile[6]->DrawShadow(0,0,0,0.5);
385 							} /* if */
386 						 } /* if */
387 						 break;
388 			case B_FACTORY_NUCLEAR:
389 						 if (!shadows) {
390 							 if (detaillevel>=2) building_tile[4]->draw(0.5,0.5,0.5);
391 											 else building_tile[4]->draw_notexture(0.5,0.5,0.5);
392 							 glPushMatrix();
393 							 glTranslatef(0.5,0.5,1);
394 							 piece_tile[0][6]->draw_notexture(0.8f,0.8f,0.8f);
395 							 glPopMatrix();
396 						 } else {
397 							 glPushMatrix();
398 							 glTranslatef(0,0,0.05f);
399 							 building_tile[4]->DrawShadow(0,0,0,0.5);
400 							 glTranslatef(float(-light.x),float(-light.y),0);
401 							 piece_tile[0][6]->DrawShadow(0,lightposv,0,0,0,0.5);
402 							 glPopMatrix();
403 						 } /* if */
404 
405 						 if (b->owner==1) {
406 							if (!shadows) {
407 								glTranslatef(0,-1,1);
408 								building_tile[6]->draw(0.3f,0.3f,0.8f);
409 							} else {
410 								glTranslatef(float(-light.x),float(-light.y)-1,0.05f);
411 								building_tile[6]->DrawShadow(0,0,0,0.5);
412 							} /* if */
413 						 } /* if */
414 						 if (b->owner==2) {
415 							if (!shadows) {
416 								glTranslatef(0,-1,1);
417 								building_tile[6]->draw(0.8f,0.3f,0.3f);
418 							} else {
419 								glTranslatef(float(-light.x),float(-light.y)-1,0.05f);
420 								building_tile[6]->DrawShadow(0,0,0,0.5);
421 							} /* if */
422 						 } /* if */
423 						 break;
424 			case B_FACTORY_PHASERS:
425 						 if (!shadows) {
426 							 if (detaillevel>=2) building_tile[4]->draw(0.5,0.5,0.5);
427 											 else building_tile[4]->draw_notexture(0.5,0.5,0.5);
428 							 glPushMatrix();
429 							 glTranslatef(0.5,0.5,1);
430 							 piece_tile[0][5]->draw_notexture(0.8f,0.8f,0.8f);
431 							 glPopMatrix();
432 						 } else {
433 							 glPushMatrix();
434 							 glTranslatef(0,0,0.05f);
435 							 building_tile[4]->DrawShadow(0,0,0,0.5);
436 							 glTranslatef(float(-light.x),float(-light.y),0);
437 							 piece_tile[0][5]->DrawShadow(0,lightposv,0,0,0,0.5);
438 							 glPopMatrix();
439 						 } /* if */
440 
441 						 if (b->owner==1) {
442 							if (!shadows) {
443 								glTranslatef(0,-1,1);
444 								building_tile[6]->draw(0.3f,0.3f,0.8f);
445 							} else {
446 								glTranslatef(float(-light.x),float(-light.y)-1,0.05f);
447 								building_tile[6]->DrawShadow(0,0,0,0.5);
448 							} /* if */
449 						 } /* if */
450 						 if (b->owner==2) {
451 							if (!shadows) {
452 								glTranslatef(0,-1,1);
453 								building_tile[6]->draw(0.8f,0.3f,0.3f);
454 							} else {
455 								glTranslatef(float(-light.x),float(-light.y)-1,0.05f);
456 								building_tile[6]->DrawShadow(0,0,0,0.5);
457 							} /* if */
458 						 } /* if */
459 						 break;
460 			case B_FACTORY_MISSILES:
461 						 if (!shadows) {
462 							 if (detaillevel>=2) building_tile[4]->draw(0.5,0.5,0.5);
463 											 else building_tile[4]->draw_notexture(0.5,0.5,0.5);
464 							 glPushMatrix();
465 							 glTranslatef(0.5,0.5,1);
466 							 piece_tile[0][4]->draw_notexture(0.8f,0.8f,0.8f);
467 							 glPopMatrix();
468 						 } else {
469 							 glPushMatrix();
470 							 glTranslatef(0,0,0.05f);
471 							 building_tile[4]->DrawShadow(0,0,0,0.5);
472 							 glTranslatef(float(-light.x),float(-light.y),0);
473 							 piece_tile[0][4]->DrawShadow(0,lightposv,0,0,0,0.5);
474 							 glPopMatrix();
475 						 } /* if */
476 
477 						 if (b->owner==1) {
478 							if (!shadows) {
479 								glTranslatef(0,-1,1);
480 								building_tile[6]->draw(0.3f,0.3f,0.8f);
481 							} else {
482 								glTranslatef(float(-light.x),float(-light.y)-1,0.05f);
483 								building_tile[6]->DrawShadow(0,0,0,0.5);
484 							} /* if */
485 						 } /* if */
486 						 if (b->owner==2) {
487 							if (!shadows) {
488 								glTranslatef(0,-1,1);
489 								building_tile[6]->draw(0.8f,0.3f,0.3f);
490 							} else {
491 								glTranslatef(float(-light.x),float(-light.y)-1,0.05f);
492 								building_tile[6]->DrawShadow(0,0,0,0.5);
493 							} /* if */
494 						 } /* if */
495 						 break;
496 			case B_FACTORY_CANNONS:
497 						 if (!shadows) {
498 							 if (detaillevel>=2) building_tile[4]->draw(0.5,0.5,0.5);
499 											 else building_tile[4]->draw_notexture(0.5,0.5,0.5);
500 							 glPushMatrix();
501 							 glTranslatef(0.5,0.5,1);
502 							 piece_tile[0][3]->draw_notexture(0.8f,0.8f,0.8f);
503 							 glPopMatrix();
504 						 } else {
505 							 glPushMatrix();
506 							 glTranslatef(0,0,0.05f);
507 							 building_tile[4]->DrawShadow(0,0,0,0.5);
508 							 glTranslatef(float(-light.x),float(-light.y),0);
509 							 piece_tile[0][3]->DrawShadow(0,lightposv,0,0,0,0.5);
510 							 glPopMatrix();
511 						 } /* if */
512 
513 						 if (b->owner==1) {
514 							if (!shadows) {
515 								glTranslatef(0,-1,1);
516 								building_tile[6]->draw(0.3f,0.3f,0.8f);
517 							} else {
518 								glTranslatef(float(-light.x),float(-light.y)-1,0.05f);
519 								building_tile[6]->DrawShadow(0,0,0,0.5);
520 							} /* if */
521 						 } /* if */
522 						 if (b->owner==2) {
523 							if (!shadows) {
524 								glTranslatef(0,-1,1);
525 								building_tile[6]->draw(0.8f,0.3f,0.3f);
526 							} else {
527 								glTranslatef(float(-light.x),float(-light.y)-1,0.05f);
528 								building_tile[6]->DrawShadow(0,0,0,0.5);
529 							} /* if */
530 						 } /* if */
531 						 break;
532 			case B_FACTORY_CHASSIS:
533 						 if (!shadows) {
534 							 if (detaillevel>=2) building_tile[4]->draw(0.5,0.5,0.5);
535 											 else building_tile[4]->draw_notexture(0.5,0.5,0.5);
536 							 glPushMatrix();
537 							 glTranslatef(0.5,0.5,1);
538 							 piece_tile[0][1]->draw_notexture(0.8f,0.8f,0.8f);
539 							 glPopMatrix();
540 						 } else {
541 							 glPushMatrix();
542 							 glTranslatef(0,0,0.05f);
543 							 building_tile[4]->DrawShadow(0,0,0,0.5);
544 							 glTranslatef(float(-light.x),float(-light.y),0);
545 							 piece_tile[0][1]->DrawShadow(0,lightposv,0,0,0,0.5);
546 							 glPopMatrix();
547 						 } /* if */
548 
549 						 if (b->owner==1) {
550 							if (!shadows) {
551 								glTranslatef(0,-1,1);
552 								building_tile[6]->draw(0.3f,0.3f,0.8f);
553 							} else {
554 								glTranslatef(float(-light.x),float(-light.y)-1,0.05f);
555 								building_tile[6]->DrawShadow(0,0,0,0.5);
556 							} /* if */
557 						 } /* if */
558 						 if (b->owner==2) {
559 							if (!shadows) {
560 								glTranslatef(0,-1,1);
561 								building_tile[6]->draw(0.8f,0.3f,0.3f);
562 							} else {
563 								glTranslatef(float(-light.x),float(-light.y)-1,0.05f);
564 								building_tile[6]->DrawShadow(0,0,0,0.5);
565 							} /* if */
566 						 } /* if */
567 						 break;
568 
569 			case B_WARBASE:if (!shadows) {
570 							   if (detaillevel>=2) building_tile[8]->draw(0.5,0.5,0.5);
571 											   else building_tile[8]->draw_notexture(0.5,0.5,0.5);
572 						   } else {
573 							   glTranslatef(0,0,0.05f);
574 							   building_tile[8]->DrawShadow(0,0,0,0.5);
575 						   } /* if */
576 
577 						   if (b->owner==1) {
578 							   if (!shadows) {
579 								   glTranslatef(0,-2,1);
580 								   building_tile[6]->draw(0.3f,0.3f,0.8f);
581 							   } else {
582 								   glTranslatef(float(-light.x),float(-light.y)-2,0.05f);
583 								   building_tile[6]->DrawShadow(0,0,0,0.5);
584 							   } /* if */
585 						   } /* if */
586 						   if (b->owner==2) {
587 							  if (!shadows) {
588 								 glTranslatef(0,-2,1);
589 								 building_tile[6]->draw(0.8f,0.3f,0.3f);
590 							  } else {
591 								 glTranslatef(float(-light.x),float(-light.y)-2,0.05f);
592 								 building_tile[6]->DrawShadow(0,0,0,0.5);
593 							  } /* if */
594 						   } /* if */
595 						   break;
596 			} /* switch */
597 			glPopMatrix();
598 		} /* if */
599 	} /* while */
600 
601 } /* drawmap */
602 
603 
MapMaxZ(float x[2],float y[2])604 float NETHER::MapMaxZ(float x[2],float y[2])
605 {
606 	int i,j;
607 	float z=0;
608 	int o;
609 
610 	for(i=int(x[0]);float(i)<x[1];i++) {
611 		for(j=int(y[0]);float(j)<y[1];j++) {
612 			if (i>=0 && i<map_w &&
613 				j>=0 && j<map_h) {
614 				o=map[i+j*map_w];
615 				if (tile[o]->cmc.z[0]>z) z=tile[o]->cmc.z[0];
616 				if (tile[o]->cmc.z[1]>z) z=tile[o]->cmc.z[1];
617 			} /* if */
618 		} /* for */
619 	} /* for */
620 
621 	return z;
622 } /* MapMaxZ */
623 
624 
MapTerrain(float x,float y)625 int NETHER::MapTerrain(float x, float y)
626 {
627 	switch(map[int(x)+int(y)*map_w]) {
628 	case 0:
629 		return T_GRASS;
630 		break;
631 	case 1:
632 	case 2:
633 		return T_SAND;
634 		break;
635 	case 3:
636 		return T_MOUNTAINS;
637 		break;
638 	default:
639 		return T_HOLE;
640 		break;
641 	} /* switch */
642 } /* NETHER::MapTerrain */
643 
644 
WorseMapTerrain(float x[2],float y[2])645 int NETHER::WorseMapTerrain(float x[2], float y[2])
646 {
647 	int t,t2;
648 
649 	t=MapTerrain(x[0]+0.001f,y[0]+0.001f);
650 	t2=MapTerrain(x[1]-0.001f,y[0]+0.001f);
651 	if (t2==T_HOLE || t==T_HOLE) return T_HOLE;
652 	if ((t2==T_MOUNTAINS && (t==T_SAND || t==T_GRASS)) ||
653 		(t2==T_SAND && t==T_GRASS)) t=t2;
654 	t2=MapTerrain(x[0]+0.001f,y[1]-0.001f);
655 	if (t2==T_HOLE) return T_HOLE;
656 	if ((t2==T_MOUNTAINS && (t==T_SAND || t==T_GRASS)) ||
657 		(t2==T_SAND && t==T_GRASS)) t=t2;
658 	t2=MapTerrain(x[1]-0.001f,y[1]-0.001f);
659 	if (t2==T_HOLE) return T_HOLE;
660 	if ((t2==T_MOUNTAINS && (t==T_SAND || t==T_GRASS)) ||
661 		(t2==T_SAND && t==T_GRASS)) t=t2;
662 	return t;
663 } /* NETHER::WorseMapTerrain */
664 
665