From c994c6febb6b5f24799577eba845d1fd734c9d32 Mon Sep 17 00:00:00 2001 From: Helmut Buhler Date: Sat, 25 Oct 2025 12:03:22 +0200 Subject: [PATCH 1/6] Simplify RecorderClass::replayMatchesGameVersion a bit --- .../GameEngine/Source/Common/Recorder.cpp | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp b/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp index b59813da06..f3fa57e5b6 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp @@ -1136,18 +1136,17 @@ Bool RecorderClass::replayMatchesGameVersion(AsciiString filename) Bool RecorderClass::replayMatchesGameVersion(const ReplayHeader& header) { - Bool versionStringDiff = header.versionString != TheVersion->getUnicodeVersion(); - Bool versionTimeStringDiff = header.versionTimeString != TheVersion->getUnicodeBuildTime(); - Bool versionNumberDiff = header.versionNumber != TheVersion->getVersionNumber(); - Bool exeCRCDiff = header.exeCRC != TheGlobalData->m_exeCRC; - Bool exeDifferent = versionStringDiff || versionTimeStringDiff || versionNumberDiff || exeCRCDiff; - Bool iniDifferent = header.iniCRC != TheGlobalData->m_iniCRC; - - if(exeDifferent || iniDifferent) - { - return FALSE; - } - return TRUE; + if (header.versionString != TheVersion->getUnicodeVersion()) + return false; + if (header.versionTimeString != TheVersion->getUnicodeBuildTime()) + return false; + if (header.versionNumber != TheVersion->getVersionNumber()) + return false; + if (header.exeCRC != TheGlobalData->m_exeCRC) + return false; + if (header.iniCRC != TheGlobalData->m_iniCRC) + return false; + return true; } /** From 1d97452833cd517c656e391e19235201add0cbba Mon Sep 17 00:00:00 2001 From: Helmut Buhler Date: Sat, 25 Oct 2025 12:06:23 +0200 Subject: [PATCH 2/6] Don't compare versionTimeString in RecorderClass::replayMatchesGameVersion --- GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp b/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp index f3fa57e5b6..eea85e7f6f 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp @@ -1138,8 +1138,11 @@ Bool RecorderClass::replayMatchesGameVersion(const ReplayHeader& header) { if (header.versionString != TheVersion->getUnicodeVersion()) return false; - if (header.versionTimeString != TheVersion->getUnicodeBuildTime()) - return false; + + // TheSuperHackers @fix Don't check build time. Otherwise SH build will show warning when opening + // retail replays, even though it's compatible. + //if (header.versionTimeString != TheVersion->getUnicodeBuildTime()) + // return false; if (header.versionNumber != TheVersion->getVersionNumber()) return false; if (header.exeCRC != TheGlobalData->m_exeCRC) From b7d7c1ab12f18f09b60e8d0b117c012ac0f16e34 Mon Sep 17 00:00:00 2001 From: Helmut Buhler Date: Sat, 25 Oct 2025 12:10:18 +0200 Subject: [PATCH 3/6] Simplify isCrcCompatible calculation in ReplayMenu --- .../Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp index 16e68dea3f..b751b69c92 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp @@ -274,11 +274,7 @@ void PopulateReplayFileListbox(GameWindow *listbox) const Bool hasMap = mapData != NULL; - const Bool isCrcCompatible = - header.versionString == TheVersion->getUnicodeVersion() - && header.versionNumber == TheVersion->getVersionNumber() - && header.exeCRC == TheGlobalData->m_exeCRC - && header.iniCRC == TheGlobalData->m_iniCRC; + const Bool isCrcCompatible = RecorderClass::replayMatchesGameVersion(header); if (isCrcCompatible) { From ed329796fe9b9f948329a3a3c92c3efc67e697a4 Mon Sep 17 00:00:00 2001 From: Helmut Buhler Date: Mon, 3 Nov 2025 21:35:01 +0100 Subject: [PATCH 4/6] Remove commented code --- GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp b/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp index eea85e7f6f..d0e9685f5a 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp @@ -1138,11 +1138,6 @@ Bool RecorderClass::replayMatchesGameVersion(const ReplayHeader& header) { if (header.versionString != TheVersion->getUnicodeVersion()) return false; - - // TheSuperHackers @fix Don't check build time. Otherwise SH build will show warning when opening - // retail replays, even though it's compatible. - //if (header.versionTimeString != TheVersion->getUnicodeBuildTime()) - // return false; if (header.versionNumber != TheVersion->getVersionNumber()) return false; if (header.exeCRC != TheGlobalData->m_exeCRC) From b89b612245a432bda62f34521a4da21bdca65c7c Mon Sep 17 00:00:00 2001 From: Helmut Buhler Date: Mon, 3 Nov 2025 21:36:19 +0100 Subject: [PATCH 5/6] Add comment --- GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp b/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp index d0e9685f5a..6550e39882 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/Recorder.cpp @@ -1136,6 +1136,7 @@ Bool RecorderClass::replayMatchesGameVersion(AsciiString filename) Bool RecorderClass::replayMatchesGameVersion(const ReplayHeader& header) { + // TheSuperHackers @fix No longer checks the build time here to prevent incorrect Replay playback incompatibility messages when the Replay playback would actually be technically compatible. if (header.versionString != TheVersion->getUnicodeVersion()) return false; if (header.versionNumber != TheVersion->getVersionNumber()) From 802036d9c2ceb498b4c78b93307289cb88265516 Mon Sep 17 00:00:00 2001 From: Helmut Buhler Date: Mon, 3 Nov 2025 21:37:43 +0100 Subject: [PATCH 6/6] Synced with Generals --- .../GameEngine/Source/Common/Recorder.cpp | 22 +++++++++---------- .../GUI/GUICallbacks/Menus/ReplayMenu.cpp | 6 +---- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/Generals/Code/GameEngine/Source/Common/Recorder.cpp b/Generals/Code/GameEngine/Source/Common/Recorder.cpp index b7a6df6e41..7fbb5bf2e5 100644 --- a/Generals/Code/GameEngine/Source/Common/Recorder.cpp +++ b/Generals/Code/GameEngine/Source/Common/Recorder.cpp @@ -1133,18 +1133,16 @@ Bool RecorderClass::replayMatchesGameVersion(AsciiString filename) Bool RecorderClass::replayMatchesGameVersion(const ReplayHeader& header) { - Bool versionStringDiff = header.versionString != TheVersion->getUnicodeVersion(); - Bool versionTimeStringDiff = header.versionTimeString != TheVersion->getUnicodeBuildTime(); - Bool versionNumberDiff = header.versionNumber != TheVersion->getVersionNumber(); - Bool exeCRCDiff = header.exeCRC != TheGlobalData->m_exeCRC; - Bool exeDifferent = versionStringDiff || versionTimeStringDiff || versionNumberDiff || exeCRCDiff; - Bool iniDifferent = header.iniCRC != TheGlobalData->m_iniCRC; - - if(exeDifferent || iniDifferent) - { - return FALSE; - } - return TRUE; + // TheSuperHackers @fix No longer checks the build time here to prevent incorrect Replay playback incompatibility messages when the Replay playback would actually be technically compatible. + if (header.versionString != TheVersion->getUnicodeVersion()) + return false; + if (header.versionNumber != TheVersion->getVersionNumber()) + return false; + if (header.exeCRC != TheGlobalData->m_exeCRC) + return false; + if (header.iniCRC != TheGlobalData->m_iniCRC) + return false; + return true; } /** diff --git a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp index 21e62db7f3..20a2decdfa 100644 --- a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/ReplayMenu.cpp @@ -274,11 +274,7 @@ void PopulateReplayFileListbox(GameWindow *listbox) const Bool hasMap = mapData != NULL; - const Bool isCrcCompatible = - header.versionString == TheVersion->getUnicodeVersion() - && header.versionNumber == TheVersion->getVersionNumber() - && header.exeCRC == TheGlobalData->m_exeCRC - && header.iniCRC == TheGlobalData->m_iniCRC; + const Bool isCrcCompatible = RecorderClass::replayMatchesGameVersion(header); if (isCrcCompatible) {