[Scummvm-git-logs] scummvm master -> eee7882c9ab638a5ce1b7751ab0667486bbaa117
sluicebox
22204938+sluicebox at users.noreply.github.com
Mon Sep 28 12:19:01 UTC 2020
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:
eee7882c9a SCI: Fix LSL3 volume slider
Commit: eee7882c9ab638a5ce1b7751ab0667486bbaa117
https://github.com/scummvm/scummvm/commit/eee7882c9ab638a5ce1b7751ab0667486bbaa117
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2020-09-28T05:14:48-07:00
Commit Message:
SCI: Fix LSL3 volume slider
There was a workaround for this but it didn't fix the script bug.
Instead it set the volume to max every time the volume dialog opened.
Changed paths:
engines/sci/engine/script_patches.cpp
engines/sci/engine/workarounds.cpp
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index 1c7fa4bed6..2cc1627e20 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -7042,6 +7042,46 @@ static const SciScriptPatcherEntry larry2Signatures[] = {
SCI_SIGNATUREENTRY_TERMINATOR
};
+// ===========================================================================
+// Leisure Suit Larry 3
+
+// The LSL3 volume dialog initialize its slider to the current volume by calling
+// kDoSoundMasterVolume, but it passes an uninitialized variable as an extra
+// parameter. This changes the volume instead of just querying it, leaving the
+// slider out of sync with the abruptly changed volume.
+//
+// We remove the uninitialized parameter so that this code correctly queries the
+// volume instead of setting it. This was fixed in later versions but the buggy
+// one was used as the basis for SCI Studio's template script, which is also
+// included with SCI Companion, and so this bug lives on in fan games.
+//
+// Applies to: English PC, English Amiga, English Atari ST
+// Responsible method: TheMenuBar:handleEvent
+static const uint16 larry3SignatureVolumeSlider[] = {
+ SIG_MAGICDWORD,
+ 0x39, SIG_SELECTOR8(doit), // pushi doit
+ 0x78, // push1
+ 0x7a, // push2
+ 0x39, 0x08, // pushi 08 [ volume ]
+ 0x8d, 0x01, // lst 01 [ uninitialized variable ]
+ 0x43, 0x31, 0x04, // callk DoSound 04 [ set volume and return previous ]
+ SIG_END
+};
+
+static const uint16 larry3PatchVolumeSlider[] = {
+ PATCH_ADDTOOFFSET(+3),
+ 0x39, 0x01, // pushi 01
+ 0x38, PATCH_UINT16(0x0008), // pushi 0008 [ volume ]
+ 0x43, 0x31, 0x02, // callk DoSound 02 [ return volume ]
+ PATCH_END
+};
+
+// script, description, signature patch
+static const SciScriptPatcherEntry larry3Signatures[] = {
+ { true, 997, "fix volume slider", 1, larry3SignatureVolumeSlider, larry3PatchVolumeSlider },
+ SCI_SIGNATUREENTRY_TERMINATOR
+};
+
// ===========================================================================
// Leisure Suit Larry 5
// In Miami the player can call the green card telephone number and get
@@ -20327,6 +20367,9 @@ void ScriptPatcher::processScript(uint16 scriptNr, SciSpan<byte> scriptData) {
case GID_LSL2:
signatureTable = larry2Signatures;
break;
+ case GID_LSL3:
+ signatureTable = larry3Signatures;
+ break;
case GID_LSL5:
signatureTable = larry5Signatures;
break;
diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp
index cdf3f0a4a8..7e7a88d755 100644
--- a/engines/sci/engine/workarounds.cpp
+++ b/engines/sci/engine/workarounds.cpp
@@ -463,7 +463,6 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = {
{ GID_LSL1, 720, 720, 0, "rm720", "init", NULL, 0, 0, { WORKAROUND_FAKE, 0 } }, // age check room
{ GID_LSL2, 38, 38, 0, "cloudScript", "changeState", NULL, 1, 1, { WORKAROUND_FAKE, 0 } }, // entering the room in the middle deck of the ship - bug #5034
{ GID_LSL3, 340, 340, 0, "ComicScript", "changeState", NULL, -1, -1, { WORKAROUND_FAKE, 0 } }, // right after entering the 3 ethnic groups inside comedy club (temps 200, 201, 202, 203)
- { GID_LSL3, -1, 997, 0, "TheMenuBar", "handleEvent", NULL, 1, 1, { WORKAROUND_FAKE, 0xf } }, // when setting volume the first time, this temp is used to set volume on entry (normally it would have been initialized to 's')
{ GID_LSL6, 820, 82, 0, "", "export 0", NULL, 0, 326, { WORKAROUND_FAKE, 0 } }, // when touching the electric fence (temp 193 for English release, temp 293 for French/German, temp 313 for Spanish - used for setting the loop of the death animation), it's not setting it for this death - bug #5103
{ GID_LSL6, -1, 85, 0, "washcloth", "doVerb", NULL, 0, 0, { WORKAROUND_FAKE, 0 } }, // washcloth in inventory
{ GID_LSL6, -1, 928, -1, "Narrator", "startText", NULL, 0, 0, { WORKAROUND_FAKE, 0 } }, // used by various objects that are even translated in foreign versions, that's why we use the base-class
More information about the Scummvm-git-logs
mailing list