diff options
-rw-r--r-- | actor.cpp | 4 | ||||
-rw-r--r-- | debug.cpp | 33 | ||||
-rw-r--r-- | script.cpp | 7 | ||||
-rw-r--r-- | script_v2.cpp | 6 | ||||
-rw-r--r-- | scumm.h | 1 | ||||
-rw-r--r-- | scummvm.cpp | 1 |
6 files changed, 44 insertions, 8 deletions
@@ -465,7 +465,7 @@ AdjustBoxResult Scumm::adjustXYToBeInBox(Actor *a, int x, int y, int pathfrom) { AdjustBoxResult abr,tmp; uint threshold; uint best; - int box; + int box, iterations; /* Use inerations for those odd times we get stuck in the loop */ byte flags, b; abr.x = x; @@ -479,6 +479,8 @@ AdjustBoxResult Scumm::adjustXYToBeInBox(Actor *a, int x, int y, int pathfrom) { return abr; while(1) { + iterations++; + if (iterations > 1000) return abr; /* Safety net */ box = getNumBoxes() - 1; best = (uint)0xFFFF; b = 0; @@ -40,7 +40,9 @@ enum { CMD_ACTOR, CMD_SCRIPTS, CMD_LOAD_ROOM, - CMD_DUMPBOX, + CMD_DUMPBOX, + CMD_VAR, + CMD_WATCH, CMD_EXIT }; @@ -117,6 +119,31 @@ bool ScummDebugger::do_command() { } } return true; + case CMD_VAR: + if (!_parameters[0]) { + printf("Enter a variable\n"); + } else { + char *tok = strtok(_parameters, " "); + int var = atoi(tok); + tok = strtok(NULL, ""); + if (tok) + _s->writeVar(var, atoi(tok)); + + printf("Var[%d] = %d\n", var, _s->readVar(var)); + } + return true; + case CMD_WATCH: + if (!_parameters[0]) { + printf("Clearing all watches..\n"); + _s->_varwatch = -1; + } else { + _s->_varwatch = atoi(_parameters); + if (_s->_varwatch == 0) + printf("Watching all variables\n"); + else + printf("Watching vars[%d]\n", _s->_varwatch); + } + return true; case CMD_EXIT: exit(1); @@ -161,7 +188,9 @@ static const DebuggerCommands debugger_commands[] = { { "a", 1, CMD_ACTOR }, { "s", 1, CMD_SCRIPTS }, { "r", 1, CMD_LOAD_ROOM }, - { "b", 1, CMD_DUMPBOX}, + { "b", 1, CMD_DUMPBOX}, + { "v", 1, CMD_VAR}, + { "w", 1, CMD_WATCH}, { "e", 1, CMD_EXIT }, { 0, 0, 0 }, }; diff --git a/script.cpp b/script.cpp index 10bff307e5..1853881f87 100644 --- a/script.cpp +++ b/script.cpp @@ -333,6 +333,9 @@ void Scumm::writeVar(uint var, int value) { if (!(var&0xF000)) { checkRange(_numVariables-1, 0, var, "Variable %d out of range(w)"); _vars[var] = value; + + if ((_varwatch == var) || (_varwatch == 0)) + printf("vars[%d] = %d (via script %d)\n", var, value, &vm.slot[_currentScript].number); return; } @@ -729,12 +732,12 @@ int Scumm::getVerbEntrypoint(int obj, int entry) { void Scumm::push(int a) { - assert(_scummStackPos >=0 && _scummStackPos < ARRAYSIZE(_scummStack)-1); + assert(_scummStackPos >=0 && _scummStackPos <= ARRAYSIZE(_scummStack)-1); _scummStack[_scummStackPos++] = a; } int Scumm::pop() { - assert(_scummStackPos >0 && _scummStackPos < ARRAYSIZE(_scummStack)); + assert(_scummStackPos >0 && _scummStackPos <= ARRAYSIZE(_scummStack)); return _scummStack[--_scummStackPos]; } diff --git a/script_v2.cpp b/script_v2.cpp index e359af629c..8ed1e07ca1 100644 --- a/script_v2.cpp +++ b/script_v2.cpp @@ -262,7 +262,7 @@ void Scumm::setupOpcodes2() { &Scumm::o6_talkEgo, /* BC */ &Scumm::o6_dim, - &Scumm::o6_invalid, + &Scumm::o5_dummy, &Scumm::o6_runVerbCodeQuick, &Scumm::o6_runScriptQuick, /* C0 */ @@ -2365,7 +2365,7 @@ void Scumm::o6_dim() { nukeArray(fetchScriptWord()); return; default: - error("o6_dim: default case"); + error("o6_dim : default case"); } defineArray(fetchScriptWord(), data, 0, pop()); @@ -2634,7 +2634,7 @@ void Scumm::o6_miscOps() { break; case 122: - error("stub o6_miscOps_122(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)", + warning("stub o6_miscOps_122(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)", args[1],args[2],args[3],args[4], args[5],args[6],args[7],args[8], args[9],args[10],args[11],args[12]); @@ -859,6 +859,7 @@ struct Scumm { ObjectData *_objs; uint16 *_newNames; int16 *_vars; + int16 _varwatch; byte *_bitVars; const OpcodeProc *_opcodes; diff --git a/scummvm.cpp b/scummvm.cpp index 82321e48c1..2c7b2a5dc4 100644 --- a/scummvm.cpp +++ b/scummvm.cpp @@ -119,6 +119,7 @@ void Scumm::scummInit() { charset._bufPos = 0; _haveMsg = 0; + _varwatch = -1; _screenStartStrip = 0; _vars[VAR_TALK_ACTOR] = 0; |