aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/sci/engine/script_patches.cpp161
1 files changed, 83 insertions, 78 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index e93d31194d..73449229e7 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -10696,15 +10696,16 @@ static const SciScriptPatcherEntry shiversSignatures[] = {
// a dramatic long fade, but does this with an unreasonably large number of
// divisions which takes tens of seconds to finish (because transitions are not
// CPU-dependent in ScummVM).
+// Fixes bug: #9590
static const uint16 sq6SlowTransitionSignature1[] = {
SIG_MAGICDWORD,
- 0x38, SIG_UINT16(0x578), // pushi $578
- 0x51, 0x33, // class Styler
+ 0x38, SIG_UINT16(0x0578), // pushi $578
+ 0x51, 0x33, // class Styler
SIG_END
};
static const uint16 sq6SlowTransitionPatch1[] = {
- 0x38, SIG_UINT16(0x1f4), // pushi 500
+ 0x38, PATCH_UINT16(0x01f4), // pushi 500
PATCH_END
};
@@ -10712,15 +10713,16 @@ static const uint16 sq6SlowTransitionPatch1[] = {
// be a much larger value at startup (200 vs 30) if it thinks it is running in
// Windows. Room 410 (eulogy room) also unconditionally resets divisions to the
// larger value.
+// Fixes bug: #9590
static const uint16 sq6SlowTransitionSignature2[] = {
SIG_MAGICDWORD,
- 0x38, SIG_UINT16(0xc8), // pushi $c8
- 0x51, 0x33, // class Styler
+ 0x38, SIG_UINT16(0x00c8), // pushi $c8
+ 0x51, 0x33, // class Styler
SIG_END
};
static const uint16 sq6SlowTransitionPatch2[] = {
- 0x38, SIG_UINT16(0x1e), // pushi 30
+ 0x38, PATCH_UINT16(0x001e), // pushi 30
PATCH_END
};
@@ -10732,7 +10734,7 @@ static const uint16 sq6BenchmarkSignature[] = {
0x38, SIG_SELECTOR16(init), // pushi init
0x76, // push0
0x7e, SIG_ADDTOOFFSET(+2), // line
- 0x38, SIG_SELECTOR16(posn), // pushi $140 (posn)
+ 0x38, SIG_SELECTOR16(posn), // pushi posn
SIG_END
};
@@ -10760,14 +10762,15 @@ static const SciScriptPatcherEntry sq6Signatures[] = {
// in ScummVM. This patch is basically identical to the patch for LSL7, except
// that they left line numbers in the LSL7 scripts and changed the music volume.
// Applies to at least: English CD
+// Fixes bug: #9700
static const uint16 torinVolumeResetSignature1[] = {
SIG_MAGICDWORD,
0x35, 0x28, // ldi $28
- 0xa1, 0xe3, // sag $e3 (music volume)
+ 0xa1, 0xe3, // sag global[$e3] (music volume)
0x35, 0x3c, // ldi $3c
- 0xa1, 0xe4, // sag $e4 (sfx volume)
+ 0xa1, 0xe4, // sag global[$e4] (sfx volume)
0x35, 0x64, // ldi $64
- 0xa1, 0xe5, // sag $e5 (speech volume)
+ 0xa1, 0xe5, // sag global[$e5] (speech volume)
SIG_END
};
@@ -10781,44 +10784,46 @@ static const uint16 torinVolumeResetPatch1[] = {
// the volume stored in ScummVM. This patch is basically identical to the patch
// for LSL7, except that they left line numbers in the LSL7 scripts.
// Applies to at least: English CD
+// Fixes bug: #9700
static const uint16 torinVolumeResetSignature2[] = {
SIG_MAGICDWORD,
- 0x38, SIG_SELECTOR16(readWord), // pushi $020b (readWord)
- 0x76, // push0
- SIG_ADDTOOFFSET(6), // advance file stream
- 0xa1, 0xe3, // sag $e3 (music volume)
- SIG_ADDTOOFFSET(10), // advance file stream
- 0xa1, 0xe4, // sag $e4 (sfx volume)
- SIG_ADDTOOFFSET(10), // advance file stream
- 0xa1, 0xe5, // sag $e5 (speech volume)
+ 0x38, SIG_SELECTOR16(readWord), // pushi readWord ($020b)
+ 0x76, // push0
+ SIG_ADDTOOFFSET(+6), // ...
+ 0xa1, 0xe3, // sag global[$e3] (music volume)
+ SIG_ADDTOOFFSET(+10), // ...
+ 0xa1, 0xe4, // sag global[$e4] (sfx volume)
+ SIG_ADDTOOFFSET(+10), // ...
+ 0xa1, 0xe5, // sag global[$e5] (speech volume)
SIG_END
};
static const uint16 torinVolumeResetPatch2[] = {
- PATCH_ADDTOOFFSET(10), // advance file stream
- 0x18, 0x18, // waste bytes
- PATCH_ADDTOOFFSET(10), // advance file stream
- 0x18, 0x18, // waste bytes
- PATCH_ADDTOOFFSET(10), // advance file stream
- 0x18, 0x18, // waste bytes
+ PATCH_ADDTOOFFSET(+10),
+ 0x18, 0x18, // (waste bytes)
+ PATCH_ADDTOOFFSET(+10), // ...
+ 0x18, 0x18, // (waste bytes)
+ PATCH_ADDTOOFFSET(+10), // ...
+ 0x18, 0x18, // (waste bytes)
PATCH_END
};
// In Escarpa, it is possible for Boogle to be left outside of Torin's bag
// when fast-forwarding through the exit animation of the seraglio. If this
-// happens, when the player goes from the seraglio to the dragon's cave and then
-// tries to worm Boogle to the left side of the cave, the game will hang because
-// Boogle is on the wrong side of the navigable area barrier and cannot move
-// through it to continue the cutscene. This patch fixes the fast-forward code
-// 'soBoogleBackUp::ff' in the seraglio so that Boogle's in-the-bag flag is set
-// when fast forwarding.
+// happens, when the player goes from the seraglio to the dragon's cave and
+// then tries to worm Boogle to the left side of the cave, the game will hang
+// because Boogle is on the wrong side of the navigable area barrier and cannot
+// move through it to continue the cutscene. This patch fixes the fast-forward
+// code 'soBoogleBackUp::ff' in the seraglio so that Boogle's in-the-bag flag
+// is set when fast-forwarding.
// Applies to at least: English CD, Spanish CD
+// Fixes bug: #9836
static const uint16 torinSeraglioBoogleFlagSignature[] = {
0x35, 0x00, // ldi 0
SIG_MAGICDWORD,
- 0xa3, 0x00, // sal 0
+ 0xa3, 0x00, // sal local[0]
0x38, SIG_SELECTOR16(test), // pushi test
- SIG_ADDTOOFFSET(0x5a), // all the rest of the method
+ SIG_ADDTOOFFSET(+0x5a), // all the rest of the method
// CHECKME: Spanish version seems to have a total of 0x5d bytes from this point to the ret
// FIXME: Check for end of method (e.g. ret) and add different signatures in case localized versions are different
SIG_END
@@ -10826,79 +10831,79 @@ static const uint16 torinSeraglioBoogleFlagSignature[] = {
static const uint16 torinSeraglioBoogleFlagPatch[] = {
// @1e5f
- // ldi 0, sal 0 removed from here (+4 bytes)
+ // ldi 0, sal local[0] removed from here (+4 bytes)
// @1e5f (+4 bytes)
// local[0] = /* oFlags */ ScriptID(64017, 0);
- 0x7a, // push2
- 0x38, PATCH_UINT16(0xfa11), // pushi 64017
- 0x76, // push0
- 0x43, 0x02, PATCH_UINT16(4), // callk ScriptID[2], 4
- 0xa3, 0x00, // sal 0 (-2 bytes)
+ 0x7a, // push2
+ 0x38, PATCH_UINT16(0xfa11), // pushi 64017
+ 0x76, // push0
+ 0x43, 0x02, PATCH_UINT16(0x0004), // callk ScriptID[2], 4
+ 0xa3, 0x00, // sal local[0] (-2 bytes)
// @1e6a (+2 bytes)
// acc = local[0].test(94);
- 0x38, PATCH_SELECTOR16(test), // pushi test
- 0x78, // push1
- 0x39, 0x5e, // pushi 94
- 0x4a, PATCH_UINT16(0x06), // send 6
+ 0x38, PATCH_SELECTOR16(test), // pushi test
+ 0x78, // push1
+ 0x39, 0x5e, // pushi 94
+ 0x4a, PATCH_UINT16(0x0006), // send 6
// @1e73 (+2 bytes)
// if (!acc) goto elseCase;
- 0x30, PATCH_UINT16(0x34), // bnt 0x31 + 3
+ 0x30, PATCH_UINT16(0x0034), // bnt 0x31 + 3
// @1e76 (+2 bytes)
// global[0].get(ScriptID(64001, 0).get(20));
- 0x38, PATCH_SELECTOR16(get), // pushi get
- 0x78, // push1
- 0x38, PATCH_SELECTOR16(get), // pushi get
- 0x78, // push1
- 0x39, 0x14, // pushi 20
- 0x7a, // push2
- 0x38, PATCH_UINT16(0xfa01), // pushi 64001
- 0x76, // push0
- 0x43, 0x02, PATCH_UINT16(4), // callk ScriptID[2], 4
- 0x4a, PATCH_UINT16(0x06), // send 6
- 0x36, // push
- 0x81, 0x00, // lag 0 (ego)
- 0x4a, PATCH_UINT16(0x06), // send 6
+ 0x38, PATCH_SELECTOR16(get), // pushi get
+ 0x78, // push1
+ 0x38, PATCH_SELECTOR16(get), // pushi get
+ 0x78, // push1
+ 0x39, 0x14, // pushi 20
+ 0x7a, // push2
+ 0x38, PATCH_UINT16(0xfa01), // pushi 64001
+ 0x76, // push0
+ 0x43, 0x02, PATCH_UINT16(0x0004), // callk ScriptID[2], 4
+ 0x4a, PATCH_UINT16(0x0006), // send 6
+ 0x36, // push
+ 0x81, 0x00, // lag global[0] (ego)
+ 0x4a, PATCH_UINT16(0x0006), // send 6
// @1e92 (+2 bytes)
// local[0].set(52);
- 0x38, PATCH_SELECTOR16(set), // pushi set
- 0x78, // push1
- 0x39, 0x34, // pushi 52
- 0x83, 0x00, // lal 0 (+7 byte)
- 0x4a, PATCH_UINT16(0x06), // send 6
+ 0x38, PATCH_SELECTOR16(set), // pushi set
+ 0x78, // push1
+ 0x39, 0x34, // pushi 52
+ 0x83, 0x00, // lal local[0] (+7 byte)
+ 0x4a, PATCH_UINT16(0x0006), // send 6
// @1e9d (+9 bytes)
// goto endOfBranch;
- 0x33, 0x0b, // jmp [to end of conditional branch] (+1 byte)
+ 0x33, 0x0b, // jmp [to end of conditional branch] (+1 byte)
// @1e9f (+10 bytes)
// elseCase: local[0].clear(97);
- 0x38, PATCH_SELECTOR16(clear), // pushi clear
- 0x78, // push1
- 0x39, 0x61, // pushi 97
- 0x83, 0x00, // lal 0 (+7 bytes)
- 0x4a, PATCH_UINT16(0x06), // send 6
+ 0x38, PATCH_SELECTOR16(clear), // pushi clear
+ 0x78, // push1
+ 0x39, 0x61, // pushi 97
+ 0x83, 0x00, // lal local[0] (+7 bytes)
+ 0x4a, PATCH_UINT16(0x0006), // send 6
// @1eaa (+17 bytes)
// endOfBranch: local[0].set(232);
- 0x38, PATCH_SELECTOR16(set), // pushi set (-3 bytes)
- 0x78, // push1 (-1 byte)
- 0x38, PATCH_UINT16(0xe8), // pushi 232 (Boogle-in-bag flag) (-3 bytes)
- 0x83, 0x00, // lal 0 (-2 bytes)
- 0x4a, PATCH_UINT16(0x06), // send 6 (-3 bytes)
+ 0x38, PATCH_SELECTOR16(set), // pushi set (-3 bytes)
+ 0x78, // push1 (-1 byte)
+ 0x38, PATCH_UINT16(0x00e8), // pushi 232 (Boogle-in-bag flag) (-3 bytes)
+ 0x83, 0x00, // lal local[0] (-2 bytes)
+ 0x4a, PATCH_UINT16(0x0006), // send 6 (-3 bytes)
// @1eb6 (+5 bytes)
// local[0] = 0; self.dispose();
- 0x38, PATCH_SELECTOR16(dispose), // pushi dispose
- 0x76, // push0
- 0x3c, // dup (-1 byte)
- 0xab, 0x00, // ssl 0 (-2 bytes)
- 0x54, PATCH_UINT16(4), // self 4
- 0x48, // ret
+ 0x38, PATCH_SELECTOR16(dispose), // pushi dispose
+ 0x76, // push0
+ 0x3c, // dup (-1 byte)
+ 0xab, 0x00, // ssl local[0] (-2 bytes)
+ 0x54, PATCH_UINT16(0x0004), // self 4
+ 0x48, // ret
// @1ec1 (+2 bytes)
PATCH_END