ogre.qc 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. /* Copyright (C) 1996-1997 Id Software, Inc.
  2. This program is free software; you can redistribute it and/or modify
  3. it under the terms of the GNU General Public License as published by
  4. the Free Software Foundation; either version 2 of the License, or
  5. (at your option) any later version.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  9. GNU General Public License for more details.
  10. You should have received a copy of the GNU General Public License
  11. along with this program; if not, write to the Free Software
  12. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  13. See file, 'COPYING', for details.
  14. */
  15. /*
  16. ==============================================================================
  17. OGRE
  18. ==============================================================================
  19. */
  20. $cd /raid/quake/id1/models/ogre_c
  21. $origin 0 0 24
  22. $base base
  23. $skin base
  24. $frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9
  25. $frame walk1 walk2 walk3 walk4 walk5 walk6 walk7
  26. $frame walk8 walk9 walk10 walk11 walk12 walk13 walk14 walk15 walk16
  27. $frame run1 run2 run3 run4 run5 run6 run7 run8
  28. $frame swing1 swing2 swing3 swing4 swing5 swing6 swing7
  29. $frame swing8 swing9 swing10 swing11 swing12 swing13 swing14
  30. $frame smash1 smash2 smash3 smash4 smash5 smash6 smash7
  31. $frame smash8 smash9 smash10 smash11 smash12 smash13 smash14
  32. $frame shoot1 shoot2 shoot3 shoot4 shoot5 shoot6
  33. $frame pain1 pain2 pain3 pain4 pain5
  34. $frame painb1 painb2 painb3
  35. $frame painc1 painc2 painc3 painc4 painc5 painc6
  36. $frame paind1 paind2 paind3 paind4 paind5 paind6 paind7 paind8 paind9 paind10
  37. $frame paind11 paind12 paind13 paind14 paind15 paind16
  38. $frame paine1 paine2 paine3 paine4 paine5 paine6 paine7 paine8 paine9 paine10
  39. $frame paine11 paine12 paine13 paine14 paine15
  40. $frame death1 death2 death3 death4 death5 death6
  41. $frame death7 death8 death9 death10 death11 death12
  42. $frame death13 death14
  43. $frame bdeath1 bdeath2 bdeath3 bdeath4 bdeath5 bdeath6
  44. $frame bdeath7 bdeath8 bdeath9 bdeath10
  45. $frame pull1 pull2 pull3 pull4 pull5 pull6 pull7 pull8 pull9 pull10 pull11
  46. //=============================================================================
  47. void() OgreGrenadeExplode =
  48. {
  49. T_RadiusDamage (self, self.owner, 40, world);
  50. sound (self, CHAN_VOICE, "weapons/r_exp3.wav", 1, ATTN_NORM);
  51. WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  52. WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  53. WriteCoord (MSG_BROADCAST, self.origin_x);
  54. WriteCoord (MSG_BROADCAST, self.origin_y);
  55. WriteCoord (MSG_BROADCAST, self.origin_z);
  56. self.velocity = '0 0 0';
  57. self.touch = SUB_Null;
  58. setmodel (self, "progs/s_explod.spr");
  59. self.solid = SOLID_NOT;
  60. s_explode1 ();
  61. };
  62. void() OgreGrenadeTouch =
  63. {
  64. if (other == self.owner)
  65. return; // don't explode on owner
  66. if (other.takedamage == DAMAGE_AIM)
  67. {
  68. OgreGrenadeExplode();
  69. return;
  70. }
  71. sound (self, CHAN_VOICE, "weapons/bounce.wav", 1, ATTN_NORM); // bounce sound
  72. if (self.velocity == '0 0 0')
  73. self.avelocity = '0 0 0';
  74. };
  75. /*
  76. ================
  77. OgreFireGrenade
  78. ================
  79. */
  80. void() OgreFireGrenade =
  81. {
  82. local entity missile, mpuff;
  83. self.effects = self.effects | EF_MUZZLEFLASH;
  84. sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
  85. missile = spawn ();
  86. missile.owner = self;
  87. missile.movetype = MOVETYPE_BOUNCE;
  88. missile.solid = SOLID_BBOX;
  89. // set missile speed
  90. makevectors (self.angles);
  91. missile.velocity = normalize(self.enemy.origin - self.origin);
  92. missile.velocity = missile.velocity * 600;
  93. missile.velocity_z = 200;
  94. missile.avelocity = '300 300 300';
  95. missile.angles = vectoangles(missile.velocity);
  96. missile.touch = OgreGrenadeTouch;
  97. // set missile duration
  98. missile.nextthink = time + 2.5;
  99. missile.think = OgreGrenadeExplode;
  100. setmodel (missile, "progs/grenade.mdl");
  101. setsize (missile, '0 0 0', '0 0 0');
  102. setorigin (missile, self.origin);
  103. };
  104. //=============================================================================
  105. /*
  106. ================
  107. chainsaw
  108. FIXME
  109. ================
  110. */
  111. void(float side) chainsaw =
  112. {
  113. local vector delta;
  114. local float ldmg;
  115. if (!self.enemy)
  116. return;
  117. if (!CanDamage (self.enemy, self))
  118. return;
  119. ai_charge(10);
  120. delta = self.enemy.origin - self.origin;
  121. if (vlen(delta) > 100)
  122. return;
  123. ldmg = (random() + random() + random()) * 4;
  124. T_Damage (self.enemy, self, self, ldmg);
  125. if (side)
  126. {
  127. makevectors (self.angles);
  128. if (side == 1)
  129. SpawnMeatSpray (self.origin + v_forward*16, crandom() * 100 * v_right);
  130. else
  131. SpawnMeatSpray (self.origin + v_forward*16, side * v_right);
  132. }
  133. };
  134. void() ogre_stand1 =[ $stand1, ogre_stand2 ] {ai_stand();};
  135. void() ogre_stand2 =[ $stand2, ogre_stand3 ] {ai_stand();};
  136. void() ogre_stand3 =[ $stand3, ogre_stand4 ] {ai_stand();};
  137. void() ogre_stand4 =[ $stand4, ogre_stand5 ] {ai_stand();};
  138. void() ogre_stand5 =[ $stand5, ogre_stand6 ] {
  139. if (random() < 0.2)
  140. sound (self, CHAN_VOICE, "ogre/ogidle.wav", 1, ATTN_IDLE);
  141. ai_stand();
  142. };
  143. void() ogre_stand6 =[ $stand6, ogre_stand7 ] {ai_stand();};
  144. void() ogre_stand7 =[ $stand7, ogre_stand8 ] {ai_stand();};
  145. void() ogre_stand8 =[ $stand8, ogre_stand9 ] {ai_stand();};
  146. void() ogre_stand9 =[ $stand9, ogre_stand1 ] {ai_stand();};
  147. void() ogre_walk1 =[ $walk1, ogre_walk2 ] {ai_walk(3);};
  148. void() ogre_walk2 =[ $walk2, ogre_walk3 ] {ai_walk(2);};
  149. void() ogre_walk3 =[ $walk3, ogre_walk4 ] {
  150. ai_walk(2);
  151. if (random() < 0.2)
  152. sound (self, CHAN_VOICE, "ogre/ogidle.wav", 1, ATTN_IDLE);
  153. };
  154. void() ogre_walk4 =[ $walk4, ogre_walk5 ] {ai_walk(2);};
  155. void() ogre_walk5 =[ $walk5, ogre_walk6 ] {ai_walk(2);};
  156. void() ogre_walk6 =[ $walk6, ogre_walk7 ] {
  157. ai_walk(5);
  158. if (random() < 0.1)
  159. sound (self, CHAN_VOICE, "ogre/ogdrag.wav", 1, ATTN_IDLE);
  160. };
  161. void() ogre_walk7 =[ $walk7, ogre_walk8 ] {ai_walk(3);};
  162. void() ogre_walk8 =[ $walk8, ogre_walk9 ] {ai_walk(2);};
  163. void() ogre_walk9 =[ $walk9, ogre_walk10 ] {ai_walk(3);};
  164. void() ogre_walk10 =[ $walk10, ogre_walk11 ] {ai_walk(1);};
  165. void() ogre_walk11 =[ $walk11, ogre_walk12 ] {ai_walk(2);};
  166. void() ogre_walk12 =[ $walk12, ogre_walk13 ] {ai_walk(3);};
  167. void() ogre_walk13 =[ $walk13, ogre_walk14 ] {ai_walk(3);};
  168. void() ogre_walk14 =[ $walk14, ogre_walk15 ] {ai_walk(3);};
  169. void() ogre_walk15 =[ $walk15, ogre_walk16 ] {ai_walk(3);};
  170. void() ogre_walk16 =[ $walk16, ogre_walk1 ] {ai_walk(4);};
  171. void() ogre_run1 =[ $run1, ogre_run2 ] {ai_run(9);
  172. if (random() < 0.2)
  173. sound (self, CHAN_VOICE, "ogre/ogidle2.wav", 1, ATTN_IDLE);
  174. };
  175. void() ogre_run2 =[ $run2, ogre_run3 ] {ai_run(12);};
  176. void() ogre_run3 =[ $run3, ogre_run4 ] {ai_run(8);};
  177. void() ogre_run4 =[ $run4, ogre_run5 ] {ai_run(22);};
  178. void() ogre_run5 =[ $run5, ogre_run6 ] {ai_run(16);};
  179. void() ogre_run6 =[ $run6, ogre_run7 ] {ai_run(4);};
  180. void() ogre_run7 =[ $run7, ogre_run8 ] {ai_run(13);};
  181. void() ogre_run8 =[ $run8, ogre_run1 ] {ai_run(24);};
  182. void() ogre_swing1 =[ $swing1, ogre_swing2 ] {ai_charge(11);
  183. sound (self, CHAN_WEAPON, "ogre/ogsawatk.wav", 1, ATTN_NORM);
  184. };
  185. void() ogre_swing2 =[ $swing2, ogre_swing3 ] {ai_charge(1);};
  186. void() ogre_swing3 =[ $swing3, ogre_swing4 ] {ai_charge(4);};
  187. void() ogre_swing4 =[ $swing4, ogre_swing5 ] {ai_charge(13);};
  188. void() ogre_swing5 =[ $swing5, ogre_swing6 ] {ai_charge(9); chainsaw(0);self.angles_y = self.angles_y + random()*25;};
  189. void() ogre_swing6 =[ $swing6, ogre_swing7 ] {chainsaw(200);self.angles_y = self.angles_y + random()* 25;};
  190. void() ogre_swing7 =[ $swing7, ogre_swing8 ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};
  191. void() ogre_swing8 =[ $swing8, ogre_swing9 ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};
  192. void() ogre_swing9 =[ $swing9, ogre_swing10 ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};
  193. void() ogre_swing10 =[ $swing10, ogre_swing11 ] {chainsaw(-200);self.angles_y = self.angles_y + random()* 25;};
  194. void() ogre_swing11 =[ $swing11, ogre_swing12 ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};
  195. void() ogre_swing12 =[ $swing12, ogre_swing13 ] {ai_charge(3);};
  196. void() ogre_swing13 =[ $swing13, ogre_swing14 ] {ai_charge(8);};
  197. void() ogre_swing14 =[ $swing14, ogre_run1 ] {ai_charge(9);};
  198. void() ogre_smash1 =[ $smash1, ogre_smash2 ] {ai_charge(6);
  199. sound (self, CHAN_WEAPON, "ogre/ogsawatk.wav", 1, ATTN_NORM);
  200. };
  201. void() ogre_smash2 =[ $smash2, ogre_smash3 ] {ai_charge(0);};
  202. void() ogre_smash3 =[ $smash3, ogre_smash4 ] {ai_charge(0);};
  203. void() ogre_smash4 =[ $smash4, ogre_smash5 ] {ai_charge(1);};
  204. void() ogre_smash5 =[ $smash5, ogre_smash6 ] {ai_charge(4);};
  205. void() ogre_smash6 =[ $smash6, ogre_smash7 ] {ai_charge(4); chainsaw(0);};
  206. void() ogre_smash7 =[ $smash7, ogre_smash8 ] {ai_charge(4); chainsaw(0);};
  207. void() ogre_smash8 =[ $smash8, ogre_smash9 ] {ai_charge(10); chainsaw(0);};
  208. void() ogre_smash9 =[ $smash9, ogre_smash10 ] {ai_charge(13); chainsaw(0);};
  209. void() ogre_smash10 =[ $smash10, ogre_smash11 ] {chainsaw(1);};
  210. void() ogre_smash11 =[ $smash11, ogre_smash12 ] {ai_charge(2); chainsaw(0);
  211. self.nextthink = self.nextthink + random()*0.2;}; // slight variation
  212. void() ogre_smash12 =[ $smash12, ogre_smash13 ] {ai_charge();};
  213. void() ogre_smash13 =[ $smash13, ogre_smash14 ] {ai_charge(4);};
  214. void() ogre_smash14 =[ $smash14, ogre_run1 ] {ai_charge(12);};
  215. void() ogre_nail1 =[ $shoot1, ogre_nail2 ] {ai_face();};
  216. void() ogre_nail2 =[ $shoot2, ogre_nail3 ] {ai_face();};
  217. void() ogre_nail3 =[ $shoot2, ogre_nail4 ] {ai_face();};
  218. void() ogre_nail4 =[ $shoot3, ogre_nail5 ] {ai_face();OgreFireGrenade();};
  219. void() ogre_nail5 =[ $shoot4, ogre_nail6 ] {ai_face();};
  220. void() ogre_nail6 =[ $shoot5, ogre_nail7 ] {ai_face();};
  221. void() ogre_nail7 =[ $shoot6, ogre_run1 ] {ai_face();};
  222. void() ogre_pain1 =[ $pain1, ogre_pain2 ] {};
  223. void() ogre_pain2 =[ $pain2, ogre_pain3 ] {};
  224. void() ogre_pain3 =[ $pain3, ogre_pain4 ] {};
  225. void() ogre_pain4 =[ $pain4, ogre_pain5 ] {};
  226. void() ogre_pain5 =[ $pain5, ogre_run1 ] {};
  227. void() ogre_painb1 =[ $painb1, ogre_painb2 ] {};
  228. void() ogre_painb2 =[ $painb2, ogre_painb3 ] {};
  229. void() ogre_painb3 =[ $painb3, ogre_run1 ] {};
  230. void() ogre_painc1 =[ $painc1, ogre_painc2 ] {};
  231. void() ogre_painc2 =[ $painc2, ogre_painc3 ] {};
  232. void() ogre_painc3 =[ $painc3, ogre_painc4 ] {};
  233. void() ogre_painc4 =[ $painc4, ogre_painc5 ] {};
  234. void() ogre_painc5 =[ $painc5, ogre_painc6 ] {};
  235. void() ogre_painc6 =[ $painc6, ogre_run1 ] {};
  236. void() ogre_paind1 =[ $paind1, ogre_paind2 ] {};
  237. void() ogre_paind2 =[ $paind2, ogre_paind3 ] {ai_pain(10);};
  238. void() ogre_paind3 =[ $paind3, ogre_paind4 ] {ai_pain(9);};
  239. void() ogre_paind4 =[ $paind4, ogre_paind5 ] {ai_pain(4);};
  240. void() ogre_paind5 =[ $paind5, ogre_paind6 ] {};
  241. void() ogre_paind6 =[ $paind6, ogre_paind7 ] {};
  242. void() ogre_paind7 =[ $paind7, ogre_paind8 ] {};
  243. void() ogre_paind8 =[ $paind8, ogre_paind9 ] {};
  244. void() ogre_paind9 =[ $paind9, ogre_paind10 ] {};
  245. void() ogre_paind10=[ $paind10, ogre_paind11 ] {};
  246. void() ogre_paind11=[ $paind11, ogre_paind12 ] {};
  247. void() ogre_paind12=[ $paind12, ogre_paind13 ] {};
  248. void() ogre_paind13=[ $paind13, ogre_paind14 ] {};
  249. void() ogre_paind14=[ $paind14, ogre_paind15 ] {};
  250. void() ogre_paind15=[ $paind15, ogre_paind16 ] {};
  251. void() ogre_paind16=[ $paind16, ogre_run1 ] {};
  252. void() ogre_paine1 =[ $paine1, ogre_paine2 ] {};
  253. void() ogre_paine2 =[ $paine2, ogre_paine3 ] {ai_pain(10);};
  254. void() ogre_paine3 =[ $paine3, ogre_paine4 ] {ai_pain(9);};
  255. void() ogre_paine4 =[ $paine4, ogre_paine5 ] {ai_pain(4);};
  256. void() ogre_paine5 =[ $paine5, ogre_paine6 ] {};
  257. void() ogre_paine6 =[ $paine6, ogre_paine7 ] {};
  258. void() ogre_paine7 =[ $paine7, ogre_paine8 ] {};
  259. void() ogre_paine8 =[ $paine8, ogre_paine9 ] {};
  260. void() ogre_paine9 =[ $paine9, ogre_paine10 ] {};
  261. void() ogre_paine10=[ $paine10, ogre_paine11 ] {};
  262. void() ogre_paine11=[ $paine11, ogre_paine12 ] {};
  263. void() ogre_paine12=[ $paine12, ogre_paine13 ] {};
  264. void() ogre_paine13=[ $paine13, ogre_paine14 ] {};
  265. void() ogre_paine14=[ $paine14, ogre_paine15 ] {};
  266. void() ogre_paine15=[ $paine15, ogre_run1 ] {};
  267. void(entity attacker, float damage) ogre_pain =
  268. {
  269. local float r;
  270. // don't make multiple pain sounds right after each other
  271. if (self.pain_finished > time)
  272. return;
  273. sound (self, CHAN_VOICE, "ogre/ogpain1.wav", 1, ATTN_NORM);
  274. r = random();
  275. if (r < 0.25)
  276. {
  277. ogre_pain1 ();
  278. self.pain_finished = time + 1;
  279. }
  280. else if (r < 0.5)
  281. {
  282. ogre_painb1 ();
  283. self.pain_finished = time + 1;
  284. }
  285. else if (r < 0.75)
  286. {
  287. ogre_painc1 ();
  288. self.pain_finished = time + 1;
  289. }
  290. else if (r < 0.88)
  291. {
  292. ogre_paind1 ();
  293. self.pain_finished = time + 2;
  294. }
  295. else
  296. {
  297. ogre_paine1 ();
  298. self.pain_finished = time + 2;
  299. }
  300. };
  301. void() ogre_die1 =[ $death1, ogre_die2 ] {};
  302. void() ogre_die2 =[ $death2, ogre_die3 ] {};
  303. void() ogre_die3 =[ $death3, ogre_die4 ]
  304. {self.solid = SOLID_NOT;
  305. self.ammo_rockets = 2;DropBackpack();};
  306. void() ogre_die4 =[ $death4, ogre_die5 ] {};
  307. void() ogre_die5 =[ $death5, ogre_die6 ] {};
  308. void() ogre_die6 =[ $death6, ogre_die7 ] {};
  309. void() ogre_die7 =[ $death7, ogre_die8 ] {};
  310. void() ogre_die8 =[ $death8, ogre_die9 ] {};
  311. void() ogre_die9 =[ $death9, ogre_die10 ] {};
  312. void() ogre_die10 =[ $death10, ogre_die11 ] {};
  313. void() ogre_die11 =[ $death11, ogre_die12 ] {};
  314. void() ogre_die12 =[ $death12, ogre_die13 ] {};
  315. void() ogre_die13 =[ $death13, ogre_die14 ] {};
  316. void() ogre_die14 =[ $death14, ogre_die14 ] {};
  317. void() ogre_bdie1 =[ $bdeath1, ogre_bdie2 ] {};
  318. void() ogre_bdie2 =[ $bdeath2, ogre_bdie3 ] {ai_forward(5);};
  319. void() ogre_bdie3 =[ $bdeath3, ogre_bdie4 ]
  320. {self.solid = SOLID_NOT;
  321. self.ammo_rockets = 2;DropBackpack();};
  322. void() ogre_bdie4 =[ $bdeath4, ogre_bdie5 ] {ai_forward(1);};
  323. void() ogre_bdie5 =[ $bdeath5, ogre_bdie6 ] {ai_forward(3);};
  324. void() ogre_bdie6 =[ $bdeath6, ogre_bdie7 ] {ai_forward(7);};
  325. void() ogre_bdie7 =[ $bdeath7, ogre_bdie8 ] {ai_forward(25);};
  326. void() ogre_bdie8 =[ $bdeath8, ogre_bdie9 ] {};
  327. void() ogre_bdie9 =[ $bdeath9, ogre_bdie10 ] {};
  328. void() ogre_bdie10 =[ $bdeath10, ogre_bdie10 ] {};
  329. void() ogre_die =
  330. {
  331. // check for gib
  332. if (self.health < -80)
  333. {
  334. sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
  335. ThrowHead ("progs/h_ogre.mdl", self.health);
  336. ThrowGib ("progs/gib3.mdl", self.health);
  337. ThrowGib ("progs/gib3.mdl", self.health);
  338. ThrowGib ("progs/gib3.mdl", self.health);
  339. return;
  340. }
  341. sound (self, CHAN_VOICE, "ogre/ogdth.wav", 1, ATTN_NORM);
  342. if (random() < 0.5)
  343. ogre_die1 ();
  344. else
  345. ogre_bdie1 ();
  346. };
  347. void() ogre_melee =
  348. {
  349. if (random() > 0.5)
  350. ogre_smash1 ();
  351. else
  352. ogre_swing1 ();
  353. };
  354. /*QUAKED monster_ogre (1 0 0) (-32 -32 -24) (32 32 64) Ambush
  355. */
  356. void() monster_ogre =
  357. {
  358. if (deathmatch)
  359. {
  360. remove(self);
  361. return;
  362. }
  363. precache_model ("progs/ogre.mdl");
  364. precache_model ("progs/h_ogre.mdl");
  365. precache_model ("progs/grenade.mdl");
  366. precache_sound ("ogre/ogdrag.wav");
  367. precache_sound ("ogre/ogdth.wav");
  368. precache_sound ("ogre/ogidle.wav");
  369. precache_sound ("ogre/ogidle2.wav");
  370. precache_sound ("ogre/ogpain1.wav");
  371. precache_sound ("ogre/ogsawatk.wav");
  372. precache_sound ("ogre/ogwake.wav");
  373. self.solid = SOLID_SLIDEBOX;
  374. self.movetype = MOVETYPE_STEP;
  375. setmodel (self, "progs/ogre.mdl");
  376. setsize (self, VEC_HULL2_MIN, VEC_HULL2_MAX);
  377. self.health = 200;
  378. self.th_stand = ogre_stand1;
  379. self.th_walk = ogre_walk1;
  380. self.th_run = ogre_run1;
  381. self.th_die = ogre_die;
  382. self.th_melee = ogre_melee;
  383. self.th_missile = ogre_nail1;
  384. self.th_pain = ogre_pain;
  385. walkmonster_start();
  386. };
  387. void() monster_ogre_marksman =
  388. {
  389. monster_ogre ();
  390. };