From 878675cbd0487b2064abdd452006fdcfb8d6896d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 16 Aug 2019 14:14:51 +0300 Subject: STARTREK: Simplify screen name code and add the "actions" debug command - The screen name and map name code have been merged and simplified - Some usage of SharedPtr has been adapted - Duplicate code for loading the room map has been merged - The "actions" command has been imported from the tools code - Cleanup --- engines/startrek/console.cpp | 186 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 184 insertions(+), 2 deletions(-) (limited to 'engines/startrek/console.cpp') 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 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 -- cgit v1.2.3