[Scummvm-cvs-logs] CVS: scummvm/gob draw.cpp,1.22,1.23 draw.h,1.11,1.12 gob.cpp,1.36,1.37 inter.h,1.11,1.12 inter_v1.cpp,1.12,1.13 inter_v2.cpp,1.5,1.6 module.mk,1.7,1.8 parse.cpp,1.21,1.22 parse.h,1.7,1.8

Sven Hesse drmccoy at users.sourceforge.net
Thu Feb 2 13:13:15 CET 2006


Update of /cvsroot/scummvm/scummvm/gob
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19733

Modified Files:
	draw.cpp draw.h gob.cpp inter.h inter_v1.cpp inter_v2.cpp 
	module.mk parse.cpp parse.h 
Log Message:
Added/Changed o2_evaluateStore(), o2_palLoad(), o2_setRenderFlags(), o2_loadTot(), parseVarIndex(), parseValExpr() and parseExpr() for Gob2


Index: draw.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gob/draw.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- draw.cpp	29 Jan 2006 02:27:10 -0000	1.22
+++ draw.cpp	2 Feb 2006 21:11:59 -0000	1.23
@@ -693,81 +693,6 @@
 	_cursorY = newY;
 }
 
-void Draw::interPalLoad(void) {
-	int16 i;
-	int16 ind1;
-	int16 ind2;
-	byte cmd;
-	char *palPtr;
-
-	cmd = *_vm->_global->_inter_execPtr++;
-	_applyPal = 0;
-	if (cmd & 0x80)
-		cmd &= 0x7f;
-	else
-		_applyPal = 1;
-
-	if (cmd == 49) {
-		warning("inter_palLoad: cmd == 49 is not supported");
-		//var_B = 1;
-		for (i = 0; i < 18; i++, _vm->_global->_inter_execPtr++) {
-			if (i < 2) {
-				if (_applyPal == 0)
-					continue;
-
-				_unusedPalette1[i] = *_vm->_global->_inter_execPtr;
-				continue;
-			}
-			//if (*inter_execPtr != 0)
-			//      var_B = 0;
-
-			ind1 = *_vm->_global->_inter_execPtr >> 4;
-			ind2 = (*_vm->_global->_inter_execPtr & 0xf);
-
-			_unusedPalette1[i] =
-			    ((_palLoadData1[ind1] + _palLoadData2[ind2]) << 8) +
-			    (_palLoadData2[ind1] + _palLoadData1[ind2]);
-		}
-
-		_vm->_global->_pPaletteDesc->unused1 = _unusedPalette1;
-	}
-
-	switch (cmd) {
-	case 52:
-		for (i = 0; i < 16; i++, _vm->_global->_inter_execPtr += 3) {
-			_vgaSmallPalette[i].red = _vm->_global->_inter_execPtr[0];
-			_vgaSmallPalette[i].green = _vm->_global->_inter_execPtr[1];
-			_vgaSmallPalette[i].blue = _vm->_global->_inter_execPtr[2];
-		}
-		break;
-
-	case 50:
-		for (i = 0; i < 16; i++, _vm->_global->_inter_execPtr++)
-			_unusedPalette2[i] = *_vm->_global->_inter_execPtr;
-		break;
-
-	case 53:
-		palPtr = _vm->_game->loadTotResource(_vm->_inter->load16());
-		memcpy((char *)_vgaPalette, palPtr, 768);
-		break;
-
-	case 54:
-		memset((char *)_vgaPalette, 0, 768);
-		break;
-	}
-	if (!_applyPal) {
-		_vm->_global->_pPaletteDesc->unused2 = _unusedPalette2;
-		_vm->_global->_pPaletteDesc->unused1 = _unusedPalette1;
-
-		if (_vm->_global->_videoMode != 0x13)
-			_vm->_global->_pPaletteDesc->vgaPal = (Video::Color *)_vgaSmallPalette;
-		else
-			_vm->_global->_pPaletteDesc->vgaPal = (Video::Color *)_vgaPalette;
-
-		_vm->_palanim->fade((Video::PalDesc *) _vm->_global->_pPaletteDesc, 0, 0);
-	}
-}
-
 void Draw::printText(void) {
 	int16 savedFlags;
 	int16 ldestSpriteX;

Index: draw.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gob/draw.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- draw.h	29 Jan 2006 02:27:10 -0000	1.11
+++ draw.h	2 Feb 2006 21:12:00 -0000	1.12
@@ -111,7 +111,6 @@
 
 	void spriteOperation(int16 operation);
 	void animateCursor(int16 cursor);
-	void interPalLoad(void);
 	void printText(void);
 
 	Draw(GobEngine *vm);

Index: gob.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gob/gob.cpp,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -d -r1.36 -r1.37
--- gob.cpp	21 Jan 2006 13:01:18 -0000	1.36
+++ gob.cpp	2 Feb 2006 21:12:00 -0000	1.37
@@ -298,14 +298,17 @@
 	_mult = new Mult(this);
 	_pack = new Pack();
 	_palanim = new PalAnim(this);
-	_parse = new Parse(this);
 	_scenery = new Scenery(this);
 	_gtimer = new GTimer();
 	_util = new Util(this);
-	if (_features & Gob::GF_GOB1)
+	if (_features & Gob::GF_GOB1) {
 		_inter = new Inter_v1(this);
-	else if (_features & Gob::GF_GOB2)
+		_parse = new Parse_v1(this);
+	}
+	else if (_features & Gob::GF_GOB2) {
 		_inter = new Inter_v2(this);
+		_parse = new Parse_v2(this);
+	}
 	else
 		error("GobEngine::init(): Unknown version of game engine");
 	if ((_features & Gob::GF_MAC) || (_features & Gob::GF_GOB1))

Index: inter.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gob/inter.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- inter.h	18 Jan 2006 17:39:34 -0000	1.11
+++ inter.h	2 Feb 2006 21:12:00 -0000	1.12
@@ -300,6 +300,11 @@
 
 	void o2_drawStub(void) { warning("Gob2 stub"); }
 	void o2_stub0x80(void);
+	void o2_stub0x23(void);
+	bool o2_evaluateStore(char &cmdCount, int16 &counter, int16 &retFlag);
+	bool o2_palLoad(char &cmdCount, int16 &counter, int16 &retFlag);
+	void o2_setRenderFlags(void);
+	bool o2_loadTot(char &cmdCount, int16 &counter, int16 &retFlag);
 };
 
 }				// End of namespace Gob

