diff options
author | Travis Howell | 2004-09-16 12:30:54 +0000 |
---|---|---|
committer | Travis Howell | 2004-09-16 12:30:54 +0000 |
commit | 49cd965411720b3ee20dc628ac864f5ec0e07c5d (patch) | |
tree | 83c167743d8de6930330acb95c4e8a1bb1cd567e | |
parent | 9bc8383ceeec56234a1e2a14af9d8d830d0d132d (diff) | |
download | scummvm-rg350-49cd965411720b3ee20dc628ac864f5ec0e07c5d.tar.gz scummvm-rg350-49cd965411720b3ee20dc628ac864f5ec0e07c5d.tar.bz2 scummvm-rg350-49cd965411720b3ee20dc628ac864f5ec0e07c5d.zip |
Correction to pickVarRandom
Add HE80+ version too.
svn-id: r15138
-rw-r--r-- | scumm/intern.h | 2 | ||||
-rw-r--r-- | scumm/script_v6.cpp | 4 | ||||
-rw-r--r-- | scumm/script_v6he.cpp | 9 | ||||
-rw-r--r-- | scumm/script_v72he.cpp | 8 | ||||
-rw-r--r-- | scumm/script_v80he.cpp | 57 |
5 files changed, 65 insertions, 15 deletions
diff --git a/scumm/intern.h b/scumm/intern.h index ac5a004517..9b2cf0ff3a 100644 --- a/scumm/intern.h +++ b/scumm/intern.h @@ -563,6 +563,7 @@ protected: virtual void executeOpcode(byte i); virtual const char *getOpcodeDesc(byte i); + void localizeArray(int slot, int script); void redimArray(int arrayId, int newX, int newY, int d); int readFileToArray(int slot, int32 size); void writeFileFromArray(int slot, int resID); @@ -801,6 +802,7 @@ protected: void o80_cursorCommand(); void o80_setState(); void o80_drawWizPolygon(); + void o80_pickVarRandom(); }; class ScummEngine_v90he : public ScummEngine_v80he { diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp index 1519a2b71a..f1c3079f15 100644 --- a/scumm/script_v6.cpp +++ b/scumm/script_v6.cpp @@ -3019,7 +3019,7 @@ void ScummEngine_v6::o6_pickVarRandom() { num = readArray(value, 0, 0); byte *ptr = getResourceAddress(rtString, readVar(value)); - if (_version >= 7 || _heversion >= 72) { + if (_version >= 7) { var_A = READ_LE_UINT32(ptr + 4); var_C = READ_LE_UINT32(ptr + 8); } else { @@ -3028,7 +3028,7 @@ void ScummEngine_v6::o6_pickVarRandom() { } if (var_A-1 <= num) { - int16 var_2 = readArray(value, 0, num - 1); + int16 var_2 = readArray(value, 0, var_A - 1); shuffleArray(value, 1, num - 1); if (readArray(value, 0, 1) == var_2) { num = 2; diff --git a/scumm/script_v6he.cpp b/scumm/script_v6he.cpp index db9fa58578..9b7e684084 100644 --- a/scumm/script_v6he.cpp +++ b/scumm/script_v6he.cpp @@ -1153,15 +1153,18 @@ void ScummEngine_v6he::o6_soundOps() { } } -void ScummEngine_v6he::o6_localizeArray() { - int slot = pop(); - +void ScummEngine_v6he::localizeArray(int slot, int script) { if (slot >= _numArray) error("o6_localizeArray(%d): array slot out of range", slot); _arraySlot[slot] = vm.slot[_currentScript].number; } +void ScummEngine_v6he::o6_localizeArray() { + int slot = pop(); + localizeArray(slot, vm.slot[_currentScript].number); +} + void ScummEngine_v6he::o6_seekFilePos() { int mode, offset, slot; mode = pop(); diff --git a/scumm/script_v72he.cpp b/scumm/script_v72he.cpp index 5217b63076..00d20c2ff3 100644 --- a/scumm/script_v72he.cpp +++ b/scumm/script_v72he.cpp @@ -1693,7 +1693,7 @@ void ScummEngine_v72he::o72_getPixel() { void ScummEngine_v72he::o72_pickVarRandom() { int num; int args[100]; - int32 var_A; + int32 dim1end; num = getStackList(args, ARRAYSIZE(args)); int value = fetchScriptWord(); @@ -1716,11 +1716,11 @@ void ScummEngine_v72he::o72_pickVarRandom() { num = readArray(value, 0, 0); ArrayHeader *ah = (ArrayHeader *)getResourceAddress(rtString, readVar(value)); - var_A = FROM_LE_32(ah->dim1end); + dim1end = FROM_LE_32(ah->dim1end); - if (var_A-1 <= num) { + if (dim1end <= num) { int16 var_2 = readArray(value, 0, num - 1); - shuffleArray(value, 1, num - 1); + shuffleArray(value, 1, dim1end); if (readArray(value, 0, 1) == var_2) { num = 2; } else { diff --git a/scumm/script_v80he.cpp b/scumm/script_v80he.cpp index c0ae90e0fc..72c88b55d9 100644 --- a/scumm/script_v80he.cpp +++ b/scumm/script_v80he.cpp @@ -328,7 +328,7 @@ void ScummEngine_v80he::setupOpcodes() { OPCODE(o6_soundOps), OPCODE(o72_getPixel), OPCODE(o6_localizeArray), - OPCODE(o72_pickVarRandom), + OPCODE(o80_pickVarRandom), /* E4 */ OPCODE(o6_setBoxSet), OPCODE(o6_invalid), @@ -424,11 +424,7 @@ void ScummEngine_v80he::o80_unknown49() { void ScummEngine_v80he::o80_unknown4A() { int slot = pop(); - - if (slot >= _numArray) - error("o80_unknown4A(%d): array slot out of range", slot); - - _arraySlot[slot] = 0xFFFFFFFF; + localizeArray(slot, 0xFFFFFFFF); } void ScummEngine_v80he::o80_readConfigFile() { @@ -607,4 +603,53 @@ void ScummEngine_v80he::o80_drawWizPolygon() { } } + + +void ScummEngine_v80he::o80_pickVarRandom() { + int num; + int args[100]; + int32 dim1end; + + num = getStackList(args, ARRAYSIZE(args)); + int value = fetchScriptWord(); + + if (readVar(value) == 0) { + defineArray(value, kDwordArray, 0, 0, 0, num + 1); + if (value & 0x8000) + localizeArray(readVar(value), 0xFFFFFFFF); + else if (value & 0x4000) + localizeArray(readVar(value), vm.slot[_currentScript].number); + + if (num > 0) { + int16 counter = 0; + do { + writeArray(value, 0, counter + 1, args[counter]); + } while (++counter < num); + } + + shuffleArray(value, 1, num-1); + writeArray(value, 0, 0, 2); + push(readArray(value, 0, 1)); + return; + } + + num = readArray(value, 0, 0); + + ArrayHeader *ah = (ArrayHeader *)getResourceAddress(rtString, readVar(value)); + dim1end = FROM_LE_32(ah->dim1end); + + if (dim1end <= num) { + int16 var_2 = readArray(value, 0, num - 1); + shuffleArray(value, 1, dim1end); + if (readArray(value, 0, 1) == var_2 && var_2 >= 3) { + int tmp = readArray(value, 0, 2); + writeArray(value, 0, num, tmp); + writeArray(value, 0, 2, var_2); + } + } + + writeArray(value, 0, 0, num + 1); + push(readArray(value, 0, num)); +} + } // End of namespace Scumm |