diff options
| -rw-r--r-- | engines/sci/engine/vm.cpp | 23 | 
1 files changed, 14 insertions, 9 deletions
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index b251521041..9d08b55546 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -94,7 +94,7 @@ static ExecStack *add_exec_stack_varselector(Common::List<ExecStack> &execStack,  // validation functionality -static reg_t &validate_property(Object *obj, int index) { +static reg_t &validate_property(EngineState *s, Object *obj, int index) {  	// A static dummy reg_t, which we return if obj or index turn out to be  	// invalid. Note that we cannot just return NULL_REG, because client code  	// may modify the value of the returned reg_t. @@ -105,6 +105,11 @@ static reg_t &validate_property(Object *obj, int index) {  	if (!obj)  		error("validate_property: Sending to disposed object"); +	if (getSciVersion() == SCI_VERSION_3) +		index = obj->locateVarSelector(s->_segMan, index); +	else +		index >>= 1; +  	if (index < 0 || (uint)index >= obj->getVarCount()) {  		// This is same way sierra does it and there are some games, that contain such scripts like  		//  iceman script 998 (fred::canBeHere, executed right at the start) @@ -1650,27 +1655,27 @@ void run_vm(EngineState *s) {  		case op_pToa: // 0x31 (49)  			// Property To Accumulator -			s->r_acc = validate_property(obj, (opparams[0] >> 1)); +			s->r_acc = validate_property(s, obj, opparams[0]);  			break;  		case op_aTop: // 0x32 (50)  			// Accumulator To Property -			validate_property(obj, (opparams[0] >> 1)) = s->r_acc; +			validate_property(s, obj, opparams[0]) = s->r_acc;  			break;  		case op_pTos: // 0x33 (51)  			// Property To Stack -			PUSH32(validate_property(obj, opparams[0] >> 1)); +			PUSH32(validate_property(s, obj, opparams[0]));  			break;  		case op_sTop: // 0x34 (52)  			// Stack To Property -			validate_property(obj, (opparams[0] >> 1)) = POP32(); +			validate_property(s, obj, opparams[0]) = POP32();  			break;  		case op_ipToa: { // 0x35 (53)  			// Increment Property and copy To Accumulator -			reg_t &opProperty = validate_property(obj, opparams[0] >> 1); +			reg_t &opProperty = validate_property(s, obj, opparams[0]);  			uint16 valueProperty;  			if (validate_unsignedInteger(opProperty, valueProperty))  				s->r_acc = make_reg(0, valueProperty + 1); @@ -1682,7 +1687,7 @@ void run_vm(EngineState *s) {  		case op_dpToa: { // 0x36 (54)  			// Decrement Property and copy To Accumulator -			reg_t &opProperty = validate_property(obj, opparams[0] >> 1); +			reg_t &opProperty = validate_property(s, obj, opparams[0]);  			uint16 valueProperty;  			if (validate_unsignedInteger(opProperty, valueProperty))  				s->r_acc = make_reg(0, valueProperty - 1); @@ -1694,7 +1699,7 @@ void run_vm(EngineState *s) {  		case op_ipTos: { // 0x37 (55)  			// Increment Property and push to Stack -			reg_t &opProperty = validate_property(obj, opparams[0] >> 1); +			reg_t &opProperty = validate_property(s, obj, opparams[0]);  			uint16 valueProperty;  			if (validate_unsignedInteger(opProperty, valueProperty))  				valueProperty++; @@ -1707,7 +1712,7 @@ void run_vm(EngineState *s) {  		case op_dpTos: { // 0x38 (56)  			// Decrement Property and push to Stack -			reg_t &opProperty = validate_property(obj, opparams[0] >> 1); +			reg_t &opProperty = validate_property(s, obj, opparams[0]);  			uint16 valueProperty;  			if (validate_unsignedInteger(opProperty, valueProperty))  				valueProperty--;  | 
