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