From d4a9532ee68b139d7fa66bb32c97571a1afa01ce Mon Sep 17 00:00:00 2001 From: guerringuerrin Date: Fri, 20 Mar 2026 15:46:25 -0300 Subject: [PATCH] Add support for opening the most recent replay summary Add getLastReplayMetadata() to get metadata of the most recent replay, or null if unavailable Add showLastGameSummary() to show the last game summary using metadata from getLastReplayMetadata() Add a default hotkey --- binaries/data/config/default.cfg | 1 + .../public/gui/common/functions_utility.js | 49 +++++++++++++++++++ .../mods/public/gui/gamesetup/gamesetup.js | 1 + .../mods/public/gui/hotkeys/spec/engine.json | 4 ++ binaries/data/mods/public/gui/lobby/lobby.js | 1 + 5 files changed, 56 insertions(+) diff --git a/binaries/data/config/default.cfg b/binaries/data/config/default.cfg index 590c5b549c..2a735e1228 100644 --- a/binaries/data/config/default.cfg +++ b/binaries/data/config/default.cfg @@ -229,6 +229,7 @@ mousegrabtoggle = F3 ; Toggle mouse grabbing mode ; > DIALOG HOTKEYS summary = "Ctrl+Tab" ; Toggle in-game summary +lastsummary = "Alt+Shift+S" ; Show the last game summary lobby = "Alt+L" ; Show the multiplayer lobby in a dialog window. structree = "Alt+Shift+T" ; Show structure tree civinfo = "Alt+Shift+H" ; Show civilization info diff --git a/binaries/data/mods/public/gui/common/functions_utility.js b/binaries/data/mods/public/gui/common/functions_utility.js index ed20d03bc2..f83145f226 100644 --- a/binaries/data/mods/public/gui/common/functions_utility.js +++ b/binaries/data/mods/public/gui/common/functions_utility.js @@ -315,6 +315,7 @@ function formatXmppAnnouncement(subject, text) return message; } + /** * Converts underscore-separated identifiers to PascalCase class names * for selecting entities by identity class. @@ -326,6 +327,7 @@ function toPascalCase(str) .map(s => s.charAt(0).toUpperCase() + s.slice(1)) .join(''); } + /** * Registers global hotkeys for opening GUI pages. * @@ -344,4 +346,51 @@ function registerGlobalGuiPageHotkeys(hotkeys) } Engine.SetGlobalHotkey(key, "Press", () => Engine.OpenChildPage(`page_${key}.xml`)); } +} + +/* + * Get metadata of the most recent replay, or null if unavailable. + */ +function getLastReplayMetadata() +{ + const replays = Engine.GetReplays(false); + if (!replays.length) + return null; + + const lastReplay = replays.reduce((a, b) => + a.attribs.timestamp > b.attribs.timestamp ? a : b + ); + + const simData = Engine.GetReplayMetadata(lastReplay.directory); + if (!simData) + return null; + + return { + "simData": simData, + "directory": lastReplay.directory + }; +} + +/* + * Show the last game summary using metadata from getLastReplayMetadata() + */ +function showLastGameSummary() +{ + const data = getLastReplayMetadata(); + + if (!data) + { + messageBox(500, 200, translate("No summary data available."), translate("Error")); + return; + } + + Engine.OpenChildPage("page_summary.xml", { + "sim": data.simData, + "gui": { + "replayDirectory": data.directory, + "isInLobby": true, + "ingame": false, + "dialog": true + } + }); } \ No newline at end of file diff --git a/binaries/data/mods/public/gui/gamesetup/gamesetup.js b/binaries/data/mods/public/gui/gamesetup/gamesetup.js index af1f86e869..d9855c0770 100644 --- a/binaries/data/mods/public/gui/gamesetup/gamesetup.js +++ b/binaries/data/mods/public/gui/gamesetup/gamesetup.js @@ -44,6 +44,7 @@ var g_SetupWindow; function init(initData, hotloadData) { registerGlobalGuiPageHotkeys(["options", "hotkeys", "civinfo", "structree", "catafalque", "manual", "tips"]); + Engine.SetGlobalHotkey("lastsummary", "Press", () => showLastGameSummary()); return Promise.race([new Promise(closePageCallback => { g_SetupWindow = new SetupWindow(initData, hotloadData, closePageCallback); diff --git a/binaries/data/mods/public/gui/hotkeys/spec/engine.json b/binaries/data/mods/public/gui/hotkeys/spec/engine.json index 4906530b04..867224abd0 100644 --- a/binaries/data/mods/public/gui/hotkeys/spec/engine.json +++ b/binaries/data/mods/public/gui/hotkeys/spec/engine.json @@ -138,6 +138,10 @@ "options": { "name": "Open Options window", "desc": "Open Options window." + }, + "lastsummary": { + "name": "Open last game summary", + "desc": "Open last game summary." } } } diff --git a/binaries/data/mods/public/gui/lobby/lobby.js b/binaries/data/mods/public/gui/lobby/lobby.js index 208c81e9cf..82817a98e7 100644 --- a/binaries/data/mods/public/gui/lobby/lobby.js +++ b/binaries/data/mods/public/gui/lobby/lobby.js @@ -37,6 +37,7 @@ async function init(attribs) return new Promise(closePageCallback => { registerGlobalGuiPageHotkeys(["options", "hotkeys", "civinfo", "structree", "catafalque", "mapbrowser", "manual", "tips"]); + Engine.SetGlobalHotkey("lastsummary", "Press", () => showLastGameSummary()); g_LobbyHandler = new LobbyHandler(closePageCallback, attribs && attribs.dialog); });