From 8a5705132d236f9bce49a420ddfff94157eabcb5 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 16 Aug 2010 19:58:01 +0000 Subject: SCUMM: More finely differentiate opcode tables between v3, v4 and v5 This has been tested and verified as much as I can, but has a small risk of leading to (easily fixable) regressions. svn-id: r52130 --- engines/scumm/script_v2.cpp | 1 - engines/scumm/script_v3.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ engines/scumm/script_v4.cpp | 5 +++++ engines/scumm/script_v5.cpp | 24 ------------------------ engines/scumm/scumm_v3.h | 2 ++ 5 files changed, 47 insertions(+), 25 deletions(-) (limited to 'engines') diff --git a/engines/scumm/script_v2.cpp b/engines/scumm/script_v2.cpp index d93e2ea3e4..bc8446d16f 100644 --- a/engines/scumm/script_v2.cpp +++ b/engines/scumm/script_v2.cpp @@ -640,7 +640,6 @@ void ScummEngine_v2::o2_waitForActor() { } void ScummEngine_v2::o2_waitForMessage() { - if (VAR(VAR_HAVE_MSG)) { _scriptPointer--; o5_breakHere(); diff --git a/engines/scumm/script_v3.cpp b/engines/scumm/script_v3.cpp index 7d2efdb9a8..176eefdeef 100644 --- a/engines/scumm/script_v3.cpp +++ b/engines/scumm/script_v3.cpp @@ -24,6 +24,7 @@ */ #include "scumm/scumm_v3.h" +#include "scumm/actor.h" namespace Scumm { @@ -36,6 +37,11 @@ void ScummEngine_v3::setupOpcodes() { OPCODE(0x30, o3_setBoxFlags); OPCODE(0xb0, o3_setBoxFlags); } + + OPCODE(0x3b, o3_waitForActor); + OPCODE(0xbb, o3_waitForActor); + + OPCODE(0x4c, o3_waitForSentence); } void ScummEngine_v3::o3_setBoxFlags() { @@ -46,4 +52,38 @@ void ScummEngine_v3::o3_setBoxFlags() { setBoxFlags(a, b); } +void ScummEngine_v3::o3_waitForActor() { + // This opcode was a NOP in LOOM. Also, we cannot directly use + // o2_waitForActor because there the _scriptPointer is different (it + // assumes that getVar reads only a single byte, which is correct + // for v2 but not for v3). Of course we could copy the code here to + // o2_waitForActor and then merge the two, but right now I am + // keeping this as it is. + if (_game.id == GID_INDY3) { + const byte *oldaddr = _scriptPointer - 1; + Actor *a = derefActor(getVarOrDirectByte(PARAM_1), "o3_waitForActor"); + if (a->_moving) { + _scriptPointer = oldaddr; + o5_breakHere(); + } + } +} + +void ScummEngine_v3::o3_waitForSentence() { + // FIXME/TODO: Can we merge this with o2_waitForSentence? I think + // the code here is actually incorrect, and the code in + // o2_waitForSentence correct, but somebody should check the + // disassembly for Indy and Loom. + if (_sentenceNum) { + if (_sentence[_sentenceNum - 1].freezeCount && !isScriptInUse(VAR(VAR_SENTENCE_SCRIPT))) + return; + } else if (!isScriptInUse(VAR(VAR_SENTENCE_SCRIPT))) + return; + + _scriptPointer--; + o5_breakHere(); +} + + + } // End of namespace Scumm diff --git a/engines/scumm/script_v4.cpp b/engines/scumm/script_v4.cpp index 01927b02e7..6dc3004432 100644 --- a/engines/scumm/script_v4.cpp +++ b/engines/scumm/script_v4.cpp @@ -60,6 +60,11 @@ void ScummEngine_v4::setupOpcodes() { OPCODE(0x22, o4_saveLoadGame); OPCODE(0xa2, o4_saveLoadGame); + + // Disable some opcodes which are unused in v4. + _opcodes[0x3b].setProc(0, 0); + _opcodes[0x4c].setProc(0, 0); + _opcodes[0xbb].setProc(0, 0); } void ScummEngine_v4::o4_ifState() { diff --git a/engines/scumm/script_v5.cpp b/engines/scumm/script_v5.cpp index 08afdb8ec9..556f5b0af1 100644 --- a/engines/scumm/script_v5.cpp +++ b/engines/scumm/script_v5.cpp @@ -999,17 +999,6 @@ void ScummEngine_v5::o5_getActorRoom() { void ScummEngine_v5::o5_getActorScale() { Actor *a; - // INDY3 uses this opcode for waitForActor - if (_game.id == GID_INDY3) { - const byte *oldaddr = _scriptPointer - 1; - a = derefActor(getVarOrDirectByte(PARAM_1), "o5_getActorScale (wait)"); - if (a->_moving) { - _scriptPointer = oldaddr; - o5_breakHere(); - } - return; - } - getResultPos(); int act = getVarOrDirectByte(PARAM_1); a = derefActor(act, "o5_getActorScale"); @@ -2044,19 +2033,6 @@ void ScummEngine_v5::o5_isSoundRunning() { void ScummEngine_v5::o5_soundKludge() { int items[16]; - - if (_game.features & GF_SMALL_HEADER) { // Is WaitForSentence in SCUMM V3 - if (_sentenceNum) { - if (_sentence[_sentenceNum - 1].freezeCount && !isScriptInUse(VAR(VAR_SENTENCE_SCRIPT))) - return; - } else if (!isScriptInUse(VAR(VAR_SENTENCE_SCRIPT))) - return; - - _scriptPointer--; - o5_breakHere(); - return; - } - int num = getWordVararg(items); _sound->soundKludge(items, num); } diff --git a/engines/scumm/scumm_v3.h b/engines/scumm/scumm_v3.h index 767069d1bc..abe75cd64d 100644 --- a/engines/scumm/scumm_v3.h +++ b/engines/scumm/scumm_v3.h @@ -50,6 +50,8 @@ protected: /* Version 3 script opcodes */ void o3_setBoxFlags(); + void o3_waitForActor(); + void o3_waitForSentence(); }; /** -- cgit v1.2.3