[Scummvm-git-logs] scummvm master -> 3776b4c384529bff8bd11c329af9c81d1f19d8f2
sev-
noreply at scummvm.org
Mon Aug 29 19:51:53 UTC 2022
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
3776b4c384 SCUMM: HE: dump costume script
Commit: 3776b4c384529bff8bd11c329af9c81d1f19d8f2
https://github.com/scummvm/scummvm/commit/3776b4c384529bff8bd11c329af9c81d1f19d8f2
Author: BLooperZ (blooperz at users.noreply.github.com)
Date: 2022-08-29T21:51:37+02:00
Commit Message:
SCUMM: HE: dump costume script
Changed paths:
engines/scumm/akos.cpp
engines/scumm/akos.h
engines/scumm/debugger.cpp
engines/scumm/debugger.h
diff --git a/engines/scumm/akos.cpp b/engines/scumm/akos.cpp
index d4fe525a787..4f6bd9ec9dc 100644
--- a/engines/scumm/akos.cpp
+++ b/engines/scumm/akos.cpp
@@ -52,71 +52,6 @@ struct AkosOffset {
#include "common/pack-end.h" // END STRUCT PACKING
-enum AkosOpcodes {
- AKC_Return = 0xC001,
- AKC_SetVar = 0xC010,
- AKC_CmdQue3 = 0xC015,
- AKC_C016 = 0xC016,
- AKC_C017 = 0xC017,
- AKC_C018 = 0xC018,
- AKC_C019 = 0xC019,
- AKC_ComplexChan = 0xC020,
- AKC_C021 = 0xC021,
- AKC_C022 = 0xC022,
- AKC_ComplexChan2 = 0xC025,
- AKC_Jump = 0xC030,
- AKC_JumpIfSet = 0xC031,
- AKC_AddVar = 0xC040,
- AKC_C042 = 0xC042,
- AKC_C044 = 0xC044,
- AKC_C045 = 0xC045,
- AKC_C046 = 0xC046,
- AKC_C047 = 0xC047,
- AKC_C048 = 0xC048,
- AKC_Ignore = 0xC050,
- AKC_IncVar = 0xC060,
- AKC_CmdQue3Quick = 0xC061,
- AKC_JumpStart = 0xC070,
- AKC_JumpE = 0xC070,
- AKC_JumpNE = 0xC071,
- AKC_JumpL = 0xC072,
- AKC_JumpLE = 0xC073,
- AKC_JumpG = 0xC074,
- AKC_JumpGE = 0xC075,
- AKC_StartAnim = 0xC080,
- AKC_StartVarAnim = 0xC081,
- AKC_Random = 0xC082,
- AKC_SetActorClip = 0xC083,
- AKC_StartAnimInActor = 0xC084,
- AKC_SetVarInActor = 0xC085,
- AKC_HideActor = 0xC086,
- AKC_SetDrawOffs = 0xC087,
- AKC_JumpTable = 0xC088,
- AKC_SoundStuff = 0xC089,
- AKC_Flip = 0xC08A,
- AKC_Cmd3 = 0xC08B,
- AKC_Ignore3 = 0xC08C,
- AKC_Ignore2 = 0xC08D,
- AKC_C08E = 0xC08E,
- AKC_SkipStart = 0xC090,
- AKC_SkipE = 0xC090,
- AKC_SkipNE = 0xC091,
- AKC_SkipL = 0xC092,
- AKC_SkipLE = 0xC093,
- AKC_SkipG = 0xC094,
- AKC_SkipGE = 0xC095,
- AKC_ClearFlag = 0xC09F,
- AKC_C0A0 = 0xC0A0,
- AKC_C0A1 = 0xC0A1,
- AKC_C0A2 = 0xC0A2,
- AKC_C0A3 = 0xC0A3,
- AKC_C0A4 = 0xC0A4,
- AKC_C0A5 = 0xC0A5,
- AKC_C0A6 = 0xC0A6,
- AKC_C0A7 = 0xC0A7,
- AKC_EndSeq = 0xC0FF
-};
-
static bool akos_compare(int a, int b, byte cmd) {
switch (cmd) {
case 0:
@@ -1373,10 +1308,6 @@ bool ScummEngine_v6::akos_increaseAnims(const byte *akos, Actor *a) {
return result;
}
-#define GW(o) ((int16)READ_LE_UINT16(aksq+curpos+(o)))
-#define GUW(o) READ_LE_UINT16(aksq+curpos+(o))
-#define GB(o) aksq[curpos+(o)]
-
bool ScummEngine_v6::akos_increaseAnim(Actor *a, int chan, const byte *aksq, const uint16 *akfo, int numakfo) {
byte active;
uint old_curpos, curpos, end;
diff --git a/engines/scumm/akos.h b/engines/scumm/akos.h
index e56ca9547a9..0dc3c0e1f83 100644
--- a/engines/scumm/akos.h
+++ b/engines/scumm/akos.h
@@ -123,6 +123,75 @@ protected:
void markRectAsDirty(Common::Rect rect);
};
+enum AkosOpcodes {
+ AKC_Return = 0xC001,
+ AKC_SetVar = 0xC010,
+ AKC_CmdQue3 = 0xC015,
+ AKC_C016 = 0xC016,
+ AKC_C017 = 0xC017,
+ AKC_C018 = 0xC018,
+ AKC_C019 = 0xC019,
+ AKC_ComplexChan = 0xC020,
+ AKC_C021 = 0xC021,
+ AKC_C022 = 0xC022,
+ AKC_ComplexChan2 = 0xC025,
+ AKC_Jump = 0xC030,
+ AKC_JumpIfSet = 0xC031,
+ AKC_AddVar = 0xC040,
+ AKC_C042 = 0xC042,
+ AKC_C044 = 0xC044,
+ AKC_C045 = 0xC045,
+ AKC_C046 = 0xC046,
+ AKC_C047 = 0xC047,
+ AKC_C048 = 0xC048,
+ AKC_Ignore = 0xC050,
+ AKC_IncVar = 0xC060,
+ AKC_CmdQue3Quick = 0xC061,
+ AKC_JumpStart = 0xC070,
+ AKC_JumpE = 0xC070,
+ AKC_JumpNE = 0xC071,
+ AKC_JumpL = 0xC072,
+ AKC_JumpLE = 0xC073,
+ AKC_JumpG = 0xC074,
+ AKC_JumpGE = 0xC075,
+ AKC_StartAnim = 0xC080,
+ AKC_StartVarAnim = 0xC081,
+ AKC_Random = 0xC082,
+ AKC_SetActorClip = 0xC083,
+ AKC_StartAnimInActor = 0xC084,
+ AKC_SetVarInActor = 0xC085,
+ AKC_HideActor = 0xC086,
+ AKC_SetDrawOffs = 0xC087,
+ AKC_JumpTable = 0xC088,
+ AKC_SoundStuff = 0xC089,
+ AKC_Flip = 0xC08A,
+ AKC_Cmd3 = 0xC08B,
+ AKC_Ignore3 = 0xC08C,
+ AKC_Ignore2 = 0xC08D,
+ AKC_C08E = 0xC08E,
+ AKC_SkipStart = 0xC090,
+ AKC_SkipE = 0xC090,
+ AKC_SkipNE = 0xC091,
+ AKC_SkipL = 0xC092,
+ AKC_SkipLE = 0xC093,
+ AKC_SkipG = 0xC094,
+ AKC_SkipGE = 0xC095,
+ AKC_ClearFlag = 0xC09F,
+ AKC_C0A0 = 0xC0A0,
+ AKC_C0A1 = 0xC0A1,
+ AKC_C0A2 = 0xC0A2,
+ AKC_C0A3 = 0xC0A3,
+ AKC_C0A4 = 0xC0A4,
+ AKC_C0A5 = 0xC0A5,
+ AKC_C0A6 = 0xC0A6,
+ AKC_C0A7 = 0xC0A7,
+ AKC_EndSeq = 0xC0FF
+};
+
+#define GW(o) ((int16)READ_LE_UINT16(aksq+curpos+(o)))
+#define GUW(o) READ_LE_UINT16(aksq+curpos+(o))
+#define GB(o) aksq[curpos+(o)]
+
} // End of namespace Scumm
#endif
diff --git a/engines/scumm/debugger.cpp b/engines/scumm/debugger.cpp
index a3e5be94919..08b4faf5203 100644
--- a/engines/scumm/debugger.cpp
+++ b/engines/scumm/debugger.cpp
@@ -35,6 +35,8 @@
#include "scumm/scumm.h"
#include "scumm/sound.h"
+#include "scumm/akos.h"
+
namespace Scumm {
void debugC(int channel, const char *s, ...) {
@@ -77,6 +79,7 @@ ScummDebugger::ScummDebugger(ScummEngine *s)
registerCmd("object", WRAP_METHOD(ScummDebugger, Cmd_Object));
registerCmd("script", WRAP_METHOD(ScummDebugger, Cmd_Script));
registerCmd("scr", WRAP_METHOD(ScummDebugger, Cmd_Script));
+ registerCmd("cosdump", WRAP_METHOD(ScummDebugger, Cmd_Cosdump));
registerCmd("scripts", WRAP_METHOD(ScummDebugger, Cmd_PrintScript));
registerCmd("importres", WRAP_METHOD(ScummDebugger, Cmd_ImportRes));
@@ -525,6 +528,329 @@ bool ScummDebugger::Cmd_PrintScript(int argc, const char **argv) {
return true;
}
+bool ScummDebugger::Cmd_Cosdump(int argc, const char **argv) {
+ const byte *akos;
+ const byte *aksq;
+ uint32 curpos;
+ uint32 code;
+ uint32 aend;
+ int costume;
+ int count;
+ int i;
+
+ if (argc < 2) {
+ debugPrintf("Syntax: cosdump <num>\n");
+ return true;
+ }
+
+ costume = atoi(argv[1]);
+ if (costume >= _vm->_numCostumes) {
+ debugPrintf("Costume %d is out of range (range: 1 - %d)\n", costume, _vm->_numCostumes);
+ return true;
+ }
+
+ akos = _vm->getResourceAddress(rtCostume, costume);
+
+ curpos = 0;
+ aksq = _vm->findResourceData(MKTAG('A','K','S','Q'), akos);
+ if (aksq == nullptr) {
+ debugPrintf("Costume %d does not have AKSQ block\n", costume);
+ return true;
+ }
+ aend = READ_BE_UINT32(aksq - 4) - 8;
+ debugPrintf("DUMP COSTUME SCRIPT %d (size %d)\n", costume, aend);
+ while (curpos < aend) {
+ code = GB(0);
+ if (code & 0x80)
+ code = READ_BE_UINT16(aksq + curpos);
+ debugPrintf("[%04x] (%04x) ", curpos, code);
+ switch (code) {
+ case AKC_Return:
+ debugPrintf("RETURN\n");
+ curpos += 2;
+ break;
+ case AKC_SetVar:
+ debugPrintf("VAR[%d] = %d\n", GB(4), GW(2));
+ curpos += 5;
+ break;
+ case AKC_CmdQue3:
+ debugPrintf("START SOUND %d\n", GB(2));
+ curpos += 3;
+ break;
+ case AKC_C016:
+ debugPrintf("IF SOUND RUNNING VAR[%d] GOTO [%04x]\n", GB(4), GUW(2));
+ curpos += 5;
+ break;
+ case AKC_C017:
+ debugPrintf("IF NOT SOUND RUNNING VAR[%d] GOTO [%04x]\n", GB(4), GUW(2));
+ curpos += 5;
+ break;
+ case AKC_C018:
+ debugPrintf("IF SOUND RUNNING %d GOTO [%04x]\n", GB(4), GUW(2));
+ curpos += 5;
+ break;
+ case AKC_C019:
+ debugPrintf("IF NOT SOUND RUNNING %d GOTO [%04x]\n", GB(4), GUW(2));
+ curpos += 5;
+ break;
+ case AKC_ComplexChan:
+ debugPrintf("DRAW:\n");
+ curpos += 2;
+ count = GB(0);
+ curpos++;
+ for (i = 0; i < count; i++) {
+ code = GB(4);
+ if (code & 0x80) {
+ code = READ_BE_UINT16(aksq + curpos + 4);
+ debugPrintf("\tEXTENDED OFFSET %d POS %d,%d\n", code, GW(0), GW(2));
+ curpos++;
+ } else {
+ debugPrintf("\tOFFSET %d POS %d,%d\n", code, GW(0), GW(2));
+ }
+ curpos += 5;
+ }
+ break;
+ case AKC_C021:
+ debugPrintf("CONDITION MASK DRAW [%04x] [", curpos + GB(2));
+ count = GB(3);
+ for (i = 0; i < count; i++) {
+ if (i)
+ debugPrintf(", ");
+ debugPrintf("%d", GB(4));
+ curpos++;
+ }
+ debugPrintf("]\n");
+ curpos += 4;
+ count = GB(0);
+ curpos++;
+ for (i = 0; i < count; i++) {
+ code = GB(4);
+ if (code & 0x80) {
+ code = READ_BE_UINT16(aksq + curpos + 4);
+ debugPrintf("\tEXTENDED OFFSET %d POS %d,%d\n", code, GW(0), GW(2));
+ curpos++;
+ } else {
+ debugPrintf("\tOFFSET %d POS %d,%d\n", code, GW(0), GW(2));
+ }
+ curpos += 5;
+ }
+ break;
+ case AKC_C022:
+ debugPrintf("CONDITION MASK DRAW [%04x] [", curpos + GB(2));
+ count = GB(3);
+ for (i = 0; i < count; i++) {
+ if (i)
+ debugPrintf(", ");
+ debugPrintf("%d", GB(4));
+ curpos++;
+ }
+ debugPrintf("] AT OFFSET %d, %d:\n", GW(2), GW(4));
+ curpos += 6;
+ count = GB(0);
+ curpos++;
+ for (i = 0; i < count; i++) {
+ code = GB(4);
+ if (code & 0x80) {
+ code = READ_BE_UINT16(aksq + curpos + 4);
+ debugPrintf("\tEXTENDED OFFSET %d POS %d,%d\n", code, GW(0), GW(2));
+ curpos++;
+ } else {
+ debugPrintf("\tOFFSET %d POS %d,%d\n", code, GW(0), GW(2));
+ }
+ curpos += 5;
+ }
+ break;
+ case AKC_ComplexChan2:
+ debugPrintf("DRAW AT OFFSET %d, %d:\n", GW(2), GW(4));
+ curpos += 6;
+ count = GB(0);
+ curpos++;
+ for (i = 0; i < count; i++) {
+ code = GB(4);
+ if (code & 0x80) {
+ code = READ_BE_UINT16(aksq + curpos + 4);
+ debugPrintf("\tEXTENDED OFFSET %d POS %d,%d\n", code, GW(0), GW(2));
+ curpos++;
+ } else {
+ debugPrintf("\tOFFSET %d POS %d,%d\n", code, GW(0), GW(2));
+ }
+ curpos += 5;
+ }
+ break;
+ case AKC_Jump:
+ debugPrintf("GOTO [%04x]\n", GUW(2));
+ curpos += 4;
+ break;
+ case AKC_JumpIfSet:
+ debugPrintf("IF VAR[%d] GOTO [%04x]\n", GB(4), GUW(2));
+ curpos += 5;
+ break;
+ case AKC_AddVar:
+ debugPrintf("VAR[%d] += %d\n", GB(4), GW(2));
+ curpos += 5;
+ break;
+ case AKC_C042:
+ debugPrintf("START SOUND %d SOFT\n", GB(2));
+ curpos += 3;
+ break;
+ case AKC_C044:
+ debugPrintf("START SOUND VAR[%d] SOFT\n", GB(2));
+ curpos += 3;
+ break;
+ case AKC_C045:
+ debugPrintf("USER CONDITION %d = VAR[%d] GOTO [%04x] \n", GB(3), GB(4), GB(2));
+ curpos += 5;
+ break;
+ case AKC_C046:
+ debugPrintf("VAR[%d] = USER CONDITION %d GOTO [%04x] \n", GB(4), GB(3), GB(2));
+ curpos += 5;
+ break;
+ case AKC_C047:
+ debugPrintf("TALK CONDITION %d SET GOTO [%04x] \n", GB(3), GB(2));
+ curpos += 4;
+ break;
+ case AKC_C048:
+ debugPrintf("VAR[%d] = TALK CONDITION %d GOTO [%04x] \n", GB(4), GB(3), GB(2));
+ curpos += 5;
+ break;
+ case AKC_Ignore:
+ debugPrintf("IGNORE %d\n", GB(2));
+ curpos += 3;
+ break;
+ case AKC_IncVar:
+ debugPrintf("VAR[0]++\n");
+ curpos += 2;
+ break;
+ case AKC_CmdQue3Quick:
+ debugPrintf("START SOUND QUICK\n");
+ curpos += 2;
+ break;
+ case AKC_JumpE:
+ debugPrintf("IF VAR[%d] == %d GOTO [%04x]\n", GB(4), GW(5), GUW(2));
+ curpos += 7;
+ break;
+ case AKC_JumpNE:
+ debugPrintf("IF VAR[%d] != %d GOTO [%04x]\n", GB(4), GW(5), GUW(2));
+ curpos += 7;
+ break;
+ case AKC_JumpL:
+ debugPrintf("IF VAR[%d] < %d GOTO [%04x]\n", GB(4), GW(5), GUW(2));
+ curpos += 7;
+ break;
+ case AKC_JumpLE:
+ debugPrintf("IF VAR[%d] <= %d GOTO [%04x]\n", GB(4), GW(5), GUW(2));
+ curpos += 7;
+ break;
+ case AKC_JumpG:
+ debugPrintf("IF VAR[%d] > %d GOTO [%04x]\n", GB(4), GW(5), GUW(2));
+ curpos += 7;
+ break;
+ case AKC_JumpGE:
+ debugPrintf("IF VAR[%d] >= %d GOTO [%04x]\n", GB(4), GW(5), GUW(2));
+ curpos += 7;
+ break;
+ case AKC_StartAnim:
+ debugPrintf("START ANIMATION %d\n", GB(2));
+ curpos += 3;
+ break;
+ case AKC_StartVarAnim:
+ debugPrintf("START ANIMATION VAR[%d]\n", GB(2));
+ curpos += 3;
+ break;
+ case AKC_Random:
+ debugPrintf("VAR[%d] = RANDOM BETWEEN %d AND %d\n", GB(6), GW(2), GW(4));
+ curpos += 7;
+ break;
+ case AKC_SetActorClip:
+ debugPrintf("ZCLIP %d\n", GB(2));
+ curpos += 3;
+ break;
+ case AKC_StartAnimInActor:
+ debugPrintf("START ANIMATION ACTOR VAR[%d] VAR[%d]\n", GB(2), GB(3));
+ curpos += 4;
+ break;
+ case AKC_SetVarInActor:
+ debugPrintf("ACTOR VAR[%d] VAR[%d] = %d\n", GB(2), GB(3), GW(4));
+ curpos += 6;
+ break;
+ case AKC_HideActor:
+ debugPrintf("DESTROY ACTOR\n");
+ curpos += 2;
+ break;
+ case AKC_SetDrawOffs:
+ debugPrintf("SET DRAW OFFSETS %d %d\n", GW(2), GW(4));
+ curpos += 6;
+ break;
+ case AKC_JumpTable:
+ debugPrintf("GOTO OFFSET AT VAR[%d]\n", GB(2));
+ curpos += 3;
+ break;
+ // case AKC_SoundStuff:
+ // break;
+ // case AKC_Flip:
+ // break;
+ // case AKC_Cmd3:
+ // break;
+ // case AKC_Ignore3:
+ // break;
+ case AKC_Ignore2:
+ debugPrintf("START SOUND VAR[%d]\n", GB(2));
+ curpos += 3;
+ break;
+ // case AKC_C08E:
+ // break;
+ // case AKC_SkipE:
+ // break;
+ // case AKC_SkipNE:
+ // break;
+ // case AKC_SkipL:
+ // break;
+ // case AKC_SkipLE:
+ // break;
+ // case AKC_SkipG:
+ // break;
+ // case AKC_SkipGE:
+ // break;
+ // case AKC_ClearFlag:
+ // break;
+ case AKC_C0A0:
+ debugPrintf("START TALK %d {%d}\n", GB(2), GB(3));
+ curpos += 4;
+ break;
+ case AKC_C0A1:
+ debugPrintf("IF ACTOR TALKING GOTO [%04x]\n", GUW(2));
+ curpos += 4;
+ break;
+ case AKC_C0A2:
+ debugPrintf("IF NOT ACTOR TALKING GOTO [%04x]\n", GUW(2));
+ curpos += 4;
+ break;
+ case AKC_C0A3:
+ debugPrintf("START TALK VAR[%d]\n", GB(2));
+ curpos += 3;
+ break;
+ // case AKC_C0A4:
+ // break;
+ // case AKC_C0A5:
+ // break;
+ // case AKC_C0A6:
+ // break;
+ // case AKC_C0A7:
+ // break;
+ case AKC_EndSeq:
+ debugPrintf("STOP\n");
+ curpos += 2;
+ break;
+ default:
+ warning("DEFAULT OP, breaking...\n");
+ return true;
+ break;
+ }
+ }
+
+ return true;
+}
+
bool ScummDebugger::Cmd_Actor(int argc, const char **argv) {
Actor *a;
int actnum;
diff --git a/engines/scumm/debugger.h b/engines/scumm/debugger.h
index 034575083f7..75303652e2c 100644
--- a/engines/scumm/debugger.h
+++ b/engines/scumm/debugger.h
@@ -65,6 +65,7 @@ private:
bool Cmd_Show(int argc, const char **argv);
bool Cmd_Hide(int argc, const char **argv);
+ bool Cmd_Cosdump(int argc, const char **argv);
bool Cmd_IMuse(int argc, const char **argv);
bool Cmd_DiMuse(int argc, const char **argv);
More information about the Scummvm-git-logs
mailing list