Remove Engine.SwitchGuiPage from campaigns

This commit is contained in:
phosit 2025-08-09 14:52:08 +02:00
parent 434a1a1905
commit 76b6725272
No known key found for this signature in database
GPG key ID: C9430B600671C268
4 changed files with 86 additions and 54 deletions

View file

@ -6,7 +6,7 @@
*/
class CampaignMenu extends AutoWatcher
{
constructor(campaignRun)
constructor(campaignRun, closePageCallback)
{
super("render");
@ -16,17 +16,20 @@ class CampaignMenu extends AutoWatcher
this.levelSelection = Engine.GetGUIObjectByName("levelSelection");
this.levelSelection.onSelectionChange = () => { this.selectedLevel = this.levelSelection.selected; };
this.levelSelection.onMouseLeftDoubleClickItem = () => this.startScenario();
Engine.GetGUIObjectByName('startButton').onPress = () => this.startScenario();
Engine.GetGUIObjectByName('backToMain').onPress = () => this.goBackToMainMenu();
Engine.GetGUIObjectByName('savedGamesButton').onPress = this.loadSavegame.bind(this);
const startScenarioCallback = this.startScenario.bind(this, closePageCallback);
this.levelSelection.onMouseLeftDoubleClickItem = startScenarioCallback;
Engine.GetGUIObjectByName('startButton').onPress = startScenarioCallback;
Engine.GetGUIObjectByName('backToMain').onPress =
this.goBackToMainMenu.bind(this, closePageCallback);
Engine.GetGUIObjectByName('savedGamesButton').onPress =
this.loadSavegame.bind(this, closePageCallback);
this.mapCache = new MapCache();
this._ready = true;
}
async loadSavegame()
async loadSavegame(closePageCallback)
{
const gameId = await Engine.OpenChildPage(
'page_loadgame.xml',
@ -44,27 +47,29 @@ class CampaignMenu extends AutoWatcher
return;
}
Engine.SwitchGuiPage("page_loading.xml", {
"attribs": metadata.initAttributes,
"playerAssignments": {
"local": {
"name":
metadata.initAttributes.settings.PlayerData[metadata.playerID]?.Name ??
singleplayerName(),
"player": metadata.playerID
}
},
"savedGUIData": metadata.gui
});
closePageCallback({ [Engine.openRequest]: {
"page": "page_loading.xml",
"argument": {
"attribs": metadata.initAttributes,
"playerAssignments": {
"local": {
"name": metadata.initAttributes.settings.PlayerData[metadata.playerID]
?.Name ?? singleplayerName(),
"player": metadata.playerID
}
},
"savedGUIData": metadata.gui
}
} });
}
goBackToMainMenu()
goBackToMainMenu(closePageCallback)
{
this.run.save();
Engine.SwitchGuiPage("page_pregame.xml", {});
closePageCallback({ [Engine.openRequest]: { "page": "page_pregame.xml" } });
}
startScenario()
startScenario(closePageCallback)
{
const level = this.getSelectedLevelData();
if (!meetsRequirements(this.run, level))
@ -113,23 +118,29 @@ class CampaignMenu extends AutoWatcher
},
};
Engine.SwitchGuiPage("page_gamesetup.xml", {
"backPage": {
"page": this.run.getMenuPath(),
"data": {
"filename": this.run.filename
}
},
"gameSettings": attributes,
});
closePageCallback({ [Engine.openRequest]: {
"page": "page_gamesetup.xml",
"argument": {
"backPage": {
"page": this.run.getMenuPath(),
"data": {
"filename": this.run.filename
}
},
"gameSettings": attributes,
}
} });
return;
}
gameSettings.launchGame(assignments, true);
Engine.SwitchGuiPage("page_loading.xml", {
"attribs": gameSettings.finalizedAttributes,
"playerAssignments": assignments
});
closePageCallback({ [Engine.openRequest]: {
"page": "page_loading.xml",
"argument": {
"attribs": gameSettings.finalizedAttributes,
"playerAssignments": assignments
}
} });
}
getSelectedLevelData()
@ -234,7 +245,7 @@ class CampaignMenu extends AutoWatcher
var g_CampaignMenu;
function init(initData)
async function init(initData)
{
let run = initData?.filename || CampaignRun.getCurrentRunFilename();
try
@ -242,11 +253,14 @@ function init(initData)
run = new CampaignRun(run).load();
if (!run.isCurrent())
run.setCurrent();
g_CampaignMenu = new CampaignMenu(run);
return new Promise(closePageCallback =>
{
g_CampaignMenu = new CampaignMenu(run, closePageCallback);
});
}
catch(err)
{
error(sprintf("Error loading campaign run %s: %s.", CampaignRun.getCurrentRunFilename(), err));
Engine.SwitchGuiPage("page_pregame.xml", {});
return { [Engine.openRequest]: { "page": "page_pregame.xml" } };
}
}

