mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-14 16:41:07 +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.
329 lines
6.1 KiB
Text
329 lines
6.1 KiB
Text
|
|
// Bishop -------------------------------------------------------------------
|
|
|
|
class Bishop : Actor
|
|
{
|
|
int missilecount;
|
|
int bobstate;
|
|
|
|
Default
|
|
{
|
|
Health 130;
|
|
Radius 22;
|
|
Height 65;
|
|
Speed 10;
|
|
PainChance 110;
|
|
Monster;
|
|
+FLOAT +NOGRAVITY +NOBLOOD
|
|
+TELESTOMP
|
|
+DONTOVERLAP
|
|
+NOTARGETSWITCH
|
|
SeeSound "BishopSight";
|
|
AttackSound "BishopAttack";
|
|
PainSound "BishopPain";
|
|
DeathSound "BishopDeath";
|
|
ActiveSound "BishopActiveSounds";
|
|
Obituary"$OB_BISHOP";
|
|
}
|
|
|
|
States
|
|
{
|
|
Spawn:
|
|
BISH A 10 A_Look;
|
|
Loop;
|
|
See:
|
|
BISH A 2 A_Chase;
|
|
BISH A 2 A_BishopChase;
|
|
BISH A 2;
|
|
BISH B 2 A_BishopChase;
|
|
BISH B 2 A_Chase;
|
|
BISH B 2 A_BishopChase;
|
|
BISH A 1 A_BishopDecide;
|
|
Loop;
|
|
Blur:
|
|
BISH A 2 A_BishopDoBlur;
|
|
BISH A 4 A_BishopSpawnBlur;
|
|
Wait;
|
|
Pain:
|
|
BISH C 6 A_Pain;
|
|
BISH CCC 6 A_BishopPainBlur;
|
|
BISH C 0;
|
|
Goto See;
|
|
Missile:
|
|
BISH A 3 A_FaceTarget;
|
|
BISH DE 3 A_FaceTarget;
|
|
BISH F 3 A_BishopAttack;
|
|
BISH F 5 A_BishopAttack2;
|
|
Wait;
|
|
Death:
|
|
BISH G 6;
|
|
BISH H 6 Bright A_Scream;
|
|
BISH I 5 Bright A_NoBlocking;
|
|
BISH J 5 BRIGHT A_Explode(random[BishopBoom](25,40));
|
|
BISH K 5 Bright;
|
|
BISH LM 4 Bright;
|
|
BISH N 4 A_SpawnItemEx("BishopPuff", 0,0,40, 0,0,-0.5);
|
|
BISH O 4 A_QueueCorpse;
|
|
BISH P -1;
|
|
Stop;
|
|
Ice:
|
|
BISH X 5 A_FreezeDeath;
|
|
BISH X 1 A_FreezeDeathChunks;
|
|
Wait;
|
|
}
|
|
|
|
|
|
|
|
//============================================================================
|
|
//
|
|
// A_BishopAttack
|
|
//
|
|
//============================================================================
|
|
|
|
void A_BishopAttack()
|
|
{
|
|
let targ = target;
|
|
if (!targ)
|
|
{
|
|
return;
|
|
}
|
|
A_PlaySound (AttackSound, CHAN_BODY);
|
|
if (CheckMeleeRange())
|
|
{
|
|
int damage = random[BishopAttack](1, 8) * 4;
|
|
int newdam = targ.DamageMobj (self, self, damage, 'Melee');
|
|
targ.TraceBleed (newdam > 0 ? newdam : damage, self);
|
|
return;
|
|
}
|
|
missilecount = (random[BishopAttack]() & 3) + 5;
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_BishopAttack2
|
|
//
|
|
// Spawns one of a string of bishop missiles
|
|
//============================================================================
|
|
|
|
void A_BishopAttack2()
|
|
{
|
|
if (!target || !missilecount)
|
|
{
|
|
missilecount = 0;
|
|
SetState (SeeState);
|
|
return;
|
|
}
|
|
Actor mo = SpawnMissile (target, "BishopFX");
|
|
if (mo != null)
|
|
{
|
|
mo.tracer = target;
|
|
}
|
|
missilecount--;
|
|
return;
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_BishopDecide
|
|
//
|
|
//============================================================================
|
|
|
|
void A_BishopDecide()
|
|
{
|
|
if (random[BishopDecide]() >= 220)
|
|
{
|
|
SetStateLabel ("Blur");
|
|
}
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_BishopDoBlur
|
|
//
|
|
//============================================================================
|
|
|
|
void A_BishopDoBlur()
|
|
{
|
|
missilecount = (random[BishopDoBlur]() & 3) + 3; // Random number of blurs
|
|
if (random[BishopDoBlur]() < 120)
|
|
{
|
|
Thrust(11, Angle + 90);
|
|
}
|
|
else if (random[BishopDoBlur]() > 125)
|
|
{
|
|
Thrust(11, Angle - 90);
|
|
}
|
|
else
|
|
{ // Thrust forward
|
|
Thrust(11);
|
|
}
|
|
A_PlaySound ("BishopBlur", CHAN_BODY);
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_BishopSpawnBlur
|
|
//
|
|
//============================================================================
|
|
|
|
void A_BishopSpawnBlur()
|
|
{
|
|
if (!--missilecount)
|
|
{
|
|
Vel.XY = (0,0);// = Vel.Y = 0;
|
|
if (random[BishopSpawnBlur]() > 96)
|
|
{
|
|
SetState (SeeState);
|
|
}
|
|
else
|
|
{
|
|
SetState (MissileState);
|
|
}
|
|
}
|
|
Actor mo = Spawn ("BishopBlur", Pos, ALLOW_REPLACE);
|
|
if (mo)
|
|
{
|
|
mo.angle = angle;
|
|
}
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_BishopChase
|
|
//
|
|
//============================================================================
|
|
|
|
void A_BishopChase()
|
|
{
|
|
double newz = pos.z - BobSin(bobstate) / 2.;
|
|
bobstate = (bobstate + 4) & 63;
|
|
newz += BobSin(bobstate) / 2.;
|
|
SetZ(newz);
|
|
}
|
|
|
|
//============================================================================
|
|
//
|
|
// A_BishopPainBlur
|
|
//
|
|
//============================================================================
|
|
|
|
void A_BishopPainBlur()
|
|
{
|
|
if (random[BishopPainBlur]() < 64)
|
|
{
|
|
SetStateLabel ("Blur");
|
|
return;
|
|
}
|
|
double xo = random2[BishopPainBlur]() / 16.;
|
|
double yo = random2[BishopPainBlue]() / 16.;
|
|
double zo = random2[BishopPainBlue]() / 32.;
|
|
Actor mo = Spawn ("BishopPainBlur", Vec3Offset(xo, yo, zo), ALLOW_REPLACE);
|
|
if (mo)
|
|
{
|
|
mo.angle = angle;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
extend class Actor
|
|
{
|
|
//============================================================================
|
|
//
|
|
// A_BishopMissileWeave (this function must be in Actor)
|
|
//
|
|
//============================================================================
|
|
|
|
void A_BishopMissileWeave()
|
|
{
|
|
A_Weave(2, 2, 2., 1.);
|
|
}
|
|
}
|
|
|
|
// Bishop puff --------------------------------------------------------------
|
|
|
|
class BishopPuff : Actor
|
|
{
|
|
Default
|
|
{
|
|
+NOBLOCKMAP +NOGRAVITY
|
|
RenderStyle "Translucent";
|
|
Alpha 0.6;
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
BISH QRST 5;
|
|
BISH UV 6;
|
|
BISH W 5;
|
|
Stop;
|
|
}
|
|
}
|
|
|
|
// Bishop pain blur ---------------------------------------------------------
|
|
|
|
class BishopPainBlur : Actor
|
|
{
|
|
Default
|
|
{
|
|
+NOBLOCKMAP +NOGRAVITY
|
|
RenderStyle "Translucent";
|
|
Alpha 0.6;
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
BISH C 8;
|
|
Stop;
|
|
}
|
|
}
|
|
|
|
// Bishop FX ----------------------------------------------------------------
|
|
|
|
class BishopFX : Actor
|
|
{
|
|
Default
|
|
{
|
|
Radius 10;
|
|
Height 6;
|
|
Speed 10;
|
|
Damage 1;
|
|
Projectile;
|
|
+SEEKERMISSILE
|
|
-ACTIVATEIMPACT -ACTIVATEPCROSS
|
|
+STRIFEDAMAGE +ZDOOMTRANS
|
|
RenderStyle "Add";
|
|
DeathSound "BishopMissileExplode";
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
BPFX ABAB 1 Bright A_BishopMissileWeave;
|
|
BPFX B 0 Bright A_SeekerMissile(2,3);
|
|
Loop;
|
|
Death:
|
|
BPFX CDEF 4 Bright;
|
|
BPFX GH 3 Bright;
|
|
Stop;
|
|
}
|
|
}
|
|
|
|
// Bishop blur --------------------------------------------------------------
|
|
|
|
class BishopBlur : Actor
|
|
{
|
|
Default
|
|
{
|
|
+NOBLOCKMAP +NOGRAVITY
|
|
RenderStyle "Translucent";
|
|
Alpha 0.6;
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
BISH A 16;
|
|
BISH A 8 A_SetTranslucent(0.4);
|
|
Stop;
|
|
}
|
|
}
|
|
|