From 866a957151cb369dd5b0f3b579b453a2a8aece84 Mon Sep 17 00:00:00 2001 From: "seer-by-sentry[bot]" <157164994+seer-by-sentry[bot]@users.noreply.github.com> Date: Sun, 5 Oct 2025 02:57:46 +0000 Subject: [PATCH] MinefieldBehavior: Adjust health based on remaining mines and regeneration --- .../Object/Behavior/MinefieldBehavior.cpp | 50 +++++++++---------- .../Object/Behavior/MinefieldBehavior.cpp | 50 +++++++++---------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/MinefieldBehavior.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/MinefieldBehavior.cpp index 9a32eea433a..a43f5fc68e5 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/MinefieldBehavior.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/MinefieldBehavior.cpp @@ -277,36 +277,36 @@ void MinefieldBehavior::detonateOnce(const Coord3D& position) if (m_virtualMinesRemaining > 0) --m_virtualMinesRemaining; + // Calculate the desired health based on remaining virtual mines + Real percent = (Real)m_virtualMinesRemaining / (Real)d->m_numVirtualMines; + BodyModuleInterface* body = getObject()->getBodyModule(); + Real health = body->getHealth(); + Real desired = percent * body->getMaxHealth(); + + // If we don't regenerate and have no mines left, health should go to 0 to trigger natural death + // Otherwise, keep a minimum health for regenerating minefields if (!m_regenerates && m_virtualMinesRemaining == 0) + desired = 0.0f; + else if (desired < MIN_HEALTH) + desired = MIN_HEALTH; + + Real amount = health - desired; + + if (amount > 0.0f) { - TheGameLogic->destroyObject(getObject()); - } - else - { - Real percent = (Real)m_virtualMinesRemaining / (Real)d->m_numVirtualMines; - BodyModuleInterface* body = getObject()->getBodyModule(); - Real health = body->getHealth(); - Real desired = percent * body->getMaxHealth(); - if (desired < MIN_HEALTH) - desired = MIN_HEALTH; - Real amount = health - desired; - - if (amount > 0.0f) - { - m_ignoreDamage = true; + m_ignoreDamage = true; - //body->internalChangeHealth(desired - health); - //can't use this, AutoHeal won't work unless we go thru normal damage stuff + //body->internalChangeHealth(desired - health); + //can't use this, AutoHeal won't work unless we go thru normal damage stuff - DamageInfo extraDamageInfo; - extraDamageInfo.in.m_damageType = DAMAGE_UNRESISTABLE; - extraDamageInfo.in.m_deathType = DEATH_NONE; - extraDamageInfo.in.m_sourceID = getObject()->getID(); - extraDamageInfo.in.m_amount = amount; - getObject()->attemptDamage(&extraDamageInfo); + DamageInfo extraDamageInfo; + extraDamageInfo.in.m_damageType = DAMAGE_UNRESISTABLE; + extraDamageInfo.in.m_deathType = DEATH_NONE; + extraDamageInfo.in.m_sourceID = getObject()->getID(); + extraDamageInfo.in.m_amount = amount; + getObject()->attemptDamage(&extraDamageInfo); - m_ignoreDamage = false; - } + m_ignoreDamage = false; } if (m_virtualMinesRemaining == 0) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/MinefieldBehavior.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/MinefieldBehavior.cpp index 9f899d20393..db3e05c3990 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/MinefieldBehavior.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/MinefieldBehavior.cpp @@ -279,36 +279,36 @@ void MinefieldBehavior::detonateOnce(const Coord3D& position) if (m_virtualMinesRemaining > 0) --m_virtualMinesRemaining; + // Calculate the desired health based on remaining virtual mines + Real percent = (Real)m_virtualMinesRemaining / (Real)d->m_numVirtualMines; + BodyModuleInterface* body = getObject()->getBodyModule(); + Real health = body->getHealth(); + Real desired = percent * body->getMaxHealth(); + + // If we don't regenerate and have no mines left, health should go to 0 to trigger natural death + // Otherwise, keep a minimum health for regenerating minefields if (!m_regenerates && m_virtualMinesRemaining == 0) + desired = 0.0f; + else if (desired < MIN_HEALTH) + desired = MIN_HEALTH; + + Real amount = health - desired; + + if (amount > 0.0f) { - TheGameLogic->destroyObject(getObject()); - } - else - { - Real percent = (Real)m_virtualMinesRemaining / (Real)d->m_numVirtualMines; - BodyModuleInterface* body = getObject()->getBodyModule(); - Real health = body->getHealth(); - Real desired = percent * body->getMaxHealth(); - if (desired < MIN_HEALTH) - desired = MIN_HEALTH; - Real amount = health - desired; - - if (amount > 0.0f) - { - m_ignoreDamage = true; + m_ignoreDamage = true; - //body->internalChangeHealth(desired - health); - //can't use this, AutoHeal won't work unless we go thru normal damage stuff + //body->internalChangeHealth(desired - health); + //can't use this, AutoHeal won't work unless we go thru normal damage stuff - DamageInfo extraDamageInfo; - extraDamageInfo.in.m_damageType = DAMAGE_UNRESISTABLE; - extraDamageInfo.in.m_deathType = DEATH_NONE; - extraDamageInfo.in.m_sourceID = getObject()->getID(); - extraDamageInfo.in.m_amount = amount; - getObject()->attemptDamage(&extraDamageInfo); + DamageInfo extraDamageInfo; + extraDamageInfo.in.m_damageType = DAMAGE_UNRESISTABLE; + extraDamageInfo.in.m_deathType = DEATH_NONE; + extraDamageInfo.in.m_sourceID = getObject()->getID(); + extraDamageInfo.in.m_amount = amount; + getObject()->attemptDamage(&extraDamageInfo); - m_ignoreDamage = false; - } + m_ignoreDamage = false; } if (m_virtualMinesRemaining == 0)