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

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Fri Dec 5 04:38:50 CET 2008


Revision: 35247
          http://scummvm.svn.sourceforge.net/scummvm/?rev=35247&view=rev
Author:   drmccoy
Date:     2008-12-05 03:38:50 +0000 (Fri, 05 Dec 2008)

Log Message:
-----------
Parsing fixes for Urban Runner

Modified Paths:
--------------
    scummvm/trunk/engines/gob/inter_v6.cpp
    scummvm/trunk/engines/gob/parse.h
    scummvm/trunk/engines/gob/parse_v2.cpp

Modified: scummvm/trunk/engines/gob/inter_v6.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v6.cpp	2008-12-04 21:25:44 UTC (rev 35246)
+++ scummvm/trunk/engines/gob/inter_v6.cpp	2008-12-05 03:38:50 UTC (rev 35247)
@@ -39,76 +39,6 @@
 
 const int Inter_v6::_goblinFuncLookUp[][2] = {
 	{0, 0},
-	{1, 0},
-	{80, 1},
-	{81, 2},
-	{82, 3},
-	{83, 4},
-	{84, 5},
-	{85, 6},
-	{86, 7},
-	{87, 0},
-	{88, 0},
-	{89, 0},
-	{90, 0},
-	{91, 0},
-	{92, 8},
-	{93, 0},
-	{94, 0},
-	{95, 9},
-	{96, 10},
-	{97, 11},
-	{98, 12},
-	{99, 0},
-	{100, 13},
-	{200, 14},
-	{30, 24},
-	{32, 25},
-	{33, 26},
-	{34, 27},
-	{35, 28},
-	{36, 29},
-	{37, 30},
-	{40, 31},
-	{41, 32},
-	{42, 33},
-	{43, 34},
-	{44, 35},
-	{50, 36},
-	{52, 37},
-	{53, 38},
-	{100, 39},
-	{152, 40},
-	{200, 41},
-	{201, 42},
-	{202, 43},
-	{203, 44},
-	{204, 45},
-	{250, 46},
-	{251, 47},
-	{252, 48},
-	{500, 49},
-	{502, 50},
-	{503, 51},
-	{600, 52},
-	{601, 53},
-	{602, 54},
-	{603, 55},
-	{604, 56},
-	{605, 57},
-	{1000, 58},
-	{1001, 59},
-	{1002, 60},
-	{1003, 61},
-	{1004, 62},
-	{1005, 63},
-	{1006, 64},
-	{1008, 65},
-	{1009, 66},
-	{1010, 67},
-	{1011, 68},
-	{1015, 69},
-	{2005, 70}
 };
 
 Inter_v6::Inter_v6(GobEngine *vm) : Inter_v5(vm) {

Modified: scummvm/trunk/engines/gob/parse.h
===================================================================
--- scummvm/trunk/engines/gob/parse.h	2008-12-04 21:25:44 UTC (rev 35246)
+++ scummvm/trunk/engines/gob/parse.h	2008-12-05 03:38:50 UTC (rev 35247)
@@ -70,6 +70,8 @@
 	Parse_v2(GobEngine *vm);
 	virtual ~Parse_v2() {}
 
+	virtual int16 sub_12063(int16 arg_0, byte arg_2, uint32 arg_3, uint16 arg_7, uint16 arg_9);
+
 	virtual int16 parseVarIndex(uint16 *arg_0 = 0, uint16 *arg_4 = 0);
 	virtual int16 parseValExpr(byte stopToken = 99);
 	virtual int16 parseExpr(byte stopToken, byte *resultPtr);

Modified: scummvm/trunk/engines/gob/parse_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/parse_v2.cpp	2008-12-04 21:25:44 UTC (rev 35246)
+++ scummvm/trunk/engines/gob/parse_v2.cpp	2008-12-05 03:38:50 UTC (rev 35247)
@@ -59,8 +59,14 @@
 				*arg_4 = 14;
 
 			_vm->_global->_inter_execPtr += 2;
-			if (*_vm->_global->_inter_execPtr == 97)
-				_vm->_global->_inter_execPtr++;
+
+			debugC(2, kDebugParser, "parseVarIndex: Prefix %d (%d)", varPos, operation);
+
+			if (*_vm->_global->_inter_execPtr != 97)
+				return varPos;
+
+			_vm->_global->_inter_execPtr++;
+
 		} else if (operation == 15) {
 			uint16 n = _vm->_inter->load16();
 			varPos += n * 4;
@@ -81,29 +87,21 @@
 			for (int i = 0; i < var_A; i++) {
 				temp2 = parseValExpr(12);
 
-				//uint16 ax = sub_12063(temp2, var_12[i], varPos, 0);
+				int16 ax = sub_12063(temp2, var_12[i], varPos, 0, 0);
 
-				uint16 ax;
-
-				if (temp2 < 0) {
-					ax = 0;
-				} else if (var_12[i] > temp2) {
-					ax = temp2;
-				} else {
-					ax = var_12[i] - 1;
-				}
-
 				var_6 = var_6 * var_12[i] + ax;
 			}
 
 			varPos += var_6 * var_0C * 4;
 
-			if (*_vm->_global->_inter_execPtr == 97)
-				_vm->_global->_inter_execPtr++;
-		}
+			debugC(2, kDebugParser, "parseVarIndex: Prefix %d (%d)", varPos, operation);
 
