home *** CD-ROM | disk | FTP | other *** search
- /* 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
- // <code>
- // };
-
-
- /*
- ================
- 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;
- };
-
-
- void() SUB_Gib =
- {
- local vector x, y, v;
- local float r_num;
- r_num = random();
- if (r_num < 0.5) // Meat spray only, most of the time
- {
- x = '1 0 0';
- y = '0 1 0';
- v = x * (50 - random() * 100) + y * (50 - random() * 100);
- r_num = random();
- SpawnMeatSpray(self.origin, v);
- }
- else if (r_num < 0.7)
- ThrowGib("progs/gib1.mdl", self.health);
- else if (r_num < 0.9)
- ThrowGib("progs/gib2.mdl", self.health);
- else
- ThrowGib("progs/gib3.mdl", self.health);
- };
-
- void() MonsterCorpseGib =
- {
- ThrowGib ("progs/gib3.mdl", self.health);
- ThrowGib ("progs/gib3.mdl", self.health);
- ThrowGib ("progs/gib3.mdl", self.health);
- ThrowHead (self.weaponmodel, self.health);
- self.think = SUB_Null;
- };
-
-
- void() DropCorpse =
- {
- droptofloor();
- self.think = DropCorpse;
- self.nextthink = time + 0.5;
- };
-
-
- void(vector bb1, vector bb2, string headmdl) monster_corpse_setup =
- {
- setsize(self, bb1, bb2);
- self.weaponmodel = headmdl; // This should be unused in monsters
- self.health = 35;
- self.deadflag = DEAD_DYING;
- self.th_stand = SUB_Null;
- self.th_walk = SUB_Null;
- self.th_run = SUB_Null;
- self.th_pain = SUB_Gib;
- self.th_die = MonsterCorpseGib;
- self.th_melee = SUB_Null;
- self.th_missile = SUB_Null;
- self.takedamage= DAMAGE_AIM; // grenades explode
- };
-
-
- /*
- ================
- monster_death_use
-
- When a mosnter dies, it fires all of its targets with the current
- enemy as activator.
- ================
- */
- void() monster_death_use =
- {
- local entity ent, otemp, stemp;
-
- // 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 string stemp;
- local entity etemp;
-
- 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");
- }
-
- 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.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 < 3)
- {
- 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;
- };
-
-