[Scummvm-git-logs] scummvm master -> 34210343346356f0c6d3737897b3d8af65d9fd62

sluicebox 22204938+sluicebox at users.noreply.github.com
Thu Nov 7 13:32:52 CET 2019


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
3421034334 SCI: Fix SQ5 WD40 fruit lockup


Commit: 34210343346356f0c6d3737897b3d8af65d9fd62
    https://github.com/scummvm/scummvm/commit/34210343346356f0c6d3737897b3d8af65d9fd62
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2019-11-07T04:30:03-08:00

Commit Message:
SCI: Fix SQ5 WD40 fruit lockup

Fixes bug #5162

Changed paths:
    engines/sci/engine/script_patches.cpp


diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index a3fa389..e42e53e 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -16511,10 +16511,92 @@ static const uint16 sq5PatchCaptainChairFix[] = {
 	PATCH_END
 };
 
+// When using the fruit on WD40 in room 305, she can take off before ego's
+//  animation completes and lock up the game. WD40 remains on the log for five
+//  seconds but ego's animation runs at the game speed setting and the scripts
+//  don't coordinate. At slow speeds, ego's animation can take all five seconds.
+//
+// We fix this by not allowing WD40 to take off while ego has a script running.
+//  To do this we use existing code in sWD40LandOverRog that retries the current
+//  state after 10 ticks. This preserves the scene's timing unless WD40 would
+//  have gotten stuck, in which case she now waits for sFruitUpWD40 to complete.
+//
+// Applies to: All versions
+// Responsible method: sWD40LandOverRog:changeState
+// Fixes bug: #5162
+static const uint16 sq5SignatureWd40FruitFix[] = {
+	0x6d, 0x14,                     // dpToa state [ state-- ]
+	0x35, 0x0a,                     // ldi 0a
+	SIG_MAGICDWORD,
+	0x65, 0x20,                     // aTop ticks [ ticks = 10 ]
+	0x32, SIG_UINT16(0x0106),       // jmp 0106   [ end of method ]
+	SIG_ADDTOOFFSET(+57),
+	0x31, 0x28,                     // bnt 28 [ state 5 ]
+	SIG_ADDTOOFFSET(+7),
+	0x31, 0x18,                     // bnt 18
+	0x78,                           // push1
+	SIG_ADDTOOFFSET(+20),
+	0x32, SIG_UINT16(0x00aa),       // jmp 00aa [ end of method ]
+	0x35, 0x01,                     // ldi 01
+	0x65, 0x1a,                     // aTop cycles
+	0x32, SIG_UINT16(0x00a3),       // jmp 00a3 [ end of method ]
+	0x3c,                           // dup
+	0x35, 0x05,                     // ldi 05
+	0x1a,                           // eq?
+	0x31, 0x11,                     // bnt 11 [ state 6 ]
+	0x39, SIG_SELECTOR8(play),      // pushi play
+	0x78,                           // push1
+	0x39, 0x4b,                     // pushi 4b
+	0x72, SIG_UINT16(0x096e),       // lofsa theMusic3
+	0x4a, 0x06,                     // send 06 [ theMusic3 play: 75 ]
+	0x35, 0x05,                     // ldi 05
+	0x65, 0x1c,                     // aTop seconds [ seconds = 5 ]
+	0x32, SIG_UINT16(0x008c),       // jmp 008c [ end of method ]
+	0x3c,                           // dup
+	0x35, 0x06,                     // ldi 06
+	0x1a,                           // eq?
+	0x30, SIG_UINT16(0x0053),       // bnt 0053 [ state 7 ]
+	SIG_END
+};
+
+static const uint16 sq5PatchWd40FruitFix[] = {
+	PATCH_ADDTOOFFSET(+66),
+	0x31, 0x22,                     // bnt 22 [ state 5 ]
+	PATCH_ADDTOOFFSET(+7),
+	0x78,                           // push1
+	0x31, 0x16,                     // bnt 16
+	PATCH_ADDTOOFFSET(+20),
+	0x3a,                           // toss
+	0x48,                           // ret
+	0x69, 0x1a,                     // sTop cycles [ cycles = 1 ]
+	0x3c,                           // dup
+	0x35, 0x05,                     // ldi 05
+	0x1a,                           // eq?
+	0x31, 0x0d,                     // bnt 0d [ state 6 ]
+	0x39, PATCH_SELECTOR8(play),    // pushi play
+	0x78,                           // push1
+	0x39, 0x4b,                     // pushi 4b
+	0x72, PATCH_UINT16(0x096e),     // lofsa theMusic3
+	0x4a, 0x06,                     // send 06 [ theMusic3 play: 75 ]
+	0x69, 0x1c,                     // sTop seconds [ seconds = 5 ]
+	0x48,                           // ret
+	0x3c,                           // dup
+	0x35, 0x06,                     // ldi 06
+	0x1a,                           // eq?
+	0x31, 0x5e,                     // bnt 5e [ state 7 ]
+	0X38, PATCH_SELECTOR16(script), // pushi script
+	0x76,                           // push0
+	0x81, 0x00,                     // lag 00
+	0x4a, 0x04,                     // send 04 [ ego script? ]
+	0x2e, PATCH_UINT16(0xff76),     // bt ff76 [ state--, ticks = 10 ]
+	PATCH_END
+};
+
 //          script, description,                                      signature                             patch
 static const SciScriptPatcherEntry sq5Signatures[] = {
 	{  true,   200, "captain chair lockup fix",                    1, sq5SignatureCaptainChairFix,          sq5PatchCaptainChairFix },
 	{  true,   226, "toolbox fix",                                 1, sq5SignatureToolboxFix,               sq5PatchToolboxFix },
+	{  true,   305, "wd40 fruit fix",                              1, sq5SignatureWd40FruitFix,             sq5PatchWd40FruitFix },
 	{  true,  1000, "drive bay pathfinding fix",                   1, sq5SignatureDriveBayPathfindingFix,   sq5PatchDriveBayPathfindingFix },
 	SCI_SIGNATUREENTRY_TERMINATOR
 };





More information about the Scummvm-git-logs mailing list