hexen2-hw-hc/fireball.hc

145 lines
3.0 KiB
C++

/*
* $Header: /HexenWorld/HCode/fireball.hc 1 2/04/98 1:59p Rjohnson $
*/
/*
==============================================================================
FIREBALL
==============================================================================
*/
// For building the model
$cd c:\model\fireball // Directory to find model in
$origin 0 0 0
// baseframe is in iceimp.3ds
$base fireball
// skin is in iceimp.lbm
$skin fireball
// Imp throwing
$frame firbal1 firbal2 firbal3 firbal4 firbal5
$frame firbal6 firbal7 firbal8 firbal9 firbal10
//============================================================================
void FireFizzle (void)
{
sound (self, CHAN_WEAPON, "misc/fout.wav", 1, ATTN_NORM);
DeathBubbles(1);
remove(self);
}
void() fireballTouch =
{
local float damg;
if (other == self.owner)
return; // don't explode on owner
if (pointcontents(self.origin) == CONTENT_SKY)
{
remove(self);
return;
}
if (self.dmg == -1)
damg = random(5,10);
else if (self.dmg)
damg = self.dmg;
else
damg = random(12,22);
if (other.health)
{
if (self.owner.classname == "cube_of_force")
T_Damage (other, self.owner, self.owner.owner, damg );
else
T_Damage (other, self, self.owner, damg );
}
// don't do radius damage to the other, because all the damage
// was done in the impact
T_RadiusDamage (self, self.owner, damg, other);
// sound (self, CHAN_WEAPON, "weapons/explode.wav", 1, ATTN_NORM);
self.origin = self.origin - 8*normalize(self.velocity);
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_EXPLOSION);
WriteCoord (MSG_BROADCAST, self.origin_x);
WriteCoord (MSG_BROADCAST, self.origin_y);
WriteCoord (MSG_BROADCAST, self.origin_z);
remove(self);
// BecomeExplosion ();
};
//============================================================================
void fireball_1(void)
{
float retval;
self.nextthink = time + HX_FRAME_TIME;
retval = AdvanceFrame($firbal1,$firbal10);
if (retval == AF_BEGINNING)
{
if (pointcontents(self.origin) != CONTENT_EMPTY)
FireFizzle();
}
}
//============================================================================
void(vector offset) do_fireball =
{
entity missile;
vector vec;
missile = spawn ();
missile.owner = self;
missile.speed=500;
if(self.classname=="monster_imp_lord")
{
missile.dmg=random(80,120);
missile.speed+=500;
missile.scale=2;
}
else
missile.dmg = self.dmg;
missile.movetype = MOVETYPE_FLYMISSILE;
missile.solid = SOLID_BBOX;
missile.health = 10;
setmodel (missile, "models/fireball.mdl");
setsize (missile, '0 0 0', '0 0 0');
// set missile speed
makevectors (self.angles);
vec = self.origin + self.view_ofs + v_factor(offset);
setorigin (missile, vec);
vec = self.enemy.origin - missile.origin + self.enemy.view_ofs;
vec = normalize(vec);
missile.velocity = (vec+aim_adjust(self.enemy))*missile.speed;
missile.angles = vectoangles('0 0 0'-missile.velocity);
missile.touch = fireballTouch;
missile.think = fireball_1;
missile.nextthink = time + HX_FRAME_TIME;
};