diff options
Diffstat (limited to 'engines/agi/op_cmd.cpp')
-rw-r--r-- | engines/agi/op_cmd.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/engines/agi/op_cmd.cpp b/engines/agi/op_cmd.cpp index 5d08313b52..364a999509 100644 --- a/engines/agi/op_cmd.cpp +++ b/engines/agi/op_cmd.cpp @@ -1753,8 +1753,6 @@ static void (*agiCommand[183])(uint8 *) = { cmd_adj_ego_move_to_x_y }; -#define CMD_BSIZE 12 - /** * Execute a logic script * @param n Number of the logic resource to execute @@ -1765,6 +1763,11 @@ int AgiEngine::runLogic(int n) { uint8 *code = NULL; g_agi = this; int num = 0; + ScriptPos sp; + + sp.script = n; + sp.curIP = 0; + _game.execStack.push_back(sp); // If logic not loaded, load it if (~_game.dirLogic[n].flags & RES_LOADED) { @@ -1795,6 +1798,9 @@ int AgiEngine::runLogic(int n) { } } + _game.execStack.back().curIP = ip; + processEvents(); + switch (op = *(code + ip++)) { case 0xff: // if (open/close) testIfCode(n); @@ -1812,6 +1818,7 @@ int AgiEngine::runLogic(int n) { } break; case 0x00: // return + _game.execStack.pop_back(); return 1; default: num = logicNamesCmd[op].numArgs; @@ -1819,7 +1826,7 @@ int AgiEngine::runLogic(int n) { memset(p + num, 0, CMD_BSIZE - num); debugC(2, kDebugLevelScripts, "%s(%d %d %d)", logicNamesCmd[op].name, p[0], p[1], p[2]); - agiCommand[op] (p); + agiCommand[op](p); ip += num; } @@ -1827,6 +1834,8 @@ int AgiEngine::runLogic(int n) { break; } + _game.execStack.pop_back(); + return 0; // after executing new.room() } |