diff options
Diffstat (limited to 'engines/sci/engine/script_patches.cpp')
-rw-r--r-- | engines/sci/engine/script_patches.cpp | 115 |
1 files changed, 60 insertions, 55 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 631597ba88..d564cd7323 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -6352,7 +6352,7 @@ static const SciScriptPatcherEntry phantasmagoria2Signatures[] = { // Fixes bug: #5865 static const uint16 pq1vgaSignatureBriefingGettingStuck[] = { 0x76, // push0 - 0x45, 0x02, 0x00, // call export 2 of script 0 (disable control) + 0x45, 0x02, 0x00, // callb [export 2 of script 0], 00 (disable control) 0x38, SIG_ADDTOOFFSET(+2), // pushi notify 0x76, // push0 0x81, 0x02, // lag global[2] (get current room) @@ -6365,7 +6365,7 @@ static const uint16 pq1vgaSignatureBriefingGettingStuck[] = { }; static const uint16 pq1vgaPatchBriefingGettingStuck[] = { - 0x33, 0x0a, // jmp to lsl local[2], skip over export 2 and ::notify + 0x33, 0x0a, // jmp [to lsl local[2], skip over export 2 and ::notify] PATCH_END // rm015::notify would try to make ego walk to the chair }; @@ -6379,26 +6379,26 @@ static const uint16 pq1vgaPatchBriefingGettingStuck[] = { // when the 2 seconds have passed and the locker got closed. // Applies to at least: English floppy // Responsible method: putGun::changeState (script 341) -// Fixes bug: #5705 / #6400 +// Fixes bug: #5705, #6400 static const uint16 pq1vgaSignaturePutGunInLockerBug[] = { 0x35, 0x00, // ldi 00 0x1a, // eq? 0x31, 0x25, // bnt [next state check] SIG_ADDTOOFFSET(+22), // [skip 22 bytes] SIG_MAGICDWORD, - 0x38, SIG_SELECTOR16(put), // pushi "put" + 0x38, SIG_SELECTOR16(put), // pushi put 0x78, // push1 0x76, // push0 - 0x81, 0x00, // lag 00 + 0x81, 0x00, // lag global[0] 0x4a, 0x06, // send 06 - ego::put(0) 0x35, 0x02, // ldi 02 0x65, 0x1c, // aTop 1c (set timer to 2 seconds) 0x33, 0x0e, // jmp [end of method] - 0x3c, // dup --- next state check target + 0x3c, // dup (state check) 0x35, 0x01, // ldi 01 0x1a, // eq? 0x31, 0x08, // bnt [end of method] - 0x39, SIG_SELECTOR8(dispose), // pushi "dispose" + 0x39, SIG_SELECTOR8(dispose), // pushi dispose 0x76, // push0 0x72, SIG_UINT16(0x0088), // lofsa 0088 0x4a, 0x04, // send 04 - locker::dispose @@ -6412,14 +6412,14 @@ static const uint16 pq1vgaPatchPutGunInLockerBug[] = { 0x35, 0x02, // ldi 02 0x65, 0x1c, // aTop 1c (set timer to 2 seconds) 0x33, 0x17, // jmp [end of method] - 0x3c, // dup --- next state check target + 0x3c, // dup (state check) 0x35, 0x01, // ldi 01 0x1a, // eq? 0x31, 0x11, // bnt [end of method] - 0x38, PATCH_SELECTOR16(put), // pushi "put" + 0x38, PATCH_SELECTOR16(put), // pushi put 0x78, // push1 0x76, // push0 - 0x81, 0x00, // lag 00 + 0x81, 0x00, // lag global[0] 0x4a, 0x06, // send 06 - ego::put(0) PATCH_END }; @@ -6441,16 +6441,16 @@ static const uint16 pq1vgaSignatureMapSaveRestoreBug[] = { 0x38, 0x64, 0x80, // pushi 8064 0x76, // push0 0x89, 0x28, // lsg global[28] - 0x43, 0x08, 0x08, // kDrawPic (8) + 0x43, 0x08, 0x08, // callk DrawPic, 8 SIG_END }; static const uint16 pq1vgaPatchMapSaveRestoreBug[] = { - 0x38, PATCH_SELECTOR16(overlay), // pushi "overlay" + 0x38, PATCH_SELECTOR16(overlay), // pushi overlay 0x7a, // push2 0x89, 0xf9, // lsg global[f9] 0x39, 0x64, // pushi 64 (no transition) - 0x81, 0x02, // lag global[02] (current room object) + 0x81, 0x02, // lag global[2] (current room object) 0x4a, 0x08, // send 08 0x18, // not (waste byte) PATCH_END @@ -6464,7 +6464,6 @@ static const SciScriptPatcherEntry pq1vgaSignatures[] = { SCI_SIGNATUREENTRY_TERMINATOR }; - // =========================================================================== // Police Quest 3 @@ -6510,7 +6509,7 @@ static const uint16 pq3PatchGiveLocketPoints[] = { 0x7a, // push2 0x38, PATCH_UINT16(0x00ff), // pushi 0x00ff - using last flag slot, seems to be unused 0x39, 0x0a, // pushi 10d - 10 points - 0x45, 0x06, 0x04, // callb export000_6, 4 + 0x45, 0x06, 0x04, // callb [export 6 of script 0], 4 // original code 0x39, 0x20, // pushi 20h (state) 0x78, // push1 @@ -6561,21 +6560,21 @@ static const uint16 pq4CdSpeechAndSubtitlesSignature[] = { 0x76, // push0 0x43, 0x22, SIG_UINT16(0x00), // callk IsHiRes SIG_ADDTOOFFSET(+45), // skip over the remaining code - 0x38, SIG_SELECTOR16(init), // pushi $93 (init) + 0x38, SIG_SELECTOR16(init), // pushi init ($93) 0x76, // push0 0x59, 0x01, // &rest 01 - 0x57, 0x8f, SIG_UINT16(0x04), // super GCItem + 0x57, 0x8f, SIG_UINT16(0x04), // super GCItem, 4 0x48, // ret // iconText::select - 0x38, SIG_SELECTOR16(select), // pushi $1c4 (select) + 0x38, SIG_SELECTOR16(select), // pushi select ($1c4) 0x76, // push0 0x59, 0x01, // &rest 01 0x57, 0x8f, SIG_UINT16(0x04), // super GCItem, 4 0x89, 0x5a, // lsg global[$5a] 0x35, 0x02, // ldi 2 0x12, // and - 0x30, SIG_UINT16(0x1f), // bnt [jump to currently-in-text-mode code] + 0x30, SIG_UINT16(0x001f), // bnt [to currently-in-text-mode code] SIG_ADDTOOFFSET(+67), // skip over the rest 0x48, // ret SIG_END @@ -6615,31 +6614,34 @@ static const uint16 pq4CdSpeechAndSubtitlesPatch[] = { // iconText::select PATCH_ADDTOOFFSET(+10), // skip over the super code - 0xc1, 0x5a, // +ag $5a - 0xa1, 0x5a, // sag $5a + 0xc1, 0x5a, // +ag global[$5a] + 0xa1, 0x5a, // sag global[$5a] 0x36, // push 0x35, 0x04, // ldi 4 0x28, // uge? 0x31, 0x03, // bnt [skip over follow up code] 0x78, // push1 - 0xa9, 0x5a, // ssg $5a + 0xa9, 0x5a, // ssg global[$5a] 0x76, // push0 0x41, 0x99, PATCH_UINT16(0x00), // call [our new subroutine which sets view+loop+cel, effectively -103], 0 0x33, 0x2f, // jmp [to end of original select, show call] PATCH_END }; -// When showing the red shoe to Barbie after showing the police badge but before -// exhausting the normal dialogue tree, the game plays the expected dialogue but -// fails to award points or set an internal flag indicating this interaction has -// occurred (which is needed to progress in the game). This is because the game -// checks global $9a (dialogue progress flag) instead of local 3 (badge shown -// flag) when interacting with Barbie. The game uses the same -// `shoeShoe::changeState(0)` method for showing the shoe to the young woman at the -// bar earlier in the game, and checks local 3 then, so just check local 3 in -// both cases to prevent the game from appearing to be in an unwinnable state -// just because the player interacted in the "wrong" order. +// When showing the red shoe to Barbie, after showing the police badge but +// before exhausting the normal dialogue tree, the game plays the expected +// dialogue but fails to award points or set an internal flag indicating this +// interaction has occurred (which is needed to progress in the game). +// +// This is because the game checks global[$9a] (dialogue progress flag) instead +// of local[3] (badge shown flag) when interacting with Barbie. The game uses +// the same `shoeShoe::changeState(0)` method for showing the shoe to the young +// woman at the bar earlier in the game, and checks local[3] then, so just +// check local[3] in both cases to prevent the game from appearing to be in an +// unwinnable state just because the player interacted in the "wrong" order. +// // Applies to at least: English floppy, German floppy, English CD, German CD +// Fixes bug: #9849 static const uint16 pq4BittyKittyShowBarieRedShoeSignature[] = { // stripper::noun check is for checking, if police badge was shown SIG_MAGICDWORD, @@ -6647,14 +6649,14 @@ static const uint16 pq4BittyKittyShowBarieRedShoeSignature[] = { 0x35, 0x02, // ldi 2 0x1e, // gt? 0x30, SIG_UINT16(0x0028), // bnt [skip 2 points code] - 0x39, SIG_SELECTOR8(points), // pushi $61 (points) + 0x39, SIG_SELECTOR8(points), // pushi points ($61) SIG_END }; static const uint16 pq4BittyKittyShowBarbieRedShoePatch[] = { 0x83, 0x03, // lal local[3] 0x30, PATCH_UINT16(0x002b), // bnt [skip 2 points code] - 0x33, 1, // jmp 1 (waste some bytes) + 0x33, 0x01, // jmp 1 (waste some bytes) PATCH_END }; @@ -6670,42 +6672,43 @@ static const uint16 pq4BittyKittyShowBarbieRedShoePatch[] = { // be less than one second if the timer is set in between hardware clock // seconds, so the values are increased slightly from their equivalent tick // values to compensate for this. +// +// TODO: The object structure changed in PQ4CD so ticks moved from 0x20 to 0x22. +// Additional signatures/patches will need to be added for CD version. +// // Applies to at least: English Floppy, German floppy // Responsible method: metzAttack::changeState(2) - 120 ticks (player needs to draw gun) // stickScr::changeState(0) - 180 ticks (player needs to tell enemy to drop gun) // dropStick::changeState(5) - 120 ticks (player needs to tell enemy to turn around) // turnMetz::changeState(5) - 600/420 ticks (player needs to cuff Metz) // all in script 390 -// -// TODO: The object structure changed in PQ4CD so ticks moved from 0x20 to 0x22. -// Additional signatures/patches will need to be added for CD version. static const uint16 pq4FloppyCityHallDrawGunTimerSignature[] = { SIG_MAGICDWORD, 0x4a, SIG_UINT16(0x08), // send 8 0x32, // jmp [ret] SIG_ADDTOOFFSET(+8), // skip over some code - 0x35, 0x78, // pushi $78 (120) + 0x35, 0x78, // ldi $78 (120) 0x65, 0x20, // aTop ticks SIG_END }; static const uint16 pq4FloppyCityHallDrawGunTimerPatch[] = { PATCH_ADDTOOFFSET(+12), // send 8, jmp, skip over some code - 0x35, 0x05, // pushi 4 (120t/2s -> 4s) + 0x35, 0x05, // ldi 5 (120t/2s -> 5s) 0x65, 0x1c, // aTop seconds PATCH_END }; static const uint16 pq4FloppyCityHallTellEnemyDropWeaponTimerSignature[] = { SIG_MAGICDWORD, - 0x34, SIG_UINT16(0xb4), // pushi $b4 (180) + 0x34, SIG_UINT16(0xb4), // ldi $b4 (180) 0x65, 0x20, // aTop ticks - 0x32, SIG_UINT16(0x5e), // jmp to ret + 0x32, SIG_UINT16(0x5e), // jmp [to ret] SIG_END }; static const uint16 pq4FloppyCityHallTellEnemyDropWeaponTimerPatch[] = { - 0x34, PATCH_UINT16(0x05), // pushi 5 (180t/3s -> 5s) + 0x34, PATCH_UINT16(0x05), // ldi 5 (180t/3s -> 5s) 0x65, 0x1c, // aTop seconds PATCH_END }; @@ -6713,50 +6716,51 @@ static const uint16 pq4FloppyCityHallTellEnemyDropWeaponTimerPatch[] = { static const uint16 pq4FloppyCityHallTellEnemyTurnAroundTimerSignature[] = { SIG_MAGICDWORD, 0x4a, SIG_UINT16(0x04), // send 4 - 0x35, 0x78, // pushi $78 (120) + 0x35, 0x78, // ldi $78 (120) 0x65, 0x20, // aTop ticks SIG_END }; static const uint16 pq4FloppyCityHallTellEnemyTurnAroundTimerPatch[] = { PATCH_ADDTOOFFSET(+3), // send 4 - 0x35, 0x03, // pushi 3 (120t/2s -> 3s) + 0x35, 0x03, // ldi 3 (120t/2s -> 3s) 0x65, 0x1c, // aTop seconds PATCH_END }; static const uint16 pq4FloppyCityHallCuffEnemyTimerSignature[] = { SIG_MAGICDWORD, - 0x34, SIG_UINT16(0x258), // pushi $258 (600) - 0x65, 0x20, // aTop ticks + 0x34, SIG_UINT16(0x0258), // ldi $258 (600) + 0x65, 0x20, // aTop ticks SIG_ADDTOOFFSET(+3), - 0x34, SIG_UINT16(0x1a4), // pushi $1a4 (420) - 0x65, 0x20, // aTop ticks + 0x34, SIG_UINT16(0x01a4), // ldi $1a4 (420) + 0x65, 0x20, // aTop ticks SIG_END }; static const uint16 pq4FloppyCityHallCuffEnemyTimerPatch[] = { - 0x34, PATCH_UINT16(0x0a), // pushi 10 (600t/10s) + 0x34, PATCH_UINT16(0x0a), // ldi 10 (600t/10s) 0x65, 0x1c, // aTop seconds PATCH_ADDTOOFFSET(+3), - 0x34, SIG_UINT16(0x07), // pushi 7 (420t/7s) + 0x34, PATCH_UINT16(0x07), // ldi 7 (420t/7s) 0x65, 0x1c, // aTop seconds PATCH_END }; // The end game action sequence also uses ticks instead of seconds. See the // description of city hall action sequence issues for more information. +// // Applies to at least: English Floppy, German floppy, English CD // Responsible method: comeInLast::changeState(11) static const uint16 pq4LastActionHeroTimerSignature[] = { SIG_MAGICDWORD, - 0x34, SIG_UINT16(0x12c), // pushi $12c (300) + 0x34, SIG_UINT16(0x012c), // ldi $12c (300) 0x65, SIG_ADDTOOFFSET(+1), // aTop ticks ($20 for floppy, $22 for CD) SIG_END }; static const uint16 pq4LastActionHeroTimerPatch[] = { - 0x34, PATCH_UINT16(0x05), // pushi 5 (300t/5s) + 0x34, PATCH_UINT16(0x0005), // ldi 5 (300t/5s) 0x65, PATCH_GETORIGINALBYTEADJUST(4, -4), // aTop seconds PATCH_END }; @@ -6785,17 +6789,18 @@ static const SciScriptPatcherEntry pq4Signatures[] = { // master sound volume to 127, but the game should always use the volume stored // in ScummVM. // Applies to at least: English CD +// Fixes bug: #9700 static const uint16 pqSwatVolumeResetSignature[] = { SIG_MAGICDWORD, 0x38, SIG_SELECTOR16(masterVolume), // pushi masterVolume 0x78, // push1 - 0x39, 0x7f, // push $7f - 0x54, SIG_UINT16(0x06), // self 6 + 0x39, 0x7f, // pushi $7f + 0x54, SIG_UINT16(0x0006), // self 6 SIG_END }; static const uint16 pqSwatVolumeResetPatch[] = { - 0x32, PATCH_UINT16(6), // jmp 6 [past volume reset] + 0x32, PATCH_UINT16(0x0006), // jmp 6 [past volume reset] PATCH_END }; |