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