m_brain.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. // Copyright (c) ZeniMax Media Inc.
  2. // Licensed under the GNU General Public License 2.0.
  3. /*
  4. ==============================================================================
  5. brain
  6. ==============================================================================
  7. */
  8. #include "g_local.h"
  9. #include "m_brain.h"
  10. static int sound_chest_open;
  11. static int sound_tentacles_extend;
  12. static int sound_tentacles_retract;
  13. static int sound_death;
  14. static int sound_idle1;
  15. static int sound_idle2;
  16. static int sound_idle3;
  17. static int sound_pain1;
  18. static int sound_pain2;
  19. static int sound_sight;
  20. static int sound_search;
  21. static int sound_melee1;
  22. static int sound_melee2;
  23. static int sound_melee3;
  24. void brain_sight (edict_t *self, edict_t *other)
  25. {
  26. gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
  27. }
  28. void brain_search (edict_t *self)
  29. {
  30. gi.sound (self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0);
  31. }
  32. void brain_run (edict_t *self);
  33. void brain_dead (edict_t *self);
  34. //
  35. // STAND
  36. //
  37. mframe_t brain_frames_stand [] =
  38. {
  39. ai_stand, 0, NULL,
  40. ai_stand, 0, NULL,
  41. ai_stand, 0, NULL,
  42. ai_stand, 0, NULL,
  43. ai_stand, 0, NULL,
  44. ai_stand, 0, NULL,
  45. ai_stand, 0, NULL,
  46. ai_stand, 0, NULL,
  47. ai_stand, 0, NULL,
  48. ai_stand, 0, NULL,
  49. ai_stand, 0, NULL,
  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. 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. };
  70. mmove_t brain_move_stand = {FRAME_stand01, FRAME_stand30, brain_frames_stand, NULL};
  71. void brain_stand (edict_t *self)
  72. {
  73. self->monsterinfo.currentmove = &brain_move_stand;
  74. }
  75. //
  76. // IDLE
  77. //
  78. mframe_t brain_frames_idle [] =
  79. {
  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. };
  111. mmove_t brain_move_idle = {FRAME_stand31, FRAME_stand60, brain_frames_idle, brain_stand};
  112. void brain_idle (edict_t *self)
  113. {
  114. gi.sound (self, CHAN_AUTO, sound_idle3, 1, ATTN_IDLE, 0);
  115. self->monsterinfo.currentmove = &brain_move_idle;
  116. }
  117. //
  118. // WALK
  119. //
  120. mframe_t brain_frames_walk1 [] =
  121. {
  122. ai_walk, 7, NULL,
  123. ai_walk, 2, NULL,
  124. ai_walk, 3, NULL,
  125. ai_walk, 3, NULL,
  126. ai_walk, 1, NULL,
  127. ai_walk, 0, NULL,
  128. ai_walk, 0, NULL,
  129. ai_walk, 9, NULL,
  130. ai_walk, -4, NULL,
  131. ai_walk, -1, NULL,
  132. ai_walk, 2, NULL
  133. };
  134. mmove_t brain_move_walk1 = {FRAME_walk101, FRAME_walk111, brain_frames_walk1, NULL};
  135. // walk2 is FUBAR, do not use
  136. #if 0
  137. void brain_walk2_cycle (edict_t *self)
  138. {
  139. if (random() > 0.1)
  140. self->monsterinfo.nextframe = FRAME_walk220;
  141. }
  142. mframe_t brain_frames_walk2 [] =
  143. {
  144. ai_walk, 3, NULL,
  145. ai_walk, -2, NULL,
  146. ai_walk, -4, NULL,
  147. ai_walk, -3, NULL,
  148. ai_walk, 0, NULL,
  149. ai_walk, 1, NULL,
  150. ai_walk, 12, NULL,
  151. ai_walk, 0, NULL,
  152. ai_walk, -3, NULL,
  153. ai_walk, 0, NULL,
  154. ai_walk, -2, NULL,
  155. ai_walk, 0, NULL,
  156. ai_walk, 0, NULL,
  157. ai_walk, 1, NULL,
  158. ai_walk, 0, NULL,
  159. ai_walk, 0, NULL,
  160. ai_walk, 0, NULL,
  161. ai_walk, 0, NULL,
  162. ai_walk, 0, NULL,
  163. ai_walk, 10, NULL, // Cycle Start
  164. ai_walk, -1, NULL,
  165. ai_walk, 7, NULL,
  166. ai_walk, 0, NULL,
  167. ai_walk, 3, NULL,
  168. ai_walk, -3, NULL,
  169. ai_walk, 2, NULL,
  170. ai_walk, 4, NULL,
  171. ai_walk, -3, NULL,
  172. ai_walk, 2, NULL,
  173. ai_walk, 0, NULL,
  174. ai_walk, 4, brain_walk2_cycle,
  175. ai_walk, -1, NULL,
  176. ai_walk, -1, NULL,
  177. ai_walk, -8, NULL,
  178. ai_walk, 0, NULL,
  179. ai_walk, 1, NULL,
  180. ai_walk, 5, NULL,
  181. ai_walk, 2, NULL,
  182. ai_walk, -1, NULL,
  183. ai_walk, -5, NULL
  184. };
  185. mmove_t brain_move_walk2 = {FRAME_walk201, FRAME_walk240, brain_frames_walk2, NULL};
  186. #endif
  187. void brain_walk (edict_t *self)
  188. {
  189. // if (random() <= 0.5)
  190. self->monsterinfo.currentmove = &brain_move_walk1;
  191. // else
  192. // self->monsterinfo.currentmove = &brain_move_walk2;
  193. }
  194. mframe_t brain_frames_defense [] =
  195. {
  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. };
  206. mmove_t brain_move_defense = {FRAME_defens01, FRAME_defens08, brain_frames_defense, NULL};
  207. mframe_t brain_frames_pain3 [] =
  208. {
  209. ai_move, -2, NULL,
  210. ai_move, 2, NULL,
  211. ai_move, 1, NULL,
  212. ai_move, 3, NULL,
  213. ai_move, 0, NULL,
  214. ai_move, -4, NULL
  215. };
  216. mmove_t brain_move_pain3 = {FRAME_pain301, FRAME_pain306, brain_frames_pain3, brain_run};
  217. mframe_t brain_frames_pain2 [] =
  218. {
  219. ai_move, -2, NULL,
  220. ai_move, 0, NULL,
  221. ai_move, 0, NULL,
  222. ai_move, 0, NULL,
  223. ai_move, 0, NULL,
  224. ai_move, 3, NULL,
  225. ai_move, 1, NULL,
  226. ai_move, -2, NULL
  227. };
  228. mmove_t brain_move_pain2 = {FRAME_pain201, FRAME_pain208, brain_frames_pain2, brain_run};
  229. mframe_t brain_frames_pain1 [] =
  230. {
  231. ai_move, -6, NULL,
  232. ai_move, -2, NULL,
  233. ai_move, -6, NULL,
  234. ai_move, 0, NULL,
  235. ai_move, 0, NULL,
  236. ai_move, 0, NULL,
  237. ai_move, 0, NULL,
  238. ai_move, 0, NULL,
  239. ai_move, 0, NULL,
  240. ai_move, 0, NULL,
  241. ai_move, 0, NULL,
  242. ai_move, 0, NULL,
  243. ai_move, 0, NULL,
  244. ai_move, 2, NULL,
  245. ai_move, 0, NULL,
  246. ai_move, 2, NULL,
  247. ai_move, 1, NULL,
  248. ai_move, 7, NULL,
  249. ai_move, 0, NULL,
  250. ai_move, 3, NULL,
  251. ai_move, -1, NULL
  252. };
  253. mmove_t brain_move_pain1 = {FRAME_pain101, FRAME_pain121, brain_frames_pain1, brain_run};
  254. mframe_t brain_frames_duck [] =
  255. {
  256. ai_move, 0, NULL,
  257. ai_move, -2, monster_duck_down,
  258. ai_move, 17, monster_duck_hold,
  259. ai_move, -3, NULL,
  260. ai_move, -1, monster_duck_up,
  261. ai_move, -5, NULL,
  262. ai_move, -6, NULL,
  263. ai_move, -6, NULL
  264. };
  265. mmove_t brain_move_duck = {FRAME_duck01, FRAME_duck08, brain_frames_duck, brain_run};
  266. /*
  267. void brain_dodge (edict_t *self, edict_t *attacker, float eta, trace_t *tr)
  268. {
  269. //========
  270. //PMM - new dodge code
  271. float r;
  272. float height;
  273. if (!self->enemy)
  274. {
  275. self->enemy = attacker;
  276. FoundTarget (self);
  277. }
  278. // PMM - don't bother if it's going to hit anyway; fix for weird in-your-face etas (I was
  279. // seeing numbers like 13 and 14)
  280. if ((eta < 0.1) || (eta > 5))
  281. return;
  282. r = random();
  283. if (r > (0.25*((skill->value)+1)))
  284. return;
  285. if (self->monsterinfo.aiflags & AI_DODGING)
  286. {
  287. height = self->absmax[2];
  288. }
  289. else
  290. {
  291. height = self->absmax[2]-32-1; // the -1 is because the absmax is s.origin + maxs + 1
  292. }
  293. // check to see if it makes sense to duck
  294. if (tr->endpos[2] <= height)
  295. {
  296. // if it doesn't sense to duck, try to strafe and shoot
  297. // FIXME - this guy is so slow, it's not worth it
  298. //vec3_t forward,right,up,diff;
  299. monster_done_dodge (self);
  300. return;
  301. }
  302. if (skill->value == 0)
  303. {
  304. self->monsterinfo.currentmove = &brain_move_duck;
  305. // PMM - stupid dodge
  306. self->monsterinfo.duck_wait_time = level.time + eta + 1;
  307. self->monsterinfo.aiflags |= AI_DODGING;
  308. return;
  309. }
  310. self->monsterinfo.currentmove = &brain_move_duck;
  311. self->monsterinfo.duck_wait_time = level.time + eta + (0.1 * (3 - skill->value));
  312. self->monsterinfo.aiflags |= AI_DODGING;
  313. return;
  314. //============
  315. //PMM
  316. }
  317. */
  318. mframe_t brain_frames_death2 [] =
  319. {
  320. ai_move, 0, NULL,
  321. ai_move, 0, NULL,
  322. ai_move, 0, NULL,
  323. ai_move, 9, NULL,
  324. ai_move, 0, NULL
  325. };
  326. mmove_t brain_move_death2 = {FRAME_death201, FRAME_death205, brain_frames_death2, brain_dead};
  327. mframe_t brain_frames_death1 [] =
  328. {
  329. ai_move, 0, NULL,
  330. ai_move, 0, NULL,
  331. ai_move, -2, NULL,
  332. ai_move, 9, 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. };
  348. mmove_t brain_move_death1 = {FRAME_death101, FRAME_death118, brain_frames_death1, brain_dead};
  349. //
  350. // MELEE
  351. //
  352. void brain_swing_right (edict_t *self)
  353. {
  354. gi.sound (self, CHAN_BODY, sound_melee1, 1, ATTN_NORM, 0);
  355. }
  356. void brain_hit_right (edict_t *self)
  357. {
  358. vec3_t aim;
  359. VectorSet (aim, MELEE_DISTANCE, self->maxs[0], 8);
  360. if (fire_hit (self, aim, (15 + (rand() %5)), 40))
  361. gi.sound (self, CHAN_WEAPON, sound_melee3, 1, ATTN_NORM, 0);
  362. }
  363. void brain_swing_left (edict_t *self)
  364. {
  365. gi.sound (self, CHAN_BODY, sound_melee2, 1, ATTN_NORM, 0);
  366. }
  367. void brain_hit_left (edict_t *self)
  368. {
  369. vec3_t aim;
  370. VectorSet (aim, MELEE_DISTANCE, self->mins[0], 8);
  371. if (fire_hit (self, aim, (15 + (rand() %5)), 40))
  372. gi.sound (self, CHAN_WEAPON, sound_melee3, 1, ATTN_NORM, 0);
  373. }
  374. mframe_t brain_frames_attack1 [] =
  375. {
  376. ai_charge, 8, NULL,
  377. ai_charge, 3, NULL,
  378. ai_charge, 5, NULL,
  379. ai_charge, 0, NULL,
  380. ai_charge, -3, brain_swing_right,
  381. ai_charge, 0, NULL,
  382. ai_charge, -5, NULL,
  383. ai_charge, -7, brain_hit_right,
  384. ai_charge, 0, NULL,
  385. ai_charge, 6, brain_swing_left,
  386. ai_charge, 1, NULL,
  387. ai_charge, 2, brain_hit_left,
  388. ai_charge, -3, NULL,
  389. ai_charge, 6, NULL,
  390. ai_charge, -1, NULL,
  391. ai_charge, -3, NULL,
  392. ai_charge, 2, NULL,
  393. ai_charge, -11,NULL
  394. };
  395. mmove_t brain_move_attack1 = {FRAME_attak101, FRAME_attak118, brain_frames_attack1, brain_run};
  396. void brain_chest_open (edict_t *self)
  397. {
  398. self->spawnflags &= ~65536;
  399. self->monsterinfo.power_armor_type = POWER_ARMOR_NONE;
  400. gi.sound (self, CHAN_BODY, sound_chest_open, 1, ATTN_NORM, 0);
  401. }
  402. void brain_tentacle_attack (edict_t *self)
  403. {
  404. vec3_t aim;
  405. VectorSet (aim, MELEE_DISTANCE, 0, 8);
  406. if (fire_hit (self, aim, (10 + (rand() %5)), -600) && skill->value > 0)
  407. self->spawnflags |= 65536;
  408. gi.sound (self, CHAN_WEAPON, sound_tentacles_retract, 1, ATTN_NORM, 0);
  409. }
  410. void brain_chest_closed (edict_t *self)
  411. {
  412. self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
  413. if (self->spawnflags & 65536)
  414. {
  415. self->spawnflags &= ~65536;
  416. self->monsterinfo.currentmove = &brain_move_attack1;
  417. }
  418. }
  419. mframe_t brain_frames_attack2 [] =
  420. {
  421. ai_charge, 5, NULL,
  422. ai_charge, -4, NULL,
  423. ai_charge, -4, NULL,
  424. ai_charge, -3, NULL,
  425. ai_charge, 0, brain_chest_open,
  426. ai_charge, 0, NULL,
  427. ai_charge, 13, brain_tentacle_attack,
  428. ai_charge, 0, NULL,
  429. ai_charge, 2, NULL,
  430. ai_charge, 0, NULL,
  431. ai_charge, -9, brain_chest_closed,
  432. ai_charge, 0, NULL,
  433. ai_charge, 4, NULL,
  434. ai_charge, 3, NULL,
  435. ai_charge, 2, NULL,
  436. ai_charge, -3, NULL,
  437. ai_charge, -6, NULL
  438. };
  439. mmove_t brain_move_attack2 = {FRAME_attak201, FRAME_attak217, brain_frames_attack2, brain_run};
  440. void brain_melee(edict_t *self)
  441. {
  442. if (random() <= 0.5)
  443. self->monsterinfo.currentmove = &brain_move_attack1;
  444. else
  445. self->monsterinfo.currentmove = &brain_move_attack2;
  446. }
  447. //
  448. // RUN
  449. //
  450. mframe_t brain_frames_run [] =
  451. {
  452. ai_run, 9, NULL,
  453. ai_run, 2, NULL,
  454. ai_run, 3, NULL,
  455. ai_run, 3, NULL,
  456. ai_run, 1, NULL,
  457. ai_run, 0, NULL,
  458. ai_run, 0, NULL,
  459. ai_run, 10, NULL,
  460. ai_run, -4, NULL,
  461. ai_run, -1, NULL,
  462. ai_run, 2, NULL
  463. };
  464. mmove_t brain_move_run = {FRAME_walk101, FRAME_walk111, brain_frames_run, NULL};
  465. void brain_run (edict_t *self)
  466. {
  467. self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
  468. if (self->monsterinfo.aiflags & AI_STAND_GROUND)
  469. self->monsterinfo.currentmove = &brain_move_stand;
  470. else
  471. self->monsterinfo.currentmove = &brain_move_run;
  472. }
  473. void brain_pain (edict_t *self, edict_t *other, float kick, int damage)
  474. {
  475. float r;
  476. if (self->health < (self->max_health / 2))
  477. self->s.skinnum = 1;
  478. if (level.time < self->pain_debounce_time)
  479. return;
  480. self->pain_debounce_time = level.time + 3;
  481. if (skill->value == 3)
  482. return; // no pain anims in nightmare
  483. r = random();
  484. if (r < 0.33)
  485. {
  486. gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
  487. self->monsterinfo.currentmove = &brain_move_pain1;
  488. }
  489. else if (r < 0.66)
  490. {
  491. gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
  492. self->monsterinfo.currentmove = &brain_move_pain2;
  493. }
  494. else
  495. {
  496. gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
  497. self->monsterinfo.currentmove = &brain_move_pain3;
  498. }
  499. // PMM - clear duck flag
  500. if (self->monsterinfo.aiflags & AI_DUCKED)
  501. monster_duck_up(self);
  502. }
  503. void brain_dead (edict_t *self)
  504. {
  505. VectorSet (self->mins, -16, -16, -24);
  506. VectorSet (self->maxs, 16, 16, -8);
  507. self->movetype = MOVETYPE_TOSS;
  508. self->svflags |= SVF_DEADMONSTER;
  509. self->nextthink = 0;
  510. gi.linkentity (self);
  511. }
  512. void brain_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
  513. {
  514. int n;
  515. self->s.effects = 0;
  516. self->monsterinfo.power_armor_type = POWER_ARMOR_NONE;
  517. // check for gib
  518. if (self->health <= self->gib_health)
  519. {
  520. gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
  521. for (n= 0; n < 2; n++)
  522. ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
  523. for (n= 0; n < 4; n++)
  524. ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
  525. ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
  526. self->deadflag = DEAD_DEAD;
  527. return;
  528. }
  529. if (self->deadflag == DEAD_DEAD)
  530. return;
  531. // regular death
  532. gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
  533. self->deadflag = DEAD_DEAD;
  534. self->takedamage = DAMAGE_YES;
  535. if (random() <= 0.5)
  536. self->monsterinfo.currentmove = &brain_move_death1;
  537. else
  538. self->monsterinfo.currentmove = &brain_move_death2;
  539. }
  540. void brain_duck (edict_t *self, float eta)
  541. {
  542. // has to be done immediately otherwise he can get stuck
  543. monster_duck_down(self);
  544. if (skill->value == 0)
  545. // PMM - stupid dodge
  546. self->monsterinfo.duck_wait_time = level.time + eta + 1;
  547. else
  548. self->monsterinfo.duck_wait_time = level.time + eta + (0.1 * (3 - skill->value));
  549. self->monsterinfo.currentmove = &brain_move_duck;
  550. self->monsterinfo.nextframe = FRAME_duck01;
  551. return;
  552. }
  553. /*QUAKED monster_brain (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
  554. */
  555. void SP_monster_brain (edict_t *self)
  556. {
  557. if (deathmatch->value)
  558. {
  559. G_FreeEdict (self);
  560. return;
  561. }
  562. sound_chest_open = gi.soundindex ("brain/brnatck1.wav");
  563. sound_tentacles_extend = gi.soundindex ("brain/brnatck2.wav");
  564. sound_tentacles_retract = gi.soundindex ("brain/brnatck3.wav");
  565. sound_death = gi.soundindex ("brain/brndeth1.wav");
  566. sound_idle1 = gi.soundindex ("brain/brnidle1.wav");
  567. sound_idle2 = gi.soundindex ("brain/brnidle2.wav");
  568. sound_idle3 = gi.soundindex ("brain/brnlens1.wav");
  569. sound_pain1 = gi.soundindex ("brain/brnpain1.wav");
  570. sound_pain2 = gi.soundindex ("brain/brnpain2.wav");
  571. sound_sight = gi.soundindex ("brain/brnsght1.wav");
  572. sound_search = gi.soundindex ("brain/brnsrch1.wav");
  573. sound_melee1 = gi.soundindex ("brain/melee1.wav");
  574. sound_melee2 = gi.soundindex ("brain/melee2.wav");
  575. sound_melee3 = gi.soundindex ("brain/melee3.wav");
  576. self->movetype = MOVETYPE_STEP;
  577. self->solid = SOLID_BBOX;
  578. self->s.modelindex = gi.modelindex ("models/monsters/brain/tris.md2");
  579. VectorSet (self->mins, -16, -16, -24);
  580. VectorSet (self->maxs, 16, 16, 32);
  581. self->health = 300;
  582. self->gib_health = -150;
  583. self->mass = 400;
  584. self->pain = brain_pain;
  585. self->die = brain_die;
  586. self->monsterinfo.stand = brain_stand;
  587. self->monsterinfo.walk = brain_walk;
  588. self->monsterinfo.run = brain_run;
  589. // PMM
  590. self->monsterinfo.dodge = M_MonsterDodge;
  591. self->monsterinfo.duck = brain_duck;
  592. self->monsterinfo.unduck = monster_duck_up;
  593. // self->monsterinfo.dodge = brain_dodge;
  594. // pmm
  595. // self->monsterinfo.attack = brain_attack;
  596. self->monsterinfo.melee = brain_melee;
  597. self->monsterinfo.sight = brain_sight;
  598. self->monsterinfo.search = brain_search;
  599. self->monsterinfo.idle = brain_idle;
  600. self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;
  601. self->monsterinfo.power_armor_power = 100;
  602. gi.linkentity (self);
  603. self->monsterinfo.currentmove = &brain_move_stand;
  604. self->monsterinfo.scale = MODEL_SCALE;
  605. walkmonster_start (self);
  606. }