diff --git a/src/codepointers.h b/src/codepointers.h index 0117332407..24817efdb7 100644 --- a/src/codepointers.h +++ b/src/codepointers.h @@ -343,6 +343,25 @@ ACTOR(WraithFX3) ACTOR(WraithMelee) ACTOR(WraithFX2) +ACTOR(SorcSpinBalls) +ACTOR(SpeedBalls) +ACTOR(SlowBalls) +ACTOR(StopBalls) +ACTOR(SorcBossAttack) +ACTOR(SpawnFizzle) +ACTOR(SorcBallOrbit) +ACTOR(AccelBalls) +ACTOR(DecelBalls) +ACTOR(SorcOffense2) +ACTOR(SorcBallPop) +ACTOR(BounceCheck) +ACTOR(SorcFX1Seek) +ACTOR(SorcFX2Split) +ACTOR(SorcFX2Orbit) +ACTOR(SpawnBishop) +ACTOR(SorcererBishopEntry) +ACTOR(SorcFX4Check) + ACTOR(TemplarAttack) ACTOR(SentinelAttack) ACTOR(ReaverRanged) diff --git a/src/g_hexen/a_heresiarch.cpp b/src/g_hexen/a_heresiarch.cpp index 69b3749be5..27ed9c3701 100644 --- a/src/g_hexen/a_heresiarch.cpp +++ b/src/g_hexen/a_heresiarch.cpp @@ -47,25 +47,12 @@ #define BALL2_ANGLEOFFSET (ANGLE_MAX/3) #define BALL3_ANGLEOFFSET ((ANGLE_MAX/3)*2) -void A_SorcBallPop (AActor *actor); -void A_SorcBallOrbit (AActor *actor); -void A_SorcSpinBalls (AActor *actor); -void A_SpeedBalls (AActor *actor); void A_SlowBalls (AActor *actor); void A_StopBalls (AActor *actor); void A_AccelBalls (AActor *actor); void A_DecelBalls (AActor *actor); -void A_SorcBossAttack (AActor *actor); -void A_SpawnFizzle (AActor *actor); -void A_BounceCheck (AActor *actor); -void A_DoBounceCheck (AActor *actor, const char *sound); -void A_SorcFX1Seek (AActor *actor); void A_SorcOffense2 (AActor *actor); -void A_SorcFX2Split (AActor *actor); -void A_SorcFX2Orbit (AActor *actor); -void A_SorcererBishopEntry (AActor *actor); -void A_SpawnBishop (AActor *actor); -void A_SorcFX4Check (AActor *actor); +void A_DoBounceCheck (AActor *actor, const char *sound); static FRandom pr_heresiarch ("Heresiarch"); @@ -73,7 +60,7 @@ static FRandom pr_heresiarch ("Heresiarch"); class AHeresiarch : public AActor { - DECLARE_ACTOR (AHeresiarch, AActor) + DECLARE_CLASS (AHeresiarch, AActor) public: const PClass *StopBall; @@ -81,82 +68,7 @@ public: void Die (AActor *source, AActor *inflictor); }; -FState AHeresiarch::States[] = -{ -#define S_SORC_SPAWN1 0 - S_NORMAL (SORC, 'A', 3, NULL , &States[S_SORC_SPAWN1+1]), - S_NORMAL (SORC, 'A', 2, A_SorcSpinBalls , &States[S_SORC_SPAWN1+2]), - S_NORMAL (SORC, 'A', 10, A_Look , &States[S_SORC_SPAWN1+2]), - -#define S_SORC_WALK1 (S_SORC_SPAWN1+3) - S_NORMAL (SORC, 'A', 5, A_Chase , &States[S_SORC_WALK1+1]), - S_NORMAL (SORC, 'B', 5, A_Chase , &States[S_SORC_WALK1+2]), - S_NORMAL (SORC, 'C', 5, A_Chase , &States[S_SORC_WALK1+3]), - S_NORMAL (SORC, 'D', 5, A_Chase , &States[S_SORC_WALK1]), - -#define S_SORC_PAIN1 (S_SORC_WALK1+4) - S_NORMAL (SORC, 'G', 8, NULL , &States[S_SORC_PAIN1+1]), - S_NORMAL (SORC, 'G', 8, A_Pain , &States[S_SORC_WALK1]), - -#define S_SORC_ATK2_1 (S_SORC_PAIN1+2) - S_BRIGHT (SORC, 'F', 6, A_FaceTarget , &States[S_SORC_ATK2_1+1]), - S_BRIGHT (SORC, 'F', 6, A_SpeedBalls , &States[S_SORC_ATK2_1+2]), - S_BRIGHT (SORC, 'F', 6, A_FaceTarget , &States[S_SORC_ATK2_1+2]), - -#define S_SORC_ATTACK1 (S_SORC_ATK2_1+3) - S_BRIGHT (SORC, 'E', 6, NULL , &States[S_SORC_ATTACK1+1]), - S_BRIGHT (SORC, 'E', 6, A_SpawnFizzle , &States[S_SORC_ATTACK1+2]), - S_BRIGHT (SORC, 'E', 5, A_FaceTarget , &States[S_SORC_ATTACK1+1]), - S_BRIGHT (SORC, 'E', 2, NULL , &States[S_SORC_ATTACK1+4]), - S_BRIGHT (SORC, 'E', 2, A_SorcBossAttack , &States[S_SORC_WALK1]), - -#define S_SORC_DIE1 (S_SORC_ATTACK1+5) - S_BRIGHT (SORC, 'H', 5, NULL , &States[S_SORC_DIE1+1]), - S_BRIGHT (SORC, 'I', 5, A_FaceTarget , &States[S_SORC_DIE1+2]), - S_BRIGHT (SORC, 'J', 5, A_Scream , &States[S_SORC_DIE1+3]), - S_BRIGHT (SORC, 'K', 5, NULL , &States[S_SORC_DIE1+4]), - S_BRIGHT (SORC, 'L', 5, NULL , &States[S_SORC_DIE1+5]), - S_BRIGHT (SORC, 'M', 5, NULL , &States[S_SORC_DIE1+6]), - S_BRIGHT (SORC, 'N', 5, NULL , &States[S_SORC_DIE1+7]), - S_BRIGHT (SORC, 'O', 5, NULL , &States[S_SORC_DIE1+8]), - S_BRIGHT (SORC, 'P', 5, NULL , &States[S_SORC_DIE1+9]), - S_BRIGHT (SORC, 'Q', 5, NULL , &States[S_SORC_DIE1+10]), - S_BRIGHT (SORC, 'R', 5, NULL , &States[S_SORC_DIE1+11]), - S_BRIGHT (SORC, 'S', 5, NULL , &States[S_SORC_DIE1+12]), - S_BRIGHT (SORC, 'T', 5, NULL , &States[S_SORC_DIE1+13]), - S_BRIGHT (SORC, 'U', 5, A_NoBlocking , &States[S_SORC_DIE1+14]), - S_BRIGHT (SORC, 'V', 5, NULL , &States[S_SORC_DIE1+15]), - S_BRIGHT (SORC, 'W', 5, NULL , &States[S_SORC_DIE1+16]), - S_BRIGHT (SORC, 'X', 5, NULL , &States[S_SORC_DIE1+17]), - S_BRIGHT (SORC, 'Y', 5, NULL , &States[S_SORC_DIE1+18]), - S_BRIGHT (SORC, 'Z', -1, NULL , NULL), -}; - -IMPLEMENT_ACTOR (AHeresiarch, Hexen, 10080, 0) - PROP_SpawnHealth (5000) - PROP_PainChance (10) - PROP_SpeedFixed (16) - PROP_RadiusFixed (40) - PROP_HeightFixed (110) - PROP_Mass (500) - PROP_Damage (9) - PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_COUNTKILL) - PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_BOSS|MF2_PUSHWALL|MF2_MCROSS) - PROP_Flags3 (MF3_DONTMORPH|MF3_NOTARGET) - PROP_Flags4 (MF4_NOICEDEATH|MF4_DEFLECT) - - PROP_SpawnState (S_SORC_SPAWN1) - PROP_SeeState (S_SORC_WALK1) - PROP_PainState (S_SORC_PAIN1) - PROP_MissileState (S_SORC_ATK2_1) - PROP_DeathState (S_SORC_DIE1) - - PROP_SeeSound ("SorcererSight") - PROP_PainSound ("SorcererPain") - PROP_DeathSound ("SorcererDeathScream") - PROP_ActiveSound ("SorcererActive") - PROP_Obituary ("$OB_HERESIARCH") -END_DEFAULTS +IMPLEMENT_CLASS (AHeresiarch) void AHeresiarch::Serialize (FArchive &arc) { @@ -182,7 +94,7 @@ void AHeresiarch::Die (AActor *source, AActor *inflictor) class ASorcBall : public AActor { - DECLARE_STATELESS_ACTOR (ASorcBall, AActor) + DECLARE_CLASS (ASorcBall, AActor) public: virtual void DoFireSpell (); virtual void SorcUpdateBallAngle (); @@ -195,36 +107,19 @@ public: arc << AngleOffset; } - void GetExplodeParms (int &damage, int &distance, bool &hurtSource) - { - distance = 255; - damage = 255; - SeeSound = 0; // don't play bounce - } - bool SpecialBlastHandling (AActor *source, fixed_t strength) { // don't blast sorcerer balls return false; } }; -IMPLEMENT_STATELESS_ACTOR (ASorcBall, Hexen, -1, 0) - PROP_SpeedFixed (10) - PROP_RadiusFixed (5) - PROP_HeightFixed (5) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE) - PROP_Flags2 (MF2_HEXENBOUNCE|MF2_NOTELEPORT) - PROP_Flags3 (MF3_FULLVOLDEATH|MF3_CANBOUNCEWATER|MF3_NOWALLBOUNCESND) - - PROP_SeeSound ("SorcererBallBounce") - PROP_DeathSound ("SorcererBigBallExplode") -END_DEFAULTS +IMPLEMENT_CLASS (ASorcBall) // First ball (purple) - fires projectiles ---------------------------------- class ASorcBall1 : public ASorcBall { - DECLARE_ACTOR (ASorcBall1, ASorcBall) + DECLARE_CLASS (ASorcBall1, ASorcBall) public: void BeginPlay () { @@ -236,49 +131,13 @@ public: virtual void CastSorcererSpell (); }; -FState ASorcBall1::States[] = -{ -#define S_SORCBALL1_1 0 - S_NORMAL (SBMP, 'A', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1+1]), - S_NORMAL (SBMP, 'B', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1+2]), - S_NORMAL (SBMP, 'C', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1+3]), - S_NORMAL (SBMP, 'D', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1+4]), - S_NORMAL (SBMP, 'E', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1+5]), - S_NORMAL (SBMP, 'F', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1+6]), - S_NORMAL (SBMP, 'G', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1+7]), - S_NORMAL (SBMP, 'H', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1+8]), - S_NORMAL (SBMP, 'I', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1+9]), - S_NORMAL (SBMP, 'J', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1+10]), - S_NORMAL (SBMP, 'K', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1+11]), - S_NORMAL (SBMP, 'L', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1+12]), - S_NORMAL (SBMP, 'M', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1+13]), - S_NORMAL (SBMP, 'N', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1+14]), - S_NORMAL (SBMP, 'O', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1+15]), - S_NORMAL (SBMP, 'P', 2, A_SorcBallOrbit , &States[S_SORCBALL1_1]), - -#define S_SORCBALL1_D1 (S_SORCBALL1_1+16) - S_NORMAL (SBMP, 'A', 5, A_SorcBallPop , &States[S_SORCBALL1_D1+1]), - S_NORMAL (SBMP, 'B', 2, A_BounceCheck , &States[S_SORCBALL1_D1+1]), - -#define S_SORCBALL1_D5 (S_SORCBALL1_D1+2) - S_NORMAL (SBS4, 'D', 5, A_Explode , &States[S_SORCBALL1_D5+1]), - S_NORMAL (SBS4, 'E', 5, NULL , &States[S_SORCBALL1_D5+2]), - S_NORMAL (SBS4, 'F', 6, NULL , &States[S_SORCBALL1_D5+3]), - S_NORMAL (SBS4, 'G', 6, NULL , &States[S_SORCBALL1_D5+4]), - S_NORMAL (SBS4, 'H', 6, NULL , NULL), -}; - -IMPLEMENT_ACTOR (ASorcBall1, Hexen, -1, 0) - PROP_SpawnState (S_SORCBALL1_1) - PROP_PainState (S_SORCBALL1_D1) - PROP_DeathState (S_SORCBALL1_D5) -END_DEFAULTS +IMPLEMENT_CLASS (ASorcBall1) // Second ball (blue) - generates the shield -------------------------------- class ASorcBall2 : public ASorcBall { - DECLARE_ACTOR (ASorcBall2, ASorcBall) + DECLARE_CLASS (ASorcBall2, ASorcBall) public: void BeginPlay () { @@ -288,49 +147,13 @@ public: virtual void CastSorcererSpell (); }; -FState ASorcBall2::States[] = -{ -#define S_SORCBALL2_1 0 - S_NORMAL (SBMB, 'A', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1+1]), - S_NORMAL (SBMB, 'B', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1+2]), - S_NORMAL (SBMB, 'C', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1+3]), - S_NORMAL (SBMB, 'D', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1+4]), - S_NORMAL (SBMB, 'E', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1+5]), - S_NORMAL (SBMB, 'F', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1+6]), - S_NORMAL (SBMB, 'G', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1+7]), - S_NORMAL (SBMB, 'H', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1+8]), - S_NORMAL (SBMB, 'I', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1+9]), - S_NORMAL (SBMB, 'J', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1+10]), - S_NORMAL (SBMB, 'K', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1+11]), - S_NORMAL (SBMB, 'L', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1+12]), - S_NORMAL (SBMB, 'M', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1+13]), - S_NORMAL (SBMB, 'N', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1+14]), - S_NORMAL (SBMB, 'O', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1+15]), - S_NORMAL (SBMB, 'P', 2, A_SorcBallOrbit , &States[S_SORCBALL2_1]), - -#define S_SORCBALL2_D1 (S_SORCBALL2_1+16) - S_NORMAL (SBMB, 'A', 5, A_SorcBallPop , &States[S_SORCBALL2_D1+1]), - S_NORMAL (SBMB, 'B', 2, A_BounceCheck , &States[S_SORCBALL2_D1+1]), - -#define S_SORCBALL2_D5 (S_SORCBALL2_D1+2) - S_NORMAL (SBS3, 'D', 5, A_Explode , &States[S_SORCBALL2_D5+1]), - S_NORMAL (SBS3, 'E', 5, NULL , &States[S_SORCBALL2_D5+2]), - S_NORMAL (SBS3, 'F', 6, NULL , &States[S_SORCBALL2_D5+3]), - S_NORMAL (SBS3, 'G', 6, NULL , &States[S_SORCBALL2_D5+4]), - S_NORMAL (SBS3, 'H', 6, NULL , NULL), -}; - -IMPLEMENT_ACTOR (ASorcBall2, Hexen, -1, 0) - PROP_SpawnState (S_SORCBALL2_1) - PROP_PainState (S_SORCBALL2_D1) - PROP_DeathState (S_SORCBALL2_D5) -END_DEFAULTS +IMPLEMENT_CLASS (ASorcBall2) // Third ball (green) - summons Bishops ------------------------------------- class ASorcBall3 : public ASorcBall { - DECLARE_ACTOR (ASorcBall3, ASorcBall) + DECLARE_CLASS (ASorcBall3, ASorcBall) public: void BeginPlay () { @@ -340,54 +163,15 @@ public: virtual void CastSorcererSpell (); }; -FState ASorcBall3::States[] = -{ -#define S_SORCBALL3_1 0 - S_NORMAL (SBMG, 'A', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1+1]), - S_NORMAL (SBMG, 'B', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1+2]), - S_NORMAL (SBMG, 'C', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1+3]), - S_NORMAL (SBMG, 'D', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1+4]), - S_NORMAL (SBMG, 'E', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1+5]), - S_NORMAL (SBMG, 'F', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1+6]), - S_NORMAL (SBMG, 'G', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1+7]), - S_NORMAL (SBMG, 'H', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1+8]), - S_NORMAL (SBMG, 'I', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1+9]), - S_NORMAL (SBMG, 'J', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1+10]), - S_NORMAL (SBMG, 'K', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1+11]), - S_NORMAL (SBMG, 'L', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1+12]), - S_NORMAL (SBMG, 'M', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1+13]), - S_NORMAL (SBMG, 'N', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1+14]), - S_NORMAL (SBMG, 'O', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1+15]), - S_NORMAL (SBMG, 'P', 2, A_SorcBallOrbit , &States[S_SORCBALL3_1]), - -#define S_SORCBALL3_D1 (S_SORCBALL3_1+16) - S_NORMAL (SBMG, 'A', 5, A_SorcBallPop , &States[S_SORCBALL3_D1+1]), - S_NORMAL (SBMG, 'B', 2, A_BounceCheck , &States[S_SORCBALL3_D1+1]), - -#define S_SORCBALL3_D5 (S_SORCBALL3_D1+2) - S_NORMAL (SBS3, 'D', 5, A_Explode , &States[S_SORCBALL3_D5+1]), - S_NORMAL (SBS3, 'E', 5, NULL , &States[S_SORCBALL3_D5+2]), - S_NORMAL (SBS3, 'F', 6, NULL , &States[S_SORCBALL3_D5+3]), - S_NORMAL (SBS3, 'G', 6, NULL , &States[S_SORCBALL3_D5+4]), - S_NORMAL (SBS3, 'H', 6, NULL , NULL), -}; - -IMPLEMENT_ACTOR (ASorcBall3, Hexen, -1, 0) - PROP_SpawnState (S_SORCBALL3_1) - PROP_PainState (S_SORCBALL3_D1) - PROP_DeathState (S_SORCBALL3_D5) -END_DEFAULTS +IMPLEMENT_CLASS (ASorcBall3) // Sorcerer spell 1 (The burning, bouncing head thing) ---------------------- +/* class ASorcFX1 : public AActor { - DECLARE_ACTOR (ASorcFX1, AActor) + DECLARE_CLASS (ASorcFX1, AActor) public: - void GetExplodeParms (int &damage, int &distance, bool &hurtSource) - { - damage = 30; - } bool FloorBounceMissile (secplane_t &plane) { fixed_t orgmomz = momz; @@ -400,236 +184,8 @@ public: return true; } }; - -FState ASorcFX1::States[] = -{ -#define S_SORCFX1_1 0 - S_BRIGHT (SBS1, 'A', 2, NULL , &States[S_SORCFX1_1+1]), - S_BRIGHT (SBS1, 'B', 3, A_SorcFX1Seek , &States[S_SORCFX1_1+2]), - S_BRIGHT (SBS1, 'C', 3, A_SorcFX1Seek , &States[S_SORCFX1_1+3]), - S_BRIGHT (SBS1, 'D', 3, A_SorcFX1Seek , &States[S_SORCFX1_1]), - -#define S_SORCFX1_D1 (S_SORCFX1_1+4) - S_BRIGHT (FHFX, 'S', 2, A_Explode , &States[S_SORCFX1_D1+1]), - S_BRIGHT (FHFX, 'S', 6, NULL , &States[S_SORCFX1_D1+2]), - S_BRIGHT (FHFX, 'S', 6, NULL , NULL), -}; - -IMPLEMENT_ACTOR (ASorcFX1, Hexen, -1, 0) - PROP_SpeedFixed (7) - PROP_RadiusFixed (5) - PROP_HeightFixed (5) - PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE) - PROP_Flags2 (MF2_HEXENBOUNCE|MF2_NOTELEPORT) - PROP_Flags3 (MF3_FULLVOLDEATH|MF3_CANBOUNCEWATER|MF3_NOWALLBOUNCESND) - - PROP_SpawnState (S_SORCFX1_1) - PROP_DeathState (S_SORCFX1_D1) - PROP_XDeathState (S_SORCFX1_D1) - - PROP_SeeSound ("SorcererBallBounce") - PROP_DeathSound ("SorcererHeadScream") -END_DEFAULTS - -// Sorcerer spell 2 (The visible part of the shield) ------------------------ - -class ASorcFX2 : public AActor -{ - DECLARE_ACTOR (ASorcFX2, AActor) -}; - -FState ASorcFX2::States[] = -{ -#define S_SORCFX2_SPLIT1 0 - S_BRIGHT (SBS2, 'A', 3, A_SorcFX2Split , &States[S_SORCFX2_SPLIT1]), - -#define S_SORCFX2T1 (S_SORCFX2_SPLIT1+1) - S_NORMAL (SBS2, 'A', 10, NULL , NULL), - -#define S_SORCFX2_ORBIT1 (S_SORCFX2T1+1) - S_BRIGHT (SBS2, 'A', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1+1]), - S_BRIGHT (SBS2, 'B', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1+2]), - S_BRIGHT (SBS2, 'C', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1+3]), - S_BRIGHT (SBS2, 'D', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1+4]), - S_BRIGHT (SBS2, 'E', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1+5]), - S_BRIGHT (SBS2, 'F', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1+6]), - S_BRIGHT (SBS2, 'G', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1+7]), - S_BRIGHT (SBS2, 'H', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1+8]), - S_BRIGHT (SBS2, 'I', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1+9]), - S_BRIGHT (SBS2, 'J', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1+10]), - S_BRIGHT (SBS2, 'K', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1+11]), - S_BRIGHT (SBS2, 'L', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1+12]), - S_BRIGHT (SBS2, 'M', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1+13]), - S_BRIGHT (SBS2, 'N', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1+14]), - S_BRIGHT (SBS2, 'O', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1+15]), - S_BRIGHT (SBS2, 'P', 2, A_SorcFX2Orbit , &States[S_SORCFX2_ORBIT1]), -}; - -IMPLEMENT_ACTOR (ASorcFX2, Hexen, -1, 0) - PROP_SpeedFixed (15) - PROP_RadiusFixed (5) - PROP_HeightFixed (5) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY) - PROP_Flags2 (MF2_NOTELEPORT) - - PROP_SpawnState (S_SORCFX2_SPLIT1) - PROP_DeathState (S_SORCFX2T1) -END_DEFAULTS - -// The translucent trail behind SorcFX2 ------------------------------------- - -class ASorcFX2T1 : public ASorcFX2 -{ - DECLARE_STATELESS_ACTOR (ASorcFX2T1, ASorcFX2) -}; - -IMPLEMENT_STATELESS_ACTOR (ASorcFX2T1, Hexen, -1, 0) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY) - PROP_Flags2 (MF2_NOTELEPORT) - PROP_RenderStyle (STYLE_Translucent) - PROP_Alpha (HX_ALTSHADOW) - - PROP_SpawnState (S_SORCFX2T1) -END_DEFAULTS - -// Sorcerer spell 3 (The Bishop spawner) ------------------------------------ - -class ASorcFX3 : public AActor -{ - DECLARE_ACTOR (ASorcFX3, AActor) -}; - -FState ASorcFX3::States[] = -{ -#define S_SORCFX3_1 0 - S_BRIGHT (SBS3, 'A', 2, NULL , &States[S_SORCFX3_1+1]), - S_BRIGHT (SBS3, 'B', 2, NULL , &States[S_SORCFX3_1+2]), - S_BRIGHT (SBS3, 'C', 2, NULL , &States[S_SORCFX3_1]), - -#define S_BISHMORPH1 (S_SORCFX3_1+3) - S_BRIGHT (SBS3, 'A', 4, NULL , &States[S_BISHMORPH1+1]), - S_NORMAL (BISH, 'P', 4, A_SorcererBishopEntry , &States[S_BISHMORPH1+2]), - S_NORMAL (BISH, 'O', 4, NULL , &States[S_BISHMORPH1+3]), - S_NORMAL (BISH, 'N', 4, NULL , &States[S_BISHMORPH1+4]), - S_NORMAL (BISH, 'M', 3, NULL , &States[S_BISHMORPH1+5]), - S_NORMAL (BISH, 'L', 3, NULL , &States[S_BISHMORPH1+6]), - S_NORMAL (BISH, 'K', 3, NULL , &States[S_BISHMORPH1+7]), - S_NORMAL (BISH, 'J', 3, NULL , &States[S_BISHMORPH1+8]), - S_NORMAL (BISH, 'I', 3, NULL , &States[S_BISHMORPH1+9]), - S_NORMAL (BISH, 'H', 3, NULL , &States[S_BISHMORPH1+10]), - S_NORMAL (BISH, 'G', 3, A_SpawnBishop , NULL), -}; - -IMPLEMENT_ACTOR (ASorcFX3, Hexen, -1, 0) - PROP_SpeedFixed (15) - PROP_RadiusFixed (22) - PROP_HeightFixed (65) - PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE) - PROP_Flags2 (MF2_NOTELEPORT) - - PROP_SpawnState (S_SORCFX3_1) - PROP_DeathState (S_BISHMORPH1) - - PROP_SeeSound ("SorcererBishopSpawn") -END_DEFAULTS - -// The Bishop spawner's explosion animation --------------------------------- - -class ASorcFX3Explosion : public AActor -{ - DECLARE_ACTOR (ASorcFX3Explosion, AActor) -}; - -FState ASorcFX3Explosion::States[] = -{ -#define S_SORCFX3_EXP1 0 - S_NORMAL (SBS3, 'D', 3, NULL , &States[S_SORCFX3_EXP1+1]), - S_NORMAL (SBS3, 'E', 3, NULL , &States[S_SORCFX3_EXP1+2]), - S_NORMAL (SBS3, 'F', 3, NULL , &States[S_SORCFX3_EXP1+3]), - S_NORMAL (SBS3, 'G', 3, NULL , &States[S_SORCFX3_EXP1+4]), - S_NORMAL (SBS3, 'H', 3, NULL , NULL), -}; - -IMPLEMENT_ACTOR (ASorcFX3Explosion, Hexen, -1, 0) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY) - PROP_Flags2 (MF2_NOTELEPORT) - PROP_RenderStyle (STYLE_Translucent) - PROP_Alpha (HX_ALTSHADOW) - - PROP_SpawnState (S_SORCFX3_EXP1) -END_DEFAULTS - - -// Sorcerer spell 4 (The purple projectile) --------------------------------- - -class ASorcFX4 : public AActor -{ - DECLARE_ACTOR (ASorcFX4, AActor) -public: - void GetExplodeParms (int &damage, int &distance, bool &hurtSource) - { - damage = 20; - } -}; - -FState ASorcFX4::States[] = -{ -#define S_SORCFX4_1 0 - S_BRIGHT (SBS4, 'A', 2, A_SorcFX4Check , &States[S_SORCFX4_1+1]), - S_BRIGHT (SBS4, 'B', 2, A_SorcFX4Check , &States[S_SORCFX4_1+2]), - S_BRIGHT (SBS4, 'C', 2, A_SorcFX4Check , &States[S_SORCFX4_1]), - -#define S_SORCFX4_D1 (S_SORCFX4_1+3) - S_BRIGHT (SBS4, 'D', 2, NULL , &States[S_SORCFX4_D1+1]), - S_BRIGHT (SBS4, 'E', 2, A_Explode , &States[S_SORCFX4_D1+2]), - S_BRIGHT (SBS4, 'F', 2, NULL , &States[S_SORCFX4_D1+3]), - S_BRIGHT (SBS4, 'G', 2, NULL , &States[S_SORCFX4_D1+4]), - S_BRIGHT (SBS4, 'H', 2, NULL , NULL), -}; - -IMPLEMENT_ACTOR (ASorcFX4, Hexen, -1, 0) - PROP_SpeedFixed (12) - PROP_RadiusFixed (10) - PROP_HeightFixed (10) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE) - PROP_Flags2 (MF2_NOTELEPORT) - PROP_RenderStyle (STYLE_Add) - - PROP_SpawnState (S_SORCFX4_1) - PROP_DeathState (S_SORCFX4_D1) - - PROP_DeathSound ("SorcererBallExplode") -END_DEFAULTS - -// Spark that appears when shooting SorcFX4 --------------------------------- - -class ASorcSpark1 : public AActor -{ - DECLARE_ACTOR (ASorcSpark1, AActor) -}; - -FState ASorcSpark1::States[] = -{ -#define S_SORCSPARK1 0 - S_BRIGHT (SBFX, 'A', 4, NULL , &States[S_SORCSPARK1+1]), - S_BRIGHT (SBFX, 'B', 4, NULL , &States[S_SORCSPARK1+2]), - S_BRIGHT (SBFX, 'C', 4, NULL , &States[S_SORCSPARK1+3]), - S_BRIGHT (SBFX, 'D', 4, NULL , &States[S_SORCSPARK1+4]), - S_BRIGHT (SBFX, 'E', 4, NULL , &States[S_SORCSPARK1+5]), - S_BRIGHT (SBFX, 'F', 4, NULL , &States[S_SORCSPARK1+6]), - S_BRIGHT (SBFX, 'G', 4, NULL , NULL), -}; - -IMPLEMENT_ACTOR (ASorcSpark1, Hexen, -1, 0) - PROP_RadiusFixed (5) - PROP_HeightFixed (5) - PROP_Gravity (FRACUNIT/8) - PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF) - PROP_Flags2 (MF2_NOTELEPORT) - PROP_RenderStyle (STYLE_Add) - - PROP_SpawnState (S_SORCSPARK1) -END_DEFAULTS +IMPLEMENT_CLASS (ASorcFX1) +*/ //============================================================================ // @@ -684,15 +240,15 @@ void A_SorcSpinBalls(AActor *actor) actor->special1 = ANGLE_1; z = actor->z - actor->floorclip + actor->height; - mo = Spawn (actor->x, actor->y, z, NO_REPLACE); + mo = Spawn("SorcBall1", actor->x, actor->y, z, NO_REPLACE); if (mo) { mo->target = actor; mo->special2 = SORCFX4_RAPIDFIRE_TIME; } - mo = Spawn (actor->x, actor->y, z, NO_REPLACE); + mo = Spawn("SorcBall2", actor->x, actor->y, z, NO_REPLACE); if (mo) mo->target = actor; - mo = Spawn (actor->x, actor->y, z, NO_REPLACE); + mo = Spawn("SorcBall3", actor->x, actor->y, z, NO_REPLACE); if (mo) mo->target = actor; } @@ -775,7 +331,7 @@ void A_SorcBallOrbit(AActor *ball) { // Put sorcerer into special throw spell anim if (parent->health > 0) - parent->SetStateNF (&AHeresiarch::States[S_SORC_ATTACK1]); + parent->SetState (parent->FindState("Attack1")); actor->DoFireSpell (); } @@ -790,7 +346,7 @@ void A_SorcBallOrbit(AActor *ball) parent->args[3] = SORC_STOPPED; // Back to orbit balls if (parent->health > 0) - parent->SetStateNF (&AHeresiarch::States[S_SORC_ATTACK1+3]); + parent->SetState (parent->FindState("Attack2")); } else { @@ -964,7 +520,7 @@ void ASorcBall::CastSorcererSpell () // Put sorcerer into throw spell animation if (target->health > 0) - target->SetStateNF (&AHeresiarch::States[S_SORC_ATTACK1+3]); + target->SetState (target->FindState("Attack2")); } //============================================================================ @@ -983,7 +539,7 @@ void ASorcBall2::CastSorcererSpell () AActor *mo; fixed_t z = parent->z - parent->floorclip + SORC_DEFENSE_HEIGHT*FRACUNIT; - mo = Spawn (x, y, z, ALLOW_REPLACE); + mo = Spawn("SorcFX2", x, y, z, ALLOW_REPLACE); parent->flags2 |= MF2_REFLECTIVE|MF2_INVULNERABLE; parent->args[0] = SORC_DEFENSE_TIME; if (mo) mo->target = parent; @@ -1007,18 +563,19 @@ void ASorcBall3::CastSorcererSpell () ang1 = angle - ANGLE_45; ang2 = angle + ANGLE_45; + const PClass *cls = PClass::FindClass("SorcFX3"); if (health < (GetDefault()->health/3)) { // Spawn 2 at a time - mo = P_SpawnMissileAngle(parent, RUNTIME_CLASS(ASorcFX3), ang1, 4*FRACUNIT); + mo = P_SpawnMissileAngle(parent, cls, ang1, 4*FRACUNIT); if (mo) mo->target = parent; - mo = P_SpawnMissileAngle(parent, RUNTIME_CLASS(ASorcFX3), ang2, 4*FRACUNIT); + mo = P_SpawnMissileAngle(parent, cls, ang2, 4*FRACUNIT); if (mo) mo->target = parent; } else { if (pr_heresiarch() < 128) ang1 = ang2; - mo = P_SpawnMissileAngle(parent, RUNTIME_CLASS(ASorcFX3), ang1, 4*FRACUNIT); + mo = P_SpawnMissileAngle(parent, cls, ang1, 4*FRACUNIT); if (mo) mo->target = parent; } } @@ -1055,7 +612,8 @@ void ASorcBall1::CastSorcererSpell () ang1 = angle + ANGLE_1*70; ang2 = angle - ANGLE_1*70; - mo = P_SpawnMissileAngle (parent, RUNTIME_CLASS(ASorcFX1), ang1, 0); + const PClass *cls = PClass::FindClass("SorcFX1"); + mo = P_SpawnMissileAngle (parent, cls, ang1, 0); if (mo) { mo->target = parent; @@ -1063,7 +621,7 @@ void ASorcBall1::CastSorcererSpell () mo->args[4] = BOUNCE_TIME_UNIT; mo->args[3] = 15; // Bounce time in seconds } - mo = P_SpawnMissileAngle (parent, RUNTIME_CLASS(ASorcFX1), ang2, 0); + mo = P_SpawnMissileAngle (parent, cls, ang2, 0); if (mo) { mo->target = parent; @@ -1101,7 +659,7 @@ void A_SorcOffense2(AActor *actor) delta = (finesine[index])*SORCFX4_SPREAD_ANGLE; delta = (delta>>FRACBITS)*ANGLE_1; ang1 = actor->angle + delta; - mo = P_SpawnMissileAngle(parent, RUNTIME_CLASS(ASorcFX4), ang1, 0); + mo = P_SpawnMissileAngle(parent, PClass::FindClass("SorcFX4"), ang1, 0); if (mo) { mo->special2 = 35*5/2; // 5 seconds @@ -1149,7 +707,7 @@ void A_SpawnFizzle(AActor *actor) z = actor->z - actor->floorclip + (actor->height>>1); for (ix=0; ix<5; ix++) { - mo = Spawn (x, y, z, ALLOW_REPLACE); + mo = Spawn("SorcSpark1", x, y, z, ALLOW_REPLACE); if (mo) { rangle = angle + ((pr_heresiarch()%5) << 1); @@ -1196,21 +754,21 @@ void A_SorcFX2Split(AActor *actor) { AActor *mo; - mo = Spawn (actor->x, actor->y, actor->z, NO_REPLACE); + mo = Spawn(actor->GetClass(), actor->x, actor->y, actor->z, NO_REPLACE); if (mo) { mo->target = actor->target; mo->args[0] = 0; // CW mo->special1 = actor->angle; // Set angle - mo->SetStateNF (&ASorcFX2::States[S_SORCFX2_ORBIT1]); + mo->SetState (mo->FindState("Orbit")); } - mo = Spawn (actor->x, actor->y, actor->z, NO_REPLACE); + mo = Spawn(actor->GetClass(), actor->x, actor->y, actor->z, NO_REPLACE); if (mo) { mo->target = actor->target; mo->args[0] = 1; // CCW mo->special1 = actor->angle; // Set angle - mo->SetStateNF (&ASorcFX2::States[S_SORCFX2_ORBIT1]); + mo->SetState (mo->FindState("Orbit")); } actor->Destroy (); } @@ -1241,7 +799,7 @@ void A_SorcFX2Orbit (AActor *actor) if ((parent->health <= 0) || // Sorcerer is dead (!parent->args[0])) // Time expired { - actor->SetStateNF (actor->FindState(NAME_Death)); + actor->SetState (actor->FindState(NAME_Death)); parent->args[0] = 0; parent->flags2 &= ~MF2_REFLECTIVE; parent->flags2 &= ~MF2_INVULNERABLE; @@ -1249,7 +807,7 @@ void A_SorcFX2Orbit (AActor *actor) if (actor->args[0] && (parent->args[0]-- <= 0)) // Time expired { - actor->SetStateNF (actor->FindState(NAME_Death)); + actor->SetState (actor->FindState(NAME_Death)); parent->args[0] = 0; parent->flags2 &= ~MF2_REFLECTIVE; } @@ -1264,7 +822,7 @@ void A_SorcFX2Orbit (AActor *actor) z = parent->z - parent->floorclip + SORC_DEFENSE_HEIGHT*FRACUNIT; z += FixedMul(15*FRACUNIT,finecosine[angle]); // Spawn trailer - Spawn (x, y, z, ALLOW_REPLACE); + Spawn("SorcFX2T1", x, y, z, ALLOW_REPLACE); } else // Clock wise { @@ -1275,7 +833,7 @@ void A_SorcFX2Orbit (AActor *actor) z = parent->z - parent->floorclip + SORC_DEFENSE_HEIGHT*FRACUNIT; z += FixedMul(20*FRACUNIT,finesine[angle]); // Spawn trailer - Spawn (x, y, z, ALLOW_REPLACE); + Spawn("SorcFX2T1", x, y, z, ALLOW_REPLACE); } actor->SetOrigin (x, y, z); @@ -1319,7 +877,7 @@ void A_SpawnBishop(AActor *actor) void A_SorcererBishopEntry(AActor *actor) { - Spawn (actor->x, actor->y, actor->z, ALLOW_REPLACE); + Spawn("SorcFX3Explosion", actor->x, actor->y, actor->z, ALLOW_REPLACE); S_Sound (actor, CHAN_VOICE, actor->SeeSound, 1, ATTN_NORM); } @@ -1335,7 +893,7 @@ void A_SorcFX4Check(AActor *actor) { if (actor->special2-- <= 0) { - actor->SetStateNF (actor->FindState(NAME_Death)); + actor->SetState (actor->FindState(NAME_Death)); } } diff --git a/wadsrc/static/actors/hexen/heresiarch.txt b/wadsrc/static/actors/hexen/heresiarch.txt new file mode 100644 index 0000000000..32e95b91a8 --- /dev/null +++ b/wadsrc/static/actors/hexen/heresiarch.txt @@ -0,0 +1,336 @@ + +// The Heresiarch him/itself ------------------------------------------------ + +ACTOR Heresiarch 10080 native +{ + Health 5000 + Painchance 10 + Speed 16 + Radius 40 + Height 110 + Mass 500 + Damage 9 + Monster + +FLOORCLIP + +BOSS + +DONTMORPH + +NOTARGET + +NOICEDEATH + +DEFLECT + SeeSound "SorcererSight" + PainSound "SorcererPain" + DeathSound "SorcererDeathScream" + ActiveSound "SorcererActive" + Obituary "$OB_HERESIARCH" + + action native A_SorcSpinBalls(); + action native A_SpeedBalls(); + action native A_SlowBalls(); + action native A_StopBalls(); + action native A_SorcBossAttack(); + action native A_SpawnFizzle(); + + States + { + Spawn: + SORC A 3 + SORC A 2 A_SorcSpinBalls + Idle: + SORC A 10 A_Look + Wait + See: + SORC ABCD 5 A_Chase + Loop + Pain: + SORC G 8 + SORC G 8 A_Pain + Goto See + Missile: + SORC F 6 Bright A_FaceTarget + SORC F 6 Bright A_SpeedBalls + SORC F 6 Bright A_FaceTarget + Wait + Attack1: + SORC E 6 Bright + SORC E 6 Bright A_SpawnFizzle + SORC E 5 Bright A_FaceTarget + Goto Attack1+1 + Attack2: + SORC E 2 Bright + SORC E 2 Bright A_SorcBossAttack + Goto See + Death: + SORC H 5 Bright + SORC I 5 Bright A_FaceTarget + SORC J 5 Bright A_Scream + SORC KLMNOPQRST 5 Bright + SORC U 5 Bright A_NoBlocking + SORC VWXY 5 Bright + SORC Z -1 Bright + Stop + } +} + +// Base class for the balls flying around the Heresiarch's head ------------- + +ACTOR SorcBall native +{ + Speed 10 + Radius 5 + Height 5 + Projectile + -ACTIVATEIMPACT + -ACTIVATEPCROSS + +FULLVOLDEATH + +CANBOUNCEWATER + +NOBOUNCESOUND + +HEXENBOUNCE + SeeSound "SorcererBallBounce" + DeathSound "SorcererBigBallExplode" + + action native A_SorcBallOrbit(); + action native A_AccelBalls(); + action native A_DecelBalls(); + action native A_SorcOffense2(); + action native A_SorcBallPop(); + action native A_BounceCheck (); +} + +// First ball (purple) - fires projectiles ---------------------------------- + +ACTOR SorcBall1 : SorcBall native +{ + States + { + Spawn: + SBMP ABCDEFGHIJKLMNOP 2 A_SorcBallOrbit + Loop + Pain: + SBMP A 5 A_SorcBallPop + SBMP B 2 A_BounceCheck + Wait + Death: + SBS4 D 5 A_Explode(255,255) + SBS4 E 5 + SBS4 FGH 6 + Stop + } +} + + +// Second ball (blue) - generates the shield -------------------------------- + +ACTOR SorcBall2 : SorcBall native +{ + States + { + Spawn: + SBMB ABCDEFGHIJKLMNOP 2 A_SorcBallOrbit + Loop + Pain: + SBMB A 5 A_SorcBallPop + SBMB B 2 A_BounceCheck + Wait + Death: + SBS3 D 5 A_Explode(255,255) + SBS3 E 5 + SBS3 FGH 6 + Stop + } +} + +// Third ball (green) - summons Bishops ------------------------------------- + +ACTOR SorcBall3 : SorcBall native +{ + States + { + Spawn: + SBMG ABCDEFGHIJKLMNOP 2 A_SorcBallOrbit + Loop + Pain: + SBMG A 5 A_SorcBallPop + SBMG B 2 A_BounceCheck + Wait + Death: + SBS3 D 5 A_Explode(255,255) + SBS3 E 5 + SBS3 FGH 6 + Stop + } +} + + +// Sorcerer spell 1 (The burning, bouncing head thing) ---------------------- + +ACTOR SorcFX1 +{ + Speed 7 + Radius 5 + Height 5 + Projectile + -ACTIVATEIMPACT + -ACTIVATEPCROSS + -NOGRAVITY + +FULLVOLDEATH + +CANBOUNCEWATER + +NOWALLBOUNCESND + BounceFactor 1.0 + +HEXENBOUNCE + SeeSound "SorcererBallBounce" + DeathSound "SorcererHeadScream" + + action native A_SorcFX1Seek(); + + States + { + Spawn: + SBS1 A 2 Bright + SBS1 BCD 3 Bright A_SorcFX1Seek + Loop + Death: + FHFX S 2 Bright A_Explode(30) + FHFX SS 6 Bright + Stop + } +} + + +// Sorcerer spell 2 (The visible part of the shield) ------------------------ + +ACTOR SorcFX2 +{ + Speed 15 + Radius 5 + Height 5 + +NOBLOCKMAP + +NOGRAVITY + +NOTELEPORT + + action native A_SorcFX2Split(); + action native A_SorcFX2Orbit (); + + states + { + Spawn: + SBS2 A 3 Bright A_SorcFX2Split + Loop + Orbit: + SBS2 A 2 Bright + SBS2 BCDEFGHIJKLMNOPA 2 Bright A_SorcFX2Orbit + Goto Orbit+1 + Death: + SBS2 A 10 + Stop + } +} + +// The translucent trail behind SorcFX2 ------------------------------------- + +ACTOR SorcFX2T1 : SorcFX2 +{ + RenderStyle Translucent + Alpha 0.4 + States + { + Spawn: + Goto Death + } +} + + +// Sorcerer spell 3 (The Bishop spawner) ------------------------------------ + +ACTOR SorcFX3 +{ + Speed 15 + Radius 22 + Height 65 + +NOBLOCKMAP + +MISSILE + +NOTELEPORT + SeeSound "SorcererBishopSpawn" + + action native A_SpawnBishop(); + action native A_SorcererBishopEntry(); + + States + { + Spawn: + SBS3 ABC 2 Bright + Loop + Death: + SBS3 A 4 Bright + BISH P 4 A_SorcererBishopEntry + BISH ON 4 + BISH MLKJIH 3 + BISH G 3 A_SpawnBishop + Stop + } +} + + +// The Bishop spawner's explosion animation --------------------------------- + +ACTOR SorcFX3Explosion +{ + +NOBLOCKMAP + +MISSILE + +NOTELEPORT + RenderStyle Translucent + Alpha 0.4 + States + { + Spawn: + SBS3 DEFGH 3 + Stop + } +} + + +// Sorcerer spell 4 (The purple projectile) --------------------------------- + +ACTOR SorcFX4 +{ + Speed 12 + Radius 10 + Height 10 + Projectile + -ACTIVATEIMPACT + -ACTIVATEPCROSS + DeathSound "SorcererBallExplode" + + action native A_SorcFX4Check(); + + States + { + Spawn: + SBS4 ABC 2 Bright A_SorcFX4Check + Loop + Death: + SBS4 D 2 Bright + SBS4 E 2 Bright A_Explode(20) + SBS4 FGH 2 Bright + Stop + } +} + + +// Spark that appears when shooting SorcFX4 --------------------------------- + +ACTOR SorcSpark1 +{ + Radius 5 + Height 5 + Gravity 0.125 + +NOBLOCKMAP + +DROPOFF + +NOTELEPORT + RenderStyle Add + States + { + Spawn: + SBFX ABCDEFG 4 Bright + Stop + } +} diff --git a/wadsrc/static/decorate.txt b/wadsrc/static/decorate.txt index f26bfb225f..ee33abba40 100644 --- a/wadsrc/static/decorate.txt +++ b/wadsrc/static/decorate.txt @@ -131,6 +131,7 @@ #include "actors/hexen/serpent.txt" #include "actors/hexen/spike.txt" #include "actors/hexen/wraith.txt" +#include "actors/hexen/heresiarch.txt" #include "actors/strife/strifehumanoid.txt" #include "actors/strife/strifeplayer.txt" diff --git a/zdoom.vcproj b/zdoom.vcproj index 685a1d678f..ef546bf44a 100644 --- a/zdoom.vcproj +++ b/zdoom.vcproj @@ -1,7 +1,7 @@ + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - @@ -953,6 +943,16 @@ Outputs=""src/$(InputName).h"" /> + + + @@ -1558,6 +1558,16 @@ Outputs="$(IntDir)\$(InputName).obj" /> + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + @@ -1800,14 +1808,6 @@ Outputs="$(IntDir)/$(InputName).obj" /> - - - @@ -1973,14 +1973,6 @@ Outputs="$(IntDir)\$(InputName).obj" /> - - - @@ -1991,6 +1983,14 @@ Outputs="$(IntDir)\$(InputName).obj" /> + + + - - - @@ -2877,6 +2869,14 @@ AdditionalIncludeDirectories="src\win32;$(NoInherit)" /> + + + @@ -3151,7 +3151,7 @@ />