Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/source/ps/SavedGame.cpp
Show First 20 Lines • Show All 73 Lines • ▼ Show 20 Lines | Status SavedGames::Save(const CStrW& name, const CStrW& description, CSimulation2& simulation, const shared_ptr<ScriptInterface::StructuredClone>& guiMetadataClone) | ||||
time_t now = time(NULL); | time_t now = time(NULL); | ||||
// Construct the serialized state to be saved | // Construct the serialized state to be saved | ||||
std::stringstream simStateStream; | std::stringstream simStateStream; | ||||
if (!simulation.SerializeState(simStateStream)) | if (!simulation.SerializeState(simStateStream)) | ||||
WARN_RETURN(ERR::FAIL); | WARN_RETURN(ERR::FAIL); | ||||
JS::RootedValue metadata(cx); | |||||
JS::RootedValue initAttributes(cx, simulation.GetInitAttributes()); | JS::RootedValue initAttributes(cx, simulation.GetInitAttributes()); | ||||
JS::RootedValue mods(cx, Mod::GetLoadedModsWithVersions(simulation.GetScriptInterface())); | JS::RootedValue mods(cx, Mod::GetLoadedModsWithVersions(simulation.GetScriptInterface())); | ||||
simulation.GetScriptInterface().Eval("({})", &metadata); | |||||
simulation.GetScriptInterface().SetProperty(metadata, "engine_version", std::string(engine_version)); | JS::RootedValue metadata(cx); | ||||
simulation.GetScriptInterface().SetProperty(metadata, "mods", mods); | |||||
simulation.GetScriptInterface().SetProperty(metadata, "time", (double)now); | simulation.GetScriptInterface().CreateObject( | ||||
simulation.GetScriptInterface().SetProperty(metadata, "playerID", g_Game->GetPlayerID()); | &metadata, | ||||
simulation.GetScriptInterface().SetProperty(metadata, "initAttributes", initAttributes); | "engine_version", std::string(engine_version), | ||||
"time", static_cast<double>(now), | |||||
"playerID", g_Game->GetPlayerID(), | |||||
"mods", mods, | |||||
"initAttributes", initAttributes); | |||||
JS::RootedValue guiMetadata(cx); | JS::RootedValue guiMetadata(cx); | ||||
simulation.GetScriptInterface().ReadStructuredClone(guiMetadataClone, &guiMetadata); | simulation.GetScriptInterface().ReadStructuredClone(guiMetadataClone, &guiMetadata); | ||||
// get some camera data | // get some camera data | ||||
JS::RootedValue cameraMetadata(cx); | |||||
simulation.GetScriptInterface().Eval("({})", &cameraMetadata); | |||||
const CVector3D cameraPosition = g_Game->GetView()->GetCameraPosition(); | const CVector3D cameraPosition = g_Game->GetView()->GetCameraPosition(); | ||||
simulation.GetScriptInterface().SetProperty(cameraMetadata, "PosX", cameraPosition.X); | |||||
simulation.GetScriptInterface().SetProperty(cameraMetadata, "PosY", cameraPosition.Y); | |||||
simulation.GetScriptInterface().SetProperty(cameraMetadata, "PosZ", cameraPosition.Z); | |||||
const CVector3D cameraRotation = g_Game->GetView()->GetCameraRotation(); | const CVector3D cameraRotation = g_Game->GetView()->GetCameraRotation(); | ||||
simulation.GetScriptInterface().SetProperty(cameraMetadata, "RotX", cameraRotation.X); | |||||
simulation.GetScriptInterface().SetProperty(cameraMetadata, "RotY", cameraRotation.Y); | JS::RootedValue cameraMetadata(cx); | ||||
simulation.GetScriptInterface().SetProperty(cameraMetadata, "Zoom", g_Game->GetView()->GetCameraZoom()); | |||||
simulation.GetScriptInterface().CreateObject( | |||||
&cameraMetadata, | |||||
"PosX", cameraPosition.X, | |||||
"PosY", cameraPosition.Y, | |||||
"PosZ", cameraPosition.Z, | |||||
"RotX", cameraRotation.X, | |||||
"RotY", cameraRotation.Y, | |||||
"Zoom", g_Game->GetView()->GetCameraZoom()); | |||||
simulation.GetScriptInterface().SetProperty(guiMetadata, "camera", cameraMetadata); | simulation.GetScriptInterface().SetProperty(guiMetadata, "camera", cameraMetadata); | ||||
simulation.GetScriptInterface().SetProperty(metadata, "gui", guiMetadata); | |||||
simulation.GetScriptInterface().SetProperty(metadata, "gui", guiMetadata); | |||||
simulation.GetScriptInterface().SetProperty(metadata, "description", description); | simulation.GetScriptInterface().SetProperty(metadata, "description", description); | ||||
std::string metadataString = simulation.GetScriptInterface().StringifyJSON(&metadata, true); | std::string metadataString = simulation.GetScriptInterface().StringifyJSON(&metadata, true); | ||||
// Write the saved game as zip file containing the various components | // Write the saved game as zip file containing the various components | ||||
PIArchiveWriter archiveWriter = CreateArchiveWriter_Zip(tempSaveFileRealPath, false); | PIArchiveWriter archiveWriter = CreateArchiveWriter_Zip(tempSaveFileRealPath, false); | ||||
if (!archiveWriter) | if (!archiveWriter) | ||||
WARN_RETURN(ERR::FAIL); | WARN_RETURN(ERR::FAIL); | ||||
▲ Show 20 Lines • Show All 103 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
JS::Value SavedGames::GetSavedGames(const ScriptInterface& scriptInterface) | JS::Value SavedGames::GetSavedGames(const ScriptInterface& scriptInterface) | ||||
{ | { | ||||
TIMER(L"GetSavedGames"); | TIMER(L"GetSavedGames"); | ||||
JSContext* cx = scriptInterface.GetContext(); | JSContext* cx = scriptInterface.GetContext(); | ||||
JSAutoRequest rq(cx); | JSAutoRequest rq(cx); | ||||
JS::RootedObject games(cx, JS_NewArrayObject(cx, 0)); | JS::RootedValue games(cx); | ||||
scriptInterface.CreateArray(&games); | |||||
Status err; | Status err; | ||||
VfsPaths pathnames; | VfsPaths pathnames; | ||||
err = vfs::GetPathnames(g_VFS, "saves/", L"*.0adsave", pathnames); | err = vfs::GetPathnames(g_VFS, "saves/", L"*.0adsave", pathnames); | ||||
WARN_IF_ERR(err); | WARN_IF_ERR(err); | ||||
for (size_t i = 0; i < pathnames.size(); ++i) | for (size_t i = 0; i < pathnames.size(); ++i) | ||||
Show All 19 Lines | for (size_t i = 0; i < pathnames.size(); ++i) | ||||
if (err < 0) | if (err < 0) | ||||
{ | { | ||||
DEBUG_WARN_ERR(err); | DEBUG_WARN_ERR(err); | ||||
continue; // skip this file | continue; // skip this file | ||||
} | } | ||||
JS::RootedValue metadata(cx, loader.GetMetadata()); | JS::RootedValue metadata(cx, loader.GetMetadata()); | ||||
JS::RootedValue game(cx); | JS::RootedValue game(cx); | ||||
scriptInterface.Eval("({})", &game); | scriptInterface.CreateObject( | ||||
scriptInterface.SetProperty(game, "id", pathnames[i].Basename()); | &game, | ||||
scriptInterface.SetProperty(game, "metadata", metadata); | "id", pathnames[i].Basename(), | ||||
JS_SetElement(cx, games, i, game); | "metadata", metadata); | ||||
scriptInterface.SetPropertyInt(games, i, game); | |||||
} | } | ||||
return JS::ObjectValue(*games); | return games; | ||||
} | } | ||||
bool SavedGames::DeleteSavedGame(const std::wstring& name) | bool SavedGames::DeleteSavedGame(const std::wstring& name) | ||||
{ | { | ||||
const VfsPath basename(L"saves/" + name); | const VfsPath basename(L"saves/" + name); | ||||
const VfsPath filename = basename.ChangeExtension(L".0adsave"); | const VfsPath filename = basename.ChangeExtension(L".0adsave"); | ||||
OsPath realpath; | OsPath realpath; | ||||
Show All 15 Lines |
Wildfire Games · Phabricator