aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorScott Thomas2018-11-03 22:56:02 +1030
committerDavid Turner2018-11-03 15:15:32 +0000
commit75c6f2fd609b16d6f122bee8cd7a04e7a300f325 (patch)
tree955ac9df6577404feec28d7e0787cb61aac6329b /engines
parent0c340485e01e0c18634a496d145841afb2ac2536 (diff)
downloadscummvm-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')
-rw-r--r--engines/groovie/groovie.cpp2
-rw-r--r--engines/groovie/script.cpp15
-rw-r--r--engines/groovie/script.h1
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);