[Scummvm-git-logs] scummvm master -> 5a4840ee55fe141cd44ed4d3eb7991bd8adb6ccd

m-kiewitz m_kiewitz at users.sourceforge.net
Sun Aug 6 21:09:13 CEST 2017


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
5a4840ee55 SCI32: Add script patches for action sequences in city hall


Commit: 5a4840ee55fe141cd44ed4d3eb7991bd8adb6ccd
    https://github.com/scummvm/scummvm/commit/5a4840ee55fe141cd44ed4d3eb7991bd8adb6ccd
Author: Martin Kiewitz (m_kiewitz at users.sourceforge.net)
Date: 2017-08-06T21:09:07+02:00

Commit Message:
SCI32: Add script patches for action sequences in city hall

Changed paths:
    engines/sci/engine/script_patches.cpp


diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index 9ff628e..5e85c39 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -4092,13 +4092,105 @@ static const SciScriptPatcherEntry pq3Signatures[] = {
 #pragma mark -
 #pragma mark Police Quest 4
 
-//          script, description,                                      signature                         patch
+// In Police Quest 4 scripts for room 390 (city hall) use ticks instead of seconds.
+// Ticks are not behaving the same as seconds. Ticks will also go down within game menus including inventory.
+// When getting attacked, the player has almost no time to draw the gun - and even when the player has the gun
+// equipped in advance, afterwards the attacker needs to get cuffed. Which means selecting the cuffs inside
+// the inventory.
+// It's not obvious that this sequence doesn't stop time while inside game menus, which is why the player
+// may think it's a bug when the player is literally instantly attacked and killed after returning from inventory.
+//
+// Another action-sequence right before that uses ::seconds (woman, who attacks ego with a knife).
+//
+// That's why we change all occurrences of ::ticks to ::seconds and also adjust the values accordingly.
+//
+// This is not a perfect solution. The game system will decrease ::seconds by 1 after entering+exiting the game menu,
+// that's why I raised some of the timers for 1 or 2 seconds. A better solution would be to make it so game system
+// won't decrease ticks/seconds after returning from the game menu. That could of course break things, but should be investigated.
+//
+// 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
+//
+// The code for the CD version was changed quite a bit, the selector for ticks also changed from 0x10 (so opcode-wise it's 0x20) to 0x11 (opcode-wise 0x22),
+// so additional signatures/patches will need to be added for CD version.
+//
+// metzAttack::changeState(2)
+static const uint16 pq4FloppyCityHallDrawGunTimerSignature[] = {
+	SIG_MAGICDWORD,
+	0x4a, SIG_UINT16(0x0008),           // send 08
+	0x32,                               // jmp [ret]
+	SIG_ADDTOOFFSET(+8),                // skip over some code
+	0x35, 0x78,                         // pushi 0078h (120)
+	0x65, 0x20,                         // aTop ticks
+	SIG_END
+};
+static const uint16 pq4FloppyCityHallDrawGunTimerPatch[] = {
+	PATCH_ADDTOOFFSET(12),
+	0x35, 0x05,                         // pushi 4
+	0x65, 0x1c,                         // aTop seconds - raise time from 2 seconds to 4 seconds
+	PATCH_END
+};
+// stickScr::changeState(0)
+static const uint16 pq4FloppyCityHallTellEnemyDropWeaponTimerSignature[] = {
+	SIG_MAGICDWORD,
+	0x34, SIG_UINT16(180),              // pushi 00B4h (180)
+	0x65, 0x20,                         // aTop ticks
+	0x32, SIG_UINT16(0x005e),           // jmp to ret
+	SIG_END
+};
+static const uint16 pq4FloppyCityHallTellEnemyDropWeaponTimerPatch[] = {
+	0x34, PATCH_UINT16(5),              // pushi 5
+	0x65, 0x1c,                         // aTop seconds - raise time from 3 seconds to 5 seconds
+	PATCH_END
+};
+// dropStick::changeState(5)
+static const uint16 pq4FloppyCityHallTellEnemyTurnAroundTimerSignature[] = {
+	SIG_MAGICDWORD,
+	0x4a, SIG_UINT16(0x0004),           // send 04
+	0x35, 0x78,                         // pushi 0078h (120)
+	0x65, 0x20,                         // aTop ticks
+	SIG_END
+};
+static const uint16 pq4FloppyCityHallTellEnemyTurnAroundTimerPatch[] = {
+	PATCH_ADDTOOFFSET(+3),
+	0x35, 0x03,                         // pushi 3
+	0x65, 0x1c,                         // aTop seconds - raise time from 2 seconds to 3 seconds
+	PATCH_END
+};
+// turnMetz::changeState(5)
+static const uint16 pq4FloppyCityHallCuffEnemyTimerSignature[] = {
+	SIG_MAGICDWORD,
+	0x34, SIG_UINT16(600),              // pushi 258h (600)
+	0x65, 0x20,                         // aTop ticks
+	SIG_ADDTOOFFSET(+3),
+	0x34, SIG_UINT16(420),              // pushi 1A4h (420)
+	0x65, 0x20,                         // aTop ticks
+	SIG_END
+};
+static const uint16 pq4FloppyCityHallCuffEnemyTimerPatch[] = {
+	0x34, PATCH_UINT16(10),             // pushi 10
+	0x65, 0x1c,                         // aTop seconds - time is 10 seconds
+	PATCH_ADDTOOFFSET(+3),
+	0x34, SIG_UINT16(7),                // pushi 7
+	0x65, 0x1c,                         // aTop seconds - time is 7 seconds
+	PATCH_END
+};
+
+//          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 },
-	{  true, 64990, "disable change directory button",             1, sci2ChangeDirSignature,           sci2ChangeDirPatch },
+	{  true,   390, "floppy: city hall: draw gun timer",               1, pq4FloppyCityHallDrawGunTimerSignature,             pq4FloppyCityHallDrawGunTimerPatch },
+	{  true,   390, "floppy: city hall: tell enemy drop weapon timer", 1, pq4FloppyCityHallTellEnemyDropWeaponTimerSignature, pq4FloppyCityHallTellEnemyDropWeaponTimerPatch },
+	{  true,   390, "floppy: city hall: tell enemy turn around timer", 1, pq4FloppyCityHallTellEnemyTurnAroundTimerSignature, pq4FloppyCityHallTellEnemyTurnAroundTimerPatch },
+	{  true,   390, "floppy: city hall: cuff enemy timer",             1, pq4FloppyCityHallCuffEnemyTimerSignature,           pq4FloppyCityHallCuffEnemyTimerPatch },
+	{  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 },
+	{  true, 64990, "disable change directory button",                 1, sci2ChangeDirSignature,                             sci2ChangeDirPatch },
 	SCI_SIGNATUREENTRY_TERMINATOR
 };
 





More information about the Scummvm-git-logs mailing list