diff options
| author | Martin Kiewitz | 2010-08-24 21:53:06 +0000 | 
|---|---|---|
| committer | Martin Kiewitz | 2010-08-24 21:53:06 +0000 | 
| commit | 4a6553098f65a72418966f7306efc249a836e3e3 (patch) | |
| tree | e11bed2297d2c939e4f86acfe82033c6746425ef | |
| parent | eface88e31f46331537d4d9b8942076eee9ce6c3 (diff) | |
| download | scummvm-rg350-4a6553098f65a72418966f7306efc249a836e3e3.tar.gz scummvm-rg350-4a6553098f65a72418966f7306efc249a836e3e3.tar.bz2 scummvm-rg350-4a6553098f65a72418966f7306efc249a836e3e3.zip | |
SCI: adding qfg1vga patch for fight issue
fixes bug #3036756
svn-id: r52361
| -rw-r--r-- | engines/sci/engine/script_patches.cpp | 77 | 
1 files changed, 68 insertions, 9 deletions
| diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 1e1f389e73..640a2ff344 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -45,6 +45,8 @@ struct SciScriptSignature {  	const uint16 *patch;  }; +#define SCI_SIGNATUREENTRY_TERMINATOR { 0, NULL, 0, 0, NULL, NULL } +  // signatures are built like this:  //  - first a counter of the bytes that follow  //  - then the actual bytes that need to get matched @@ -115,7 +117,7 @@ const uint16 ecoquest1PatchStayAndHelp[] = {  //    script, description,                                   magic DWORD,                                 adjust  const SciScriptSignature ecoquest1Signatures[] = {      {    660, "CD: bad messagebox and freeze",               PATCH_MAGICDWORD(0x38, 0x22, 0x01, 0x78),   -17, ecoquest1SignatureStayAndHelp, ecoquest1PatchStayAndHelp }, -    {      0, NULL,                                          0,                                            0, NULL,                          NULL } +    SCI_SIGNATUREENTRY_TERMINATOR  };  // =========================================================================== @@ -177,7 +179,7 @@ const uint16 ecoquest2PatchEcorder[] = {  //    script, description,                                   magic DWORD,                                 adjust  const SciScriptSignature ecoquest2Signatures[] = {      {     50, "initial text not removed on ecorder",         PATCH_MAGICDWORD(0x39, 0x64, 0x39, 0x7d),    -8, ecoquest2SignatureEcorder, ecoquest2PatchEcorder }, -    {      0, NULL,                                          0,                                            0, NULL,                          NULL } +    SCI_SIGNATUREENTRY_TERMINATOR  };  // daySixBeignet::changeState (4) is called when the cop goes out and sets cycles to 220. @@ -250,7 +252,7 @@ const SciScriptSignature gk1Signatures[] = {      {    212, "day 5 phone freeze",                          PATCH_MAGICDWORD(0x35, 0x03, 0x65, 0x1a),     0, gk1SignatureDay5PhoneFreeze, gk1PatchDay5PhoneFreeze },      {    230, "day 6 police beignet timer issue",            PATCH_MAGICDWORD(0x34, 0xdc, 0x00, 0x65),   -16, gk1SignatureDay6PoliceBeignet, gk1PatchDay6PoliceBeignet },      {    230, "day 6 police sleep timer issue",              PATCH_MAGICDWORD(0x34, 0xdc, 0x00, 0x65),    -5, gk1SignatureDay6PoliceSleep, gk1PatchDay6PoliceSleep }, -    {      0, NULL,                                          0,                                            0, NULL,                          NULL } +    SCI_SIGNATUREENTRY_TERMINATOR  };  // =========================================================================== @@ -370,7 +372,7 @@ const uint16 kq5PatchCdHarpyVolume[] = {  //    script, description,                                   magic DWORD,                                 adjust  const SciScriptSignature kq5Signatures[] = {      {      0, "CD: harpy volume change",                     PATCH_MAGICDWORD(0x80, 0x91, 0x01, 0x18),     0, kq5SignatureCdHarpyVolume, kq5PatchCdHarpyVolume }, -    {      0, NULL,                                          0,                                            0, NULL,                      NULL } +    SCI_SIGNATUREENTRY_TERMINATOR  };  // =========================================================================== @@ -421,7 +423,7 @@ const uint16 larry6PatchDeathDialog[] = {  //    script, description,                                   magic DWORD,                                  adjust  const SciScriptSignature larry6Signatures[] = {      {     82, "death dialog memory corruption",              PATCH_MAGICDWORD(0x3e, 0x33, 0x01, 0x35),     0, larry6SignatureDeathDialog, larry6PatchDeathDialog }, -    {      0, NULL,                                          0,                                            0, NULL,                       NULL } +    SCI_SIGNATUREENTRY_TERMINATOR  };  // =========================================================================== @@ -452,7 +454,7 @@ const uint16 laurabow2PatchPaintingClosing[] = {  //    script, description,                                   magic DWORD,                                  adjust  const SciScriptSignature laurabow2Signatures[] = {      {    560, "painting closing immediately",                PATCH_MAGICDWORD(0x36, 0x81, 0x0b, 0x1c),    -2, laurabow2SignaturePaintingClosing, laurabow2PatchPaintingClosing }, -    {      0, NULL,                                          0,                                            0, NULL,                              NULL } +    SCI_SIGNATUREENTRY_TERMINATOR  };  // =========================================================================== @@ -496,7 +498,62 @@ const SciScriptSignature mothergoose256Signatures[] = {      {      0, "replay save issue",                           PATCH_MAGICDWORD(0x20, 0x04, 0xa1, 0xb3),    -2, mothergoose256SignatureReplay,    mothergoose256PatchReplay },      {      0, "save limit dialog (SCI1.1)",                  PATCH_MAGICDWORD(0xb3, 0x35, 0x0d, 0x20),    -1, mothergoose256SignatureSaveLimit, mothergoose256PatchSaveLimit },      {    994, "save limit dialog (SCI1)",                    PATCH_MAGICDWORD(0xb3, 0x35, 0x0d, 0x20),    -1, mothergoose256SignatureSaveLimit, mothergoose256PatchSaveLimit }, -    {      0, NULL,                                          0,                                            0, NULL,                             NULL } +    SCI_SIGNATUREENTRY_TERMINATOR +}; + +// =========================================================================== +//  script 215 of qfg1vga pointBox::doit actually processes button-presses +//   during fighting with monsters. It strangely also calls 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 freddy pharkas and if you turn dos-box +//   to max cycles, 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 qfg1vgaSignatureFightEvents[] = { +	25, +	0x39, 0x6d,       // pushi 6d (selector new) +	0x76,             // push0 +	0x51, 0x07,       // class Event +	0x4a, 0x04,       // send 04 (Event::new) +	0xa5, 0x00,       // sat temp[0] +	0x78,             // push1 +	0x76,             // push0 +	0x4a, 0x04,       // send 04 (Event::x) +	0xa5, 0x03,       // sat temp[3] +	0x76,             // push0 (selector y) +	0x76,             // push0 +	0x85, 0x00,       // lat temp[0] +	0x4a, 0x04,       // send 04 +	0x36,             // push +	0x35, 0x0a,       // ldi 0a +	0x04,             // sub (poor mans localization) ;-) +	0 +}; + +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 +	0xa5, 0x00,       // sat temp[0] +	0x78,             // push1 +	0x76,             // push0 +	0x4a, 0x04,       // send 04 (Event::x) +	0xa5, 0x03,       // sat temp[3] +	0x76,             // push0 (selector y) +	0x76,             // push0 +	0x85, 0x00,       // lat temp[0] +	0x4a, 0x04,       // send 04 +	0x39, 0x00,       // pushi 00 +	0x02,             // add (waste 3 bytes) - we don't need localization, User::doit has already done it +	PATCH_END +}; + +//    script, description,                                   magic DWORD,                                  adjust +const SciScriptSignature qfg1vgaSignatures[] = { +    {    215, "fight event issue",                           PATCH_MAGICDWORD(0x6d, 0x76, 0x51, 0x07),    -1, qfg1vgaSignatureFightEvents, qfg1vgaPatchFightEvents }, +    SCI_SIGNATUREENTRY_TERMINATOR  };  // =========================================================================== @@ -525,7 +582,7 @@ const uint16 sq4FloppyPatchEndlessFlight[] = {  //    script, description,                                   magic DWORD,                                  adjust  const SciScriptSignature sq4Signatures[] = {      {    298, "Floppy: endless flight",                      PATCH_MAGICDWORD(0x67, 0x08, 0x63, 0x44),    -3, sq4FloppySignatureEndlessFlight, sq4FloppyPatchEndlessFlight }, -    {      0, NULL,                                          0,                                            0, NULL,                            NULL } +    SCI_SIGNATUREENTRY_TERMINATOR  };  // =========================================================================== @@ -573,7 +630,7 @@ const uint16 sq5PatchScrubbing[] = {  //    script, description,                                   magic DWORD,                                  adjust  const SciScriptSignature sq5Signatures[] = {      {    119, "scrubbing send crash",                        PATCH_MAGICDWORD(0x18, 0x31, 0x37, 0x78),     0, sq5SignatureScrubbing, sq5PatchScrubbing }, -    {      0, NULL,                                          0,                                            0, NULL,                  NULL } +    SCI_SIGNATUREENTRY_TERMINATOR  }; @@ -654,6 +711,8 @@ void Script::matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uin  		signatureTable = larry6Signatures;  	if (g_sci->getGameId() == GID_MOTHERGOOSE256)  		signatureTable = mothergoose256Signatures; +	if (g_sci->getGameId() == GID_QFG1VGA) +		signatureTable = qfg1vgaSignatures;  	if (g_sci->getGameId() == GID_SQ4)  		signatureTable = sq4Signatures;  	if (g_sci->getGameId() == GID_SQ5) | 
