From 436c66237c0fbed3d0efea326268fa4e0c2759cc Mon Sep 17 00:00:00 2001 From: MrS-ibra Date: Wed, 24 Dec 2025 00:24:22 +0300 Subject: [PATCH 1/8] Update ScriptEngine.cpp --- .../Source/GameLogic/ScriptEngine/ScriptEngine.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp index 3f2fa743316..d39e3fd3da8 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp @@ -5523,12 +5523,13 @@ void ScriptEngine::update(void) */ #endif #endif - + #if defined(GENERALS_ONLINE_HIGH_FPS_SERVER) - if (!m_firstUpdate && !TheGameLogic->HasLegacyFrameAdvanced()) { - return; - } + const bool legacyFrameAdvanced = TheGameLogic->HasLegacyFrameAdvanced(); +#else + const bool legacyFrameAdvanced = true; #endif + if (m_firstUpdate) { createNamedCache(); particleEditorUpdate(); @@ -5578,7 +5579,9 @@ void ScriptEngine::update(void) if (m_counters[i].isCountdownTimer) { // If counter has any time left, decrement. Counters go to -1 and stop. if (m_counters[i].value >= 0) { - m_counters[i].value--; + if (legacyFrameAdvanced) { + m_counters[i].value--; + } } } } From 4c18783cc24235606c891fd1acbfeb624eff4dc9 Mon Sep 17 00:00:00 2001 From: MrS-ibra Date: Wed, 24 Dec 2025 02:00:43 +0300 Subject: [PATCH 2/8] more timers fixing --- .../GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp index d39e3fd3da8..69562b1335f 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp @@ -5540,13 +5540,17 @@ void ScriptEngine::update(void) } if (m_closeWindowTimer > 0) { + if (legacyFrameAdvanced) { m_closeWindowTimer--; + } if (m_closeWindowTimer < 1) { TheScriptActions->closeWindows(FALSE); // Close victory or defeat windows. } } if (m_endGameTimer > 0) { + if (legacyFrameAdvanced) { m_endGameTimer--; + } if (m_endGameTimer < 1) { TheGameLogic->exitGame(); //TheScriptActions->closeWindows(FALSE); // Close victory or defeat windows. From c0286b819889674db96cd22c039f491ffaa1d6bb Mon Sep 17 00:00:00 2001 From: MrS-ibra Date: Wed, 24 Dec 2025 03:06:00 +0300 Subject: [PATCH 3/8] gate adjustTimer --- .../Source/GameLogic/ScriptEngine/ScriptEngine.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp index 69562b1335f..9e887c3270a 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp @@ -6856,7 +6856,12 @@ void ScriptEngine::adjustTimer(ScriptAction* pAction, Bool millisecondTimer, Boo Real value = pAction->getParameter(0)->getReal(); if (!add) value = -value; - m_counters[counterNdx].value += REAL_TO_INT_CEIL(ConvertDurationFromMsecsToFrames(value * 1000)); +#if defined(GENERALS_ONLINE_HIGH_FPS_SERVER) + const int LEGACY_FPS_INT = BaseFps; + m_counters[counterNdx].value += REAL_TO_INT_CEIL(value * (Real)LEGACY_FPS_INT); +#else + m_counters[counterNdx].value += REAL_TO_INT_CEIL(ConvertDurationFromMsecsToFrames(value * 1000)); +#endif } else { Int value = pAction->getParameter(0)->getInt(); From 9e1b9d448458635b0237eea77d7c157dc0443384 Mon Sep 17 00:00:00 2001 From: MrS-ibra Date: Thu, 25 Dec 2025 14:08:52 +0300 Subject: [PATCH 4/8] fake frame counters update --- .../GameLogic/ScriptEngine/ScriptEngine.cpp | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp index 9e887c3270a..2d289efaf4c 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp @@ -75,6 +75,9 @@ static HMODULE st_DebugDLL; #include "Common/MapObject.h" #include "../../GameEngineDevice/Include/W3DDevice/GameClient/W3DAssetManagerExposed.h" +static Bool g_isLegacyCounter[MAX_COUNTERS]; +static Bool g_cachedLegacyFrameAdvanced = FALSE; + static void _addUpdatedParticleSystem(AsciiString particleSystemName); static void _appendAllParticleSystems(void); static void _appendAllThingTemplates(void); @@ -5298,6 +5301,7 @@ void ScriptEngine::reset(void) m_counters[i].value = 0; m_counters[i].isCountdownTimer = false; m_counters[i].name.clear(); + g_isLegacyCounter[i] = FALSE; } for (i = 0; i < MAX_FLAGS; i++) { m_flags[i].value = false; @@ -5440,6 +5444,7 @@ void ScriptEngine::newMap(void) m_counters[i].value = 0; m_counters[i].isCountdownTimer = false; m_counters[i].name.clear(); + g_isLegacyCounter[i] = FALSE; } m_numFlags = 1; for (i = 0; i < MAX_FLAGS; i++) { @@ -5529,6 +5534,7 @@ void ScriptEngine::update(void) #else const bool legacyFrameAdvanced = true; #endif + g_cachedLegacyFrameAdvanced = legacyFrameAdvanced; if (m_firstUpdate) { createNamedCache(); @@ -6413,7 +6419,13 @@ void ScriptEngine::setCounter(ScriptAction* pAction) pAction->getParameter(0)->friend_setInt(counterNdx); } Int value = pAction->getParameter(1)->getInt(); - m_counters[counterNdx].value = value; + if (g_isLegacyCounter[counterNdx]) { + if (g_cachedLegacyFrameAdvanced) { + m_counters[counterNdx].value = value; + } + } else { + m_counters[counterNdx].value = value; + } } //------------------------------------------------------------------------------------------------- @@ -6481,7 +6493,13 @@ void ScriptEngine::addCounter(ScriptAction* pAction) counterNdx = allocateCounter(pAction->getParameter(1)->getString()); pAction->getParameter(1)->friend_setInt(counterNdx); } - m_counters[counterNdx].value += value; + if (g_isLegacyCounter[counterNdx]) { + if (g_cachedLegacyFrameAdvanced) { + m_counters[counterNdx].value += value; + } + } else { + m_counters[counterNdx].value += value; + } } //------------------------------------------------------------------------------------------------- @@ -6496,7 +6514,13 @@ void ScriptEngine::subCounter(ScriptAction* pAction) counterNdx = allocateCounter(pAction->getParameter(1)->getString()); pAction->getParameter(1)->friend_setInt(counterNdx); } - m_counters[counterNdx].value -= value; + if (g_isLegacyCounter[counterNdx]) { + if (g_cachedLegacyFrameAdvanced) { + m_counters[counterNdx].value -= value; + } + } else { + m_counters[counterNdx].value -= value; + } } //------------------------------------------------------------------------------------------------- @@ -6809,6 +6833,7 @@ void ScriptEngine::setTimer(ScriptAction* pAction, Bool millisecondTimer, Bool r m_counters[counterNdx].value = value; } m_counters[counterNdx].isCountdownTimer = true; + g_isLegacyCounter[counterNdx] = TRUE; } //------------------------------------------------------------------------------------------------- From 457de19f9c0daba2655e844b866dfdd449f48d33 Mon Sep 17 00:00:00 2001 From: MrS-ibra Date: Thu, 25 Dec 2025 14:18:55 +0300 Subject: [PATCH 5/8] update --- .../Source/GameLogic/ScriptEngine/ScriptEngine.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp index 2d289efaf4c..3652137398c 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp @@ -57,6 +57,8 @@ #include "GameLogic/ScriptEngine.h" #include "GameLogic/SidesList.h" +static Bool g_isLegacyCounter[MAX_COUNTERS]; +static Bool g_cachedLegacyFrameAdvanced = FALSE; // These are for debugger window static int st_LastCurrentFrame; @@ -75,9 +77,6 @@ static HMODULE st_DebugDLL; #include "Common/MapObject.h" #include "../../GameEngineDevice/Include/W3DDevice/GameClient/W3DAssetManagerExposed.h" -static Bool g_isLegacyCounter[MAX_COUNTERS]; -static Bool g_cachedLegacyFrameAdvanced = FALSE; - static void _addUpdatedParticleSystem(AsciiString particleSystemName); static void _appendAllParticleSystems(void); static void _appendAllThingTemplates(void); From ee6727c0c0c0197b523a4d19540d5282ad5a1db3 Mon Sep 17 00:00:00 2001 From: MrS-ibra Date: Thu, 25 Dec 2025 14:36:35 +0300 Subject: [PATCH 6/8] enum --- .../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 3652137398c..76c84d028d4 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp @@ -57,7 +57,7 @@ #include "GameLogic/ScriptEngine.h" #include "GameLogic/SidesList.h" -static Bool g_isLegacyCounter[MAX_COUNTERS]; +static Bool g_isLegacyCounter[ScriptEngine::MAX_COUNTERS]; static Bool g_cachedLegacyFrameAdvanced = FALSE; // These are for debugger window From f375c73671589be7806876e596db9a893255492b Mon Sep 17 00:00:00 2001 From: MrS-ibra Date: Thu, 25 Dec 2025 14:54:13 +0300 Subject: [PATCH 7/8] dynamic gating --- .../Source/GameLogic/ScriptEngine/ScriptEngine.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp index 76c84d028d4..5812a9f1fa8 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp @@ -5528,12 +5528,8 @@ void ScriptEngine::update(void) #endif #endif -#if defined(GENERALS_ONLINE_HIGH_FPS_SERVER) - const bool legacyFrameAdvanced = TheGameLogic->HasLegacyFrameAdvanced(); -#else - const bool legacyFrameAdvanced = true; -#endif - g_cachedLegacyFrameAdvanced = legacyFrameAdvanced; +const bool legacyFrameAdvanced = TheGameLogic->HasLegacyFrameAdvanced(); +g_cachedLegacyFrameAdvanced = legacyFrameAdvanced; if (m_firstUpdate) { createNamedCache(); From c86f77dbead3e7d9d6d7308110bbdb1ce5f9a1af Mon Sep 17 00:00:00 2001 From: MrS-ibra Date: Thu, 25 Dec 2025 15:26:23 +0300 Subject: [PATCH 8/8] Update ScriptEngine.cpp --- .../GameLogic/ScriptEngine/ScriptEngine.cpp | 58 ++++++++++++------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp index 5812a9f1fa8..81d307a4819 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/ScriptEngine/ScriptEngine.cpp @@ -6858,6 +6858,7 @@ void ScriptEngine::restartTimer(ScriptAction* pAction) } if (m_counters[counterNdx].value > 0) { m_counters[counterNdx].isCountdownTimer = true; + g_isLegacyCounter[counterNdx] = TRUE; } } @@ -6866,29 +6867,46 @@ void ScriptEngine::restartTimer(ScriptAction* pAction) //------------------------------------------------------------------------------------------------- void ScriptEngine::adjustTimer(ScriptAction* pAction, Bool millisecondTimer, Bool add) { - DEBUG_ASSERTCRASH(pAction->getNumParameters() >= 2, ("Not enough parameters.")); - Int counterNdx = pAction->getParameter(1)->getInt(); - if (counterNdx == 0) { - counterNdx = allocateCounter(pAction->getParameter(1)->getString()); - pAction->getParameter(1)->friend_setInt(counterNdx); - } - if (millisecondTimer) { - Real value = pAction->getParameter(0)->getReal(); - if (!add) - value = -value; + DEBUG_ASSERTCRASH(pAction->getNumParameters() >= 2, ("Not enough parameters.")); + Int counterNdx = pAction->getParameter(1)->getInt(); + if (counterNdx == 0) { + counterNdx = allocateCounter(pAction->getParameter(1)->getString()); + pAction->getParameter(1)->friend_setInt(counterNdx); + } + + if (millisecondTimer) { + Real value = pAction->getParameter(0)->getReal(); + if (!add) + value = -value; + #if defined(GENERALS_ONLINE_HIGH_FPS_SERVER) - const int LEGACY_FPS_INT = BaseFps; - m_counters[counterNdx].value += REAL_TO_INT_CEIL(value * (Real)LEGACY_FPS_INT); + const int LEGACY_FPS_INT = BaseFps; + Int delta = REAL_TO_INT_CEIL(value * (Real)LEGACY_FPS_INT); #else - m_counters[counterNdx].value += REAL_TO_INT_CEIL(ConvertDurationFromMsecsToFrames(value * 1000)); + Int delta = REAL_TO_INT_CEIL(ConvertDurationFromMsecsToFrames(value * 1000)); #endif - } - else { - Int value = pAction->getParameter(0)->getInt(); - if (!add) - value = -value; - m_counters[counterNdx].value += value; - } + + if (g_isLegacyCounter[counterNdx]) { + if (g_cachedLegacyFrameAdvanced) { + m_counters[counterNdx].value += delta; + } + } else { + m_counters[counterNdx].value += delta; + } + } + else { + Int value = pAction->getParameter(0)->getInt(); + if (!add) + value = -value; + + if (g_isLegacyCounter[counterNdx]) { + if (g_cachedLegacyFrameAdvanced) { + m_counters[counterNdx].value += value; + } + } else { + m_counters[counterNdx].value += value; + } + } } //-------------------------------------------------------------------------------------------------