/* ALL MONSTERS SHOULD BE 1 0 0 IN COLOR */ // name =[framenum, nexttime, nextthink] {code} // expands to: // name () // { // self.frame=framenum; // self.nextthink = time + nexttime; // self.think = nextthink // // }; /* ================ monster_use Using a monster makes it angry at the current activator ================ */ void() monster_use = { if (self.enemy) return; if (self.health <= 0) return; if (activator.items & IT_INVISIBILITY) return; if (activator.flags & FL_NOTARGET) return; if (activator.classname != "player") return; // delay reaction so if the monster is teleported, its sound is still // heard self.enemy = activator; self.nextthink = time + 0.1; self.think = FoundTarget; }; /* ================ monster_death_use When a mosnter dies, it fires all of its targets with the current enemy as activator. ================ */ void() monster_death_use = { // fall to ground if (self.flags & FL_FLY) self.flags = self.flags - FL_FLY; if (self.flags & FL_SWIM) self.flags = self.flags - FL_SWIM; if (!self.target) return; activator = self.enemy; SUB_UseTargets (); }; //============================================================================ void() walkmonster_start_go = { local float replace; local vector back; self.origin_z = self.origin_z + 1; // raise off floor a bit droptofloor(); if (!walkmove(0,0)) { dprint ("walkmonster in wall at: "); dprint (vtos(self.origin)); dprint ("\n"); back = self.origin; replace = 90; while (!walkmove(0,0) && replace > 0) { setorigin(self, back); self.origin_x = self.origin_x + crandom()*600; self.origin_y = self.origin_y + crandom()*600; self.origin_z = self.origin_z + 1; // raise off floor a bit droptofloor(); replace = replace - 1; } } self.takedamage = DAMAGE_AIM; self.ideal_yaw = self.angles * '0 1 0'; if (!self.yaw_speed) self.yaw_speed = 20; self.view_ofs = '0 0 25'; self.use = monster_use; self.flags = self.flags | FL_MONSTER; if (self.target) { self.goalentity = self.movetarget = find(world, targetname, self.target); self.ideal_yaw = vectoyaw(self.goalentity.origin - self.origin); if (!self.movetarget) { dprint ("Monster can't find target at "); dprint (vtos(self.origin)); dprint ("\n"); } // this used to be an objerror if (self.movetarget.classname == "path_corner" || self.movetarget.classname == "rhostage") self.th_walk (); else self.pausetime = 99999999; self.th_stand (); } else { self.pausetime = 99999999; self.th_stand (); } // spread think times so they don't all happen at same time self.nextthink = self.nextthink + random()*0.5; }; void() walkmonster_start = { // delay drop to floor to make sure all doors have been spawned // spread think times so they don't all happen at same time self.nextthink = self.nextthink + random()*0.5; self.think = walkmonster_start_go; total_monsters = total_monsters + 1; }; void() flymonster_start_go = { self.takedamage = DAMAGE_AIM; self.ideal_yaw = self.angles * '0 1 0'; if (!self.yaw_speed) self.yaw_speed = 10; self.view_ofs = '0 0 25'; self.use = monster_use; self.flags = self.flags | FL_FLY; self.flags = self.flags | FL_MONSTER; if (!walkmove(0,0)) { dprint ("flymonster in wall at: "); dprint (vtos(self.origin)); dprint ("\n"); } if (self.target) { self.goalentity = self.movetarget = find(world, targetname, self.target); if (!self.movetarget) { dprint ("Monster can't find target at "); dprint (vtos(self.origin)); dprint ("\n"); } // this used to be an objerror if (self.movetarget.classname == "path_corner") self.th_walk (); else self.pausetime = 99999999; self.th_stand (); } else { self.pausetime = 99999999; self.th_stand (); } }; void() flymonster_start = { // spread think times so they don't all happen at same time self.nextthink = self.nextthink + random()*0.5; self.think = flymonster_start_go; total_monsters = total_monsters + 1; }; void() swimmonster_start_go = { if (deathmatch) { remove(self); return; } self.takedamage = DAMAGE_AIM; total_monsters = total_monsters + 1; self.ideal_yaw = self.angles * '0 1 0'; if (!self.yaw_speed) self.yaw_speed = 10; self.view_ofs = '0 0 10'; self.use = monster_use; self.flags = self.flags | FL_SWIM; self.flags = self.flags | FL_MONSTER; if (self.target) { self.goalentity = self.movetarget = find(world, targetname, self.target); if (!self.movetarget) { dprint ("Monster can't find target at "); dprint (vtos(self.origin)); dprint ("\n"); } // this used to be an objerror self.ideal_yaw = vectoyaw(self.goalentity.origin - self.origin); self.th_walk (); } else { self.pausetime = 99999999; self.th_stand (); } // spread think times so they don't all happen at same time self.nextthink = self.nextthink + random()*0.5; }; void() swimmonster_start = { // spread think times so they don't all happen at same time self.nextthink = self.nextthink + random()*0.5; self.think = swimmonster_start_go; total_monsters = total_monsters + 1; };