From faf1e43abf11a2927e53f6fe894cdf0d5905d439 Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Tue, 18 Nov 2025 20:51:17 +1100 Subject: [PATCH] refactor: Rename RETAIL_COMPATIBLE_BUG macro to PRESERVE_RETAIL_BEHAVIOR --- Core/GameEngine/Include/Common/GameDefines.h | 4 ++-- Generals/Code/GameEngine/Include/Common/TunnelTracker.h | 2 +- Generals/Code/GameEngine/Source/Common/RTS/Player.cpp | 2 +- Generals/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp | 4 ++-- Generals/Code/GameEngine/Source/GameClient/SelectionInfo.cpp | 2 +- .../GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp | 2 +- .../Source/GameLogic/Object/Contain/TunnelContain.cpp | 2 +- .../GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp | 2 +- .../Source/GameLogic/Object/Update/SpecialAbilityUpdate.cpp | 2 +- GeneralsMD/Code/GameEngine/Include/Common/TunnelTracker.h | 2 +- GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp | 2 +- .../Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp | 4 ++-- .../Code/GameEngine/Source/GameClient/SelectionInfo.cpp | 4 ++-- .../GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp | 2 +- .../Source/GameLogic/Object/Contain/TunnelContain.cpp | 2 +- .../GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp | 2 +- .../Source/GameLogic/Object/Update/SpecialAbilityUpdate.cpp | 2 +- .../Source/GameLogic/Object/Update/StealthUpdate.cpp | 2 +- 18 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Core/GameEngine/Include/Common/GameDefines.h b/Core/GameEngine/Include/Common/GameDefines.h index 4d11397296..667ea8aa9f 100644 --- a/Core/GameEngine/Include/Common/GameDefines.h +++ b/Core/GameEngine/Include/Common/GameDefines.h @@ -23,8 +23,8 @@ // Note: Retail compatibility must not be broken before this project officially does. // Use RETAIL_COMPATIBLE_CRC and RETAIL_COMPATIBLE_XFER_SAVE to guard breaking changes. -#ifndef RETAIL_COMPATIBLE_BUG -#define RETAIL_COMPATIBLE_BUG (1) // Retain bugs present in retail Generals 1.08 and Zero Hour 1.04 +#ifndef PRESERVE_RETAIL_BEHAVIOR +#define PRESERVE_RETAIL_BEHAVIOR (1) // Retain behavior present in retail Generals 1.08 and Zero Hour 1.04 #endif #ifndef RETAIL_COMPATIBLE_CRC diff --git a/Generals/Code/GameEngine/Include/Common/TunnelTracker.h b/Generals/Code/GameEngine/Include/Common/TunnelTracker.h index 60806062d2..eddc5b3c10 100644 --- a/Generals/Code/GameEngine/Include/Common/TunnelTracker.h +++ b/Generals/Code/GameEngine/Include/Common/TunnelTracker.h @@ -59,7 +59,7 @@ class TunnelTracker : public MemoryPoolObject, static void destroyObject( Object *obj, void *userData ); ///< Callback for Iterate Contained system static void healObject( Object *obj, void *frames ); ///< Callback for Iterate Contained system -#if RETAIL_COMPATIBLE_BUG || RETAIL_COMPATIBLE_CRC +#if PRESERVE_RETAIL_BEHAVIOR || RETAIL_COMPATIBLE_CRC void healObjects(Real frames); ///< heal all objects within the tunnel #else void healObjects(); ///< heal all objects within the tunnel diff --git a/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp b/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp index 691788c0c6..4803ccc2fd 100644 --- a/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp +++ b/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp @@ -677,7 +677,7 @@ void Player::update() } } -#if !RETAIL_COMPATIBLE_BUG && !RETAIL_COMPATIBLE_CRC +#if !PRESERVE_RETAIL_BEHAVIOR && !RETAIL_COMPATIBLE_CRC // TheSuperHackers @bugfix Stubbjax 26/09/2025 The Tunnel System now heals // all units once per frame instead of once per frame per Tunnel Network. TunnelTracker* tunnelSystem = getTunnelSystem(); diff --git a/Generals/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp b/Generals/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp index 9f35758567..cac0a999b1 100644 --- a/Generals/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp +++ b/Generals/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp @@ -256,7 +256,7 @@ void TunnelTracker::destroyObject( Object *obj, void * ) // ------------------------------------------------------------------------ // heal all the objects within the tunnel system using the iterateContained function -#if RETAIL_COMPATIBLE_BUG || RETAIL_COMPATIBLE_CRC +#if PRESERVE_RETAIL_BEHAVIOR || RETAIL_COMPATIBLE_CRC void TunnelTracker::healObjects(Real frames) { iterateContained(healObject, &frames, FALSE); @@ -280,7 +280,7 @@ void TunnelTracker::healObject( Object *obj, void *frames) { //get the number of frames to heal -#if RETAIL_COMPATIBLE_BUG || RETAIL_COMPATIBLE_CRC +#if PRESERVE_RETAIL_BEHAVIOR || RETAIL_COMPATIBLE_CRC Real *framesForFullHeal = (Real*)frames; #else UnsignedInt* framesForFullHeal = (UnsignedInt*)frames; diff --git a/Generals/Code/GameEngine/Source/GameClient/SelectionInfo.cpp b/Generals/Code/GameEngine/Source/GameClient/SelectionInfo.cpp index e6d8e35d79..203c37c22c 100644 --- a/Generals/Code/GameEngine/Source/GameClient/SelectionInfo.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/SelectionInfo.cpp @@ -347,7 +347,7 @@ Bool addDrawableToList( Drawable *draw, void *userData ) if (!pds->drawableListToFill) return FALSE; -#if !RTS_GENERALS || !RETAIL_COMPATIBLE_BUG +#if !RTS_GENERALS || !PRESERVE_RETAIL_BEHAVIOR // TheSuperHackers @info // In retail, drag-selecting allows the player to select stealthed objects and objects through the // fog. Some players exploit this bug to determine where an opponent's units are and consider this diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp index 64d37a7d18..f96f8c8d33 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp @@ -593,7 +593,7 @@ void ActiveBody::attemptHealing( DamageInfo *damageInfo ) //(object pointer loses scope as soon as atteptdamage's caller ends) m_lastDamageInfo = *damageInfo; m_lastDamageCleared = false; -#if RETAIL_COMPATIBLE_BUG +#if PRESERVE_RETAIL_BEHAVIOR m_lastDamageTimestamp = TheGameLogic->getFrame(); #endif m_lastHealingTimestamp = TheGameLogic->getFrame(); diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp index 9dd8170b79..2fc9fb89aa 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp @@ -403,7 +403,7 @@ UpdateSleepTime TunnelContain::update( void ) if (controllingPlayer) { TunnelTracker *tunnelSystem = controllingPlayer->getTunnelSystem(); -#if RETAIL_COMPATIBLE_BUG || RETAIL_COMPATIBLE_CRC +#if PRESERVE_RETAIL_BEHAVIOR || RETAIL_COMPATIBLE_CRC if (tunnelSystem) { const TunnelContainModuleData* modData = getTunnelContainModuleData(); diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp index 2afdf0e21a..f935cc2685 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp @@ -1333,7 +1333,7 @@ class GenericObjectCreationNugget : public ObjectCreationNugget } } -#if !RETAIL_COMPATIBLE_CRC && !RETAIL_COMPATIBLE_BUG +#if !RETAIL_COMPATIBLE_CRC && !PRESERVE_RETAIL_BEHAVIOR ObjectID sinkID = sourceObj->getExperienceTracker()->getExperienceSink(); firstObject->getExperienceTracker()->setExperienceSink(sinkID != INVALID_ID ? sinkID : sourceObj->getID()); #endif diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/SpecialAbilityUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/SpecialAbilityUpdate.cpp index 39d4be44ea..2441c9081e 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/SpecialAbilityUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/SpecialAbilityUpdate.cpp @@ -1341,7 +1341,7 @@ void SpecialAbilityUpdate::triggerAbilityEffect() if( targetMoney && objectMoney ) { UnsignedInt cash = targetMoney->countMoney(); -#if RETAIL_COMPATIBLE_CRC || RETAIL_COMPATIBLE_BUG +#if RETAIL_COMPATIBLE_CRC || PRESERVE_RETAIL_BEHAVIOR UnsignedInt desiredAmount = 1000; #else UnsignedInt desiredAmount = data->m_effectValue; diff --git a/GeneralsMD/Code/GameEngine/Include/Common/TunnelTracker.h b/GeneralsMD/Code/GameEngine/Include/Common/TunnelTracker.h index 35209d8e9a..e1e4236531 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/TunnelTracker.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/TunnelTracker.h @@ -59,7 +59,7 @@ class TunnelTracker : public MemoryPoolObject, static void destroyObject( Object *obj, void *userData ); ///< Callback for Iterate Contained system static void healObject( Object *obj, void *frames ); ///< Callback for Iterate Contained system -#if RETAIL_COMPATIBLE_BUG || RETAIL_COMPATIBLE_CRC +#if PRESERVE_RETAIL_BEHAVIOR || RETAIL_COMPATIBLE_CRC void healObjects(Real frames); ///< heal all objects within the tunnel #else void healObjects(); ///< heal all objects within the tunnel diff --git a/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp b/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp index dfe4d9eba9..79f8392c89 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp @@ -717,7 +717,7 @@ void Player::update() } } -#if !RETAIL_COMPATIBLE_BUG && !RETAIL_COMPATIBLE_CRC +#if !PRESERVE_RETAIL_BEHAVIOR && !RETAIL_COMPATIBLE_CRC // TheSuperHackers @bugfix Stubbjax 26/09/2025 The Tunnel System now heals // all units once per frame instead of once per frame per Tunnel Network. TunnelTracker* tunnelSystem = getTunnelSystem(); diff --git a/GeneralsMD/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp b/GeneralsMD/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp index 1bee2cf90d..55bc3f6671 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp @@ -257,7 +257,7 @@ void TunnelTracker::destroyObject( Object *obj, void * ) // ------------------------------------------------------------------------ // heal all the objects within the tunnel system using the iterateContained function -#if RETAIL_COMPATIBLE_BUG || RETAIL_COMPATIBLE_CRC +#if PRESERVE_RETAIL_BEHAVIOR || RETAIL_COMPATIBLE_CRC void TunnelTracker::healObjects(Real frames) { iterateContained(healObject, &frames, FALSE); @@ -281,7 +281,7 @@ void TunnelTracker::healObject( Object *obj, void *frames) { //get the number of frames to heal -#if RETAIL_COMPATIBLE_BUG || RETAIL_COMPATIBLE_CRC +#if PRESERVE_RETAIL_BEHAVIOR || RETAIL_COMPATIBLE_CRC Real *framesForFullHeal = (Real*)frames; #else UnsignedInt* framesForFullHeal = (UnsignedInt*)frames; diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/SelectionInfo.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/SelectionInfo.cpp index 5eb28a3cab..e2f1a26cee 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/SelectionInfo.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/SelectionInfo.cpp @@ -345,7 +345,7 @@ Bool addDrawableToList( Drawable *draw, void *userData ) if (!pds->drawableListToFill) return FALSE; -#if !RTS_GENERALS || !RETAIL_COMPATIBLE_BUG +#if !RTS_GENERALS || !PRESERVE_RETAIL_BEHAVIOR if (draw->getFullyObscuredByShroud()) return FALSE; @@ -372,7 +372,7 @@ Bool addDrawableToList( Drawable *draw, void *userData ) return FALSE; } -#if !RTS_GENERALS && RETAIL_COMPATIBLE_BUG +#if !RTS_GENERALS && PRESERVE_RETAIL_BEHAVIOR // TheSuperHackers @info // In retail, hidden objects such as passengers are included here when drag-selected, which causes // enemy selection logic to exit early (only 1 enemy unit can be selected at a time). Some players diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp index 3a700619c6..8800ed713c 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp @@ -842,7 +842,7 @@ void ActiveBody::attemptHealing( DamageInfo *damageInfo ) //(object pointer loses scope as soon as atteptdamage's caller ends) m_lastDamageInfo = *damageInfo; m_lastDamageCleared = false; -#if RETAIL_COMPATIBLE_BUG +#if PRESERVE_RETAIL_BEHAVIOR m_lastDamageTimestamp = TheGameLogic->getFrame(); #endif m_lastHealingTimestamp = TheGameLogic->getFrame(); diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp index 8b3da4760d..1f998a53ff 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp @@ -539,7 +539,7 @@ UpdateSleepTime TunnelContain::update( void ) if (controllingPlayer) { TunnelTracker *tunnelSystem = controllingPlayer->getTunnelSystem(); -#if RETAIL_COMPATIBLE_BUG || RETAIL_COMPATIBLE_CRC +#if PRESERVE_RETAIL_BEHAVIOR || RETAIL_COMPATIBLE_CRC if (tunnelSystem) { const TunnelContainModuleData* modData = getTunnelContainModuleData(); diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp index ff6c741778..3e6d515983 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp @@ -1421,7 +1421,7 @@ class GenericObjectCreationNugget : public ObjectCreationNugget } } -#if !RETAIL_COMPATIBLE_CRC && !RETAIL_COMPATIBLE_BUG +#if !RETAIL_COMPATIBLE_CRC && !PRESERVE_RETAIL_BEHAVIOR ObjectID sinkID = sourceObj->getExperienceTracker()->getExperienceSink(); firstObject->getExperienceTracker()->setExperienceSink(sinkID != INVALID_ID ? sinkID : sourceObj->getID()); #endif diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/SpecialAbilityUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/SpecialAbilityUpdate.cpp index d0e5403716..a1aaab160b 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/SpecialAbilityUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/SpecialAbilityUpdate.cpp @@ -1487,7 +1487,7 @@ void SpecialAbilityUpdate::triggerAbilityEffect() if( targetMoney && objectMoney ) { UnsignedInt cash = targetMoney->countMoney(); -#if RETAIL_COMPATIBLE_CRC || RETAIL_COMPATIBLE_BUG +#if RETAIL_COMPATIBLE_CRC || PRESERVE_RETAIL_BEHAVIOR UnsignedInt desiredAmount = 1000; #else UnsignedInt desiredAmount = data->m_effectValue; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StealthUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StealthUpdate.cpp index 1f3af121ea..5c20cbfadc 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StealthUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StealthUpdate.cpp @@ -318,7 +318,7 @@ Bool StealthUpdate::allowedToStealth( Object *stealthOwner ) const if( flags & STEALTH_NOT_WHILE_TAKING_DAMAGE && self->getBodyModule()->getLastDamageTimestamp() >= now - 1 ) { -#if RETAIL_COMPATIBLE_BUG +#if PRESERVE_RETAIL_BEHAVIOR //Only if it's not healing damage. if( self->getBodyModule()->getLastDamageInfo()->in.m_damageType != DAMAGE_HEALING ) #endif