diff options
-rw-r--r-- | scumm/intern.h | 21 | ||||
-rw-r--r-- | scumm/script_v100he.cpp | 132 | ||||
-rw-r--r-- | scumm/script_v90he.cpp | 132 | ||||
-rw-r--r-- | scumm/sprite_he.cpp | 79 |
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; |