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:
parent
3a2b418c0e
commit
7470e88624
@ -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
|
||||
};
|
||||
}
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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"/>
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
@ -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");
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user