diff options
author | Filippos Karapetis | 2010-06-25 17:25:00 +0000 |
---|---|---|
committer | Filippos Karapetis | 2010-06-25 17:25:00 +0000 |
commit | aedc77f0bddcfcd11e465ee29c5fc66973ef9f9b (patch) | |
tree | dfd0a5c3e3e93a93a67500b43c69ce5f7e812e83 /engines/sci | |
parent | b6d1b3bc0b2c4e3edbc49a73cb629313eb84c889 (diff) | |
download | scummvm-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.cpp | 2 | ||||
-rw-r--r-- | engines/sci/engine/vm.cpp | 5 | ||||
-rw-r--r-- | engines/sci/graphics/animate.cpp | 5 |
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); } |