From 9ff42ccae60ef900583110bed3e947de36e5e096 Mon Sep 17 00:00:00 2001 From: Vantha Date: Mon, 23 Mar 2026 23:39:42 +0100 Subject: [PATCH] Fix unresponsiveness after campaign game ends Presumably since 094a7c2268, when a game played as part of a campaign ended (by the player winning or loosing), after closing the victory dialog by pressing "Stay", the session UI became completely unresponsive, so that no buttons could be clicked. The cause for this was that the child page campaigns/default_menu/endgame/page.xml was never closed, so remained invisibly open above the session GUI and blocked all of the inputs. Additionally the Campaign session class tried to close the page_session.xml page, which was not supposed to happen, it was introduced by mistake in 094a7c2268 replacing the logic to close the campaigns/default_menu/endgame/page.xml child page again. --- .../gui/campaigns/default_menu/endgame/endgame.js | 2 ++ .../public/gui/session/campaigns/CampaignSession.js | 7 +++---- binaries/data/mods/public/gui/session/session.js | 11 +++-------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/binaries/data/mods/public/gui/campaigns/default_menu/endgame/endgame.js b/binaries/data/mods/public/gui/campaigns/default_menu/endgame/endgame.js index 113e7ae5b2..32f30805e6 100644 --- a/binaries/data/mods/public/gui/campaigns/default_menu/endgame/endgame.js +++ b/binaries/data/mods/public/gui/campaigns/default_menu/endgame/endgame.js @@ -8,4 +8,6 @@ function init(endGameData) const run = CampaignRun.getCurrentRun(); if (endGameData.won) markLevelComplete(run, endGameData.initData.levelID); + + return Promise.resolve(); } diff --git a/binaries/data/mods/public/gui/session/campaigns/CampaignSession.js b/binaries/data/mods/public/gui/session/campaigns/CampaignSession.js index c2d6238eb6..4d327922e7 100644 --- a/binaries/data/mods/public/gui/session/campaigns/CampaignSession.js +++ b/binaries/data/mods/public/gui/session/campaigns/CampaignSession.js @@ -1,9 +1,9 @@ class CampaignSession { - constructor(data, closePageCallback) + constructor(data) { this.run = new CampaignRun(data.run).load(); - registerPlayersFinishedHandler(this.onFinish.bind(this, closePageCallback)); + registerPlayersFinishedHandler(this.onFinish.bind(this)); this.endGameData = { "won": false, "initData": data, @@ -11,7 +11,7 @@ class CampaignSession }; } - onFinish(closePageCallback, players, won) + onFinish(players, won) { const playerID = Engine.GetPlayerID(); if (players.indexOf(playerID) === -1) @@ -24,7 +24,6 @@ class CampaignSession // Run the endgame script. Engine.OpenChildPage(this.getEndGame(), this.endGameData); - closePageCallback(); } getMenu() diff --git a/binaries/data/mods/public/gui/session/session.js b/binaries/data/mods/public/gui/session/session.js index 587a711ffe..afb7491080 100644 --- a/binaries/data/mods/public/gui/session/session.js +++ b/binaries/data/mods/public/gui/session/session.js @@ -277,11 +277,8 @@ function init(initData, hotloadData) restoreSavedGameData(initData.savedGUIData); } - const promise = new Promise(closePageCallback => - { - if (g_InitAttributes.campaignData) - g_CampaignSession = new CampaignSession(g_InitAttributes.campaignData, closePageCallback); - }); + if (g_InitAttributes.campaignData) + g_CampaignSession = new CampaignSession(g_InitAttributes.campaignData); const mapCache = new MapCache(); g_Cheats = new Cheats(); @@ -345,9 +342,7 @@ function init(initData, hotloadData) setTimeout(displayGamestateNotifications, 1000); - if (g_IsNetworked) - return Promise.race([promise, handleNetMessages()]); - return promise; + return g_IsNetworked ? handleNetMessages() : new Promise(() => {}); } function registerPlayersInitHandler(handler)