WIP for o90_spriteInfoSet
svn-id: r16842
This commit is contained in:
parent
b1e67c4ce8
commit
6942100a94
3 changed files with 215 additions and 10 deletions
|
@ -919,6 +919,16 @@ protected:
|
||||||
void spriteInfoSet_field_18(int spriteNum, int value);
|
void spriteInfoSet_field_18(int spriteNum, int value);
|
||||||
void spriteInfoSet_Inc_tx_ty(int spriteNum, int value1, int value2);
|
void spriteInfoSet_Inc_tx_ty(int spriteNum, int value1, int value2);
|
||||||
void spriteInfoSet_zoom(int spriteNum, int value);
|
void spriteInfoSet_zoom(int spriteNum, int value);
|
||||||
|
void spriteInfoSet_rotAngle(int spriteNum, int value);
|
||||||
|
void spriteInfoSet_flag22(int spriteNum, int value);
|
||||||
|
void spriteInfoSet_flag7(int spriteNum, int value);
|
||||||
|
void spriteInfoSet_flagRotated(int spriteNum, int value);
|
||||||
|
void spriteInfoSet_flag8(int spriteNum, int value);
|
||||||
|
void spriteInfoSet_flagZoomed(int spriteNum, int value);
|
||||||
|
void spriteInfoSet_flag20(int spriteNum, int value);
|
||||||
|
void spriteInfoSet_flags23_26(int spriteNum, int value);
|
||||||
|
void spriteInfoSet_flag31(int spriteNum, int value);
|
||||||
|
void spriteInfoSet_field_78_64(int spriteNum, int value);
|
||||||
|
|
||||||
void spritesAllocTables(int numSprites, int numGroups, int numImgSprites);
|
void spritesAllocTables(int numSprites, int numGroups, int numImgSprites);
|
||||||
void spritesResetTables(bool refreshScreen);
|
void spritesResetTables(bool refreshScreen);
|
||||||
|
|
|
@ -928,16 +928,39 @@ void ScummEngine_v90he::o90_getSpriteInfo() {
|
||||||
|
|
||||||
void ScummEngine_v90he::o90_setSpriteInfo() {
|
void ScummEngine_v90he::o90_setSpriteInfo() {
|
||||||
int args[16];
|
int args[16];
|
||||||
int spriteId;
|
int spriteId, tmp[2];
|
||||||
|
static int storedFields[2];
|
||||||
byte subOp = fetchScriptByte();
|
byte subOp = fetchScriptByte();
|
||||||
subOp -= 34;
|
subOp -= 34;
|
||||||
|
|
||||||
switch (subOp) {
|
switch (subOp) {
|
||||||
case 0:
|
case 0:
|
||||||
pop();
|
args[0] = pop();
|
||||||
|
if (_curSpriteId > _curMaxSpriteId)
|
||||||
|
break;
|
||||||
|
spriteId = _curSpriteId;
|
||||||
|
if (!spriteId)
|
||||||
|
spriteId++;
|
||||||
|
|
||||||
|
for (; spriteId <= _curMaxSpriteId; spriteId++) {
|
||||||
|
spriteInfoGet_field_2C_30(spriteId, tmp[0], tmp[1]);
|
||||||
|
storedFields[0] = tmp[0];
|
||||||
|
spriteInfoSet_field_2C_30(spriteId, args[0], tmp[1]);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
pop();
|
args[0] = pop();
|
||||||
|
if (_curSpriteId > _curMaxSpriteId)
|
||||||
|
break;
|
||||||
|
spriteId = _curSpriteId;
|
||||||
|
if (!spriteId)
|
||||||
|
spriteId++;
|
||||||
|
|
||||||
|
for (; spriteId <= _curMaxSpriteId; spriteId++) {
|
||||||
|
spriteInfoGet_field_2C_30(spriteId, tmp[0], tmp[1]);
|
||||||
|
storedFields[1] = tmp[1];
|
||||||
|
spriteInfoSet_field_2C_30(spriteId, tmp[0], args[0]);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
args[0] = pop();
|
args[0] = pop();
|
||||||
|
@ -951,8 +974,34 @@ void ScummEngine_v90he::o90_setSpriteInfo() {
|
||||||
spriteInfoSet_groupNum(spriteId, args[0]);
|
spriteInfoSet_groupNum(spriteId, args[0]);
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
pop();
|
args[1] = pop();
|
||||||
pop();
|
args[0] = pop();
|
||||||
|
if (_curSpriteId > _curMaxSpriteId)
|
||||||
|
break;
|
||||||
|
spriteId = _curSpriteId;
|
||||||
|
if (!spriteId)
|
||||||
|
spriteId++;
|
||||||
|
|
||||||
|
for (; spriteId <= _curMaxSpriteId; spriteId++)
|
||||||
|
switch(args[1]) {
|
||||||
|
case 0:
|
||||||
|
spriteInfoSet_flag7(spriteId, args[0]);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
spriteInfoSet_flagRotated(spriteId, args[0]);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
spriteInfoSet_flag8(spriteId, args[0]);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
spriteInfoSet_flagZoomed(spriteId, args[0]);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
spriteInfoSet_flag20(spriteId, args[0]);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 9:
|
case 9:
|
||||||
args[0] = pop();
|
args[0] = pop();
|
||||||
|
@ -989,7 +1038,15 @@ void ScummEngine_v90he::o90_setSpriteInfo() {
|
||||||
spriteInfoSet_resState(spriteId, args[0]);
|
spriteInfoSet_resState(spriteId, args[0]);
|
||||||
break;
|
break;
|
||||||
case 19:
|
case 19:
|
||||||
pop();
|
args[0] = pop();
|
||||||
|
if (_curSpriteId > _curMaxSpriteId)
|
||||||
|
break;
|
||||||
|
spriteId = _curSpriteId;
|
||||||
|
if (!spriteId)
|
||||||
|
spriteId++;
|
||||||
|
|
||||||
|
for (; spriteId <= _curMaxSpriteId; spriteId++)
|
||||||
|
spriteInfoSet_rotAngle(spriteId, args[0]);
|
||||||
break;
|
break;
|
||||||
case 23:
|
case 23:
|
||||||
if (_gameId == GID_FREDDI4 || _heversion >= 99) {
|
if (_gameId == GID_FREDDI4 || _heversion >= 99) {
|
||||||
|
@ -1038,7 +1095,15 @@ void ScummEngine_v90he::o90_setSpriteInfo() {
|
||||||
spriteInfoSet_tx_ty(spriteId, args[0], args[1]);
|
spriteInfoSet_tx_ty(spriteId, args[0], args[1]);
|
||||||
break;
|
break;
|
||||||
case 34:
|
case 34:
|
||||||
pop();
|
args[0] = pop();
|
||||||
|
if (_curSpriteId > _curMaxSpriteId)
|
||||||
|
break;
|
||||||
|
spriteId = _curSpriteId;
|
||||||
|
if (!spriteId)
|
||||||
|
spriteId++;
|
||||||
|
|
||||||
|
for (; spriteId <= _curMaxSpriteId; spriteId++)
|
||||||
|
spriteInfoSet_flag31(spriteId, args[0]);
|
||||||
break;
|
break;
|
||||||
case 43:
|
case 43:
|
||||||
args[1] = pop();
|
args[1] = pop();
|
||||||
|
@ -1053,7 +1118,15 @@ void ScummEngine_v90he::o90_setSpriteInfo() {
|
||||||
spriteInfoSet_field_2C_30(spriteId, args[0], args[1]);
|
spriteInfoSet_field_2C_30(spriteId, args[0], args[1]);
|
||||||
break;
|
break;
|
||||||
case 48:
|
case 48:
|
||||||
pop();
|
args[0] = pop();
|
||||||
|
if (_curSpriteId > _curMaxSpriteId)
|
||||||
|
break;
|
||||||
|
spriteId = _curSpriteId;
|
||||||
|
if (!spriteId)
|
||||||
|
spriteId++;
|
||||||
|
|
||||||
|
for (; spriteId <= _curMaxSpriteId; spriteId++)
|
||||||
|
spriteInfoSet_flag22(spriteId, args[0]);
|
||||||
break;
|
break;
|
||||||
case 52: // HE 98+
|
case 52: // HE 98+
|
||||||
args[0] = pop();
|
args[0] = pop();
|
||||||
|
@ -1078,7 +1151,15 @@ void ScummEngine_v90he::o90_setSpriteInfo() {
|
||||||
spriteInfoSet_zoom(spriteId, args[0]);
|
spriteInfoSet_zoom(spriteId, args[0]);
|
||||||
break;
|
break;
|
||||||
case 63: // HE 98+
|
case 63: // HE 98+
|
||||||
pop();
|
args[0] = pop();
|
||||||
|
if (_curSpriteId > _curMaxSpriteId)
|
||||||
|
break;
|
||||||
|
spriteId = _curSpriteId;
|
||||||
|
if (!spriteId)
|
||||||
|
spriteId++;
|
||||||
|
|
||||||
|
for (; spriteId <= _curMaxSpriteId; spriteId++)
|
||||||
|
spriteInfoSet_field_78_64(spriteId, args[0]);
|
||||||
break;
|
break;
|
||||||
case 64:
|
case 64:
|
||||||
args[0] = pop();
|
args[0] = pop();
|
||||||
|
@ -1092,7 +1173,15 @@ void ScummEngine_v90he::o90_setSpriteInfo() {
|
||||||
spriteInfoSet_field_54(spriteId, args[0]);
|
spriteInfoSet_field_54(spriteId, args[0]);
|
||||||
break;
|
break;
|
||||||
case 90:
|
case 90:
|
||||||
pop();
|
args[0] = pop();
|
||||||
|
if (_curSpriteId > _curMaxSpriteId)
|
||||||
|
break;
|
||||||
|
spriteId = _curSpriteId;
|
||||||
|
if (!spriteId)
|
||||||
|
spriteId++;
|
||||||
|
|
||||||
|
for (; spriteId <= _curMaxSpriteId; spriteId++)
|
||||||
|
spriteInfoSet_flags23_26(spriteId, args[0]);
|
||||||
break;
|
break;
|
||||||
case 91:
|
case 91:
|
||||||
getStackList(args, ARRAYSIZE(args));
|
getStackList(args, ARRAYSIZE(args));
|
||||||
|
@ -1113,6 +1202,7 @@ void ScummEngine_v90he::o90_setSpriteInfo() {
|
||||||
spriteInfoSet_field_80(spriteId, args[0]);
|
spriteInfoSet_field_80(spriteId, args[0]);
|
||||||
break;
|
break;
|
||||||
case 124:
|
case 124:
|
||||||
|
spritesResetTables(true);
|
||||||
break;
|
break;
|
||||||
case 164:
|
case 164:
|
||||||
args[1] = pop();
|
args[1] = pop();
|
||||||
|
|
|
@ -343,6 +343,111 @@ void ScummEngine_v90he::spriteInfoSet_zoom(int spriteNum, int value) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ScummEngine_v90he::spriteInfoSet_rotAngle(int spriteNum, int value) {
|
||||||
|
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
|
||||||
|
|
||||||
|
_spriteTable[spriteNum].flags |= kSFRotated;
|
||||||
|
|
||||||
|
if (_spriteTable[spriteNum].rot_angle != value) {
|
||||||
|
_spriteTable[spriteNum].rot_angle = value;
|
||||||
|
|
||||||
|
if (_spriteTable[spriteNum].res_id)
|
||||||
|
_spriteTable[spriteNum].flags |= kSF01 | kSF02;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScummEngine_v90he::spriteInfoSet_flag22(int spriteNum, int value) {
|
||||||
|
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
_spriteTable[spriteNum].flags |= kSF22;
|
||||||
|
else
|
||||||
|
_spriteTable[spriteNum].flags &= ~(kSF01 | kSF22);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScummEngine_v90he::spriteInfoSet_flag7(int spriteNum, int value) {
|
||||||
|
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
_spriteTable[spriteNum].flags |= kSF07;
|
||||||
|
else
|
||||||
|
_spriteTable[spriteNum].flags &= ~(kSF01 | kSF07);
|
||||||
|
|
||||||
|
if (_spriteTable[spriteNum].res_id)
|
||||||
|
_spriteTable[spriteNum].flags |= kSF01 | kSF02;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScummEngine_v90he::spriteInfoSet_flagRotated(int spriteNum, int value) {
|
||||||
|
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
_spriteTable[spriteNum].flags |= kSFRotated;
|
||||||
|
else
|
||||||
|
_spriteTable[spriteNum].flags &= ~(kSF01 | kSFRotated);
|
||||||
|
|
||||||
|
if (_spriteTable[spriteNum].res_id)
|
||||||
|
_spriteTable[spriteNum].flags |= kSF01 | kSF02;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScummEngine_v90he::spriteInfoSet_flag8(int spriteNum, int value) {
|
||||||
|
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
_spriteTable[spriteNum].flags |= kSF08;
|
||||||
|
else
|
||||||
|
_spriteTable[spriteNum].flags &= ~(kSF01 | kSF08);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScummEngine_v90he::spriteInfoSet_flagZoomed(int spriteNum, int value) {
|
||||||
|
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
_spriteTable[spriteNum].flags |= kSFZoomed;
|
||||||
|
else
|
||||||
|
_spriteTable[spriteNum].flags &= ~(kSF01 | kSFZoomed);
|
||||||
|
|
||||||
|
if (_spriteTable[spriteNum].res_id)
|
||||||
|
_spriteTable[spriteNum].flags |= kSF01 | kSF02;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScummEngine_v90he::spriteInfoSet_flag20(int spriteNum, int value) {
|
||||||
|
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
_spriteTable[spriteNum].flags |= kSF20;
|
||||||
|
else
|
||||||
|
_spriteTable[spriteNum].flags &= ~(kSF01 | kSF20);
|
||||||
|
|
||||||
|
if (_spriteTable[spriteNum].res_id)
|
||||||
|
_spriteTable[spriteNum].flags |= kSF01 | kSF02;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScummEngine_v90he::spriteInfoSet_flags23_26(int spriteNum, int value) {
|
||||||
|
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
_spriteTable[spriteNum].flags |= kSF23 | kSF26;
|
||||||
|
else
|
||||||
|
_spriteTable[spriteNum].flags &= ~(kSF01 | kSF23 | kSF26);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScummEngine_v90he::spriteInfoSet_flag31(int spriteNum, int value) {
|
||||||
|
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
|
||||||
|
|
||||||
|
// Note that condition is inverted
|
||||||
|
if (!value)
|
||||||
|
_spriteTable[spriteNum].flags |= kSF31;
|
||||||
|
else
|
||||||
|
_spriteTable[spriteNum].flags &= ~(kSF01 | kSF31);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScummEngine_v90he::spriteInfoSet_field_78_64(int spriteNum, int value) {
|
||||||
|
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
|
||||||
|
|
||||||
|
_spriteTable[spriteNum].field_78 = value;
|
||||||
|
_spriteTable[spriteNum].field_64 = value;
|
||||||
|
}
|
||||||
|
|
||||||
void ScummEngine_v90he::spriteInfoSet_case183(int spriteNum) {
|
void ScummEngine_v90he::spriteInfoSet_case183(int spriteNum) {
|
||||||
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
|
checkRange(_varNumSprites, 1, spriteNum, "Invalid sprite %d");
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue