aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorNipun Garg2019-07-09 00:21:43 +0530
committerEugene Sandulenko2019-09-03 17:17:15 +0200
commit85a8209d97992572d98a2f4bb20a9b9faa706b0c (patch)
tree821882b775ffcd7855148bd0963d7684b135eb92 /engines
parent961f3b46f0cf1a458a425c576914cfc621bf962d (diff)
downloadscummvm-rg350-85a8209d97992572d98a2f4bb20a9b9faa706b0c.tar.gz
scummvm-rg350-85a8209d97992572d98a2f4bb20a9b9faa706b0c.tar.bz2
scummvm-rg350-85a8209d97992572d98a2f4bb20a9b9faa706b0c.zip
HDB: Add save/load for the Lua Globals environment
Diffstat (limited to 'engines')
-rw-r--r--engines/hdb/hdb.cpp5
-rw-r--r--engines/hdb/lua-script.cpp46
-rw-r--r--engines/hdb/lua-script.h2
3 files changed, 50 insertions, 3 deletions
diff --git a/engines/hdb/hdb.cpp b/engines/hdb/hdb.cpp
index c82c9d67be..3259241517 100644
--- a/engines/hdb/hdb.cpp
+++ b/engines/hdb/hdb.cpp
@@ -435,6 +435,7 @@ bool HDBGame::saveSlot(int slot) {
Common::OutSaveFile *out;
Common::String saveFileName = Common::String::format("%s.%03d", _targetName.c_str(), slot);
+ Common::String saveLuaName = Common::String::format("%s.l.%03d", _targetName.c_str(), slot);
if (!(out = _saveFileMan->openForSaving(saveFileName)))
error("Unable to open save file");
@@ -443,9 +444,7 @@ bool HDBGame::saveSlot(int slot) {
// Actual Save Data
saveGame(out);
-#if 0
- _lua->save(out, saveFileName);
-#endif
+ _lua->save(out, saveLuaName.c_str());
out->finalize();
if (out->err())
diff --git a/engines/hdb/lua-script.cpp b/engines/hdb/lua-script.cpp
index 337496b75b..58f79293cc 100644
--- a/engines/hdb/lua-script.cpp
+++ b/engines/hdb/lua-script.cpp
@@ -144,6 +144,52 @@ void LuaScript::purgeGlobals() {
_globals.clear();
}
+void LuaScript::save(Common::OutSaveFile *out, const char *fName) {
+ out->writeUint32LE(_globals.size());
+
+ // Save Globals
+ for (uint i = 0; i < _globals.size(); i++) {
+ out->write(_globals[i]->global, 32);
+ out->writeSint32LE(_globals[i]->valueOrString);
+ out->writeDoubleLE(_globals[i]->value);
+ out->write(_globals[i]->string, 32);
+ }
+
+ // Delete Lua Save File
+ Common::InSaveFile *inLua = g_system->getSavefileManager()->openForLoading(fName);
+ if (inLua)
+ delete inLua;
+
+ lua_getglobal(_state, "SaveState");
+ lua_pushstring(_state, fName);
+ if (lua_pcall(_state, 0, 0, -2)) {
+ error("An error occured while saving \"%s\": %s.", fName, lua_tostring(_state, -1));
+ lua_pop(_state, -1);
+ }
+}
+
+void LuaScript::loadSaveFile(Common::InSaveFile *in, const char *fName) {
+ // Clear out all globals
+ _globals.clear();
+
+ // Start reading globals
+ _globals.resize(in->readUint32LE());
+ for (uint i = 0; i < _globals.size(); i++) {
+ in->read(_globals[i]->global, 32);
+ _globals[i]->valueOrString = in->readSint32LE();
+ _globals[i]->value = in->readDoubleLE();
+ in->read(_globals[i]->string, 32);
+ }
+
+ lua_getglobal(_state, "LoadState");
+ lua_pushstring(_state, fName);
+ if (lua_pcall(_state, 0, 0, -2)) {
+ error("An error occured while loading \"%s\": %s.", fName, lua_tostring(_state, -1));
+ lua_pop(_state, -1);
+ }
+
+}
+
void LuaScript::setLuaGlobalValue(const char *name, int value) {
if (!_state)
return;
diff --git a/engines/hdb/lua-script.h b/engines/hdb/lua-script.h
index b84a19da7d..22168a94b6 100644
--- a/engines/hdb/lua-script.h
+++ b/engines/hdb/lua-script.h
@@ -59,6 +59,8 @@ public:
void saveGlobalString(const char *global, const char *string);
void loadGlobal(const char *global);
void purgeGlobals();
+ void save(Common::OutSaveFile *out, const char *fName);
+ void loadSaveFile(Common::InSaveFile *in, const char *fName);
bool init();
bool initScript(Common::SeekableReadStream *stream, const char *scriptName, int32 length);