hexen2/H2MP/hcode/impulse.hc
2000-11-10 00:00:00 +00:00

1097 lines
22 KiB
C++

/*
* $Header: /H2 Mission Pack/HCode/impulse.hc 32 3/27/98 2:14p Mgummelt $
*/
void PlayerAdvanceLevel(float NewLevel);
void player_level_cheat(void);
void player_experience_cheat(void);
void Polymorph (entity loser);
void()sheep_look;
//void create_swarm (void);
void wake_sheep ()
{
entity found;
float r;
if(self.attack_finished>time)
return;
if(self.sheep_call>time)
return;
self.sheep_call=time+2;
sheep_sound(1);
found=find(world,classname,"player_sheep");
while(found)
{
if(infront(found))
r=random();
else
r=random(5);
if(r<0.5)
{
found.think=sheep_look;
thinktime found : 0;
}
found=find(found,classname,"player_sheep");
}
}
void restore_weapon ()
{//FIXME: use idle, not select
self.weaponframe = 0;
if (self.playerclass==CLASS_PALADIN)
{
switch (self.weapon)
{
case IT_WEAPON1:
self.weaponmodel = "models/gauntlet.mdl";
break;
case IT_WEAPON2:
self.weaponmodel = "models/vorpal.mdl";
break;
case IT_WEAPON3:
self.weaponmodel = "models/axe.mdl";
break;
case IT_WEAPON4:
self.weaponmodel = "models/purifier.mdl";
break;
}
}
else if (self.playerclass==CLASS_CRUSADER)
{
switch (self.weapon)
{
case IT_WEAPON1:
self.weaponmodel = "models/warhamer.mdl";
break;
case IT_WEAPON2:
self.weaponmodel = "models/icestaff.mdl";
break;
case IT_WEAPON3:
self.weaponmodel = "models/meteor.mdl";
break;
case IT_WEAPON4:
self.weaponmodel = "models/sunstaff.mdl";
break;
}
}
else if (self.playerclass==CLASS_NECROMANCER)
{
switch (self.weapon)
{
case IT_WEAPON1:
self.weaponmodel = "models/sickle.mdl";
break;
case IT_WEAPON2:
self.weaponmodel = "models/spllbook.mdl"; // FIXME: still need these models
break;
case IT_WEAPON3:
self.weaponmodel = "models/spllbook.mdl";
break;
case IT_WEAPON4:
self.weaponmodel = "models/ravenstf.mdl";
break;
}
}
else if (self.playerclass==CLASS_ASSASSIN)
{
switch (self.weapon)
{
case IT_WEAPON1:
self.weaponmodel = "models/punchdgr.mdl";
break;
case IT_WEAPON2:
self.weaponmodel = "models/crossbow.mdl";
break;
case IT_WEAPON3:
self.weaponmodel = "models/v_assgr.mdl";
break;
case IT_WEAPON4:
self.weaponmodel = "models/scarabst.mdl";
break;
}
}
else if (self.playerclass==CLASS_SUCCUBUS)
{
switch (self.weapon)
{
case IT_WEAPON1:
self.weaponmodel = "models/sucwp1.mdl";
break;
case IT_WEAPON2:
self.weaponmodel = "models/sucwp2.mdl";
break;
case IT_WEAPON3:
self.weaponmodel = "models/sucwp3.mdl";
break;
case IT_WEAPON4:
self.weaponmodel = "models/sucwp4.mdl";
break;
}
}
}
void see_coop_view ()
{
entity startent,found;
float gotone;
if(self.viewentity!=self)
centerprint(self,"Ally vision not available in chase camera mode\n");
if(!coop&&!teamplay)
{
centerprint(self,"Ally vision not available\n");
return;
}
if(self.cameramode==world)
startent=self;
else
startent=self.cameramode;
found=startent;
while(!gotone)
{
found=find(found,classname,"player");
if(found.flags&FL_CLIENT)
if((deathmatch&&teamplay&&found.team==self.team)||coop)
if(found.cameramode==world||found==self)
gotone=TRUE;
if(found==startent)
{
centerprint(self,"No allies available\n");
return;
}
}
if(found==self)
{
CameraReturn();
return;
}
centerprint(self,found.netname);
AllyVision(self,found);
self.weaponmodel=self.cameramode.weaponmodel;
self.weaponframe=self.cameramode.weaponframe;
}
void player_everything_cheat(void)
{
//RESET!
if(deathmatch||coop||skill>2)
return;
CheatCommand(); // Give them weapons and mana
Artifact_Cheat(); // Give them all artifacts
self.puzzles_cheat = 1; // Get them past puzzles
// Then they leave home and never call you. The ingrates.
}
void PrintFrags()
{
entity lastent;
lastent=nextent(world);
while(lastent)
{
if(lastent.classname=="player")
{
bprint(lastent.netname);
bprint(" (L-");
bprint(ftos(lastent.level));
switch (lastent.playerclass)
{
case CLASS_ASSASSIN:
bprint(" Assassin) ");
break;
case CLASS_SUCCUBUS:
bprint(" Demoness) ");
break;
case CLASS_PALADIN:
bprint(" Paladin) ");
break;
case CLASS_CRUSADER:
bprint(" Crusader) ");
break;
default:
bprint(" Necromancer) ");
break;
}
bprint(" FRAGS: ");
bprint(ftos(lastent.frags));
bprint(" (LF: ");
bprint(ftos(lastent.level_frags));
bprint(")\n");
}
lastent=find(lastent,classname,"player");
}
}
/*void()gravityup =
{
self.gravity+=0.01;
if(self.gravity==10)
self.gravity=0;
dprint("Gravity: ");
dprint(ftos(self.gravity));
dprint("\n");
};
void()gravitydown =
{
self.gravity-=0.01;
if(self.gravity==-10)
self.gravity=0;
dprint("Gravity: ");
dprint(ftos(self.gravity));
dprint("\n");
};
*/
void player_stopfly(void)
{
self.movetype = MOVETYPE_WALK;
self.idealpitch = cvar("sv_walkpitch");
self.idealroll = 0;
}
void player_fly(void)
{
self.movetype = MOVETYPE_FLY;
self.velocity_z = 100; // A little push up
self.hoverz = .4;
}
void HeaveHo (void)
{
vector dir;
float inertia, lift;
makevectors(self.v_angle);
dir=normalize(v_forward);
traceline(self.origin+self.proj_ofs,self.origin+self.proj_ofs+dir*48,FALSE,self);
if(trace_ent.movetype&&trace_ent.solid&&trace_ent!=world&&trace_ent.flags&FL_ONGROUND&&trace_ent.solid!=SOLID_BSP)
{
if(!trace_ent.mass)
inertia = 1;
else if(trace_ent.mass<=50)
inertia=trace_ent.mass/10;
else
inertia=trace_ent.mass/100;
lift=(self.strength/40+0.5)*300/inertia;
if(lift>300)
lift=300;
trace_ent.velocity_z+=lift;
if (trace_ent.flags&FL_ONGROUND)
trace_ent.flags-=FL_ONGROUND;
if(self.playerclass==CLASS_ASSASSIN||self.playerclass==CLASS_SUCCUBUS)
sound (self, CHAN_BODY,"player/assjmp.wav", 1, ATTN_NORM);
else
sound (self, CHAN_BODY,"player/paljmp.wav", 1, ATTN_NORM);
self.attack_finished=time+1;
}
}
/*
void AddServerFlag(float addflag)
{
addflag=byte_me(addflag+8);
dprintf("Serverflags were: %s\n",serverflags);
dprintf("Added flag %s\n",addflag);
serverflags(+)addflag;
dprintf("Serverflags are now: %s\n",serverflags);
}
*/
void makeplayer ()
{
newmis=spawn();
setmodel(newmis,self.model);
setorigin(newmis,self.origin);
newmis.frame = self.frame;
newmis.angles=self.angles;
newmis.think=SUB_Remove;
thinktime newmis : 10;
}
/*
============
ImpulseCommands
============
*/
void() ImpulseCommands =
{
entity search;
float total;
string printnum;
if(self.flags2&FL_CHAINED&&self.impulse!=23)
return;
if (self.impulse == 9&&skill<3)
CheatCommand ();
else if(self.impulse==177)//Make BBOX model
if(self.movechain.model=="models/playrbox.mdl")
{
remove(self.movechain);
self.movechain=world;
}
else
{
self.movechain=spawn();
setorigin(self.movechain,self.origin);
setmodel(self.movechain,"models/playrbox.mdl");
setsize(self.movechain,'-16 -16 0','16 16 56');
self.movechain.hull=HULL_PLAYER;
self.movechain.abslight=0.5;
self.movechain.drawflags(+)MLS_ABSLIGHT;
self.movechain.solid=SOLID_NOT;
self.movechain.movetype=MOVETYPE_NOCLIP;
self.movechain.angles='0 0 0';
}
else if(self.impulse==178)//test trace
if(self.flags2&FL2_TEST_TRACE)
self.flags2(-)FL2_TEST_TRACE;
else
self.flags2(+)FL2_TEST_TRACE;
else if (self.impulse == 99)
ClientKill();
else if (self.impulse == 23 ) // To use inventory item
UseInventoryItem ();
else if(self.impulse==33)
{
if(coop||teamplay)
see_coop_view();
else
centerprint(self,"Ally Vision Not Available\n");
}
else if(self.impulse==32)
PanicButton();
else if (self.impulse == 27)//Uncomment this for a good time!
ToggleChaseCam(self);
else if (self.impulse == 28&&(!coop)&&(!deathmatch))
makeplayer();
/* else if (self.impulse == 34)
{ // rjr - extremely temp - just for debugging purposes only
sprint(self,"Puzzle Inventory: [ ");
if (self.puzzle_inv1)
{
sprint(self,"(");
sprint(self,self.puzzle_inv1);
sprint(self,")");
}
if (self.puzzle_inv2)
{
sprint(self,"(");
sprint(self,self.puzzle_inv2);
sprint(self,")");
}
if (self.puzzle_inv3)
{
sprint(self,"(");
sprint(self,self.puzzle_inv3);
sprint(self,")");
}
if (self.puzzle_inv4)
{
sprint(self,"(");
sprint(self,self.puzzle_inv4);
sprint(self,")");
}
if (self.puzzle_inv5)
{
sprint(self,"(");
sprint(self,self.puzzle_inv5);
sprint(self,")");
}
if (self.puzzle_inv6)
{
sprint(self,"(");
sprint(self,self.puzzle_inv6);
sprint(self,")");
}
if (self.puzzle_inv7)
{
sprint(self,"(");
sprint(self,self.puzzle_inv7);
sprint(self,")");
}
if (self.puzzle_inv8)
{
sprint(self,"(");
sprint(self,self.puzzle_inv8);
sprint(self,")");
}
sprint(self," ] \n");
}*/
else if (self.impulse==35&&skill<3)
{
search = nextent(world);
total = 0;
while(search != world)
{
if (search.flags & FL_MONSTER)
{
total += 1;
remove(search);
}
search = nextent(search);
}
dprintf("Removed %s monsters\n",total);
}
else if (self.impulse==36&&skill<3)
{
search = nextent(world);
total = 0;
while(search != world)
{
if (search.flags & FL_MONSTER)
{
total += 1;
thinktime search : 99999;
}
search = nextent(search);
}
dprintf("Froze %s monsters\n",total);
}
else if (self.impulse==37&&skill<3)
{
search = nextent(world);
total = 0;
while(search != world)
{
if (search.flags & FL_MONSTER)
{
total += 1;
thinktime search : HX_FRAME_TIME;
}
search = nextent(search);
}
dprintf("UnFroze %s monsters\n",total);
}
/* else if (self.impulse==38)
{
sprint(self,"Class: ");
s2 = ftos(self.playerclass);
sprint(self,s2);
sprint(self,"\n");
sprint(self," Hit Points: ");
s2 = ftos(self.health);
sprint(self,s2);
s2 = ftos(self.max_health);
sprint(self,"/");
sprint(self,s2);
sprint(self,"\n");
sprint(self," Strength: ");
s2 = ftos(self.strength);
sprint(self,s2);
sprint(self,"\n");
sprint(self," Intelligence: ");
s2 = ftos(self.intelligence);
sprint(self,s2);
sprint(self,"\n");
sprint(self," Wisdom: ");
s2 = ftos(self.wisdom);
sprint(self,s2);
sprint(self,"\n");
sprint(self," Dexterity: ");
s2 = ftos(self.dexterity);
sprint(self,s2);
sprint(self,"\n");
}*/
else if(self.impulse==25&&skill<3)
{
//reset!
if(deathmatch||coop)
{
self.impulse=0;
return;
}
else
{
self.cnt_tome += 1;
Use_TomeofPower();
}
}
else if(self.impulse==39&&skill<3)
{
if(deathmatch||coop)
{
self.impulse=0;
return;
}
else // Toggle flight
{
if (self.movetype != MOVETYPE_FLY)
player_fly();
else
player_stopfly();
}
}
else if(self.impulse==40&&skill<3)
{
//reset!
if(deathmatch||coop)
{
self.impulse=0;
return;
}
else
player_level_cheat();
}
else if(self.impulse==41&&skill<3)
{
if(deathmatch||coop)
{
self.impulse=0;
return;
}
else
player_experience_cheat();
}
else if (self.impulse == 42)
{
sprint(self,"Coordinates: ");
printnum=vtos(self.origin);
sprint(self,printnum);
sprint(self,"\n");
sprint(self,"Angles: ");
printnum=vtos(self.angles);
sprint(self,printnum);
sprint(self,"\n");
sprint(self,"Map is ");
sprint(self,mapname);
sprint(self,"\n");
}
else if(self.impulse==43&&skill<3)
player_everything_cheat();
else if(self.impulse==44)
DropInventoryItem();
/* else if (self.impulse == 99)
{ // RJ's test impulse
search = nextent(world);
total = 0;
while(search != world)
{
if (search.classname == "monster_fish")
{
total += 1;
dprintf("%s. ",total);
dprintv("%s\n",search.origin);
}
search = nextent(search);
}
}*/
else if (self.impulse >= 100 && self.impulse <= 115)
{
Inventory_Quick(self.impulse - 99);
}
else if (self.impulse == 254)
{
sprint(self,"King of the Hill is ");
search=FindExpLeader();
sprint(self,search.netname);
sprint(self," (EXP = ");
sprint(self,ftos(search.experience));
sprint(self,") \n");
}
else if (self.impulse == 255)
PrintFrags();
//On the fly class changing only works in network because of selective precaching
else if (self.impulse>170&&self.impulse<176&&cvar("registered"))
{
if(!coop&&!deathmatch)
{
centerprint(self,"Cannot switch classes on the fly in single player...\n");
self.impulse=0;
return;
}
if(randomclass)
{
centerprint(self,"Cannot switch classes with randomclass active...\n");
self.impulse=0;
return;
}
if(self.level<3)
{
centerprint(self,"You must have achieved level 3 or higher to change class!\n");
self.impulse=0;
return;
}
if(self.impulse==171)//Quick Class-change hot-keys
if(self.playerclass==CLASS_PALADIN)
{
self.impulse=0;
return;
}
else
self.newclass=CLASS_PALADIN;
else if(self.impulse==172)
if(self.playerclass==CLASS_CRUSADER)
{
self.impulse=0;
return;
}
else
self.newclass=CLASS_CRUSADER;
else if(self.impulse==173)
if(self.playerclass==CLASS_NECROMANCER)
{
self.impulse=0;
return;
}
else
self.newclass=CLASS_NECROMANCER;
else if(self.impulse==174)
if(self.playerclass==CLASS_ASSASSIN)
{
self.impulse=0;
return;
}
else
self.newclass=CLASS_ASSASSIN;
else if(self.impulse==175)
if(self.playerclass==CLASS_SUCCUBUS)
{
self.impulse=0;
return;
}
else
self.newclass=CLASS_SUCCUBUS;
self.effects=self.drawflags=FALSE;
remove_invincibility(self);
self.playerclass=self.newclass;//So it drops exp the right amount
drop_level(self,2);
newmis=spawn();
newmis.classname="classchangespot";
newmis.angles=self.angles;
setorigin(newmis,self.origin);
//what's this - it's code for single play which we don't need anymore
// if(!deathmatch&&!coop)
// parm7=self.newclass;//Just to tell respawn() not to use restart
// else
{
self.model=self.init_model;
GibPlayer();
self.frags -= 2; // extra penalty
}
respawn ();
}
if(self.model=="models/sheep.mdl")
{
self.impulse=0;
return;
}
/* if (self.impulse >= 1 && self.impulse <= 4)
W_ChangeWeapon ();
else if ((self.impulse == 10) && (wp_deselect == 0))
CycleWeaponCommand ();
else if (self.impulse == 11)
ServerflagsCommand ();
else if (self.impulse == 12)
CycleWeaponReverseCommand ();
else if(self.impulse == 13)
HeaveHo();
else if (self.impulse == 22 &&!self.flags2 & FL2_CROUCHED) // To crouch
{
if(self.flags2 & FL2_CROUCH_TOGGLE)
self.flags2(-)FL2_CROUCH_TOGGLE;
else
self.flags2(+)FL2_CROUCH_TOGGLE;
// PlayerCrouch();
}
*/
switch (self.impulse)
{
case 1..4:
W_ChangeWeapon();
break;
case 10:
if (wp_deselect == 0)
CycleWeaponCommand ();
break;
case 11:
ServerflagsCommand ();
break;
case 12:
CycleWeaponReverseCommand ();
break;
case 13:
HeaveHo();
break;
case 14:
if(world.target=="sheep")
wake_sheep();
else if(skill<3)
Polymorph(self);
break;
case 22:
if (!self.flags2 & FL2_CROUCHED)
{
if(self.flags2 & FL2_CROUCH_TOGGLE)
self.flags2(-)FL2_CROUCH_TOGGLE;
else
self.flags2(+)FL2_CROUCH_TOGGLE;
}
break;
}
self.impulse = 0;
};
/*
* $Log: /H2 Mission Pack/HCode/impulse.hc $
*
* 32 3/27/98 2:14p Mgummelt
* Sheephunt fix
*
* 31 3/23/98 5:48p Mgummelt
*
* 30 3/19/98 6:32p Mgummelt
*
* 29 3/19/98 2:26p Mgummelt
*
* 28 3/19/98 12:17a Mgummelt
* last bug fixes
*
* 27 3/17/98 11:02a Mgummelt
*
* 26 3/16/98 8:39p Mgummelt
*
* 25 3/16/98 8:31p Jweier
*
* 24 3/13/98 4:34p Mgummelt
*
* 23 3/12/98 10:25p Jmonroe
*
* 22 3/11/98 9:21p Mgummelt
*
* 21 3/11/98 7:47p Mgummelt
*
* 20 3/11/98 7:12p Mgummelt
*
* 19 3/11/98 6:20p Mgummelt
*
* 18 3/09/98 8:08p Mgummelt
*
* 17 3/06/98 4:55p Mgummelt
*
* 16 3/06/98 12:35a Jmonroe
* made caserange work, switched some more things
*
* 15 3/02/98 12:17p Mgummelt
*
* 14 3/02/98 11:51a Mgummelt
*
* 13 3/01/98 3:49p Mgummelt
*
* 12 2/13/98 11:16a Jmonroe
* changed succubus to demoness, made her water time the same as others
*
* 11 2/12/98 5:55p Jmonroe
* remove unreferenced funcs
*
* 10 2/08/98 4:28p Mgummelt
*
* 9 2/06/98 2:10p Mgummelt
*
* 8 1/22/98 5:52p Mgummelt
*
* 7 1/19/98 6:20p Mgummelt
*
* 6 1/13/98 3:35p Mgummelt
*
* 126 10/28/97 1:01p Mgummelt
* Massive replacement, rewrote entire code... just kidding. Added
* support for 5th class.
*
* 123 10/23/97 11:38a Mgummelt
*
* 122 10/16/97 5:06p Mgummelt
*
* 121 10/07/97 11:59a Mgummelt
*
* 120 9/25/97 3:43p Mgummelt
*
* 119 9/23/97 5:18p Mgummelt
*
* 118 9/23/97 4:48p Mgummelt
*
* 117 9/11/97 4:21p Mgummelt
*
* 116 9/11/97 3:38p Mgummelt
*
* 115 9/10/97 11:39p Mgummelt
*
* 114 9/10/97 10:48p Mgummelt
*
* 113 9/10/97 7:50p Mgummelt
*
* 112 9/10/97 6:44p Mgummelt
*
* 111 9/09/97 3:45p Mgummelt
*
* 110 9/09/97 2:32p Rjohnson
* Removed cheats
*
* 109 9/01/97 9:32p Rlove
*
* 108 9/01/97 6:27p Rlove
*
* 107 9/01/97 3:38p Rlove
*
* 106 8/31/97 7:07p Rlove
*
* 105 8/31/97 2:36p Mgummelt
*
* 104 8/31/97 11:38a Mgummelt
* To which I say- shove where the sun don't shine- sideways! Yeah!
* How's THAT for paper cut!!!!
*
* 103 8/31/97 8:52a Mgummelt
*
* 102 8/27/97 9:22p Mgummelt
*
* 101 8/27/97 8:14p Mgummelt
*
* 100 8/25/97 6:08p Mgummelt
*
* 99 8/25/97 6:07p Mgummelt
*
* 98 8/25/97 4:06p Mgummelt
*
* 97 8/24/97 8:32p Mgummelt
*
* 96 8/24/97 4:35p Rlove
* Working on flight
*
* 95 8/23/97 8:24p Mgummelt
*
* 94 8/21/97 4:04p Rlove
*
* 93 8/21/97 10:55a Mgummelt
*
* 92 8/21/97 4:55a Mgummelt
*
* 91 8/21/97 4:23a Mgummelt
*
* 90 8/20/97 5:00p Mgummelt
*
* 89 8/20/97 5:48a Rlove
*
* 88 8/19/97 8:14p Mgummelt
*
* 87 8/19/97 2:12p Rjohnson
* Fix for inventory
*
* 86 8/19/97 12:57p Mgummelt
*
* 85 8/19/97 10:04a Rjohnson
* Removed camera stuff
*
* 84 8/18/97 1:46p Mgummelt
*
* 83 8/18/97 1:45p Mgummelt
*
* 82 8/18/97 11:25a Mgummelt
*
* 81 8/17/97 3:13a Mgummelt
*
* 80 8/15/97 4:39p Mgummelt
*
* 79 8/15/97 4:08p Rlove
*
* 78 8/15/97 3:23p Rlove
*
* 77 8/09/97 1:58a Mgummelt
*
* 76 8/09/97 1:56a Mgummelt
*
* 75 8/08/97 5:50p Rjohnson
* Quick use for inventory items
*
* 74 8/06/97 12:09a Bgokey
*
* 73 8/05/97 3:17p Rlove
*
* 72 8/01/97 4:40p Rlove
*
* 71 8/01/97 1:43a Mgummelt
*
* 70 7/31/97 6:36p Mgummelt
*
* 69 7/30/97 10:43p Mgummelt
*
* 68 7/28/97 7:50p Mgummelt
*
* 67 7/28/97 1:51p Mgummelt
*
* 66 7/26/97 8:38a Mgummelt
*
* 65 7/25/97 10:35p Mgummelt
*
* 64 7/25/97 9:50a Rlove
*
* 63 7/21/97 3:03p Rlove
*
* 62 7/18/97 4:25p Mgummelt
*
* 61 7/17/97 4:54p Rlove
*
* 60 7/17/97 1:53p Rlove
*
* 59 7/17/97 11:43a Mgummelt
*
* 58 7/16/97 8:12p Mgummelt
*
* 57 7/15/97 8:41p Mgummelt
*
* 56 7/15/97 2:31p Mgummelt
*
* 55 7/14/97 2:12p Mgummelt
*
* 54 7/08/97 3:09p Rlove
*
* 53 7/07/97 6:34p Rjohnson
* Added a test impulse
*
* 52 7/07/97 2:24p Mgummelt
*
* 51 7/03/97 4:43p Rlove
*
* 50 7/03/97 1:59p Rlove
*
* 49 7/03/97 11:40a Rjohnson
* Added an impulse to display coords
*
* 48 6/30/97 3:23p Mgummelt
*
* 47 6/30/97 9:41a Rlove
*
* 46 6/27/97 5:35p Mgummelt
*
* 45 6/23/97 4:50p Mgummelt
*
* 44 6/18/97 4:00p Mgummelt
*
* 43 6/18/97 2:44p Mgummelt
*
* 42 6/06/97 2:52p Rlove
* Artifact of Super Health now functions properly
*
* 41 6/05/97 4:44p Rlove
* Fly mode is network friendly now.
*
* 40 6/02/97 7:58p Mgummelt
*
* 39 5/31/97 9:29p Mgummelt
*
* 38 5/28/97 1:43p Rlove
* Plaques now activate when you bump into them.
*
* 37 5/27/97 8:22p Mgummelt
*
* 36 5/27/97 9:23a Rlove
*
* 35 5/27/97 8:57a Rlove
* Plaques work again. proj_ofs needed to be added to the origin so you
* could 'see' the plaque
*
* 34 5/23/97 11:51p Mgummelt
*
* 33 5/23/97 1:29p Rlove
*
* 32 5/19/97 11:36p Mgummelt
*
* 31 5/15/97 11:43a Rjohnson
* Stats updates
*
* 30 5/14/97 3:36p Rjohnson
* Inital stats implementation
*
* 29 5/13/97 2:18p Rjohnson
* Added some monster removing impulses
*
* 28 5/12/97 11:12p Mgummelt
*
* 27 5/08/97 5:47p Mgummelt
*
* 26 5/06/97 1:29p Mgummelt
*
* 25 5/05/97 10:09p Mgummelt
*
* 24 5/02/97 8:06p Mgummelt
*
* 23 4/26/97 3:52p Mgummelt
*
* 22 4/25/97 8:32p Mgummelt
*
* 21 4/22/97 5:55p Mgummelt
*
* 20 4/19/97 1:01p Rjohnson
* Added a puzzle inventory impulse
*
* 19 4/17/97 1:45p Mgummelt
*
* 18 4/16/96 11:51p Mgummelt
*
* 17 4/13/96 3:30p Mgummelt
*
* 16 4/09/96 8:29p Mgummelt
*
* 15 4/09/96 4:43p Mgummelt
*
* 14 4/09/97 11:07a Mgummelt
*
* 13 4/07/97 6:30p Mgummelt
*
* 12 4/07/97 3:09p Mgummelt
*
* 11 4/07/97 2:50p Mgummelt
*
* 10 4/07/97 1:46p Mgummelt
*
* 9 4/04/97 6:37p Mgummelt
*
* 8 4/04/97 5:40p Rlove
*
* 7 3/18/97 7:37a Rlove
* Added tome of power
*
* 6 2/12/97 10:17a Rlove
*
* 5 1/07/97 3:23p Rlove
* Fixed plaque problem
*
* 4 12/30/96 8:31a Rlove
* Changing the use command
*
* 3 12/26/96 1:32p Rlove
* Took out old impulses
*
* 2 11/12/96 2:39p Rlove
* Updates for the inventory system. Torch, HP boost and Super HP Boost.
*/