aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Kiewitz2017-07-30 14:07:32 +0200
committerMartin Kiewitz2017-07-30 14:07:32 +0200
commit99f5a3dc04fd0f5dd5fb8fa976a2675dc59aca71 (patch)
tree9d8054463ff71a4f92b2802921df526007782a16
parent2c6b2532dd19d0ff268dc1c099f4bf18e86a42da (diff)
downloadscummvm-rg350-99f5a3dc04fd0f5dd5fb8fa976a2675dc59aca71.tar.gz
scummvm-rg350-99f5a3dc04fd0f5dd5fb8fa976a2675dc59aca71.tar.bz2
scummvm-rg350-99f5a3dc04fd0f5dd5fb8fa976a2675dc59aca71.zip
SCI32: Add script patch for PQ4 floppy computer issue
This fixes buggy PQ4 system script code and makes entering user and password on the police computer not trigger a signature mismatch anymore. Script code was fixed by Sierra in PQ4 CD.
-rw-r--r--engines/sci/engine/script_patches.cpp51
1 files changed, 47 insertions, 4 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index 2f382f4e01..a95070ff37 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -284,9 +284,51 @@ static const uint16 sci2VolumeResetPatch[] = {
PATCH_END
};
+// At least Gabriel Knight 1 and Police Quest 4 floppy have a broken Str::strip inside script 64918.
+// The code never passes over the actual string to kStringTrim, so that would not work and also trigger
+// a signature mismatch.
+// Localized version of Police Quest 4 were also affected.
+// Gabriel Knight although affected doesn't seem to ever call the code, so there is no reason to patch it.
+// Police Quest 4 CD got this fixed.
+static const uint16 sci2BrokenStrStripSignature[] = {
+ SIG_MAGICDWORD,
+ 0x85, 0x06, // lat temp[6]
+ 0x31, 0x10, // bnt [jump to code that passes 2 parameters]
+ 0x38, SIG_UINT16(0x00c2), // pushi 00c2 (callKernel)
+ 0x38, SIG_UINT16(3), // pushi 03
+ 0x39, 0x0e, // pushi 0e
+ 0x8d, 0x0b, // lst temp[0b]
+ 0x36, // push
+ 0x54, SIG_UINT16(0x000a), // self 0a
+ 0x33, 0x0b, // jmp to [ret]
+ // 2 parameter code
+ 0x38, SIG_UINT16(0x00c2), // pushi 00c2
+ 0x7a, // push2
+ 0x39, 0x0e, // pushi 0e
+ 0x8d, 0x0b, // lst temp[0b]
+ 0x54, SIG_UINT16(0x0008), // self 08
+ SIG_END
+};
+
+static const uint16 sci2BrokenStrStripPatch[] = {
+ PATCH_ADDTOOFFSET(+2),
+ 0x85, 0x06, // lat temp[6] (once more]
+ PATCH_ADDTOOFFSET(+3), // jump over pushi callKernel
+ 0x39, 0x04, // pushi 04
+ 0x39, 0x0e, // pushi 0e
+ // Attention: data is 0x14 in PQ4 CD, in floppy it's 0x12
+ 0x67, 0x12, // pTos data (pass actual data)
+ 0x8d, 0x0b, // lst temp[0b]
+ 0x36, // push
+ 0x54, PATCH_UINT16(0x000c), // self 0c
+ 0x48, // ret
+ PATCH_END
+};
+
+
// Torin/LSL7-specific version of sci2NumSavesSignature1/2
// Applies to at least: English CD
-static const uint16 torinNumSavesSignature[] = {
+static const uint16 torinLarry7NumSavesSignature[] = {
SIG_MAGICDWORD,
0x36, // push
0x35, 0x14, // ldi 20
@@ -294,7 +336,7 @@ static const uint16 torinNumSavesSignature[] = {
SIG_END
};
-static const uint16 torinNumSavesPatch[] = {
+static const uint16 torinLarry7NumSavesPatch[] = {
PATCH_ADDTOOFFSET(+1), // push
0x35, 0x63, // ldi 99
PATCH_END
@@ -2743,7 +2785,7 @@ static const SciScriptPatcherEntry larry7Signatures[] = {
{ true, 540, "fix make cheese cutscene (priority)", 1, larry7SignatureMakeCheesePriority, larry7PatchMakeCheesePriority },
{ true, 64000, "disable volume reset on startup 1/2", 1, larry7VolumeResetSignature1, larry7VolumeResetPatch1 },
{ true, 64000, "disable volume reset on startup 2/2", 1, larry7VolumeResetSignature2, larry7VolumeResetPatch2 },
- { true, 64866, "increase number of save games", 1, torinNumSavesSignature, torinNumSavesPatch },
+ { true, 64866, "increase number of save games", 1, torinLarry7NumSavesSignature, torinLarry7NumSavesPatch },
SCI_SIGNATUREENTRY_TERMINATOR
};
@@ -4035,6 +4077,7 @@ static const SciScriptPatcherEntry pq3Signatures[] = {
// script, description, signature patch
static const SciScriptPatcherEntry pq4Signatures[] = {
+ { true, 64918, "Str::strip fix for floppy version", 1, sci2BrokenStrStripSignature, sci2BrokenStrStripPatch },
{ true, 64908, "disable video benchmarking", 1, sci2BenchmarkSignature, sci2BenchmarkPatch },
{ true, 64990, "increase number of save games", 1, sci2NumSavesSignature1, sci2NumSavesPatch1 },
{ true, 64990, "increase number of save games", 1, sci2NumSavesSignature2, sci2NumSavesPatch2 },
@@ -6042,7 +6085,7 @@ static const SciScriptPatcherEntry torinSignatures[] = {
{ 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 },
+ { true, 64866, "increase number of save games", 1, torinLarry7NumSavesSignature, torinLarry7NumSavesPatch },
SCI_SIGNATUREENTRY_TERMINATOR
};