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

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Mon May 1 09:06:03 CEST 2006


Revision: 22262
Author:   drmccoy
Date:     2006-05-01 09:04:53 -0700 (Mon, 01 May 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm/?rev=22262&view=rev

Log Message:
-----------
More stubs; GOB2 goes in-game for a second, then segfaults in the
Global-constructor; valgrind shows invalid reads in parseValExpr()
and parseExpr() while accessing _inter_variables and _inter_execPtr

Modified Paths:
--------------
    scummvm/trunk/engines/gob/game_v2.cpp
    scummvm/trunk/engines/gob/inter.h
    scummvm/trunk/engines/gob/inter_v1.cpp
    scummvm/trunk/engines/gob/inter_v2.cpp
    scummvm/trunk/engines/gob/mult.h
    scummvm/trunk/engines/gob/mult_v1.cpp
    scummvm/trunk/engines/gob/mult_v2.cpp
    scummvm/trunk/engines/gob/parse.cpp
    scummvm/trunk/engines/gob/parse_v2.cpp
Modified: scummvm/trunk/engines/gob/game_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/game_v2.cpp	2006-05-01 15:36:54 UTC (rev 22261)
+++ scummvm/trunk/engines/gob/game_v2.cpp	2006-05-01 16:04:53 UTC (rev 22262)
@@ -181,8 +181,7 @@
 			if (_vm->_global->_inter_variables == 0) {
 				variablesCount = READ_LE_UINT32((char *)_totFileData + 0x2c);
 				_vm->_global->_inter_variables = new char[variablesCount * 4];
-				for (i = 0; i < variablesCount; i++)
-					WRITE_VAR(i, 0);
+				memset(_vm->_global->_inter_variables, 0, variablesCount * 4);
 			}
 
 			_vm->_global->_inter_execPtr = (char *)_totFileData;

Modified: scummvm/trunk/engines/gob/inter.h
===================================================================
--- scummvm/trunk/engines/gob/inter.h	2006-05-01 15:36:54 UTC (rev 22261)
+++ scummvm/trunk/engines/gob/inter.h	2006-05-01 16:04:53 UTC (rev 22262)
@@ -310,6 +310,9 @@
 
 	void o2_drawStub(void) { warning("Gob2 stub"); }
 	void o2_totSub(void);
+	void o2_stub0x52(void);
+	void o2_stub0x53(void);
+	void o2_stub0x54(void);
 	void o2_stub0x56(void);
 	void o2_stub0x80(void);
 	void o2_renderStatic(void);
@@ -318,6 +321,7 @@
 	bool o2_loadTot(char &cmdCount, int16 &counter, int16 &retFlag);
 	bool o2_freeSprite(char &cmdCount, int16 &counter, int16 &retFlag);
 	bool o2_loadSound(char &cmdCount, int16 &counter, int16 &retFlag);
+	void o2_multSub(void);
 	void o2_setRenderFlags(void);
 	void o2_initMult(void);
 	void o2_loadCurLayer(void);
@@ -328,6 +332,7 @@
 	void o2_getCDTrackPos(void);
 	void o2_playMult(void);
 	void o2_initCursor(void);
+	void o2_setPickable(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc);
 };
 
 }				// End of namespace Gob

