sync pokemon_icon.c

This commit is contained in:
cawtds 2025-05-02 02:01:08 +02:00
parent fa53e4f99e
commit 0132879bcd
14 changed files with 191 additions and 195 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 = &image;

View File

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

View File

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

View File

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