From 4454a6397b3c0006916ad071f788781ffa61e2ef Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sat, 24 Apr 2021 01:17:39 -0400 Subject: [PATCH] Fixed bug where TOD was updated too frequently. --- include/overworld.h | 1 + include/palette.h | 1 - src/overworld.c | 8 ++--- src/palette.c | 72 +-------------------------------------------- 4 files changed, 6 insertions(+), 76 deletions(-) diff --git a/include/overworld.h b/include/overworld.h index 2180a87a9b..58cf5b16af 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -141,6 +141,7 @@ void CleanupOverworldWindowsAndTilemaps(void); bool32 IsUpdateLinkStateCBActive(void); void CB1_Overworld(void); void CB2_OverworldBasic(void); +u8 UpdateTimeOfDay(void); void UpdatePalettesWithTime(u32); void CB2_Overworld(void); void SetMainCallback1(void (*cb)(void)); diff --git a/include/palette.h b/include/palette.h index 886c05c386..89de237c23 100644 --- a/include/palette.h +++ b/include/palette.h @@ -88,7 +88,6 @@ void BlendPalettesUnfaded(u32, u8, u16); void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor); void TintPalette_RGB_Copy(u16 palOffset, u32 blendColor); -void TimeBlendPalettes(u32 palettes, u32 coeff, u32 blendColor); void TimeMixPalettes(u32, u16 *, u16 *, struct BlendSettings *, struct BlendSettings *, u16); void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); diff --git a/src/overworld.c b/src/overworld.c index a3b3649fa8..51e4279fb8 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -186,7 +186,7 @@ static u16 (*sPlayerKeyInterceptCallback)(u32); static bool8 sReceivingFromLink; static u8 sRfuKeepAliveTimer; -static u8 timeCounter; +static u16 sTimeUpdateCounter; // playTimeVBlanks will eventually overflow, so this is used to update TOD static struct TimeBlendSettings currentTimeBlend; // IWRAM common @@ -1542,7 +1542,7 @@ void UpdatePalettesWithTime(u32 palettes) { } } -u8 UpdateSpritePaletteWithTime(u8 paletteNum) { // TODO: Optimize this +u8 UpdateSpritePaletteWithTime(u8 paletteNum) { UpdatePalettesWithTime(1 << (paletteNum + 16)); return paletteNum; } @@ -1559,13 +1559,13 @@ static void OverworldBasic(void) UpdateTilesetAnimations(); DoScheduledBgTilemapCopiesToVram(); // Every minute if no palette fade is active, update TOD blending as needed - if (!(gPaletteFade.active || (timeCounter++ % 3600))) { + if (!(gPaletteFade.active || (++sTimeUpdateCounter % 3600))) { struct TimeBlendSettings cachedBlend = { .time0 = currentTimeBlend.time0, .time1 = currentTimeBlend.time1, .weight = currentTimeBlend.weight, }; - timeCounter = 0; + sTimeUpdateCounter = 0; UpdateTimeOfDay(); if (cachedBlend.time0 != currentTimeBlend.time0 || cachedBlend.time1 != currentTimeBlend.time1 diff --git a/src/palette.c b/src/palette.c index d7974779ca..37b30d0c38 100644 --- a/src/palette.c +++ b/src/palette.c @@ -1084,78 +1084,8 @@ void TimeBlendPalette(u16 palOffset, u32 coeff, u32 blendColor) { } } -void TimeBlendPalettes(u32 palettes, u32 coeff, u32 blendColor) { - s32 newR, newG, newB, defR, defG, defB, altR, altG, altB; - u16 * src; - u16 * dst; - u32 defaultBlendColor = DEFAULT_LIGHT_COLOR; - - if (!palettes) - return; - - coeff *= 2; - newR = (blendColor << 27) >> 27; - newG = (blendColor << 22) >> 27; - newB = (blendColor << 17) >> 27; - defR = (defaultBlendColor << 27) >> 27; - defG = (defaultBlendColor << 22) >> 27; - defB = (defaultBlendColor << 17) >> 27; - src = gPlttBufferUnfaded; - dst = gPlttBufferFaded; - - do { - if (palettes & 1) { - u16 *srcEnd = src + 16; - u16 altBlendIndices = *dst++ = *src++; // color 0 is copied through - u32 altBlendColor; - if (altBlendIndices >> 15) { // High bit set; bitmask of which colors to alt-blend - // Note that bit 0 of altBlendIndices specifies color 1 - altBlendColor = src[14]; // color 15 - if (altBlendColor >> 15) { // Set alternate blend color - altR = (altBlendColor << 27) >> 27; - altG = (altBlendColor << 22) >> 27; - altB = (altBlendColor << 17) >> 27; - } else { - altBlendColor = 0; - } - } else { - altBlendIndices = 0; - } - while (src != srcEnd) { - u32 srcColor = *src; - s32 r = (srcColor << 27) >> 27; - s32 g = (srcColor << 22) >> 27; - s32 b = (srcColor << 17) >> 27; - - if (altBlendIndices & 1) { - if (altBlendColor) { // Use alternate blend color - *dst = ((r + (((altR - r) * coeff) >> 5)) << 0) - | ((g + (((altG - g) * coeff) >> 5)) << 5) - | ((b + (((altB - b) * coeff) >> 5)) << 10); - } else { // Use default blend color - *dst = ((r + (((defR - r) * coeff) >> 5)) << 0) - | ((g + (((defG - g) * coeff) >> 5)) << 5) - | ((b + (((defB - b) * coeff) >> 5)) << 10); - } - } else { // Use provided blend color - *dst = ((r + (((newR - r) * coeff) >> 5)) << 0) - | ((g + (((newG - g) * coeff) >> 5)) << 5) - | ((b + (((newB - b) * coeff) >> 5)) << 10); - } - src++; - dst++; - altBlendIndices >>= 1; - } - } else { - src += 16; - dst += 16; - } - palettes >>= 1; - } while (palettes); -} - // Blends a weighted average of two blend parameters -// TODO: Should pointers be marked as const? +// Parameters can be either blended (as in BlendPalettes) or tinted (as in TintPaletteRGB_Copy) void TimeMixPalettes(u32 palettes, u16 *src, u16 *dst, struct BlendSettings *blend0, struct BlendSettings *blend1, u16 weight0) { s32 r0, g0, b0, r1, g1, b1, defR, defG, defB, altR, altG, altB; u32 color0, coeff0, color1, coeff1;