-		warning("v5+ Stub: parseVarIndex operation %d, offset %d", operation, varPos);
+			if (*_vm->_global->_inter_execPtr != 97)
+				return varPos;
 
+			_vm->_global->_inter_execPtr++;
+		}
+
 		operation = *_vm->_global->_inter_execPtr++;
 	}
 
@@ -204,9 +202,7 @@
 				uint16 n = _vm->_inter->load16();
 				varPos += n * 4;
 
-				_vm->_global->_inter_execPtr += 2;
-				if (*_vm->_global->_inter_execPtr == 97)
-					_vm->_global->_inter_execPtr++;
+				_vm->_global->_inter_execPtr += 3;
 			} else if (operation == 15) {
 				uint16 n = _vm->_inter->load16();
 				varPos += n * 4;
@@ -222,28 +218,17 @@
 				for (int i = 0; i < var_A; i++) {
 					temp2 = parseValExpr(12);
 
-					//uint16 ax = sub_12063(temp2, var_12[i], varPos, 0);
+					int16 ax = sub_12063(temp2, var_12[i], varPos, 0, 0);
 
-					uint16 ax;
-
-					if (temp2 < 0) {
-						ax = 0;
-					} else if (var_12[i] > temp2) {
-						ax = temp2;
-					} else {
-						ax = var_12[i] - 1;
-					}
-
 					var_6 = var_6 * var_12[i] + ax;
 				}
 
 				varPos += var_6 * var_0C * 4;
 
-				if (*_vm->_global->_inter_execPtr == 97)
-					_vm->_global->_inter_execPtr++;
+				_vm->_global->_inter_execPtr++;
 			}
 
-			warning("v5+ Stub: parseValExpr operation %d, offset %d", operation, varPos);
+			debugC(2, kDebugParser, "parseValExpr: Prefix %d (%d)", varPos, operation);
 
 			operation = *_vm->_global->_inter_execPtr++;
 		}
@@ -304,7 +289,7 @@
 				break;
 
 			case 23:
-				*valPtr = (uint16) VAR(_vm->_inter->load16());
+				*valPtr = (uint16) READ_VARO_UINT32(varPos + _vm->_inter->load16() * 4);
 				break;
 
 			case 24:
@@ -367,6 +352,7 @@
 					break;
 				}
 			}	// if ((stkPos > 0) && (cmdPtr[-1] > 4) && (cmdPtr[-1] < 9))
+			varPos = 0;
 			continue;
 		}
 
@@ -524,18 +510,8 @@
 				for (int i = 0; i < var_A; i++) {
 					temp2 = parseValExpr(12);
 
-					//uint16 ax = sub_12063(temp2, var_12[i], varPos, 0);
+					int16 ax = sub_12063(temp2, var_12[i], varPos, 0, 0);
 
-					uint16 ax;
-
-					if (temp2 < 0) {
-						ax = 0;
-					} else if (var_12[i] > temp2) {
-						ax = temp2;
-					} else {
-						ax = var_12[i] - 1;
-					}
-
 					var_6 = var_6 * var_12[i] + ax;
 				}
 
@@ -545,7 +521,7 @@
 					_vm->_global->_inter_execPtr++;
 			}
 
-			warning("v5+ Stub: parseExpr operation %d, offset %d", operation, varPos);
+			debugC(2, kDebugParser, "parseExpr: Prefix %d (%d)", varPos, operation);
 
 			operation = *_vm->_global->_inter_execPtr++;
 		}
@@ -625,7 +601,7 @@
 
 			case 23:
 				*operPtr = 20;
-				*valPtr = VAR(_vm->_inter->load16());
+				*valPtr = READ_VARO_UINT32(varPos + _vm->_inter->load16() * 4);
 				break;
 
 			case 24:
@@ -697,8 +673,10 @@
 					*operPtr = (operPtr[1] == 23) ? 24 : 23;
 			}
 
-			if (stkPos <= 0)
+			if (stkPos <= 0) {
+				varPos = 0;
 				continue;
+			}
 
 			switch (operPtr[-1]) {
 			case 2:
@@ -742,6 +720,7 @@
 				valPtr -= 2;
 				break;
 			}
+			varPos = 0;
 			continue;
 		} // (op >= 16) && (op <= 29)
 
@@ -1124,4 +1103,14 @@
 	}
 }
 
+int16 Parse_v2::sub_12063(int16 arg_0, byte arg_2, uint32 arg_3, uint16 arg_7, uint16 arg_9) {
+	if (arg_0 < 0)
+		return 0;
+
+	if (arg_2 > arg_0)
+		return arg_0;
+
+	return arg_2 - 1;
+}
+
 } // End of namespace Gob


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