Index: inter_v1.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gob/inter_v1.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- inter_v1.cpp	29 Jan 2006 19:41:43 -0000	1.12
+++ inter_v1.cpp	2 Feb 2006 21:12:00 -0000	1.13
@@ -32,6 +32,7 @@
 #include "gob/cdrom.h"
 #include "gob/music.h"
 #include "gob/map.h"
+#include "gob/palanim.h"
 
 namespace Gob {
 
@@ -1722,7 +1723,78 @@
 }
 
 bool Inter_v1::o1_palLoad(char &cmdCount, int16 &counter, int16 &retFlag) {
-	_vm->_draw->interPalLoad();
+	int16 i;
+	int16 ind1;
+	int16 ind2;
+	byte cmd;
+	char *palPtr;
+
+	cmd = *_vm->_global->_inter_execPtr++;
+	_vm->_draw->_applyPal = 0;
+	if (cmd & 0x80)
+		cmd &= 0x7f;
+	else
+		_vm->_draw->_applyPal = 1;
+
+	if (cmd == 49) {
+		warning("o1_palLoad: cmd == 49 is not supported");
+		//var_B = 1;
+		for (i = 0; i < 18; i++, _vm->_global->_inter_execPtr++) {
+			if (i < 2) {
+				if (_vm->_draw->_applyPal == 0)
+					continue;
+
+				_vm->_draw->_unusedPalette1[i] = *_vm->_global->_inter_execPtr;
+				continue;
+			}
+			//if (*inter_execPtr != 0)
+			//      var_B = 0;
+
+			ind1 = *_vm->_global->_inter_execPtr >> 4;
+			ind2 = (*_vm->_global->_inter_execPtr & 0xf);
+
+			_vm->_draw->_unusedPalette1[i] =
+			    ((_vm->_draw->_palLoadData1[ind1] + _vm->_draw->_palLoadData2[ind2]) << 8) +
+			    (_vm->_draw->_palLoadData2[ind1] + _vm->_draw->_palLoadData1[ind2]);
+		}
+
+		_vm->_global->_pPaletteDesc->unused1 = _vm->_draw->_unusedPalette1;
+	}
+
+	switch (cmd) {
+	case 52:
+		for (i = 0; i < 16; i++, _vm->_global->_inter_execPtr += 3) {
+			_vm->_draw->_vgaSmallPalette[i].red = _vm->_global->_inter_execPtr[0];
+			_vm->_draw->_vgaSmallPalette[i].green = _vm->_global->_inter_execPtr[1];
+			_vm->_draw->_vgaSmallPalette[i].blue = _vm->_global->_inter_execPtr[2];
+		}
+		break;
+
+	case 50:
+		for (i = 0; i < 16; i++, _vm->_global->_inter_execPtr++)
+			_vm->_draw->_unusedPalette2[i] = *_vm->_global->_inter_execPtr;
+		break;
+
+	case 53:
+		palPtr = _vm->_game->loadTotResource(_vm->_inter->load16());
+		memcpy((char *)_vm->_draw->_vgaPalette, palPtr, 768);
+		break;
+
+	case 54:
+		memset((char *)_vm->_draw->_vgaPalette, 0, 768);
+		break;
+	}
+	if (!_vm->_draw->_applyPal) {
+		_vm->_global->_pPaletteDesc->unused2 = _vm->_draw->_unusedPalette2;
+		_vm->_global->_pPaletteDesc->unused1 = _vm->_draw->_unusedPalette1;
+
+		if (_vm->_global->_videoMode != 0x13)
+			_vm->_global->_pPaletteDesc->vgaPal = (Video::Color *)_vm->_draw->_vgaSmallPalette;
+		else
+			_vm->_global->_pPaletteDesc->vgaPal = (Video::Color *)_vm->_draw->_vgaPalette;
+
+		_vm->_palanim->fade((Video::PalDesc *) _vm->_global->_pPaletteDesc, 0, 0);
+	}
 	return false;
 }
 

Index: inter_v2.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gob/inter_v2.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- inter_v2.cpp	18 Jan 2006 17:39:34 -0000	1.5
+++ inter_v2.cpp	2 Feb 2006 21:12:00 -0000	1.6
@@ -30,6 +30,7 @@
 #include "gob/mult.h"
 #include "gob/goblin.h"
 #include "gob/cdrom.h"
+#include "gob/palanim.h"
 
 namespace Gob {
 
@@ -128,7 +129,7 @@
 		/* 08 */
 		OPCODE(o1_initCursorAnim),
 		OPCODE(o1_clearCursorAnim),
-		OPCODE(o1_setRenderFlags),
+		OPCODE(o2_setRenderFlags),
 		{NULL, ""},
 		/* 0C */
 		{NULL, ""},
@@ -159,7 +160,7 @@
 		OPCODE(o2_drawStub),
 		OPCODE(o2_drawStub),
 		OPCODE(o2_drawStub),
-		OPCODE(o2_drawStub),
+		OPCODE(o2_stub0x23),
 		/* 24 */
 		OPCODE(o2_drawStub),
 		OPCODE(o2_drawStub),
@@ -450,7 +451,7 @@
 		OPCODE(o1_whileDo),
 		/* 08 */
 		OPCODE(o1_callBool),
-		OPCODE(o1_evaluateStore),
+		OPCODE(o2_evaluateStore),
 		OPCODE(o1_loadSpriteToPos),
 		{NULL, ""},
 		/* 0C */
@@ -461,8 +462,8 @@
 		/* 10 */
 		{NULL, ""},
 		OPCODE(o1_printText),
-		OPCODE(o1_loadTot),
-		OPCODE(o1_palLoad),
+		OPCODE(o2_loadTot),
+		OPCODE(o2_palLoad),
 		/* 14 */
 		OPCODE(o1_keyFunc),
 		OPCODE(o1_capturePush),
@@ -712,4 +713,284 @@
 	warning("STUB: Gob2 drawOperation 0x80 (%d %d)", expr1, expr2);
 }
 
