aboutsummaryrefslogtreecommitdiff
path: root/engines/sci
diff options
context:
space:
mode:
authorMartin Kiewitz2017-09-16 19:58:40 +0200
committerMartin Kiewitz2017-09-16 19:58:40 +0200
commitbbbbfb64dc9ce6770a8a0691921054f8c39a9019 (patch)
treec0172771d642689eb6ff472d47b30fc449c04848 /engines/sci
parentbce9ba0aec00d56f125b4de6a4157a080be6cddd (diff)
downloadscummvm-rg350-bbbbfb64dc9ce6770a8a0691921054f8c39a9019.tar.gz
scummvm-rg350-bbbbfb64dc9ce6770a8a0691921054f8c39a9019.tar.bz2
scummvm-rg350-bbbbfb64dc9ce6770a8a0691921054f8c39a9019.zip
SCI32: Add script patch for PQ4CD for dual mode (text+speech)
This makes the game menu able to handle a 3rd state, so that the game shows text but also play speech at the same time. We need to inject our own view for the new button to really show up. I'm not that experienced with the SCI32 graphics code, which is why I prefer snover to do this part. Right now it will show the button with text selected 2 times in a row. The first "text" button is the dual mode / "both" state. Anyway, thanks to snover for notifying me of this game needing dual mode patched in and also for some help.
Diffstat (limited to 'engines/sci')
-rw-r--r--engines/sci/engine/script_patches.cpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index 018b4089aa..cc7194e296 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -4357,6 +4357,97 @@ static const SciScriptPatcherEntry pq3Signatures[] = {
#pragma mark -
#pragma mark Police Quest 4
+// Adding support to also select both (text + speech at the same time) inside the game menu.
+// There is lowres support inside this code, but the button is never created for the lowres
+// version. That's why we effectively remove lowres support in those 2 methods, which
+// gives us more spare bytes to work with.
+//
+// For this to fully work, we need to inject our own view for the button that has both text and speech enabled.
+//
+// Applies to: English CD
+// Responsible method: iconText::init, iconText::select (script 9)
+// Implements enhancement request: #9690
+static const uint16 pq4CDGameMenuSupportBOTHSignature[] = {
+ // We don't check the 2 methods completely, only the important bits
+ 0x76, // push0
+ 0x43, 0x22, 0x00, 0x00, // callk IsHiRes
+ 0x18, // not
+ 0x31, 0x05, // bnt [skip next 2 opcodes, when hires]
+ SIG_MAGICDWORD,
+ 0x34, SIG_UINT16(0x2661), // ldi 2661h
+ 0x65, 0x78, // aTop mainView
+ 0x89, 0x5a, // lsg global[5Ah]
+ 0x35, 0x01, // ldi 01
+ 0x12, // and
+ 0x30, SIG_UINT16(0x1b), // bnt [when in speech mode]
+ 0x76, // push0
+ 0x43, 0x22, 0x00, 0x00, // callk IsHiRes
+ SIG_ADDTOOFFSET(+45), // skip over the remaining code
+ 0x38, SIG_UINT16(0x93), // pushi 93h (init)
+ 0x76, // push0
+ 0x59, 0x01, // &rest 01
+ 0x57, 0x8f, 0x04, 0x00, // super GCItem
+ 0x48, // ret
+ // now we should be at iconText::select
+ 0x38, SIG_UINT16(0x01c4), // pushi 1C4h (select)
+ 0x76, // push0
+ 0x59, 0x01, // &rest 01
+ 0x57, 0x8f, 0x04, 0x00, // super GCItem, 04
+ 0x89, 0x5a, // lsg global[5Ah]
+ 0x35, 0x02, // ldi 02
+ 0x12, // and
+ 0x30, SIG_UINT16(0x1F), // bnt [jump to currently-in-text-mode code]
+ SIG_ADDTOOFFSET(+67), // skip over the rest
+ 0x48, // ret
+ SIG_END
+};
+
+static const uint16 pq4CDGameMenuSupportBOTHPatch[] = {
+ 0x76, // push0
+ 0x41, 2, PATCH_UINT16(0), // call our new routine, that does set view+loop+cel
+ 0x33, 64, // jmp (to original init, super GCItem call)
+ // new code for setting view+loop+cel
+ 0x34, PATCH_UINT16(10987), // ldi 10987
+ 0x65, 0x78, // aTop mainView - always set this view, because it's used by 2 states
+ 0x89, 0x5a, // lsg global[5Ah]
+ 0x35, 0x03, // ldi 03
+ 0x1a, // eq?
+ 0x31, 4, // bnt [skip over follow up code]
+ // set, when in dual mode
+ 0x78, // push1
+ 0x69, 0x7a, // sTop mainLoop
+ 0x48, // ret
+ 0x89, 0x5a, // lsg global[5Ah]
+ 0x35, 0x01, // ldi 01
+ 0x12, // and
+ 0x31, 4, // bnt [skip over follow up code]
+ // set, when in text mode
+ 0x76, // push0
+ 0x69, 0x7a, // sTop mainLoop
+ 0x48, // ret
+ // set, when in speech mode
+ 0x34, PATCH_UINT16(10982), // ldi 10982
+ 0x65, 0x78, // aTop mainView
+ 0x35, 15, // ldi 15d
+ 0x65, 0x7a, // aTop mainLoop
+ 0x48, // ret
+ PATCH_ADDTOOFFSET(+38), // skip to iconText::select
+ // iconText::select
+ PATCH_ADDTOOFFSET(+10), // skip over the super code
+ 0xC1, 0x5A, // plusag 5Ah (increase 5Ah by one)
+ 0xA1, 0x5A, // sag 5Ah (save)
+ 0x36, // push
+ 0x35, 0x04, // ldi 04
+ 0x28, // uge?
+ 0x31, 3, // bnt [skip over follow up code]
+ 0x78, // push1
+ 0xA9, 0x5A, // ssg 5Ah (save)
+ 0x76, // push0
+ 0x41, 153, PATCH_UINT16(0), // call our new routine, that does set view+loop+cel, effectively -103
+ 0x33, 47, // jmp (to end of original select, show call)
+ PATCH_END
+};
+
// In Police Quest 4 inside the Bitty Kitty show (room 315), the player has to first talk with a young woman, show her the police badge, then
// show her the red shoe. She will tell the player that may "Barbie" knows more.
// After leaving and entering later (not detailed here), Barbie will be available.
@@ -4510,6 +4601,7 @@ static const uint16 pq4LastActionHeroTimerPatch[] = {
// script, description, signature patch
static const SciScriptPatcherEntry pq4Signatures[] = {
+ { true, 9, "CD: game menu to support BOTH", 1, pq4CDGameMenuSupportBOTHSignature, pq4CDGameMenuSupportBOTHPatch },
{ true, 315, "show barbie the red shoe points fix", 1, pq4BittyKittyShowBarieRedShoeSignature, pq4BittyKittyShowBarbieRedShoePatch },
{ true, 390, "floppy: city hall: draw gun timer", 1, pq4FloppyCityHallDrawGunTimerSignature, pq4FloppyCityHallDrawGunTimerPatch },
{ true, 390, "floppy: city hall: tell enemy drop weapon timer", 1, pq4FloppyCityHallTellEnemyDropWeaponTimerSignature, pq4FloppyCityHallTellEnemyDropWeaponTimerPatch },