Skip to content

Commit 6014188

Browse files
authored
bugfix(object): Guard GameLogic xfer version bump with RETAIL_COMPATIBLE_XFER_SAVE (#2418)
1 parent 25ab77d commit 6014188

2 files changed

Lines changed: 26 additions & 11 deletions

File tree

Generals/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4248,14 +4248,18 @@ void GameLogic::prepareLogicForObjectLoad()
42484248
* this version breaks compatibility with previous versions. (CBD)
42494249
* 5: Added xfering the BuildAssistant's sell list.
42504250
* 9: Added m_rankPointsToAddAtGameStart, or else on a load game, your RestartGame button will forget your exp
4251-
* 10: TheSuperHackers @tweak Save objects in reverse order so they load in correct order. Reverse object list for old saves.
4251+
* 10: TheSuperHackers @fix Save objects in reverse order so they load in correct order
42524252
*/
42534253
// ------------------------------------------------------------------------------------------------
42544254
void GameLogic::xfer( Xfer *xfer )
42554255
{
42564256

42574257
// version
4258+
#if RETAIL_COMPATIBLE_XFER_SAVE
4259+
const XferVersion currentVersion = 9;
4260+
#else
42584261
const XferVersion currentVersion = 10;
4262+
#endif
42594263
XferVersion version = currentVersion;
42604264
xfer->xferVersion( &version, currentVersion );
42614265

@@ -4288,14 +4292,17 @@ void GameLogic::xfer( Xfer *xfer )
42884292
ObjectTOCEntry *tocEntry;
42894293
if( xfer->getXferMode() == XFER_SAVE )
42904294
{
4291-
4292-
// TheSuperHackers @fix bobtista 27/01/2026 Save objects in reverse order (newest first)
4295+
#if !RETAIL_COMPATIBLE_XFER_SAVE
4296+
// TheSuperHackers @fix bobtista 07/03/2026 Save objects in reverse order (newest first)
42934297
// so they load in the correct order (oldest objects at head of list).
42944298
Object *lastObj = nullptr;
42954299
for( obj = getFirstObject(); obj; obj = obj->getNextObject() )
42964300
lastObj = obj;
42974301

42984302
for( obj = lastObj; obj; obj = obj->getPrevObject() )
4303+
#else
4304+
for( obj = getFirstObject(); obj; obj = obj->getNextObject() )
4305+
#endif
42994306
{
43004307

43014308
// get the object TOC entry for this template
@@ -4378,9 +4385,9 @@ void GameLogic::xfer( Xfer *xfer )
43784385

43794386
}
43804387

4381-
// TheSuperHackers @fix bobtista 27/01/2026 Reverse object list for old saves.
4382-
// Old saves stored objects oldest-first, which results in reversed order when loaded
4383-
// since objects are prepended during creation. Version 10+ saves in reverse order.
4388+
// TheSuperHackers @fix bobtista 07/03/2026 Reverse object list after load.
4389+
// Objects are prepended during creation, which reverses the saved order.
4390+
// Version 10+ saves in reverse order so they load in the correct order.
43844391
if ( version <= 9 )
43854392
{
43864393
Object *prev = nullptr;

GeneralsMD/Code/GameEngine/Source/GameLogic/System/GameLogic.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4816,14 +4816,18 @@ void GameLogic::prepareLogicForObjectLoad()
48164816
* 5: Added xfering the BuildAssistant's sell list.
48174817
* 9: Added m_rankPointsToAddAtGameStart, or else on a load game, your RestartGame button will forget your exp
48184818
* 10: xfer m_superweaponRestriction
4819-
* 11: TheSuperHackers @tweak Save objects in reverse order so they load in correct order
4819+
* 11: TheSuperHackers @fix Save objects in reverse order so they load in correct order
48204820
*/
48214821
// ------------------------------------------------------------------------------------------------
48224822
void GameLogic::xfer( Xfer *xfer )
48234823
{
48244824

48254825
// version
4826+
#if RETAIL_COMPATIBLE_XFER_SAVE
4827+
const XferVersion currentVersion = 10;
4828+
#else
48264829
const XferVersion currentVersion = 11;
4830+
#endif
48274831
XferVersion version = currentVersion;
48284832
xfer->xferVersion( &version, currentVersion );
48294833

@@ -4856,13 +4860,17 @@ void GameLogic::xfer( Xfer *xfer )
48564860
ObjectTOCEntry *tocEntry;
48574861
if( xfer->getXferMode() == XFER_SAVE )
48584862
{
4859-
// TheSuperHackers @fix bobtista 27/01/2026 Save objects in reverse order (newest first)
4863+
#if !RETAIL_COMPATIBLE_XFER_SAVE
4864+
// TheSuperHackers @fix bobtista 07/03/2026 Save objects in reverse order (newest first)
48604865
// so they load in the correct order (oldest objects at head of list).
48614866
Object *lastObj = nullptr;
48624867
for( obj = getFirstObject(); obj; obj = obj->getNextObject() )
48634868
lastObj = obj;
48644869

48654870
for( obj = lastObj; obj; obj = obj->getPrevObject() )
4871+
#else
4872+
for( obj = getFirstObject(); obj; obj = obj->getNextObject() )
4873+
#endif
48664874
{
48674875

48684876
// get the object TOC entry for this template
@@ -4945,9 +4953,9 @@ void GameLogic::xfer( Xfer *xfer )
49454953

49464954
}
49474955

4948-
// TheSuperHackers @fix bobtista 27/01/2026 Reverse object list for old saves.
4949-
// Old saves stored objects oldest-first, which results in reversed order when loaded
4950-
// since objects are prepended during creation. Version 11+ saves in reverse order.
4956+
// TheSuperHackers @fix bobtista 07/03/2026 Reverse object list after load.
4957+
// Objects are prepended during creation, which reverses the saved order.
4958+
// Version 11+ saves in reverse order so they load in the correct order.
49514959
if ( version <= 10 )
49524960
{
49534961
Object *prev = nullptr;

0 commit comments

Comments
 (0)