diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 40cc9680b..714405641 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,9 @@ August 5, 2008 (Changes by Graf Zahl) +- Added DECORATE conversions for Hexen's Cleric weapons by Karate Chris. +- Added a check to Zipdir that excludes files with a .orig extension. These + can be left behind by patch.exe and create problems. +- fixed: Unmorphing from chicken caused a crash when reading non-existent + meta-data strings. - Converted the ScriptedMarines to DECORATE. - Fixed: DLightTransfer and DWallLightTransfer were declared as actors. diff --git a/src/codepointers.h b/src/codepointers.h index 1d21a9dee..4282e87b1 100644 --- a/src/codepointers.h +++ b/src/codepointers.h @@ -207,7 +207,18 @@ WEAPON(CFlameAttack) WEAPON(CFlameRotate) ACTOR(CFlamePuff) WEAPON(CFlameMissile) +ACTOR(DropWraithvergePieces) +WEAPON(CHolyAttack) +WEAPON(CHolyAttack2) +WEAPON(CHolyPalette) +ACTOR(CHolySeek) +ACTOR(CHolyCheckScream) +ACTOR(CHolyTail) WEAPON(CMaceAttack) +WEAPON(CStaffInitBlink) +WEAPON(CStaffCheckBlink) +WEAPON(CStaffCheck) +WEAPON(CStaffAttack) ACTOR(FiredRocks) ACTOR(FiredChase) ACTOR(FiredAttack) diff --git a/src/g_hexen/a_clericholy.cpp b/src/g_hexen/a_clericholy.cpp index 4c25e4307..6c19c8de2 100644 --- a/src/g_hexen/a_clericholy.cpp +++ b/src/g_hexen/a_clericholy.cpp @@ -17,7 +17,6 @@ static FRandom pr_checkscream ("CCheckScream"); static FRandom pr_spiritslam ("CHolySlam"); static FRandom pr_wraithvergedrop ("WraithvergeDrop"); -void A_CHolySpawnPuff (AActor *); void A_CHolyAttack2 (AActor *); void A_CHolyTail (AActor *); void A_CHolySeek (AActor *); @@ -33,16 +32,14 @@ void SpawnSpiritTail (AActor *spirit); class AClericWeaponPiece : public AFourthWeaponPiece { - DECLARE_STATELESS_ACTOR (AClericWeaponPiece, AFourthWeaponPiece) + DECLARE_CLASS (AClericWeaponPiece, AFourthWeaponPiece) public: void BeginPlay (); protected: bool MatchPlayerClass (AActor *toucher); }; -IMPLEMENT_STATELESS_ACTOR (AClericWeaponPiece, Hexen, -1, 0) - PROP_Inventory_PickupMessage("$TXT_WRAITHVERGE_PIECE") -END_DEFAULTS +IMPLEMENT_CLASS (AClericWeaponPiece) bool AClericWeaponPiece::MatchPlayerClass (AActor *toucher) { @@ -54,21 +51,12 @@ bool AClericWeaponPiece::MatchPlayerClass (AActor *toucher) class ACWeaponPiece1 : public AClericWeaponPiece { - DECLARE_ACTOR (ACWeaponPiece1, AClericWeaponPiece) + DECLARE_CLASS (ACWeaponPiece1, AClericWeaponPiece) public: void BeginPlay (); }; -FState ACWeaponPiece1::States[] = -{ - S_BRIGHT (WCH1, 'A', -1, NULL , NULL), -}; - -IMPLEMENT_ACTOR (ACWeaponPiece1, Hexen, 18, 33) - PROP_Flags (MF_SPECIAL) - PROP_Flags2 (MF2_FLOATBOB) - PROP_SpawnState (0) -END_DEFAULTS +IMPLEMENT_CLASS (ACWeaponPiece1) void ACWeaponPiece1::BeginPlay () { @@ -85,16 +73,7 @@ public: void BeginPlay (); }; -FState ACWeaponPiece2::States[] = -{ - S_BRIGHT (WCH2, 'A', -1, NULL , NULL), -}; - -IMPLEMENT_ACTOR (ACWeaponPiece2, Hexen, 19, 34) - PROP_Flags (MF_SPECIAL) - PROP_Flags2 (MF2_FLOATBOB) - PROP_SpawnState (0) -END_DEFAULTS +IMPLEMENT_CLASS (ACWeaponPiece2) void ACWeaponPiece2::BeginPlay () { @@ -111,16 +90,7 @@ public: void BeginPlay (); }; -FState ACWeaponPiece3::States[] = -{ - S_BRIGHT (WCH3, 'A', -1, NULL , NULL), -}; - -IMPLEMENT_ACTOR (ACWeaponPiece3, Hexen, 20, 35) - PROP_Flags (MF_SPECIAL) - PROP_Flags2 (MF2_FLOATBOB) - PROP_SpawnState (0) -END_DEFAULTS +IMPLEMENT_CLASS (ACWeaponPiece3) void ACWeaponPiece3::BeginPlay () { @@ -128,27 +98,6 @@ void ACWeaponPiece3::BeginPlay () PieceValue = WPIECE3<<3; } -// An actor that spawns the three pieces of the cleric's fourth weapon ------ - -// This gets spawned if weapon drop is on so that other players can pick up -// this player's weapon. - -class AWraithvergeDrop : public AActor -{ - DECLARE_ACTOR (AWraithvergeDrop, AActor) -}; - -FState AWraithvergeDrop::States[] = -{ - S_NORMAL (TNT1, 'A', 1, NULL, &States[1]), - S_NORMAL (TNT1, 'A', 1, A_DropWraithvergePieces, NULL) -}; - -IMPLEMENT_ACTOR (AWraithvergeDrop, Hexen, -1, 0) - PROP_SpawnState (0) -END_DEFAULTS - - // Cleric's Wraithverge (Holy Symbol?) -------------------------------------- class ACWeapWraithverge : public AClericWeapon @@ -167,171 +116,11 @@ public: BYTE CHolyCount; }; -FState ACWeapWraithverge::States[] = -{ - // Dummy state, because the fourth weapon does not appear in a level directly. - S_NORMAL (TNT1, 'A', -1, NULL , NULL), - -#define S_CHOLYREADY 1 - S_NORMAL (CHLY, 'A', 1, A_WeaponReady , &States[S_CHOLYREADY]), - -#define S_CHOLYDOWN (S_CHOLYREADY+1) - S_NORMAL (CHLY, 'A', 1, A_Lower , &States[S_CHOLYDOWN]), - -#define S_CHOLYUP (S_CHOLYDOWN+1) - S_NORMAL (CHLY, 'A', 1, A_Raise , &States[S_CHOLYUP]), - -#define S_CHOLYATK (S_CHOLYUP+1) - S_BRIGHT2 (CHLY, 'A', 1, NULL , &States[S_CHOLYATK+1], 0, 40), - S_BRIGHT2 (CHLY, 'B', 1, NULL , &States[S_CHOLYATK+2], 0, 40), - S_BRIGHT2 (CHLY, 'C', 2, NULL , &States[S_CHOLYATK+3], 0, 43), - S_BRIGHT2 (CHLY, 'D', 2, NULL , &States[S_CHOLYATK+4], 0, 43), - S_BRIGHT2 (CHLY, 'E', 2, NULL , &States[S_CHOLYATK+5], 0, 45), - S_BRIGHT2 (CHLY, 'F', 6, A_CHolyAttack , &States[S_CHOLYATK+6], 0, 48), - S_BRIGHT2 (CHLY, 'G', 2, A_CHolyPalette , &States[S_CHOLYATK+7], 0, 40), - S_BRIGHT2 (CHLY, 'G', 2, A_CHolyPalette , &States[S_CHOLYATK+8], 0, 40), - S_BRIGHT2 (CHLY, 'G', 2, A_CHolyPalette , &States[S_CHOLYREADY], 0, 36) -}; - -IMPLEMENT_ACTOR (ACWeapWraithverge, Hexen, -1, 0) - PROP_Flags (MF_SPECIAL) - PROP_SpawnState (0) - - PROP_Weapon_SelectionOrder (3000) - PROP_Weapon_Flags (WIF_PRIMARY_USES_BOTH) - PROP_Weapon_AmmoUse1 (18) - PROP_Weapon_AmmoUse2 (18) - PROP_Weapon_AmmoGive1 (0) - PROP_Weapon_AmmoGive2 (0) - PROP_Weapon_UpState (S_CHOLYUP) - PROP_Weapon_DownState (S_CHOLYDOWN) - PROP_Weapon_ReadyState (S_CHOLYREADY) - PROP_Weapon_AtkState (S_CHOLYATK) - PROP_Weapon_Kickback (150) - PROP_Weapon_MoveCombatDist (22000000) - PROP_Weapon_AmmoType1 ("Mana1") - PROP_Weapon_AmmoType2 ("Mana2") - PROP_Weapon_ProjectileType ("HolyMissile") - PROP_Inventory_PickupMessage("$TXT_WEAPON_C4") -END_DEFAULTS - -// Holy Missile ------------------------------------------------------------- - -class AHolyMissile : public AActor -{ - DECLARE_ACTOR (AHolyMissile, AActor) -}; - -FState AHolyMissile::States[] = -{ - S_BRIGHT (SPIR, 'P', 3, A_CHolySpawnPuff , &States[1]), - S_BRIGHT (SPIR, 'P', 3, A_CHolySpawnPuff , &States[2]), - S_BRIGHT (SPIR, 'P', 3, A_CHolySpawnPuff , &States[3]), - S_BRIGHT (SPIR, 'P', 3, A_CHolySpawnPuff , &States[4]), - S_BRIGHT (SPIR, 'P', 1, A_CHolyAttack2 , NULL), -}; - -IMPLEMENT_ACTOR (AHolyMissile, Hexen, -1, 0) - PROP_SpeedFixed (30) - PROP_RadiusFixed (15) - PROP_HeightFixed (8) - PROP_Damage (4) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE) - PROP_Flags2 (MF2_NOTELEPORT) - PROP_Flags4 (MF4_EXTREMEDEATH) - - PROP_SpawnState (0) - PROP_DeathState (4) -END_DEFAULTS - -// Holy Missile Puff -------------------------------------------------------- - -class AHolyMissilePuff : public AActor -{ - DECLARE_ACTOR (AHolyMissilePuff, AActor) -}; - -FState AHolyMissilePuff::States[] = -{ - S_NORMAL (SPIR, 'Q', 3, NULL , &States[1]), - S_NORMAL (SPIR, 'R', 3, NULL , &States[2]), - S_NORMAL (SPIR, 'S', 3, NULL , &States[3]), - S_NORMAL (SPIR, 'T', 3, NULL , &States[4]), - S_NORMAL (SPIR, 'U', 3, NULL , NULL), -}; - -IMPLEMENT_ACTOR (AHolyMissilePuff, Hexen, -1, 0) - PROP_RadiusFixed (4) - PROP_HeightFixed (8) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF) - PROP_Flags2 (MF2_NOTELEPORT) - PROP_RenderStyle (STYLE_Translucent) - PROP_Alpha (HX_ALTSHADOW) - - PROP_SpawnState (0) -END_DEFAULTS - -// Holy Puff ---------------------------------------------------------------- - -class AHolyPuff : public AActor -{ - DECLARE_ACTOR (AHolyPuff, AActor) -}; - -FState AHolyPuff::States[] = -{ - S_NORMAL (SPIR, 'K', 3, NULL , &States[1]), - S_NORMAL (SPIR, 'L', 3, NULL , &States[2]), - S_NORMAL (SPIR, 'M', 3, NULL , &States[3]), - S_NORMAL (SPIR, 'N', 3, NULL , &States[4]), - S_NORMAL (SPIR, 'O', 3, NULL , NULL), -}; - -IMPLEMENT_ACTOR (AHolyPuff, Hexen, -1, 0) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY) - PROP_RenderStyle (STYLE_Translucent) - PROP_Alpha (HX_SHADOW) - PROP_SpawnState (0) -END_DEFAULTS - +IMPLEMENT_CLASS (ACWeapWraithverge) // Holy Spirit -------------------------------------------------------------- -FState AHolySpirit::States[] = -{ -#define S_HOLY_FX1 0 - S_NORMAL (SPIR, 'A', 2, A_CHolySeek , &States[S_HOLY_FX1+1]), - S_NORMAL (SPIR, 'A', 2, A_CHolySeek , &States[S_HOLY_FX1+2]), - S_NORMAL (SPIR, 'B', 2, A_CHolySeek , &States[S_HOLY_FX1+3]), - S_NORMAL (SPIR, 'B', 2, A_CHolyCheckScream , &States[S_HOLY_FX1]), - -#define S_HOLY_FX_X1 (S_HOLY_FX1+4) - S_NORMAL (SPIR, 'D', 4, NULL , &States[S_HOLY_FX_X1+1]), - S_NORMAL (SPIR, 'E', 4, A_Scream , &States[S_HOLY_FX_X1+2]), - S_NORMAL (SPIR, 'F', 4, NULL , &States[S_HOLY_FX_X1+3]), - S_NORMAL (SPIR, 'G', 4, NULL , &States[S_HOLY_FX_X1+4]), - S_NORMAL (SPIR, 'H', 4, NULL , &States[S_HOLY_FX_X1+5]), - S_NORMAL (SPIR, 'I', 4, NULL , NULL), -}; - -IMPLEMENT_ACTOR (AHolySpirit, Hexen, -1, 0) - PROP_SpawnHealth (105) - PROP_SpeedFixed (12) - PROP_RadiusFixed (10) - PROP_HeightFixed (6) - PROP_Damage (3) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE) - PROP_Flags2 (MF2_NOTELEPORT|MF2_RIP|MF2_IMPACT|MF2_PCROSS|MF2_SEEKERMISSILE) - PROP_Flags3 (MF3_FOILINVUL|MF3_SKYEXPLODE|MF3_NOEXPLODEFLOOR|MF3_CANBLAST) - PROP_Flags4 (MF4_EXTREMEDEATH) - PROP_RenderStyle (STYLE_Translucent) - PROP_Alpha (HX_ALTSHADOW) - - PROP_SpawnState (S_HOLY_FX1) - PROP_DeathState (S_HOLY_FX_X1) - - PROP_DeathSound ("SpiritDie") -END_DEFAULTS +IMPLEMENT_CLASS (AHolySpirit) bool AHolySpirit::Slam (AActor *thing) { @@ -364,7 +153,7 @@ bool AHolySpirit::Slam (AActor *thing) P_DamageMobj (thing, this, target, dam, NAME_Melee); if (pr_spiritslam() < 128) { - Spawn (x, y, z, ALLOW_REPLACE); + Spawn ("HolyPuff", x, y, z, ALLOW_REPLACE); S_Sound (this, CHAN_WEAPON, "SpiritAttack", 1, ATTN_NORM); if (thing->flags3&MF3_ISMONSTER && pr_spiritslam() < 128) { @@ -421,43 +210,6 @@ bool AHolySpirit::IsOkayToAttack (AActor *link) return false; } - -// Holy Tail ---------------------------------------------------------------- - -class AHolyTail : public AActor -{ - DECLARE_ACTOR (AHolyTail, AActor) -}; - -FState AHolyTail::States[] = -{ - S_NORMAL (SPIR, 'C', 1, A_CHolyTail , &States[0]), - S_NORMAL (SPIR, 'D', -1, NULL , NULL), -}; - -IMPLEMENT_ACTOR (AHolyTail, Hexen, -1, 0) - PROP_RadiusFixed (1) - PROP_HeightFixed (1) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_NOCLIP) - PROP_Flags2 (MF2_NOTELEPORT) - PROP_RenderStyle (STYLE_Translucent) - PROP_Alpha (HX_ALTSHADOW) - - PROP_SpawnState (0) -END_DEFAULTS - -// Holy Tail Trail --------------------------------------------------------- - -class AHolyTailTrail : public AHolyTail -{ - DECLARE_STATELESS_ACTOR (AHolyTailTrail, AHolyTail) -}; - - -IMPLEMENT_STATELESS_ACTOR (AHolyTailTrail, Hexen, -1, 0) - PROP_SpawnState (1) -END_DEFAULTS - //============================================================================ // // A_CHolyAttack3 @@ -467,7 +219,7 @@ END_DEFAULTS void A_CHolyAttack3 (AActor *actor) { - AActor * missile = P_SpawnMissileZ (actor, actor->z + 40*FRACUNIT, actor->target, RUNTIME_CLASS(AHolyMissile)); + AActor * missile = P_SpawnMissileZ (actor, actor->z + 40*FRACUNIT, actor->target, PClass::FindClass ("HolyMissile")); if (missile != NULL) missile->tracer = NULL; // No initial target S_Sound (actor, CHAN_WEAPON, "HolySymbolFire", 1, ATTN_NORM); } @@ -539,11 +291,11 @@ void SpawnSpiritTail (AActor *spirit) AActor *tail, *next; int i; - tail = Spawn (spirit->x, spirit->y, spirit->z, ALLOW_REPLACE); + tail = Spawn ("HolyTail", spirit->x, spirit->y, spirit->z, ALLOW_REPLACE); tail->target = spirit; // parent for (i = 1; i < 3; i++) { - next = Spawn (spirit->x, spirit->y, spirit->z, ALLOW_REPLACE); + next = Spawn ("HolyTailTrail", spirit->x, spirit->y, spirit->z, ALLOW_REPLACE); tail->tracer = next; tail = next; } @@ -571,7 +323,7 @@ void A_CHolyAttack (AActor *actor) if (!weapon->DepleteAmmo (weapon->bAltFire)) return; } - AActor * missile = P_SpawnPlayerMissile (actor, 0,0,0, RUNTIME_CLASS(AHolyMissile), actor->angle, &linetarget); + AActor * missile = P_SpawnPlayerMissile (actor, 0,0,0, PClass::FindClass ("HolyMissile"), actor->angle, &linetarget); if (missile != NULL) missile->tracer = linetarget; weapon->CHolyCount = 3; @@ -867,17 +619,6 @@ void A_CHolyCheckScream (AActor *actor) } } -//============================================================================ -// -// A_CHolySpawnPuff -// -//============================================================================ - -void A_CHolySpawnPuff (AActor *actor) -{ - Spawn (actor->x, actor->y, actor->z, ALLOW_REPLACE); -} - void AClericWeaponPiece::BeginPlay () { Super::BeginPlay (); diff --git a/src/g_hexen/a_clericstaff.cpp b/src/g_hexen/a_clericstaff.cpp index e00127d2f..9dcaa0c61 100644 --- a/src/g_hexen/a_clericstaff.cpp +++ b/src/g_hexen/a_clericstaff.cpp @@ -20,120 +20,16 @@ void A_CStaffCheck (AActor *actor); void A_CStaffAttack (AActor *actor); void A_CStaffMissileSlither (AActor *); -// The Cleric's Serpent Staff ----------------------------------------------- - -class ACWeapStaff : public AClericWeapon -{ - DECLARE_ACTOR (ACWeapStaff, AClericWeapon) -}; - -FState ACWeapStaff::States[] = -{ -#define S_CSTAFF 0 - S_NORMAL (WCSS, 'A', -1, NULL , NULL), - -#define S_CSTAFFREADY (S_CSTAFF+1) - S_NORMAL (CSSF, 'C', 4, NULL , &States[S_CSTAFFREADY+1]), - S_NORMAL (CSSF, 'B', 3, A_CStaffInitBlink , &States[S_CSTAFFREADY+2]), - S_NORMAL (CSSF, 'A', 1, A_WeaponReady , &States[S_CSTAFFREADY+3]), - S_NORMAL (CSSF, 'A', 1, A_WeaponReady , &States[S_CSTAFFREADY+4]), - S_NORMAL (CSSF, 'A', 1, A_WeaponReady , &States[S_CSTAFFREADY+5]), - S_NORMAL (CSSF, 'A', 1, A_WeaponReady , &States[S_CSTAFFREADY+6]), - S_NORMAL (CSSF, 'A', 1, A_WeaponReady , &States[S_CSTAFFREADY+7]), - S_NORMAL (CSSF, 'A', 1, A_WeaponReady , &States[S_CSTAFFREADY+8]), - S_NORMAL (CSSF, 'A', 1, A_WeaponReady , &States[S_CSTAFFREADY+9]), - S_NORMAL (CSSF, 'A', 1, A_CStaffCheckBlink , &States[S_CSTAFFREADY+2]), - -#define S_CSTAFFBLINK (S_CSTAFFREADY+10) - S_NORMAL (CSSF, 'B', 1, A_WeaponReady , &States[S_CSTAFFBLINK+1]), - S_NORMAL (CSSF, 'B', 1, A_WeaponReady , &States[S_CSTAFFBLINK+2]), - S_NORMAL (CSSF, 'B', 1, A_WeaponReady , &States[S_CSTAFFBLINK+3]), - S_NORMAL (CSSF, 'C', 1, A_WeaponReady , &States[S_CSTAFFBLINK+4]), - S_NORMAL (CSSF, 'C', 1, A_WeaponReady , &States[S_CSTAFFBLINK+5]), - S_NORMAL (CSSF, 'C', 1, A_WeaponReady , &States[S_CSTAFFBLINK+6]), - S_NORMAL (CSSF, 'C', 1, A_WeaponReady , &States[S_CSTAFFBLINK+7]), - S_NORMAL (CSSF, 'C', 1, A_WeaponReady , &States[S_CSTAFFBLINK+8]), - S_NORMAL (CSSF, 'B', 1, A_WeaponReady , &States[S_CSTAFFBLINK+9]), - S_NORMAL (CSSF, 'B', 1, A_WeaponReady , &States[S_CSTAFFBLINK+10]), - S_NORMAL (CSSF, 'B', 1, A_WeaponReady , &States[S_CSTAFFREADY+2]), - -#define S_CSTAFFDOWN (S_CSTAFFBLINK+11) - S_NORMAL (CSSF, 'B', 3, NULL , &States[S_CSTAFFDOWN+1]), - S_NORMAL (CSSF, 'C', 4, NULL , &States[S_CSTAFFDOWN+2]), - S_NORMAL (CSSF, 'C', 1, A_Lower , &States[S_CSTAFFDOWN+2]), - -#define S_CSTAFFUP (S_CSTAFFDOWN+3) - S_NORMAL (CSSF, 'C', 1, A_Raise , &States[S_CSTAFFUP]), - -#define S_CSTAFFATK (S_CSTAFFUP+1) - S_NORMAL2 (CSSF, 'A', 1, A_CStaffCheck , &States[S_CSTAFFATK+1], 0, 45), - S_NORMAL2 (CSSF, 'J', 1, A_CStaffAttack , &States[S_CSTAFFATK+2], 0, 50), - S_NORMAL2 (CSSF, 'J', 2, NULL , &States[S_CSTAFFATK+3], 0, 50), - S_NORMAL2 (CSSF, 'J', 2, NULL , &States[S_CSTAFFATK+4], 0, 45), - S_NORMAL2 (CSSF, 'A', 2, NULL , &States[S_CSTAFFATK+5], 0, 40), - S_NORMAL2 (CSSF, 'A', 2, NULL , &States[S_CSTAFFREADY+2], 0, 36), - -#define S_CSTAFFATK2 (S_CSTAFFATK+6) - S_NORMAL2 (CSSF, 'K', 10, NULL , &States[S_CSTAFFREADY+2], 0, 36), -}; - -IMPLEMENT_ACTOR (ACWeapStaff, Hexen, 10, 32) - PROP_Flags (MF_SPECIAL) - PROP_SpawnState (S_CSTAFF) - - PROP_Weapon_SelectionOrder (1600) - PROP_Weapon_AmmoUse1 (1) - PROP_Weapon_AmmoGive1 (25) - PROP_Weapon_UpState (S_CSTAFFUP) - PROP_Weapon_DownState (S_CSTAFFDOWN) - PROP_Weapon_ReadyState (S_CSTAFFREADY) - PROP_Weapon_AtkState (S_CSTAFFATK) - PROP_Weapon_Kickback (150) - PROP_Weapon_YAdjust (10) - PROP_Weapon_MoveCombatDist (25000000) - PROP_Weapon_AmmoType1 ("Mana1") - PROP_Weapon_ProjectileType ("CStaffMissile") - PROP_Inventory_PickupMessage("$TXT_WEAPON_C2") -END_DEFAULTS - // Serpent Staff Missile ---------------------------------------------------- class ACStaffMissile : public AActor { - DECLARE_ACTOR (ACStaffMissile, AActor) + DECLARE_CLASS (ACStaffMissile, AActor) public: int DoSpecialDamage (AActor *target, int damage); }; -FState ACStaffMissile::States[] = -{ -#define S_CSTAFF_MISSILE1 0 - S_BRIGHT (CSSF, 'D', 1, A_CStaffMissileSlither , &States[S_CSTAFF_MISSILE1+1]), - S_BRIGHT (CSSF, 'D', 1, A_CStaffMissileSlither , &States[S_CSTAFF_MISSILE1+2]), - S_BRIGHT (CSSF, 'E', 1, A_CStaffMissileSlither , &States[S_CSTAFF_MISSILE1+3]), - S_BRIGHT (CSSF, 'E', 1, A_CStaffMissileSlither , &States[S_CSTAFF_MISSILE1]), - -#define S_CSTAFF_MISSILE_X1 (S_CSTAFF_MISSILE1+4) - S_BRIGHT (CSSF, 'F', 4, NULL , &States[S_CSTAFF_MISSILE_X1+1]), - S_BRIGHT (CSSF, 'G', 4, NULL , &States[S_CSTAFF_MISSILE_X1+2]), - S_BRIGHT (CSSF, 'H', 3, NULL , &States[S_CSTAFF_MISSILE_X1+3]), - S_BRIGHT (CSSF, 'I', 3, NULL , NULL), -}; - -IMPLEMENT_ACTOR (ACStaffMissile, Hexen, -1, 0) - PROP_SpeedFixed (22) - PROP_RadiusFixed (12) - PROP_HeightFixed (10) - PROP_Damage (5) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE) - PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS) - PROP_RenderStyle (STYLE_Add) - - PROP_SpawnState (S_CSTAFF_MISSILE1) - PROP_DeathState (S_CSTAFF_MISSILE_X1) - - PROP_DeathSound ("ClericCStaffExplode") -END_DEFAULTS +IMPLEMENT_CLASS (ACStaffMissile) int ACStaffMissile::DoSpecialDamage (AActor *target, int damage) { @@ -146,33 +42,6 @@ int ACStaffMissile::DoSpecialDamage (AActor *target, int damage) return damage; } -// Serpent Staff Puff ------------------------------------------------------- - -class ACStaffPuff : public AActor -{ - DECLARE_ACTOR (ACStaffPuff, AActor) -}; - -FState ACStaffPuff::States[] = -{ - S_NORMAL (FHFX, 'S', 4, NULL , &States[1]), - S_NORMAL (FHFX, 'T', 4, NULL , &States[2]), - S_NORMAL (FHFX, 'U', 4, NULL , &States[3]), - S_NORMAL (FHFX, 'V', 4, NULL , &States[4]), - S_NORMAL (FHFX, 'W', 4, NULL , NULL), -}; - -IMPLEMENT_ACTOR (ACStaffPuff, Hexen, -1, 0) - PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY) - PROP_Flags3 (MF3_PUFFONACTORS) - PROP_RenderStyle (STYLE_Translucent) - PROP_Alpha (HX_SHADOW) - - PROP_SpawnState (0) - - PROP_SeeSound ("ClericCStaffHitThing") -END_DEFAULTS - //============================================================================ // // A_CStaffCheck @@ -204,7 +73,7 @@ void A_CStaffCheck (AActor *actor) slope = P_AimLineAttack (pmo, angle, fixed_t(1.5*MELEERANGE), &linetarget); if (linetarget) { - P_LineAttack (pmo, angle, fixed_t(1.5*MELEERANGE), slope, damage, NAME_Melee, RUNTIME_CLASS(ACStaffPuff)); + P_LineAttack (pmo, angle, fixed_t(1.5*MELEERANGE), slope, damage, NAME_Melee, PClass::FindClass ("CStaffPuff")); pmo->angle = R_PointToAngle2 (pmo->x, pmo->y, linetarget->x, linetarget->y); if ((linetarget->player || linetarget->flags3&MF3_ISMONSTER) @@ -216,7 +85,7 @@ void A_CStaffCheck (AActor *actor) { pmo->health = player->health = newLife; } - P_SetPsprite (player, ps_weapon, &ACWeapStaff::States[S_CSTAFFATK2]); + P_SetPsprite (player, ps_weapon, weapon->FindState ("Drain")); } if (weapon != NULL) { @@ -228,7 +97,7 @@ void A_CStaffCheck (AActor *actor) slope = P_AimLineAttack (player->mo, angle, fixed_t(1.5*MELEERANGE), &linetarget); if (linetarget) { - P_LineAttack (pmo, angle, fixed_t(1.5*MELEERANGE), slope, damage, NAME_Melee, RUNTIME_CLASS(ACStaffPuff)); + P_LineAttack (pmo, angle, fixed_t(1.5*MELEERANGE), slope, damage, NAME_Melee, PClass::FindClass ("CStaffPuff")); pmo->angle = R_PointToAngle2 (pmo->x, pmo->y, linetarget->x, linetarget->y); if (linetarget->player || linetarget->flags3&MF3_ISMONSTER) @@ -236,7 +105,7 @@ void A_CStaffCheck (AActor *actor) newLife = player->health+(damage>>4); newLife = newLife > 100 ? 100 : newLife; pmo->health = player->health = newLife; - P_SetPsprite (player, ps_weapon, &ACWeapStaff::States[S_CSTAFFATK2]); + P_SetPsprite (player, ps_weapon, weapon->FindState ("Drain")); } weapon->DepleteAmmo (weapon->bAltFire, false); break; @@ -323,7 +192,7 @@ void A_CStaffCheckBlink (AActor *actor) { if (!--actor->special1) { - P_SetPsprite (actor->player, ps_weapon, &ACWeapStaff::States[S_CSTAFFBLINK]); + P_SetPsprite (actor->player, ps_weapon, actor->FindState ("Blink")); actor->special1 = (pr_blink()+50)>>2; } else diff --git a/src/g_hexen/a_hexenglobal.h b/src/g_hexen/a_hexenglobal.h index a13c52f26..20f791c70 100644 --- a/src/g_hexen/a_hexenglobal.h +++ b/src/g_hexen/a_hexenglobal.h @@ -31,7 +31,7 @@ public: class AHolySpirit : public AActor { - DECLARE_ACTOR (AHolySpirit, AActor) + DECLARE_CLASS (AHolySpirit, AActor) public: bool Slam (AActor *thing); bool SpecialBlastHandling (AActor *source, fixed_t strength); diff --git a/src/g_shared/a_morph.cpp b/src/g_shared/a_morph.cpp index 9f910be7f..8650034e3 100644 --- a/src/g_shared/a_morph.cpp +++ b/src/g_shared/a_morph.cpp @@ -267,31 +267,34 @@ bool P_UndoPlayerMorph (player_t *activator, player_t *player, bool force) // taking events, reset up the face, if any; // this is only needed for old-skool skins // and for the original DOOM status bar. - if ((player == &players[consoleplayer]) && - (strcmp(pmo->GetClass()->Meta.GetMetaString (APMETA_Face), "None") != 0)) + if ((player == &players[consoleplayer])) { - // Assume root-level base skin to begin with - size_t skinindex = 0; - // If a custom skin was in use, then reload it - // or else the base skin for the player class. - if ((unsigned int)player->userinfo.skin >= PlayerClasses.Size () && - (size_t)player->userinfo.skin < numskins) + const char *face = pmo->GetClass()->Meta.GetMetaString (APMETA_Face); + if (face != NULL && strcmp(face, "None") != 0) { - skinindex = player->userinfo.skin; - } - else if (PlayerClasses.Size () > 1) - { - const PClass *whatami = player->mo->GetClass(); - for (unsigned int i = 0; i < PlayerClasses.Size (); ++i) + // Assume root-level base skin to begin with + size_t skinindex = 0; + // If a custom skin was in use, then reload it + // or else the base skin for the player class. + if ((unsigned int)player->userinfo.skin >= PlayerClasses.Size () && + (size_t)player->userinfo.skin < numskins) { - if (PlayerClasses[i].Type == whatami) + skinindex = player->userinfo.skin; + } + else if (PlayerClasses.Size () > 1) + { + const PClass *whatami = player->mo->GetClass(); + for (unsigned int i = 0; i < PlayerClasses.Size (); ++i) { - skinindex = i; - break; + if (PlayerClasses[i].Type == whatami) + { + skinindex = i; + break; + } } } + StatusBar->SetFace(&skins[skinindex]); } - StatusBar->SetFace(&skins[skinindex]); } angle = mo->angle >> ANGLETOFINESHIFT; diff --git a/tools/zipdir/zipdir.c b/tools/zipdir/zipdir.c index 17f4fddfb..6a2adf280 100644 --- a/tools/zipdir/zipdir.c +++ b/tools/zipdir/zipdir.c @@ -270,6 +270,13 @@ void recurse_dir(dir_tree_t *tree, const char *dirpath) { file_entry_t *entry; + if (strstr(fileinfo.name, ".orig")) + { + // .orig files are left behind by patch.exe and should never be + // added to zdoom.pk3 + continue; + } + entry = alloc_file_entry(dirpath, fileinfo.name, fileinfo.time_write); if (entry == NULL) { diff --git a/wadsrc/static/actors/hexen/clericholy.txt b/wadsrc/static/actors/hexen/clericholy.txt new file mode 100644 index 000000000..6b52b6455 --- /dev/null +++ b/wadsrc/static/actors/hexen/clericholy.txt @@ -0,0 +1,237 @@ + +// Cleric Weapon Piece ------------------------------------------------------ + +ACTOR ClericWeaponPiece : FourthWeaponPiece native +{ + Game Hexen + Inventory.PickupMessage "$TXT_WRAITHVERGE_PIECE" +} + +// Cleric Weapon Piece 1 ---------------------------------------------------- + +ACTOR CWeaponPiece1 : ClericWeaponPiece 18 native +{ + Game Hexen + SpawnID 33 + +FLOATBOB + States + { + Spawn: + WCH1 A -1 + Stop + } +} + +// Cleric Weapon Piece 2 ---------------------------------------------------- + +ACTOR CWeaponPiece2 : ClericWeaponPiece 19 native +{ + Game Hexen + SpawnID 34 + +FLOATBOB + States + { + Spawn: + WCH2 A -1 + Stop + } +} + +// Cleric Weapon Piece 3 ---------------------------------------------------- + +ACTOR CWeaponPiece3 : ClericWeaponPiece 20 native +{ + Game Hexen + SpawnID 35 + +FLOATBOB + States + { + Spawn: + WCH3 A -1 + Stop + } +} + +// Wraithverge Drop --------------------------------------------------------- + +ACTOR WraithvergeDrop +{ + action native A_DropWraithvergePieces(); + + States + { + Spawn: + TNT1 A 1 + TNT1 A 1 A_DropWraithvergePieces + Stop + } +} + +// Cleric's Wraithverge (Holy Symbol?) -------------------------------------- + +ACTOR CWeapWraithverge : ClericWeapon native +{ + Weapon.SelectionOrder 3000 + +WEAPON.PRIMARY_USES_BOTH + Weapon.AmmoUse1 18 + Weapon.AmmoUse2 18 + Weapon.AmmoGive1 0 + Weapon.AmmoGive2 0 + Weapon.KickBack 150 + Weapon.AmmoType1 "Mana1" + Weapon.AmmoType2 "Mana2" + Inventory.PickupMessage "$TXT_WEAPON_C4" + + action native A_CHolyAttack(); + action native A_CHolyPalette(); + + States + { + Spawn: + TNT1 A -1 + Stop + Ready: + CHLY A 1 A_WeaponReady + Loop + Select: + CHLY A 1 A_Raise + Loop + Deselect: + CHLY A 1 A_Lower + Loop + Fire: + CHLY AB 1 Bright Offset (0, 40) + CHLY CD 2 Bright Offset (0, 43) + CHLY E 2 Bright Offset (0, 45) + CHLY F 6 Bright Offset (0, 48) A_CHolyAttack + CHLY GG 2 Bright Offset (0, 40) A_CHolyPalette + CHLY G 2 Offset (0, 36) A_CHolyPalette + Goto Ready + } +} + +// Holy Missile ------------------------------------------------------------- + +ACTOR HolyMissile +{ + Speed 30 + Radius 15 + Height 8 + Damage 4 + Projectile + -ACTIVATEIMPACT -ACTIVATEPCROSS + +EXTREMEDEATH + + action native A_CHolyAttack2(); + + States + { + Spawn: + SPIR PPPP 3 Bright A_SpawnItemEx("HolyMissilePuff") + Death: + SPIR P 1 Bright A_CHolyAttack2 + Stop + } +} + +// Holy Missile Puff -------------------------------------------------------- + +ACTOR HolyMissilePuff +{ + Radius 4 + Height 8 + +NOBLOCKMAP +NOGRAVITY +DROPOFF + +NOTELEPORT + RenderStyle "Translucent" + Alpha 0.4 + States + { + Spawn: + SPIR QRSTU 3 + Stop + } +} + +// Holy Puff ---------------------------------------------------------------- + +ACTOR HolyPuff +{ + +NOBLOCKMAP +NOGRAVITY + RenderStyle Translucent + Alpha 0.6 + States + { + Spawn: + SPIR KLMNO 3 + Stop + } +} + +// Holy Spirit -------------------------------------------------------------- + +ACTOR HolySpirit native +{ + Health 105 + Speed 12 + Radius 10 + Height 6 + Damage 3 + Projectile + +RIPPER +SEEKERMISSILE + +FOILINVUL +SKYEXPLODE +NOEXPLODEFLOOR +CANBLAST + +EXTREMEDEATH + RenderStyle Translucent + Alpha 0.4 + DeathSound "SpiritDie" + + action native A_CHolySeek(); + action native A_CHolyCheckScream(); + + States + { + Spawn: + SPIR AAB 2 A_CHolySeek + SPIR B 2 A_CHolyCheckScream + Loop + Death: + SPIR D 4 + SPIR E 4 A_Scream + SPIR FGHI 4 + Stop + } +} + +// Holy Tail ---------------------------------------------------------------- + +ACTOR HolyTail +{ + Radius 1 + Height 1 + +NOBLOCKMAP +NOGRAVITY +DROPOFF +NOCLIP + +NOTELEPORT + RenderStyle Translucent + Alpha 0.6 + + action native A_CHolyTail(); + + States + { + Spawn: + SPIR C 1 A_CHolyTail + Loop + TailTrail: + SPIR D -1 + Stop + } +} + +// Holy Tail Trail --------------------------------------------------------- + +ACTOR HolyTailTrail : HolyTail +{ + States + { + Spawn: + Goto TailTrail + } +} diff --git a/wadsrc/static/actors/hexen/clericstaff.txt b/wadsrc/static/actors/hexen/clericstaff.txt new file mode 100644 index 000000000..3b9cd1699 --- /dev/null +++ b/wadsrc/static/actors/hexen/clericstaff.txt @@ -0,0 +1,95 @@ + +// The Cleric's Serpent Staff ----------------------------------------------- + +ACTOR CWeapStaff : ClericWeapon 10 +{ + Game Hexen + SpawnID 32 + Weapon.SelectionOrder 1600 + Weapon.AmmoUse1 1 + Weapon.AmmoGive1 25 + Weapon.KickBack 150 + Weapon.YAdjust 10 + Weapon.AmmoType1 "Mana1" + Inventory.PickupMessage "$TXT_WEAPON_C2" + + action native A_CStaffInitBlink(); + action native A_CStaffCheckBlink(); + action native A_CStaffCheck(); + action native A_CStaffAttack(); + + States + { + Spawn: + WCSS A -1 + Stop + Select: + CSSF C 1 A_Raise + Loop + Deselect: + CSSF B 3 + CSSF C 4 + CSSF C 1 A_Lower + Wait + Ready: + CSSF C 4 + CSSF B 3 A_CStaffInitBlink + CSSF AAAAAAA 1 A_WeaponReady + CSSF A 1 A_CStaffCheckBlink + Goto Ready + 2 + Fire: + CSSF A 1 Offset (0, 45) A_CStaffCheck + CSSF J 1 Offset (0, 50) A_CStaffAttack + CSSF J 2 Offset (0, 50) + CSSF J 2 Offset (0, 45) + CSSF A 2 Offset (0, 40) + CSSF A 2 Offset (0, 36) + Goto Ready + 2 + Blink: + CSSF BBBCCCCCBBB 1 A_WeaponReady + Goto Ready + 2 + Drain: + CSSF K 10 Offset (0, 36) + Goto Ready + 2 + } +} + +// Serpent Staff Missile ---------------------------------------------------- + +ACTOR CStaffMissile native +{ + Speed 22 + Radius 12 + Height 10 + Damage 5 + RenderStyle Add + Projectile + DeathSound "ClericCStaffExplode" + States + { + Spawn: + CSSF DDEE 1 Bright A_CStaffMissileSlither + Loop + Death: + CSSF FG 4 Bright + CSSF HI 3 Bright + Stop + } +} + +// Serpent Staff Puff ------------------------------------------------------- + +ACTOR CStaffPuff +{ + +NOBLOCKMAP +NOGRAVITY + +PUFFONACTORS + RenderStyle Translucent + Alpha 0.6 + SeeSound "ClericCStaffHitThing" + States + { + Spawn: + FHFX STUVW 4 + Stop + } +} diff --git a/wadsrc/static/decorate.txt b/wadsrc/static/decorate.txt index b32a3b238..597aa50f4 100644 --- a/wadsrc/static/decorate.txt +++ b/wadsrc/static/decorate.txt @@ -94,6 +94,8 @@ #include "actors/hexen/blastradius.txt" #include "actors/hexen/boostarmor.txt" #include "actors/hexen/clericflame.txt" +#include "actors/hexen/clericholy.txt" +#include "actors/hexen/clericstaff.txt" #include "actors/strife/strifeplayer.txt" #include "actors/strife/beggars.txt"