Sync palette util

This commit is contained in:
GriffinR
2022-09-06 14:34:52 -04:00
parent b3c7b9e09f
commit d08aa80a70
4 changed files with 197 additions and 187 deletions
+83
View File
@@ -0,0 +1,83 @@
#ifndef GUARD_PALETTE_UTIL_H
#define GUARD_PALETTE_UTIL_H
struct PulseBlendSettings
{
u16 blendColor;
u16 paletteOffset;
u8 numColors;
u8 delay;
u8 numFadeCycles;
s8 maxBlendCoeff:4;
s8 fadeType:2;
s8 restorePaletteOnUnload:1;
s8 unk7_7:1;
};
struct PulseBlendPalette
{
u8 paletteSelector;
u8 blendCoeff:4;
u8 fadeDirection:1;
s8 unk1_5:1;
s8 available:1;
u32 inUse:1;
u8 delayCounter;
u8 fadeCycleCounter;
struct PulseBlendSettings pulseBlendSettings;
};
struct PulseBlend
{
u16 usedPulseBlendPalettes;
struct PulseBlendPalette pulseBlendPalettes[16];
};
#define FLASHUTIL_USE_EXISTING_COLOR (1 << 15)
struct RouletteFlashSettings
{
u16 color;
u16 paletteOffset;
u8 numColors;
u8 delay;
u8 unk6; // Set but never used
s8 numFadeCycles:5;
s8 unk7_5:2; // Set but never used
s8 colorDeltaDir:1;
};
struct RouletteFlashPalette
{
u8 state:7;
u8 available:1;
u8 delayCounter;
s8 fadeCycleCounter;
s8 colorDelta;
struct RouletteFlashSettings settings;
};
struct RouletteFlashUtil
{
u8 enabled;
u8 unused;
u16 flags;
struct RouletteFlashPalette palettes[16];
};
void RouletteFlash_Reset(struct RouletteFlashUtil *);
u8 RouletteFlash_Add(struct RouletteFlashUtil *, u8, const struct RouletteFlashSettings *);
void RouletteFlash_Run(struct RouletteFlashUtil *);
void RouletteFlash_Enable(struct RouletteFlashUtil *, u16);
void RouletteFlash_Stop(struct RouletteFlashUtil *, u16);
void InitPulseBlend(struct PulseBlend *);
int InitPulseBlendPaletteSettings(struct PulseBlend *, const struct PulseBlendSettings *);
static void ClearPulseBlendPalettesSettings(struct PulseBlendPalette *);
void UnloadUsedPulseBlendPalettes(struct PulseBlend *, u16, u8);
void MarkUsedPulseBlendPalettes(struct PulseBlend *, u16, u8);
void UnmarkUsedPulseBlendPalettes(struct PulseBlend *, u16, u8);
void UpdatePulseBlend(struct PulseBlend *);
void FillTilemapRect(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height);
void SetTilemapRect(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height);
#endif // GUARD_PALETTE_UTIL_H
-84
View File
@@ -1,84 +0,0 @@
#ifndef GUARD_ROULETTE_H
#define GUARD_ROULETTE_H
struct UnkStruct1
{
u16 var00;
u16 var02;
u8 var04;
u8 var05;
u8 var06;
s8 var07_0:5;
s8 var07_5:2;
s8 var07_7:1;
};
struct UnkStruct3
{
u8 var00_0:7;
u8 var00_7:1;
u8 var01;
s8 var02;
s8 var03;
struct UnkStruct1 var04;
};
struct UnkStruct0
{
u8 var00;
u8 var01;
u16 var02; //flag for each UnkStruct3
struct UnkStruct3 var04[0x10];
};
struct PulseBlendSettings
{
u16 blendColor;
u16 paletteOffset;
u8 numColors;
u8 delay;
u8 numFadeCycles;
s8 maxBlendCoeff:4;
s8 fadeType:2;
s8 restorePaletteOnUnload:1;
s8 unk7_7:1;
};
struct PulseBlendPalette
{
u8 paletteSelector;
u8 blendCoeff:4;
u8 fadeDirection:1;
s8 unk1_5:1;
s8 available:1;
u32 inUse:1;
u8 delayCounter;
u8 fadeCycleCounter;
struct PulseBlendSettings pulseBlendSettings;
};
struct PulseBlend
{
u16 usedPulseBlendPalettes;
struct PulseBlendPalette pulseBlendPalettes[16];
};
void sub_80D8BE4(struct UnkStruct0 *);
u8 sub_80D8BF8(struct UnkStruct0 *, u8, const struct UnkStruct1 *);
u8 sub_80D8C7C(struct UnkStruct0 *, u8);
u8 sub_80D8CB0(struct UnkStruct3 *);
u8 sub_80D8EB8(struct UnkStruct3 *);
void task_tutorial_controls_fadein(struct UnkStruct0 *);
void sub_80D8FB4(struct UnkStruct0 *, u16);
void sub_80D9008(struct UnkStruct0 *, u16);
void InitPulseBlend(struct PulseBlend *);
int InitPulseBlendPaletteSettings(struct PulseBlend *, const struct PulseBlendSettings *);
static void ClearPulseBlendPalettesSettings(struct PulseBlendPalette *);
void UnloadUsedPulseBlendPalettes(struct PulseBlend *, u16, u8);
void MarkUsedPulseBlendPalettes(struct PulseBlend *, u16, u8);
void UnmarkUsedPulseBlendPalettes(struct PulseBlend *, u16, u8);
void UpdatePulseBlend(struct PulseBlend *);
void sub_80D9574(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height);
void sub_80D95C4(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height);
#endif // GUARD_ROULETTE_H
+1 -1
View File
@@ -202,7 +202,7 @@ SECTIONS {
src/battle_controller_link_partner.o(.text); src/battle_controller_link_partner.o(.text);
src/battle_message.o(.text); src/battle_message.o(.text);
src/math_util.o(.text); src/math_util.o(.text);
src/roulette_util.o(.text); src/palette_util.o(.text);
src/cable_car_util.o(.text); src/cable_car_util.o(.text);
src/save.o(.text); src/save.o(.text);
src/mystery_event_script.o(.text); src/mystery_event_script.o(.text);
+113 -102
View File
@@ -1,207 +1,217 @@
#include "global.h" #include "global.h"
#include "gflib.h" #include "gflib.h"
#include "roulette_util.h" #include "palette_util.h"
#include "util.h" #include "util.h"
void sub_80D8BE4(struct UnkStruct0 *r0) // "RouletteFlash" is more accurately a general flashing/fading util.
// This file handles fading the palettes for the color/icon selections on the Roulette wheel
// but it also handles the "pulse blend" effect of Mirage Tower.
// Neither exist in FRLG, so everything in this file goes unused.
void RouletteFlash_Reset(struct RouletteFlashUtil *flash)
{ {
r0->var00 = 0; flash->enabled = 0;
r0->var02 = 0; flash->flags = 0;
memset(&r0->var04, 0, sizeof(r0->var04)); memset(&flash->palettes, 0, sizeof(flash->palettes));
} }
u8 sub_80D8BF8(struct UnkStruct0 *r0, u8 r1, const struct UnkStruct1 *r2) u8 RouletteFlash_Add(struct RouletteFlashUtil *flash, u8 id, const struct RouletteFlashSettings *settings)
{ {
if (!(r1 < 16) || (r0->var04[r1].var00_7)) if (id >= ARRAY_COUNT(flash->palettes) || flash->palettes[id].available)
return 0xFF; return 0xFF;
r0->var04[r1].var04.var00 = r2->var00; flash->palettes[id].settings.color = settings->color;
r0->var04[r1].var04.var02 = r2->var02; flash->palettes[id].settings.paletteOffset = settings->paletteOffset;
r0->var04[r1].var04.var04 = r2->var04; flash->palettes[id].settings.numColors = settings->numColors;
r0->var04[r1].var04.var05 = r2->var05; flash->palettes[id].settings.delay = settings->delay;
r0->var04[r1].var04.var06 = r2->var06; flash->palettes[id].settings.unk6 = settings->unk6;
r0->var04[r1].var04.var07_0 = r2->var07_0; flash->palettes[id].settings.numFadeCycles = settings->numFadeCycles;
r0->var04[r1].var04.var07_5 = r2->var07_5; flash->palettes[id].settings.unk7_5 = settings->unk7_5;
r0->var04[r1].var04.var07_7 = r2->var07_7; flash->palettes[id].settings.colorDeltaDir = settings->colorDeltaDir;
r0->var04[r1].var00_0 = 0; flash->palettes[id].state = 0;
r0->var04[r1].var00_7 = 1; flash->palettes[id].available = TRUE;
r0->var04[r1].var02 = 0; flash->palettes[id].fadeCycleCounter = 0;
r0->var04[r1].var01 = 0; flash->palettes[id].delayCounter = 0;
if (r0->var04[r1].var04.var07_7 < 0) if (flash->palettes[id].settings.colorDeltaDir < 0)
r0->var04[r1].var03 = 0xFF; flash->palettes[id].colorDelta = -1;
else else
r0->var04[r1].var03 = 1; flash->palettes[id].colorDelta = 1;
return r1; return id;
} }
u8 sub_80D8C7C(struct UnkStruct0 *r0, u8 r1) static u8 RouletteFlash_Remove(struct RouletteFlashUtil *flash, u8 id)
{ {
if (r1 >= 16) if (id >= ARRAY_COUNT(flash->palettes))
return 0xFF; return 0xFF;
if (!r0->var04[r1].var00_7) if (!flash->palettes[id].available)
return 0xFF; return 0xFF;
memset(&r0->var04[r1], 0, sizeof(r0->var04[r1])); memset(&flash->palettes[id], 0, sizeof(flash->palettes[id]));
return r1; return id;
} }
u8 sub_80D8CB0(struct UnkStruct3 *r0) static u8 RouletteFlash_FadePalette(struct RouletteFlashPalette *pal)
{ {
u8 i; u8 i;
u8 returnval; u8 returnval;
for (i = 0; i < r0->var04.var04; i++) for (i = 0; i < pal->settings.numColors; i++)
{ {
struct PlttData *faded = (struct PlttData *)&gPlttBufferFaded[r0->var04.var02 + i]; struct PlttData *faded = (struct PlttData *)&gPlttBufferFaded[pal->settings.paletteOffset + i];
struct PlttData *unfaded = (struct PlttData *)&gPlttBufferUnfaded[r0->var04.var02 + i]; struct PlttData *unfaded = (struct PlttData *)&gPlttBufferUnfaded[pal->settings.paletteOffset + i];
switch (r0->var00_0) switch (pal->state)
{ {
case 1: case 1:
if (faded->r + r0->var03 >= 0 && faded->r + r0->var03 < 32) // Fade color
faded->r += r0->var03; if (faded->r + pal->colorDelta >= 0 && faded->r + pal->colorDelta < 32)
if (faded->g + r0->var03 >= 0 && faded->g + r0->var03 < 32) faded->r += pal->colorDelta;
faded->g += r0->var03; if (faded->g + pal->colorDelta >= 0 && faded->g + pal->colorDelta < 32)
if (faded->b + r0->var03 >= 0 && faded->b + r0->var03 < 32) faded->g += pal->colorDelta;
faded->b += r0->var03; if (faded->b + pal->colorDelta >= 0 && faded->b + pal->colorDelta < 32)
faded->b += pal->colorDelta;
break; break;
case 2: case 2:
if (r0->var03 < 0) // Fade back to original color
if (pal->colorDelta < 0)
{ {
if (faded->r + r0->var03 >= unfaded->r) if (faded->r + pal->colorDelta >= unfaded->r)
faded->r += r0->var03; faded->r += pal->colorDelta;
if (faded->g + r0->var03 >= unfaded->g) if (faded->g + pal->colorDelta >= unfaded->g)
faded->g += r0->var03; faded->g += pal->colorDelta;
if (faded->b + r0->var03 >= unfaded->b) if (faded->b + pal->colorDelta >= unfaded->b)
faded->b += r0->var03; faded->b += pal->colorDelta;
} }
else else
{ {
if (faded->r + r0->var03 <= unfaded->r) if (faded->r + pal->colorDelta <= unfaded->r)
faded->r += r0->var03; faded->r += pal->colorDelta;
if (faded->g + r0->var03 <= unfaded->g) if (faded->g + pal->colorDelta <= unfaded->g)
faded->g += r0->var03; faded->g += pal->colorDelta;
if (faded->b + r0->var03 <= unfaded->b) if (faded->b + pal->colorDelta <= unfaded->b)
faded->b += r0->var03; faded->b += pal->colorDelta;
} }
break; break;
} }
} }
if ((u32)r0->var02++ != r0->var04.var07_0) if ((u32)pal->fadeCycleCounter++ != pal->settings.numFadeCycles)
{ {
returnval = 0; returnval = 0;
} }
else else
{ {
r0->var02 = 0; pal->fadeCycleCounter = 0;
r0->var03 *= -1; pal->colorDelta *= -1;
if (r0->var00_0 == 1) if (pal->state == 1)
r0->var00_0++; pal->state++;
else else
r0->var00_0--; pal->state--;
returnval = 1; returnval = 1;
} }
return returnval; return returnval;
} }
u8 sub_80D8EB8(struct UnkStruct3 *r0) static u8 RouletteFlash_FlashPalette(struct RouletteFlashPalette *pal)
{ {
u8 rg2 = 0; u8 i = 0;
switch (r0->var00_0) switch (pal->state)
{ {
case 1: case 1:
for (rg2 = 0; rg2 < r0->var04.var04; rg2++) // Flash to color
gPlttBufferFaded[r0->var04.var02 + rg2] = r0->var04.var00; for (i = 0; i < pal->settings.numColors; i++)
r0->var00_0++; gPlttBufferFaded[pal->settings.paletteOffset + i] = pal->settings.color;
pal->state++;
break; break;
case 2: case 2:
for (rg2 = 0; rg2 < r0->var04.var04; rg2++) // Restore to original color
gPlttBufferFaded[r0->var04.var02 + rg2] = gPlttBufferUnfaded[r0->var04.var02 + rg2]; for (i = 0; i < pal->settings.numColors; i++)
r0->var00_0--; gPlttBufferFaded[pal->settings.paletteOffset + i] = gPlttBufferUnfaded[pal->settings.paletteOffset + i];
pal->state--;
break; break;
} }
return 1; return 1;
} }
void task_tutorial_controls_fadein(struct UnkStruct0 *r0) void RouletteFlash_Run(struct RouletteFlashUtil *flash)
{ {
u8 i = 0; u8 i = 0;
if (r0->var00) if (flash->enabled)
{ {
for (i = 0; i < 16; i++) for (i = 0; i < ARRAY_COUNT(flash->palettes); i++)
{ {
if ((r0->var02 >> i) & 1) if ((flash->flags >> i) & 1)
{ {
if (--r0->var04[i].var01 == 0xFF) // if underflow ? if (--flash->palettes[i].delayCounter == (u8)-1)
{ {
if (r0->var04[i].var04.var00 & 0x8000) // PlttData->unused_15 ? if (flash->palettes[i].settings.color & FLASHUTIL_USE_EXISTING_COLOR)
sub_80D8CB0(&r0->var04[i]); RouletteFlash_FadePalette(&flash->palettes[i]);
else else
sub_80D8EB8(&r0->var04[i]); RouletteFlash_FlashPalette(&flash->palettes[i]);
r0->var04[i].var01 = r0->var04[i].var04.var05; flash->palettes[i].delayCounter = flash->palettes[i].settings.delay;
} }
} }
} }
} }
} }
void sub_80D8FB4(struct UnkStruct0 *r0, u16 r1) void RouletteFlash_Enable(struct RouletteFlashUtil *flash, u16 flags)
{ {
u8 i = 0; u8 i = 0;
r0->var00++; flash->enabled++;
for (i = 0; i < 16; i++) for (i = 0; i < ARRAY_COUNT(flash->palettes); i++)
{ {
if ((r1 >> i) & 1) if ((flags >> i) & 1)
{ {
if (r0->var04[i].var00_7) if (flash->palettes[i].available)
{ {
r0->var02 |= 1 << i; flash->flags |= 1 << i;
r0->var04[i].var00_0 = 1; flash->palettes[i].state = 1;
} }
} }
} }
} }
void sub_80D9008(struct UnkStruct0 *r0, u16 r1) void RouletteFlash_Stop(struct RouletteFlashUtil *flash, u16 flags)
{ {
u8 i; u8 i;
for (i = 0; i < 16; i++) for (i = 0; i < ARRAY_COUNT(flash->palettes); i++)
{ {
if ((r0->var02 >> i) & 1) if ((flash->flags >> i) & 1)
{ {
if (r0->var04[i].var00_7) if (flash->palettes[i].available)
{ {
if ((r1 >> i) & 1) if ((flags >> i) & 1)
{ {
u32 offset = r0->var04[i].var04.var02; u32 offset = flash->palettes[i].settings.paletteOffset;
u16 *faded = &gPlttBufferFaded[offset]; u16 *faded = &gPlttBufferFaded[offset];
u16 *unfaded = &gPlttBufferUnfaded[offset]; u16 *unfaded = &gPlttBufferUnfaded[offset];
memcpy(faded, unfaded, r0->var04[i].var04.var04 * 2); memcpy(faded, unfaded, flash->palettes[i].settings.numColors * 2);
r0->var04[i].var00_0 = 0; flash->palettes[i].state = 0;
r0->var04[i].var02 = 0; flash->palettes[i].fadeCycleCounter = 0;
r0->var04[i].var01 = 0; flash->palettes[i].delayCounter = 0;
if (r0->var04[i].var04.var07_7 < 0) if (flash->palettes[i].settings.colorDeltaDir < 0)
r0->var04[i].var03 = 0xFF; flash->palettes[i].colorDelta = -1;
else else
r0->var04[i].var03 = 0x1; flash->palettes[i].colorDelta = 1;
} }
} }
} }
} }
if (r1 == 0xFFFF) if (flags == 0xFFFF)
{ {
r0->var00 = 0; // Stopped all
r0->var02 = 0; flash->enabled = 0;
flash->flags = 0;
} }
else else
{ {
r0->var02 = r0->var02 & ~r1; flash->flags &= ~flags;
} }
} }
@@ -427,7 +437,8 @@ void UpdatePulseBlend(struct PulseBlend *pulseBlend)
} }
} }
void sub_80D9574(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height) // Below used for the Roulette grid
void FillTilemapRect(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height)
{ {
u16 *_dest; u16 *_dest;
u8 i; u8 i;
@@ -444,7 +455,7 @@ void sub_80D9574(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height)
} }
} }
void sub_80D95C4(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height) void SetTilemapRect(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height)
{ {
u16 *_dest; u16 *_dest;
u16 *_src = src; u16 *_src = src;