|
|
1.1 root 1: /*
2: ==============================================================================
3:
4: boss5
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 BossExplode2 (edict_t *self);
24:
25: void TreadSound2 (edict_t *self)
26: {
27: gi.sound (self, CHAN_VOICE, tread_sound, 1, ATTN_NORM, 0);
28: }
29:
30: void boss5_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 boss5_dead (edict_t *self);
40: void boss5Rocket (edict_t *self);
41: void boss5MachineGun (edict_t *self);
42: void boss5_reattack1(edict_t *self);
43:
44:
45: //
46: // stand
47: //
48:
49: mframe_t boss5_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 boss5_move_stand = {FRAME_stand_1, FRAME_stand_60, boss5_frames_stand, NULL};
113:
114: void boss5_stand (edict_t *self)
115: {
116: self->monsterinfo.currentmove = &boss5_move_stand;
117: }
118:
119:
120: mframe_t boss5_frames_run [] =
121: {
122: ai_run, 12, TreadSound2,
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 boss5_move_run = {FRAME_forwrd_1, FRAME_forwrd_18, boss5_frames_run, NULL};
142:
143: //
144: // walk
145: //
146:
147:
148: mframe_t boss5_frames_forward [] =
149: {
150: ai_walk, 4, TreadSound2,
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 boss5_move_forward = {FRAME_forwrd_1, FRAME_forwrd_18, boss5_frames_forward, NULL};
170:
171: void boss5_forward (edict_t *self)
172: {
173: self->monsterinfo.currentmove = &boss5_move_forward;
174: }
175:
176: void boss5_walk (edict_t *self)
177: {
178: self->monsterinfo.currentmove = &boss5_move_forward;
179: }
180:
181: void boss5_run (edict_t *self)
182: {
183: if (self->monsterinfo.aiflags & AI_STAND_GROUND)
184: self->monsterinfo.currentmove = &boss5_move_stand;
185: else
186: self->monsterinfo.currentmove = &boss5_move_run;
187: }
188:
189: mframe_t boss5_frames_turn_right [] =
190: {
191: ai_move, 0, TreadSound2,
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 boss5_move_turn_right = {FRAME_right_1, FRAME_right_18, boss5_frames_turn_right, boss5_run};
211:
212: mframe_t boss5_frames_turn_left [] =
213: {
214: ai_move, 0, TreadSound2,
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 boss5_move_turn_left = {FRAME_left_1, FRAME_left_18, boss5_frames_turn_left, boss5_run};
234:
235:
236: mframe_t boss5_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 boss5_move_pain3 = {FRAME_pain3_9, FRAME_pain3_12, boss5_frames_pain3, boss5_run};
244:
245: mframe_t boss5_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 boss5_move_pain2 = {FRAME_pain2_5, FRAME_pain2_8, boss5_frames_pain2, boss5_run};
253:
254: mframe_t boss5_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 boss5_move_pain1 = {FRAME_pain1_1, FRAME_pain1_4, boss5_frames_pain1, boss5_run};
262:
263: mframe_t boss5_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, BossExplode2
289: };
290: mmove_t boss5_move_death = {FRAME_death_1, FRAME_death_24, boss5_frames_death1, boss5_dead};
291:
292: mframe_t boss5_frames_backward[] =
293: {
294: ai_walk, 0, TreadSound2,
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 boss5_move_backward = {FRAME_backwd_1, FRAME_backwd_18, boss5_frames_backward, NULL};
314:
315: mframe_t boss5_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 boss5_move_attack4 = {FRAME_attak4_1, FRAME_attak4_6, boss5_frames_attack4, boss5_run};
325:
326: mframe_t boss5_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 boss5_move_attack3 = {FRAME_attak3_1, FRAME_attak3_27, boss5_frames_attack3, boss5_run};
357:
358: mframe_t boss5_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, boss5Rocket,
368: ai_move, 0, NULL,
369: ai_move, 0, NULL,
370: ai_move, 0, boss5Rocket,
371: ai_move, 0, NULL,
372: ai_move, 0, NULL,
373: ai_move, 0, boss5Rocket,
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 boss5_move_attack2 = {FRAME_attak2_1, FRAME_attak2_27, boss5_frames_attack2, boss5_run};
389:
390: mframe_t boss5_frames_attack1[]=
391: {
392: ai_charge, 0, boss5MachineGun,
393: ai_charge, 0, boss5MachineGun,
394: ai_charge, 0, boss5MachineGun,
395: ai_charge, 0, boss5MachineGun,
396: ai_charge, 0, boss5MachineGun,
397: ai_charge, 0, boss5MachineGun,
398:
399: };
400: mmove_t boss5_move_attack1 = {FRAME_attak1_1, FRAME_attak1_6, boss5_frames_attack1, boss5_reattack1};
401:
402: mframe_t boss5_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 boss5_move_end_attack1 = {FRAME_attak1_7, FRAME_attak1_20, boss5_frames_end_attack1, boss5_run};
420:
421:
422: void boss5_reattack1(edict_t *self)
423: {
424: if (visible(self, self->enemy))
425: if (random() < 0.9)
426: self->monsterinfo.currentmove = &boss5_move_attack1;
427: else
428: self->monsterinfo.currentmove = &boss5_move_end_attack1;
429: else
430: self->monsterinfo.currentmove = &boss5_move_end_attack1;
431: }
432:
433: void boss5_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 (damage <= 10)
455: {
456: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM,0);
457: self->monsterinfo.currentmove = &boss5_move_pain1;
458: }
459: else if (damage <= 25)
460: {
461: gi.sound (self, CHAN_VOICE, sound_pain3, 1, ATTN_NORM,0);
462: self->monsterinfo.currentmove = &boss5_move_pain2;
463: }
464: else
465: {
466: gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM,0);
467: self->monsterinfo.currentmove = &boss5_move_pain3;
468: }
469: };
470:
471:
472: void boss5Rocket (edict_t *self)
473: {
474: vec3_t forward, right;
475: vec3_t start;
476: vec3_t dir;
477: vec3_t vec;
478: int flash_number;
479:
480: if (self->s.frame == FRAME_attak2_8)
481: flash_number = MZ2_SUPERTANK_ROCKET_1;
482: else if (self->s.frame == FRAME_attak2_11)
483: flash_number = MZ2_SUPERTANK_ROCKET_2;
484: else // (self->s.frame == FRAME_attak2_14)
485: flash_number = MZ2_SUPERTANK_ROCKET_3;
486:
487: AngleVectors (self->s.angles, forward, right, NULL);
488: G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);
489:
490: VectorCopy (self->enemy->s.origin, vec);
491: vec[2] += self->enemy->viewheight;
492: VectorSubtract (vec, start, dir);
493: VectorNormalize (dir);
494:
495: monster_fire_rocket (self, start, dir, 50, 500, flash_number);
496:
497: }
498:
499: void boss5MachineGun (edict_t *self)
500: {
501: vec3_t dir;
502: vec3_t vec;
503: vec3_t start;
504: vec3_t forward, right;
505: int flash_number;
506:
507: flash_number = MZ2_SUPERTANK_MACHINEGUN_1 + (self->s.frame - FRAME_attak1_1);
508:
509: //FIXME!!!
510: dir[0] = 0;
511: dir[1] = self->s.angles[1];
512: dir[2] = 0;
513:
514: AngleVectors (dir, forward, right, NULL);
515: G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, start);
516:
517: if (self->enemy)
518: {
519: VectorCopy (self->enemy->s.origin, vec);
520: VectorMA (vec, 0, self->enemy->velocity, vec);
521: vec[2] += self->enemy->viewheight;
522: VectorSubtract (vec, start, forward);
523: VectorNormalize (forward);
524: }
525:
526: monster_fire_bullet (self, start, forward, 6, 4, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, flash_number);
527: }
528:
529:
530: void boss5_attack(edict_t *self)
531: {
532: vec3_t vec;
533: float range;
534: //float r;
535:
536: VectorSubtract (self->enemy->s.origin, self->s.origin, vec);
537: range = VectorLength (vec);
538:
539: //r = random();
540:
541: // Attack 1 == Chaingun
542: // Attack 2 == Rocket Launcher
543:
544: if (range <= 160)
545: {
546: self->monsterinfo.currentmove = &boss5_move_attack1;
547: }
548: else
549: { // fire rockets more often at distance
550: if (random() < 0.3)
551: self->monsterinfo.currentmove = &boss5_move_attack1;
552: else
553: self->monsterinfo.currentmove = &boss5_move_attack2;
554: }
555: }
556:
557:
558: //
559: // death
560: //
561:
562: void boss5_dead (edict_t *self)
563: {
564: /*
565: VectorSet (self->mins, -16, -16, -24);
566: VectorSet (self->maxs, 16, 16, -8);
567: */
568: VectorSet (self->mins, -60, -60, 0);
569: VectorSet (self->maxs, 60, 60, 72);
570: self->movetype = MOVETYPE_TOSS;
571: self->svflags |= SVF_DEADMONSTER;
572: self->nextthink = 0;
573: gi.linkentity (self);
574: }
575:
576:
577: void BossExplode2 (edict_t *self)
578: {
579: vec3_t org;
580: int n;
581:
582: self->think = BossExplode2;
583: VectorCopy (self->s.origin, org);
584: org[2] += 24 + (rand()&15);
585: switch (self->count++)
586: {
587: case 0:
588: org[0] -= 24;
589: org[1] -= 24;
590: break;
591: case 1:
592: org[0] += 24;
593: org[1] += 24;
594: break;
595: case 2:
596: org[0] += 24;
597: org[1] -= 24;
598: break;
599: case 3:
600: org[0] -= 24;
601: org[1] += 24;
602: break;
603: case 4:
604: org[0] -= 48;
605: org[1] -= 48;
606: break;
607: case 5:
608: org[0] += 48;
609: org[1] += 48;
610: break;
611: case 6:
612: org[0] -= 48;
613: org[1] += 48;
614: break;
615: case 7:
616: org[0] += 48;
617: org[1] -= 48;
618: break;
619: case 8:
620: self->s.sound = 0;
621: for (n= 0; n < 4; n++)
622: ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", 500, GIB_ORGANIC);
623: for (n= 0; n < 8; n++)
624: ThrowGib (self, "models/objects/gibs/sm_metal/tris.md2", 500, GIB_METALLIC);
625: ThrowGib (self, "models/objects/gibs/chest/tris.md2", 500, GIB_ORGANIC);
626: ThrowHead (self, "models/objects/gibs/gear/tris.md2", 500, GIB_METALLIC);
627: self->deadflag = DEAD_DEAD;
628: return;
629: }
630:
631: gi.WriteByte (svc_temp_entity);
632: gi.WriteByte (TE_EXPLOSION1);
633: gi.WritePosition (org);
634: gi.multicast (self->s.origin, MULTICAST_PVS);
635:
636: self->nextthink = level.time + 0.1;
637: }
638:
639:
640: void boss5_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
641: {
642: gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
643: self->deadflag = DEAD_DEAD;
644: self->takedamage = DAMAGE_NO;
645: self->count = 0;
646: self->monsterinfo.currentmove = &boss5_move_death;
647: }
648:
649: //
650: // monster_boss5
651: //
652:
653: /*QUAKED monster_boss5 (1 .5 0) (-64 -64 0) (64 64 72) Ambush Trigger_Spawn Sight
654: */
655: void SP_monster_boss5 (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/boss5/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 = boss5_pain;
684: self->die = boss5_die;
685: self->monsterinfo.stand = boss5_stand;
686: self->monsterinfo.walk = boss5_walk;
687: self->monsterinfo.run = boss5_run;
688: self->monsterinfo.dodge = NULL;
689: self->monsterinfo.attack = boss5_attack;
690: self->monsterinfo.search = boss5_search;
691: self->monsterinfo.melee = NULL;
692: self->monsterinfo.sight = NULL;
693:
694: gi.linkentity (self);
695:
696: self->monsterinfo.currentmove = &boss5_move_stand;
697: self->monsterinfo.scale = MODEL_SCALE;
698:
699: // RAFAEL
700: self->monsterinfo.power_armor_type = POWER_ARMOR_SHIELD;
701: self->monsterinfo.power_armor_power = 400;
702:
703:
704: walkmonster_start(self);
705: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.