From e010561088a23690db3111629d0336cdc80c67f2 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 8 Aug 2008 15:18:23 +0000 Subject: [PATCH] - Changed increased lightning damage for Centaurs into a damage factor. - Changed PoisonCloud and Lightning special treatment in P_DamageMobj to use damage types instead to keep dependencies on specific actor types out of the main engine code. - Added Korax DECORATE conversion by Gez and a few others by Karate Chris. SVN r1130 (trunk) --- docs/rh-log.txt | 4 + src/codepointers.h | 29 + src/g_hexen/a_dragon.cpp | 172 +----- src/g_hexen/a_flechette.cpp | 131 +---- src/g_hexen/a_hexenglobal.h | 24 - src/g_hexen/a_hexenspecialdecs.cpp | 537 +----------------- src/g_hexen/a_korax.cpp | 191 +------ src/g_hexen/a_magelightning.cpp | 20 +- src/g_hexen/a_summon.cpp | 20 +- src/g_shared/a_action.cpp | 34 ++ src/namedef.h | 1 + src/p_interaction.cpp | 4 +- wadsrc/static/actors/hexen/centaur.txt | 1 + wadsrc/static/actors/hexen/dragon.txt | 118 ++++ wadsrc/static/actors/hexen/flechette.txt | 101 ++++ .../static/actors/hexen/hexenspecialdecs.txt | 428 ++++++++++++++ wadsrc/static/actors/hexen/korax.txt | 125 ++++ wadsrc/static/actors/hexen/summon.txt | 23 + wadsrc/static/decorate.txt | 2 + 19 files changed, 918 insertions(+), 1047 deletions(-) create mode 100644 wadsrc/static/actors/hexen/dragon.txt create mode 100644 wadsrc/static/actors/hexen/korax.txt diff --git a/docs/rh-log.txt b/docs/rh-log.txt index ca0d3786e..28f21ceaf 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,8 @@ August 8, 2008 (Changes by Graf Zahl) +- Changed increased lightning damage for Centaurs into a damage factor. +- Changed PoisonCloud and Lightning special treatment in P_DamageMobj to use damage + types instead to keep dependencies on specific actor types out of the main engine code. +- Added Korax DECORATE conversion by Gez and a few others by Karate Chris. - Removed FourthWeaponClass and based Hexen's fourth weapons on the generic weapon pieces. - Added DECORATE conversions for Hexen's Fighter weapons by Karate Chris. diff --git a/src/codepointers.h b/src/codepointers.h index 30dc0341f..db9a2534d 100644 --- a/src/codepointers.h +++ b/src/codepointers.h @@ -206,6 +206,14 @@ ACTOR(MinotaurChase) ACTOR(MinotaurDeath) // Hexen stuff +ACTOR(KoraxChase) +ACTOR(KoraxDecide) +ACTOR(KoraxBonePop) +ACTOR(KoraxMissile) +ACTOR(KoraxCommand) +ACTOR(KSpiritRoam) +ACTOR(KBolt) +ACTOR(KBoltRaise) ACTOR(BatSpawnInit) ACTOR(BatSpawn) ACTOR(BatMove) @@ -265,10 +273,31 @@ WEAPON(FHammerThrow) ACTOR(DropWeaponPieces) WEAPON(FSwordAttack) WEAPON(FSwordFlames) +ACTOR(DragonInitFlight) +ACTOR(DragonFlap) +ACTOR(DragonFlight) +ACTOR(DragonPain) +ACTOR(DragonAttack) +ACTOR(DragonCheckCrash) +ACTOR(DragonFX2) +ACTOR(PotteryExplode) +ACTOR(PotteryChooseBit) +ACTOR(PotteryCheck) +ACTOR(CorpseBloodDrip) +ACTOR(CorpseExplode) +ACTOR(LeafSpawn) +ACTOR(LeafThrust) +ACTOR(LeafCheck) +ACTOR(PoisonShroom) +ACTOR(SoAExplode) +ACTOR(BellReset1) +ACTOR(BellReset2) ACTOR(Summon) ACTOR(PoisonBagInit) ACTOR(CheckThrowBomb) ACTOR(CheckThrowBomb2) +ACTOR(PoisonBagDamage) +ACTOR(PoisonBagCheck) ACTOR(ClassBossHealth) ACTOR(ClericAttack) ACTOR(FighterAttack) diff --git a/src/g_hexen/a_dragon.cpp b/src/g_hexen/a_dragon.cpp index c60d979f8..a81464fe6 100644 --- a/src/g_hexen/a_dragon.cpp +++ b/src/g_hexen/a_dragon.cpp @@ -19,168 +19,6 @@ void A_DragonAttack (AActor *); void A_DragonCheckCrash (AActor *); void A_DragonFX2 (AActor *); -// Dragon ------------------------------------------------------------------- - -class ADragon : public AActor -{ - DECLARE_ACTOR (ADragon, AActor) -}; - -FState ADragon::States[] = -{ -#define S_DRAGON_LOOK1 0 - S_NORMAL (DRAG, 'D', 10, A_Look , &States[S_DRAGON_LOOK1]), - -#define S_DRAGON_INIT (S_DRAGON_LOOK1+1) - S_NORMAL (DRAG, 'C', 5, NULL , &States[S_DRAGON_INIT+1]), - S_NORMAL (DRAG, 'B', 5, NULL , &States[S_DRAGON_INIT+2]), - S_NORMAL (DRAG, 'A', 5, A_DragonInitFlight , &States[S_DRAGON_INIT+3]), - S_NORMAL (DRAG, 'B', 3, A_DragonFlap , &States[S_DRAGON_INIT+4]), - S_NORMAL (DRAG, 'B', 3, A_DragonFlight , &States[S_DRAGON_INIT+5]), - S_NORMAL (DRAG, 'C', 3, A_DragonFlight , &States[S_DRAGON_INIT+6]), - S_NORMAL (DRAG, 'C', 3, A_DragonFlight , &States[S_DRAGON_INIT+7]), - S_NORMAL (DRAG, 'D', 3, A_DragonFlight , &States[S_DRAGON_INIT+8]), - S_NORMAL (DRAG, 'D', 3, A_DragonFlight , &States[S_DRAGON_INIT+9]), - S_NORMAL (DRAG, 'C', 3, A_DragonFlight , &States[S_DRAGON_INIT+10]), - S_NORMAL (DRAG, 'C', 3, A_DragonFlight , &States[S_DRAGON_INIT+11]), - S_NORMAL (DRAG, 'B', 3, A_DragonFlight , &States[S_DRAGON_INIT+12]), - S_NORMAL (DRAG, 'B', 3, A_DragonFlight , &States[S_DRAGON_INIT+13]), - S_NORMAL (DRAG, 'A', 3, A_DragonFlight , &States[S_DRAGON_INIT+14]), - S_NORMAL (DRAG, 'A', 3, A_DragonFlight , &States[S_DRAGON_INIT+3]), - -#define S_DRAGON_PAIN1 (S_DRAGON_INIT+15) - S_NORMAL (DRAG, 'F', 10, A_DragonPain , &States[S_DRAGON_INIT+3]), - -#define S_DRAGON_ATK1 (S_DRAGON_PAIN1+1) - S_NORMAL (DRAG, 'E', 8, A_DragonAttack , &States[S_DRAGON_INIT+3]), - -#define S_DRAGON_DEATH1 (S_DRAGON_ATK1+1) - S_NORMAL (DRAG, 'G', 5, A_Scream , &States[S_DRAGON_DEATH1+1]), - S_NORMAL (DRAG, 'H', 4, A_NoBlocking , &States[S_DRAGON_DEATH1+2]), - S_NORMAL (DRAG, 'I', 4, NULL , &States[S_DRAGON_DEATH1+3]), - S_NORMAL (DRAG, 'J', 4, A_DragonCheckCrash , &States[S_DRAGON_DEATH1+3]), - -#define S_DRAGON_CRASH1 (S_DRAGON_DEATH1+4) - S_NORMAL (DRAG, 'K', 5, NULL , &States[S_DRAGON_CRASH1+1]), - S_NORMAL (DRAG, 'L', 5, NULL , &States[S_DRAGON_CRASH1+2]), - S_NORMAL (DRAG, 'M', -1, NULL , NULL), - -}; - -IMPLEMENT_ACTOR (ADragon, Hexen, 254, 0) - PROP_SpawnHealth (640) - PROP_PainChance (128) - PROP_SpeedFixed (10) - PROP_HeightFixed (65) - PROP_MassLong (0x7fffffff) - PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOGRAVITY|MF_FLOAT|MF_NOBLOOD|MF_COUNTKILL) - PROP_Flags2 (MF2_PASSMOBJ|MF2_BOSS) - PROP_Flags3 (MF3_DONTMORPH|MF3_NOTARGET) - PROP_Flags4 (MF4_NOICEDEATH) - - PROP_SpawnState (S_DRAGON_LOOK1) - PROP_SeeState (S_DRAGON_INIT) - PROP_PainState (S_DRAGON_PAIN1) - PROP_MissileState (S_DRAGON_ATK1) - PROP_DeathState (S_DRAGON_DEATH1) - - PROP_SeeSound ("DragonSight") - PROP_AttackSound ("DragonAttack") - PROP_PainSound ("DragonPain") - PROP_DeathSound ("DragonDeath") - PROP_ActiveSound ("DragonActive") - PROP_Obituary ("$OB_DRAGON") -END_DEFAULTS - - - -// Dragon Fireball ---------------------------------------------------------- - -class ADragonFireball : public AActor -{ - DECLARE_ACTOR (ADragonFireball, AActor) -}; - -FState ADragonFireball::States[] = -{ -#define S_DRAGON_FX1_1 0 - S_BRIGHT (DRFX, 'A', 4, NULL , &States[S_DRAGON_FX1_1+1]), - S_BRIGHT (DRFX, 'B', 4, NULL , &States[S_DRAGON_FX1_1+2]), - S_BRIGHT (DRFX, 'C', 4, NULL , &States[S_DRAGON_FX1_1+3]), - S_BRIGHT (DRFX, 'D', 4, NULL , &States[S_DRAGON_FX1_1+4]), - S_BRIGHT (DRFX, 'E', 4, NULL , &States[S_DRAGON_FX1_1+5]), - S_BRIGHT (DRFX, 'F', 4, NULL , &States[S_DRAGON_FX1_1]), - -#define S_DRAGON_FX1_X1 (S_DRAGON_FX1_1+6) - S_BRIGHT (DRFX, 'G', 4, NULL , &States[S_DRAGON_FX1_X1+1]), - S_BRIGHT (DRFX, 'H', 4, NULL , &States[S_DRAGON_FX1_X1+2]), - S_BRIGHT (DRFX, 'I', 4, NULL , &States[S_DRAGON_FX1_X1+3]), - S_BRIGHT (DRFX, 'J', 4, A_DragonFX2 , &States[S_DRAGON_FX1_X1+4]), - S_BRIGHT (DRFX, 'K', 3, NULL , &States[S_DRAGON_FX1_X1+5]), - S_BRIGHT (DRFX, 'L', 3, NULL , NULL), -}; - -IMPLEMENT_ACTOR (ADragonFireball, Hexen, -1, 0) - PROP_SpeedFixed (24) - PROP_RadiusFixed (12) - PROP_HeightFixed (10) - PROP_Damage (6) - PROP_DamageType (NAME_Fire) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE) - PROP_Flags2 (MF2_NOTELEPORT) - PROP_RenderStyle (STYLE_Add) - - PROP_SpawnState (S_DRAGON_FX1_1) - PROP_DeathState (S_DRAGON_FX1_X1) - - PROP_DeathSound ("DragonFireballExplode") -END_DEFAULTS - -// Dragon Fireball Secondary Explosion -------------------------------------- - -class ADragonExplosion : public AActor -{ - DECLARE_ACTOR (ADragonExplosion, AActor) -public: - void GetExplodeParms (int &damage, int &distance, bool &hurtSource); -}; - -FState ADragonExplosion::States[] = -{ -#define S_DRAGON_FX2_1 0 - S_BRIGHT (CFCF, 'Q', 1, NULL , &States[S_DRAGON_FX2_1+1]), - S_BRIGHT (CFCF, 'Q', 4, A_UnHideThing , &States[S_DRAGON_FX2_1+2]), - S_BRIGHT (CFCF, 'R', 3, A_Scream , &States[S_DRAGON_FX2_1+3]), - S_BRIGHT (CFCF, 'S', 4, NULL , &States[S_DRAGON_FX2_1+4]), - S_BRIGHT (CFCF, 'T', 3, A_Explode , &States[S_DRAGON_FX2_1+5]), - S_BRIGHT (CFCF, 'U', 4, NULL , &States[S_DRAGON_FX2_1+6]), - S_BRIGHT (CFCF, 'V', 3, NULL , &States[S_DRAGON_FX2_1+7]), - S_BRIGHT (CFCF, 'W', 4, NULL , &States[S_DRAGON_FX2_1+8]), - S_BRIGHT (CFCF, 'X', 3, NULL , &States[S_DRAGON_FX2_1+9]), - S_BRIGHT (CFCF, 'Y', 4, NULL , &States[S_DRAGON_FX2_1+10]), - S_BRIGHT (CFCF, 'Z', 3, NULL , NULL), -}; - -IMPLEMENT_ACTOR (ADragonExplosion, Hexen, -1, 0) - PROP_RadiusFixed (8) - PROP_HeightFixed (8) - PROP_DamageType (NAME_Fire) - PROP_Flags (MF_NOBLOCKMAP) - PROP_Flags2 (MF2_NOTELEPORT) - PROP_RenderFlags (RF_INVISIBLE) - PROP_RenderStyle (STYLE_Add) - - PROP_SpawnState (S_DRAGON_FX2_1) - - PROP_DeathSound ("DragonFireballExplode") -END_DEFAULTS - -void ADragonExplosion::GetExplodeParms (int &damage, int &distance, bool &hurtSource) -{ - damage = 80; - hurtSource = false; -} - //============================================================================ // // DragonSeek @@ -258,7 +96,7 @@ static void DragonSeek (AActor *actor, angle_t thresh, angle_t turnMax) } else if (pr_dragonseek() < 128 && P_CheckMissileRange(actor)) { - P_SpawnMissile(actor, target, RUNTIME_CLASS(ADragonFireball)); + P_SpawnMissile(actor, target, PClass::FindClass ("DragonFireball")); S_Sound (actor, CHAN_WEAPON, actor->AttackSound, 1, ATTN_NORM); } actor->target = oldTarget; @@ -409,7 +247,7 @@ void A_DragonFlap (AActor *actor) void A_DragonAttack (AActor *actor) { - P_SpawnMissile (actor, actor->target, RUNTIME_CLASS(ADragonFireball)); + P_SpawnMissile (actor, actor->target, PClass::FindClass ("DragonFireball")); } //============================================================================ @@ -431,7 +269,7 @@ void A_DragonFX2 (AActor *actor) fixed_t y = actor->y+((pr_dragonfx2()-128)<<14); fixed_t z = actor->z+((pr_dragonfx2()-128)<<12); - mo = Spawn (x, y, z, ALLOW_REPLACE); + mo = Spawn ("DragonExplosion", x, y, z, ALLOW_REPLACE); if (mo) { mo->tics = delay+(pr_dragonfx2()&3)*i*2; @@ -451,7 +289,7 @@ void A_DragonPain (AActor *actor) A_Pain (actor); if (!actor->tracer) { // no destination spot yet - actor->SetState (&ADragon::States[S_DRAGON_INIT]); + actor->SetState (actor->SeeState); } } @@ -465,6 +303,6 @@ void A_DragonCheckCrash (AActor *actor) { if (actor->z <= actor->floorz) { - actor->SetState (&ADragon::States[S_DRAGON_CRASH1]); + actor->SetState (actor->FindState ("Crash")); } } diff --git a/src/g_hexen/a_flechette.cpp b/src/g_hexen/a_flechette.cpp index e619c4d66..55e7ec382 100644 --- a/src/g_hexen/a_flechette.cpp +++ b/src/g_hexen/a_flechette.cpp @@ -22,82 +22,29 @@ void A_CheckThrowBomb (AActor *); void A_CheckThrowBomb2 (AActor *); void A_TimeBomb(AActor *self); -// Fire Bomb (Flechette used by Mage) --------------------------------------- - -class AFireBomb : public AActor -{ - DECLARE_ACTOR (AFireBomb, AActor) -public: -}; - -FState AFireBomb::States[] = -{ -#define S_FIREBOMB1 0 - S_NORMAL (PSBG, 'A', 20, NULL , &States[S_FIREBOMB1+1]), - S_NORMAL (PSBG, 'A', 10, NULL , &States[S_FIREBOMB1+2]), - S_NORMAL (PSBG, 'A', 10, NULL , &States[S_FIREBOMB1+3]), - S_NORMAL (PSBG, 'B', 4, NULL , &States[S_FIREBOMB1+4]), - S_NORMAL (PSBG, 'C', 4, A_Scream , &States[S_FIREBOMB1+5]), - S_BRIGHT (XPL1, 'A', 4, A_TimeBomb , &States[S_FIREBOMB1+6]), - S_BRIGHT (XPL1, 'B', 4, NULL , &States[S_FIREBOMB1+7]), - S_BRIGHT (XPL1, 'C', 4, NULL , &States[S_FIREBOMB1+8]), - S_BRIGHT (XPL1, 'D', 4, NULL , &States[S_FIREBOMB1+9]), - S_BRIGHT (XPL1, 'E', 4, NULL , &States[S_FIREBOMB1+10]), - S_BRIGHT (XPL1, 'F', 4, NULL , NULL), -}; - -IMPLEMENT_ACTOR (AFireBomb, Hexen, -1, 0) - PROP_DamageType (NAME_Fire) - PROP_Flags (MF_NOGRAVITY) - PROP_Flags3 (MF3_FOILINVUL) - PROP_RenderStyle (STYLE_Translucent) - PROP_Alpha (HX_ALTSHADOW) - - PROP_SpawnState (S_FIREBOMB1) - - PROP_DeathSound ("FlechetteExplode") -END_DEFAULTS - // Poison Bag Artifact (Flechette) ------------------------------------------ class AArtiPoisonBag : public AInventory { - DECLARE_ACTOR (AArtiPoisonBag, AInventory) + DECLARE_CLASS (AArtiPoisonBag, AInventory) public: bool HandlePickup (AInventory *item); AInventory *CreateCopy (AActor *other); void BeginPlay (); }; -FState AArtiPoisonBag::States[] = -{ - S_NORMAL (PSBG, 'A', -1, NULL , NULL), -}; - -IMPLEMENT_ACTOR (AArtiPoisonBag, Hexen, 8000, 72) - PROP_Flags (MF_SPECIAL) - PROP_Flags2 (MF2_FLOATBOB) - PROP_SpawnState (0) - PROP_Inventory_DefMaxAmount - PROP_Inventory_PickupFlash (1) - PROP_Inventory_FlagsSet (IF_INVBAR|IF_FANCYPICKUPSOUND) - PROP_Inventory_Icon ("ARTIPSBG") - PROP_Inventory_PickupSound ("misc/p_pkup") - PROP_Inventory_PickupMessage("$TXT_ARTIPOISONBAG") -END_DEFAULTS +IMPLEMENT_CLASS (AArtiPoisonBag) // Poison Bag 1 (The Cleric's) ---------------------------------------------- class AArtiPoisonBag1 : public AArtiPoisonBag { - DECLARE_STATELESS_ACTOR (AArtiPoisonBag1, AArtiPoisonBag) + DECLARE_CLASS (AArtiPoisonBag1, AArtiPoisonBag) public: bool Use (bool pickup); }; -IMPLEMENT_STATELESS_ACTOR (AArtiPoisonBag1, Hexen, -1, 0) - PROP_Inventory_Icon ("ARTIPSB1") -END_DEFAULTS +IMPLEMENT_CLASS (AArtiPoisonBag1) bool AArtiPoisonBag1::Use (bool pickup) { @@ -120,21 +67,19 @@ bool AArtiPoisonBag1::Use (bool pickup) class AArtiPoisonBag2 : public AArtiPoisonBag { - DECLARE_STATELESS_ACTOR (AArtiPoisonBag2, AArtiPoisonBag) + DECLARE_CLASS (AArtiPoisonBag2, AArtiPoisonBag) public: bool Use (bool pickup); }; -IMPLEMENT_STATELESS_ACTOR (AArtiPoisonBag2, Hexen, -1, 0) - PROP_Inventory_Icon ("ARTIPSB2") -END_DEFAULTS +IMPLEMENT_CLASS (AArtiPoisonBag2) bool AArtiPoisonBag2::Use (bool pickup) { angle_t angle = Owner->angle >> ANGLETOFINESHIFT; AActor *mo; - mo = Spawn ( + mo = Spawn ("FireBomb", Owner->x+16*finecosine[angle], Owner->y+24*finesine[angle], Owner->z- Owner->floorclip+8*FRACUNIT, ALLOW_REPLACE); @@ -150,14 +95,12 @@ bool AArtiPoisonBag2::Use (bool pickup) class AArtiPoisonBag3 : public AArtiPoisonBag { - DECLARE_STATELESS_ACTOR (AArtiPoisonBag3, AArtiPoisonBag) + DECLARE_CLASS (AArtiPoisonBag3, AArtiPoisonBag) public: bool Use (bool pickup); }; -IMPLEMENT_STATELESS_ACTOR (AArtiPoisonBag3, Hexen, -1, 0) - PROP_Inventory_Icon ("ARTIPSB3") -END_DEFAULTS +IMPLEMENT_CLASS (AArtiPoisonBag3) bool AArtiPoisonBag3::Use (bool pickup) { @@ -289,49 +232,15 @@ void AArtiPoisonBag::BeginPlay () // Poison Cloud ------------------------------------------------------------- -FState APoisonCloud::States[] = +class APoisonCloud : public AActor { -#define S_POISONCLOUD1 0 - S_NORMAL (PSBG, 'D', 1, NULL , &States[S_POISONCLOUD1+1]), - S_NORMAL (PSBG, 'D', 1, A_Scream , &States[S_POISONCLOUD1+2]), - S_NORMAL (PSBG, 'D', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+3]), - S_NORMAL (PSBG, 'E', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+4]), - S_NORMAL (PSBG, 'E', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+5]), - S_NORMAL (PSBG, 'E', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+6]), - S_NORMAL (PSBG, 'F', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+7]), - S_NORMAL (PSBG, 'F', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+8]), - S_NORMAL (PSBG, 'F', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+9]), - S_NORMAL (PSBG, 'G', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+10]), - S_NORMAL (PSBG, 'G', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+11]), - S_NORMAL (PSBG, 'G', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+12]), - S_NORMAL (PSBG, 'H', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+13]), - S_NORMAL (PSBG, 'H', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+14]), - S_NORMAL (PSBG, 'H', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+15]), - S_NORMAL (PSBG, 'I', 2, A_PoisonBagDamage , &States[S_POISONCLOUD1+16]), - S_NORMAL (PSBG, 'I', 1, A_PoisonBagDamage , &States[S_POISONCLOUD1+17]), - S_NORMAL (PSBG, 'I', 1, A_PoisonBagCheck , &States[S_POISONCLOUD1+3]), - -#define S_POISONCLOUD_X1 (S_POISONCLOUD1+18) - S_NORMAL (PSBG, 'H', 7, NULL , &States[S_POISONCLOUD_X1+1]), - S_NORMAL (PSBG, 'G', 7, NULL , &States[S_POISONCLOUD_X1+2]), - S_NORMAL (PSBG, 'F', 6, NULL , &States[S_POISONCLOUD_X1+3]), - S_NORMAL (PSBG, 'D', 6, NULL , NULL) + DECLARE_CLASS (APoisonCloud, AActor) +public: + int DoSpecialDamage (AActor *target, int damage); + void BeginPlay (); }; -IMPLEMENT_ACTOR (APoisonCloud, Hexen, -1, 0) - PROP_Radius (20) - PROP_Height (30) - PROP_MassLong (0x7fffffff) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF) - PROP_Flags2 (MF2_NODMGTHRUST) - PROP_Flags3 (MF3_DONTSPLASH|MF3_FOILINVUL|MF3_CANBLAST|MF3_BLOODLESSIMPACT) - PROP_RenderStyle (STYLE_Translucent) - PROP_Alpha (HX_SHADOW) - - PROP_SpawnState (S_POISONCLOUD1) - - PROP_DeathSound ("PoisonShroomDeath") -END_DEFAULTS +IMPLEMENT_CLASS (APoisonCloud) void APoisonCloud::BeginPlay () { @@ -340,12 +249,6 @@ void APoisonCloud::BeginPlay () special2 = 0; } -void APoisonCloud::GetExplodeParms (int &damage, int &distance, bool &hurtSource) -{ - damage = 4; - distance = 40; -} - int APoisonCloud::DoSpecialDamage (AActor *victim, int damage) { if (victim->player) @@ -414,7 +317,7 @@ void A_PoisonBagCheck (AActor *actor) { if (--actor->special1 <= 0) { - actor->SetState (&APoisonCloud::States[S_POISONCLOUD_X1]); + actor->SetState (actor->FindState ("Death")); } else { @@ -432,7 +335,7 @@ void A_PoisonBagDamage (AActor *actor) { int bobIndex; - A_Explode (actor); + P_RadiusAttack (actor, actor->target, 4, 40, actor->DamageType, true); bobIndex = actor->special2; actor->z += FloatBobOffsets[bobIndex]>>4; actor->special2 = (bobIndex+1)&63; diff --git a/src/g_hexen/a_hexenglobal.h b/src/g_hexen/a_hexenglobal.h index 291f23434..87d1bf11d 100644 --- a/src/g_hexen/a_hexenglobal.h +++ b/src/g_hexen/a_hexenglobal.h @@ -3,22 +3,6 @@ #include "d_player.h" -class ALightning : public AActor -{ - DECLARE_CLASS (ALightning, AActor) -public: - int SpecialMissileHit (AActor *victim); -}; - -class APoisonCloud : public AActor -{ - DECLARE_ACTOR (APoisonCloud, AActor) -public: - void GetExplodeParms (int &damage, int &distance, bool &hurtSource); - int DoSpecialDamage (AActor *target, int damage); - void BeginPlay (); -}; - class AHeresiarch : public AActor { DECLARE_ACTOR (AHeresiarch, AActor) @@ -59,12 +43,4 @@ public: bool TryPickup (AActor *toucher); }; -class ASwitchableDecoration : public AActor -{ - DECLARE_STATELESS_ACTOR (ASwitchableDecoration, AActor) -public: - void Activate (AActor *activator); - void Deactivate (AActor *activator); -}; - #endif //__A_HEXENGLOBAL_H__ diff --git a/src/g_hexen/a_hexenspecialdecs.cpp b/src/g_hexen/a_hexenspecialdecs.cpp index 7ca7447e4..6a745710f 100644 --- a/src/g_hexen/a_hexenspecialdecs.cpp +++ b/src/g_hexen/a_hexenspecialdecs.cpp @@ -22,33 +22,6 @@ static FRandom pr_leafcheck ("LeafCheck"); static FRandom pr_shroom ("PoisonShroom"); static FRandom pr_soaexplode ("SoAExplode"); -// SwitchableDecoration: Activate and Deactivate change state --------------- - -IMPLEMENT_ABSTRACT_ACTOR (ASwitchableDecoration) - -void ASwitchableDecoration::Activate (AActor *activator) -{ - SetState (FindState(NAME_Active)); -} - -void ASwitchableDecoration::Deactivate (AActor *activator) -{ - SetState (FindState(NAME_Inactive)); -} - -// SwitchingDecoration: Only Activate changes state ------------------------- - -class ASwitchingDecoration : public ASwitchableDecoration -{ - DECLARE_STATELESS_ACTOR (ASwitchingDecoration, ASwitchableDecoration) -public: - void Deactivate (AActor *activator) {} -}; - -IMPLEMENT_ABSTRACT_ACTOR (ASwitchingDecoration) - - - // Pottery1 ------------------------------------------------------------------ void A_PotteryExplode (AActor *); @@ -57,31 +30,12 @@ void A_PotteryCheck (AActor *); class APottery1 : public AActor { - DECLARE_ACTOR (APottery1, AActor) + DECLARE_CLASS (APottery1, AActor) public: void HitFloor (); }; -FState APottery1::States[] = -{ -#define S_ZPOTTERY 0 - S_NORMAL (POT1, 'A', -1, NULL , NULL), - -#define S_ZPOTTERY_EXPLODE (S_ZPOTTERY+1) - S_NORMAL (POT1, 'A', 0, A_PotteryExplode , NULL) -}; - -IMPLEMENT_ACTOR (APottery1, Hexen, 104, 0) - PROP_SpawnHealth (15) - PROP_RadiusFixed (10) - PROP_HeightFixed (32) - PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_DROPOFF) - PROP_Flags2 (MF2_SLIDE|MF2_PUSHABLE|MF2_TELESTOMP|MF2_PASSMOBJ) - PROP_Flags4 (MF4_NOICEDEATH) - - PROP_SpawnState (S_ZPOTTERY) - PROP_DeathState (S_ZPOTTERY_EXPLODE) -END_DEFAULTS +IMPLEMENT_CLASS (APottery1) void APottery1::HitFloor () { @@ -89,91 +43,6 @@ void APottery1::HitFloor () P_DamageMobj (this, NULL, NULL, 25, NAME_None); } -// Pottery2 ----------------------------------------------------------------- - -class APottery2 : public APottery1 -{ - DECLARE_ACTOR (APottery2, APottery1) -}; - -FState APottery2::States[] = -{ - S_NORMAL (POT2, 'A', -1, NULL , NULL), -}; - -IMPLEMENT_ACTOR (APottery2, Hexen, 105, 0) - PROP_HeightFixed (25) - PROP_SpawnState (0) -END_DEFAULTS - -// Pottery3 ----------------------------------------------------------------- - -class APottery3 : public APottery1 -{ - DECLARE_ACTOR (APottery3, APottery1) -}; - -FState APottery3::States[] = -{ - S_NORMAL (POT3, 'A', -1, NULL , NULL), -}; - -IMPLEMENT_ACTOR (APottery3, Hexen, 106, 0) - PROP_HeightFixed (25) - PROP_SpawnState (0) -END_DEFAULTS - -// Pottery Bit -------------------------------------------------------------- - -class APotteryBit : public AActor -{ - DECLARE_ACTOR (APotteryBit, AActor) -}; - -FState APotteryBit::States[] = -{ -#define S_POTTERYBIT 0 - S_NORMAL (PBIT, 'A', -1, NULL , NULL), - S_NORMAL (PBIT, 'B', -1, NULL , NULL), - S_NORMAL (PBIT, 'C', -1, NULL , NULL), - S_NORMAL (PBIT, 'D', -1, NULL , NULL), - S_NORMAL (PBIT, 'E', -1, NULL , NULL), - -#define S_POTTERYBIT_EX0 (S_POTTERYBIT+5) - S_NORMAL (PBIT, 'F', 0, A_PotteryChooseBit , NULL), - -#define S_POTTERYBIT_EX1 (S_POTTERYBIT_EX0+1) - S_NORMAL (PBIT, 'F', 140, NULL , &States[S_POTTERYBIT_EX0+1]), - S_NORMAL (PBIT, 'F', 1, A_PotteryCheck , NULL), - -#define S_POTTERYBIT_EX2 (S_POTTERYBIT_EX1+2) - S_NORMAL (PBIT, 'G', 140, NULL , &States[S_POTTERYBIT_EX1+1]), - S_NORMAL (PBIT, 'G', 1, A_PotteryCheck , NULL), - -#define S_POTTERYBIT_EX3 (S_POTTERYBIT_EX2+2) - S_NORMAL (PBIT, 'H', 140, NULL , &States[S_POTTERYBIT_EX2+1]), - S_NORMAL (PBIT, 'H', 1, A_PotteryCheck , NULL), - -#define S_POTTERYBIT_EX4 (S_POTTERYBIT_EX3+2) - S_NORMAL (PBIT, 'I', 140, NULL , &States[S_POTTERYBIT_EX3+1]), - S_NORMAL (PBIT, 'I', 1, A_PotteryCheck , NULL), - -#define S_POTTERYBIT_EX5 (S_POTTERYBIT_EX4+2) - S_NORMAL (PBIT, 'J', 140, NULL , &States[S_POTTERYBIT_EX4+1]), - S_NORMAL (PBIT, 'J', 1, A_PotteryCheck , NULL) -}; - -IMPLEMENT_ACTOR (APotteryBit, Hexen, -1, 0) - PROP_RadiusFixed (5) - PROP_HeightFixed (5) - PROP_Flags (MF_MISSILE) - PROP_Flags2 (MF2_NOTELEPORT) - PROP_Flags4 (MF4_NOICEDEATH) - - PROP_SpawnState (S_POTTERYBIT) - PROP_DeathState (S_POTTERYBIT_EX0) -END_DEFAULTS - //============================================================================ // // A_PotteryExplode @@ -187,7 +56,7 @@ void A_PotteryExplode (AActor *actor) for(i = (pr_pottery()&3)+3; i; i--) { - mo = Spawn (actor->x, actor->y, actor->z, ALLOW_REPLACE); + mo = Spawn ("PotteryBit", actor->x, actor->y, actor->z, ALLOW_REPLACE); mo->SetState (mo->SpawnState + (pr_pottery()%5)); if (mo) { @@ -245,82 +114,25 @@ void A_PotteryCheck (AActor *actor) } } -// Blood pool --------------------------------------------------------------- - -class ABloodPool : public AActor -{ - DECLARE_ACTOR (ABloodPool, AActor) -}; - -FState ABloodPool::States[] = -{ - S_NORMAL (BDPL, 'A', -1, NULL , NULL) -}; - -IMPLEMENT_ACTOR (ABloodPool, Hexen, 111, 0) - PROP_SpawnState (0) -END_DEFAULTS - // Lynched corpse (no heart) ------------------------------------------------ void A_CorpseBloodDrip (AActor *); class AZCorpseLynchedNoHeart : public AActor { - DECLARE_ACTOR (AZCorpseLynchedNoHeart, AActor) +DECLARE_CLASS (AZCorpseLynchedNoHeart, AActor) public: void PostBeginPlay (); }; -FState AZCorpseLynchedNoHeart::States[] = -{ - S_NORMAL (CPS5, 'A', 140, A_CorpseBloodDrip , &States[0]) -}; - -IMPLEMENT_ACTOR (AZCorpseLynchedNoHeart, Hexen, 109, 0) - PROP_RadiusFixed (10) - PROP_HeightFixed (100) - PROP_Flags (MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY) - - PROP_SpawnState (0) -END_DEFAULTS +IMPLEMENT_CLASS (AZCorpseLynchedNoHeart) void AZCorpseLynchedNoHeart::PostBeginPlay () { Super::PostBeginPlay (); - Spawn (x, y, ONFLOORZ, ALLOW_REPLACE); + Spawn ("BloodPool", x, y, ONFLOORZ, ALLOW_REPLACE); } -// CorpseBloodDrip ---------------------------------------------------------- - -class ACorpseBloodDrip : public AActor -{ - DECLARE_ACTOR (ACorpseBloodDrip, AActor) -}; - -FState ACorpseBloodDrip::States[] = -{ -#define S_CORPSEBLOODDRIP 0 - S_NORMAL (BDRP, 'A', -1, NULL , NULL), - -#define S_CORPSEBLOODDRIP_X (S_CORPSEBLOODDRIP+1) - S_NORMAL (BDSH, 'A', 3, NULL , &States[S_CORPSEBLOODDRIP_X+1]), - S_NORMAL (BDSH, 'B', 3, NULL , &States[S_CORPSEBLOODDRIP_X+2]), - S_NORMAL (BDSH, 'C', 2, NULL , &States[S_CORPSEBLOODDRIP_X+3]), - S_NORMAL (BDSH, 'D', 2, NULL , NULL) -}; - -IMPLEMENT_ACTOR (ACorpseBloodDrip, Hexen, -1, 0) - PROP_RadiusFixed (1) - PROP_HeightFixed (4) - PROP_Gravity (FRACUNIT/8) - PROP_Flags (MF_MISSILE) - PROP_Flags4 (MF4_NOICEDEATH) - - PROP_SpawnState (S_CORPSEBLOODDRIP) - PROP_DeathState (S_CORPSEBLOODDRIP_X) -END_DEFAULTS - //============================================================================ // // A_CorpseBloodDrip @@ -331,62 +143,10 @@ void A_CorpseBloodDrip (AActor *actor) { if (pr_drip() <= 128) { - Spawn (actor->x, actor->y, actor->z + actor->height/2, ALLOW_REPLACE); + Spawn ("CorpseBloodDrip", actor->x, actor->y, actor->z + actor->height/2, ALLOW_REPLACE); } } -// Corpse bit --------------------------------------------------------------- - -class ACorpseBit : public AActor -{ - DECLARE_ACTOR (ACorpseBit, AActor) -}; - -FState ACorpseBit::States[] = -{ - S_NORMAL (CPB1, 'A', -1, NULL , NULL), - S_NORMAL (CPB2, 'A', -1, NULL , NULL), - S_NORMAL (CPB3, 'A', -1, NULL , NULL), - S_NORMAL (CPB4, 'A', -1, NULL , NULL) -}; - -IMPLEMENT_ACTOR (ACorpseBit, Hexen, -1, 0) - PROP_RadiusFixed (5) - PROP_HeightFixed (5) - PROP_Flags (MF_NOBLOCKMAP) - PROP_Flags2 (MF2_TELESTOMP) - - PROP_SpawnState (0) -END_DEFAULTS - -// Corpse (sitting, splatterable) ------------------------------------------- - -void A_CorpseExplode (AActor *); - -class AZCorpseSitting : public AActor -{ - DECLARE_ACTOR (AZCorpseSitting, AActor) -}; - -FState AZCorpseSitting::States[] = -{ - S_NORMAL (CPS6, 'A', -1, NULL , NULL), - S_NORMAL (CPS6, 'A', 1, A_CorpseExplode , NULL) -}; - -IMPLEMENT_ACTOR (AZCorpseSitting, Hexen, 110, 0) - PROP_SpawnHealth (30) - PROP_RadiusFixed (15) - PROP_HeightFixed (35) - PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD) - PROP_Flags4 (MF4_NOICEDEATH) - - PROP_SpawnState (0) - PROP_DeathState (1) - - PROP_DeathSound ("FireDemonDeath") -END_DEFAULTS - //============================================================================ // // A_CorpseExplode @@ -400,7 +160,7 @@ void A_CorpseExplode (AActor *actor) for (i = (pr_foo()&3)+3; i; i--) { - mo = Spawn (actor->x, actor->y, actor->z, ALLOW_REPLACE); + mo = Spawn ("CorpseBit", actor->x, actor->y, actor->z, ALLOW_REPLACE); mo->SetState (mo->SpawnState + (pr_foo()%3)); if (mo) { @@ -410,7 +170,7 @@ void A_CorpseExplode (AActor *actor) } } // Spawn a skull - mo = Spawn (actor->x, actor->y, actor->z, ALLOW_REPLACE); + mo = Spawn ("CorpseBit", actor->x, actor->y, actor->z, ALLOW_REPLACE); mo->SetState (mo->SpawnState + 3); if (mo) { @@ -422,106 +182,6 @@ void A_CorpseExplode (AActor *actor) actor->Destroy (); } -// Leaf Spawner ------------------------------------------------------------- - -void A_LeafSpawn (AActor *); -void A_LeafThrust (AActor *); -void A_LeafCheck (AActor *); - -class ALeafSpawner : public AActor -{ - DECLARE_ACTOR (ALeafSpawner, AActor) -}; - -FState ALeafSpawner::States[] = -{ - S_NORMAL (TNT1, 'A', 20, A_LeafSpawn , &States[0]) -}; - -IMPLEMENT_ACTOR (ALeafSpawner, Hexen, 113, 0) - PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR) - PROP_RenderFlags (RF_INVISIBLE) - PROP_SpawnState (0) -END_DEFAULTS - -// Leaves ------------------------------------------------------------------- - -class ALeaf1 : public AActor -{ - DECLARE_ACTOR (ALeaf1, AActor) -}; - -FState ALeaf1::States[] = -{ -#define S_LEAF1 0 - S_NORMAL (LEF1, 'A', 4, NULL , &States[S_LEAF1+1]), - S_NORMAL (LEF1, 'B', 4, NULL , &States[S_LEAF1+2]), - S_NORMAL (LEF1, 'C', 4, NULL , &States[S_LEAF1+3]), - S_NORMAL (LEF1, 'D', 4, A_LeafThrust , &States[S_LEAF1+4]), - S_NORMAL (LEF1, 'E', 4, NULL , &States[S_LEAF1+5]), - S_NORMAL (LEF1, 'F', 4, NULL , &States[S_LEAF1+6]), - S_NORMAL (LEF1, 'G', 4, NULL , &States[S_LEAF1+7]), - S_NORMAL (LEF1, 'H', 4, A_LeafThrust , &States[S_LEAF1+8]), - S_NORMAL (LEF1, 'I', 4, NULL , &States[S_LEAF1+9]), - S_NORMAL (LEF1, 'A', 4, NULL , &States[S_LEAF1+10]), - S_NORMAL (LEF1, 'B', 4, NULL , &States[S_LEAF1+11]), - S_NORMAL (LEF1, 'C', 4, A_LeafThrust , &States[S_LEAF1+12]), - S_NORMAL (LEF1, 'D', 4, NULL , &States[S_LEAF1+13]), - S_NORMAL (LEF1, 'E', 4, NULL , &States[S_LEAF1+14]), - S_NORMAL (LEF1, 'F', 4, NULL , &States[S_LEAF1+15]), - S_NORMAL (LEF1, 'G', 4, A_LeafThrust , &States[S_LEAF1+16]), - S_NORMAL (LEF1, 'H', 4, NULL , &States[S_LEAF1+17]), - S_NORMAL (LEF1, 'I', 4, NULL , NULL), - -#define S_LEAF_X (S_LEAF1+18) - S_NORMAL (LEF3, 'D', 10, A_LeafCheck , &States[S_LEAF_X+0]) -}; - -IMPLEMENT_ACTOR (ALeaf1, Hexen, -1, 0) - PROP_RadiusFixed (2) - PROP_HeightFixed (4) - PROP_Gravity (FRACUNIT/8) - PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE) - PROP_Flags2 (MF2_NOTELEPORT) - PROP_Flags3 (MF3_DONTSPLASH) - PROP_Flags4 (MF4_NOICEDEATH) - - PROP_SpawnState (S_LEAF1) - PROP_DeathState (S_LEAF_X) -END_DEFAULTS - -class ALeaf2 : public ALeaf1 -{ - DECLARE_ACTOR (ALeaf2, ALeaf1) -}; - -FState ALeaf2::States[] = -{ -#define S_LEAF2 0 - S_NORMAL (LEF2, 'A', 4, NULL , &States[S_LEAF2+1]), - S_NORMAL (LEF2, 'B', 4, NULL , &States[S_LEAF2+2]), - S_NORMAL (LEF2, 'C', 4, NULL , &States[S_LEAF2+3]), - S_NORMAL (LEF2, 'D', 4, A_LeafThrust , &States[S_LEAF2+4]), - S_NORMAL (LEF2, 'E', 4, NULL , &States[S_LEAF2+5]), - S_NORMAL (LEF2, 'F', 4, NULL , &States[S_LEAF2+6]), - S_NORMAL (LEF2, 'G', 4, NULL , &States[S_LEAF2+7]), - S_NORMAL (LEF2, 'H', 4, A_LeafThrust , &States[S_LEAF2+8]), - S_NORMAL (LEF2, 'I', 4, NULL , &States[S_LEAF2+9]), - S_NORMAL (LEF2, 'A', 4, NULL , &States[S_LEAF2+10]), - S_NORMAL (LEF2, 'B', 4, NULL , &States[S_LEAF2+11]), - S_NORMAL (LEF2, 'C', 4, A_LeafThrust , &States[S_LEAF2+12]), - S_NORMAL (LEF2, 'D', 4, NULL , &States[S_LEAF2+13]), - S_NORMAL (LEF2, 'E', 4, NULL , &States[S_LEAF2+14]), - S_NORMAL (LEF2, 'F', 4, NULL , &States[S_LEAF2+15]), - S_NORMAL (LEF2, 'G', 4, A_LeafThrust , &States[S_LEAF2+16]), - S_NORMAL (LEF2, 'H', 4, NULL , &States[S_LEAF2+17]), - S_NORMAL (LEF2, 'I', 4, NULL , NULL) -}; - -IMPLEMENT_ACTOR (ALeaf2, Hexen, -1, 0) - PROP_SpawnState (S_LEAF2) -END_DEFAULTS - //============================================================================ // // A_LeafSpawn @@ -535,7 +195,7 @@ void A_LeafSpawn (AActor *actor) for (i = (pr_leaf()&3)+1; i; i--) { - mo = Spawn (pr_leaf()&1 ? RUNTIME_CLASS(ALeaf1) : RUNTIME_CLASS(ALeaf2), + mo = Spawn (pr_leaf()&1 ? PClass::FindClass ("Leaf1") : PClass::FindClass ("Leaf2"), actor->x + (pr_leaf.Random2()<<14), actor->y + (pr_leaf.Random2()<<14), actor->z + (pr_leaf()<<14), ALLOW_REPLACE); @@ -591,53 +251,6 @@ void A_LeafCheck (AActor *actor) actor->flags |= MF_MISSILE; } -// Torch base class --------------------------------------------------------- - - - -// Poison Shroom ------------------------------------------------------------ - -void A_PoisonShroom (AActor *); -void A_PoisonBagInit (AActor *); - -class AZPoisonShroom : public AActor -{ - DECLARE_ACTOR (AZPoisonShroom, AActor) -}; - -FState AZPoisonShroom::States[] = -{ -#define S_ZPOISONSHROOM_P 0 - S_NORMAL (SHRM, 'A', 6, NULL , &States[S_ZPOISONSHROOM_P+1]), - S_NORMAL (SHRM, 'B', 8, A_Pain , &States[S_ZPOISONSHROOM_P+2]),//<-- Intentional state - -#define S_ZPOISONSHROOM (S_ZPOISONSHROOM_P+2) - S_NORMAL (SHRM, 'A', 5, A_PoisonShroom , &States[S_ZPOISONSHROOM_P+1]), - -#define S_ZPOISONSHROOM_X (S_ZPOISONSHROOM+1) - S_NORMAL (SHRM, 'C', 5, NULL , &States[S_ZPOISONSHROOM_X+1]), - S_NORMAL (SHRM, 'D', 5, NULL , &States[S_ZPOISONSHROOM_X+2]), - S_NORMAL (SHRM, 'E', 5, A_PoisonBagInit , &States[S_ZPOISONSHROOM_X+3]), - S_NORMAL (SHRM, 'F', -1, NULL , NULL) -}; - -IMPLEMENT_ACTOR (AZPoisonShroom, Hexen, 8104, 0) - PROP_RadiusFixed (6) - PROP_HeightFixed (20) - PROP_PainChance (255) - PROP_SpawnHealth (30) - PROP_MassLong (0x7fffffff) - PROP_Flags (MF_SHOOTABLE|MF_SOLID|MF_NOBLOOD) - PROP_Flags4 (MF4_NOICEDEATH) - - PROP_SpawnState (S_ZPOISONSHROOM) - PROP_PainState (S_ZPOISONSHROOM_P) - PROP_DeathState (S_ZPOISONSHROOM_X) - - PROP_PainSound ("PoisonShroomPain") - PROP_DeathSound ("PoisonShroomDeath") -END_DEFAULTS - //=========================================================================== // // A_PoisonShroom @@ -649,63 +262,6 @@ void A_PoisonShroom (AActor *actor) actor->tics = 128+(pr_shroom()<<1); } - -// Suit of armor ------------------------------------------------------------ - -void A_SoAExplode (AActor *); - -class AZSuitOfArmor : public AActor -{ - DECLARE_ACTOR (AZSuitOfArmor, AActor) -}; - -FState AZSuitOfArmor::States[] = -{ - S_NORMAL (ZSUI, 'A', -1, NULL , NULL), - S_NORMAL (ZSUI, 'A', 1, A_SoAExplode , NULL) -}; - -IMPLEMENT_ACTOR (AZSuitOfArmor, Hexen, 8064, 0) - PROP_SpawnHealth (60) - PROP_RadiusFixed (16) - PROP_HeightFixed (72) - PROP_MassLong (0x7fffffff) - PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD) - PROP_Flags4 (MF4_NOICEDEATH) - - PROP_SpawnState (0) - PROP_DeathState (1) - - PROP_DeathSound ("SuitofArmorBreak") -END_DEFAULTS - -// Armor chunk -------------------------------------------------------------- - -class AZArmorChunk : public AActor -{ - DECLARE_ACTOR (AZArmorChunk, AActor) -}; - -FState AZArmorChunk::States[] = -{ - S_NORMAL (ZSUI, 'B', -1, NULL , NULL), - S_NORMAL (ZSUI, 'C', -1, NULL , NULL), - S_NORMAL (ZSUI, 'D', -1, NULL , NULL), - S_NORMAL (ZSUI, 'E', -1, NULL , NULL), - S_NORMAL (ZSUI, 'F', -1, NULL , NULL), - S_NORMAL (ZSUI, 'G', -1, NULL , NULL), - S_NORMAL (ZSUI, 'H', -1, NULL , NULL), - S_NORMAL (ZSUI, 'I', -1, NULL , NULL), - S_NORMAL (ZSUI, 'J', -1, NULL , NULL), - S_NORMAL (ZSUI, 'K', -1, NULL , NULL) -}; - -IMPLEMENT_ACTOR (AZArmorChunk, Hexen, -1, 0) - PROP_RadiusFixed (4) - PROP_HeightFixed (8) - PROP_SpawnState (0) -END_DEFAULTS - //=========================================================================== // // A_SoAExplode - Suit of Armor Explode @@ -719,7 +275,7 @@ void A_SoAExplode (AActor *actor) for (i = 0; i < 10; i++) { - mo = Spawn (actor->x+((pr_soaexplode()-128)<<12), + mo = Spawn ("ZArmorChunk", actor->x+((pr_soaexplode()-128)<<12), actor->y+((pr_soaexplode()-128)<<12), actor->z+(pr_soaexplode()*actor->height/256), ALLOW_REPLACE); mo->SetState (mo->SpawnState + i); @@ -750,79 +306,12 @@ void A_BellReset2 (AActor *); class AZBell : public AActor { - DECLARE_ACTOR (AZBell, AActor) + DECLARE_CLASS (AZBell, AActor) public: void Activate (AActor *activator); }; -FState AZBell::States[] = -{ -#define S_ZBELL 0 - S_NORMAL (BBLL, 'F', -1, NULL , NULL), - -#define S_ZBELL_X (S_ZBELL+1) - S_NORMAL (BBLL, 'A', 4, A_BellReset1 , &States[S_ZBELL_X+1]), - S_NORMAL (BBLL, 'B', 4, NULL , &States[S_ZBELL_X+2]), - S_NORMAL (BBLL, 'C', 4, NULL , &States[S_ZBELL_X+3]), - S_NORMAL (BBLL, 'D', 5, A_Scream , &States[S_ZBELL_X+4]), - S_NORMAL (BBLL, 'C', 4, NULL , &States[S_ZBELL_X+5]), - S_NORMAL (BBLL, 'B', 4, NULL , &States[S_ZBELL_X+6]), - S_NORMAL (BBLL, 'A', 3, NULL , &States[S_ZBELL_X+7]), - S_NORMAL (BBLL, 'E', 4, NULL , &States[S_ZBELL_X+8]), - S_NORMAL (BBLL, 'F', 5, NULL , &States[S_ZBELL_X+9]), - S_NORMAL (BBLL, 'G', 6, A_Scream , &States[S_ZBELL_X+10]), - S_NORMAL (BBLL, 'F', 5, NULL , &States[S_ZBELL_X+11]), - S_NORMAL (BBLL, 'E', 4, NULL , &States[S_ZBELL_X+12]), - S_NORMAL (BBLL, 'A', 4, NULL , &States[S_ZBELL_X+13]), - S_NORMAL (BBLL, 'B', 5, NULL , &States[S_ZBELL_X+14]), - S_NORMAL (BBLL, 'C', 5, NULL , &States[S_ZBELL_X+15]), - S_NORMAL (BBLL, 'D', 6, A_Scream , &States[S_ZBELL_X+16]), - S_NORMAL (BBLL, 'C', 5, NULL , &States[S_ZBELL_X+17]), - S_NORMAL (BBLL, 'B', 5, NULL , &States[S_ZBELL_X+18]), - S_NORMAL (BBLL, 'A', 4, NULL , &States[S_ZBELL_X+19]), - S_NORMAL (BBLL, 'E', 5, NULL , &States[S_ZBELL_X+20]), - S_NORMAL (BBLL, 'F', 5, NULL , &States[S_ZBELL_X+21]), - S_NORMAL (BBLL, 'G', 7, A_Scream , &States[S_ZBELL_X+22]), - S_NORMAL (BBLL, 'F', 5, NULL , &States[S_ZBELL_X+23]), - S_NORMAL (BBLL, 'E', 5, NULL , &States[S_ZBELL_X+24]), - S_NORMAL (BBLL, 'A', 5, NULL , &States[S_ZBELL_X+25]), - S_NORMAL (BBLL, 'B', 6, NULL , &States[S_ZBELL_X+26]), - S_NORMAL (BBLL, 'C', 6, NULL , &States[S_ZBELL_X+27]), - S_NORMAL (BBLL, 'D', 7, A_Scream , &States[S_ZBELL_X+28]), - S_NORMAL (BBLL, 'C', 6, NULL , &States[S_ZBELL_X+29]), - S_NORMAL (BBLL, 'B', 6, NULL , &States[S_ZBELL_X+30]), - S_NORMAL (BBLL, 'A', 5, NULL , &States[S_ZBELL_X+31]), - S_NORMAL (BBLL, 'E', 6, NULL , &States[S_ZBELL_X+32]), - S_NORMAL (BBLL, 'F', 6, NULL , &States[S_ZBELL_X+33]), - S_NORMAL (BBLL, 'G', 7, A_Scream , &States[S_ZBELL_X+34]), - S_NORMAL (BBLL, 'F', 6, NULL , &States[S_ZBELL_X+35]), - S_NORMAL (BBLL, 'E', 6, NULL , &States[S_ZBELL_X+36]), - S_NORMAL (BBLL, 'A', 6, NULL , &States[S_ZBELL_X+37]), - S_NORMAL (BBLL, 'B', 6, NULL , &States[S_ZBELL_X+38]), - S_NORMAL (BBLL, 'C', 6, NULL , &States[S_ZBELL_X+39]), - S_NORMAL (BBLL, 'B', 7, NULL , &States[S_ZBELL_X+40]), - S_NORMAL (BBLL, 'A', 8, NULL , &States[S_ZBELL_X+41]), - S_NORMAL (BBLL, 'E', 12, NULL , &States[S_ZBELL_X+42]), - S_NORMAL (BBLL, 'A', 10, NULL , &States[S_ZBELL_X+43]), - S_NORMAL (BBLL, 'B', 12, NULL , &States[S_ZBELL_X+44]), - S_NORMAL (BBLL, 'A', 12, NULL , &States[S_ZBELL_X+45]), - S_NORMAL (BBLL, 'E', 14, NULL , &States[S_ZBELL_X+46]), - S_NORMAL (BBLL, 'A', 1, A_BellReset2 , &States[S_ZBELL]) -}; - -IMPLEMENT_ACTOR (AZBell, Hexen, 8065, 0) - PROP_SpawnHealth (5) - PROP_RadiusFixed (56) - PROP_HeightFixed (120) - PROP_MassLong (0x7fffffff) - PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_NOGRAVITY|MF_SPAWNCEILING) - PROP_Flags4 (MF4_NOICEDEATH) - - PROP_SpawnState (S_ZBELL) - PROP_DeathState (S_ZBELL_X) - - PROP_DeathSound ("BellRing") -END_DEFAULTS +IMPLEMENT_CLASS (AZBell) void AZBell::Activate (AActor *activator) { diff --git a/src/g_hexen/a_korax.cpp b/src/g_hexen/a_korax.cpp index af56f9217..cb8aeee10 100644 --- a/src/g_hexen/a_korax.cpp +++ b/src/g_hexen/a_korax.cpp @@ -78,162 +78,6 @@ AActor *P_SpawnKoraxMissile (fixed_t x, fixed_t y, fixed_t z, extern void SpawnSpiritTail (AActor *spirit); -// Korax -------------------------------------------------------------------- - -class AKorax : public AActor -{ - DECLARE_ACTOR (AKorax, AActor) -}; - -FState AKorax::States[] = -{ -#define S_KORAX_LOOK1 0 - S_NORMAL (KORX, 'A', 5, A_Look , &States[S_KORAX_LOOK1]), - -#define S_KORAX_CHASE2 (S_KORAX_LOOK1+1) - S_NORMAL (KORX, 'A', 3, A_KoraxChase , &States[S_KORAX_CHASE2+1]), - S_NORMAL (KORX, 'A', 3, A_KoraxChase , &States[S_KORAX_CHASE2+2]), - S_NORMAL (KORX, 'A', 3, A_KoraxChase , &States[S_KORAX_CHASE2+3]), - S_NORMAL (KORX, 'B', 3, A_KoraxStep , &States[S_KORAX_CHASE2+4]), - S_NORMAL (KORX, 'B', 3, A_KoraxChase , &States[S_KORAX_CHASE2+5]), - S_NORMAL (KORX, 'B', 3, A_KoraxChase , &States[S_KORAX_CHASE2+6]), - S_NORMAL (KORX, 'B', 3, A_KoraxChase , &States[S_KORAX_CHASE2+7]), - S_NORMAL (KORX, 'C', 3, A_KoraxStep2 , &States[S_KORAX_CHASE2+8]), - S_NORMAL (KORX, 'C', 3, A_KoraxChase , &States[S_KORAX_CHASE2+9]), - S_NORMAL (KORX, 'C', 3, A_KoraxChase , &States[S_KORAX_CHASE2+10]), - S_NORMAL (KORX, 'C', 3, A_KoraxChase , &States[S_KORAX_CHASE2+11]), - S_NORMAL (KORX, 'D', 3, A_KoraxStep , &States[S_KORAX_CHASE2+12]), - S_NORMAL (KORX, 'D', 3, A_KoraxChase , &States[S_KORAX_CHASE2+13]), - S_NORMAL (KORX, 'D', 3, A_KoraxChase , &States[S_KORAX_CHASE2+14]), - S_NORMAL (KORX, 'D', 3, A_KoraxChase , &States[S_KORAX_CHASE2+15]), - S_NORMAL (KORX, 'A', 3, A_KoraxStep2 , &States[S_KORAX_CHASE2]), - -#define S_KORAX_PAIN1 (S_KORAX_CHASE2+16) - S_NORMAL (KORX, 'H', 5, A_Pain , &States[S_KORAX_PAIN1+1]), - S_NORMAL (KORX, 'H', 5, NULL , &States[S_KORAX_CHASE2]), - -#define S_KORAX_ATTACK1 (S_KORAX_PAIN1+2) - S_BRIGHT (KORX, 'E', 2, A_FaceTarget , &States[S_KORAX_ATTACK1+1]), - S_BRIGHT (KORX, 'E', 5, A_KoraxDecide , &States[S_KORAX_ATTACK1+1]), - -#define S_KORAX_DEATH1 (S_KORAX_ATTACK1+2) - S_NORMAL (KORX, 'I', 5, NULL , &States[S_KORAX_DEATH1+1]), - S_NORMAL (KORX, 'J', 5, A_FaceTarget , &States[S_KORAX_DEATH1+2]), - S_NORMAL (KORX, 'K', 5, A_Scream , &States[S_KORAX_DEATH1+3]), - S_NORMAL (KORX, 'L', 5, NULL , &States[S_KORAX_DEATH1+4]), - S_NORMAL (KORX, 'M', 5, NULL , &States[S_KORAX_DEATH1+5]), - S_NORMAL (KORX, 'N', 5, NULL , &States[S_KORAX_DEATH1+6]), - S_NORMAL (KORX, 'O', 5, NULL , &States[S_KORAX_DEATH1+7]), - S_NORMAL (KORX, 'P', 5, NULL , &States[S_KORAX_DEATH1+8]), - S_NORMAL (KORX, 'Q', 10, NULL , &States[S_KORAX_DEATH1+9]), - S_NORMAL (KORX, 'R', 5, A_KoraxBonePop , &States[S_KORAX_DEATH1+10]), - S_NORMAL (KORX, 'S', 5, A_NoBlocking , &States[S_KORAX_DEATH1+11]), - S_NORMAL (KORX, 'T', 5, NULL , &States[S_KORAX_DEATH1+12]), - S_NORMAL (KORX, 'U', 5, NULL , &States[S_KORAX_DEATH1+13]), - S_NORMAL (KORX, 'V', -1, NULL , NULL), - -#define S_KORAX_MISSILE1 (S_KORAX_DEATH1+14) - S_BRIGHT (KORX, 'E', 4, A_FaceTarget , &States[S_KORAX_MISSILE1+1]), - S_BRIGHT (KORX, 'F', 8, A_KoraxMissile , &States[S_KORAX_MISSILE1+2]), - S_BRIGHT (KORX, 'E', 8, NULL , &States[S_KORAX_CHASE2]), - -#define S_KORAX_COMMAND1 (S_KORAX_MISSILE1+3) - S_BRIGHT (KORX, 'E', 5, A_FaceTarget , &States[S_KORAX_COMMAND1+1]), - S_BRIGHT (KORX, 'W', 10, A_FaceTarget , &States[S_KORAX_COMMAND1+2]), - S_BRIGHT (KORX, 'G', 15, A_KoraxCommand , &States[S_KORAX_COMMAND1+3]), - S_BRIGHT (KORX, 'W', 10, NULL , &States[S_KORAX_COMMAND1+4]), - S_BRIGHT (KORX, 'E', 5, NULL , &States[S_KORAX_CHASE2]), - -}; - -IMPLEMENT_ACTOR (AKorax, Hexen, 10200, 0) - PROP_SpawnHealth (5000) - PROP_PainChance (20) - PROP_SpeedFixed (10) - PROP_RadiusFixed (65) - PROP_HeightFixed (115) - PROP_Mass (2000) - PROP_Damage (15) - PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL) - PROP_Flags2 (MF2_FLOORCLIP|MF2_BOSS|MF2_TELESTOMP|MF2_PUSHWALL|MF2_MCROSS) - PROP_Flags3 (MF3_DONTMORPH|MF3_NOTARGET) - PROP_Flags4 (MF4_NOICEDEATH) - - PROP_SpawnState (S_KORAX_LOOK1) - PROP_SeeState (S_KORAX_CHASE2) - PROP_PainState (S_KORAX_PAIN1) - PROP_MissileState (S_KORAX_ATTACK1) - PROP_DeathState (S_KORAX_DEATH1) - - PROP_SeeSound ("KoraxSight") - PROP_AttackSound ("KoraxAttack") - PROP_PainSound ("KoraxPain") - PROP_DeathSound ("KoraxDeath") - PROP_ActiveSound ("KoraxActive") - PROP_Obituary ("$OB_KORAX") -END_DEFAULTS - -// Korax Spirit ------------------------------------------------------------- - -class AKoraxSpirit : public AActor -{ - DECLARE_ACTOR (AKoraxSpirit, AActor) -}; - -FState AKoraxSpirit::States[] = -{ - S_NORMAL (SPIR, 'A', 5, A_KSpiritRoam , &States[1]), - S_NORMAL (SPIR, 'B', 5, A_KSpiritRoam , &States[0]), - -#define S_KSPIRIT_DEATH (2) - S_NORMAL (SPIR, 'D', 5, NULL , &States[S_KSPIRIT_DEATH+1]), - S_NORMAL (SPIR, 'E', 5, NULL , &States[S_KSPIRIT_DEATH+2]), - S_NORMAL (SPIR, 'F', 5, NULL , &States[S_KSPIRIT_DEATH+3]), - S_NORMAL (SPIR, 'G', 5, NULL , &States[S_KSPIRIT_DEATH+4]), - S_NORMAL (SPIR, 'H', 5, NULL , &States[S_KSPIRIT_DEATH+5]), - S_NORMAL (SPIR, 'I', 5, NULL , NULL), -}; - -IMPLEMENT_ACTOR (AKoraxSpirit, Hexen, -1, 0) - PROP_SpeedFixed (8) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_NOCLIP|MF_MISSILE) - PROP_Flags2 (MF2_NOTELEPORT) - PROP_RenderStyle (STYLE_Translucent) - PROP_Alpha (HX_ALTSHADOW) - PROP_SpawnState (0) -END_DEFAULTS - -// Korax Bolt --------------------------------------------------------------- - -class AKoraxBolt : public AActor -{ - DECLARE_ACTOR (AKoraxBolt, AActor) -}; - -FState AKoraxBolt::States[] = -{ -#define S_KBOLT1 0 - S_BRIGHT (MLFX, 'I', 2, NULL , &States[S_KBOLT1+1]), - S_BRIGHT (MLFX, 'J', 2, A_KBoltRaise , &States[S_KBOLT1+2]), - S_BRIGHT (MLFX, 'I', 2, A_KBolt , &States[S_KBOLT1+3]), - S_BRIGHT (MLFX, 'J', 2, A_KBolt , &States[S_KBOLT1+4]), - S_BRIGHT (MLFX, 'K', 2, A_KBolt , &States[S_KBOLT1+5]), - S_BRIGHT (MLFX, 'L', 2, A_KBolt , &States[S_KBOLT1+6]), - S_BRIGHT (MLFX, 'M', 2, A_KBolt , &States[S_KBOLT1+2]), -}; - -IMPLEMENT_ACTOR (AKoraxBolt, Hexen, -1, 0) - PROP_RadiusFixed (15) - PROP_HeightFixed (35) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE) - PROP_Flags2 (MF2_NOTELEPORT) - PROP_RenderStyle (STYLE_Add) - - PROP_SpawnState (S_KBOLT1) -END_DEFAULTS - -//============================================================================ - //============================================================================ // // A_KoraxChase @@ -295,29 +139,6 @@ void A_KoraxChase (AActor *actor) } } -//============================================================================ -// -// A_KoraxStep -// -//============================================================================ - -void A_KoraxStep (AActor *actor) -{ - A_Chase (actor); -} - -//============================================================================ -// -// A_KoraxStep2 -// -//============================================================================ - -void A_KoraxStep2 (AActor *actor) -{ - S_Sound (actor, CHAN_BODY, "KoraxStep", 1, ATTN_NONE); - A_Chase (actor); -} - //============================================================================ // // A_KoraxBonePop @@ -332,7 +153,7 @@ void A_KoraxBonePop (AActor *actor) // Spawn 6 spirits equalangularly for (i = 0; i < 6; ++i) { - mo = P_SpawnMissileAngle (actor, RUNTIME_CLASS(AKoraxSpirit), ANGLE_60*i, 5*FRACUNIT); + mo = P_SpawnMissileAngle (actor, PClass::FindClass("KoraxSpirit"), ANGLE_60*i, 5*FRACUNIT); if (mo) KSpiritInit (mo, actor); } @@ -368,11 +189,11 @@ void A_KoraxDecide (AActor *actor) { if (pr_koraxdecide()<220) { - actor->SetState (&AKorax::States[S_KORAX_MISSILE1]); + actor->SetState (actor->FindState("Attack")); } else { - actor->SetState (&AKorax::States[S_KORAX_COMMAND1]); + actor->SetState (actor->FindState("Command")); } } @@ -435,7 +256,7 @@ void A_KoraxCommand (AActor *actor) x = actor->x + KORAX_COMMAND_OFFSET * finecosine[ang]; y = actor->y + KORAX_COMMAND_OFFSET * finesine[ang]; z = actor->z + KORAX_COMMAND_HEIGHT*FRACUNIT; - Spawn (x, y, z, ALLOW_REPLACE); + Spawn("KoraxBolt", x, y, z, ALLOW_REPLACE); if (actor->health <= (actor->GetDefault()->health >> 1)) { @@ -609,7 +430,7 @@ void A_KSpiritRoam (AActor *actor) if (actor->health-- <= 0) { S_Sound (actor, CHAN_VOICE, "SpiritDie", 1, ATTN_NORM); - actor->SetState (&AKoraxSpirit::States[S_KSPIRIT_DEATH]); + actor->SetState (actor->FindState("Death")); } else { @@ -657,7 +478,7 @@ void A_KBoltRaise (AActor *actor) if ((z + KORAX_BOLT_HEIGHT) < actor->ceilingz) { - mo = Spawn (actor->x, actor->y, z, ALLOW_REPLACE); + mo = Spawn("KoraxBolt", actor->x, actor->y, z, ALLOW_REPLACE); if (mo) { mo->special1 = KORAX_BOLT_LIFETIME; diff --git a/src/g_hexen/a_magelightning.cpp b/src/g_hexen/a_magelightning.cpp index 07a921685..af3ee1484 100644 --- a/src/g_hexen/a_magelightning.cpp +++ b/src/g_hexen/a_magelightning.cpp @@ -31,6 +31,13 @@ void A_FreeTargMobj (AActor *); // Lightning ---------------------------------------------------------------- +class ALightning : public AActor +{ + DECLARE_CLASS (ALightning, AActor) +public: + int SpecialMissileHit (AActor *victim); +}; + IMPLEMENT_CLASS(ALightning) int ALightning::SpecialMissileHit (AActor *thing) @@ -45,18 +52,7 @@ int ALightning::SpecialMissileHit (AActor *thing) if ((!thing->player && !(thing->flags2&MF2_BOSS)) || !(level.time&1)) { - // There needs to be a better way to do this... - static const PClass *centaur=NULL; - if (!centaur) centaur = PClass::FindClass("Centaur"); - - if (thing->IsKindOf(centaur)) - { // Lightning does more damage to centaurs - P_DamageMobj(thing, this, target, 9, NAME_Electric); - } - else - { - P_DamageMobj(thing, this, target, 3, NAME_Electric); - } + P_DamageMobj(thing, this, target, 3, NAME_Electric); if (!(S_IsActorPlayingSomething (this, CHAN_WEAPON, -1))) { S_Sound (this, CHAN_WEAPON, "MageLightningZap", 1, ATTN_NORM); diff --git a/src/g_hexen/a_summon.cpp b/src/g_hexen/a_summon.cpp index 2bdc86458..c4e8ba030 100644 --- a/src/g_hexen/a_summon.cpp +++ b/src/g_hexen/a_summon.cpp @@ -18,25 +18,7 @@ public: bool Use (bool pickup); }; -FState AArtiDarkServant::States[] = -{ -#define S_ARTI_SUMMON 0 - S_NORMAL (SUMN, 'A', 350, NULL , &States[S_ARTI_SUMMON]), -}; - -IMPLEMENT_ACTOR (AArtiDarkServant, Hexen, 86, 16) - PROP_Flags (MF_SPECIAL|MF_COUNTITEM) - PROP_Flags2 (MF2_FLOATBOB) - PROP_SpawnState (S_ARTI_SUMMON) - PROP_Inventory_RespawnTics (30+4200) - PROP_Inventory_DefMaxAmount - PROP_Inventory_PickupFlash (1) - PROP_Inventory_FlagsSet (IF_INVBAR|IF_FANCYPICKUPSOUND) - PROP_Inventory_Icon ("ARTISUMN") - PROP_Inventory_PickupSound ("misc/p_pkup") - PROP_Inventory_PickupMessage("$TXT_ARTISUMMON") -END_DEFAULTS - +IMPLEMENT_CLASS (AArtiDarkServant) //============================================================================ // diff --git a/src/g_shared/a_action.cpp b/src/g_shared/a_action.cpp index 02f2c3cb9..aca970a2f 100644 --- a/src/g_shared/a_action.cpp +++ b/src/g_shared/a_action.cpp @@ -16,6 +16,40 @@ static FRandom pr_freezedeath ("FreezeDeath"); static FRandom pr_icesettics ("IceSetTics"); static FRandom pr_freeze ("FreezeDeathChunks"); + +// SwitchableDecoration: Activate and Deactivate change state --------------- + +class ASwitchableDecoration : public AActor +{ + DECLARE_STATELESS_ACTOR (ASwitchableDecoration, AActor) +public: + void Activate (AActor *activator); + void Deactivate (AActor *activator); +}; + +IMPLEMENT_ABSTRACT_ACTOR (ASwitchableDecoration) + +void ASwitchableDecoration::Activate (AActor *activator) +{ + SetState (FindState(NAME_Active)); +} + +void ASwitchableDecoration::Deactivate (AActor *activator) +{ + SetState (FindState(NAME_Inactive)); +} + +// SwitchingDecoration: Only Activate changes state ------------------------- + +class ASwitchingDecoration : public ASwitchableDecoration +{ + DECLARE_STATELESS_ACTOR (ASwitchingDecoration, ASwitchableDecoration) +public: + void Deactivate (AActor *activator) {} +}; + +IMPLEMENT_ABSTRACT_ACTOR (ASwitchingDecoration) + /***************************** IceChunk ************************************/ class AIceChunk : public AActor diff --git a/src/namedef.h b/src/namedef.h index fd283df58..42a151554 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -218,6 +218,7 @@ xx(DrainLife) // A weapon like the Sigil that drains your life away. xx(Massacre) // For death by a cheater! //(Melee) already defined above, so don't define it again xx(InstantDeath) // Strife "instant death" +xx(PoisonCloud) // makes monsters howl. // Special death name for getting killed excessively. Could be used as // a damage type if you wanted to force an extreme death. diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index dbdb0c56e..f86ea31f1 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -1201,7 +1201,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage if (!(target->flags5 & MF5_NOPAIN) && (pr_damagemobj() < painchance) && !(target->flags & MF_SKULLFLY)) { - if (inflictor && inflictor->IsKindOf (RUNTIME_CLASS(ALightning))) + if (mod == NAME_Electric) { if (pr_lightning() < 96) { @@ -1223,7 +1223,7 @@ void P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage target->flags |= MF_JUSTHIT; // fight back! FState * painstate = target->FindState(NAME_Pain, mod); if (painstate != NULL) target->SetState (painstate); - if (inflictor && inflictor->IsKindOf (RUNTIME_CLASS(APoisonCloud))) + if (mod == NAME_PoisonCloud) { if ((target->flags3 & MF3_ISMONSTER) && pr_poison() < 128) { diff --git a/wadsrc/static/actors/hexen/centaur.txt b/wadsrc/static/actors/hexen/centaur.txt index 445f959b4..8044fa2ab 100644 --- a/wadsrc/static/actors/hexen/centaur.txt +++ b/wadsrc/static/actors/hexen/centaur.txt @@ -20,6 +20,7 @@ ACTOR Centaur 107 ActiveSound "CentaurActive" HowlSound "PuppyBeat" Obituary "$OB_CENTAUR" + DamageFactor "Electric", 3 States { Spawn: diff --git a/wadsrc/static/actors/hexen/dragon.txt b/wadsrc/static/actors/hexen/dragon.txt new file mode 100644 index 000000000..904b2f953 --- /dev/null +++ b/wadsrc/static/actors/hexen/dragon.txt @@ -0,0 +1,118 @@ + +// Dragon ------------------------------------------------------------------- + +ACTOR Dragon 254 +{ + Game Hexen + Health 640 + PainChance 128 + Speed 10 + Height 65 + Mass 0x7fffffff + Monster + +NOGRAVITY +FLOAT +NOBLOOD + +BOSS + +DONTMORPH +NOTARGET + +NOICEDEATH + SeeSound "DragonSight" + AttackSound "DragonAttack" + PainSound "DragonPain" + DeathSound "DragonDeath" + ActiveSound "DragonActive" + Obituary "$OB_DRAGON" + + action native A_DragonInitFlight(); + action native A_DragonFlap(); + action native A_DragonFlight(); + action native A_DragonPain(); + action native A_DragonAttack(); + action native A_DragonCheckCrash(); + + States + { + Spawn: + DRAG D 10 A_Look + Loop + See: + DRAG CB 5 + DRAG A 5 A_DragonInitFlight + DRAG B 3 A_DragonFlap + DRAG BCCDDCCBBAA 3 A_DragonFlight + Goto See + 3 + Pain: + DRAG F 10 A_DragonPain + Goto See + 3 + Missile: + DRAG E 8 A_DragonAttack + Goto See + 3 + Death: + DRAG G 5 A_Scream + DRAG H 4 A_NoBlocking + DRAG I 4 + DRAG J 4 A_DragonCheckCrash + Wait + Crash: + DRAG KL 5 + DRAG M -1 + Stop + } +} + +// Dragon Fireball ---------------------------------------------------------- + +ACTOR DragonFireball +{ + Speed 24 + Radius 12 + Height 10 + Damage 6 + DamageType "Fire" + Projectile + -ACTIVATEIMPACT -ACTIVATEPCROSS + RenderStyle Add + DeathSound "DragonFireballExplode" + + action native A_DragonFX2(); + + States + { + Spawn: + DRFX ABCDEF 4 Bright + Loop + Death: + DRFX GHI 4 Bright + DRFX J 4 Bright A_DragonFX2 + DRFX KL 3 Bright + Stop + } +} + +// Dragon Fireball Secondary Explosion -------------------------------------- + +ACTOR DragonExplosion +{ + Radius 8 + Height 8 + DamageType "Fire" + +NOBLOCKMAP + +NOTELEPORT + +INVISIBLE + RenderStyle Add + DeathSound "DragonFireballExplode" + States + { + Spawn: + CFCF Q 1 Bright + CFCF Q 4 Bright A_UnHideThing + CFCF R 3 Bright A_Scream + CFCF S 4 Bright + CFCF T 3 Bright A_Explode (80, 128, 0) + CFCF U 4 Bright + CFCF V 3 Bright + CFCF W 4 Bright + CFCF X 3 Bright + CFCF Y 4 Bright + CFCF Z 3 Bright + Stop + } +} diff --git a/wadsrc/static/actors/hexen/flechette.txt b/wadsrc/static/actors/hexen/flechette.txt index 9e64cf4be..70f717517 100644 --- a/wadsrc/static/actors/hexen/flechette.txt +++ b/wadsrc/static/actors/hexen/flechette.txt @@ -21,6 +21,32 @@ ACTOR PoisonBag } } +// Fire Bomb (Flechette used by Mage) --------------------------------------- + +ACTOR FireBomb +{ + DamageType "Fire" + +NOGRAVITY + +FOILINVUL + RenderStyle Translucent + Alpha 0.6 + DeathSound "FlechetteExplode" + + action native A_TimeBomb(); + + States + { + Spawn: + PSBG A 20 + PSBG AA 10 + PSBG B 4 + PSBG C 4 A_Scream + XPL1 A 4 Bright A_TimeBomb + XPL1 BCDEF 4 Bright + Stop + } +} + // Throwing Bomb (Flechette used by Fighter) -------------------------------- ACTOR ThrowingBomb @@ -65,3 +91,78 @@ ACTOR ThrowingBomb Stop } } + +// Poison Bag Artifact (Flechette) ------------------------------------------ + +ACTOR ArtiPoisonBag : Inventory 8000 native +{ + Game Hexen + SpawnID 72 + +FLOATBOB + Inventory.DefMaxAmount + Inventory.PickupFlash 1 + +INVBAR +FANCYPICKUPSOUND + Inventory.Icon "ARTIPSBG" + Inventory.PickupSound "misc/p_pkup" + Inventory.PickupMessage "$TXT_ARTIPOISONBAG" + States + { + Spawn: + PSBG A -1 + Stop + } +} + +// Poison Bag 1 (The Cleric's) ---------------------------------------------- + +ACTOR ArtiPoisonBag1 : ArtiPoisonBag native +{ + Inventory.Icon "ARTIPSB1" +} + +// Poison Bag 2 (The Mage's) ------------------------------------------------ + +ACTOR ArtiPoisonBag2 : ArtiPoisonBag native +{ + Inventory.Icon "ARTIPSB2" +} + +// Poison Bag 3 (The Fighter's) --------------------------------------------- + +ACTOR ArtiPoisonBag3 : ArtiPoisonBag native +{ + Inventory.Icon "ARTIPSB3" +} +// Poison Cloud ------------------------------------------------------------- + +ACTOR PoisonCloud native +{ + Radius 20 + Height 30 + Mass 0x7fffffff + +NOBLOCKMAP +NOGRAVITY +DROPOFF + +NODAMAGETHRUST + +DONTSPLASH +FOILINVUL +CANBLAST +BLOODLESSIMPACT + RenderStyle Translucent + Alpha 0.6 + DeathSound "PoisonShroomDeath" + DamageType PoisonCloud + + action native A_PoisonBagDamage(); + action native A_PoisonBagCheck(); + + States + { + Spawn: + PSBG D 1 + PSBG D 1 A_Scream + PSBG DEEEFFFGGGHHHII 2 A_PoisonBagDamage + PSBG I 2 A_PoisonBagCheck + PSBG I 1 A_PoisonBagCheck + Goto Spawn + 3 + Death: + PSBG HG 7 + PSBG FD 6 + Stop + } +} diff --git a/wadsrc/static/actors/hexen/hexenspecialdecs.txt b/wadsrc/static/actors/hexen/hexenspecialdecs.txt index 40b10171a..0d8d7ab40 100644 --- a/wadsrc/static/actors/hexen/hexenspecialdecs.txt +++ b/wadsrc/static/actors/hexen/hexenspecialdecs.txt @@ -75,6 +75,283 @@ ACTOR TreeDestructible 8062 } +// Pottery1 ------------------------------------------------------------------ + +ACTOR Pottery1 104 native +{ + Game Hexen + Health 15 + Speed 10 + Height 32 + +SOLID +SHOOTABLE +NOBLOOD +DROPOFF + +SLIDESONWALLS +PUSHABLE +TELESTOMP +CANPASS + +NOICEDEATH + + action native A_PotteryExplode(); + + States + { + Spawn: + POT1 A -1 + Loop + Death: + POT1 A 0 A_PotteryExplode + Stop + } +} + +// Pottery2 ----------------------------------------------------------------- + +ACTOR Pottery2 : Pottery1 105 +{ + Game Hexen + Height 25 + States + { + Spawn: + POT2 A -1 + Stop + } +} + +// Pottery3 ----------------------------------------------------------------- + +ACTOR Pottery3 : Pottery1 106 +{ + Game Hexen + Height 25 + States + { + Spawn: + POT3 A -1 + Stop + } +} + +// Pottery Bit -------------------------------------------------------------- + +ACTOR PotteryBit +{ + Radius 5 + Height 5 + +MISSILE + +NOTELEPORT + +NOICEDEATH + + action native A_PotteryChooseBit(); + action native A_PotteryCheck(); + + States + { + Spawn: + PBIT ABCDE -1 + Stop + Death: + PBIT F 0 A_PotteryChooseBit + Stop + Pottery1: + PBIT F 140 + PBIT F 1 A_PotteryCheck + Stop + Pottery2: + PBIT G 140 + PBIT G 1 A_PotteryCheck + Stop + Pottery3: + PBIT H 140 + PBIT H 1 A_PotteryCheck + Stop + Pottery4: + PBIT I 140 + PBIT I 1 A_PotteryCheck + Stop + Pottery5: + PBIT J 140 + PBIT J 1 A_PotteryCheck + Stop + } +} + + +// Blood pool --------------------------------------------------------------- + +ACTOR BloodPool 111 +{ + Game Hexen + States + { + Spawn: + BDPL A -1 + Stop + } +} + + +// Lynched corpse (no heart) ------------------------------------------------ + +ACTOR ZCorpseLynchedNoHeart 109 native +{ + Radius 10 + Height 100 + +SOLID +SPAWNCEILING +NOGRAVITY + + action native A_CorpseBloodDrip(); + + States + { + Spawn: + CPS5 A 140 A_CorpseBloodDrip + Loop + } +} + + +// CorpseBloodDrip ---------------------------------------------------------- + +ACTOR CorpseBloodDrip +{ + Radius 1 + Height 4 + Gravity 0.125 + +MISSILE + +NOICEDEATH + States + { + Spawn: + BDRP A -1 + Stop + Death: + BDSH AB 3 + BDSH CD 2 + Stop + } +} + + +// Corpse bit --------------------------------------------------------------- + +ACTOR CorpseBit +{ + Radius 5 + Height 5 + +NOBLOCKMAP + +TELESTOMP + States + { + Spawn: + CPB1 A -1 + Stop + CPB2 A -1 + Stop + CPB3 A -1 + Stop + CPB4 A -1 + Stop + } +} + + +// Corpse (sitting, splatterable) ------------------------------------------- + +ACTOR ZCorpseSitting 110 +{ + Game Hexen + Health 30 + Radius 15 + Height 35 + +SOLID +SHOOTABLE +NOBLOOD + +NOICEDEATH + DeathSound "FireDemonDeath" + + action native A_CorpseExplode(); + + States + { + Spawn: + CPS6 A -1 + Stop + CPS6 A 1 A_CorpseExplode + Stop + } +} + + +// Leaf Spawner ------------------------------------------------------------- + +ACTOR LeafSpawner 113 +{ + Game Hexen + +NOBLOCKMAP +NOSECTOR + +INVISIBLE + + action native A_LeafSpawn(); + + States + { + Spawn: + TNT1 A 20 A_LeafSpawn + Loop + } +} + + +// Leaf 1 ------------------------------------------------------------------- + +ACTOR Leaf1 +{ + Radius 2 + Height 4 + Gravity 0.125 + +NOBLOCKMAP +MISSILE + +NOTELEPORT +DONTSPLASH + +NOICEDEATH + + action native A_LeafThrust(); + action native A_LeafCheck(); + + States + { + Spawn: + LEF1 ABC 4 + LEF1 D 4 A_LeafThrust + LEF1 EFG 4 + LEF1 H 4 A_LeafThrust + LEF1 I 4 + LEF1 AB 4 + LEF1 C 4 A_LeafThrust + LEF1 DEF 4 + LEF1 G 4 A_LeafThrust + LEF1 HI 4 + Stop + Death: + LEF3 D 10 A_LeafCheck + Wait + } +} + + +// Leaf 2 ------------------------------------------------------------------- + +ACTOR Leaf2 : Leaf1 +{ + States + { + Spawn: + LEF2 ABC 4 + LEF2 D 4 A_LeafThrust + LEF2 EFG 4 + LEF2 H 4 A_LeafThrust + LEF2 I 4 + LEF2 AB 4 + LEF2 C 4 A_LeafThrust + LEF2 DEF 4 + LEF2 G 4 A_LeafThrust + LEF2 HI 4 + Stop + } +} + + // Twined torch ------------------------------------------------------------- ACTOR ZTwinedTorch : SwitchableDecoration 116 @@ -191,6 +468,39 @@ ACTOR ZShrub2 8102 } +// Poison Shroom ------------------------------------------------------------ + +ACTOR ZPoisonShroom 8104 +{ + Game Hexen + Radius 6 + Height 20 + PainChance 255 + Health 30 + Mass 0x7fffffff + +SHOOTABLE +SOLID +NOBLOOD + +NOICEDEATH + PainSound "PoisonShroomPain" + DeathSound "PoisonShroomDeath" + + action native A_PoisonShroom(); + + States + { + Spawn: + SHRM A 5 A_PoisonShroom + Pain: + SHRM A 6 + SHRM B 8 A_Pain + Goto Spawn + Death: + SHRM CDE 5 + SHRM F -1 + Stop + } +} + + // Fire Bull ---------------------------------------------------------------- ACTOR ZFireBull : SwitchableDecoration 8042 @@ -225,6 +535,124 @@ ACTOR ZFireBullUnlit : ZFireBull 8043 } +// Suit of armor ------------------------------------------------------------ + +ACTOR ZSuitOfArmor +{ + Health 60 + Radius 16 + Height 72 + Mass 0x7fffffff + +SOLID +SHOOTABLE +NOBLOOD + +NOICEDEATH + DeathSound "SuitofArmorBreak" + + action native A_SoAExplode(); + + States + { + Spawn: + ZSUI A -1 + Stop + ZSUI A 1 A_SoAExplode + Stop + } +} + + +// Armor chunk -------------------------------------------------------------- + +ACTOR ZArmorChunk +{ + Radius 4 + Height 8 + States + { + Spawn: + ZSUI B -1 + Stop + ZSUI C -1 + Stop + ZSUI D -1 + Stop + ZSUI E -1 + Stop + ZSUI F -1 + Stop + ZSUI G -1 + Stop + ZSUI H -1 + Stop + ZSUI I -1 + Stop + ZSUI J -1 + Stop + ZSUI K -1 + Stop + } +} + + +// Bell --------------------------------------------------------------------- + +ACTOR ZBell 8065 native +{ + Game Hexen + Health 5 + Radius 56 + Height 120 + Mass 0x7fffffff + +SOLID +SHOOTABLE +NOBLOOD +NOGRAVITY +SPAWNCEILING + +NOICEDEATH + DeathSound "BellRing" + + action native A_BellReset1(); + action native A_BellReset2(); + + States + { + Spawn: + BBLL F -1 + Stop + Death: + BBLL A 4 A_BellReset1 + BBLL BC 4 + BBLL D 5 A_Scream + BBLL CB 4 + BBLL A 3 + BBLL E 4 + BBLL F 5 + BBLL G 6 A_Scream + BBLL F 5 + BBLL EA 4 + BBLL BC 5 + BBLL D 6 A_Scream + BBLL CB 5 + BBLL A 4 + BBLL EF 5 + BBLL G 7 A_Scream + BBLL FEA 5 + BBLL B 6 + BBLL C 6 + BBLL D 7 A_Scream + BBLL CB 6 + BBLL A 5 + BBLL EF 6 + BBLL G 7 A_Scream + BBLL FEABC 6 + BBLL B 7 + BBLL A 8 + BBLL E 12 + BBLL A 10 + BBLL B 12 + BBLL A 12 + BBLL E 14 + BBLL A 1 A_BellReset2 + Goto Spawn + } +} + + // "Christmas" Tree --------------------------------------------------------- ACTOR ZXmasTree 8068 diff --git a/wadsrc/static/actors/hexen/korax.txt b/wadsrc/static/actors/hexen/korax.txt new file mode 100644 index 000000000..1c6705811 --- /dev/null +++ b/wadsrc/static/actors/hexen/korax.txt @@ -0,0 +1,125 @@ +ACTOR Korax 10200 +{ + Game Hexen + Health 5000 + Painchance 20 + Speed 10 + Radius 65 + Height 115 + Mass 2000 + Damage 15 + Monster + +BOSS + +FLOORCLIP + +TELESTOMP + +DONTMORPH + +NOTARGET + +NOICEDEATH + +BOSSDEATH + SeeSound "KoraxSight" + AttackSound "KoraxAttack" + PainSound "KoraxPain" + DeathSound "KoraxDeath" + ActiveSound "KoraxActive" + Obituary "$OB_KORAX" // "%o was swept from the board by Korax." + + action native A_KoraxChase(); + action native A_KoraxDecide(); + action native A_KoraxBonePop(); + action native A_KoraxMissile(); + action native A_KoraxCommand(); + + States + { + Spawn: + KORX A 5 A_Look + Loop + See: + KORX AAA 3 A_KoraxChase + KORX B 3 A_Chase + KORX BBB 3 A_KoraxChase + KORX C 0 A_PlaySound("KoraxStep") + KORX C 3 A_Chase + KORX CCC 3 A_KoraxChase + KORX D 3 A_Chase + KORX DDD 3 A_KoraxChase + KORX A 0 A_PlaySound("KoraxStep") + KORX A 3 A_Chase + Loop + Pain: + KORX H 5 A_Pain + KORX H 5 + Goto See + Missile: + KORX E 2 Bright A_FaceTarget + KORX E 5 Bright A_KoraxDecide + Wait + Death: + KORX I 5 + KORX J 5 A_FaceTarget + KORX K 5 A_Scream + KORX LMNOP 5 + KORX Q 10 + KORX R 5 A_KoraxBonePop + KORX S 5 A_NoBlocking + KORX TU 5 + KORX V -1 + Stop + Attack: + KORX E 4 Bright A_FaceTarget + KORX F 8 Bright A_KoraxMissile + KORX E 8 Bright + Goto See + Command: + KORX E 5 Bright A_FaceTarget + KORX W 10 Bright A_FaceTarget + KORX G 15 Bright A_KoraxCommand + KORX W 10 Bright + KORX E 5 Bright + Goto See + } +} + +ACTOR KoraxSpirit +{ + Speed 8 + Projectile + +NOCLIP + -ACTIVATEPCROSS + -ACTIVATEIMPACT + RenderStyle Translucent + Alpha 0.4 + + action native A_KSpiritRoam(); + + States + { + Spawn: + SPIR AB 5 A_KSpiritRoam + Loop + Death: + SPIR DEFGHI 5 + Stop + } +} + +ACTOR KoraxBolt +{ + Radius 15 + Height 35 + Projectile + -ACTIVATEPCROSS + -ACTIVATEIMPACT + RenderStyle Add + + action native A_KBolt(); + action native A_KBoltRaise(); + + States + { + Spawn: + MLFX I 2 Bright + MLFX J 2 Bright A_KBoltRaise + MLFX IJKLM 2 Bright A_KBolt + } +} diff --git a/wadsrc/static/actors/hexen/summon.txt b/wadsrc/static/actors/hexen/summon.txt index 3ea10713f..2250c9129 100644 --- a/wadsrc/static/actors/hexen/summon.txt +++ b/wadsrc/static/actors/hexen/summon.txt @@ -1,4 +1,27 @@ +// Dark Servant Artifact ---------------------------------------------------- + +ACTOR ArtiDarkServant : Inventory 86 native +{ + Game Hexen + SpawnID 16 + +COUNTITEM + +FLOATBOB + Inventory.RespawnTics 4230 + Inventory.DefMaxAmount + Inventory.PickupFlash 1 + +INVBAR +FANCYPICKUPSOUND + Inventory.Icon "ARTISUMN" + Inventory.PickupSound "misc/p_pkup" + Inventory.PickupMessage "$TXT_ARTISUMMON" + States + { + Spawn: + SUMN A 350 + Loop + } +} + // Summoning Doll ----------------------------------------------------------- ACTOR SummoningDoll diff --git a/wadsrc/static/decorate.txt b/wadsrc/static/decorate.txt index 6ff4538f9..83f934c48 100644 --- a/wadsrc/static/decorate.txt +++ b/wadsrc/static/decorate.txt @@ -67,6 +67,7 @@ #include "actors/heretic/dsparil.txt" #include "actors/heretic/chicken.txt" +#include "actors/hexen/korax.txt" #include "actors/hexen/fighterplayer.txt" #include "actors/hexen/clericplayer.txt" #include "actors/hexen/mageplayer.txt" @@ -105,6 +106,7 @@ #include "actors/hexen/fighteraxe.txt" #include "actors/hexen/fighterhammer.txt" #include "actors/hexen/fighterquietus.txt" +#include "actors/hexen/dragon.txt" #include "actors/strife/strifehumanoid.txt" #include "actors/strife/strifeplayer.txt"