|
|
1.1 root 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:
25: void TreadSound (edict_t *self)
26: {
27: gi.sound (self, CHAN_VOICE, tread_sound, 1, ATTN_NORM, 0);
28: }
29:
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:
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:
171: void supertank_forward (edict_t *self)
172: {
173: self->monsterinfo.currentmove = &supertank_move_forward;
174: }
175:
176: void supertank_walk (edict_t *self)
177: {
178: self->monsterinfo.currentmove = &supertank_move_forward;
179: }
180:
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:
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:
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:
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->enemy || !self->enemy->inuse) //PGM
484: return; //PGM
485:
486: if (self->s.frame == FRAME_attak2_8)
487: flash_number = MZ2_SUPERTANK_ROCKET_1;
488: else if (self->s.frame == FRAME_attak2_11)
489: flash_number = MZ2_SUPERTANK_ROCKET_2;
490: else // (self->s.frame == FRAME_attak2_14)
491: flash_number = MZ2_SUPERTANK_ROCKET_3;
492:
493: AngleVectors (self->s.angles, forward, right, NULL);
494: G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);
495:
496: VectorCopy (self->enemy->s.origin, vec);
497: vec[2] += self->enemy->viewheight;
498: VectorSubtract (vec, start, dir);
499: VectorNormalize (dir);
500:
501: monster_fire_rocket (self, start, dir, 50, 500, flash_number);
502: }
503:
504: void supertankMachineGun (edict_t *self)
505: {
506: vec3_t dir;
507: vec3_t vec;
508: vec3_t start;
509: vec3_t forward, right;
510: int flash_number;
511:
512: if(!self->enemy || !self->enemy->inuse) //PGM
513: return; //PGM
514:
515: flash_number = MZ2_SUPERTANK_MACHINEGUN_1 + (self->s.frame - FRAME_attak1_1);
516:
517: //FIXME!!!
518: dir[0] = 0;
519: dir[1] = self->s.angles[1];
520: dir[2] = 0;
521:
522: AngleVectors (dir, forward, right, NULL);
523: G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);
524:
525: if (self->enemy)
526: {
527: VectorCopy (self->enemy->s.origin, vec);
528: VectorMA (vec, 0, self->enemy->velocity, vec);
529: vec[2] += self->enemy->viewheight;
530: VectorSubtract (vec, start, forward);
531: VectorNormalize (forward);
532: }
533:
534: monster_fire_bullet (self, start, forward, 6, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, flash_number);
535: }
536:
537:
538: void supertank_attack(edict_t *self)
539: {
540: vec3_t vec;
541: float range;
542: //float r;
543:
544: VectorSubtract (self->enemy->s.origin, self->s.origin, vec);
545: range = VectorLength (vec);
546:
547: //r = random();
548:
549: // Attack 1 == Chaingun
550: // Attack 2 == Rocket Launcher
551:
552: if (range <= 160)
553: {
554: self->monsterinfo.currentmove = &supertank_move_attack1;
555: }
556: else
557: { // fire rockets more often at distance
558: if (random() < 0.3)
559: self->monsterinfo.currentmove = &supertank_move_attack1;
560: else
561: self->monsterinfo.currentmove = &supertank_move_attack2;
562: }
563: }
564:
565:
566: //
567: // death
568: //
569:
570: void supertank_dead (edict_t *self)
571: {
572: VectorSet (self->mins, -60, -60, 0);
573: VectorSet (self->maxs, 60, 60, 72);
574: self->movetype = MOVETYPE_TOSS;
575: self->svflags |= SVF_DEADMONSTER;
576: self->nextthink = 0;
577: gi.linkentity (self);
578: }
579:
580:
581: void BossExplode (edict_t *self)
582: {
583: vec3_t org;
584: int n;
585:
586: self->think = BossExplode;
587: VectorCopy (self->s.origin, org);
588: org[2] += 24 + (rand()&15);
589: switch (self->count++)
590: {
591: case 0:
592: org[0] -= 24;
593: org[1] -= 24;
594: break;
595: case 1:
596: org[0] += 24;
597: org[1] += 24;
598: break;
599: case 2:
600: org[0] += 24;
601: org[1] -= 24;
602: break;
603: case 3:
604: org[0] -= 24;
605: org[1] += 24;
606: break;
607: case 4:
608: org[0] -= 48;
609: org[1] -= 48;
610: break;
611: case 5:
612: org[0] += 48;
613: org[1] += 48;
614: break;
615: case 6:
616: org[0] -= 48;
617: org[1] += 48;
618: break;
619: case 7:
620: org[0] += 48;
621: org[1] -= 48;
622: break;
623: case 8:
624: self->s.sound = 0;
625: for (n= 0; n < 4; n++)
626: ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", 500, GIB_ORGANIC);
627: for (n= 0; n < 8; n++)
628: ThrowGib (self, "models/objects/gibs/sm_metal/tris.md2", 500, GIB_METALLIC);
629: ThrowGib (self, "models/objects/gibs/chest/tris.md2", 500, GIB_ORGANIC);
630: ThrowHead (self, "models/objects/gibs/gear/tris.md2", 500, GIB_METALLIC);
631: self->deadflag = DEAD_DEAD;
632: return;
633: }
634:
635: gi.WriteByte (svc_temp_entity);
636: gi.WriteByte (TE_EXPLOSION1);
637: gi.WritePosition (org);
638: gi.multicast (self->s.origin, MULTICAST_PVS);
639:
640: self->nextthink = level.time + 0.1;
641: }
642:
643:
644: void supertank_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
645: {
646: gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
647: self->deadflag = DEAD_DEAD;
648: self->takedamage = DAMAGE_NO;
649: self->count = 0;
650: self->monsterinfo.currentmove = &supertank_move_death;
651: }
652:
653:
654: //===========
655: //PGM
656: qboolean supertank_blocked (edict_t *self, float dist)
657: {
658: if(blocked_checkshot (self, 0.25 + (0.05 * skill->value) ))
659: return true;
660:
661: if(blocked_checkplat (self, dist))
662: return true;
663:
664: return false;
665: }
666: //PGM
667: //===========
668:
669: //
670: // monster_supertank
671: //
672:
673: /*QUAKED monster_supertank (1 .5 0) (-64 -64 0) (64 64 72) Ambush Trigger_Spawn Sight
674: */
675: void SP_monster_supertank (edict_t *self)
676: {
677: if (deathmatch->value)
678: {
679: G_FreeEdict (self);
680: return;
681: }
682:
683: sound_pain1 = gi.soundindex ("bosstank/btkpain1.wav");
684: sound_pain2 = gi.soundindex ("bosstank/btkpain2.wav");
685: sound_pain3 = gi.soundindex ("bosstank/btkpain3.wav");
686: sound_death = gi.soundindex ("bosstank/btkdeth1.wav");
687: sound_search1 = gi.soundindex ("bosstank/btkunqv1.wav");
688: sound_search2 = gi.soundindex ("bosstank/btkunqv2.wav");
689:
690: // self->s.sound = gi.soundindex ("bosstank/btkengn1.wav");
691: tread_sound = gi.soundindex ("bosstank/btkengn1.wav");
692:
693: self->movetype = MOVETYPE_STEP;
694: self->solid = SOLID_BBOX;
695: self->s.modelindex = gi.modelindex ("models/monsters/boss1/tris.md2");
696: VectorSet (self->mins, -64, -64, 0);
697: VectorSet (self->maxs, 64, 64, 112);
698:
699: self->health = 1500;
700: self->gib_health = -500;
701: self->mass = 800;
702:
703: self->pain = supertank_pain;
704: self->die = supertank_die;
705: self->monsterinfo.stand = supertank_stand;
706: self->monsterinfo.walk = supertank_walk;
707: self->monsterinfo.run = supertank_run;
708: self->monsterinfo.dodge = NULL;
709: self->monsterinfo.attack = supertank_attack;
710: self->monsterinfo.search = supertank_search;
711: self->monsterinfo.melee = NULL;
712: self->monsterinfo.sight = NULL;
713: self->monsterinfo.blocked = supertank_blocked; //PGM
714:
715: gi.linkentity (self);
716:
717: self->monsterinfo.currentmove = &supertank_move_stand;
718: self->monsterinfo.scale = MODEL_SCALE;
719:
720: walkmonster_start(self);
721:
722: //PMM
723: self->monsterinfo.aiflags |= AI_IGNORE_SHOTS;
724: //pmm
725: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.