aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorTorbjörn Andersson2007-12-16 00:41:30 +0000
committerTorbjörn Andersson2007-12-16 00:41:30 +0000
commit35e8a6651864dd8dc6c4607b0aefa32a571f29be (patch)
treef4750516a542ddfb035ecbe587e2e53f95dcc611 /engines
parent01b6e025ffa455507514d7fbf065d0cc4ba0a4c6 (diff)
downloadscummvm-rg350-35e8a6651864dd8dc6c4607b0aefa32a571f29be.tar.gz
scummvm-rg350-35e8a6651864dd8dc6c4607b0aefa32a571f29be.tar.bz2
scummvm-rg350-35e8a6651864dd8dc6c4607b0aefa32a571f29be.zip
Workaround for bug #1487382 ("SWORD2: Game freezes"). It appears to be a script
bug. svn-id: r29866
Diffstat (limited to 'engines')
-rw-r--r--engines/sword2/interpreter.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/engines/sword2/interpreter.cpp b/engines/sword2/interpreter.cpp
index d3f202211d..17b7cbe92f 100644
--- a/engines/sword2/interpreter.cpp
+++ b/engines/sword2/interpreter.cpp
@@ -312,6 +312,7 @@ int Logic::runScript2(byte *scriptData, byte *objectData, byte *offsetPtr) {
bool checkMopBug = false;
bool checkPyramidBug = false;
bool checkElevatorBug = false;
+ bool checkPearlBug = false;
if (scriptNumber == 2) {
if (strcmp((char *)header.name, "mop_73") == 0)
@@ -320,6 +321,8 @@ int Logic::runScript2(byte *scriptData, byte *objectData, byte *offsetPtr) {
checkPyramidBug = true;
else if (strcmp((char *)header.name, "lift_82") == 0)
checkElevatorBug = true;
+ else if (strcmp((char *)header.name, "pearl_31") == 0)
+ checkPearlBug = true;
}
code += noScripts * 4;
@@ -633,6 +636,15 @@ int Logic::runScript2(byte *scriptData, byte *objectData, byte *offsetPtr) {
// Continue as normal
break;
case IR_TERMINATE:
+ if (checkPearlBug && readVar(1290) == 0) {
+ // Pearl's interaction script will wait
+ // until global(1290) is no longer 0
+ // before doing anything. But if the
+ // script was terminated prematurely,
+ // that never happens.
+ warning("Working around Pearl bug: Resetting Pearl's state");
+ writeVar(1290, 1);
+ }
// Return without updating the offset
return 2;
case IR_REPEAT: