diff --git a/source/ps/GameSetup/GameSetup.cpp b/source/ps/GameSetup/GameSetup.cpp index ba02e8047e..121bf9ac3e 100644 --- a/source/ps/GameSetup/GameSetup.cpp +++ b/source/ps/GameSetup/GameSetup.cpp @@ -1485,8 +1485,7 @@ bool AutostartVisualReplay(const std::string& replayFile) // TODO: Non progressive load can fail - need a decent way to handle this LDR_NonprogressiveLoad(); - PSRETURN ret = g_Game->ReallyStartGame(); - ENSURE(ret == PSRETURN_OK); + ENSURE(g_Game->ReallyStartGame() == PSRETURN_OK); ScriptInterface& scriptInterface = g_Game->GetSimulation2()->GetScriptInterface(); diff --git a/source/ps/VisualReplay.cpp b/source/ps/VisualReplay.cpp index 6e4767f8b0..7cbd34e320 100644 --- a/source/ps/VisualReplay.cpp +++ b/source/ps/VisualReplay.cpp @@ -22,6 +22,8 @@ #include "gui/GUIManager.h" #include "lib/allocators/shared_ptr.h" #include "lib/utf8.h" +#include "network/NetClient.h" +#include "network/NetServer.h" #include "ps/CLogger.h" #include "ps/Filesystem.h" #include "ps/Game.h" @@ -44,6 +46,21 @@ OsPath VisualReplay::GetDirectoryName() return OsPath(psLogDir() / L"sim_log"); } +void VisualReplay::StartVisualReplay(CStrW directory) +{ + ENSURE(!g_NetServer); + ENSURE(!g_NetClient); + ENSURE(!g_Game); + + const OsPath replayFile = VisualReplay::GetDirectoryName() / directory / L"commands.txt"; + + if (!FileExists(replayFile)) + return; + + g_Game = new CGame(false, false); + g_Game->StartVisualReplay(replayFile.string8()); +} + JS::Value VisualReplay::GetReplays(ScriptInterface& scriptInterface) { TIMER(L"GetReplays"); @@ -129,7 +146,7 @@ inline int getReplayDuration(std::istream *replayStream, const CStr& fileName, c if (!replayStream->good()) { - LOGERROR("Read error when determining replay duration at %i of %lu in %s", currentPosition - 2, fileSize, fileName.c_str()); + LOGERROR("Read error when determining replay duration at %i of %llu in %s", currentPosition - 2, fileSize, fileName.c_str()); return -1; } @@ -155,7 +172,7 @@ JS::Value VisualReplay::LoadReplayData(ScriptInterface& scriptInterface, OsPath& const OsPath replayFile = GetDirectoryName() / directory / L"commands.txt"; if (debugParser) - debug_printf("Opening %s\n", utf8_from_wstring(replayFile.string()).c_str()); + debug_printf("Opening %s\n", replayFile.string8().c_str()); if (!FileExists(replayFile)) return JSVAL_NULL; @@ -170,8 +187,7 @@ JS::Value VisualReplay::LoadReplayData(ScriptInterface& scriptInterface, OsPath& return JSVAL_NULL; // Open file - // TODO: enhancement: support unicode when OsString() is properly implemented for windows - const CStr fileName = utf8_from_wstring(replayFile.string()); + const CStr fileName = replayFile.string8(); std::ifstream* replayStream = new std::ifstream(fileName.c_str()); // File must begin with "start" @@ -255,7 +271,7 @@ JS::Value VisualReplay::GetReplayAttributes(ScriptInterface::CxPrivate* pCxPriva return attribs; // Open file - std::istream* replayStream = new std::ifstream(utf8_from_wstring(replayFile.string()).c_str()); + std::istream* replayStream = new std::ifstream(replayFile.string8().c_str()); CStr type, line; ENSURE((*replayStream >> type).good() && type == "start"); @@ -298,7 +314,7 @@ JS::Value VisualReplay::GetReplayMetadata(ScriptInterface::CxPrivate* pCxPrivate CStr line; std::getline(*stream, line); stream->close(); - delete stream; + SAFE_DELETE(stream); pCxPrivate->pScriptInterface->ParseJSON(line, &metadata); return metadata; diff --git a/source/ps/VisualReplay.h b/source/ps/VisualReplay.h index 89b25721ad..bf873fd82a 100644 --- a/source/ps/VisualReplay.h +++ b/source/ps/VisualReplay.h @@ -36,6 +36,11 @@ namespace VisualReplay */ OsPath GetDirectoryName(); +/** + * Replays the commands.txt file in the given subdirectory visually. + */ +void StartVisualReplay(CStrW directory); + /** * Get a list of replays to display in the GUI. * diff --git a/source/ps/scripting/JSInterface_VisualReplay.cpp b/source/ps/scripting/JSInterface_VisualReplay.cpp index 0eac7c2ded..d3ca1797f9 100644 --- a/source/ps/scripting/JSInterface_VisualReplay.cpp +++ b/source/ps/scripting/JSInterface_VisualReplay.cpp @@ -17,26 +17,12 @@ #include "precompiled.h" -#include "network/NetClient.h" -#include "network/NetServer.h" -#include "ps/Filesystem.h" -#include "ps/Game.h" #include "ps/VisualReplay.h" #include "ps/scripting/JSInterface_VisualReplay.h" void JSI_VisualReplay::StartVisualReplay(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), CStrW directory) { - ENSURE(!g_NetServer); - ENSURE(!g_NetClient); - ENSURE(!g_Game); - - const OsPath replayFile = VisualReplay::GetDirectoryName() / directory / L"commands.txt"; - if (FileExists(replayFile)) - { - g_Game = new CGame(false, false); - // TODO: support unicode when OsString() is implemented for windows - g_Game->StartVisualReplay(utf8_from_wstring(replayFile.string())); - } + VisualReplay::StartVisualReplay(directory); } bool JSI_VisualReplay::DeleteReplay(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), CStrW replayFile)