diff --git a/GeneralsMD/Code/GameEngine/Include/Common/Upgrade.h b/GeneralsMD/Code/GameEngine/Include/Common/Upgrade.h index 07aa657a65..09a47c95ab 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/Upgrade.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/Upgrade.h @@ -235,6 +235,7 @@ class UpgradeCenter : public SubsystemInterface void reset( void ); ///< subsystem interface void update( void ) { } ///< subsystem interface + void deleteAllUpgrades(); UpgradeTemplate *firstUpgradeTemplate( void ); ///< return the first upgrade template const UpgradeTemplate *findUpgradeByKey( NameKeyType key ) const; ///< find upgrade by name key const UpgradeTemplate *findUpgrade( const AsciiString& name ) const; ///< find and return upgrade by name diff --git a/GeneralsMD/Code/GameEngine/Source/Common/System/Upgrade.cpp b/GeneralsMD/Code/GameEngine/Source/Common/System/Upgrade.cpp index 17515a59d7..209cf523eb 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/System/Upgrade.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/System/Upgrade.cpp @@ -34,6 +34,7 @@ #include "Common/Upgrade.h" #include "Common/Player.h" #include "Common/Xfer.h" +#include "Common/XferCRC.h" #include "GameClient/InGameUI.h" #include "GameClient/Image.h" @@ -236,23 +237,7 @@ UpgradeCenter::UpgradeCenter( void ) //------------------------------------------------------------------------------------------------- UpgradeCenter::~UpgradeCenter( void ) { - - // delete all the upgrades loaded from the INI database - UpgradeTemplate *next; - while( m_upgradeList ) - { - - // get next - next = m_upgradeList->friend_getNext(); - - // delete head of list - deleteInstance(m_upgradeList); - - // set head to next element - m_upgradeList = next; - - } - + deleteAllUpgrades(); } //------------------------------------------------------------------------------------------------- @@ -284,6 +269,17 @@ void UpgradeCenter::init( void ) //------------------------------------------------------------------------------------------------- void UpgradeCenter::reset( void ) { + // TheSuperHackers @bugfix helmutbuhler 26/10/2025 + // When a custom map with a map.ini overrides some upgrades, we need to undo that here + // to avoid mismatches. For now we just reload the original ini files. + deleteAllUpgrades(); + init(); + XferCRC xferCRC; + xferCRC.open("lightCRC"); + INI ini; + ini.loadFileDirectory("Data\\INI\\Default\\Upgrade", INI_LOAD_OVERWRITE, &xferCRC); + ini.loadFileDirectory("Data\\INI\\Upgrade", INI_LOAD_OVERWRITE, &xferCRC); + if( TheMappedImageCollection && !buttonImagesCached ) { UpgradeTemplate *upgrade; @@ -295,6 +291,26 @@ void UpgradeCenter::reset( void ) } } +void UpgradeCenter::deleteAllUpgrades() +{ + // delete all the upgrades loaded from the INI database + UpgradeTemplate *next; + while( m_upgradeList ) + { + // get next + next = m_upgradeList->friend_getNext(); + + // delete head of list + deleteInstance(m_upgradeList); + + // set head to next element + m_upgradeList = next; + } + m_upgradeList = NULL; + m_nextTemplateMaskBit = 0; + buttonImagesCached = FALSE; +} + //------------------------------------------------------------------------------------------------- /** Find upgrade matching name key */ //-------------------------------------------------------------------------------------------------