+void Inter_v2::o2_stub0x23(void) {
+	byte result;
+	char str[40];
+	
+	result = evalExpr(NULL);
+	strcpy(str, _vm->_global->_inter_resStr);
+
+	warning("STUB: Gob2 drawOperation 0x23 (%d, \"%s\")", result, str);
+}
+
+bool Inter_v2::o2_evaluateStore(char &cmdCount, int16 &counter, int16 &retFlag) {
+	char *savedPos;
+	int16 varOff;
+	int16 token;
+	int16 result;
+	byte loopCount;
+
+	savedPos = _vm->_global->_inter_execPtr;
+	varOff = _vm->_parse->parseVarIndex();
+
+	if (*_vm->_global->_inter_execPtr == 99) {
+		_vm->_global->_inter_execPtr++;
+		loopCount = *_vm->_global->_inter_execPtr++;
+	}
+	else
+		loopCount = 1;
+
+	for (int i = 0; i < loopCount; i++) {
+		token = evalExpr(&result);
+		switch (savedPos[0]) {
+		case 16:
+		case 18:
+			*(_vm->_global->_inter_variables + varOff + i) = _vm->_global->_inter_resVal;
+			break;
+
+		case 17:
+		case 27:
+			*(uint16*)(_vm->_global->_inter_variables + varOff + i * 2) = _vm->_global->_inter_resVal;
+			break;
+
+		case 23:
+		case 26:
+			WRITE_VAR_OFFSET(varOff + i * 4, _vm->_global->_inter_resVal);
+			break;
+
+		case 24:
+			*(uint16*)(_vm->_global->_inter_variables + varOff + i * 4) = _vm->_global->_inter_resVal;
+			break;
+
+		case 25:
+		case 28:
+			if (token == 20)
+				*(_vm->_global->_inter_variables + varOff) = result;
+			else
+				strcpy(_vm->_global->_inter_variables + varOff, _vm->_global->_inter_resStr);
+			break;
+		}
+	}
+
+	return false;
+}
+
+bool Inter_v2::o2_palLoad(char &cmdCount, int16 &counter, int16 &retFlag) {
+	int16 i;
+	int16 ind1;
+	int16 ind2;
+	byte cmd;
+	char *palPtr;
+
+	cmd = *_vm->_global->_inter_execPtr++;
+
+	switch(cmd & 0x7f) {
+	case 48:
+		if ((_vm->_global->_videoMode < 0x32) || (_vm->_global->_videoMode > 0x63)) {
+			_vm->_global->_inter_execPtr += 48;
+			return false;
+		}
+		break;
+
+	case 49:
+		if ((_vm->_global->_videoMode != 5) && (_vm->_global->_videoMode != 7)) {
+			_vm->_global->_inter_execPtr += 18;
+			return false;
+		}
+		break;
+
+	case 50:
+		if (_vm->_global->_videoMode != 0x0D) { // || (word_2D479 == 256) {
+			_vm->_global->_inter_execPtr += 16;
+			return false;
+		}
+		break;
+
+	case 51:
+		if (_vm->_global->_videoMode < 0x64) {
+			_vm->_global->_inter_execPtr += 2;
+			return false;
+		}
+		break;
+
+	case 52:
+		if (_vm->_global->_videoMode != 0x0D) { // || (word_2D479 == 256) {
+			_vm->_global->_inter_execPtr += 48;
+			return false;
+		}
+		break;
+
+	case 53:
+		if (_vm->_global->_videoMode < 0x13) {
+			_vm->_global->_inter_execPtr += 2;
+			return false;
+		}
+		break;
+
+	case 54:
+		if (_vm->_global->_videoMode < 0x13) {
+			return false;
+		}
+		break;
+
+	case 61:
+		if (_vm->_global->_videoMode < 0x13) {
+			*_vm->_global->_inter_execPtr += 4;
+			return false;
+		}
+		break;
+	}
+
+	if ((cmd & 0x7f) == 0x30) {
+		_vm->_global->_inter_execPtr += 48;
+		return false;
+	}
+
+	_vm->_draw->_applyPal = 0;
+	if (cmd & 0x80)
+		cmd &= 0x7f;
+	else
+		_vm->_draw->_applyPal = 1;
+
+	if (cmd == 49) {
+		int dl;
+		for (i = 2; i < 18; i++) {
+			dl = 1;
+			if(_vm->_global->_inter_execPtr[i] != 0)
+				dl = 0;
+		}
+		if (dl != 0) {
+			warning("GOB2 Stub! sub_27413");
+/*			sub_27413(_draw_frontSurface);
+			byte_2E521 = 0;
+			_vm->_global->_inter_execPtr += 18;
+			break;*/
+		}
+//		byte_2E521 = 1;
+
+		for (i = 0; i < 18; i++, _vm->_global->_inter_execPtr++) {
+			if (i < 2) {
+				if (_vm->_draw->_applyPal == 0)
+					continue;
+
+				_vm->_draw->_unusedPalette1[i] = *_vm->_global->_inter_execPtr;
+				continue;
+			}
+
+			ind1 = *_vm->_global->_inter_execPtr >> 4;
+			ind2 = (*_vm->_global->_inter_execPtr & 0xf);
+
+			_vm->_draw->_unusedPalette1[i] =
+			    ((_vm->_draw->_palLoadData1[ind1] + _vm->_draw->_palLoadData2[ind2]) << 8) +
+			    (_vm->_draw->_palLoadData2[ind1] + _vm->_draw->_palLoadData1[ind2]);
+		}
+
+		_vm->_global->_pPaletteDesc->unused1 = _vm->_draw->_unusedPalette1;
+		_vm->_video->setFullPalette(_vm->_global->_pPaletteDesc);
+		return false;
+	}
+
+	switch (cmd) {
+	case 50:
+		for (i = 0; i < 16; i++, _vm->_global->_inter_execPtr++)
+			_vm->_draw->_unusedPalette2[i] = *_vm->_global->_inter_execPtr;
+		break;
+
+	case 52:
+		for (i = 0; i < 16; i++, _vm->_global->_inter_execPtr += 3) {
+			_vm->_draw->_vgaSmallPalette[i].red = _vm->_global->_inter_execPtr[0];
+			_vm->_draw->_vgaSmallPalette[i].green = _vm->_global->_inter_execPtr[1];
+			_vm->_draw->_vgaSmallPalette[i].blue = _vm->_global->_inter_execPtr[2];
+		}
+		_vm->_global->_inter_execPtr += 48;
+		if (_vm->_global->_videoMode >= 0x13)
+			return false;
+		break;
+
+	case 53:
+		palPtr = _vm->_game->loadTotResource(_vm->_inter->load16());
+		memcpy((char *)_vm->_draw->_vgaPalette, palPtr, 768);
+		break;
+
+	case 54:
+		memset((char *)_vm->_draw->_vgaPalette, 0, 768);
+		break;
+
+	case 61:
+		ind1 = *_vm->_global->_inter_execPtr++;
+		ind2 = (*_vm->_global->_inter_execPtr++ - ind1 + 1) * 3;
+		palPtr = _vm->_game->loadTotResource(_vm->_inter->load16());
+		memcpy((char *)_vm->_draw->_vgaPalette + ind1 * 3, palPtr + ind1 * 3, ind2);
+		if (_vm->_draw->_applyPal) {
+			_vm->_draw->_applyPal = 0;
+			_vm->_video->setFullPalette(_vm->_global->_pPaletteDesc);
+			return false;
+		}
+		break;
+	}
+	
+	if (!_vm->_draw->_applyPal) {
+		_vm->_global->_pPaletteDesc->unused2 = _vm->_draw->_unusedPalette2;
+		_vm->_global->_pPaletteDesc->unused1 = _vm->_draw->_unusedPalette1;
+		if (_vm->_global->_videoMode < 0x13) {
+			_vm->_global->_pPaletteDesc->vgaPal = (Video::Color *)_vm->_draw->_vgaSmallPalette;
+			_vm->_palanim->fade((Video::PalDesc *) _vm->_global->_pPaletteDesc, 0, 0);
+			return false;
+		}
+		if ((_vm->_global->_videoMode < 0x32) || (_vm->_global->_videoMode >= 0x64)) {
+			_vm->_global->_pPaletteDesc->vgaPal = (Video::Color *)_vm->_draw->_vgaPalette;
+			_vm->_palanim->fade((Video::PalDesc *) _vm->_global->_pPaletteDesc, 0, 0);
+			return false;
+		}
+		_vm->_global->_pPaletteDesc->vgaPal = (Video::Color *)_vm->_draw->_vgaSmallPalette;
+		_vm->_palanim->fade((Video::PalDesc *) _vm->_global->_pPaletteDesc, 0, 0);
+	}
+
+	return false;
+}
+
+void Inter_v2::o2_setRenderFlags(void) {
+	int16 expr;
+
+	expr = _vm->_parse->parseValExpr();
+	
+	if (expr & 0x8000) {
+		if (expr & 0x4000)
+			_vm->_draw->_renderFlags = _vm->_parse->parseValExpr();
+		else
+			_vm->_draw->_renderFlags &= expr & 0x3fff;
+	}
+	else
+		_vm->_draw->_renderFlags |= expr & 0x3fff;
+}
+
+bool Inter_v2::o2_loadTot(char &cmdCount, int16 &counter, int16 &retFlag) {
+	char buf[20];
+	int8 size;
+	int16 i;
+
+	if ((*_vm->_global->_inter_execPtr & 0x80) != 0) {
+		_vm->_global->_inter_execPtr++;
+		evalExpr(0);
+		strcpy(buf, _vm->_global->_inter_resStr);
+	} else {
+		size = *_vm->_global->_inter_execPtr++;
+		for (i = 0; i < size; i++)
+			buf[i] = *_vm->_global->_inter_execPtr++;
+
+		buf[size] = 0;
+	}
+
+	if (strcmp(buf, "INSTALL") == 0) {
+		warning("GOB2 Stub! word_2E515 = _inter_variables[0E8h]");
+	}
+
+	strcat(buf, ".tot");
+	if (_terminate != 2)
+		_terminate = true;
+	strcpy(_vm->_game->_totToLoad, buf);
+
+	return false;
+}
+
 } // End of namespace Gob

