mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-11 15:21:51 +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.
164 lines
3 KiB
Text
164 lines
3 KiB
Text
|
|
// Wizard --------------------------------------------------------
|
|
|
|
class Wizard : Actor
|
|
{
|
|
Default
|
|
{
|
|
Health 180;
|
|
Radius 16;
|
|
Height 68;
|
|
Mass 100;
|
|
Speed 12;
|
|
Painchance 64;
|
|
Monster;
|
|
+FLOAT
|
|
+NOGRAVITY
|
|
+DONTOVERLAP
|
|
SeeSound "wizard/sight";
|
|
AttackSound "wizard/attack";
|
|
PainSound "wizard/pain";
|
|
DeathSound "wizard/death";
|
|
ActiveSound "wizard/active";
|
|
Obituary "$OB_WIZARD";
|
|
HitObituary "$OB_WIZARDHIT";
|
|
DropItem "BlasterAmmo", 84, 10;
|
|
DropItem "ArtiTomeOfPower", 4, 0;
|
|
}
|
|
|
|
States
|
|
{
|
|
Spawn:
|
|
WZRD AB 10 A_Look;
|
|
Loop;
|
|
See:
|
|
WZRD A 3 A_Chase;
|
|
WZRD A 4 A_Chase;
|
|
WZRD A 3 A_Chase;
|
|
WZRD A 4 A_Chase;
|
|
WZRD B 3 A_Chase;
|
|
WZRD B 4 A_Chase;
|
|
WZRD B 3 A_Chase;
|
|
WZRD B 4 A_Chase;
|
|
Loop;
|
|
Missile:
|
|
WZRD C 4 A_WizAtk1;
|
|
WZRD C 4 A_WizAtk2;
|
|
WZRD C 4 A_WizAtk1;
|
|
WZRD C 4 A_WizAtk2;
|
|
WZRD C 4 A_WizAtk1;
|
|
WZRD C 4 A_WizAtk2;
|
|
WZRD C 4 A_WizAtk1;
|
|
WZRD C 4 A_WizAtk2;
|
|
WZRD D 12 A_WizAtk3;
|
|
Goto See;
|
|
Pain:
|
|
WZRD E 3 A_GhostOff;
|
|
WZRD E 3 A_Pain;
|
|
Goto See;
|
|
Death:
|
|
WZRD F 6 A_GhostOff;
|
|
WZRD G 6 A_Scream;
|
|
WZRD HI 6;
|
|
WZRD J 6 A_NoBlocking;
|
|
WZRD KL 6;
|
|
WZRD M -1 A_SetFloorClip;
|
|
Stop;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// PROC A_GhostOff
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void A_GhostOff ()
|
|
{
|
|
A_SetRenderStyle(1.0, STYLE_Normal);
|
|
bGhost = false;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// PROC A_WizAtk1
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void A_WizAtk1 ()
|
|
{
|
|
A_FaceTarget ();
|
|
A_GhostOff();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// PROC A_WizAtk2
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void A_WizAtk2 ()
|
|
{
|
|
A_FaceTarget ();
|
|
A_SetRenderStyle(HR_SHADOW, STYLE_Translucent);
|
|
bGhost = true;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// PROC A_WizAtk3
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void A_WizAtk3 ()
|
|
{
|
|
A_GhostOff();
|
|
let targ = target;
|
|
if (!targ) return;
|
|
A_PlaySound (AttackSound, CHAN_WEAPON);
|
|
if (CheckMeleeRange())
|
|
{
|
|
int damage = random[WizAtk3](1, 8) * 4;
|
|
int newdam = targ.DamageMobj (self, self, damage, 'Melee');
|
|
targ.TraceBleed (newdam > 0 ? newdam : damage, self);
|
|
return;
|
|
}
|
|
Actor mo = SpawnMissile (targ, "WizardFX1");
|
|
if (mo != null)
|
|
{
|
|
SpawnMissileAngle("WizardFX1", mo.Angle - 45. / 8, mo.Vel.Z);
|
|
SpawnMissileAngle("WizardFX1", mo.Angle + 45. / 8, mo.Vel.Z);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
// Projectile --------------------------------------------------------
|
|
|
|
class WizardFX1 : Actor
|
|
{
|
|
Default
|
|
{
|
|
Radius 10;
|
|
Height 6;
|
|
Speed 18;
|
|
FastSpeed 24;
|
|
Damage 3;
|
|
Projectile;
|
|
-ACTIVATEIMPACT
|
|
-ACTIVATEPCROSS
|
|
+ZDOOMTRANS
|
|
RenderStyle "Add";
|
|
}
|
|
|
|
States
|
|
{
|
|
Spawn:
|
|
FX11 AB 6 BRIGHT;
|
|
Loop;
|
|
Death:
|
|
FX11 CDEFG 5 BRIGHT;
|
|
Stop;
|
|
}
|
|
}
|
|
|
|
|