From 127749369d14e66be49df81aa49696e59f23c2c0 Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Thu, 11 Mar 2021 22:38:06 -0500 Subject: [PATCH] Allowed map headers to specify light palettes. --- data/tilesets/headers.inc | 2 +- .../secondary/rustboro/palettes/06.pal | 2 +- include/global.fieldmap.h | 1 + include/palette.h | 2 + src/fieldmap.c | 8 +++- src/overworld.c | 9 ++-- src/palette.c | 48 ++++++++++++++++--- 7 files changed, 59 insertions(+), 13 deletions(-) diff --git a/data/tilesets/headers.inc b/data/tilesets/headers.inc index c56234b13b..aefc245db5 100644 --- a/data/tilesets/headers.inc +++ b/data/tilesets/headers.inc @@ -24,7 +24,7 @@ gTileset_Petalburg:: @ 83DF71C gTileset_Rustboro:: @ 83DF734 .byte TRUE @ is compressed .byte TRUE @ is secondary tileset - .2byte 0 @ padding + .2byte 1 << 6 @ 1 << 6 .4byte gTilesetTiles_Rustboro .4byte gTilesetPalettes_Rustboro .4byte gMetatiles_Rustboro diff --git a/data/tilesets/secondary/rustboro/palettes/06.pal b/data/tilesets/secondary/rustboro/palettes/06.pal index 767ae160d5..5851fc31aa 100644 --- a/data/tilesets/secondary/rustboro/palettes/06.pal +++ b/data/tilesets/secondary/rustboro/palettes/06.pal @@ -1,7 +1,7 @@ JASC-PAL 0100 16 -115 197 164 +248 224 120 255 255 255 238 238 213 205 205 164 diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 0e65cc844c..248e2a6c00 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -29,6 +29,7 @@ struct Tileset { /*0x00*/ bool8 isCompressed; /*0x01*/ bool8 isSecondary; + /*0x02*/ u16 lightPalettes; /*0x04*/ void *tiles; /*0x08*/ void *palettes; /*0x0c*/ u16 *metatiles; diff --git a/include/palette.h b/include/palette.h index ebc1cc0bb4..4a54b1d552 100644 --- a/include/palette.h +++ b/include/palette.h @@ -76,6 +76,8 @@ void BeginHardwarePaletteFade(u8, u8, u8, u8, u8); void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color); void BlendPalettesUnfaded(u32, u8, u16); void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); +void TimePalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor); +void TimePalettes(u32 palettes, u8 coeff, u16 color); void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); void TintPalette_SepiaTone(u16 *palette, u16 count); diff --git a/src/fieldmap.c b/src/fieldmap.c index e437ea7fc2..d084dcf387 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -884,8 +884,14 @@ void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size) } else if (tileset->isSecondary == TRUE) { + u8 i; LoadPalette(((u16*)tileset->palettes) + (NUM_PALS_IN_PRIMARY * 16), destOffset, size); - FieldmapPaletteDummy(destOffset, size >> 1); + for (i = NUM_PALS_IN_PRIMARY; i < NUM_PALS_TOTAL; i++) { + if (tileset->lightPalettes & (1 << i)) { + u16 index = i * 16; + gPlttBufferFaded[index] = gPlttBufferUnfaded[index] |= 0x8000; + } + } } else { diff --git a/src/overworld.c b/src/overworld.c index 5bbb1b3762..294bec37bf 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1521,13 +1521,14 @@ void BlendPalettesWithTime(u32 palettes) { palettes &= ~(1 << (i + 16)); } palettes &= ~0xE000; // Don't blend tile palettes [13,15] - palettes &= ~(1 << 6); - gTimeOfDay = gTimeOfDay > TIME_OF_DAY_MAX ? TIME_OF_DAY_MAX : gTimeOfDay; - BlendPalettes(palettes, sTimeOfDayBlendVars[gTimeOfDay].coeff, sTimeOfDayBlendVars[gTimeOfDay].blendColor); + gTimeOfDay = min(TIME_OF_DAY_MAX, gTimeOfDay); + if (!palettes) + return; + TimePalettes(palettes, sTimeOfDayBlendVars[gTimeOfDay].coeff, sTimeOfDayBlendVars[gTimeOfDay].blendColor); } } -u8 UpdateSpritePaletteWithTime(u8 paletteNum) { +u8 UpdateSpritePaletteWithTime(u8 paletteNum) { // TODO: Optimize this BlendPalettesWithTime(1 << (paletteNum + 16)); return paletteNum; } diff --git a/src/palette.c b/src/palette.c index a367a5ed43..593c9bcd45 100644 --- a/src/palette.c +++ b/src/palette.c @@ -457,7 +457,7 @@ static u8 GetPaletteNumByUid(u16 uid) } // Like normal palette fade, but respects sprite/tile palettes immune to time of day fading -static u8 UpdateTimeOfDayPaletteFade(void) // Like normal, but respects sprite palettes immune to fading +static u8 UpdateTimeOfDayPaletteFade(void) { u8 paletteNum; u16 paletteOffset; @@ -496,13 +496,13 @@ static u8 UpdateTimeOfDayPaletteFade(void) // Like normal, but respects sprite p if (gPaletteFade.yDec) { if (gPaletteFade.objPaletteToggle) { // sprite palettes if (gPaletteFade.y >= gPaletteFade.targetY || GetSpritePaletteTagByPaletteNum(paletteNum) & 0x8000) - BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + TimePalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); // tile palettes } else if (gPaletteFade.y >= gPaletteFade.targetY || (paletteNum >= 13 && paletteNum <= 15)) { - BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + TimePalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); } } else { - BlendPalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); + TimePalette(paletteOffset, 16, gPaletteFade.y, gPaletteFade.blendColor); } } } @@ -978,6 +978,42 @@ void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color) } } +// Like BlendPalette, but ignores blendColor if the transparency high bit is set +void TimePalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) { + u16 i; + s8 r, g, b; + struct PlttData *data2 = (struct PlttData *)&blendColor; + for (i = 0; i < numEntries; i++) { + u16 index = i + palOffset; + struct PlttData *data1 = (struct PlttData *)&gPlttBufferUnfaded[index]; + if (i == 0) { + if (data1->unused_15) { // Use transparency color to blend + data2 = data1; + gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; + } + else if (data2->unused_15) // Set transparency/blending color + gPlttBufferUnfaded[index] = gPlttBufferFaded[index] = blendColor; + continue; + } + r = data1->r; + g = data1->g; + b = data1->b; + gPlttBufferFaded[index] = RGB(r + (((data2->r - r) * coeff) >> 4), + g + (((data2->g - g) * coeff) >> 4), + b + (((data2->b - b) * coeff) >> 4)); + } +} + +// Apply time effect to a series of palettes +void TimePalettes(u32 palettes, u8 coeff, u16 color) { + u16 paletteOffset; + for (paletteOffset = 0; palettes; paletteOffset += 16) { + if (palettes & 1) + TimePalette(paletteOffset, 16, coeff, color); + palettes >>= 1; + } +} + void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color) { void *src = gPlttBufferUnfaded; @@ -1123,8 +1159,8 @@ static bool32 IsBlendPalettesGraduallyTaskActive(u8 id) int i; for (i = 0; i < NUM_TASKS; i++) - if ((gTasks[i].isActive == TRUE) - && (gTasks[i].func == Task_BlendPalettesGradually) + if ((gTasks[i].isActive == TRUE) + && (gTasks[i].func == Task_BlendPalettesGradually) && (gTasks[i].tId == id)) return TRUE;