aboutsummaryrefslogtreecommitdiff
path: root/scumm
diff options
context:
space:
mode:
authorMax Horn2003-10-26 21:30:52 +0000
committerMax Horn2003-10-26 21:30:52 +0000
commita4d2a47820ad7ce26de1f52a9a11f6d466ed9610 (patch)
tree8561421e140950ed282475a0ffb58fe0c79b5edf /scumm
parentfbd6528e365babdd9e6d59089ef210f04a7eb19e (diff)
downloadscummvm-rg350-a4d2a47820ad7ce26de1f52a9a11f6d466ed9610.tar.gz
scummvm-rg350-a4d2a47820ad7ce26de1f52a9a11f6d466ed9610.tar.bz2
scummvm-rg350-a4d2a47820ad7ce26de1f52a9a11f6d466ed9610.zip
factor out common debugger code
svn-id: r10984
Diffstat (limited to 'scumm')
-rw-r--r--scumm/debugger.cpp486
-rw-r--r--scumm/debugger.h61
2 files changed, 103 insertions, 444 deletions
diff --git a/scumm/debugger.cpp b/scumm/debugger.cpp
index fa8973df8a..28c0d9890b 100644
--- a/scumm/debugger.cpp
+++ b/scumm/debugger.cpp
@@ -33,30 +33,15 @@
#include "scumm/scumm.h"
#include "scumm/sound.h"
-#if USE_CONSOLE
- #include "gui/console.h"
- #define Debug_Printf _debuggerDialog->printf
-#else
- #define Debug_Printf printf
-#endif
-
-#ifdef _WIN32_WCE
-extern void force_keyboard(bool);
-#endif
+#include "common/debugger.cpp"
extern uint16 _debugLevel;
namespace Scumm {
-ScummDebugger::ScummDebugger(ScummEngine *s) {
+ScummDebugger::ScummDebugger(ScummEngine *s)
+ : Common::Debugger<ScummDebugger>(s->_newgui) {
_vm = s;
- _frame_countdown = 0;
- _dvar_count = 0;
- _dcmd_count = 0;
- _detach_now = false;
- _isAttached = false;
- _errStr = NULL;
- _debuggerDialog = NULL;
// Register variables
DVar_Register("debug_countdown", &_frame_countdown, DVAR_INT, 0);
@@ -103,248 +88,20 @@ ScummDebugger::ScummDebugger(ScummEngine *s) {
DCmd_Register("imuse", &ScummDebugger::Cmd_IMuse);
}
-// Initialisation Functions
-void ScummDebugger::attach(const char *entry) {
-
-#ifdef _WIN32_WCE
- force_keyboard(true);
-#endif
-
- if (entry) {
- _errStr = strdup(entry);
- }
-
- _frame_countdown = 1;
- _detach_now = false;
- _isAttached = true;
-}
-
-void ScummDebugger::detach() {
-#if USE_CONSOLE
- if (_debuggerDialog) {
- _debuggerDialog->setInputCallback(0, 0);
- _debuggerDialog->setCompletionCallback(0, 0);
- }
-#endif
-
-#ifdef _WIN32_WCE
- force_keyboard(false);
-#endif
-
- _detach_now = false;
- _isAttached = false;
-}
-
-// Temporary execution handler
-void ScummDebugger::onFrame() {
- if (_frame_countdown == 0)
- return;
- --_frame_countdown;
-
- if (!_frame_countdown) {
- // Pause sound output
- bool old_soundsPaused = _vm->_sound->_soundsPaused;
- _vm->_sound->pauseSounds(true);
-
- // Enter debugger
- enter();
-
- _vm->_sound->pauseSounds(old_soundsPaused); // Resume previous sound state
-
- if (_detach_now) // Detach if we're finished with the debugger
- detach();
- }
-}
-
-// Console handler
-#if USE_CONSOLE
-bool ScummDebugger::debuggerInputCallback(ConsoleDialog *console, const char *input, void *refCon) {
- ScummDebugger *debugger = (ScummDebugger *)refCon;
-
- return debugger->RunCommand(input);
+void ScummDebugger::preEnter() {
+ // Pause sound output
+ _old_soundsPaused = _vm->_sound->_soundsPaused;
+ _vm->_sound->pauseSounds(true);
}
-
-bool ScummDebugger::debuggerCompletionCallback(ConsoleDialog *console, const char *input, char*& completion, void *refCon) {
- ScummDebugger *debugger = (ScummDebugger *)refCon;
-
- return debugger->TabComplete(input, completion);
+void ScummDebugger::postEnter() {
+ // Resume previous sound state
+ _vm->_sound->pauseSounds(_old_soundsPaused);
}
-#endif
-
///////////////////////////////////////////////////
// Now the fun stuff:
-// Command/Variable registration functions
-void ScummDebugger::DVar_Register(const char *varname, void *pointer, int type, int optional) {
- assert(_dvar_count < (int)sizeof(_dvars));
- strcpy(_dvars[_dvar_count].name, varname);
- _dvars[_dvar_count].type = type;
- _dvars[_dvar_count].variable = pointer;
- _dvars[_dvar_count].optional = optional;
-
- _dvar_count++;
-}
-
-void ScummDebugger::DCmd_Register(const char *cmdname, DebugProc pointer) {
- assert(_dcmd_count < (int)sizeof(_dcmds));
- strcpy(_dcmds[_dcmd_count].name, cmdname);
- _dcmds[_dcmd_count].function = pointer;
-
- _dcmd_count++;
-}
-
-// Main Debugger Loop
-void ScummDebugger::enter() {
-#if USE_CONSOLE
- if (!_debuggerDialog) {
- _debuggerDialog = new ConsoleDialog(_vm->_newgui, 1.0, 0.67F);
-
- Debug_Printf("Debugger started, type 'exit' to return to the game.\n");
- Debug_Printf("Type 'help' to see a little list of commands and variables.\n");
- }
-
- if (_errStr) {
- Debug_Printf("ERROR: %s\n\n", _errStr);
- free(_errStr);
- _errStr = NULL;
- }
-
- _debuggerDialog->setInputCallback(debuggerInputCallback, this);
- _debuggerDialog->setCompletionCallback(debuggerCompletionCallback, this);
- _debuggerDialog->runModal();
-#else
- // TODO: compared to the console input, this here is very bare bone.
- // For example, no support for tab completion and no history. At least
- // we should re-add (optional) support for the readline library.
- // Or maybe instead of choosing between a console dialog and stdio,
- // we should move that choice into the ConsoleDialog class - that is,
- // the console dialog code could be #ifdef'ed to not print to the dialog
- // but rather to stdio. This way, we could also reuse the command history
- // and tab completion of the console. It would still require a lot of
- // work, but at least no dependency on a 3rd party library...
-
- printf("Debugger entered, please switch to this console for input.\n");
-
- int i;
- char buf[256];
-
- do {
- printf("debug> ");
- if (!fgets(buf, sizeof(buf), stdin))
- return;
-
- i = strlen(buf);
- while (i > 0 && buf[i - 1] == '\n')
- buf[--i] = 0;
-
- if (i == 0)
- continue;
- } while (RunCommand(buf));
-
-#endif
-}
-
-// Command execution loop
-bool ScummDebugger::RunCommand(const char *inputOrig) {
- int i = 0, num_params = 0;
- const char *param[256];
- char *input = strdup(inputOrig); // One of the rare occasions using strdup is OK (although avoiding strtok might be more elegant here).
-
- // Parse out any params
- char *tok = strtok(input, " ");
- if (tok) {
- do {
- param[num_params++] = tok;
- } while ((tok = strtok(NULL, " ")) != NULL);
- } else {
- param[num_params++] = input;
- }
-
- for (i=0; i < _dcmd_count; i++) {
- if (!strcmp(_dcmds[i].name, param[0])) {
- bool result = (this->*_dcmds[i].function)(num_params, param);
- free(input);
- return result;
- }
- }
-
- // It's not a command, so things get a little tricky for variables. Do fuzzy matching to ignore things like subscripts.
- for (i = 0; i < _dvar_count; i++) {
- if (!strncmp(_dvars[i].name, param[0], strlen(_dvars[i].name))) {
- if (num_params > 1) {
- // Alright, we need to check the TYPE of the variable to deref and stuff... the array stuff is a bit ugly :)
- switch(_dvars[i].type) {
- // Integer
- case DVAR_INT:
- *(int *)_dvars[i].variable = atoi(param[1]);
- Debug_Printf("(int)%s = %d\n", param[0], *(int *)_dvars[i].variable);
- break;
- // Integer Array
- case DVAR_INTARRAY: {
- char *chr = strchr(param[0], '[');
- if (!chr) {
- Debug_Printf("You must access this array as %s[element]\n", param[0]);
- } else {
- int element = atoi(chr+1);
- int32 *var = *(int32 **)_dvars[i].variable;
- if (element > _dvars[i].optional) {
- Debug_Printf("%s is out of range (array is %d elements big)\n", param[0], _dvars[i].optional);
- } else {
- var[element] = atoi(param[1]);
- Debug_Printf("(int)%s = %d\n", param[0], var[element]);
- }
- }
- }
- break;
- default:
- Debug_Printf("Failed to set variable %s to %s - unknown type\n", _dvars[i].name, param[1]);
- break;
- }
- } else {
- // And again, type-dependent prints/defrefs. The array one is still ugly.
- switch(_dvars[i].type) {
- // Integer
- case DVAR_INT:
- Debug_Printf("(int)%s = %d\n", param[0], *(int *)_dvars[i].variable);
- break;
- // Integer array
- case DVAR_INTARRAY: {
- char *chr = strchr(param[0], '[');
- if (!chr) {
- Debug_Printf("You must access this array as %s[element]\n", param[0]);
- } else {
- int element = atoi(chr+1);
- int16 *var = *(int16 **)_dvars[i].variable;
- if (element > _dvars[i].optional) {
- Debug_Printf("%s is out of range (array is %d elements big)\n", param[0], _dvars[i].optional);
- } else {
- Debug_Printf("(int)%s = %d\n", param[0], var[element]);
- }
- }
- }
- break;
- // String
- case DVAR_STRING:
- Debug_Printf("(string)%s = %s\n", param[0], ((Common::String *)_dvars[i].variable)->c_str());
- break;
- default:
- Debug_Printf("%s = (unknown type)\n", param[0]);
- break;
- }
- }
-
- free(input);
- return true;
- }
- }
-
- Debug_Printf("Unknown command or variable\n");
- free(input);
- return true;
-}
-
// Commands
bool ScummDebugger::Cmd_Exit(int argc, const char **argv) {
_detach_now = true;
@@ -360,61 +117,61 @@ bool ScummDebugger::Cmd_Restart(int argc, const char **argv) {
bool ScummDebugger::Cmd_IMuse(int argc, const char **argv) {
if (!_vm->_imuse && !_vm->_musicEngine) {
- Debug_Printf("No iMuse engine is active.\n");
+ DebugPrintf("No iMuse engine is active.\n");
return true;
}
if (argc > 1) {
if (!strcmp(argv[1], "panic")) {
_vm->_musicEngine->stopAllSounds();
- Debug_Printf("AAAIIIEEEEEE!\n");
- Debug_Printf("Shutting down all music tracks\n");
+ DebugPrintf("AAAIIIEEEEEE!\n");
+ DebugPrintf("Shutting down all music tracks\n");
return true;
} else if (!strcmp (argv[1], "multimidi")) {
if (argc > 2 && (!strcmp(argv[2], "on") || !strcmp(argv[2], "off"))) {
if (_vm->_imuse)
_vm->_imuse->property(IMuse::PROP_MULTI_MIDI, !strcmp(argv[2], "on"));
- Debug_Printf("MultiMidi mode switched %s.\n", argv[2]);
+ DebugPrintf("MultiMidi mode switched %s.\n", argv[2]);
} else {
- Debug_Printf("Specify \"on\" or \"off\" to switch.\n");
+ DebugPrintf("Specify \"on\" or \"off\" to switch.\n");
}
return true;
} else if (!strcmp(argv[1], "play")) {
if (argc > 2 && (!strcmp(argv[2], "random") || atoi(argv[2]) != 0)) {
int sound = atoi(argv[2]);
if (!strcmp(argv[2], "random")) {
- Debug_Printf("Selecting from %d songs...\n", _vm->getNumSounds());
+ DebugPrintf("Selecting from %d songs...\n", _vm->getNumSounds());
sound = _vm->_rnd.getRandomNumber(_vm->getNumSounds());
}
_vm->ensureResourceLoaded(rtSound, sound);
_vm->_musicEngine->startSound(sound);
- Debug_Printf("Attempted to start music %d.\n", sound);
+ DebugPrintf("Attempted to start music %d.\n", sound);
} else {
- Debug_Printf("Specify a music resource # from 1-255.\n");
+ DebugPrintf("Specify a music resource # from 1-255.\n");
}
return true;
} else if (!strcmp(argv[1], "stop")) {
if (argc > 2 && (!strcmp(argv[2], "all") || atoi(argv[2]) != 0)) {
if (!strcmp(argv[2], "all")) {
_vm->_musicEngine->stopAllSounds();
- Debug_Printf("Shutting down all music tracks.\n");
+ DebugPrintf("Shutting down all music tracks.\n");
} else {
_vm->_musicEngine->stopSound(atoi(argv[2]));
- Debug_Printf("Attempted to stop music %d.\n", atoi(argv[2]));
+ DebugPrintf("Attempted to stop music %d.\n", atoi(argv[2]));
}
} else {
- Debug_Printf("Specify a music resource # or \"all\".\n");
+ DebugPrintf("Specify a music resource # or \"all\".\n");
}
return true;
}
}
- Debug_Printf("Available iMuse commands:\n");
- Debug_Printf(" panic - Stop all music tracks\n");
- Debug_Printf(" multimidi on/off - Toggle dual MIDI drivers\n");
- Debug_Printf(" play # - Play a music resource\n");
- Debug_Printf(" stop # - Stop a music resource\n");
+ DebugPrintf("Available iMuse commands:\n");
+ DebugPrintf(" panic - Stop all music tracks\n");
+ DebugPrintf(" multimidi on/off - Toggle dual MIDI drivers\n");
+ DebugPrintf(" play # - Play a music resource\n");
+ DebugPrintf(" stop # - Stop a music resource\n");
return true;
}
@@ -427,7 +184,7 @@ bool ScummDebugger::Cmd_Room(int argc, const char **argv) {
_vm->_fullRedraw = 1;
return false;
} else {
- Debug_Printf("Current room: %d [%d] - use 'room <roomnum>' to switch\n", _vm->_currentRoom, _vm->_roomResource);
+ DebugPrintf("Current room: %d [%d] - use 'room <roomnum>' to switch\n", _vm->_currentRoom, _vm->_roomResource);
return true;
}
}
@@ -444,7 +201,7 @@ bool ScummDebugger::Cmd_LoadGame(int argc, const char **argv) {
return false;
}
- Debug_Printf("Syntax: loadgame <slotnum>\n");
+ DebugPrintf("Syntax: loadgame <slotnum>\n");
return true;
}
@@ -457,7 +214,7 @@ bool ScummDebugger::Cmd_SaveGame(int argc, const char **argv) {
_vm->_saveLoadFlag = 1;
_vm->_saveLoadCompatible = false;
} else
- Debug_Printf("Syntax: savegame <slotnum> <name>\n");
+ DebugPrintf("Syntax: savegame <slotnum> <name>\n");
return true;
}
@@ -465,18 +222,18 @@ bool ScummDebugger::Cmd_SaveGame(int argc, const char **argv) {
bool ScummDebugger::Cmd_Show(int argc, const char **argv) {
if (argc != 2) {
- Debug_Printf("Syntax: show <parameter>\n");
+ DebugPrintf("Syntax: show <parameter>\n");
return true;
}
if (!strcmp(argv[1], "hex")) {
_vm->_hexdumpScripts = true;
- Debug_Printf("Script hex dumping on\n");
+ DebugPrintf("Script hex dumping on\n");
} else if (!strncmp(argv[1], "sta", 3)) {
_vm->_showStack = 1;
- Debug_Printf("Stack tracing on\n");
+ DebugPrintf("Stack tracing on\n");
} else {
- Debug_Printf("Unknown show parameter '%s'\nParameters are 'hex' for hex dumping and 'sta' for stack tracing\n", argv[1]);
+ DebugPrintf("Unknown show parameter '%s'\nParameters are 'hex' for hex dumping and 'sta' for stack tracing\n", argv[1]);
}
return true;
}
@@ -484,18 +241,18 @@ bool ScummDebugger::Cmd_Show(int argc, const char **argv) {
bool ScummDebugger::Cmd_Hide(int argc, const char **argv) {
if (argc != 2) {
- Debug_Printf("Syntax: hide <parameter>\n");
+ DebugPrintf("Syntax: hide <parameter>\n");
return true;
}
if (!strcmp(argv[1], "hex")) {
_vm->_hexdumpScripts = false;
- Debug_Printf("Script hex dumping off\n");
+ DebugPrintf("Script hex dumping off\n");
} else if (!strncmp(argv[1], "sta", 3)) {
_vm->_showStack = 0;
- Debug_Printf("Stack tracing off\n");
+ DebugPrintf("Stack tracing off\n");
} else {
- Debug_Printf("Unknown hide parameter '%s'\nParameters are 'hex' to turn off hex dumping and 'sta' to turn off stack tracing\n", argv[1]);
+ DebugPrintf("Unknown hide parameter '%s'\nParameters are 'hex' to turn off hex dumping and 'sta' to turn off stack tracing\n", argv[1]);
}
return true;
}
@@ -504,7 +261,7 @@ bool ScummDebugger::Cmd_Script(int argc, const char** argv) {
int scriptnum;
if (argc < 2) {
- Debug_Printf("Syntax: script <scriptnum> <command>\n");
+ DebugPrintf("Syntax: script <scriptnum> <command>\n");
return true;
}
@@ -512,7 +269,7 @@ bool ScummDebugger::Cmd_Script(int argc, const char** argv) {
// FIXME: what is the max range on these?
// if (scriptnum >= _vm->_maxScripts) {
- // Debug_Printf("Script number %d is out of range (range: 1 - %d)\n", scriptnum, _vm->_maxScripts);
+ // DebugPrintf("Script number %d is out of range (range: 1 - %d)\n", scriptnum, _vm->_maxScripts);
// return true;
//}
@@ -522,7 +279,7 @@ bool ScummDebugger::Cmd_Script(int argc, const char** argv) {
_vm->runScript(scriptnum, 0, 0, 0);
return false;
} else {
- Debug_Printf("Unknown script command '%s'\nUse <kill/stop | run/start> as command\n", argv[2]);
+ DebugPrintf("Unknown script command '%s'\nUse <kill/stop | run/start> as command\n", argv[2]);
}
return true;
@@ -534,7 +291,7 @@ bool ScummDebugger::Cmd_ImportRes(int argc, const char** argv) {
int resnum;
if (argc != 4) {
- Debug_Printf("Syntax: importres <restype> <filename> <resnum>\n");
+ DebugPrintf("Syntax: importres <restype> <filename> <resnum>\n");
return true;
}
@@ -544,7 +301,7 @@ bool ScummDebugger::Cmd_ImportRes(int argc, const char** argv) {
if (!strncmp(argv[1], "scr", 3)) {
file.open(argv[2], "");
if (file.isOpen() == false) {
- Debug_Printf("Could not open file %s\n", argv[2]);
+ DebugPrintf("Could not open file %s\n", argv[2]);
return true;
}
if (_vm->_features & GF_SMALL_HEADER) {
@@ -565,25 +322,25 @@ bool ScummDebugger::Cmd_ImportRes(int argc, const char** argv) {
file.read(_vm->createResource(rtScript, resnum, size), size);
} else
- Debug_Printf("Unknown importres type '%s'\n", argv[1]);
+ DebugPrintf("Unknown importres type '%s'\n", argv[1]);
return true;
}
bool ScummDebugger::Cmd_PrintScript(int argc, const char **argv) {
int i;
ScriptSlot *ss = _vm->vm.slot;
- Debug_Printf("+--------------------------------------+\n");
- Debug_Printf("|# | num|offst|sta|typ|fr|rec|fc|cut|\n");
- Debug_Printf("+--+----+-----+---+---+--+---+--+---+\n");
+ DebugPrintf("+--------------------------------------+\n");
+ DebugPrintf("|# | num|offst|sta|typ|fr|rec|fc|cut|\n");
+ DebugPrintf("+--+----+-----+---+---+--+---+--+---+\n");
for (i = 0; i < NUM_SCRIPT_SLOT; i++, ss++) {
if (ss->number) {
- Debug_Printf("|%2d|%4d|%05x|%3d|%3d|%2d|%3d|%2d|%3d|\n",
+ DebugPrintf("|%2d|%4d|%05x|%3d|%3d|%2d|%3d|%2d|%3d|\n",
i, ss->number, ss->offs, ss->status, ss->where,
ss->freezeResistant, ss->recursive,
ss->freezeCount, ss->cutsceneOverride);
}
}
- Debug_Printf("+--------------------------------------+\n");
+ DebugPrintf("+--------------------------------------+\n");
return true;
}
@@ -594,13 +351,13 @@ bool ScummDebugger::Cmd_Actor(int argc, const char **argv) {
int value;
if (argc < 3) {
- Debug_Printf("Syntax: actor <actornum> <command> <parameter>\n");
+ DebugPrintf("Syntax: actor <actornum> <command> <parameter>\n");
return true;
}
actnum = atoi(argv[1]);
if (actnum >= _vm->_numActors) {
- Debug_Printf("Actor %d is out of range (range: 1 - %d)\n", actnum, _vm->_numActors);
+ DebugPrintf("Actor %d is out of range (range: 1 - %d)\n", actnum, _vm->_numActors);
return true;
}
@@ -609,31 +366,31 @@ bool ScummDebugger::Cmd_Actor(int argc, const char **argv) {
if (!strcmp(argv[2], "ignoreboxes")) {
a->ignoreBoxes = (value > 0);
- Debug_Printf("Actor[%d].ignoreBoxes = %d\n", actnum, a->ignoreBoxes);
+ DebugPrintf("Actor[%d].ignoreBoxes = %d\n", actnum, a->ignoreBoxes);
} else if (!strcmp(argv[2], "x")) {
a->putActor(value, a->_pos.y, a->room);
- Debug_Printf("Actor[%d].x = %d\n", actnum, a->_pos.x);
+ DebugPrintf("Actor[%d].x = %d\n", actnum, a->_pos.x);
_vm->_fullRedraw = 1;
} else if (!strcmp(argv[2], "y")) {
a->putActor(a->_pos.x, value, a->room);
- Debug_Printf("Actor[%d].y = %d\n", actnum, a->_pos.y);
+ DebugPrintf("Actor[%d].y = %d\n", actnum, a->_pos.y);
_vm->_fullRedraw = 1;
} else if (!strcmp(argv[2], "elevation")) {
a->elevation = value;
- Debug_Printf("Actor[%d].elevation = %d\n", actnum, a->elevation);
+ DebugPrintf("Actor[%d].elevation = %d\n", actnum, a->elevation);
_vm->_fullRedraw = 1;
} else if (!strcmp(argv[2], "costume")) {
if (value >= _vm->res.num[rtCostume])
- Debug_Printf("Costume not changed as %d exceeds max of %d\n", value, _vm->res.num[rtCostume]);
+ DebugPrintf("Costume not changed as %d exceeds max of %d\n", value, _vm->res.num[rtCostume]);
else {
a->setActorCostume( value );
_vm->_fullRedraw = 1;
- Debug_Printf("Actor[%d].costume = %d\n", actnum, a->costume);
+ DebugPrintf("Actor[%d].costume = %d\n", actnum, a->costume);
}
} else if (!strcmp(argv[2], "name")) {
- Debug_Printf("Name of actor %d: %s\n", actnum, _vm->getObjOrActorName(actnum));
+ DebugPrintf("Name of actor %d: %s\n", actnum, _vm->getObjOrActorName(actnum));
} else {
- Debug_Printf("Unknown actor command '%s'\nUse <ignoreboxes |costume> as command\n", argv[2]);
+ DebugPrintf("Unknown actor command '%s'\nUse <ignoreboxes |costume> as command\n", argv[2]);
}
return true;
@@ -643,35 +400,35 @@ bool ScummDebugger::Cmd_PrintActor(int argc, const char **argv) {
int i;
Actor *a;
- Debug_Printf("+----------------------------------------------------------------+\n");
- Debug_Printf("|# |room| x | y |elev|cos|width|box|mov| zp|frame|scale|dir|cls|\n");
- Debug_Printf("+--+----+----+----+----+---+-----+---+---+---+-----+-----+---+---+\n");
+ DebugPrintf("+----------------------------------------------------------------+\n");
+ DebugPrintf("|# |room| x | y |elev|cos|width|box|mov| zp|frame|scale|dir|cls|\n");
+ DebugPrintf("+--+----+----+----+----+---+-----+---+---+---+-----+-----+---+---+\n");
for (i = 1; i < _vm->_numActors; i++) {
a = &_vm->_actors[i];
if (a->visible)
- Debug_Printf("|%2d|%4d|%4d|%4d|%4d|%3d|%5d|%3d|%3d|%3d|%5d|%5d|%3d|$%02x|\n",
+ DebugPrintf("|%2d|%4d|%4d|%4d|%4d|%3d|%5d|%3d|%3d|%3d|%5d|%5d|%3d|$%02x|\n",
a->number, a->room, a->_pos.x, a->_pos.y, a->elevation, a->costume,
a->width, a->walkbox, a->moving, a->forceClip, a->frame,
a->scalex, a->getFacing(), int(_vm->_classData[a->number]&0xFF));
}
- Debug_Printf("+----------------------------------------------------------------+\n");
+ DebugPrintf("+----------------------------------------------------------------+\n");
return true;
}
bool ScummDebugger::Cmd_PrintObjects(int argc, const char **argv) {
int i;
ObjectData *o;
- Debug_Printf("Objects in current room\n");
- Debug_Printf("+---------------------------------+--+\n");
- Debug_Printf("|num | x | y |width|height|state|fl|\n");
- Debug_Printf("+----+----+----+-----+------+-----+--+\n");
+ DebugPrintf("Objects in current room\n");
+ DebugPrintf("+---------------------------------+--+\n");
+ DebugPrintf("|num | x | y |width|height|state|fl|\n");
+ DebugPrintf("+----+----+----+-----+------+-----+--+\n");
for (i = 1; (i < _vm->_numLocalObjects) && (_vm->_objs[i].obj_nr != 0) ; i++) {
o = &(_vm->_objs[i]);
- Debug_Printf("|%4d|%4d|%4d|%5d|%6d|%5d|%2d|\n",
+ DebugPrintf("|%4d|%4d|%4d|%5d|%6d|%5d|%2d|\n",
o->obj_nr, o->x_pos, o->y_pos, o->width, o->height, o->state, o->fl_object_index);
}
- Debug_Printf("\n");
+ DebugPrintf("\n");
return true;
}
@@ -680,13 +437,13 @@ bool ScummDebugger::Cmd_Object(int argc, const char **argv) {
int obj;
if (argc < 3) {
- Debug_Printf("Syntax: object <objectnum> <command> <parameter>\n");
+ DebugPrintf("Syntax: object <objectnum> <command> <parameter>\n");
return true;
}
obj = atoi(argv[1]);
if (obj >= _vm->_numGlobalObjects) {
- Debug_Printf("Object %d is out of range (range: 1 - %d)\n", obj, _vm->_numGlobalObjects);
+ DebugPrintf("Object %d is out of range (range: 1 - %d)\n", obj, _vm->_numGlobalObjects);
return true;
}
@@ -715,9 +472,9 @@ bool ScummDebugger::Cmd_Object(int argc, const char **argv) {
//is BgNeedsRedraw enough?
_vm->_BgNeedsRedraw = true;
} else if (!strcmp(argv[2], "name")) {
- Debug_Printf("Name of object %d: %s\n", obj, _vm->getObjOrActorName(obj));
+ DebugPrintf("Name of object %d: %s\n", obj, _vm->getObjOrActorName(obj));
} else {
- Debug_Printf("Unknown object command '%s'\nUse <pickup | state> as command\n", argv[2]);
+ DebugPrintf("Unknown object command '%s'\nUse <pickup | state> as command\n", argv[2]);
}
return true;
@@ -728,35 +485,35 @@ bool ScummDebugger::Cmd_Help(int argc, const char **argv) {
// wrap around nicely
int width = 0, size, i;
- Debug_Printf("Commands are:\n");
+ DebugPrintf("Commands are:\n");
for (i = 0 ; i < _dcmd_count ; i++) {
size = strlen(_dcmds[i].name) + 1;
if ((width + size) >= 39) {
- Debug_Printf("\n");
+ DebugPrintf("\n");
width = size;
} else
width += size;
- Debug_Printf("%s ", _dcmds[i].name);
+ DebugPrintf("%s ", _dcmds[i].name);
}
width = 0;
- Debug_Printf("\n\nVariables are:\n");
+ DebugPrintf("\n\nVariables are:\n");
for (i = 0 ; i < _dvar_count ; i++) {
size = strlen(_dvars[i].name) + 1;
if ((width + size) >= 39) {
- Debug_Printf("\n");
+ DebugPrintf("\n");
width = size;
} else
width += size;
- Debug_Printf("%s ", _dvars[i].name);
+ DebugPrintf("%s ", _dvars[i].name);
}
- Debug_Printf("\n");
+ DebugPrintf("\n");
return true;
}
@@ -764,20 +521,20 @@ bool ScummDebugger::Cmd_Help(int argc, const char **argv) {
bool ScummDebugger::Cmd_DebugLevel(int argc, const char **argv) {
if (argc == 1) {
if (_vm->_debugMode == false)
- Debug_Printf("Debugging is not enabled at this time\n");
+ DebugPrintf("Debugging is not enabled at this time\n");
else
- Debug_Printf("Debugging is currently set at level %d\n", _debugLevel);
+ DebugPrintf("Debugging is currently set at level %d\n", _debugLevel);
} else { // set level
int level = atoi(argv[1]);
_debugLevel = level;
if (level > 0) {
_vm->_debugMode = true;
- Debug_Printf("Debug level set to level %d\n", level);
+ DebugPrintf("Debug level set to level %d\n", level);
} else if (level == 0) {
_vm->_debugMode = false;
- Debug_Printf("Debugging is now disabled\n");
+ DebugPrintf("Debugging is now disabled\n");
} else
- Debug_Printf("Not a valid debug level\n");
+ DebugPrintf("Not a valid debug level\n");
}
return true;
@@ -791,7 +548,7 @@ bool ScummDebugger::Cmd_PrintBox(int argc, const char **argv) {
printBox(atoi(argv[i]));
} else {
num = _vm->getNumBoxes();
- Debug_Printf("\nWalk boxes:\n");
+ DebugPrintf("\nWalk boxes:\n");
for (i = 0; i < num; i++)
printBox(i);
}
@@ -803,22 +560,22 @@ bool ScummDebugger::Cmd_PrintBoxMatrix(int argc, const char **argv) {
int num = _vm->getNumBoxes();
int i, j;
- Debug_Printf("Walk matrix:\n");
+ DebugPrintf("Walk matrix:\n");
if (_vm->_version <= 2)
boxm += num;
for (i = 0; i < num; i++) {
- Debug_Printf("%d: ", i);
+ DebugPrintf("%d: ", i);
if (_vm->_version <= 2) {
for (j = 0; j < num; j++)
- Debug_Printf("[%d] ", *boxm++);
+ DebugPrintf("[%d] ", *boxm++);
} else {
while (*boxm != 0xFF) {
- Debug_Printf("[%d-%d=>%d] ", boxm[0], boxm[1], boxm[2]);
+ DebugPrintf("[%d-%d=>%d] ", boxm[0], boxm[1], boxm[2]);
boxm += 3;
}
boxm++;
}
- Debug_Printf("\n");
+ DebugPrintf("\n");
}
return true;
}
@@ -833,7 +590,7 @@ void ScummDebugger::printBox(int box) {
_vm->getBoxCoordinates(box, &coords);
// Print out coords, flags, zbuffer mask
- Debug_Printf("%d: [%d x %d] [%d x %d] [%d x %d] [%d x %d], flags=0x%02x, mask=%d, scale=%d\n",
+ DebugPrintf("%d: [%d x %d] [%d x %d] [%d x %d] [%d x %d], flags=0x%02x, mask=%d, scale=%d\n",
box,
coords.ul.x, coords.ul.y, coords.ll.x, coords.ll.y,
coords.ur.x, coords.ur.y, coords.lr.x, coords.lr.y,
@@ -990,7 +747,7 @@ bool ScummDebugger::Cmd_PrintDraft(int argc, const char **argv) {
int i, base, draft;
if (_vm->_gameId != GID_LOOM && _vm->_gameId != GID_LOOM256) {
- Debug_Printf("Command only works with Loom/LoomCD\n");
+ DebugPrintf("Command only works with Loom/LoomCD\n");
return true;
}
@@ -1032,7 +789,7 @@ bool ScummDebugger::Cmd_PrintDraft(int argc, const char **argv) {
// the distaff, but I don't know if that's a safe
// thing to do.
- Debug_Printf("Learned all drafts and notes.\n");
+ DebugPrintf("Learned all drafts and notes.\n");
return true;
}
@@ -1044,7 +801,7 @@ bool ScummDebugger::Cmd_PrintDraft(int argc, const char **argv) {
if (strcmp(argv[1], "fix") == 0) {
for (i = 0; i < 16; i++)
_vm->_scummVars[base + 2 * i + 1] = odds[i];
- Debug_Printf(
+ DebugPrintf(
"An attempt has been made to repair\n"
"the internal drafts data structure.\n"
"Continue on your own risk.\n");
@@ -1056,7 +813,7 @@ bool ScummDebugger::Cmd_PrintDraft(int argc, const char **argv) {
for (i = 0; i < 16; i++) {
draft = _vm->_scummVars[base + i * 2];
- Debug_Printf("%d %-13s %c%c%c%c %c%c %5d %c\n",
+ DebugPrintf("%d %-13s %c%c%c%c %c%c %5d %c\n",
base + 2 * i,
names[i],
notes[draft & 0x0007],
@@ -1072,55 +829,4 @@ bool ScummDebugger::Cmd_PrintDraft(int argc, const char **argv) {
return true;
}
-// returns true if something has been completed
-// completion has to be delete[]-ed then
-bool ScummDebugger::TabComplete(const char *input, char*& completion) {
- // very basic tab completion
- // for now it just supports command completions
-
- // adding completions of command parameters would be nice (but hard) :-)
- // maybe also give a list of possible command completions?
- // (but this will require changes to console)
-
- if (strchr(input, ' '))
- return false; // already finished the first word
-
- unsigned int inputlen = strlen(input);
-
- unsigned int matchlen = 0;
- char match[30]; // the max. command name is 30 chars
-
- for (int i=0; i < _dcmd_count; i++) {
- if (!strncmp(_dcmds[i].name, input, inputlen)) {
- unsigned int commandlen = strlen(_dcmds[i].name);
- if (commandlen == inputlen) { // perfect match
- return false;
- }
- if (commandlen > inputlen) { // possible match
- // no previous match
- if (matchlen == 0) {
- strcpy(match, _dcmds[i].name + inputlen);
- matchlen = commandlen - inputlen;
- } else {
- // take common prefix of previous match and this command
- unsigned int j;
- for (j = 0; j < matchlen; j++) {
- if (match[j] != _dcmds[i].name[inputlen + j]) break;
- }
- matchlen = j;
- }
- if (matchlen == 0)
- return false;
- }
- }
- }
- if (matchlen == 0)
- return false;
-
- completion = new char[matchlen+1];
- memcpy(completion, match, matchlen);
- completion[matchlen] = 0;
- return true;
-}
-
} // End of namespace Scumm
diff --git a/scumm/debugger.h b/scumm/debugger.h
index 9252f79bb8..ba5db57ea4 100644
--- a/scumm/debugger.h
+++ b/scumm/debugger.h
@@ -18,64 +18,25 @@
* $Header$
*/
-#ifndef DEBUG_H
-#define DEBUG_H
+#ifndef DEBUGGER_H
+#define DEBUGGER_H
-class ConsoleDialog;
+#include "common/debugger.h"
namespace Scumm {
-// Choose between text console or ScummConsole
-#define USE_CONSOLE 1
-
class ScummEngine;
-class ScummDebugger;
-
-typedef bool (ScummDebugger::*DebugProc)(int argc, const char **argv);
-
-enum {
- DVAR_INT,
- DVAR_BOOL,
- DVAR_INTARRAY,
- DVAR_STRING
-};
-
-struct DVar {
- char name[30];
- void *variable;
- int type, optional;
-};
-
-struct DCmd {
- char name[30];
- DebugProc function;
-};
-class ScummDebugger {
+class ScummDebugger : public Common::Debugger<ScummDebugger> {
public:
ScummDebugger(ScummEngine *s);
- void onFrame();
- void attach(const char *entry = 0);
-
- bool isAttached() const { return _isAttached; }
-
protected:
ScummEngine *_vm;
- int _frame_countdown, _dvar_count, _dcmd_count;
- DVar _dvars[256];
- DCmd _dcmds[256];
- bool _detach_now;
- bool _isAttached;
- char *_errStr;
- ConsoleDialog *_debuggerDialog;
+ bool _old_soundsPaused;
- void enter();
- void detach();
-
- void DVar_Register(const char *varname, void *pointer, int type, int optional);
- void DCmd_Register(const char *cmdname, DebugProc pointer);
- bool RunCommand(const char *input);
+ virtual void preEnter();
+ virtual void postEnter();
// Commands
bool Cmd_Exit(int argc, const char **argv);
@@ -106,14 +67,6 @@ protected:
void printBox(int box);
void drawBox(int box);
-
-#if USE_CONSOLE
- static bool debuggerInputCallback(ConsoleDialog *console, const char *input, void *refCon);
- static bool debuggerCompletionCallback(ConsoleDialog *console, const char *input, char*& completion, void *refCon);
-#endif
-
- bool TabComplete(const char *input, char*& completion);
-
};
} // End of namespace Scumm