aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/intern.h21
-rw-r--r--scumm/script_v100he.cpp132
-rw-r--r--scumm/script_v90he.cpp132
-rw-r--r--scumm/sprite_he.cpp79
4 files changed, 314 insertions, 50 deletions
diff --git a/scumm/intern.h b/scumm/intern.h
index 15eb74b69a..0eadbdda53 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -854,6 +854,7 @@ protected:
int _curMaxSpriteId;
int _curSpriteId;
+ int _curSpriteGroupId;
public:
ScummEngine_v90he(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16]) : ScummEngine_v80he(detector, syst, gs, md5sum) {}
@@ -938,6 +939,26 @@ protected:
void spriteInfoSet_setClassFlags(int spriteId, int value1, int value2);
void spriteInfoSet_resetClassFlags(int spriteId);
+ void spriteGroupSet_case0_0(int spriteGroupId, int value1, int value2);
+ void spriteGroupSet_case0_1(int spriteGroupId, int value);
+ void spriteGroupSet_case0_2(int spriteGroupId, int value);
+ void spriteGroupSet_case0_3(int spriteGroupId, int value);
+ void spriteGroupSet_case0_4(int spriteGroupId);
+ void spriteGroupSet_case0_5(int spriteGroupId, int value);
+ void spriteGroupSet_case0_6(int spriteGroupId, int value);
+ void spriteGroupSet_case0_7(int spriteGroupId, int value);
+ void spriteGroupSet_case5_0(int spriteGroupId, int value);
+ void spriteGroupSet_case5_1(int spriteGroupId, int value);
+ void spriteGroupSet_case5_2(int spriteGroupId, int value);
+ void spriteGroupSet_case5_3(int spriteGroupId, int value);
+ void spriteGroupSet_field_10(int spriteGroupId, int value);
+ void spriteGroupSet_tx_ty(int spriteGroupId, int value1, int value2);
+ void spriteGroupSet_case26(int spriteGroupId, int value);
+ void spriteGroupSet_case28(int spriteGroupId, int value1, int value2);
+ void spriteGroupSet_fields_0_4_8_C(int spriteGroupId, int value1, int value2, int value3, int value4);
+ void spriteGroupSet_case56(int spriteGroupId);
+ void spriteGroupSet_case180(int spriteGroupId);
+
void spritesAllocTables(int numSprites, int numGroups, int numMaxSprites);
void spritesResetTables(bool refreshScreen);
void spriteGroupCheck(int spriteGroupId);
diff --git a/scumm/script_v100he.cpp b/scumm/script_v100he.cpp
index 8b2e776836..5c88186193 100644
--- a/scumm/script_v100he.cpp
+++ b/scumm/script_v100he.cpp
@@ -833,78 +833,160 @@ void ScummEngine_v100he::o100_drawObject() {
void ScummEngine_v100he::o100_setSpriteGroupInfo() {
byte string[260];
+ int type, value1, value2, value3, value4;
byte subOp = fetchScriptByte();
- debug(1,"o100_setSpriteGroupInfo stub (%d)", subOp);
+ debug(1,"o100_setSpriteGroupInfo (%d)", subOp);
switch (subOp) {
case 0:
- pop();
+ _curSpriteGroupId = pop();
break;
case 6:
- pop();
- pop();
+ value2 = pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case28(_curSpriteGroupId, value1, value2);
break;
case 18:
- pop();
- pop();
- pop();
- pop();
+ value4 = pop();
+ value3 = pop();
+ value2 = pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_fields_0_4_8_C(_curSpriteGroupId, value1, value2, value3, value4);
break;
case 38:
- switch (pop()) {
+ type = pop() - 1;
+ switch (type) {
+ case 0:
+ value2 = pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_0(_curSpriteGroupId, value1, value2);
+ break;
case 1:
- pop();
- pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_1(_curSpriteGroupId, value1);
break;
case 2:
- pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_2(_curSpriteGroupId, value1);
break;
case 3:
- pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_3(_curSpriteGroupId, value1);
break;
case 4:
- pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_4(_curSpriteGroupId);
break;
case 5:
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_5(_curSpriteGroupId, value1);
break;
case 6:
- pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_6(_curSpriteGroupId, value1);
break;
case 7:
- pop();
- break;
- case 8:
- pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_7(_curSpriteGroupId, value1);
break;
default:
error("o100_setSpriteGroupInfo subOp 38: Unknown case %d", subOp);
}
break;
case 40:
- pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case26(_curSpriteGroupId, value1);
break;
case 49:
- pop();
- pop();
+ value2 = pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_tx_ty(_curSpriteGroupId, value1, value2);
break;
case 52:
copyScriptString(string);
break;
case 53:
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case180(_curSpriteGroupId);
break;
case 54:
+ // dummy case
pop();
pop();
break;
case 59:
- pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_field_10(_curSpriteGroupId, value1);
break;
case 60:
- pop();
- pop();
+ type = pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ switch (type) {
+ case 0:
+ spriteGroupSet_case5_0(_curSpriteGroupId, value1);
+ break;
+ case 1:
+ spriteGroupSet_case5_1(_curSpriteGroupId, value1);
+ break;
+ case 2:
+ spriteGroupSet_case5_2(_curSpriteGroupId, value1);
+ break;
+ case 3:
+ spriteGroupSet_case5_3(_curSpriteGroupId, value1);
+ break;
+ default:
+ error("o100_setSpriteGroupInfo subOp 60: Unknown case %d", subOp);
+ }
break;
case 89:
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case56(_curSpriteGroupId);
break;
default:
error("o100_setSpriteGroupInfo: Unknown case %d", subOp);
diff --git a/scumm/script_v90he.cpp b/scumm/script_v90he.cpp
index 1c5293563e..144faf79c4 100644
--- a/scumm/script_v90he.cpp
+++ b/scumm/script_v90he.cpp
@@ -1361,71 +1361,153 @@ void ScummEngine_v90he::o90_getSpriteGroupInfo() {
}
void ScummEngine_v90he::o90_setSpriteGroupInfo() {
+ int type, value1, value2, value3, value4;
+
byte subOp = fetchScriptByte();
subOp -= 37;
- debug(1,"o90_setSpriteGroupInfo stub (%d)", subOp);
+ debug(1,"o90_setSpriteGroupInfo (%d)", subOp);
switch (subOp) {
case 0:
- switch (pop()) {
+ type = pop() - 1;
+ switch (type) {
+ case 0:
+ value2 = pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_0(_curSpriteGroupId, value1, value2);
+ break;
case 1:
- pop();
- pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_1(_curSpriteGroupId, value1);
break;
case 2:
- pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_2(_curSpriteGroupId, value1);
break;
case 3:
- pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_3(_curSpriteGroupId, value1);
break;
case 4:
- pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_4(_curSpriteGroupId);
break;
case 5:
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_5(_curSpriteGroupId, value1);
break;
case 6:
- pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_6(_curSpriteGroupId, value1);
break;
case 7:
- pop();
- break;
- case 8:
- pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case0_7(_curSpriteGroupId, value1);
break;
default:
error("o90_setSpriteGroupInfo subOp 0: Unknown case %d", subOp);
}
break;
case 5:
- pop();
- pop();
+ type = pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ switch (type) {
+ case 0:
+ spriteGroupSet_case5_0(_curSpriteGroupId, value1);
+ break;
+ case 1:
+ spriteGroupSet_case5_1(_curSpriteGroupId, value1);
+ break;
+ case 2:
+ spriteGroupSet_case5_2(_curSpriteGroupId, value1);
+ break;
+ case 3:
+ spriteGroupSet_case5_3(_curSpriteGroupId, value1);
+ break;
+ default:
+ error("o90_setSpriteGroupInfo subOp 5: Unknown case %d", subOp);
+ }
break;
case 6:
- pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_field_10(_curSpriteGroupId, value1);
break;
case 7:
- pop();
- pop();
+ value2 = pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_tx_ty(_curSpriteGroupId, value1, value2);
break;
case 20:
- pop();
+ _curSpriteGroupId = pop();
break;
case 26:
- pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case26(_curSpriteGroupId, value1);
break;
case 28:
- pop();
- pop();
+ value2 = pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case28(_curSpriteGroupId, value1, value2);
break;
case 30:
- pop();
- pop();
- pop();
- pop();
+ value4 = pop();
+ value3 = pop();
+ value2 = pop();
+ value1 = pop();
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_fields_0_4_8_C(_curSpriteGroupId, value1, value2, value3, value4);
break;
case 56:
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case56(_curSpriteGroupId);
break;
case 180:
+ if (!_curSpriteGroupId)
+ break;
+
+ spriteGroupSet_case180(_curSpriteGroupId);
break;
default:
error("o90_setSpriteGroupInfo: Unknown case %d", subOp);
diff --git a/scumm/sprite_he.cpp b/scumm/sprite_he.cpp
index 79c36cac83..cfcaa299ed 100644
--- a/scumm/sprite_he.cpp
+++ b/scumm/sprite_he.cpp
@@ -512,6 +512,85 @@ void ScummEngine_v90he::spriteInfoSet_addImageToList(int spriteId, int imageNum,
// TODO
}
+//
+// spriteGroupSet functions
+//
+void ScummEngine_v90he::spriteGroupSet_case0_0(int spriteGroupId, int value1, int value2) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_case0_1(int spriteGroupId, int value) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_case0_2(int spriteGroupId, int value) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_case0_3(int spriteGroupId, int value) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_case0_4(int spriteGroupId) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_case0_5(int spriteGroupId, int value) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_case0_6(int spriteGroupId, int value) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_case0_7(int spriteGroupId, int value) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_case5_0(int spriteGroupId, int value) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_case5_1(int spriteGroupId, int value) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_case5_2(int spriteGroupId, int value) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_case5_3(int spriteGroupId, int value) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_field_10(int spriteGroupId, int value) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_tx_ty(int spriteGroupId, int value1, int value2) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_case26(int spriteGroupId, int value) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_case28(int spriteGroupId, int value1, int value2) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_fields_0_4_8_C(int spriteGroupId, int value1, int value2, int value3, int value4) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_case56(int spriteGroupId) {
+ // TODO
+}
+
+void ScummEngine_v90he::spriteGroupSet_case180(int spriteGroupId) {
+ // TODO
+}
+
void ScummEngine_v90he::spritesAllocTables(int numSprites, int numGroups, int numMaxSprites) {
_varNumSpriteGroups = numGroups;
_numSpritesToProcess = 0;