From 795dcd8fa98948908059009992a216d6f8c92706 Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Thu, 19 Mar 2026 19:48:17 +0100 Subject: [PATCH 1/2] refactor(bitflags): Simplify conditions with testForAny, testForAll and remove unexpected assert in BitFlags::testForAll --- GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h | 2 -- .../GameEngine/Source/GameLogic/Object/Die/DieModule.cpp | 5 ++--- .../Source/GameLogic/Object/Update/StealthUpdate.cpp | 3 +-- .../Source/GameLogic/Object/Upgrade/UpgradeModule.cpp | 2 +- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h b/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h index 2fb3ef744d7..59aef62235b 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/BitFlags.h @@ -155,8 +155,6 @@ class BitFlags //All argument bits must be set in our bits too in order to return TRUE Bool testForAll( const BitFlags& that ) const { - DEBUG_ASSERTCRASH( that.any(), ("BitFlags::testForAll is always true if you ask about zero flags. Did you mean that?") ); - BitFlags tmp = *this; tmp.m_bits.flip(); tmp.m_bits &= that.m_bits; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Die/DieModule.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Die/DieModule.cpp index 6ce8204a2ba..b7a8824b7e5 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Die/DieModule.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Die/DieModule.cpp @@ -74,12 +74,11 @@ Bool DieMuxData::isDieApplicable(const Object* obj, const DamageInfo *damageInfo return false; // all 'exempt' bits must be clear for us to run. - if( m_exemptStatus.any() && obj->getStatusBits().testForAny( m_exemptStatus ) ) + if( !obj->getStatusBits().testForNone( m_exemptStatus ) ) return false; // all 'required' bits must be set for us to run. - // But only if we have a required status to check - if( m_requiredStatus.any() && !obj->getStatusBits().testForAll( m_requiredStatus ) ) + if( !obj->getStatusBits().testForAll( m_requiredStatus ) ) return false; return true; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StealthUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StealthUpdate.cpp index a762850554c..4a2f3625093 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StealthUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/StealthUpdate.cpp @@ -327,8 +327,7 @@ Bool StealthUpdate::allowedToStealth( Object *stealthOwner ) const } //We need all required status or else we fail - // If we have any requirements - if( data->m_requiredStatus.any() && !self->getStatusBits().testForAll( data->m_requiredStatus ) ) + if( !self->getStatusBits().testForAll( data->m_requiredStatus ) ) return FALSE; //If we have any forbidden statii, then fail diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Upgrade/UpgradeModule.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Upgrade/UpgradeModule.cpp index 9bf8fdca53e..6fff83ed96f 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Upgrade/UpgradeModule.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Upgrade/UpgradeModule.cpp @@ -172,7 +172,7 @@ Bool UpgradeMux::testUpgradeConditions( const UpgradeMaskType& keyMask ) const getUpgradeActivationMasks(activation, conflicting); //Okay, make sure we don't have any conflicting upgrades - if( !keyMask.any() || !keyMask.testForAny( conflicting ) ) + if( keyMask.testForNone( conflicting ) ) { //Make sure we have activation conditions if( activation.any() ) From b971452b08791912c2a5cc5f0fc2026cd573419f Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Sat, 21 Mar 2026 18:18:58 +0100 Subject: [PATCH 2/2] Replicate in Generals --- Generals/Code/GameEngine/Include/Common/BitFlags.h | 2 -- .../GameEngine/Source/GameLogic/Object/Die/DieModule.cpp | 5 ++--- .../Source/GameLogic/Object/Upgrade/UpgradeModule.cpp | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Generals/Code/GameEngine/Include/Common/BitFlags.h b/Generals/Code/GameEngine/Include/Common/BitFlags.h index 5c572210109..47242c0d7ca 100644 --- a/Generals/Code/GameEngine/Include/Common/BitFlags.h +++ b/Generals/Code/GameEngine/Include/Common/BitFlags.h @@ -155,8 +155,6 @@ class BitFlags //All argument bits must be set in our bits too in order to return TRUE Bool testForAll( const BitFlags& that ) const { - DEBUG_ASSERTCRASH( that.any(), ("BitFlags::testForAll is always true if you ask about zero flags. Did you mean that?") ); - BitFlags tmp = *this; tmp.m_bits.flip(); tmp.m_bits &= that.m_bits; diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Die/DieModule.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Die/DieModule.cpp index fe2fb77f9d5..f268fe33d03 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Die/DieModule.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Die/DieModule.cpp @@ -74,12 +74,11 @@ Bool DieMuxData::isDieApplicable(const Object* obj, const DamageInfo *damageInfo return false; // all 'exempt' bits must be clear for us to run. - if( m_exemptStatus.any() && obj->getStatusBits().testForAny( m_exemptStatus ) ) + if( !obj->getStatusBits().testForNone( m_exemptStatus ) ) return false; // all 'required' bits must be set for us to run. - // But only if we have a required status to check - if( m_requiredStatus.any() && !obj->getStatusBits().testForAll( m_requiredStatus ) ) + if( !obj->getStatusBits().testForAll( m_requiredStatus ) ) return false; return true; diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Upgrade/UpgradeModule.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Upgrade/UpgradeModule.cpp index 802ad2d1f22..08d393fd054 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Upgrade/UpgradeModule.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Upgrade/UpgradeModule.cpp @@ -162,7 +162,7 @@ Bool UpgradeMux::testUpgradeConditions( const UpgradeMaskType& keyMask ) const getUpgradeActivationMasks(activation, conflicting); //Okay, make sure we don't have any conflicting upgrades - if( !keyMask.any() || !keyMask.testForAny( conflicting ) ) + if( keyMask.testForNone( conflicting ) ) { //Make sure we have activation conditions if( activation.any() )