mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-20 19:21:46 +00:00
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
This commit is contained in:
parent
5602b2cf81
commit
8a5705132d
@ -640,7 +640,6 @@ void ScummEngine_v2::o2_waitForActor() {
|
||||
}
|
||||
|
||||
void ScummEngine_v2::o2_waitForMessage() {
|
||||
|
||||
if (VAR(VAR_HAVE_MSG)) {
|
||||
_scriptPointer--;
|
||||
o5_breakHere();
|
||||
|
@ -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
|
||||
|
@ -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() {
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -50,6 +50,8 @@ protected:
|
||||
|
||||
/* Version 3 script opcodes */
|
||||
void o3_setBoxFlags();
|
||||
void o3_waitForActor();
|
||||
void o3_waitForSentence();
|
||||
};
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user