diff options
author | sluicebox | 2018-11-04 14:07:24 -0800 |
---|---|---|
committer | Filippos Karapetis | 2018-11-05 00:07:24 +0200 |
commit | 4929104dbe94490ca94d380fa0cbc68a7c5f774b (patch) | |
tree | 040fa55f308f2d73bceb87f4701c95fe7e9d5991 /engines | |
parent | d46e0d8ab0d93102cea0d3573e54e8bfa00fcffe (diff) | |
download | scummvm-rg350-4929104dbe94490ca94d380fa0cbc68a7c5f774b.tar.gz scummvm-rg350-4929104dbe94490ca94d380fa0cbc68a7c5f774b.tar.bz2 scummvm-rg350-4929104dbe94490ca94d380fa0cbc68a7c5f774b.zip |
SCI32: Fix GK1 ego flicker in Gran's chair (#1369)
Fixes graphics glitch in the original game, bug #9760
Diffstat (limited to 'engines')
-rw-r--r-- | engines/sci/engine/script_patches.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 20d7763fb5..1f21a086c8 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -1692,6 +1692,69 @@ static const uint16 gk1SysLoggerHotKeyPatch[] = { PATCH_END }; +// After interrogating Gran in room 380, clicking on objects while seated +// causes Gabriel to briefly flicker into standing and other frames. +// This is a script bug that also occurs with Sierra's interpreter. +// +// Ego is initialized incorrectly by rm380:init when returning from interrogation +// (room 50). Several properties are wrong and it's bad luck that it works as +// well as it does or Sierra would have noticed. For comparison, the scripts +// egoEnters and sitDown do it correctly. rm380:init first initializes ego for +// walking and then applies only some of the properties for sitting in the chair. +// +// This leaves ego in a walking/sitting state with several problems: +// - signal flag kSignalDoesntTurn isn't set +// - cycler is set to StopWalk instead of none +// - loop/cel is set to 2 0 instead of 0 5 +// +// rm380:init sets ego's loop/cel to 0 5 (Gabriel sitting) but the unexpected +// StopWalk immediately changes this to 2 0 (Gabriel starts talking) which went +// unnoticed because those two frames are similar. This is why Gabriel's hand +// is slightly raised when returning from interrogation. The flickering is due +// to ego attempting to turn to face items while sitting due to kSignalDoesntTurn +// not being set. +// +// We fix the flickering by passing a second parameter to GKEgo:setLoop which +// causes kSignalDoesntTurn to be set, preventing ego from attempting to face +// objects being clicked, just as egoEnters and sitDown do. +// +// Applies to: All PC Floppy and CD versions. TODO: Test Mac, should apply +// Responsible method: rm380:init +// Fixes bug #9760 +static const uint16 gk1GranChairFlickerSignature[] = { + 0x78, // push1 + 0x76, // push0 [ loop: 0 ] + 0x38, SIG_SELECTOR16(init), // pushi init + 0x76, // push0 + 0x38, SIG_SELECTOR16(posn), // pushi posn + SIG_MAGICDWORD, + 0x7a, // push2 + 0x38, SIG_UINT16(0x00af), // pushi 00af + 0x39, 0x75, // pushi 75 + 0x81, 0x00, // lag 0 + 0x4a, SIG_UINT16(0x001e), // send 1e [ GKEgo: ... setLoop: 0 ... ] + 0x35, 0x01, // ldi 1 + 0xa3, 0x00, // sal local0 + SIG_END +}; + +static const uint16 gk1GranChairFlickerPatch[] = { + 0x7a, // push2 + 0x76, // push0 [ loop: 0 ] + 0x78, // push1 [ 2nd param tells setLoop to set kSignalDoesntTurn ] + 0x38, PATCH_SELECTOR16(init), // pushi init + 0x76, // push0 + 0x38, PATCH_SELECTOR16(posn), // pushi posn + 0x7a, // push2 + 0x38, PATCH_UINT16(0x00af), // pushi 00af + 0x39, 0x75, // pushi 75 + 0x81, 0x00, // lag 0 + 0x4a, PATCH_UINT16(0x0020), // send 20 [ GKEgo: ... setLoop: 0 1 ... ] + 0x78, // push1 [ save a byte ] + 0xab, 0x00, // ssl local0 + PATCH_END +}; + // script, description, signature patch static const SciScriptPatcherEntry gk1Signatures[] = { { true, 0, "remove alt+n syslogger hotkey", 1, gk1SysLoggerHotKeySignature, gk1SysLoggerHotKeyPatch }, @@ -1707,6 +1770,7 @@ static const SciScriptPatcherEntry gk1Signatures[] = { { true, 250, "fix ego speed when exiting drug store", 1, gk1DrugStoreEgoSpeedFixSignature, gk1DrugStoreEgoSpeedFixPatch }, { true, 280, "fix pathfinding in Madame Cazanoux's house", 1, gk1CazanouxPathfindingSignature, gk1CazanouxPathfindingPatch }, { true, 290, "fix magentia missing message", 1, gk1ShowMagentiaItemSignature, gk1ShowMagentiaItemPatch }, + { true, 380, "fix ego flicker in Gran's chair", 1, gk1GranChairFlickerSignature, gk1GranChairFlickerPatch }, { true, 710, "fix day 9 vine swing speech playing", 1, gk1Day9VineSwingSignature, gk1Day9VineSwingPatch }, { true, 800, "fix day 10 honfour unlock door lockup", 1, gk1HonfourUnlockDoorSignature, gk1HonfourUnlockDoorPatch }, { true, 64908, "disable video benchmarking", 1, sci2BenchmarkSignature, sci2BenchmarkPatch }, |