hknight.qc 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. /* Copyright (C) 1996-2022 id Software LLC
  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. KNIGHT
  18. ==============================================================================
  19. */
  20. $cd /raid/quake/id1/models/knight2
  21. $origin 0 0 24
  22. $base base
  23. $skin skin
  24. $skin statue2
  25. $frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9
  26. $frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8 walk9
  27. $frame walk10 walk11 walk12 walk13 walk14 walk15 walk16 walk17
  28. $frame walk18 walk19 walk20
  29. $frame run1 run2 run3 run4 run5 run6 run7 run8
  30. $frame pain1 pain2 pain3 pain4 pain5
  31. $frame death1 death2 death3 death4 death5 death6 death7 death8
  32. $frame death9 death10 death11 death12
  33. $frame deathb1 deathb2 deathb3 deathb4 deathb5 deathb6 deathb7 deathb8
  34. $frame deathb9
  35. $frame char_a1 char_a2 char_a3 char_a4 char_a5 char_a6 char_a7 char_a8
  36. $frame char_a9 char_a10 char_a11 char_a12 char_a13 char_a14 char_a15 char_a16
  37. $frame magica1 magica2 magica3 magica4 magica5 magica6 magica7 magica8
  38. $frame magica9 magica10 magica11 magica12 magica13 magica14
  39. $frame magicb1 magicb2 magicb3 magicb4 magicb5 magicb6 magicb7 magicb8
  40. $frame magicb9 magicb10 magicb11 magicb12 magicb13
  41. $frame char_b1 char_b2 char_b3 char_b4 char_b5 char_b6
  42. $frame slice1 slice2 slice3 slice4 slice5 slice6 slice7 slice8 slice9 slice10
  43. $frame smash1 smash2 smash3 smash4 smash5 smash6 smash7 smash8 smash9 smash10
  44. $frame smash11
  45. $frame w_attack1 w_attack2 w_attack3 w_attack4 w_attack5 w_attack6 w_attack7
  46. $frame w_attack8 w_attack9 w_attack10 w_attack11 w_attack12 w_attack13 w_attack14
  47. $frame w_attack15 w_attack16 w_attack17 w_attack18 w_attack19 w_attack20
  48. $frame w_attack21 w_attack22
  49. $frame magicc1 magicc2 magicc3 magicc4 magicc5 magicc6 magicc7 magicc8
  50. $frame magicc9 magicc10 magicc11
  51. void() hknight_char_a1;
  52. void() hknight_run1;
  53. void() hk_idle_sound;
  54. void(float offset) hknight_shot =
  55. {
  56. local vector offang;
  57. local vector org, vec;
  58. offang = vectoangles (self.enemy.origin - self.origin);
  59. offang_y = offang_y + offset * 6;
  60. makevectors (offang);
  61. org = self.origin + self.mins + self.size*0.5 + v_forward * 20;
  62. // set missile speed
  63. vec = normalize (v_forward);
  64. vec_z = 0 - vec_z + (random() - 0.5)*0.1;
  65. launch_spike (org, vec);
  66. newmis.classname = "knightspike";
  67. setmodel (newmis, "progs/k_spike.mdl");
  68. setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
  69. newmis.velocity = vec*300;
  70. if (cvar("pr_checkextension"))
  71. if (checkextension("EX_EXTENDED_EF"))
  72. newmis.effects = newmis.effects | EF_CANDLELIGHT; // give the projectiles a weak glow
  73. sound (self, CHAN_WEAPON, "hknight/attack1.wav", 1, ATTN_NORM);
  74. };
  75. void() CheckForCharge =
  76. {
  77. // check for mad charge
  78. if (!enemy_vis)
  79. return;
  80. if (time < self.attack_finished)
  81. return;
  82. if ( fabs(self.origin_z - self.enemy.origin_z) > 20)
  83. return; // too much height change
  84. if ( vlen (self.origin - self.enemy.origin) < 80)
  85. return; // use regular attack
  86. // charge
  87. SUB_AttackFinished (2);
  88. hknight_char_a1 ();
  89. };
  90. void() CheckContinueCharge =
  91. {
  92. if (time > self.attack_finished)
  93. {
  94. SUB_AttackFinished (3);
  95. hknight_run1 ();
  96. return; // done charging
  97. }
  98. if (random() > 0.5)
  99. sound (self, CHAN_WEAPON, "knight/sword2.wav", 1, ATTN_NORM);
  100. else
  101. sound (self, CHAN_WEAPON, "knight/sword1.wav", 1, ATTN_NORM);
  102. };
  103. //===========================================================================
  104. void() hknight_stand1 =[ $stand1, hknight_stand2 ] {ai_stand();};
  105. void() hknight_stand2 =[ $stand2, hknight_stand3 ] {ai_stand();};
  106. void() hknight_stand3 =[ $stand3, hknight_stand4 ] {ai_stand();};
  107. void() hknight_stand4 =[ $stand4, hknight_stand5 ] {ai_stand();};
  108. void() hknight_stand5 =[ $stand5, hknight_stand6 ] {ai_stand();};
  109. void() hknight_stand6 =[ $stand6, hknight_stand7 ] {ai_stand();};
  110. void() hknight_stand7 =[ $stand7, hknight_stand8 ] {ai_stand();};
  111. void() hknight_stand8 =[ $stand8, hknight_stand9 ] {ai_stand();};
  112. void() hknight_stand9 =[ $stand9, hknight_stand1 ] {ai_stand();};
  113. //===========================================================================
  114. void() hknight_walk1 =[ $walk1, hknight_walk2 ] {
  115. hk_idle_sound();
  116. ai_walk(2);};
  117. void() hknight_walk2 =[ $walk2, hknight_walk3 ] {ai_walk(5);};
  118. void() hknight_walk3 =[ $walk3, hknight_walk4 ] {ai_walk(5);};
  119. void() hknight_walk4 =[ $walk4, hknight_walk5 ] {ai_walk(4);};
  120. void() hknight_walk5 =[ $walk5, hknight_walk6 ] {ai_walk(4);};
  121. void() hknight_walk6 =[ $walk6, hknight_walk7 ] {ai_walk(2);};
  122. void() hknight_walk7 =[ $walk7, hknight_walk8 ] {ai_walk(2);};
  123. void() hknight_walk8 =[ $walk8, hknight_walk9 ] {ai_walk(3);};
  124. void() hknight_walk9 =[ $walk9, hknight_walk10 ] {ai_walk(3);};
  125. void() hknight_walk10 =[ $walk10, hknight_walk11 ] {ai_walk(4);};
  126. void() hknight_walk11 =[ $walk11, hknight_walk12 ] {ai_walk(3);};
  127. void() hknight_walk12 =[ $walk12, hknight_walk13 ] {ai_walk(4);};
  128. void() hknight_walk13 =[ $walk13, hknight_walk14 ] {ai_walk(6);};
  129. void() hknight_walk14 =[ $walk14, hknight_walk15 ] {ai_walk(2);};
  130. void() hknight_walk15 =[ $walk15, hknight_walk16 ] {ai_walk(2);};
  131. void() hknight_walk16 =[ $walk16, hknight_walk17 ] {ai_walk(4);};
  132. void() hknight_walk17 =[ $walk17, hknight_walk18 ] {ai_walk(3);};
  133. void() hknight_walk18 =[ $walk18, hknight_walk19 ] {ai_walk(3);};
  134. void() hknight_walk19 =[ $walk19, hknight_walk20 ] {ai_walk(3);};
  135. void() hknight_walk20 =[ $walk20, hknight_walk1 ] {ai_walk(2);};
  136. //===========================================================================
  137. void() hknight_run1 =[ $run1, hknight_run2 ] {
  138. hk_idle_sound();
  139. ai_run (20); CheckForCharge (); };
  140. void() hknight_run2 =[ $run2, hknight_run3 ] {ai_run(25);};
  141. void() hknight_run3 =[ $run3, hknight_run4 ] {ai_run(18);};
  142. void() hknight_run4 =[ $run4, hknight_run5 ] {ai_run(16);};
  143. void() hknight_run5 =[ $run5, hknight_run6 ] {ai_run(14);};
  144. void() hknight_run6 =[ $run6, hknight_run7 ] {ai_run(25);};
  145. void() hknight_run7 =[ $run7, hknight_run8 ] {ai_run(21);};
  146. void() hknight_run8 =[ $run8, hknight_run1 ] {ai_run(13);};
  147. //============================================================================
  148. void() hknight_pain1 =[ $pain1, hknight_pain2 ]
  149. {
  150. if (self.spawnflags & 2) // statue
  151. sound (self, CHAN_VOICE, "statue/pain.wav", 1, ATTN_NORM);
  152. else
  153. sound (self, CHAN_VOICE, "hknight/pain1.wav", 1, ATTN_NORM);
  154. };
  155. void() hknight_pain2 =[ $pain2, hknight_pain3 ] {};
  156. void() hknight_pain3 =[ $pain3, hknight_pain4 ] {};
  157. void() hknight_pain4 =[ $pain4, hknight_pain5 ] {};
  158. void() hknight_pain5 =[ $pain5, hknight_run1 ] {};
  159. //============================================================================
  160. void() hknight_die1 =[ $death1, hknight_die2 ] {ai_forward(10);};
  161. void() hknight_die2 =[ $death2, hknight_die3 ] {ai_forward(8);};
  162. void() hknight_die3 =[ $death3, hknight_die4 ]
  163. {self.solid = SOLID_NOT; ai_forward(7);};
  164. void() hknight_die4 =[ $death4, hknight_die5 ] {};
  165. void() hknight_die5 =[ $death5, hknight_die6 ] {};
  166. void() hknight_die6 =[ $death6, hknight_die7 ] {};
  167. void() hknight_die7 =[ $death7, hknight_die8 ] {};
  168. void() hknight_die8 =[ $death8, hknight_die9 ] {ai_forward(10);};
  169. void() hknight_die9 =[ $death9, hknight_die10 ] {ai_forward(11);};
  170. void() hknight_die10 =[ $death10, hknight_die11 ] {};
  171. void() hknight_die11 =[ $death11, hknight_die12 ] {};
  172. void() hknight_die12 =[ $death12, hknight_die12 ] {};
  173. void() hknight_dieb1 =[ $deathb1, hknight_dieb2 ] {};
  174. void() hknight_dieb2 =[ $deathb2, hknight_dieb3 ] {};
  175. void() hknight_dieb3 =[ $deathb3, hknight_dieb4 ]
  176. {self.solid = SOLID_NOT;};
  177. void() hknight_dieb4 =[ $deathb4, hknight_dieb5 ] {};
  178. void() hknight_dieb5 =[ $deathb5, hknight_dieb6 ] {};
  179. void() hknight_dieb6 =[ $deathb6, hknight_dieb7 ] {};
  180. void() hknight_dieb7 =[ $deathb7, hknight_dieb8 ] {};
  181. void() hknight_dieb8 =[ $deathb8, hknight_dieb9 ] {};
  182. void() hknight_dieb9 =[ $deathb9, hknight_dieb9 ] {};
  183. void() hknight_die =
  184. {
  185. // check for gib
  186. if (self.health < -40)
  187. {
  188. sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
  189. ThrowHead ("progs/h_hellkn.mdl", self.health);
  190. if (self.spawnflags & 2) // statue
  191. {
  192. ThrowGib ( "progs/statgib1.mdl", self.health);
  193. ThrowGib ( "progs/statgib2.mdl", self.health);
  194. ThrowGib ( "progs/statgib3.mdl", self.health);
  195. }
  196. else
  197. {
  198. ThrowGib ("progs/gib1.mdl", self.health);
  199. ThrowGib ("progs/gib2.mdl", self.health);
  200. ThrowGib ("progs/gib3.mdl", self.health);
  201. }
  202. return;
  203. }
  204. // regular death
  205. if (self.spawnflags & 2) // statue
  206. sound (self, CHAN_VOICE, "statue/death.wav", 1, ATTN_NORM);
  207. else
  208. sound (self, CHAN_VOICE, "hknight/death1.wav", 1, ATTN_NORM);
  209. if (random() > 0.5)
  210. hknight_die1 ();
  211. else
  212. hknight_dieb1 ();
  213. };
  214. //============================================================================
  215. void() hknight_magica1 =[ $magica1, hknight_magica2 ] {ai_face();};
  216. void() hknight_magica2 =[ $magica2, hknight_magica3 ] {ai_face();};
  217. void() hknight_magica3 =[ $magica3, hknight_magica4 ] {ai_face();};
  218. void() hknight_magica4 =[ $magica4, hknight_magica5 ] {ai_face();};
  219. void() hknight_magica5 =[ $magica5, hknight_magica6 ] {ai_face();};
  220. void() hknight_magica6 =[ $magica6, hknight_magica7 ] {ai_face();};
  221. void() hknight_magica7 =[ $magica7, hknight_magica8 ] {hknight_shot(-2);};
  222. void() hknight_magica8 =[ $magica8, hknight_magica9 ] {hknight_shot(-1);};
  223. void() hknight_magica9 =[ $magica9, hknight_magica10] {hknight_shot(0);};
  224. void() hknight_magica10 =[ $magica10, hknight_magica11] {hknight_shot(1);};
  225. void() hknight_magica11 =[ $magica11, hknight_magica12] {hknight_shot(2);};
  226. void() hknight_magica12 =[ $magica12, hknight_magica13] {hknight_shot(3);};
  227. void() hknight_magica13 =[ $magica13, hknight_magica14] {ai_face();};
  228. void() hknight_magica14 =[ $magica14, hknight_run1 ] {ai_face();};
  229. //============================================================================
  230. void() hknight_magicb1 =[ $magicb1, hknight_magicb2 ] {ai_face();};
  231. void() hknight_magicb2 =[ $magicb2, hknight_magicb3 ] {ai_face();};
  232. void() hknight_magicb3 =[ $magicb3, hknight_magicb4 ] {ai_face();};
  233. void() hknight_magicb4 =[ $magicb4, hknight_magicb5 ] {ai_face();};
  234. void() hknight_magicb5 =[ $magicb5, hknight_magicb6 ] {ai_face();};
  235. void() hknight_magicb6 =[ $magicb6, hknight_magicb7 ] {ai_face();};
  236. void() hknight_magicb7 =[ $magicb7, hknight_magicb8 ] {hknight_shot(-2);};
  237. void() hknight_magicb8 =[ $magicb8, hknight_magicb9 ] {hknight_shot(-1);};
  238. void() hknight_magicb9 =[ $magicb9, hknight_magicb10] {hknight_shot(0);};
  239. void() hknight_magicb10 =[ $magicb10, hknight_magicb11] {hknight_shot(1);};
  240. void() hknight_magicb11 =[ $magicb11, hknight_magicb12] {hknight_shot(2);};
  241. void() hknight_magicb12 =[ $magicb12, hknight_magicb13] {hknight_shot(3);};
  242. void() hknight_magicb13 =[ $magicb13, hknight_run1] {ai_face();};
  243. //============================================================================
  244. void() hknight_magicc1 =[ $magicc1, hknight_magicc2 ] {ai_face();};
  245. void() hknight_magicc2 =[ $magicc2, hknight_magicc3 ] {ai_face();};
  246. void() hknight_magicc3 =[ $magicc3, hknight_magicc4 ] {ai_face();};
  247. void() hknight_magicc4 =[ $magicc4, hknight_magicc5 ] {ai_face();};
  248. void() hknight_magicc5 =[ $magicc5, hknight_magicc6 ] {ai_face();};
  249. void() hknight_magicc6 =[ $magicc6, hknight_magicc7 ] {hknight_shot(-2);};
  250. void() hknight_magicc7 =[ $magicc7, hknight_magicc8 ] {hknight_shot(-1);};
  251. void() hknight_magicc8 =[ $magicc8, hknight_magicc9 ] {hknight_shot(0);};
  252. void() hknight_magicc9 =[ $magicc9, hknight_magicc10] {hknight_shot(1);};
  253. void() hknight_magicc10 =[ $magicc10, hknight_magicc11] {hknight_shot(2);};
  254. void() hknight_magicc11 =[ $magicc11, hknight_run1] {hknight_shot(3);};
  255. //===========================================================================
  256. void() hknight_char_a1 =[ $char_a1, hknight_char_a2 ] {ai_charge(20);};
  257. void() hknight_char_a2 =[ $char_a2, hknight_char_a3 ] {ai_charge(25);};
  258. void() hknight_char_a3 =[ $char_a3, hknight_char_a4 ] {ai_charge(18);};
  259. void() hknight_char_a4 =[ $char_a4, hknight_char_a5 ] {ai_charge(16);};
  260. void() hknight_char_a5 =[ $char_a5, hknight_char_a6 ] {ai_charge(14);};
  261. void() hknight_char_a6 =[ $char_a6, hknight_char_a7 ] {ai_charge(20); ai_melee();};
  262. void() hknight_char_a7 =[ $char_a7, hknight_char_a8 ] {ai_charge(21); ai_melee();};
  263. void() hknight_char_a8 =[ $char_a8, hknight_char_a9 ] {ai_charge(13); ai_melee();};
  264. void() hknight_char_a9 =[ $char_a9, hknight_char_a10 ] {ai_charge(20); ai_melee();};
  265. void() hknight_char_a10=[ $char_a10, hknight_char_a11 ] {ai_charge(20); ai_melee();};
  266. void() hknight_char_a11=[ $char_a11, hknight_char_a12 ] {ai_charge(18); ai_melee();};
  267. void() hknight_char_a12=[ $char_a12, hknight_char_a13 ] {ai_charge(16);};
  268. void() hknight_char_a13=[ $char_a13, hknight_char_a14 ] {ai_charge(14);};
  269. void() hknight_char_a14=[ $char_a14, hknight_char_a15 ] {ai_charge(25);};
  270. void() hknight_char_a15=[ $char_a15, hknight_char_a16 ] {ai_charge(21);};
  271. void() hknight_char_a16=[ $char_a16, hknight_run1 ] {ai_charge(13);};
  272. //===========================================================================
  273. void() hknight_char_b1 =[ $char_b1, hknight_char_b2 ]
  274. {CheckContinueCharge (); ai_charge(23); ai_melee();};
  275. void() hknight_char_b2 =[ $char_b2, hknight_char_b3 ] {ai_charge(17); ai_melee();};
  276. void() hknight_char_b3 =[ $char_b3, hknight_char_b4 ] {ai_charge(12); ai_melee();};
  277. void() hknight_char_b4 =[ $char_b4, hknight_char_b5 ] {ai_charge(22); ai_melee();};
  278. void() hknight_char_b5 =[ $char_b5, hknight_char_b6 ] {ai_charge(18); ai_melee();};
  279. void() hknight_char_b6 =[ $char_b6, hknight_char_b1 ] {ai_charge(8); ai_melee();};
  280. //===========================================================================
  281. void() hknight_slice1 =[ $slice1, hknight_slice2 ] {ai_charge(9);};
  282. void() hknight_slice2 =[ $slice2, hknight_slice3 ] {ai_charge(6);};
  283. void() hknight_slice3 =[ $slice3, hknight_slice4 ] {ai_charge(13);};
  284. void() hknight_slice4 =[ $slice4, hknight_slice5 ] {ai_charge(4);};
  285. void() hknight_slice5 =[ $slice5, hknight_slice6 ] {ai_charge(7); ai_melee();};
  286. void() hknight_slice6 =[ $slice6, hknight_slice7 ] {ai_charge(15); ai_melee();};
  287. void() hknight_slice7 =[ $slice7, hknight_slice8 ] {ai_charge(8); ai_melee();};
  288. void() hknight_slice8 =[ $slice8, hknight_slice9 ] {ai_charge(2); ai_melee();};
  289. void() hknight_slice9 =[ $slice9, hknight_slice10 ] {ai_melee();};
  290. void() hknight_slice10 =[ $slice10, hknight_run1 ] {ai_charge(3);};
  291. //===========================================================================
  292. void() hknight_smash1 =[ $smash1, hknight_smash2 ] {ai_charge(1);};
  293. void() hknight_smash2 =[ $smash2, hknight_smash3 ] {ai_charge(13);};
  294. void() hknight_smash3 =[ $smash3, hknight_smash4 ] {ai_charge(9);};
  295. void() hknight_smash4 =[ $smash4, hknight_smash5 ] {ai_charge(11);};
  296. void() hknight_smash5 =[ $smash5, hknight_smash6 ] {ai_charge(10); ai_melee();};
  297. void() hknight_smash6 =[ $smash6, hknight_smash7 ] {ai_charge(7); ai_melee();};
  298. void() hknight_smash7 =[ $smash7, hknight_smash8 ] {ai_charge(12); ai_melee();};
  299. void() hknight_smash8 =[ $smash8, hknight_smash9 ] {ai_charge(2); ai_melee();};
  300. void() hknight_smash9 =[ $smash9, hknight_smash10 ] {ai_charge(3); ai_melee();};
  301. void() hknight_smash10 =[ $smash10, hknight_smash11 ] {ai_charge(0);};
  302. void() hknight_smash11 =[ $smash11, hknight_run1 ] {ai_charge(0);};
  303. //============================================================================
  304. void() hknight_watk1 =[ $w_attack1, hknight_watk2 ] {ai_charge(2);};
  305. void() hknight_watk2 =[ $w_attack2, hknight_watk3 ] {ai_charge(0);};
  306. void() hknight_watk3 =[ $w_attack3, hknight_watk4 ] {ai_charge(0);};
  307. void() hknight_watk4 =[ $w_attack4, hknight_watk5 ] {ai_melee();};
  308. void() hknight_watk5 =[ $w_attack5, hknight_watk6 ] {ai_melee();};
  309. void() hknight_watk6 =[ $w_attack6, hknight_watk7 ] {ai_melee();};
  310. void() hknight_watk7 =[ $w_attack7, hknight_watk8 ] {ai_charge(1);};
  311. void() hknight_watk8 =[ $w_attack8, hknight_watk9 ] {ai_charge(4);};
  312. void() hknight_watk9 =[ $w_attack9, hknight_watk10 ] {ai_charge(5);};
  313. void() hknight_watk10 =[ $w_attack10, hknight_watk11 ] {ai_charge(3); ai_melee();};
  314. void() hknight_watk11 =[ $w_attack11, hknight_watk12 ] {ai_charge(2); ai_melee();};
  315. void() hknight_watk12 =[ $w_attack12, hknight_watk13 ] {ai_charge(2); ai_melee();};
  316. void() hknight_watk13 =[ $w_attack13, hknight_watk14 ] {ai_charge(0);};
  317. void() hknight_watk14 =[ $w_attack14, hknight_watk15 ] {ai_charge(0);};
  318. void() hknight_watk15 =[ $w_attack15, hknight_watk16 ] {ai_charge(0);};
  319. void() hknight_watk16 =[ $w_attack16, hknight_watk17 ] {ai_charge(1);};
  320. void() hknight_watk17 =[ $w_attack17, hknight_watk18 ] {ai_charge(1); ai_melee();};
  321. void() hknight_watk18 =[ $w_attack18, hknight_watk19 ] {ai_charge(3); ai_melee();};
  322. void() hknight_watk19 =[ $w_attack19, hknight_watk20 ] {ai_charge(4); ai_melee();};
  323. void() hknight_watk20 =[ $w_attack20, hknight_watk21 ] {ai_charge(6);};
  324. void() hknight_watk21 =[ $w_attack21, hknight_watk22 ] {ai_charge(7);};
  325. void() hknight_watk22 =[ $w_attack22, hknight_run1 ] {ai_charge(3);};
  326. //============================================================================
  327. void() hk_idle_sound =
  328. {
  329. if (random() < 0.2)
  330. {
  331. if (self.spawnflags & 2) // statue
  332. sound (self, CHAN_VOICE, "statue/idle.wav", 1, ATTN_IDLE);
  333. else
  334. sound (self, CHAN_VOICE, "hknight/idle.wav", 1, ATTN_NORM);
  335. }
  336. };
  337. void(entity attacker, float damage) hknight_pain =
  338. {
  339. if (self.pain_finished > time)
  340. return;
  341. if (self.spawnflags & 2) // statue
  342. sound (self, CHAN_VOICE, "statue/pain.wav", 1, ATTN_NORM);
  343. else
  344. sound (self, CHAN_VOICE, "hknight/pain1.wav", 1, ATTN_NORM);
  345. if (time - self.pain_finished > 5)
  346. { // allways go into pain frame if it has been a while
  347. hknight_pain1 ();
  348. self.pain_finished = time + 1;
  349. return;
  350. }
  351. if ((random()*30 > damage) )
  352. return; // didn't flinch
  353. self.pain_finished = time + 1;
  354. hknight_pain1 ();
  355. };
  356. float hknight_type;
  357. void() hknight_melee =
  358. {
  359. hknight_type = hknight_type + 1;
  360. sound (self, CHAN_WEAPON, "hknight/slash1.wav", 1, ATTN_NORM);
  361. if (hknight_type == 1)
  362. hknight_slice1 ();
  363. else if (hknight_type == 2)
  364. hknight_smash1 ();
  365. else if (hknight_type == 3)
  366. {
  367. hknight_watk1 ();
  368. hknight_type = 0;
  369. }
  370. };
  371. void() hknight_pause =
  372. {
  373. sound ( self, CHAN_VOICE, "statue/see.wav", 1, ATTN_NORM);
  374. self.takedamage = DAMAGE_AIM;
  375. self.th_stand = hknight_stand1;
  376. self.th_walk = hknight_walk1;
  377. self.th_run = hknight_run1;
  378. self.th_melee = hknight_melee;
  379. self.th_missile = hknight_magicc1;
  380. self.th_pain = hknight_pain;
  381. self.th_die = hknight_die;
  382. self.use = SUB_Null;
  383. self.enemy = activator;
  384. self.nextthink = time + 0.1;
  385. self.think = FoundTarget;
  386. self.delay = 0;
  387. };
  388. void() hknight_pause1 =
  389. {
  390. self.takedamage = DAMAGE_NO;
  391. self.use = hknight_pause;
  392. self.think = hknight_pause1;
  393. self.nextthink = time + 0.1;
  394. };
  395. /*QUAKED monster_hell_knight (1 0 0) (-16 -16 -24) (16 16 40) Ambush Statue
  396. Statue - select this to use the stone skin and have him frozen in place.
  397. delay: time from sight to attack (default 5)
  398. frame: frame to be frozen in. (default 73)
  399. */
  400. void() monster_hell_knight =
  401. {
  402. if (deathmatch)
  403. {
  404. remove(self);
  405. return;
  406. }
  407. precache_model2 ("progs/hknight.mdl");
  408. precache_model2 ("progs/k_spike.mdl");
  409. precache_model2 ("progs/h_hellkn.mdl");
  410. if (self.spawnflags & 2) // statue
  411. {
  412. precache_model ( "progs/statgib1.mdl");
  413. precache_model ( "progs/statgib2.mdl");
  414. precache_model ( "progs/statgib3.mdl");
  415. precache_sound ( "statue/see.wav");
  416. precache_sound ( "statue/idle.wav");
  417. precache_sound ( "statue/pain.wav");
  418. precache_sound ( "statue/death.wav");
  419. }
  420. else
  421. {
  422. precache_sound2 ("hknight/death1.wav");
  423. precache_sound2 ("hknight/pain1.wav");
  424. precache_sound2 ("hknight/sight1.wav");
  425. precache_sound2 ("hknight/idle.wav");
  426. }
  427. precache_sound2 ("hknight/attack1.wav");
  428. precache_sound ("hknight/hit.wav"); // used by C code, so don't sound2
  429. precache_sound2 ("hknight/slash1.wav");
  430. precache_sound2 ("hknight/grunt.wav");
  431. precache_sound ("knight/sword1.wav");
  432. precache_sound ("knight/sword2.wav");
  433. self.solid = SOLID_SLIDEBOX;
  434. self.movetype = MOVETYPE_STEP;
  435. setmodel (self, "progs/hknight.mdl");
  436. setsize (self, '-16 -16 -24', '16 16 40');
  437. self.health = 250;
  438. if (self.spawnflags & 2) // statue
  439. {
  440. if (self.frame == 0)
  441. self.frame = 73;
  442. self.skin = 1;
  443. if (!self.targetname)
  444. {
  445. dprint ("statue not targeted\n");
  446. dprint (self.classname);
  447. dprint (" at ");
  448. dprint (vtos(self.origin));
  449. dprint ("\n");
  450. return;
  451. }
  452. self.use = hknight_pause;
  453. self.th_stand = hknight_pause1;
  454. self.th_walk = hknight_pause1;
  455. self.th_run = hknight_pause1;
  456. walkmonster_start ();
  457. }
  458. else
  459. {
  460. self.th_stand = hknight_stand1;
  461. self.th_walk = hknight_walk1;
  462. self.th_run = hknight_run1;
  463. self.th_melee = hknight_melee;
  464. self.th_missile = hknight_magicc1;
  465. self.th_pain = hknight_pain;
  466. self.th_die = hknight_die;
  467. walkmonster_start ();
  468. }
  469. };