Index: module.mk
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gob/module.mk,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- module.mk	7 Jan 2006 22:28:54 -0000	1.7
+++ module.mk	2 Feb 2006 21:12:00 -0000	1.8
@@ -20,6 +20,8 @@
 	gob/pack.o \
 	gob/palanim.o \
 	gob/parse.o \
+	gob/parse_v1.o \
+	gob/parse_v2.o \
 	gob/scenery.o \
 	gob/sound.o \
 	gob/timer.o \

Index: parse.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gob/parse.cpp,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- parse.cpp	29 Jan 2006 02:56:23 -0000	1.21
+++ parse.cpp	2 Feb 2006 21:12:00 -0000	1.22
@@ -70,576 +70,6 @@
 	return ptr + (n & 0x0FFFFFFF);
 }
 
-int16 Parse::parseExpr(char stopToken, byte *arg_2) {
-	int32 values[20];
-	byte operStack[20];
-	int32 prevPrevVal;
-	int32 prevVal;
-	int32 curVal;
-	int32 *valPtr;
-	char *operPtr;
-	byte *arrDescPtr;
-	char var_C;
-	byte operation;
-	int16 dimCount;
-	int16 temp;
-	int16 temp2;
-	uint16 offset;
-	int16 dim;
-	char var_1A;
-	int16 stkPos;
-	int16 brackStart;
-
-	stkPos = -1;
-	operPtr = (char *)(operStack - 1);
-	valPtr = values - 1;
-
-	while (1) {
-		stkPos++;
-		operPtr++;
-		valPtr++;
-		operation = *_vm->_global->_inter_execPtr++;
-		if (operation >= 19 && operation <= 29) {
-			switch (operation) {
-			case 19:
-				*operPtr = 20;
-				*valPtr = READ_LE_UINT32(_vm->_global->_inter_execPtr);
-				_vm->_global->_inter_execPtr += 4;
-				break;
-
-			case 20:
-				*operPtr = 20;
-				*valPtr = _vm->_inter->load16();
-				break;
-
-			case 22:
-				*operPtr = 22;
-				*valPtr = encodePtr(_vm->_global->_inter_execPtr, kExecPtr);
-				_vm->_global->_inter_execPtr += strlen(_vm->_global->_inter_execPtr) + 1;
-				break;
-
-			case 23:
-				*operPtr = 20;
-				*valPtr = VAR(_vm->_inter->load16());
-				break;
-
-			case 25:
-				*operPtr = 22;
-				temp = _vm->_inter->load16() * 4;
-				*valPtr = encodePtr(_vm->_global->_inter_variables + temp, kInterVar);
-				if (*_vm->_global->_inter_execPtr == 13) {
-					_vm->_global->_inter_execPtr++;
-					temp += parseValExpr(12);
-					*operPtr = 20;
-					*valPtr = (uint8)*(_vm->_global->_inter_variables + temp);
-				}
-				break;
-
-			case 26:
-			case 28:
-				*operPtr = operation - 6;
-				temp = _vm->_inter->load16();
-				dimCount = *_vm->_global->_inter_execPtr++;
-				arrDescPtr = (byte *)_vm->_global->_inter_execPtr;
-				_vm->_global->_inter_execPtr += dimCount;
-				offset = 0;
-				dim = 0;
-				for (dim = 0; dim < dimCount; dim++) {
-					temp2 = parseValExpr(12);
-					offset = offset * arrDescPtr[dim] + temp2;
-				}
-
-				if (operation == 26) {
-					*valPtr = VAR(temp + offset);
-					break;
-				}
-				*valPtr = encodePtr(_vm->_global->_inter_variables + temp * 4 + offset * _vm->_global->_inter_animDataSize * 4, kInterVar);
-				if (*_vm->_global->_inter_execPtr == 13) {
-					_vm->_global->_inter_execPtr++;
-					temp2 = parseValExpr(12);
-					*operPtr = 20;
-					*valPtr = (uint8)*(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
-				}
-				break;
-
-			case 29:
-				operation = *_vm->_global->_inter_execPtr++;
-				parseExpr(10, 0);
-
-				switch (operation) {
-				case 5:
-					_vm->_global->_inter_resVal = _vm->_global->_inter_resVal * _vm->_global->_inter_resVal;
-					break;
-
-				case 0:
-				case 1:
-				case 6:
-					curVal = 1;
-					prevVal = 1;
-
-					do {
-						prevPrevVal = prevVal;
-						prevVal = curVal;
-						curVal = (curVal + _vm->_global->_inter_resVal / curVal) / 2;
-					} while (curVal != prevVal && curVal != prevPrevVal);
-					_vm->_global->_inter_resVal = curVal;
-					break;
-
-				case 10:
-					_vm->_global->_inter_resVal = _vm->_util->getRandom(_vm->_global->_inter_resVal);
-					break;
-
-				case 7:
-					if (_vm->_global->_inter_resVal < 0)
-						_vm->_global->_inter_resVal = -_vm->_global->_inter_resVal;
-					break;
-				}
-				*operPtr = 20;
-				*valPtr = _vm->_global->_inter_resVal;
-			}
-
-			if (stkPos > 0 && (operPtr[-1] == 1 || operPtr[-1] == 11)) {
-				stkPos--;
-				operPtr--;
-				valPtr--;
-
-				if (*operPtr == 1) {
-					*operPtr = 20;
-					valPtr[0] = -valPtr[1];
-				} else if (*operPtr == 11) {
-					if (operPtr[1] == 23)
-						*operPtr = 24;
-					else
-						*operPtr = 23;
-				}
-			}
-
-			if (stkPos <= 0)
-				continue;
-
-			switch (operPtr[-1]) {
-			case 2:
-				if (operPtr[-2] == 22) {
-					if (decodePtr(valPtr[-2]) != _vm->_global->_inter_resStr) {
-						strcpy(_vm->_global->_inter_resStr, decodePtr(valPtr[-2]));
-						valPtr[-2] = encodePtr(_vm->_global->_inter_resStr, kResStr);
-					}
-					strcat(_vm->_global->_inter_resStr, decodePtr(valPtr[0]));
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-				}
-				break;
-
-			case 5:
-				valPtr[-2] *= valPtr[0];
-				stkPos -= 2;
-				operPtr -= 2;
-				valPtr -= 2;
-				break;
-
-			case 6:
-				valPtr[-2] /= valPtr[0];
-				stkPos -= 2;
-				operPtr -= 2;
-				valPtr -= 2;
-				break;
-
-			case 7:
-				valPtr[-2] %= valPtr[0];
-				stkPos -= 2;
-				operPtr -= 2;
-				valPtr -= 2;
-				break;
-
-			case 8:
-				valPtr[-2] &= valPtr[0];
-				stkPos -= 2;
-				operPtr -= 2;
-				valPtr -= 2;
-				break;
-			}
-			continue;
-		}		// op>= 19 && op <= 29
-
-		if (operation == stopToken || operation == 30 || operation == 31 || operation == 10) {
-			while (stkPos >= 2) {
-				var_1A = 0;
-				if (operPtr[-2] == 9 && (operation == 10 || operation == stopToken)) {
-					operPtr[-2] = operPtr[-1];
-					if (operPtr[-2] == 20 || operPtr[-2] == 22)
-						valPtr[-2] = valPtr[-1];
-
-					stkPos--;
-					operPtr--;
-					valPtr--;
-
-					if (stkPos > 1) {
-						if (operPtr[-2] == 1) {
-							operPtr[-2] = 20;
-							valPtr[-2] = -valPtr[-1];
-							stkPos--;
-							operPtr--;
-							valPtr--;
-						} else if (operPtr[-2] == 11) {
-							if (operPtr[-1] == 23)
-								operPtr[-2] = 24;
-							else
-								operPtr[-2] = 23;
-
-							stkPos--;
-							operPtr--;
-							valPtr--;
-						}
-					}	// stkPos > 1
-
-					if (stkPos > 2) {
-						switch (operPtr[-2]) {
-						case 5:
-							valPtr[-3] *= valPtr[-1];
-							stkPos -= 2;
-							operPtr -= 2;
-							valPtr -= 2;
-							break;
-						case 6:
-							valPtr[-3] /= valPtr[-1];
-							stkPos -= 2;
-							operPtr -= 2;
-							valPtr -= 2;
-							break;
-
-						case 7:
-							valPtr[-3] %= valPtr[-1];
-							stkPos -= 2;
-							operPtr -= 2;
-							valPtr -= 2;
-							break;
-
-						case 8:
-							valPtr[-3] &= valPtr[-1];
-							stkPos -= 2;
-							operPtr -= 2;
-							valPtr -= 2;
-							break;
-						}	// switch
-					}	// stkPos > 2
-
-					if (operation != stopToken)
-						break;
-				}	// if (operPtr[-2] == 9 && ...)
-
-				for (brackStart = stkPos - 2; brackStart > 0 &&
-				    operStack[brackStart] < 30 &&
-				    operStack[brackStart] != 9; brackStart--);
-
-				if (operStack[brackStart] >= 30 || operStack[brackStart] == 9)
-					brackStart++;
-
-				switch (operPtr[-2]) {
-				case 2:
-					if (operStack[brackStart] == 20) {
-						values[brackStart] += valPtr[-1];
-					} else if (operStack[brackStart] == 22) {
-						if (decodePtr(values[brackStart]) != _vm->_global->_inter_resStr) {
-							strcpy(_vm->_global->_inter_resStr, decodePtr(values[brackStart]));
-							values[brackStart] = encodePtr(_vm->_global->_inter_resStr, kResStr);
-						}
-						strcat(_vm->_global->_inter_resStr, decodePtr(valPtr[-1]));
-					}
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					continue;
-
-				case 3:
-					values[brackStart] -= valPtr[-1];
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					continue;
-
-				case 4:
-					values[brackStart] |= valPtr[-1];
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					continue;
-
-				case 5:
-					valPtr[-3] *= valPtr[-1];
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					break;
-
-				case 6:
-					valPtr[-3] /= valPtr[-1];
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					break;
-
-				case 7:
-					valPtr[-3] %= valPtr[-1];
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					break;
-
-				case 8:
-					valPtr[-3] &= valPtr[-1];
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					break;
-
-				case 30:
-					if (operPtr[-3] == 23)
-						operPtr[-3] = operPtr[-1];
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					break;
-
-				case 31:
-					if (operPtr[-3] == 24)
-						operPtr[-3] = operPtr[-1];
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					break;
-
-				case 32:
-					var_C = operPtr[-3];
-					operPtr[-3] = 23;
-					if (var_C == 20) {
-						if (valPtr[-3] < valPtr[-1])
-							operPtr[-3] = 24;
-					} else if (var_C == 22) {
-						if (decodePtr(valPtr[-3]) != _vm->_global->_inter_resStr) {
-							strcpy(_vm->_global->_inter_resStr, decodePtr(valPtr[-3]));
-							valPtr[-3] = encodePtr(_vm->_global->_inter_resStr, kResStr);
-						}
-						if (strcmp(_vm->_global->_inter_resStr, decodePtr(valPtr[-1])) < 0)
-							operPtr[-3] = 24;
-					}
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					break;
-
-				case 33:
-					var_C = operPtr[-3];
-					operPtr[-3] = 23;
-					if (var_C == 20) {
-						if (valPtr[-3] <= valPtr[-1])
-							operPtr[-3] = 24;
-					} else if (var_C == 22) {
-						if (decodePtr(valPtr[-3]) != _vm->_global->_inter_resStr) {
-							strcpy(_vm->_global->_inter_resStr, decodePtr(valPtr[-3]));
-							valPtr[-3] = encodePtr(_vm->_global->_inter_resStr, kResStr);
-						}
-						if (strcmp(_vm->_global->_inter_resStr, decodePtr(valPtr[-1])) <= 0)
-							operPtr[-3] = 24;
-					}
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					break;
-
-				case 34:
-					var_C = operPtr[-3];
-					operPtr[-3] = 23;
-					if (var_C == 20) {
-						if (valPtr[-3] > valPtr[-1])
-							operPtr[-3] = 24;
-					} else if (var_C == 22) {
-						if (decodePtr(valPtr[-3]) != _vm->_global->_inter_resStr) {
-							strcpy(_vm->_global->_inter_resStr, decodePtr(valPtr[-3]));
-							valPtr[-3] = encodePtr(_vm->_global->_inter_resStr, kResStr);
-						}
-						if (strcmp(_vm->_global->_inter_resStr, decodePtr(valPtr[-1])) > 0)
-							operPtr[-3] = 24;
-					}
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					break;
-
-				case 35:
-					var_C = operPtr[-3];
-					operPtr[-3] = 23;
-					if (var_C == 20) {
-						if (valPtr[-3] >= valPtr[-1])
-							operPtr[-3] = 24;
-					} else if (var_C == 22) {
-						if (decodePtr(valPtr[-3]) != _vm->_global->_inter_resStr) {
-							strcpy(_vm->_global->_inter_resStr, decodePtr(valPtr[-3]));
-							valPtr[-3] = encodePtr(_vm->_global->_inter_resStr, kResStr);
-						}
-						if (strcmp(_vm->_global->_inter_resStr, decodePtr(valPtr[-1])) >= 0)
-							operPtr[-3] = 24;
-					}
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					break;
-
-				case 36:
-					var_C = operPtr[-3];
-					operPtr[-3] = 23;
-					if (var_C == 20) {
-						if (valPtr[-3] == valPtr[-1])
-							operPtr[-3] = 24;
-					} else if (var_C == 22) {
-						if (decodePtr(valPtr[-3]) != _vm->_global->_inter_resStr) {
-							strcpy(_vm->_global->_inter_resStr, decodePtr(valPtr[-3]));
-							valPtr[-3] = encodePtr(_vm->_global->_inter_resStr, kResStr);
-						}
-						if (strcmp(_vm->_global->_inter_resStr, decodePtr(valPtr[-1])) == 0)
-							operPtr[-3] = 24;
-					}
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					break;
-
-				case 37:
-					var_C = operPtr[-3];
-					operPtr[-3] = 23;
-					if (var_C == 20) {
-						if (valPtr[-3] != valPtr[-1])
-							operPtr[-3] = 24;
-					} else if (var_C == 22) {
-						if (decodePtr(valPtr[-3]) != _vm->_global->_inter_resStr) {
-							strcpy(_vm->_global->_inter_resStr, decodePtr(valPtr[-3]));
-							valPtr[-3] = encodePtr(_vm->_global->_inter_resStr, kResStr);
-						}
-						if (strcmp(_vm->_global->_inter_resStr, decodePtr(valPtr[-1])) != 0)
-							operPtr[-3] = 24;
-					}
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					break;
-
-				default:
-					var_1A = 1;
-					break;
-				}	// switch
-
-				if (var_1A != 0)
-					break;
-			}	// while (stkPos >= 2)
-
-			if (operation == 30 || operation == 31) {
-				if (operPtr[-1] == 20) {
-					if (valPtr[-1] != 0)
-						operPtr[-1] = 24;
-					else
-						operPtr[-1] = 23;
-				}
-
-				if ((operation == 30 && operPtr[-1] == 24) ||
-				    (operation == 31 && operPtr[-1] == 23)) {
-					if (stkPos > 1 && operPtr[-2] == 9) {
-						skipExpr(10);
-						operPtr[-2] = operPtr[-1];
-						stkPos -= 2;
-						operPtr -= 2;
-						valPtr -= 2;
-					} else {
-						skipExpr(stopToken);
-					}
-					operation = _vm->_global->_inter_execPtr[-1];
-					if (stkPos > 0 && operPtr[-1] == 11) {
-						if (operPtr[0] == 23)
-							operPtr[-1] = 24;
-						else
-							operPtr[-1] = 23;
-
-						stkPos--;
-						operPtr--;
-						valPtr--;
-					}
-				} else
-					operPtr[0] = operation;
-			} else {
-				stkPos--;
-				operPtr--;
-				valPtr--;
-			}
-
-			if (operation != stopToken)
-				continue;
-
-			if (arg_2 != 0)
-				*arg_2 = operStack[0];
-
-			switch (operStack[0]) {
-			case 20:
-				_vm->_global->_inter_resVal = values[0];
-				break;
-
-			case 22:
-				if (decodePtr(values[0]) != _vm->_global->_inter_resStr)
-					strcpy(_vm->_global->_inter_resStr, decodePtr(values[0]));
-				break;
-
-			case 11:
-				if (arg_2 != 0)
-					*arg_2 ^= 1;
-				break;
-
-			case 23:
-			case 24:
-				break;
-
-			default:
-				_vm->_global->_inter_resVal = 0;
-				if (arg_2 != 0)
-					*arg_2 = 20;
-				break;
-			}
-			return 0;
-		}		// operation == stopToken || operation == 30 || operation == 31 || operation == 10
-
-		if (operation < 1 || operation > 11) {
-			if (operation < 32 || operation > 37)
-				continue;
-
-			if (stkPos > 2) {
-				if (operPtr[-2] == 2) {
-					if (operPtr[-3] == 20) {
-						valPtr[-3] += valPtr[-1];
-					} else if (operPtr[-3] == 22) {
-						if (decodePtr(valPtr[-3]) != _vm->_global->_inter_resStr) {
-							strcpy(_vm->_global->_inter_resStr, decodePtr(valPtr[-3]));
-							valPtr[-3] = encodePtr(_vm->_global->_inter_resStr, kResStr);
-						}
-						strcat(_vm->_global->_inter_resStr, decodePtr(valPtr[-1]));
-					}
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-
-				} else if (operPtr[-2] == 3) {
-					valPtr[-3] -= valPtr[-1];
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-				} else if (operPtr[-2] == 4) {
-					valPtr[-3] |= valPtr[-1];
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-				}
-			}
-		}
-		*operPtr = operation;
-	}
-}
-
 void Parse::skipExpr(char stopToken) {
 	int16 dimCount;
 	char operation;
@@ -715,285 +145,6 @@
 	}
 }
 
