home *** CD-ROM | disk | FTP | other *** search
/ Quake 'em / QUAKEEM.BIN / quake / programs / dropdead / monsters.qc < prev    next >
Encoding:
Text File  |  1996-08-20  |  6.2 KB  |  294 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. void() SUB_Gib =
  43. {
  44.     local vector x, y, v;
  45.     local float r_num;
  46.     r_num = random();
  47.     if (r_num < 0.5)  // Meat spray only, most of the time
  48.     {
  49.         x = '1 0 0';
  50.         y = '0 1 0';
  51.         v = x * (50 - random() * 100) + y * (50 - random() * 100);
  52.         r_num = random();
  53.         SpawnMeatSpray(self.origin, v);
  54.     }
  55.     else if (r_num < 0.7)
  56.         ThrowGib("progs/gib1.mdl", self.health);
  57.     else if (r_num < 0.9)
  58.         ThrowGib("progs/gib2.mdl", self.health);
  59.     else
  60.         ThrowGib("progs/gib3.mdl", self.health);
  61. };
  62.  
  63. void() MonsterCorpseGib =
  64. {
  65.     ThrowGib ("progs/gib3.mdl", self.health);
  66.     ThrowGib ("progs/gib3.mdl", self.health);
  67.     ThrowGib ("progs/gib3.mdl", self.health);
  68.     ThrowHead (self.weaponmodel, self.health);
  69.     self.think = SUB_Null;
  70. };
  71.  
  72.  
  73. void() DropCorpse =
  74. {
  75.     droptofloor();
  76.     self.think = DropCorpse;
  77.     self.nextthink = time + 0.5;
  78. };
  79.  
  80.  
  81. void(vector bb1, vector bb2, string headmdl) monster_corpse_setup =
  82. {
  83.     setsize(self, bb1, bb2);
  84.     self.weaponmodel = headmdl; // This should be unused in monsters
  85.     self.health = 35;
  86.     self.deadflag = DEAD_DYING;
  87.     self.th_stand = SUB_Null;
  88.     self.th_walk = SUB_Null;
  89.     self.th_run = SUB_Null;
  90.     self.th_pain = SUB_Gib;
  91.     self.th_die = MonsterCorpseGib;
  92.     self.th_melee = SUB_Null;
  93.     self.th_missile = SUB_Null;
  94.     self.takedamage= DAMAGE_AIM; // grenades explode 
  95. };
  96.  
  97.  
  98. /*
  99. ================
  100. monster_death_use
  101.  
  102. When a mosnter dies, it fires all of its targets with the current
  103. enemy as activator.
  104. ================
  105. */
  106. void() monster_death_use =
  107. {
  108.     local entity     ent, otemp, stemp;
  109.  
  110. // fall to ground
  111.     if (self.flags & FL_FLY)
  112.         self.flags = self.flags - FL_FLY;
  113.     if (self.flags & FL_SWIM)
  114.         self.flags = self.flags - FL_SWIM;
  115.  
  116.     if (!self.target)
  117.         return;
  118.  
  119.     activator = self.enemy;
  120.     SUB_UseTargets ();
  121. };
  122.  
  123.  
  124. //============================================================================
  125.  
  126. void() walkmonster_start_go =
  127. {
  128. local string    stemp;
  129. local entity    etemp;
  130.  
  131.     self.origin_z = self.origin_z + 1;    // raise off floor a bit
  132.     droptofloor();
  133.     
  134.     if (!walkmove(0,0))
  135.     {
  136.         dprint ("walkmonster in wall at: ");
  137.         dprint (vtos(self.origin));
  138.         dprint ("\n");
  139.     }
  140.     
  141.     self.takedamage = DAMAGE_AIM;
  142.  
  143.     self.ideal_yaw = self.angles * '0 1 0';
  144.     if (!self.yaw_speed)
  145.         self.yaw_speed = 20;
  146.     self.view_ofs = '0 0 25';
  147.     self.use = monster_use;
  148.     
  149.     self.flags = self.flags | FL_MONSTER;
  150.     
  151.     if (self.target)
  152.     {
  153.         self.goalentity = self.movetarget = find(world, targetname, self.target);
  154.         self.ideal_yaw = vectoyaw(self.goalentity.origin - self.origin);
  155.         if (!self.movetarget)
  156.         {
  157.             dprint ("Monster can't find target at ");
  158.             dprint (vtos(self.origin));
  159.             dprint ("\n");
  160.         }
  161. // this used to be an objerror
  162.         if (self.movetarget.classname == "path_corner")
  163.             self.th_walk ();
  164.         else
  165.             self.pausetime = 99999999;
  166.             self.th_stand ();
  167.     }
  168.     else
  169.     {
  170.         self.pausetime = 99999999;
  171.         self.th_stand ();
  172.     }
  173.  
  174. // spread think times so they don't all happen at same time
  175.     self.nextthink = self.nextthink + random()*0.5;
  176. };
  177.  
  178.  
  179. void() walkmonster_start =
  180. {
  181. // delay drop to floor to make sure all doors have been spawned
  182. // spread think times so they don't all happen at same time
  183.     self.nextthink = self.nextthink + random()*0.5;
  184.     self.think = walkmonster_start_go;
  185.     total_monsters = total_monsters + 1;
  186. };
  187.  
  188.  
  189.  
  190. void() flymonster_start_go =
  191. {
  192.     self.takedamage = DAMAGE_AIM;
  193.  
  194.     self.ideal_yaw = self.angles * '0 1 0';
  195.     if (!self.yaw_speed)
  196.         self.yaw_speed = 10;
  197.     self.view_ofs = '0 0 25';
  198.     self.use = monster_use;
  199.  
  200.     self.flags = self.flags | FL_FLY;
  201.     self.flags = self.flags | FL_MONSTER;
  202.  
  203.     if (!walkmove(0,0))
  204.     {
  205.         dprint ("flymonster in wall at: ");
  206.         dprint (vtos(self.origin));
  207.         dprint ("\n");
  208.     }
  209.  
  210.     if (self.target)
  211.     {
  212.         self.goalentity = self.movetarget = find(world, targetname, self.target);
  213.         if (!self.movetarget)
  214.         {
  215.             dprint ("Monster can't find target at ");
  216.             dprint (vtos(self.origin));
  217.             dprint ("\n");
  218.         }
  219. // this used to be an objerror
  220.         if (self.movetarget.classname == "path_corner")
  221.             self.th_walk ();
  222.         else
  223.             self.pausetime = 99999999;
  224.             self.th_stand ();
  225.     }
  226.     else
  227.     {
  228.         self.pausetime = 99999999;
  229.         self.th_stand ();
  230.     }
  231. };
  232.  
  233. void() flymonster_start =
  234. {
  235. // spread think times so they don't all happen at same time
  236.     self.nextthink = self.nextthink + random()*0.5;
  237.     self.think = flymonster_start_go;
  238.     total_monsters = total_monsters + 1;
  239. };
  240.  
  241.  
  242. void() swimmonster_start_go =
  243. {
  244.     if (deathmatch < 3)
  245.     {
  246.         remove(self);
  247.         return;
  248.     }
  249.  
  250.     self.takedamage = DAMAGE_AIM;
  251.     total_monsters = total_monsters + 1;
  252.  
  253.     self.ideal_yaw = self.angles * '0 1 0';
  254.     if (!self.yaw_speed)
  255.         self.yaw_speed = 10;
  256.     self.view_ofs = '0 0 10';
  257.     self.use = monster_use;
  258.     
  259.     self.flags = self.flags | FL_SWIM;
  260.     self.flags = self.flags | FL_MONSTER;
  261.  
  262.     if (self.target)
  263.     {
  264.         self.goalentity = self.movetarget = find(world, targetname, self.target);
  265.         if (!self.movetarget)
  266.         {
  267.             dprint ("Monster can't find target at ");
  268.             dprint (vtos(self.origin));
  269.             dprint ("\n");
  270.         }
  271. // this used to be an objerror
  272.         self.ideal_yaw = vectoyaw(self.goalentity.origin - self.origin);
  273.         self.th_walk ();
  274.     }
  275.     else
  276.     {
  277.         self.pausetime = 99999999;
  278.         self.th_stand ();
  279.     }
  280.  
  281. // spread think times so they don't all happen at same time
  282.     self.nextthink = self.nextthink + random()*0.5;
  283. };
  284.  
  285. void() swimmonster_start =
  286. {
  287. // spread think times so they don't all happen at same time
  288.     self.nextthink = self.nextthink + random()*0.5;
  289.     self.think = swimmonster_start_go;
  290.     total_monsters = total_monsters + 1;
  291. };
  292.  
  293.  
  294.