aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/script_patches.cpp
diff options
context:
space:
mode:
authorsluicebox2019-07-24 08:20:44 -0700
committerFilippos Karapetis2019-07-24 22:40:39 +0300
commit60044a74651f62e1d8b926f8d67e62930c82b365 (patch)
treec0081ae2962f99e7ec47a3697f9f29d22212d940 /engines/sci/engine/script_patches.cpp
parent0e258cafd4f7482fa45757d239a075cd636cbfb2 (diff)
downloadscummvm-rg350-60044a74651f62e1d8b926f8d67e62930c82b365.tar.gz
scummvm-rg350-60044a74651f62e1d8b926f8d67e62930c82b365.tar.bz2
scummvm-rg350-60044a74651f62e1d8b926f8d67e62930c82b365.zip
SCI: Fix CAMELOT Missing Hunter points
Fixes bug #11027
Diffstat (limited to 'engines/sci/engine/script_patches.cpp')
-rw-r--r--engines/sci/engine/script_patches.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index 401d7e3fe1..501f8c37bd 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -575,6 +575,42 @@ static const uint16 camelotPatchRelicMerchantLockup2[] = {
PATCH_END
};
+// The hunter in room 11 doesn't award soul points if you buy his furs with the
+// "buy furs" command first and "pay" second. Two points are awarded if these
+// commands are entered in the opposite order.
+//
+// We fix this by adding the missing function call to award the soul points as
+// Sierra did in later versions. Fortunately, the GiveMoney script contains
+// redundant code that can be replaced as it is occurs later in the method.
+//
+// Applies to: PC only
+// Responsible method: GiveMoney:changeState(3)
+// Fixes bug: #11027
+static const uint16 camelotSignatureHunterMissingPoints[] = {
+ SIG_MAGICDWORD,
+ 0x30, SIG_UINT16(0x0020), // bnt 0020 [ matches PC only ]
+ 0x35, 0x00, // ldi 00
+ 0xa3, 0x00, // sal 00 [ local0 = 0 ]
+ // unnecessary code which is repeated later in the method
+ 0x89, 0xdd, // lsg dd
+ 0x81, 0x84, // lag 84
+ 0x02, // add
+ 0xa1, 0xdd, // sag dd [ global221 += global132 ]
+ 0x35, 0x00, // ldi 00
+ 0xa1, 0x84, // sag 84 [ global132 = 0 ]
+ SIG_END
+};
+
+static const uint16 camelotPatchHunterMissingPoints[] = {
+ PATCH_ADDTOOFFSET(+7),
+ 0x38, PATCH_UINT16(0x0003), // pushi 0003
+ 0x38, PATCH_UINT16(0x00f5), // pushi 00f5 [ point flag 245 ]
+ 0x7a, // push2 [ soul points ]
+ 0x7a, // push2 [ +2 points ]
+ 0x45, 0x0a, 0x06, // callb proc0_10 06 [ +2 soul points ]
+ 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
@@ -634,6 +670,7 @@ static const uint16 camelotPatchGiveMuleMessage[] = {
// script, description, signature patch
static const SciScriptPatcherEntry camelotSignatures[] = {
+ { true, 11, "fix hunter missing points", 1, camelotSignatureHunterMissingPoints, camelotPatchHunterMissingPoints },
{ 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 },