View file

@ -32,14 +32,16 @@ class BrokenRun
*/
class LoadModal extends AutoWatcher
{
constructor(campaignTemplate)
constructor(closePageCallback)
{
super("render");
// _watch so render() is called anytime currentRuns are modified.
this.currentRuns = _watch(this.getRuns(), () => this.render());
Engine.GetGUIObjectByName('cancelButton').onPress = () => Engine.SwitchGuiPage("page_pregame.xml", {});
Engine.GetGUIObjectByName('cancelButton').onPress = closePageCallback.bind(undefined, {
[Engine.openRequest]: { "page": "page_pregame.xml" }
});
Engine.GetGUIObjectByName('deleteGameButton').onPress = () => this.deleteSelectedRun();
Engine.GetGUIObjectByName('startButton').onPress = () => this.startSelectedRun();
@ -81,16 +83,19 @@ class LoadModal extends AutoWatcher
return out;
}
loadCampaign()
loadCampaign(closePageCallback)
{
const filename = this.currentRuns[this.selectedRun].filename;
const run = new CampaignRun(filename)
.load()
.setCurrent();
Engine.SwitchGuiPage(run.getMenuPath(), {
"filename": run.filename
});
closePageCallback({ [Engine.openRequest]: {
"page": run.getMenuPath(),
"argument": {
"filename": run.filename
}
} });
}
async deleteSelectedRun()
@ -112,10 +117,10 @@ class LoadModal extends AutoWatcher
this.selectedRun = -1;
}
startSelectedRun()
startSelectedRun(closePageCallback)
{
if (this.currentRuns[this.selectedRun] instanceof CampaignRun)
this.loadCampaign();
this.loadCampaign(closePageCallback);
}
displayCurrentRuns()
@ -138,5 +143,5 @@ var g_LoadModal;
function init()
{
g_LoadModal = new LoadModal();
return new Promise(closePageCallback => { g_LoadModal = new LoadModal(closePageCallback); });
}

View file

@ -10,7 +10,8 @@ class NewCampaignModal
this.template = campaignTemplate;
Engine.GetGUIObjectByName('cancelButton').onPress = closePageCallback;
Engine.GetGUIObjectByName('startButton').onPress = () => this.createAndStartCampaign();
Engine.GetGUIObjectByName('startButton').onPress =
this.createAndStartCampaign.bind(this, closePageCallback);
Engine.GetGUIObjectByName('runDescription').caption = translateWithContext("Campaign Template", this.template.Name);
Engine.GetGUIObjectByName('runDescription').onTextEdit = () =>
{
@ -19,7 +20,7 @@ class NewCampaignModal
Engine.GetGUIObjectByName('runDescription').focus();
}
createAndStartCampaign()
createAndStartCampaign(closePageCallback)
{
const filename = this.template.identifier + "_" + Date.now() + "_" + Math.floor(Math.random()*100000);
const run = new CampaignRun(filename)
@ -28,8 +29,11 @@ class NewCampaignModal
.save()
.setCurrent();
Engine.SwitchGuiPage(run.getMenuPath(), {
"filename": run.filename
closePageCallback({
"page": run.getMenuPath(),
"argument": {
"filename": run.filename
}
});
}
}

View file

@ -4,15 +4,21 @@
*/
class CampaignSetupPage extends AutoWatcher
{
constructor()
constructor(closePageCallback)
{
super("render");
this.selectedIndex = -1;
this.templates = CampaignTemplate.getAvailableTemplates();
Engine.GetGUIObjectByName("mainMenuButton").onPress = () => Engine.SwitchGuiPage("page_pregame.xml");
Engine.GetGUIObjectByName("startCampButton").onPress = () => Engine.OpenChildPage("campaigns/new_modal/page.xml", this.selectedTemplate);
Engine.GetGUIObjectByName("mainMenuButton").onPress = closePageCallback.bind(undefined,
{ [Engine.openRequest]: { "page": "page_pregame.xml" } });
Engine.GetGUIObjectByName("startCampButton").onPress = async() =>
{
const ret = await Engine.OpenChildPage("campaigns/new_modal/page.xml", this.selectedTemplate);
if (ret !== undefined)
closePageCallback({ [Engine.openRequest]: ret });
};
this.campaignSelection = Engine.GetGUIObjectByName("campaignSelection");
this.campaignSelection.onMouseLeftDoubleClickItem = () =>
@ -69,5 +75,8 @@ var g_CampaignSetupPage;
function init()
{
g_CampaignSetupPage = new CampaignSetupPage();
return new Promise(closePageCallback =>
{
g_CampaignSetupPage = new CampaignSetupPage(closePageCallback);
});
}