diff --git a/src/pokemon_sprite_visualizer.c b/src/pokemon_sprite_visualizer.c index 44515a54e3..d4a17d7a69 100644 --- a/src/pokemon_sprite_visualizer.c +++ b/src/pokemon_sprite_visualizer.c @@ -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);