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