diff options
author | Scott Thomas | 2018-11-03 22:56:02 +1030 |
---|---|---|
committer | David Turner | 2018-11-03 15:15:32 +0000 |
commit | 75c6f2fd609b16d6f122bee8cd7a04e7a300f325 (patch) | |
tree | 955ac9df6577404feec28d7e0787cb61aac6329b /engines/groovie | |
parent | 0c340485e01e0c18634a496d145841afb2ac2536 (diff) | |
download | scummvm-rg350-75c6f2fd609b16d6f122bee8cd7a04e7a300f325.tar.gz scummvm-rg350-75c6f2fd609b16d6f122bee8cd7a04e7a300f325.tar.bz2 scummvm-rg350-75c6f2fd609b16d6f122bee8cd7a04e7a300f325.zip |
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.
Diffstat (limited to 'engines/groovie')
-rw-r--r-- | engines/groovie/groovie.cpp | 2 | ||||
-rw-r--r-- | engines/groovie/script.cpp | 15 | ||||
-rw-r--r-- | engines/groovie/script.h | 1 |
3 files changed, 16 insertions, 2 deletions
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); |