SCI: Fix SQ4 sewer tunnel lockup, bug #10970
This commit is contained in:
parent
c6621773ef
commit
75a8bfce25
1 changed files with 56 additions and 0 deletions
|
@ -12542,6 +12542,60 @@ static const uint16 sq4CdPatchVohaulPocketPalTextSpeech[] = {
|
||||||
PATCH_END
|
PATCH_END
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Walking around the sewer tunnels in the following sequence locks up the game:
|
||||||
|
//
|
||||||
|
// 1. Enter the ladder room (90) from the center room (95) while the slime is
|
||||||
|
// just below the middle of the screen
|
||||||
|
// 2. Enter the southwest room (105) from the ladder room (90)
|
||||||
|
//
|
||||||
|
// The script enterNorth has a code path which fails to advance the state and so
|
||||||
|
// it gets stuck in handsOff mode. If sewer:status is 3, meaning the slime is
|
||||||
|
// moving north or south, then enterNorth assumes that sewer:location, the room
|
||||||
|
// the slime is in, must be room 105 or 90, but in the sequence above it is 95.
|
||||||
|
//
|
||||||
|
// We fix this by setting enterNorth:state to 1 in the problematic code path so
|
||||||
|
// that the script advances. Sierra fixed this bug after the English PC floppy
|
||||||
|
// versions but forgot to include the fix in the CD version over a year later.
|
||||||
|
//
|
||||||
|
// Applies to: English PC Floppy, English PC CD
|
||||||
|
// Responsible method: enterNorth:changeState(0)
|
||||||
|
// Fixes bug #10970
|
||||||
|
static const uint16 sq4FloppySignatureSewerLockup[] = {
|
||||||
|
SIG_MAGICDWORD,
|
||||||
|
0x35, 0x01, // ldi 01
|
||||||
|
0x65, 0x0a, // aTop state [ state = 1 ]
|
||||||
|
0x32, SIG_UINT16(0x002e), // jmp 002e [ end of switch ]
|
||||||
|
0x3c, // dup
|
||||||
|
0x35, 0x5a, // ldi 5a [ ladder room ]
|
||||||
|
0x1a, // eq?
|
||||||
|
0x30, SIG_UINT16(0x0027), // bnt 0027 [ end of switch without setting state ]
|
||||||
|
SIG_END
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint16 sq4FloppyPatchSewerLockup[] = {
|
||||||
|
PATCH_ADDTOOFFSET(+11),
|
||||||
|
0x30, PATCH_UINT16(0xfff2), // bnt fff2 [ set state before end of switch ]
|
||||||
|
PATCH_END
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint16 sq4CDSignatureSewerLockup[] = {
|
||||||
|
SIG_MAGICDWORD,
|
||||||
|
0x35, 0x01, // ldi 01
|
||||||
|
0x65, 0x14, // aTop state [ state = 1 ]
|
||||||
|
0x33, 0x2c, // jmp 2c [ end of switch ]
|
||||||
|
0x3c, // dup
|
||||||
|
0x35, 0x5a, // ldi 5a [ ladder room ]
|
||||||
|
0x1a, // eq?
|
||||||
|
0x31, 0x26, // bnt 26 [ end of switch without setting state ]
|
||||||
|
SIG_END
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint16 sq4CDPatchSewerLockup[] = {
|
||||||
|
PATCH_ADDTOOFFSET(+10),
|
||||||
|
0x31, 0xf4, // bnt f4 [ set state before end of switch ]
|
||||||
|
PATCH_END
|
||||||
|
};
|
||||||
|
|
||||||
// script, description, signature patch
|
// script, description, signature patch
|
||||||
static const SciScriptPatcherEntry sq4Signatures[] = {
|
static const SciScriptPatcherEntry sq4Signatures[] = {
|
||||||
{ true, 1, "Floppy: EGA intro delay fix", 2, sq4SignatureEgaIntroDelay, sq4PatchEgaIntroDelay },
|
{ true, 1, "Floppy: EGA intro delay fix", 2, sq4SignatureEgaIntroDelay, sq4PatchEgaIntroDelay },
|
||||||
|
@ -12549,6 +12603,8 @@ static const SciScriptPatcherEntry sq4Signatures[] = {
|
||||||
{ true, 700, "Floppy: throw stuff at sequel police bug", 1, sq4FloppySignatureThrowStuffAtSequelPoliceBug, sq4FloppyPatchThrowStuffAtSequelPoliceBug },
|
{ true, 700, "Floppy: throw stuff at sequel police bug", 1, sq4FloppySignatureThrowStuffAtSequelPoliceBug, sq4FloppyPatchThrowStuffAtSequelPoliceBug },
|
||||||
{ true, 35, "CD: sidewalk smell message fix", 1, sq4CdSignatureSidewalkSmellMessage, sq4CdPatchSidewalkSmellMessage },
|
{ true, 35, "CD: sidewalk smell message fix", 1, sq4CdSignatureSidewalkSmellMessage, sq4CdPatchSidewalkSmellMessage },
|
||||||
{ true, 45, "CD: walk in from below for room 45 fix", 1, sq4CdSignatureWalkInFromBelowRoom45, sq4CdPatchWalkInFromBelowRoom45 },
|
{ true, 45, "CD: walk in from below for room 45 fix", 1, sq4CdSignatureWalkInFromBelowRoom45, sq4CdPatchWalkInFromBelowRoom45 },
|
||||||
|
{ true, 105, "Floppy: sewer lockup fix", 1, sq4FloppySignatureSewerLockup, sq4FloppyPatchSewerLockup },
|
||||||
|
{ true, 105, "CD: sewer lockup fix", 1, sq4CDSignatureSewerLockup, sq4CDPatchSewerLockup },
|
||||||
{ true, 290, "CD: cedric easter egg fix", 1, sq4CdSignatureCedricEasterEgg, sq4CdPatchCedricEasterEgg },
|
{ true, 290, "CD: cedric easter egg fix", 1, sq4CdSignatureCedricEasterEgg, sq4CdPatchCedricEasterEgg },
|
||||||
{ true, 290, "CD: cedric lockup fix (1/2)", 1, sq4CdSignatureCedricLockup1, sq4CdPatchCedricLockup1 },
|
{ true, 290, "CD: cedric lockup fix (1/2)", 1, sq4CdSignatureCedricLockup1, sq4CdPatchCedricLockup1 },
|
||||||
{ true, 290, "CD: cedric lockup fix (2/2)", 1, sq4CdSignatureCedricLockup2, sq4CdPatchCedricLockup2 },
|
{ true, 290, "CD: cedric lockup fix (2/2)", 1, sq4CdSignatureCedricLockup2, sq4CdPatchCedricLockup2 },
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue