1
0
forked from 0ad/0ad

Always save the replay metadata (summary screen info) when ending the application. Patch by Imarok, fixes #4020.

This was SVN commit r18613.
This commit is contained in:
elexis 2016-08-17 15:17:43 +00:00
parent 3a2b418c0e
commit 7470e88624
8 changed files with 38 additions and 29 deletions

View File

@ -165,3 +165,16 @@ function displayGamestateNotifications()
setTimeout(displayGamestateNotifications, 1000);
}
/**
* Also called from the C++ side when ending the game.
*/
function getReplayMetadata()
{
let extendedSimState = Engine.GuiInterfaceCall("GetExtendedSimulationState");
return {
"timeElapsed" : extendedSimState.timeElapsed,
"playerStates": extendedSimState.players,
"mapSettings": Engine.GetInitAttributes().settings
};
}

View File

@ -517,23 +517,12 @@ function resignGame(leaveGameAfterResign)
*/
function leaveGame(willRejoin)
{
let extendedSimState = Engine.GuiInterfaceCall("GetExtendedSimulationState");
let simData = {
"timeElapsed" : extendedSimState.timeElapsed,
"playerStates": extendedSimState.players,
"mapSettings": g_GameAttributes.settings
};
if (!g_IsReplay)
Engine.SaveReplayMetadata(JSON.stringify(simData));
if (!willRejoin &&
simData.playerStates[Engine.GetPlayerID()] &&
simData.playerStates[Engine.GetPlayerID()].state == "active")
if (!willRejoin && !g_IsObserver)
resignGame(true);
// Before ending the game
let replayDirectory = Engine.GetCurrentReplayDirectory();
let simData = getReplayMetadata();
Engine.EndGame();

View File

@ -2,6 +2,7 @@
<objects>
<script file="gui/common/functions_civinfo.js"/>
<script file="gui/common/functions_global_object.js"/>
<script file="gui/common/functions_utility.js"/>
<script file="gui/common/tooltips.js"/>
<script file="gui/structree/structree.js"/>

View File

@ -78,6 +78,7 @@
#include "ps/UserReport.h"
#include "ps/Util.h"
#include "ps/VideoMode.h"
#include "ps/VisualReplay.h"
#include "ps/World.h"
#include "renderer/Renderer.h"
@ -701,6 +702,10 @@ static void ShutdownSDL()
void EndGame()
{
if (g_Game && g_Game->IsGameStarted() && !g_Game->IsVisualReplay() &&
g_AtlasGameLoop && !g_AtlasGameLoop->running)
VisualReplay::SaveReplayMetadata(g_GUI->GetActiveGUI()->GetScriptInterface().get());
SAFE_DELETE(g_NetClient);
SAFE_DELETE(g_NetServer);
SAFE_DELETE(g_Game);

View File

@ -134,7 +134,7 @@ inline int goBackToLineBeginning(std::istream* replayStream, const CStr& fileNam
*
* @return seconds or -1 on error
*/
inline int getReplayDuration(std::istream *replayStream, const CStr& fileName, const u64& fileSize)
inline int getReplayDuration(std::istream* replayStream, const CStr& fileName, const u64& fileSize)
{
CStr type;
@ -292,20 +292,28 @@ JS::Value VisualReplay::GetReplayAttributes(ScriptInterface::CxPrivate* pCxPriva
return attribs;
}
// TODO: enhancement: how to save the data if the process is killed? (case SDL_QUIT in main.cpp)
void VisualReplay::SaveReplayMetadata(const CStrW& data)
void VisualReplay::SaveReplayMetadata(ScriptInterface* scriptInterface)
{
// TODO: enhancement: use JS::HandleValue similar to SaveGame
if (!g_Game)
JSContext* cx = scriptInterface->GetContext();
JSAutoRequest rq(cx);
JS::RootedValue metadata(cx);
JS::RootedValue global(cx, scriptInterface->GetGlobalObject());
if (!scriptInterface->CallFunction(global, "getReplayMetadata", &metadata))
{
LOGERROR("Could not save replay metadata!");
return;
}
// Get the directory of the currently active replay
const OsPath fileName = g_Game->GetReplayLogger().GetDirectory() / L"metadata.json";
CreateDirectories(fileName.Parent(), 0700);
std::ofstream stream (fileName.string8().c_str(), std::ofstream::out | std::ofstream::trunc);
stream << utf8_from_wstring(data);
stream << scriptInterface->StringifyJSON(&metadata, false);
stream.close();
debug_printf("Saved replay metadata to %s\n", fileName.string8().c_str());
}
bool VisualReplay::HasReplayMetadata(const CStrW& directoryName)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2015 Wildfire Games.
/* Copyright (C) 2016 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@ -81,7 +81,7 @@ JS::Value GetReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate, const CStrW&
/**
* Saves the metadata from the session to metadata.json
*/
void SaveReplayMetadata(const CStrW& data);
void SaveReplayMetadata(ScriptInterface* scriptInterface);
}

View File

@ -53,11 +53,6 @@ JS::Value JSI_VisualReplay::GetReplayMetadata(ScriptInterface::CxPrivate* pCxPri
return VisualReplay::GetReplayMetadata(pCxPrivate, directoryName);
}
void JSI_VisualReplay::SaveReplayMetadata(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const CStrW& data)
{
VisualReplay::SaveReplayMetadata(data);
}
void JSI_VisualReplay::RegisterScriptFunctions(ScriptInterface& scriptInterface)
{
scriptInterface.RegisterFunction<JS::Value, &GetReplays>("GetReplays");
@ -66,5 +61,4 @@ void JSI_VisualReplay::RegisterScriptFunctions(ScriptInterface& scriptInterface)
scriptInterface.RegisterFunction<JS::Value, CStrW, &GetReplayAttributes>("GetReplayAttributes");
scriptInterface.RegisterFunction<JS::Value, CStrW, &GetReplayMetadata>("GetReplayMetadata");
scriptInterface.RegisterFunction<bool, CStrW, &HasReplayMetadata>("HasReplayMetadata");
scriptInterface.RegisterFunction<void, CStrW, &SaveReplayMetadata>("SaveReplayMetadata");
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2015 Wildfire Games.
/* Copyright (C) 2016 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@ -29,7 +29,6 @@ namespace JSI_VisualReplay
JS::Value GetReplayAttributes(ScriptInterface::CxPrivate* pCxPrivate, const CStrW& directoryName);
bool HasReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate, const CStrW& directoryName);
JS::Value GetReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate, const CStrW& directoryName);
void SaveReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate, const CStrW& data);
void RegisterScriptFunctions(ScriptInterface& scriptInterface);
}