diff --git a/Generals/Code/GameEngine/Source/GameClient/Drawable.cpp b/Generals/Code/GameEngine/Source/GameClient/Drawable.cpp index 9ea06a8d0c3..1d99a5f02fc 100644 --- a/Generals/Code/GameEngine/Source/GameClient/Drawable.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/Drawable.cpp @@ -4895,9 +4895,24 @@ void TintEnvelope::xfer( Xfer *xfer ) // sustain counter if (version <= 1) { - UnsignedInt sustainCounter = (UnsignedInt)m_sustainCounter; + // TheSuperHackers @bugfix bobtista 13/08/2026 Preserve the indefinite sustain sentinel across the retail + // compatible save format. (Real)SUSTAIN_INDEFINITELY rounds up to 4294967296, which is out of range for + // UnsignedInt, so converting it back is undefined and yields 0 on MSVC. Assigning that result back also + // cleared the sustain on save, which released color envelopes that are meant to hold indefinitely. + UnsignedInt sustainCounter; + if( m_sustainCounter >= (Real)SUSTAIN_INDEFINITELY ) + { + sustainCounter = SUSTAIN_INDEFINITELY; + } + else + { + sustainCounter = (UnsignedInt)m_sustainCounter; + } xfer->xferUnsignedInt( &sustainCounter ); - m_sustainCounter = (Real)sustainCounter; + if( xfer->getXferMode() == XFER_LOAD ) + { + m_sustainCounter = (Real)sustainCounter; + } } else { diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/Drawable.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/Drawable.cpp index 2ea309f2106..00464233f8a 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/Drawable.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/Drawable.cpp @@ -5614,9 +5614,24 @@ void TintEnvelope::xfer( Xfer *xfer ) // sustain counter if (version <= 1) { - UnsignedInt sustainCounter = (UnsignedInt)m_sustainCounter; + // TheSuperHackers @bugfix bobtista 13/08/2026 Preserve the indefinite sustain sentinel across the retail + // compatible save format. (Real)SUSTAIN_INDEFINITELY rounds up to 4294967296, which is out of range for + // UnsignedInt, so converting it back is undefined and yields 0 on MSVC. Assigning that result back also + // cleared the sustain on save, which released color envelopes that are meant to hold indefinitely. + UnsignedInt sustainCounter; + if( m_sustainCounter >= (Real)SUSTAIN_INDEFINITELY ) + { + sustainCounter = SUSTAIN_INDEFINITELY; + } + else + { + sustainCounter = (UnsignedInt)m_sustainCounter; + } xfer->xferUnsignedInt( &sustainCounter ); - m_sustainCounter = (Real)sustainCounter; + if( xfer->getXferMode() == XFER_LOAD ) + { + m_sustainCounter = (Real)sustainCounter; + } } else {