diff options
author | sluicebox | 2019-06-29 20:25:56 -0700 |
---|---|---|
committer | Filippos Karapetis | 2019-06-30 12:13:16 +0300 |
commit | cf274fa47e225be7df92857f567c849a7aa30a2a (patch) | |
tree | cd3103234c79c77ddb0ed68a99dcd150edcfd177 /engines/sci/engine | |
parent | ea3f8f2e33563987d8190cc66de75b6ac7f476db (diff) | |
download | scummvm-rg350-cf274fa47e225be7df92857f567c849a7aa30a2a.tar.gz scummvm-rg350-cf274fa47e225be7df92857f567c849a7aa30a2a.tar.bz2 scummvm-rg350-cf274fa47e225be7df92857f567c849a7aa30a2a.zip |
SCI: Fix SQ4 English Amiga dress logic, bug #11004
Diffstat (limited to 'engines/sci/engine')
-rw-r--r-- | engines/sci/engine/script_patches.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index fbd353797b..1d0b52cdf6 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -12479,6 +12479,61 @@ static const uint16 sq4CdPatchGetPointsForChangingBackClothes[] = { PATCH_END }; +// The English Amiga version contains curious changes to the dress logic in +// Sock's which break the game and weren't included in later versions: +// +// 1. Purchasing the dress is recorded in flag 90 instead of mall:rFlag3 +// 2. Flag 90 is cleared when changing clothes after clearing out the ATM +// +// Game flags are global while mall flags are reset upon leaving the mall, which +// makes this look like a bug fix, but Sock's is closed when returning so this +// shouldn't change game logic. Unfortunately Sierra forgot to update the other +// scripts which query mall:rFlag3 and so they never see the dress purchase. +// This creates scenarios where exiting Sock's (room 371) after paying causes +// room 370 to kick Roger out for not paying, preventing game completion. +// +// Clearing the dress-purchase flag has no effect other than to allow purchasing +// the dress a second time as if it never happened, leaving the player without +// enough money to complete the game, having paid for the dress twice. +// +// We fix both bugs by updating the mall scripts so that they all test flag 90 +// and never clear it. It's possible the flag change was an optimization, which +// many Amiga tweaks are, since it eliminated a message send in rm371:doit. +// +// Applies to: English Amiga Floppy +// Responsible methods: rm371:doit, rm370:init, warningScript:changeState(1) +// Fixes bug #11004 +static const uint16 sq4AmigaSignatureDressPurchaseFlagClear[] = { + SIG_MAGICDWORD, + 0x78, // push1 + 0x39, 0x5a, // pushi 5a + 0x45, 0x08, 0x02, // callb proc0_8 02 [ clear flag 90 ] + SIG_END +}; + +static const uint16 sq4AmigaPatchDressPurchaseFlagClear[] = { + 0x32, PATCH_UINT16(0x0003), // jmp 0003 [ don't clear flag 90 ] + PATCH_END +}; + +static const uint16 sq4AmigaSignatureDressPurchaseFlagCheck[] = { + SIG_MAGICDWORD, + 0x36, // push [ mall ] + 0x38, SIG_UINT16(0x0228), // pushi rFlag3 + 0x39, 0x04, // pushi 04 + 0x46, SIG_UINT16(0x02bc), // calle proc700_3 06 [ is mall:rFlag3 flag 4 set? ] + SIG_UINT16(0x0003), 0x06, + SIG_END +}; + +static const uint16 sq4AmigaPatchDressPurchaseFlagCheck[] = { + 0x78, // push1 + 0x39, 0x5a, // pushi 5a + 0x45, 0x06, 0x02, // callb proc0_6 02 [ is flag 90 set? ] + 0x32, PATCH_UINT16(0x0003), // jmp 0003 + PATCH_END +}; + // The Big And Tall store (room 381) doesn't display its Look message in the CD // version. We add the missing super:doVerb call to theStore:doVerb. // @@ -13581,6 +13636,9 @@ 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 }, + { 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 }, { true, 381, "CD: big and tall room description", 1, sq4CdSignatureBigAndTallDescription, sq4CdPatchBigAndTallDescription }, { true, 385, "CD: monolith burger door message fix", 1, sq4CdSignatureMonolithBurgerDoor, sq4CdPatchMonolithBurgerDoor }, { true, 390, "CD: hz so good sequel police lockup fix", 1, sq4CdSignatureHzSoGoodSequelPoliceLockup, sq4CdPatchHzSoGoodSequelPoliceLockup }, @@ -15039,6 +15097,19 @@ void ScriptPatcher::processScript(uint16 scriptNr, SciSpan<byte> scriptData) { enablePatch(signatureTable, "Floppy: fix peer bats, upper door (2/2)"); } break; + case GID_SQ4: + // Enable the dress-purchase flag fixes for English Amiga only. + // One of these patches is applied to scripts that are the same as those + // in other versions which must not be patched, including German Amiga. + if (g_sci->getPlatform() == Common::kPlatformAmiga) { + // Check for buggy Sock's (room 371) script from English Amiga version + Resource *socksScript = g_sci->getResMan()->findResource(ResourceId(kResourceTypeScript, 371), false); + if (socksScript && socksScript->size() == 14340) { + enablePatch(signatureTable, "Amiga: dress purchase flag check fix"); + enablePatch(signatureTable, "Amiga: dress purchase flag clear fix"); + } + } + break; default: break; } |