From a03c829ace222e2dc00965cbd2c877b8b99e59fb Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 24 Sep 2007 21:58:11 +0000 Subject: - added a new generic debugger command 'facings' - added a few new kyra2 specific debugger commands svn-id: r29094 --- engines/kyra/debugger.cpp | 149 ++++++++++++++++++++++++++++++++++++++++++++-- engines/kyra/debugger.h | 7 +++ engines/kyra/kyra_v2.cpp | 2 + engines/kyra/kyra_v2.h | 3 + engines/kyra/scene_v2.cpp | 2 + engines/kyra/screen_v2.h | 1 + 6 files changed, 160 insertions(+), 4 deletions(-) (limited to 'engines') diff --git a/engines/kyra/debugger.cpp b/engines/kyra/debugger.cpp index 02cda261c9..994940d3f7 100644 --- a/engines/kyra/debugger.cpp +++ b/engines/kyra/debugger.cpp @@ -39,6 +39,7 @@ Debugger::Debugger(KyraEngine *vm) _vm = vm; DCmd_Register("screen_debug_mode", WRAP_METHOD(Debugger, cmd_setScreenDebug)); + DCmd_Register("facings", WRAP_METHOD(Debugger, cmd_showFacings)); } bool Debugger::cmd_setScreenDebug(int argc, const char **argv) { @@ -56,6 +57,16 @@ bool Debugger::cmd_setScreenDebug(int argc, const char **argv) { return true; } +bool Debugger::cmd_showFacings(int argc, const char **argv) { + DebugPrintf("Facing directions:\n"); + DebugPrintf("7 0 1\n"); + DebugPrintf(" \\ | / \n"); + DebugPrintf("6--*--2\n"); + DebugPrintf(" / | \\\n"); + DebugPrintf("5 4 3\n"); + return true; +} + #pragma mark - Debugger_v1::Debugger_v1(KyraEngine_v1 *vm) @@ -96,13 +107,13 @@ bool Debugger_v1::cmd_enterRoom(int argc, const char **argv) { if (argc > 2) { direction = atoi(argv[2]); } else { - if (_vm->_roomTable[room].northExit != 0xff) + if (_vm->_roomTable[room].northExit != 0xFFFF) direction = 3; - else if (_vm->_roomTable[room].eastExit != 0xff) + else if (_vm->_roomTable[room].eastExit != 0xFFFF) direction = 4; - else if (_vm->_roomTable[room].southExit != 0xff) + else if (_vm->_roomTable[room].southExit != 0xFFFF) direction = 1; - else if (_vm->_roomTable[room].westExit != 0xff) + else if (_vm->_roomTable[room].westExit != 0xFFFF) direction = 2; } @@ -216,6 +227,136 @@ bool Debugger_v1::cmd_listBirthstones(int argc, const char **argv) { #pragma mark - Debugger_v2::Debugger_v2(KyraEngine_v2 *vm) : Debugger(vm), _vm(vm) { + DCmd_Register("continue", WRAP_METHOD(Debugger_v2, Cmd_Exit)); + DCmd_Register("character_info", WRAP_METHOD(Debugger_v2, cmd_characterInfo)); + DCmd_Register("enter", WRAP_METHOD(Debugger_v2, cmd_enterScene)); + DCmd_Register("rooms", WRAP_METHOD(Debugger_v2, cmd_listScenes)); // for consistency with kyra_v1 + DCmd_Register("scenes", WRAP_METHOD(Debugger_v2, cmd_listScenes)); + DCmd_Register("scene_info", WRAP_METHOD(Debugger_v2, cmd_sceneInfo)); + DCmd_Register("scene_to_facing", WRAP_METHOD(Debugger_v2, cmd_sceneToFacing)); +} + +bool Debugger_v2::cmd_enterScene(int argc, const char **argv) { + uint direction = 0; + if (argc > 1) { + int scene = atoi(argv[1]); + + // game will crash if entering a non-existent scene + if (scene >= _vm->_sceneListSize) { + DebugPrintf("scene number must be any value between (including) 0 and %d\n", _vm->_sceneListSize-1); + return true; + } + + if (argc > 2) { + direction = atoi(argv[2]); + } else { + if (_vm->_sceneList[scene].exit1 != 0xFFFF) + direction = 4; + else if (_vm->_sceneList[scene].exit2 != 0xFFFF) + direction = 6; + else if (_vm->_sceneList[scene].exit3 != 0xFFFF) + direction = 0; + else if (_vm->_sceneList[scene].exit4 != 0xFFFF) + direction = 2; + } + + _vm->_system->hideOverlay(); + _vm->_mainCharacter.facing = direction; + + _vm->enterNewScene(scene, _vm->_mainCharacter.facing, 0, 0, 1); + _vm->_screen->_mouseLockCount = 0; + + _detach_now = true; + return false; + } + + DebugPrintf("Syntax: %d \n", argv[0]); + return true; +} + +bool Debugger_v2::cmd_listScenes(int argc, const char **argv) { + int shown = 1; + for (int i = 0; i < _vm->_sceneListSize; ++i) { + if (_vm->_sceneList[i].filename[0]) { + DebugPrintf("%-2i: %-10s", i, _vm->_sceneList[i].filename); + if (!(shown % 5)) + DebugPrintf("\n"); + ++shown; + } + } + DebugPrintf("\n"); + DebugPrintf("Current scene: %i\n", _vm->_currentScene); + return true; +} + +bool Debugger_v2::cmd_sceneInfo(int argc, const char **argv) { + DebugPrintf("Current scene: %d '%s'\n", _vm->_currentScene, _vm->_sceneList[_vm->_currentScene].filename); + DebugPrintf("\n"); + DebugPrintf("Exit information:\n"); + DebugPrintf("Exit1: leads to %d, position %dx%d\n", int16(_vm->_sceneExit1), _vm->_sceneEnterX1, _vm->_sceneEnterY1); + DebugPrintf("Exit2: leads to %d, position %dx%d\n", int16(_vm->_sceneExit2), _vm->_sceneEnterX2, _vm->_sceneEnterY2); + DebugPrintf("Exit3: leads to %d, position %dx%d\n", int16(_vm->_sceneExit3), _vm->_sceneEnterX3, _vm->_sceneEnterY3); + DebugPrintf("Exit4: leads to %d, position %dx%d\n", int16(_vm->_sceneExit4), _vm->_sceneEnterX4, _vm->_sceneEnterY4); + DebugPrintf("Special exit information:\n"); + if (!_vm->_specialExitCount) { + DebugPrintf("No special exits.\n"); + } else { + DebugPrintf("This scene has %d special exits.\n", _vm->_specialExitCount); + for (int i = 0; i < _vm->_specialExitCount; ++i) { + DebugPrintf("SpecialExit%d: facing %d, position (x1/y1/x2/y2): %d/%d/%d/%d\n", i, + _vm->_specialExitTable[20+i], _vm->_specialExitTable[0+i], _vm->_specialExitTable[5+i], + _vm->_specialExitTable[10+i], _vm->_specialExitTable[15+i]); + } + } + + return true; +} + +bool Debugger_v2::cmd_characterInfo(int argc, const char **argv) { + DebugPrintf("Main character is in scene: %d '%s'\n", _vm->_mainCharacter.sceneId, _vm->_sceneList[_vm->_mainCharacter.sceneId].filename); + DebugPrintf("Position: %dx%d\n", _vm->_mainCharacter.x1, _vm->_mainCharacter.y1); + DebugPrintf("Facing: %d\n", _vm->_mainCharacter.facing); + DebugPrintf("Inventory:\n"); + for (int i = 0; i < 20; ++i) { + DebugPrintf("%-2d ", int8(_vm->_mainCharacter.inventory[i])); + if (i == 9 || i == 19) + DebugPrintf("\n"); + } + return true; +} + +bool Debugger_v2::cmd_sceneToFacing(int argc, const char **argv) { + if (argc == 2) { + int facing = atoi(argv[1]); + int16 exit = -1; + + switch (facing) { + case 0: case 1: case 7: + exit = _vm->_sceneList[_vm->_currentScene].exit1; + break; + + case 6: + exit = _vm->_sceneList[_vm->_currentScene].exit2; + break; + + case 3: case 4: case 5: + exit = _vm->_sceneList[_vm->_currentScene].exit3; + break; + + case 2: + exit = _vm->_sceneList[_vm->_currentScene].exit4; + break; + + default: + break; + } + + DebugPrintf("Exit to facing %d leads to room %d.\n", facing, exit); + } else { + DebugPrintf("Usage: %s \n", argv[0]); + } + + return true; } } // End of namespace Kyra diff --git a/engines/kyra/debugger.h b/engines/kyra/debugger.h index 37df5b9a53..3c4356e880 100644 --- a/engines/kyra/debugger.h +++ b/engines/kyra/debugger.h @@ -43,6 +43,7 @@ protected: KyraEngine *_vm; bool cmd_setScreenDebug(int argc, const char **argv); + bool cmd_showFacings(int argc, const char **argv); }; class Debugger_v1 : public Debugger { @@ -74,6 +75,12 @@ public: protected: KyraEngine_v2 *_vm; + + bool cmd_enterScene(int argc, const char **argv); + bool cmd_listScenes(int argc, const char **argv); + bool cmd_sceneInfo(int argc, const char **argv); + bool cmd_characterInfo(int argc, const char **argv); + bool cmd_sceneToFacing(int argc, const char **argv); }; } // End of namespace Kyra diff --git a/engines/kyra/kyra_v2.cpp b/engines/kyra/kyra_v2.cpp index 011e3cb48d..38b79bc233 100644 --- a/engines/kyra/kyra_v2.cpp +++ b/engines/kyra/kyra_v2.cpp @@ -258,6 +258,8 @@ void KyraEngine_v2::startup() { // XXX _sceneList = new SceneDesc[86]; + memset(_sceneList, 0, sizeof(SceneDesc)*86); + _sceneListSize = 86; runStartScript(1, 0); loadNPCScript(); diff --git a/engines/kyra/kyra_v2.h b/engines/kyra/kyra_v2.h index 4e9210a503..2397378fd1 100644 --- a/engines/kyra/kyra_v2.h +++ b/engines/kyra/kyra_v2.h @@ -293,6 +293,9 @@ protected: }; SceneDesc *_sceneList; + int _sceneListSize; + uint16 _currentScene; + const char *_sceneCommentString; uint16 _sceneExit1, _sceneExit2, _sceneExit3, _sceneExit4; int _sceneEnterX1, _sceneEnterY1, _sceneEnterX2, _sceneEnterY2, diff --git a/engines/kyra/scene_v2.cpp b/engines/kyra/scene_v2.cpp index a08be8ceb5..dfa0c7f0b8 100644 --- a/engines/kyra/scene_v2.cpp +++ b/engines/kyra/scene_v2.cpp @@ -112,6 +112,8 @@ void KyraEngine_v2::enterNewScene(uint16 newScene, int facing, int unk1, int unk _screen->showMouse(); _unk5 = 0; //setNextIdleAnimTimer(); + + _currentScene = newScene; } void KyraEngine_v2::enterNewSceneUnk1(int facing, int unk1, int unk2) { diff --git a/engines/kyra/screen_v2.h b/engines/kyra/screen_v2.h index 7912d6b999..998a18b4db 100644 --- a/engines/kyra/screen_v2.h +++ b/engines/kyra/screen_v2.h @@ -33,6 +33,7 @@ namespace Kyra { class KyraEngine_v2; class Screen_v2 : public Screen { +friend class Debugger_v2; public: Screen_v2(KyraEngine_v2 *vm, OSystem *system); virtual ~Screen_v2(); -- cgit v1.2.3