From 39ba328afbef5f21a622dca0c3fc30f4247b07af Mon Sep 17 00:00:00 2001 From: Ariel Antonitis Date: Sun, 25 Apr 2021 20:13:56 -0400 Subject: [PATCH] Optimized follower palette loading. --- .../object_event_graphics_info.h | 2 +- src/event_object_movement.c | 50 +++++++++---------- src/overworld.c | 7 +-- 3 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/data/object_events/object_event_graphics_info.h b/src/data/object_events/object_event_graphics_info.h index dc96762604..9dad1424fb 100755 --- a/src/data/object_events/object_event_graphics_info.h +++ b/src/data/object_events/object_event_graphics_info.h @@ -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[] = { diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 76fc26d055..299425562d 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -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; diff --git a/src/overworld.c b/src/overworld.c index a36e2ed551..c667026676 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -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,