-int16 Parse::parseValExpr(unsigned stopToken) {
-	int16 values[20];
-	byte operStack[20];
-	int16 *valPtr;
-	byte *operPtr;
-	byte *arrDesc;
-	unsigned operation;
-	int16 temp2;
-	int16 dim;
-	int16 dimCount;
-	int16 temp;
-	int16 offset;
-	int16 stkPos;
-	int16 brackPos;
-	static int16 flag = 0;
-	int16 oldflag;
-
-	oldflag = flag;
-	if (flag == 0) {
-		flag = 1;
-		printExpr(stopToken);
-	}
-
-	stkPos = -1;
-	operPtr = operStack - 1;
-	valPtr = values - 1;
-
-	while (1) {
-		stkPos++;
-		operPtr++;
-		valPtr++;
-
-		operation = *_vm->_global->_inter_execPtr++;
-		if (operation >= 19 && operation <= 29) {
-			*operPtr = 20;
-			switch (operation) {
-			case 19:
-				*valPtr = READ_LE_UINT32(_vm->_global->_inter_execPtr);
-				_vm->_global->_inter_execPtr += 4;
-				break;
-
-			case 20:
-				*valPtr = _vm->_inter->load16();
-				break;
-
-			case 23:
-				*valPtr = (uint16)VAR(_vm->_inter->load16());
-				break;
-
-			case 25:
-				temp = _vm->_inter->load16() * 4;
-				_vm->_global->_inter_execPtr++;
-				temp += parseValExpr(12);
-				*valPtr = (uint8)*(_vm->_global->_inter_variables + temp);
-				break;
-
-			case 26:
-			case 28:
-				temp = _vm->_inter->load16();
-				dimCount = *_vm->_global->_inter_execPtr++;
-				arrDesc = (byte*)_vm->_global->_inter_execPtr;
-				_vm->_global->_inter_execPtr += dimCount;
-				offset = 0;
-				for (dim = 0; dim < dimCount; dim++) {
-					temp2 = parseValExpr(12);
-					offset = arrDesc[dim] * offset + temp2;
-				}
-				if (operation == 26) {
-					*valPtr = (uint16)VAR(temp + offset);
-				} else {
-					_vm->_global->_inter_execPtr++;
-					temp2 = parseValExpr(12);
-					*valPtr = (uint8)*(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
-				}
-				break;
-
-			case 29:
-				operation = *_vm->_global->_inter_execPtr++;
-				parseExpr(10, 0);
-
-				if (operation == 5) {
-					_vm->_global->_inter_resVal = _vm->_global->_inter_resVal * _vm->_global->_inter_resVal;
-				} else if (operation == 7) {
-					if (_vm->_global->_inter_resVal < 0)
-						_vm->_global->_inter_resVal = -_vm->_global->_inter_resVal;
-				} else if (operation == 10) {
-					_vm->_global->_inter_resVal = _vm->_util->getRandom(_vm->_global->_inter_resVal);
-				}
-				*valPtr = _vm->_global->_inter_resVal;
-				break;
-
-			}	// switch
-			if (stkPos > 0 && operPtr[-1] == 1) {
-				stkPos--;
-				operPtr--;
-				valPtr--;
-				operPtr[0] = 20;
-				valPtr[0] = -valPtr[1];
-			}
-
-			if (stkPos > 0 && operPtr[-1] > 4 && operPtr[-1] < 9) {
-				stkPos -= 2;
-				operPtr -= 2;
-				valPtr -= 2;
-
-				switch (operPtr[1]) {
-				case 5:
-					valPtr[0] *= valPtr[2];
-					break;
-
-				case 6:
-					valPtr[0] /= valPtr[2];
-					break;
-
-				case 7:
-					valPtr[0] %= valPtr[2];
-					break;
-
-				case 8:
-					valPtr[0] &= valPtr[2];
-					break;
-				}
-			}	// if (stkPos > 0 && cmdPtr[-1] > 4 && cmdPtr[-1] < 9)
-			continue;
-		}
-
-		if (operation >= 1 && operation <= 9) {
-			*operPtr = operation;
-			continue;
-		}
-
-		while (stkPos >= 2) {
-			if (operPtr[-2] == 9) {
-				stkPos--;
-				operPtr--;
-				valPtr--;
-
-				operPtr[-1] = operPtr[0];
-				valPtr[-1] = valPtr[0];
-				if (stkPos > 1 && operPtr[-2] == 1) {
-					valPtr[-2] = 20;
-					valPtr[-2] = -valPtr[-1];
-
-					stkPos--;
-					operPtr--;
-					valPtr--;
-				}
-
-				if (stkPos > 2 && operPtr[-2] > 4
-				    && operPtr[-2] < 9) {
-					stkPos -= 2;
-					operPtr -= 2;
-					valPtr -= 2;
-					switch (operPtr[0]) {
-					case 5:
-						operPtr[-1] *= operPtr[1];
-						break;
-
-					case 6:
-						operPtr[-1] /= operPtr[1];
-						break;
-
-					case 7:
-						operPtr[-1] %= operPtr[1];
-						break;
-
-					case 8:
-						operPtr[-1] &= operPtr[1];
-						break;
-					}
-				}
-				if (operation == 10)
-					break;
-			}	// operPtr[-2] == 9
-
-			for (brackPos = stkPos - 2; brackPos > 0 &&
-			    operStack[brackPos] < 30
-			    && operStack[brackPos] != 9; brackPos--);
-
-			if (operStack[brackPos] >= 30
-			    || operStack[brackPos] == 9)
-				brackPos++;
-
-			if (operPtr[-2] < 2 || operPtr[-2] > 8)
-				break;
-
-			stkPos -= 2;
-			operPtr -= 2;
-			valPtr -= 2;
-			switch (operPtr[0]) {
-			case 2:
-				values[brackPos] += valPtr[1];
-				continue;
-			case 3:
-				values[brackPos] -= valPtr[1];
-				continue;
-			case 4:
-				values[brackPos] |= valPtr[1];
-				continue;
-			case 5:
-				valPtr[-1] *= valPtr[1];
-				continue;
-			case 6:
-				valPtr[-1] /= valPtr[1];
-				continue;
-			case 7:
-				valPtr[-1] %= valPtr[1];
-				continue;
-			case 8:
-				valPtr[-1] &= valPtr[1];
-				continue;
-			}
-		}
-
-		if (operation != 10) {
-			if (operation != stopToken) {
-				debug(5, "stoptoken error: %d != %d", operation, stopToken);
-			}
-			flag = oldflag;
-			return values[0];
-		}
-
-		stkPos--;
-		operPtr--;
-		valPtr--;
-	}
-}
-
-int16 Parse::parseVarIndex() {
-	int16 temp2;
-	char *arrDesc;
-	int16 dim;
-	int16 dimCount;
-	int16 operation;
-	int16 temp;
-	int16 offset;
-	int16 val;
-
-	operation = *_vm->_global->_inter_execPtr++;
-	debug(5, "var parse = %d", operation);
-	switch (operation) {
-	case 23:
-	case 25:
-		temp = _vm->_inter->load16() * 4;
-		debug(5, "oper = %d", (int16)*_vm->_global->_inter_execPtr);
-		if (operation == 25 && *_vm->_global->_inter_execPtr == 13) {
-			_vm->_global->_inter_execPtr++;
-			val = parseValExpr(12);
-			temp += val;
-			debug(5, "parse subscript = %d", val);
-		}
-		return temp;
-
-	case 26:
-	case 28:
-		temp = _vm->_inter->load16() * 4;
-		dimCount = *_vm->_global->_inter_execPtr++;
-		arrDesc = _vm->_global->_inter_execPtr;
-		_vm->_global->_inter_execPtr += dimCount;
-		offset = 0;
-		for (dim = 0; dim < dimCount; dim++) {
-			temp2 = parseValExpr(12);
-			offset = arrDesc[dim] * offset + temp2;
-		}
-		offset *= 4;
-		if (operation != 28)
-			return temp + offset;
-
-		if (*_vm->_global->_inter_execPtr == 13) {
-			_vm->_global->_inter_execPtr++;
-			temp += parseValExpr(12);
-		}
-		return offset * _vm->_global->_inter_animDataSize + temp;
-
-	default:
-		return 0;
-	}
-}
-
 void Parse::printExpr(char stopToken) {
 	int16 dimCount;
 	char operation;

Index: parse.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gob/parse.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- parse.h	29 Jan 2006 02:20:45 -0000	1.7
+++ parse.h	2 Feb 2006 21:12:00 -0000	1.8
@@ -26,14 +26,15 @@
 
 class Parse {
 public:
-	int16 parseExpr(char stopToken, byte *resultPtr);
 	void skipExpr(char stopToken);
-	int16 parseValExpr(unsigned stopToken=99);
-	int16 parseVarIndex(void);
 	void printExpr(char stopToken);
 	void printVarIndex(void);
+	virtual int16 parseVarIndex(void) = 0;
+	virtual int16 parseValExpr(unsigned stopToken=99) = 0;
+	virtual int16 parseExpr(char stopToken, byte *resultPtr) = 0;
 	
 	Parse(GobEngine *vm);
+	virtual ~Parse() {};
 
 protected:
 	enum PointerType {
@@ -48,6 +49,26 @@
 	char *decodePtr(int32 n);
 };
 
+class Parse_v1 : public Parse {
+public:
+	Parse_v1(GobEngine *vm);
+	virtual ~Parse_v1() {};
+
+	virtual int16 parseVarIndex(void);
+	virtual int16 parseValExpr(unsigned stopToken=99);
+	virtual int16 parseExpr(char stopToken, byte *resultPtr);
+};
+
+class Parse_v2 : public Parse_v1 {
+public:
+	Parse_v2(GobEngine *vm);
+	virtual ~Parse_v2() {};
+
+	virtual int16 parseVarIndex(void);
+	virtual int16 parseValExpr(unsigned stopToken=99);
+	virtual int16 parseExpr(char stopToken, byte *resultPtr);
+};
+
 }				// End of namespace Gob
 
 #endif





More information about the Scummvm-git-logs mailing list