From edefb810722c1a01b2f0a868ce7332d0d01a8cfa Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Thu, 15 Jan 2026 13:56:08 +0100 Subject: [PATCH 1/2] fix(compatibility): Restore retail compatibility after sequential script change in ScriptEngine. --- .../GameLogic/ScriptEngine/ScriptEngine.cpp | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp index 1afe8e19c1e..130da7eafb9 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp @@ -7877,12 +7877,36 @@ void ScriptEngine::setSequentialTimer(Team *team, Int frameCount) void ScriptEngine::evaluateAndProgressAllSequentialScripts( void ) { +#if (defined(_MSC_VER) && _MSC_VER < 1300) && RETAIL_COMPATIBLE_CRC + VecSequentialScriptPtrIt it, lastIt; + lastIt = m_sequentialScripts.end(); +#else VecSequentialScriptPtrIt it; SequentialScript* lastScript = NULL; +#endif Bool itAdvanced = false; Int spinCount = 0; for (it = m_sequentialScripts.begin(); it != m_sequentialScripts.end(); /* empty */) { +#if (defined(_MSC_VER) && _MSC_VER < 1300) && RETAIL_COMPATIBLE_CRC + if (it == lastIt) { + ++spinCount; + } else { + spinCount = 0; + } + + if (spinCount > MAX_SPIN_COUNT) { + SequentialScript *seqScript = (*it); + if (seqScript) { + DEBUG_LOG(("Sequential script %s appears to be in an infinite loop.\n", + seqScript->m_scriptToExecuteSequentially->getName().str())); + } + ++it; + continue; + } + + lastIt = it; +#else if ((*it) == lastScript) { ++spinCount; } else { @@ -7900,6 +7924,7 @@ void ScriptEngine::evaluateAndProgressAllSequentialScripts( void ) } lastScript = (*it); +#endif itAdvanced = false; From d48f74d7a0e6046ea1402e1073807a3f62f09fb7 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Thu, 15 Jan 2026 14:24:44 +0100 Subject: [PATCH 2/2] Fixed merge conflict. --- .../GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp index 130da7eafb9..3884728ce1c 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp @@ -7882,7 +7882,7 @@ void ScriptEngine::evaluateAndProgressAllSequentialScripts( void ) lastIt = m_sequentialScripts.end(); #else VecSequentialScriptPtrIt it; - SequentialScript* lastScript = NULL; + SequentialScript* lastScript = nullptr; #endif Bool itAdvanced = false;