[Scummvm-cvs-logs] SF.net SVN: scummvm:[52130] scummvm/trunk/engines/scumm

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Mon Aug 16 21:58:01 CEST 2010


Revision: 52130
          http://scummvm.svn.sourceforge.net/scummvm/?rev=52130&view=rev
Author:   fingolfin
Date:     2010-08-16 19:58:01 +0000 (Mon, 16 Aug 2010)

Log Message:
-----------
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.

Modified Paths:
--------------
    scummvm/trunk/engines/scumm/script_v2.cpp
    scummvm/trunk/engines/scumm/script_v3.cpp
    scummvm/trunk/engines/scumm/script_v4.cpp
    scummvm/trunk/engines/scumm/script_v5.cpp
    scummvm/trunk/engines/scumm/scumm_v3.h

Modified: scummvm/trunk/engines/scumm/script_v2.cpp
===================================================================
--- scummvm/trunk/engines/scumm/script_v2.cpp	2010-08-16 19:57:35 UTC (rev 52129)
+++ scummvm/trunk/engines/scumm/script_v2.cpp	2010-08-16 19:58:01 UTC (rev 52130)
@@ -640,7 +640,6 @@
 }
 
 void ScummEngine_v2::o2_waitForMessage() {
-
 	if (VAR(VAR_HAVE_MSG)) {
 		_scriptPointer--;
 		o5_breakHere();

Modified: scummvm/trunk/engines/scumm/script_v3.cpp
===================================================================
--- scummvm/trunk/engines/scumm/script_v3.cpp	2010-08-16 19:57:35 UTC (rev 52129)
+++ scummvm/trunk/engines/scumm/script_v3.cpp	2010-08-16 19:58:01 UTC (rev 52130)
@@ -24,6 +24,7 @@
  */
 
 #include "scumm/scumm_v3.h"
+#include "scumm/actor.h"
 
 namespace Scumm {
 
@@ -36,6 +37,11 @@
 		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 @@
 	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

Modified: scummvm/trunk/engines/scumm/script_v4.cpp
===================================================================
--- scummvm/trunk/engines/scumm/script_v4.cpp	2010-08-16 19:57:35 UTC (rev 52129)
+++ scummvm/trunk/engines/scumm/script_v4.cpp	2010-08-16 19:58:01 UTC (rev 52130)
@@ -60,6 +60,11 @@
 
 	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() {

Modified: scummvm/trunk/engines/scumm/script_v5.cpp
===================================================================
--- scummvm/trunk/engines/scumm/script_v5.cpp	2010-08-16 19:57:35 UTC (rev 52129)
+++ scummvm/trunk/engines/scumm/script_v5.cpp	2010-08-16 19:58:01 UTC (rev 52130)
@@ -999,17 +999,6 @@
 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_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);
 }

Modified: scummvm/trunk/engines/scumm/scumm_v3.h
===================================================================
--- scummvm/trunk/engines/scumm/scumm_v3.h	2010-08-16 19:57:35 UTC (rev 52129)
+++ scummvm/trunk/engines/scumm/scumm_v3.h	2010-08-16 19:58:01 UTC (rev 52130)
@@ -50,6 +50,8 @@
 
 	/* Version 3 script opcodes */
 	void o3_setBoxFlags();
+	void o3_waitForActor();
+	void o3_waitForSentence();
 };
 
 /**


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list