WIP for o90_spriteInfoSet. Regression fix.

svn-id: r16840
This commit is contained in:
Eugene Sandulenko 2005-02-21 00:59:50 +00:00
parent 7a6b7c2a1c
commit 97688df92d
3 changed files with 195 additions and 17 deletions

View File

@ -902,12 +902,23 @@ protected:
void spriteInfoSet_field_7C(int spriteId, int value);
void spriteInfoSet_field_80(int spriteId, int value);
void spriteInfoSet_case183(int spriteId);
void spriteInfoSet_resState(int spriteNum, int value);
void spriteInfoSet_tx_ty(int spriteNum, int value1, int value2);
void spriteInfoSet_groupNum(int spriteNum, int value);
void spriteInfoSet_field_2C_30(int spriteNum, int value1, int value2);
void spriteInfoSet_field_54(int spriteNum, int value);
void spriteInfoSet_field_44(int spriteNum, int value1, int value2);
void spriteInfoSet_field_18(int spriteNum, int value);
void spriteInfoSet_Inc_tx_ty(int spriteNum, int value1, int value2);
void spriteInfoSet_zoom(int spriteNum, int value);
void spritesAllocTables(int numSprites, int numGroups, int numImgSprites);
void spritesResetTables(bool refreshScreen);
void spriteGroupCheck(int sprGrpId);
void spriteMarkIfInGroup(int sprGrpId, uint32 flags);
void spriteInfoSet_addImageToList(int spriteNum, int imageNum, int *spriteIdptr);
/* HE version 90 script opcodes */
void o90_dup();
void o90_min();

View File

