From a57bfc829eb986dfb01d2b6271563c87d5dea23e Mon Sep 17 00:00:00 2001 From: elexis Date: Thu, 14 Apr 2016 14:45:03 +0000 Subject: [PATCH] Add a button to the summary screen to replay the game that was just played (or replayed). Patch by Imarok, fixes #3437. This was SVN commit r18031. --- .../public/gui/replaymenu/replay_actions.js | 1 + .../data/mods/public/gui/session/session.js | 2 ++ .../data/mods/public/gui/summary/summary.js | 21 +++++++++++++++++++ .../data/mods/public/gui/summary/summary.xml | 21 +++++++++++++++++++ source/gui/scripting/ScriptFunctions.cpp | 12 +++++++++++ source/ps/Game.h | 3 +++ 6 files changed, 60 insertions(+) diff --git a/binaries/data/mods/public/gui/replaymenu/replay_actions.js b/binaries/data/mods/public/gui/replaymenu/replay_actions.js index b97da46518..26f5d9c276 100644 --- a/binaries/data/mods/public/gui/replaymenu/replay_actions.js +++ b/binaries/data/mods/public/gui/replaymenu/replay_actions.js @@ -79,6 +79,7 @@ function showReplaySummary() // Open summary screen summary.isReplay = true; summary.gameResult = translate("Scores at the end of the game."); + summary.replayDirectory = g_ReplaysFiltered[selected].directory; Engine.SwitchGuiPage("page_summary.xml", summary); } diff --git a/binaries/data/mods/public/gui/session/session.js b/binaries/data/mods/public/gui/session/session.js index f5eda4b26e..f192856e72 100644 --- a/binaries/data/mods/public/gui/session/session.js +++ b/binaries/data/mods/public/gui/session/session.js @@ -472,6 +472,8 @@ function leaveGame(willRejoin) if (!g_IsReplay) Engine.SaveReplayMetadata(JSON.stringify(summary)); + summary.replayDirectory = Engine.GetCurrentReplayDirectory(); + Engine.EndGame(); if (g_IsController && Engine.HasXmppClient()) diff --git a/binaries/data/mods/public/gui/summary/summary.js b/binaries/data/mods/public/gui/summary/summary.js index a02be0b949..bc01cdeac6 100644 --- a/binaries/data/mods/public/gui/summary/summary.js +++ b/binaries/data/mods/public/gui/summary/summary.js @@ -129,6 +129,26 @@ function updatePanelData(panelInfo) teamCounterFn(panelInfo.counters); } +function startReplay() +{ + if (Engine.HasXmppClient()) + Engine.StopXmppClient(); + + Engine.StartVisualReplay(g_GameData.replayDirectory); + Engine.SwitchGuiPage("page_loading.xml", { + "attribs": Engine.GetReplayAttributes(g_GameData.replayDirectory), + "isNetworked" : false, + "playerAssignments": { + "local" : { + "name": translate("You"), + "player": -1 + } + }, + "savedGUIData": "", + "isReplay" : true + }); +} + function init(data) { updateObjectPlayerPosition(); @@ -139,6 +159,7 @@ function init(data) Engine.GetGUIObjectByName("timeElapsed").caption = sprintf(translate("Game time elapsed: %(time)s"), { "time": timeToString(data.timeElapsed) }); Engine.GetGUIObjectByName("summaryText").caption = data.gameResult; Engine.GetGUIObjectByName("mapName").caption = sprintf(translate("%(mapName)s - %(mapType)s"), { "mapName": translate(data.mapSettings.Name), "mapType": mapSize ? mapSize.LongName : (mapType ? mapType.Title : "") }); + Engine.GetGUIObjectByName("replayButton").hidden = g_GameData.isInGame || !g_GameData.replayDirectory; // Panels g_PlayerCount = data.playerStates.length - 1; diff --git a/binaries/data/mods/public/gui/summary/summary.xml b/binaries/data/mods/public/gui/summary/summary.xml index 4ef3b7bc9e..577a138f78 100644 --- a/binaries/data/mods/public/gui/summary/summary.xml +++ b/binaries/data/mods/public/gui/summary/summary.xml @@ -157,6 +157,27 @@ + + Replay + + + + Continue IsVisualReplay() : false; } +std::wstring GetCurrentReplayDirectory(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) +{ + if (!g_Game) + return std::wstring(); + + return g_Game->IsVisualReplay() ? + OsPath(g_Game->GetReplayPath()).Parent().Filename().string() : + g_Game->GetReplayLogger().GetDirectory().Filename().string(); +} + int GetPlayerID(ScriptInterface::CxPrivate* UNUSED(pCxPrivate)) { if (g_Game) @@ -1049,6 +1060,7 @@ void GuiScriptingInit(ScriptInterface& scriptInterface) // Misc functions scriptInterface.RegisterFunction("SetCursor"); scriptInterface.RegisterFunction("IsVisualReplay"); + scriptInterface.RegisterFunction("GetCurrentReplayDirectory"); scriptInterface.RegisterFunction("GetPlayerID"); scriptInterface.RegisterFunction("SetPlayerID"); scriptInterface.RegisterFunction("SetViewedPlayer"); diff --git a/source/ps/Game.h b/source/ps/Game.h index 25f19c4e0f..33e1c15199 100644 --- a/source/ps/Game.h +++ b/source/ps/Game.h @@ -161,6 +161,9 @@ public: inline float GetSimRate() const { return m_SimRate; } + inline std::string GetReplayPath() const + { return m_ReplayPath; } + /** * Replace the current turn manager. * This class will take ownership of the pointer.