diff options
author | Martin Kiewitz | 2010-08-24 22:24:25 +0000 |
---|---|---|
committer | Martin Kiewitz | 2010-08-24 22:24:25 +0000 |
commit | 9ca51656060345ecc2fe2e5248d02e64ce8bbfc6 (patch) | |
tree | 42d28d7e9a9328d7ba7b281ac52cdcd0bf437ac1 | |
parent | 4a6553098f65a72418966f7306efc249a836e3e3 (diff) | |
download | scummvm-rg350-9ca51656060345ecc2fe2e5248d02e64ce8bbfc6.tar.gz scummvm-rg350-9ca51656060345ecc2fe2e5248d02e64ce8bbfc6.tar.bz2 scummvm-rg350-9ca51656060345ecc2fe2e5248d02e64ce8bbfc6.zip |
SCI: adding pharkas patch for ladder issue
in room 320, fixes bug #3037192
svn-id: r52362
-rw-r--r-- | engines/sci/engine/script_patches.cpp | 90 |
1 files changed, 68 insertions, 22 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 640a2ff344..3c2872559f 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -76,7 +76,7 @@ const byte ecoquest1SignatureStayAndHelp[] = { 0x78, // push1 0x76, // push0 0x81, 0x00, // lag global[0] - 0x4a, 0x06, // send 06 - ego::setMotion(0) + 0x4a, 0x06, // send 06 - call ego::setMotion(0) 0x39, 0x6e, // pushi 6e (selector init) 0x39, 0x04, // pushi 04 0x76, // push0 @@ -84,7 +84,7 @@ const byte ecoquest1SignatureStayAndHelp[] = { 0x39, 0x17, // pushi 17 0x7c, // pushSelf 0x51, 0x82, // class EcoNarrator - 0x4a, 0x0c, // send 0c - EcoNarrator::init(0, 0, 23, self) (BADLY BROKEN!) + 0x4a, 0x0c, // send 0c - call EcoNarrator::init(0, 0, 23, self) (BADLY BROKEN!) 0x33, // jmp [end] 0 }; @@ -100,7 +100,7 @@ const uint16 ecoquest1PatchStayAndHelp[] = { 0x78, // push1 0x76, // push0 0x81, 0x00, // lag global[0] - 0x4a, 0x06, // send 06 - ego::setMotion(0) + 0x4a, 0x06, // send 06 - call ego::setMotion(0) 0x39, 0x6e, // pushi 6e (selector init) 0x39, 0x06, // pushi 06 0x39, 0x02, // pushi 02 (additional 2 bytes) @@ -110,7 +110,7 @@ const uint16 ecoquest1PatchStayAndHelp[] = { 0x7c, // pushSelf 0x38, 0x80, 0x02, // pushi 280 (additional 3 bytes) 0x51, 0x82, // class EcoNarrator - 0x4a, 0x10, // send 10 - EcoNarrator::init(2, 0, 0, 23, self, 640) + 0x4a, 0x10, // send 10 - call EcoNarrator::init(2, 0, 0, 23, self, 640) PATCH_END }; @@ -182,6 +182,50 @@ const SciScriptSignature ecoquest2Signatures[] = { SCI_SIGNATUREENTRY_TERMINATOR }; +// =========================================================================== +// script 215 of freddy pharkas lowerLadder::doit and highLadder::doit actually +// process keyboard-presses when the ladder is on the screen in that room. +// They strangely also call kGetEvent. Because the main User::doit also calls +// kGetEvent, it's pure luck, where the event will hit. It's the same issue +// as in QfG1VGA and if you turn dos-box to max cycles, and click around for +// ego, sometimes clicks also won't get registered. Strangely it's not nearly +// as bad as in our sci, but these differences may be caused by timing. +// We just reuse the active event, thus removing the duplicate kGetEvent call. +const byte freddypharkasSignatureLadderEvent[] = { + 21, + 0x39, 0x6d, // pushi 6d (selector new) + 0x76, // push0 + 0x38, 0xf5, 0x00, // pushi f5 (selector curEvent) + 0x76, // push0 + 0x81, 0x50, // lag global[50] + 0x4a, 0x04, // send 04 - read User::curEvent + 0x4a, 0x04, // send 04 - call curEvent::new + 0xa5, 0x00, // sat temp[0] + 0x38, 0x94, 0x00, // pushi 94 (selector localize) + 0x76, // push0 + 0x4a, 0x04, // send 04 - call curEvent::localize + 0 +}; + +const uint16 freddypharkasPatchLadderEvent[] = { + 0x34, 0x00, 0x00, // ldi 0000 (waste 3 bytes, overwrites first 2 pushes) + PATCH_ADDTOOFFSET | +8, + 0xa5, 0x00, // sat temp[0] (waste 2 bytes, overwrites 2nd send) + PATCH_ADDTOOFFSET | +2, + 0x34, 0x00, 0x00, // ldi 0000 + 0x34, 0x00, 0x00, // ldi 0000 (waste 6 bytes, overwrites last 3 opcodes) + PATCH_END +}; + +// script, description, magic DWORD, adjust +const SciScriptSignature freddypharkasSignatures[] = { + // this is not a typo, both lowerLadder::doit and highLadder::doit have the same event code + { 320, "lower ladder event issue", PATCH_MAGICDWORD(0x6d, 0x76, 0x38, 0xf5), -1, freddypharkasSignatureLadderEvent, freddypharkasPatchLadderEvent }, + { 320, "high ladder event issue", PATCH_MAGICDWORD(0x6d, 0x76, 0x38, 0xf5), -1, freddypharkasSignatureLadderEvent, freddypharkasPatchLadderEvent }, + SCI_SIGNATUREENTRY_TERMINATOR +}; + +// =========================================================================== // daySixBeignet::changeState (4) is called when the cop goes out and sets cycles to 220. // this is not enough time to get to the door, so we patch that to 23 seconds const byte gk1SignatureDay6PoliceBeignet[] = { @@ -283,12 +327,12 @@ const SciScriptSignature gk1Signatures[] = { // 0x38, 0xa7, 0x00, // pushi 00a7 // 0x76, // push0 // 0x80, 0x29, 0x01, // lag 0129 -// 0x4a, 0x04, // send 04 (song::stop) +// 0x4a, 0x04, // send 04 - call song::stop // 0x39, 0x27, // pushi 27 // 0x78, // push1 // 0x8f, 0x01, // lsp 01 // 0x51, 0x54, // class 54 -// 0x4a, 0x06, // send 06 (PlaySong::play) +// 0x4a, 0x06, // send 06 - call PlaySong::play // 0x33, 0x09, // jmp 09 -> end of routine // 0x38, 0xaa, 0x00, // pushi 00aa // 0x76, // push0 @@ -303,12 +347,12 @@ const SciScriptSignature gk1Signatures[] = { // 0x38, 0x31, 0x01, // pushi 0131 (selector curEvent) // 0x76, // push0 // 0x80, 0x50, 0x00, // lag 0050 (global var 80h, "User") -// 0x4a, 0x04, // send 04 (read User::curEvent) +// 0x4a, 0x04, // send 04 - read User::curEvent // // 0x38, 0x93, 0x00, // pushi 0093 (selector port) // 0x78, // push1 // 0x76, // push0 -// 0x4a, 0x06, // send 06 (write 0 to that object::port) +// 0x4a, 0x06, // send 06 - write 0 to that object::port // 0x48, // ret // PATCH_END //}; @@ -335,12 +379,12 @@ const byte kq5SignatureCdHarpyVolume[] = { 0x38, 0x7b, 0x01, // pushi 017b 0x76, // push0 0x81, 0x01, // lag global[1] - 0x4a, 0x04, // send 04 (getting KQ5::masterVolume) + 0x4a, 0x04, // send 04 - read KQ5::masterVolume 0xa5, 0x03, // sat temp[3] (store volume in temp 3) 0x38, 0x7b, 0x01, // pushi 017b 0x76, // push0 0x81, 0x01, // lag global[1] - 0x4a, 0x04, // send 04 (getting KQ5::masterVolume) + 0x4a, 0x04, // send 04 - read KQ5::masterVolume 0x36, // push 0x35, 0x04, // ldi 04 0x20, // ge? (followed by bnt) @@ -361,7 +405,7 @@ const uint16 kq5PatchCdHarpyVolume[] = { 0x38, 0x7b, 0x01, // pushi 017b 0x76, // push0 0x81, 0x01, // lag global[1] - 0x4a, 0x04, // send 04 (getting KQ5::masterVolume) + 0x4a, 0x04, // send 04 - read KQ5::masterVolume 0xa5, 0x03, // sat temp[3] (store volume in temp 3) // saving 8 bytes due removing of duplicate code 0x39, 0x04, // pushi 04 (saving 1 byte due swapping) @@ -432,7 +476,7 @@ const SciScriptSignature larry6Signatures[] = { // is not in the room. We fix that. const byte laurabow2SignaturePaintingClosing[] = { 17, - 0x4a, 0x04, // send 04 (gets aHeimlich::room) + 0x4a, 0x04, // send 04 - read aHeimlich::room 0x36, // push 0x81, 0x0b, // lag global[11d] -> current room 0x1c, // ne? @@ -515,16 +559,16 @@ const byte qfg1vgaSignatureFightEvents[] = { 0x39, 0x6d, // pushi 6d (selector new) 0x76, // push0 0x51, 0x07, // class Event - 0x4a, 0x04, // send 04 (Event::new) + 0x4a, 0x04, // send 04 - call Event::new 0xa5, 0x00, // sat temp[0] 0x78, // push1 0x76, // push0 - 0x4a, 0x04, // send 04 (Event::x) + 0x4a, 0x04, // send 04 - read Event::x 0xa5, 0x03, // sat temp[3] 0x76, // push0 (selector y) 0x76, // push0 0x85, 0x00, // lat temp[0] - 0x4a, 0x04, // send 04 + 0x4a, 0x04, // send 04 - read Event::y 0x36, // push 0x35, 0x0a, // ldi 0a 0x04, // sub (poor mans localization) ;-) @@ -535,16 +579,16 @@ const uint16 qfg1vgaPatchFightEvents[] = { 0x38, 0x5a, 0x01, // pushi 15a (selector curEvent) 0x76, // push0 0x81, 0x50, // lag global[50] - 0x4a, 0x04, // send 04 (read User::curEvent) -> needs one byte more than previous code + 0x4a, 0x04, // send 04 - read User::curEvent -> needs one byte more than previous code 0xa5, 0x00, // sat temp[0] 0x78, // push1 0x76, // push0 - 0x4a, 0x04, // send 04 (Event::x) + 0x4a, 0x04, // send 04 - read Event::x 0xa5, 0x03, // sat temp[3] 0x76, // push0 (selector y) 0x76, // push0 0x85, 0x00, // lat temp[0] - 0x4a, 0x04, // send 04 + 0x4a, 0x04, // send 04 - read Event::y 0x39, 0x00, // pushi 00 0x02, // add (waste 3 bytes) - we don't need localization, User::doit has already done it PATCH_END @@ -602,8 +646,8 @@ const byte sq5SignatureScrubbing[] = { 0x39, 0x38, // pushi 38 (selector mover) 0x76, // push0 0x81, 0x00, // lag 00 - 0x4a, 0x04, // send 04 (read ego::mover) - 0x4a, 0x04, // send 04 (read ego::mover::x) + 0x4a, 0x04, // send 04 - read ego::mover + 0x4a, 0x04, // send 04 - read ego::mover::x 0x36, // push 0x34, 0xa0, 0x00, // ldi 00a0 0x1c, // ne? @@ -617,11 +661,11 @@ const uint16 sq5PatchScrubbing[] = { 0x39, 0x38, // pushi 38 (selector mover) 0x76, // push0 0x81, 0x00, // lag 00 - 0x4a, 0x04, // send 04 (read ego::mover) + 0x4a, 0x04, // send 04 - read ego::mover 0x31, 0x2e, // bnt 2e (jump if ego::mover is 0) 0x78, // push1 (selector x) 0x76, // push0 - 0x4a, 0x04, // send 04 (read ego::mover::x) + 0x4a, 0x04, // send 04 - read ego::mover::x 0x39, 0xa0, // pushi a0 (saving 2 bytes) 0x1c, // ne? PATCH_END @@ -698,6 +742,8 @@ void Script::matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uin signatureTable = ecoquest1Signatures; if (g_sci->getGameId() == GID_ECOQUEST2) signatureTable = ecoquest2Signatures; + if (g_sci->getGameId() == GID_FREDDYPHARKAS) + signatureTable = freddypharkasSignatures; if (g_sci->getGameId() == GID_GK1) signatureTable = gk1Signatures; // hoyle4 now works due workaround inside GfxPorts |