gzdoom/wadsrc/static/zscript/actors/doom/lostsoul.zs
Christoph Oelckers cf74118d53 - fixed the extremely long standing bug that Lost Souls didn't reacquire their target when slamming into something.
This was one of that annoying old design mistakes where Doom and Heretic features were poorly merged together. The Heretic Gargoyle uses very similar coding but performs a subtly different action when actually hitting another actor. This different action was made the default, even for the Lost Soul.
It has now been changed that both monsters use their original action, being distinguished by an actor flag. For compatibility with custom definitions Heretic's behavior, which has been the default in ZDoom will be the preferred one. The one of the Lost Soul can be reactivated by a flag.
2019-08-11 09:00:29 +02:00

122 lines
2.2 KiB
Text

//===========================================================================
//
// Lost Soul
//
//===========================================================================
class LostSoul : Actor
{
Default
{
Health 100;
Radius 16;
Height 56;
Mass 50;
Speed 8;
Damage 3;
PainChance 256;
Monster;
+FLOAT +NOGRAVITY +MISSILEMORE +DONTFALL +NOICEDEATH +ZDOOMTRANS +RETARGETAFTERSLAM
AttackSound "skull/melee";
PainSound "skull/pain";
DeathSound "skull/death";
ActiveSound "skull/active";
RenderStyle "SoulTrans";
Obituary "$OB_SKULL";
Tag "$FN_LOST";
}
States
{
Spawn:
SKUL AB 10 BRIGHT A_Look;
Loop;
See:
SKUL AB 6 BRIGHT A_Chase;
Loop;
Missile:
SKUL C 10 BRIGHT A_FaceTarget;
SKUL D 4 BRIGHT A_SkullAttack;
SKUL CD 4 BRIGHT;
Goto Missile+2;
Pain:
SKUL E 3 BRIGHT;
SKUL E 3 BRIGHT A_Pain;
Goto See;
Death:
SKUL F 6 BRIGHT;
SKUL G 6 BRIGHT A_Scream;
SKUL H 6 BRIGHT;
SKUL I 6 BRIGHT A_NoBlocking;
SKUL J 6;
SKUL K 6;
Stop;
}
}
class BetaSkull : LostSoul
{
States
{
Spawn:
SKUL A 10 A_Look;
Loop;
See:
SKUL BCDA 5 A_Chase;
Loop;
Missile:
SKUL E 4 A_FaceTarget;
SKUL F 5 A_BetaSkullAttack;
SKUL F 4;
Goto See;
Pain:
SKUL G 4;
SKUL H 2 A_Pain;
Goto See;
SKUL I 4;
Goto See;
Death:
SKUL JKLM 5;
SKUL N 5 A_Scream;
SKUL O 5;
SKUL P 5 A_Fall;
SKUL Q 5 A_Stop;
Wait;
}
}
//===========================================================================
//
// Code (must be attached to Actor)
//
//===========================================================================
extend class Actor
{
const DEFSKULLSPEED = 20;
void A_SkullAttack(double skullspeed = DEFSKULLSPEED)
{
if (target == null) return;
if (skullspeed <= 0) skullspeed = DEFSKULLSPEED;
bSkullfly = true;
A_PlaySound(AttackSound, CHAN_VOICE);
A_FaceTarget();
VelFromAngle(skullspeed);
Vel.Z = (target.pos.Z + target.Height/2 - pos.Z) / DistanceBySpeed(target, skullspeed);
}
void A_BetaSkullAttack()
{
if (target == null || target.GetSpecies() == self.GetSpecies()) return;
A_PlaySound(AttackSound, CHAN_WEAPON);
A_FaceTarget();
int damage = GetMissileDamage(7,1);
target.DamageMobj(self, self, damage, 'None');
}
}