Permalink
Browse files

SCI32: Add script patch for Bitty Kitty / Barbie game glitch

Fixes bug #9849
Which is a pseudo-game-breaking glitch of the game itself.
Applies to at least English+German floppy and English CD version.
  • Loading branch information...
m-kiewitz committed Aug 6, 2017
1 parent c55e83e commit 4d7d7698eb83d60d185d6ed693d1cdfe0a3978de
Showing with 47 additions and 0 deletions.
  1. +47 −0 engines/sci/engine/script_patches.cpp
@@ -4092,6 +4092,52 @@ static const SciScriptPatcherEntry pq3Signatures[] = {
#pragma mark - #pragma mark -
#pragma mark Police Quest 4 #pragma mark Police Quest 4
// In Police Quest 4 inside the Bitty Kitty show (room 315), the player has to first talk with a young woman, show her the police badge, then
// show her the red shoe. She will tell the player that may "Barbie" knows more.
// After leaving and entering later (not detailed here), Barbie will be available.
// Now the player needs to show her the police badge as well and then it goes a bit weird.
//
// The player can show her the red shoe immediately, which will work dialog-wise, but points won't be awarded and the corresponding flag will also not get set.
// Internally the game checks if some regular talking dialog (for Barbie) has been accessed before awarding the points and setting the flags.
// When the player does not recognize this, the player may get stuck and it will look as if a game breaking glitch has happened.
//
// Showing the red shoe to the young woman AND showing it to Barbie is all done using the same script.
// It works via shoeShoe::changeState.
//
// The code in there of state 0 checks first who is currently inside the room using stripper::noun.
// Afterwards for the young woman it checks local 3 if it's zero or not zero.
// Local 3 is set, when the player has shown the police badge to the person, that is currently inside the room.
//
// For Barbie strangely global 9Ah is checked instead, which then causes those issues.
//
// We change the Barbie code to also check local 3, which seems to work out.
// We can't simply remove the check, otherwise the flag will get set even when the player
// hasn't shown the badge, which will cause Barbie to not answer the question and the player
// won't be able to show her the shoe a second time.
//
// This of course also happened, when using the original interpreter.
//
// Applies to at least: English floppy, German floppy, English CD
// Responsible method: showShoe::changeState(0) - script 315
// Fixes bug: #9849
static const uint16 pq4BittyKittyShowBarieRedShoeSignature[] = {
// stripper::noun check is for checking, if police badge was shown
SIG_MAGICDWORD,
0x89, 0x9a, // lsg global[9Ah]
0x35, 0x02, // ldi 02
0x1e, // gt?
0x30, SIG_UINT16(0x0028), // bnt [skip 2 points code]
0x39, 0x61, // pushi 61h (flag)
SIG_END
};
static const uint16 pq4BittyKittyShowBarbieRedShoePatch[] = {
0x83, 0x03, // lal local[3]
0x30, PATCH_UINT16(0x002b), // bnt [skip 2 points code]
0x33, 1, // jmp 1 (waste some bytes)
PATCH_END
};
// In Police Quest 4 scripts for room 390 (city hall) use ticks instead of seconds. // 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. // 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 // When getting attacked, the player has almost no time to draw the gun - and even when the player has the gun
@@ -4182,6 +4228,7 @@ static const uint16 pq4FloppyCityHallCuffEnemyTimerPatch[] = {
// script, description, signature patch // script, description, signature patch
static const SciScriptPatcherEntry pq4Signatures[] = { static const SciScriptPatcherEntry pq4Signatures[] = {
{ true, 315, "show barbie the red shoe points fix", 1, pq4BittyKittyShowBarieRedShoeSignature, pq4BittyKittyShowBarbieRedShoePatch },
{ true, 390, "floppy: city hall: draw gun timer", 1, pq4FloppyCityHallDrawGunTimerSignature, pq4FloppyCityHallDrawGunTimerPatch }, { 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 drop weapon timer", 1, pq4FloppyCityHallTellEnemyDropWeaponTimerSignature, pq4FloppyCityHallTellEnemyDropWeaponTimerPatch },
{ true, 390, "floppy: city hall: tell enemy turn around timer", 1, pq4FloppyCityHallTellEnemyTurnAroundTimerSignature, pq4FloppyCityHallTellEnemyTurnAroundTimerPatch }, { true, 390, "floppy: city hall: tell enemy turn around timer", 1, pq4FloppyCityHallTellEnemyTurnAroundTimerSignature, pq4FloppyCityHallTellEnemyTurnAroundTimerPatch },

0 comments on commit 4d7d769

Please sign in to comment.