From f4d836b8e92655ae00f9b605d2c013887607bda2 Mon Sep 17 00:00:00 2001 From: sluicebox Date: Fri, 10 May 2019 17:43:24 -0700 Subject: SCI: Fix QFG1VGA dagger game lockup and error Fixes a lockup in the PC version and an error in the Mac fix, bug #10958 --- engines/sci/engine/script_patches.cpp | 85 ++++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 2 deletions(-) (limited to 'engines/sci') diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index b6674dee71..36abc0bcb3 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -106,6 +106,7 @@ static const char *const selectorNameTable[] = { "handsOn", // system selector "localize", // Freddy Pharkas "put", // Police Quest 1 VGA + "changeState", // Quest For Glory 1 VGA, QFG4 "hide", // Quest For Glory 1 VGA, QFG4 "say", // Quest For Glory 1 VGA, QFG4 "script", // Quest For Glory 1 VGA @@ -172,7 +173,6 @@ static const char *const selectorNameTable[] = { "advanceCurIcon", // QFG4 "amount", // QFG4 "approachVerbs", // QFG4 - "changeState", // QFG4 "cue", // QFG4 "curIcon", // QFG4 "curInvIcon", // QFG4 @@ -214,6 +214,7 @@ enum ScriptPatcherSelectors { SELECTOR_handsOn, SELECTOR_localize, SELECTOR_put, + SELECTOR_changeState, SELECTOR_hide, SELECTOR_say, SELECTOR_script, @@ -281,7 +282,6 @@ enum ScriptPatcherSelectors { SELECTOR_advanceCurIcon, SELECTOR_amount, SELECTOR_approachVerbs, - SELECTOR_changeState, SELECTOR_cue, SELECTOR_curIcon, SELECTOR_curInvIcon, @@ -8220,6 +8220,85 @@ static const uint16 qfg1vgaPatchMacGiantFight[] = { PATCH_END }; +// Dag-Nab-It, the dagger game in room 340, mistakenly leaves inventory enabled. +// Using a throwable item, such as a dagger, locks up the game. +// +// We fix this by disabling inventory controls on this screen. Sierra attempted +// to do this in the Mac version but introduced a new bug which we also fix. +// +// Applies to: PC Floppy +// Responsible method: dagnabitScript:changeState +// Fixes bug: #10958 +static const uint16 qfg1vgaSignatureDagnabitInventory[] = { + 0x38, SIG_SELECTOR16(disable), // pushi disable + 0x39, 0x03, // pushi 03 + 0x78, // push1 + 0x39, SIG_MAGICDWORD, 0x05, // pushi 05 + 0x39, 0x09, // pushi 09 + 0x81, 0x45, // lag 45 + 0x4a, 0x0a, // send 0a [ mainIconBar disable: 1 5 9 ] + 0x35, 0x01, // ldi 01 + 0xa3, 0x13, // sal 13 + 0x32, SIG_UINT16(0x0278), // jmp 0278 [ end of method ] + SIG_ADDTOOFFSET(+625), + 0x38, SIG_SELECTOR16(changeState), // pushi changeState + 0x78, // push1 + 0x78, // push1 + SIG_END +}; + +static const uint16 qfg1vgaPatchDagnabitInventory[] = { + PATCH_ADDTOOFFSET(+3), + 0x39, 0x05, // pushi 05 + PATCH_ADDTOOFFSET(+5), + 0x39, 0x07, // pushi 07 [ "use" inventory icon ] + 0x39, 0x08, // pushi 08 [ inventory ] + 0x81, 0x45, // lag 45 + 0x4a, 0x0e, // send 0e [ mainIconBar disable: 1 5 9 7 8 ] + 0x78, // push1 + 0xab, 0x13, // ssl 13 + PATCH_ADDTOOFFSET(+629), + 0x76, // push0 [ state 0 re-disables inventory ] + PATCH_END +}; + +// The Mac version of Dag-Nab-It, the dagger game in room 340, introduced a bug +// that sends a message to a non-object when clicking during the start. +// +// The PC version left inventory enabled and Sierra fixed this in Mac. Sierra +// also attempted to clear the inventory cursor, but this was done in a way +// that leaves the icon bar in an illegal state. mainIconBar:curInvIcon is +// set to zero but mainIconBar:curIcon remains set to the "use" icon item. +// Clicking anywhere during the initial two seconds causes IconBar:handleEvent +// to query curInvIcon:message but since curInvIcon is zero this is an error. +// +// We fix this with a deceptively simple patch that prevents the "use" icon from +// ending up as mainIconBar:curIcon. rm340:init runs a complex sequence of icon +// disabling and enabling. Patching a redundant mainIconBar:disable to include +// "use" prevents the subsequent call to handsOff from cycling through enabled +// icons and landing on "use" as the new curIcon, preventing the illegal state. +// +// Applies to: Mac Floppy +// Responsible method: rm340:init +// Fixes bug: #10958 +static const uint16 qfg1vgaSignatureMacDagnabitIconBar[] = { + 0x38, SIG_SELECTOR16(disable), // pushi disable + 0x39, 0x03, // pushi 03 + 0x78, // push1 + SIG_MAGICDWORD, + 0x39, 0x05, // pushi 05 + 0x39, 0x08, // pushi 08 + 0x81, 0x45, // lag 45 + 0x4a, 0x0a, // send 0a [ mainIconBar disable: 1 5 8 ] + SIG_END +}; + +static const uint16 qfg1vgaPatchMacDagnabitIconBar[] = { + PATCH_ADDTOOFFSET(+6), + 0x39, 0x07, // pushi 07 [ "use" inventory icon ] + PATCH_END +}; + // script, description, signature patch static const SciScriptPatcherEntry qfg1vgaSignatures[] = { { true, 0, "inventory weight warning", 1, qfg1vgaSignatureInventoryWeightWarn, qfg1vgaPatchInventoryWeightWarn }, @@ -8240,6 +8319,8 @@ static const SciScriptPatcherEntry qfg1vgaSignatures[] = { { true, 331, "moving to crusher", 1, qfg1vgaSignatureMoveToCrusher, qfg1vgaPatchMoveToCrusher }, { true, 331, "moving to crusher from card game", 1, qfg1vgaSignatureCrusherCardGame, qfg1vgaPatchCrusherCardGame }, { true, 332, "thieves' guild cashier fix", 1, qfg1vgaSignatureThievesGuildCashier, qfg1vgaPatchThievesGuildCashier }, + { true, 340, "dagnabit inventory fix", 1, qfg1vgaSignatureDagnabitInventory, qfg1vgaPatchDagnabitInventory }, + { true, 340, "mac: dagnabit icon bar fix", 1, qfg1vgaSignatureMacDagnabitIconBar, qfg1vgaPatchMacDagnabitIconBar }, { true, 603, "mac: logo mouse-up fix", 1, qfg1vgaSignatureMacLogoIntroSkip, qfg1vgaPatchMacLogoIntroSkip }, { true, 814, "window text temp space", 1, qfg1vgaSignatureTempSpace, qfg1vgaPatchTempSpace }, { true, 814, "dialog header offset", 3, qfg1vgaSignatureDialogHeader, qfg1vgaPatchDialogHeader }, -- cgit v1.2.3