[Scummvm-cvs-logs] SF.net SVN: scummvm: [28181] scummvm/trunk/engines/gob

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Tue Jul 24 08:11:38 CEST 2007


Revision: 28181
          http://scummvm.svn.sourceforge.net/scummvm/?rev=28181&view=rev
Author:   drmccoy
Date:     2007-07-23 23:11:38 -0700 (Mon, 23 Jul 2007)

Log Message:
-----------
Fixing bug #1749688 ("GOB3: Objects Disappear")

Modified Paths:
--------------
    scummvm/trunk/engines/gob/inter.h
    scummvm/trunk/engines/gob/inter_v2.cpp
    scummvm/trunk/engines/gob/inter_v3.cpp
    scummvm/trunk/engines/gob/mult.h
    scummvm/trunk/engines/gob/mult_v1.cpp
    scummvm/trunk/engines/gob/mult_v2.cpp

Modified: scummvm/trunk/engines/gob/inter.h
===================================================================
--- scummvm/trunk/engines/gob/inter.h	2007-07-24 01:23:23 UTC (rev 28180)
+++ scummvm/trunk/engines/gob/inter.h	2007-07-24 06:11:38 UTC (rev 28181)
@@ -342,6 +342,7 @@
 	virtual void checkSwitchTable(byte **ppExec);
 
 	void o2_playMult();
+	void o2_freeMultKeys();
 	void o2_setRenderFlags();
 	void o2_multSub();
 	void o2_initMult();

Modified: scummvm/trunk/engines/gob/inter_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v2.cpp	2007-07-24 01:23:23 UTC (rev 28180)
+++ scummvm/trunk/engines/gob/inter_v2.cpp	2007-07-24 06:11:38 UTC (rev 28181)
@@ -134,7 +134,7 @@
 		/* 00 */
 		OPCODE(o1_loadMult),
 		OPCODE(o2_playMult),
-		OPCODE(o1_freeMultKeys),
+		OPCODE(o2_freeMultKeys),
 		{NULL, ""},
 		/* 04 */
 		{NULL, ""},
@@ -826,6 +826,17 @@
 	_vm->_mult->playMult(VAR(57), -1, checkEscape & 0x1, 0);
 }
 
+void Inter_v2::o2_freeMultKeys() {
+	uint16 index = load16();
+
+	if (!_vm->_mult->hasMultData(index))
+		return;
+
+	_vm->_mult->setMultData(index);
+	_vm->_mult->freeMultKeys();
+	_vm->_mult->zeroMultData(index);
+}
+
 void Inter_v2::o2_setRenderFlags() {
 	int16 expr;
 

Modified: scummvm/trunk/engines/gob/inter_v3.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v3.cpp	2007-07-24 01:23:23 UTC (rev 28180)
+++ scummvm/trunk/engines/gob/inter_v3.cpp	2007-07-24 06:11:38 UTC (rev 28181)
@@ -122,7 +122,7 @@
 		/* 00 */
 		OPCODE(o1_loadMult),
 		OPCODE(o2_playMult),
-		OPCODE(o1_freeMultKeys),
+		OPCODE(o2_freeMultKeys),
 		{NULL, ""},
 		/* 04 */
 		{NULL, ""},

Modified: scummvm/trunk/engines/gob/mult.h
===================================================================
--- scummvm/trunk/engines/gob/mult.h	2007-07-24 01:23:23 UTC (rev 28180)
+++ scummvm/trunk/engines/gob/mult.h	2007-07-24 06:11:38 UTC (rev 28181)
@@ -112,7 +112,7 @@
 	} PACKED_STRUCT;
 
 	struct Mult_AnimKey {
-		int16 frame;
+		uint16 frame;
 		int16 layer;
 		int16 posX;
 		int16 posY;
@@ -246,8 +246,10 @@
 
 	virtual void loadMult(int16 resId) = 0;
 	virtual void freeMultKeys() = 0;
-	virtual void setMultData(uint16 multindex) = 0;
-	virtual void multSub(uint16 multindex) = 0;
+	virtual bool hasMultData(uint16 multIndex) = 0;
+	virtual void setMultData(uint16 multIndex) = 0;
+	virtual void zeroMultData(uint16 multIndex) = 0;
+	virtual void multSub(uint16 multIndex) = 0;
 	virtual void animate() = 0;
 
 	Mult(GobEngine *vm);
@@ -299,8 +301,10 @@
 
 	virtual void loadMult(int16 resId);
 	virtual void freeMultKeys();
-	virtual void setMultData(uint16 multindex);
-	virtual void multSub(uint16 multindex);
+	virtual bool hasMultData(uint16 multIndex);
+	virtual void setMultData(uint16 multIndex);
+	virtual void zeroMultData(uint16 multIndex);
+	virtual void multSub(uint16 multIndex);
 	virtual void animate();
 
 protected:
@@ -317,8 +321,10 @@
 
 	virtual void loadMult(int16 resId);
 	virtual void freeMultKeys();
-	virtual void setMultData(uint16 multindex);
-	virtual void multSub(uint16 multindex);
+	virtual bool hasMultData(uint16 multIndex);
+	virtual void setMultData(uint16 multIndex);
+	virtual void zeroMultData(uint16 multIndex);
+	virtual void multSub(uint16 multIndex);
 	virtual void animate();
 
 protected:

Modified: scummvm/trunk/engines/gob/mult_v1.cpp
===================================================================
--- scummvm/trunk/engines/gob/mult_v1.cpp	2007-07-24 01:23:23 UTC (rev 28180)
+++ scummvm/trunk/engines/gob/mult_v1.cpp	2007-07-24 06:11:38 UTC (rev 28181)
@@ -237,14 +237,22 @@
 	_multData = 0;
 }
 
-void Mult_v1::setMultData(uint16 multindex) {
+bool Mult_v1::hasMultData(uint16 multIndex) {
 	error("Switching mults not supported for Gob1");
 }
 
-void Mult_v1::multSub(uint16 multindex) {
+void Mult_v1::setMultData(uint16 multIndex) {
 	error("Switching mults not supported for Gob1");
 }
 
+void Mult_v1::zeroMultData(uint16 multIndex) {
+	error("Switching mults not supported for Gob1");
+}
+
+void Mult_v1::multSub(uint16 multIndex) {
+	error("Switching mults not supported for Gob1");
+}
+
 void Mult_v1::playMultInit() {
 	_doPalSubst = false;
 	_palFadingRed = 0;

Modified: scummvm/trunk/engines/gob/mult_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/mult_v2.cpp	2007-07-24 01:23:23 UTC (rev 28180)
+++ scummvm/trunk/engines/gob/mult_v2.cpp	2007-07-24 06:11:38 UTC (rev 28181)
@@ -346,28 +346,42 @@
 	_multData = 0;
 }
 
-void Mult_v2::setMultData(uint16 multindex) {
-	if (multindex > 7)
+bool Mult_v2::hasMultData(uint16 multIndex) {
+	if (multIndex > 7)
 		error("Multindex out of range");
 
-	debugC(4, kDebugGameFlow, "Switching to mult %d", multindex);
-	_multData = _multDatas[multindex];
+	return _multDatas[multIndex] != 0;
 }
 
-void Mult_v2::multSub(uint16 multindex) {
+void Mult_v2::setMultData(uint16 multIndex) {
+	if (multIndex > 7)
+		error("Multindex out of range");
+
+	debugC(4, kDebugGameFlow, "Switching to mult %d", multIndex);
+	_multData = _multDatas[multIndex];
+}
+
+void Mult_v2::zeroMultData(uint16 multIndex) {
+	if (multIndex > 7)
+		error("Multindex out of range");
+
+	_multDatas[multIndex] = 0;
+}
+
+void Mult_v2::multSub(uint16 multIndex) {
 	uint16 flags;
 	int16 expr;
 	int16 index;
 	int16 startFrame, stopFrame, firstFrame;
 
-	flags = multindex;
-	multindex = (multindex >> 12) & 0xF;
+	flags = multIndex;
+	multIndex = (multIndex >> 12) & 0xF;
 
-	if (multindex > 7)
+	if (multIndex > 7)
 		error("Multindex out of range");
 
-	debugC(4, kDebugGameFlow, "Sub mult %d", multindex);
-	_multData = _multDatas[multindex];
+	debugC(4, kDebugGameFlow, "Sub mult %d", multIndex);
+	_multData = _multDatas[multIndex];
 
 	if (!_multData) {
 		_vm->_parse->parseValExpr();
@@ -1074,13 +1088,19 @@
 		return;
 
 	for (int i = 0; i < 4; i++) {
+		int obj = _multData->animObjs[index][i];
+
 		if (_multData->animObjs[index][i] != -1) {
 			int keyIndex = _multData->animKeysIndices[index][i];
 			int count = _multData->animKeysCount[i];
 
 			for (int j = keyIndex; j < count; j++) {
+
+				if ((obj == -1) || (obj == 1024))
+					continue;
+
 				Mult_AnimKey &key = _multData->animKeys[i][j];
-				Mult_Object &animObj = _objects[_multData->animObjs[index][i]];
+				Mult_Object &animObj = _objects[obj];
 				Mult_AnimData &animData = *(animObj.pAnimData);
 
 				if (key.frame > frame)
@@ -1122,7 +1142,7 @@
 			}
 		}
 
-		if (_multData->animObjs[index][i] != -1) {
+		if (obj != -1) {
 			int keyIndex = _multData->imdKeysIndices[index][i];
 			int count = _multData->imdKeysCount[i];
 


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