diff --git a/docs/rh-log.txt b/docs/rh-log.txt index d8220221a..e92fe73fb 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,8 +1,10 @@ -August 6, 2008 -- The x87 precision control is now explicitly set for double precision, since - GCC defaults to extended precision instead, unlike Visual C++. - +August 6, 2008 +- The x87 precision control is now explicitly set for double precision, since + GCC defaults to extended precision instead, unlike Visual C++. + August 6, 2008 (Changes by Graf Zahl) +- Converted Strife's Programmer, Loremaster and Thingstoblowup to DECORATE. +- Fixed: Attacking a merchant in Strife didn't alert the enemies. - Removed AT_GAME_SET(PowerInvulnerable) due to the problems it caused. The two occurences in the code that depended on it were changed accordingly. Invulnerability colormaps are now being set by the items exclusively. diff --git a/src/codepointers.h b/src/codepointers.h index 6ba81c8a1..6ff49ba35 100644 --- a/src/codepointers.h +++ b/src/codepointers.h @@ -108,6 +108,8 @@ ACTOR(CheckForReload) ACTOR(ResetReloadCounter) ACTOR(ClearReFire) ACTOR(SpawnSingleItem) +ACTOR(GiveQuestItem) +ACTOR(Bang4Cloud) ACTOR(M_Refire) ACTOR(M_CheckAttack) @@ -280,6 +282,13 @@ ACTOR(EntityDeath) ACTOR(EntityAttack) ACTOR(SubEntityDeath) ACTOR(SpawnEntity) +ACTOR(ProgrammerMelee) +ACTOR(SpawnProgrammerBase) +ACTOR(ProgrammerDeath) +ACTOR(LoremasterChain) +ACTOR(ExtraLightOff) +ACTOR(Explode512) +ACTOR(LightGoesOut) // Special code pointers for Strife's player - not to be used elsewhere! ACTOR(ItBurnsItBurns) diff --git a/src/d_main.cpp b/src/d_main.cpp index 3a0e0408d..0bf352d3f 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -31,11 +31,11 @@ #define mkdir(a,b) _mkdir (a) #else #include -#endif - -#ifdef HAVE_FPU_CONTROL -#include -#endif +#endif + +#ifdef HAVE_FPU_CONTROL +#include +#endif #include #ifdef unix @@ -2073,20 +2073,20 @@ void D_DoomMain (void) const IWADInfo *iwad_info; srand(I_MSTime()); - - // Set the FPU precision to 53 significant bits. This is the default - // for Visual C++, but not for GCC, so some slight math variances - // might crop up if we leave it alone. -#if defined(_FPU_GETCW) - { - int cw; - _FPU_GETCW(cw); - cw = (cw & ~_FPU_EXTENDED) | _FPU_DOUBLE; - _FPU_SETCW(cw); - } -#elif defined(_PC_53) - _control87(_PC_53, _MCW_PC); -#endif + + // Set the FPU precision to 53 significant bits. This is the default + // for Visual C++, but not for GCC, so some slight math variances + // might crop up if we leave it alone. +#if defined(_FPU_GETCW) + { + int cw; + _FPU_GETCW(cw); + cw = (cw & ~_FPU_EXTENDED) | _FPU_DOUBLE; + _FPU_SETCW(cw); + } +#elif defined(_PC_53) + _control87(_PC_53, _MCW_PC); +#endif PClass::StaticInit (); atterm (C_DeinitConsole); diff --git a/src/dobjtype.cpp b/src/dobjtype.cpp index 5866e89f9..070b8b556 100644 --- a/src/dobjtype.cpp +++ b/src/dobjtype.cpp @@ -394,6 +394,16 @@ void PClass::FreeStateList () } } +const PClass *PClass::NativeClass() const +{ + const PClass *cls = this; + + while (cls && cls->bRuntimeClass == 1) + cls = cls->ParentClass; + + return cls; +} + // Symbol tables ------------------------------------------------------------ PSymbol::~PSymbol() diff --git a/src/dobjtype.h b/src/dobjtype.h index bb86753c9..0d37f32af 100644 --- a/src/dobjtype.h +++ b/src/dobjtype.h @@ -116,6 +116,7 @@ struct PClass void InitializeActorInfo (); void BuildFlatPointers (); void FreeStateList(); + const PClass *NativeClass() const; // Returns true if this type is an ancestor of (or same as) the passed type. bool IsAncestorOf (const PClass *ti) const diff --git a/src/g_strife/a_alienspectres.cpp b/src/g_strife/a_alienspectres.cpp index 82bd1ae60..2c7e56a95 100644 --- a/src/g_strife/a_alienspectres.cpp +++ b/src/g_strife/a_alienspectres.cpp @@ -25,21 +25,11 @@ static void GenericSpectreSpawn (AActor *actor, const char *type) } } -void A_SpawnSpectre3 (AActor *actor) -{ - GenericSpectreSpawn (actor, "AlienSpectre3"); -} - void A_SpawnSpectre4 (AActor *actor) { GenericSpectreSpawn (actor, "AlienSpectre4"); } -void A_SpawnSpectre5 (AActor *actor) -{ - GenericSpectreSpawn (actor, "AlienSpectre5"); -} - void A_SpectreChunkSmall (AActor *self) { AActor *foo = Spawn("AlienChunkSmall", self->x, self->y, self->z + 10*FRACUNIT, ALLOW_REPLACE); diff --git a/src/g_strife/a_loremaster.cpp b/src/g_strife/a_loremaster.cpp index 806d82019..d113baf4c 100644 --- a/src/g_strife/a_loremaster.cpp +++ b/src/g_strife/a_loremaster.cpp @@ -6,144 +6,16 @@ #include "p_local.h" #include "s_sound.h" -static FRandom pr_atk1 ("FooMelee"); - -void A_SentinelBob (AActor *); -void A_SpawnSpectre5 (AActor *); - -void A_SpectreMelee (AActor *); -void A_LoremasterAttack (AActor *); -void A_LoremasterChain (AActor *); - // Loremaster (aka Priest) -------------------------------------------------- -class ALoremaster : public AActor -{ - DECLARE_ACTOR (ALoremaster, AActor) -public: - void NoBlockingSet (); -}; - -FState ALoremaster::States[] = -{ -#define S_PRIEST_STND 0 - S_NORMAL (PRST, 'A', 10, A_Look, &States[S_PRIEST_STND+1]), - S_NORMAL (PRST, 'B', 10, A_SentinelBob, &States[S_PRIEST_STND]), - -#define S_PRIEST_RUN (S_PRIEST_STND+2) - S_NORMAL (PRST, 'A', 4, A_Chase, &States[S_PRIEST_RUN+1]), - S_NORMAL (PRST, 'A', 4, A_SentinelBob, &States[S_PRIEST_RUN+2]), - S_NORMAL (PRST, 'B', 4, A_Chase, &States[S_PRIEST_RUN+3]), - S_NORMAL (PRST, 'B', 4, A_SentinelBob, &States[S_PRIEST_RUN+4]), - S_NORMAL (PRST, 'C', 4, A_Chase, &States[S_PRIEST_RUN+5]), - S_NORMAL (PRST, 'C', 4, A_SentinelBob, &States[S_PRIEST_RUN+6]), - S_NORMAL (PRST, 'D', 4, A_Chase, &States[S_PRIEST_RUN+7]), - S_NORMAL (PRST, 'D', 4, A_SentinelBob, &States[S_PRIEST_RUN]), - -#define S_PRIEST_MELEE (S_PRIEST_RUN+8) - S_NORMAL (PRST, 'E', 4, A_FaceTarget, &States[S_PRIEST_MELEE+1]), - S_NORMAL (PRST, 'F', 4, A_SpectreMelee, &States[S_PRIEST_MELEE+2]), - S_NORMAL (PRST, 'E', 4, A_SentinelBob, &States[S_PRIEST_RUN]), - -#define S_PRIEST_MISSILE (S_PRIEST_MELEE+3) - S_NORMAL (PRST, 'E', 4, A_FaceTarget, &States[S_PRIEST_MISSILE+1]), - S_NORMAL (PRST, 'F', 4, A_LoremasterAttack, &States[S_PRIEST_MISSILE+2]), - S_NORMAL (PRST, 'E', 4, A_SentinelBob, &States[S_PRIEST_RUN]), - -#define S_PRIEST_DIE (S_PRIEST_MISSILE+3) - S_NORMAL (PDED, 'A', 6, NULL, &States[S_PRIEST_DIE+1]), - S_NORMAL (PDED, 'B', 6, A_Scream, &States[S_PRIEST_DIE+2]), - S_NORMAL (PDED, 'C', 6, NULL, &States[S_PRIEST_DIE+3]), - S_NORMAL (PDED, 'D', 6, A_NoBlocking, &States[S_PRIEST_DIE+4]), - S_NORMAL (PDED, 'E', 6, NULL, &States[S_PRIEST_DIE+5]), - S_NORMAL (PDED, 'F', 5, NULL, &States[S_PRIEST_DIE+6]), - S_NORMAL (PDED, 'G', 5, NULL, &States[S_PRIEST_DIE+7]), - S_NORMAL (PDED, 'H', 5, NULL, &States[S_PRIEST_DIE+8]), - S_NORMAL (PDED, 'I', 5, NULL, &States[S_PRIEST_DIE+9]), - S_NORMAL (PDED, 'J', 5, NULL, &States[S_PRIEST_DIE+10]), - S_NORMAL (PDED, 'K', 5, NULL, &States[S_PRIEST_DIE+11]), - S_NORMAL (PDED, 'L', 5, NULL, &States[S_PRIEST_DIE+12]), - S_NORMAL (PDED, 'M', 4, NULL, &States[S_PRIEST_DIE+13]), - S_NORMAL (PDED, 'N', 4, NULL, &States[S_PRIEST_DIE+14]), - S_NORMAL (PDED, 'O', 4, NULL, &States[S_PRIEST_DIE+15]), - S_NORMAL (PDED, 'P', 4, NULL, &States[S_PRIEST_DIE+16]), - S_NORMAL (PDED, 'Q', 4, A_SpawnSpectre5, &States[S_PRIEST_DIE+17]), - S_NORMAL (PDED, 'R', 4, NULL, &States[S_PRIEST_DIE+18]), - S_NORMAL (PDED, 'S', 4, NULL, &States[S_PRIEST_DIE+19]), - S_NORMAL (PDED, 'T', -1, NULL, NULL), -}; - -IMPLEMENT_ACTOR (ALoremaster, Strife, 12, 0) - PROP_StrifeType (66) - PROP_StrifeTeaserType (63) - PROP_StrifeTeaserType2 (64) - PROP_SpawnHealth (800) - PROP_SpawnState (S_PRIEST_STND) - PROP_SeeState (S_PRIEST_RUN) - PROP_MeleeState (S_PRIEST_MELEE) - PROP_MissileState (S_PRIEST_MISSILE) - PROP_DeathState (S_PRIEST_DIE) - PROP_SpeedFixed (10) - PROP_RadiusFixed (15) - PROP_HeightFixed (56) - PROP_FloatSpeed (5) - PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOGRAVITY|MF_FLOAT| - MF_NOBLOOD|MF_COUNTKILL|MF_NOTDMATCH) - PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS) - PROP_Flags3 (MF3_NOBLOCKMONST) - PROP_Flags4 (MF4_INCOMBAT|MF4_LOOKALLAROUND|MF4_FIRERESIST|MF4_NOICEDEATH) - PROP_MinMissileChance (150) - PROP_Tag ("PRIEST") - PROP_SeeSound ("loremaster/sight") - PROP_AttackSound ("loremaster/attack") - PROP_PainSound ("loremaster/pain") - PROP_DeathSound ("loremaster/death") - PROP_ActiveSound ("loremaster/active") - PROP_Obituary ("$OB_LOREMASTER") -END_DEFAULTS - - -//============================================================================ -// -// ALoremaster :: NoBlockingSet -// -//============================================================================ - -void ALoremaster::NoBlockingSet () -{ - P_DropItem (this, "Junk", -1, 256); -} - -// Loremaster Projectile ---------------------------------------------------- - class ALoreShot : public AActor { - DECLARE_ACTOR (ALoreShot, AActor) + DECLARE_CLASS (ALoreShot, AActor) public: int DoSpecialDamage (AActor *target, int damage); }; -FState ALoreShot::States[] = -{ - S_NORMAL (OCLW, 'A', 2, A_LoremasterChain, &States[0]), - S_NORMAL (CCLW, 'A', 6, NULL, NULL) -}; - -IMPLEMENT_ACTOR (ALoreShot, Strife, -1, 0) - PROP_StrifeType (97) - PROP_SpawnState (0) - PROP_DeathState (1) - PROP_SpeedFixed (20) - PROP_RadiusFixed (10) - PROP_HeightFixed (14) - PROP_Damage (2) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE) - PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS) - PROP_Flags4 (MF4_STRIFEDAMAGE) - PROP_MaxStepHeight (4) - PROP_SeeSound ("loremaster/chain") - PROP_ActiveSound ("loremaster/swish") -END_DEFAULTS +IMPLEMENT_CLASS (ALoreShot) int ALoreShot::DoSpecialDamage (AActor *target, int damage) { @@ -165,50 +37,10 @@ int ALoreShot::DoSpecialDamage (AActor *target, int damage) return damage; } -// Loremaster Subprojectile ------------------------------------------------- - -class ALoreShot2 : public AActor -{ - DECLARE_ACTOR (ALoreShot2, AActor) -}; - -FState ALoreShot2::States[] = -{ - S_NORMAL (TEND, 'A', 20, NULL, NULL) -}; - -IMPLEMENT_ACTOR (ALoreShot2, Strife, -1, 0) - PROP_StrifeType (98) - PROP_SpawnState (0) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY) - PROP_SeeSound ("loremaster/active") -END_DEFAULTS - -void A_SpectreMelee (AActor *self) -{ - int damage; - - if (self->target == NULL) - return; - - damage = (pr_atk1() & 9) * 5; - - P_DamageMobj (self->target, self, self, damage, NAME_None); - P_TraceBleed (damage, self->target, self); -} - -void A_LoremasterAttack (AActor *self) -{ - if (self->target != NULL) - { - P_SpawnMissile (self, self->target, RUNTIME_CLASS(ALoreShot)); - } -} - void A_LoremasterChain (AActor *self) { S_Sound (self, CHAN_BODY, "loremaster/active", 1, ATTN_NORM); - Spawn (self->x, self->y, self->z, ALLOW_REPLACE); - Spawn (self->x - (self->momx >> 1), self->y - (self->momy >> 1), self->z - (self->momz >> 1), ALLOW_REPLACE); - Spawn (self->x - self->momx, self->y - self->momy, self->z - self->momz, ALLOW_REPLACE); + Spawn("LoreShot2", self->x, self->y, self->z, ALLOW_REPLACE); + Spawn("LoreShot2", self->x - (self->momx >> 1), self->y - (self->momy >> 1), self->z - (self->momz >> 1), ALLOW_REPLACE); + Spawn("LoreShot2", self->x - self->momx, self->y - self->momy, self->z - self->momz, ALLOW_REPLACE); } diff --git a/src/g_strife/a_programmer.cpp b/src/g_strife/a_programmer.cpp index 65f07a4ed..ea6dd7543 100644 --- a/src/g_strife/a_programmer.cpp +++ b/src/g_strife/a_programmer.cpp @@ -9,165 +9,18 @@ static FRandom pr_prog ("Programmer"); -void A_SentinelBob (AActor *); -void A_TossGib (AActor *); -void A_Countdown (AActor *); - -void A_ProgrammerMelee (AActor *); -void A_SpotLightning (AActor *); -void A_SpawnProgrammerBase (AActor *); -void A_ProgrammerDeath (AActor *); - -// Programmer --------------------------------------------------------------- - -class AProgrammer : public AActor -{ - DECLARE_ACTOR (AProgrammer, AActor) -public: - void NoBlockingSet (); -}; - -FState AProgrammer::States[] = -{ -#define S_PROG_STND 0 - S_NORMAL (PRGR, 'A', 5, A_Look, &States[S_PROG_STND+1]), - S_NORMAL (PRGR, 'A', 1, A_SentinelBob, &States[S_PROG_STND]), - -#define S_PROG_CHASE (S_PROG_STND+2) - S_NORMAL (PRGR, 'A', 160, A_SentinelBob, &States[S_PROG_CHASE+1]), - S_NORMAL (PRGR, 'B', 5, A_SentinelBob, &States[S_PROG_CHASE+2]), - S_NORMAL (PRGR, 'C', 5, A_SentinelBob, &States[S_PROG_CHASE+3]), - S_NORMAL (PRGR, 'D', 5, A_SentinelBob, &States[S_PROG_CHASE+4]), - S_NORMAL (PRGR, 'E', 2, A_SentinelBob, &States[S_PROG_CHASE+5]), - S_NORMAL (PRGR, 'F', 2, A_SentinelBob, &States[S_PROG_CHASE+6]), - S_NORMAL (PRGR, 'E', 3, A_Chase, &States[S_PROG_CHASE+7]), - S_NORMAL (PRGR, 'F', 3, A_Chase, &States[S_PROG_CHASE+4]), - -#define S_PROG_MELEE (S_PROG_CHASE+8) - S_NORMAL (PRGR, 'E', 2, A_SentinelBob, &States[S_PROG_MELEE+1]), - S_NORMAL (PRGR, 'F', 3, A_SentinelBob, &States[S_PROG_MELEE+2]), - S_NORMAL (PRGR, 'E', 3, A_FaceTarget, &States[S_PROG_MELEE+4]), - S_NORMAL (PRGR, 'F', 4, A_ProgrammerMelee, &States[S_PROG_CHASE+4]), - -#define S_PROG_MISSILE (S_PROG_MELEE+4) - S_NORMAL (PRGR, 'G', 5, A_FaceTarget, &States[S_PROG_MISSILE+1]), - S_NORMAL (PRGR, 'H', 5, A_SentinelBob, &States[S_PROG_MISSILE+2]), - S_BRIGHT (PRGR, 'I', 5, A_FaceTarget, &States[S_PROG_MISSILE+3]), - S_BRIGHT (PRGR, 'J', 5, A_SpotLightning, &States[S_PROG_CHASE+4]), - -#define S_PROG_PAIN (S_PROG_MISSILE+4) - S_NORMAL (PRGR, 'K', 5, A_Pain, &States[S_PROG_PAIN+1]), - S_NORMAL (PRGR, 'L', 5, A_SentinelBob, &States[S_PROG_CHASE+4]), - -#define S_PROG_DIE (S_PROG_PAIN+2) - S_BRIGHT (PRGR, 'L', 7, A_TossGib, &States[S_PROG_DIE+1]), - S_BRIGHT (PRGR, 'M', 7, A_Scream, &States[S_PROG_DIE+2]), - S_BRIGHT (PRGR, 'N', 7, A_TossGib, &States[S_PROG_DIE+3]), - S_BRIGHT (PRGR, 'O', 7, A_NoBlocking, &States[S_PROG_DIE+4]), - S_BRIGHT (PRGR, 'P', 7, A_TossGib, &States[S_PROG_DIE+5]), - S_BRIGHT (PRGR, 'Q', 7, A_SpawnProgrammerBase,&States[S_PROG_DIE+6]), - S_BRIGHT (PRGR, 'R', 7, NULL, &States[S_PROG_DIE+7]), - S_BRIGHT (PRGR, 'S', 6, NULL, &States[S_PROG_DIE+8]), - S_BRIGHT (PRGR, 'T', 5, NULL, &States[S_PROG_DIE+9]), - S_BRIGHT (PRGR, 'U', 5, NULL, &States[S_PROG_DIE+10]), - S_BRIGHT (PRGR, 'V', 5, NULL, &States[S_PROG_DIE+11]), - S_BRIGHT (PRGR, 'W', 5, NULL, &States[S_PROG_DIE+12]), - S_BRIGHT (PRGR, 'X', 32, NULL, &States[S_PROG_DIE+13]), - S_BRIGHT (PRGR, 'X', -1, A_ProgrammerDeath, NULL) -}; - -IMPLEMENT_ACTOR (AProgrammer, Strife, 71, 0) - PROP_StrifeType (95) - PROP_SpawnHealth (1100) - PROP_SpawnState (S_PROG_STND) - PROP_SeeState (S_PROG_CHASE) - PROP_PainState (S_PROG_PAIN) - PROP_PainChance (50) - PROP_MeleeState (S_PROG_MELEE) - PROP_MissileState (S_PROG_MISSILE) - PROP_DeathState (S_PROG_DIE) - PROP_SpeedFixed (26) - PROP_FloatSpeed (5) - PROP_RadiusFixed (45) - PROP_HeightFixed (60) - PROP_Mass (800) - PROP_Damage (4) - PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOGRAVITY|MF_FLOAT| - MF_NOBLOOD|MF_COUNTKILL|MF_NOTDMATCH) - PROP_Flags2 (MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS) - PROP_Flags3 (MF3_DONTMORPH|MF3_NOBLOCKMONST) - PROP_Flags4 (MF4_LOOKALLAROUND|MF4_FIRERESIST|MF4_NOICEDEATH|MF4_NOTARGETSWITCH) - PROP_MinMissileChance (150) - PROP_AttackSound ("programmer/attack") - PROP_PainSound ("programmer/pain") - PROP_DeathSound ("programmer/death") - PROP_ActiveSound ("programmer/active") - PROP_Obituary ("$OB_PROGRAMMER") -END_DEFAULTS - -//============================================================================ -// -// AProgrammer :: NoBlockingSet -// -//============================================================================ - -void AProgrammer::NoBlockingSet () -{ - P_DropItem (this, "Sigil1", -1, 256); -} - -// The Programmer's base for when he dies ----------------------------------- - -class AProgrammerBase : public AActor -{ - DECLARE_ACTOR (AProgrammerBase, AActor) -public: - void GetExplodeParms (int &damage, int &dist, bool &hurtSource); -}; - -FState AProgrammerBase::States[] = -{ - S_BRIGHT (BASE, 'A', 5, A_ExplodeAndAlert, &States[1]), - S_BRIGHT (BASE, 'B', 5, NULL, &States[2]), - S_BRIGHT (BASE, 'C', 5, NULL, &States[3]), - S_BRIGHT (BASE, 'D', 5, NULL, &States[4]), - S_NORMAL (BASE, 'E', 5, NULL, &States[5]), - S_NORMAL (BASE, 'F', 5, NULL, &States[6]), - S_NORMAL (BASE, 'G', 5, NULL, &States[7]), - S_NORMAL (BASE, 'H', -1, NULL, NULL) -}; - -IMPLEMENT_ACTOR (AProgrammerBase, Strife, -1, 0) - PROP_StrifeType (96) - PROP_SpawnState (0) - PROP_Flags (MF_NOBLOCKMAP|MF_NOCLIP|MF_NOBLOOD) -END_DEFAULTS - -//============================================================================ -// -// AProgrammerBase :: GetExplodeParms -// -//============================================================================ - -void AProgrammerBase::GetExplodeParms (int &damage, int &dist, bool &hurtSource) -{ - damage = dist = 32; -} - // The Programmer level ending thing ---------------------------------------- // [RH] I took some liberties to make this "cooler" than it was in Strife. class AProgLevelEnder : public AInventory { - DECLARE_STATELESS_ACTOR (AProgLevelEnder, AInventory) + DECLARE_CLASS (AProgLevelEnder, AInventory) public: void Tick (); PalEntry GetBlend (); }; -IMPLEMENT_STATELESS_ACTOR (AProgLevelEnder, Strife, -1, 0) - PROP_Inventory_FlagsSet (IF_UNDROPPABLE) -END_DEFAULTS +IMPLEMENT_CLASS (AProgLevelEnder) //============================================================================ // @@ -266,7 +119,7 @@ void A_SpotLightning (AActor *self) void A_SpawnProgrammerBase (AActor *self) { - AActor *foo = Spawn (self->x, self->y, self->z + 24*FRACUNIT, ALLOW_REPLACE); + AActor *foo = Spawn("ProgrammerBase", self->x, self->y, self->z + 24*FRACUNIT, ALLOW_REPLACE); if (foo != NULL) { foo->angle = self->angle + ANGLE_180 + (pr_prog.Random2() << 22); @@ -297,5 +150,4 @@ void A_ProgrammerDeath (AActor *self) } // the sky change scripts are now done as special actions in MAPINFO A_BossDeath(self); - //P_StartScript (self, NULL, 250, NULL, 0, 0, 0, 0, false, false); } diff --git a/src/g_strife/a_thingstoblowup.cpp b/src/g_strife/a_thingstoblowup.cpp index 5776e186e..21b70ac6c 100644 --- a/src/g_strife/a_thingstoblowup.cpp +++ b/src/g_strife/a_thingstoblowup.cpp @@ -5,54 +5,13 @@ #include "p_enemy.h" #include "a_action.h" #include "gstrings.h" +#include "thingdef/thingdef.h" static FRandom pr_bang4cloud ("Bang4Cloud"); static FRandom pr_lightout ("LightOut"); extern const PClass *QuestItemClasses[31]; -void A_TossGib (AActor *); -void A_LoopActiveSound (AActor *); -void A_LightGoesOut (AActor *); - -// A Cloud used for varius explosions --------------------------------------- -// This actor has no direct equivalent in strife. To create this, Strife -// spawned a spark and then changed its state to that of this explosion -// cloud. Weird. - -class ABang4Cloud : public AActor -{ - DECLARE_ACTOR (ABang4Cloud, AActor); -public: - void BeginPlay () - { - momz = FRACUNIT; - } -}; - -FState ABang4Cloud::States[] = -{ - S_BRIGHT (BNG4, 'B', 3, NULL, &States[1]), - S_BRIGHT (BNG4, 'C', 3, NULL, &States[2]), - S_BRIGHT (BNG4, 'D', 3, NULL, &States[3]), - S_BRIGHT (BNG4, 'E', 3, NULL, &States[4]), - S_BRIGHT (BNG4, 'F', 3, NULL, &States[5]), - S_BRIGHT (BNG4, 'G', 3, NULL, &States[6]), - S_BRIGHT (BNG4, 'H', 3, NULL, &States[7]), - S_BRIGHT (BNG4, 'I', 3, NULL, &States[8]), - S_BRIGHT (BNG4, 'J', 3, NULL, &States[9]), - S_BRIGHT (BNG4, 'K', 3, NULL, &States[10]), - S_BRIGHT (BNG4, 'L', 3, NULL, &States[11]), - S_BRIGHT (BNG4, 'M', 3, NULL, &States[12]), - S_BRIGHT (BNG4, 'N', 3, NULL, NULL) -}; - -IMPLEMENT_ACTOR (ABang4Cloud, Strife, -1, 0) - PROP_SpawnState (0) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY) - PROP_RenderStyle (STYLE_Add) -END_DEFAULTS - void A_Bang4Cloud (AActor *self) { fixed_t spawnx, spawny; @@ -60,14 +19,17 @@ void A_Bang4Cloud (AActor *self) spawnx = self->x + (pr_bang4cloud.Random2() & 3) * 10240; spawny = self->y + (pr_bang4cloud.Random2() & 3) * 10240; - Spawn (spawnx, spawny, self->z, ALLOW_REPLACE); + Spawn("Bang4Cloud", spawnx, spawny, self->z, ALLOW_REPLACE); } -// Piston ------------------------------------------------------------------- +// ------------------------------------------------------------------- void A_GiveQuestItem (AActor *self) { - int questitem = (self->Speed >> FRACBITS); + int index=CheckIndex(1); + if (index<0) return; + + int questitem = EvalExpressionI (StateParameters[index], self); // Give one of these quest items to every player in the game for (int i = 0; i < MAXPLAYERS; ++i) @@ -93,146 +55,7 @@ void A_GiveQuestItem (AActor *self) } } -class APiston : public AActor -{ - DECLARE_ACTOR (APiston, AActor); -}; - -FState APiston::States[] = -{ - S_NORMAL (PSTN, 'A', 8, NULL, &States[1]), - S_NORMAL (PSTN, 'B', 8, NULL, &States[0]), - - S_BRIGHT (PSTN, 'A', 4, A_Scream, &States[3]), - S_BRIGHT (PSTN, 'B', 4, A_NoBlocking, &States[4]), - S_BRIGHT (PSTN, 'C', 4, A_GiveQuestItem, &States[5]), - S_BRIGHT (PSTN, 'D', 4, A_Bang4Cloud, &States[6]), - S_BRIGHT (PSTN, 'E', 4, A_TossGib, &States[7]), - S_BRIGHT (PSTN, 'F', 4, NULL, &States[8]), - S_BRIGHT (PSTN, 'G', 4, A_Bang4Cloud, &States[9]), - S_NORMAL (PSTN, 'H', 4, NULL, &States[10]), - S_NORMAL (PSTN, 'I', -1, NULL, NULL) -}; - -IMPLEMENT_ACTOR (APiston, Strife, 45, 0) - PROP_StrifeType (123) - PROP_SpawnHealth (100) - PROP_SpawnState (0) - PROP_DeathState (2) - PROP_SpeedFixed (16) // Was a byte in Strife - PROP_RadiusFixed (20) - PROP_HeightFixed (76) - PROP_MassLong (10000000) - PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD) - PROP_Flags2 (MF2_FLOORCLIP) - PROP_Flags4 (MF4_INCOMBAT) - PROP_DeathSound ("misc/explosion") -END_DEFAULTS - -// Computer ----------------------------------------------------------------- - -class AComputer : public AActor -{ - DECLARE_ACTOR (AComputer, AActor) -}; - -FState AComputer::States[] = -{ - S_BRIGHT (SECR, 'A', 4, NULL, &States[1]), - S_BRIGHT (SECR, 'B', 4, NULL, &States[2]), - S_BRIGHT (SECR, 'C', 4, NULL, &States[3]), - S_BRIGHT (SECR, 'D', 4, NULL, &States[0]), - - S_BRIGHT (SECR, 'E', 5, A_Bang4Cloud, &States[5]), - S_BRIGHT (SECR, 'F', 5, A_NoBlocking, &States[6]), - S_BRIGHT (SECR, 'G', 5, A_GiveQuestItem, &States[7]), - S_BRIGHT (SECR, 'H', 5, A_TossGib, &States[8]), - S_BRIGHT (SECR, 'I', 5, A_Bang4Cloud, &States[9]), - S_NORMAL (SECR, 'J', 5, NULL, &States[10]), - S_NORMAL (SECR, 'K', 5, A_Bang4Cloud, &States[11]), - S_NORMAL (SECR, 'L', 5, NULL, &States[12]), - S_NORMAL (SECR, 'M', 5, A_Bang4Cloud, &States[13]), - S_NORMAL (SECR, 'N', 5, NULL, &States[14]), - S_NORMAL (SECR, 'O', 5, A_Bang4Cloud, &States[15]), - S_NORMAL (SECR, 'P',-1, NULL, NULL) -}; - -IMPLEMENT_ACTOR (AComputer, Strife, 182, 0) - PROP_SpawnState (0) - PROP_SpawnHealth (80) - PROP_DeathState (4) - PROP_SpeedFixed (27) // was a byte in Strife - PROP_RadiusFixed (26) - PROP_HeightFixed (128) - PROP_MassLong (100000) - PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD) - PROP_Flags2 (MF2_FLOORCLIP) - PROP_Flags4 (MF4_INCOMBAT) - PROP_StrifeType (124) - PROP_DeathSound ("misc/explosion") -END_DEFAULTS - -// Power Crystal ------------------------------------------------------------ - -void A_ExtraLightOff (AActor *); -void A_Explode512 (AActor *); - -class APowerCrystal : public AActor -{ - DECLARE_ACTOR (APowerCrystal, AActor) -}; - -FState APowerCrystal::States[] = -{ - S_BRIGHT (CRYS, 'A', 16, A_LoopActiveSound, &States[1]), - S_BRIGHT (CRYS, 'B', 5, A_LoopActiveSound, &States[2]), - S_BRIGHT (CRYS, 'C', 4, A_LoopActiveSound, &States[3]), - S_BRIGHT (CRYS, 'D', 4, A_LoopActiveSound, &States[4]), - S_BRIGHT (CRYS, 'E', 4, A_LoopActiveSound, &States[5]), - S_BRIGHT (CRYS, 'F', 4, A_LoopActiveSound, &States[0]), - - S_BRIGHT (BOOM, 'A', 0, A_Scream, &States[7]), // [RH] This seems like a good idea - S_BRIGHT (BOOM, 'A', 1, A_Explode512, &States[8]), - S_BRIGHT (BOOM, 'B', 3, A_GiveQuestItem, &States[9]), - S_BRIGHT (BOOM, 'C', 2, A_LightGoesOut, &States[10]), - S_BRIGHT (BOOM, 'D', 3, A_Bang4Cloud, &States[11]), - S_BRIGHT (BOOM, 'E', 3, NULL, &States[12]), - S_BRIGHT (BOOM, 'F', 3, NULL, &States[13]), - S_BRIGHT (BOOM, 'G', 3, A_Bang4Cloud, &States[14]), - S_BRIGHT (BOOM, 'H', 1, A_Explode512, &States[15]), - S_BRIGHT (BOOM, 'I', 3, NULL, &States[16]), - S_BRIGHT (BOOM, 'J', 3, A_Bang4Cloud, &States[17]), - S_BRIGHT (BOOM, 'K', 3, A_Bang4Cloud, &States[18]), - S_BRIGHT (BOOM, 'L', 3, A_Bang4Cloud, &States[19]), - S_BRIGHT (BOOM, 'M', 3, NULL, &States[20]), - S_BRIGHT (BOOM, 'N', 3, NULL, &States[21]), - S_BRIGHT (BOOM, 'O', 3, A_Bang4Cloud, &States[22]), - S_BRIGHT (BOOM, 'P', 3, NULL, &States[23]), - S_BRIGHT (BOOM, 'Q', 3, NULL, &States[24]), - S_BRIGHT (BOOM, 'R', 3, NULL, &States[25]), - S_BRIGHT (BOOM, 'S', 3, NULL, &States[26]), - S_BRIGHT (BOOM, 'T', 3, NULL, &States[27]), - S_BRIGHT (BOOM, 'U', 3, A_ExtraLightOff, &States[28]), - S_BRIGHT (BOOM, 'V', 3, NULL, &States[29]), - S_BRIGHT (BOOM, 'W', 3, NULL, &States[30]), - S_BRIGHT (BOOM, 'X', 3, NULL, &States[31]), - S_BRIGHT (BOOM, 'Y', 3, NULL, NULL) -}; - -IMPLEMENT_ACTOR (APowerCrystal, Strife, 92, 0) - PROP_SpawnState (0) - PROP_SpawnHealth (50) - PROP_DeathState (6) - PROP_SpeedFixed (14) // Was a byte in Strife - PROP_RadiusFixed (20) // This size seems odd, but that's what the mobjinfo says - PROP_HeightFixed (16) - PROP_MassLong (99999999) - PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOGRAVITY|MF_NOBLOOD) - PROP_Flags2 (MF2_FLOORCLIP) - PROP_StrifeType (201) - PROP_DeathSound ("misc/explosion") - PROP_ActiveSound ("misc/reactor") -END_DEFAULTS +// PowerCrystal ------------------------------------------------------------------- void A_ExtraLightOff (AActor *self) { diff --git a/src/thingdef/thingdef.cpp b/src/thingdef/thingdef.cpp index 5f9079c32..868b5b6af 100644 --- a/src/thingdef/thingdef.cpp +++ b/src/thingdef/thingdef.cpp @@ -393,7 +393,7 @@ static FActorInfo *CreateNewActor(FScanner &sc, FActorInfo **parentc, Baggage *b { sc.ScriptError("Unknown native class '%s'", typeName.GetChars()); } - else if (ti->ParentClass != parent) + else if (ti->ParentClass->NativeClass() != parent->NativeClass()) { sc.ScriptError("Native class '%s' does not inherit from '%s'", typeName.GetChars(),parent->TypeName.GetChars()); diff --git a/src/v_palette.cpp b/src/v_palette.cpp index e6f13f067..13288b0c9 100644 --- a/src/v_palette.cpp +++ b/src/v_palette.cpp @@ -288,7 +288,7 @@ void FPalette::MakeRemap (const DWORD *colors, BYTE *remap, const BYTE *useful, { remap[workspace[i].PalEntry] = BestColor ((DWORD *)BaseColors, RPART(workspace[i].Color), GPART(workspace[i].Color), BPART(workspace[i].Color), - 0, 255); + 1, 255); } } } diff --git a/wadsrc/static/actors/nativeclasses.txt b/wadsrc/static/actors/nativeclasses.txt index 508e4790e..0a128bf8a 100644 --- a/wadsrc/static/actors/nativeclasses.txt +++ b/wadsrc/static/actors/nativeclasses.txt @@ -182,6 +182,8 @@ class Actor extends Thinker action native A_ClassBossHealth(); action native A_ShootGun(); action native A_RocketInFlight(); + action native A_Bang4Cloud(); + action native A_GiveQuestItem(eval int itemno); } class Inventory extends Actor diff --git a/wadsrc/static/actors/strife/loremaster.txt b/wadsrc/static/actors/strife/loremaster.txt new file mode 100644 index 000000000..f8e760eb9 --- /dev/null +++ b/wadsrc/static/actors/strife/loremaster.txt @@ -0,0 +1,117 @@ + +// Loremaster (aka Priest) -------------------------------------------------- + +ACTOR Loremaster 12 +{ + Game Strife + ConversationID 66, 63, 64 + Health 800 + Speed 10 + Radius 15 + Height 56 + FloatSpeed 5 + Monster + +FLOAT + +NOBLOOD + +NOGRAVITY + +NOTDMATCH + +FLOORCLIP + +NOBLOCKMONST + +INCOMBAT + +LOOKALLAROUND + +FIRERESIST + +NOICEDEATH + MinMissileChance 150 + Tag "PRIEST" + SeeSound "loremaster/sight" + AttackSound "loremaster/attack" + PainSound "loremaster/pain" + DeathSound "loremaster/death" + ActiveSound "loremaster/active" + Obituary "$OB_LOREMASTER" + DropItem "Junk" + states + { + Spawn: + PRST A 10 A_Look + PRST B 10 A_SentinelBob + Loop + See: + PRST A 4 A_Chase + PRST A 4 A_SentinelBob + PRST B 4 A_Chase + PRST B 4 A_SentinelBob + PRST C 4 A_Chase + PRST C 4 A_SentinelBob + PRST D 4 A_Chase + PRST D 4 A_SentinelBob + Loop + Melee: + PRST E 4 A_FaceTarget + PRST F 4 A_CustomMeleeAttack((random[SpectreMelee](0,255)&9)*5) + PRST E 4 A_SentinelBob + Goto See + Missile: + PRST E 4 A_FaceTarget + PRST F 4 A_CustomMissile("LoreShot", 32, 0) + PRST E 4 A_SentinelBob + Goto See + Death: + PDED A 6 + PDED B 6 A_Scream + PDED C 6 + PDED D 6 A_Fall + PDED E 6 + PDED FGHIJIJIJKL 5 + PDED MNOP 4 + PDED Q 4 A_SpawnItemEx("AlienSpectre5", 0, 0, 0, 0, 0, random[spectrespawn](0,255)*0.0078125, 0, SXF_NOCHECKPOSITION) + PDED RS 4 + PDED T -1 + Stop + } +} + + +// Loremaster Projectile ---------------------------------------------------- + +ACTOR LoreShot native +{ + ConversationID 97,-1,-1 + Speed 20 + Height 14 + Radius 10 + Projectile + +STRIFEDAMAGE + Damage 2 + MaxStepHeight 4 + SeeSound "loremaster/chain" + ActiveSound "loremaster/swish" + + action native A_LoremasterChain (); + + States + { + Spawn: + OCLW A 2 A_LoremasterChain + Loop + Death: + OCLW A 6 + Stop + } +} + +// Loremaster Subprojectile ------------------------------------------------- + +ACTOR LoreShot2 +{ + ConversationID 98,-1,-1 + +NOBLOCKMAP + +NOGRAVITY + States + { + Spawn: + TEND A 20 + Stop + } +} + diff --git a/wadsrc/static/actors/strife/merchants.txt b/wadsrc/static/actors/strife/merchants.txt index e49db9eee..2e235c75c 100644 --- a/wadsrc/static/actors/strife/merchants.txt +++ b/wadsrc/static/actors/strife/merchants.txt @@ -27,7 +27,8 @@ ACTOR Merchant Loop See: Pain: - MRPN A 3 A_AlertMonsters + MRPN A 1 + MRPN A 2 A_AlertMonsters MRPN B 3 A_Pain MRPN C 3 MRPN D 9 Door_CloseWaitOpen(999, 64, 960) diff --git a/wadsrc/static/actors/strife/programmer.txt b/wadsrc/static/actors/strife/programmer.txt new file mode 100644 index 000000000..41fdedff2 --- /dev/null +++ b/wadsrc/static/actors/strife/programmer.txt @@ -0,0 +1,110 @@ + +// Programmer --------------------------------------------------------------- + +ACTOR Programmer 71 +{ + Game Strife + ConversationID 95, -1, -1 + Health 1100 + PainChance 50 + Speed 26 + FloatSpeed 5 + Radius 45 + Height 60 + Mass 800 + Damage 4 + Monster + +NOGRAVITY + +FLOAT + +NOBLOOD + +NOTDMATCH + +DONTMORPH + +NOBLOCKMONST + +LOOKALLAROUND + +FIRERESIST + +NOICEDEATH + +NOTARGETSWITCH + MinMissileChance 150 + AttackSound "programmer/attack" + PainSound "programmer/pain" + DeathSound "programmer/death" + ActiveSound "programmer/active" + Obituary "$OB_PROGRAMMER" + DropItem "Sigil1" + + action native A_ProgrammerMelee (); + action native A_SpawnProgrammerBase (); + action native A_ProgrammerDeath (); + action native A_SpotLightning(); + + States + { + Spawn: + PRGR A 5 A_Look + PRGR A 1 A_SentinelBob + Loop + See: + PRGR A 160 A_SentinelBob + PRGR BCD 5 A_SentinelBob + PRGR EF 2 A_SentinelBob + PRGR EF 3 A_Chase + Goto See+4 + Melee: + PRGR E 2 A_SentinelBob + PRGR F 3 A_SentinelBob + PRGR E 3 A_FaceTarget + PRGR F 4 A_ProgrammerMelee + Goto See+4 + Missile: + PRGR G 5 A_FaceTarget + PRGR H 5 A_SentinelBob + PRGR I 5 Bright A_FaceTarget + PRGR J 5 Bright A_SpotLightning + Goto See+4 + Pain: + PRGR K 5 A_Pain + PRGR L 5 A_SentinelBob + Goto See+4 + Death: + PRGR L 7 Bright A_TossGib + PRGR M 7 Bright A_Scream + PRGR N 7 Bright A_TossGib + PRGR O 7 Bright A_NoBlocking + PRGR P 7 Bright A_TossGib + PRGR Q 7 Bright A_SpawnProgrammerBase + PRGR R 7 Bright + PRGR S 6 Bright + PRGR TUVW 5 Bright + PRGR X 32 Bright + PRGR Y -1 Bright A_ProgrammerDeath + Stop + } +} + + +// The Programmer's base for when he dies ----------------------------------- + +ACTOR ProgrammerBase +{ + ConversationID 96,-1,-1 + +NOBLOCKMAP + +NOCLIP + +NOBLOOD + states + { + Spawn: + BASE A 5 Bright A_Explode(32,32,1,1) + BASE BCD 5 Bright + BASE EFG 5 + BASE H -1 + Stop + } +} + + +// The Programmer level ending thing ---------------------------------------- + +ACTOR ProgLevelEnder : Inventory native +{ + +INVENTORY.UNDROPPABLE +} diff --git a/wadsrc/static/actors/strife/thingstoblowup.txt b/wadsrc/static/actors/strife/thingstoblowup.txt new file mode 100644 index 000000000..5d0088c43 --- /dev/null +++ b/wadsrc/static/actors/strife/thingstoblowup.txt @@ -0,0 +1,147 @@ + + +// A Cloud used for varius explosions --------------------------------------- +// This actor has no direct equivalent in strife. To create this, Strife +// spawned a spark and then changed its state to that of this explosion +// cloud. Weird. + +ACTOR Bang4Cloud +{ + +NOBLOCKMAP + +NOGRAVITY + RenderStyle Add + VSpeed 1 + States + { + Spawn: + BNG4 BCDEFGHIJKLMN 3 Bright + Stop + } +} + +// Piston ------------------------------------------------------------------- + +ACTOR Piston 45 +{ + Game Strife + ConversationID 123,-1,-1 + Health 100 + Speed 16 + Radius 16 + Height 76 + Mass 10000000 + +SOLID + +SHOOTABLE + +NOBLOOD + +FLOORCLIP + +INCOMBAT + DeathSound "misc/explosion" + states + { + Spawn: + PSTN AB 8 + Loop + Death: + PSTN A 4 Bright A_Scream + PSTN B 4 Bright A_NoBlocking + PSTN C 4 Bright A_GiveQuestItem(16) + PSTN D 4 Bright A_Bang4Cloud + PSTN E 4 Bright A_TossGib + PSTN F 4 Bright + PSTN G 4 Bright A_Bang4Cloud + PSTN H 4 + PSTN I -1 + Stop + } + +} + +// Computer ----------------------------------------------------------------- + +ACTOR Computer 182 +{ + Game Strife + ConversationID 128,-1,-1 + Health 80 + Speed 27 + Radius 26 + Height 128 + Mass 10000000 + +SOLID + +SHOOTABLE + +NOBLOOD + +FLOORCLIP + +INCOMBAT + DeathSound "misc/explosion" + states + { + Spawn: + SECR ABCD 4 Bright + Loop + Death: + SECR E 5 Bright A_Bang4Cloud + SECR F 5 Bright A_NoBlocking + SECR G 5 Bright A_GiveQuestItem(27) + SECR H 5 Bright A_TossGib + SECR I 5 Bright A_Bang4Cloud + SECR J 5 + SECR K 5 A_Bang4Cloud + SECR L 5 + SECR M 5 A_Bang4Cloud + SECR N 5 + SECR O 5 A_Bang4Cloud + SECR P -1 + Stop + } +} + + +// Power Crystal ------------------------------------------------------------ + +ACTOR PowerCrystal 92 +{ + Game Strife + ConversationID 201,-1,-1 + Health 50 + Speed 14 + Radius 20 + Height 16 + Mass 99999999 + +SOLID + +SHOOTABLE + +NOGRAVITY + +NOBLOOD + +FLOORCLIP + DeathSound "misc/explosion" + ActiveSound "misc/reactor" + + action native A_ExtraLightOff (); + action native A_Explode512 (); + action native A_LightGoesOut (); + + States + { + Spawn: + CRYS A 16 A_LoopActiveSound + CRYS B 5 A_LoopActiveSound + CRYS CDEF 4 A_LoopActiveSound + Loop + Death: + BOOM A 0 Bright A_Scream + BOOM A 1 Bright A_Explode512 + BOOM B 3 Bright A_GiveQuestItem(14) + BOOM C 2 Bright A_LightGoesOut + BOOM D 3 Bright A_Bang4Cloud + BOOM EF 3 Bright + BOOM G 3 Bright A_Bang4Cloud + BOOM H 1 Bright A_Explode512 + BOOM I 3 Bright + BOOM JKL 3 Bright A_Bang4Cloud + BOOM MN 3 Bright + BOOM O 3 Bright A_Bang4Cloud + BOOM PQRST 3 Bright + BOOM U 3 Bright A_ExtraLightOff + BOOM VWXY 3 Bright + Stop + } +} diff --git a/wadsrc/static/decorate.txt b/wadsrc/static/decorate.txt index 296245a29..9890ec214 100644 --- a/wadsrc/static/decorate.txt +++ b/wadsrc/static/decorate.txt @@ -105,9 +105,11 @@ #include "actors/strife/crusader.txt" #include "actors/strife/entityboss.txt" #include "actors/strife/inquisitor.txt" +#include "actors/strife/loremaster.txt" #include "actors/strife/merchants.txt" #include "actors/strife/peasants.txt" #include "actors/strife/strifebishop.txt" +#include "actors/strife/programmer.txt" #include "actors/strife/questitems.txt" #include "actors/strife/ratbuddy.txt" #include "actors/strife/rebels.txt" @@ -118,5 +120,6 @@ #include "actors/strife/strifeitems.txt" #include "actors/strife/strifekeys.txt" #include "actors/strife/strifestuff.txt" +#include "actors/strife/thingstoblowup.txt" #include "actors/strife/templar.txt" #include "actors/strife/zombie.txt"