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