diff options
author | Colin Snover | 2017-07-15 22:35:11 -0500 |
---|---|---|
committer | Colin Snover | 2017-07-15 22:53:39 -0500 |
commit | 8e0ccc5eb144a458d3e12cae24fa7970a7d9a749 (patch) | |
tree | e2cfc935b47971a21e57fe44b8c78839b6b4ffba /engines | |
parent | 222ef33fb6be0abbc21d89e4353ae30698e2ce21 (diff) | |
download | scummvm-rg350-8e0ccc5eb144a458d3e12cae24fa7970a7d9a749.tar.gz scummvm-rg350-8e0ccc5eb144a458d3e12cae24fa7970a7d9a749.tar.bz2 scummvm-rg350-8e0ccc5eb144a458d3e12cae24fa7970a7d9a749.zip |
SCI32: Add patch for mismatched PointSoft Torin heap 20700
Refs Trac#9776, Trac#9864. Fixes Trac#9797.
Diffstat (limited to 'engines')
-rw-r--r-- | engines/sci/engine/script_patches.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 04aecba95c..8c000dda74 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -5811,9 +5811,111 @@ static const uint16 torinSeraglioBoogleFlagPatch[] = { PATCH_END }; +// At least some French PointSoft releases of Torin's Passage managed to get +// released with script 20700 from the official Sierra TORINPAT patch and +// *unpatched* heap 20700. Worse, the selector table is not the same as the one +// in the US release, so it is not possible to just apply TORINPAT to the game +// (it will just explode later when mismatched selectors are used). So, here we +// are hot-patching all of the wrong offsets in the original heap to match the +// patched script. +// Applies to at least: French PointSoft CD release +static const uint16 torinPointSoft20700HeapSignature[] = { + 0xe1, 0x15, 0x23, 0x16, // end of patched 20700.SCR (so we don't + // accidentally patch the heap when it is correctly + // matched with an unpatched script) + SIG_ADDTOOFFSET(1), // padding byte added by Script::load + SIG_ADDTOOFFSET(0x1d2), // first bad offset in the heap is at 0x1d2 + SIG_MAGICDWORD, + SIG_UINT16(0xd8), + SIG_UINT16(0xd8), + SIG_ADDTOOFFSET(0x200 - 0x1d2 - 4), // second bad offset, etc. + SIG_UINT16(0xde), + SIG_UINT16(0xde), + SIG_ADDTOOFFSET(0x280 - 0x200 - 4), + SIG_UINT16(0xe0), + SIG_UINT16(0xe0), + SIG_ADDTOOFFSET(0x300 - 0x280 - 4), + SIG_UINT16(0xe2), + SIG_UINT16(0xe2), + SIG_ADDTOOFFSET(0x374 - 0x300 - 4), + SIG_UINT16(0xe4), + SIG_UINT16(0xe4), + SIG_ADDTOOFFSET(0x3ce - 0x374 - 4), + SIG_UINT16(0xee), + SIG_UINT16(0xee), + SIG_ADDTOOFFSET(0x44e - 0x3ce - 4), + SIG_UINT16(0xf0), + SIG_UINT16(0xf0), + SIG_ADDTOOFFSET(0x482 - 0x44e - 4), + SIG_UINT16(0xf6), + SIG_UINT16(0xf6), + SIG_ADDTOOFFSET(0x4b6 - 0x482 - 4), + SIG_UINT16(0xfc), + SIG_UINT16(0xfc), + SIG_ADDTOOFFSET(0x4ea - 0x4b6 - 4), + SIG_UINT16(0x106), + SIG_UINT16(0x106), + SIG_ADDTOOFFSET(0x51e - 0x4ea - 4), + SIG_UINT16(0x110), + SIG_UINT16(0x110), + SIG_ADDTOOFFSET(0x55c - 0x51e - 4), + SIG_UINT16(0x116), + SIG_UINT16(0x116), + SIG_ADDTOOFFSET(0x5a2 - 0x55c - 4), + SIG_UINT16(0x118), + SIG_UINT16(0x118), + SIG_END +}; + +static const uint16 torinPointSoft20700HeapPatch[] = { + PATCH_ADDTOOFFSET(4), // end of patched 20700.SCR + PATCH_ADDTOOFFSET(1), // padding byte + PATCH_ADDTOOFFSET(0x1d2), // first bad offset + PATCH_UINT16(0xdc), + PATCH_UINT16(0xdc), + PATCH_ADDTOOFFSET(0x200 - 0x1d2 - 4), // second bad offset, etc. + PATCH_UINT16(0xe6), + PATCH_UINT16(0xe6), + PATCH_ADDTOOFFSET(0x280 - 0x200 - 4), + PATCH_UINT16(0xe8), + PATCH_UINT16(0xe8), + PATCH_ADDTOOFFSET(0x300 - 0x280 - 4), + PATCH_UINT16(0xea), + PATCH_UINT16(0xea), + PATCH_ADDTOOFFSET(0x374 - 0x300 - 4), + PATCH_UINT16(0xec), + PATCH_UINT16(0xec), + PATCH_ADDTOOFFSET(0x3ce - 0x374 - 4), + PATCH_UINT16(0xf6), + PATCH_UINT16(0xf6), + PATCH_ADDTOOFFSET(0x44e - 0x3ce - 4), + PATCH_UINT16(0xf8), + PATCH_UINT16(0xf8), + PATCH_ADDTOOFFSET(0x482 - 0x44e - 4), + PATCH_UINT16(0xfe), + PATCH_UINT16(0xfe), + PATCH_ADDTOOFFSET(0x4b6 - 0x482 - 4), + PATCH_UINT16(0x104), + PATCH_UINT16(0x104), + PATCH_ADDTOOFFSET(0x4ea - 0x4b6 - 4), + PATCH_UINT16(0x10e), + PATCH_UINT16(0x10e), + PATCH_ADDTOOFFSET(0x51e - 0x4ea - 4), + PATCH_UINT16(0x118), + PATCH_UINT16(0x118), + PATCH_ADDTOOFFSET(0x55c - 0x51e - 4), + PATCH_UINT16(0x11e), + PATCH_UINT16(0x11e), + PATCH_ADDTOOFFSET(0x5a2 - 0x55c - 4), + PATCH_UINT16(0x120), + PATCH_UINT16(0x120), + PATCH_END +}; + // script, description, signature patch static const SciScriptPatcherEntry torinSignatures[] = { { true, 20600, "fix wrong boogle bag flag on fast-forward", 1, torinSeraglioBoogleFlagSignature, torinSeraglioBoogleFlagPatch }, + { true, 20700, "fix bad heap in PointSoft release", 1, torinPointSoft20700HeapSignature, torinPointSoft20700HeapPatch }, { true, 64000, "disable volume reset on startup 1/2", 1, torinVolumeResetSignature1, torinVolumeResetPatch1 }, { true, 64000, "disable volume reset on startup 2/2", 1, torinVolumeResetSignature2, torinVolumeResetPatch2 }, { true, 64866, "increase number of save games", 1, torinNumSavesSignature, torinNumSavesPatch }, |