aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Templier2010-10-22 22:00:27 +0000
committerJulien Templier2010-10-22 22:00:27 +0000
commit90974937a3a56cd2446101d7ee663e1bdbe82db2 (patch)
tree63430b05dd9cc0fb7660546c984645b9e7a45ef6
parent610c5eb336f9e6561f44772845fbd525a0bb5eab (diff)
downloadscummvm-rg350-90974937a3a56cd2446101d7ee663e1bdbe82db2.tar.gz
scummvm-rg350-90974937a3a56cd2446101d7ee663e1bdbe82db2.tar.bz2
scummvm-rg350-90974937a3a56cd2446101d7ee663e1bdbe82db2.zip
LASTEXPRESS: Reorganize and enhance some debug commands
Add "time" command to convert between in-game and human-readable forms Rename "dump" command to "show" and use named parameters instead of index Add progress and flags options to show command svn-id: r53715
-rw-r--r--engines/lastexpress/debug.cpp88
-rw-r--r--engines/lastexpress/debug.h3
-rw-r--r--engines/lastexpress/game/menu.cpp6
-rw-r--r--engines/lastexpress/game/state.cpp8
-rw-r--r--engines/lastexpress/game/state.h155
5 files changed, 226 insertions, 34 deletions
diff --git a/engines/lastexpress/debug.cpp b/engines/lastexpress/debug.cpp
index 2f52508eca..f26fdf61b9 100644
--- a/engines/lastexpress/debug.cpp
+++ b/engines/lastexpress/debug.cpp
@@ -81,7 +81,8 @@ Debugger::Debugger(LastExpressEngine *engine) : _engine(engine), _command(NULL),
// Game
DCmd_Register("delta", WRAP_METHOD(Debugger, cmdTimeDelta));
- DCmd_Register("dump", WRAP_METHOD(Debugger, cmdDump));
+ DCmd_Register("time", WRAP_METHOD(Debugger, cmdTime));
+ DCmd_Register("show", WRAP_METHOD(Debugger, cmdShow));
DCmd_Register("entity", WRAP_METHOD(Debugger, cmdEntity));
// Misc
@@ -201,8 +202,8 @@ bool Debugger::cmdHelp(int, const char **) {
DebugPrintf(" beetle - start the beetle game\n");
DebugPrintf("\n");
DebugPrintf(" delta - Adjust the time delta\n");
- DebugPrintf(" dump - Dump game data\n");
- DebugPrintf(" entity - Dump entity data\n");
+ DebugPrintf(" show - show game data\n");
+ DebugPrintf(" entity - show entity data\n");
DebugPrintf("\n");
DebugPrintf(" loadgame - load a saved game\n");
DebugPrintf(" chapter - switch to a specific chapter\n");
@@ -894,7 +895,7 @@ bool Debugger::cmdBeetle(int argc, const char **argv) {
*/
bool Debugger::cmdTimeDelta(int argc, const char **argv) {
if (argc == 2) {
- int delta = getNumber(argv[1]);
+ int delta = getNumber(argv[1]);
if (delta <= 0 || delta > 500)
goto label_error;
@@ -909,14 +910,43 @@ label_error:
}
/**
- * Command: dumps game logic data
+ * Command: Convert between in-game time and human readable time
*
* @param argc The argument count.
* @param argv The values.
*
* @return true if it was handled, false otherwise
*/
-bool Debugger::cmdDump(int argc, const char **argv) {
+bool Debugger::cmdTime(int argc, const char **argv) {
+ if (argc == 2) {
+ int time = getNumber(argv[1]);
+
+ if (time < 0)
+ goto label_error;
+
+ // Convert to human-readable form
+ uint8 hours = 0;
+ uint8 minutes = 0;
+ State::getHourMinutes(time, &hours, &minutes);
+
+ DebugPrintf("%02d:%02d\n", hours, minutes);
+ } else {
+label_error:
+ DebugPrintf("Syntax: time <time to convert> (time=0-INT_MAX)\n");
+ }
+
+ return true;
+}
+
+/**
+ * Command: show game logic data
+ *
+ * @param argc The argument count.
+ * @param argv The values.
+ *
+ * @return true if it was handled, false otherwise
+ */
+bool Debugger::cmdShow(int argc, const char **argv) {
#define OUTPUT_DUMP(name, text) \
DebugPrintf(#name "\n"); \
DebugPrintf("--------------------------------------------------------------------\n\n"); \
@@ -924,41 +954,37 @@ bool Debugger::cmdDump(int argc, const char **argv) {
DebugPrintf("\n");
if (argc == 2) {
- switch (getNumber(argv[1])) {
- default:
- goto label_error;
- // GameState
- case 1:
- OUTPUT_DUMP("Game state", getState()->toString().c_str());
- break;
+ Common::String name(const_cast<char *>(argv[1]));
- // Inventory
- case 2:
+ if (name == "state" || name == "st") {
+ OUTPUT_DUMP("Game state", getState()->toString().c_str());
+ } else if (name == "progress" || name == "pr") {
+ OUTPUT_DUMP("Progress", getProgress().toString().c_str());
+ } else if (name == "flags" || name == "fl") {
+ OUTPUT_DUMP("Flags", getFlags()->toString().c_str());
+ } else if (name == "inventory" || name == "inv") {
OUTPUT_DUMP("Inventory", getInventory()->toString().c_str());
- break;
-
- // Objects
- case 3:
+ } else if (name == "objects" || name == "obj") {
OUTPUT_DUMP("Objects", getObjects()->toString().c_str());
- break;
-
- // SavePoints
- case 4:
+ } else if (name == "savepoints" || name == "pt") {
OUTPUT_DUMP("SavePoints", getSavePoints()->toString().c_str());
- break;
-
- case 5:
+ } else if (name == "scene" || name == "sc") {
OUTPUT_DUMP("Current scene", getScenes()->get(getState()->scene)->toString().c_str());
+ } else {
+ goto label_error;
}
+
} else {
label_error:
DebugPrintf("Syntax: state <option>\n");
- DebugPrintf(" 1 : Game state\n");
- DebugPrintf(" 2 : Inventory\n");
- DebugPrintf(" 3 : Objects\n");
- DebugPrintf(" 4 : SavePoints\n");
- DebugPrintf(" 5 : Current scene\n");
+ DebugPrintf(" state / st\n");
+ DebugPrintf(" progress / pr\n");
+ DebugPrintf(" flags / fl\n");
+ DebugPrintf(" inventory / inv\n");
+ DebugPrintf(" objects / obj\n");
+ DebugPrintf(" savepoints / pt\n");
+ DebugPrintf(" scene / sc\n");
}
return true;
diff --git a/engines/lastexpress/debug.h b/engines/lastexpress/debug.h
index bb13c76bd0..84be4ed4a5 100644
--- a/engines/lastexpress/debug.h
+++ b/engines/lastexpress/debug.h
@@ -77,7 +77,8 @@ private:
bool cmdBeetle(int argc, const char **argv);
bool cmdTimeDelta(int argc, const char **argv);
- bool cmdDump(int argc, const char **argv);
+ bool cmdTime(int argc, const char **argv);
+ bool cmdShow(int argc, const char **argv);
bool cmdEntity(int argc, const char **argv);
bool cmdLoadGame(int argc, const char **argv);
diff --git a/engines/lastexpress/game/menu.cpp b/engines/lastexpress/game/menu.cpp
index 19678a3255..6992178d57 100644
--- a/engines/lastexpress/game/menu.cpp
+++ b/engines/lastexpress/game/menu.cpp
@@ -238,8 +238,10 @@ void Clock::draw(uint32 time) {
// 54000 * 24 = 1296000 = 1 day
// Calculate each sequence index from the current time
- uint8 hour = (uint8)((time % 1296000) / 54000);
- uint8 minute = (uint8)((time % 54000) / 900);
+
+ uint8 hour = 0;
+ uint8 minute = 0;
+ State::getHourMinutes(time, &hour, &minute);
uint32 index_date = 18 * time / 1296000;
if (hour == 23)
index_date += 18 * minute / 60;
diff --git a/engines/lastexpress/game/state.cpp b/engines/lastexpress/game/state.cpp
index 8675f6e312..9586c58ceb 100644
--- a/engines/lastexpress/game/state.cpp
+++ b/engines/lastexpress/game/state.cpp
@@ -58,6 +58,14 @@ bool State::isNightTime() const {
|| (_state->progress.chapter == kChapter5 && !_state->progress.isNightTime));
}
+void State::getHourMinutes(uint32 time, uint8 *hours, uint8 *minutes) {
+ if (hours == NULL || minutes == NULL)
+ error("State::getHourMinutes: invalid parameters passed!");
+
+ *hours = (uint8)((time % 1296000) / 54000);
+ *minutes = (uint8)((time % 54000) / 900);
+}
+
uint32 State::getPowerOfTwo(uint32 x) {
if (!x || (x & 1))
return 0;
diff --git a/engines/lastexpress/game/state.h b/engines/lastexpress/game/state.h
index a8ddfc7051..76a7cbc3f2 100644
--- a/engines/lastexpress/game/state.h
+++ b/engines/lastexpress/game/state.h
@@ -450,6 +450,143 @@ public:
EXPOSE_VALUE(127, field_1FC);
}
}
+
+ Common::String toString() {
+#define PRINT_VALUE(idx, name) ret += Common::String::printf("(%03d) " #name " = %d\n", idx, name);
+
+ Common::String ret = "";
+
+ PRINT_VALUE(0, field_0);
+ PRINT_VALUE(1, jacket);
+ PRINT_VALUE(2, eventCorpseMovedFromFloor);
+ PRINT_VALUE(3, field_C);
+ PRINT_VALUE(4, eventCorpseFound);
+ PRINT_VALUE(5, field_14);
+ PRINT_VALUE(6, field_18);
+ PRINT_VALUE(7, portrait);
+ PRINT_VALUE(8, eventCorpseThrown);
+ PRINT_VALUE(9, field_24);
+ PRINT_VALUE(10, field_28);
+ PRINT_VALUE(11, chapter);
+ PRINT_VALUE(12, field_30);
+ PRINT_VALUE(13, eventMetAugust);
+ PRINT_VALUE(14, isNightTime);
+ PRINT_VALUE(15, field_3C);
+ PRINT_VALUE(16, field_40);
+ PRINT_VALUE(17, field_44);
+ PRINT_VALUE(18, field_48);
+ PRINT_VALUE(19, field_4C);
+ PRINT_VALUE(20, isTrainRunning);
+ PRINT_VALUE(21, field_54);
+ PRINT_VALUE(22, field_58);
+ PRINT_VALUE(23, field_5C);
+ PRINT_VALUE(24, field_60);
+ PRINT_VALUE(25, field_64);
+ PRINT_VALUE(26, field_68);
+ PRINT_VALUE(27, eventMertensAugustWaiting);
+ PRINT_VALUE(28, eventMertensKronosInvitation);
+ PRINT_VALUE(29, isEggOpen);
+ PRINT_VALUE(30, field_78);
+ PRINT_VALUE(31, field_7C);
+ PRINT_VALUE(32, field_80);
+ PRINT_VALUE(33, field_84);
+ PRINT_VALUE(34, field_88);
+ PRINT_VALUE(35, field_8C);
+ PRINT_VALUE(36, field_90);
+ PRINT_VALUE(37, field_94);
+ PRINT_VALUE(38, field_98);
+ PRINT_VALUE(39, field_9C);
+ PRINT_VALUE(40, field_A0);
+ PRINT_VALUE(41, field_A4);
+ PRINT_VALUE(42, field_A8);
+ PRINT_VALUE(43, field_AC);
+ PRINT_VALUE(44, field_B0);
+ PRINT_VALUE(45, field_B4);
+ PRINT_VALUE(46, field_B8);
+ PRINT_VALUE(47, field_BC);
+ PRINT_VALUE(48, field_C0);
+ PRINT_VALUE(49, field_C4);
+ PRINT_VALUE(50, field_C8);
+ PRINT_VALUE(51, field_CC);
+ PRINT_VALUE(52, eventMetBoutarel);
+ PRINT_VALUE(53, eventMetHadija);
+ PRINT_VALUE(54, eventMetYasmin);
+ PRINT_VALUE(55, field_DC);
+ PRINT_VALUE(56, field_E0);
+ PRINT_VALUE(57, field_E4);
+ PRINT_VALUE(58, field_E8);
+ PRINT_VALUE(59, field_EC);
+ PRINT_VALUE(60, field_F0);
+ PRINT_VALUE(61, field_F4);
+ PRINT_VALUE(62, field_F8);
+ PRINT_VALUE(63, field_FC);
+ PRINT_VALUE(64, field_100);
+ PRINT_VALUE(65, field_104);
+ PRINT_VALUE(66, field_108);
+ PRINT_VALUE(67, field_10C);
+ PRINT_VALUE(68, field_110);
+ PRINT_VALUE(69, field_114);
+ PRINT_VALUE(70, field_118);
+ PRINT_VALUE(71, field_11C);
+ PRINT_VALUE(72, field_120);
+ PRINT_VALUE(73, field_124);
+ PRINT_VALUE(74, field_128);
+ PRINT_VALUE(75, field_12C);
+ PRINT_VALUE(76, field_130);
+ PRINT_VALUE(77, field_134);
+ PRINT_VALUE(78, field_138);
+ PRINT_VALUE(79, field_13C);
+ PRINT_VALUE(80, field_140);
+ PRINT_VALUE(81, field_144);
+ PRINT_VALUE(82, field_148);
+ PRINT_VALUE(83, field_14C);
+ PRINT_VALUE(84, field_150);
+ PRINT_VALUE(85, field_154);
+ PRINT_VALUE(86, field_158);
+ PRINT_VALUE(87, field_15C);
+ PRINT_VALUE(88, field_160);
+ PRINT_VALUE(89, field_164);
+ PRINT_VALUE(90, field_168);
+ PRINT_VALUE(91, field_16C);
+ PRINT_VALUE(92, field_170);
+ PRINT_VALUE(93, field_174);
+ PRINT_VALUE(94, field_178);
+ PRINT_VALUE(95, field_17C);
+ PRINT_VALUE(96, field_180);
+ PRINT_VALUE(97, field_184);
+ PRINT_VALUE(98, field_188);
+ PRINT_VALUE(99, field_18C);
+ PRINT_VALUE(100, field_190);
+ PRINT_VALUE(101, field_194);
+ PRINT_VALUE(102, field_198);
+ PRINT_VALUE(103, field_19C);
+ PRINT_VALUE(104, field_1A0);
+ PRINT_VALUE(105, field_1A4);
+ PRINT_VALUE(106, field_1A8);
+ PRINT_VALUE(107, field_1AC);
+ PRINT_VALUE(108, field_1B0);
+ PRINT_VALUE(109, field_1B4);
+ PRINT_VALUE(110, field_1B8);
+ PRINT_VALUE(111, field_1BC);
+ PRINT_VALUE(112, field_1C0);
+ PRINT_VALUE(113, field_1C4);
+ PRINT_VALUE(114, field_1C8);
+ PRINT_VALUE(115, field_1CC);
+ PRINT_VALUE(116, field_1D0);
+ PRINT_VALUE(117, field_1D4);
+ PRINT_VALUE(118, field_1D8);
+ PRINT_VALUE(119, field_1DC);
+ PRINT_VALUE(120, field_1E0);
+ PRINT_VALUE(121, field_1E4);
+ PRINT_VALUE(122, field_1E8);
+ PRINT_VALUE(123, field_1EC);
+ PRINT_VALUE(124, field_1F0);
+ PRINT_VALUE(125, field_1F4);
+ PRINT_VALUE(126, field_1F8);
+ PRINT_VALUE(127, field_1FC);
+
+ return ret;
+ }
};
struct GameState {
@@ -542,6 +679,23 @@ public:
shouldRedraw = false;
shouldDrawEggOrHourGlass = false;
}
+
+ /**
+ * Convert this object into a string representation.
+ *
+ * @return A string representation of this object.
+ */
+ Common::String toString() {
+ Common::String ret = "";
+
+ ret += Common::String::printf("Unknown: 0:%02d - 3:%02d - 4:%02d - 5:%02d\n", flag_0, flag_3, flag_4, flag_5);
+ ret += Common::String::printf("FrameInterval: %02d - ShouldRedraw:%02d - ShouldDrawEggOrHourGlass:%02d\n", frameInterval, shouldRedraw, shouldDrawEggOrHourGlass);
+ ret += Common::String::printf("IsGameRunning: %02d\n", isGameRunning);
+ ret += Common::String::printf("Mouse: RightClick:%02d - LeftClick:%02d\n", mouseRightClick, mouseLeftClick);
+ ret += Common::String::printf("Entities: 0:%02d - 1:%02d\n", flag_entities_0, flag_entities_1);
+
+ return ret;
+ }
};
State(LastExpressEngine *engine);
@@ -567,6 +721,7 @@ public:
// Helpers
static uint32 getPowerOfTwo(uint32 x);
+ static void getHourMinutes(uint32 time, uint8 *hours, uint8 *minutes);
private:
static const uint32 _defaultBrigthness = 0x3;