aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsluicebox2018-12-09 04:10:08 -0800
committerFilippos Karapetis2018-12-09 14:10:08 +0200
commitd55e63dbcffda12322e1ac3c10f2bdd790d82e43 (patch)
treeeed6a98d65dffe5769ca90fc57f81c57491796c4
parentd95b8e215b6e8ba864819d35a3624ddedbfb3a54 (diff)
downloadscummvm-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.cpp80
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 },