Ticket #4020: 4020_altf4_v2.2.patch
File 4020_altf4_v2.2.patch, 7.1 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/gui/common/functions_global_object.js
165 165 166 166 setTimeout(displayGamestateNotifications, 1000); 167 167 } 168 169 /* 170 * Used from C++ code for saving the replay metadata 171 */ 172 function getReplayMetadata() 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
517 517 */ 518 518 function leaveGame(willRejoin) 519 519 { 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 530 if (!willRejoin && 531 simData.playerStates[Engine.GetPlayerID()] && 532 simData.playerStates[Engine.GetPlayerID()].state == "active") 520 if (!willRejoin && !g_IsObserver) 533 521 resignGame(true); 534 522 535 523 // Before ending the game 536 524 let replayDirectory = Engine.GetCurrentReplayDirectory(); 537 525 526 let simData = getReplayMetadata(); 527 538 528 Engine.EndGame(); 539 529 540 530 if (g_IsController && Engine.HasXmppClient()) -
binaries/data/mods/public/gui/structree/structree.xml
1 1 <?xml version="1.0" encoding="utf-8"?> 2 2 3 3 <objects> 4 <script file="gui/common/functions_global_object.js"/> 4 5 <script file="gui/common/functions_civinfo.js"/> 5 6 <script file="gui/common/functions_utility.js"/> 6 7 <script file="gui/common/tooltips.js"/> -
source/ps/GameSetup/GameSetup.cpp
78 78 #include "ps/UserReport.h" 79 79 #include "ps/Util.h" 80 80 #include "ps/VideoMode.h" 81 #include "ps/VisualReplay.h" 81 82 #include "ps/World.h" 82 83 83 84 #include "renderer/Renderer.h" … … 701 702 702 703 void EndGame() 703 704 { 705 if (g_Game != NULL && !g_Game->IsVisualReplay()) 706 VisualReplay::SaveReplayMetadata(g_GUI->GetActiveGUI()->GetScriptInterface().get()); 707 704 708 SAFE_DELETE(g_NetClient); 705 709 SAFE_DELETE(g_NetServer); 706 710 SAFE_DELETE(g_Game); -
source/ps/scripting/JSInterface_VisualReplay.cpp
53 53 return VisualReplay::GetReplayMetadata(pCxPrivate, directoryName); 54 54 } 55 55 56 void JSI_VisualReplay::SaveReplayMetadata(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), const CStrW& data)57 {58 VisualReplay::SaveReplayMetadata(data);59 }60 61 56 void JSI_VisualReplay::RegisterScriptFunctions(ScriptInterface& scriptInterface) 62 57 { 63 58 scriptInterface.RegisterFunction<JS::Value, &GetReplays>("GetReplays"); … … 66 61 scriptInterface.RegisterFunction<JS::Value, CStrW, &GetReplayAttributes>("GetReplayAttributes"); 67 62 scriptInterface.RegisterFunction<JS::Value, CStrW, &GetReplayMetadata>("GetReplayMetadata"); 68 63 scriptInterface.RegisterFunction<bool, CStrW, &HasReplayMetadata>("HasReplayMetadata"); 69 scriptInterface.RegisterFunction<void, CStrW, &SaveReplayMetadata>("SaveReplayMetadata");70 64 } -
source/ps/scripting/JSInterface_VisualReplay.h
1 /* Copyright (C) 201 5Wildfire Games.1 /* Copyright (C) 2016 Wildfire Games. 2 2 * This file is part of 0 A.D. 3 3 * 4 4 * 0 A.D. is free software: you can redistribute it and/or modify … … 29 29 JS::Value GetReplayAttributes(ScriptInterface::CxPrivate* pCxPrivate, const CStrW& directoryName); 30 30 bool HasReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate, const CStrW& directoryName); 31 31 JS::Value GetReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate, const CStrW& directoryName); 32 void SaveReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate, const CStrW& data);33 32 void RegisterScriptFunctions(ScriptInterface& scriptInterface); 34 33 } 35 34 -
source/ps/VisualReplay.cpp
134 134 * 135 135 * @return seconds or -1 on error 136 136 */ 137 inline int getReplayDuration(std::istream *replayStream, const CStr& fileName, const u64& fileSize)137 inline int getReplayDuration(std::istream* replayStream, const CStr& fileName, const u64& fileSize) 138 138 { 139 139 CStr type; 140 140 … … 292 292 return attribs; 293 293 } 294 294 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) 295 void VisualReplay::SaveReplayMetadata(ScriptInterface* scriptInterface) 297 296 { 298 // TODO: enhancement: use JS::HandleValue similar to SaveGame299 297 if (!g_Game) 300 298 return; 299 300 JSContext* cx = scriptInterface->GetContext(); 301 JSAutoRequest rq(cx); 301 302 303 JS::RootedValue data(cx); 304 JS::RootedValue global(cx, scriptInterface->GetGlobalObject()); 305 306 if (!scriptInterface->CallFunction(global, "getReplayMetadata", &data)) 307 { 308 LOGERROR("Could not save replay metadata"); 309 return; 310 } 311 302 312 // Get the directory of the currently active replay 303 313 const OsPath fileName = g_Game->GetReplayLogger().GetDirectory() / L"metadata.json"; 304 314 CreateDirectories(fileName.Parent(), 0700); 305 315 306 316 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); 308 318 stream.close(); 319 debug_printf("Saved replay metadata to %s\n", fileName.string8().c_str()); 309 320 } 310 321 311 322 bool VisualReplay::HasReplayMetadata(const CStrW& directoryName) -
source/ps/VisualReplay.h
1 /* Copyright (C) 201 5Wildfire Games.1 /* Copyright (C) 2016 Wildfire Games. 2 2 * This file is part of 0 A.D. 3 3 * 4 4 * 0 A.D. is free software: you can redistribute it and/or modify … … 81 81 /** 82 82 * Saves the metadata from the session to metadata.json 83 83 */ 84 void SaveReplayMetadata( const CStrW& data);84 void SaveReplayMetadata(ScriptInterface* scriptInterface); 85 85 86 86 } 87 87