mirror of
https://github.com/ZDoom/qzdoom-gpl.git
synced 2024-11-23 04:11:53 +00:00
3d61d2c1f4
Nothing should ever assume that spawning an actor is unconditionally successful. There can always be some edge cases where this is not the case.
201 lines
4.4 KiB
Text
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;
|
|
}
|
|
}
|
|
|
|
|
|
}
|