Optimized follower palette loading.

This commit is contained in:
Ariel Antonitis 2021-04-25 20:13:56 -04:00
parent 147e101df5
commit 39ba328afb
3 changed files with 28 additions and 31 deletions

View File

@ -244,7 +244,7 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RubySapphireMay =
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lugia = {0xFFFF, OBJ_EVENT_PAL_TAG_LUGIA, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_LugiaOld, gDummySpriteAffineAnimTable};
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HoOh = {0xFFFF, OBJ_EVENT_PAL_TAG_HO_OH, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_HoOh, sPicTable_HoOhOld, gDummySpriteAffineAnimTable};
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_AnimatedBall = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Following, sPicTable_AnimatedBall, gDummySpriteAffineAnimTable};
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Follower = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Togetic, gDummySpriteAffineAnimTable};
const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Follower = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Togetic, gDummySpriteAffineAnimTable};
// Species-indexed pokemon object event table
const struct ObjectEventGraphicsInfo gPokemonObjectGraphics[] = {

View File

@ -152,7 +152,7 @@ static bool8 AnimateSpriteInFigure8(struct Sprite *sprite);
static void UpdateObjectEventSprite(struct Sprite *);
u8 GetDirectionToFace(s16 x1, s16 y1, s16 x2, s16 y2);
static void FollowerSetGraphics(struct ObjectEvent *, u16, u8, bool8);
static void FollowerSetGraphics(struct ObjectEvent *, u16, u8, bool8, bool8);
static void ObjectEventSetGraphics(struct ObjectEvent *, const struct ObjectEventGraphicsInfo *);
static void DoShadowFieldEffect(struct ObjectEvent *);
static void SetJumpSpriteData(struct Sprite *, u8, u8, u8);
@ -1477,7 +1477,7 @@ TrySpawnObjectEventTemplate(struct ObjectEventTemplate *objectEventTemplate,
species = gObjectEvents[objectEventId].extra.mon.species;
form = gObjectEvents[objectEventId].extra.mon.form;
shiny = gObjectEvents[objectEventId].extra.mon.shiny;
FollowerSetGraphics(&gObjectEvents[objectEventId], species, form, shiny);
FollowerSetGraphics(&gObjectEvents[objectEventId], species, form, shiny, TRUE);
}
}
@ -1652,16 +1652,17 @@ static const struct ObjectEventGraphicsInfo * SpeciesToGraphicsInfo(u16 species,
}
// Set graphics & sprite for a follower object event by species & shininess.
static void FollowerSetGraphics(struct ObjectEvent *objectEvent, u16 species, u8 form, bool8 shiny) {
static void FollowerSetGraphics(struct ObjectEvent *objEvent, u16 species, u8 form, bool8 shiny, bool8 doPalette) {
const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, form);
objectEvent->graphicsId = OBJ_EVENT_GFX_OW_MON;
ObjectEventSetGraphics(objectEvent, graphicsInfo);
objectEvent->graphicsId = OBJ_EVENT_GFX_OW_MON;
objectEvent->extra.mon.species = species;
objectEvent->extra.mon.form = form;
objectEvent->extra.mon.shiny = shiny;
if (graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) { // Use palette from species palette table
struct Sprite *sprite = &gSprites[objectEvent->spriteId];
objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON;
ObjectEventSetGraphics(objEvent, graphicsInfo);
objEvent->graphicsId = OBJ_EVENT_GFX_OW_MON;
objEvent->extra.mon.species = species;
objEvent->extra.mon.form = form;
objEvent->extra.mon.shiny = shiny;
if (graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC && doPalette) { // Use palette from species palette table
u8 paletteNum;
struct Sprite *sprite = &gSprites[objEvent->spriteId];
// Note that the shiny palette tag is `species + SPECIES_SHINY_TAG`, which must be increased with more pokemon
// so that palette tags do not overlap
const struct CompressedSpritePalette *spritePalette = &(shiny ? gMonShinyPaletteTable : gMonPaletteTable)[species];
@ -1669,24 +1670,19 @@ static void FollowerSetGraphics(struct ObjectEvent *objectEvent, u16 species, u8
sprite->inUse = FALSE;
FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum);
sprite->inUse = TRUE;
if (IndexOfSpritePaletteTag(spritePalette->tag) == 0xFF) { // Load compressed palette
if ((paletteNum = IndexOfSpritePaletteTag(spritePalette->tag)) == 0xFF) { // Load compressed palette
LoadCompressedSpritePalette(spritePalette);
sprite->oam.paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present
sprite->oam.paletteNum = paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present
if (species == SPECIES_AMPHAROS) { // palette should be light-blended TODO: Add more glowing pokemon
// CHARIZARD_LINE ?
// CHINCHOU & LANTERN
// FLAAFY, MAREEP
// UMBREON
// VOLBEAT ?
// REGIS ?
u16 * palette = &gPlttBufferUnfaded[(sprite->oam.paletteNum+16)*16];
// CHARIZARD LINE ? CHINCHOU LANTERN FLAAFY MAREEP UMBREON VOLBEAT ?
u16 * palette = &gPlttBufferUnfaded[(paletteNum+16)*16];
palette[0] |= 0x8000;
if (palette[0] & 0x4000) // If color 15 is blended, use it as the alternate color
palette[15] |= 0x8000;
}
UpdateSpritePaletteWithWeather(sprite->oam.paletteNum, FALSE);
UpdateSpritePaletteWithWeather(paletteNum, FALSE);
} else
sprite->oam.paletteNum = IndexOfSpritePaletteTag(spritePalette->tag); // Tag is always present
sprite->oam.paletteNum = paletteNum;
}
}
@ -1717,7 +1713,7 @@ void UpdateFollowingPokemon(void) { // Update following pokemon if any
MoveObjectEventToMapCoords(objEvent, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x, gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y);
objEvent->invisible = TRUE;
}
FollowerSetGraphics(objEvent, species, 0, shiny);
FollowerSetGraphics(objEvent, species, 0, shiny, TRUE);
sprite->data[6] = 0; // set animation data
objEvent->extra.mon.species = species;
objEvent->extra.mon.shiny = shiny;
@ -2147,7 +2143,7 @@ static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y)
sprite->sObjEventId = objectEventId;
objectEvent->spriteId = i;
if (objectEvent->graphicsId == OBJ_EVENT_GFX_OW_MON) { // Set pokemon graphics
FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny);
FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny, TRUE);
}
if (!objectEvent->inanimate && objectEvent->movementType != MOVEMENT_TYPE_PLAYER)
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objectEvent->facingDirection));
@ -6494,11 +6490,11 @@ bool8 MovementAction_ExitPokeball_Step1(struct ObjectEvent *objectEvent, struct
return TRUE;
// Restore graphicsId and set palette to white
} else if ((duration == 0 && sprite->data[3] == 3) || (duration == 1 && sprite->data[3] == 7)) {
FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny);
FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny, FALSE);
LoadWhiteFlashPalette(objectEvent, sprite);
// Restore original palette
} else if ((duration == 0 && sprite->data[3] == 1) || (duration == 1 && sprite->data[3] == 3)) {
FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny);
FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny, TRUE);
}
return FALSE;
}
@ -6526,7 +6522,7 @@ bool8 MovementAction_EnterPokeball_Step1(struct ObjectEvent *objectEvent, struct
bool8 MovementAction_EnterPokeball_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny);
FollowerSetGraphics(objectEvent, objectEvent->extra.mon.species, objectEvent->extra.mon.form, objectEvent->extra.mon.shiny, FALSE);
objectEvent->invisible = TRUE;
sprite->data[1] = 0;
sprite->data[6] = 0;

View File

@ -1515,9 +1515,10 @@ void UpdatePalettesWithTime(u32 palettes) {
if (MapHasNaturalLight(gMapHeader.mapType)) {
u16 i;
u16 tempPaletteBuffer[16];
for (i = 0; i < 16; i++) {
u32 mask = 1 << 16;
for (i = 0; i < 16; i++, mask <<= 1) {
if (GetSpritePaletteTagByPaletteNum(i) >> 15) // Don't blend special sprite palette tags
palettes &= ~(1 << (i + 16));
palettes &= ~(mask);
}
palettes &= 0xFFFF1FFF; // Don't blend tile palettes [13,15]
if (!palettes)
@ -1536,7 +1537,7 @@ u8 UpdateSpritePaletteWithTime(u8 paletteNum) {
u16 offset;
if (GetSpritePaletteTagByPaletteNum(paletteNum) >> 15)
return paletteNum;
offset = (paletteNum + 16) * 16;
offset = (paletteNum + 16) << 4;
TimeMixPalettes(1,
gPlttBufferUnfaded + offset,
gPlttBufferFaded + offset,