From 2e123ee6fcdccd2a908b9e707d99705fd5024d5c Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Tue, 17 Feb 2026 21:57:38 +0100 Subject: [PATCH 1/4] Fixed incorrect seed value for restarted skirmish games (multiplayer maps). --- .../GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp index 58e2183df2a..492b172dfbf 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp @@ -200,6 +200,11 @@ static void restartMissionMenu() Int gameMode = TheGameLogic->getGameMode(); AsciiString mapName = TheGlobalData->m_mapName; + // TheSuperHackers @bugfix Caball009 07/02/2026 Reuse the previous seed value for the new skirmish match to prevent mismatches. + // Campaign, challenge, and skirmish single-player scenarios all use GAME_SINGLE_PLAYER and are expected to use 0 as seed value. + DEBUG_ASSERTCRASH((TheSkirmishGameInfo != nullptr) == (gameMode == GAME_SKIRMISH), ("Unexpected game mode on map / mission restart")); + const UnsignedInt seed = TheSkirmishGameInfo ? TheSkirmishGameInfo->getSeed() : 0; + // // if the map name was from a save game it will have "Save/" at the front of it, // we want to go back to the original pristine map string for the map name when restarting @@ -238,11 +243,8 @@ static void restartMissionMenu() TheScriptEngine->getGlobalDifficulty(), rankPointsStartedWith) ); - //if (TheGlobalData->m_fixedSeed >= 0) - //InitRandom(TheGlobalData->m_fixedSeed); - InitRandom(0); - //else - // InitGameLogicRandom(GameClientRandomValue(0, INT_MAX - 1)); + + InitRandom(seed); } //TheTransitionHandler->remove("QuitFull"); //KRISMORNESS ADD //quitMenuLayout = nullptr; //KRISMORNESS ADD From 096d62132f29ba4f3d4a451397cbd0c4e3d5cf1b Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Tue, 17 Feb 2026 21:58:19 +0100 Subject: [PATCH 2/4] Fixed incorrect seed value for newly started skirmish games (singleplayer maps). --- .../GUI/GUICallbacks/Menus/SkirmishGameOptionsMenu.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/SkirmishGameOptionsMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/SkirmishGameOptionsMenu.cpp index cbfee81c6ce..133ddf9b0fd 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/SkirmishGameOptionsMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/SkirmishGameOptionsMenu.cpp @@ -431,7 +431,6 @@ void reallyDoStart( void ) TheWritableGlobalData->m_mapName = TheSkirmishGameInfo->getMap(); TheSkirmishGameInfo->startGame(0); - InitGameLogicRandom(TheSkirmishGameInfo->getSeed()); Bool isSkirmish = TRUE; const MapMetaData *md = TheMapCache->findMap(TheSkirmishGameInfo->getMap()); @@ -442,6 +441,8 @@ void reallyDoStart( void ) if (isSkirmish) { + InitGameLogicRandom(TheSkirmishGameInfo->getSeed()); + GameMessage *msg = TheMessageStream->appendMessage( GameMessage::MSG_NEW_GAME ); msg->appendIntegerArgument(GAME_SKIRMISH); msg->appendIntegerArgument(DIFFICULTY_NORMAL); // not really used; just specified so we can add the game speed last @@ -450,6 +451,8 @@ void reallyDoStart( void ) } else { + InitGameLogicRandom(0); + GameMessage *msg = TheMessageStream->appendMessage( GameMessage::MSG_NEW_GAME ); msg->appendIntegerArgument(GAME_SINGLE_PLAYER); msg->appendIntegerArgument(DIFFICULTY_NORMAL); // not really used; just specified so we can add the game speed last From 00bddf4cc6bcbb5525b7e10ffb60ea157de4f331 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Tue, 17 Feb 2026 22:26:09 +0100 Subject: [PATCH 3/4] Replicated in Generals. --- .../GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp | 12 +++++++----- .../GUICallbacks/Menus/SkirmishGameOptionsMenu.cpp | 5 ++++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp index 9cb4b869650..137062659e1 100644 --- a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp @@ -200,6 +200,11 @@ static void restartMissionMenu() Int gameMode = TheGameLogic->getGameMode(); AsciiString mapName = TheGlobalData->m_mapName; + // TheSuperHackers @bugfix Caball009 07/02/2026 Reuse the previous seed value for the new skirmish match to prevent mismatches. + // Campaign, challenge, and skirmish single-player scenarios all use GAME_SINGLE_PLAYER and are expected to use 0 as seed value. + DEBUG_ASSERTCRASH((TheSkirmishGameInfo != nullptr) == (gameMode == GAME_SKIRMISH), ("Unexpected game mode on map / mission restart")); + const UnsignedInt seed = TheSkirmishGameInfo ? TheSkirmishGameInfo->getSeed() : 0; + // // if the map name was from a save game it will have "Save/" at the front of it, // we want to go back to the original pristine map string for the map name when restarting @@ -238,11 +243,8 @@ static void restartMissionMenu() TheScriptEngine->getGlobalDifficulty(), rankPointsStartedWith) ); - //if (TheGlobalData->m_fixedSeed >= 0) - //InitRandom(TheGlobalData->m_fixedSeed); - InitRandom(0); - //else - // InitGameLogicRandom(GameClientRandomValue(0, INT_MAX - 1)); + + InitRandom(seed); } //TheTransitionHandler->remove("QuitFull"); //KRISMORNESS ADD //quitMenuLayout = nullptr; //KRISMORNESS ADD diff --git a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/SkirmishGameOptionsMenu.cpp b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/SkirmishGameOptionsMenu.cpp index 77800e749ae..209a93b81a1 100644 --- a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/SkirmishGameOptionsMenu.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/SkirmishGameOptionsMenu.cpp @@ -420,7 +420,6 @@ void reallyDoStart( void ) TheWritableGlobalData->m_mapName = TheSkirmishGameInfo->getMap(); TheSkirmishGameInfo->startGame(0); - InitGameLogicRandom(TheSkirmishGameInfo->getSeed()); Bool isSkirmish = TRUE; const MapMetaData *md = TheMapCache->findMap(TheSkirmishGameInfo->getMap()); @@ -431,6 +430,8 @@ void reallyDoStart( void ) if (isSkirmish) { + InitGameLogicRandom(TheSkirmishGameInfo->getSeed()); + GameMessage *msg = TheMessageStream->appendMessage( GameMessage::MSG_NEW_GAME ); msg->appendIntegerArgument(GAME_SKIRMISH); msg->appendIntegerArgument(DIFFICULTY_NORMAL); // not really used; just specified so we can add the game speed last @@ -439,6 +440,8 @@ void reallyDoStart( void ) } else { + InitGameLogicRandom(0); + GameMessage *msg = TheMessageStream->appendMessage( GameMessage::MSG_NEW_GAME ); msg->appendIntegerArgument(GAME_SINGLE_PLAYER); msg->appendIntegerArgument(DIFFICULTY_NORMAL); // not really used; just specified so we can add the game speed last From c7bd0e9dd38cf6a8925c06ca22e88971246a7833 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Sat, 21 Feb 2026 22:35:11 +0100 Subject: [PATCH 4/4] Stored temporary seed value as signed integer. --- .../Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp | 2 +- .../Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp index 137062659e1..e9d1f7267c5 100644 --- a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp @@ -203,7 +203,7 @@ static void restartMissionMenu() // TheSuperHackers @bugfix Caball009 07/02/2026 Reuse the previous seed value for the new skirmish match to prevent mismatches. // Campaign, challenge, and skirmish single-player scenarios all use GAME_SINGLE_PLAYER and are expected to use 0 as seed value. DEBUG_ASSERTCRASH((TheSkirmishGameInfo != nullptr) == (gameMode == GAME_SKIRMISH), ("Unexpected game mode on map / mission restart")); - const UnsignedInt seed = TheSkirmishGameInfo ? TheSkirmishGameInfo->getSeed() : 0; + const Int seed = TheSkirmishGameInfo ? TheSkirmishGameInfo->getSeed() : 0; // // if the map name was from a save game it will have "Save/" at the front of it, diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp index 492b172dfbf..fc0c4520266 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/QuitMenu.cpp @@ -203,7 +203,7 @@ static void restartMissionMenu() // TheSuperHackers @bugfix Caball009 07/02/2026 Reuse the previous seed value for the new skirmish match to prevent mismatches. // Campaign, challenge, and skirmish single-player scenarios all use GAME_SINGLE_PLAYER and are expected to use 0 as seed value. DEBUG_ASSERTCRASH((TheSkirmishGameInfo != nullptr) == (gameMode == GAME_SKIRMISH), ("Unexpected game mode on map / mission restart")); - const UnsignedInt seed = TheSkirmishGameInfo ? TheSkirmishGameInfo->getSeed() : 0; + const Int seed = TheSkirmishGameInfo ? TheSkirmishGameInfo->getSeed() : 0; // // if the map name was from a save game it will have "Save/" at the front of it,