From d864e625c17365f4d92edcb85448709d7f484e06 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Fri, 14 Aug 2026 17:01:39 -0400 Subject: [PATCH 01/12] bugfix(saveload): Transfer the dock approach position bone count --- .../Object/Update/DockUpdate/DockUpdate.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp index ec4c2dbd8bb..ec308ad33f0 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp @@ -558,13 +558,21 @@ void DockUpdate::crc( Xfer *xfer ) } // ------------------------------------------------------------------------------------------------ -/** Xfer Method */ +/** Xfer Method + * Version Info: + * 1: Initial version + * 2: TheSuperHackers @bugfix bobtista 14/08/2026 Serialize the approach position bone count, so + * a dock with no waiting bones keeps biasing approach positions toward the caller on load */ // ------------------------------------------------------------------------------------------------ void DockUpdate::xfer( Xfer *xfer ) { // version +#if RETAIL_COMPATIBLE_XFER_SAVE XferVersion currentVersion = 1; +#else + XferVersion currentVersion = 2; +#endif XferVersion version = currentVersion; xfer->xferVersion( &version, currentVersion ); @@ -583,6 +591,12 @@ void DockUpdate::xfer( Xfer *xfer ) // # approach positions xfer->xferInt( &m_numberApproachPositions ); + // # approach position bones + if( version >= 2 ) + { + xfer->xferInt( &m_numberApproachPositionBones ); + } + // positions loaded xfer->xferBool( &m_positionsLoaded ); From 5d919e80d3282d70947a4011d2266e655445685f Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Fri, 14 Aug 2026 17:01:39 -0400 Subject: [PATCH 02/12] bugfix(saveload): Transfer the dock approach position bone count (Generals) --- .../Object/Update/DockUpdate/DockUpdate.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp index 7ca5deccccb..aa59b83485b 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp @@ -543,13 +543,21 @@ void DockUpdate::crc( Xfer *xfer ) } // ------------------------------------------------------------------------------------------------ -/** Xfer Method */ +/** Xfer Method + * Version Info: + * 1: Initial version + * 2: TheSuperHackers @bugfix bobtista 14/08/2026 Serialize the approach position bone count, so + * a dock with no waiting bones keeps biasing approach positions toward the caller on load */ // ------------------------------------------------------------------------------------------------ void DockUpdate::xfer( Xfer *xfer ) { // version +#if RETAIL_COMPATIBLE_XFER_SAVE XferVersion currentVersion = 1; +#else + XferVersion currentVersion = 2; +#endif XferVersion version = currentVersion; xfer->xferVersion( &version, currentVersion ); @@ -568,6 +576,12 @@ void DockUpdate::xfer( Xfer *xfer ) // # approach positions xfer->xferInt( &m_numberApproachPositions ); + // # approach position bones + if( version >= 2 ) + { + xfer->xferInt( &m_numberApproachPositionBones ); + } + // positions loaded xfer->xferBool( &m_positionsLoaded ); From beaa5b3df597d8ef14d2f7eb823f7051a3f62cf5 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Thu, 24 Sep 2026 08:49:40 -0400 Subject: [PATCH 03/12] docs(saveload): Move dock counter explanation beside transfer --- .../Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp index ec308ad33f0..a164f0b0a49 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp @@ -561,8 +561,7 @@ void DockUpdate::crc( Xfer *xfer ) /** Xfer Method * Version Info: * 1: Initial version - * 2: TheSuperHackers @bugfix bobtista 14/08/2026 Serialize the approach position bone count, so - * a dock with no waiting bones keeps biasing approach positions toward the caller on load */ + * 2: Save the approach position bone count. */ // ------------------------------------------------------------------------------------------------ void DockUpdate::xfer( Xfer *xfer ) { @@ -594,6 +593,7 @@ void DockUpdate::xfer( Xfer *xfer ) // # approach position bones if( version >= 2 ) { + // The saved positions-loaded flag can prevent this count from being recomputed. xfer->xferInt( &m_numberApproachPositionBones ); } From d802721e3c38827e6898932197f346c61464f059 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Thu, 24 Sep 2026 08:49:40 -0400 Subject: [PATCH 04/12] docs(saveload): Move dock counter explanation beside transfer in Generals --- .../Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp index aa59b83485b..672518ed0dd 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp @@ -546,8 +546,7 @@ void DockUpdate::crc( Xfer *xfer ) /** Xfer Method * Version Info: * 1: Initial version - * 2: TheSuperHackers @bugfix bobtista 14/08/2026 Serialize the approach position bone count, so - * a dock with no waiting bones keeps biasing approach positions toward the caller on load */ + * 2: Save the approach position bone count. */ // ------------------------------------------------------------------------------------------------ void DockUpdate::xfer( Xfer *xfer ) { @@ -579,6 +578,7 @@ void DockUpdate::xfer( Xfer *xfer ) // # approach position bones if( version >= 2 ) { + // The saved positions-loaded flag can prevent this count from being recomputed. xfer->xferInt( &m_numberApproachPositionBones ); } From e062b8647d48364ffe00b3d507d7ac96c6398971 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Thu, 24 Sep 2026 16:38:07 -0400 Subject: [PATCH 05/12] docs(saveload): Remove the redundant dock bone label --- .../Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp index a164f0b0a49..78f4cce8b53 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp @@ -590,7 +590,6 @@ void DockUpdate::xfer( Xfer *xfer ) // # approach positions xfer->xferInt( &m_numberApproachPositions ); - // # approach position bones if( version >= 2 ) { // The saved positions-loaded flag can prevent this count from being recomputed. From 4d1d84b5de80f89febb7f3727fbc18a7818e64c6 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Thu, 24 Sep 2026 16:38:07 -0400 Subject: [PATCH 06/12] docs(generals): Align existing PR comments with Zero Hour --- .../Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp index 672518ed0dd..9ff22456203 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp @@ -575,7 +575,6 @@ void DockUpdate::xfer( Xfer *xfer ) // # approach positions xfer->xferInt( &m_numberApproachPositions ); - // # approach position bones if( version >= 2 ) { // The saved positions-loaded flag can prevent this count from being recomputed. From 35fa61b6d0b99fcb0daf6d01802005e7bd96ad2e Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Fri, 25 Sep 2026 04:06:25 -0400 Subject: [PATCH 07/12] style(dock): Keep the bone count label inside the version branch --- .../Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp index 78f4cce8b53..d8cf092b7a7 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp @@ -592,7 +592,7 @@ void DockUpdate::xfer( Xfer *xfer ) if( version >= 2 ) { - // The saved positions-loaded flag can prevent this count from being recomputed. + // # approach position bones xfer->xferInt( &m_numberApproachPositionBones ); } From bf43c4da483703d675c5fd44a6bf077dbe644a5c Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Fri, 25 Sep 2026 04:06:26 -0400 Subject: [PATCH 08/12] style(dock): Keep the bone count label inside the version branch in Generals --- .../Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp index 9ff22456203..0f6ace491b8 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp @@ -577,7 +577,7 @@ void DockUpdate::xfer( Xfer *xfer ) if( version >= 2 ) { - // The saved positions-loaded flag can prevent this count from being recomputed. + // # approach position bones xfer->xferInt( &m_numberApproachPositionBones ); } From f87f8790433a9c584e2de7b1a9f0d6636020eb2f Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Wed, 30 Sep 2026 12:30:38 -0400 Subject: [PATCH 09/12] bugfix(dock): Recompute dock positions after loading --- .../Object/Update/DockUpdate/DockUpdate.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp index d8cf092b7a7..d0180b12705 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp @@ -561,17 +561,13 @@ void DockUpdate::crc( Xfer *xfer ) /** Xfer Method * Version Info: * 1: Initial version - * 2: Save the approach position bone count. */ + */ // ------------------------------------------------------------------------------------------------ void DockUpdate::xfer( Xfer *xfer ) { // version -#if RETAIL_COMPATIBLE_XFER_SAVE XferVersion currentVersion = 1; -#else - XferVersion currentVersion = 2; -#endif XferVersion version = currentVersion; xfer->xferVersion( &version, currentVersion ); @@ -590,12 +586,6 @@ void DockUpdate::xfer( Xfer *xfer ) // # approach positions xfer->xferInt( &m_numberApproachPositions ); - if( version >= 2 ) - { - // # approach position bones - xfer->xferInt( &m_numberApproachPositionBones ); - } - // positions loaded xfer->xferBool( &m_positionsLoaded ); @@ -655,5 +645,11 @@ void DockUpdate::loadPostProcess() // call base class UpdateModule::loadPostProcess(); + // TheSuperHackers @bugfix bobtista 30/09/2026 Restore the unsaved approach bone count. + if( m_positionsLoaded ) + { + loadDockPositions(); + } + } From ef3b52bcf321c67b1283cd11facf8dae2878aea7 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Wed, 30 Sep 2026 12:30:38 -0400 Subject: [PATCH 10/12] bugfix(generals): Recompute dock positions after loading --- .../Object/Update/DockUpdate/DockUpdate.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp index 0f6ace491b8..ccf2f2dc5c8 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/DockUpdate/DockUpdate.cpp @@ -546,17 +546,13 @@ void DockUpdate::crc( Xfer *xfer ) /** Xfer Method * Version Info: * 1: Initial version - * 2: Save the approach position bone count. */ + */ // ------------------------------------------------------------------------------------------------ void DockUpdate::xfer( Xfer *xfer ) { // version -#if RETAIL_COMPATIBLE_XFER_SAVE XferVersion currentVersion = 1; -#else - XferVersion currentVersion = 2; -#endif XferVersion version = currentVersion; xfer->xferVersion( &version, currentVersion ); @@ -575,12 +571,6 @@ void DockUpdate::xfer( Xfer *xfer ) // # approach positions xfer->xferInt( &m_numberApproachPositions ); - if( version >= 2 ) - { - // # approach position bones - xfer->xferInt( &m_numberApproachPositionBones ); - } - // positions loaded xfer->xferBool( &m_positionsLoaded ); @@ -640,5 +630,11 @@ void DockUpdate::loadPostProcess() // call base class UpdateModule::loadPostProcess(); + // TheSuperHackers @bugfix bobtista 30/09/2026 Restore the unsaved approach bone count. + if( m_positionsLoaded ) + { + loadDockPositions(); + } + } From fe4f1814b1fc7e36559f686b55081cd56b70a436 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Wed, 30 Sep 2026 17:51:58 -0400 Subject: [PATCH 11/12] docs(dock): Explain approach bone count reconstruction --- .../Code/GameEngine/Include/GameLogic/Module/DockUpdate.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/DockUpdate.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/DockUpdate.h index a3b69520f64..fd43af70545 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/DockUpdate.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/DockUpdate.h @@ -135,7 +135,7 @@ class DockUpdate : public UpdateModule , public DockUpdateInterface Coord3D m_dockPosition; Coord3D m_exitPosition; Int m_numberApproachPositions; - Int m_numberApproachPositionBones; + Int m_numberApproachPositionBones; ///< Recomputed after loading; does not need serialization. // These are real variables local to my specific needs here in DockUpdate Bool m_positionsLoaded; ///< FALSE until we have loaded all the docking positions From f3d7502d811a3234bc62692068ee91026041f97e Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Wed, 30 Sep 2026 17:51:59 -0400 Subject: [PATCH 12/12] docs(generals): Explain approach bone count reconstruction --- Generals/Code/GameEngine/Include/GameLogic/Module/DockUpdate.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Generals/Code/GameEngine/Include/GameLogic/Module/DockUpdate.h b/Generals/Code/GameEngine/Include/GameLogic/Module/DockUpdate.h index e1f88ea6907..f965f7d00a6 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/Module/DockUpdate.h +++ b/Generals/Code/GameEngine/Include/GameLogic/Module/DockUpdate.h @@ -135,7 +135,7 @@ class DockUpdate : public UpdateModule , public DockUpdateInterface Coord3D m_dockPosition; Coord3D m_exitPosition; Int m_numberApproachPositions; - Int m_numberApproachPositionBones; + Int m_numberApproachPositionBones; ///< Recomputed after loading; does not need serialization. // These are real variables local to my specific needs here in DockUpdate Bool m_positionsLoaded; ///< FALSE until we have loaded all the docking positions