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 | |
| 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
| -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); | 
