aboutsummaryrefslogtreecommitdiff
path: root/engines/startrek/console.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/startrek/console.cpp')
-rw-r--r--engines/startrek/console.cpp186
1 files changed, 184 insertions, 2 deletions
diff --git a/engines/startrek/console.cpp b/engines/startrek/console.cpp
index 5e6108efa6..816b5ce742 100644
--- a/engines/startrek/console.cpp
+++ b/engines/startrek/console.cpp
@@ -22,12 +22,14 @@
#include "startrek/console.h"
#include "gui/debugger.h"
+#include "startrek/room.h"
#include "startrek/startrek.h"
namespace StarTrek {
Console::Console(StarTrekEngine *vm) : GUI::Debugger(), _vm(vm) {
registerCmd("room", WRAP_METHOD(Console, Cmd_Room));
+ registerCmd("actions", WRAP_METHOD(Console, Cmd_Actions));
}
Console::~Console() {
@@ -35,9 +37,9 @@ Console::~Console() {
bool Console::Cmd_Room(int argc, const char **argv) {
if (argc < 3) {
- debugPrintf("Current room: %s%d\n", _vm->_missionToLoad.c_str(), _vm->_roomIndexToLoad);
+ debugPrintf("Current room: %s\n", _vm->getScreenName().c_str());
debugPrintf("Use room <mission> <room> to teleport\n");
- debugPrintf("Valid missions are: DEMON, TUG, LOVE, MUDD, FEATHER, TRIAL, SINS, VENG");
+ debugPrintf("Valid missions are: DEMON, TUG, LOVE, MUDD, FEATHER, TRIAL, SINS, VENG\n");
return true;
}
@@ -48,4 +50,184 @@ bool Console::Cmd_Room(int argc, const char **argv) {
return false;
}
+bool Console::Cmd_Actions(int argc, const char **argv) {
+ Common::String screenName = _vm->getScreenName();
+
+ if (argc == 3) {
+ Common::String missionName = argv[1];
+ int roomIndex = atoi(argv[2]);
+
+ screenName = missionName + (char)(roomIndex + '0');
+ }
+
+ Common::MemoryReadStreamEndian *rdfFile = _vm->loadFile(screenName + ".RDF");
+ rdfFile->seek(14);
+
+ uint16 startOffset = rdfFile->readUint16LE();
+ uint16 endOffset = rdfFile->readUint16LE();
+ uint16 offset = startOffset;
+
+ while (offset < endOffset) {
+ rdfFile->seek(offset);
+
+ uint32 action = rdfFile->readUint32LE();
+ uint16 nextOffset = rdfFile->readUint16LE();
+
+ debugPrintf("Offset %d: %s\n", offset, EventToString(action).c_str());
+ offset = nextOffset;
+ }
+
+ delete rdfFile;
+
+ return true;
+}
+
+Common::String Console::EventToString(uint32 action) {
+ const char *actions[] = {
+ "Tick",
+ "Walk",
+ "Use",
+ "Get",
+ "Look",
+ "Talk"
+ };
+
+ byte verb = action & 0xff;
+ byte subject = (action >> 8) & 0xff;
+ byte b2 = (action >> 16) & 0xff;
+ byte b3 = (action >> 24) & 0xff;
+
+ String retString;
+ switch (verb) {
+ case 0: // Tick
+ retString = Common::String::format("Tick %d", (subject | (b2 << 8)));
+ break;
+ case 2: // Use
+ retString = Common::String(actions[verb]) + " " + ItemToString(subject) + ", " + ItemToString(b2);
+ break;
+ case 1: // Walk
+ case 3: // Get
+ case 4: // Look
+ case 5: // Talk
+ retString = Common::String(actions[verb]) + " " + ItemToString(subject);
+ break;
+ case 6: // Warp touched
+ retString = Common::String::format("Touched warp %d", subject);
+ break;
+ case 7: // Hotspot touched
+ retString = Common::String::format("Touched hotspot %d", subject);
+ break;
+ case 8: // Timer expired
+ retString = Common::String::format("Timer %d expired", subject);
+ break;
+ case 10: // Animation finished
+ retString = Common::String::format("Finished animation (%d)", subject);
+ break;
+ case 12: // Walking finished
+ retString = Common::String::format("Finished walking (%d)", subject);
+ break;
+ default:
+ retString = Common::String::format("%x%x%x%x", verb, subject, b2, b3);
+ break;
+ }
+
+ // Check for actions using bytes they're not expected to use
+ if (b3 != 0)
+ debugPrintf("WARNING: b3 nonzero in action: %s\n", retString.c_str());
+ if (b2 != 0 && verb != 0 && verb != 2)
+ debugPrintf("WARNING: b2 nonzero in action: %s\n", retString.c_str());
+
+ return retString;
+}
+
+const char *itemNames[] = {
+ "IPHASERS",
+ "IPHASERK",
+ "IHAND",
+ "IROCK",
+ "ISTRICOR",
+ "IMTRICOR",
+ "IDEADGUY",
+ "ICOMM",
+ "IPBC",
+ "IRLG",
+ "IWRENCH",
+ "IINSULAT",
+ "ISAMPLE",
+ "ICURE",
+ "IDISHES",
+ "IRT",
+ "IRTWB",
+ "ICOMBBIT",
+ "IJNKMETL",
+ "IWIRING",
+ "IWIRSCRP",
+ "IPWF",
+ "IPWE",
+ "IDEADPH",
+ "IBOMB",
+ "IMETAL",
+ "ISKULL",
+ "IMINERAL",
+ "IMETEOR",
+ "ISHELLS",
+ "IDEGRIME",
+ "ILENSES",
+ "IDISKS",
+ "IANTIGRA",
+ "IN2GAS",
+ "IO2GAS",
+ "IH2GAS",
+ "IN2O",
+ "INH3",
+ "IH2O",
+ "IWROD",
+ "IIROD",
+ "IREDGEM_A",
+ "IREDGEM_B",
+ "IREDGEM_C",
+ "IGRNGEM_A",
+ "IGRNGEM_B",
+ "IGRNGEM_C",
+ "IBLUGEM_A",
+ "IBLUGEM_B",
+ "IBLUGEM_C",
+ "ICONECT",
+ "IS8ROCKS",
+ "IIDCARD",
+ "ISNAKE",
+ "IFERN",
+ "ICRYSTAL",
+ "IKNIFE",
+ "IDETOXIN",
+ "IBERRY",
+ "IDOOVER",
+ "IALIENDV",
+ "ICAPSULE",
+ "IMEDKIT",
+ "IBEAM",
+ "IDRILL",
+ "IHYPO",
+ "IFUSION",
+ "ICABLE1",
+ "ICABLE2",
+ "ILMD",
+ "IDECK",
+ "ITECH"
+};
+
+Common::String Console::ItemToString(byte index) {
+ if (index == 0)
+ return "KIRK";
+ else if (index == 1)
+ return "SPOCK";
+ else if (index == 2)
+ return "MCCOY";
+ else if (index == 3)
+ return "REDSHIRT";
+ else if (index >= 0x40 && (index - 0x40) < ARRAYSIZE(itemNames))
+ return itemNames[index - 0x40];
+ return Common::String(Common::String::format("0x%02x:", index)); // TODO
+}
+
} // End of namespace StarTrek