aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--actor.cpp4
-rw-r--r--debug.cpp33
-rw-r--r--script.cpp7
-rw-r--r--script_v2.cpp6
-rw-r--r--scumm.h1
-rw-r--r--scummvm.cpp1
6 files changed, 44 insertions, 8 deletions
diff --git a/actor.cpp b/actor.cpp
index f933818e6c..e94076908c 100644
--- a/actor.cpp
+++ b/actor.cpp
@@ -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;
diff --git a/debug.cpp b/debug.cpp
index 7e44d9609e..00baf1dad7 100644
--- a/debug.cpp
+++ b/debug.cpp
@@ -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]);
diff --git a/scumm.h b/scumm.h
index b3275f4227..56d5f9533c 100644
--- a/scumm.h
+++ b/scumm.h
@@ -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;