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 const float ms[4][3]={{0.0078125,0.015625,0.03125},
28 					{0.00390625,0.0078125,0.03125},
29 					{0,0.0078125,0.015625},
30 					{0,0,0.03125}};
31 
32 const int rs[4][3]={{2,3,5},
33 					{1,2,5},
34 					{0,2,3},
35 					{0,0,5}};
36 extern int detaillevel;
37 
ROBOT()38 ROBOT::ROBOT()
39 {
40 	traction=-1;
41 	firetimer=0;
42 	strength=100;
43 	pieces[0]=false;
44 	pieces[1]=false;
45 	pieces[2]=false;
46 	pieces[3]=false;
47 	pieces[4]=false;
48 
49 	electronics_state=0;
50 	chassis_state=0;
51 } /* ROBOT::ROBOT */
52 
53 
valid(void)54 bool ROBOT::valid(void)
55 {
56 	if (traction==-1) return false;
57 	if (pieces[0]==false &&
58 		pieces[1]==false &&
59 		pieces[2]==false &&
60 		pieces[3]==false) return false;
61 	return true;
62 } /* ROBOT::valid */
63 
64 
RobotCMC(ROBOT * r,int owner)65 CMC NETHER::RobotCMC(ROBOT *r,int owner)
66 {
67 	CMC cmc;
68 	float m[16]={1,0,0,0,
69 				 0,1,0,0,
70 				 0,0,1,0,
71 				 0,0,0,1};
72 
73 	switch(r->traction) {
74 	case 0:
75 		cmc=piece_tile[owner][0]->cmc;
76 		m[14]=1.0;
77 		break;
78 	case 1:
79 		cmc=piece_tile[owner][1]->cmc;
80 		m[14]=0.35;
81 		break;
82 	case 2:
83 		cmc=piece_tile[owner][2]->cmc;
84 		m[14]=0.45;
85 		break;
86 	} /* switch */
87 
88 	if (r->pieces[0]) {
89 		cmc.expand(&(piece_tile[owner][3]->cmc),m);
90 		m[14]+=0.5;
91 	} /* if */
92 	if (r->pieces[1]) {
93 		cmc.expand(&(piece_tile[owner][4]->cmc),m);
94 		m[14]+=0.35;
95 	} /* if */
96 	if (r->pieces[2]) {
97 		cmc.expand(&(piece_tile[owner][5]->cmc),m);
98 		m[14]+=0.5;
99 	} /* if */
100 	if (r->pieces[3]) {
101 		cmc.expand(&(piece_tile[owner][6]->cmc),m);
102 		m[14]+=0.8;
103 	} /* if */
104 	if (r->pieces[4]) {
105 		cmc.expand(&(piece_tile[owner][7]->cmc),m);
106 	} /* if */
107 
108 	return cmc;
109 } /* ROBOT::buildCMC */
110 
111 
112 
113 
DrawRobot(ROBOT * robot,int owner,bool shadows)114 void NETHER::DrawRobot(ROBOT *robot,int owner,bool shadows)
115 {
116 	float r[2]={0.9,0.4};
117 	float g[2]={0.9,0.4};
118 	float b[2]={0.9,0.4};
119 	float z=0;
120 	float bipod_v=0;
121 	Vector light;
122 
123 	light=lightposv;
124 	light=light/light.z;
125 
126 	glPushMatrix();
127 	switch(robot->traction) {
128 	case 0:
129 		if (robot->chassis_state>=0) {
130 			if (robot->chassis_state<32) {
131 				bipod_v=robot->chassis_state*0.00390625;
132 			} else {
133 				bipod_v=(64-robot->chassis_state)*0.00390625;
134 			} /* if */
135 		} else {
136 			if (robot->chassis_state>-31) {
137 				bipod_v=robot->chassis_state*0.00390625;
138 			} else {
139 				bipod_v=(-63-robot->chassis_state)*0.00390625;
140 			} /* if */
141 		} /* if */
142 		if (!shadows) {
143 			glPushMatrix();
144 			glRotatef(robot->angle,0,0,1);
145 			if (detaillevel>=3) piece_tile[owner][8]->draw(r[owner],g[owner],b[owner]);
146 						    else piece_tile[owner][8]->draw_notexture(r[owner],g[owner],b[owner]);
147 			glPushMatrix();
148 			glTranslatef(bipod_v,0,0);
149 			if (detaillevel>=3) piece_tile[owner][9]->draw(r[owner],g[owner],b[owner]);
150 						    else piece_tile[owner][9]->draw_notexture(r[owner],g[owner],b[owner]);
151 			glPopMatrix();
152 			glPushMatrix();
153 			glTranslatef(-bipod_v,0,0);
154 			if (detaillevel>=3) piece_tile[owner][10]->draw(r[owner],g[owner],b[owner]);
155 						    else piece_tile[owner][10]->draw_notexture(r[owner],g[owner],b[owner]);
156 			glPopMatrix();
157 //			piece_tile[owner][0]->draw(r[owner],g[owner],b[owner]);
158 			glPopMatrix();
159 		} else {
160 			glPushMatrix();
161 			glTranslatef(-z*light.x,-z*light.y,0.05);
162 			glRotatef(robot->angle,0,0,1);
163 			piece_tile[owner][8]->DrawShadow(robot->angle,lightposv,0,0,0,0.5);
164 			glPushMatrix();
165 			glTranslatef(bipod_v,0,0);
166 			piece_tile[owner][9]->DrawShadow(robot->angle,lightposv,0,0,0,0.5);
167 			glPopMatrix();
168 			glPushMatrix();
169 			glTranslatef(-bipod_v,0,0);
170 			piece_tile[owner][10]->DrawShadow(robot->angle,lightposv,0,0,0,0.5);
171 			glPopMatrix();
172 //			piece_tile[owner][0]->DrawShadow(robot->angle,lightposv,0,0,0,0.5);
173 			glPopMatrix();
174 		} /* if */
175 		z+=1.0;
176 		break;
177 	case 1:
178 		if (!shadows) {
179 			glPushMatrix();
180 			glRotatef(robot->angle,0,0,1);
181 			if (detaillevel>=3) piece_tile[owner][1]->draw(r[owner],g[owner],b[owner]);
182 						    else piece_tile[owner][1]->draw_notexture(r[owner],g[owner],b[owner]);
183 			glPopMatrix();
184 		} else {
185 			glPushMatrix();
186 			glTranslatef(-z*light.x,-z*light.y,0.05);
187 			glRotatef(robot->angle,0,0,1);
188 			piece_tile[owner][1]->DrawShadow(robot->angle,lightposv,0,0,0,0.5);
189 			glPopMatrix();
190 		} /* if */
191 		z+=0.35;
192 		break;
193 	case 2:
194 		z+=(cos(robot->chassis_state/15.0)*0.1)-0.1;
195 		if (!shadows) {
196 			glPushMatrix();
197 			glTranslatef(0,0,z);
198 			glRotatef(robot->angle,0,0,1);
199 			if (detaillevel>=3) piece_tile[owner][2]->draw(r[owner],g[owner],b[owner]);
200 						    else piece_tile[owner][2]->draw_notexture(r[owner],g[owner],b[owner]);
201 			glPopMatrix();
202 		} else {
203 			glPushMatrix();
204 			glTranslatef(-z*light.x,-z*light.y,0.05);
205 			glRotatef(robot->angle,0,0,1);
206 			piece_tile[owner][2]->DrawShadow(robot->angle,lightposv,0,0,0,0.5);
207 			glPopMatrix();
208 		} /* if */
209 		z+=0.45;
210 		break;
211 	} /* switch */
212 
213 	if (robot->pieces[0]) {
214 		if (!shadows) {
215 			glPushMatrix();
216 			glTranslatef(0,0,z);
217 			glRotatef(robot->angle,0,0,1);
218 			if (detaillevel>=3) piece_tile[owner][3]->draw(r[owner],g[owner],b[owner]);
219 						    else piece_tile[owner][3]->draw_notexture(r[owner],g[owner],b[owner]);
220 			glPopMatrix();
221 		} else {
222 			glPushMatrix();
223 			glTranslatef(-z*light.x,-z*light.y,0.05);
224 			glRotatef(robot->angle,0,0,1);
225 			piece_tile[owner][3]->DrawShadow(robot->angle,lightposv,0,0,0,0.5);
226 			glPopMatrix();
227 		} /* if */
228 		z+=0.5;
229 	} /* if */
230 	if (robot->pieces[1]) {
231 		if (!shadows) {
232 			glPushMatrix();
233 			glTranslatef(0,0,z);
234 			glRotatef(robot->angle,0,0,1);
235 			if (detaillevel>=3) piece_tile[owner][4]->draw(r[owner],g[owner],b[owner]);
236 						    else piece_tile[owner][4]->draw_notexture(r[owner],g[owner],b[owner]);
237 			glPopMatrix();
238 		} else {
239 			glPushMatrix();
240 			glTranslatef(-z*light.x,-z*light.y,0.05);
241 			glRotatef(robot->angle,0,0,1);
242 			piece_tile[owner][4]->DrawShadow(robot->angle,lightposv,0,0,0,0.5);
243 			glPopMatrix();
244 		} /* if */
245 		z+=0.35;
246 	} /* if */
247 	if (robot->pieces[2]) {
248 		if (!shadows) {
249 			glPushMatrix();
250 			glTranslatef(0,0,z);
251 			glRotatef(robot->angle,0,0,1);
252 			if (detaillevel>=3) piece_tile[owner][5]->draw(r[owner],g[owner],b[owner]);
253 						    else piece_tile[owner][5]->draw_notexture(r[owner],g[owner],b[owner]);
254 			glPopMatrix();
255 		} else {
256 			glPushMatrix();
257 			glTranslatef(-z*light.x,-z*light.y,0.05);
258 			glRotatef(robot->angle,0,0,1);
259 			piece_tile[owner][5]->DrawShadow(robot->angle,lightposv,0,0,0,0.5);
260 			glPopMatrix();
261 		} /* if */
262 		z+=0.5;
263 	} /* if */
264 	if (robot->pieces[3]) {
265 		if (!shadows) {
266 			glPushMatrix();
267 			glTranslatef(0,0,z);
268 			glRotatef(robot->angle,0,0,1);
269 			if (detaillevel>=3) piece_tile[owner][6]->draw(r[owner],g[owner],b[owner]);
270 					        else piece_tile[owner][6]->draw_notexture(r[owner],g[owner],b[owner]);
271 			glPopMatrix();
272 		} else {
273 			glPushMatrix();
274 			glTranslatef(-z*light.x,-z*light.y,0.05);
275 			glRotatef(robot->angle,0,0,1);
276 			piece_tile[owner][6]->DrawShadow(robot->angle,lightposv,0,0,0,0.5);
277 			glPopMatrix();
278 		} /* if */
279 		z+=0.8;
280 	} /* if */
281 	if (robot->pieces[4]) {
282 		if (!shadows) {
283 			glPushMatrix();
284 			glTranslatef(0,0,z);
285 			glRotatef(robot->angle,0,0,1);
286 			if (!robot->pieces[3]) glTranslatef(-0.2,0,0);
287 			glRotatef(robot->electronics_state,0,0,1);
288 			if (detaillevel>=3) piece_tile[owner][7]->draw(r[owner],g[owner],b[owner]);
289 					 	    else piece_tile[owner][7]->draw_notexture(r[owner],g[owner],b[owner]);
290 			glPopMatrix();
291 		} else {
292 			glPushMatrix();
293 			glTranslatef(-z*light.x,-z*light.y,0.05);
294 			glRotatef(robot->angle+robot->electronics_state,0,0,1);
295 			piece_tile[owner][7]->DrawShadow(robot->angle+robot->electronics_state,lightposv,0,0,0,0.5);
296 			glPopMatrix();
297 		} /* if */
298 	} /* if */
299 	glPopMatrix();
300 
301 } /* NETHER::DrawRobot */
302 
303 
304 
305 
RobotSpeed(int traction,int terrain)306 float NETHER::RobotSpeed(int traction,int terrain)
307 {
308 	if (terrain<4 && traction<3) return ms[terrain][traction];
309 
310 /*	switch(terrain) {
311 	case T_GRASS:
312 		if (traction==0) return 0.0078125;
313 		if (traction==1) return 0.015625;
314 		return 0.03125;
315 		break;
316 	case T_SAND:
317 		if (traction==0) return 0.00390625;
318 		if (traction==1) return 0.0078125;
319 		return 0.03125;
320 		break;
321 	case T_MOUNTAINS:
322 		if (traction==0) return 0;
323 		if (traction==1) return 0.0078125;
324 		return 0.015625;
325 		break;
326 	case T_HOLE:
327 		if (traction==0) return 0;
328 		if (traction==1) return 0;
329 		return 0.03125;
330 		break;
331 	} /* switch */
332 	return 0;
333 } /* NETHER::RobotSpeed */
334 
335 
RobotRotationSpeed(int traction,int terrain)336 int NETHER::RobotRotationSpeed(int traction,int terrain)
337 {
338 	if (terrain<4 && traction<3) return rs[terrain][traction];
339 
340 /*	switch(terrain) {
341 	case T_GRASS:
342 		if (traction==0) return 2;
343 		if (traction==1) return 3;
344 		return 5;
345 		break;
346 	case T_SAND:
347 		if (traction==0) return 1;
348 		if (traction==1) return 2;
349 		return 5;
350 		break;
351 	case T_MOUNTAINS:
352 		if (traction==0) return 0;
353 		if (traction==1) return 2;
354 		return 3;
355 		break;
356 	case T_HOLE:
357 		if (traction==0) return 0;
358 		if (traction==1) return 0;
359 		return 5;
360 		break;
361 	} /* switch */
362 	return 0;
363 } /* NETHER::RobotRotationSpeed */
364 
365 
Walkable(int traction,int terrain)366 bool NETHER::Walkable(int traction,int terrain)
367 {
368 	if (RobotSpeed(traction,terrain)!=0) return true;
369 
370 	return false;
371 } /* NETHER::Walkable */
372 
373 
374 
piecez(int piece)375 float ROBOT::piecez(int piece)
376 {
377 	float z=0;
378 	switch(traction) {
379 	case 0:
380 		z+=1.0;
381 		break;
382 	case 1:
383 		z+=0.35;
384 		break;
385 	case 2:
386 		z+=0.25;
387 		break;
388 	} /* switch */
389 
390 	/* CANON; */
391 	if (pieces[0]) {
392 		if (piece==0) return z;
393 		z+=0.5;
394 	} /* if */
395 	/* MISSILES: */
396 	if (pieces[1]) {
397 		if (piece==1) return z;
398 		z+=0.35;
399 	} /* if */
400 	/* PHASER: */
401 	if (pieces[2]) {
402 		if (piece==2) return z;
403 		z+=0.5;
404 	} /* if */
405 	/* NUCLEAR: */
406 	if (pieces[3]) {
407 		if (piece==3) return z;
408 		z+=0.8;
409 	} /* if */
410 
411 	return z;
412 } /* ROBOT::piecez */
413 
414 
RobotCollision(ROBOT * r,bool complete)415 bool NETHER::RobotCollision(ROBOT *r,bool complete)
416 {
417 	int i;
418 	List<BUILDING> l;
419 	BUILDING *b;
420 	List<ROBOT> l2;
421 	ROBOT *rt;
422 	float m1[16]={1,0,0,0,
423 				  0,1,0,0,
424 				  0,0,1,0,
425 				  r->pos.x,r->pos.y,r->pos.z,1};
426 	float m2[16]={1,0,0,0,
427 				  0,1,0,0,
428 				  0,0,1,0,
429 				  0,0,0,1};
430 
431 	/* Collision with the ship: */
432 	{
433 		float m2[16]={1,0,0,0,
434 				 	  0,1,0,0,
435 					  0,0,1,0,
436 					  shipp.x,shipp.y,shipp.z,1};
437 		if (r->cmc.collision_simple(m1,&(ship->cmc),m2)) return true;
438 	}
439 
440 	if (!complete) return false;
441 
442 	/* Collision with buildings: */
443 	l.Instance(buildings);
444 	l.Rewind();
445 	while(l.Iterate(b)) {
446 		if (((b->pos.x-r->pos.x)*(b->pos.x-r->pos.x)+
447 			 (b->pos.y-r->pos.y)*(b->pos.y-r->pos.y)+
448 			 (b->pos.z-r->pos.z)*(b->pos.z-r->pos.z))<COLISION_TEST_THRESHOLD) {
449 			m2[12]=b->pos.x;
450 			m2[13]=b->pos.y;
451 			m2[14]=b->pos.z;
452 
453 			switch(b->type) {
454 				case B_FENCE:
455 					if (r->cmc.collision_simple(m1,&(building_tile[5]->cmc),m2)) return true;
456 					break;
457 				case B_WALL1:
458 					if (r->cmc.collision_simple(m1,&(building_tile[0]->cmc),m2)) return true;
459 					break;
460 				case B_WALL2:
461 					if (r->cmc.collision_simple(m1,&(building_tile[1]->cmc),m2)) return true;
462 					break;
463 				case B_WALL3:
464 					if (r->cmc.collision_simple(m1,&(building_tile[2]->cmc),m2)) return true;
465 					break;
466 				case B_WALL4:
467 					if (r->cmc.collision_simple(m1,&(building_tile[3]->cmc),m2)) return true;
468 					break;
469 				case B_WALL5:
470 					if (r->cmc.collision_simple(m1,&(building_tile[4]->cmc),m2)) return true;
471 					break;
472 				case B_WALL6:
473 					if (r->cmc.collision_simple(m1,&(building_tile[7]->cmc),m2)) return true;
474 					break;
475 				case B_WARBASE:
476 					if (r->cmc.collision_simple(m1,&(building_tile[8]->cmc),m2)) return true;
477 					//m2[13]=b->pos.y-2;
478 					//m2[14]=b->pos.z+1;
479 					//if (b->owner!=0) if (r->cmc.collision_simple(m1,&(building_tile[6]->cmc),m2)) return true;
480 					break;
481 			case B_FACTORY_ELECTRONICS:
482 					if (r->cmc.collision_simple(m1,&(building_tile[4]->cmc),m2)) return true;
483 					m2[12]=b->pos.x+0.5;
484 					m2[13]=b->pos.y+0.5;
485 					m2[14]=b->pos.z+1;
486 					if (r->cmc.collision_simple(m1,&(piece_tile[0][7]->cmc),m2)) return true;
487 					//m2[12]=b->pos.x;
488 					//m2[13]=b->pos.y-1;
489 					//if (b->owner!=0) if (r->cmc.collision_simple(m1,&(building_tile[6]->cmc),m2)) return true;
490 					break;
491 			case B_FACTORY_NUCLEAR:
492 					if (r->cmc.collision_simple(m1,&(building_tile[4]->cmc),m2)) return true;
493 					m2[12]=b->pos.x+0.5;
494 					m2[13]=b->pos.y+0.5;
495 					m2[14]=b->pos.z+1;
496 					if (r->cmc.collision_simple(m1,&(piece_tile[0][6]->cmc),m2)) return true;
497 					//m2[12]=b->pos.x;
498 					//m2[13]=b->pos.y-1;
499 					//if (b->owner!=0) if (r->cmc.collision_simple(m1,&(building_tile[6]->cmc),m2)) return true;
500 					break;
501 			case B_FACTORY_PHASERS:
502 					if (r->cmc.collision_simple(m1,&(building_tile[4]->cmc),m2)) return true;
503 					m2[12]=b->pos.x+0.5;
504 					m2[13]=b->pos.y+0.5;
505 					m2[14]=b->pos.z+1;
506 					if (r->cmc.collision_simple(m1,&(piece_tile[0][5]->cmc),m2)) return true;
507 					//m2[12]=b->pos.x;
508 					//m2[13]=b->pos.y-1;
509 					//if (b->owner!=0) if (r->cmc.collision_simple(m1,&(building_tile[6]->cmc),m2)) return true;
510 					break;
511 			case B_FACTORY_MISSILES:
512 					if (r->cmc.collision_simple(m1,&(building_tile[4]->cmc),m2)) return true;
513 					m2[12]=b->pos.x+0.5;
514 					m2[13]=b->pos.y+0.5;
515 					m2[14]=b->pos.z+1;
516 					if (r->cmc.collision_simple(m1,&(piece_tile[0][4]->cmc),m2)) return true;
517 					//m2[12]=b->pos.x;
518 					//m2[13]=b->pos.y-1;
519 					//if (b->owner!=0) if (r->cmc.collision_simple(m1,&(building_tile[6]->cmc),m2)) return true;
520 					break;
521 			case B_FACTORY_CANNONS:
522 					if (r->cmc.collision_simple(m1,&(building_tile[4]->cmc),m2)) return true;
523 					m2[12]=b->pos.x+0.5;
524 					m2[13]=b->pos.y+0.5;
525 					m2[14]=b->pos.z+1;
526 					if (r->cmc.collision_simple(m1,&(piece_tile[0][3]->cmc),m2)) return true;
527 					//m2[12]=b->pos.x;
528 					//m2[13]=b->pos.y-1;
529 					//if (b->owner!=0) if (r->cmc.collision_simple(m1,&(building_tile[6]->cmc),m2)) return true;
530 					break;
531 			case B_FACTORY_CHASSIS:
532 					if (r->cmc.collision_simple(m1,&(building_tile[4]->cmc),m2)) return true;
533 					m2[12]=b->pos.x+0.5;
534 					m2[13]=b->pos.y+0.5;
535 					m2[14]=b->pos.z+1;
536 					if (r->cmc.collision_simple(m1,&(piece_tile[0][1]->cmc),m2)) return true;
537 					//m2[12]=b->pos.x;
538 					//m2[13]=b->pos.y-1;
539 					//if (b->owner!=0) if (r->cmc.collision_simple(m1,&(building_tile[6]->cmc),m2)) return true;
540 					break;
541 			} /* switch */
542 			} /* if */
543 	} /* while */
544 
545 	/* Collision with the robots: */
546 	for(i=0;i<2;i++) {
547 		l2.Instance(robots[i]);
548 		l2.Rewind();
549 		while(l2.Iterate(rt)) {
550 			if (((rt->pos.x-r->pos.x)*(rt->pos.x-r->pos.x)+
551 				 (rt->pos.y-r->pos.y)*(rt->pos.y-r->pos.y)+
552 				 (rt->pos.z-r->pos.z)*(rt->pos.z-r->pos.z))<COLISION_TEST_THRESHOLD) {
553 				if (rt!=r) {
554 					m2[12]=rt->pos.x;
555 					m2[13]=rt->pos.y;
556 					m2[14]=rt->pos.z;
557 					if (r->cmc.collision_simple(m1,&(rt->cmc),m2)) return true;
558 				} /* if */
559 			} /* if */
560 		} /* while */
561 	} /* while */
562 
563 	return false;
564 } /* NETHER::RobotCollision */
565 
566 
bullethit(int type)567 bool ROBOT::bullethit(int type)
568 {
569 	int npieces=0;
570 	int damage;
571 
572 	if (pieces[0]) npieces++;
573 	if (pieces[1]) npieces++;
574 	if (pieces[2]) npieces++;
575 	if (pieces[3]) npieces++;
576 	if (pieces[4]) npieces++;
577 
578 	switch(type) {
579 	case 0:
580 		/* CANNON: */
581 		damage=24;
582 		if (traction==0) damage-=2;
583 		if (npieces==1) damage-=2;
584 		if (npieces==2) damage-=4;
585 		if (npieces==3) damage-=8;
586 		if (npieces==4) damage-=12;
587 		if (npieces==5) damage-=16;
588 		break;
589 	case 1:
590 		/* CANNON: */
591 		damage=36;
592 		if (traction==0) damage-=3;
593 		if (npieces==1) damage-=3;
594 		if (npieces==2) damage-=6;
595 		if (npieces==3) damage-=12;
596 		if (npieces==4) damage-=18;
597 		if (npieces==5) damage-=24;
598 		break;
599 	case 2:
600 		/* CANNON: */
601 		damage=48;
602 		if (traction==0) damage-=4;
603 		if (npieces==1) damage-=4;
604 		if (npieces==2) damage-=8;
605 		if (npieces==3) damage-=16;
606 		if (npieces==4) damage-=24;
607 		if (npieces==5) damage-=32;
608 		break;
609 	} /* switch */
610 
611 	strength-=damage;
612 	if (strength<=0) return false;
613 	return true;
614 } /* bullethit */
615 
RobotCost(int player,ROBOT * r,int * res)616 void NETHER::RobotCost(int player,ROBOT *r,int *res)
617 {
618 	int i;
619 	int tmp;
620 	int corr[5]={5,4,3,2,1};
621 	int cost[5]={2,4,4,20,3};
622 
623 	res[0]=0;
624 	res[1]=0;
625 	res[2]=0;
626 	res[3]=0;
627 	res[4]=0;
628 	res[5]=0;
629 	res[6]=0;
630 
631 	tmp=0;
632 	if (r->traction==0) tmp=3;
633 	if (r->traction==1) tmp=5;
634 	if (r->traction==2) tmp=10;
635 	if (resources[player][6]>tmp) {
636 		res[6]=tmp;
637 	} else {
638 		res[6]=resources[player][6];
639 		res[0]=tmp-resources[player][6];
640 	} /* if */
641 
642 	for(i=0;i<5;i++) {
643 		if (r->pieces[i]) {
644 			if (resources[player][corr[i]]>cost[i]) {
645 				res[corr[i]]=cost[i];
646 			} else {
647 				res[corr[i]]=resources[player][corr[i]];
648 				res[0]+=cost[i]-resources[player][corr[i]];
649 			} /* if */
650 		} /* if */
651 	} /* for */
652 } /* NETHER::RobotCost */
653 
654 
RobotCost(ROBOT * r)655 int NETHER::RobotCost(ROBOT *r)
656 {
657 	int i;
658 	int tmp=0;
659 	int cost[5]={2,4,4,20,3};
660 
661 	if (r->traction==0) tmp=3;
662 	if (r->traction==1) tmp=5;
663 	if (r->traction==2) tmp=10;
664 
665 	for(i=0;i<5;i++) {
666 		if (r->pieces[i]) tmp+=cost[i];
667 	} /* for */
668 
669 	return tmp;
670 } /* NETHER::RobotCost */
671 
672