diff options
| -rw-r--r-- | scumm/intern.h | 2 | ||||
| -rw-r--r-- | scumm/script_v90he.cpp | 23 | ||||
| -rw-r--r-- | scumm/sprite_he.cpp | 18 | 
3 files changed, 42 insertions, 1 deletions
| diff --git a/scumm/intern.h b/scumm/intern.h index 2ad2c9db90..b1dbbc32c9 100644 --- a/scumm/intern.h +++ b/scumm/intern.h @@ -935,6 +935,8 @@ protected:  	void spriteInfoSet_flags23_26(int spriteId, int value);  	void spriteInfoSet_flag31(int spriteId, int value);  	void spriteInfoSet_field_78_64(int spriteId, int value); +	void spriteInfoSet_classFlags_1(int spriteId, int value1, int value2); +	void spriteInfoSet_classFlags_2(int spriteId);  	void spritesAllocTables(int numSprites, int numGroups, int numMaxSprites);  	void spritesResetTables(bool refreshScreen); diff --git a/scumm/script_v90he.cpp b/scumm/script_v90he.cpp index ecc5c6cab4..76a39bae1f 100644 --- a/scumm/script_v90he.cpp +++ b/scumm/script_v90he.cpp @@ -954,6 +954,7 @@ void ScummEngine_v90he::o90_setSpriteInfo() {  	int args[16];  	int spriteId, tmp[2];  	static int storedFields[2]; +	int n;  	byte subOp = fetchScriptByte();  	subOp -= 34; @@ -1210,7 +1211,27 @@ void ScummEngine_v90he::o90_setSpriteInfo() {  			spriteInfoSet_flags23_26(spriteId, args[0]);  		break;  	case 91: -		getStackList(args, ARRAYSIZE(args)); +		n = getStackList(args, ARRAYSIZE(args)); +		if (_curSpriteId != 0 && _curMaxSpriteId != 0 && n != 0) { +			int *p = &args[n - 1]; +			do { +				int code = *p; +				if (code == 0) { +					for (int i = _curSpriteId; i <= _curMaxSpriteId; ++i) { +						spriteInfoSet_classFlags_2(i);					 +					} +				} else if (code & 0x80) { +					for (int i = _curSpriteId; i <= _curMaxSpriteId; ++i) { +						spriteInfoSet_classFlags_1(i, code & 0x7F, 1); +					} +				} else { +					for (int i = _curSpriteId; i <= _curMaxSpriteId; ++i) { +						spriteInfoSet_classFlags_1(i, code & 0x7F, 0); +					} +				} +				--p; +			} while (--n); +		}  		break;  	case 105: // HE 99+  		pop(); diff --git a/scumm/sprite_he.cpp b/scumm/sprite_he.cpp index cd8ccd4d3b..0b32c61e4d 100644 --- a/scumm/sprite_he.cpp +++ b/scumm/sprite_he.cpp @@ -485,6 +485,24 @@ void ScummEngine_v90he::spriteInfoSet_field_78_64(int spriteId, int value) {  	_spriteTable[spriteId].field_64 = value;  } +void ScummEngine_v90he::spriteInfoSet_classFlags_1(int spriteId, int classId, int toggle) { +	checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d"); +	checkRange(32, 1, classId, "class %d out of range in statement"); +	 +	// XXX +	if (toggle) { +		_spriteTable[spriteId].flags |= 1 << (classId - 1); +	} else { +		_spriteTable[spriteId].flags &= 1 << (classId - 1); +	} +} + +void ScummEngine_v90he::spriteInfoSet_classFlags_2(int spriteId) { +	checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d"); + +	_spriteTable[spriteId].class_flags = 0; +} +  void ScummEngine_v90he::spriteInfoSet_case183(int spriteId) {  	checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d"); | 
