From fa3cba6f8e5c31dc12207eb1ce7122aed6b1e098 Mon Sep 17 00:00:00 2001 From: tintinhamans <5984296+tintinhamans@users.noreply.github.com> Date: Sun, 13 Sep 2026 07:08:50 +0200 Subject: [PATCH] bugfix(object): preserve max-health upgrade order Signed-off-by: tintinhamans <5984296+tintinhamans@users.noreply.github.com> --- Generals/Code/GameEngine/Include/GameLogic/Object.h | 1 + Generals/Code/GameEngine/Source/GameLogic/Object/Object.cpp | 6 ++++++ .../Source/GameLogic/Object/Upgrade/MaxHealthUpgrade.cpp | 6 +++++- GeneralsMD/Code/GameEngine/Include/GameLogic/Object.h | 1 + .../Code/GameEngine/Source/GameLogic/Object/Object.cpp | 6 ++++++ .../Source/GameLogic/Object/Upgrade/MaxHealthUpgrade.cpp | 6 +++++- 6 files changed, 24 insertions(+), 2 deletions(-) diff --git a/Generals/Code/GameEngine/Include/GameLogic/Object.h b/Generals/Code/GameEngine/Include/GameLogic/Object.h index 54ca8613dc8..2119da5f441 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/Object.h +++ b/Generals/Code/GameEngine/Include/GameLogic/Object.h @@ -220,6 +220,7 @@ class Object : public Thing, public Snapshot ExperienceTracker* getExperienceTracker() {return m_experienceTracker;} const ExperienceTracker* getExperienceTracker() const {return m_experienceTracker;} VeterancyLevel getVeterancyLevel() const; + Real getMaxHealthUpgradeScale() const; inline const AsciiString& getName() const { return m_name; } inline void setName( const AsciiString& newName ) { m_name = newName; } diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Object.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Object.cpp index afd6ee9660d..89d6733ef6f 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Object.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Object.cpp @@ -2727,6 +2727,12 @@ VeterancyLevel Object::getVeterancyLevel() const return m_experienceTracker ? m_experienceTracker->getVeterancyLevel() : LEVEL_REGULAR; } +//------------------------------------------------------------------------------------------------- +Real Object::getMaxHealthUpgradeScale() const +{ + return TheGlobalData->m_healthBonus[getVeterancyLevel()]; +} + //------------------------------------------------------------------------------------------------- void Object::friend_bindToDrawable( Drawable *draw ) { diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Upgrade/MaxHealthUpgrade.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Upgrade/MaxHealthUpgrade.cpp index a9fbf946960..c606f620320 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Upgrade/MaxHealthUpgrade.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Upgrade/MaxHealthUpgrade.cpp @@ -81,13 +81,17 @@ void MaxHealthUpgrade::upgradeImplementation() { const MaxHealthUpgradeModuleData *data = getMaxHealthUpgradeModuleData(); - //Simply add the xp scalar to the xp tracker! Object *obj = getObject(); BodyModuleInterface *body = obj->getBodyModule(); if( body ) { +#if RETAIL_COMPATIBLE_CRC body->setMaxHealth( body->getMaxHealth() + data->m_addMaxHealth, data->m_maxHealthChangeType ); +#else + Real maxHealth = body->getMaxHealth() + data->m_addMaxHealth * obj->getMaxHealthUpgradeScale(); + body->setMaxHealth( maxHealth, data->m_maxHealthChangeType ); +#endif } } diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/Object.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/Object.h index 13019ab3fa7..9118bbf72e2 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/Object.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/Object.h @@ -236,6 +236,7 @@ class Object : public Thing, public Snapshot ExperienceTracker* getExperienceTracker() {return m_experienceTracker;} const ExperienceTracker* getExperienceTracker() const {return m_experienceTracker;} VeterancyLevel getVeterancyLevel() const; + Real getMaxHealthUpgradeScale() const; inline const AsciiString& getName() const { return m_name; } inline void setName( const AsciiString& newName ) { m_name = newName; } diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Object.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Object.cpp index f99f83dfd27..0822e76d6f2 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Object.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Object.cpp @@ -3015,6 +3015,12 @@ VeterancyLevel Object::getVeterancyLevel() const return m_experienceTracker ? m_experienceTracker->getVeterancyLevel() : LEVEL_REGULAR; } +//------------------------------------------------------------------------------------------------- +Real Object::getMaxHealthUpgradeScale() const +{ + return TheGlobalData->m_healthBonus[getVeterancyLevel()]; +} + //------------------------------------------------------------------------------------------------- void Object::friend_bindToDrawable( Drawable *draw ) { diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Upgrade/MaxHealthUpgrade.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Upgrade/MaxHealthUpgrade.cpp index e7f73297662..872bb85680c 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Upgrade/MaxHealthUpgrade.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Upgrade/MaxHealthUpgrade.cpp @@ -81,13 +81,17 @@ void MaxHealthUpgrade::upgradeImplementation() { const MaxHealthUpgradeModuleData *data = getMaxHealthUpgradeModuleData(); - //Simply add the xp scalar to the xp tracker! Object *obj = getObject(); BodyModuleInterface *body = obj->getBodyModule(); if( body ) { +#if RETAIL_COMPATIBLE_CRC body->setMaxHealth( body->getMaxHealth() + data->m_addMaxHealth, data->m_maxHealthChangeType ); +#else + Real maxHealth = body->getMaxHealth() + data->m_addMaxHealth * obj->getMaxHealthUpgradeScale(); + body->setMaxHealth( maxHealth, data->m_maxHealthChangeType ); +#endif } }