Skip to content

Commit 866a957

Browse files
MinefieldBehavior: Adjust health based on remaining mines and regeneration
1 parent 4b359f0 commit 866a957

2 files changed

Lines changed: 50 additions & 50 deletions

File tree

Generals/Code/GameEngine/Source/GameLogic/Object/Behavior/MinefieldBehavior.cpp

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -277,36 +277,36 @@ void MinefieldBehavior::detonateOnce(const Coord3D& position)
277277
if (m_virtualMinesRemaining > 0)
278278
--m_virtualMinesRemaining;
279279

280+
// Calculate the desired health based on remaining virtual mines
281+
Real percent = (Real)m_virtualMinesRemaining / (Real)d->m_numVirtualMines;
282+
BodyModuleInterface* body = getObject()->getBodyModule();
283+
Real health = body->getHealth();
284+
Real desired = percent * body->getMaxHealth();
285+
286+
// If we don't regenerate and have no mines left, health should go to 0 to trigger natural death
287+
// Otherwise, keep a minimum health for regenerating minefields
280288
if (!m_regenerates && m_virtualMinesRemaining == 0)
289+
desired = 0.0f;
290+
else if (desired < MIN_HEALTH)
291+
desired = MIN_HEALTH;
292+
293+
Real amount = health - desired;
294+
295+
if (amount > 0.0f)
281296
{
282-
TheGameLogic->destroyObject(getObject());
283-
}
284-
else
285-
{
286-
Real percent = (Real)m_virtualMinesRemaining / (Real)d->m_numVirtualMines;
287-
BodyModuleInterface* body = getObject()->getBodyModule();
288-
Real health = body->getHealth();
289-
Real desired = percent * body->getMaxHealth();
290-
if (desired < MIN_HEALTH)
291-
desired = MIN_HEALTH;
292-
Real amount = health - desired;
293-
294-
if (amount > 0.0f)
295-
{
296-
m_ignoreDamage = true;
297+
m_ignoreDamage = true;
297298

298-
//body->internalChangeHealth(desired - health);
299-
//can't use this, AutoHeal won't work unless we go thru normal damage stuff
299+
//body->internalChangeHealth(desired - health);
300+
//can't use this, AutoHeal won't work unless we go thru normal damage stuff
300301

301-
DamageInfo extraDamageInfo;
302-
extraDamageInfo.in.m_damageType = DAMAGE_UNRESISTABLE;
303-
extraDamageInfo.in.m_deathType = DEATH_NONE;
304-
extraDamageInfo.in.m_sourceID = getObject()->getID();
305-
extraDamageInfo.in.m_amount = amount;
306-
getObject()->attemptDamage(&extraDamageInfo);
302+
DamageInfo extraDamageInfo;
303+
extraDamageInfo.in.m_damageType = DAMAGE_UNRESISTABLE;
304+
extraDamageInfo.in.m_deathType = DEATH_NONE;
305+
extraDamageInfo.in.m_sourceID = getObject()->getID();
306+
extraDamageInfo.in.m_amount = amount;
307+
getObject()->attemptDamage(&extraDamageInfo);
307308

308-
m_ignoreDamage = false;
309-
}
309+
m_ignoreDamage = false;
310310
}
311311

312312
if (m_virtualMinesRemaining == 0)

GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/MinefieldBehavior.cpp

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -279,36 +279,36 @@ void MinefieldBehavior::detonateOnce(const Coord3D& position)
279279
if (m_virtualMinesRemaining > 0)
280280
--m_virtualMinesRemaining;
281281

282+
// Calculate the desired health based on remaining virtual mines
283+
Real percent = (Real)m_virtualMinesRemaining / (Real)d->m_numVirtualMines;
284+
BodyModuleInterface* body = getObject()->getBodyModule();
285+
Real health = body->getHealth();
286+
Real desired = percent * body->getMaxHealth();
287+
288+
// If we don't regenerate and have no mines left, health should go to 0 to trigger natural death
289+
// Otherwise, keep a minimum health for regenerating minefields
282290
if (!m_regenerates && m_virtualMinesRemaining == 0)
291+
desired = 0.0f;
292+
else if (desired < MIN_HEALTH)
293+
desired = MIN_HEALTH;
294+
295+
Real amount = health - desired;
296+
297+
if (amount > 0.0f)
283298
{
284-
TheGameLogic->destroyObject(getObject());
285-
}
286-
else
287-
{
288-
Real percent = (Real)m_virtualMinesRemaining / (Real)d->m_numVirtualMines;
289-
BodyModuleInterface* body = getObject()->getBodyModule();
290-
Real health = body->getHealth();
291-
Real desired = percent * body->getMaxHealth();
292-
if (desired < MIN_HEALTH)
293-
desired = MIN_HEALTH;
294-
Real amount = health - desired;
295-
296-
if (amount > 0.0f)
297-
{
298-
m_ignoreDamage = true;
299+
m_ignoreDamage = true;
299300

300-
//body->internalChangeHealth(desired - health);
301-
//can't use this, AutoHeal won't work unless we go thru normal damage stuff
301+
//body->internalChangeHealth(desired - health);
302+
//can't use this, AutoHeal won't work unless we go thru normal damage stuff
302303

303-
DamageInfo extraDamageInfo;
304-
extraDamageInfo.in.m_damageType = DAMAGE_UNRESISTABLE;
305-
extraDamageInfo.in.m_deathType = DEATH_NONE;
306-
extraDamageInfo.in.m_sourceID = getObject()->getID();
307-
extraDamageInfo.in.m_amount = amount;
308-
getObject()->attemptDamage(&extraDamageInfo);
304+
DamageInfo extraDamageInfo;
305+
extraDamageInfo.in.m_damageType = DAMAGE_UNRESISTABLE;
306+
extraDamageInfo.in.m_deathType = DEATH_NONE;
307+
extraDamageInfo.in.m_sourceID = getObject()->getID();
308+
extraDamageInfo.in.m_amount = amount;
309+
getObject()->attemptDamage(&extraDamageInfo);
309310

310-
m_ignoreDamage = false;
311-
}
311+
m_ignoreDamage = false;
312312
}
313313

314314
if (m_virtualMinesRemaining == 0)

0 commit comments

Comments
 (0)