hexen2-siege-hc/soul.hc
1998-06-24 00:00:00 +00:00

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;
}