diff options
author | sluicebox | 2018-12-09 04:10:08 -0800 |
---|---|---|
committer | Filippos Karapetis | 2018-12-09 14:10:08 +0200 |
commit | d55e63dbcffda12322e1ac3c10f2bdd790d82e43 (patch) | |
tree | eed6a98d65dffe5769ca90fc57f81c57491796c4 | |
parent | d95b8e215b6e8ba864819d35a3624ddedbfb3a54 (diff) | |
download | scummvm-rg350-d55e63dbcffda12322e1ac3c10f2bdd790d82e43.tar.gz scummvm-rg350-d55e63dbcffda12322e1ac3c10f2bdd790d82e43.tar.bz2 scummvm-rg350-d55e63dbcffda12322e1ac3c10f2bdd790d82e43.zip |
SCI32: Fix GK1 mummy animation, bug #10828 (#1439)
Fixes an animation script bug that occurs in the original
-rw-r--r-- | engines/sci/engine/script_patches.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 8442eeb35e..2a8e6d8c42 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -1353,6 +1353,84 @@ static const uint16 gk1Day9VineSwingPatch[] = { PATCH_END }; +// The mummies on day 9 move without animating if ego exits to the north before +// the first one finishes standing. This also occurs in Sierra's interpreter. +// +// The 12 outer rooms of the African mound all take place in room 710, which +// reinitializes its contents on each room change. Each room's mummy is guard1 +// repositioned with a different view. When the mummies come to life, +// keyWorks:changeState(6) starts guard1's standing animation after which +// state 7 initializes guard1 for chasing ego. Ego however can leave before +// guard1 finishes standing, preventing state 7 from occurring. The script for +// exiting to the north assumes state 7 has run, otherwise guard1 remains on +// the wrong view with no cycler or looper in subsequent rooms. +// +// This bug is due to the script rightWay only partially initializing guard1 for +// chasing as opposed to wrongWay and backTrack which fully initialize. We fix +// this by replacing rightWay's partial initialization with the full version +// from keyWorks state 7. There are two versions of this patch due to +// significant differences between floppy and CD versions of this script. +// +// This patch is not applied to the NRS versions of this script, which address +// this bug by disabling control until guard1 finishes standing, giving the +// player less time to escape. +// +// Applies to: All PC Floppy and CD versions. TODO: Test Mac +// Responsible method: rightWay:changeState(1) +// Fixes bug #10828 +static const uint16 gk1MummyAnimateFloppySignature[] = { + 0x39, SIG_SELECTOR8(view), // pushi view [ full guard1 init ] + SIG_MAGICDWORD, + 0x78, // push1 + 0x38, SIG_UINT16(0x02c5), // pushi 709d + SIG_ADDTOOFFSET(+674), + 0x38, SIG_SELECTOR16(setMotion), // pushi setMotion [ partial guard1 init ] + 0x38, SIG_UINT16(0x0004), // pushi 0004 + 0x51, 0x70, // class PChase + 0x36, // push + 0x89, 0x00, // lsg 00 + 0x39, 0x0f, // pushi 0f + SIG_END +}; + +static const uint16 gk1MummyAnimateFloppyPatch[] = { + PATCH_ADDTOOFFSET(+680), + 0x39, PATCH_SELECTOR8(view), // pushi view [ waste 6 stack items to be compatible with ] + 0x76, // push0 [ the send instruction in full guard1 init ] + 0x39, PATCH_SELECTOR8(view), // pushi view + 0x76, // push0 + 0x39, PATCH_SELECTOR8(view), // pushi view + 0x39, 00, // pushi 00 + 0x32, PATCH_UINT16(0xfd4b), // jmp -693d [ continue full guard1 init in keyWorks state 7 ] + PATCH_END +}; + +static const uint16 gk1MummyAnimateCDSignature[] = { + 0x39, SIG_SELECTOR8(view), // pushi view [ full guard1 init ] + SIG_MAGICDWORD, + 0x78, // push1 + 0x38, SIG_UINT16(0x02c5), // pushi 709d + SIG_ADDTOOFFSET(+750), + 0x38, SIG_SELECTOR16(setMotion), // pushi setMotion [ partial guard1 init ] + 0x38, SIG_UINT16(0x0004), // pushi 0004 + 0x51, 0x70, // class PChase + 0x36, // push + 0x89, 0x00, // lsg 00 + 0x39, 0x0f, // pushi 0f + SIG_END +}; + +static const uint16 gk1MummyAnimateCDPatch[] = { + PATCH_ADDTOOFFSET(+756), + 0x39, PATCH_SELECTOR8(view), // pushi view [ waste 6 stack items to be compatible with ] + 0x76, // push0 [ the send instruction in full guard1 init ] + 0x39, PATCH_SELECTOR8(view), // pushi view + 0x76, // push0 + 0x39, PATCH_SELECTOR8(view), // pushi view + 0x39, 00, // pushi 00 + 0x32, PATCH_UINT16(0xfcff), // jmp -769d [ continue full guard1 init in keyWorks state 7 ] + PATCH_END +}; // In GK1, the `view` selector is used to store view numbers in some cases and // object references to Views in other cases. `Interrogation::dispose` compares @@ -2110,6 +2188,8 @@ static const SciScriptPatcherEntry gk1Signatures[] = { { true, 420, "fix lorelei chair missing message", 1, gk1OperateLoreleiChairSignature, gk1OperateLoreleiChairPatch }, { true, 420, "fix lorelei money messages", 1, gk1LoreleiMoneySignature, gk1LoreleiMoneyPatch }, { true, 710, "fix day 9 vine swing speech playing", 1, gk1Day9VineSwingSignature, gk1Day9VineSwingPatch }, + { true, 710, "fix day 9 mummy animation (floppy)", 1, gk1MummyAnimateFloppySignature, gk1MummyAnimateFloppyPatch }, + { true, 710, "fix day 9 mummy animation (cd)", 1, gk1MummyAnimateCDSignature, gk1MummyAnimateCDPatch }, { true, 800, "fix day 10 honfour unlock door lockup", 1, gk1HonfourUnlockDoorSignature, gk1HonfourUnlockDoorPatch }, { true, 64908, "disable video benchmarking", 1, sci2BenchmarkSignature, sci2BenchmarkPatch }, { true, 64990, "increase number of save games (1/2)", 1, sci2NumSavesSignature1, sci2NumSavesPatch1 }, |