Fixed bug where TOD was updated too frequently.
This commit is contained in:
parent
dbc4cb8293
commit
4454a6397b
4 changed files with 6 additions and 76 deletions
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue