diff options
author | Nipun Garg | 2019-07-09 00:21:43 +0530 |
---|---|---|
committer | Eugene Sandulenko | 2019-09-03 17:17:15 +0200 |
commit | 85a8209d97992572d98a2f4bb20a9b9faa706b0c (patch) | |
tree | 821882b775ffcd7855148bd0963d7684b135eb92 /engines | |
parent | 961f3b46f0cf1a458a425c576914cfc621bf962d (diff) | |
download | scummvm-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.cpp | 5 | ||||
-rw-r--r-- | engines/hdb/lua-script.cpp | 46 | ||||
-rw-r--r-- | engines/hdb/lua-script.h | 2 |
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); |