From 3de471de36f22c12604d60be16f270c594510a56 Mon Sep 17 00:00:00 2001 From: sluicebox <22204938+sluicebox@users.noreply.github.com> Date: Thu, 16 Jan 2020 04:31:24 -0800 Subject: [PATCH] SCI: Set first palette color when drawing a 1.1 pic When drawing a pic while pal-very isn't active, SSCI 1.1 sets the first 255 palette colors, as opposed to skipping the first when normally inserting a palette. Without this, a palette cycle that includes the first color will permanently alter the system palette, such as in Hoyle4 when winning the Klondike game with certain table backgrounds. Fixes bugs #11164 and #11195 --- engines/sci/graphics/palette.cpp | 8 ++++---- engines/sci/graphics/palette.h | 4 ++-- engines/sci/graphics/picture.cpp | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 4b19f27f82a..37a5248f21c 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -306,7 +306,7 @@ void GfxPalette::setEGA() { setOnScreen(); } -void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { +void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge, bool includeFirstColor) { uint32 systime = _sysPalette.timestamp; if (force || newPalette->timestamp != systime) { @@ -315,7 +315,7 @@ void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { if ((forceRealMerge) || (_useMerging)) _sysPaletteChanged |= merge(newPalette, force, forceRealMerge); else - _sysPaletteChanged |= insert(newPalette, &_sysPalette); + _sysPaletteChanged |= insert(newPalette, &_sysPalette, includeFirstColor && (_palVaryResourceId == -1)); // Adjust timestamp on newPalette, so it wont get merged/inserted w/o need newPalette->timestamp = _sysPalette.timestamp; @@ -336,10 +336,10 @@ void GfxPalette::set(Palette *newPalette, bool force, bool forceRealMerge) { } } -bool GfxPalette::insert(Palette *newPalette, Palette *destPalette) { +bool GfxPalette::insert(Palette *newPalette, Palette *destPalette, bool includeFirstColor) { bool paletteChanged = false; - for (int i = 1; i < 255; i++) { + for (int i = (includeFirstColor ? 0 : 1); i < 255; i++) { if (newPalette->colors[i].used) { if ((newPalette->colors[i].r != destPalette->colors[i].r) || (newPalette->colors[i].g != destPalette->colors[i].g) || diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 2923df92200..a753c3b176c 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -52,8 +52,8 @@ public: bool setAmiga(); void modifyAmigaPalette(const SciSpan &data); void setEGA(); - void set(Palette *sciPal, bool force, bool forceRealMerge = false); - bool insert(Palette *newPalette, Palette *destPalette); + void set(Palette *sciPal, bool force, bool forceRealMerge = false, bool includeFirstColor = false); + bool insert(Palette *newPalette, Palette *destPalette, bool includeFirstColor = false); bool merge(Palette *pFrom, bool force, bool forceRealMerge); uint16 matchColor(byte r, byte g, byte b); void getSys(Palette *pal); diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index 96c6e985955..e71961791f5 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -127,7 +127,7 @@ void GfxPicture::drawSci11Vga() { if (has_cel) { // Create palette and set it _palette->createFromData(inbuffer.subspan(palette_data_ptr), &palette); - _palette->set(&palette, true); + _palette->set(&palette, true, false, true); drawCelData(inbuffer, cel_headerPos, cel_RlePos, cel_LiteralPos, 0, 0, 0, 0, false); }