From 75c6f2fd609b16d6f122bee8cd7a04e7a300f325 Mon Sep 17 00:00:00 2001 From: Scott Thomas Date: Sat, 3 Nov 2018 22:56:02 +1030 Subject: GROOVIE: Fix GMM loads, block saves in a puzzle Loading and returning from subscripts alters the _variables used, thus are not guaranteed to create a valid save state. Loading a save should be valid at any time, as long as the active script being run is restored to the base game script. --- engines/groovie/groovie.cpp | 2 +- engines/groovie/script.cpp | 15 ++++++++++++++- engines/groovie/script.h | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) (limited to 'engines') diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp index 672c440e44..8edbb2947d 100644 --- a/engines/groovie/groovie.cpp +++ b/engines/groovie/groovie.cpp @@ -382,7 +382,7 @@ bool GroovieEngine::canLoadGameStateCurrently() { bool GroovieEngine::canSaveGameStateCurrently() { // TODO: verify the engine has been initialized if (_script) - return true; + return _script->canDirectSave(); else return false; } diff --git a/engines/groovie/script.cpp b/engines/groovie/script.cpp index 3ba3d5d78a..b68c41831e 100644 --- a/engines/groovie/script.cpp +++ b/engines/groovie/script.cpp @@ -175,7 +175,15 @@ void Script::directGameLoad(int slot) { return; } - // TODO: Return to the main script, likely reusing most of o_returnscript() + // Return to the main script if required + if (_savedCode) { + // Returning the correct spot, dealing with _savedVariables, etc + // is not needed as game state is getting nuked anyway + delete[] _code; + _code = _savedCode; + _codeSize = _savedCodeSize; + _savedCode = nullptr; + } // HACK: We set the slot to load in the appropriate variable, and set the // current instruction to the one that actually loads the saved game @@ -396,6 +404,11 @@ void Script::loadgame(uint slot) { _vm->_grvCursorMan->show(false); } +bool Script::canDirectSave() const { + // Disallow when running a subscript + return _savedCode == nullptr; +} + void Script::directGameSave(int slot, const Common::String &desc) { if (slot < 0 || slot > MAX_SAVES - 1) { return; diff --git a/engines/groovie/script.h b/engines/groovie/script.h index a70a59d66f..7ecb166583 100644 --- a/engines/groovie/script.h +++ b/engines/groovie/script.h @@ -61,6 +61,7 @@ public: bool loadScript(Common::String scriptfile); void directGameLoad(int slot); void directGameSave(int slot, const Common::String &desc); + bool canDirectSave() const; void step(); void setMouseClick(uint8 button); -- cgit v1.2.3