mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-11 15:21:51 +00:00
3d61d2c1f4
Nothing should ever assume that spawning an actor is unconditionally successful. There can always be some edge cases where this is not the case.
244 lines
4 KiB
Text
244 lines
4 KiB
Text
|
|
// Heretic imp (as opposed to the Doom variety) -----------------------------
|
|
|
|
class HereticImp : Actor
|
|
{
|
|
bool extremecrash;
|
|
|
|
Default
|
|
{
|
|
Health 40;
|
|
Radius 16;
|
|
Height 36;
|
|
Mass 50;
|
|
Speed 10;
|
|
Painchance 200;
|
|
Monster;
|
|
+FLOAT
|
|
+NOGRAVITY
|
|
+SPAWNFLOAT
|
|
+DONTOVERLAP
|
|
+MISSILEMORE
|
|
SeeSound "himp/sight";
|
|
AttackSound "himp/attack";
|
|
PainSound "himp/pain";
|
|
DeathSound "himp/death";
|
|
ActiveSound "himp/active";
|
|
Obituary "$OB_HERETICIMP";
|
|
HitObituary "$OB_HERETICIMPHIT";
|
|
}
|
|
|
|
States
|
|
{
|
|
Spawn:
|
|
IMPX ABCB 10 A_Look;
|
|
Loop;
|
|
See:
|
|
IMPX AABBCCBB 3 A_Chase;
|
|
Loop;
|
|
Melee:
|
|
IMPX DE 6 A_FaceTarget;
|
|
IMPX F 6 A_CustomMeleeAttack(random[ImpMeAttack](5,12), "himp/attack", "himp/attack");
|
|
Goto See;
|
|
Missile:
|
|
IMPX A 10 A_FaceTarget;
|
|
IMPX B 6 A_ImpMsAttack;
|
|
IMPX CBAB 6;
|
|
Goto Missile+2;
|
|
Pain:
|
|
IMPX G 3;
|
|
IMPX G 3 A_Pain;
|
|
Goto See;
|
|
Death:
|
|
IMPX G 4 A_ImpDeath;
|
|
IMPX H 5;
|
|
Wait;
|
|
XDeath:
|
|
IMPX S 5 A_ImpXDeath1;
|
|
IMPX TU 5;
|
|
IMPX V 5 A_Gravity;
|
|
IMPX W 5;
|
|
Wait;
|
|
Crash:
|
|
IMPX I 7 A_ImpExplode;
|
|
IMPX J 7 A_Scream;
|
|
IMPX K 7;
|
|
IMPX L -1;
|
|
Stop;
|
|
XCrash:
|
|
IMPX X 7;
|
|
IMPX Y 7;
|
|
IMPX Z -1;
|
|
Stop;
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// PROC A_ImpMsAttack
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void A_ImpMsAttack()
|
|
{
|
|
if (!target || random[ImpMSAtk]() > 64)
|
|
{
|
|
SetState (SeeState);
|
|
return;
|
|
}
|
|
A_SkullAttack(12);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// PROC A_ImpExplode
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void A_ImpExplode()
|
|
{
|
|
Actor chunk;
|
|
|
|
bNoGravity = false;
|
|
|
|
chunk = Spawn("HereticImpChunk1", pos, ALLOW_REPLACE);
|
|
if (chunk != null)
|
|
{
|
|
chunk.vel.x = random2[ImpExplode]() / 64.;
|
|
chunk.vel.y = random2[ImpExplode]() / 64.;
|
|
chunk.vel.z = 9;
|
|
}
|
|
|
|
chunk = Spawn("HereticImpChunk2", pos, ALLOW_REPLACE);
|
|
if (chunk != null)
|
|
{
|
|
chunk.vel.x = random2[ImpExplode]() / 64.;
|
|
chunk.vel.y = random2[ImpExplode]() / 64.;
|
|
chunk.vel.z = 9;
|
|
}
|
|
|
|
if (extremecrash)
|
|
{
|
|
SetStateLabel ("XCrash");
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// PROC A_ImpDeath
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void A_ImpDeath()
|
|
{
|
|
bSolid = false;
|
|
bFloorClip = true;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// PROC A_ImpXDeath1
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void A_ImpXDeath1()
|
|
{
|
|
bSolid = false;
|
|
bFloorClip = true;
|
|
bNoGravity = true;
|
|
extremecrash = true;
|
|
}
|
|
}
|
|
|
|
// Heretic imp leader -------------------------------------------------------
|
|
|
|
class HereticImpLeader : HereticImp
|
|
{
|
|
Default
|
|
{
|
|
Species "HereticImpLeader";
|
|
Health 80;
|
|
-MISSILEMORE
|
|
AttackSound "himp/leaderattack";
|
|
}
|
|
States
|
|
{
|
|
Melee:
|
|
Stop;
|
|
Missile:
|
|
IMPX DE 6 A_FaceTarget;
|
|
IMPX F 6 A_CustomComboAttack("HereticImpBall", 32, random[ImpMsAttack2](5,12), "himp/leaderattack");
|
|
Goto See;
|
|
}
|
|
}
|
|
|
|
// Heretic imp chunk 1 ------------------------------------------------------
|
|
|
|
class HereticImpChunk1 : Actor
|
|
{
|
|
Default
|
|
{
|
|
Mass 5;
|
|
Radius 4;
|
|
+NOBLOCKMAP
|
|
+MOVEWITHSECTOR
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
IMPX M 5;
|
|
IMPX NO 700;
|
|
Stop;
|
|
}
|
|
}
|
|
|
|
// Heretic imp chunk 2 ------------------------------------------------------
|
|
|
|
class HereticImpChunk2 : Actor
|
|
{
|
|
Default
|
|
{
|
|
Mass 5;
|
|
Radius 4;
|
|
+NOBLOCKMAP
|
|
+MOVEWITHSECTOR
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
IMPX P 5;
|
|
IMPX QR 700;
|
|
Stop;
|
|
}
|
|
}
|
|
|
|
// Heretic imp ball ---------------------------------------------------------
|
|
|
|
class HereticImpBall : Actor
|
|
{
|
|
Default
|
|
{
|
|
Radius 8;
|
|
Height 8;
|
|
Speed 10;
|
|
FastSpeed 20;
|
|
Damage 1;
|
|
Projectile;
|
|
SeeSound "himp/leaderattack";
|
|
+SPAWNSOUNDSOURCE
|
|
-ACTIVATEPCROSS
|
|
-ACTIVATEIMPACT
|
|
RenderStyle "Add";
|
|
}
|
|
States
|
|
{
|
|
Spawn:
|
|
FX10 ABC 6 Bright;
|
|
Loop;
|
|
Death:
|
|
FX10 DEFG 5 Bright;
|
|
Stop;
|
|
}
|
|
}
|
|
|
|
|