aboutsummaryrefslogtreecommitdiff
path: root/engines/sci
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci')
-rw-r--r--engines/sci/engine/script_patches.cpp131
1 files changed, 129 insertions, 2 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index 3e37d134ee..1f6a2d0c3d 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -99,6 +99,7 @@ static const char *const selectorNameTable[] = {
"play", // system selector
"number", // system selector
"setScript", // system selector
+ "setCycle", // system selector
"localize", // Freddy Pharkas
"put", // Police Quest 1 VGA
"say", // Quest For Glory 1 VGA
@@ -131,7 +132,6 @@ static const char *const selectorNameTable[] = {
"iconV", // Phant2
"update", // Phant2
"xOff", // Phant2
- "setCycle", // GK1
"fore", // KQ7
"back", // KQ7
"font", // KQ7
@@ -167,6 +167,7 @@ enum ScriptPatcherSelectors {
SELECTOR_play,
SELECTOR_number,
SELECTOR_setScript,
+ SELECTOR_setCycle,
SELECTOR_localize,
SELECTOR_put,
SELECTOR_say,
@@ -200,7 +201,6 @@ enum ScriptPatcherSelectors {
SELECTOR_iconV,
SELECTOR_update,
SELECTOR_xOff,
- SELECTOR_setCycle,
SELECTOR_fore,
SELECTOR_back,
SELECTOR_font,
@@ -2474,6 +2474,130 @@ static const SciScriptPatcherEntry longbowSignatures[] = {
};
// ===========================================================================
+// Leisure Suit Larry 1 (Spanish)
+//
+// It seems originally the Spanish version of Larry 1 used some beta code at
+// least for the man wearing a barrel, who walks around in front of the casino.
+// The script inside the resource files even uses a class, that does not exist
+// inside those resource files, which causes a hard error.
+// The patch files included with the Spanish version (300.scr,300.tex, 927.scr)
+// add this class, but at least inside ScummVM a write to a non-existent selector
+// happens right after the player tries to buy an apple from that man.
+//
+// In the original English releases (2.0+2.1) this was handled differently.
+// Which is why this script patch changes that code to work just like in the English release.
+//
+// Attention: for at least some release of this game, view 302 (man wearing a barrel) is fully
+// broken! Which also causes a crash. The original interpreter crashes as well.
+// The only way to fix this is to dump that view from another release of Larry 1
+// and then use the view patch file on this release.
+//
+// Applies to at least: Spanish floppy
+// Responsible method: sBuyApple::changeScript(2)
+// Fixes bug: #10240
+static const uint16 larry1SignatureBuyApple[] = {
+ // end of state 0
+ 0x35, 0x01, // ldi 01
+ 0x65, 0x10, // aTop cycles
+ 0x32, SIG_UINT16(0x0248), // jmp [ret]
+ 0x3c, // dup
+ 0x35, 0x01, // ldi 01
+ 0x1a, // eq?
+ 0x30, SIG_UINT16(0x0007), // bnt [step 2 check]
+ // state 1 code
+ 0x35, 0x01, // ldi 01
+ 0x65, 0x10, // aTop cycles
+ 0x32, SIG_UINT16(0x023a), // jmp [ret]
+ 0x3c, // dup
+ 0x35, 0x02, // ldi 02
+ 0x1a, // eq?
+ 0x30, SIG_UINT16(0x0036), // bnt [step 3 check]
+ // state 2 code
+ 0x35, 0x02, // ldi 02
+ 0x38, SIG_UINT16(0x0091), // pushi setCycle
+ 0x78, // push1
+ 0x51, 0x18, // class Walk
+ 0x36, // push
+ 0x38, SIG_UINT16(0x0126), // pushi setAvoider
+ 0x78, // push1
+ 0x51, 0x6d, // class PAvoider
+ 0x36, // push
+ 0x38, SIG_UINT16(0x0116), // pushi setMotion
+ SIG_MAGICDWORD,
+ 0x39, 0x04, // pushi 04
+ 0x51, 0x24, // class PolyPath
+ 0x36, // push
+ 0x39, 0x04, // pushi 04
+ 0x76, // push0
+ 0x72, SIG_UINT16(0x0f4e), // lofsa aAppleMan
+ 0x4a, 0x04, // send 04
+ 0x36, // push
+ 0x35, 0x1d, // ldi 1Dh
+ 0x02, // add
+ 0x36, // push
+ 0x39, 0x03, // pushi 03
+ 0x76, // push0
+ 0x72, SIG_UINT16(0x0f4e), // lofsa aAppleMan
+ 0x4a, 0x04, // send 04
+ 0x36, // push
+ 0x7c, // pushSelf
+ 0x81, 0x00, // lag global[0]
+ 0x4a, 0x18, // send 18h
+ 0x32, SIG_UINT16(0x01fd), // jmp [ret]
+ SIG_END
+};
+
+static const uint16 larry1PatchBuyApple[] = {
+ PATCH_ADDTOOFFSET(+11),
+ 0x2f, 0xf3, // bt [jump to end of step 1 code], saves 8 bytes
+ 0x3c, // dup
+ 0x35, 0x02, // ldi 02
+ 0x1a, // eq?
+ 0x31, 0x3f, // bnt [step 3 check]
+ 0x38, PATCH_UINT16(0x00e1), // pushi distanceTo
+ 0x78, // push1
+ 0x72, PATCH_UINT16(0x0f4e), // lofsa sAppleMan
+ 0x36, // push
+ 0x81, 0x00, // lag global[0]
+ 0x4a, 0x06, // send 06
+ 0x36, // push
+ 0x35, 0x1e, // ldi 1Eh
+ 0x1e, // gt?
+ 0x31, 0xdb, // bnt [jump to end of step 1 code]
+ 0x38, PATCH_SELECTOR16(setCycle), // pushi setCycle
+ 0x78, // push1
+ 0x51, 0x18, // class Walk
+ 0x36, // push
+ 0x38, PATCH_SELECTOR16(setMotion), // pushi setMotion
+ 0x39, 0x04, // pushi 04
+ 0x51, 0x24, // class PolyPath
+ 0x36, // push
+ 0x39, 0x04, // pushi 04
+ 0x76, // push0
+ 0x72, PATCH_UINT16(0x0f4e), // lofsa aAppleMan
+ 0x4a, 0x04, // send 04
+ 0x36, // push
+ 0x35, 0x1d, // ldi 1Dh
+ 0x02, // add
+ 0x36, // push
+ 0x39, 0x03, // pushi 03
+ 0x76, // push0
+ 0x72, PATCH_UINT16(0x0f4e), // lofsa aAppleMan
+ 0x4a, 0x04, // send 04
+ 0x36, // push
+ 0x7c, // pushSelf
+ 0x81, 0x00, // lag global[0]
+ 0x4a, 0x12, // send 12h
+ PATCH_END
+};
+
+// script, description, signature patch
+static const SciScriptPatcherEntry larry1Signatures[] = {
+ { true, 300, "Spanish: buy apple from barrel man", 1, larry1SignatureBuyApple, larry1PatchBuyApple },
+ SCI_SIGNATUREENTRY_TERMINATOR
+};
+
+// ===========================================================================
// Leisure Suit Larry 2
// On the plane, Larry is able to wear the parachute. This grants 4 points.
// In early versions of LSL2, it was possible to get "unlimited" points by
@@ -7363,6 +7487,9 @@ void ScriptPatcher::processScript(uint16 scriptNr, SciSpan<byte> scriptData) {
case GID_LONGBOW:
signatureTable = longbowSignatures;
break;
+ case GID_LSL1:
+ signatureTable = larry1Signatures;
+ break;
case GID_LSL2:
signatureTable = larry2Signatures;
break;