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 9cb4b86965..137062659e 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 77800e749a..209a93b81a 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 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 58e2183df2..492b172dfb 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 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 cbfee81c6c..133ddf9b0f 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