@ -940,21 +940,53 @@ void ScummEngine_v90he::o90_setSpriteInfo() {
pop();
break;
case 3:
pop();
args[0] = pop();
if (_curSpriteId > _curMaxSpriteId)
break;
spriteId = _curSpriteId;
if (!spriteId)
spriteId++;
for (; spriteId <= _curMaxSpriteId; spriteId++)
spriteInfoSet_groupNum(spriteId, args[0]);
break;
case 8:
pop();
pop();
break;
case 9:
pop();
args[0] = pop();
if (_curSpriteId > _curMaxSpriteId)
break;
spriteId = _curSpriteId;
if (!spriteId)
spriteId++;
for (; spriteId <= _curMaxSpriteId; spriteId++)
spriteInfoSet_field_18(spriteId, args[0]);
break;
case 10:
pop();
pop();
args[1] = pop();
args[0] = pop();
if (_curSpriteId > _curMaxSpriteId)
break;
spriteId = _curSpriteId;
if (!spriteId)
spriteId++;
for (; spriteId <= _curMaxSpriteId; spriteId++)
spriteInfoSet_Inc_tx_ty(spriteId, args[0], args[1]);
break;
case 18:
pop();
args[0] = pop();
if (_curSpriteId > _curMaxSpriteId)
break;
spriteId = _curSpriteId;
if (!spriteId)
spriteId++;
for (; spriteId <= _curMaxSpriteId; spriteId++)
spriteInfoSet_resState(spriteId, args[0]);
break;
case 19:
pop();
@ -983,18 +1015,42 @@ void ScummEngine_v90he::o90_setSpriteInfo() {
spriteInfoSet_field_7C(spriteId, args[0]);
break;
case 29:
pop();
args[0] = pop();
if (_curSpriteId > _curMaxSpriteId)
break;
spriteId = _curSpriteId;
if (!spriteId)
spriteId++;
for (; spriteId <= _curMaxSpriteId; spriteId++)
spriteInfoSet_addImageToList(spriteId, 1, &args[0]);
break;
case 31:
pop();
pop();
args[1] = pop();
args[0] = pop();
if (_curSpriteId > _curMaxSpriteId)
break;
spriteId = _curSpriteId;
if (!spriteId)
spriteId++;
for (; spriteId <= _curMaxSpriteId; spriteId++)
spriteInfoSet_tx_ty(spriteId, args[0], args[1]);
break;
case 34:
pop();
break;
case 43:
pop();
pop();
args[1] = pop();
args[0] = pop();
if (_curSpriteId > _curMaxSpriteId)
break;
spriteId = _curSpriteId;
if (!spriteId)
spriteId++;
for (; spriteId <= _curMaxSpriteId; spriteId++)
spriteInfoSet_field_2C_30(spriteId, args[0], args[1]);
break;
case 48:
pop();
@ -1011,13 +1067,29 @@ void ScummEngine_v90he::o90_setSpriteInfo() {
spriteInfoSet_field_14(spriteId, args[0]);
break;
case 58: // HE 99+
pop();
args[0] = pop();
if (_curSpriteId > _curMaxSpriteId)
break;
spriteId = _curSpriteId;
if (!spriteId)
spriteId++;
for (; spriteId <= _curMaxSpriteId; spriteId++)
spriteInfoSet_zoom(spriteId, args[0]);
break;
case 63: // HE 98+
pop();
break;
case 64:
pop();
args[0] = pop();
if (_curSpriteId > _curMaxSpriteId)
break;
spriteId = _curSpriteId;
if (!spriteId)
spriteId++;
for (; spriteId <= _curMaxSpriteId; spriteId++)
spriteInfoSet_field_54(spriteId, args[0]);
break;
case 90:
pop();
@ -1043,11 +1115,18 @@ void ScummEngine_v90he::o90_setSpriteInfo() {
case 124:
break;
case 164:
pop();
pop();
args[1] = pop();
args[0] = pop();
if (_curSpriteId > _curMaxSpriteId)
break;
spriteId = _curSpriteId;
if (!spriteId)
spriteId++;
for (; spriteId <= _curMaxSpriteId; spriteId++)
spriteInfoSet_field_44(spriteId, args[0], args[1]);
break;
case 183:
args[0] = pop();
if (_curSpriteId > _curMaxSpriteId)
break;
spriteId = _curSpriteId;

View File

@ -208,9 +208,97 @@ void ScummEngine_v90he::spriteInfoSet_field_80(int spriteId, int value) {
_spriteTable[spriteId].field_80 = value;
}
void ScummEngine_v90he::spriteInfoSet_case183(int spriteId) {
checkRange(_varNumSprites, 1, spriteId, "Invalid sprite %d");
void ScummEngine_v90he::spriteInfoSet_resState(int spriteNum, int value) {
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
if (_spriteTable[spriteNum].res_id) {
int state;
state = MAX(value, _spriteTable[spriteNum].res_wiz_states - 1);
if (state < 0)
state = 0;
if (_spriteTable[spriteNum].res_state != state) {
_spriteTable[spriteNum].res_state = state;
_spriteTable[spriteNum].flags |= kSF01 | kSF02;
}
}
}
void ScummEngine_v90he::spriteInfoSet_tx_ty(int spriteNum, int value1, int value2) {
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
if (_spriteTable[spriteNum].tx != value1 || _spriteTable[spriteNum].ty != value2) {
_spriteTable[spriteNum].tx = value1;
_spriteTable[spriteNum].ty = value2;
_spriteTable[spriteNum].flags |= kSF01 | kSF02;
}
}
void ScummEngine_v90he::spriteInfoSet_groupNum(int spriteNum, int value) {
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
checkRange(_varNumSpriteGroups, 1, value, "Invalid sprite group%d");
_spriteTable[spriteNum].group_num = value;
}
void ScummEngine_v90he::spriteInfoSet_field_2C_30(int spriteNum, int value1, int value2) {
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
_spriteTable[spriteNum].field_2C = value1;
_spriteTable[spriteNum].field_30 = value2;
}
void ScummEngine_v90he::spriteInfoSet_field_54(int spriteNum, int value) {
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
_spriteTable[spriteNum].field_54 = value;
if (_spriteTable[spriteNum].res_id)
_spriteTable[spriteNum].flags |= kSF01 | kSF02;
}
void ScummEngine_v90he::spriteInfoSet_field_44(int spriteNum, int value1, int value2) {
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
_spriteTable[spriteNum].field_44 = value2;
}
void ScummEngine_v90he::spriteInfoSet_field_18(int spriteNum, int value) {
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
_spriteTable[spriteNum].field_18 = value;
}
void ScummEngine_v90he::spriteInfoSet_Inc_tx_ty(int spriteNum, int value1, int value2) {
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
_spriteTable[spriteNum].tx += value1;
_spriteTable[spriteNum].ty += value2;
if (_spriteTable[spriteNum].tx || _spriteTable[spriteNum].ty)
_spriteTable[spriteNum].flags |= kSF01 | kSF02;
}
void ScummEngine_v90he::spriteInfoSet_zoom(int spriteNum, int value) {
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
_spriteTable[spriteNum].flags |= kSFZoomed;
if (_spriteTable[spriteNum].zoom != value) {
_spriteTable[spriteNum].zoom = value;
if (_spriteTable[spriteNum].res_id)
_spriteTable[spriteNum].flags |= kSF01 | kSF02;
}
}
void ScummEngine_v90he::spriteInfoSet_case183(int spriteNum) {
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
// TODO
}
void ScummEngine_v90he::spriteInfoSet_addImageToList(int spriteNum, int imageNum, int *spriteIdptr) {
// TODO
}