mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-16 17:31:23 +00:00
a210aaea3e
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.
96 lines
1.8 KiB
Text
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);
|
|
}
|
|
}
|
|
}
|