aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTravis Howell2005-02-21 01:08:48 +0000
committerTravis Howell2005-02-21 01:08:48 +0000
commitb1e67c4ce87210b8c240e7da65ded3562e4349aa (patch)
treeac17b9c53efd03c4a9402742ba8846d9ebcf6530
parent97688df92d0356848e0c75a319b8d030881b6a85 (diff)
downloadscummvm-rg350-b1e67c4ce87210b8c240e7da65ded3562e4349aa.tar.gz
scummvm-rg350-b1e67c4ce87210b8c240e7da65ded3562e4349aa.tar.bz2
scummvm-rg350-b1e67c4ce87210b8c240e7da65ded3562e4349aa.zip
Add functions for o90_getSpriteGroupInfo
svn-id: r16841
-rw-r--r--scumm/intern.h8
-rw-r--r--scumm/script_v90he.cpp61
-rw-r--r--scumm/sprite_he.cpp51
3 files changed, 113 insertions, 7 deletions
diff --git a/scumm/intern.h b/scumm/intern.h
index 942d73d7b0..17d1a9ba8f 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -898,6 +898,14 @@ protected:
void spriteInfoGet_tx_ty(int spriteId, int32 &tx, int32 &ty);
void spriteInfoGet_field_2C_30(int spriteId, int32 &field_2C, int32 &field_30);
+ int spriteGroupGet_field_10(int spriteId);
+ int spriteGroupGet_field_20(int spriteId);
+ int spriteGroupGet_field_30(int spriteId);
+ int spriteGroupGet_field_34(int spriteId);
+ int spriteGroupGet_field_38(int spriteId);
+ int spriteGroupGet_field_3C(int spriteId);
+ void spriteGroupGet_tx_ty(int spriteId, int32 &tx, int32 &ty);
+
void spriteInfoSet_field_14(int spriteId, int value);
void spriteInfoSet_field_7C(int spriteId, int value);
void spriteInfoSet_field_80(int spriteId, int value);
diff --git a/scumm/script_v90he.cpp b/scumm/script_v90he.cpp
index be77aef170..b3e8d211d0 100644
--- a/scumm/script_v90he.cpp
+++ b/scumm/script_v90he.cpp
@@ -1143,35 +1143,82 @@ void ScummEngine_v90he::o90_setSpriteInfo() {
}
void ScummEngine_v90he::o90_getSpriteGroupInfo() {
+ int32 tx, ty;
+ int spriteId, type;
+
byte subOp = fetchScriptByte();
switch (subOp) {
case 8: // HE 99+
pop();
+ push(0);
break;
case 30:
- pop();
+ spriteId = pop();
+ if (spriteId) {
+ spriteGroupGet_tx_ty(spriteId, tx, ty);
+ push(tx);
+ } else {
+ push(0);
+ }
break;
case 31:
- pop();
+ spriteId = pop();
+ if (spriteId) {
+ spriteGroupGet_tx_ty(spriteId, tx, ty);
+ push(ty);
+ } else {
+ push(0);
+ }
break;
case 42: // HE 99+
- pop();
- pop();
+ type = pop();
+ spriteId = pop();
+ if (spriteId) {
+ switch(type) {
+ case 0:
+ push(spriteGroupGet_field_30(spriteId));
+ break;
+ case 1:
+ push(spriteGroupGet_field_34(spriteId));
+ break;
+ case 2:
+ push(spriteGroupGet_field_38(spriteId));
+ break;
+ case 3:
+ push(spriteGroupGet_field_3C(spriteId));
+ break;
+ default:
+ push(0);
+ }
+ } else {
+ push(0);
+ }
break;
case 43:
- pop();
+ spriteId = pop();
+ if (spriteId) {
+ push(spriteGroupGet_field_10(spriteId));
+ } else {
+ push(0);
+ }
break;
case 63: // HE 99+
- pop();
+ spriteId = pop();
+ if (spriteId) {
+ push(spriteGroupGet_field_20(spriteId));
+ } else {
+ push(0);
+ }
break;
case 139: // HE 99+
+ // dummy case
pop();
pop();
+ push(0);
break;
default:
error("o90_getSpriteGroupInfo: Unknown case %d", subOp);
}
- push(0);
debug(1,"o90_getSpriteGroupInfo stub (%d)", subOp);
}
diff --git a/scumm/sprite_he.cpp b/scumm/sprite_he.cpp
index c1a5f04110..b79fd7aaa1 100644
--- a/scumm/sprite_he.cpp
+++ b/scumm/sprite_he.cpp
@@ -35,6 +35,10 @@ void ScummEngine_v90he::allocateArrays() {
spritesAllocTables(_numSprites, 64, 64);
}
+//
+// spriteInfoGet functions
+//
+
int ScummEngine_v90he::spriteInfoGet_flags_1(int spriteId) {
checkRange(_numSprites, 1, spriteId, "_spriteTableGet_flags_1: Invalid sprite %d");
@@ -182,6 +186,53 @@ void ScummEngine_v90he::spriteInfoGet_field_2C_30(int spriteId, int32 &field_2C,
}
//
+// spriteGroupGet functions
+//
+
+int ScummEngine_v90he::spriteGroupGet_field_10(int spriteId) {
+ checkRange(_numSprites, 1, spriteId, "spriteInfoGet_field_10: Invalid sprite %d");
+
+ return _spriteGroups[spriteId].field_10;
+}
+
+int ScummEngine_v90he::spriteGroupGet_field_20(int spriteId) {
+ checkRange(_numSprites, 1, spriteId, "spriteInfoGet_field_20: Invalid sprite %d");
+
+ return _spriteGroups[spriteId].field_20;
+}
+
+int ScummEngine_v90he::spriteGroupGet_field_30(int spriteId) {
+ checkRange(_numSprites, 1, spriteId, "spriteInfoGet_field_30: Invalid sprite %d");
+
+ return _spriteGroups[spriteId].field_30;
+}
+
+int ScummEngine_v90he::spriteGroupGet_field_34(int spriteId) {
+ checkRange(_numSprites, 1, spriteId, "spriteInfoGet_field_34: Invalid sprite %d");
+
+ return _spriteGroups[spriteId].field_34;
+}
+
+int ScummEngine_v90he::spriteGroupGet_field_38(int spriteId) {
+ checkRange(_numSprites, 1, spriteId, "spriteInfoGet_field_38: Invalid sprite %d");
+
+ return _spriteGroups[spriteId].field_38;
+}
+
+int ScummEngine_v90he::spriteGroupGet_field_3C(int spriteId) {
+ checkRange(_numSprites, 1, spriteId, "spriteInfoGet_field_3C: Invalid sprite %d");
+
+ return _spriteGroups[spriteId].field_3C;
+}
+
+void ScummEngine_v90he::spriteGroupGet_tx_ty(int spriteId, int32 &tx, int32 &ty) {
+ checkRange(_numSprites, 1, spriteId, "spriteGroupGet_tx_ty: Invalid sprite %d");
+
+ tx = _spriteGroups[spriteId].tx;
+ ty = _spriteGroups[spriteId].ty;
+}
+
+//
// spriteInfoSet functions
//
void ScummEngine_v90he::spriteInfoSet_field_14(int spriteId, int value) {