aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/engine/script_patches.cpp111
1 files changed, 106 insertions, 5 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index 89ed9cbadd..8eddbfc4db 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -3511,6 +3511,104 @@ static const uint16 longbowPatchBerryBushFix[] = {
PATCH_END
};
+// The camp (room 150) has a bug that can prevent the outlaws from ever rescuing
+// the boys at sunset on day 5 or 6. The rescue occurs when entering camp as an
+// abbey monk after leaving town exactly 3 times but this assumes that the
+// counter can't exceed this. Wearing a different disguise can increment the
+// counter beyond 3 at which point sunset can never occur.
+//
+// We fix this by patching the counter tests to greater than or equals. This
+// makes them consistent with the other scripts that test this global variable.
+//
+// Applies to: English PC Floppy, German PC Floppy, English Amiga Floppy
+// Responsible method: local procedure #3 in script 150
+// Fixes bug #10839
+static const uint16 longbowSignatureCampSunsetFix[] = {
+ SIG_MAGICDWORD,
+ 0x89, 0x8e, // lsg 8e [ times left town ]
+ 0x35, 0x03, // ldi 03
+ 0x1a, // eq?
+ SIG_END
+};
+
+static const uint16 longbowPatchCampSunsetFix[] = {
+ PATCH_ADDTOOFFSET(+4),
+ 0x20, // ge?
+ PATCH_END
+};
+
+// The town map (room 260) has a bug that can send Robin to the wrong room.
+// Loading the map from town on day 5 or 6 automatically sends Robin to camp
+// (room 150) after leaving town more than twice. The intent is to start the
+// sunset scene where the outlaws rescue the boys, but the map doesn't test the
+// correct sunset conditions and can load an empty camp, even on the wrong day.
+//
+// We fix this by changing the map's logic to match the camp's by requiring the
+// abbey monk disguise to be worn and the rescue flag to not be set.
+//
+// Applies to: English PC Floppy, German PC Floppy, English Amiga Floppy
+// Responsible method: rm260:init
+// Fixes bug #10839
+static const uint16 longbowSignatureTownMapSunsetFix[] = {
+ SIG_MAGICDWORD,
+ 0x39, 0x05, // pushi 05
+ 0x81, 0x82, // lag 82 [ day ]
+ 0x24, // le?
+ 0x30, SIG_UINT16(0x0089), // bnt 0089 [ no sunset if day < 5 ]
+ 0x60, // pprev
+ 0x35, 0x06, // ldi 06
+ 0x24, // le?
+ 0x30, SIG_UINT16(0x0082), // bnt 0082 [ no sunset if day > 6 ]
+ 0x89, 0x8e, // lsg 8e
+ 0x35, 0x01, // ldi 01
+ SIG_END
+};
+
+static const uint16 longbowPatchTownMapSunsetFix[] = {
+ 0x89, 0x7e, // lsg 7e [ current disguise ]
+ 0x35, 0x05, // ldi 05 [ abbey monk ]
+ 0x1c, // ne?
+ 0x2f, 0x06, // bt 06 [ no sunset if disguise != abbey monk ]
+ 0x78, // push1
+ 0x39, 0x38, // pushi 38
+ 0x45, 0x05, 0x02, // callb proc0_5 [ is rescue flag set? ]
+ 0x2e, PATCH_UINT16(0x0081), // bt 0081 [ no sunset if rescue flag is set ]
+ 0x81, 0x8e, // lag 8e
+ 0x78, // push1 [ save a byte ]
+ PATCH_END
+};
+
+// Ending day 5 or 6 by choosing to attack the castle fails to set the rescue
+// flag which tells the next day what to do. This flag is set when rescuing
+// the boys yourself and when the outlaws rescue them at sunset. Without this
+// flag, the sunset rescue can repeat the next day and break the game.
+//
+// We fix this by setting the flag when returning the boys to their mother in
+// room 250 after the attack.
+//
+// Applies to: English PC Floppy, German PC Floppy, English Amiga Floppy
+// Responsible method: boysSaved:changeState(0)
+// Fixes bug #10839
+static const uint16 longbowSignatureRescueFlagFix[] = {
+ 0x3c, // dup
+ 0x35, 0x00, // ldi 00
+ 0x1a, // eq?
+ 0x30, SIG_MAGICDWORD, // bnt 0003 [ state 1 ]
+ SIG_UINT16(0x0003),
+ 0x32, SIG_UINT16(0x025b), // jmp 025b [ end of method ]
+ SIG_END
+};
+
+static const uint16 longbowPatchRescueFlagFix[] = {
+ 0x2f, 0x08, // bt 08 [ state 1 ]
+ 0x78, // push1
+ 0x39, 0x38, // pushi 38
+ 0x45, 0x06, 0x02, // callb proc0_6 [ set rescue flag ]
+ 0x3a, // toss
+ 0x48, // ret
+ PATCH_END
+};
+
// On day 9, room 350 outside the cobbler's hut is initialized incorrectly if
// disguised as a monk. The entrance to the hut is broken and several minor
// messages are incorrect. This is due to the room's script assuming that the
@@ -3575,12 +3673,15 @@ static const uint16 longbowPatchAmigaPubFix[] = {
PATCH_END
};
-// script, description, signature patch
+// script, description, signature patch
static const SciScriptPatcherEntry longbowSignatures[] = {
- { true, 210, "hand code crash", 5, longbowSignatureShowHandCode, longbowPatchShowHandCode },
- { true, 225, "arithmetic berry bush fix", 1, longbowSignatureBerryBushFix, longbowPatchBerryBushFix },
- { true, 350, "day 9 cobbler hut fix", 10, longbowSignatureCobblerHut, longbowPatchCobblerHut },
- { true, 530, "amiga pub fix", 1, longbowSignatureAmigaPubFix, longbowPatchAmigaPubFix },
+ { true, 150, "day 5/6 camp sunset fix", 2, longbowSignatureCampSunsetFix, longbowPatchCampSunsetFix },
+ { true, 210, "hand code crash", 5, longbowSignatureShowHandCode, longbowPatchShowHandCode },
+ { true, 225, "arithmetic berry bush fix", 1, longbowSignatureBerryBushFix, longbowPatchBerryBushFix },
+ { true, 250, "day 5/6 rescue flag fix", 1, longbowSignatureRescueFlagFix, longbowPatchRescueFlagFix },
+ { true, 260, "day 5/6 town map sunset fix", 1, longbowSignatureTownMapSunsetFix, longbowPatchTownMapSunsetFix },
+ { true, 350, "day 9 cobbler hut fix", 10, longbowSignatureCobblerHut, longbowPatchCobblerHut },
+ { true, 530, "amiga pub fix", 1, longbowSignatureAmigaPubFix, longbowPatchAmigaPubFix },
SCI_SIGNATUREENTRY_TERMINATOR
};