qzdoom/wadsrc/static/zscript/heretic/knight.txt
Christoph Oelckers 06900ff8be - reviewd script code for spawn calls that did not check their results.
Nothing should ever assume that spawning an actor is unconditionally successful. There can always be some edge cases where this is not the case.
2016-12-31 10:27:12 -05:00

173 lines
3 KiB
Text

// Knight -------------------------------------------------------------------
class Knight : Actor
{
Default
{
Health 200;
Radius 24;
Height 78;
Mass 150;
Speed 12;
Painchance 100;
Monster;
+FLOORCLIP
SeeSound "hknight/sight";
AttackSound "hknight/attack";
PainSound "hknight/pain";
DeathSound "hknight/death";
ActiveSound "hknight/active";
Obituary "$OB_BONEKNIGHT";
HitObituary "$OB_BONEKNIGHTHIT";
DropItem "CrossbowAmmo", 84, 5;
}
States
{
Spawn:
KNIG AB 10 A_Look;
Loop;
See:
KNIG ABCD 4 A_Chase;
Loop;
Melee:
Missile:
KNIG E 10 A_FaceTarget;
KNIG F 8 A_FaceTarget;
KNIG G 8 A_KnightAttack;
KNIG E 10 A_FaceTarget;
KNIG F 8 A_FaceTarget;
KNIG G 8 A_KnightAttack;
Goto See;
Pain:
KNIG H 3;
KNIG H 3 A_Pain;
Goto See;
Death:
KNIG I 6;
KNIG J 6 A_Scream;
KNIG K 6;
KNIG L 6 A_NoBlocking;
KNIG MN 6;
KNIG O -1;
Stop;
}
//----------------------------------------------------------------------------
//
// PROC A_KnightAttack
//
//----------------------------------------------------------------------------
void A_KnightAttack ()
{
if (!target) return;
if (CheckMeleeRange ())
{
int damage = random[KnightAttack](1, 8) * 3;
int newdam = target.DamageMobj (self, self, damage, 'Melee');
target.TraceBleed (newdam > 0 ? newdam : damage, self);
A_PlaySound ("hknight/melee", CHAN_BODY);
return;
}
// Throw axe
A_PlaySound (AttackSound, CHAN_BODY);
if (self.bShadow || random[KnightAttack]() < 40)
{ // Red axe
SpawnMissileZ (pos.Z + 36, target, "RedAxe");
}
else
{ // Green axe
SpawnMissileZ (pos.Z + 36, target, "KnightAxe");
}
}
}
// Knight ghost -------------------------------------------------------------
class KnightGhost : Knight
{
Default
{
+SHADOW
+GHOST
RenderStyle "Translucent";
Alpha 0.4;
}
}
// Knight axe ---------------------------------------------------------------
class KnightAxe : Actor
{
Default
{
Radius 10;
Height 8;
Speed 9;
FastSpeed 18;
Damage 2;
Projectile;
-NOBLOCKMAP
-ACTIVATEIMPACT
-ACTIVATEPCROSS
+WINDTHRUST
+THRUGHOST
DeathSound "hknight/hit";
}
States
{
Spawn:
SPAX A 3 BRIGHT A_PlaySound("hknight/axewhoosh");
SPAX BC 3 BRIGHT;
Loop;
Death:
SPAX DEF 6 BRIGHT;
Stop;
}
}
// Red axe ------------------------------------------------------------------
class RedAxe : KnightAxe
{
Default
{
+NOBLOCKMAP
-WINDTHRUST
Damage 7;
}
States
{
Spawn:
RAXE AB 5 BRIGHT A_DripBlood;
Loop;
Death:
RAXE CDE 6 BRIGHT;
Stop;
}
//----------------------------------------------------------------------------
//
// PROC A_DripBlood
//
//----------------------------------------------------------------------------
void A_DripBlood ()
{
double xo = random2[DripBlood]() / 32.0;
double yo = random2[DripBlood]() / 32.0;
Actor mo = Spawn ("Blood", Vec3Offset(xo, yo, 0.), ALLOW_REPLACE);
if (mo != null)
{
mo.Vel.X = random2[DripBlood]() / 64.0;
mo.Vel.Y = random2[DripBlood]() / 64.0;
mo.Gravity = 1./8;
}
}
}