From 05d434830fe10ba9093c1a5f8fbae03a863a44bb Mon Sep 17 00:00:00 2001 From: Vantha Date: Wed, 11 Mar 2026 16:32:30 +0100 Subject: [PATCH] Add hotloading support to the tutorial UI --- .../data/mods/public/gui/session/session.js | 3 +- .../gui/session/tutorial/TutorialManager.js | 42 ++++++++++++++++--- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/binaries/data/mods/public/gui/session/session.js b/binaries/data/mods/public/gui/session/session.js index 66b95176b0..102127cd89 100644 --- a/binaries/data/mods/public/gui/session/session.js +++ b/binaries/data/mods/public/gui/session/session.js @@ -345,7 +345,7 @@ async function init(initData, hotloadData) g_NetworkStatusOverlay = new NetworkStatusOverlay(closePageCallback); g_QuitConfirmationDefeat = new QuitConfirmationDefeat(closePageCallback); g_QuitConfirmationReplay = new QuitConfirmationReplay(closePageCallback); - g_TutorialManager = new TutorialManager(closePageCallback); + g_TutorialManager = new TutorialManager(closePageCallback, hotloadData?.tutorial); })]); // TODO: use event instead @@ -610,6 +610,7 @@ function getHotloadData() "selection": g_Selection.selected, "playerAssignments": g_PlayerAssignments, "player": g_Players, + "tutorial": g_TutorialManager.getHotloadData() }; } diff --git a/binaries/data/mods/public/gui/session/tutorial/TutorialManager.js b/binaries/data/mods/public/gui/session/tutorial/TutorialManager.js index dac31d92e9..e8187301ac 100644 --- a/binaries/data/mods/public/gui/session/tutorial/TutorialManager.js +++ b/binaries/data/mods/public/gui/session/tutorial/TutorialManager.js @@ -13,24 +13,38 @@ class TutorialManager { parentObj = Engine.GetGUIObjectByName("tutorialPanels"); - panels = new Map(); - pendingSteps = []; + panels = new Map([ + [TUTORIAL_STEP_TYPE.INSTRUCTION, new InstructionPanel(this.continue.bind(this))], + [TUTORIAL_STEP_TYPE.INFO, new InfoPanel(this.continue.bind(this))] + ]); + + displayedSteps = []; // All steps that have already been displayed, in the form of [stepType, panelData] + pendingSteps = []; // All received steps that have yet to be displayed, in the form of [stepType, panelData] activePanel; + currentWarning = ""; isFinished = false; closePageCallback; - constructor(closePageCallback) + constructor(closePageCallback, hotloadData) { this.closePageCallback = closePageCallback; - this.panels.set(TUTORIAL_STEP_TYPE.INSTRUCTION, new InstructionPanel(this.continue.bind(this))); - this.panels.set(TUTORIAL_STEP_TYPE.INFO, new InfoPanel(this.continue.bind(this))); this.parentObj.hidden = true; + + if (hotloadData) + { + for (const [stepType, panelData] of hotloadData.displayedSteps) + this.displayStep(stepType, panelData); + + this.pendingSteps = hotloadData.pendingSteps; + if (hotloadData.warning) + this.displayWarning(hotloadData.warning); + } } toggleVisibility() { - this.parentObj.hidden = !this.activePanel || !this.parentObj.hidden; + this.parentObj.hidden = !this.displayedSteps.length || !this.parentObj.hidden; } handleNotification(notification) @@ -70,6 +84,7 @@ class TutorialManager displayWarning(warning) { + this.currentWarning = warning; this.activePanel.displayWarning(translate(warning)); } @@ -80,6 +95,9 @@ class TutorialManager displayStep(stepType, panelData) { + if (this.isFinished) + return; + this.parentObj.hidden = false; this.isFinished = panelData.isLast; @@ -102,6 +120,9 @@ class TutorialManager this.panels.forEach((panel, type) => panel.setVisible(type == stepType)); this.activePanel = this.panels.get(stepType); this.activePanel.displayStep(panelData); + + this.displayedSteps.push([stepType, panelData]); + this.currentWarning = ""; } continue() @@ -113,4 +134,13 @@ class TutorialManager else Engine.PostNetworkCommand({ "type": "dialog-answer", "tutorial": "continue" }); } + + getHotloadData() + { + return { + "displayedSteps": this.displayedSteps, + "pendingSteps": this.pendingSteps, + "warning": this.currentWarning + }; + } }