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
This commit is contained in:
sluicebox 2020-01-16 04:31:24 -08:00
parent 4a99c9e964
commit 3de471de36
3 changed files with 7 additions and 7 deletions

View File

@ -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) ||

View File

@ -52,8 +52,8 @@ public:
bool setAmiga();
void modifyAmigaPalette(const SciSpan<const byte> &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);

View File

@ -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);
}