Modified: scummvm/trunk/engines/gob/inter_v1.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v1.cpp	2006-05-01 15:36:54 UTC (rev 22261)
+++ scummvm/trunk/engines/gob/inter_v1.cpp	2006-05-01 16:04:53 UTC (rev 22262)
@@ -1647,7 +1647,7 @@
 }
 
 void Inter_v1::executeDrawOpcode(byte i) {
-	debugC(1, DEBUG_DRAWOP, "opcodeDraw %d (%s)", i, getOpcodeDrawDesc(i));
+	debugC(1, DEBUG_DRAWOP, "opcodeDraw %d [0x%x] (%s)", i, i, getOpcodeDrawDesc(i));
 
 	OpcodeDrawProcV1 op = _opcodesDrawV1[i].proc;
 
@@ -1658,7 +1658,7 @@
 }
 
 bool Inter_v1::executeFuncOpcode(byte i, byte j, char &cmdCount, int16 &counter, int16 &retFlag) {
-	debugC(1, DEBUG_FUNCOP, "opcodeFunc %d.%d (%s)", i, j, getOpcodeFuncDesc(i, j));
+	debugC(1, DEBUG_FUNCOP, "opcodeFunc %d.%d [0x%x.0x%x] (%s)", i, j, i, j, getOpcodeFuncDesc(i, j));
 
 	if ((i > 4) || (j > 15)) {
 		warning("unimplemented opcodeFunc: %d.%d", i, j);
@@ -1675,7 +1675,7 @@
 }
 
 void Inter_v1::executeGoblinOpcode(int i, int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc) {
-	debugC(1, DEBUG_GOBOP, "opcodeGoblin %d (%s)", i, getOpcodeGoblinDesc(i));
+	debugC(1, DEBUG_GOBOP, "opcodeGoblin %d [0x%x] (%s)", i, i, getOpcodeGoblinDesc(i));
 
 	OpcodeGoblinProcV1 op = NULL;
 

Modified: scummvm/trunk/engines/gob/inter_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v2.cpp	2006-05-01 15:36:54 UTC (rev 22261)
+++ scummvm/trunk/engines/gob/inter_v2.cpp	2006-05-01 16:04:53 UTC (rev 22262)
@@ -146,7 +146,7 @@
 		OPCODE(o1_loadAnim),
 		OPCODE(o1_freeAnim),
 		OPCODE(o1_updateAnim),
-		OPCODE(o2_drawStub),
+		OPCODE(o2_multSub),
 		/* 14 */
 		OPCODE(o2_initMult),
 		OPCODE(o1_multFreeMult),
@@ -225,11 +225,11 @@
 		/* 50 */
 		OPCODE(o2_drawStub),
 		OPCODE(o2_drawStub),
-		OPCODE(o2_drawStub),
-		OPCODE(o2_drawStub),
+		OPCODE(o2_stub0x52),
+		OPCODE(o2_stub0x53),
 		/* 54 */
+		OPCODE(o2_stub0x54),
 		OPCODE(o2_drawStub),
-		OPCODE(o2_drawStub),
 		OPCODE(o2_stub0x56),
 		{NULL, ""},
 		/* 58 */
@@ -560,7 +560,7 @@
 		OPCODE(o1_setType),
 		/* 08 */
 		OPCODE(o1_setNoTick),
-		OPCODE(o1_setPickable),
+		OPCODE(o2_setPickable),
 		OPCODE(o1_setXPos),
 		OPCODE(o1_setYPos),
 		/* 0C */
@@ -645,7 +645,7 @@
 }
 
 void Inter_v2::executeDrawOpcode(byte i) {
-	debugC(1, DEBUG_DRAWOP, "opcodeDraw %d (%s)", i, getOpcodeDrawDesc(i));
+	debugC(1, DEBUG_DRAWOP, "opcodeDraw %d [0x%x] (%s)", i, i, getOpcodeDrawDesc(i));
 
 	OpcodeDrawProcV2 op = _opcodesDrawV2[i].proc;
 
@@ -656,7 +656,7 @@
 }
 
 bool Inter_v2::executeFuncOpcode(byte i, byte j, char &cmdCount, int16 &counter, int16 &retFlag) {
-	debugC(1, DEBUG_FUNCOP, "opcodeFunc %d.%d (%s)", i, j, getOpcodeFuncDesc(i, j));
+	debugC(1, DEBUG_FUNCOP, "opcodeFunc %d.%d [0x%x.0x%x] (%s)", i, j, i, j, getOpcodeFuncDesc(i, j));
 
 	if ((i > 4) || (j > 15)) {
 		warning("unimplemented opcodeFunc: %d.%d", i, j);
@@ -673,7 +673,7 @@
 }
 
 void Inter_v2::executeGoblinOpcode(int i, int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc) {
-	debugC(1, DEBUG_GOBOP, "opcodeGoblin %d (%s)", i, getOpcodeGoblinDesc(i));
+	debugC(1, DEBUG_GOBOP, "opcodeGoblin %d [0x%x] (%s)", i, i, getOpcodeGoblinDesc(i));
 
 	OpcodeGoblinProcV2 op = NULL;
 
@@ -710,6 +710,33 @@
 	return "";
 }
 
+void Inter_v2::o2_stub0x52(void) {
+	int16 expr1 = _vm->_parse->parseValExpr();
+	int16 expr2 = _vm->_parse->parseValExpr();
+	int16 expr3 = _vm->_parse->parseValExpr();
+
+	warning("STUB: Gob2 drawOperation 0x52 (%d %d %d)", expr1, expr2, expr3);
+}
+
+void Inter_v2::o2_stub0x53(void) {
+	int16 var1 = _vm->_parse->parseVarIndex() >> 2;
+	int16 var2 = _vm->_parse->parseVarIndex() >> 2;
+	int16 index = _vm->_parse->parseValExpr();
+
+	warning("STUB: Gob2 drawOperation 0x53 (%d %d %d)", var1, var2, index);
+
+//	WRITE_VAR(var1, _vm->_mult->_objects[index].field_1A);
+//	WRITE_VAR(var2, _vm->_mult->_objects[index].field_1B);
+}
+
+void Inter_v2::o2_stub0x54(void) {
+	int16 index = _vm->_parse->parseValExpr();
+
+	warning("STUB: Gob2 drawOperation 0x54 (%d)", index);
+
+//	_vm->_mult->_objects[index].pAnimData->field_12 = 4;
+}
+
 void Inter_v2::o2_stub0x56(void) {
 	int16 expr1 = _vm->_parse->parseValExpr();
 	int16 expr2 = _vm->_parse->parseValExpr();
@@ -942,6 +969,10 @@
 	_vm->_game->loadSound(slot, dataPtr);*/
 }
 
+void Inter_v2::o2_multSub(void) {
+	_vm->_mult->multSub(_vm->_parse->parseValExpr());
+}
+
 void Inter_v2::o2_renderStatic(void) {
 	int16 layer;
 	int16 index;
@@ -1522,4 +1553,8 @@
 	WRITE_VAR(4, _vm->_game->_mouseButtons);
 }
 
+void Inter_v2::o2_setPickable(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc) {
+	warning("GOB2 Stub! o2_setPickable");
+}
+
 } // End of namespace Gob

Modified: scummvm/trunk/engines/gob/mult.h
===================================================================
--- scummvm/trunk/engines/gob/mult.h	2006-05-01 15:36:54 UTC (rev 22261)
+++ scummvm/trunk/engines/gob/mult.h	2006-05-01 16:04:53 UTC (rev 22262)
@@ -196,6 +196,7 @@
 	void initAll(void);
 
 	virtual void setMultData(uint16 multindex) = 0;
+	virtual void multSub(uint16 multindex) = 0;
 	virtual void loadMult(int16 resId) = 0;
 	virtual void playMult(int16 startFrame, int16 endFrame, char checkEscape,
 				  char handleMouse) = 0;
@@ -226,6 +227,7 @@
 	virtual ~Mult_v1() {};
 
 	virtual void setMultData(uint16 multindex);
+	virtual void multSub(uint16 multindex);
 	virtual void loadMult(int16 resId);
 	virtual void playMult(int16 startFrame, int16 endFrame, char checkEscape,
 				  char handleMouse);
@@ -307,6 +309,7 @@
 	virtual ~Mult_v2() {};
 
 	virtual void setMultData(uint16 multindex);
+	virtual void multSub(uint16 multindex);
 	virtual void loadMult(int16 resId);
 	virtual void playMult(int16 startFrame, int16 endFrame, char checkEscape,
 				  char handleMouse);

Modified: scummvm/trunk/engines/gob/mult_v1.cpp
===================================================================
--- scummvm/trunk/engines/gob/mult_v1.cpp	2006-05-01 15:36:54 UTC (rev 22261)
+++ scummvm/trunk/engines/gob/mult_v1.cpp	2006-05-01 16:04:53 UTC (rev 22262)
@@ -207,6 +207,10 @@
 	error("Switching mults not supported for Gob1");
 }
 
+void Mult_v1::multSub(uint16 multindex) {
+	error("Switching mults not supported for Gob1");
+}
+
 void Mult_v1::playMult(int16 startFrame, int16 endFrame, char checkEscape,
 	    char handleMouse) {
 	char stopNoClear;

Modified: scummvm/trunk/engines/gob/mult_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/mult_v2.cpp	2006-05-01 15:36:54 UTC (rev 22261)
+++ scummvm/trunk/engines/gob/mult_v2.cpp	2006-05-01 16:04:53 UTC (rev 22262)
@@ -33,6 +33,7 @@
 #include "gob/anim.h"
 #include "gob/draw.h"
 #include "gob/palanim.h"
+#include "gob/parse.h"
 
 namespace Gob {
 
@@ -276,6 +277,57 @@
 	_multData2 = _multDatas[multindex];
 }
 
+void Mult_v2::multSub(uint16 multindex) {
+	uint16 flags;
+	int16 expr;
+	int i;
+	int16 di;
+
+	flags = multindex;
+	multindex = (multindex >> 12) & 0xF;
+
+	if (multindex > 7)
+		error("Multindex out of range");
+
+	debugC(4, DEBUG_GAMEFLOW, "Sub mult %d", multindex);
+	_multData2 = _multDatas[multindex];
+
+	if (_multData2 == 0) {
+		_vm->_parse->parseValExpr();
+		_vm->_parse->parseValExpr();
+		_vm->_parse->parseValExpr();
+		_vm->_parse->parseValExpr();
+		return;
+	}
+
+	if (flags & 0x200)
+		di = 3;
+	else if (flags & 0x100)
+		di = 2;
+	else if (flags & 0x80)
+		di = 1;
+	else
+		di = 0;
+
+	if (flags & 0x400) {
+		flags = 0x400;
+		_multData2->field_156 = -1;
+	} else {
+		_multData2->field_156 = 1;
+		flags &= 0x7F;
+	}
+
+	_multData2->field_124[di][0] = flags;
+	for (i = 1; i < 4; i++) {
+		_multData2->field_124[di][i] = _vm->_parse->parseValExpr();
+	}
+	expr = _vm->_parse->parseValExpr();
+	_multData2->animKeysIndices1[di] = expr;
+	_multData2->animKeysIndices2[di] = expr;
+	// loc_5D0E
+	warning("GOB2 Stub! Mult_v2::multSub()");
+}
+
 void Mult_v2::playMult(int16 startFrame, int16 endFrame, char checkEscape,
 	    char handleMouse) {
 	char stopNoClear;

Modified: scummvm/trunk/engines/gob/parse.cpp
===================================================================
--- scummvm/trunk/engines/gob/parse.cpp	2006-05-01 15:36:54 UTC (rev 22261)
+++ scummvm/trunk/engines/gob/parse.cpp	2006-05-01 16:04:53 UTC (rev 22262)
@@ -160,6 +160,9 @@
 	char saved = 0;
 	static char *savedPos = 0;
 
+	// TODO: There seems to be a problem here, GOB2 runs into an endless loop
+	return;
+
 	if (savedPos == 0) {
 		savedPos = _vm->_global->_inter_execPtr;
 		saved = 1;

Modified: scummvm/trunk/engines/gob/parse_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/parse_v2.cpp	2006-05-01 15:36:54 UTC (rev 22261)
+++ scummvm/trunk/engines/gob/parse_v2.cpp	2006-05-01 16:04:53 UTC (rev 22262)
@@ -365,6 +365,8 @@
 	int16 stkPos;
 	int16 brackStart;
 
+	memset(operStack, 0, 20);
+
 	stkPos = -1;
 	operPtr = (char *)(operStack - 1);
 	valPtr = values - 1;


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