Ticket #4020: 4020_altf4_v2.1.patch

File 4020_altf4_v2.1.patch, 7.2 KB (added by Imarok, 8 years ago)

Applied elexis' remarks

  • binaries/data/mods/public/gui/common/functions_global_object.js

     
    165165
    166166    setTimeout(displayGamestateNotifications, 1000);
    167167}
     168
     169/*
     170 * The simData is used for the summary and as replay metadata
     171 */
     172function getSimData()
     173{
     174    let extendedSimState = Engine.GuiInterfaceCall("GetExtendedSimulationState");
     175    return {
     176        "timeElapsed" : extendedSimState.timeElapsed,
     177        "playerStates": extendedSimState.players,
     178        "mapSettings": Engine.GetInitAttributes().settings
     179    };
     180}
  • binaries/data/mods/public/gui/session/session.js

     
    517517 */
    518518function leaveGame(willRejoin)
    519519{
    520     let extendedSimState = Engine.GuiInterfaceCall("GetExtendedSimulationState");
    521     let simData = {
    522         "timeElapsed" : extendedSimState.timeElapsed,
    523         "playerStates": extendedSimState.players,
    524         "mapSettings": g_GameAttributes.settings
    525     };
    526 
    527     if (!g_IsReplay)
    528         Engine.SaveReplayMetadata(JSON.stringify(simData));
    529 
    530520    if (!willRejoin &&
    531         simData.playerStates[Engine.GetPlayerID()] &&
    532         simData.playerStates[Engine.GetPlayerID()].state == "active")
     521        g_Players[Engine.GetPlayerID()] &&
     522        g_Players[Engine.GetPlayerID()].state == "active")
    533523        resignGame(true);
    534524
    535525    // Before ending the game
    536526    let replayDirectory = Engine.GetCurrentReplayDirectory();
    537527
     528    let simData = getSimData();
     529
    538530    Engine.EndGame();
    539531
    540532    if (g_IsController && Engine.HasXmppClient())
  • binaries/data/mods/public/gui/structree/structree.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22
    33<objects>
     4    <script file="gui/common/functions_global_object.js"/>
    45    <script file="gui/common/functions_civinfo.js"/>
    56    <script file="gui/common/functions_utility.js"/>
    67    <script file="gui/common/tooltips.js"/>
  • source/ps/GameSetup/GameSetup.cpp

     
    7878#include "ps/UserReport.h"
    7979#include "ps/Util.h"
    8080#include "ps/VideoMode.h"
     81#include "ps/VisualReplay.h"
    8182#include "ps/World.h"
    8283
    8384#include "renderer/Renderer.h"
     
    701702
    702703void EndGame()
    703704{
     705    if (g_Game != NULL && !g_Game->IsVisualReplay())
     706        VisualReplay::SaveReplayMetadata(g_GUI->GetActiveGUI()->GetScriptInterface().get());
     707
    704708    SAFE_DELETE(g_NetClient);
    705709    SAFE_DELETE(g_NetServer);
    706710    SAFE_DELETE(g_Game);
  • source/ps/scripting/JSInterface_VisualReplay.cpp

     
    5353    return VisualReplay::GetReplayMetadata(pCxPrivate, directoryName);
    5454}
    5555
    56 void JSI_VisualReplay::SaveReplayMetadata(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const CStrW& data)
    57 {
    58     VisualReplay::SaveReplayMetadata(data);
    59 }
    60 
    6156void JSI_VisualReplay::RegisterScriptFunctions(ScriptInterface& scriptInterface)
    6257{
    6358    scriptInterface.RegisterFunction<JS::Value, &GetReplays>("GetReplays");
     
    6661    scriptInterface.RegisterFunction<JS::Value, CStrW, &GetReplayAttributes>("GetReplayAttributes");
    6762    scriptInterface.RegisterFunction<JS::Value, CStrW, &GetReplayMetadata>("GetReplayMetadata");
    6863    scriptInterface.RegisterFunction<bool, CStrW, &HasReplayMetadata>("HasReplayMetadata");
    69     scriptInterface.RegisterFunction<void, CStrW, &SaveReplayMetadata>("SaveReplayMetadata");
    7064}
  • source/ps/scripting/JSInterface_VisualReplay.h

     
    1 /* Copyright (C) 2015 Wildfire Games.
     1/* Copyright (C) 2016 Wildfire Games.
    22 * This file is part of 0 A.D.
    33 *
    44 * 0 A.D. is free software: you can redistribute it and/or modify
     
    2929    JS::Value GetReplayAttributes(ScriptInterface::CxPrivate* pCxPrivate, const CStrW& directoryName);
    3030    bool HasReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate, const CStrW& directoryName);
    3131    JS::Value GetReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate, const CStrW& directoryName);
    32     void SaveReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate, const CStrW& data);
    3332    void RegisterScriptFunctions(ScriptInterface& scriptInterface);
    3433}
    3534
  • source/ps/VisualReplay.cpp

     
    134134 *
    135135 * @return seconds or -1 on error
    136136 */
    137 inline int getReplayDuration(std::istream *replayStream, const CStr& fileName, const u64& fileSize)
     137inline int getReplayDuration(std::istream* replayStream, const CStr& fileName, const u64& fileSize)
    138138{
    139139    CStr type;
    140140
     
    292292    return attribs;
    293293}
    294294
    295 // TODO: enhancement: how to save the data if the process is killed? (case SDL_QUIT in main.cpp)
    296 void VisualReplay::SaveReplayMetadata(const CStrW& data)
     295void VisualReplay::SaveReplayMetadata(ScriptInterface* scriptInterface)
    297296{
    298     // TODO: enhancement: use JS::HandleValue similar to SaveGame
    299297    if (!g_Game)
    300298        return;
     299   
     300    JSContext* cx = scriptInterface->GetContext();
     301    JSAutoRequest rq(cx);
    301302
     303    JS::RootedValue data(cx);
     304    JS::RootedValue global(cx, scriptInterface->GetGlobalObject());
     305
     306    if (!scriptInterface->CallFunction(global, "getSimData", &data))
     307    {
     308        LOGERROR("Could not save replay metadata");
     309        return;
     310    }
     311
    302312    // Get the directory of the currently active replay
    303313    const OsPath fileName = g_Game->GetReplayLogger().GetDirectory() / L"metadata.json";
    304314    CreateDirectories(fileName.Parent(), 0700);
    305315
    306316    std::ofstream stream (fileName.string8().c_str(), std::ofstream::out | std::ofstream::trunc);
    307     stream << utf8_from_wstring(data);
     317    stream << scriptInterface->StringifyJSON(&data, false);
    308318    stream.close();
     319    debug_printf("Saved replay metadata to %s\n", fileName.string8().c_str());
    309320}
    310321
    311322bool VisualReplay::HasReplayMetadata(const CStrW& directoryName)
  • source/ps/VisualReplay.h

     
    1 /* Copyright (C) 2015 Wildfire Games.
     1/* Copyright (C) 2016 Wildfire Games.
    22 * This file is part of 0 A.D.
    33 *
    44 * 0 A.D. is free software: you can redistribute it and/or modify
     
    8181/**
    8282 * Saves the metadata from the session to metadata.json
    8383 */
    84 void SaveReplayMetadata(const CStrW& data);
     84void SaveReplayMetadata(ScriptInterface* scriptInterface);
    8585
    8686}
    8787