From bd159e226c23ea55027a2ff9b80c04d97ebef5bc Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Tue, 19 May 2026 15:15:50 +0200 Subject: [PATCH 1/3] Fixed retail behavior macros. --- .../Code/GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp | 2 +- .../GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp | 2 +- .../GameEngine/Source/GameLogic/Object/Update/StealthUpdate.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp index 550d5bba1e1..21ce7bd81ae 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 PRESERVE_STRUCTURE_STEALTH_DURING_REPAIR +#if RETAIL_COMPATIBLE_CRC || PRESERVE_STRUCTURE_STEALTH_DURING_REPAIR m_lastDamageTimestamp = TheGameLogic->getFrame(); #endif m_lastHealingTimestamp = TheGameLogic->getFrame(); diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp index 01decec3f0a..e9ae3d22976 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp @@ -53,7 +53,7 @@ CrateCollideModuleData::CrateCollideModuleData() m_executeAnimationFades = TRUE; m_isBuildingPickup = FALSE; m_isHumanOnlyPickup = FALSE; - m_allowMultiPickup = (PRESERVE_MULTI_CRATE_PICKUP != 0); + m_allowMultiPickup = (RETAIL_COMPATIBLE_CRC != 0 || PRESERVE_MULTI_CRATE_PICKUP != 0); m_executeFX = nullptr; m_pickupScience = SCIENCE_INVALID; m_executionAnimationTemplate = AsciiString::TheEmptyString; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StealthUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StealthUpdate.cpp index d5322eea49f..f893bccec3d 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StealthUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StealthUpdate.cpp @@ -312,7 +312,7 @@ Bool StealthUpdate::allowedToStealth( Object *stealthOwner ) const if( flags & STEALTH_NOT_WHILE_TAKING_DAMAGE && self->getBodyModule()->getLastDamageTimestamp() >= now - 1 ) { -#if PRESERVE_STRUCTURE_STEALTH_DURING_REPAIR +#if RETAIL_COMPATIBLE_CRC || PRESERVE_STRUCTURE_STEALTH_DURING_REPAIR //Only if it's not healing damage. if( self->getBodyModule()->getLastDamageInfo()->in.m_damageType != DAMAGE_HEALING ) #endif From 9ec6877cf2926ef2f0206fcb8c6849f8bf1a27c1 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Tue, 19 May 2026 15:17:53 +0200 Subject: [PATCH 2/3] Changed macro order & macro expressions. --- 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 ++-- .../Source/GameLogic/Object/Behavior/PoisonedBehavior.cpp | 2 +- .../Source/GameLogic/Object/Contain/TunnelContain.cpp | 2 +- .../GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/Common/TunnelTracker.h b/GeneralsMD/Code/GameEngine/Include/Common/TunnelTracker.h index b1e3f5bf492..b044ebc00cd 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/TunnelTracker.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/TunnelTracker.h @@ -60,7 +60,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 PRESERVE_TUNNEL_HEAL_STACKING || RETAIL_COMPATIBLE_CRC +#if RETAIL_COMPATIBLE_CRC || PRESERVE_TUNNEL_HEAL_STACKING 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 a9a53e3a006..cfa31bcc99c 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp @@ -716,7 +716,7 @@ void Player::update() } } -#if !PRESERVE_TUNNEL_HEAL_STACKING && !RETAIL_COMPATIBLE_CRC +#if !(RETAIL_COMPATIBLE_CRC || PRESERVE_TUNNEL_HEAL_STACKING) // 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 5e1de31615e..114c70088f3 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp @@ -278,7 +278,7 @@ void TunnelTracker::destroyObject( Object *obj, void * ) // ------------------------------------------------------------------------ // heal all the objects within the tunnel system using the iterateContained function -#if PRESERVE_TUNNEL_HEAL_STACKING || RETAIL_COMPATIBLE_CRC +#if RETAIL_COMPATIBLE_CRC || PRESERVE_TUNNEL_HEAL_STACKING void TunnelTracker::healObjects(Real frames) { iterateContained(healObject, &frames, FALSE); @@ -302,7 +302,7 @@ void TunnelTracker::healObject( Object *obj, void *frames) { //get the number of frames to heal -#if PRESERVE_TUNNEL_HEAL_STACKING || RETAIL_COMPATIBLE_CRC +#if RETAIL_COMPATIBLE_CRC || PRESERVE_TUNNEL_HEAL_STACKING Real *framesForFullHeal = (Real*)frames; #else UnsignedInt* framesForFullHeal = (UnsignedInt*)frames; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/PoisonedBehavior.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/PoisonedBehavior.cpp index c593952333a..1cadfe55df4 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/PoisonedBehavior.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/PoisonedBehavior.cpp @@ -159,7 +159,7 @@ void PoisonedBehavior::startPoisonedEffects( const DamageInfo *damageInfo ) // We are going to take the damage dealt by the original poisoner every so often for a while. m_poisonDamageAmount = damageInfo->out.m_actualDamageDealt; -#if !RETAIL_COMPATIBLE_CRC && !PRESERVE_NO_XP_FROM_POISON_KILLS +#if !(RETAIL_COMPATIBLE_CRC || PRESERVE_NO_XP_FROM_POISON_KILLS) // TheSuperHackers @bugfix Stubbjax 03/09/2025 Allow poison damage to award xp to the poison source. m_poisonSource = damageInfo->in.m_sourceID; #endif diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp index aa6a5f1aa5d..b8b3115beea 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp @@ -549,7 +549,7 @@ UpdateSleepTime TunnelContain::update() if (controllingPlayer) { TunnelTracker *tunnelSystem = controllingPlayer->getTunnelSystem(); -#if PRESERVE_TUNNEL_HEAL_STACKING || RETAIL_COMPATIBLE_CRC +#if RETAIL_COMPATIBLE_CRC || PRESERVE_TUNNEL_HEAL_STACKING 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 892c1f120ab..b77ede9b68e 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp @@ -1428,7 +1428,7 @@ class GenericObjectCreationNugget : public ObjectCreationNugget } } -#if !RETAIL_COMPATIBLE_CRC && !PRESERVE_NO_XP_FROM_OCL_KILLS +#if !(RETAIL_COMPATIBLE_CRC || PRESERVE_NO_XP_FROM_OCL_KILLS) ObjectID sinkID = sourceObj->getExperienceTracker()->getExperienceSink(); firstObject->getExperienceTracker()->setExperienceSink(sinkID != INVALID_ID ? sinkID : sourceObj->getID()); #endif From d8faf320d56f180825c678de0a1c40923d8da207 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Tue, 19 May 2026 20:50:20 +0200 Subject: [PATCH 3/3] Replicated in Generals. --- 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 ++-- .../Source/GameLogic/Object/Behavior/PoisonedBehavior.cpp | 2 +- .../GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp | 2 +- .../GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp | 2 +- .../Source/GameLogic/Object/Contain/TunnelContain.cpp | 2 +- .../GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Generals/Code/GameEngine/Include/Common/TunnelTracker.h b/Generals/Code/GameEngine/Include/Common/TunnelTracker.h index b8d19cb7197..0762faee90c 100644 --- a/Generals/Code/GameEngine/Include/Common/TunnelTracker.h +++ b/Generals/Code/GameEngine/Include/Common/TunnelTracker.h @@ -60,7 +60,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 PRESERVE_TUNNEL_HEAL_STACKING || RETAIL_COMPATIBLE_CRC +#if RETAIL_COMPATIBLE_CRC || PRESERVE_TUNNEL_HEAL_STACKING 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 7bc48908c7a..590e7eebca3 100644 --- a/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp +++ b/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp @@ -678,7 +678,7 @@ void Player::update() } } -#if !PRESERVE_TUNNEL_HEAL_STACKING && !RETAIL_COMPATIBLE_CRC +#if !(RETAIL_COMPATIBLE_CRC || PRESERVE_TUNNEL_HEAL_STACKING) // 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 385d1bf20c7..91fc49b7f13 100644 --- a/Generals/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp +++ b/Generals/Code/GameEngine/Source/Common/RTS/TunnelTracker.cpp @@ -277,7 +277,7 @@ void TunnelTracker::destroyObject( Object *obj, void * ) // ------------------------------------------------------------------------ // heal all the objects within the tunnel system using the iterateContained function -#if PRESERVE_TUNNEL_HEAL_STACKING || RETAIL_COMPATIBLE_CRC +#if RETAIL_COMPATIBLE_CRC || PRESERVE_TUNNEL_HEAL_STACKING void TunnelTracker::healObjects(Real frames) { iterateContained(healObject, &frames, FALSE); @@ -301,7 +301,7 @@ void TunnelTracker::healObject( Object *obj, void *frames) { //get the number of frames to heal -#if PRESERVE_TUNNEL_HEAL_STACKING || RETAIL_COMPATIBLE_CRC +#if RETAIL_COMPATIBLE_CRC || PRESERVE_TUNNEL_HEAL_STACKING Real *framesForFullHeal = (Real*)frames; #else UnsignedInt* framesForFullHeal = (UnsignedInt*)frames; diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/PoisonedBehavior.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/PoisonedBehavior.cpp index a11b49f5792..5483e20dd84 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/PoisonedBehavior.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/PoisonedBehavior.cpp @@ -158,7 +158,7 @@ void PoisonedBehavior::startPoisonedEffects( const DamageInfo *damageInfo ) // We are going to take the damage dealt by the original poisoner every so often for a while. m_poisonDamageAmount = damageInfo->out.m_actualDamageDealt; -#if !RETAIL_COMPATIBLE_CRC && !PRESERVE_NO_XP_FROM_POISON_KILLS +#if !(RETAIL_COMPATIBLE_CRC || PRESERVE_NO_XP_FROM_POISON_KILLS) // TheSuperHackers @bugfix Stubbjax 03/09/2025 Allow poison damage to award xp to the poison source. m_poisonSource = damageInfo->in.m_sourceID; #endif diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Body/ActiveBody.cpp index ed8e846cfe1..bea29c00a96 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 PRESERVE_STRUCTURE_STEALTH_DURING_REPAIR +#if RETAIL_COMPATIBLE_CRC || PRESERVE_STRUCTURE_STEALTH_DURING_REPAIR m_lastDamageTimestamp = TheGameLogic->getFrame(); #endif m_lastHealingTimestamp = TheGameLogic->getFrame(); diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp index 0856934e280..fbf487ec78d 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp @@ -50,7 +50,7 @@ CrateCollideModuleData::CrateCollideModuleData() m_executeAnimationFades = TRUE; m_isBuildingPickup = FALSE; m_isHumanOnlyPickup = FALSE; - m_allowMultiPickup = (PRESERVE_MULTI_CRATE_PICKUP != 0); + m_allowMultiPickup = (RETAIL_COMPATIBLE_CRC != 0 || PRESERVE_MULTI_CRATE_PICKUP != 0); m_executeFX = nullptr; m_pickupScience = SCIENCE_INVALID; m_executionAnimationTemplate = AsciiString::TheEmptyString; diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp index 82ac87c314a..ed9c1983da5 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Contain/TunnelContain.cpp @@ -437,7 +437,7 @@ UpdateSleepTime TunnelContain::update() if (controllingPlayer) { TunnelTracker *tunnelSystem = controllingPlayer->getTunnelSystem(); -#if PRESERVE_TUNNEL_HEAL_STACKING || RETAIL_COMPATIBLE_CRC +#if RETAIL_COMPATIBLE_CRC || PRESERVE_TUNNEL_HEAL_STACKING 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 0e802efaadb..003c55fde46 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/ObjectCreationList.cpp @@ -1340,7 +1340,7 @@ class GenericObjectCreationNugget : public ObjectCreationNugget } } -#if !RETAIL_COMPATIBLE_CRC && !PRESERVE_NO_XP_FROM_OCL_KILLS +#if !(RETAIL_COMPATIBLE_CRC || PRESERVE_NO_XP_FROM_OCL_KILLS) ObjectID sinkID = sourceObj->getExperienceTracker()->getExperienceSink(); firstObject->getExperienceTracker()->setExperienceSink(sinkID != INVALID_ID ? sinkID : sourceObj->getID()); #endif