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