aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/engine/script_patches.cpp58
1 files changed, 58 insertions, 0 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index 3e09a1f39a..401d7e3fe1 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -575,9 +575,67 @@ static const uint16 camelotPatchRelicMerchantLockup2[] = {
PATCH_END
};
+// When giving away the mule in room 56, the merchant's first long message is
+// immediately replaced by the next. mo:handleEvent displays the first and
+// starts the script getMule, which proceeds to display its own messages
+// without waiting.
+//
+// We fix this by adding code to getMule to wait for the merchant's message to
+// complete if you gave away the mule and a message is on screen.
+//
+// Applies to: All versions
+// Responsible method: getMule:changeState(4)
+// Fixes bug: #11026
+static const uint16 camelotSignatureGiveMuleMessage[] = {
+ 0x30, SIG_UINT16(0x0023), // bnt 0023 [ state 4 ]
+ SIG_ADDTOOFFSET(+0x20),
+ SIG_MAGICDWORD,
+ 0x32, SIG_UINT16(0x0239), // jmp 0239 [ end of method ]
+ 0x3c, // dup
+ 0x35, 0x04, // ldi 04
+ 0x1a, // eq?
+ 0x30, SIG_UINT16(0x0016), // bnt 0016 [ state 5 ]
+ 0x83, 0x02, // lal 02 [ gave away mule? ]
+ 0x30, SIG_UINT16(0x000a), // bnt 000a [ skip state 14 if mule was sold ]
+ 0x39, SIG_SELECTOR8(changeState), // pushi changeState
+ 0x78, // push1
+ 0x39, 0x0e, // pushi 0e
+ 0x54, 0x06, // self 06 [ self changeState: 14 ]
+ 0x32, SIG_UINT16(0x0223), // jmp 0223 [ end of method ]
+ 0x35, 0x01, // ldi 01
+ 0x65, 0x10, // aTop cycles [ cycles = 1 ]
+ 0x32, SIG_UINT16(0x021c), // jmp 021c [ end of method ]
+ SIG_END
+};
+
+static const uint16 camelotPatchGiveMuleMessage[] = {
+ 0x30, PATCH_UINT16(0x0020), // bnt 0020 [ state 4 ]
+ PATCH_ADDTOOFFSET(+0x20),
+ 0x3c, // dup
+ 0x35, 0x04, // ldi 04
+ 0x1a, // eq?
+ 0x31, 0x1a, // bnt 1a [ state 5 ]
+ 0x83, 0x02, // lal 02 [ gave away mule? ]
+ 0x31, 0x13, // bnt 13 [ skip state 14 if mule was sold ]
+ 0x35, 0x0d, // ldi 0d
+ 0x65, 0x0a, // aTop state [ state = 13 ]
+ 0x38, PATCH_UINT16(0x0121), // pushi talkCue [ same value in all versions ]
+ 0x78, // push1
+ 0x7c, // pushSelf
+ 0x38, PATCH_UINT16(0x0122), // pushi tS1 [ same value in all versions ]
+ 0x76, // push0
+ 0x81, 0x6f, // lag 6f
+ 0x4a, 0x0a, // send 0a [ tObj talkCue: self tS1? ]
+ 0x2f, 0x03, // bt 03 [ don't set cycles if message on screen ]
+ 0x78, // push1
+ 0x69, 0x10, // sTop cycles [ cycles = 1 ]
+ PATCH_END
+};
+
// script, description, signature patch
static const SciScriptPatcherEntry camelotSignatures[] = {
{ true, 62, "fix peepingTom Sierra bug", 1, camelotSignaturePeepingTom, camelotPatchPeepingTom },
+ { true, 158, "fix give mule message", 1, camelotSignatureGiveMuleMessage, camelotPatchGiveMuleMessage },
{ 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