diff options
author | Oliver Kiehl | 2003-05-25 15:41:48 +0000 |
---|---|---|
committer | Oliver Kiehl | 2003-05-25 15:41:48 +0000 |
commit | 48f277e65d42c725163aa7516aae529fd94255f0 (patch) | |
tree | db368c3663cd51503cb693e81b9c6653ec6ce34a | |
parent | eba043584b29049014333020ea709513f7c8322c (diff) | |
download | scummvm-rg350-48f277e65d42c725163aa7516aae529fd94255f0.tar.gz scummvm-rg350-48f277e65d42c725163aa7516aae529fd94255f0.tar.bz2 scummvm-rg350-48f277e65d42c725163aa7516aae529fd94255f0.zip |
cleanup/prevent _compact from being overwritten by possible recalls of the interpreter
svn-id: r7958
-rw-r--r-- | sky/logic.cpp | 52 | ||||
-rw-r--r-- | sky/logic.h | 2 |
2 files changed, 27 insertions, 27 deletions
diff --git a/sky/logic.cpp b/sky/logic.cpp index 7570da456f..dc9480b9a6 100644 --- a/sky/logic.cpp +++ b/sky/logic.cpp @@ -29,7 +29,7 @@ uint16 SkyLogic::_screen; typedef void (SkyLogic::*LogicTable) (); static const LogicTable logicTable[] = { - &SkyLogic::lreturn, + &SkyLogic::nop, &SkyLogic::logicScript, // 1 script processor &SkyLogic::autoRoute, // 2 Make a route &SkyLogic::arAnim, // 3 Follow a route @@ -100,10 +100,7 @@ void SkyLogic::engine() { } } -void SkyLogic::lreturn() { - // WTF??? - return; -} +void SkyLogic::nop() {} void SkyLogic::logicScript() { // Process the current mega's script @@ -915,7 +912,7 @@ script: scriptData += READ_LE_UINT16(scriptData + (scriptNo & 0x0fff)); uint32 a, b, c; - uint16 command, mcode, s; + uint16 command, s; uint16 *tmp; int16 t; @@ -989,29 +986,32 @@ script: push(0); break; case 11: // call_mcode - s = READ_LE_UINT16(scriptData++); - - a = s; - b = c = 0; - assert(s <= 3); - // No, I did not forget the "break"s - switch (s) { - case 3: - c = pop(); - case 2: - b = pop(); - case 1: - a = pop(); - } + { + s = READ_LE_UINT16(scriptData++); + + a = s; + b = c = 0; + assert(s <= 3); + // No, I did not forget the "break"s + switch (s) { + case 3: + c = pop(); + case 2: + b = pop(); + case 1: + a = pop(); + } - // TODO: save stuff (compare asm code) - mcode = READ_LE_UINT16(scriptData++)/4; // get mcode number - SkyDebug::mcode(mcode, a, b, c); + uint16 mcode = READ_LE_UINT16(scriptData++)/4; // get mcode number + SkyDebug::mcode(mcode, a, b, c); - a = (this->*mcodeTable[mcode]) (a, b, c); + Compact *saveCpt = _compact; + uint32 ret = (this->*mcodeTable[mcode]) (a, b, c); + _compact = saveCpt; - if (!a) - return (((scriptData - moduleStart) << 16) | scriptNo); + if (!ret) + return (((scriptData - moduleStart) << 16) | scriptNo); + } break; case 12: // more_than a = pop(); diff --git a/sky/logic.h b/sky/logic.h index 86ca55a617..bfc102b427 100644 --- a/sky/logic.h +++ b/sky/logic.h @@ -34,7 +34,7 @@ public: SkyLogic(SkyDisk *skyDisk, SkyGrid *skyGrid, SkyText *skyText, SkyMusicBase *skyMusic, SkyMouse *skyMouse, SkySound *skySound, uint32 gameVersion); void engine(); - void lreturn(); + void nop(); void logicScript(); void autoRoute(); void arAnim(); |