237 lines
5.1 KiB
C++
237 lines
5.1 KiB
C++
/*
|
|
* $Header: /HexenWorld/Siege/soul.hc 5 5/25/98 1:39p Mgummelt $
|
|
*/
|
|
|
|
// 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;
|
|
}
|
|
|