diff options
-rw-r--r-- | scumm/intern.h | 2 | ||||
-rw-r--r-- | scumm/script_v72he.cpp | 70 | ||||
-rw-r--r-- | scumm/script_v7he.cpp | 24 |
3 files changed, 85 insertions, 11 deletions
diff --git a/scumm/intern.h b/scumm/intern.h index 5cb7d9b0c5..8c60c54b6b 100644 --- a/scumm/intern.h +++ b/scumm/intern.h @@ -723,10 +723,12 @@ protected: void o72_getPixel(); void o72_pickVarRandom(); void o72_redimArray(); + void o72_unknownED(); void o72_unknownEF(); void o72_unknownF1(); void o72_readINI(); void o72_unknownF4(); + void o72_unknownF6(); void o72_unknownF8(); void o72_unknownF9(); void o72_unknownFA(); diff --git a/scumm/script_v72he.cpp b/scumm/script_v72he.cpp index f4dcb54d87..10a4e99061 100644 --- a/scumm/script_v72he.cpp +++ b/scumm/script_v72he.cpp @@ -342,7 +342,7 @@ void ScummEngine_v72he::setupOpcodes() { OPCODE(o6_readFilePos), /* EC */ OPCODE(o6_invalid), - OPCODE(o6_invalid), + OPCODE(o72_unknownED), OPCODE(o7_stringLen), OPCODE(o72_unknownEF), /* F0 */ @@ -353,7 +353,7 @@ void ScummEngine_v72he::setupOpcodes() { /* F4 */ OPCODE(o72_unknownF4), OPCODE(o6_invalid), - OPCODE(o6_invalid), + OPCODE(o72_unknownF6), OPCODE(o6_invalid), /* F8 */ OPCODE(o72_unknownF8), @@ -1213,6 +1213,31 @@ void ScummEngine_v72he::redimArray(int arrayId, int newDim2start, int newDim2end } +void ScummEngine_v72he::o72_unknownED() { + int array, pos, len; + int letter = 0, result = 0; + + len = pop(); + pos = pop(); + array = pop(); + + if (len == -1) { + pos = 0; + len = resStrLen(getStringAddress(array)); + } + + writeVar(0, array); + while (len >= pos) { + letter = readArray(0, 0, pos); + if (letter) + result += getCharsetOffset(letter); + pos++; + } + + push(result); + debug(1,"stub o72_unknownED"); +} + void ScummEngine_v72he::o72_unknownEF() { int value; int array, array2, len, len2, len3, offset; @@ -1305,6 +1330,47 @@ void ScummEngine_v72he::o72_unknownF4() { } } +void ScummEngine_v72he::o72_unknownF6() { + int len, len2, pos, value, array; + value = pop(); + len = pop(); + pos = pop(); + array = pop(); + + if (len >= 0) { + len2 = resStrLen(getStringAddress(array)); + if (len2 < len) + len = len2; + } else { + len = 12; + } + + if (pos < 0) + pos = 0; + + writeVar(0, array); + if (pos > len) { + while (pos > len) { + if (readArray(0, 0, pos) == value) { + push(pos); + return; + } + pos--; + } + } else { + while (pos < len) { + if (readArray(0, 0, pos) == value) { + push(pos); + return; + } + pos++; + } + } + + push(-1); + debug(1,"stub o72_unknownF6"); +} + void ScummEngine_v72he::o72_unknownF8() { int a = fetchScriptByte(); push(1); diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp index 9dd9d0e5e3..3b0841b1d4 100644 --- a/scumm/script_v7he.cpp +++ b/scumm/script_v7he.cpp @@ -415,7 +415,7 @@ int ScummEngine_v7he::getCharsetOffset(int letter) { if (!ptr) error("getCharsetOffset: charset %d not found!", id); - offset = READ_LE_UINT32(ptr + 29 + letter); + offset = READ_LE_UINT32(ptr + 29 + letter + 4); if (offset == 0) return 0; @@ -673,6 +673,7 @@ void ScummEngine_v7he::o7_resourceRoutines() { case 122: case 123: case 203: + case 239: debug(5,"stub queueload (%d) resource %d", op, pop()); break; case 159: @@ -924,7 +925,7 @@ void ScummEngine_v7he::o7_unknownF5() { len = resStrLen(getStringAddress(array)); writeVar(0, array); - while (len <= pos) { + while (len < pos) { letter = readArray(0, 0, pos); result += getCharsetOffset(letter); if (result >= ebx) @@ -933,25 +934,30 @@ void ScummEngine_v7he::o7_unknownF5() { } push(result); - debug(1,"stub o7_unknownF5"); + debug(1,"stub o7_unknownF5 (%d)", result); } void ScummEngine_v7he::o7_unknownF6() { - int len, pos, value, array; + int len, len2, pos, value, array; value = pop(); len = pop(); pos = pop(); array = pop(); - if (len < 0) - len = resStrLen(getStringAddress(array)); + if (len >= 0) { + len2 = resStrLen(getStringAddress(array)); + if (len2 < len) + len = len2; + } else { + len = 12; + } if (pos < 0) pos = 0; writeVar(0, array); - if (len < pos) { - while (len < pos) { + if (pos > len) { + while (pos > len) { if (readArray(0, 0, pos) == value) { push(pos); return; @@ -959,7 +965,7 @@ void ScummEngine_v7he::o7_unknownF6() { pos--; } } else { - while (len >= pos) { + while (pos < len) { if (readArray(0, 0, pos) == value) { push(pos); return; |