diff options
author | sluicebox | 2019-07-21 15:36:13 -0700 |
---|---|---|
committer | Filippos Karapetis | 2019-07-22 07:57:07 +0300 |
commit | c6929d50cff2718c4ed20f178a6fc8faa1c7ed1d (patch) | |
tree | d66e2086c583c98a1d964e44a7d7c990f7791a3a | |
parent | 02eb33f83f3b6a124152bd318bd603d4f0253065 (diff) | |
download | scummvm-rg350-c6929d50cff2718c4ed20f178a6fc8faa1c7ed1d.tar.gz scummvm-rg350-c6929d50cff2718c4ed20f178a6fc8faa1c7ed1d.tar.bz2 scummvm-rg350-c6929d50cff2718c4ed20f178a6fc8faa1c7ed1d.zip |
SCI: Fix CAMELOT relic merchant lockup
Fixes bug #11025
-rw-r--r-- | engines/sci/engine/script_patches.cpp | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 0b328d5d97..3e09a1f39a 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -523,9 +523,63 @@ static const uint16 camelotPatchPeepingTom[] = { PATCH_END }; -// script, description, signature patch +// If the butcher's daughter in room 62 closes her window while Arthur interacts +// with the relic merchant then the game locks up. The script daughterAppears +// attempts to dispose the script peepingTom, but it does so by clearing ego's +// script no matter what it is, which breaks the game if the script is buyRelic +// or one of the other handsOff merchant scripts. +// +// We fix this by calling peepingTom:dispose instead of clearing ego's script. +// As this is an earlier SCI game prior to Script:dispose clearing the client +// property, we need to do that ourselves in peepingTom:doit when Arthur turns +// away from the window, or else peepingTom:client will still point to ego +// after disposal, and the subsequent peepingTom:dispose will end ego's script. +// +// Applies to: All versions +// Responsible methods: daughterAppears:changeState(6), peepingTom:doit +// Fixes bug: #11025 +static const uint16 camelotSignatureRelicMerchantLockup1[] = { + 0x39, SIG_SELECTOR8(setScript), // pushi setScript + 0x78, // push1 + 0x76, // push0 + 0x81, SIG_MAGICDWORD, 0x00, // lag 00 + 0x4a, 0x06, // send 06 [ ego setScript: 0 ] + 0x3a, // toss + SIG_END +}; + +static const uint16 camelotPatchRelicMerchantLockup1[] = { + 0x39, PATCH_SELECTOR8(dispose), // pushi dispose + 0x76, // push0 + 0x72, PATCH_UINT16(0x01f3), // lofsa peepingTom + 0x4a, 0x04, // send 04 [ peepingTom dispose: ] + PATCH_END +}; + +static const uint16 camelotSignatureRelicMerchantLockup2[] = { + 0x39, SIG_SELECTOR8(setScript), // pushi setScript + 0x78, // push1 + 0x76, // push0 + 0x81, SIG_MAGICDWORD, 0x00, // lag 00 + 0x4a, 0x06, // send 06 [ ego setScript: 0 ] + 0x48, // ret + SIG_END +}; + +static const uint16 camelotPatchRelicMerchantLockup2[] = { + 0x39, PATCH_SELECTOR8(dispose), // pushi dispose + 0x76, // push0 + 0x54, 0x04, // self 04 [ self dispose: ] + 0x76, // push0 + 0x69, 0x08, // sTop client [ client = 0 ] + PATCH_END +}; + +// script, description, signature patch static const SciScriptPatcherEntry camelotSignatures[] = { - { true, 62, "fix peepingTom Sierra bug", 1, camelotSignaturePeepingTom, camelotPatchPeepingTom }, + { true, 62, "fix peepingTom Sierra bug", 1, camelotSignaturePeepingTom, camelotPatchPeepingTom }, + { true, 169, "fix relic merchant lockup (1/2)", 1, camelotSignatureRelicMerchantLockup1, camelotPatchRelicMerchantLockup1 }, + { true, 169, "fix relic merchant lockup (2/2)", 1, camelotSignatureRelicMerchantLockup2, camelotPatchRelicMerchantLockup2 }, SCI_SIGNATUREENTRY_TERMINATOR }; |