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/3] 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/3] 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/3] 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