aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/gob/inter_v6.cpp70
-rw-r--r--engines/gob/parse.h2
-rw-r--r--engines/gob/parse_v2.cpp87
3 files changed, 40 insertions, 119 deletions
diff --git a/engines/gob/inter_v6.cpp b/engines/gob/inter_v6.cpp
index d27bcc64b5..048f3da191 100644
--- a/engines/gob/inter_v6.cpp
+++ b/engines/gob/inter_v6.cpp
@@ -39,76 +39,6 @@ namespace Gob {
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) {
diff --git a/engines/gob/parse.h b/engines/gob/parse.h
index 15ec78b57f..e181b6441e 100644
--- a/engines/gob/parse.h
+++ b/engines/gob/parse.h
@@ -70,6 +70,8 @@ public:
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);
diff --git a/engines/gob/parse_v2.cpp b/engines/gob/parse_v2.cpp
index 347a253204..fd2726d049 100644
--- a/engines/gob/parse_v2.cpp
+++ b/engines/gob/parse_v2.cpp
@@ -59,8 +59,14 @@ int16 Parse_v2::parseVarIndex(uint16 *arg_0, uint16 *arg_4) {
*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,28 +87,20 @@ int16 Parse_v2::parseVarIndex(uint16 *arg_0, uint16 *arg_4) {
for (int i = 0; i < var_A; i++) {
temp2 = parseValExpr(12);
- //uint16 ax = sub_12063(temp2, var_12[i], varPos, 0);
-
- uint16 ax;
-
- if (temp2 < 0) {
- ax = 0;
- } else if (var_12[i] > temp2) {
- ax = temp2;
- } else {
- ax = var_12[i] - 1;
- }
+ int16 ax = sub_12063(temp2, var_12[i], varPos, 0, 0);
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 @@ int16 Parse_v2::parseValExpr(byte stopToken) {
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 @@ int16 Parse_v2::parseValExpr(byte stopToken) {
for (int i = 0; i < var_A; i++) {
temp2 = parseValExpr(12);
- //uint16 ax = sub_12063(temp2, var_12[i], varPos, 0);
-
- uint16 ax;
-
- if (temp2 < 0) {
- ax = 0;
- } else if (var_12[i] > temp2) {
- ax = temp2;
- } else {
- ax = var_12[i] - 1;
- }
+ int16 ax = sub_12063(temp2, var_12[i], varPos, 0, 0);
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 @@ int16 Parse_v2::parseValExpr(byte stopToken) {
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 @@ int16 Parse_v2::parseValExpr(byte stopToken) {
break;
}
} // if ((stkPos > 0) && (cmdPtr[-1] > 4) && (cmdPtr[-1] < 9))
+ varPos = 0;
continue;
}
@@ -524,17 +510,7 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
for (int i = 0; i < var_A; i++) {
temp2 = parseValExpr(12);
- //uint16 ax = sub_12063(temp2, var_12[i], varPos, 0);
-
- uint16 ax;
-
- if (temp2 < 0) {
- ax = 0;
- } else if (var_12[i] > temp2) {
- ax = temp2;
- } else {
- ax = var_12[i] - 1;
- }
+ int16 ax = sub_12063(temp2, var_12[i], varPos, 0, 0);
var_6 = var_6 * var_12[i] + ax;
}
@@ -545,7 +521,7 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
_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 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
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 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
*operPtr = (operPtr[1] == 23) ? 24 : 23;
}
- if (stkPos <= 0)
+ if (stkPos <= 0) {
+ varPos = 0;
continue;
+ }
switch (operPtr[-1]) {
case 2:
@@ -742,6 +720,7 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
valPtr -= 2;
break;
}
+ varPos = 0;
continue;
} // (op >= 16) && (op <= 29)
@@ -1124,4 +1103,14 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
}
}
+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