diff options
author | Martin Kiewitz | 2010-06-27 11:51:44 +0000 |
---|---|---|
committer | Martin Kiewitz | 2010-06-27 11:51:44 +0000 |
commit | 32ee0338f8309bddfe61cc23db934bfb4447cdc2 (patch) | |
tree | b2380577ae91c844f1c2c24372b7f077b07f3156 | |
parent | 0b6bd84aba372076c450dfefa89752a3c7778bae (diff) | |
download | scummvm-rg350-32ee0338f8309bddfe61cc23db934bfb4447cdc2.tar.gz scummvm-rg350-32ee0338f8309bddfe61cc23db934bfb4447cdc2.tar.bz2 scummvm-rg350-32ee0338f8309bddfe61cc23db934bfb4447cdc2.zip |
SCI: better solution for the lsl6 uninit issue, we now go through all the parents till we find a working workaround - we can use Narrator::startText that way inside the workaround table
svn-id: r50374
-rw-r--r-- | engines/sci/engine/vm.cpp | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index a6caa1e251..c4552e591d 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -199,7 +199,7 @@ static const UninitializedReadWorkaround uninitializedReadWorkarounds[] = { { GID_FREDDYPHARKAS, 24, "gcWin", "open", -1, 5, 0xf }, // is used as priority for game menu { GID_FREDDYPHARKAS, 31, "quitWin", "open", -1, 5, 0xf }, // is used as priority for game menu { GID_LSL1, 720, "rm720", "init", -1, 0, 0 }, // age check room - { GID_LSL6, 928, "*", "startText", -1, 0, 0 }, // used by various objects that are even translated in foreign versions (actually Narrator::startText) + { GID_LSL6, 928, "Narrator", "startText", -1, 0, 0 }, // used by various objects that are even translated in foreign versions, that's why we use the base-class { GID_ISLANDBRAIN, 140, "piece", "init", -1, 3, 1 }, // first puzzle right at the start, some initialization variable. bnt is done on it, and it should be non-0 { GID_ISLANDBRAIN, 268, "anElement", "select", -1, 0, 0 }, // elements puzzle, gets used before super TextIcon { GID_KQ5, 0, "", "export 29", -1, 3, 0 }, // called when playing harp for the harpies, is used for kDoAudio @@ -248,16 +248,25 @@ static reg_t validate_read_var(reg_t *r, reg_t *stack_base, int type, int max, i } // Search if this is a known uninitialized read - const UninitializedReadWorkaround *workaround = uninitializedReadWorkarounds; - while (workaround->objectName) { - if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && ((workaround->objectName == curObjectName) || (*workaround->objectName == '*')) - && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->localCallOffset && workaround->index == index) { - // Workaround found - r[index] = make_reg(0, workaround->newValue); - return r[index]; + const UninitializedReadWorkaround *workaround; + Common::String searchObjectName = curObjectName; + reg_t searchObject = lastCall->sendp; + do { + workaround = uninitializedReadWorkarounds; + while (workaround->objectName) { + if (workaround->gameId == gameId && workaround->scriptNr == curScriptNr && (workaround->objectName == searchObjectName) + && workaround->methodName == curMethodName && workaround->localCallOffset == lastCall->localCallOffset && workaround->index == index) { + // Workaround found + r[index] = make_reg(0, workaround->newValue); + return r[index]; + } + workaround++; } - workaround++; - } + // Go back to the parent + searchObject = state->_segMan->getObject(searchObject)->getSuperClassSelector(); + if (!searchObject.isNull()) + searchObjectName = state->_segMan->getObjectName(searchObject); + } while (!searchObject.isNull()); // no parent left? error("Uninitialized read for temp %d from method %s::%s (script %d, localCall %x)", index, curObjectName.c_str(), curMethodName.c_str(), curScriptNr, lastCall->localCallOffset); } return r[index]; |