diff --git a/include/constants/pokemon_icon.h b/include/constants/pokemon_icon.h new file mode 100644 index 000000000..d57d5111a --- /dev/null +++ b/include/constants/pokemon_icon.h @@ -0,0 +1,6 @@ +#ifndef GUARD_CONSTANTS_POKEMON_ICON_H +#define GUARD_CONSTANTS_POKEMON_ICON_H + +#define POKE_ICON_BASE_PAL_TAG 56000 + +#endif // GUARD_CONSTANTS_POKEMON_ICON_H diff --git a/include/graphics.h b/include/graphics.h index 1305a664f..477cb08c3 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -64,6 +64,9 @@ extern const u32 gBallGfx_Cherish[]; extern const u16 gBallPal_Cherish[]; extern const u32 gOpenPokeballGfx[]; +// Pokémon gfx +extern const u16 gMonIconPalettes[][16]; + // pokemon gfx extern const u32 gMonFrontPic_Bulbasaur[]; extern const u16 gMonPalette_Bulbasaur[]; diff --git a/include/pokemon_icon.h b/include/pokemon_icon.h index 6275aaaec..702ef6dab 100644 --- a/include/pokemon_icon.h +++ b/include/pokemon_icon.h @@ -13,9 +13,9 @@ const u8 *GetMonIconTiles(u16 iconSpecies, bool32 extra); const u16 *GetValidMonIconPalettePtr(u16 speciesId); void LoadMonIconPalettes(void); void FreeMonIconPalettes(void); -u16 MailSpeciesToIconSpecies(u16); +u16 GetIconSpeciesNoPersonality(u16); u8 CreateMonIconNoPersonality(u16 species, SpriteCallback callback, s16 x, s16 y, u8 subpriority); -void DestroyMonIcon(struct Sprite *); +void FreeAndDestroyMonIconSprite(struct Sprite *); u16 GetUnownLetterByPersonality(u32 personality); void SpriteCB_MonIcon(struct Sprite *); u8 CreateMonIcon(u16 species, SpriteCallback callback, s16 x, s16 y, u8 subpriority, u32 personality); @@ -26,7 +26,7 @@ void FreeMonIconPalette(u16 iconId); void SetPartyHPBarSprite(struct Sprite *sprite, u8 animNum); u8 GetMonIconPaletteIndexFromSpecies(u16 species); u16 GetIconSpecies(u16 species, u32 personality); -void LoadMonIconPalettesAt(u16 offset); +void TryLoadAllMonIconPalettesAtOffset(u16 offset); u8 GetValidMonIconPalIndex(u16 species); void SafeLoadMonIconPalette(u16 species); void SafeFreeMonIconPalette(u16 species); diff --git a/src/battle_debug.c b/src/battle_debug.c index d98a4ec49..fac604167 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1001,7 +1001,7 @@ static void CleanUpAiInfoWindow(u8 taskId) for (i = 0; i < MAX_BATTLERS_COUNT; i++) { if (data->spriteIds.aiIconSpriteIds[i] != 0xFF) - DestroyMonIcon(&gSprites[data->spriteIds.aiIconSpriteIds[i]]); + FreeAndDestroyMonIconSprite(&gSprites[data->spriteIds.aiIconSpriteIds[i]]); } FreeAndDestroyMonPicSprite(data->aiMonSpriteId); ClearWindowTilemap(data->aiMovesWindowId); @@ -1345,7 +1345,7 @@ static void SwitchToDebugViewFromAiParty(u8 taskId) if (data->spriteIds.aiPartyIcons[i] != 0xFF) { DestroySpriteAndFreeResources(&gSprites[gSprites[data->spriteIds.aiPartyIcons[i]].sConditionSpriteId]); - DestroyMonIcon(&gSprites[data->spriteIds.aiPartyIcons[i]]); + FreeAndDestroyMonIconSprite(&gSprites[data->spriteIds.aiPartyIcons[i]]); } } ClearWindowTilemap(data->aiMovesWindowId); diff --git a/src/debug.c b/src/debug.c index c7e23b8ef..0a505dea7 100644 --- a/src/debug.c +++ b/src/debug.c @@ -3242,7 +3242,7 @@ static void DebugAction_Give_Pokemon_SelectId(u8 taskId) StringExpandPlaceholders(gStringVar4, sDebugText_PokemonID); AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 1, 1, 0, NULL); - DestroyMonIcon(&gSprites[gTasks[taskId].tSpriteId]); + FreeAndDestroyMonIconSprite(&gSprites[gTasks[taskId].tSpriteId]); FreeMonIconPalettes(); LoadMonIconPalette(gTasks[taskId].tInput); gTasks[taskId].tSpriteId = CreateMonIcon(gTasks[taskId].tInput, SpriteCB_MonIcon, DEBUG_NUMBER_ICON_X, DEBUG_NUMBER_ICON_Y, 4, 0); @@ -3268,7 +3268,7 @@ static void DebugAction_Give_Pokemon_SelectId(u8 taskId) PlaySE(SE_SELECT); Free(sDebugMonData); FreeMonIconPalettes(); - DestroyMonIcon(&gSprites[gTasks[taskId].tSpriteId]); + FreeAndDestroyMonIconSprite(&gSprites[gTasks[taskId].tSpriteId]); DebugAction_DestroyExtraWindow(taskId); } } @@ -3312,7 +3312,7 @@ static void DebugAction_Give_Pokemon_SelectLevel(u8 taskId) if (JOY_NEW(A_BUTTON)) { FreeMonIconPalettes(); - DestroyMonIcon(&gSprites[gTasks[taskId].tSpriteId]); + FreeAndDestroyMonIconSprite(&gSprites[gTasks[taskId].tSpriteId]); if (gTasks[taskId].tIsComplex == FALSE) { PlaySE(MUS_LEVEL_UP); @@ -3342,7 +3342,7 @@ static void DebugAction_Give_Pokemon_SelectLevel(u8 taskId) PlaySE(SE_SELECT); Free(sDebugMonData); FreeMonIconPalettes(); - DestroyMonIcon(&gSprites[gTasks[taskId].tSpriteId]); + FreeAndDestroyMonIconSprite(&gSprites[gTasks[taskId].tSpriteId]); DebugAction_DestroyExtraWindow(taskId); } } diff --git a/src/graphics.c b/src/graphics.c index 4aa57b84f..d3ba818da 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1950,3 +1950,12 @@ const u32 gBattleIcons_Gfx1[] = INCBIN_U32("graphics/types/battle_icons1.4bpp.lz const u32 gBattleIcons_Gfx2[] = INCBIN_U32("graphics/types/battle_icons2.4bpp.lz"); const u16 gBattleIcons_Pal1[] = INCBIN_U16("graphics/types/battle_icons1.gbapal"); const u16 gBattleIcons_Pal2[] = INCBIN_U16("graphics/types/battle_icons2.gbapal"); + +const u16 gMonIconPalettes[][16] = { + INCBIN_U16("graphics/pokemon/icon_palettes/pal0.gbapal"), + INCBIN_U16("graphics/pokemon/icon_palettes/pal1.gbapal"), + INCBIN_U16("graphics/pokemon/icon_palettes/pal2.gbapal"), + INCBIN_U16("graphics/pokemon/icon_palettes/pal3.gbapal"), + INCBIN_U16("graphics/pokemon/icon_palettes/pal4.gbapal"), + INCBIN_U16("graphics/pokemon/icon_palettes/pal5.gbapal") +}; diff --git a/src/mail.c b/src/mail.c index 2e0abd440..6898bbb10 100644 --- a/src/mail.c +++ b/src/mail.c @@ -590,7 +590,7 @@ static bool8 DoInitMailView(void) gPaletteFade.bufferTransferDisabled = TRUE; break; case 17: - iconId = MailSpeciesToIconSpecies(sMailViewResources->mail->species); + iconId = GetIconSpeciesNoPersonality(sMailViewResources->mail->species); switch (sMailViewResources->monIconType) { case MAIL_ICON_BEAD: @@ -720,8 +720,8 @@ static void ShowMailCB_Teardown(void) { case MAIL_ICON_BEAD: case MAIL_ICON_DREAM: - FreeMonIconPalette(MailSpeciesToIconSpecies(sMailViewResources->mail->species)); - DestroyMonIcon(&gSprites[sMailViewResources->monIconSpriteId]); + FreeMonIconPalette(GetIconSpeciesNoPersonality(sMailViewResources->mail->species)); + FreeAndDestroyMonIconSprite(&gSprites[sMailViewResources->monIconSpriteId]); break; } *sMailViewResources = (struct MailViewResources){}; diff --git a/src/mail_data.c b/src/mail_data.c index 727d877da..d3ebdc81e 100644 --- a/src/mail_data.c +++ b/src/mail_data.c @@ -80,19 +80,20 @@ u16 SpeciesToMailSpecies(u16 species, u32 personality) return species; } -u16 MailSpeciesToSpecies(u16 mailSpecies, u16 *unownLetter) +u16 MailSpeciesToSpecies(u16 mailSpecies, u16 *buffer) { u16 result; - if (mailSpecies >= UNOWN_OFFSET && mailSpecies < (UNOWN_OFFSET + NUM_UNOWN_FORMS)) + if (mailSpecies >= UNOWN_OFFSET && mailSpecies < UNOWN_OFFSET + NUM_UNOWN_FORMS) { result = SPECIES_UNOWN; - *unownLetter = mailSpecies - UNOWN_OFFSET; + *buffer = mailSpecies - UNOWN_OFFSET; } else { result = mailSpecies; } + return result; } diff --git a/src/mystery_gift_show_card.c b/src/mystery_gift_show_card.c index b73c344e3..b7e57191b 100644 --- a/src/mystery_gift_show_card.c +++ b/src/mystery_gift_show_card.c @@ -464,7 +464,7 @@ static void CreateCardSprites(void) // Create icon sprite if (sWonderCardData->cardMetadata.iconSpecies != SPECIES_NONE) { - sWonderCardData->monIconSpriteId = CreateMonIconNoPersonality(MailSpeciesToIconSpecies(sWonderCardData->cardMetadata.iconSpecies), SpriteCallbackDummy, 220, 20, 0); + sWonderCardData->monIconSpriteId = CreateMonIconNoPersonality(GetIconSpeciesNoPersonality(sWonderCardData->cardMetadata.iconSpecies), SpriteCallbackDummy, 220, 20, 0); gSprites[sWonderCardData->monIconSpriteId].oam.priority = 2; } @@ -480,7 +480,7 @@ static void CreateCardSprites(void) sWonderCardData->stampSpriteIds[i][0] = CreateSprite(&sSpriteTemplate_StampShadow, 216 - 32 * i, 0x90, 8); if (sWonderCardData->cardMetadata.stampData[0][i] != 0) { - sWonderCardData->stampSpriteIds[i][1] = CreateMonIconNoPersonality(MailSpeciesToIconSpecies(sWonderCardData->cardMetadata.stampData[0][i]), SpriteCallbackDummy, 216 - 32 * i, 136, 0); + sWonderCardData->stampSpriteIds[i][1] = CreateMonIconNoPersonality(GetIconSpeciesNoPersonality(sWonderCardData->cardMetadata.stampData[0][i]), SpriteCallbackDummy, 216 - 32 * i, 136, 0); gSprites[sWonderCardData->stampSpriteIds[i][1]].oam.priority = 2; } } @@ -493,7 +493,7 @@ static void DestroyCardSprites(void) // Destroy icon sprite if (sWonderCardData->monIconSpriteId != SPRITE_NONE) - DestroyMonIcon(&gSprites[sWonderCardData->monIconSpriteId]); + FreeAndDestroyMonIconSprite(&gSprites[sWonderCardData->monIconSpriteId]); // Destroy stamp sprites if (sWonderCardData->card.maxStamps != 0 && sWonderCardData->card.type == CARD_TYPE_STAMP) @@ -508,7 +508,7 @@ static void DestroyCardSprites(void) #else if (sWonderCardData->stampSpriteIds[i][0] != SPRITE_NONE) #endif - DestroyMonIcon(&gSprites[sWonderCardData->stampSpriteIds[i][1]]); + FreeAndDestroyMonIconSprite(&gSprites[sWonderCardData->stampSpriteIds[i][1]]); } } FreeSpriteTilesByTag(TAG_STAMP_SHADOW); diff --git a/src/party_menu.c b/src/party_menu.c index 6023e6056..a575ff2d3 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -7494,7 +7494,7 @@ static void Task_TryItemUseFormChange(u8 taskId) if (gTasks[taskId].tAnimWait == 0) { - DestroyMonIcon(icon); + FreeAndDestroyMonIconSprite(icon); CreatePartyMonIconSpriteParameterized(targetSpecies, GetMonData(mon, MON_DATA_PERSONALITY, NULL), &sPartyMenuBoxes[gPartyMenu.slotId], 1); icon->oam.mosaic = TRUE; icon->data[0] = 10; @@ -7699,7 +7699,7 @@ static void TryItemHoldFormChange(struct Pokemon *mon) { PlayCry_NormalNoDucking(targetSpecies, 0, CRY_VOLUME_RS, CRY_VOLUME_RS); SetMonData(mon, MON_DATA_SPECIES, &targetSpecies); - DestroyMonIcon(&gSprites[sPartyMenuBoxes[gPartyMenu.slotId].monSpriteId]); + FreeAndDestroyMonIconSprite(&gSprites[sPartyMenuBoxes[gPartyMenu.slotId].monSpriteId]); CreatePartyMonIconSpriteParameterized(targetSpecies, GetMonData(mon, MON_DATA_PERSONALITY, NULL), &sPartyMenuBoxes[gPartyMenu.slotId], 1); CalculateMonStats(mon); UpdatePartyMonHeldItemSprite(mon, &sPartyMenuBoxes[gPartyMenu.slotId]); diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index 536894fca..00aa93ffc 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -1,143 +1,152 @@ #include "global.h" -#include "gflib.h" -#include "mail.h" -#include "pokemon_icon.h" #include "graphics.h" - -#define POKE_ICON_BASE_PAL_TAG 56000 +#include "mail.h" +#include "palette.h" +#include "pokemon_sprite_visualizer.h" +#include "pokemon_icon.h" +#include "sprite.h" +#include "data.h" +#include "constants/pokemon_icon.h" struct MonIconSpriteTemplate { - const struct OamData * oam; + const struct OamData *oam; const u8 *image; - const union AnimCmd *const * anims; - const union AffineAnimCmd *const * affineAnims; - SpriteCallback callback; + const union AnimCmd *const *anims; + const union AffineAnimCmd *const *affineAnims; + void (*callback)(struct Sprite *); u16 paletteTag; }; -static u8 CreateMonIconSprite(const struct MonIconSpriteTemplate * template, s16 x, s16 y, u8 subpriority); -static void DestroyMonIconInternal(struct Sprite *sprite); +static u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8); +static void FreeAndDestroyMonIconSprite_(struct Sprite *sprite); -const u16 gMonIconPalettes[][16] = { - INCBIN_U16("graphics/pokemon/icon_palettes/pal0.gbapal"), - INCBIN_U16("graphics/pokemon/icon_palettes/pal1.gbapal"), - INCBIN_U16("graphics/pokemon/icon_palettes/pal2.gbapal"), - INCBIN_U16("graphics/pokemon/icon_palettes/pal3.gbapal"), - INCBIN_U16("graphics/pokemon/icon_palettes/pal4.gbapal"), - INCBIN_U16("graphics/pokemon/icon_palettes/pal5.gbapal") -}; - -const struct SpritePalette gMonIconPaletteTable[] = { +const struct SpritePalette gMonIconPaletteTable[] = +{ { gMonIconPalettes[0], POKE_ICON_BASE_PAL_TAG + 0 }, { gMonIconPalettes[1], POKE_ICON_BASE_PAL_TAG + 1 }, { gMonIconPalettes[2], POKE_ICON_BASE_PAL_TAG + 2 }, - // The following three point outside the gMonIconPalettes array - // and are therefore invalid. Fortunately, they are never used. { gMonIconPalettes[3], POKE_ICON_BASE_PAL_TAG + 3 }, { gMonIconPalettes[4], POKE_ICON_BASE_PAL_TAG + 4 }, - { gMonIconPalettes[5], POKE_ICON_BASE_PAL_TAG + 5 } + { gMonIconPalettes[5], POKE_ICON_BASE_PAL_TAG + 5 }, }; -static const struct OamData sMonIconOamData = { +static const struct OamData sMonIconOamData = +{ + .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = FALSE, .bpp = ST_OAM_4BPP, .shape = SPRITE_SHAPE(32x32), - .matrixNum = 0, + .x = 0, .size = SPRITE_SIZE(32x32), - .tileNum = 0x000, + .tileNum = 0, .priority = 1, - .paletteNum = 0 + .paletteNum = 0, }; -static const union AnimCmd sMonIconAnim_Fast[] = { - ANIMCMD_FRAME(0, 6), - ANIMCMD_FRAME(1, 6), - ANIMCMD_JUMP(0) +// fastest to slowest + +static const union AnimCmd sAnim_0[] = +{ + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_JUMP(0), }; -static const union AnimCmd sMonIconAnim_MediumFast[] = { - ANIMCMD_FRAME(0, 8), - ANIMCMD_FRAME(1, 8), - ANIMCMD_JUMP(0) +static const union AnimCmd sAnim_1[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_JUMP(0), }; -static const union AnimCmd sMonIconAnim_MediumSlow[] = { +static const union AnimCmd sAnim_2[] = +{ ANIMCMD_FRAME(0, 14), ANIMCMD_FRAME(1, 14), - ANIMCMD_JUMP(0) + ANIMCMD_JUMP(0), }; -static const union AnimCmd sMonIconAnim_Slow[] = { +static const union AnimCmd sAnim_3[] = +{ ANIMCMD_FRAME(0, 22), ANIMCMD_FRAME(1, 22), - ANIMCMD_JUMP(0) + ANIMCMD_JUMP(0), }; -static const union AnimCmd sMonIconAnim_Still[] = { +static const union AnimCmd sAnim_4[] = +{ ANIMCMD_FRAME(0, 29), - ANIMCMD_FRAME(0, 29), - ANIMCMD_JUMP(0) + ANIMCMD_FRAME(0, 29), // frame 0 is repeated + ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sMonIconAnims[] = { - sMonIconAnim_Fast, - sMonIconAnim_MediumFast, - sMonIconAnim_MediumSlow, - sMonIconAnim_Slow, - sMonIconAnim_Still +static const union AnimCmd *const sMonIconAnims[] = +{ + sAnim_0, + sAnim_1, + sAnim_2, + sAnim_3, + sAnim_4, }; -static const union AffineAnimCmd sMonIconAffineAnim_0[] = { +static const union AffineAnimCmd sAffineAnim_0[] = +{ AFFINEANIMCMD_FRAME(0, 0, 0, 10), - AFFINEANIMCMD_END + AFFINEANIMCMD_END, }; -static const union AffineAnimCmd sMonIconAffineAnim_1[] = { +static const union AffineAnimCmd sAffineAnim_1[] = +{ AFFINEANIMCMD_FRAME(-2, -2, 0, 122), - AFFINEANIMCMD_END + AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const sMonIconAffineAnims[] = { - sMonIconAffineAnim_0, - sMonIconAffineAnim_1 +static const union AffineAnimCmd *const sMonIconAffineAnims[] = +{ + sAffineAnim_0, + sAffineAnim_1, }; -static const u16 sSpriteImageSizes[][4] = { - [ST_OAM_SQUARE] = { - [ST_OAM_SIZE_0] = 0x020, - [ST_OAM_SIZE_1] = 0x080, - [ST_OAM_SIZE_2] = 0x200, - [ST_OAM_SIZE_3] = 0x800, +static const u16 sSpriteImageSizes[3][4] = +{ + [ST_OAM_SQUARE] = + { + [SPRITE_SIZE(8x8)] = 8 * 8 / 2, + [SPRITE_SIZE(16x16)] = 16 * 16 / 2, + [SPRITE_SIZE(32x32)] = 32 * 32 / 2, + [SPRITE_SIZE(64x64)] = 64 * 64 / 2, }, - [ST_OAM_H_RECTANGLE] = { - [ST_OAM_SIZE_0] = 0x040, - [ST_OAM_SIZE_1] = 0x080, - [ST_OAM_SIZE_2] = 0x100, - [ST_OAM_SIZE_3] = 0x400, + [ST_OAM_H_RECTANGLE] = + { + [SPRITE_SIZE(16x8)] = 16 * 8 / 2, + [SPRITE_SIZE(32x8)] = 32 * 8 / 2, + [SPRITE_SIZE(32x16)] = 32 * 16 / 2, + [SPRITE_SIZE(64x32)] = 64 * 32 / 2, }, - [ST_OAM_V_RECTANGLE] = { - [ST_OAM_SIZE_0] = 0x040, - [ST_OAM_SIZE_1] = 0x080, - [ST_OAM_SIZE_2] = 0x100, - [ST_OAM_SIZE_3] = 0x400, + [ST_OAM_V_RECTANGLE] = + { + [SPRITE_SIZE(8x16)] = 8 * 16 / 2, + [SPRITE_SIZE(8x32)] = 8 * 32 / 2, + [SPRITE_SIZE(16x32)] = 16 * 32 / 2, + [SPRITE_SIZE(32x64)] = 32 * 64 / 2, }, }; -u8 CreateMonIcon(u16 species, SpriteCallback callback, s16 x, s16 y, u8 subpriority, u32 personality) +u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality) { u8 spriteId; struct MonIconSpriteTemplate iconTemplate = - { - .oam = &sMonIconOamData, - .image = GetMonIconPtr(species, personality), - .anims = sMonIconAnims, - .affineAnims = sMonIconAffineAnims, - .callback = callback, - .paletteTag = POKE_ICON_BASE_PAL_TAG + gSpeciesInfo[species].iconPalIndex, - }; + { + .oam = &sMonIconOamData, + .image = GetMonIconPtr(species, personality), + .anims = sMonIconAnims, + .affineAnims = sMonIconAffineAnims, + .callback = callback, + .paletteTag = POKE_ICON_BASE_PAL_TAG + gSpeciesInfo[species].iconPalIndex, + }; + species = SanitizeSpeciesId(species); if (species > NUM_SPECIES) iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG; @@ -153,7 +162,8 @@ u8 CreateMonIcon(u16 species, SpriteCallback callback, s16 x, s16 y, u8 subprior return spriteId; } -u8 CreateMonIconNoPersonality(u16 species, SpriteCallback callback, s16 x, s16 y, u8 subpriority) + +u8 CreateMonIconNoPersonality(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) { u8 spriteId; struct MonIconSpriteTemplate iconTemplate = @@ -176,26 +186,10 @@ u8 CreateMonIconNoPersonality(u16 species, SpriteCallback callback, s16 x, s16 y u16 GetIconSpecies(u16 species, u32 personality) { - u16 result; - + species = SanitizeSpeciesId(species); if (species == SPECIES_UNOWN) - { - u16 letter = GetUnownLetterByPersonality(personality); - if (letter == 0) - letter = SPECIES_UNOWN; - else - letter += (SPECIES_UNOWN_B - 1); - result = letter; - } - else - { - if (species > NUM_SPECIES) - result = SPECIES_NONE; - else - result = species; - } - - return result; + species = GetUnownSpeciesId(personality); + return species; } u16 GetUnownLetterByPersonality(u32 personality) @@ -203,47 +197,16 @@ u16 GetUnownLetterByPersonality(u32 personality) if (!personality) return 0; else - return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C; + return GET_UNOWN_LETTER(personality); } -u16 MailSpeciesToIconSpecies(u16 species) +u16 GetIconSpeciesNoPersonality(u16 species) { - u16 value; + species = SanitizeSpeciesId(species); - if (MailSpeciesToSpecies(species, &value) == SPECIES_UNOWN) - { - if (value == 0) - value += SPECIES_UNOWN; - else - value += (SPECIES_UNOWN_B - 1); - return value; - } - else - { - if (species > (SPECIES_UNOWN_B - 1)) - species = SPECIES_NONE; - return GetIconSpecies(species, 0); - } -} - -const u8 *GetMonIconTiles(u16 species, u32 personality) -{ - const u8 *iconSprite; - - if (species > NUM_SPECIES) - species = SPECIES_NONE; - -#if P_GENDER_DIFFERENCES - if (gSpeciesInfo[species].iconSpriteFemale != NULL && IsPersonalityFemale(species, personality)) - iconSprite = gSpeciesInfo[species].iconSpriteFemale; - else -#endif - if (gSpeciesInfo[species].iconSprite != NULL) - iconSprite = gSpeciesInfo[species].iconSprite; - else - iconSprite = gSpeciesInfo[SPECIES_NONE].iconSprite; - - return iconSprite; + if (MailSpeciesToSpecies(species, &species) == SPECIES_UNOWN) + return species += SPECIES_UNOWN_B; // TODO + return GetIconSpecies(species, 0); } const u8 *GetMonIconPtr(u16 species, u32 personality) @@ -251,9 +214,9 @@ const u8 *GetMonIconPtr(u16 species, u32 personality) return GetMonIconTiles(GetIconSpecies(species, personality), personality); } -void DestroyMonIcon(struct Sprite *sprite) +void FreeAndDestroyMonIconSprite(struct Sprite *sprite) { - DestroyMonIconInternal(sprite); + FreeAndDestroyMonIconSprite_(sprite); } void LoadMonIconPalettes(void) @@ -263,20 +226,18 @@ void LoadMonIconPalettes(void) LoadSpritePalette(&gMonIconPaletteTable[i]); } +// unused void SafeLoadMonIconPalette(u16 species) { u8 palIndex; - if (species > NUM_SPECIES) - species = SPECIES_NONE; - palIndex = gSpeciesInfo[species].iconPalIndex; + palIndex = gSpeciesInfo[SanitizeSpeciesId(species)].iconPalIndex; if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) LoadSpritePalette(&gMonIconPaletteTable[palIndex]); } void LoadMonIconPalette(u16 species) { - u8 palIndex; - palIndex = gSpeciesInfo[species].iconPalIndex; + u8 palIndex = gSpeciesInfo[SanitizeSpeciesId(species)].iconPalIndex; if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) LoadSpritePalette(&gMonIconPaletteTable[palIndex]); } @@ -302,19 +263,18 @@ void FreeMonIconPalettes(void) FreeSpritePaletteByTag(gMonIconPaletteTable[i].tag); } +// unused void SafeFreeMonIconPalette(u16 species) { u8 palIndex; - if (species > NUM_SPECIES) - species = SPECIES_NONE; - palIndex = gSpeciesInfo[species].iconPalIndex; + palIndex = gSpeciesInfo[SanitizeSpeciesId(species)].iconPalIndex; FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); } void FreeMonIconPalette(u16 species) { u8 palIndex; - palIndex = gSpeciesInfo[species].iconPalIndex; + palIndex = gSpeciesInfo[SanitizeSpeciesId(species)].iconPalIndex; FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); } @@ -323,9 +283,29 @@ void SpriteCB_MonIcon(struct Sprite *sprite) UpdateMonIconFrame(sprite); } -void LoadMonIconPalettesAt(u16 offset) +const u8 *GetMonIconTiles(u16 species, u32 personality) { - int i; + const u8 *iconSprite; + + if (species > NUM_SPECIES) + species = SPECIES_NONE; + +#if P_GENDER_DIFFERENCES + if (gSpeciesInfo[species].iconSpriteFemale != NULL && IsPersonalityFemale(species, personality)) + iconSprite = gSpeciesInfo[species].iconSpriteFemale; + else +#endif + if (gSpeciesInfo[species].iconSprite != NULL) + iconSprite = gSpeciesInfo[species].iconSprite; + else + iconSprite = gSpeciesInfo[SPECIES_NONE].iconSprite; + + return iconSprite; +} + +void TryLoadAllMonIconPalettesAtOffset(u16 offset) +{ + s32 i; if (offset <= BG_PLTT_ID(16 - ARRAY_COUNT(gMonIconPaletteTable))) { for (i = 0; i < (int)ARRAY_COUNT(gMonIconPaletteTable); i++) @@ -336,23 +316,19 @@ void LoadMonIconPalettesAt(u16 offset) } } -const u16 *GetValidMonIconPalettePtr(u16 species) -{ - if (species > NUM_SPECIES) - species = SPECIES_NONE; - return gMonIconPaletteTable[gSpeciesInfo[species].iconPalIndex].data; -} - u8 GetValidMonIconPalIndex(u16 species) { - if (species > NUM_SPECIES) - species = SPECIES_NONE; - return gSpeciesInfo[species].iconPalIndex; + return gSpeciesInfo[SanitizeSpeciesId(species)].iconPalIndex; } u8 GetMonIconPaletteIndexFromSpecies(u16 species) { - return gSpeciesInfo[species].iconPalIndex; + return gSpeciesInfo[SanitizeSpeciesId(species)].iconPalIndex; +} + +const u16 *GetValidMonIconPalettePtr(u16 species) +{ + return gMonIconPaletteTable[gSpeciesInfo[SanitizeSpeciesId(species)].iconPalIndex].data; } u8 UpdateMonIconFrame(struct Sprite *sprite) @@ -391,7 +367,7 @@ u8 UpdateMonIconFrame(struct Sprite *sprite) return result; } -static u8 CreateMonIconSprite(const struct MonIconSpriteTemplate * iconTemplate, s16 x, s16 y, u8 subpriority) +static u8 CreateMonIconSprite(struct MonIconSpriteTemplate *iconTemplate, s16 x, s16 y, u8 subpriority) { u8 spriteId; @@ -415,7 +391,7 @@ static u8 CreateMonIconSprite(const struct MonIconSpriteTemplate * iconTemplate, return spriteId; } -static void DestroyMonIconInternal(struct Sprite *sprite) +static void FreeAndDestroyMonIconSprite_(struct Sprite *sprite) { struct SpriteFrameImage image = { NULL, sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] }; sprite->images = ℑ diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index 7711298af..025fb9c16 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -29,6 +29,7 @@ #include "constants/help_system.h" #include "constants/item_menu.h" #include "constants/items.h" +#include "constants/pokemon_icon.h" #include "constants/songs.h" @@ -218,7 +219,7 @@ enum { enum { - PALTAG_MON_ICON_0 = 56000, + PALTAG_MON_ICON_0 = POKE_ICON_BASE_PAL_TAG, PALTAG_MON_ICON_1, // Used implicitly in CreateMonIconSprite PALTAG_MON_ICON_2, // Used implicitly in CreateMonIconSprite PALTAG_3, // Unused @@ -7741,7 +7742,7 @@ static bool8 MultiMove_Function_Start(void) { case 0: HideBg(0); - LoadMonIconPalettesAt(BG_PLTT_ID(8)); + TryLoadAllMonIconPalettesAtOffset(BG_PLTT_ID(8)); sMultiMove->state++; break; case 1: diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 7a230821f..2acb1e851 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -4611,7 +4611,7 @@ static void PokeSum_DestroyMonIconSprite(void) u16 species; species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG); SafeFreeMonIconPalette(species); - DestroyMonIcon(&gSprites[sMonSummaryScreen->monIconSpriteId]); + FreeAndDestroyMonIconSprite(&gSprites[sMonSummaryScreen->monIconSpriteId]); } static void CreateMoveSelectionCursorObjs(u16 tileTag, u16 palTag) diff --git a/src/trainer_card.c b/src/trainer_card.c index 133713aa0..13b0a735c 100644 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -901,12 +901,12 @@ void TrainerCard_GenerateCardForLinkPlayer(struct TrainerCard *trainerCard) trainerCard->monIconTint = VarGet(VAR_TRAINER_CARD_MON_ICON_TINT_IDX); - trainerCard->monSpecies[0] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_1)); - trainerCard->monSpecies[1] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_2)); - trainerCard->monSpecies[2] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_3)); - trainerCard->monSpecies[3] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_4)); - trainerCard->monSpecies[4] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_5)); - trainerCard->monSpecies[5] = MailSpeciesToIconSpecies(VarGet(VAR_TRAINER_CARD_MON_ICON_6)); + trainerCard->monSpecies[0] = GetIconSpeciesNoPersonality(VarGet(VAR_TRAINER_CARD_MON_ICON_1)); + trainerCard->monSpecies[1] = GetIconSpeciesNoPersonality(VarGet(VAR_TRAINER_CARD_MON_ICON_2)); + trainerCard->monSpecies[2] = GetIconSpeciesNoPersonality(VarGet(VAR_TRAINER_CARD_MON_ICON_3)); + trainerCard->monSpecies[3] = GetIconSpeciesNoPersonality(VarGet(VAR_TRAINER_CARD_MON_ICON_4)); + trainerCard->monSpecies[4] = GetIconSpeciesNoPersonality(VarGet(VAR_TRAINER_CARD_MON_ICON_5)); + trainerCard->monSpecies[5] = GetIconSpeciesNoPersonality(VarGet(VAR_TRAINER_CARD_MON_ICON_6)); } static void SetDataFromTrainerCard(void)