1 /*
2 ==============================================================================
3
4 SUPERTANK
5
6 ==============================================================================
7 */
8
9 #include "g_local.h"
10 #include "m_supertank.h"
11
12 qboolean visible (edict_t *self, edict_t *other);
13
14 static int sound_pain1;
15 static int sound_pain2;
16 static int sound_pain3;
17 static int sound_death;
18 static int sound_search1;
19 static int sound_search2;
20
21 static int tread_sound;
22
23 void BossExplode (edict_t *self);
24
TreadSound(edict_t * self)25 void TreadSound (edict_t *self)
26 {
27 gi.sound (self, CHAN_VOICE, tread_sound, 1, ATTN_NORM, 0);
28 }
29
supertank_search(edict_t * self)30 void supertank_search (edict_t *self)
31 {
32 if (random() < 0.5)
33 gi.sound (self, CHAN_VOICE, sound_search1, 1, ATTN_NORM, 0);
34 else
35 gi.sound (self, CHAN_VOICE, sound_search2, 1, ATTN_NORM, 0);
36 }
37
38
39 void supertank_dead (edict_t *self);
40 void supertankRocket (edict_t *self);
41 void supertankMachineGun (edict_t *self);
42 void supertank_reattack1(edict_t *self);
43
44
45 //
46 // stand
47 //
48
49 mframe_t supertank_frames_stand []=
50 {
51 ai_stand, 0, NULL,
52 ai_stand, 0, NULL,
53 ai_stand, 0, NULL,
54 ai_stand, 0, NULL,
55 ai_stand, 0, NULL,
56 ai_stand, 0, NULL,
57 ai_stand, 0, NULL,
58 ai_stand, 0, NULL,
59 ai_stand, 0, NULL,
60 ai_stand, 0, NULL,
61 ai_stand, 0, NULL,
62 ai_stand, 0, NULL,
63 ai_stand, 0, NULL,
64 ai_stand, 0, NULL,
65 ai_stand, 0, NULL,
66 ai_stand, 0, NULL,
67 ai_stand, 0, NULL,
68 ai_stand, 0, NULL,
69 ai_stand, 0, NULL,
70 ai_stand, 0, NULL,
71 ai_stand, 0, NULL,
72 ai_stand, 0, NULL,
73 ai_stand, 0, NULL,
74 ai_stand, 0, NULL,
75 ai_stand, 0, NULL,
76 ai_stand, 0, NULL,
77 ai_stand, 0, NULL,
78 ai_stand, 0, NULL,
79 ai_stand, 0, NULL,
80 ai_stand, 0, NULL,
81 ai_stand, 0, NULL,
82 ai_stand, 0, NULL,
83 ai_stand, 0, NULL,
84 ai_stand, 0, NULL,
85 ai_stand, 0, NULL,
86 ai_stand, 0, NULL,
87 ai_stand, 0, NULL,
88 ai_stand, 0, NULL,
89 ai_stand, 0, NULL,
90 ai_stand, 0, NULL,
91 ai_stand, 0, NULL,
92 ai_stand, 0, NULL,
93 ai_stand, 0, NULL,
94 ai_stand, 0, NULL,
95 ai_stand, 0, NULL,
96 ai_stand, 0, NULL,
97 ai_stand, 0, NULL,
98 ai_stand, 0, NULL,
99 ai_stand, 0, NULL,
100 ai_stand, 0, NULL,
101 ai_stand, 0, NULL,
102 ai_stand, 0, NULL,
103 ai_stand, 0, NULL,
104 ai_stand, 0, NULL,
105 ai_stand, 0, NULL,
106 ai_stand, 0, NULL,
107 ai_stand, 0, NULL,
108 ai_stand, 0, NULL,
109 ai_stand, 0, NULL,
110 ai_stand, 0, NULL
111 };
112 mmove_t supertank_move_stand = {FRAME_stand_1, FRAME_stand_60, supertank_frames_stand, NULL};
113
supertank_stand(edict_t * self)114 void supertank_stand (edict_t *self)
115 {
116 self->monsterinfo.currentmove = &supertank_move_stand;
117 }
118
119
120 mframe_t supertank_frames_run [] =
121 {
122 ai_run, 12, TreadSound,
123 ai_run, 12, NULL,
124 ai_run, 12, NULL,
125 ai_run, 12, NULL,
126 ai_run, 12, NULL,
127 ai_run, 12, NULL,
128 ai_run, 12, NULL,
129 ai_run, 12, NULL,
130 ai_run, 12, NULL,
131 ai_run, 12, NULL,
132 ai_run, 12, NULL,
133 ai_run, 12, NULL,
134 ai_run, 12, NULL,
135 ai_run, 12, NULL,
136 ai_run, 12, NULL,
137 ai_run, 12, NULL,
138 ai_run, 12, NULL,
139 ai_run, 12, NULL
140 };
141 mmove_t supertank_move_run = {FRAME_forwrd_1, FRAME_forwrd_18, supertank_frames_run, NULL};
142
143 //
144 // walk
145 //
146
147
148 mframe_t supertank_frames_forward [] =
149 {
150 ai_walk, 4, TreadSound,
151 ai_walk, 4, NULL,
152 ai_walk, 4, NULL,
153 ai_walk, 4, NULL,
154 ai_walk, 4, NULL,
155 ai_walk, 4, NULL,
156 ai_walk, 4, NULL,
157 ai_walk, 4, NULL,
158 ai_walk, 4, NULL,
159 ai_walk, 4, NULL,
160 ai_walk, 4, NULL,
161 ai_walk, 4, NULL,
162 ai_walk, 4, NULL,
163 ai_walk, 4, NULL,
164 ai_walk, 4, NULL,
165 ai_walk, 4, NULL,
166 ai_walk, 4, NULL,
167 ai_walk, 4, NULL
168 };
169 mmove_t supertank_move_forward = {FRAME_forwrd_1, FRAME_forwrd_18, supertank_frames_forward, NULL};
170
supertank_forward(edict_t * self)171 void supertank_forward (edict_t *self)
172 {
173 self->monsterinfo.currentmove = &supertank_move_forward;
174 }
175
supertank_walk(edict_t * self)176 void supertank_walk (edict_t *self)
177 {
178 self->monsterinfo.currentmove = &supertank_move_forward;
179 }
180
supertank_run(edict_t * self)181 void supertank_run (edict_t *self)
182 {
183 if (self->monsterinfo.aiflags & AI_STAND_GROUND)
184 self->monsterinfo.currentmove = &supertank_move_stand;
185 else
186 self->monsterinfo.currentmove = &supertank_move_run;
187 }
188
189 mframe_t supertank_frames_turn_right [] =
190 {
191 ai_move, 0, TreadSound,
192 ai_move, 0, NULL,
193 ai_move, 0, NULL,
194 ai_move, 0, NULL,
195 ai_move, 0, NULL,
196 ai_move, 0, NULL,
197 ai_move, 0, NULL,
198 ai_move, 0, NULL,
199 ai_move, 0, NULL,
200 ai_move, 0, NULL,
201 ai_move, 0, NULL,
202 ai_move, 0, NULL,
203 ai_move, 0, NULL,
204 ai_move, 0, NULL,
205 ai_move, 0, NULL,
206 ai_move, 0, NULL,
207 ai_move, 0, NULL,
208 ai_move, 0, NULL
209 };
210 mmove_t supertank_move_turn_right = {FRAME_right_1, FRAME_right_18, supertank_frames_turn_right, supertank_run};
211
212 mframe_t supertank_frames_turn_left [] =
213 {
214 ai_move, 0, TreadSound,
215 ai_move, 0, NULL,
216 ai_move, 0, NULL,
217 ai_move, 0, NULL,
218 ai_move, 0, NULL,
219 ai_move, 0, NULL,
220 ai_move, 0, NULL,
221 ai_move, 0, NULL,
222 ai_move, 0, NULL,
223 ai_move, 0, NULL,
224 ai_move, 0, NULL,
225 ai_move, 0, NULL,
226 ai_move, 0, NULL,
227 ai_move, 0, NULL,
228 ai_move, 0, NULL,
229 ai_move, 0, NULL,
230 ai_move, 0, NULL,
231 ai_move, 0, NULL
232 };
233 mmove_t supertank_move_turn_left = {FRAME_left_1, FRAME_left_18, supertank_frames_turn_left, supertank_run};
234
235
236 mframe_t supertank_frames_pain3 [] =
237 {
238 ai_move, 0, NULL,
239 ai_move, 0, NULL,
240 ai_move, 0, NULL,
241 ai_move, 0, NULL
242 };
243 mmove_t supertank_move_pain3 = {FRAME_pain3_9, FRAME_pain3_12, supertank_frames_pain3, supertank_run};
244
245 mframe_t supertank_frames_pain2 [] =
246 {
247 ai_move, 0, NULL,
248 ai_move, 0, NULL,
249 ai_move, 0, NULL,
250 ai_move, 0, NULL
251 };
252 mmove_t supertank_move_pain2 = {FRAME_pain2_5, FRAME_pain2_8, supertank_frames_pain2, supertank_run};
253
254 mframe_t supertank_frames_pain1 [] =
255 {
256 ai_move, 0, NULL,
257 ai_move, 0, NULL,
258 ai_move, 0, NULL,
259 ai_move, 0, NULL
260 };
261 mmove_t supertank_move_pain1 = {FRAME_pain1_1, FRAME_pain1_4, supertank_frames_pain1, supertank_run};
262
263 mframe_t supertank_frames_death1 [] =
264 {
265 ai_move, 0, NULL,
266 ai_move, 0, NULL,
267 ai_move, 0, NULL,
268 ai_move, 0, NULL,
269 ai_move, 0, NULL,
270 ai_move, 0, NULL,
271 ai_move, 0, NULL,
272 ai_move, 0, NULL,
273 ai_move, 0, NULL,
274 ai_move, 0, NULL,
275 ai_move, 0, NULL,
276 ai_move, 0, NULL,
277 ai_move, 0, NULL,
278 ai_move, 0, NULL,
279 ai_move, 0, NULL,
280 ai_move, 0, NULL,
281 ai_move, 0, NULL,
282 ai_move, 0, NULL,
283 ai_move, 0, NULL,
284 ai_move, 0, NULL,
285 ai_move, 0, NULL,
286 ai_move, 0, NULL,
287 ai_move, 0, NULL,
288 ai_move, 0, BossExplode
289 };
290 mmove_t supertank_move_death = {FRAME_death_1, FRAME_death_24, supertank_frames_death1, supertank_dead};
291
292 mframe_t supertank_frames_backward[] =
293 {
294 ai_walk, 0, TreadSound,
295 ai_walk, 0, NULL,
296 ai_walk, 0, NULL,
297 ai_walk, 0, NULL,
298 ai_walk, 0, NULL,
299 ai_walk, 0, NULL,
300 ai_walk, 0, NULL,
301 ai_walk, 0, NULL,
302 ai_walk, 0, NULL,
303 ai_walk, 0, NULL,
304 ai_walk, 0, NULL,
305 ai_walk, 0, NULL,
306 ai_walk, 0, NULL,
307 ai_walk, 0, NULL,
308 ai_walk, 0, NULL,
309 ai_walk, 0, NULL,
310 ai_walk, 0, NULL,
311 ai_walk, 0, NULL
312 };
313 mmove_t supertank_move_backward = {FRAME_backwd_1, FRAME_backwd_18, supertank_frames_backward, NULL};
314
315 mframe_t supertank_frames_attack4[]=
316 {
317 ai_move, 0, NULL,
318 ai_move, 0, NULL,
319 ai_move, 0, NULL,
320 ai_move, 0, NULL,
321 ai_move, 0, NULL,
322 ai_move, 0, NULL
323 };
324 mmove_t supertank_move_attack4 = {FRAME_attak4_1, FRAME_attak4_6, supertank_frames_attack4, supertank_run};
325
326 mframe_t supertank_frames_attack3[]=
327 {
328 ai_move, 0, NULL,
329 ai_move, 0, NULL,
330 ai_move, 0, NULL,
331 ai_move, 0, NULL,
332 ai_move, 0, NULL,
333 ai_move, 0, NULL,
334 ai_move, 0, NULL,
335 ai_move, 0, NULL,
336 ai_move, 0, NULL,
337 ai_move, 0, NULL,
338 ai_move, 0, NULL,
339 ai_move, 0, NULL,
340 ai_move, 0, NULL,
341 ai_move, 0, NULL,
342 ai_move, 0, NULL,
343 ai_move, 0, NULL,
344 ai_move, 0, NULL,
345 ai_move, 0, NULL,
346 ai_move, 0, NULL,
347 ai_move, 0, NULL,
348 ai_move, 0, NULL,
349 ai_move, 0, NULL,
350 ai_move, 0, NULL,
351 ai_move, 0, NULL,
352 ai_move, 0, NULL,
353 ai_move, 0, NULL,
354 ai_move, 0, NULL
355 };
356 mmove_t supertank_move_attack3 = {FRAME_attak3_1, FRAME_attak3_27, supertank_frames_attack3, supertank_run};
357
358 mframe_t supertank_frames_attack2[]=
359 {
360 ai_charge, 0, NULL,
361 ai_charge, 0, NULL,
362 ai_charge, 0, NULL,
363 ai_charge, 0, NULL,
364 ai_charge, 0, NULL,
365 ai_charge, 0, NULL,
366 ai_charge, 0, NULL,
367 ai_charge, 0, supertankRocket,
368 ai_move, 0, NULL,
369 ai_move, 0, NULL,
370 ai_move, 0, supertankRocket,
371 ai_move, 0, NULL,
372 ai_move, 0, NULL,
373 ai_move, 0, supertankRocket,
374 ai_move, 0, NULL,
375 ai_move, 0, NULL,
376 ai_move, 0, NULL,
377 ai_move, 0, NULL,
378 ai_move, 0, NULL,
379 ai_move, 0, NULL,
380 ai_move, 0, NULL,
381 ai_move, 0, NULL,
382 ai_move, 0, NULL,
383 ai_move, 0, NULL,
384 ai_move, 0, NULL,
385 ai_move, 0, NULL,
386 ai_move, 0, NULL
387 };
388 mmove_t supertank_move_attack2 = {FRAME_attak2_1, FRAME_attak2_27, supertank_frames_attack2, supertank_run};
389
390 mframe_t supertank_frames_attack1[]=
391 {
392 ai_charge, 0, supertankMachineGun,
393 ai_charge, 0, supertankMachineGun,
394 ai_charge, 0, supertankMachineGun,
395 ai_charge, 0, supertankMachineGun,
396 ai_charge, 0, supertankMachineGun,
397 ai_charge, 0, supertankMachineGun,
398
399 };
400 mmove_t supertank_move_attack1 = {FRAME_attak1_1, FRAME_attak1_6, supertank_frames_attack1, supertank_reattack1};
401
402 mframe_t supertank_frames_end_attack1[]=
403 {
404 ai_move, 0, NULL,
405 ai_move, 0, NULL,
406 ai_move, 0, NULL,
407 ai_move, 0, NULL,
408 ai_move, 0, NULL,
409 ai_move, 0, NULL,
410 ai_move, 0, NULL,
411 ai_move, 0, NULL,
412 ai_move, 0, NULL,
413 ai_move, 0, NULL,
414 ai_move, 0, NULL,
415 ai_move, 0, NULL,
416 ai_move, 0, NULL,
417 ai_move, 0, NULL
418 };
419 mmove_t supertank_move_end_attack1 = {FRAME_attak1_7, FRAME_attak1_20, supertank_frames_end_attack1, supertank_run};
420
421
supertank_reattack1(edict_t * self)422 void supertank_reattack1(edict_t *self)
423 {
424 if (visible(self, self->enemy))
425 if (random() < 0.9)
426 self->monsterinfo.currentmove = &supertank_move_attack1;
427 else
428 self->monsterinfo.currentmove = &supertank_move_end_attack1;
429 else
430 self->monsterinfo.currentmove = &supertank_move_end_attack1;
431 }
432
supertank_pain(edict_t * self,edict_t * other,float kick,int damage)433 void supertank_pain (edict_t *self, edict_t *other, float kick, int damage)
434 {
435
436 if (self->health < (self->max_health / 2))
437 self->s.skinnum = 1;
438
439 if (level.time < self->pain_debounce_time)
440 return;
441
442 // Lessen the chance of him going into his pain frames
443 if (damage <=25)
444 if (random()<0.2)
445 return;
446
447 // Don't go into pain if he's firing his rockets
448 if (skill->value >= 2)
449 if ( (self->s.frame >= FRAME_attak2_1) && (self->s.frame <= FRAME_attak2_14) )
450 return;
451
452 self->pain_debounce_time = level.time + 3;
453
454 if (skill->value == 3)
455 return; // no pain anims in nightmare
456
457 if (damage <= 10)
458 {
459 gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM,0);
460 self->monsterinfo.currentmove = &supertank_move_pain1;
461 }
462 else if (damage <= 25)
463 {
464 gi.sound (self, CHAN_VOICE, sound_pain3, 1, ATTN_NORM,0);
465 self->monsterinfo.currentmove = &supertank_move_pain2;
466 }
467 else
468 {
469 gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM,0);
470 self->monsterinfo.currentmove = &supertank_move_pain3;
471 }
472 };
473
474
supertankRocket(edict_t * self)475 void supertankRocket (edict_t *self)
476 {
477 vec3_t forward, right;
478 vec3_t start;
479 vec3_t dir;
480 vec3_t vec;
481 int flash_number;
482
483 if (self->s.frame == FRAME_attak2_8)
484 flash_number = MZ2_SUPERTANK_ROCKET_1;
485 else if (self->s.frame == FRAME_attak2_11)
486 flash_number = MZ2_SUPERTANK_ROCKET_2;
487 else // (self->s.frame == FRAME_attak2_14)
488 flash_number = MZ2_SUPERTANK_ROCKET_3;
489
490 AngleVectors (self->s.angles, forward, right, NULL);
491 G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);
492
493 VectorCopy (self->enemy->s.origin, vec);
494 vec[2] += self->enemy->viewheight;
495 VectorSubtract (vec, start, dir);
496 VectorNormalize (dir);
497
498 monster_fire_rocket (self, start, dir, 50, 500, flash_number);
499 }
500
supertankMachineGun(edict_t * self)501 void supertankMachineGun (edict_t *self)
502 {
503 vec3_t dir;
504 vec3_t vec;
505 vec3_t start;
506 vec3_t forward, right;
507 int flash_number;
508
509 flash_number = MZ2_SUPERTANK_MACHINEGUN_1 + (self->s.frame - FRAME_attak1_1);
510
511 //FIXME!!!
512 dir[0] = 0;
513 dir[1] = self->s.angles[1];
514 dir[2] = 0;
515
516 AngleVectors (dir, forward, right, NULL);
517 G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);
518
519 if (self->enemy)
520 {
521 VectorCopy (self->enemy->s.origin, vec);
522 VectorMA (vec, 0, self->enemy->velocity, vec);
523 vec[2] += self->enemy->viewheight;
524 VectorSubtract (vec, start, forward);
525 VectorNormalize (forward);
526 }
527
528 monster_fire_bullet (self, start, forward, 6, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, flash_number);
529 }
530
531
supertank_attack(edict_t * self)532 void supertank_attack(edict_t *self)
533 {
534 vec3_t vec;
535 float range;
536 //float r;
537
538 VectorSubtract (self->enemy->s.origin, self->s.origin, vec);
539 range = VectorLength (vec);
540
541 //r = random();
542
543 // Attack 1 == Chaingun
544 // Attack 2 == Rocket Launcher
545
546 if (range <= 160)
547 {
548 self->monsterinfo.currentmove = &supertank_move_attack1;
549 }
550 else
551 { // fire rockets more often at distance
552 if (random() < 0.3)
553 self->monsterinfo.currentmove = &supertank_move_attack1;
554 else
555 self->monsterinfo.currentmove = &supertank_move_attack2;
556 }
557 }
558
559
560 //
561 // death
562 //
563
supertank_dead(edict_t * self)564 void supertank_dead (edict_t *self)
565 {
566 VectorSet (self->mins, -60, -60, 0);
567 VectorSet (self->maxs, 60, 60, 72);
568 self->movetype = MOVETYPE_TOSS;
569 self->svflags |= SVF_DEADMONSTER;
570 self->nextthink = 0;
571 gi.linkentity (self);
572 }
573
574
BossExplode(edict_t * self)575 void BossExplode (edict_t *self)
576 {
577 vec3_t org;
578 int n;
579
580 self->think = BossExplode;
581 VectorCopy (self->s.origin, org);
582 org[2] += 24 + (rand()&15);
583 switch (self->count++)
584 {
585 case 0:
586 org[0] -= 24;
587 org[1] -= 24;
588 break;
589 case 1:
590 org[0] += 24;
591 org[1] += 24;
592 break;
593 case 2:
594 org[0] += 24;
595 org[1] -= 24;
596 break;
597 case 3:
598 org[0] -= 24;
599 org[1] += 24;
600 break;
601 case 4:
602 org[0] -= 48;
603 org[1] -= 48;
604 break;
605 case 5:
606 org[0] += 48;
607 org[1] += 48;
608 break;
609 case 6:
610 org[0] -= 48;
611 org[1] += 48;
612 break;
613 case 7:
614 org[0] += 48;
615 org[1] -= 48;
616 break;
617 case 8:
618 self->s.sound = 0;
619 for (n= 0; n < 4; n++)
620 ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", 500, GIB_ORGANIC);
621 for (n= 0; n < 8; n++)
622 ThrowGib (self, "models/objects/gibs/sm_metal/tris.md2", 500, GIB_METALLIC);
623 ThrowGib (self, "models/objects/gibs/chest/tris.md2", 500, GIB_ORGANIC);
624 ThrowHead (self, "models/objects/gibs/gear/tris.md2", 500, GIB_METALLIC);
625 self->deadflag = DEAD_DEAD;
626 return;
627 }
628
629 gi.WriteByte (svc_temp_entity);
630 gi.WriteByte (TE_EXPLOSION1);
631 gi.WritePosition (org);
632 gi.multicast (self->s.origin, MULTICAST_PVS);
633
634 self->nextthink = level.time + 0.1;
635 }
636
637
supertank_die(edict_t * self,edict_t * inflictor,edict_t * attacker,int damage,vec3_t point)638 void supertank_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
639 {
640 gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
641 self->deadflag = DEAD_DEAD;
642 self->takedamage = DAMAGE_NO;
643 self->count = 0;
644 self->monsterinfo.currentmove = &supertank_move_death;
645 }
646
647 //
648 // monster_supertank
649 //
650
651 // RAFAEL (Powershield)
652
653 /*QUAKED monster_supertank (1 .5 0) (-64 -64 0) (64 64 72) Ambush Trigger_Spawn Sight Powershield
654 */
SP_monster_supertank(edict_t * self)655 void SP_monster_supertank (edict_t *self)
656 {
657 if (deathmatch->value)
658 {
659 G_FreeEdict (self);
660 return;
661 }
662
663 sound_pain1 = gi.soundindex ("bosstank/btkpain1.wav");
664 sound_pain2 = gi.soundindex ("bosstank/btkpain2.wav");
665 sound_pain3 = gi.soundindex ("bosstank/btkpain3.wav");
666 sound_death = gi.soundindex ("bosstank/btkdeth1.wav");
667 sound_search1 = gi.soundindex ("bosstank/btkunqv1.wav");
668 sound_search2 = gi.soundindex ("bosstank/btkunqv2.wav");
669
670 // self->s.sound = gi.soundindex ("bosstank/btkengn1.wav");
671 tread_sound = gi.soundindex ("bosstank/btkengn1.wav");
672
673 self->movetype = MOVETYPE_STEP;
674 self->solid = SOLID_BBOX;
675 self->s.modelindex = gi.modelindex ("models/monsters/boss1/tris.md2");
676 VectorSet (self->mins, -64, -64, 0);
677 VectorSet (self->maxs, 64, 64, 112);
678
679 self->health = 1500;
680 self->gib_health = -500;
681 self->mass = 800;
682
683 self->pain = supertank_pain;
684 self->die = supertank_die;
685 self->monsterinfo.stand = supertank_stand;
686 self->monsterinfo.walk = supertank_walk;
687 self->monsterinfo.run = supertank_run;
688 self->monsterinfo.dodge = NULL;
689 self->monsterinfo.attack = supertank_attack;
690 self->monsterinfo.search = supertank_search;
691 self->monsterinfo.melee = NULL;
692 self->monsterinfo.sight = NULL;
693
694 gi.linkentity (self);
695
696 self->monsterinfo.currentmove = &supertank_move_stand;
697 self->monsterinfo.scale = MODEL_SCALE;
698
699 if (self->spawnflags & 8)
700 {
701 self->monsterinfo.power_armor_type = POWER_ARMOR_SHIELD;
702 self->monsterinfo.power_armor_power = 400;
703 }
704 walkmonster_start(self);
705 }
706