home *** CD-ROM | disk | FTP | other *** search
/ Gambler 19 / GAMBLERCD19.BIN / UTILS / 3D / BRONIE / DUAL_LAU.ZIP / src / m_brain.c < prev    next >
C/C++ Source or Header  |  1997-11-26  |  15KB  |  655 lines

  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.  
  290. //
  291. // DUCK
  292. //
  293.  
  294. void brain_duck_down (edict_t *self)
  295. {
  296.     if (self->monsterinfo.aiflags & AI_DUCKED)
  297.         return;
  298.     self->monsterinfo.aiflags |= AI_DUCKED;
  299.     self->maxs[2] -= 32;
  300.     self->takedamage = DAMAGE_YES;
  301.     gi.linkentity (self);
  302. }
  303.  
  304. void brain_duck_hold (edict_t *self)
  305. {
  306.     if (level.time >= self->monsterinfo.pausetime)
  307.         self->monsterinfo.aiflags &= ~AI_HOLD_FRAME;
  308.     else
  309.         self->monsterinfo.aiflags |= AI_HOLD_FRAME;
  310. }
  311.  
  312. void brain_duck_up (edict_t *self)
  313. {
  314.     self->monsterinfo.aiflags &= ~AI_DUCKED;
  315.     self->maxs[2] += 32;
  316.     self->takedamage = DAMAGE_AIM;
  317.     gi.linkentity (self);
  318. }
  319.  
  320. mframe_t brain_frames_duck [] =
  321. {
  322.     ai_move,    0,    NULL,
  323.     ai_move,    -2,    brain_duck_down,
  324.     ai_move,    17,    brain_duck_hold,
  325.     ai_move,    -3,    NULL,
  326.     ai_move,    -1,    brain_duck_up,
  327.     ai_move,    -5,    NULL,
  328.     ai_move,    -6,    NULL,
  329.     ai_move,    -6,    NULL
  330. };
  331. mmove_t brain_move_duck = {FRAME_duck01, FRAME_duck08, brain_frames_duck, brain_run};
  332.  
  333. void brain_dodge (edict_t *self, edict_t *attacker, float eta)
  334. {
  335.     if (random() > 0.25)
  336.         return;
  337.  
  338.     if (!self->enemy)
  339.         self->enemy = attacker;
  340.  
  341.     self->monsterinfo.pausetime = level.time + eta + 0.5;
  342.     self->monsterinfo.currentmove = &brain_move_duck;
  343. }
  344.  
  345.  
  346. mframe_t brain_frames_death2 [] =
  347. {
  348.     ai_move,    0,    NULL,
  349.     ai_move,    0,    NULL,
  350.     ai_move,    0,    NULL,
  351.     ai_move,    9,    NULL,
  352.     ai_move,    0,    NULL
  353. };
  354. mmove_t brain_move_death2 = {FRAME_death201, FRAME_death205, brain_frames_death2, brain_dead};
  355.  
  356. mframe_t brain_frames_death1 [] =
  357. {
  358.     ai_move,    0,    NULL,
  359.     ai_move,    0,    NULL,
  360.     ai_move,    -2,    NULL,
  361.     ai_move,    9,    NULL,
  362.     ai_move,    0,    NULL,
  363.     ai_move,    0,    NULL,
  364.     ai_move,    0,    NULL,
  365.     ai_move,    0,    NULL,
  366.     ai_move,    0,    NULL,
  367.     ai_move,    0,    NULL,
  368.     ai_move,    0,    NULL,
  369.     ai_move,    0,    NULL,
  370.     ai_move,    0,    NULL,
  371.     ai_move,    0,    NULL,
  372.     ai_move,    0,    NULL,
  373.     ai_move,    0,    NULL,
  374.     ai_move,    0,    NULL,
  375.     ai_move,    0,    NULL
  376. };
  377. mmove_t brain_move_death1 = {FRAME_death101, FRAME_death118, brain_frames_death1, brain_dead};
  378.  
  379.  
  380. //
  381. // MELEE
  382. //
  383.  
  384. void brain_swing_right (edict_t *self)
  385. {
  386.     gi.sound (self, CHAN_BODY, sound_melee1, 1, ATTN_NORM, 0);
  387. }
  388.  
  389. void brain_hit_right (edict_t *self)
  390. {
  391.     vec3_t    aim;
  392.  
  393.     VectorSet (aim, MELEE_DISTANCE, self->maxs[0], 8);
  394.     if (fire_hit (self, aim, (15 + (rand() %5)), 40))
  395.         gi.sound (self, CHAN_WEAPON, sound_melee3, 1, ATTN_NORM, 0);
  396. }
  397.  
  398. void brain_swing_left (edict_t *self)
  399. {
  400.     gi.sound (self, CHAN_BODY, sound_melee2, 1, ATTN_NORM, 0);
  401. }
  402.  
  403. void brain_hit_left (edict_t *self)
  404. {
  405.     vec3_t    aim;
  406.  
  407.     VectorSet (aim, MELEE_DISTANCE, self->mins[0], 8);
  408.     if (fire_hit (self, aim, (15 + (rand() %5)), 40))
  409.         gi.sound (self, CHAN_WEAPON, sound_melee3, 1, ATTN_NORM, 0);
  410. }
  411.  
  412. mframe_t brain_frames_attack1 [] =
  413. {
  414.     ai_charge,    8,    NULL,
  415.     ai_charge,    3,    NULL,
  416.     ai_charge,    5,    NULL,
  417.     ai_charge,    0,    NULL,
  418.     ai_charge,    -3,    brain_swing_right,
  419.     ai_charge,    0,    NULL,
  420.     ai_charge,    -5,    NULL,
  421.     ai_charge,    -7,    brain_hit_right,
  422.     ai_charge,    0,    NULL,
  423.     ai_charge,    6,    brain_swing_left,
  424.     ai_charge,    1,    NULL,
  425.     ai_charge,    2,    brain_hit_left,
  426.     ai_charge,    -3,    NULL,
  427.     ai_charge,    6,    NULL,
  428.     ai_charge,    -1,    NULL,
  429.     ai_charge,    -3,    NULL,
  430.     ai_charge,    2,    NULL,
  431.     ai_charge,    -11,NULL
  432. };
  433. mmove_t brain_move_attack1 = {FRAME_attak101, FRAME_attak118, brain_frames_attack1, brain_run};
  434.  
  435. void brain_chest_open (edict_t *self)
  436. {
  437.     self->spawnflags &= ~65536;
  438.     self->monsterinfo.power_armor_type = POWER_ARMOR_NONE;
  439.     gi.sound (self, CHAN_BODY, sound_chest_open, 1, ATTN_NORM, 0);
  440. }
  441.  
  442. void brain_tentacle_attack (edict_t *self)
  443. {
  444.     vec3_t    aim;
  445.  
  446.     VectorSet (aim, MELEE_DISTANCE, 0, 8);
  447.     if (fire_hit (self, aim, (10 + (rand() %5)), -600) && skill->value > 0)
  448.         self->spawnflags |= 65536;
  449.     gi.sound (self, CHAN_WEAPON, sound_tentacles_retract, 1, ATTN_NORM, 0);
  450. }
  451.  
  452. void brain_chest_closed (edict_t *self)
  453. {
  454.     self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
  455.     if (self->spawnflags & 65536)
  456.     {
  457.         self->spawnflags &= ~65536;
  458.         self->monsterinfo.currentmove = &brain_move_attack1;
  459.     }
  460. }
  461.  
  462. mframe_t brain_frames_attack2 [] =
  463. {
  464.     ai_charge,    5,    NULL,
  465.     ai_charge,    -4,    NULL,
  466.     ai_charge,    -4,    NULL,
  467.     ai_charge,    -3,    NULL,
  468.     ai_charge,    0,    brain_chest_open,
  469.     ai_charge,    0,    NULL,
  470.     ai_charge,    13,    brain_tentacle_attack,
  471.     ai_charge,    0,    NULL,
  472.     ai_charge,    2,    NULL,
  473.     ai_charge,    0,    NULL,
  474.     ai_charge,    -9,    brain_chest_closed,
  475.     ai_charge,    0,    NULL,
  476.     ai_charge,    4,    NULL,
  477.     ai_charge,    3,    NULL,
  478.     ai_charge,    2,    NULL,
  479.     ai_charge,    -3,    NULL,
  480.     ai_charge,    -6,    NULL
  481. };
  482. mmove_t brain_move_attack2 = {FRAME_attak201, FRAME_attak217, brain_frames_attack2, brain_run};
  483.  
  484. void brain_melee(edict_t *self)
  485. {
  486.     if (random() <= 0.5)
  487.         self->monsterinfo.currentmove = &brain_move_attack1;
  488.     else
  489.         self->monsterinfo.currentmove = &brain_move_attack2;
  490. }
  491.  
  492.  
  493. //
  494. // RUN
  495. //
  496.  
  497. mframe_t brain_frames_run [] =
  498. {
  499.     ai_run,    9,    NULL,
  500.     ai_run,    2,    NULL,
  501.     ai_run,    3,    NULL,
  502.     ai_run,    3,    NULL,
  503.     ai_run,    1,    NULL,
  504.     ai_run,    0,    NULL,
  505.     ai_run,    0,    NULL,
  506.     ai_run,    10,    NULL,
  507.     ai_run,    -4,    NULL,
  508.     ai_run,    -1,    NULL,
  509.     ai_run,    2,    NULL
  510. };
  511. mmove_t brain_move_run = {FRAME_walk101, FRAME_walk111, brain_frames_run, NULL};
  512.  
  513. void brain_run (edict_t *self)
  514. {
  515.     self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
  516.     if (self->monsterinfo.aiflags & AI_STAND_GROUND)
  517.         self->monsterinfo.currentmove = &brain_move_stand;
  518.     else
  519.         self->monsterinfo.currentmove = &brain_move_run;
  520. }
  521.  
  522.  
  523. void brain_pain (edict_t *self, edict_t *other, float kick, int damage)
  524. {
  525.     float    r;
  526.  
  527.     if (self->health < (self->max_health / 2))
  528.         self->s.skinnum = 1;
  529.  
  530.     if (level.time < self->pain_debounce_time)
  531.         return;
  532.  
  533.     self->pain_debounce_time = level.time + 3;
  534.  
  535.     r = random();
  536.     if (r < 0.33)
  537.     {
  538.         gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
  539.         self->monsterinfo.currentmove = &brain_move_pain1;
  540.     }
  541.     else if (r < 0.66)
  542.     {
  543.         gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
  544.         self->monsterinfo.currentmove = &brain_move_pain2;
  545.     }
  546.     else
  547.     {
  548.         gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
  549.         self->monsterinfo.currentmove = &brain_move_pain3;
  550.     }
  551. }
  552.  
  553. void brain_dead (edict_t *self)
  554. {
  555.     VectorSet (self->mins, -16, -16, -24);
  556.     VectorSet (self->maxs, 16, 16, -8);
  557.     self->movetype = MOVETYPE_TOSS;
  558.     self->nextthink = 0;
  559.     gi.linkentity (self);
  560. }
  561.  
  562.  
  563.  
  564. void brain_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
  565. {
  566.     int        n;
  567.  
  568.     self->s.effects = 0;
  569.     self->monsterinfo.power_armor_type = POWER_ARMOR_NONE;
  570.  
  571. // check for gib
  572.     if (self->health <= self->gib_health)
  573.     {
  574.         gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
  575.         for (n= 0; n < 2; n++)
  576.             ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
  577.         for (n= 0; n < 4; n++)
  578.             ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
  579.         ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
  580.         self->deadflag = DEAD_DEAD;
  581.         return;
  582.     }
  583.  
  584.     if (self->deadflag == DEAD_DEAD)
  585.         return;
  586.  
  587. // regular death
  588.     gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
  589.     self->deadflag = DEAD_DEAD;
  590.     self->takedamage = DAMAGE_YES;
  591.     if (random() <= 0.5)
  592.         self->monsterinfo.currentmove = &brain_move_death1;
  593.     else
  594.         self->monsterinfo.currentmove = &brain_move_death2;
  595. }
  596.  
  597. /*QUAKED monster_brain (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
  598. */
  599. void SP_monster_brain (edict_t *self)
  600. {
  601.     if (deathmatch->value)
  602.     {
  603.         G_FreeEdict (self);
  604.         return;
  605.     }
  606.  
  607.     sound_chest_open = gi.soundindex ("brain/brnatck1.wav");
  608.     sound_tentacles_extend = gi.soundindex ("brain/brnatck2.wav");
  609.     sound_tentacles_retract = gi.soundindex ("brain/brnatck3.wav");
  610.     sound_death = gi.soundindex ("brain/brndeth1.wav");
  611.     sound_idle1 = gi.soundindex ("brain/brnidle1.wav");
  612.     sound_idle2 = gi.soundindex ("brain/brnidle2.wav");
  613.     sound_idle3 = gi.soundindex ("brain/brnlens1.wav");
  614.     sound_pain1 = gi.soundindex ("brain/brnpain1.wav");
  615.     sound_pain2 = gi.soundindex ("brain/brnpain2.wav");
  616.     sound_sight = gi.soundindex ("brain/brnsght1.wav");
  617.     sound_search = gi.soundindex ("brain/brnsrch1.wav");
  618.     sound_melee1 = gi.soundindex ("brain/melee1.wav");
  619.     sound_melee2 = gi.soundindex ("brain/melee2.wav");
  620.     sound_melee3 = gi.soundindex ("brain/melee3.wav");
  621.  
  622.     self->movetype = MOVETYPE_STEP;
  623.     self->solid = SOLID_BBOX;
  624.     self->s.modelindex = gi.modelindex ("models/monsters/brain/tris.md2");
  625.     VectorSet (self->mins, -16, -16, -24);
  626.     VectorSet (self->maxs, 16, 16, 32);
  627.  
  628.     self->health = 300;
  629.     self->gib_health = -150;
  630.     self->mass = 400;
  631.  
  632.     self->pain = brain_pain;
  633.     self->die = brain_die;
  634.  
  635.     self->monsterinfo.stand = brain_stand;
  636.     self->monsterinfo.walk = brain_walk;
  637.     self->monsterinfo.run = brain_run;
  638.     self->monsterinfo.dodge = brain_dodge;
  639. //    self->monsterinfo.attack = brain_attack;
  640.     self->monsterinfo.melee = brain_melee;
  641.     self->monsterinfo.sight = brain_sight;
  642.     self->monsterinfo.search = brain_search;
  643.     self->monsterinfo.idle = brain_idle;
  644.  
  645.     self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
  646.     self->monsterinfo.power_armor_power = 100;
  647.  
  648.     gi.linkentity (self);
  649.  
  650.     self->monsterinfo.currentmove = &brain_move_stand;    
  651.     self->monsterinfo.scale = MODEL_SCALE;
  652.  
  653.     walkmonster_start (self);
  654. }
  655.