314 lines
7 KiB
C++
314 lines
7 KiB
C++
/*
|
|
* $Header: /HexenWorld/HCode/soul.hc 3 4/01/98 5:01p Rmidthun $
|
|
*/
|
|
|
|
// Possible improvement: Make model shrink before disappearing
|
|
|
|
void () crusader_soul_touch =
|
|
{
|
|
if(!other.flags2&FL_ALIVE)
|
|
return;
|
|
|
|
if ((other.classname == "player") && (other.playerclass==CLASS_CRUSADER))
|
|
{
|
|
sound (self, CHAN_VOICE, "items/artpkup.wav", 1, ATTN_NORM);
|
|
other.super_damage_time = time + 30;
|
|
other.super_damage = 1;
|
|
other.super_damage_low = 0;
|
|
|
|
self.touch = SUB_Null;
|
|
self.think=SUB_Remove;
|
|
thinktime self : HX_FRAME_TIME * 2;
|
|
|
|
self.enemy.think=SUB_Remove;
|
|
thinktime self.enemy : HX_FRAME_TIME * 2;
|
|
|
|
sprint (other, PRINT_MEDIUM, "You now have Holy Strength!\n");
|
|
}
|
|
// Bad people are hurt by this
|
|
else if ((other.classname == "player") &&
|
|
((other.playerclass==CLASS_NECROMANCER) ||
|
|
(other.playerclass==CLASS_SUCCUBUS) ||
|
|
(other.playerclass==CLASS_ASSASSIN)))
|
|
{
|
|
if (self.pain_finished < time)
|
|
T_Damage (other, self, self, 5);
|
|
self.pain_finished = time + .2;
|
|
}
|
|
};
|
|
|
|
void () necro_soul_touch =
|
|
{
|
|
if(!other.flags2&FL_ALIVE)
|
|
return;
|
|
|
|
if ((other.classname == "player") && (other.playerclass==CLASS_NECROMANCER))
|
|
{
|
|
sound (self, CHAN_VOICE, "items/artpkup.wav", 1, ATTN_NORM);
|
|
other.health += self.health;
|
|
if (other.health>other.max_health)
|
|
other.health = other.max_health;
|
|
|
|
other.bluemana += self.bluemana;
|
|
if (other.bluemana > other.max_mana)
|
|
other.bluemana = other.max_mana;
|
|
|
|
other.greenmana += self.greenmana;
|
|
if (other.greenmana > other.max_mana)
|
|
other.greenmana = other.max_mana;
|
|
|
|
sprint (other, PRINT_MEDIUM, "You have devoured a life force!\n");
|
|
|
|
self.touch = SUB_Null;
|
|
self.think=SUB_Remove;
|
|
thinktime self : HX_FRAME_TIME * 2;
|
|
|
|
self.enemy.think=SUB_Remove;
|
|
thinktime self.enemy : HX_FRAME_TIME * 2;
|
|
|
|
}
|
|
// Good people are hurt by this
|
|
else if ((other.classname == "player") &&
|
|
((other.playerclass==CLASS_PALADIN) || (other.playerclass==CLASS_CRUSADER)))
|
|
{
|
|
if (self.pain_finished < time)
|
|
T_Damage (other, self, self, 5);
|
|
self.pain_finished = time + .2;
|
|
|
|
}
|
|
};
|
|
|
|
void () soul_move =
|
|
{
|
|
vector vel;
|
|
float p_color;
|
|
|
|
self.velocity_z += self.hoverz;
|
|
if (self.velocity_z > 16)
|
|
self.hoverz = -1;
|
|
else if (self.velocity_z < -16 )
|
|
self.hoverz = 1;
|
|
|
|
if (self.classname == "soulskull")
|
|
{
|
|
p_color = 144;
|
|
vel = randomv('-1.44 -1.44 -65', '1.44 1.44 -35');
|
|
particle2(self.origin - '0 0 20',vel,vel,p_color,PARTICLETYPE_C_EXPLODE,self.health/4);
|
|
}
|
|
|
|
else if (self.classname == "soulcross")
|
|
{
|
|
p_color = 176;
|
|
vel = randomv('-1.44 -1.44 65', '1.44 1.44 35');
|
|
particle2(self.origin +'0 0 25',vel,vel,p_color,PARTICLETYPE_C_EXPLODE,self.health/4);
|
|
}
|
|
|
|
setorigin (self.enemy, self.origin); // Move the ball with it
|
|
|
|
self.health -= 0.1;
|
|
|
|
self.think = soul_move;
|
|
thinktime self : 0.1;
|
|
if (self.sound_time < time)
|
|
{
|
|
self.sound_time = time + 4;
|
|
sound (self, CHAN_VOICE, "raven/soul.wav", 1, ATTN_NORM);
|
|
}
|
|
|
|
if (self.health <= 0)
|
|
{
|
|
stopSound(self,CHAN_VOICE);
|
|
//sound (self, CHAN_VOICE, "misc/null.wav", 1, ATTN_NORM);
|
|
remove(self);
|
|
remove(self.enemy);
|
|
}
|
|
};
|
|
|
|
|
|
void necromancer_sphere (entity ent)
|
|
{
|
|
entity new,new2;
|
|
float chance;
|
|
|
|
chance = .05 + ((ent.level - 3) * .03);
|
|
if (chance > .2)
|
|
chance = .2;
|
|
|
|
if (random() > chance)
|
|
return;
|
|
|
|
new2 = spawn();
|
|
|
|
new2.owner = new;
|
|
new2.solid = SOLID_TRIGGER;
|
|
new2.movetype = MOVETYPE_FLY;
|
|
|
|
droptofloor();
|
|
setorigin (new2, self.origin + '0 0 32');
|
|
setmodel (new2, "models/soulskul.mdl");
|
|
new2.classname = "soulskull";
|
|
setsize (new2, new2.mins , new2.maxs);
|
|
new2.think = soul_move;
|
|
thinktime new2 : 0.1;
|
|
new2.hoverz=1;
|
|
new2.velocity_z=new.hoverz;
|
|
new2.touch = necro_soul_touch;
|
|
new2.flags=0;
|
|
new2.lifespan = 15; // Alive for 15 seconds
|
|
new2.health = new2.lifespan * 2;
|
|
|
|
new2.avelocity_y = 200;
|
|
sound (new, CHAN_VOICE,"raven/soul.wav", 1, ATTN_NORM);
|
|
|
|
|
|
new = spawn();
|
|
new.owner = new;
|
|
new.solid = SOLID_TRIGGER;
|
|
new.movetype = MOVETYPE_FLY;
|
|
|
|
setmodel (new, "models/soulball.mdl");
|
|
|
|
setsize (new, new.mins , new.maxs);
|
|
new.flags=0;
|
|
setorigin (new, new2.origin);
|
|
|
|
new2.enemy = new;
|
|
|
|
}
|
|
|
|
void crusader_sphere (entity ent)
|
|
{
|
|
local entity new,new2;
|
|
float chance;
|
|
|
|
chance = .05 + ((ent.level - 3) * .03);
|
|
if (chance > .2)
|
|
chance = .2;
|
|
|
|
if (random() > chance)
|
|
return;
|
|
|
|
new2 = spawn();
|
|
|
|
new2.owner = new2;
|
|
new2.solid = SOLID_TRIGGER;
|
|
new2.movetype = MOVETYPE_FLY;
|
|
|
|
droptofloor();
|
|
setorigin (new2, self.origin + '0 0 32');
|
|
setmodel (new2, "models/cross.mdl");
|
|
|
|
setsize (new2, new2.mins , new2.maxs);
|
|
new2.classname = "soulcross";
|
|
new2.touch = crusader_soul_touch;
|
|
new2.think = soul_move;
|
|
thinktime new2 : 0.1;
|
|
new2.hoverz=1;
|
|
new2.velocity_z=new.hoverz;
|
|
new2.flags=0;
|
|
new2.lifespan = 15; // Alive for 15 seconds
|
|
new2.health = new2.lifespan * 2;
|
|
|
|
new2.avelocity_y = 200;
|
|
sound (new, CHAN_VOICE, "raven/soul.wav", 1, ATTN_NORM);
|
|
|
|
|
|
new = spawn();
|
|
|
|
new.owner = new;
|
|
new.solid = SOLID_TRIGGER;
|
|
new.movetype = MOVETYPE_FLY;
|
|
|
|
setorigin (new, new2.origin);
|
|
setmodel (new, "models/goodsphr.mdl");
|
|
|
|
new.drawflags (+) MLS_ABSLIGHT;
|
|
|
|
setsize (new, new.mins , new.maxs);
|
|
new.hoverz=1;
|
|
new.velocity_z=new.hoverz;
|
|
new.flags=0;
|
|
new.lifespan = 15; // Alive for 15 seconds
|
|
new.health = new.lifespan * 2;
|
|
new.sound_time = 2;
|
|
|
|
new2.enemy = new;
|
|
}
|
|
|
|
/*
|
|
* $Log: /HexenWorld/HCode/soul.hc $
|
|
*
|
|
* 3 4/01/98 5:01p Rmidthun
|
|
* crusader's "soul" should damage demoness
|
|
*
|
|
* 2 3/27/98 1:34p Mgummelt
|
|
* Adding PHS_OVERRIDE_R channel flag and ATTN_LOOP to all door and plat
|
|
* sounds, replacing all "null.wav" sounds with stopSound.
|
|
*
|
|
* 1 2/04/98 1:59p Rjohnson
|
|
*
|
|
* 27 9/02/97 9:20p Rlove
|
|
*
|
|
* 26 9/01/97 12:18a Rlove
|
|
*
|
|
* 25 9/01/97 12:13a Rlove
|
|
*
|
|
* 24 8/30/97 2:29p Jweier
|
|
*
|
|
* 23 8/29/97 1:00p Mgummelt
|
|
* Spheres were floating too high
|
|
*
|
|
* 22 8/07/97 5:45p Rlove
|
|
*
|
|
* 21 8/06/97 10:14p Mgummelt
|
|
*
|
|
* 20 8/06/97 11:12a Rlove
|
|
*
|
|
* 19 8/04/97 12:33p Rlove
|
|
*
|
|
* 18 8/01/97 4:48p Rlove
|
|
*
|
|
* 17 8/01/97 4:38p Rlove
|
|
*
|
|
* 16 7/21/97 3:03p Rlove
|
|
*
|
|
* 15 7/01/97 11:23a Rlove
|
|
*
|
|
* 14 7/01/97 11:06a Rlove
|
|
*
|
|
* 13 7/01/97 9:46a Rlove
|
|
* Crusader soul sphere is in. It does double damage.
|
|
*
|
|
* 12 6/30/97 7:30p Rlove
|
|
*
|
|
* 11 6/19/97 4:11p Rjohnson
|
|
* Optimization
|
|
*
|
|
* 10 6/19/97 4:08p Rjohnson
|
|
* removed crandom()
|
|
*
|
|
* 9 6/18/97 10:46a Rjohnson
|
|
* Code cleanu
|
|
*
|
|
* 8 6/17/97 10:20a Rlove
|
|
*
|
|
* 7 6/16/97 8:04a Rlove
|
|
* Fixed null.wav error, also paladin weapons deplete mana now
|
|
*
|
|
* 6 6/03/97 10:48p Mgummelt
|
|
*
|
|
* 5 6/03/97 7:59a Rlove
|
|
* Change take_art.wav to artpkup.wav
|
|
*
|
|
* 4 5/15/97 6:34p Rjohnson
|
|
* Code cleanup
|
|
*
|
|
* 3 3/12/97 10:57p Rjohnson
|
|
* Changed the particle2 parameters to make it less taxing on the network
|
|
* and more versitile
|
|
*
|
|
* 2 2/03/97 4:42p Rlove
|
|
* Newest soul sphere
|
|
*
|
|
* 1 2/03/97 2:43p Rlove
|
|
*/
|