aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippos Karapetis2012-06-11 21:14:08 +0300
committerFilippos Karapetis2012-06-11 21:17:21 +0300
commitea06210b92a45f8fca6b9be19057bcd607988ee7 (patch)
tree365061856eba8f2305452cf54ff78dfa139504e8
parent15306bc554b926e7d50f6a443766065e684557f3 (diff)
downloadscummvm-rg350-ea06210b92a45f8fca6b9be19057bcd607988ee7.tar.gz
scummvm-rg350-ea06210b92a45f8fca6b9be19057bcd607988ee7.tar.bz2
scummvm-rg350-ea06210b92a45f8fca6b9be19057bcd607988ee7.zip
SCI: Add support for variable selectors in kListFirstTrue / kListAllTrue
This is used by Torin's Passage (e.g. when trying to open the menu). Based on a slightly modified patch by LePhilousophe
-rw-r--r--engines/sci/engine/klists.cpp19
1 files changed, 11 insertions, 8 deletions
diff --git a/engines/sci/engine/klists.cpp b/engines/sci/engine/klists.cpp
index 2a33df26bc..5a608af034 100644
--- a/engines/sci/engine/klists.cpp
+++ b/engines/sci/engine/klists.cpp
@@ -575,8 +575,11 @@ reg_t kListFirstTrue(EngineState *s, int argc, reg_t *argv) {
// First, check if the target selector is a variable
if (lookupSelector(s->_segMan, curObject, slc, &address, NULL) == kSelectorVariable) {
- // Can this happen with variable selectors?
- error("kListFirstTrue: Attempted to access a variable selector");
+ // If it's a variable selector, check its value.
+ // Example: script 64893 in Torin, MenuHandler::isHilited checks
+ // all children for variable selector 0x03ba (bHilited).
+ if (!readSelector(s->_segMan, curObject, slc).isNull())
+ return curObject;
} else {
invokeSelector(s, curObject, slc, argc, argv, argc - 2, argv + 2);
@@ -609,16 +612,16 @@ reg_t kListAllTrue(EngineState *s, int argc, reg_t *argv) {
// First, check if the target selector is a variable
if (lookupSelector(s->_segMan, curObject, slc, &address, NULL) == kSelectorVariable) {
- // Can this happen with variable selectors?
- error("kListAllTrue: Attempted to access a variable selector");
+ // If it's a variable selector, check its value
+ s->r_acc = readSelector(s->_segMan, curObject, slc);
} else {
invokeSelector(s, curObject, slc, argc, argv, argc - 2, argv + 2);
-
- // Check if the result isn't true
- if (s->r_acc.isNull())
- break;
}
+ // Check if the result isn't true
+ if (s->r_acc.isNull())
+ break;
+
curNode = s->_segMan->lookupNode(nextNode);
}