Allowed map headers to specify light palettes.

This commit is contained in:
Ariel Antonitis 2021-03-11 22:38:06 -05:00
parent 5045958c96
commit 127749369d
7 changed files with 59 additions and 13 deletions

View File

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

View File

@ -1,7 +1,7 @@
JASC-PAL
0100
16
115 197 164
248 224 120
255 255 255
238 238 213
205 205 164

View File

@ -29,6 +29,7 @@ struct Tileset
{
/*0x00*/ bool8 isCompressed;
/*0x01*/ bool8 isSecondary;
/*0x02*/ u16 lightPalettes;
/*0x04*/ void *tiles;
/*0x08*/ void *palettes;
/*0x0c*/ u16 *metatiles;

View File

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

View File

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

View File

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

View File

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