|
|
1.1 root 1: /*
2: ==============================================================================
3:
4: brain
5:
6: ==============================================================================
7: */
8:
9: #include "g_local.h"
10: #include "m_brain.h"
11:
12:
13: static int sound_chest_open;
14: static int sound_tentacles_extend;
15: static int sound_tentacles_retract;
16: static int sound_death;
17: static int sound_idle1;
18: static int sound_idle2;
19: static int sound_idle3;
20: static int sound_pain1;
21: static int sound_pain2;
22: static int sound_sight;
23: static int sound_search;
24: static int sound_melee1;
25: static int sound_melee2;
26: static int sound_melee3;
27:
28:
29: void brain_sight (edict_t *self, edict_t *other)
30: {
31: gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
32: }
33:
34: void brain_search (edict_t *self)
35: {
36: gi.sound (self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0);
37: }
38:
39:
40: void brain_run (edict_t *self);
41: void brain_dead (edict_t *self);
42:
43:
44: //
45: // STAND
46: //
47:
48: mframe_t brain_frames_stand [] =
49: {
50: ai_stand, 0, NULL,
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:
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:
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: };
83: mmove_t brain_move_stand = {FRAME_stand01, FRAME_stand30, brain_frames_stand, NULL};
84:
85: void brain_stand (edict_t *self)
86: {
87: self->monsterinfo.currentmove = &brain_move_stand;
88: }
89:
90:
91: //
92: // IDLE
93: //
94:
95: mframe_t brain_frames_idle [] =
96: {
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:
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:
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: };
130: mmove_t brain_move_idle = {FRAME_stand31, FRAME_stand60, brain_frames_idle, brain_stand};
131:
132: void brain_idle (edict_t *self)
133: {
134: gi.sound (self, CHAN_AUTO, sound_idle3, 1, ATTN_IDLE, 0);
135: self->monsterinfo.currentmove = &brain_move_idle;
136: }
137:
138:
139: //
140: // WALK
141: //
142: mframe_t brain_frames_walk1 [] =
143: {
144: ai_walk, 7, NULL,
145: ai_walk, 2, NULL,
146: ai_walk, 3, NULL,
147: ai_walk, 3, NULL,
148: ai_walk, 1, NULL,
149: ai_walk, 0, NULL,
150: ai_walk, 0, NULL,
151: ai_walk, 9, NULL,
152: ai_walk, -4, NULL,
153: ai_walk, -1, NULL,
154: ai_walk, 2, NULL
155: };
156: mmove_t brain_move_walk1 = {FRAME_walk101, FRAME_walk111, brain_frames_walk1, NULL};
157:
158: // walk2 is FUBAR, do not use
159: #if 0
160: void brain_walk2_cycle (edict_t *self)
161: {
162: if (random() > 0.1)
163: self->monsterinfo.nextframe = FRAME_walk220;
164: }
165:
166: mframe_t brain_frames_walk2 [] =
167: {
168: ai_walk, 3, NULL,
169: ai_walk, -2, NULL,
170: ai_walk, -4, NULL,
171: ai_walk, -3, NULL,
172: ai_walk, 0, NULL,
173: ai_walk, 1, NULL,
174: ai_walk, 12, NULL,
175: ai_walk, 0, NULL,
176: ai_walk, -3, NULL,
177: ai_walk, 0, NULL,
178:
179: ai_walk, -2, NULL,
180: ai_walk, 0, NULL,
181: ai_walk, 0, NULL,
182: ai_walk, 1, NULL,
183: ai_walk, 0, NULL,
184: ai_walk, 0, NULL,
185: ai_walk, 0, NULL,
186: ai_walk, 0, NULL,
187: ai_walk, 0, NULL,
188: ai_walk, 10, NULL, // Cycle Start
189:
190: ai_walk, -1, NULL,
191: ai_walk, 7, NULL,
192: ai_walk, 0, NULL,
193: ai_walk, 3, NULL,
194: ai_walk, -3, NULL,
195: ai_walk, 2, NULL,
196: ai_walk, 4, NULL,
197: ai_walk, -3, NULL,
198: ai_walk, 2, NULL,
199: ai_walk, 0, NULL,
200:
201: ai_walk, 4, brain_walk2_cycle,
202: ai_walk, -1, NULL,
203: ai_walk, -1, NULL,
204: ai_walk, -8, NULL,
205: ai_walk, 0, NULL,
206: ai_walk, 1, NULL,
207: ai_walk, 5, NULL,
208: ai_walk, 2, NULL,
209: ai_walk, -1, NULL,
210: ai_walk, -5, NULL
211: };
212: mmove_t brain_move_walk2 = {FRAME_walk201, FRAME_walk240, brain_frames_walk2, NULL};
213: #endif
214:
215: void brain_walk (edict_t *self)
216: {
217: // if (random() <= 0.5)
218: self->monsterinfo.currentmove = &brain_move_walk1;
219: // else
220: // self->monsterinfo.currentmove = &brain_move_walk2;
221: }
222:
223:
224:
225: mframe_t brain_frames_defense [] =
226: {
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: ai_move, 0, NULL,
233: ai_move, 0, NULL,
234: ai_move, 0, NULL,
235: ai_move, 0, NULL
236: };
237: mmove_t brain_move_defense = {FRAME_defens01, FRAME_defens08, brain_frames_defense, NULL};
238:
239: mframe_t brain_frames_pain3 [] =
240: {
241: ai_move, -2, NULL,
242: ai_move, 2, NULL,
243: ai_move, 1, NULL,
244: ai_move, 3, NULL,
245: ai_move, 0, NULL,
246: ai_move, -4, NULL
247: };
248: mmove_t brain_move_pain3 = {FRAME_pain301, FRAME_pain306, brain_frames_pain3, brain_run};
249:
250: mframe_t brain_frames_pain2 [] =
251: {
252: ai_move, -2, NULL,
253: ai_move, 0, NULL,
254: ai_move, 0, NULL,
255: ai_move, 0, NULL,
256: ai_move, 0, NULL,
257: ai_move, 3, NULL,
258: ai_move, 1, NULL,
259: ai_move, -2, NULL
260: };
261: mmove_t brain_move_pain2 = {FRAME_pain201, FRAME_pain208, brain_frames_pain2, brain_run};
262:
263: mframe_t brain_frames_pain1 [] =
264: {
265: ai_move, -6, NULL,
266: ai_move, -2, NULL,
267: ai_move, -6, 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, 2, NULL,
279: ai_move, 0, NULL,
280: ai_move, 2, NULL,
281: ai_move, 1, NULL,
282: ai_move, 7, NULL,
283: ai_move, 0, NULL,
284: ai_move, 3, NULL,
285: ai_move, -1, NULL
286: };
287: mmove_t brain_move_pain1 = {FRAME_pain101, FRAME_pain121, brain_frames_pain1, brain_run};
288:
289: mframe_t brain_frames_duck [] =
290: {
291: ai_move, 0, NULL,
292: ai_move, -2, monster_duck_down,
293: ai_move, 17, monster_duck_hold,
294: ai_move, -3, NULL,
295: ai_move, -1, monster_duck_up,
296: ai_move, -5, NULL,
297: ai_move, -6, NULL,
298: ai_move, -6, NULL
299: };
300: mmove_t brain_move_duck = {FRAME_duck01, FRAME_duck08, brain_frames_duck, brain_run};
301:
302: /*
303: void brain_dodge (edict_t *self, edict_t *attacker, float eta, trace_t *tr)
304: {
305: //========
306: //PMM - new dodge code
307: float r;
308: float height;
309:
310: if (!self->enemy)
311: {
312: self->enemy = attacker;
313: FoundTarget (self);
314: }
315:
316: // PMM - don't bother if it's going to hit anyway; fix for weird in-your-face etas (I was
317: // seeing numbers like 13 and 14)
318: if ((eta < 0.1) || (eta > 5))
319: return;
320:
321: r = random();
322: if (r > (0.25*((skill->value)+1)))
323: return;
324:
325: if (self->monsterinfo.aiflags & AI_DODGING)
326: {
327: height = self->absmax[2];
328: }
329: else
330: {
331: height = self->absmax[2]-32-1; // the -1 is because the absmax is s.origin + maxs + 1
332: }
333:
334: // check to see if it makes sense to duck
335: if (tr->endpos[2] <= height)
336: {
337: // if it doesn't sense to duck, try to strafe and shoot
338: // FIXME - this guy is so slow, it's not worth it
339:
340: //vec3_t forward,right,up,diff;
341:
342: monster_done_dodge (self);
343: return;
344: }
345:
346: if (skill->value == 0)
347: {
348: self->monsterinfo.currentmove = &brain_move_duck;
349: // PMM - stupid dodge
350: self->monsterinfo.duck_wait_time = level.time + eta + 1;
351: self->monsterinfo.aiflags |= AI_DODGING;
352: return;
353: }
354:
355: self->monsterinfo.currentmove = &brain_move_duck;
356: self->monsterinfo.duck_wait_time = level.time + eta + (0.1 * (3 - skill->value));
357: self->monsterinfo.aiflags |= AI_DODGING;
358: return;
359: //============
360: //PMM
361: }
362: */
363:
364: mframe_t brain_frames_death2 [] =
365: {
366: ai_move, 0, NULL,
367: ai_move, 0, NULL,
368: ai_move, 0, NULL,
369: ai_move, 9, NULL,
370: ai_move, 0, NULL
371: };
372: mmove_t brain_move_death2 = {FRAME_death201, FRAME_death205, brain_frames_death2, brain_dead};
373:
374: mframe_t brain_frames_death1 [] =
375: {
376: ai_move, 0, NULL,
377: ai_move, 0, NULL,
378: ai_move, -2, NULL,
379: ai_move, 9, 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: ai_move, 0, NULL,
388: ai_move, 0, NULL,
389: ai_move, 0, NULL,
390: ai_move, 0, NULL,
391: ai_move, 0, NULL,
392: ai_move, 0, NULL,
393: ai_move, 0, NULL
394: };
395: mmove_t brain_move_death1 = {FRAME_death101, FRAME_death118, brain_frames_death1, brain_dead};
396:
397:
398: //
399: // MELEE
400: //
401:
402: void brain_swing_right (edict_t *self)
403: {
404: gi.sound (self, CHAN_BODY, sound_melee1, 1, ATTN_NORM, 0);
405: }
406:
407: void brain_hit_right (edict_t *self)
408: {
409: vec3_t aim;
410:
411: VectorSet (aim, MELEE_DISTANCE, self->maxs[0], 8);
412: if (fire_hit (self, aim, (15 + (rand() %5)), 40))
413: gi.sound (self, CHAN_WEAPON, sound_melee3, 1, ATTN_NORM, 0);
414: }
415:
416: void brain_swing_left (edict_t *self)
417: {
418: gi.sound (self, CHAN_BODY, sound_melee2, 1, ATTN_NORM, 0);
419: }
420:
421: void brain_hit_left (edict_t *self)
422: {
423: vec3_t aim;
424:
425: VectorSet (aim, MELEE_DISTANCE, self->mins[0], 8);
426: if (fire_hit (self, aim, (15 + (rand() %5)), 40))
427: gi.sound (self, CHAN_WEAPON, sound_melee3, 1, ATTN_NORM, 0);
428: }
429:
430: mframe_t brain_frames_attack1 [] =
431: {
432: ai_charge, 8, NULL,
433: ai_charge, 3, NULL,
434: ai_charge, 5, NULL,
435: ai_charge, 0, NULL,
436: ai_charge, -3, brain_swing_right,
437: ai_charge, 0, NULL,
438: ai_charge, -5, NULL,
439: ai_charge, -7, brain_hit_right,
440: ai_charge, 0, NULL,
441: ai_charge, 6, brain_swing_left,
442: ai_charge, 1, NULL,
443: ai_charge, 2, brain_hit_left,
444: ai_charge, -3, NULL,
445: ai_charge, 6, NULL,
446: ai_charge, -1, NULL,
447: ai_charge, -3, NULL,
448: ai_charge, 2, NULL,
449: ai_charge, -11,NULL
450: };
451: mmove_t brain_move_attack1 = {FRAME_attak101, FRAME_attak118, brain_frames_attack1, brain_run};
452:
453: void brain_chest_open (edict_t *self)
454: {
455: self->spawnflags &= ~65536;
456: self->monsterinfo.power_armor_type = POWER_ARMOR_NONE;
457: gi.sound (self, CHAN_BODY, sound_chest_open, 1, ATTN_NORM, 0);
458: }
459:
460: void brain_tentacle_attack (edict_t *self)
461: {
462: vec3_t aim;
463:
464: VectorSet (aim, MELEE_DISTANCE, 0, 8);
465: if (fire_hit (self, aim, (10 + (rand() %5)), -600) && skill->value > 0)
466: self->spawnflags |= 65536;
467: gi.sound (self, CHAN_WEAPON, sound_tentacles_retract, 1, ATTN_NORM, 0);
468: }
469:
470: void brain_chest_closed (edict_t *self)
471: {
472: self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
473: if (self->spawnflags & 65536)
474: {
475: self->spawnflags &= ~65536;
476: self->monsterinfo.currentmove = &brain_move_attack1;
477: }
478: }
479:
480: mframe_t brain_frames_attack2 [] =
481: {
482: ai_charge, 5, NULL,
483: ai_charge, -4, NULL,
484: ai_charge, -4, NULL,
485: ai_charge, -3, NULL,
486: ai_charge, 0, brain_chest_open,
487: ai_charge, 0, NULL,
488: ai_charge, 13, brain_tentacle_attack,
489: ai_charge, 0, NULL,
490: ai_charge, 2, NULL,
491: ai_charge, 0, NULL,
492: ai_charge, -9, brain_chest_closed,
493: ai_charge, 0, NULL,
494: ai_charge, 4, NULL,
495: ai_charge, 3, NULL,
496: ai_charge, 2, NULL,
497: ai_charge, -3, NULL,
498: ai_charge, -6, NULL
499: };
500: mmove_t brain_move_attack2 = {FRAME_attak201, FRAME_attak217, brain_frames_attack2, brain_run};
501:
502: void brain_melee(edict_t *self)
503: {
504: if (random() <= 0.5)
505: self->monsterinfo.currentmove = &brain_move_attack1;
506: else
507: self->monsterinfo.currentmove = &brain_move_attack2;
508: }
509:
510:
511: //
512: // RUN
513: //
514:
515: mframe_t brain_frames_run [] =
516: {
517: ai_run, 9, NULL,
518: ai_run, 2, NULL,
519: ai_run, 3, NULL,
520: ai_run, 3, NULL,
521: ai_run, 1, NULL,
522: ai_run, 0, NULL,
523: ai_run, 0, NULL,
524: ai_run, 10, NULL,
525: ai_run, -4, NULL,
526: ai_run, -1, NULL,
527: ai_run, 2, NULL
528: };
529: mmove_t brain_move_run = {FRAME_walk101, FRAME_walk111, brain_frames_run, NULL};
530:
531: void brain_run (edict_t *self)
532: {
533: self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
534: if (self->monsterinfo.aiflags & AI_STAND_GROUND)
535: self->monsterinfo.currentmove = &brain_move_stand;
536: else
537: self->monsterinfo.currentmove = &brain_move_run;
538: }
539:
540:
541: void brain_pain (edict_t *self, edict_t *other, float kick, int damage)
542: {
543: float r;
544:
545: if (self->health < (self->max_health / 2))
546: self->s.skinnum = 1;
547:
548: if (level.time < self->pain_debounce_time)
549: return;
550:
551: self->pain_debounce_time = level.time + 3;
552:
553: if (skill->value == 3)
554: return; // no pain anims in nightmare
555:
556: r = random();
557: if (r < 0.33)
558: {
559: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
560: self->monsterinfo.currentmove = &brain_move_pain1;
561: }
562: else if (r < 0.66)
563: {
564: gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
565: self->monsterinfo.currentmove = &brain_move_pain2;
566: }
567: else
568: {
569: gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
570: self->monsterinfo.currentmove = &brain_move_pain3;
571: }
572: // PMM - clear duck flag
573: if (self->monsterinfo.aiflags & AI_DUCKED)
574: monster_duck_up(self);
575: }
576:
577: void brain_dead (edict_t *self)
578: {
579: VectorSet (self->mins, -16, -16, -24);
580: VectorSet (self->maxs, 16, 16, -8);
581: self->movetype = MOVETYPE_TOSS;
582: self->svflags |= SVF_DEADMONSTER;
583: self->nextthink = 0;
584: gi.linkentity (self);
585: }
586:
587:
588:
589: void brain_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
590: {
591: int n;
592:
593: self->s.effects = 0;
594: self->monsterinfo.power_armor_type = POWER_ARMOR_NONE;
595:
596: // check for gib
597: if (self->health <= self->gib_health)
598: {
599: gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
600: for (n= 0; n < 2; n++)
601: ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
602: for (n= 0; n < 4; n++)
603: ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
604: ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
605: self->deadflag = DEAD_DEAD;
606: return;
607: }
608:
609: if (self->deadflag == DEAD_DEAD)
610: return;
611:
612: // regular death
613: gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
614: self->deadflag = DEAD_DEAD;
615: self->takedamage = DAMAGE_YES;
616: if (random() <= 0.5)
617: self->monsterinfo.currentmove = &brain_move_death1;
618: else
619: self->monsterinfo.currentmove = &brain_move_death2;
620: }
621:
622: void brain_duck (edict_t *self, float eta)
623: {
624: // has to be done immediately otherwise he can get stuck
625: monster_duck_down(self);
626:
627: if (skill->value == 0)
628: // PMM - stupid dodge
629: self->monsterinfo.duck_wait_time = level.time + eta + 1;
630: else
631: self->monsterinfo.duck_wait_time = level.time + eta + (0.1 * (3 - skill->value));
632:
633: self->monsterinfo.currentmove = &brain_move_duck;
634: self->monsterinfo.nextframe = FRAME_duck01;
635: return;
636: }
637:
638:
639: /*QUAKED monster_brain (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
640: */
641: void SP_monster_brain (edict_t *self)
642: {
643: if (deathmatch->value)
644: {
645: G_FreeEdict (self);
646: return;
647: }
648:
649: sound_chest_open = gi.soundindex ("brain/brnatck1.wav");
650: sound_tentacles_extend = gi.soundindex ("brain/brnatck2.wav");
651: sound_tentacles_retract = gi.soundindex ("brain/brnatck3.wav");
652: sound_death = gi.soundindex ("brain/brndeth1.wav");
653: sound_idle1 = gi.soundindex ("brain/brnidle1.wav");
654: sound_idle2 = gi.soundindex ("brain/brnidle2.wav");
655: sound_idle3 = gi.soundindex ("brain/brnlens1.wav");
656: sound_pain1 = gi.soundindex ("brain/brnpain1.wav");
657: sound_pain2 = gi.soundindex ("brain/brnpain2.wav");
658: sound_sight = gi.soundindex ("brain/brnsght1.wav");
659: sound_search = gi.soundindex ("brain/brnsrch1.wav");
660: sound_melee1 = gi.soundindex ("brain/melee1.wav");
661: sound_melee2 = gi.soundindex ("brain/melee2.wav");
662: sound_melee3 = gi.soundindex ("brain/melee3.wav");
663:
664: self->movetype = MOVETYPE_STEP;
665: self->solid = SOLID_BBOX;
666: self->s.modelindex = gi.modelindex ("models/monsters/brain/tris.md2");
667: VectorSet (self->mins, -16, -16, -24);
668: VectorSet (self->maxs, 16, 16, 32);
669:
670: self->health = 300;
671: self->gib_health = -150;
672: self->mass = 400;
673:
674: self->pain = brain_pain;
675: self->die = brain_die;
676:
677: self->monsterinfo.stand = brain_stand;
678: self->monsterinfo.walk = brain_walk;
679: self->monsterinfo.run = brain_run;
680: // PMM
681: self->monsterinfo.dodge = M_MonsterDodge;
682: self->monsterinfo.duck = brain_duck;
683: self->monsterinfo.unduck = monster_duck_up;
684: // self->monsterinfo.dodge = brain_dodge;
685: // pmm
686: // self->monsterinfo.attack = brain_attack;
687: self->monsterinfo.melee = brain_melee;
688: self->monsterinfo.sight = brain_sight;
689: self->monsterinfo.search = brain_search;
690: self->monsterinfo.idle = brain_idle;
691:
692: self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
693: self->monsterinfo.power_armor_power = 100;
694:
695: gi.linkentity (self);
696:
697: self->monsterinfo.currentmove = &brain_move_stand;
698: self->monsterinfo.scale = MODEL_SCALE;
699:
700: walkmonster_start (self);
701: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.