1
0
forked from 0ad/0ad

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.
This commit is contained in:
elexis 2016-04-14 14:45:03 +00:00
parent f4bfe7c3ad
commit a57bfc829e
6 changed files with 60 additions and 0 deletions

View File

@ -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);
}

View File

@ -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())

View File

@ -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;

View File

@ -157,6 +157,27 @@
</object>
</object>
<object type="button" name="replayButton" style="ModernButtonRed" size="100%-310 100%-48 100%-170 100%-20">
<translatableAttribute id="caption">Replay</translatableAttribute>
<action on="Press"><![CDATA[
if (g_GameData.isInGame)
return;
if (Engine.HasXmppClient())
messageBox(
400, 200,
translate("Are you sure you want to quit the lobby?"),
translate("Confirmation"),
0,
[translate("No"), translate("Yes")],
[null, startReplay]
);
else
startReplay();
]]>
</action>
</object>
<object type="button" style="ModernButtonRed" size="100%-160 100%-48 100%-20 100%-20">
<translatableAttribute id="caption">Continue</translatableAttribute>
<action on="Press"><![CDATA[

View File

@ -50,6 +50,7 @@
#include "ps/Hotkey.h"
#include "ps/ProfileViewer.h"
#include "ps/Pyrogenesis.h"
#include "ps/Replay.h"
#include "ps/SavedGame.h"
#include "ps/UserReport.h"
#include "ps/World.h"
@ -207,6 +208,16 @@ bool IsVisualReplay(ScriptInterface::CxPrivate* UNUSED(pCxPrivate))
return g_Game ? g_Game->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<std::wstring, std::wstring, &SetCursor>("SetCursor");
scriptInterface.RegisterFunction<bool, &IsVisualReplay>("IsVisualReplay");
scriptInterface.RegisterFunction<std::wstring, &GetCurrentReplayDirectory>("GetCurrentReplayDirectory");
scriptInterface.RegisterFunction<int, &GetPlayerID>("GetPlayerID");
scriptInterface.RegisterFunction<void, int, &SetPlayerID>("SetPlayerID");
scriptInterface.RegisterFunction<void, int, &SetViewedPlayer>("SetViewedPlayer");

View File

@ -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.