[Scummvm-git-logs] scummvm master -> ef333e86118de26d862adcfbf68b34bda22115af
sluicebox
22204938+sluicebox at users.noreply.github.com
Thu Jun 17 03:27:41 UTC 2021
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:
ef333e8611 SCI: Fix several SQ1 message and verb script bugs
Commit: ef333e86118de26d862adcfbf68b34bda22115af
https://github.com/scummvm/scummvm/commit/ef333e86118de26d862adcfbf68b34bda22115af
Author: sluicebox (22204938+sluicebox at users.noreply.github.com)
Date: 2021-06-16T22:27:15-05:00
Commit Message:
SCI: Fix several SQ1 message and verb script bugs
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 cc565ee73e..b9ff0f84db 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -19718,9 +19718,11 @@ static const uint16 sq1vgaPatchOratSounds[] = {
//
// We fix this by patching out the inventory tests in the broken doVerb methods.
// Note that this technique only works because these doVerb methods don't have
-// handlers for item zero: the data cartridge.
+// handlers for item zero: the data cartridge. This patch must not be applied
+// to the Spanish version as it doesn't use the lookStr properties and instead
+// displays messages with extra code.
//
-// Applies to: All versions
+// Applies to: All versions except Spanish
// Responsible methods: rm64:doVerb, upperLanding:doVerb, emitter:doVerb, tubes:doVerb,
// space:doVerb, leftShieldEmitter:doVerb, rightShieldEmitter:doVerb
static const uint16 sq1vgaSignatureRoom64Verbs[] = {
@@ -19738,6 +19740,198 @@ static const uint16 sq1vgaPatchRoom64Verbs[] = {
PATCH_END
};
+// Room 46 at the back of Droids B Us doesn't display the Look messages for its
+// building or or signs. All three of these objects omit passing the verb to
+// super:doVerb. store:doVerb has an extra bug and does this even after
+// responding to other verbs, causing the red X cursor after their message.
+//
+// We fix this by patching the &rest instructions to include all the parameters
+// and patching store:doVerb to only call super:doVerb if it hasn't already
+// printed a message.
+//
+// Applies to: All versions, although the store and giraffe were later fixed.
+// Responsible methods: store:doVerb, giraffe:doVerb, pickupSign:doVerb
+static const uint16 sq1vgaSignatureRoom46Verbs1[] = {
+ SIG_MAGICDWORD,
+ 0x32, SIG_UINT16(0x0009), // jmp 0009
+ 0x38, SIG_SELECTOR16(doVerb), // pushi doVerb
+ 0x76, // push0
+ 0x59, 0x02, // &rest 02 [ bug: skips first parameter ]
+ 0x57, SIG_ADDTOOFFSET(+1), 0x04, // super Feature 04
+ SIG_END
+};
+
+static const uint16 sq1vgaPatchRoom46Verbs1[] = {
+ PATCH_ADDTOOFFSET(+7),
+ 0x59, 0x01, // &rest 01 [ include all parameters ]
+ PATCH_END
+};
+
+static const uint16 sq1vgaSignatureRoom46Verbs2[] = {
+ 0x30, SIG_UINT16(0x0009), // bnt 0009
+ SIG_ADDTOOFFSET(+9),
+ SIG_MAGICDWORD,
+ 0x3a, // toss
+ 0x38, SIG_SELECTOR16(doVerb), // pushi doVerb [ bug: always called ]
+ 0x76, // push0
+ 0x59, 0x02, // &rest 02 [ bug: skips first parameter ]
+ 0x57, SIG_ADDTOOFFSET(+1), 0x04, // super Feature 04
+ 0x48, // ret
+ SIG_ADDTOOFFSET(+0xb4),
+ 0x38, SIG_SELECTOR16(doVerb), // pushi doVerb
+ 0x76, // push0
+ 0x59, 0x01, // &rest 01 [ patched ]
+ 0x57, SIG_ADDTOOFFSET(+1), 0x04, // super Feature 04
+ 0x3a, // toss
+ 0x48, // ret
+ SIG_END
+};
+
+static const uint16 sq1vgaPatchRoom46Verbs2[] = {
+ 0x30, PATCH_UINT16(0x00c8), // bnt 00c8 [ super doVerb: &rest, toss, ret ]
+ PATCH_ADDTOOFFSET(+10),
+ 0x48, // ret
+ PATCH_END
+};
+
+// Clicking Do on the smallest of the three boxes of robot parts outside of
+// Droids B Us will sometimes send ego walking off into the forcefield instead
+// of opening the box. The script sets box1:approachVerbs on the second click
+// for no reason. We fix this as Sierra did by removing the approachVerbs.
+//
+// Applies to: English PC VGA
+// Responsible method: box1:doVerb
+static const uint16 sq1vgaSignatureRobotBoxApproachVerbs[] = {
+ SIG_MAGICDWORD,
+ 0x38, SIG_SELECTOR16(approachVerbs),// pushi approachVerbs
+ 0x7a, // push2
+ 0x39, 0x03, // pushi 03 [ Do ]
+ 0x39, 0x04, // pushi 04 [ Inventory ]
+ 0x54, 0x08, // self 08 [ self approachVerbs: 3 4 ]
+ SIG_END
+};
+
+static const uint16 sq1vgaPatchRobotBoxApproachVerbs[] = {
+ 0x32, PATCH_UINT16(0x0007), // jmp 0007 [ skip setting approachVerbs ]
+ PATCH_END
+};
+
+// The message for tasting the pink ship in room 40 doesn't display because the
+// function name was forgotten in the script. This was fixed in later versions.
+//
+// Applies to: English PC VGA
+// Responsible method: pinkShip:doVerb
+static const uint16 sq1vgaSignatureTastePinkShip[] = {
+ 0x47, 0xff, 0x00, 0x04, // calle proc255_0 04 [ Print ]
+ SIG_ADDTOOFFSET(+10),
+ SIG_MAGICDWORD,
+ 0x39, 0x28, // pushi 28
+ 0x35, 0x10, // ldi 10
+ 0x32, SIG_UINT16(0x000b), // jmp 000b
+ SIG_END
+};
+
+static const uint16 sq1vgaPatchTastePinkShip[] = {
+ PATCH_ADDTOOFFSET(+14),
+ 0x7a, // push2
+ 0x39, 0x28, // pushi 28
+ 0x39, 0x10, // pushi 10
+ 0x33, 0xeb, // jmp eb [ Print ]
+ PATCH_END
+};
+
+// Looking at Tiny's sign causes the animated part of the sign to teleport to
+// the cursor position. The Features in this game that are defined by control
+// areas tend to update their coordinates to the click position so that ego
+// will always turn to face the exact spot that was clicked. tinysign is a Prop
+// with a view and shouldn't have this code in its doVerb method.
+//
+// We fix this as Sierra did by removing the coordinate code from tinysign.
+//
+// Applies to: English PC VGA
+// Responsible method: tinysign:doVerb
+static const uint16 sq1vgaSignatureTinysSign[] = {
+ 0x39, SIG_SELECTOR8(x), // pushi x
+ 0x76, // push0
+ 0x38, SIG_SELECTOR16(curEvent), // pushi curEvent
+ SIG_ADDTOOFFSET(+20),
+ 0x4a, 0x04, // send 04 [ Event y? ]
+ 0x65, 0x0a, // aTop y
+ SIG_ADDTOOFFSET(+10),
+ SIG_MAGICDWORD,
+ 0x39, 0x28, // pushi 28
+ 0x76, // push0
+ 0x47, 0xff, 0x00, 0x04, // calle proc0_255 04 [ Print 28 0 ]
+ SIG_END
+};
+
+static const uint16 sq1vgaPatchTinysSign[] = {
+ 0x33, 0x1c, // jmp 1c [ skip changing coordinates ]
+ PATCH_END
+};
+
+// The two bar patrons on the right are supposed to animate when the detail
+// slider is set to highest, but the detail test is wrong. Instead they do
+// the opposite and animate at every detail setting except highest.
+//
+// We fix the test to match the detailLevel of triGirl and slugGuy (three).
+//
+// Applies to: All versions
+// Responsible method: rm43:init
+static const uint16 sq1vgaSignatureBarPatronAnimation[] = {
+ 0x38, SIG_ADDTOOFFSET(+2), // pushi detailLevel
+ 0x76, // push0
+ 0x81, 0x01, // lag 01
+ 0x4a, 0x04, // send 04 [ sq1 detailLevel? ]
+ SIG_MAGICDWORD,
+ 0x36, // push
+ 0x35, 0x02, // ldi 02
+ 0x24, // le? [ sq1:detailLevel <= 2 ]
+ SIG_END
+};
+
+static const uint16 sq1vgaPatchBarPatronAnimation[] = {
+ PATCH_ADDTOOFFSET(+11),
+ 0x1e, // gt? [ sq1:detailLevel > 2 ]
+ PATCH_END
+};
+
+// On the Deltaur, clicking Look or Do or Taste on various things cycles through
+// a different message each time, but repeated off-by-one errors prevent the
+// last message from displaying. We fix the off-by-one errors.
+//
+// Applies to: All versions
+// Responsible method: RegionFeature:doVerb
+static const uint16 sq1vgaSignatureDeltaurMessages1[] = {
+ SIG_MAGICDWORD,
+ 0xc3, 0xc3, // +al c3
+ 0x36, // push
+ 0x35, 0x06, // ldi 06 [ should be 7 ]
+ SIG_END
+};
+
+static const uint16 sq1vgaSignatureDeltaurMessages2[] = {
+ SIG_MAGICDWORD,
+ 0xc3, 0xc6, // +al c6
+ 0x36, // push
+ 0x35, 0x04, // ldi 04 [ should be 5 ]
+ SIG_END
+};
+
+static const uint16 sq1vgaSignatureDeltaurMessages3[] = {
+ SIG_MAGICDWORD,
+ 0xc3, 0xc2, // +al c2
+ 0x36, // push
+ 0x35, 0x05, // ldi 05 [ should be 6 ]
+ SIG_END
+};
+
+static const uint16 sq1vgaPatchDeltaurMessages[] = {
+ PATCH_ADDTOOFFSET(+3),
+ 0x35, PATCH_GETORIGINALBYTEADJUST(+4, +1), // ldi XX + 1
+ PATCH_END
+};
+
// The Russian version of SQ1VGA has mangled class names in its scripts. This
// isn't a problem in Sierra's interpreter since this is just metadata, but our
// feature detection code looks up several classes by name and requires them to
@@ -19784,10 +19978,19 @@ static const uint16 sq1vgaPatchRussianSoundName[] = {
// script, description, signature patch
static const SciScriptPatcherEntry sq1vgaSignatures[] = {
{ true, 28, "orat sounds", 1, sq1vgaSignatureOratSounds, sq1vgaPatchOratSounds },
+ { true, 40, "taste pink ship", 1, sq1vgaSignatureTastePinkShip, sq1vgaPatchTastePinkShip },
+ { true, 40, "tiny's sign", 1, sq1vgaSignatureTinysSign, sq1vgaPatchTinysSign },
+ { true, 43, "bar patron animation", 1, sq1vgaSignatureBarPatronAnimation, sq1vgaPatchBarPatronAnimation },
{ true, 45, "Ulence Flats: timepod graphic glitch", 1, sq1vgaSignatureUlenceFlatsTimepodGfxGlitch, sq1vgaPatchUlenceFlatsTimepodGfxGlitch },
{ true, 45, "Ulence Flats: force field generator glitch", 1, sq1vgaSignatureUlenceFlatsGeneratorGlitch, sq1vgaPatchUlenceFlatsGeneratorGlitch },
+ { true, 46, "room 46 verbs", 2, sq1vgaSignatureRoom46Verbs1, sq1vgaPatchRoom46Verbs1 },
+ { true, 46, "room 46 verbs", 1, sq1vgaSignatureRoom46Verbs2, sq1vgaPatchRoom46Verbs2 },
+ { true, 46, "robot box approach verbs", 1, sq1vgaSignatureRobotBoxApproachVerbs, sq1vgaPatchRobotBoxApproachVerbs },
{ true, 58, "Sarien armory droid zapping ego first time", 1, sq1vgaSignatureEgoShowsCard, sq1vgaPatchEgoShowsCard },
- { true, 64, "room 64 verbs", 7, sq1vgaSignatureRoom64Verbs, sq1vgaPatchRoom64Verbs },
+ { false, 64, "room 64 verbs", 7, sq1vgaSignatureRoom64Verbs, sq1vgaPatchRoom64Verbs },
+ { true, 703, "deltaur messages", 1, sq1vgaSignatureDeltaurMessages1, sq1vgaPatchDeltaurMessages },
+ { true, 703, "deltaur messages", 1, sq1vgaSignatureDeltaurMessages2, sq1vgaPatchDeltaurMessages },
+ { true, 703, "deltaur messages", 1, sq1vgaSignatureDeltaurMessages3, sq1vgaPatchDeltaurMessages },
{ true, 704, "spider droid timing issue", 1, sq1vgaSignatureSpiderDroidTiming, sq1vgaPatchSpiderDroidTiming },
{ true, 989, "rename russian Sound class", 1, sq1vgaSignatureRussianSoundName, sq1vgaPatchRussianSoundName },
{ true, 992, "rename russian Motion class", 1, sq1vgaSignatureRussianMotionName, sq1vgaPatchRussianMotionName },
@@ -21694,6 +21897,11 @@ void ScriptPatcher::processScript(uint16 scriptNr, SciSpan<byte> scriptData) {
enablePatch(signatureTable, "Floppy: fix peer bats, upper door (2/2)");
}
break;
+ case GID_SQ1:
+ if (g_sci->getLanguage() != Common::ES_ESP) {
+ enablePatch(signatureTable, "room 64 verbs");
+ }
+ break;
case GID_SQ3:
if (g_sci->getLanguage() == Common::HE_ISR) {
enablePatch(signatureTable, "Hebrew: Replace name in status bar");
More information about the Scummvm-git-logs
mailing list