qzdoom-gpl/wadsrc/static/zscript/strife/strifefunctions.txt
Christoph Oelckers 3d61d2c1f4 - reviewd script code for spawn calls that did not check their results.
Nothing should ever assume that spawning an actor is unconditionally successful. There can always be some edge cases where this is not the case.
2016-12-31 15:40:51 +01:00

201 lines
4.4 KiB
Text

// common Strife action functions that are used by multiple different actors
extend class Actor
{
//============================================================================
void A_FLoopActiveSound()
{
if (ActiveSound != 0 && !(level.time & 7))
{
A_PlaySound (ActiveSound, CHAN_VOICE);
}
}
void A_LoopActiveSound()
{
A_PlaySound(ActiveSound, CHAN_VOICE, 1, true);
}
//============================================================================
//
//
//
//============================================================================
void A_Countdown()
{
if (--reactiontime <= 0)
{
ExplodeMissile ();
bSkullFly = false;
}
}
//============================================================================
//
// A_ClearSoundTarget
//
//============================================================================
void A_ClearSoundTarget()
{
CurSector.SoundTarget = null;
for (Actor mo = CurSector.thinglist; mo != null; mo = mo.snext)
{
mo.LastHeard = null;
}
}
//==========================================================================
//
// A_TossGib
//
//==========================================================================
void A_TossGib()
{
class <Actor> gibtype;
if (bNoBlood) gibtype = "Junk";
else gibtype = "Meat";
Actor gib = Spawn (gibtype, pos + (0,0,24), ALLOW_REPLACE);
if (gib == null)
{
return;
}
gib.Angle = random[GibTosser]() * (360 / 256.f);
gib.VelFromAngle(random[GibTosser]() & 15);
gib.Vel.Z = random[GibTosser]() & 15;
}
//==========================================================================
//
//
//
//==========================================================================
void A_ShootGun()
{
if (!target) return;
A_PlaySound ("monsters/rifle", CHAN_WEAPON);
A_FaceTarget ();
double pitch = AimLineAttack (angle, MISSILERANGE);
LineAttack (Angle + Random2[ShootGun]() * (11.25 / 256), MISSILERANGE, pitch, 3*(random[ShootGun]() % 5 + 1), 'Hitscan', "StrifePuff");
}
//==========================================================================
//
//
//
//==========================================================================
void A_SetShadow()
{
bShadow = true;
A_SetRenderStyle(HR_SHADOW, STYLE_Translucent);
}
void A_ClearShadow()
{
bShadow = false;
A_SetRenderStyle(1, STYLE_Normal);
}
//==========================================================================
//
//
//
//==========================================================================
void A_GetHurt()
{
bInCombat = true;
if ((random[HurtMe]() % 5) == 0)
{
A_PlaySound (PainSound, CHAN_VOICE);
health--;
}
if (health <= 0)
{
Die (target, target);
}
}
//==========================================================================
//
//
//
//==========================================================================
void A_DropFire()
{
Actor drop = Spawn("FireDroplet", pos + (0,0,24), ALLOW_REPLACE);
if (drop != null)
{
drop.Vel.Z = -1.;
}
A_Explode(64, 64, XF_NOSPLASH, damagetype: 'Fire');
}
//==========================================================================
//
//
//
//==========================================================================
void A_RemoveForceField()
{
bSpecial = false;
CurSector.RemoveForceField();
}
//==========================================================================
//
//
//
//==========================================================================
void A_AlertMonsters(double maxdist = 0, int flags = 0)
{
Actor target = null;
Actor emitter = self;
if (player != null || (Flags & AMF_TARGETEMITTER))
{
target = self;
}
else if (self.target != null && (self.target.player != null || (Flags & AMF_TARGETNONPLAYER)))
{
target = self.target;
}
if (Flags & AMF_EMITFROMTARGET) emitter = target;
if (target != null && emitter != null)
{
emitter.SoundAlert(target, false, maxdist);
}
}
//============================================================================
//
// A_RocketInFlight
//
//============================================================================
void A_RocketInFlight()
{
A_PlaySound ("misc/missileinflight", CHAN_VOICE);
SpawnPuff ("MiniMissilePuff", Pos, Angle - 180, Angle - 180, 2, PF_HITTHING);
Actor trail = Spawn("RocketTrail", Vec3Offset(-Vel.X, -Vel.Y, 0.), ALLOW_REPLACE);
if (trail != null)
{
trail.Vel.Z = 1;
}
}
}