[Scummvm-git-logs] scummvm master -> df54c6be6c6170489f420e4be68469d198401b55
bluegr
noreply at scummvm.org
Sun Jul 14 18:46:13 UTC 2024
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:
df54c6be6c DGDS: Dump script from debug console
Commit: df54c6be6c6170489f420e4be68469d198401b55
https://github.com/scummvm/scummvm/commit/df54c6be6c6170489f420e4be68469d198401b55
Author: BLooperZ (blooperz at users.noreply.github.com)
Date: 2024-07-14T21:46:08+03:00
Commit Message:
DGDS: Dump script from debug console
Changed paths:
engines/dgds/console.cpp
engines/dgds/console.h
diff --git a/engines/dgds/console.cpp b/engines/dgds/console.cpp
index 7b4bc56d4ba..8c73842a043 100644
--- a/engines/dgds/console.cpp
+++ b/engines/dgds/console.cpp
@@ -27,6 +27,7 @@
#include "image/png.h"
+#include "dgds/ads.h"
#include "dgds/console.h"
#include "dgds/decompress.h"
#include "dgds/dgds.h"
@@ -49,6 +50,7 @@ Console::Console(DgdsEngine *vm) : _vm(vm) {
registerCmd("imagedumpall", WRAP_METHOD(Console, cmdImageDumpAll));
registerCmd("global", WRAP_METHOD(Console, cmdGlobal));
registerCmd("scene", WRAP_METHOD(Console, cmdScene));
+ registerCmd("scriptdump", WRAP_METHOD(Console, cmdScriptDump));
}
bool Console::cmdFileInfo(int argc, const char **argv) {
@@ -284,4 +286,187 @@ bool Console::cmdScene(int argc, const char **argv) {
return true;
}
+void Console::printOp(int indent, const char *text) {
+ for (int i = 0; i < indent; i++) {
+ debugPrintf("\t");
+ }
+ debugPrintf("%s", text);
+}
+
+bool Console::cmdScriptDump(int argc, const char **argv) {
+ if (argc < 2) {
+ debugPrintf("Usage: %s <filename>\n", argv[0]);
+ debugPrintf(" eg: %s CLBATH.ADS\n", argv[0]);
+ return true;
+ }
+
+ Common::String fname(argv[1]);
+
+ Common::SeekableReadStream *resStream = _vm->getResource(fname, false);
+ if (resStream == nullptr) {
+ debugPrintf("Resource %s not found\n", fname.c_str());
+ return true;
+ }
+
+ ADSData adsData;
+ ADSInterpreter interp(_vm);
+ ADSParser dgds(_vm->getResourceManager(), _vm->getDecompressor());
+ dgds.parse(&adsData, fname);
+
+ adsData.scr->seek(0);
+
+ uint8 segno = 0;
+ uint8 indent = 1;
+ uint16 opcode;
+ uint16 tag = 1;
+ while (!adsData.scr->eos()) {
+ opcode = adsData.scr->readUint16LE();
+ switch (opcode) {
+ case 0xFFFF:
+ printOp(indent, "END\n");
+ tag = adsData.scr->readUint16LE();
+ segno++;
+ // Fall through
+ case 0x0001:
+ if (adsData._tags.contains(tag))
+ debugPrintf("\n%d: %s\n", segno, adsData._tags[tag].c_str());
+ continue;
+ case 0x0003:
+ printOp(indent, "unknown");
+ break;
+ case 0x0005:
+ printOp(indent, "init");
+ break;
+ case 0x1010:
+ printOp(indent++, "WHILE runtype");
+ break;
+ case 0x1020:
+ printOp(indent++, "WHILE not runtype");
+ break;
+ case 0x1030:
+ printOp(indent++, "WHILE NOT_PLAYED");
+ break;
+ case 0x1040:
+ printOp(indent++, "WHILE PLAYED");
+ break;
+ case 0x1050:
+ printOp(indent++, "WHILE FINISHED");
+ break;
+ case 0x1060:
+ printOp(indent++, "WHILE NOT_RUNNING");
+ break;
+ case 0x1070:
+ printOp(indent++, "WHILE RUNNING");
+ break;
+ case 0x1080:
+ printOp(indent++, "WHILE count?");
+ break;
+ case 0x1090:
+ printOp(indent++, "WHILE ??");
+ break;
+ case 0x1310:
+ printOp(indent++, "IF runtype 5");
+ break;
+ case 0x1320:
+ printOp(indent++, "IF not runtype 5");
+ break;
+ case 0x1330:
+ printOp(indent++, "IF NOT_PLAYED");
+ break;
+ case 0x1340:
+ printOp(indent++, "IF PLAYED");
+ break;
+ case 0x1350:
+ printOp(indent++, "IF FINISHED");
+ break;
+ case 0x1360:
+ printOp(indent++, "IF NOT_RUNNING");
+ break;
+ case 0x1370:
+ printOp(indent++, "IF RUNNING");
+ break;
+ case 0x1380:
+ printOp(indent++, "IF DETAIL LEVEL <=");
+ break;
+ case 0x1390:
+ printOp(indent++, "IF DETAIL LEVEL >=");
+ break;
+ case 0x1500:
+ printOp(--indent, "ELSE / Skip to end-if");
+ break;
+ case 0x1510:
+ printOp(--indent, "END IF");
+ break;
+ case 0x1520:
+ printOp(--indent, "END WHILE");
+ break;
+ case 0x2000:
+ printOp(indent, "ADD sequence");
+ break;
+ case 0x2005:
+ printOp(indent, "ADD sequence");
+ break;
+ case 0x2010:
+ printOp(indent, "STOP SCENE");
+ break;
+ case 0x2015:
+ printOp(indent, "SET RUNFLAG 5");
+ break;
+ case 0x2020:
+ printOp(indent, "RESET SEQ");
+ break;
+ case 0x3020:
+ printOp(indent, "RANDOM_NOOP");
+ break;
+ case 0x3010:
+ printOp(indent++, "RANDOM_START");
+ break;
+ case 0x30FF:
+ printOp(--indent, "RANDOM_END");
+ break;
+ case 0x4000:
+ printOp(indent, "MOVE SEQ TO BACK");
+ break;
+ case 0x4010:
+ printOp(indent, "MOVE SEQ TO FRONT");
+ break;
+ case 0xF000:
+ printOp(indent, "SET STATE 2");
+ break;
+ case 0xF010:
+ printOp(indent, "FADE_OUT");
+ break;
+ case 0xF200:
+ printOp(indent, "RUN_SCRIPT");
+ break;
+ case 0xF210:
+ printOp(indent, "RUN_SCRIPT");
+ break;
+ case 0x1420:
+ printOp(--indent, "AND");
+ break;
+ case 0x1430:
+ printOp(--indent, "OR");
+ break;
+ case 0xFF10:
+ printOp(indent, "UNKNOWN");
+ break;
+ case 0xFFF0:
+ printOp(indent, "END_IF");
+ break;
+ default:
+ printOp(indent, "UNKNOWN");
+ debugPrintf("(%04x)", opcode);
+ break;
+ }
+ int numArgs = interp.numArgs(opcode);
+ for (int i = 0; i < numArgs; i++) {
+ debugPrintf(" %d", adsData.scr->readUint16LE());
+ }
+ debugPrintf("\n");
+ }
+
+ return true;
+}
+
} // End of namespace Dgds
diff --git a/engines/dgds/console.h b/engines/dgds/console.h
index eaf148fde71..26c066a44e4 100644
--- a/engines/dgds/console.h
+++ b/engines/dgds/console.h
@@ -42,6 +42,8 @@ private:
bool cmdImageDump(int argc, const char **argv);
bool cmdGlobal(int argc, const char **argv);
bool cmdScene(int argc, const char **argv);
+ void printOp(int indent, const char *text);
+ bool cmdScriptDump(int argc, const char **argv);
DgdsEngine *_vm;
};
More information about the Scummvm-git-logs
mailing list