diff options
author | Sven Hesse | 2008-12-05 03:38:50 +0000 |
---|---|---|
committer | Sven Hesse | 2008-12-05 03:38:50 +0000 |
commit | 275485c9836f6bba8581321df7d30e08c74b3ba5 (patch) | |
tree | f45de1ce5ff7a3887015aa7dd79f4d67e96075cf | |
parent | beb18533c3bf58b60dac41050b63115a86a474ee (diff) | |
download | scummvm-rg350-275485c9836f6bba8581321df7d30e08c74b3ba5.tar.gz scummvm-rg350-275485c9836f6bba8581321df7d30e08c74b3ba5.tar.bz2 scummvm-rg350-275485c9836f6bba8581321df7d30e08c74b3ba5.zip |
Parsing fixes for Urban Runner
svn-id: r35247
-rw-r--r-- | engines/gob/inter_v6.cpp | 70 | ||||
-rw-r--r-- | engines/gob/parse.h | 2 | ||||
-rw-r--r-- | engines/gob/parse_v2.cpp | 87 |
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 |