gzdoom/wadsrc/static/zscript/doom/demon.txt
Christoph Oelckers a210aaea3e - fixed: All melee functions calling TraceBleed after DamageMobj must first copy the target member to a local variable.
DamageMobj can destroy the damaged actor if the death state sequence has zero duration. But Actor.target is a garbage collected member variable, i.e. it will be null, once the actor it points to gets destroyed.
This was originally done correctly in the C++ code but during the scriptification all those 'AActor *target = self->target' lines were removed because they looked redundant, but were not.
2017-06-06 09:12:58 +02:00

96 lines
1.8 KiB
Text

//===========================================================================
//
// Pink Demon
//
//===========================================================================
class Demon : Actor
{
Default
{
Health 150;
PainChance 180;
Speed 10;
Radius 30;
Height 56;
Mass 400;
Monster;
+FLOORCLIP
SeeSound "demon/sight";
AttackSound "demon/melee";
PainSound "demon/pain";
DeathSound "demon/death";
ActiveSound "demon/active";
Obituary "$OB_DEMONHIT";
}
States
{
Spawn:
SARG AB 10 A_Look;
Loop;
See:
SARG AABBCCDD 2 Fast A_Chase;
Loop;
Melee:
SARG EF 8 Fast A_FaceTarget;
SARG G 8 Fast A_SargAttack;
Goto See;
Pain:
SARG H 2 Fast;
SARG H 2 Fast A_Pain;
Goto See;
Death:
SARG I 8;
SARG J 8 A_Scream;
SARG K 4;
SARG L 4 A_NoBlocking;
SARG M 4;
SARG N -1;
Stop;
Raise:
SARG N 5;
SARG MLKJI 5;
Goto See;
}
}
//===========================================================================
//
// Spectre
//
//===========================================================================
class Spectre : Demon
{
Default
{
+SHADOW
RenderStyle "OptFuzzy";
Alpha 0.5;
SeeSound "spectre/sight";
AttackSound "spectre/melee";
PainSound "spectre/pain";
DeathSound "spectre/death";
ActiveSound "spectre/active";
HitObituary "$OB_SPECTREHIT";
}
}
//===========================================================================
//
// Code (must be attached to Actor)
//
//===========================================================================
extend class Actor
{
void A_SargAttack()
{
let targ = target;
if (targ && CheckMeleeRange())
{
int damage = random[pr_sargattack](1, 10) * 4;
int newdam = targ.DamageMobj (self, self, damage, "Melee");
targ.TraceBleed (newdam > 0 ? newdam : damage, self);
}
}
}