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
brain_sight(edict_t * self,edict_t * other)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
brain_search(edict_t * self)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
brain_stand(edict_t * self)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
brain_idle(edict_t * self)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
brain_walk(edict_t * self)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
brain_swing_right(edict_t * self)402 void brain_swing_right (edict_t *self)
403 {
404 gi.sound (self, CHAN_BODY, sound_melee1, 1, ATTN_NORM, 0);
405 }
406
brain_hit_right(edict_t * self)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
brain_swing_left(edict_t * self)416 void brain_swing_left (edict_t *self)
417 {
418 gi.sound (self, CHAN_BODY, sound_melee2, 1, ATTN_NORM, 0);
419 }
420
brain_hit_left(edict_t * self)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
brain_chest_open(edict_t * self)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
brain_tentacle_attack(edict_t * self)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
brain_chest_closed(edict_t * self)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
brain_melee(edict_t * self)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
brain_run(edict_t * self)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
brain_pain(edict_t * self,edict_t * other,float kick,int damage)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
brain_dead(edict_t * self)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
brain_die(edict_t * self,edict_t * inflictor,edict_t * attacker,int damage,vec3_t point)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
brain_duck(edict_t * self,float eta)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 */
SP_monster_brain(edict_t * self)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 }
702