diff options
| author | Filippos Karapetis | 2012-06-11 21:14:08 +0300 | 
|---|---|---|
| committer | Filippos Karapetis | 2012-06-11 21:17:21 +0300 | 
| commit | ea06210b92a45f8fca6b9be19057bcd607988ee7 (patch) | |
| tree | 365061856eba8f2305452cf54ff78dfa139504e8 | |
| parent | 15306bc554b926e7d50f6a443766065e684557f3 (diff) | |
| download | scummvm-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.cpp | 19 | 
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);  	} | 
