o90_setSpriteInfo so 91

svn-id: r16866
This commit is contained in:
Gregory Montoir 2005-02-22 22:23:10 +00:00
parent 44c6bbe438
commit 26b11cb444
3 changed files with 42 additions and 1 deletions

View file

@ -935,6 +935,8 @@ protected:
void spriteInfoSet_flags23_26(int spriteId, int value); void spriteInfoSet_flags23_26(int spriteId, int value);
void spriteInfoSet_flag31(int spriteId, int value); void spriteInfoSet_flag31(int spriteId, int value);
void spriteInfoSet_field_78_64(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 spritesAllocTables(int numSprites, int numGroups, int numMaxSprites);
void spritesResetTables(bool refreshScreen); void spritesResetTables(bool refreshScreen);

View file

@ -954,6 +954,7 @@ void ScummEngine_v90he::o90_setSpriteInfo() {
int args[16]; int args[16];
int spriteId, tmp[2]; int spriteId, tmp[2];
static int storedFields[2]; static int storedFields[2];
int n;
byte subOp = fetchScriptByte(); byte subOp = fetchScriptByte();
subOp -= 34; subOp -= 34;
@ -1210,7 +1211,27 @@ void ScummEngine_v90he::o90_setSpriteInfo() {
spriteInfoSet_flags23_26(spriteId, args[0]); spriteInfoSet_flags23_26(spriteId, args[0]);
break; break;
case 91: 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; break;
case 105: // HE 99+ case 105: // HE 99+
pop(); pop();

View file

@ -485,6 +485,24 @@ void ScummEngine_v90he::spriteInfoSet_field_78_64(int spriteId, int value) {
_spriteTable[spriteId].field_64 = 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) { void ScummEngine_v90he::spriteInfoSet_case183(int spriteId) {
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d"); checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");