diff options
Diffstat (limited to 'scumm')
-rw-r--r-- | scumm/intern.h | 2 | ||||
-rw-r--r-- | scumm/script_v6he.cpp | 36 |
2 files changed, 33 insertions, 5 deletions
diff --git a/scumm/intern.h b/scumm/intern.h index 2bddb5ab65..ed4608efdc 100644 --- a/scumm/intern.h +++ b/scumm/intern.h @@ -558,7 +558,7 @@ protected: virtual void decodeParseString(int a, int b); - void unknownEA_func(int a, int b, int c, int d, int e); + void unknownEA_func(int arrayId, int newX, int newY, int d); int readFileToArray(int slot, int32 size); void writeFileFromArray(int slot, int resID); diff --git a/scumm/script_v6he.cpp b/scumm/script_v6he.cpp index 8b4aa66faf..b132c4f9a0 100644 --- a/scumm/script_v6he.cpp +++ b/scumm/script_v6he.cpp @@ -1124,19 +1124,47 @@ void ScummEngine_v6he::o6_unknownEA() { eax = fetchScriptByte(); switch (eax) { case 199: - unknownEA_func(5, esi, edi, fetchScriptWord(), eax); + unknownEA_func(fetchScriptWord(), esi, edi, 5); break; case 202: - unknownEA_func(3, esi, edi, fetchScriptWord(), eax); + unknownEA_func(fetchScriptWord(), esi, edi, 3); break; default: break; } } -void ScummEngine_v6he::unknownEA_func(int a, int b, int c, int d, int e) { +void ScummEngine_v6he::unknownEA_func(int arrayId, int newX, int newY, int d) { // Used in mini game at Cosmic Dust Diner in puttmoon - warning("unknownEA_func(%d, %d, %d, %d, %d) stub", a, b, c, d, e); + int var_2, var_4, ax, cx; + + if (readVar(arrayId) == 0) + error("unknownEA_func: Reference to zeroed array pointer"); + + byte *ptr = getResourceAddress(rtString, readVar(arrayId)); + + if (!ptr) + error("unknownEA_func: Invalid array (%d) reference", readVar(arrayId)); + + if (d == 5) + var_2 = 2; + else + var_2 = 1; + + if (READ_LE_UINT16(ptr) == 5) + var_4 = 2; + else + var_4 = 1; + + cx = var_2 * (newX + 1) * (newY + 1); + ax = var_4 * READ_LE_UINT16(ptr + 2) * READ_LE_UINT16(ptr + 4); + + if (ax == cx) + error("unknownEA_func: array %d redim mismatch", readVar(arrayId)); + + WRITE_LE_UINT16(ptr, d); + WRITE_LE_UINT16(ptr + 2, newX + 1); + WRITE_LE_UINT16(ptr + 4, newY + 1); } void ScummEngine_v6he::o6_unknownEE() { |