Various sprite visualizer fixes if configs disabled (#8697)

Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>
This commit is contained in:
John Cooper McDonald 2026-01-03 11:21:36 -06:00 committed by GitHub
parent eba17e6860
commit a15d51083a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -471,7 +471,7 @@ static void PrintInstructionsOnWindow(struct PokemonSpriteVisualizer *data)
{
AddTextPrinterParameterized(WIN_BOTTOM_LEFT, fontId, textL, 30, 0, 0, NULL);
AddTextPrinterParameterized(WIN_BOTTOM_LEFT, fontId, textR, 30, 12, 0, NULL);
if (GetSpeciesFormTable(data->currentmonId) != NULL)
if (GetSpeciesFormTable(species) != NULL)
AddTextPrinterParameterized(WIN_BOTTOM_LEFT, fontId, textBottomForms, 0, 0, 0, NULL);
else
AddTextPrinterParameterized(WIN_BOTTOM_LEFT, fontId, textBottom, 0, 0, 0, NULL);
@ -722,7 +722,7 @@ static void BattleLoadOpponentMonSpriteGfxCustom(u16 species, bool8 isFemale, bo
static void SetConstSpriteValues(struct PokemonSpriteVisualizer *data)
{
u16 species = data->currentmonId;
u16 species = SanitizeSpeciesId(data->currentmonId);
data->constSpriteValues.frontPicCoords = gSpeciesInfo[species].frontPicYOffset;
data->constSpriteValues.frontElevation = gSpeciesInfo[species].enemyMonElevation;
data->constSpriteValues.backPicCoords = gSpeciesInfo[species].backPicYOffset;
@ -735,11 +735,11 @@ static void ResetOffsetSpriteValues(struct PokemonSpriteVisualizer *data)
data->offsetsSpriteValues.offset_front_elevation = 0;
}
static void ResetShadowSettings(struct PokemonSpriteVisualizer *data, u16 species)
static void ResetShadowSettings(struct PokemonSpriteVisualizer *data)
{
if (B_ENEMY_MON_SHADOW_STYLE <= GEN_3 || P_GBA_STYLE_SPECIES_GFX == TRUE)
return;
u16 species = SanitizeSpeciesId(data->currentmonId);
data->shadowSettings.definedX = gSpeciesInfo[species].enemyShadowXOffset;
data->shadowSettings.definedY = gSpeciesInfo[species].enemyShadowYOffset;
data->shadowSettings.definedSize = gSpeciesInfo[species].enemyShadowSize;
@ -836,10 +836,10 @@ static void SpriteCB_Follower(struct Sprite *sprite)
}
}
static void LoadAndCreateEnemyShadowSpriteCustom(struct PokemonSpriteVisualizer *data, u16 species)
static void LoadAndCreateEnemyShadowSpriteCustom(struct PokemonSpriteVisualizer *data)
{
bool8 invisible = FALSE;
species = SanitizeSpeciesId(species);
u16 species = SanitizeSpeciesId(data->currentmonId);
if (B_ENEMY_MON_SHADOW_STYLE >= GEN_4 && P_GBA_STYLE_SPECIES_GFX == FALSE)
{
@ -1038,6 +1038,32 @@ static void UpdateBattleBg(u8 taskId, bool8 increment)
LoadBattleBg(data->battleBgType, data->battleEnvironment);
}
static void DrawFollowerSprite(struct PokemonSpriteVisualizer *data)
{
if (!OW_POKEMON_OBJECT_EVENTS)
return;
u16 species = SanitizeSpeciesId(data->currentmonId);
u16 graphicsId = species + OBJ_EVENT_MON;
if (data->isShiny)
graphicsId += OBJ_EVENT_MON_SHINY;
if (data->isFemale)
graphicsId += OBJ_EVENT_MON_FEMALE;
data->followerspriteId = CreateObjectGraphicsSprite(graphicsId,
SpriteCB_Follower,
VISUALIZER_FOLLOWER_X,
VISUALIZER_FOLLOWER_Y,
0);
gSprites[data->followerspriteId].oam.priority = 0;
const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, data->isShiny, data->isFemale);
gSprites[data->followerspriteId].oam.shape = graphicsInfo->oam->shape;
gSprites[data->followerspriteId].oam.size = graphicsInfo->oam->size;
gSprites[data->followerspriteId].images = graphicsInfo->images;
gSprites[data->followerspriteId].anims = graphicsInfo->anims;
gSprites[data->followerspriteId].subspriteTables = graphicsInfo->subspriteTables;
}
// *******************************
// Main functions
static void UpdateMonAnimNames(u8 taskId)
@ -1245,7 +1271,7 @@ void CB2_Pokemon_Sprite_Visualizer(void)
SetStructPtr(taskId, data);
data->currentmonId = SPECIES_BULBASAUR;
species = data->currentmonId;
species = SanitizeSpeciesId(data->currentmonId);
//Print instructions
PrintInstructionsOnWindow(data);
@ -1255,8 +1281,6 @@ void CB2_Pokemon_Sprite_Visualizer(void)
LoadSpritePaletteWithTag(palette, species);
//Front
HandleLoadSpecialPokePic(TRUE, gMonSpritesGfxPtr->spritesGfx[1], species, (data->isFemale ? FEMALE_PERSONALITY : MALE_PERSONALITY));
data->isShiny = FALSE;
data->isFemale = FALSE;
BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 1);
SetMultiuseSpriteTemplateToPokemon(species, 1);
gMultiuseSpriteTemplate.paletteTag = species;
@ -1266,15 +1290,15 @@ void CB2_Pokemon_Sprite_Visualizer(void)
gSprites[data->frontspriteId].callback = SpriteCallbackDummy;
gSprites[data->frontspriteId].oam.priority = 0;
//Front Shadow
LoadAndCreateEnemyShadowSpriteCustom(data, species);
LoadAndCreateEnemyShadowSpriteCustom(data);
//Back
HandleLoadSpecialPokePic(FALSE, gMonSpritesGfxPtr->spritesGfx[2], species, (data->isFemale ? FEMALE_PERSONALITY : MALE_PERSONALITY));
BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 4);
BattleLoadOpponentMonSpriteGfxCustom(species, data->isFemale, data->isShiny, 5);
SetMultiuseSpriteTemplateToPokemon(species, 2);
offset_y = gSpeciesInfo[species].backPicYOffset;
data->backspriteId = CreateSprite(&gMultiuseSpriteTemplate, VISUALIZER_MON_BACK_X, VISUALIZER_MON_BACK_Y + offset_y, 0);
gSprites[data->backspriteId].oam.paletteNum = 4;
gSprites[data->backspriteId].oam.paletteNum = 5;
gSprites[data->backspriteId].callback = SpriteCallbackDummy;
gSprites[data->backspriteId].oam.priority = 0;
@ -1283,26 +1307,7 @@ void CB2_Pokemon_Sprite_Visualizer(void)
gSprites[data->iconspriteId].oam.priority = 0;
//Follower Sprite
u16 graphicsId = species + OBJ_EVENT_MON;
if (data->isShiny)
graphicsId += OBJ_EVENT_MON_SHINY;
if (data->isFemale)
graphicsId += OBJ_EVENT_MON_FEMALE;
data->followerspriteId = CreateObjectGraphicsSprite(graphicsId,
SpriteCB_Follower,
VISUALIZER_FOLLOWER_X,
VISUALIZER_FOLLOWER_Y,
0);
gSprites[data->followerspriteId].oam.priority = 0;
const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, data->isShiny, data->isFemale);
if (graphicsInfo != NULL)
{
gSprites[data->followerspriteId].oam.shape = graphicsInfo->oam->shape;
gSprites[data->followerspriteId].oam.size = graphicsInfo->oam->size;
gSprites[data->followerspriteId].images = graphicsInfo->images;
gSprites[data->followerspriteId].anims = graphicsInfo->anims;
gSprites[data->followerspriteId].subspriteTables = graphicsInfo->subspriteTables;
}
DrawFollowerSprite(data);
//Modify Arrows
SetUpModifyArrows(data);
@ -1316,7 +1321,7 @@ void CB2_Pokemon_Sprite_Visualizer(void)
//Anim names
data->animIdBack = GetSpeciesBackAnimSet(species) + 1;
data->animIdFront = gSpeciesInfo[data->currentmonId].frontAnimId;
data->animIdFront = gSpeciesInfo[species].frontAnimId;
UpdateMonAnimNames(taskId);
//BattleNg Name
@ -1386,7 +1391,7 @@ static void ResetBGs_PokemonSpriteVisualizer(u16 a)
static void ApplyOffsetSpriteValues(struct PokemonSpriteVisualizer *data)
{
u16 species = data->currentmonId;
u16 species = SanitizeSpeciesId(data->currentmonId);
//Back
gSprites[data->backspriteId].y = VISUALIZER_MON_BACK_Y + gSpeciesInfo[species].backPicYOffset + data->offsetsSpriteValues.offset_back_picCoords;
//Front
@ -1399,6 +1404,7 @@ static void ApplyOffsetSpriteValues(struct PokemonSpriteVisualizer *data)
static void UpdateSubmenuOneOptionValue(u8 taskId, bool8 increment)
{
struct PokemonSpriteVisualizer *data = GetStructPtr(taskId);
u16 species = SanitizeSpeciesId(data->currentmonId);
u8 option = data->submenuYpos[1];
switch (option)
@ -1441,15 +1447,15 @@ static void UpdateSubmenuOneOptionValue(u8 taskId, bool8 increment)
UpdateBattleBg(taskId, increment);
break;
case 3:
if (GetSpeciesFormTable(data->currentmonId) != NULL)
if (GetSpeciesFormTable(species) != NULL)
{
struct PokemonSpriteVisualizerModifyArrows *modArrows = &data->modifyArrows;
u8 formId = GetFormIdFromFormSpeciesId(data->currentmonId);
const u16 *formTable = GetSpeciesFormTable(data->currentmonId);
u8 formId = GetFormIdFromFormSpeciesId(species);
const u16 *formTable = GetSpeciesFormTable(species);
if (increment)
{
if (formTable[formId + 1] != FORM_SPECIES_END)
modArrows->currValue = GetFormSpeciesId(data->currentmonId, formId + 1);
modArrows->currValue = GetFormSpeciesId(species, formId + 1);
else
modArrows->currValue = formTable[0];
}
@ -1466,13 +1472,13 @@ static void UpdateSubmenuOneOptionValue(u8 taskId, bool8 increment)
modArrows->currValue = formTable[lastForm];
}
else
modArrows->currValue = GetFormSpeciesId(data->currentmonId, formId - 1);
modArrows->currValue = GetFormSpeciesId(species, formId - 1);
}
data->animIdBack = GetSpeciesBackAnimSet(modArrows->currValue) + 1;
data->animIdFront = gSpeciesInfo[modArrows->currValue].frontAnimId;
UpdateMonAnimNames(taskId);
ResetOffsetSpriteValues(data);
ResetShadowSettings(data, modArrows->currValue);
ResetShadowSettings(data);
UpdateBattlerValue(data);
ReloadPokemonSprites(data);
@ -1488,7 +1494,7 @@ static void UpdateSubmenuOneOptionValue(u8 taskId, bool8 increment)
static void UpdateSubmenuTwoOptionValue(u8 taskId, bool8 increment)
{
struct PokemonSpriteVisualizer *data = GetStructPtr(taskId);
u16 species = data->currentmonId;
u16 species = SanitizeSpeciesId(data->currentmonId);
u8 option = data->submenuYpos[2];
s8 offset;
u8 y;
@ -1659,27 +1665,28 @@ static void Task_AnimateAfterDelay(u8 taskId)
static void HandleInput_PokemonSpriteVisualizer(u8 taskId)
{
struct PokemonSpriteVisualizer *data = GetStructPtr(taskId);
u16 species = SanitizeSpeciesId(data->currentmonId);
struct Sprite *Frontsprite = &gSprites[data->frontspriteId];
struct Sprite *Backsprite = &gSprites[data->backspriteId];
if (JOY_NEW(L_BUTTON) && (Backsprite->callback == SpriteCallbackDummy))
{
PlayCryInternal(data->currentmonId, 0, 120, 10, CRY_MODE_NORMAL);
PlayCryInternal(species, 0, 120, 10, CRY_MODE_NORMAL);
LaunchAnimationTaskForBackSprite(Backsprite, data->animIdBack-1);
}
if (JOY_NEW(R_BUTTON) && (Frontsprite->callback == SpriteCallbackDummy))
{
PlayCryInternal(data->currentmonId, 0, 120, 10, CRY_MODE_NORMAL);
if (HasTwoFramesAnimation(data->currentmonId))
PlayCryInternal(species, 0, 120, 10, CRY_MODE_NORMAL);
if (HasTwoFramesAnimation(species))
StartSpriteAnim(Frontsprite, 1);
if (gSpeciesInfo[data->currentmonId].frontAnimDelay != 0)
if (gSpeciesInfo[species].frontAnimDelay != 0)
{
// Animation has delay, start delay task
u8 taskId = CreateTask(Task_AnimateAfterDelay, 0);
STORE_PTR_IN_TASK(Frontsprite, taskId, 0);
gTasks[taskId].sAnimId = data->animIdFront;
gTasks[taskId].sAnimDelay = gSpeciesInfo[data->currentmonId].frontAnimDelay;
gTasks[taskId].sAnimDelay = gSpeciesInfo[species].frontAnimDelay;
}
else
{
@ -1698,7 +1705,7 @@ static void HandleInput_PokemonSpriteVisualizer(u8 taskId)
ReloadPokemonSprites(data);
ApplyOffsetSpriteValues(data);
}
if (JOY_NEW(SELECT_BUTTON) && SpeciesHasGenderDifferences(data->currentmonId))
if (JOY_NEW(SELECT_BUTTON) && SpeciesHasGenderDifferences(species))
{
data->isFemale = !data->isFemale;
PrintDigitChars(data);
@ -1729,10 +1736,10 @@ static void HandleInput_PokemonSpriteVisualizer(u8 taskId)
data->isFemale = FALSE;
PrintDigitChars(data);
UpdateBattlerValue(data);
ResetShadowSettings(data, data->currentmonId);
ResetShadowSettings(data);
ReloadPokemonSprites(data);
data->animIdBack = GetSpeciesBackAnimSet(data->currentmonId) + 1;
data->animIdFront = gSpeciesInfo[data->currentmonId].frontAnimId;
data->animIdBack = GetSpeciesBackAnimSet(species) + 1;
data->animIdFront = gSpeciesInfo[species].frontAnimId;
UpdateMonAnimNames(taskId);
ResetOffsetSpriteValues(data);
}
@ -1746,10 +1753,10 @@ static void HandleInput_PokemonSpriteVisualizer(u8 taskId)
data->isFemale = FALSE;
PrintDigitChars(data);
UpdateBattlerValue(data);
ResetShadowSettings(data, data->currentmonId);
ResetShadowSettings(data);
ReloadPokemonSprites(data);
data->animIdBack = GetSpeciesBackAnimSet(data->currentmonId) + 1;
data->animIdFront = gSpeciesInfo[data->currentmonId].frontAnimId;
data->animIdBack = GetSpeciesBackAnimSet(species) + 1;
data->animIdFront = gSpeciesInfo[species].frontAnimId;
UpdateMonAnimNames(taskId);
ResetOffsetSpriteValues(data);
}
@ -1786,7 +1793,8 @@ static void HandleInput_PokemonSpriteVisualizer(u8 taskId)
SetConstSpriteValues(data);
UpdateYPosOffsetText(data);
gSprites[data->followerspriteId].invisible = TRUE;
if (data->followerspriteId != 0)
gSprites[data->followerspriteId].invisible = TRUE;
}
else if (JOY_NEW(B_BUTTON))
{
@ -1805,7 +1813,7 @@ static void HandleInput_PokemonSpriteVisualizer(u8 taskId)
data->submenuYpos[1] += 1;
if (data->submenuYpos[1] >= 3)
{
if ((GetSpeciesFormTable(data->currentmonId) == NULL) || (data->submenuYpos[1] >= 4))
if ((GetSpeciesFormTable(species) == NULL) || (data->submenuYpos[1] >= 4))
data->submenuYpos[1] = 0;
}
data->optionArrows.currentDigit = data->submenuYpos[1];
@ -1815,7 +1823,7 @@ static void HandleInput_PokemonSpriteVisualizer(u8 taskId)
{
if (data->submenuYpos[1] == 0)
{
if (GetSpeciesFormTable(data->currentmonId) != NULL)
if (GetSpeciesFormTable(species) != NULL)
data->submenuYpos[1] = 3;
else
data->submenuYpos[1] = 2;
@ -1851,8 +1859,9 @@ static void HandleInput_PokemonSpriteVisualizer(u8 taskId)
SetArrowInvisibility(data);
PrintInstructionsOnWindow(data);
UpdateMonAnimNames(taskId);
gSprites[data->followerspriteId].invisible = FALSE;
if (data->followerspriteId != 0)
gSprites[data->followerspriteId].invisible = FALSE;
}
else if (JOY_NEW(DPAD_DOWN))
{
@ -1933,7 +1942,7 @@ static void HandleInput_PokemonSpriteVisualizer(u8 taskId)
static void ReloadPokemonSprites(struct PokemonSpriteVisualizer *data)
{
const u16 *palette;
u16 species = data->currentmonId;
u16 species = SanitizeSpeciesId(data->currentmonId);
s16 offset_y;
u8 front_x = sBattlerCoords[0][1].x;
u8 front_y;
@ -1941,7 +1950,9 @@ static void ReloadPokemonSprites(struct PokemonSpriteVisualizer *data)
DestroySprite(&gSprites[data->frontspriteId]);
DestroySprite(&gSprites[data->backspriteId]);
DestroySprite(&gSprites[data->iconspriteId]);
DestroySprite(&gSprites[data->followerspriteId]);
if (data->followerspriteId != 0)
DestroySprite(&gSprites[data->followerspriteId]);
DestroySprite(&gSprites[data->frontShadowSpriteIdPrimary]);
if (B_ENEMY_MON_SHADOW_STYLE >= GEN_4 && P_GBA_STYLE_SPECIES_GFX == FALSE)
@ -1974,7 +1985,7 @@ static void ReloadPokemonSprites(struct PokemonSpriteVisualizer *data)
gSprites[data->frontspriteId].callback = SpriteCallbackDummy;
gSprites[data->frontspriteId].oam.priority = 0;
//Front Shadow
LoadAndCreateEnemyShadowSpriteCustom(data, species);
LoadAndCreateEnemyShadowSpriteCustom(data);
//Back
HandleLoadSpecialPokePic(FALSE, gMonSpritesGfxPtr->spritesGfx[2], species, (data->isFemale ? FEMALE_PERSONALITY : MALE_PERSONALITY));
@ -1991,26 +2002,7 @@ static void ReloadPokemonSprites(struct PokemonSpriteVisualizer *data)
gSprites[data->iconspriteId].oam.priority = 0;
//Follower Sprite
u16 graphicsId = species + OBJ_EVENT_MON;
if (data->isShiny)
graphicsId += OBJ_EVENT_MON_SHINY;
if (data->isFemale)
graphicsId += OBJ_EVENT_MON_FEMALE;
data->followerspriteId = CreateObjectGraphicsSprite(graphicsId,
SpriteCB_Follower,
VISUALIZER_FOLLOWER_X,
VISUALIZER_FOLLOWER_Y,
0);
gSprites[data->followerspriteId].oam.priority = 0;
const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, data->isShiny, data->isFemale);
if (graphicsInfo != NULL)
{
gSprites[data->followerspriteId].oam.shape = graphicsInfo->oam->shape;
gSprites[data->followerspriteId].oam.size = graphicsInfo->oam->size;
gSprites[data->followerspriteId].images = graphicsInfo->images;
gSprites[data->followerspriteId].anims = graphicsInfo->anims;
gSprites[data->followerspriteId].subspriteTables = graphicsInfo->subspriteTables;
}
DrawFollowerSprite(data);
//Modify Arrows
LoadSpritePalette(&gSpritePalette_Arrow);