aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine
diff options
context:
space:
mode:
authorsluicebox2019-03-17 18:22:36 -0700
committerFilippos Karapetis2019-03-19 06:07:59 +0200
commita398d363b17cea9362ca75895985ac97d7485ccd (patch)
treefcef97a7fa20712c41abc172ffab9fae68c1819a /engines/sci/engine
parenta4f92ce3460a47bd5c80ff444f3485e2c064ed61 (diff)
downloadscummvm-rg350-a398d363b17cea9362ca75895985ac97d7485ccd.tar.gz
scummvm-rg350-a398d363b17cea9362ca75895985ac97d7485ccd.tar.bz2
scummvm-rg350-a398d363b17cea9362ca75895985ac97d7485ccd.zip
SCI: Apply SQ4 timing workaround to non-VGA versions
Fixes bug #6193 by applying the SQ4 floppy kPaletteAnimation timing workaround from 99de89c974fc24bf58b034842750e522d7d441d4 to versions with less than 256 colors. This includes DOS EGA, PC-98, and Amiga. This also patches out the intro script's workaround that uses different timing in EGA mode, as this is incompatible with ours and makes the intro screen last over 3 minutes instead of 5 seconds.
Diffstat (limited to 'engines/sci/engine')
-rw-r--r--engines/sci/engine/kgraphics.cpp27
-rw-r--r--engines/sci/engine/script_patches.cpp25
2 files changed, 39 insertions, 13 deletions
diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp
index ee9212bd47..8e97716b96 100644
--- a/engines/sci/engine/kgraphics.cpp
+++ b/engines/sci/engine/kgraphics.cpp
@@ -646,18 +646,17 @@ reg_t kPaletteAnimate(EngineState *s, int argc, reg_t *argv) {
bool paletteChanged = false;
// Palette animation in non-VGA SCI1 games has been removed
- if (g_sci->_gfxPalette16->getTotalColorCount() < 256)
- return s->r_acc;
-
- for (argNr = 0; argNr < argc; argNr += 3) {
- uint16 fromColor = argv[argNr].toUint16();
- uint16 toColor = argv[argNr + 1].toUint16();
- int16 speed = argv[argNr + 2].toSint16();
- if (g_sci->_gfxPalette16->kernelAnimate(fromColor, toColor, speed))
- paletteChanged = true;
+ if (g_sci->_gfxPalette16->getTotalColorCount() == 256) {
+ for (argNr = 0; argNr < argc; argNr += 3) {
+ uint16 fromColor = argv[argNr].toUint16();
+ uint16 toColor = argv[argNr + 1].toUint16();
+ int16 speed = argv[argNr + 2].toSint16();
+ if (g_sci->_gfxPalette16->kernelAnimate(fromColor, toColor, speed))
+ paletteChanged = true;
+ }
+ if (paletteChanged)
+ g_sci->_gfxPalette16->kernelAnimateSet();
}
- if (paletteChanged)
- g_sci->_gfxPalette16->kernelAnimateSet();
// WORKAROUND: The game scripts in SQ4 floppy count the number of elapsed
// cycles in the intro from the number of successive kAnimate calls during
@@ -668,8 +667,10 @@ reg_t kPaletteAnimate(EngineState *s, int argc, reg_t *argv) {
// speed throttler gets called) between the different palette animation calls.
// Thus, we add a small delay between each animate call to make the whole
// palette animation effect slower and visible, and not have the logo screen
- // get skipped because the scripts don't wait between animation steps. Fixes
- // bug #3537232.
+ // get skipped because the scripts don't wait between animation steps. This
+ // workaround is applied to non-VGA versions as well because even though they
+ // don't use palette animation they still call this function and use it for
+ // timing. Fixes bugs #6057, #6193.
// The original workaround was for the intro SQ4 logo (room#1).
// This problem also happens in the time pod (room#531).
// This problem also happens in the ending cutscene time rip (room#21).
diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp
index 96515c9b06..87b67c734b 100644
--- a/engines/sci/engine/script_patches.cpp
+++ b/engines/sci/engine/script_patches.cpp
@@ -11092,6 +11092,30 @@ static const uint16 sq4CdPatchGettingShotWhileGettingRope[] = {
PATCH_END
};
+// During the SQ4 introduction logo, EGA versions increase the number of calls
+// to kPaletteAnimate by 40x. This was probably to achieve the same delay as
+// VGA even though no palette animation occurred. This adjustment interferes
+// with our kPaletteAnimate speed throttling for SQ4 scripts such as this, bug
+// #6057. We remove the EGA delay, making all versions consistent, otherwise
+// the logo is displayed for over 3 minutes instead of 5 seconds.
+//
+// Applies to: English PC EGA Floppy, Japanese PC-98
+// Responsible method: rmScript:changeState
+// Fixes bug #6193
+static const uint16 sq4SignatureEgaIntroDelay[] = {
+ SIG_MAGICDWORD,
+ 0x89, 0x69, // lsg 69 [ system colors ]
+ 0x35, 0x10, // ldi 10
+ 0x1e, // gt? [ system colors > 16 ]
+ 0x30, // bnt [ use EGA delay ]
+ SIG_END
+};
+
+static const uint16 sq4PatchEgaIntroDelay[] = {
+ 0x33, 0x06, // jmp 06 [ don't use EGA delay ]
+ PATCH_END
+};
+
// Talking in room 520 results in a missing message due to passing the wrong
// modNum to the narrator.
//
@@ -11351,6 +11375,7 @@ static const uint16 sq4CdPatchTextOptions[] = {
// script, description, signature patch
static const SciScriptPatcherEntry sq4Signatures[] = {
+ { true, 1, "Floppy: EGA intro delay fix", 2, sq4SignatureEgaIntroDelay, sq4PatchEgaIntroDelay },
{ true, 298, "Floppy: endless flight", 1, sq4FloppySignatureEndlessFlight, sq4FloppyPatchEndlessFlight },
{ true, 700, "Floppy: throw stuff at sequel police bug", 1, sq4FloppySignatureThrowStuffAtSequelPoliceBug, sq4FloppyPatchThrowStuffAtSequelPoliceBug },
{ true, 35, "CD: sidewalk smell message fix", 1, sq4CdSignatureSidewalkSmellMessage, sq4CdPatchSidewalkSmellMessage },