aboutsummaryrefslogtreecommitdiff
path: root/engines/sci
diff options
context:
space:
mode:
authorFilippos Karapetis2010-06-25 17:25:00 +0000
committerFilippos Karapetis2010-06-25 17:25:00 +0000
commitaedc77f0bddcfcd11e465ee29c5fc66973ef9f9b (patch)
treedfd0a5c3e3e93a93a67500b43c69ce5f7e812e83 /engines/sci
parentb6d1b3bc0b2c4e3edbc49a73cb629313eb84c889 (diff)
downloadscummvm-rg350-aedc77f0bddcfcd11e465ee29c5fc66973ef9f9b.tar.gz
scummvm-rg350-aedc77f0bddcfcd11e465ee29c5fc66973ef9f9b.tar.bz2
scummvm-rg350-aedc77f0bddcfcd11e465ee29c5fc66973ef9f9b.zip
When loading a game, stop all running VMs recursively, and also stop kAnimate's current recursion. This fixes the invalid execution stack frame in SQ1, when loading from the death screen after dying from the acid drops in Kerona. This should also fix the invalid hunk pointers, thus the warning about invalid hunk pointers has been turned into an error, as it shouldn't occur anymore
svn-id: r50277
Diffstat (limited to 'engines/sci')
-rw-r--r--engines/sci/engine/seg_manager.cpp2
-rw-r--r--engines/sci/engine/vm.cpp5
-rw-r--r--engines/sci/graphics/animate.cpp5
3 files changed, 11 insertions, 1 deletions
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp
index e011de67d9..d356c9a3fc 100644
--- a/engines/sci/engine/seg_manager.cpp
+++ b/engines/sci/engine/seg_manager.cpp
@@ -454,7 +454,7 @@ byte *SegManager::getHunkPointer(reg_t addr) {
HunkTable *ht = (HunkTable *)getSegment(addr.segment, SEG_TYPE_HUNK);
if (!ht || !ht->isValidEntry(addr.offset)) {
- warning("getHunkPointer() with invalid handle %04x:%04x", PRINT_REG(addr));
+ error("getHunkPointer() with invalid handle %04x:%04x", PRINT_REG(addr));
return NULL;
}
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index 068259224d..f54cddc253 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -1226,6 +1226,11 @@ void run_vm(EngineState *s, bool restoring) {
xs_new = &(s->_executionStack.back());
s->_executionStackPosChanged = true;
+
+ // If a game is being loaded, stop processing
+ if (s->abortScriptProcessing != kAbortNone || g_engine->shouldQuit())
+ return; // Stop processing
+
break;
}
diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp
index 9018a6f62e..08ff3bfc80 100644
--- a/engines/sci/graphics/animate.cpp
+++ b/engines/sci/graphics/animate.cpp
@@ -98,6 +98,11 @@ bool GfxAnimate::invoke(List *list, int argc, reg_t *argv) {
if (!(signal & kSignalFrozen)) {
// Call .doit method of that object
invokeSelector(_s, curObject, SELECTOR(doit), argc, argv, 0);
+
+ // If a game is being loaded, stop processing
+ if (_s->abortScriptProcessing != kAbortNone || g_engine->shouldQuit())
+ return true; // Stop processing
+
// Lookup node again, since the nodetable it was in may have been reallocated
curNode = _s->_segMan->lookupNode(curAddress);
}