home *** CD-ROM | disk | FTP | other *** search
/ Superpower (Alt) / SUPERPOWER.iso / q / patch / mbq109 / zombie.qc next >
Encoding:
Text File  |  1996-08-07  |  23.1 KB  |  591 lines

  1. Modified by shyft --- Suicide Zombies
  2.  
  3. /*
  4. ==============================================================================
  5.  
  6. ZOMBIE
  7.  
  8. ==============================================================================
  9. */
  10. $cd /raid/quake/id1/models/zombie
  11.  
  12. $origin    0 0 24
  13.  
  14. $base base
  15. $skin skin
  16.  
  17. $frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8
  18. $frame stand9 stand10 stand11 stand12 stand13 stand14 stand15
  19.  
  20. $frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8 walk9 walk10 walk11
  21. $frame walk12 walk13 walk14 walk15 walk16 walk17 walk18 walk19
  22.  
  23. $frame run1 run2 run3 run4 run5 run6 run7 run8 run9 run10 run11 run12
  24. $frame run13 run14 run15 run16 run17 run18
  25.  
  26. $frame atta1 atta2 atta3 atta4 atta5 atta6 atta7 atta8 atta9 atta10 atta11
  27. $frame atta12 atta13
  28.  
  29. $frame attb1 attb2 attb3 attb4 attb5 attb6 attb7 attb8 attb9 attb10 attb11
  30. $frame attb12 attb13 attb14
  31.  
  32. $frame attc1 attc2 attc3 attc4 attc5 attc6 attc7 attc8 attc9 attc10 attc11
  33. $frame attc12
  34.  
  35. $frame paina1 paina2 paina3 paina4 paina5 paina6 paina7 paina8 paina9 paina10
  36. $frame paina11 paina12
  37.  
  38. $frame painb1 painb2 painb3 painb4 painb5 painb6 painb7 painb8 painb9 painb10
  39. $frame painb11 painb12 painb13 painb14 painb15 painb16 painb17 painb18 painb19
  40. $frame painb20 painb21 painb22 painb23 painb24 painb25 painb26 painb27 painb28
  41.  
  42. $frame painc1 painc2 painc3 painc4 painc5 painc6 painc7 painc8 painc9 painc10
  43. $frame painc11 painc12 painc13 painc14 painc15 painc16 painc17 painc18
  44.  
  45. $frame paind1 paind2 paind3 paind4 paind5 paind6 paind7 paind8 paind9 paind10
  46. $frame paind11 paind12 paind13
  47.  
  48. $frame paine1 paine2 paine3 paine4 paine5 paine6 paine7 paine8 paine9 paine10
  49. $frame paine11 paine12 paine13 paine14 paine15 paine16 paine17 paine18 paine19
  50. $frame paine20 paine21 paine22 paine23 paine24 paine25 paine26 paine27 paine28
  51. $frame paine29 paine30
  52.  
  53. $frame cruc_1 cruc_2 cruc_3 cruc_4 cruc_5 cruc_6
  54.  
  55. float    SPAWN_CRUCIFIED    = 1;
  56.  
  57. //=============================================================================
  58.  
  59. .float inpain;
  60.  
  61. void() zombie_stand1    =[    $stand1,        zombie_stand2    ] {ai_stand();};
  62. void() zombie_stand2    =[    $stand2,        zombie_stand3    ] {ai_stand();};
  63. void() zombie_stand3    =[    $stand3,        zombie_stand4    ] {ai_stand();};
  64. void() zombie_stand4    =[    $stand4,        zombie_stand5    ] {ai_stand();};
  65. void() zombie_stand5    =[    $stand5,        zombie_stand6    ] {ai_stand();};
  66. void() zombie_stand6    =[    $stand6,        zombie_stand7    ] {ai_stand();};
  67. void() zombie_stand7    =[    $stand7,        zombie_stand8    ] {ai_stand();};
  68. void() zombie_stand8    =[    $stand8,        zombie_stand9    ] {ai_stand();};
  69. void() zombie_stand9    =[    $stand9,        zombie_stand10    ] {ai_stand();};
  70. void() zombie_stand10    =[    $stand10,        zombie_stand11    ] {ai_stand();};
  71. void() zombie_stand11    =[    $stand11,        zombie_stand12    ] {ai_stand();};
  72. void() zombie_stand12    =[    $stand12,        zombie_stand13    ] {ai_stand();};
  73. void() zombie_stand13    =[    $stand13,        zombie_stand14    ] {ai_stand();};
  74. void() zombie_stand14    =[    $stand14,        zombie_stand15    ] {ai_stand();};
  75. void() zombie_stand15    =[    $stand15,        zombie_stand1    ] {ai_stand();};
  76.  
  77. void() zombie_cruc1    =    [    $cruc_1,        zombie_cruc2    ] {
  78. if (random() < 0.1)
  79.     sound (self, CHAN_VOICE, "zombie/idle_w2.wav", 1, ATTN_STATIC);};
  80. void() zombie_cruc2    =    [    $cruc_2,        zombie_cruc3    ] {self.nextthink = time + 0.1 + random()*0.1;};
  81. void() zombie_cruc3    =    [    $cruc_3,        zombie_cruc4    ] {self.nextthink = time + 0.1 + random()*0.1;};
  82. void() zombie_cruc4    =    [    $cruc_4,        zombie_cruc5    ] {self.nextthink = time + 0.1 + random()*0.1;};
  83. void() zombie_cruc5    =    [    $cruc_5,        zombie_cruc6    ] {self.nextthink = time + 0.1 + random()*0.1;};
  84. void() zombie_cruc6    =    [    $cruc_6,        zombie_cruc1    ] {self.nextthink = time + 0.1 + random()*0.1;};
  85.  
  86. void() zombie_walk1        =[    $walk1,        zombie_walk2    ] {ai_walk(0);};
  87. void() zombie_walk2        =[    $walk2,        zombie_walk3    ] {ai_walk(2);};
  88. void() zombie_walk3        =[    $walk3,        zombie_walk4    ] {ai_walk(3);};
  89. void() zombie_walk4        =[    $walk4,        zombie_walk5    ] {ai_walk(2);};
  90. void() zombie_walk5        =[    $walk5,        zombie_walk6    ] {ai_walk(1);};
  91. void() zombie_walk6        =[    $walk6,        zombie_walk7    ] {ai_walk(0);};
  92. void() zombie_walk7        =[    $walk7,        zombie_walk8    ] {ai_walk(0);};
  93. void() zombie_walk8        =[    $walk8,        zombie_walk9    ] {ai_walk(0);};
  94. void() zombie_walk9        =[    $walk9,        zombie_walk10    ] {ai_walk(0);};
  95. void() zombie_walk10    =[    $walk10,    zombie_walk11    ] {ai_walk(0);};
  96. void() zombie_walk11    =[    $walk11,    zombie_walk12    ] {ai_walk(2);};
  97. void() zombie_walk12    =[    $walk12,    zombie_walk13    ] {ai_walk(2);};
  98. void() zombie_walk13    =[    $walk13,    zombie_walk14    ] {ai_walk(1);};
  99. void() zombie_walk14    =[    $walk14,    zombie_walk15    ] {ai_walk(0);};
  100. void() zombie_walk15    =[    $walk15,    zombie_walk16    ] {ai_walk(0);};
  101. void() zombie_walk16    =[    $walk16,    zombie_walk17    ] {ai_walk(0);};
  102. void() zombie_walk17    =[    $walk17,    zombie_walk18    ] {ai_walk(0);};
  103. void() zombie_walk18    =[    $walk18,    zombie_walk19    ] {ai_walk(0);};
  104. void() zombie_walk19    =[    $walk19,    zombie_walk1    ] {
  105. ai_walk(0);
  106. if (random() < 0.2)
  107.     sound (self, CHAN_VOICE, "zombie/z_idle.wav", 1, ATTN_IDLE);};
  108.  
  109. void() zombie_run1        =[    $run1,        zombie_run2    ] {ai_run(1);self.inpain = 0;};
  110. void() zombie_run2        =[    $run2,        zombie_run3    ] {ai_run(1);};
  111. void() zombie_run3        =[    $run3,        zombie_run4    ] {ai_run(0);};
  112. void() zombie_run4        =[    $run4,        zombie_run5    ] {ai_run(1);};
  113. void() zombie_run5        =[    $run5,        zombie_run6    ] {ai_run(2);};
  114. void() zombie_run6        =[    $run6,        zombie_run7    ] {ai_run(3);};
  115. void() zombie_run7        =[    $run7,        zombie_run8    ] {ai_run(4);};
  116. void() zombie_run8        =[    $run8,        zombie_run9    ] {ai_run(4);};
  117. void() zombie_run9        =[    $run9,        zombie_run10    ] {ai_run(2);};
  118. void() zombie_run10        =[    $run10,        zombie_run11    ] {ai_run(0);};
  119. void() zombie_run11        =[    $run11,        zombie_run12    ] {ai_run(0);};
  120. void() zombie_run12        =[    $run12,        zombie_run13    ] {ai_run(0);};
  121. void() zombie_run13        =[    $run13,        zombie_run14    ] {ai_run(2);};
  122. void() zombie_run14        =[    $run14,        zombie_run15    ] {ai_run(4);};
  123. void() zombie_run15        =[    $run15,        zombie_run16    ] {ai_run(6);};
  124. void() zombie_run16        =[    $run16,        zombie_run17    ] {ai_run(7);};
  125. void() zombie_run17        =[    $run17,        zombie_run18    ] {ai_run(3);};
  126. void() zombie_run18        =[    $run18,        zombie_run1    ] {
  127. ai_run(8);
  128. if (random() < 0.2)
  129.     sound (self, CHAN_VOICE, "zombie/z_idle.wav", 1, ATTN_IDLE);
  130. if (random() > 0.8)
  131.     sound (self, CHAN_VOICE, "zombie/z_idle1.wav", 1, ATTN_IDLE);
  132. };
  133.  
  134. void() zombie_xrun1        =[    $run1,        zombie_xrun2    ] {ai_run(11);self.inpain = 0;};
  135. void() zombie_xrun2        =[    $run2,        zombie_xrun3    ] {ai_run(11);};
  136. void() zombie_xrun3        =[    $run3,        zombie_xrun4    ] {ai_run(10);};
  137. void() zombie_xrun4        =[    $run4,        zombie_xrun5    ] {ai_run(11);};
  138. void() zombie_xrun5        =[    $run5,        zombie_xrun6    ] {ai_run(12);};
  139. void() zombie_xrun6        =[    $run6,        zombie_xrun7    ] {ai_run(13);};
  140. void() zombie_xrun7        =[    $run7,        zombie_xrun8    ] {ai_run(14);};
  141. void() zombie_xrun8        =[    $run8,        zombie_xrun9    ] {ai_run(14);};
  142. void() zombie_xrun9        =[    $run9,        zombie_xrun10    ] {ai_run(12);};
  143. void() zombie_xrun10        =[    $run10,        zombie_xrun11    ] {ai_run(10);};
  144. void() zombie_xrun11        =[    $run11,        zombie_xrun12    ] {ai_run(10);};
  145. void() zombie_xrun12        =[    $run12,        zombie_xrun13    ] {ai_run(10);};
  146. void() zombie_xrun13        =[    $run13,        zombie_xrun14    ] {ai_run(12);};
  147. void() zombie_xrun14        =[    $run14,        zombie_xrun15    ] {ai_run(14);};
  148. void() zombie_xrun15        =[    $run15,        zombie_xrun16    ] {ai_run(16);};
  149. void() zombie_xrun16        =[    $run16,        zombie_xrun17    ] {ai_run(17);};
  150. void() zombie_xrun17        =[    $run17,        zombie_xrun18    ] {ai_run(13);};
  151. void() zombie_xrun18        =[    $run18,        zombie_xrun1    ] {
  152. ai_run(18);
  153. if (random() < 0.2)
  154.     sound (self, CHAN_VOICE, "zombie/z_idle.wav", 1, ATTN_IDLE);
  155. if (random() > 0.8)
  156.     sound (self, CHAN_VOICE, "zombie/z_idle1.wav", 1, ATTN_IDLE);
  157. };
  158.  
  159. /*
  160. =============================================================================
  161.  
  162. ATTACKS
  163.  
  164. =============================================================================
  165. */
  166.  
  167. void() ZombieGrenadeTouch =
  168. {
  169.     if (other == self.owner)
  170.         return;        // don't explode on owner
  171.     if (other.takedamage)
  172.     {
  173.         T_Damage (other, self, self.owner, 10 );
  174.         sound (self, CHAN_WEAPON, "zombie/z_hit.wav", 1, ATTN_NORM);
  175.         remove (self);
  176.         return;
  177.     }
  178.     sound (self, CHAN_WEAPON, "zombie/z_miss.wav", 1, ATTN_NORM);    // bounce sound
  179.     self.velocity = '0 0 0';
  180.     self.avelocity = '0 0 0';
  181.     self.touch = SUB_Remove;
  182. };
  183.  
  184. /*
  185. ================
  186. ZombieFireGrenade
  187. ================
  188. */
  189. void(vector st) ZombieFireGrenade =
  190. {
  191.     local    entity missile, mpuff;
  192.     local    vector    org;
  193.  
  194.     sound (self, CHAN_WEAPON, "zombie/z_shot1.wav", 1, ATTN_NORM);
  195.  
  196.     missile = spawn ();
  197.     missile.owner = self;
  198.     missile.movetype = MOVETYPE_BOUNCE;
  199.     missile.solid = SOLID_BBOX;
  200.  
  201. // calc org
  202.     org = self.origin + st_x * v_forward + st_y * v_right + (st_z - 24) * v_up;
  203.     
  204. // set missile speed    
  205.  
  206.     makevectors (self.angles);
  207.  
  208.     missile.velocity = normalize(self.enemy.origin - org);
  209.     missile.velocity = missile.velocity * 600;
  210.     missile.velocity_z = 200;
  211.  
  212.     missile.avelocity = '3000 1000 2000';
  213.  
  214.     missile.touch = ZombieGrenadeTouch;
  215.     
  216. // set missile duration
  217.     missile.nextthink = time + 2.5;
  218.     missile.think = SUB_Remove;
  219.  
  220.     setmodel (missile, "progs/zom_gib.mdl");
  221.     setsize (missile, '0 0 0', '0 0 0');        
  222.     setorigin (missile, org);
  223. };
  224.  
  225.  
  226. void() zombie_atta1        =[    $atta1,        zombie_atta2    ] {ai_face();};
  227. void() zombie_atta2        =[    $atta2,        zombie_atta3    ] {ai_face();};
  228. void() zombie_atta3        =[    $atta3,        zombie_atta4    ] {ai_face();};
  229. void() zombie_atta4        =[    $atta4,        zombie_atta5    ] {ai_face();};
  230. void() zombie_atta5        =[    $atta5,        zombie_atta6    ] {ai_face();};
  231. void() zombie_atta6        =[    $atta6,        zombie_atta7    ] {ai_face();};
  232. void() zombie_atta7        =[    $atta7,        zombie_atta8    ] {ai_face();};
  233. void() zombie_atta8        =[    $atta8,        zombie_atta9    ] {ai_face();};
  234. void() zombie_atta9        =[    $atta9,        zombie_atta10    ] {ai_face();};
  235. void() zombie_atta10    =[    $atta10,    zombie_atta11    ] {ai_face();};
  236. void() zombie_atta11    =[    $atta11,    zombie_atta12    ] {ai_face();};
  237. void() zombie_atta12    =[    $atta12,    zombie_atta13    ] {ai_face();};
  238. void() zombie_atta13    =[    $atta13,    zombie_run1    ] {ai_face();ZombieFireGrenade('-10 -22 30');};
  239.  
  240. void() zombie_attb1        =[    $attb1,        zombie_attb2    ] {ai_face();};
  241. void() zombie_attb2        =[    $attb2,        zombie_attb3    ] {ai_face();};
  242. void() zombie_attb3        =[    $attb3,        zombie_attb4    ] {ai_face();};
  243. void() zombie_attb4        =[    $attb4,        zombie_attb5    ] {ai_face();};
  244. void() zombie_attb5        =[    $attb5,        zombie_attb6    ] {ai_face();};
  245. void() zombie_attb6        =[    $attb6,        zombie_attb7    ] {ai_face();};
  246. void() zombie_attb7        =[    $attb7,        zombie_attb8    ] {ai_face();};
  247. void() zombie_attb8        =[    $attb8,        zombie_attb9    ] {ai_face();};
  248. void() zombie_attb9        =[    $attb9,        zombie_attb10    ] {ai_face();};
  249. void() zombie_attb10    =[    $attb10,    zombie_attb11    ] {ai_face();};
  250. void() zombie_attb11    =[    $attb11,    zombie_attb12    ] {ai_face();};
  251. void() zombie_attb12    =[    $attb12,    zombie_attb13    ] {ai_face();};
  252. void() zombie_attb13    =[    $attb13,    zombie_attb14    ] {ai_face();};
  253. void() zombie_attb14    =[    $attb13,    zombie_run1    ] {ai_face();ZombieFireGrenade('-10 -24 29');};
  254.  
  255. void() zombie_attc1        =[    $attc1,        zombie_attc2    ] {ai_face();};
  256. void() zombie_attc2        =[    $attc2,        zombie_attc3    ] {ai_face();};
  257. void() zombie_attc3        =[    $attc3,        zombie_attc4    ] {ai_face();};
  258. void() zombie_attc4        =[    $attc4,        zombie_attc5    ] {ai_face();};
  259. void() zombie_attc5        =[    $attc5,        zombie_attc6    ] {ai_face();};
  260. void() zombie_attc6        =[    $attc6,        zombie_attc7    ] {ai_face();};
  261. void() zombie_attc7        =[    $attc7,        zombie_attc8    ] {ai_face();};
  262. void() zombie_attc8        =[    $attc8,        zombie_attc9    ] {ai_face();};
  263. void() zombie_attc9        =[    $attc9,        zombie_attc10    ] {ai_face();};
  264. void() zombie_attc10    =[    $attc10,    zombie_attc11    ] {ai_face();};
  265. void() zombie_attc11    =[    $attc11,    zombie_attc12    ] {ai_face();};
  266. void() zombie_attc12    =[    $attc12,    zombie_run1        ] {ai_face();ZombieFireGrenade('-12 -19 29');};
  267.  
  268. void() zombie_missile =
  269. {
  270.     local float    r;
  271.     
  272.     r = random();
  273.     
  274.     if (r < 0.3)
  275.         zombie_atta1 ();
  276.     else if (r < 0.6)
  277.         zombie_attb1 ();
  278.     else
  279.         zombie_attc1 ();
  280. };
  281.  
  282.  
  283. /*
  284. =============================================================================
  285.  
  286. PAIN
  287.  
  288. =============================================================================
  289. */
  290.  
  291. void() zombie_paina1    =[    $paina1,    zombie_paina2    ] {sound (self, CHAN_VOICE, "zombie/z_pain.wav", 1, ATTN_NORM);};
  292. void() zombie_paina2    =[    $paina2,    zombie_paina3    ] {ai_painforward(3);};
  293. void() zombie_paina3    =[    $paina3,    zombie_paina4    ] {ai_painforward(1);};
  294. void() zombie_paina4    =[    $paina4,    zombie_paina5    ] {ai_pain(1);};
  295. void() zombie_paina5    =[    $paina5,    zombie_paina6    ] {ai_pain(3);};
  296. void() zombie_paina6    =[    $paina6,    zombie_paina7    ] {ai_pain(1);};
  297. void() zombie_paina7    =[    $paina7,    zombie_paina8    ] {};
  298. void() zombie_paina8    =[    $paina8,    zombie_paina9    ] {};
  299. void() zombie_paina9    =[    $paina9,    zombie_paina10    ] {};
  300. void() zombie_paina10    =[    $paina10,    zombie_paina11    ] {};
  301. void() zombie_paina11    =[    $paina11,    zombie_paina12    ] {};
  302. void() zombie_paina12    =[    $paina12,    zombie_run1        ] {};
  303.  
  304. void() zombie_painb1    =[    $painb1,    zombie_painb2    ] {sound (self, CHAN_VOICE, "zombie/z_pain1.wav", 1, ATTN_NORM);};
  305. void() zombie_painb2    =[    $painb2,    zombie_painb3    ] {ai_pain(2);};
  306. void() zombie_painb3    =[    $painb3,    zombie_painb4    ] {ai_pain(8);};
  307. void() zombie_painb4    =[    $painb4,    zombie_painb5    ] {ai_pain(6);};
  308. void() zombie_painb5    =[    $painb5,    zombie_painb6    ] {ai_pain(2);};
  309. void() zombie_painb6    =[    $painb6,    zombie_painb7    ] {};
  310. void() zombie_painb7    =[    $painb7,    zombie_painb8    ] {};
  311. void() zombie_painb8    =[    $painb8,    zombie_painb9    ] {};
  312. void() zombie_painb9    =[    $painb9,    zombie_painb10    ] {sound (self, CHAN_BODY, "zombie/z_fall.wav", 1, ATTN_NORM);};
  313. void() zombie_painb10    =[    $painb10,    zombie_painb11    ] {};
  314. void() zombie_painb11    =[    $painb11,    zombie_painb12    ] {};
  315. void() zombie_painb12    =[    $painb12,    zombie_painb13    ] {};
  316. void() zombie_painb13    =[    $painb13,    zombie_painb14    ] {};
  317. void() zombie_painb14    =[    $painb14,    zombie_painb15    ] {};
  318. void() zombie_painb15    =[    $painb15,    zombie_painb16    ] {};
  319. void() zombie_painb16    =[    $painb16,    zombie_painb17    ] {};
  320. void() zombie_painb17    =[    $painb17,    zombie_painb18    ] {};
  321. void() zombie_painb18    =[    $painb18,    zombie_painb19    ] {};
  322. void() zombie_painb19    =[    $painb19,    zombie_painb20    ] {};
  323. void() zombie_painb20    =[    $painb20,    zombie_painb21    ] {};
  324. void() zombie_painb21    =[    $painb21,    zombie_painb22    ] {};
  325. void() zombie_painb22    =[    $painb22,    zombie_painb23    ] {};
  326. void() zombie_painb23    =[    $painb23,    zombie_painb24    ] {};
  327. void() zombie_painb24    =[    $painb24,    zombie_painb25    ] {};
  328. void() zombie_painb25    =[    $painb25,    zombie_painb26    ] {ai_painforward(1);};
  329. void() zombie_painb26    =[    $painb26,    zombie_painb27    ] {};
  330. void() zombie_painb27    =[    $painb27,    zombie_painb28    ] {};
  331. void() zombie_painb28    =[    $painb28,    zombie_run1        ] {};
  332.  
  333. void() zombie_painc1    =[    $painc1,    zombie_painc2    ] {sound (self, CHAN_VOICE, "zombie/z_pain1.wav", 1, ATTN_NORM);};
  334. void() zombie_painc2    =[    $painc2,    zombie_painc3    ] {};
  335. void() zombie_painc3    =[    $painc3,    zombie_painc4    ] {ai_pain(3);};
  336. void() zombie_painc4    =[    $painc4,    zombie_painc5    ] {ai_pain(1);};
  337. void() zombie_painc5    =[    $painc5,    zombie_painc6    ] {};
  338. void() zombie_painc6    =[    $painc6,    zombie_painc7    ] {};
  339. void() zombie_painc7    =[    $painc7,    zombie_painc8    ] {};
  340. void() zombie_painc8    =[    $painc8,    zombie_painc9    ] {};
  341. void() zombie_painc9    =[    $painc9,    zombie_painc10    ] {};
  342. void() zombie_painc10    =[    $painc10,    zombie_painc11    ] {};
  343. void() zombie_painc11    =[    $painc11,    zombie_painc12    ] {ai_painforward(1);};
  344. void() zombie_painc12    =[    $painc12,    zombie_painc13    ] {ai_painforward(1);};
  345. void() zombie_painc13    =[    $painc13,    zombie_painc14    ] {};
  346. void() zombie_painc14    =[    $painc14,    zombie_painc15    ] {};
  347. void() zombie_painc15    =[    $painc15,    zombie_painc16    ] {};
  348. void() zombie_painc16    =[    $painc16,    zombie_painc17    ] {};
  349. void() zombie_painc17    =[    $painc17,    zombie_painc18    ] {};
  350. void() zombie_painc18    =[    $painc18,    zombie_run1    ] {};
  351.  
  352. void() zombie_paind1    =[    $paind1,    zombie_paind2    ] {sound (self, CHAN_VOICE, "zombie/z_pain.wav", 1, ATTN_NORM);};
  353. void() zombie_paind2    =[    $paind2,    zombie_paind3    ] {};
  354. void() zombie_paind3    =[    $paind3,    zombie_paind4    ] {};
  355. void() zombie_paind4    =[    $paind4,    zombie_paind5    ] {};
  356. void() zombie_paind5    =[    $paind5,    zombie_paind6    ] {};
  357. void() zombie_paind6    =[    $paind6,    zombie_paind7    ] {};
  358. void() zombie_paind7    =[    $paind7,    zombie_paind8    ] {};
  359. void() zombie_paind8    =[    $paind8,    zombie_paind9    ] {};
  360. void() zombie_paind9    =[    $paind9,    zombie_paind10    ] {ai_pain(1);};
  361. void() zombie_paind10    =[    $paind10,    zombie_paind11    ] {};
  362. void() zombie_paind11    =[    $paind11,    zombie_paind12    ] {};
  363. void() zombie_paind12    =[    $paind12,    zombie_paind13    ] {};
  364. void() zombie_paind13    =[    $paind13,    zombie_run1    ] {};
  365.  
  366. void() zombie_paine1    =[    $paine1,    zombie_paine2    ] {
  367. sound (self, CHAN_VOICE, "zombie/z_pain.wav", 1, ATTN_NORM);
  368. self.health = 60;
  369. };
  370. void() zombie_paine2    =[    $paine2,    zombie_paine3    ] {ai_pain(8);};
  371. void() zombie_paine3    =[    $paine3,    zombie_paine4    ] {ai_pain(5);};
  372. void() zombie_paine4    =[    $paine4,    zombie_paine5    ] {ai_pain(3);};
  373. void() zombie_paine5    =[    $paine5,    zombie_paine6    ] {ai_pain(1);};
  374. void() zombie_paine6    =[    $paine6,    zombie_paine7    ] {ai_pain(2);};
  375. void() zombie_paine7    =[    $paine7,    zombie_paine8    ] {ai_pain(1);};
  376. void() zombie_paine8    =[    $paine8,    zombie_paine9    ] {ai_pain(1);};
  377. void() zombie_paine9    =[    $paine9,    zombie_paine10    ] {ai_pain(2);};
  378. void() zombie_paine10    =[    $paine10,    zombie_paine11    ] {
  379. sound (self, CHAN_BODY, "zombie/z_fall.wav", 1, ATTN_NORM);
  380. self.solid = SOLID_NOT;
  381. };
  382. void() zombie_paine11    =[    $paine11,    zombie_paine12    ] {self.nextthink = self.nextthink + 5;self.health = 60;};
  383. void() zombie_paine12    =[    $paine12,    zombie_paine13    ]{
  384. // see if ok to stand up
  385. self.health = 60;
  386. sound (self, CHAN_VOICE, "zombie/z_idle.wav", 1, ATTN_IDLE);
  387. self.solid = SOLID_SLIDEBOX;
  388. if (!walkmove (0, 0))
  389. {
  390.     self.think = zombie_paine11;
  391.     self.solid = SOLID_NOT;
  392.     return;
  393. }
  394. };
  395. void() zombie_paine13    =[    $paine13,    zombie_paine14    ] {};
  396. void() zombie_paine14    =[    $paine14,    zombie_paine15    ] {};
  397. void() zombie_paine15    =[    $paine15,    zombie_paine16    ] {};
  398. void() zombie_paine16    =[    $paine16,    zombie_paine17    ] {};
  399. void() zombie_paine17    =[    $paine17,    zombie_paine18    ] {};
  400. void() zombie_paine18    =[    $paine18,    zombie_paine19    ] {};
  401. void() zombie_paine19    =[    $paine19,    zombie_paine20    ] {};
  402. void() zombie_paine20    =[    $paine20,    zombie_paine21    ] {};
  403. void() zombie_paine21    =[    $paine21,    zombie_paine22    ] {};
  404. void() zombie_paine22    =[    $paine22,    zombie_paine23    ] {};
  405. void() zombie_paine23    =[    $paine23,    zombie_paine24    ] {};
  406. void() zombie_paine24    =[    $paine24,    zombie_paine25    ] {};
  407. void() zombie_paine25    =[    $paine25,    zombie_paine26    ] {ai_painforward(5);};
  408. void() zombie_paine26    =[    $paine26,    zombie_paine27    ] {ai_painforward(3);};
  409. void() zombie_paine27    =[    $paine27,    zombie_paine28    ] {ai_painforward(1);};
  410. void() zombie_paine28    =[    $paine28,    zombie_paine29    ] {ai_pain(1);};
  411. void() zombie_paine29    =[    $paine29,    zombie_paine30    ] {};
  412. void() zombie_paine30    =[    $paine30,    zombie_run1        ] {};
  413.  
  414.  
  415. void()    zombie_atk1    =[    $run1,        zombie_atk2    ]
  416. {
  417. sound (self, CHAN_WEAPON, "zombie/z_idle.wav", 1, ATTN_NORM);
  418. ai_charge(10);};
  419. void()    zombie_atk2    =[    $run2,        zombie_atk3    ] {ai_charge(15);};
  420. void()    zombie_atk3    =[    $run3,        zombie_atk4    ] {ai_charge(8);};
  421. void()    zombie_atk4    =[    $run4,        zombie_atk5    ] {ai_charge(10);};
  422. void()    zombie_atk5    =[    $run5,        zombie_atk6    ] {ai_charge(9);};
  423. void()    zombie_atk6    =[    $run6,        zombie_atk7    ] {ai_charge(12);};
  424. void()    zombie_atk7    =[    $run7,        zombie_atk8    ] {ai_charge(8);};
  425. void()    zombie_atk8    =[    $run8,        zombie_atk9    ] {ai_charge(13);};
  426. void()    zombie_atk9    =[    $run9,        zombie_atk10] {ai_charge(10);};
  427. void()    zombie_atk10=[    $run10,        zombie_xrun1    ] {
  428.       makevectors (self.angles);
  429.     self.origin_z = self.origin_z + 1;
  430.     self.velocity = v_forward * 100 + '0 0 25';
  431.     if (self.flags & FL_ONGROUND)
  432.     self.flags = self.flags - FL_ONGROUND;
  433.       ai_charge(20); 
  434. };
  435.  
  436. void() zombie_bomb =
  437. {     
  438.         if (other.classname != "player")
  439.             return;
  440.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  441.     WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  442.     WriteCoord (MSG_BROADCAST, self.origin_x);
  443.     WriteCoord (MSG_BROADCAST, self.origin_y);
  444.     WriteCoord (MSG_BROADCAST, self.origin_z);
  445.     
  446. T_RadiusDamage (self, self, 50, world);
  447.       ThrowHead ("progs/h_zombie.mdl", -150);
  448.     ThrowGib ("progs/gib1.mdl", -150);
  449.       
  450.       sound (self, CHAN_VOICE, "zombie/z_gib.wav", 1, ATTN_NORM);
  451.     ThrowGib ("progs/gib2.mdl", -150);
  452.     ThrowGib ("progs/gib3.mdl", -150);
  453.       
  454. };
  455.  
  456.  
  457. void() zombie_die =
  458. {
  459.     sound (self, CHAN_VOICE, "zombie/z_gib.wav", 1, ATTN_NORM);
  460.     ThrowHead ("progs/h_zombie.mdl", self.health);
  461.     ThrowGib ("progs/gib1.mdl", self.health);
  462.     ThrowGib ("progs/gib2.mdl", self.health);
  463.     ThrowGib ("progs/gib3.mdl", self.health);
  464. };
  465.  
  466. /*
  467. =================
  468. zombie_pain
  469.  
  470. Zombies can only be killed (gibbed) by doing 60 hit points of damage
  471. in a single frame (rockets, grenades, quad shotgun, quad nailgun).
  472.  
  473. A hit of 25 points or more (super shotgun, quad nailgun) will allways put it
  474. down to the ground.
  475.  
  476. A hit of from 10 to 40 points in one frame will cause it to go down if it
  477. has been twice in two seconds, otherwise it goes into one of the four
  478. fast pain frames.
  479.  
  480. A hit of less than 10 points of damage (winged by a shotgun) will be ignored.
  481.  
  482. FIXME: don't use pain_finished because of nightmare hack
  483. =================
  484. */
  485. void(entity attacker, float take) zombie_pain =
  486. {
  487.     local float r;
  488.  
  489.     self.health = 60;        // allways reset health
  490.  
  491.     if (take < 9)
  492.         return;                // totally ignore
  493.  
  494.     if (self.inpain == 2)
  495.         return;            // down on ground, so don't reset any counters
  496.  
  497. // go down immediately if a big enough hit
  498.     if (take >= 25)
  499.     {
  500.         self.inpain = 2;
  501.         zombie_paine1 ();
  502.         return;
  503.     }
  504.     
  505.     if (self.inpain)
  506.     {
  507. // if hit again in next gre seconds while not in pain frames, definately drop
  508.         self.pain_finished = time + 3;
  509.         return;            // currently going through an animation, don't change
  510.     }
  511.     
  512.     if (self.pain_finished > time)
  513.     {
  514. // hit again, so drop down
  515.         self.inpain = 2;
  516.         zombie_paine1 ();
  517.         return;
  518.     }
  519.  
  520. // gp into one of the fast pain animations    
  521.     self.inpain = 1;
  522.  
  523.     r = random();
  524.     if (r < 0.25)
  525.         zombie_paina1 ();
  526.     else if (r <  0.5)
  527.         zombie_painb1 ();
  528.     else if (r <  0.75)
  529.         zombie_painc1 ();
  530.     else
  531.         zombie_paind1 ();
  532. };
  533.  
  534. //============================================================================
  535.  
  536. /*QUAKED monster_zombie (1 0 0) (-16 -16 -24) (16 16 32) Crucified ambush
  537.  
  538. If crucified, stick the bounding box 12 pixels back into a wall to look right.
  539. */
  540. void() monster_zombie =
  541. {
  542.     if (deathmatch)
  543.     {
  544.         remove(self);
  545.         return;
  546.     }
  547.  
  548.     precache_model ("progs/zombie.mdl");
  549.     precache_model ("progs/h_zombie.mdl");
  550.     precache_model ("progs/zom_gib.mdl");
  551.     precache_sound ("zombie/z_idle.wav");
  552.     precache_sound ("zombie/z_idle1.wav");
  553.     precache_sound ("zombie/z_shot1.wav");
  554.     precache_sound ("zombie/z_gib.wav");
  555.     precache_sound ("zombie/z_pain.wav");
  556.     precache_sound ("zombie/z_pain1.wav");
  557.     precache_sound ("zombie/z_fall.wav");
  558.     precache_sound ("zombie/z_miss.wav");
  559.     precache_sound ("zombie/z_hit.wav");
  560.     precache_sound ("zombie/idle_w2.wav");
  561.  
  562.     self.solid = SOLID_SLIDEBOX;
  563.     self.movetype = MOVETYPE_STEP;
  564.  
  565.     setmodel (self, "progs/zombie.mdl");
  566.  
  567.     setsize (self, '-16 -16 -24', '16 16 40');
  568.     self.health = 60;
  569.  
  570.     
  571.       self.th_stand = zombie_stand1;
  572.     self.th_walk = zombie_walk1;
  573.     self.th_run = zombie_run1;
  574.     self.th_pain = zombie_pain;
  575.     self.th_die = zombie_die;
  576.      if (random() > 0.3) 
  577.       self.th_missile = zombie_missile;
  578.      else
  579.     {self.th_melee = zombie_atk1; 
  580.        self.th_run = zombie_xrun1;
  581.        self.touch=zombie_bomb;}
  582.  
  583.     if (self.spawnflags & SPAWN_CRUCIFIED)
  584.     {
  585.         self.movetype = MOVETYPE_NONE;
  586.             zombie_cruc1 ();
  587.     }
  588.     else
  589.         walkmonster_start();
  590. };
  591.