SHARE
TWEET

RMQ/Schism OgreQc

a guest Sep 8th, 2015 83 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. ==============================================================================
  3.  
  4. OGRE
  5.  
  6. This includes the four basic weapon variants - Nail, Rocket, Grenade and
  7. Double Chainsaw.  The Elder Ogre is the XOgre and held in that qc file.
  8.  
  9. ==============================================================================
  10. */
  11.  
  12. $cd id1/models/ogre_c
  13. $origin 0 0 24
  14. $base base
  15. $skin base
  16.  
  17. $frame  stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9
  18.  
  19. $frame walk1 walk2 walk3 walk4 walk5 walk6 walk7
  20. $frame walk8 walk9 walk10 walk11 walk12 walk13 walk14 walk15 walk16
  21.  
  22. $frame run1 run2 run3 run4 run5 run6 run7 run8
  23.  
  24. $frame swing1 swing2 swing3 swing4 swing5 swing6 swing7
  25. $frame swing8 swing9 swing10 swing11 swing12 swing13 swing14
  26.  
  27. $frame smash1 smash2 smash3 smash4 smash5 smash6 smash7
  28. $frame smash8 smash9 smash10 smash11 smash12 smash13 smash14
  29.  
  30. $frame shoot1 shoot2 shoot3 shoot4 shoot5 shoot6
  31.  
  32. $frame pain1 pain2 pain3 pain4 pain5
  33.  
  34. $frame painb1 painb2 painb3
  35.  
  36. $frame painc1 painc2 painc3 painc4 painc5 painc6
  37.  
  38. $frame paind1 paind2 paind3 paind4 paind5 paind6 paind7 paind8 paind9 paind10
  39. $frame paind11 paind12 paind13 paind14 paind15 paind16
  40.  
  41. $frame paine1 paine2 paine3 paine4 paine5 paine6 paine7 paine8 paine9 paine10
  42. $frame paine11 paine12 paine13 paine14 paine15
  43.  
  44. $frame death1 death2 death3 death4 death5 death6
  45. $frame death7 death8 death9 death10 death11 death12
  46. $frame death13 death14
  47.  
  48. $frame bdeath1 bdeath2 bdeath3 bdeath4 bdeath5 bdeath6
  49. $frame bdeath7 bdeath8 bdeath9 bdeath10
  50.  
  51. $frame pull1 pull2 pull3 pull4 pull5 pull6 pull7 pull8 pull9 pull10 pull11
  52.  
  53. // CUSTENTS fire while running frames
  54. // (c) Carl Glave 1997
  55. $frame runfire1 runfire2 runfire3 runfire4
  56. $frame runfire5 runfire6 runfire7 runfire8
  57.  
  58. $framevalue 0   // FTEQCC
  59.  
  60. // ogreb DUAL CHAINSAWS
  61.  
  62. $frame  ogbstand1 ogbstand2 ogbstand3 ogbstand4 ogbstand5 ogbstand6 ogbstand7 ogbstand8 ogbstand9
  63.  
  64. $frame ogbwalk1 ogbwalk2 ogbwalk3 ogbwalk4 ogbwalk5 ogbwalk6 ogbwalk7
  65. $frame ogbwalk8 ogbwalk9 ogbwalk10 ogbwalk11 ogbwalk12 ogbwalk13 ogbwalk14 ogbwalk15 ogbwalk16
  66.  
  67. $frame ogbrun1 ogbrun2 ogbrun3 ogbrun4 ogbrun5 ogbrun6 ogbrun7 ogbrun8
  68.  
  69. $frame ogbswing1 ogbswing2 ogbswing3 ogbswing4 ogbswing5 ogbswing6 ogbswing7
  70. $frame ogbswing8 ogbswing9 ogbswing10 ogbswing11 ogbswing12 ogbswing13 ogbswing14
  71.  
  72. $frame ogbsmash1 ogbsmash2 ogbsmash3 ogbsmash4 ogbsmash5 ogbsmash6 ogbsmash7
  73. $frame ogbsmash8 ogbsmash9 ogbsmash10 ogbsmash11 ogbsmash12 ogbsmash13 ogbsmash14
  74.  
  75. $frame ogbtaunt1 ogbtaunt2 ogbtaunt3
  76.  
  77. $frame ogbpain1 ogbpain2 ogbpain3 ogbpain4 ogbpain5
  78.  
  79. $frame ogbdeath1 ogbdeath2 ogbdeath3 ogbdeath4 ogbdeath5 ogbdeath6
  80. $frame ogbdeath7 ogbdeath8 ogbdeath9 ogbdeath10 ogbdeath11 ogbdeath12
  81. $frame ogbdeath13 ogbdeath14 ogbdeath15 ogbdeath16 ogbdeath17
  82. $frame ogbdeath18 ogbdeath19 ogbdeath20 ogbdeath21
  83.  
  84. $frame ogbbdeath1 ogbbdeath2 ogbbdeath3 ogbbdeath4 ogbbdeath5 ogbbdeath6
  85. $frame ogbbdeath7 ogbbdeath8 ogbbdeath9 ogbbdeath10
  86.  
  87. $frame ogbcdeath1 ogbcdeath2 ogbcdeath3 ogbcdeath4 ogbcdeath5 ogbcdeath6
  88. $frame ogbcdeath7 ogbcdeath8 ogbcdeath9 ogbcdeath10 ogbcdeath11 ogbcdeath12
  89. $frame ogbcdeath13 ogbcdeath14
  90.  
  91. $framevalue 0
  92.  
  93. //ogrer ROCKETS
  94.  
  95. $frame  standr1 standr2 standr3 standr4 standr5 standr6 standr7 standr8 standr9
  96.  
  97. $frame walkr1 walkr2 walkr3 walkr4 walkr5 walkr6 walkr7
  98. $frame walkr8 walkr9 walkr10 walkr11 walkr12 walkr13 walkr14 walkr15 walkr16
  99.  
  100. $frame runr1 runr2 runr3 runr4 runr5 runr6 runr7 runr8
  101.  
  102. $frame bayonet1 bayonet2 bayonet3 bayonet4 bayonet5 bayonet6 bayonet7
  103.  
  104. $frame shootr1 shootr2 shootr3 shootr4 shootr5 shootr6
  105.  
  106. $frame painr1 painr2 painr3 painr4 painr5
  107.  
  108. $frame painbr1 painbr2 painbr3
  109.  
  110. $frame paincr1 paincr2 paincr3 paincr4 paincr5 paincr6
  111.  
  112. $frame paindr1 paindr2 paindr3 paindr4 paindr5 paindr6 paindr7 paindr8 paindr9 paindr10
  113. $frame paindr11 paindr12 paindr13 paindr14 paindr15 paindr16
  114.  
  115. $frame painer1 painer2 painer3 painer4 painer5 painer6 painer7 painer8 painer9 painer10
  116. $frame painer11 painer12 painer13 painer14 painer15
  117.  
  118. $frame deathr1 deathr2 deathr3 deathr4 deathr5 deathr6
  119. $frame deathr7 deathr8 deathr9 deathr10 deathr11 deathr12
  120. $frame deathr13 deathr14
  121.  
  122. $frame bdeathr1 bdeathr2 bdeathr3 bdeathr4 bdeathr5 bdeathr6
  123. $frame bdeathr7 bdeathr8 bdeathr9 bdeathr10
  124.  
  125. //=============================================================================
  126.  
  127. //float   NAIL_OGRE = 4; ijed All gone to defs
  128. //float BERSERK_OGRE = 8;       // if change, remember ai.qc
  129. //float ROCKET_OGRE = 16;
  130.  
  131. //=============================================================================
  132.  
  133. // footsteps, gb
  134. void()  ogstep =
  135. {
  136.         if ((self.flags & FL_ONGROUND) /*&& (self.h2olevel == 0)*/ /*&& (self.velocity != '0 0 0')*/)
  137.         {
  138.                 if (self.h2olevel > 1)  // not when submerged
  139.                         return;
  140.  
  141.                 local float r;
  142.  
  143.                 // wading in water?
  144.                 if (self.h2olevel > 0)
  145.                 {
  146.                         r = rint(random() * 3);
  147.  
  148.                         if (r == 1)
  149.                                 sound (self, CHAN_AUTO, "misc/waterstep1.wav", 0.7, ATTN_NORM);
  150.                         else if (r == 2)
  151.                                 sound (self, CHAN_AUTO, "misc/waterstep2.wav", 0.7, ATTN_NORM);
  152.                         else if (r == 0)
  153.                                 sound (self, CHAN_AUTO, "misc/waterstep3.wav", 0.7, ATTN_NORM);
  154.                         else
  155.                                 sound (self, CHAN_AUTO, "misc/waterstep4.wav", 0.7, ATTN_NORM);
  156.                 }
  157.                 // out of water?
  158.                 else
  159.                 {
  160.                         r = rint(random() * 7);
  161.                        
  162.                         if (r == 1)
  163.                                 sound (self, CHAN_AUTO, "ogre/ogstep1.wav", 0.7, ATTN_NORM);
  164.                         else if (r == 2)
  165.                                 sound (self, CHAN_AUTO, "ogre/ogstep2.wav", 0.7, ATTN_NORM);
  166.                         else if (r == 3)
  167.                                 sound (self, CHAN_AUTO, "ogre/ogstep3.wav", 0.7, ATTN_NORM);
  168.                         else if (r == 4)
  169.                                 sound (self, CHAN_AUTO, "ogre/ogstep4.wav", 0.7, ATTN_NORM);
  170.                         else if (r == 5)
  171.                                 sound (self, CHAN_AUTO, "ogre/ogstep5.wav", 0.7, ATTN_NORM);
  172.                         else if (r == 6)
  173.                                 sound (self, CHAN_AUTO, "ogre/ogstep6.wav", 0.7, ATTN_NORM);
  174.                         else if (r == 0)
  175.                                 sound (self, CHAN_AUTO, "ogre/ogstep7.wav", 0.7, ATTN_NORM);
  176.                         else
  177.                                 sound (self, CHAN_AUTO, "ogre/ogstep8.wav", 0.7, ATTN_NORM);
  178.                 }
  179.         }
  180. };
  181.  
  182. /*
  183. ================
  184. OgreSpike
  185. ================
  186. */
  187.  
  188. void() ogrespike_touch =
  189. {
  190.         if (other == self.real_owner)
  191.         {
  192.                 self.force_velocity = self.velocity;    // record velocity at time of impact
  193.  
  194.                 self.owner = other;     // to allow it to pass through
  195.        
  196.                 self.think = reset_velocity;    // since the server is going to mangle our velocity after .touch is finished we need to reset it manually
  197.                 self.nextthink = time;  // next frame
  198.                
  199.                 return;
  200.         }
  201.                
  202.         if (other.classname == "phys_obj")      // Supa, Prevent bot collision ent test entities from colliding with projectiles
  203.                 return;
  204.  
  205.         if (other.solid == SOLID_TRIGGER)
  206.                 return; // trigger field, do nothing
  207.  
  208.         if (other.classname == "func_breakaway" )
  209.         if (other.spawnflags & PIERCEABLE               )       // can projectiles pass through this breakable?
  210.         {
  211.                 T_Damage (other, self, self.real_owner, other.health, DTH_OGRE_NAIL, FALSE, 1); // smash the breakable
  212.        
  213.                 self.force_velocity = self.velocity;    // record velocity at time of impact
  214.  
  215.                 self.owner = other;     // to allow it to pass through
  216.  
  217.                 self.think = reset_velocity;    // since the server is going to mangle our velocity after .touch is finished we need to reset it manually
  218.                 self.nextthink = time;                  // next frame
  219.  
  220.                 return;
  221.         }
  222.                
  223.         if (pointcontents(self.origin) == CONTENT_SKY)
  224.         {
  225.                 remove(self);
  226.                 return;
  227.         }
  228.  
  229.         // hit something that bleeds
  230.         if (other.takedamage)
  231.         {
  232.                 spawn_touchblood (9, other.nobleed);
  233.  
  234.                 T_Damage (other, self, self.real_owner, 9, DTH_OGRE_NAIL, FALSE, 1);
  235.                
  236.                 remove(self);
  237.         }
  238.         else if (other == world)        // oh, duh
  239.         {       // hit BSP? remove after 1s
  240.                 setorigin(self, self.origin - 4 * normalize(self.velocity));
  241.  
  242.                 self.touch = SUB_Null;
  243.                 self.velocity = '0 0 0';
  244.                
  245.                 self.think = SUB_Remove;
  246.                 self.nextthink = time + 1;
  247.         }
  248.         else remove(self);
  249. };
  250.  
  251. void() OgreSpike =  //ijed Fires an ogre's spikes in a spray at the player
  252. {
  253.         local vector dir;
  254.         local vector sdir;
  255.         local vector org;
  256.         local vector enemyorg;
  257.         local entity old;
  258.         local float firedelay;
  259.         local float spikes;
  260.        
  261.         // gb, submerged?
  262.         if (self.h2olevel >= 3)
  263.         {
  264.                 if (random() < 0.4)
  265.                 {
  266.                         sound (self, CHAN_WEAPON, "weapons/fail.wav", 1, ATTN_NORM);
  267.                         return;
  268.                 }
  269.         }
  270.        
  271.         self.effects = (self.effects | EF_MUZZLEFLASH);
  272.         sound (self, CHAN_WEAPON, "ogre/flak.wav", 1, ATTN_NORM);
  273.    
  274.         firedelay = (random() + 2 - skill);  
  275.        
  276.         self.attack_finished = (time + firedelay);  //ijed Skill dependant delay between shots
  277.  
  278. //      dir = normalize (self.enemy.origin - self.origin);
  279.  
  280.         // Supa, take breakables into account
  281.         if (self.enemy.solid == SOLID_BSP)      enemyorg = (self.enemy.absmin + self.enemy.absmax) * 0.5;
  282.         else                                                            enemyorg = self.enemy.origin;
  283.  
  284.         do      // Supa, Launch a spread of 4 ogrespikes..
  285.         {
  286. //              launch_spike (self.origin + '0 0 16', dir + v_up*(crandom()*25) + v_right*(crandom()*25));
  287.  
  288.                 dir = enemyorg + RandomOffset(25);
  289.                 dir = normalize (dir - self.origin);
  290.                 launch_spike (self.origin + '0 0 16', dir);
  291.                
  292.                 newmis.touch = ogrespike_touch;
  293.                 setmodel (newmis, "progs/s_spike.mdl");
  294.                 setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
  295.        
  296.                 spikes = spikes + 1;
  297.         }
  298.         while (spikes < 4);
  299.        
  300.         //  Skill dependant speed
  301.         if (skill > 2)          newmis.velocity = dir * 1000;
  302.         else if (skill > 1)     newmis.velocity = dir * 900;
  303.         else                    newmis.velocity = dir * 800;
  304. };
  305.  
  306. /*
  307. ================
  308. Chainsaw
  309. ================
  310. */
  311. void(float side) chainsaw =
  312. {
  313. local vector    delta, enemyorg;
  314. local float     ldmg;
  315.  
  316.         if (!self.enemy)
  317.                 return;
  318.         if (!CanDamage (self.enemy, self))
  319.                 return;
  320.  
  321.         ai_charge(10);
  322.  
  323.         // Supa, take breakables into account
  324.         if (self.enemy.solid == SOLID_BSP)      enemyorg = (self.enemy.absmin + self.enemy.absmax) * 0.5;
  325.         else                                                            enemyorg = self.enemy.origin;
  326.        
  327.         delta = enemyorg - self.origin;
  328.  
  329. // DRAGONS /- - - -
  330. //    if (vlen(delta) > 100)
  331.     if (!InMeleeRange (100))    // Needed for fat dragons.
  332.         return;
  333. //- - - - - - - - -
  334.  
  335.         if (self.enemy.classname == "monster_zombie")   // Supa, Ogre saw instagibs Zombies
  336.                 ldmg = 100;
  337.         else
  338.                 ldmg = (random() + random() + random()) * 4;  //ijed reverted to 4 damage
  339.                 //Berserks have the same base damage, but are in a hitting state for longer
  340.                
  341.         T_Damage (self.enemy, self, self, ldmg, DTH_OGRE_SAW, FALSE, 1.5);
  342.  
  343.         if (side)
  344.         {
  345.                 makevectors (self.angles);
  346.                 if (side == 1)
  347.                         SpawnMeatSpray (self.origin + v_forward*16, crandom() * 100 * v_right);
  348.                 else
  349.                         SpawnMeatSpray (self.origin + v_forward*16, side * v_right);
  350.         }
  351. };
  352.  
  353. /*=============================================================================
  354. Idle Behaviours
  355. =============================================================================*/
  356.  
  357. void() ogre_talk = //I Is aN OgRe I Is
  358. {
  359.         local float r;
  360.         r = random();
  361.        
  362.         if (r < 0.2)
  363.                 sound (self, CHAN_VOICE, "ogre/ogtalk1.wav", 1, ATTN_NORM);
  364.         else if (r < 0.4)
  365.                 sound (self, CHAN_VOICE, "ogre/ogtalk2.wav", 1, ATTN_NORM);
  366.         else if (r < 0.6)
  367.                 sound (self, CHAN_VOICE, "ogre/ogtalk3.wav", 1, ATTN_NORM);
  368.         else if (r < 0.8)
  369.                 sound (self, CHAN_VOICE, "ogre/ogtalk4.wav", 1, ATTN_NORM);
  370.         else
  371.                 sound (self, CHAN_VOICE, "ogre/ogpain5.wav", 1, ATTN_NORM);
  372. };
  373.  
  374. void() ogre_idle_sound =
  375. {
  376.         local float r;
  377.        
  378.         if (self.spawnflags & 1)        // gb, it's no surprise if it goes "GRR";  FIXME: add this to other monsters
  379.                 return;
  380.  
  381.         r = random();
  382.        
  383.         if (r < 0.5)
  384.                 sound (self, CHAN_VOICE, "ogre/ogidle1.wav", 1, ATTN_NORM);
  385.         else
  386.                 sound (self, CHAN_VOICE, "ogre/ogidle2.wav", 1, ATTN_NORM);
  387. };
  388.  
  389. // Nail / Grenade stand
  390.  
  391. void() ogre_stand1      =[      $stand1,        ogre_stand2     ] {ai_stand();};
  392. void() ogre_stand2      =[      $stand2,        ogre_stand3     ] {ai_stand();};
  393. void() ogre_stand3      =[      $stand3,        ogre_stand4     ] {ai_stand();};
  394. void() ogre_stand4      =[      $stand4,        ogre_stand5     ] {ai_stand();};
  395. void() ogre_stand5      =[      $stand5,        ogre_stand6     ] {
  396. if (random() < 0.2)
  397.         ogre_idle_sound();
  398. ai_stand();
  399. };
  400. void() ogre_stand6      =[      $stand6,        ogre_stand7     ] {ai_stand();};
  401. void() ogre_stand7      =[      $stand7,        ogre_stand8     ] {ai_stand();};
  402. void() ogre_stand8      =[      $stand8,        ogre_stand9     ] {ai_stand();};
  403. void() ogre_stand9      =[      $stand9,        ogre_stand1     ] {ai_stand();};
  404.  
  405. // Berserk Stand
  406.  
  407. void() ogreb_stand1     =[      $ogbstand1,     ogreb_stand2    ] {ai_stand();};
  408. void() ogreb_stand2     =[      $ogbstand2,     ogreb_stand3    ] {ai_stand();};
  409. void() ogreb_stand3     =[      $ogbstand3,     ogreb_stand4    ] {ai_stand();};
  410. void() ogreb_stand4     =[      $ogbstand4,     ogreb_stand5    ] {ai_stand();};
  411. void() ogreb_stand5     =[      $ogbstand5,     ogreb_stand6    ] {
  412. if (random() < 0.2)
  413.         ogre_idle_sound();
  414. ai_stand();
  415. };
  416. void() ogreb_stand6     =[      $ogbstand6,     ogreb_stand7    ] {ai_stand();};
  417. void() ogreb_stand7     =[      $ogbstand7,     ogreb_stand8    ] {ai_stand();};
  418. void() ogreb_stand8     =[      $ogbstand8,     ogreb_stand9    ] {ai_stand();};
  419. void() ogreb_stand9     =[      $ogbstand9,     ogreb_stand1    ] {ai_stand();};
  420.  
  421. // Rocket stand
  422.  
  423. void() ogrer_stand1     =[      $standr1,       ogrer_stand2    ] {ai_stand();};
  424. void() ogrer_stand2     =[      $standr2,       ogrer_stand3    ] {ai_stand();};
  425. void() ogrer_stand3     =[      $standr3,       ogrer_stand4    ] {ai_stand();};
  426. void() ogrer_stand4     =[      $standr4,       ogrer_stand5    ] {ai_stand();};
  427. void() ogrer_stand5     =[      $standr5,       ogrer_stand6    ] {
  428. if (random() < 0.2)
  429.         ogre_idle_sound();
  430. ai_stand();
  431. };
  432. void() ogrer_stand6     =[      $standr6,       ogrer_stand7    ] {ai_stand();};
  433. void() ogrer_stand7     =[      $standr7,       ogrer_stand8    ] {ai_stand();};
  434. void() ogrer_stand8     =[      $standr8,       ogrer_stand9    ] {ai_stand();};
  435. void() ogrer_stand9     =[      $standr9,       ogrer_stand1    ] {ai_stand();};
  436.  
  437.  
  438. // ======================== WALK ===============================
  439.  
  440. // Grenade / Nail Walk
  441.  
  442. void() ogre_walk1               =[      $walk1,         ogre_walk2      ] {ogstep();ai_walk(3);};
  443. void() ogre_walk2               =[      $walk2,         ogre_walk3      ] {ai_walk(2);};
  444. void() ogre_walk3               =[      $walk3,         ogre_walk4      ] {
  445. ai_walk(2);
  446. if (random() < 0.2)
  447.         ogre_idle_sound();
  448. };
  449. void() ogre_walk4               =[      $walk4,         ogre_walk5      ] {ai_walk(2);};
  450. void() ogre_walk5               =[      $walk5,         ogre_walk6      ] {ai_walk(2);};
  451. void() ogre_walk6               =[      $walk6,         ogre_walk7      ] {
  452. ai_walk(5);
  453. if (random() < 0.1)
  454.         sound (self, CHAN_VOICE, "ogre/ogdrag.wav", 1, ATTN_IDLE);
  455. };
  456. void() ogre_walk7               =[      $walk7,         ogre_walk8      ] {ai_walk(3);};
  457. void() ogre_walk8               =[      $walk8,         ogre_walk9      ] {ai_walk(2);};
  458. void() ogre_walk9               =[      $walk9,         ogre_walk10     ] {ai_walk(3);};
  459. void() ogre_walk10              =[      $walk10,        ogre_walk11     ] {ogstep();ai_walk(1);};
  460. void() ogre_walk11              =[      $walk11,        ogre_walk12     ] {ai_walk(2);};
  461. void() ogre_walk12      =[      $walk12,        ogre_walk13     ] {ai_walk(3);};
  462. void() ogre_walk13      =[      $walk13,        ogre_walk14     ] {
  463. if (random() < 0.1)
  464.         ogre_talk();
  465. ai_stand();
  466. };
  467. void() ogre_walk14      =[      $walk14,        ogre_walk15     ] {ai_walk(3);};
  468. void() ogre_walk15      =[      $walk15,        ogre_walk16     ] {ai_walk(3);};
  469. void() ogre_walk16      =[      $walk16,        ogre_walk1      ] {ai_walk(4);};
  470.  
  471. // Berserk Walk
  472.  
  473. void() ogreb_walk1      =[      $ogbwalk1,      ogreb_walk2             ] {ogstep();ai_walk(3);};
  474. void() ogreb_walk2      =[      $ogbwalk2,      ogreb_walk3             ] {ai_walk(2);};
  475. void() ogreb_walk3      =[      $ogbwalk3,      ogreb_walk4             ] {
  476. ai_walk(2);
  477. if (random() < 0.2)
  478.         ogre_idle_sound();
  479. };
  480. void() ogreb_walk4      =[      $ogbwalk4,      ogreb_walk5             ] {ai_walk(2);};
  481. void() ogreb_walk5      =[      $ogbwalk5,      ogreb_walk6             ] {ai_walk(2);};
  482. void() ogreb_walk6      =[      $ogbwalk6,      ogreb_walk7             ] {
  483. ai_walk(5);
  484. if (random() < 0.1)
  485.         sound (self, CHAN_VOICE, "ogre/ogdrag.wav", 1, ATTN_IDLE);
  486. };
  487. void() ogreb_walk7      =[      $ogbwalk7,      ogreb_walk8             ] {ai_walk(3);};
  488. void() ogreb_walk8      =[      $ogbwalk8,      ogreb_walk9             ] {ai_walk(2);};
  489. void() ogreb_walk9      =[      $ogbwalk9,      ogreb_walk10    ] {ogstep();ai_walk(3);};
  490. void() ogreb_walk10     =[      $ogbwalk10,     ogreb_walk11    ] {ai_walk(1);};
  491. void() ogreb_walk11     =[      $ogbwalk11,     ogreb_walk12    ] {ai_walk(2);};
  492. void() ogreb_walk12     =[      $ogbwalk12,     ogreb_walk13    ] {ai_walk(3);};
  493. void() ogreb_walk13     =[      $ogbwalk13,     ogreb_walk14    ] {
  494. if (random() < 0.1)
  495.         ogre_talk();
  496. ai_stand();
  497. };
  498. void() ogreb_walk14     =[      $ogbwalk14,     ogreb_walk15    ] {ai_walk(3);};
  499. void() ogreb_walk15     =[      $ogbwalk15,     ogreb_walk16    ] {ai_walk(3);};
  500. void() ogreb_walk16     =[      $ogbwalk16,     ogreb_walk1             ] {ai_walk(4);};
  501.  
  502. //Rocket Walk
  503.  
  504. void() ogrer_walk1              =[      $walkr1,        ogrer_walk2             ] {ogstep();ai_walk(3);};
  505. void() ogrer_walk2              =[      $walkr2,        ogrer_walk3             ] {ai_walk(2);};
  506. void() ogrer_walk3              =[      $walkr3,        ogrer_walk4             ] {
  507. ai_walk(2);
  508. if (random() < 0.2)
  509.         ogre_idle_sound();
  510. };
  511. void() ogrer_walk4              =[      $walkr4,        ogrer_walk5             ] {ai_walk(2);};
  512. void() ogrer_walk5              =[      $walkr5,        ogrer_walk6             ] {ai_walk(2);};
  513. void() ogrer_walk6              =[      $walkr6,        ogrer_walk7             ] {ai_walk(5);};
  514. void() ogrer_walk7              =[      $walkr7,        ogrer_walk8             ] {ai_walk(3);};
  515. void() ogrer_walk8              =[      $walkr8,        ogrer_walk9             ] {ai_walk(2);};
  516. void() ogrer_walk9              =[      $walkr9,        ogrer_walk10    ] {ogstep();ai_walk(3);};
  517. void() ogrer_walk10             =[      $walkr10,       ogrer_walk11    ] {ai_walk(1);};
  518. void() ogrer_walk11             =[      $walkr11,       ogrer_walk12    ] {ai_walk(2);};
  519. void() ogrer_walk12             =[      $walkr12,       ogrer_walk13    ] {ai_walk(3);};
  520. void() ogrer_walk13     =[      $walkr13,       ogrer_walk14    ] {
  521. if (random() < 0.1)
  522.         ogre_talk();
  523. ai_stand();
  524. };
  525. void() ogrer_walk14     =[      $walkr14,       ogrer_walk15    ] {ai_walk(3);};
  526. void() ogrer_walk15     =[      $walkr15,       ogrer_walk16    ] {ai_walk(3);};
  527. void() ogrer_walk16     =[      $walkr16,       ogrer_walk1             ] {ai_walk(4);};
  528.  
  529. //Grenade / Nail Run
  530.  
  531. void() ogre_run1        =[      $run1,          ogre_run2       ] {ai_run(9);
  532. if (random() < 0.1)
  533.         ogre_talk();
  534. };
  535. void() ogre_run2        =[      $run2,          ogre_run3       ] {ogstep();ai_run(12);};
  536. void() ogre_run3        =[      $run3,          ogre_run4       ] {ai_run(8);};
  537. void() ogre_run4        =[      $run4,          ogre_run5       ] {ai_run(22);};
  538. void() ogre_run5        =[      $run5,          ogre_run6       ] {ai_run(16);};
  539. void() ogre_run6        =[      $run6,          ogre_run7       ] {ogstep();ai_run(4);};
  540. void() ogre_run7        =[      $run7,          ogre_run8       ] {ai_run(13);};
  541. void() ogre_run8        =[      $run8,          ogre_run1       ] {ai_run(24);};
  542.  
  543. //Berserk Run
  544.  
  545. void() ogreb_run1       =[      $ogbrun1,       ogreb_run2      ] {ai_run(9);
  546. if (random() < 0.1)
  547.         ogre_talk();
  548. };
  549. void() ogreb_run2       =[      $ogbrun2,       ogreb_run3      ] {ogstep();ai_run(12);};
  550. void() ogreb_run3       =[      $ogbrun3,       ogreb_run4      ] {ai_run(12);};
  551. void() ogreb_run4       =[      $ogbrun4,       ogreb_run5      ] {ai_run(22);};
  552. void() ogreb_run5       =[      $ogbrun5,       ogreb_run6      ] {ai_run(32);};
  553. void() ogreb_run6       =[      $ogbrun6,       ogreb_run7      ] {ogstep();ai_run(12);};
  554. void() ogreb_run7       =[      $ogbrun7,       ogreb_run8      ] {ai_run(13);};
  555. void() ogreb_run8       =[      $ogbrun8,       ogreb_run1      ] {ai_run(24);};
  556.  
  557. //Rocket Run
  558.  
  559. void() ogrer_run1       =[      $run1,          ogre_run2       ] {ai_run(9);
  560. if (random() < 0.1)
  561.         ogre_talk();
  562. };
  563. void() ogrer_run2       =[      $runr2,         ogrer_run3      ] {ogstep();ai_run(12);};
  564. void() ogrer_run3       =[      $runr3,         ogrer_run4      ] {ai_run(8);};
  565. void() ogrer_run4       =[      $runr4,         ogrer_run5      ] {ai_run(22);};
  566. void() ogrer_run5       =[      $runr5,         ogrer_run6      ] {ai_run(16);};
  567. void() ogrer_run6       =[      $runr6,         ogrer_run7      ] {ogstep();ai_run(4);};
  568. void() ogrer_run7       =[      $runr7,         ogrer_run8      ] {ai_run(13);};
  569. void() ogrer_run8       =[      $runr8,         ogrer_run1      ] {ai_run(24);};
  570.  
  571. // Grenade / Nail Melee Swing
  572.  
  573. void() ogre_swing1      =[      $swing1,        ogre_swing2     ] {ai_charge(11);
  574. sound (self, CHAN_WEAPON, "ogre/ogsawatk.wav", 1, ATTN_NORM);
  575. sound (self, CHAN_BODY, "ogre/ogsawloop.wav", 0.5, ATTN_NORM);  // gb, restart this from time to time
  576. ogstep();
  577. };
  578. void() ogre_swing2      =[      $swing2,        ogre_swing3     ] {ai_charge(1);};
  579. void() ogre_swing3      =[      $swing3,        ogre_swing4     ] {ai_charge(4);};
  580. void() ogre_swing4      =[      $swing4,        ogre_swing5     ] {ai_charge(13);};
  581. void() ogre_swing5      =[      $swing5,        ogre_swing6     ] {ogstep();ai_charge(9); chainsaw(0);self.angles_y = self.angles_y + random()*25;};
  582. void() ogre_swing6      =[      $swing6,        ogre_swing7     ] {chainsaw(200);self.angles_y = self.angles_y + random()* 25;};
  583. void() ogre_swing7      =[      $swing7,        ogre_swing8     ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};
  584. void() ogre_swing8      =[      $swing8,        ogre_swing9     ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};
  585. void() ogre_swing9      =[      $swing9,        ogre_swing10    ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};
  586. void() ogre_swing10     =[      $swing10,       ogre_swing11    ] {chainsaw(-200);self.angles_y = self.angles_y + random()* 25;};
  587. void() ogre_swing11     =[      $swing11,       ogre_swing12    ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};
  588. void() ogre_swing12     =[      $swing12,       ogre_swing13    ] {ai_charge(3);};
  589. void() ogre_swing13     =[      $swing13,       ogre_swing14    ] {ai_charge(8);};
  590. void() ogre_swing14     =[      $swing14,       ogre_run1       ] {ai_charge(9);};
  591.  
  592. // Berserk Melee Swing
  593.  
  594. void() ogreb_swing1     =[      $ogbswing1,     ogreb_swing2    ] {ai_charge(11);
  595. sound (self, CHAN_WEAPON, "ogre/ogbsawatk.wav", 1, ATTN_NORM);
  596. sound (self, CHAN_BODY, "ogre/ogsawloop.wav", 0.5, ATTN_NORM);  // gb, restart this from time to time
  597. ogstep();
  598. };
  599. void() ogreb_swing2     =[      $ogbswing2,     ogreb_swing3    ] {ai_charge(1); chainsaw(0);self.angles_y = self.angles_y + random()*25;};
  600. void() ogreb_swing3     =[      $ogbswing3,     ogreb_swing4    ] {ai_charge(4); chainsaw(0);self.angles_y = self.angles_y + random()*25;};
  601. void() ogreb_swing4     =[      $ogbswing4,     ogreb_swing5    ] {ai_charge(13); chainsaw(0);self.angles_y = self.angles_y + random()*25;};
  602. void() ogreb_swing5     =[      $ogbswing5,     ogreb_swing6    ] {ogstep();ai_charge(9); chainsaw(0);self.angles_y = self.angles_y + random()*25;};
  603. void() ogreb_swing6     =[      $ogbswing6,     ogreb_swing7    ] {chainsaw(200);self.angles_y = self.angles_y + random()* 25;};
  604. void() ogreb_swing7     =[      $ogbswing7,     ogreb_swing8    ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};
  605. void() ogreb_swing8     =[      $ogbswing8,     ogreb_swing9    ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};
  606. void() ogreb_swing9     =[      $ogbswing9,     ogreb_swing10 ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};
  607. void() ogreb_swing10    =[      $ogbswing10,    ogreb_swing11 ] {chainsaw(-200);self.angles_y = self.angles_y + random()* 25;};
  608. void() ogreb_swing11    =[      $ogbswing11,    ogreb_swing12 ] {chainsaw(0);self.angles_y = self.angles_y + random()* 25;};
  609. void() ogreb_swing12    =[      $ogbswing12,    ogreb_swing13 ] {ai_charge(3);};
  610. void() ogreb_swing13    =[      $ogbswing13,    ogreb_swing14 ] {ai_charge(8);};
  611. void() ogreb_swing14    =[      $ogbswing14,    ogreb_run1      ] {ai_charge(9);};
  612.  
  613. // Grenade / Nail Melee Smash
  614. void() ogre_smash1      =[      $smash1,        ogre_smash2     ] {ai_charge(6);
  615. sound (self, CHAN_WEAPON, "ogre/ogsawatk.wav", 1, ATTN_NORM);
  616. ogstep();
  617. };
  618. void() ogre_smash2      =[      $smash2,        ogre_smash3     ] {ai_charge(0);};
  619. void() ogre_smash3      =[      $smash3,        ogre_smash4     ] {ai_charge(0);};
  620. void() ogre_smash4      =[      $smash4,        ogre_smash5     ] {ai_charge(1);};
  621. void() ogre_smash5      =[      $smash5,        ogre_smash6     ] {ai_charge(4);};
  622. void() ogre_smash6      =[      $smash6,        ogre_smash7     ] {ai_charge(4); chainsaw(0);};
  623. void() ogre_smash7      =[      $smash7,        ogre_smash8     ] {ai_charge(4); chainsaw(0);};
  624. void() ogre_smash8      =[      $smash8,        ogre_smash9     ] {ai_charge(10); chainsaw(0);};
  625. void() ogre_smash9      =[      $smash9,        ogre_smash10 ] {ogstep();ai_charge(13); chainsaw(0);};
  626. void() ogre_smash10     =[      $smash10,       ogre_smash11 ] {chainsaw(1);};
  627. void() ogre_smash11     =[      $smash11,       ogre_smash12 ] {ai_charge(2); chainsaw(0);
  628. self.nextthink = self.nextthink + random()*0.2;};       // slight variation
  629. void() ogre_smash12     =[      $smash12,       ogre_smash13 ] {ai_charge(0);};
  630. void() ogre_smash13     =[      $smash13,       ogre_smash14 ] {ai_charge(4);};
  631. void() ogre_smash14     =[      $smash14,       ogre_run1       ] {ai_charge(12);};
  632.  
  633. // Berserk Melee Smash
  634. void() ogreb_smash1     =[      $ogbsmash1,     ogreb_smash2    ] {ai_charge(6);
  635. sound (self, CHAN_WEAPON, "ogre/ogbsawatk.wav", 1, ATTN_NORM);
  636. ogstep();
  637. };
  638. void() ogreb_smash2     =[      $ogbsmash2,     ogreb_smash3    ] {ai_charge(0); chainsaw(0);};
  639. void() ogreb_smash3     =[      $ogbsmash3,     ogreb_smash4    ] {ai_charge(0); chainsaw(0);};
  640. void() ogreb_smash4     =[      $ogbsmash4,     ogreb_smash5    ] {ai_charge(1); chainsaw(0);};
  641. void() ogreb_smash5     =[      $ogbsmash5,     ogreb_smash6    ] {ai_charge(4); chainsaw(0);};
  642. void() ogreb_smash6     =[      $ogbsmash6,     ogreb_smash7    ] {ai_charge(4); chainsaw(0);};
  643. void() ogreb_smash7     =[      $ogbsmash7,     ogreb_smash8    ] {ai_charge(4); chainsaw(0);};
  644. void() ogreb_smash8     =[      $ogbsmash8,     ogreb_smash9    ] {ai_charge(10); chainsaw(0);};
  645. void() ogreb_smash9     =[      $ogbsmash9,     ogreb_smash10 ] {ogstep();ai_charge(13); chainsaw(0);};
  646. void() ogreb_smash10    =[      $ogbsmash10,    ogreb_smash11 ] {chainsaw(1);};
  647. void() ogreb_smash11    =[      $ogbsmash11,    ogreb_smash12 ] {ai_charge(2); chainsaw(0);
  648. self.nextthink = self.nextthink + random()*0.2;};       // slight variation
  649. void() ogreb_smash12    =[      $ogbsmash12,    ogreb_smash13 ] {ai_charge(0);};
  650. void() ogreb_smash13    =[      $ogbsmash13,    ogreb_smash14 ] {ai_charge(4);};
  651. void() ogreb_smash14    =[      $ogbsmash14,    ogreb_run1      ] {ai_charge(12);};
  652.  
  653. // Bayonet Melee (Rocket Ogre)
  654. void()  ogre_bayonet1   =[      $bayonet1,      ogre_bayonet2   ] {ogstep();ai_charge(0);};
  655. void()  ogre_bayonet2   =[      $bayonet2,      ogre_bayonet3   ] {ai_charge(0);};
  656. void()  ogre_bayonet3   =[      $bayonet3,      ogre_bayonet4   ] {ai_charge(0);};
  657. void()  ogre_bayonet4   =[      $bayonet4,      ogre_bayonet5   ] {ai_charge(0);};
  658. void()  ogre_bayonet5   =[      $bayonet5,      ogre_bayonet6   ] {ogstep();ai_charge(0); chainsaw(0);};
  659. void()  ogre_bayonet6   =[      $bayonet6,      ogre_bayonet7   ] {ai_charge(0);};
  660. void()  ogre_bayonet7   =[      $bayonet7,      ogrer_run1              ] {ai_charge(0);};
  661.  
  662. // Fire Grenade
  663. void() ogre_grenade1    =[      $shoot1,        ogre_grenade2   ] {ogstep();ai_face();
  664. if (random() < 0.1)
  665.         ogre_talk();
  666. };
  667. void() ogre_grenade2    =[      $shoot2,        ogre_grenade3   ] {ai_face();};
  668. void() ogre_grenade3    =[      $shoot2,        ogre_grenade4   ] {ai_face();};
  669. void() ogre_grenade4    =[      $shoot3,        ogre_grenade5   ] {ai_face();M_FireGrenade('0 0 0');};
  670. void() ogre_grenade5    =[      $shoot4,        ogre_grenade6   ] {ai_face();};
  671. void() ogre_grenade6    =[      $shoot5,        ogre_grenade7   ] {ai_face();};
  672. void() ogre_grenade7    =[      $shoot6,        ogre_run1       ] {ai_face();};
  673.  
  674. // Fire Rocket
  675. void() ogre_rocket1     =[      $shootr1,       ogre_rocket2    ] {ai_face();
  676. if (random() < 0.1)
  677.         ogre_talk();
  678. };
  679. void() ogre_rocket2     =[      $shootr2,       ogre_rocket3    ] {ogstep();ai_face();};
  680. void() ogre_rocket3     =[      $shootr3,       ogre_rocket4    ] {ai_face();};
  681. void() ogre_rocket4     =[      $shootr4,       ogre_rocket5    ] {ai_face();M_FireRocket();};
  682. void() ogre_rocket5     =[      $shootr5,       ogre_rocket6    ] {ai_face();};
  683. void() ogre_rocket6     =[      $shootr6,       ogrer_run1              ] {ai_face();};
  684.  
  685.  
  686. // Fire Nails
  687. void() ogre_nail1       =[      $runfire1,      ogre_nail2      ] {ai_charge(9);
  688. if (random() < 0.1)
  689.         ogre_talk();
  690. };
  691. void() ogre_nail2       =[      $runfire2,      ogre_nail3      ] {ogstep();ai_charge(12);};
  692. void() ogre_nail3       =[      $runfire2,      ogre_nail4      ] {ai_charge(8);};
  693. void() ogre_nail4       =[      $runfire3,      ogre_nail5      ] {ai_charge(14);};
  694. void() ogre_nail5       =[      $runfire4,      ogre_nail6      ] {ai_charge(22);OgreSpike();};
  695. void() ogre_nail6       =[      $runfire5,      ogre_nail7      ] {ai_charge(16);};
  696. void() ogre_nail7       =[      $runfire6,      ogre_nail8      ] {ogstep();ai_charge(4);};
  697. void() ogre_nail8       =[      $runfire7,      ogre_nail9      ] {ai_charge(13);};
  698. void() ogre_nail9       =[      $runfire8,      ogre_run1       ] {ai_charge(24);};
  699.  
  700. // Nail / Grenade pain
  701. void()  ogre_pain1      =[      $pain1,         ogre_pain2      ] {};
  702. void()  ogre_pain2      =[      $pain2,         ogre_pain3      ] {};
  703. void()  ogre_pain3      =[      $pain3,         ogre_pain4      ] {};
  704. void()  ogre_pain4      =[      $pain4,         ogre_pain5      ] {};
  705. void()  ogre_pain5      =[      $pain5,         ogre_run1       ] {};
  706.  
  707. // b
  708. void()  ogre_painb1     =[      $painb1,        ogre_painb2     ] {};
  709. void()  ogre_painb2     =[      $painb2,        ogre_painb3     ] {};
  710. void()  ogre_painb3     =[      $painb3,        ogre_run1       ] {};
  711.  
  712. // c
  713. void()  ogre_painc1     =[      $painc1,        ogre_painc2     ] {};
  714. void()  ogre_painc2     =[      $painc2,        ogre_painc3     ] {};
  715. void()  ogre_painc3     =[      $painc3,        ogre_painc4     ] {};
  716. void()  ogre_painc4     =[      $painc4,        ogre_painc5     ] {};
  717. void()  ogre_painc5     =[      $painc5,        ogre_painc6     ] {};
  718. void()  ogre_painc6     =[      $painc6,        ogre_run1       ] {};
  719.  
  720. // d
  721.  
  722. void()  ogre_paind1             =[      $paind1,        ogre_paind2             ] {};
  723. void()  ogre_paind2             =[      $paind2,        ogre_paind3             ] {ai_pain(10);};
  724. void()  ogre_paind3             =[      $paind3,        ogre_paind4             ] {ai_pain(9);};
  725. void()  ogre_paind4             =[      $paind4,        ogre_paind5             ] {ai_pain(4);};
  726. void()  ogre_paind5             =[      $paind5,        ogre_paind6             ] {};
  727. void()  ogre_paind6             =[      $paind6,        ogre_paind7             ] {};
  728. void()  ogre_paind7             =[      $paind7,        ogre_paind8             ] {};
  729. void()  ogre_paind8             =[      $paind8,        ogre_paind9             ] {};
  730. void()  ogre_paind9             =[      $paind9,        ogre_paind10    ] {};
  731. void()  ogre_paind10    =[      $paind10,       ogre_paind11    ] {};
  732. void()  ogre_paind11    =[      $paind11,       ogre_paind12    ] {};
  733. void()  ogre_paind12    =[      $paind12,       ogre_paind13    ] {};
  734. void()  ogre_paind13    =[      $paind13,       ogre_paind14    ] {};
  735. void()  ogre_paind14    =[      $paind14,       ogre_paind15    ] {};
  736. void()  ogre_paind15    =[      $paind15,       ogre_paind16    ] {};
  737. void()  ogre_paind16    =[      $paind16,       ogre_run1               ] {};
  738.  
  739. // e
  740.  
  741. void()  ogre_paine1     =[      $paine1,        ogre_paine2     ] {};
  742. void()  ogre_paine2     =[      $paine2,        ogre_paine3     ] {ai_pain(10);};
  743. void()  ogre_paine3     =[      $paine3,        ogre_paine4     ] {ai_pain(9);};
  744. void()  ogre_paine4     =[      $paine4,        ogre_paine5     ] {ai_pain(4);};
  745. void()  ogre_paine5     =[      $paine5,        ogre_paine6     ] {};
  746. void()  ogre_paine6     =[      $paine6,        ogre_paine7     ] {};
  747. void()  ogre_paine7     =[      $paine7,        ogre_paine8     ] {};
  748. void()  ogre_paine8     =[      $paine8,        ogre_paine9     ] {};
  749. void()  ogre_paine9     =[      $paine9,        ogre_paine10    ] {};
  750. void()  ogre_paine10    =[      $paine10,       ogre_paine11    ] {};
  751. void()  ogre_paine11    =[      $paine11,       ogre_paine12    ] {};
  752. void()  ogre_paine12    =[      $paine12,       ogre_paine13    ] {};
  753. void()  ogre_paine13    =[      $paine13,       ogre_paine14    ] {};
  754. void()  ogre_paine14    =[      $paine14,       ogre_paine15    ] {};
  755. void()  ogre_paine15    =[      $paine15,       ogre_run1       ] {};
  756.  
  757. // Berserk Pain
  758.  
  759. void()  ogreb_pain1     =[      $ogbpain1,      ogreb_pain2     ] {};
  760. void()  ogreb_pain2     =[      $ogbpain2,      ogreb_pain3     ] {};
  761. void()  ogreb_pain3     =[      $ogbpain3,      ogreb_pain4     ] {};
  762. void()  ogreb_pain4     =[      $ogbpain4,      ogreb_pain5     ] {};
  763. void()  ogreb_pain5     =[      $ogbpain5,      ogreb_run1      ] {};
  764.  
  765. // Rocket Pain
  766. void()  ogrer_pain1     =[      $painr1,                ogrer_pain2     ] {};
  767. void()  ogrer_pain2     =[      $painr2,                ogrer_pain3     ] {};
  768. void()  ogrer_pain3     =[      $painr3,                ogrer_pain4     ] {};
  769. void()  ogrer_pain4     =[      $painr4,                ogrer_pain5     ] {};
  770. void()  ogrer_pain5     =[      $painr5,                ogrer_run1      ] {};
  771.  
  772. // Rocket Pain B
  773. void()  ogrer_painb1    =[      $painbr1,       ogrer_painb2    ] {};
  774. void()  ogrer_painb2    =[      $painbr2,       ogrer_painb3    ] {};
  775. void()  ogrer_painb3    =[      $painbr3,       ogrer_run1      ] {};
  776.  
  777. // Rocket Pain C
  778. void()  ogrer_painc1    =[      $paincr1,       ogrer_painc2    ] {};
  779. void()  ogrer_painc2    =[      $paincr2,       ogrer_painc3    ] {};
  780. void()  ogrer_painc3    =[      $paincr3,       ogrer_painc4    ] {};
  781. void()  ogrer_painc4    =[      $paincr4,       ogrer_painc5    ] {};
  782. void()  ogrer_painc5    =[      $paincr5,       ogrer_painc6    ] {};
  783. void()  ogrer_painc6    =[      $paincr6,       ogrer_run1      ] {};
  784.  
  785. // Rocket Pain D
  786. void()  ogrer_paind1    =[      $paindr1,       ogrer_paind2    ] {};
  787. void()  ogrer_paind2    =[      $paindr2,       ogrer_paind3    ] {ai_pain(10);};
  788. void()  ogrer_paind3    =[      $paindr3,       ogrer_paind4    ] {ai_pain(9);};
  789. void()  ogrer_paind4    =[      $paindr4,       ogrer_paind5    ] {ai_pain(4);};
  790. void()  ogrer_paind5    =[      $paindr5,       ogrer_paind6    ] {};
  791. void()  ogrer_paind6    =[      $paindr6,       ogrer_paind7    ] {};
  792. void()  ogrer_paind7    =[      $paindr7,       ogrer_paind8    ] {};
  793. void()  ogrer_paind8    =[      $paindr8,       ogrer_paind9    ] {};
  794. void()  ogrer_paind9    =[      $paindr9,       ogrer_paind10   ] {};
  795. void()  ogrer_paind10   =[      $paindr10,      ogrer_paind11   ] {};
  796. void()  ogrer_paind11   =[      $paindr11,      ogrer_paind12   ] {};
  797. void()  ogrer_paind12   =[      $paindr12,      ogrer_paind13   ] {};
  798. void()  ogrer_paind13   =[      $paindr13,      ogrer_paind14   ] {};
  799. void()  ogrer_paind14   =[      $paindr14,      ogrer_paind15   ] {};
  800. void()  ogrer_paind15   =[      $paindr15,      ogrer_paind16   ] {};
  801. void()  ogrer_paind16   =[      $paindr16,      ogrer_run1      ] {};
  802.  
  803. // Rocket Pain E
  804. void()  ogrer_paine1            =[      $painer1,               ogrer_paine2    ] {};
  805. void()  ogrer_paine2            =[      $painer2,               ogrer_paine3    ] {ai_pain(10);};
  806. void()  ogrer_paine3            =[      $painer3,               ogrer_paine4    ] {ai_pain(9);};
  807. void()  ogrer_paine4            =[      $painer4,               ogrer_paine5    ] {ai_pain(4);};
  808. void()  ogrer_paine5            =[      $painer5,               ogrer_paine6    ] {};
  809. void()  ogrer_paine6            =[      $painer6,               ogrer_paine7    ] {};
  810. void()  ogrer_paine7            =[      $painer7,               ogrer_paine8    ] {};
  811. void()  ogrer_paine8            =[      $painer8,               ogrer_paine9    ] {};
  812. void()  ogrer_paine9            =[      $painer9,               ogrer_paine10   ] {};
  813. void()  ogrer_paine10           =[      $painer10,              ogrer_paine11   ] {};
  814. void()  ogrer_paine11           =[      $painer11,              ogrer_paine12   ] {};
  815. void()  ogrer_paine12           =[      $painer12,              ogrer_paine13   ] {};
  816. void()  ogrer_paine13           =[      $painer13,              ogrer_paine14   ] {};
  817. void()  ogrer_paine14           =[      $painer14,              ogrer_paine15   ] {};
  818. void()  ogrer_paine15           =[      $painer15,              ogrer_run1              ] {};
  819.  
  820. // Pain, All Ogres
  821.  
  822. void() ogre_pain_sound =
  823. {
  824.         local float r;
  825.         r = random();
  826.        
  827.         if (r < 0.25)
  828.         {
  829.                 sound (self, CHAN_VOICE, "ogre/ogpain1.wav", 1, ATTN_NORM);
  830.         }
  831.         else if (r < 0.5)
  832.         {
  833.                 sound (self, CHAN_VOICE, "ogre/ogpain2.wav", 1, ATTN_NORM);
  834.         }
  835.         else if (r < 0.75)
  836.         {
  837.                 sound (self, CHAN_VOICE, "ogre/ogpain3.wav", 1, ATTN_NORM);
  838.         }
  839.         else if (r < 0.88)
  840.         {
  841.                 sound (self, CHAN_VOICE, "ogre/ogpain4.wav", 1, ATTN_NORM);
  842.         }
  843.         else
  844.         {
  845.                 sound (self, CHAN_VOICE, "ogre/ogpain5.wav", 1, ATTN_NORM);
  846.         }
  847. };
  848.  
  849. void(entity attacker, float damage)     ogre_pain =
  850. {
  851.         local float     r;
  852.         r = random();
  853.        
  854.         // Don't go into a pain loop too frequently
  855.         if (self.pain_finished > time)
  856.                 return;
  857.  
  858.         // drowning?
  859.         if (self.h2olevel >= 3)
  860.         {
  861.                 DeathBubbles (1);
  862.                 sound (self, CHAN_VOICE, "player/drown1.wav", 1, ATTN_NORM);    // FIXME
  863.                 // no pain anim
  864.                 return;
  865.         }
  866.        
  867.         //play a random pain sound
  868.         ogre_pain_sound();
  869.        
  870.         //  What Type of Ogre is it?
  871.         if (self.spawnflags & BERSERK_OGRE) // notice they're resistant and only have a single short pain loop
  872.         {
  873.                 // sound (self, CHAN_VOICE, "ogre/ogpain1.wav", 1, ATTN_NORM);
  874.                 ogreb_pain1 ();
  875.                 self.pain_finished = time + 1;
  876.                 return;
  877.         }
  878.         else if (self.spawnflags & ROCKET_OGRE)
  879.         {
  880.                 if (r < 0.25)
  881.                 {
  882.                         //sound (self, CHAN_VOICE, "ogre/ogpain1.wav", 1, ATTN_NORM);
  883.                         ogrer_pain1 ();
  884.                         self.pain_finished = time + 1;
  885.                 }
  886.                 else if (r < 0.5)
  887.                 {
  888.                         //sound (self, CHAN_VOICE, "ogre/ogpain2.wav", 1, ATTN_NORM);
  889.                         ogrer_painb1 ();
  890.                         self.pain_finished = time + 1;
  891.                 }
  892.                 else if (r < 0.75)
  893.                 {
  894.                         //sound (self, CHAN_VOICE, "ogre/ogpain3.wav", 1, ATTN_NORM);
  895.                         ogrer_painc1 ();
  896.                         self.pain_finished = time + 1;
  897.                 }
  898.                 else if (r < 0.88)
  899.                 {
  900.                         //sound (self, CHAN_VOICE, "ogre/ogpain4.wav", 1, ATTN_NORM);
  901.                         ogrer_paind1 ();
  902.                         self.pain_finished = time + 2;
  903.                 }
  904.                 else
  905.                 {
  906.                         //sound (self, CHAN_VOICE, "ogre/ogpain5.wav", 1, ATTN_NORM);
  907.                         ogrer_paine1 ();
  908.                         self.pain_finished = time + 2;
  909.                 }      
  910.         }
  911.         else // Grenade or Nail Ogre
  912.         {
  913.                 if (r < 0.25)
  914.                 {
  915.                         //sound (self, CHAN_VOICE, "ogre/ogpain1.wav", 1, ATTN_NORM);
  916.                         ogre_pain1 ();
  917.                         self.pain_finished = time + 1;
  918.                 }
  919.                 else if (r < 0.5)
  920.                 {
  921.                         //sound (self, CHAN_VOICE, "ogre/ogpain2.wav", 1, ATTN_NORM);
  922.                         ogre_painb1 ();
  923.                         self.pain_finished = time + 1;
  924.                 }
  925.                 else if (r < 0.75)
  926.                 {
  927.                         //sound (self, CHAN_VOICE, "ogre/ogpain3.wav", 1, ATTN_NORM);
  928.                         ogre_painc1 ();
  929.                         self.pain_finished = time + 1;
  930.                 }
  931.                 else if (r < 0.88)
  932.                 {
  933.                         //sound (self, CHAN_VOICE, "ogre/ogpain4.wav", 1, ATTN_NORM);
  934.                         ogre_paind1 ();
  935.                         self.pain_finished = time + 2;
  936.                 }
  937.                 else
  938.                 {
  939.                         //sound (self, CHAN_VOICE, "ogre/ogpain5.wav", 1, ATTN_NORM);
  940.                         ogre_paine1 ();
  941.                         self.pain_finished = time + 2;
  942.                 }
  943.         }
  944. };
  945.  
  946. // Normal Death
  947.  
  948. void()  ogre_die1       =[      $death1,        ogre_die2       ] {};
  949. void()  ogre_die2       =[      $death2,        ogre_die3       ] {};
  950. void()  ogre_die3       =[      $death3,        ogre_die4       ]
  951. {self.solid = SOLID_NOT;DeathDrop();};
  952. void()  ogre_die4       =[      $death4,        ogre_die5       ] {};
  953. void()  ogre_die5       =[      $death5,        ogre_die6       ] {};
  954. void()  ogre_die6       =[      $death6,        ogre_die7       ] {};
  955. void()  ogre_die7       =[      $death7,        ogre_die8       ] {};
  956. void()  ogre_die8       =[      $death8,        ogre_die9       ] {};
  957. void()  ogre_die9       =[      $death9,        ogre_die10      ] {};
  958. void()  ogre_die10      =[      $death10,       ogre_die11      ] {};
  959. void()  ogre_die11      =[      $death11,       ogre_die12      ] {};
  960. void()  ogre_die12      =[      $death12,       ogre_die13      ] {};
  961. void()  ogre_die13      =[      $death13,       ogre_die14      ] {};
  962. void()  ogre_die14      =[      $death14,       ogre_die14      ] {CorpseThink();};
  963.  
  964. // Normal Death V2
  965.  
  966. void()  ogre_bdie1      =[      $bdeath1,       ogre_bdie2      ] {};
  967. void()  ogre_bdie2      =[      $bdeath2,       ogre_bdie3      ] {ai_forward(5);};
  968. void()  ogre_bdie3      =[      $bdeath3,       ogre_bdie4      ]
  969. {self.solid = SOLID_NOT;DeathDrop();};
  970. void()  ogre_bdie4      =[      $bdeath4,       ogre_bdie5      ] {ai_forward(1);};
  971. void()  ogre_bdie5      =[      $bdeath5,       ogre_bdie6      ] {ai_forward(3);};
  972. void()  ogre_bdie6      =[      $bdeath6,       ogre_bdie7      ] {ai_forward(7);};
  973. void()  ogre_bdie7      =[      $bdeath7,       ogre_bdie8      ] {ai_forward(25);};
  974. void()  ogre_bdie8      =[      $bdeath8,       ogre_bdie9      ] {};
  975. void()  ogre_bdie9      =[      $bdeath9,       ogre_bdie10     ] {};
  976. void()  ogre_bdie10     =[      $bdeath10,      ogre_bdie10     ] {CorpseThink();};
  977.  
  978. // Berserk Death (Chainsaw Flip)
  979.  
  980. void()  ogreb_die1      =[      $ogbdeath1,     ogreb_die2      ] {};
  981. void()  ogreb_die2      =[      $ogbdeath2,     ogreb_die3      ] {};
  982. void()  ogreb_die3      =[      $ogbdeath3,     ogreb_die4      ] {self.solid = SOLID_NOT;};
  983. void()  ogreb_die4      =[      $ogbdeath4,     ogreb_die5      ] {};
  984. void()  ogreb_die5      =[      $ogbdeath5,     ogreb_die6      ] {};
  985. void()  ogreb_die6      =[      $ogbdeath6,     ogreb_die7      ] {};
  986. void()  ogreb_die7      =[      $ogbdeath7,     ogreb_die8      ] {};
  987. void()  ogreb_die8      =[      $ogbdeath8,     ogreb_die9      ] {};
  988. void()  ogreb_die9      =[      $ogbdeath9,     ogreb_die10     ] {};
  989. void()  ogreb_die10     =[      $ogbdeath10,    ogreb_die11     ] {};
  990. void()  ogreb_die11     =[      $ogbdeath11,    ogreb_die12     ] {};
  991. void()  ogreb_die12     =[      $ogbdeath12,    ogreb_die13     ] {};
  992. void()  ogreb_die13     =[      $ogbdeath13,    ogreb_die14     ] {};
  993. void()  ogreb_die14     =[      $ogbdeath14,    ogreb_die15     ] {};
  994. void()  ogreb_die15     =[      $ogbdeath15,    ogreb_die16     ] {};
  995. void()  ogreb_die16     =[      $ogbdeath16,    ogreb_die17     ] {
  996. sound (self, CHAN_WEAPON, "ogre/ogsawatk.wav", 1, ATTN_NORM);
  997. SpawnMeatSpray (self.origin + v_forward*16, crandom() * 100 * v_right);};
  998. void()  ogreb_die17     =[      $ogbdeath17,    ogreb_die18     ] {SpawnMeatSpray (self.origin + v_forward*16, crandom() * 100 * v_right);};
  999. void()  ogreb_die18     =[      $ogbdeath18,    ogreb_die19     ] {SpawnMeatSpray (self.origin + v_forward*16, crandom() * 100 * v_right);};
  1000. void()  ogreb_die19     =[      $ogbdeath19,    ogreb_die20     ] {};
  1001. void()  ogreb_die20     =[      $ogbdeath20,    ogreb_die21     ] {};
  1002. void()  ogreb_die21     =[      $ogbdeath21,    ogreb_die21     ] {CorpseThink();};
  1003.  
  1004. // Berserk Death V2
  1005.  
  1006. void()  ogreb_bdie1     =[      $ogbbdeath1,    ogreb_bdie2     ] {};
  1007. void()  ogreb_bdie2     =[      $ogbbdeath2,    ogreb_bdie3     ] {};
  1008. void()  ogreb_bdie3     =[      $ogbbdeath3,    ogreb_bdie4     ] {self.solid = SOLID_NOT;};
  1009. void()  ogreb_bdie4     =[      $ogbbdeath4,    ogreb_bdie5     ] {};
  1010. void()  ogreb_bdie5     =[      $ogbbdeath5,    ogreb_bdie6     ] {};
  1011. void()  ogreb_bdie6     =[      $ogbbdeath6,    ogreb_bdie7     ] {};
  1012. void()  ogreb_bdie7     =[      $ogbbdeath7,    ogreb_bdie8     ] {};
  1013. void()  ogreb_bdie8     =[      $ogbbdeath8,    ogreb_bdie9     ] {};
  1014. void()  ogreb_bdie9     =[      $ogbbdeath9,    ogreb_bdie10    ] {};
  1015. void()  ogreb_bdie10    =[      $ogbbdeath10,   ogreb_bdie10    ] {CorpseThink();};
  1016.  
  1017. // Berserk Death V3
  1018.  
  1019. void()  ogreb_cdie1     =[      $ogbcdeath1,    ogreb_cdie2     ] {};
  1020. void()  ogreb_cdie2     =[      $ogbcdeath2,    ogreb_cdie3     ] {};
  1021. void()  ogreb_cdie3     =[      $ogbcdeath3,    ogreb_cdie4     ] {self.solid = SOLID_NOT;};
  1022. void()  ogreb_cdie4     =[      $ogbcdeath4,    ogreb_cdie5     ] {};
  1023. void()  ogreb_cdie5     =[      $ogbcdeath5,    ogreb_cdie6     ] {};
  1024. void()  ogreb_cdie6     =[      $ogbcdeath6,    ogreb_cdie7     ] {};
  1025. void()  ogreb_cdie7     =[      $ogbcdeath7,    ogreb_cdie8     ] {};
  1026. void()  ogreb_cdie8     =[      $ogbcdeath8,    ogreb_cdie9     ] {};
  1027. void()  ogreb_cdie9     =[      $ogbcdeath9,    ogreb_cdie10    ] {};
  1028. void()  ogreb_cdie10    =[      $ogbcdeath10,   ogreb_cdie11    ] {};
  1029. void()  ogreb_cdie11    =[      $ogbcdeath11,   ogreb_cdie12    ] {};
  1030. void()  ogreb_cdie12    =[      $ogbcdeath12,   ogreb_cdie13    ] {};
  1031. void()  ogreb_cdie13    =[      $ogbcdeath13,   ogreb_cdie14    ] {};
  1032. void()  ogreb_cdie14    =[      $ogbcdeath14,   ogreb_cdie14    ] {CorpseThink();};
  1033.  
  1034. // Rocket Death
  1035.  
  1036. void()  ogrer_die1      =[      $deathr1,       ogrer_die2      ] {};
  1037. void()  ogrer_die2      =[      $deathr2,       ogrer_die3      ] {};
  1038. void()  ogrer_die3      =[      $deathr3,       ogrer_die4      ]
  1039. {self.solid = SOLID_NOT;DeathDrop();};
  1040. void()  ogrer_die4      =[      $deathr4,       ogrer_die5      ] {};
  1041. void()  ogrer_die5      =[      $deathr5,       ogrer_die6      ] {};
  1042. void()  ogrer_die6      =[      $deathr6,       ogrer_die7      ] {};
  1043. void()  ogrer_die7      =[      $deathr7,       ogrer_die8      ] {};
  1044. void()  ogrer_die8      =[      $deathr8,       ogrer_die9      ] {};
  1045. void()  ogrer_die9      =[      $deathr9,       ogrer_die10     ] {};
  1046. void()  ogrer_die10     =[      $deathr10,      ogrer_die11     ] {};
  1047. void()  ogrer_die11     =[      $deathr11,      ogrer_die12     ] {};
  1048. void()  ogrer_die12     =[      $deathr12,      ogrer_die13     ] {};
  1049. void()  ogrer_die13     =[      $deathr13,      ogrer_die14     ] {};
  1050. void()  ogrer_die14     =[      $deathr14,      ogrer_die14     ] {CorpseThink();};
  1051.  
  1052. // Rocket Death V2
  1053.  
  1054. void()  ogrer_bdie1             =[      $bdeathr1,      ogrer_bdie2             ]       {};
  1055. void()  ogrer_bdie2             =[      $bdeathr2,      ogrer_bdie3             ]       {ai_forward(5);};
  1056. void()  ogrer_bdie3             =[      $bdeathr3,      ogrer_bdie4             ]       {self.solid = SOLID_NOT; DeathDrop();};
  1057. void()  ogrer_bdie4             =[      $bdeathr4,      ogrer_bdie5             ]       {ai_forward(1);};
  1058. void()  ogrer_bdie5             =[      $bdeathr5,      ogrer_bdie6             ]       {ai_forward(3);};
  1059. void()  ogrer_bdie6             =[      $bdeathr6,      ogrer_bdie7             ]       {ai_forward(7);};
  1060. void()  ogrer_bdie7             =[      $bdeathr7,      ogrer_bdie8             ]       {ai_forward(25);};
  1061. void()  ogrer_bdie8             =[      $bdeathr8,      ogrer_bdie9             ]       {};
  1062. void()  ogrer_bdie9             =[      $bdeathr9,      ogrer_bdie10    ]       {};
  1063. void()  ogrer_bdie10    =[      $bdeathr10,     ogrer_bdie10    ]       {CorpseThink();};
  1064.  
  1065. // Ogre Die (All Versions)
  1066.  
  1067. void() ogre_death_sound =
  1068. {
  1069.         local float r;
  1070.         r = random();
  1071.        
  1072.         if (r < 0.5)
  1073.         {
  1074.                 sound (self, CHAN_VOICE, "ogre/ogdth1.wav", 1, ATTN_NORM);
  1075.         }
  1076.         else
  1077.         {
  1078.                 sound (self, CHAN_VOICE, "ogre/ogdth2.wav", 1, ATTN_NORM);
  1079.         }
  1080. };
  1081.  
  1082. void() ogre_die =
  1083. {
  1084.         local float r;
  1085.         //local float GibCount;
  1086.         //local float LegCount;
  1087.         //local float ArmCount;
  1088.         //local float FootCount;
  1089.         //GibCount = 0;
  1090.         //LegCount = 0;
  1091.         //ArmCount = 0;
  1092.         //FootCount = 0;
  1093.         r = random();
  1094.  
  1095.         // gb, kill chainsaw loop
  1096.         sound (self, CHAN_BODY, "misc/null.wav", 1, ATTN_NORM);
  1097.  
  1098.         // Drowning?
  1099.         if (self.h2olevel >= 3)
  1100.         {
  1101.                 DeathBubbles (4);
  1102.                 sound (self, CHAN_VOICE, "ogre/ogdrown1.wav", 1, ATTN_NORM);    //FIXME
  1103.                
  1104.                 if (self.spawnflags & BERSERK_OGRE)
  1105.                         ogreb_die1();
  1106.                 else
  1107.                         ogre_die1();
  1108.  
  1109.                 return;
  1110.         }
  1111.  
  1112.         // Gib?
  1113.         if (self.health < -80)
  1114.         {
  1115.                 sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
  1116.                 ThrowHead ("progs/gib_ogre1.mdl", self.health, 3);
  1117.                 ThrowGib ("progs/gib_ogre2.mdl", self.health);
  1118.                 ThrowGib ("progs/gib_ogre3.mdl", self.health);
  1119.                 ThrowGib ("progs/gib_ogre4.mdl", self.health);
  1120.                 ThrowGib ("progs/gib_ogre5.mdl", self.health);
  1121.                
  1122.                 ThrowBlood (self.health*2);     //ijed Blood vfx
  1123.                 ThrowBlood (self.health*2);     //ijed Blood vfx
  1124.                 ThrowBlood (self.health*3);     //ijed Blood vfx
  1125.                 return;
  1126.         }      
  1127. /*              ThrowGibs (self.health);        // Supa, special cauteriser gib effect
  1128.                 ThrowGib ("progs/gib_ogre2.mdl", self.health);
  1129.                 ThrowGib ("progs/gib_ogre3.mdl", self.health);
  1130.                 ThrowGib ("progs/gib_ogre4.mdl", self.health);
  1131.                
  1132.                 ijed:  Uh yeah, this was crap :P
  1133.                
  1134.                 do      //ijed Chucks body parts
  1135.                 {
  1136.                         if ((random() < 0.33) && ArmCount < 2)          //count the limbs
  1137.                         {
  1138.                                 ThrowGib ("progs/gib_ogre2.mdl", self.health);          // arm
  1139.                                 ArmCount = ArmCount + 1;                                                       
  1140.                         }
  1141.                         else if ((random() > 0.66) && (LegCount < 2))
  1142.                         {
  1143.                                 ThrowGib ("progs/gib_ogre3.mdl", self.health);          // leg
  1144.                                 LegCount = LegCount + 1;
  1145.                         }
  1146.                         else if (FootCount < 2)
  1147.                         {
  1148.                                 ThrowGib ("progs/gib_ogre4.mdl", self.health);  // foot
  1149.                                 FootCount = FootCount + 1;
  1150.                         }
  1151.                         else
  1152.                         {
  1153.                                 ThrowGib ("progs/vomitus_gib.mdl", self.health);        // generic meat from vomitus
  1154.                         }
  1155.                         ThrowBlood (self.health*2);     //ijed Blood vfx
  1156.                         ThrowBlood (self.health*3);     //ijed Blood vfx
  1157.                         GibCount = GibCount + 1;
  1158.                 }       while (GibCount < 4);                  
  1159.                 return;
  1160.         }*/
  1161.        
  1162.         // What type of Ogre is dying?
  1163.         if (self.spawnflags & BERSERK_OGRE)
  1164.         {      
  1165.                 ogre_death_sound ();
  1166.                
  1167.                 if (r < 0.2)
  1168.                         ogreb_die1 ();
  1169.                 else if (r < 0.6)
  1170.                         ogreb_bdie1 ();
  1171.                 else
  1172.                         ogreb_cdie1 ();
  1173.  
  1174.                 return;
  1175.         }
  1176.         else if (self.spawnflags & ROCKET_OGRE)
  1177.         {
  1178.                 ogre_death_sound ();
  1179.                
  1180.                 if (r < 0.5)
  1181.                         ogrer_die1 ();
  1182.                 else
  1183.                         ogrer_bdie1 ();
  1184.                        
  1185.                 return;
  1186.         }
  1187.         else    // Grenadier / Nail (pending)
  1188.         {
  1189.                 ogre_death_sound ();
  1190.                
  1191.                 if (r < 0.5)
  1192.                         ogre_die1 ();
  1193.                 else
  1194.                         ogre_bdie1 ();
  1195.         }
  1196. };
  1197.  
  1198. // Ogre Melee -> All Versions
  1199. void() ogre_melee =
  1200. {
  1201.         local float r;
  1202.         r = random();
  1203.        
  1204.         if (self.spawnflags & BERSERK_OGRE)
  1205.         {
  1206.                 if (r > 0.5)
  1207.                         ogreb_smash1 ();
  1208.                 else
  1209.                         ogreb_swing1 ();
  1210.         }
  1211.         else if (self.spawnflags & ROCKET_OGRE)
  1212.         {
  1213.                 ogre_bayonet1 ();
  1214.         }
  1215.         else
  1216.         {
  1217.                 if (r > 0.5)
  1218.                         ogre_smash1 ();
  1219.                 else
  1220.                         ogre_swing1 ();
  1221.         }
  1222. };
  1223.  
  1224. // Supa, ijed -> Ogre taunt behavior
  1225.  
  1226. void() ogre_taunt_sound =
  1227. {
  1228.         local float r;
  1229.         r = random();
  1230.  
  1231.         if (r > 0.5)
  1232.                 sound (self, CHAN_VOICE, "ogre/ogtaunt2.wav", 1, ATTN_NORM);
  1233.         else
  1234.                 sound (self, CHAN_VOICE, "ogre/ogtaunt3.wav", 1, ATTN_NORM);
  1235. };
  1236.  
  1237. void() ogre_dance;
  1238.  
  1239. void()  ogre_taunt1     =[      $pain1,         ogre_taunt2     ] {};
  1240. void()  ogre_taunt2     =[      $pain2,         ogre_taunt3     ] {};
  1241. void()  ogre_taunt3     =[      $pain3,         ogre_taunt4     ] {};
  1242. void()  ogre_taunt4     =[      $pain4,         ogre_taunt5     ] {};
  1243. void()  ogre_taunt5     =[      $pain5,         ogre_dance      ] {};
  1244.  
  1245. void()  ogre_tauntb1    =[      $painb1,        ogre_tauntb2    ] {};
  1246. void()  ogre_tauntb2    =[      $painb2,        ogre_tauntb3    ] {};
  1247. void()  ogre_tauntb3    =[      $painb3,        ogre_dance              ] {};
  1248.  
  1249. void()  ogre_tauntc1    =[      $painc1,        ogre_tauntc2    ] {};
  1250. void()  ogre_tauntc2    =[      $painc2,        ogre_tauntc3    ] {};
  1251. void()  ogre_tauntc3    =[      $painc3,        ogre_tauntc4    ] {};
  1252. void()  ogre_tauntc4    =[      $painc4,        ogre_tauntc5    ] {};
  1253. void()  ogre_tauntc5    =[      $painc5,        ogre_tauntc6    ] {};
  1254. void()  ogre_tauntc6    =[      $painc6,        ogre_dance              ] {};
  1255.  
  1256. void()  ogre_tauntd1    =[      $paind1,        ogre_tauntd2    ] {};
  1257. void()  ogre_tauntd2    =[      $paind2,        ogre_tauntd3    ] {};
  1258. void()  ogre_tauntd3    =[      $paind3,        ogre_tauntd4    ] {};
  1259. void()  ogre_tauntd4    =[      $paind4,        ogre_tauntd5    ] {};
  1260. void()  ogre_tauntd5    =[      $paind5,        ogre_tauntd6    ] {};
  1261. void()  ogre_tauntd6    =[      $paind6,        ogre_tauntd7    ] {};
  1262. void()  ogre_tauntd7    =[      $paind7,        ogre_tauntd8    ] {};
  1263. void()  ogre_tauntd8    =[      $paind8,        ogre_tauntd9    ] {};
  1264. void()  ogre_tauntd9    =[      $paind9,        ogre_tauntd10   ] {};
  1265. void()  ogre_tauntd10   =[      $paind10,       ogre_tauntd11   ] {};
  1266. void()  ogre_tauntd11   =[      $paind11,       ogre_tauntd12   ] {};
  1267. void()  ogre_tauntd12   =[      $paind12,       ogre_tauntd13   ] {};
  1268. void()  ogre_tauntd13   =[      $paind13,       ogre_tauntd14   ] {};
  1269. void()  ogre_tauntd14   =[      $paind14,       ogre_tauntd15   ] {};
  1270. void()  ogre_tauntd15   =[      $paind15,       ogre_tauntd16   ] {};
  1271. void()  ogre_tauntd16   =[      $paind16,       ogre_dance              ] {};
  1272.  
  1273. void()  ogre_taunte1    =[      $paine1,        ogre_taunte2    ] {};
  1274. void()  ogre_taunte2    =[      $paine2,        ogre_taunte3    ] {};
  1275. void()  ogre_taunte3    =[      $paine3,        ogre_taunte4    ] {};
  1276. void()  ogre_taunte4    =[      $paine4,        ogre_taunte5    ] {};
  1277. void()  ogre_taunte5    =[      $paine5,        ogre_taunte6    ] {};
  1278. void()  ogre_taunte6    =[      $paine6,        ogre_taunte7    ] {};
  1279. void()  ogre_taunte7    =[      $paine7,        ogre_taunte8    ] {};
  1280. void()  ogre_taunte8    =[      $paine8,        ogre_taunte9    ] {};
  1281. void()  ogre_taunte9    =[      $paine9,        ogre_taunte10   ] {};
  1282. void()  ogre_taunte10   =[      $paine10,       ogre_taunte11   ] {};
  1283. void()  ogre_taunte11   =[      $paine11,       ogre_taunte12   ] {};
  1284. void()  ogre_taunte12   =[      $paine12,       ogre_taunte13   ] {};
  1285. void()  ogre_taunte13   =[      $paine13,       ogre_taunte14   ] {};
  1286. void()  ogre_taunte14   =[      $paine14,       ogre_taunte15   ] {};
  1287. void()  ogre_taunte15   =[      $paine15,       ogre_dance              ] {};
  1288.  
  1289. //return to previous thinkage
  1290. void() ogre_stoptaunt =
  1291. {
  1292.         if (self.movetarget)    self.th_walk();
  1293.         else                                    self.th_stand();
  1294. };
  1295.  
  1296. void()  ogre_dance =    // dance! dance for me, puppet!
  1297. {
  1298.         local float r;
  1299.        
  1300.         if (self.cnt > 3)       // only dance a bit before looking for hostiles again                           // okay, stop dancing and get back to work
  1301.         {
  1302.                 ogre_stoptaunt ();
  1303.                 return;
  1304.         }
  1305.        
  1306.         self.cnt = self.cnt + 1;
  1307.  
  1308.         SightSound();
  1309.        
  1310.         r = random();
  1311.  
  1312.         if              (r < 0.25       )       ogre_taunt1();
  1313.         else if (r < 0.5        )       ogre_tauntb1();
  1314.         else if (r < 0.75       )       ogre_tauntc1();
  1315.         else if (r < 0.88       )       ogre_tauntd1();
  1316.         else                                    ogre_taunte1();
  1317. };
  1318.  
  1319. //Ogreb Taunting
  1320. void ogreb_taunt1();
  1321.  
  1322. void()  ogreb_dance =   // dance! dance for me, puppet!
  1323. {
  1324.         if (self.cnt > 2)       // only dance a bit before looking for hostiles again
  1325.         {
  1326.                 ogre_stoptaunt ();   //okay, stop dancing and get back to work
  1327.                 return;
  1328.         }
  1329.        
  1330.         self.cnt = self.cnt + 1;
  1331.         ogreb_taunt1 ();
  1332. };
  1333.  
  1334. void()  ogreb_taunt1    =[      $ogbtaunt1,     ogreb_taunt2    ] {};
  1335. void()  ogreb_taunt2    =[      $ogbtaunt2,     ogreb_taunt3    ] {};
  1336. void()  ogreb_taunt3    =[      $ogbtaunt3,     ogreb_dance             ] {};
  1337.  
  1338. void(entity deadplayer) ogreb_taunt =
  1339. {
  1340.         ogre_taunt_sound();
  1341.        
  1342.         if (!coop)
  1343.         {
  1344.                 self.enemy = deadplayer;        // needed to prevent the ogre from doing anything else
  1345.                 ogreb_taunt1();
  1346.         }
  1347. };
  1348.  
  1349. void(entity deadplayer) ogre_taunt =
  1350. {
  1351.         // FIXME: TEMPORARY PLACEHOLDER BEHAVIOR
  1352.         ogre_taunt_sound();
  1353.         if (!coop)
  1354.         {
  1355.                 self.enemy = deadplayer;        // needed to prevent the ogre from doing anything else
  1356.                 ogre_taunt1();
  1357.         }
  1358. };
  1359. // Supa, Ogre taunt behavior end
  1360.  
  1361. //ijed Chooses attack type depending on weapon
  1362. void() ogre_chooseattack =
  1363. {
  1364.         if (self.spawnflags & NAIL_OGRE) //ijed Chooses attack type
  1365.                 ogre_nail1();
  1366.         else if (self.spawnflags & ROCKET_OGRE)
  1367.                 ogre_rocket1();
  1368.         else
  1369.                 ogre_grenade1();
  1370. };
  1371.  
  1372. void() monster_ogre_go =
  1373. {
  1374.         self.solid = SOLID_SLIDEBOX;
  1375.         self.movetype = MOVETYPE_STEP;
  1376.  
  1377.         //Which mesh to use
  1378.         if (self.spawnflags & BERSERK_OGRE)
  1379.                 setmodel (self, "progs/ogreb.mdl");
  1380.         else if (self.spawnflags & ROCKET_OGRE)
  1381.                 setmodel (self, "progs/ogrer.mdl");
  1382.         else
  1383.                 setmodel (self, "progs/ogre.mdl");
  1384.  
  1385.         setsize (self, VEC_HULL_MIN, VEC_HULL_MAX);     // gb, idea by Lardarse
  1386.         // setsize (self, VEC_HULL2_MIN, VEC_HULL2_MAX); // FIXME - custom bbox
  1387.        
  1388.         self.health = MonsterHealth(200);
  1389.        
  1390.         //What to think
  1391.         if (self.spawnflags & BERSERK_OGRE)
  1392.         {
  1393.                 self.th_stand = ogreb_stand1;
  1394.                 self.th_walk = ogreb_walk1;
  1395.                 self.th_run = ogreb_run1;
  1396.                 self.th_taunt = ogreb_taunt;
  1397.         }
  1398.         else if (self.spawnflags & ROCKET_OGRE)
  1399.         {
  1400.                 self.th_stand = ogrer_stand1;
  1401.                 self.th_walk = ogrer_walk1;
  1402.                 self.th_run = ogrer_run1;
  1403.                 self.th_missile = ogre_chooseattack;
  1404.                 self.th_taunt = ogre_taunt;
  1405.         }
  1406.         else //grenade and nails
  1407.         {
  1408.                 self.th_stand = ogre_stand1;
  1409.                 self.th_walk = ogre_walk1;
  1410.                 self.th_run = ogre_run1;
  1411.                 self.th_missile = ogre_chooseattack;
  1412.                 self.th_taunt = ogre_taunt;
  1413.         }
  1414.        
  1415.         self.th_die = ogre_die;
  1416.         self.th_melee = ogre_melee;
  1417.         self.th_pain = ogre_pain;
  1418.         self.th_submerged = SUB_Null;
  1419.        
  1420.         self.always_infight = TRUE;
  1421.        
  1422.         if (!self.noroam)
  1423.                 self.should_roam = TRUE;
  1424.        
  1425.         Gyro_Object_Activate (self, 90000);
  1426.  
  1427.         walkmonster_start();
  1428. };
  1429.  
  1430. /*QUAKED monster_ogre (1 0 0) (-32 -32 -24) (32 32 64) Ambush
  1431. */
  1432. void() monster_ogre =
  1433. {
  1434.         if (deathmatch)
  1435.         {
  1436.                 remove(self);
  1437.                 return;
  1438.         }
  1439.  
  1440.         legacy_checkfortweaks(); // gb
  1441.  
  1442.         // Supa, precache all versions anyway in case of a savegame load, otherwise we may run into cases where the qcvm loads
  1443.         //  different models in a different order than what the savegame had, which can cause nice modelindex mismatches
  1444.        
  1445.         //what to precache
  1446. //      if (self.spawnflags & BERSERK_OGRE)
  1447. //      {
  1448.                 precache_model ("progs/ogreb.mdl");
  1449.                 precache_sound ("ogre/ogbsawatk.wav");
  1450. //      }
  1451. //      else if (self.spawnflags & NAIL_OGRE)  
  1452. //      {
  1453.                 precache_model ("progs/ogre.mdl");      // FIXME differentiate between grenade and nail ogre
  1454.                 precache_sound ("ogre/flak.wav");
  1455.                 precache_sound ("ogre/ogsawatk.wav");
  1456. //      }
  1457. //      else if (self.spawnflags & ROCKET_OGRE)
  1458. //      {
  1459.                 precache_model ("progs/ogrer.mdl");
  1460.                 precache_model ("progs/missile.mdl");
  1461.                 precache_sound ("ogre/orocket.wav");
  1462.                 precache_sound ("ogre/orockex.wav");
  1463.                 precache_sound ("ogre/ogsawatk.wav");
  1464. //      }
  1465. //      else  //Grenadier
  1466. //      {
  1467.                 precache_model ("progs/ogre.mdl");
  1468.                 precache_model ("progs/grenade.mdl");   // is this even needed?  No, but ask Carmack :P
  1469.                 precache_sound ("ogre/ogsawatk.wav");
  1470. //      }
  1471.  
  1472.         //precache_model ("progs/h_ogre.mdl");  //And it's outta here
  1473.         precache_model ("progs/gib_ogre1.mdl");
  1474.         precache_model ("progs/gib_ogre2.mdl");
  1475.         precache_model ("progs/gib_ogre3.mdl");
  1476.         precache_model ("progs/gib_ogre4.mdl");
  1477.         precache_model ("progs/gib_ogre5.mdl");
  1478.  
  1479.         precache_sound ("ogre/ogdrag.wav");
  1480.         precache_sound ("ogre/ogdth1.wav");
  1481.         precache_sound ("ogre/ogdth2.wav");
  1482.  
  1483.         //Taunt Sounds
  1484.         precache_sound ("ogre/ogtaunt2.wav");
  1485.         precache_sound ("ogre/ogtaunt3.wav");
  1486.        
  1487.         precache_sound ("ogre/ogdrown1.wav");
  1488.        
  1489.         precache_sound ("ogre/ogidle1.wav");
  1490.         precache_sound ("ogre/ogidle2.wav");
  1491.  
  1492.         precache_sound ("ogre/ogpain1.wav");
  1493.         precache_sound ("ogre/ogpain2.wav");
  1494.         precache_sound ("ogre/ogpain3.wav");
  1495.         precache_sound ("ogre/ogpain4.wav");
  1496.         precache_sound ("ogre/ogpain5.wav");
  1497.        
  1498.         // footsteps, gb
  1499.         precache_sound ("ogre/ogstep1.wav");
  1500.         precache_sound ("ogre/ogstep2.wav");
  1501.         precache_sound ("ogre/ogstep3.wav");
  1502.         precache_sound ("ogre/ogstep4.wav");
  1503.         precache_sound ("ogre/ogstep5.wav");
  1504.         precache_sound ("ogre/ogstep6.wav");
  1505.         precache_sound ("ogre/ogstep7.wav");
  1506.         precache_sound ("ogre/ogstep8.wav");
  1507.        
  1508.         precache_sound ("ogre/ogtalk1.wav");
  1509.         precache_sound ("ogre/ogtalk2.wav");
  1510.         precache_sound ("ogre/ogtalk3.wav");
  1511.         precache_sound ("ogre/ogtalk4.wav");
  1512.  
  1513.         precache_sound ("ogre/ogwake.wav");
  1514.         precache_sound ("ogre/ogwake2.wav");
  1515.  
  1516.         precache_sound ("ogre/ogsawloop.wav");
  1517.  
  1518.         self.go = monster_ogre_go;
  1519.         if(!CheckGroup()) self.go();
  1520. };
  1521.  
  1522. //ijed Ok, nailgunners run but grenadiers stand and shoot, lets see how the playtest works out.  As a note, the marksman is still
  1523. //in, but his only difference is that he doesn't shout when seeing the player - he's still there to not break older maps.
  1524. //If anyone has an idea for a use for him, lets see about implementing it.  
  1525.  
  1526. void() monster_ogre_marksman =
  1527. {
  1528.         monster_ogre ();
  1529. };
RAW Paste Data
Challenge yourself this year...
Learn something new in 2017
Top