home *** CD-ROM | disk | FTP | other *** search
/ Quake 'em / QUAKEEM.BIN / quake / programs / sgqcver3 / monsters.qc < prev    next >
Encoding:
Text File  |  1996-08-02  |  5.2 KB  |  244 lines

  1. /* ALL MONSTERS SHOULD BE 1 0 0 IN COLOR */
  2.  
  3. // name =[framenum,    nexttime, nextthink] {code}
  4. // expands to:
  5. // name ()
  6. // {
  7. //        self.frame=framenum;
  8. //        self.nextthink = time + nexttime;
  9. //        self.think = nextthink
  10. //        <code>
  11. // };
  12.  
  13.  
  14. /*
  15. ================
  16. monster_use
  17.  
  18. Using a monster makes it angry at the current activator
  19. ================
  20. */
  21. void() monster_use =
  22. {
  23.     if (self.enemy)
  24.         return;
  25.     if (self.health <= 0)
  26.         return;
  27.     if (activator.items & IT_INVISIBILITY)
  28.         return;
  29.     if (activator.flags & FL_NOTARGET)
  30.         return;
  31.     if (activator.classname != "player")
  32.         return;
  33.     
  34. // delay reaction so if the monster is teleported, its sound is still
  35. // heard
  36.     self.enemy = activator;
  37.     self.nextthink = time + 0.1;
  38.     self.think = FoundTarget;
  39. };
  40.  
  41. /*
  42. ================
  43. monster_death_use
  44.  
  45. When a mosnter dies, it fires all of its targets with the current
  46. enemy as activator.
  47. ================
  48. */
  49. void() monster_death_use =
  50. {
  51.     local entity     ent, otemp, stemp;
  52.  
  53. // fall to ground
  54.     if (self.flags & FL_FLY)
  55.         self.flags = self.flags - FL_FLY;
  56.     if (self.flags & FL_SWIM)
  57.         self.flags = self.flags - FL_SWIM;
  58.  
  59.     if (!self.target)
  60.         return;
  61.  
  62.     activator = self.enemy;
  63.     SUB_UseTargets ();
  64. };
  65.  
  66.  
  67. //============================================================================
  68.  
  69. void() walkmonster_start_go =
  70. {
  71. local string    stemp;
  72. local entity    etemp;
  73.  
  74.     self.origin_z = self.origin_z + 1;    // raise off floor a bit
  75.     droptofloor();
  76.     
  77.     if (!walkmove(0,0))
  78.     {
  79.         dprint ("walkmonster in wall at: ");
  80.         dprint (vtos(self.origin));
  81.         dprint ("\n");
  82.     }
  83.     
  84.     self.takedamage = DAMAGE_AIM;
  85.  
  86.     self.ideal_yaw = self.angles * '0 1 0';
  87.     if (!self.yaw_speed)
  88.         self.yaw_speed = 20;
  89.     self.view_ofs = '0 0 25';
  90.     self.use = monster_use;
  91.     
  92.     self.flags = self.flags | FL_MONSTER;
  93.     
  94.     if (self.target)
  95.     {
  96.         self.goalentity = self.movetarget = find(world, targetname, self.target);
  97.         self.ideal_yaw = vectoyaw(self.goalentity.origin - self.origin);
  98.         if (!self.movetarget)
  99.         {
  100.             dprint ("Monster can't find target at ");
  101.             dprint (vtos(self.origin));
  102.             dprint ("\n");
  103.         }
  104. // this used to be an objerror
  105.         if (self.movetarget.classname == "path_corner")
  106.             self.th_walk ();
  107.         else
  108.             self.pausetime = 99999999;
  109.             self.th_stand ();
  110.     }
  111.     else
  112.     {
  113.         self.pausetime = 99999999;
  114.         self.th_stand ();
  115.     }
  116.  
  117. // spread think times so they don't all happen at same time
  118.         if ( !(self.classname == "monster_zombie") )
  119.         {
  120.                 self.air_finished = time + 12;
  121.                 self.dmg = 2;                   // initial water damage
  122.         }
  123.     self.nextthink = self.nextthink + random()*0.5;
  124. };
  125.  
  126.  
  127. void() walkmonster_start =
  128. {
  129. // delay drop to floor to make sure all doors have been spawned
  130. // spread think times so they don't all happen at same time
  131.     self.nextthink = self.nextthink + random()*0.5;
  132.     self.think = walkmonster_start_go;
  133.     total_monsters = total_monsters + 1;
  134. };
  135.  
  136.  
  137.  
  138. void() flymonster_start_go =
  139. {
  140.     self.takedamage = DAMAGE_AIM;
  141.  
  142.     self.ideal_yaw = self.angles * '0 1 0';
  143.     if (!self.yaw_speed)
  144.         self.yaw_speed = 10;
  145.     self.view_ofs = '0 0 25';
  146.     self.use = monster_use;
  147.     self.air_finished = time + 12;
  148.     self.dmg = 2;           // initial water damage
  149.  
  150.     self.flags = self.flags | FL_FLY;
  151.     self.flags = self.flags | FL_MONSTER;
  152.  
  153.     if (!walkmove(0,0))
  154.     {
  155.         dprint ("flymonster in wall at: ");
  156.         dprint (vtos(self.origin));
  157.         dprint ("\n");
  158.     }
  159.  
  160.     if (self.target)
  161.     {
  162.         self.goalentity = self.movetarget = find(world, targetname, self.target);
  163.         if (!self.movetarget)
  164.         {
  165.             dprint ("Monster can't find target at ");
  166.             dprint (vtos(self.origin));
  167.             dprint ("\n");
  168.         }
  169. // this used to be an objerror
  170.         if (self.movetarget.classname == "path_corner")
  171.             self.th_walk ();
  172.         else
  173.             self.pausetime = 99999999;
  174.             self.th_stand ();
  175.     }
  176.     else
  177.     {
  178.         self.pausetime = 99999999;
  179.         self.th_stand ();
  180.     }
  181. };
  182.  
  183. void() flymonster_start =
  184. {
  185. // spread think times so they don't all happen at same time
  186.     self.nextthink = self.nextthink + random()*0.5;
  187.     self.think = flymonster_start_go;
  188.     total_monsters = total_monsters + 1;
  189. };
  190.  
  191.  
  192. void() swimmonster_start_go =
  193. {
  194.     if (deathmatch)
  195.     {
  196.         remove(self);
  197.         return;
  198.     }
  199.  
  200.     self.takedamage = DAMAGE_AIM;
  201.     total_monsters = total_monsters + 1;
  202.  
  203.     self.ideal_yaw = self.angles * '0 1 0';
  204.     if (!self.yaw_speed)
  205.         self.yaw_speed = 10;
  206.     self.view_ofs = '0 0 10';
  207.     self.use = monster_use;
  208.     
  209.     self.flags = self.flags | FL_SWIM;
  210.     self.flags = self.flags | FL_MONSTER;
  211.  
  212.     if (self.target)
  213.     {
  214.         self.goalentity = self.movetarget = find(world, targetname, self.target);
  215.         if (!self.movetarget)
  216.         {
  217.             dprint ("Monster can't find target at ");
  218.             dprint (vtos(self.origin));
  219.             dprint ("\n");
  220.         }
  221. // this used to be an objerror
  222.         self.ideal_yaw = vectoyaw(self.goalentity.origin - self.origin);
  223.         self.th_walk ();
  224.     }
  225.     else
  226.     {
  227.         self.pausetime = 99999999;
  228.         self.th_stand ();
  229.     }
  230.  
  231. // spread think times so they don't all happen at same time
  232.     self.nextthink = self.nextthink + random()*0.5;
  233. };
  234.  
  235. void() swimmonster_start =
  236. {
  237. // spread think times so they don't all happen at same time
  238.     self.nextthink = self.nextthink + random()*0.5;
  239.     self.think = swimmonster_start_go;
  240.     total_monsters = total_monsters + 1;
  241. };
  242.  
  243.  
  244.