aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsluicebox2019-08-08 17:57:14 -0700
committerFilippos Karapetis2019-08-09 08:16:11 +0300
commit92d3751972b68a56c3cad215f1e24eb586ccd447 (patch)
treef850610d4a2542db1d52fe929add3d46ac4997b6
parent66f316b567cd1480ba618800fec3e96538a8eb51 (diff)
downloadscummvm-rg350-92d3751972b68a56c3cad215f1e24eb586ccd447.tar.gz
scummvm-rg350-92d3751972b68a56c3cad215f1e24eb586ccd447.tar.bz2
scummvm-rg350-92d3751972b68a56c3cad215f1e24eb586ccd447.zip
SCI: Fix SQ4 Sock's dressing room obstacles
Fixes bug #11055
-rw-r--r--engines/sci/engine/script_patches.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index ad9ffb3bcd..ef7e6df94e 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -14247,6 +14247,40 @@ static const uint16 sq4CdPatchRemovedRoomTimepodCode[] = {
PATCH_END
};
+// Walking into Sock's dressing room (room 371) can cause ego to escape obstacle
+// boundaries and get stuck behind the wall or counter. Similar problems occur
+// in the original. The dressing room has no obstacle bounding the edge of the
+// screen. Instead, rm371:doit detects if ego has hit the edge and moves him
+// back to x coordinate 173 but doesn't change ego:y. If ego hits the edge on a
+// diagonal pathfinding move then this can place ego around the corner of one
+// of the obstacles that bound the top and bottom of the dressing room.
+// rm371:doit will then move ego within the obstacle and out of bounds.
+//
+// We fix this by extending the two obstacles an additional 10 pixels past the
+// edge of the screen so that ego can't get around their corners and get stuck.
+// Sierra reduced one of these coordinates in later floppy versions, and it's
+// not clear why, but this change wasn't included in the CD version.
+//
+// Applies to: All versions
+// Responsible method: rm371:init
+// Fixes bug #11055
+static const uint16 sq4SignatureSocksDressingRoomObstacles[] = {
+ 0x38, SIG_ADDTOOFFSET(+2), // pushi 321d or 319d [ x ]
+ 0x39, 0x46, // pushi 70d [ y ]
+ SIG_ADDTOOFFSET(+125),
+ 0x38, SIG_MAGICDWORD, // pushi 321d [ x ]
+ SIG_UINT16(0x0141),
+ 0x39, 0x49, // pushi 73d [ y ]
+ SIG_END
+};
+
+static const uint16 sq4PatchSocksDressingRoomObstacles[] = {
+ 0x38, PATCH_UINT16(0x014b), // pushi 331d [ x ]
+ PATCH_ADDTOOFFSET(+127),
+ 0x38, PATCH_UINT16(0x014b), // pushi 331d [ x ]
+ PATCH_END
+};
+
// script, description, signature patch
static const SciScriptPatcherEntry sq4Signatures[] = {
{ true, 1, "Floppy: EGA intro delay fix", 2, sq4SignatureEgaIntroDelay, sq4PatchEgaIntroDelay },
@@ -14265,6 +14299,7 @@ static const SciScriptPatcherEntry sq4Signatures[] = {
{ true, 370, "CD: sock's door restore and message fix", 1, sq4CdSignatureSocksDoor, sq4CdPatchSocksDoor },
{ true, 370, "CD/Floppy: sock's sequel police flag fix (1/2)", 1, sq4SignatureSocksSequelPoliceFlag1, sq4PatchSocksSequelPoliceFlag1 },
{ true, 370, "CD/Floppy: sock's sequel police flag fix (2/2)", 1, sq4SignatureSocksSequelPoliceFlag2, sq4PatchSocksSequelPoliceFlag2 },
+ { true, 371, "CD/Floppy: sock's dressing room obstacles fix", 1, sq4SignatureSocksDressingRoomObstacles, sq4PatchSocksDressingRoomObstacles },
{ false, 370, "Amiga: dress purchase flag check fix", 1, sq4AmigaSignatureDressPurchaseFlagCheck, sq4AmigaPatchDressPurchaseFlagCheck },
{ false, 371, "Amiga: dress purchase flag clear fix", 1, sq4AmigaSignatureDressPurchaseFlagClear, sq4AmigaPatchDressPurchaseFlagClear },
{ false, 386, "Amiga: dress purchase flag check fix", 1, sq4AmigaSignatureDressPurchaseFlagCheck, sq4AmigaPatchDressPurchaseFlagCheck },