pokefirered/src/pokemon_summary_screen.c
2025-05-02 02:01:08 +02:00

5652 lines
180 KiB
C

#include "global.h"
#include "gflib.h"
#include "graphics.h"
#include "decompress.h"
#include "pokemon.h"
#include "pokemon_summary_screen.h"
#include "help_system.h"
#include "task.h"
#include "menu_helpers.h"
#include "link.h"
#include "overworld.h"
#include "constants/songs.h"
#include "strings.h"
#include "menu.h"
#include "constants/items.h"
#include "pokemon_sprite_visualizer.h"
#include "data.h"
#include "item.h"
#include "constants/party_menu.h"
#include "trade.h"
#include "battle_main.h"
#include "scanline_effect.h"
#include "constants/moves.h"
#include "dynamic_placeholder_text_util.h"
#include "constants/region_map_sections.h"
#include "region_map.h"
#include "field_specials.h"
#include "party_menu.h"
#include "constants/battle.h"
#include "event_data.h"
#include "trainer_pokemon_sprites.h"
#include "battle_anim.h"
#include "pokeball.h"
#include "pokemon_icon.h"
#include "battle_interface.h"
#include "mon_markings.h"
#include "pokemon_storage_system.h"
#include "constants/battle_move_effects.h"
#include "constants/sound.h"
#define TAG_MOVE_TYPES 30002
#define TAG_CATEGORY_ICONS 30004
// needs conflicting header to match (curIndex is s8 in the function, but has to be defined as u8 here)
extern s16 SeekToNextMonInBox(struct BoxPokemon * boxMons, u8 curIndex, u8 maxIndex, u8 flags);
static void BufferSelectedMonData(struct Pokemon * mon);
static void CB2_SetUpPSS(void);
static void PokeSum_TryPlayMonCry(void);
static void PokeSum_RemoveWindows(u8 curPageIndex);
static void Task_PokeSum_FlipPages(u8 taskId);
static void Task_FlipPages_FromInfo(u8 taskId);
static void Task_PokeSum_SwitchDisplayedPokemon(u8 taskId);
static void PokeSum_SeekToNextMon(u8 taskId, s8 direction);
static void Task_DestroyResourcesOnExit(u8 taskId);
static void PokeSum_HideSpritesBeforePageFlip(void);
static void PokeSum_ShowSpritesBeforePageFlip(void);
static void PokeSum_UpdateWin1ActiveFlag(u8 curPageIndex);
static void PokeSum_AddWindows(u8 curPageIndex);
static void PokeSum_PrintPageHeaderText(u8 curPageIndex);
static void PokeSum_InitBgCoordsBeforePageFlips(void);
static u8 PokeSum_IsPageFlipFinished(u8);
static void PokeSum_SetHelpContext(void);
static void Task_HandleInput_SelectMove(u8 id);
static void PokeSum_CopyNewBgTilemapBeforePageFlip_2(void);
static void PokeSum_CopyNewBgTilemapBeforePageFlip(void);
static void PokeSum_DrawPageProgressTiles(void);
static void PokeSum_PrintRightPaneText(void);
static void PokeSum_PrintBottomPaneText(void);
static void PokeSum_PrintAbilityDataOrMoveTypes(void);
static void PokeSum_PrintMonTypeIcons(void);
static void PokeSum_PrintPageName(const u8 * str);
static void PokeSum_PrintControlsString(const u8 * str);
static void PrintMonLevelNickOnWindow2(const u8 * str);
static void PokeSum_UpdateBgPriorityForPageFlip(u8 setBg0Priority, u8 keepBg1Bg2PriorityOrder);
static void ShowOrHideHpBarObjs(u8 invisible);
static void ShowOrHideExpBarObjs(u8 invisible);
static void PokeSum_ShowOrHideMonPicSprite(u8 invisible);
static void PokeSum_ShowOrHideMonMarkingsSprite(u8 invisible);
static void ShowOrHideBallIconObj(u8 invisible);
static void ShowOrHideStatusIcon(u8 invisible);
static void HideShowPokerusIcon(u8 invisible);
static void HideShowShinyStar(u8 invisible);
static void ShoworHideMoveSelectionCursor(u8 invisible);
static void PokeSum_ShowOrHideMonIconSprite(u8 invisible);
static void PokeSum_Setup_ResetCallbacks(void);
static void PokeSum_Setup_InitGpu(void);
static void PokeSum_Setup_SpritesReset(void);
static u8 PokeSum_HandleLoadBgGfx(void);
static u8 PokeSum_HandleCreateSprites(void);
static void PokeSum_CreateWindows(void);
static u8 PokeSum_Setup_BufferStrings(void);
static void CommitStaticWindowTilemaps(void);
static void PokeSum_Setup_SetVBlankCallback(void);
static void PokeSum_FinishSetup(void);
static void BufferMonInfo(void);
static void BufferMonSkills(void);
static void BufferMonMoves(void);
static u8 StatusToAilment(u32 status);
static void BufferMonMoveI(u8);
static u16 GetMonMoveBySlotId(struct Pokemon * mon, u8 moveSlot);
static u16 GetMonPpByMoveSlot(struct Pokemon * mon, u8 moveSlot);
static void CreateShinyStarObj(u16, u16);
static void CreatePokerusIconObj(u16, u16);
static void PokeSum_CreateMonMarkingsSprite(void);
static void CreateMoveSelectionCursorObjs(u16, u16);
static void CreateMonStatusIconObj(u16, u16);
static void CreateHpBarObjs(u16, u16);
static void CreateExpBarObjs(u16, u16);
static void CreateBallIconObj(void);
static void PokeSum_CreateMonIconSprite(void);
static void PokeSum_CreateMonPicSprite(void);
static void Task_InputHandler_SelectOrForgetMove(u8 taskId);
static void CB2_RunPokemonSummaryScreen(void);
static void PrintInfoPage(void);
static void PrintSkillsPage(void);
static void PrintMovesPage(void);
static void PokeSum_PrintMoveName(u8 i);
static void PokeSum_PrintTrainerMemo(void);
static void PokeSum_PrintExpPoints_NextLv(void);
static void PokeSum_PrintSelectedMoveStats(void);
static void PokeSum_PrintTrainerMemo_Mon(void);
static void PokeSum_PrintTrainerMemo_Egg(void);
static bool32 MapSecIsInKantoOrSevii(u8 mapSec);
static bool32 IsMultiBattlePartner(void);
static bool32 PokeSum_IsMonBoldOrGentle(u8 nature);
static void PokeSum_PrintTrainerMemo_Mon_NotHeldByOT(void);
static bool32 CurrentMonIsFromGBA(void);
static u8 PokeSum_BufferOtName_IsEqualToCurrentOwner(struct Pokemon * mon);
static void PokeSum_PrintAbilityNameAndDesc(void);
static void PokeSum_DrawMoveTypeIcons(void);
static void PokeSum_DestroySprites(void);
static void PokeSum_FlipPages_HandleBgHofs(void);
static void SwapMonMoveSlots(void);
static void SwapBoxMonMoveSlots(void);
static void UpdateCurrentMonBufferFromPartyOrBox(struct Pokemon * mon);
static void PokeSum_SetMonPicSpriteCallback(u16 spriteId);
static void SpriteCB_MoveSelectionCursor(struct Sprite *sprite);
static void UpdateMonStatusIconObj(void);
static void UpdateHpBarObjs(void);
static void UpdateExpBarObjs(void);
static void ShowPokerusIconObjIfHasOrHadPokerus(void);
static void ShowShinyStarObjIfMonShiny(void);
static void PokeSum_DestroyMonMarkingsSprite(void);
static void PokeSum_UpdateMonMarkingsAnim(void);
static s8 SeekToNextMonInSingleParty(s8 direction);
static s8 SeekToNextMonInMultiParty(s8 direction);
struct PokemonSummaryScreenData
{
u16 bg1TilemapBuffer[0x800];
u16 bg2TilemapBuffer[0x800];
u16 bg3TilemapBuffer[0x800];
u8 ALIGNED(4) windowIds[7];
u8 ALIGNED(4) unk3008;
u8 ALIGNED(4) ballIconSpriteId;
u8 ALIGNED(4) monPicSpriteId;
u8 ALIGNED(4) monIconSpriteId;
u8 ALIGNED(4) inputHandlerTaskId;
u8 ALIGNED(4) inhibitPageFlipInput;
u8 ALIGNED(4) numMonPicBounces;
bool32 isEnemyParty; /* 0x3024 */
struct PokeSummary
{
u8 ALIGNED(4) speciesNameStrBuf[POKEMON_NAME_LENGTH];
u8 ALIGNED(4) nicknameStrBuf[POKEMON_NAME_LENGTH + 1];
u8 ALIGNED(4) otNameStrBuf[12];
u8 ALIGNED(4) otNameStrBufs[2][12];
u8 ALIGNED(4) dexNumStrBuf[5];
u8 ALIGNED(4) unk306C[7];
u8 ALIGNED(4) itemNameStrBuf[ITEM_NAME_LENGTH + 1];
u8 ALIGNED(4) genderSymbolStrBuf[3];
u8 ALIGNED(4) levelStrBuf[7];
u8 ALIGNED(4) statValueStrBufs[NUM_STATS][30];
u8 ALIGNED(4) moveCurPpStrBufs[5][11];
u8 ALIGNED(4) moveMaxPpStrBufs[5][11];
u8 ALIGNED(4) moveNameStrBufs[5][MOVE_NAME_LENGTH + 1];
u8 ALIGNED(4) movePowerStrBufs[5][5];
u8 ALIGNED(4) moveAccuracyStrBufs[5][5];
u8 ALIGNED(4) expPointsStrBuf[9];
u8 ALIGNED(4) expToNextLevelStrBuf[9];
u8 ALIGNED(4) abilityNameStrBuf[ABILITY_NAME_LENGTH + 1];
u8 ALIGNED(4) abilityDescStrBuf[52];
} summary;
u8 ALIGNED(4) isEgg; /* 0x3200 */
u8 ALIGNED(4) isBadEgg; /* 0x3204 */
u8 ALIGNED(4) mode; /* 0x3208 */
u8 ALIGNED(4) unk320C; /* 0x320C */
u8 ALIGNED(4) lastIndex; /* 0x3210 */
u8 ALIGNED(4) curPageIndex; /* 0x3214 */
u8 ALIGNED(4) unk3218; /* 0x3218 */
u8 ALIGNED(4) isBoxMon; /* 0x321C */
u8 ALIGNED(4) monTypes[3]; /* 0x3220 */
u8 ALIGNED(4) pageFlipDirection; /* 0x3224 */
u8 ALIGNED(4) unk3228; /* 0x3228 */
u8 ALIGNED(4) unk322C; /* 0x322C */
u8 ALIGNED(4) unk3230; /* 0x3230 */
u8 ALIGNED(4) lockMovesFlag; /* 0x3234 */
u8 ALIGNED(4) whichBgLayerToTranslate; /* 0x3238 */
u8 ALIGNED(4) skillsPageBgNum; /* 0x323C */
u8 ALIGNED(4) infoAndMovesPageBgNum; /* 0x3240 */
u8 ALIGNED(4) flippingPages; /* 0x3244 */
u8 ALIGNED(4) unk3248; /* 0x3248 */
s16 ALIGNED(4) flipPagesBgHofs; /* 0x324C */
u16 moveTypes[5]; /* 0x3250 */
u16 moveIds[5]; /* 0x325A */
u8 ALIGNED(4) numMoves; /* 0x3264 */
u8 ALIGNED(4) isSwappingMoves; /* 0x3268 */
u8 ALIGNED(4) curMonStatusAilment; /* 0x326C */
u8 ALIGNED(4) state3270; /* 0x3270 */
u8 ALIGNED(4) summarySetupStep; /* 0x3274 */
u8 ALIGNED(4) loadBgGfxStep; /* 0x3278 */
u8 ALIGNED(4) spriteCreationStep; /* 0x327C */
u8 ALIGNED(4) bufferStringsStep; /* 0x3280 */
u8 ALIGNED(4) state3284; /* 0x3284 */
u8 ALIGNED(4) selectMoveInputHandlerState; /* 0x3288 */
u8 ALIGNED(4) switchMonTaskState; /* 0x328C */
struct Pokemon currentMon; /* 0x3290 */
union
{
struct Pokemon * mons;
struct BoxPokemon * boxMons;
} monList;
MainCallback savedCallback;
struct Sprite *markingSprite;
u8 ALIGNED(4) lastPageFlipDirection; /* 0x3300 */
u8 ALIGNED(4) unk3304; /* 0x3304 */
u8 ALIGNED(4) skillsPageMode;
u8 categoryIconSpriteId;
};
struct Struct203B144
{
u16 unk00;
u16 curHpStr;
u16 atkStr;
u16 defStr;
u16 spAStr;
u16 spDStr;
u16 speStr;
u16 expStr;
u16 toNextLevel;
u16 curPp[5];
u16 maxPp[5];
u16 unk26;
};
struct ExpBarObjs
{
struct Sprite *sprites[11]; /* 0x00 */
u16 xpos[11]; /* 0x2c */
u16 tileTag; /* 0x42 */
u16 palTag; /* 0x44 */
};
struct HpBarObjs
{
struct Sprite *sprites[10]; /* 0x00 */
u16 xpos[10]; /* 0x28 */
u16 tileTag; /* 0x3c */
u16 palTag; /* 0x3e */
};
struct MonPicBounceState
{
u8 ALIGNED(4) animFrame; /* 0x00 */
u8 ALIGNED(4) initDelay; /* 0x04 */
u8 ALIGNED(4) vigor; /* 0x08 */
};
struct MoveSelectionCursor
{
struct Sprite *sprite; /* 0x00 */
u16 whichSprite; /* 0x04 */
u16 tileTag; /* 0x06 */
u16 palTag; /* 0x08 */
};
struct MonStatusIconObj
{
struct Sprite *sprite; /* 0x00 */
u16 tileTag; /* 0x04 */
u16 palTag; /* 0x06 */
};
struct PokerusIconObj
{
struct Sprite *sprite; /* 0x00 */
u16 tileTag; /* 0x04 */
u16 palTag; /* 0x06 */
};
struct ShinyStarObjData
{
struct Sprite *sprite; /* 0x00 */
u16 tileTag; /* 0x04 */
u16 palTag; /* 0x06 */
};
static EWRAM_DATA struct PokemonSummaryScreenData * sMonSummaryScreen = NULL;
static EWRAM_DATA struct Struct203B144 * sMonSkillsPrinterXpos = NULL;
static EWRAM_DATA struct MoveSelectionCursor * sMoveSelectionCursorObjs[4] = {};
static EWRAM_DATA struct MonStatusIconObj * sStatusIcon = NULL;
static EWRAM_DATA struct HpBarObjs * sHpBarObjs = NULL;
static EWRAM_DATA struct ExpBarObjs * sExpBarObjs = NULL;
static EWRAM_DATA struct PokerusIconObj * sPokerusIconObj = NULL;
static EWRAM_DATA struct ShinyStarObjData * sShinyStarObjData = NULL;
static EWRAM_DATA u8 sLastViewedMonIndex = 0;
static EWRAM_DATA u8 sMoveSelectionCursorPos = 0;
static EWRAM_DATA u8 sMoveSwapCursorPos = 0;
static EWRAM_DATA struct MonPicBounceState * sMonPicBounceState = NULL;
extern const u32 gSummaryScreen_PageSkills_Tilemap[];
extern const u32 gSummaryScreen_PageMoves_Tilemap[];
extern const u32 gSummaryScreen_PageInfo_Tilemap[];
extern const u32 gSummaryScreen_PageMovesInfo_Tilemap[];
extern const u32 gSummaryScreen_PageEgg_Tilemap[];
extern const u16 gSummaryScreen_Bg_Pal[];
extern const u32 gSummaryScreen_Bg_Gfx[];
extern const u16 gSummaryScreen_HpExpBar_Pal[];
extern const u32 gSummaryScreen_StatusAilmentIcon_Gfx[];
extern const u16 gSummaryScreen_StatusAilmentIcon_Pal[];
extern const u32 gSummaryScreen_HpBar_Gfx[];
extern const u32 gSummaryScreen_ExpBar_Gfx[];
static const u32 sTextHeaderPalette[] = INCBIN_U32("graphics/summary_screen/text_header.gbapal");
static const u16 sMonMarkingSpritePalette[] = INCBIN_U16("graphics/summary_screen/marking.gbapal");
static const u32 sTextMovesPalette[] = INCBIN_U32("graphics/summary_screen/text_moves.gbapal");
static const u16 sMoveSelectionCursorPals[] = INCBIN_U16("graphics/summary_screen/move_selection_cursor.gbapal");
static const u32 sMoveSelectionCursorTiles_Left[] = INCBIN_U32("graphics/summary_screen/move_selection_cursor_left.4bpp.lz");
static const u32 sMoveSelectionCursorTiles_Right[] = INCBIN_U32("graphics/summary_screen/move_selection_cursor_right.4bpp.lz");
static const struct OamData sMoveSelectionCursorOamData =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(64x32),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(64x32),
.tileNum = 0,
.priority = 0,
.paletteNum = 0
};
static const union AnimCmd sMoveSelectionCursorOamAnim_Red[] =
{
ANIMCMD_FRAME(0, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sMoveSelectionCursorOamAnim_Blue[] =
{
ANIMCMD_FRAME(0x20, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd * const sMoveSelectionCursorOamAnimTable[] =
{
sMoveSelectionCursorOamAnim_Red,
sMoveSelectionCursorOamAnim_Blue
};
static const struct OamData sStatusAilmentIconOamData = {
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(32x8),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(32x8),
.tileNum = 0,
.priority = 0,
.paletteNum = 0
};
static const union AnimCmd sStatusAilmentIconAnim_PSN[] =
{
ANIMCMD_FRAME(0, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sStatusAilmentIconAnim_PRZ[] =
{
ANIMCMD_FRAME(4, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sStatusAilmentIconAnim_SLP[] =
{
ANIMCMD_FRAME(8, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sStatusAilmentIconAnim_FRZ[] =
{
ANIMCMD_FRAME(12, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sStatusAilmentIconAnim_BRN[] =
{
ANIMCMD_FRAME(16, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sStatusAilmentIconAnim_PKRS[] =
{
ANIMCMD_FRAME(20, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sStatusAilmentIconAnim_FNT[] =
{
ANIMCMD_FRAME(24, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sStatusAilmentIconAnim_Blank[] =
{
ANIMCMD_FRAME(28, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd * const sStatusAilmentIconAnimTable[] =
{
sStatusAilmentIconAnim_PSN,
sStatusAilmentIconAnim_PRZ,
sStatusAilmentIconAnim_SLP,
sStatusAilmentIconAnim_FRZ,
sStatusAilmentIconAnim_BRN,
sStatusAilmentIconAnim_PKRS,
sStatusAilmentIconAnim_FNT,
sStatusAilmentIconAnim_Blank
};
static const struct OamData sHpOrExpBarOamData = {
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(8x8),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(8x8),
.tileNum = 0,
.priority = 0,
.paletteNum = 0
};
static const union AnimCmd sHpOrExpAnim_0[] =
{
ANIMCMD_FRAME(0, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sHpOrExpAnim_1[] =
{
ANIMCMD_FRAME(1, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sHpOrExpAnim_2[] =
{
ANIMCMD_FRAME(2, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sHpOrExpAnim_3[] =
{
ANIMCMD_FRAME(3, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sHpOrExpAnim_4[] =
{
ANIMCMD_FRAME(4, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sHpOrExpAnim_5[] =
{
ANIMCMD_FRAME(5, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sHpOrExpAnim_6[] =
{
ANIMCMD_FRAME(6, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sHpOrExpAnim_7[] =
{
ANIMCMD_FRAME(7, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sHpOrExpAnim_8[] =
{
ANIMCMD_FRAME(8, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sHpOrExpAnim_9[] =
{
ANIMCMD_FRAME(9, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sHpOrExpAnim_10[] =
{
ANIMCMD_FRAME(10, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sHpOrExpAnim_11[] =
{
ANIMCMD_FRAME(11, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd * const sHpOrExpBarAnimTable[] =
{
sHpOrExpAnim_0,
sHpOrExpAnim_1,
sHpOrExpAnim_2,
sHpOrExpAnim_3,
sHpOrExpAnim_4,
sHpOrExpAnim_5,
sHpOrExpAnim_6,
sHpOrExpAnim_7,
sHpOrExpAnim_8,
sHpOrExpAnim_9,
sHpOrExpAnim_10,
sHpOrExpAnim_11
};
static const u16 sPokeSummary_HpBarPalYellow[] = INCBIN_U16("graphics/summary_screen/hp_bar_yellow.gbapal");
static const u16 sPokeSummary_HpBarPalRed[] = INCBIN_U16("graphics/summary_screen/hp_bar_red.gbapal");
static const struct OamData sPokerusIconObjOamData = {
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(8x8),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(8x8),
.tileNum = 0,
.priority = 0,
.paletteNum = 0
};
static const union AnimCmd sPokerusIconObjAnim0[] =
{
ANIMCMD_FRAME(0, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd * const sPokerusIconObjAnimTable[] =
{
sPokerusIconObjAnim0
};
static const u16 sPokerusIconObjPal[] = INCBIN_U16("graphics/summary_screen/pokerus_cured.gbapal");
static const u32 sPokerusIconObjTiles[] = INCBIN_U32("graphics/summary_screen/pokerus_cured.4bpp.lz");
static const struct OamData sStarObjOamData =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(8x8),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(8x8),
.tileNum = 0,
.priority = 0,
.paletteNum = 0
};
static const union AnimCmd sStarObjAnim0[] =
{
ANIMCMD_FRAME(1, 20),
ANIMCMD_JUMP(0),
};
static const union AnimCmd * const sStarObjAnimTable[] =
{
sStarObjAnim0
};
static const u16 sStarObjPal[] = INCBIN_U16( "graphics/summary_screen/shiny_star.gbapal");
static const u32 sStarObjTiles[] = INCBIN_U32( "graphics/summary_screen/shiny_star.4bpp.lz");
static const u32 sBgTilemap_MovesInfoPage[] = INCBIN_U32( "graphics/summary_screen/moves_info_page.bin.lz");
static const u32 sBgTilemap_MovesPage[] = INCBIN_U32( "graphics/summary_screen/moves_page.bin.lz");
static const u8 *const sEggHatchTimeTexts[] = {
gText_PokeSum_EggHatch_LongTime,
gText_PokeSum_EggHatch_SomeTime,
gText_PokeSum_EggHatch_Soon,
gText_PokeSum_EggHatch_AlmostReady
};
static const u8 *const sEggOriginTexts[] = {
gText_PokeSum_EggOrigin_DayCare,
gText_PokeSum_EggOrigin_Trade,
gText_PokeSum_EggOrigin_TravelingMan,
gText_PokeSum_EggOrigin_Trade,
gText_PokeSum_EggOrigin_NicePlace,
gText_PokeSum_EggOrigin_Spa,
gText_PokeSum_EggOrigin_Trade
};
static const u8 sPrintMoveTextColors[][3] = {
{0, 7, 8},
{0, 1, 2},
{0, 3, 4},
{0, 5, 6}
};
static const struct BgTemplate sBgTempaltes[] =
{
{
.bg = 0,
.charBaseIndex = 0,
.mapBaseIndex = 14,
.screenSize = 1,
.paletteMode = 0,
.priority = 0,
.baseTile = 0x0000
},
{
.bg = 2,
.charBaseIndex = 2,
.mapBaseIndex = 10,
.screenSize = 1,
.paletteMode = 0,
.priority = 1,
.baseTile = 0x0000
},
{
.bg = 3,
.charBaseIndex = 2,
.mapBaseIndex = 9,
.screenSize = 0,
.paletteMode = 0,
.priority = 3,
.baseTile = 0x0000
},
{
.bg = 1,
.charBaseIndex = 2,
.mapBaseIndex = 12,
.screenSize = 1,
.paletteMode = 0,
.priority = 2,
.baseTile = 0x0000
}
};
#define POKESUM_WIN_PAGE_NAME 0
#define POKESUM_WIN_CONTROLS 1
#define POKESUM_WIN_LVL_NICK 2
#define POKESUM_WIN_RIGHT_PANE 3
#define POKESUM_WIN_TRAINER_MEMO 4
#define POKESUM_WIN_INFO_3 3
#define POKESUM_WIN_INFO_4 4
#define POKESUM_WIN_INFO_5 5
#define POKESUM_WIN_INFO_6 6
#define POKESUM_WIN_SKILLS_3 3
#define POKESUM_WIN_SKILLS_4 4
#define POKESUM_WIN_SKILLS_5 5
#define POKESUM_WIN_SKILLS_6 6
#define POKESUM_WIN_MOVES_3 3
#define POKESUM_WIN_MOVES_4 4
#define POKESUM_WIN_MOVES_5 5
#define POKESUM_WIN_MOVES_6 6
static const struct WindowTemplate sWindowTemplates_Permanent_Bg1[] =
{
[POKESUM_WIN_PAGE_NAME] = {
.bg = 1,
.tilemapLeft = 0,
.tilemapTop = 0,
.width = 13,
.height = 2,
.paletteNum = 7,
.baseBlock = 0x0258
},
[POKESUM_WIN_CONTROLS] = {
.bg = 1,
.tilemapLeft = 19,
.tilemapTop = 0,
.width = 11,
.height = 2,
.paletteNum = 7,
.baseBlock = 0x0272
},
[POKESUM_WIN_LVL_NICK] = {
.bg = 1,
.tilemapLeft = 0,
.tilemapTop = 2,
.width = 15,
.height = 2,
.paletteNum = 7,
.baseBlock = 0x0288
}
};
static const struct WindowTemplate sWindowTemplates_Permanent_Bg2[] =
{
{
.bg = 2,
.tilemapLeft = 0,
.tilemapTop = 0,
.width = 13,
.height = 2,
.paletteNum = 7,
.baseBlock = 0x0258
},
{
.bg = 2,
.tilemapLeft = 19,
.tilemapTop = 0,
.width = 11,
.height = 2,
.paletteNum = 7,
.baseBlock = 0x0272
},
{
.bg = 2,
.tilemapLeft = 0,
.tilemapTop = 2,
.width = 15,
.height = 2,
.paletteNum = 7,
.baseBlock = 0x0288
},
};
static const struct WindowTemplate sWindowTemplates_Info[] =
{
[POKESUM_WIN_INFO_3 - 3] = {
.bg = 0,
.tilemapLeft = 15,
.tilemapTop = 2,
.width = 15,
.height = 12,
.paletteNum = 6,
.baseBlock = 0x0001
},
[POKESUM_WIN_INFO_4 - 3] = {
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 14,
.width = 28,
.height = 6,
.paletteNum = 6,
.baseBlock = 0x00b5
},
[POKESUM_WIN_INFO_5 - 3] = {
.bg = 0,
.tilemapLeft = 0,
.tilemapTop = 0,
.width = 0,
.height = 0,
.paletteNum = 0,
.baseBlock = 0x0000
},
[POKESUM_WIN_INFO_6 - 3] = {
.bg = 0,
.tilemapLeft = 0,
.tilemapTop = 0,
.width = 0,
.height = 0,
.paletteNum = 0,
.baseBlock = 0x0000
},
};
static const struct WindowTemplate sWindowTemplates_Skills[] =
{
[POKESUM_WIN_SKILLS_3 - 3] = {
.bg = 0,
.tilemapLeft = 20,
.tilemapTop = 2,
.width = 10,
.height = 14,
.paletteNum = 6,
.baseBlock = 0x0001
},
[POKESUM_WIN_SKILLS_4 - 3] = {
.bg = 0,
.tilemapLeft = 6,
.tilemapTop = 12,
.width = 14,
.height = 4,
.paletteNum = 6,
.baseBlock = 0x008d
},
[POKESUM_WIN_SKILLS_5 - 3] = {
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 16,
.width = 29,
.height = 4,
.paletteNum = 6,
.baseBlock = 0x00c5
},
[POKESUM_WIN_SKILLS_6 - 3] = {
.bg = 0,
.tilemapLeft = 0,
.tilemapTop = 0,
.width = 0,
.height = 0,
.paletteNum = 0,
.baseBlock = 0x0000
},
};
static const struct WindowTemplate sWindowTemplates_Moves[] =
{
[POKESUM_WIN_MOVES_3 - 3] = {
.bg = 0,
.tilemapLeft = 20,
.tilemapTop = 2,
.width = 10,
.height = 18,
.paletteNum = 8,
.baseBlock = 0x0001
},
[POKESUM_WIN_MOVES_4 - 3] = {
.bg = 0,
.tilemapLeft = 0,
.tilemapTop = 7,
.width = 15,
.height = 13,
.paletteNum = 6,
.baseBlock = 0x00b5
},
[POKESUM_WIN_MOVES_5 - 3] = {
.bg = 0,
.tilemapLeft = 15,
.tilemapTop = 2,
.width = 5,
.height = 18,
.paletteNum = 6,
.baseBlock = 0x0178
},
[POKESUM_WIN_MOVES_6 - 3] = {
.bg = 0,
.tilemapLeft = 6,
.tilemapTop = 4,
.width = 9,
.height = 2,
.paletteNum = 6,
.baseBlock = 0x01d2
},
};
static const struct WindowTemplate sWindowTemplates_Dummy[] =
{
{
.bg = 255,
.tilemapLeft = 0,
.tilemapTop = 0,
.width = 0,
.height = 0,
.paletteNum = 0,
.baseBlock = 0x0000
},
};
static const u8 sLevelNickTextColors[][3] =
{
{0, 14, 10},
{0, 1, 2},
{0, 9, 8},
{0, 5, 4},
{0, 2, 3},
{0, 11, 10},
};
static const u8 ALIGNED(4) sMultiBattlePartyOrder[] =
{
0, 2, 3, 1, 4, 5
};
static const s8 sMonPicBounceYDelta_Under60[] =
{
-1, 0, 1
};
static const s8 sMonPicBounceYDelta_60to80[] =
{
-2, -1, 0, 1, 2
};
static const s8 sMonPicBounceYDelta_80to99[] =
{
-3, -2, -1, 0, 1, 2, 3
};
static const s8 sMonPicBounceYDelta_Full[] =
{
-5, -3, -1, 0, 1, 3, 5
};
static const s8 sEggPicShakeXDelta_ItWillTakeSomeTime[] =
{
1, 1, 0, -1, -1, 0, -1, -1, 0, 1, 1
};
static const s8 sEggPicShakeXDelta_OccasionallyMoves[] =
{
2, 1, 0, -1, -2, 0, -2, -1, 0, 1, 2
};
static const s8 sEggPicShakeXDelta_AlmostReadyToHatch[] =
{
2, 1, 1, 0, -1, -1, -2, 0, -2, -1, -1, 0, 1, 1, 2
};
static const u16 * const sHpBarPals[] =
{
gSummaryScreen_HpExpBar_Pal,
sPokeSummary_HpBarPalYellow,
sPokeSummary_HpBarPalRed,
};
static const struct OamData sOamData_CategoryIcons =
{
.size = SPRITE_SIZE(16x16),
.shape = SPRITE_SHAPE(16x16),
.priority = 0,
};
const struct CompressedSpriteSheet gSpriteSheet_CategoryIcons =
{
.data = gCategoryIcons_Gfx,
.size = 16*16*3/2,
.tag = TAG_CATEGORY_ICONS,
};
const struct SpritePalette gSpritePal_CategoryIcons =
{
.data = gCategoryIcons_Pal,
.tag = TAG_CATEGORY_ICONS
};
static const union AnimCmd sSpriteAnim_CategoryIcon0[] =
{
ANIMCMD_FRAME(0, 0),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_CategoryIcon1[] =
{
ANIMCMD_FRAME(4, 0),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_CategoryIcon2[] =
{
ANIMCMD_FRAME(8, 0),
ANIMCMD_END
};
static const union AnimCmd *const sSpriteAnimTable_CategoryIcons[] =
{
sSpriteAnim_CategoryIcon0,
sSpriteAnim_CategoryIcon1,
sSpriteAnim_CategoryIcon2,
};
const struct SpriteTemplate gSpriteTemplate_CategoryIcons =
{
.tileTag = TAG_CATEGORY_ICONS,
.paletteTag = TAG_CATEGORY_ICONS,
.oam = &sOamData_CategoryIcons,
.anims = sSpriteAnimTable_CategoryIcons,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
static const struct OamData sOamData_MoveTypes =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(32x16),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(32x16),
.tileNum = 0,
.priority = 1,
.paletteNum = 0,
.affineParam = 0,
};
static const union AnimCmd sSpriteAnim_TypeNone[] = {
ANIMCMD_FRAME(TYPE_NONE * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeNormal[] = {
ANIMCMD_FRAME(TYPE_NORMAL * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeFighting[] = {
ANIMCMD_FRAME(TYPE_FIGHTING * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeFlying[] = {
ANIMCMD_FRAME(TYPE_FLYING * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypePoison[] = {
ANIMCMD_FRAME(TYPE_POISON * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeGround[] = {
ANIMCMD_FRAME(TYPE_GROUND * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeRock[] = {
ANIMCMD_FRAME(TYPE_ROCK * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeBug[] = {
ANIMCMD_FRAME(TYPE_BUG * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeGhost[] = {
ANIMCMD_FRAME(TYPE_GHOST * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeSteel[] = {
ANIMCMD_FRAME(TYPE_STEEL * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeMystery[] = {
ANIMCMD_FRAME(TYPE_MYSTERY * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeFire[] = {
ANIMCMD_FRAME(TYPE_FIRE * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeWater[] = {
ANIMCMD_FRAME(TYPE_WATER * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeGrass[] = {
ANIMCMD_FRAME(TYPE_GRASS * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeElectric[] = {
ANIMCMD_FRAME(TYPE_ELECTRIC * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypePsychic[] = {
ANIMCMD_FRAME(TYPE_PSYCHIC * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeIce[] = {
ANIMCMD_FRAME(TYPE_ICE * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeDragon[] = {
ANIMCMD_FRAME(TYPE_DRAGON * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeDark[] = {
ANIMCMD_FRAME(TYPE_DARK * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeFairy[] = {
ANIMCMD_FRAME(TYPE_FAIRY * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_TypeStellar[] = {
ANIMCMD_FRAME(TYPE_STELLAR * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_CategoryCool[] = {
ANIMCMD_FRAME((CONTEST_CATEGORY_COOL + NUMBER_OF_MON_TYPES) * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_CategoryBeauty[] = {
ANIMCMD_FRAME((CONTEST_CATEGORY_BEAUTY + NUMBER_OF_MON_TYPES) * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_CategoryCute[] = {
ANIMCMD_FRAME((CONTEST_CATEGORY_CUTE + NUMBER_OF_MON_TYPES) * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_CategorySmart[] = {
ANIMCMD_FRAME((CONTEST_CATEGORY_SMART + NUMBER_OF_MON_TYPES) * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_CategoryTough[] = {
ANIMCMD_FRAME((CONTEST_CATEGORY_TOUGH + NUMBER_OF_MON_TYPES) * 8, 0, FALSE, FALSE),
ANIMCMD_END
};
static const union AnimCmd *const sSpriteAnimTable_MoveTypes[NUMBER_OF_MON_TYPES + CONTEST_CATEGORIES_COUNT] = {
[TYPE_NONE] = sSpriteAnim_TypeNone,
[TYPE_NORMAL] = sSpriteAnim_TypeNormal,
[TYPE_FIGHTING] = sSpriteAnim_TypeFighting,
[TYPE_FLYING] = sSpriteAnim_TypeFlying,
[TYPE_POISON] = sSpriteAnim_TypePoison,
[TYPE_GROUND] = sSpriteAnim_TypeGround,
[TYPE_ROCK] = sSpriteAnim_TypeRock,
[TYPE_BUG] = sSpriteAnim_TypeBug,
[TYPE_GHOST] = sSpriteAnim_TypeGhost,
[TYPE_STEEL] = sSpriteAnim_TypeSteel,
[TYPE_MYSTERY] = sSpriteAnim_TypeMystery,
[TYPE_FIRE] = sSpriteAnim_TypeFire,
[TYPE_WATER] = sSpriteAnim_TypeWater,
[TYPE_GRASS] = sSpriteAnim_TypeGrass,
[TYPE_ELECTRIC] = sSpriteAnim_TypeElectric,
[TYPE_PSYCHIC] = sSpriteAnim_TypePsychic,
[TYPE_ICE] = sSpriteAnim_TypeIce,
[TYPE_DRAGON] = sSpriteAnim_TypeDragon,
[TYPE_DARK] = sSpriteAnim_TypeDark,
[TYPE_FAIRY] = sSpriteAnim_TypeFairy,
[TYPE_STELLAR] = sSpriteAnim_TypeStellar,
[NUMBER_OF_MON_TYPES + CONTEST_CATEGORY_COOL] = sSpriteAnim_CategoryCool,
[NUMBER_OF_MON_TYPES + CONTEST_CATEGORY_BEAUTY] = sSpriteAnim_CategoryBeauty,
[NUMBER_OF_MON_TYPES + CONTEST_CATEGORY_CUTE] = sSpriteAnim_CategoryCute,
[NUMBER_OF_MON_TYPES + CONTEST_CATEGORY_SMART] = sSpriteAnim_CategorySmart,
[NUMBER_OF_MON_TYPES + CONTEST_CATEGORY_TOUGH] = sSpriteAnim_CategoryTough,
};
const struct CompressedSpriteSheet gSpriteSheet_MoveTypes =
{
.data = gMoveTypes_Gfx,
.size = (NUMBER_OF_MON_TYPES + CONTEST_CATEGORIES_COUNT) * 0x100,
.tag = TAG_MOVE_TYPES
};
const struct SpriteTemplate gSpriteTemplate_MoveTypes =
{
.tileTag = TAG_MOVE_TYPES,
.paletteTag = TAG_MOVE_TYPES,
.oam = &sOamData_MoveTypes,
.anims = sSpriteAnimTable_MoveTypes,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
#define FREE_AND_SET_NULL_IF_SET(ptr) \
{ \
if (ptr != NULL) \
{ \
free(ptr); \
(ptr) = NULL; \
} \
}
void ShowPokemonSummaryScreen(struct Pokemon * party, u8 cursorPos, u8 lastIdx, MainCallback savedCallback, u8 mode)
{
sMonSummaryScreen = AllocZeroed(sizeof(struct PokemonSummaryScreenData));
sMonSkillsPrinterXpos = AllocZeroed(sizeof(struct Struct203B144));
if (sMonSummaryScreen == NULL)
{
SetMainCallback2(savedCallback);
return;
}
sLastViewedMonIndex = cursorPos;
sMoveSelectionCursorPos = 0;
sMoveSwapCursorPos = 0;
sMonSummaryScreen->savedCallback = savedCallback;
sMonSummaryScreen->monList.mons = party;
if (party == gEnemyParty)
sMonSummaryScreen->isEnemyParty = TRUE;
else
sMonSummaryScreen->isEnemyParty = FALSE;
sMonSummaryScreen->lastIndex = lastIdx;
sMonSummaryScreen->mode = mode;
switch (sMonSummaryScreen->mode)
{
case PSS_MODE_NORMAL:
default:
SetHelpContext(HELPCONTEXT_POKEMON_INFO);
sMonSummaryScreen->curPageIndex = PSS_PAGE_INFO;
sMonSummaryScreen->isBoxMon = FALSE;
sMonSummaryScreen->lockMovesFlag = FALSE;
break;
case PSS_MODE_BOX:
SetHelpContext(HELPCONTEXT_POKEMON_INFO);
sMonSummaryScreen->curPageIndex = PSS_PAGE_INFO;
sMonSummaryScreen->isBoxMon = TRUE;
sMonSummaryScreen->lockMovesFlag = FALSE;
break;
case PSS_MODE_SELECT_MOVE:
case PSS_MODE_FORGET_MOVE:
SetHelpContext(HELPCONTEXT_POKEMON_MOVES);
sMonSummaryScreen->curPageIndex = PSS_PAGE_MOVES_INFO;
sMonSummaryScreen->isBoxMon = FALSE;
sMonSummaryScreen->lockMovesFlag = TRUE;
break;
}
sMonSummaryScreen->state3270 = 0;
sMonSummaryScreen->summarySetupStep = 0;
sMonSummaryScreen->loadBgGfxStep = 0;
sMonSummaryScreen->spriteCreationStep = 0;
sMonSummaryScreen->whichBgLayerToTranslate = 0;
sMonSummaryScreen->skillsPageBgNum = 2;
sMonSummaryScreen->infoAndMovesPageBgNum = 1;
sMonSummaryScreen->flippingPages = FALSE;
sMonSummaryScreen->categoryIconSpriteId = 0xFF;
sMonSummaryScreen->skillsPageMode = 0;
sMonSummaryScreen->unk3228 = 0;
sMonSummaryScreen->unk322C = 1;
BufferSelectedMonData(&sMonSummaryScreen->currentMon);
sMonSummaryScreen->isEgg = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_IS_EGG);
sMonSummaryScreen->isBadEgg = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SANITY_IS_BAD_EGG);
if (sMonSummaryScreen->isBadEgg == TRUE)
sMonSummaryScreen->isEgg = TRUE;
sMonSummaryScreen->lastPageFlipDirection = 0xff;
SetMainCallback2(CB2_SetUpPSS);
}
void ShowSelectMovePokemonSummaryScreen(struct Pokemon * party, u8 cursorPos, u8 lastIdx, MainCallback savedCallback, u16 a4)
{
ShowPokemonSummaryScreen(party, cursorPos, lastIdx, savedCallback, PSS_MODE_SELECT_MOVE);
sMonSummaryScreen->moveIds[4] = a4;
}
static u8 PageFlipInputIsDisabled(u8 direction)
{
if (sMonSummaryScreen->inhibitPageFlipInput == TRUE && sMonSummaryScreen->pageFlipDirection != direction)
return TRUE;
return FALSE;
}
bool32 IsPageFlipInput(u8 direction)
{
if (sMonSummaryScreen->isEgg)
return FALSE;
if (sMonSummaryScreen->lastPageFlipDirection != 0xff && sMonSummaryScreen->lastPageFlipDirection == direction)
{
sMonSummaryScreen->lastPageFlipDirection = 0xff;
return TRUE;
}
if (PageFlipInputIsDisabled(direction))
return FALSE;
switch (direction)
{
case 1:
if (JOY_NEW(DPAD_RIGHT))
return TRUE;
if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR && JOY_NEW(R_BUTTON))
return TRUE;
break;
case 0:
if (JOY_NEW(DPAD_LEFT))
return TRUE;
if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR && JOY_NEW(L_BUTTON))
return TRUE;
break;
}
return FALSE;
}
static void Task_InputHandler_Info(u8 taskId)
{
switch (sMonSummaryScreen->state3270) {
case PSS_STATE3270_FADEIN:
BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0);
sMonSummaryScreen->state3270 = PSS_STATE3270_PLAYCRY;
break;
case PSS_STATE3270_PLAYCRY:
if (!gPaletteFade.active)
{
PokeSum_TryPlayMonCry();
sMonSummaryScreen->state3270 = PSS_STATE3270_HANDLEINPUT;
return;
}
sMonSummaryScreen->state3270 = PSS_STATE3270_PLAYCRY;
break;
case PSS_STATE3270_HANDLEINPUT:
if (IsActiveOverworldLinkBusy() == TRUE)
return;
else if (IsLinkRecvQueueAtOverworldMax() == TRUE)
return;
else if (FuncIsActiveTask(Task_PokeSum_SwitchDisplayedPokemon))
return;
if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)
{
if (IsPageFlipInput(1) == TRUE)
{
if (FuncIsActiveTask(Task_PokeSum_FlipPages))
{
sMonSummaryScreen->lastPageFlipDirection = 1;
return;
}
else if (sMonSummaryScreen->curPageIndex < PSS_PAGE_MOVES)
{
PlaySE(SE_SELECT);
HideBg(0);
sMonSummaryScreen->pageFlipDirection = 1;
PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex);
sMonSummaryScreen->curPageIndex++;
sMonSummaryScreen->state3270 = PSS_STATE3270_FLIPPAGES;
}
return;
}
else if (IsPageFlipInput(0) == TRUE)
{
if (FuncIsActiveTask(Task_PokeSum_FlipPages))
{
sMonSummaryScreen->lastPageFlipDirection = 0;
return;
}
else if (sMonSummaryScreen->curPageIndex > PSS_PAGE_INFO)
{
PlaySE(SE_SELECT);
HideBg(0);
sMonSummaryScreen->pageFlipDirection = 0;
PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex);
sMonSummaryScreen->curPageIndex--;
sMonSummaryScreen->state3270 = PSS_STATE3270_FLIPPAGES;
}
return;
}
}
if ((!FuncIsActiveTask(Task_PokeSum_FlipPages)) || FuncIsActiveTask(Task_PokeSum_SwitchDisplayedPokemon))
{
if (JOY_NEW(DPAD_UP))
{
PokeSum_SeekToNextMon(taskId, -1);
return;
}
else if (JOY_NEW(DPAD_DOWN))
{
PokeSum_SeekToNextMon(taskId, 1);
return;
}
else if (JOY_NEW(A_BUTTON))
{
if (sMonSummaryScreen->curPageIndex == PSS_PAGE_INFO)
{
PlaySE(SE_SELECT);
sMonSummaryScreen->state3270 = PSS_STATE3270_ATEXIT_FADEOUT;
}
else if (sMonSummaryScreen->curPageIndex == PSS_PAGE_SKILLS)
{
sMonSummaryScreen->skillsPageMode = (sMonSummaryScreen->skillsPageMode + 1) % PSS_SKILL_PAGE_MODE_COUNT;
BufferMonSkills();
RemoveWindow(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE]);
AddWindow(&sWindowTemplates_Skills[0]);
PokeSum_PrintRightPaneText();
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2);
}
else if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES)
{
PlaySE(SE_SELECT);
sMonSummaryScreen->pageFlipDirection = 1;
PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex);
sMonSummaryScreen->curPageIndex++;
sMonSummaryScreen->state3270 = PSS_STATE3270_FLIPPAGES;
}
return;
}
else if (JOY_NEW(B_BUTTON))
{
sMonSummaryScreen->state3270 = PSS_STATE3270_ATEXIT_FADEOUT;
}
else if (DEBUG_POKEMON_SPRITE_VISUALIZER && JOY_NEW(SELECT_BUTTON) && !gMain.inBattle)
{
sMonSummaryScreen->savedCallback = CB2_Pokemon_Sprite_Visualizer;
// StopPokemonAnimations();
PlaySE(SE_SELECT);
sMonSummaryScreen->state3270 = PSS_STATE3270_ATEXIT_FADEOUT;
}
}
break;
case PSS_STATE3270_FLIPPAGES:
if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)
{
CreateTask(Task_PokeSum_FlipPages, 0);
sMonSummaryScreen->state3270 = PSS_STATE3270_HANDLEINPUT;
}
else
{
gTasks[sMonSummaryScreen->inputHandlerTaskId].func = Task_FlipPages_FromInfo;
sMonSummaryScreen->state3270 = PSS_STATE3270_HANDLEINPUT;
}
break;
case PSS_STATE3270_ATEXIT_FADEOUT:
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0);
sMonSummaryScreen->state3270 = PSS_STATE3270_ATEXIT_WAITLINKDELAY;
break;
case PSS_STATE3270_ATEXIT_WAITLINKDELAY:
if (Overworld_LinkRecvQueueLengthMoreThan2() == TRUE)
return;
else if (IsLinkRecvQueueAtOverworldMax() == TRUE)
return;
sMonSummaryScreen->state3270 = PSS_STATE3270_ATEXIT_WAITFADE;
break;
default:
if (!gPaletteFade.active)
Task_DestroyResourcesOnExit(taskId);
break;
}
}
static void Task_PokeSum_FlipPages(u8 taskId)
{
s16 * data = gTasks[taskId].data;
switch (data[0])
{
case 0:
PokeSum_HideSpritesBeforePageFlip();
PokeSum_ShowSpritesBeforePageFlip();
sMonSummaryScreen->lockMovesFlag = TRUE;
sMonSummaryScreen->inhibitPageFlipInput = TRUE;
PokeSum_UpdateWin1ActiveFlag(sMonSummaryScreen->curPageIndex);
PokeSum_AddWindows(sMonSummaryScreen->curPageIndex);
break;
case 1:
if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)
{
if (!(sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES && sMonSummaryScreen->pageFlipDirection == 0))
{
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
CopyBgTilemapBufferToVram(0);
}
}
FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 2);
FillBgTilemapBufferRect_Palette0(1, 0, 0, 2, 15, 2);
FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 2);
FillBgTilemapBufferRect_Palette0(2, 0, 0, 2, 15, 2);
break;
case 2:
PokeSum_CopyNewBgTilemapBeforePageFlip_2();
PokeSum_CopyNewBgTilemapBeforePageFlip();
PokeSum_DrawPageProgressTiles();
PokeSum_PrintPageHeaderText(sMonSummaryScreen->curPageIndex);
break;
case 3:
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2);
break;
case 4:
if (!IsDma3ManagerBusyWithBgCopy())
{
CopyBgTilemapBufferToVram(3);
CopyBgTilemapBufferToVram(2);
CopyBgTilemapBufferToVram(1);
}
else
return;
break;
case 5:
PokeSum_InitBgCoordsBeforePageFlips();
sMonSummaryScreen->flippingPages = TRUE;
break;
case 6:
if (!PokeSum_IsPageFlipFinished(sMonSummaryScreen->pageFlipDirection))
return;
break;
case 7:
PokeSum_PrintRightPaneText();
if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)
PokeSum_PrintBottomPaneText();
PokeSum_PrintAbilityDataOrMoveTypes();
PokeSum_PrintMonTypeIcons();
break;
case 8:
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2);
break;
case 9:
if (!IsDma3ManagerBusyWithBgCopy())
{
CopyBgTilemapBufferToVram(0);
ShowBg(0);
}
else
return;
break;
default:
PokeSum_SetHelpContext();
if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)
gTasks[sMonSummaryScreen->inputHandlerTaskId].func = Task_HandleInput_SelectMove;
DestroyTask(taskId);
data[0] = 0;
sMonSummaryScreen->lockMovesFlag = FALSE;
sMonSummaryScreen->inhibitPageFlipInput = FALSE;
return;
}
data[0]++;
}
static void Task_FlipPages_FromInfo(u8 taskId)
{
switch (sMonSummaryScreen->state3284)
{
case 0:
sMonSummaryScreen->lockMovesFlag = TRUE;
sMonSummaryScreen->inhibitPageFlipInput = TRUE;
PokeSum_AddWindows(sMonSummaryScreen->curPageIndex);
break;
case 1:
if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)
{
if (!(sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES && sMonSummaryScreen->pageFlipDirection == 0))
{
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
CopyBgTilemapBufferToVram(0);
}
}
FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 2);
FillBgTilemapBufferRect_Palette0(1, 0, 0, 2, 15, 2);
FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 2);
FillBgTilemapBufferRect_Palette0(2, 0, 0, 2, 15, 2);
break;
case 2:
PokeSum_HideSpritesBeforePageFlip();
PokeSum_UpdateWin1ActiveFlag(sMonSummaryScreen->curPageIndex);
PokeSum_CopyNewBgTilemapBeforePageFlip();
PokeSum_DrawPageProgressTiles();
PokeSum_CopyNewBgTilemapBeforePageFlip_2();
break;
case 3:
PokeSum_PrintPageName(gText_PokeSum_PageName_KnownMoves);
if (!(gMain.inBattle || gReceivedRemoteLinkPlayers))
PokeSum_PrintControlsString(gText_PokeSum_Controls_PickSwitch);
else
PokeSum_PrintControlsString(gText_PokeSum_Controls_Pick);
break;
case 4:
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 2);
break;
case 5:
if (!IsDma3ManagerBusyWithBgCopy())
{
CopyBgTilemapBufferToVram(2);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(3);
}
else
return;
break;
case 6:
PokeSum_PrintRightPaneText();
PokeSum_PrintAbilityDataOrMoveTypes();
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2);
break;
case 7:
if (!IsDma3ManagerBusyWithBgCopy())
{
CopyBgTilemapBufferToVram(0);
PokeSum_InitBgCoordsBeforePageFlips();
sMonSummaryScreen->flippingPages = TRUE;
}
else
return;
break;
case 8:
if (!PokeSum_IsPageFlipFinished(sMonSummaryScreen->pageFlipDirection))
return;
PokeSum_PrintBottomPaneText();
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);
break;
case 9:
PokeSum_PrintMonTypeIcons();
PrintMonLevelNickOnWindow2(gText_PokeSum_NoData);
break;
case 10:
PokeSum_ShowSpritesBeforePageFlip();
CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2);
break;
case 11:
if (!IsDma3ManagerBusyWithBgCopy())
{
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(2);
CopyBgTilemapBufferToVram(1);
}
else
return;
break;
default:
PokeSum_SetHelpContext();
gTasks[sMonSummaryScreen->inputHandlerTaskId].func = Task_HandleInput_SelectMove;
sMonSummaryScreen->state3284 = 0;
sMonSummaryScreen->lockMovesFlag = FALSE;
sMonSummaryScreen->inhibitPageFlipInput = FALSE;
return;
}
sMonSummaryScreen->state3284++;
return;
}
static void Task_BackOutOfSelectMove(u8 taskId)
{
switch (sMonSummaryScreen->state3284)
{
case 0:
sMonSummaryScreen->lockMovesFlag = TRUE;
sMonSummaryScreen->inhibitPageFlipInput = TRUE;
PokeSum_AddWindows(sMonSummaryScreen->curPageIndex);
break;
case 1:
if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO) {
if (!(sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES && sMonSummaryScreen->pageFlipDirection == 0))
{
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
CopyBgTilemapBufferToVram(0);
}
}
FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 2);
FillBgTilemapBufferRect_Palette0(1, 0, 0, 2, 15, 2);
FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 2);
FillBgTilemapBufferRect_Palette0(2, 0, 0, 2, 15, 2);
break;
case 2:
PokeSum_CopyNewBgTilemapBeforePageFlip_2();
break;
case 3:
PokeSum_PrintRightPaneText();
PokeSum_PrintBottomPaneText();
PokeSum_PrintAbilityDataOrMoveTypes();
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2);
CopyBgTilemapBufferToVram(0);
break;
case 4:
PokeSum_PrintPageName(gText_PokeSum_PageName_KnownMoves);
PokeSum_PrintControlsString(gText_PokeSum_Controls_PageDetail);
break;
case 5:
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 2);
CopyBgTilemapBufferToVram(2);
CopyBgTilemapBufferToVram(1);
break;
case 6:
PokeSum_InitBgCoordsBeforePageFlips();
sMonSummaryScreen->flippingPages = TRUE;
PokeSum_HideSpritesBeforePageFlip();
PokeSum_UpdateWin1ActiveFlag(sMonSummaryScreen->curPageIndex);
PokeSum_PrintMonTypeIcons();
break;
case 7:
break;
case 8:
if (PokeSum_IsPageFlipFinished(sMonSummaryScreen->pageFlipDirection) == 0)
return;
PrintMonLevelNickOnWindow2(gText_PokeSum_NoData);
break;
case 9:
CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2);
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(2);
CopyBgTilemapBufferToVram(1);
break;
case 10:
PokeSum_CopyNewBgTilemapBeforePageFlip();
PokeSum_DrawPageProgressTiles();
CopyBgTilemapBufferToVram(3);
PokeSum_ShowSpritesBeforePageFlip();
break;
default:
PokeSum_SetHelpContext();
gTasks[sMonSummaryScreen->inputHandlerTaskId].func = Task_InputHandler_Info;
sMonSummaryScreen->state3284 = 0;
sMonSummaryScreen->lockMovesFlag = FALSE;
sMonSummaryScreen->inhibitPageFlipInput = FALSE;
return;
}
sMonSummaryScreen->state3284++;
return;
}
static void PokeSum_SetHpExpBarCoordsFullRight(void)
{
u8 i;
for (i = 0; i < 11; i++)
{
sExpBarObjs->xpos[i] = (8 * i) + 396;
sExpBarObjs->sprites[i]->x = sExpBarObjs->xpos[i];
if (i >= 9)
continue;
sHpBarObjs->xpos[i] = (8 * i) + 412;
sHpBarObjs->sprites[i]->x = sHpBarObjs->xpos[i];
}
}
static void PokeSum_SetHpExpBarCoordsFullLeft(void)
{
u8 i;
for (i = 0; i < 11; i++)
{
sExpBarObjs->xpos[i] = (8 * i) + 156;
sExpBarObjs->sprites[i]->x = sExpBarObjs->xpos[i];
if (i >= 9)
continue;
sHpBarObjs->xpos[i] = (8 * i) + 172;
sHpBarObjs->sprites[i]->x = sHpBarObjs->xpos[i];
}
}
static void PokeSum_InitBgCoordsBeforePageFlips(void)
{
s8 pageDelta = 1;
if (sMonSummaryScreen->pageFlipDirection == 1)
pageDelta = -1;
if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)
{
sMonSummaryScreen->flipPagesBgHofs = 240;
return;
}
if ((sMonSummaryScreen->curPageIndex + pageDelta) == PSS_PAGE_MOVES_INFO)
{
PokeSum_UpdateBgPriorityForPageFlip(0, 0);
sMonSummaryScreen->flipPagesBgHofs = 0;
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
SetGpuReg(REG_OFFSET_BG2HOFS, 0);
return;
}
if (sMonSummaryScreen->pageFlipDirection == 1)
{
sMonSummaryScreen->flipPagesBgHofs = 0;
SetGpuReg(REG_OFFSET_BG0HOFS, 0);
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
SetGpuReg(REG_OFFSET_BG2HOFS, 0);
PokeSum_UpdateBgPriorityForPageFlip(1, 1);
}
else
{
u32 bg1Priority = GetGpuReg(REG_OFFSET_BG1CNT) & 3;
u32 bg2Priority = GetGpuReg(REG_OFFSET_BG2CNT) & 3;
sMonSummaryScreen->flipPagesBgHofs = 240;
if (bg1Priority > bg2Priority)
SetGpuReg(REG_OFFSET_BG1HOFS, 240);
else
SetGpuReg(REG_OFFSET_BG2HOFS, 240);
SetGpuReg(REG_OFFSET_BG0HOFS, 240);
PokeSum_UpdateBgPriorityForPageFlip(1, 0);
}
if (sMonSummaryScreen->curPageIndex == PSS_PAGE_SKILLS)
{
if (sMonSummaryScreen->pageFlipDirection == 1)
PokeSum_SetHpExpBarCoordsFullLeft();
else
PokeSum_SetHpExpBarCoordsFullRight();
}
else if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES)
PokeSum_SetHpExpBarCoordsFullLeft();
}
static void PokeSum_HideSpritesBeforePageFlip(void)
{
u8 newPage;
if (sMonSummaryScreen->pageFlipDirection == 1)
newPage = sMonSummaryScreen->curPageIndex - 1;
else
newPage = sMonSummaryScreen->curPageIndex + 1;
switch (newPage)
{
case PSS_PAGE_INFO:
break;
case PSS_PAGE_SKILLS:
ShowOrHideHpBarObjs(TRUE);
ShowOrHideExpBarObjs(TRUE);
break;
case PSS_PAGE_MOVES:
if (sMonSummaryScreen->pageFlipDirection == 1)
{
PokeSum_ShowOrHideMonPicSprite(TRUE);
PokeSum_ShowOrHideMonMarkingsSprite(TRUE);
ShowOrHideBallIconObj(TRUE);
ShowOrHideStatusIcon(TRUE);
HideShowPokerusIcon(TRUE);
HideShowShinyStar(TRUE);
}
break;
case PSS_PAGE_MOVES_INFO:
ShoworHideMoveSelectionCursor(TRUE);
PokeSum_ShowOrHideMonIconSprite(TRUE);
ShowOrHideStatusIcon(TRUE);
HideShowPokerusIcon(TRUE);
HideShowShinyStar(TRUE);
break;
}
}
static void PokeSum_ShowSpritesBeforePageFlip(void)
{
u8 newPage;
if (sMonSummaryScreen->pageFlipDirection == 1)
newPage = sMonSummaryScreen->curPageIndex - 1;
else
newPage = sMonSummaryScreen->curPageIndex + 1;
switch (newPage)
{
case PSS_PAGE_INFO:
ShowOrHideHpBarObjs(FALSE);
ShowOrHideExpBarObjs(FALSE);
break;
case PSS_PAGE_SKILLS:
break;
case PSS_PAGE_MOVES:
if (sMonSummaryScreen->pageFlipDirection == 0)
{
ShowOrHideHpBarObjs(FALSE);
ShowOrHideExpBarObjs(FALSE);
}
else
{
ShoworHideMoveSelectionCursor(FALSE);
HideShowPokerusIcon(FALSE);
PokeSum_ShowOrHideMonIconSprite(FALSE);
HideShowShinyStar(FALSE);
}
break;
case PSS_PAGE_MOVES_INFO:
PokeSum_ShowOrHideMonPicSprite(FALSE);
PokeSum_ShowOrHideMonMarkingsSprite(FALSE);
ShowOrHideStatusIcon(FALSE);
ShowOrHideBallIconObj(FALSE);
HideShowPokerusIcon(FALSE);
HideShowShinyStar(FALSE);
break;
}
}
static u8 PokeSum_IsPageFlipFinished(u8 a0)
{
s8 pageDelta = 1;
if (sMonSummaryScreen->pageFlipDirection == 1)
pageDelta = -1;
if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)
if (sMonSummaryScreen->flipPagesBgHofs <= 0)
{
sMonSummaryScreen->flipPagesBgHofs = 0;
sMonSummaryScreen->whichBgLayerToTranslate ^= 1;
PokeSum_UpdateBgPriorityForPageFlip(0, 0);
sMonSummaryScreen->flippingPages = FALSE;
return TRUE;
}
if ((sMonSummaryScreen->curPageIndex + pageDelta) == PSS_PAGE_MOVES_INFO)
if (sMonSummaryScreen->flipPagesBgHofs >= 240)
{
sMonSummaryScreen->flipPagesBgHofs = 240;
sMonSummaryScreen->whichBgLayerToTranslate ^= 1;
sMonSummaryScreen->flippingPages = FALSE;
return TRUE;
}
if (sMonSummaryScreen->pageFlipDirection == 1)
{
if (sMonSummaryScreen->flipPagesBgHofs >= 240)
{
sMonSummaryScreen->flipPagesBgHofs = 240;
sMonSummaryScreen->whichBgLayerToTranslate ^= 1;
PokeSum_UpdateBgPriorityForPageFlip(0, 0);
sMonSummaryScreen->flippingPages = FALSE;
return TRUE;
}
}
else if (sMonSummaryScreen->flipPagesBgHofs <= 0)
{
sMonSummaryScreen->whichBgLayerToTranslate ^= 1;
sMonSummaryScreen->flipPagesBgHofs = 0;
sMonSummaryScreen->flippingPages = FALSE;
return TRUE;
}
return FALSE;
}
static void PokeSum_UpdateBgPriorityForPageFlip(u8 setBg0Priority, u8 keepBg1Bg2PriorityOrder)
{
u8 i;
u32 bg0Priority;
u32 bg1Priority;
u32 bg2Priority;
bg0Priority = GetGpuReg(REG_OFFSET_BG0CNT) & 3;
bg1Priority = GetGpuReg(REG_OFFSET_BG1CNT) & 3;
bg2Priority = GetGpuReg(REG_OFFSET_BG2CNT) & 3;
if (sMonSummaryScreen->pageFlipDirection == 1)
{
if (setBg0Priority == 0)
{
bg0Priority = 0;
if (keepBg1Bg2PriorityOrder == 0)
{
if (bg1Priority > bg2Priority)
bg1Priority = 1, bg2Priority = 2;
else
bg1Priority = 2, bg2Priority = 1;
}
else
{
if (bg1Priority > bg2Priority)
bg1Priority = 2, bg2Priority = 1;
else
bg1Priority = 1, bg2Priority = 2;
}
}
if (setBg0Priority == 1)
{
bg0Priority = 1;
if (keepBg1Bg2PriorityOrder == 0)
{
if (bg1Priority > bg2Priority)
bg1Priority = 0, bg2Priority = 2;
else
bg1Priority = 2, bg2Priority = 0;
}
else
{
if (bg1Priority > bg2Priority)
bg1Priority = 2, bg2Priority = 0;
else
bg1Priority = 0, bg2Priority = 2;
}
}
}
if (sMonSummaryScreen->pageFlipDirection == 0)
{
bg0Priority = 0;
if (bg1Priority > bg2Priority)
bg1Priority = 1, bg2Priority = 2;
else
bg1Priority = 2, bg2Priority = 1;
}
for (i = 0; i < 11; i++)
{
if (sMonSummaryScreen->curPageIndex == PSS_PAGE_SKILLS && sMonSummaryScreen->pageFlipDirection == 1)
sExpBarObjs->sprites[i]->oam.priority = bg0Priority;
else
sExpBarObjs->sprites[i]->oam.priority = bg1Priority;
if (i >= 9)
continue;
if (sMonSummaryScreen->curPageIndex == PSS_PAGE_SKILLS && sMonSummaryScreen->pageFlipDirection == 1)
sHpBarObjs->sprites[i]->oam.priority = bg0Priority;
else
sHpBarObjs->sprites[i]->oam.priority = bg1Priority;
}
SetGpuReg(REG_OFFSET_BG0CNT, (GetGpuReg(REG_OFFSET_BG0CNT) & (u16)~3) | bg0Priority);
SetGpuReg(REG_OFFSET_BG1CNT, (GetGpuReg(REG_OFFSET_BG1CNT) & (u16)~3) | bg1Priority);
SetGpuReg(REG_OFFSET_BG2CNT, (GetGpuReg(REG_OFFSET_BG2CNT) & (u16)~3) | bg2Priority);
}
static void PokeSum_CopyNewBgTilemapBeforePageFlip_2(void)
{
u8 newPage;
if (sMonSummaryScreen->pageFlipDirection == 1)
newPage = sMonSummaryScreen->curPageIndex - 1;
else
newPage = sMonSummaryScreen->curPageIndex + 1;
switch (newPage)
{
case PSS_PAGE_INFO:
CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0);
break;
case PSS_PAGE_SKILLS:
if (sMonSummaryScreen->pageFlipDirection == 1)
CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageMoves_Tilemap, 0, 0);
else
CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageInfo_Tilemap, 0, 0);
break;
case PSS_PAGE_MOVES:
if (sMonSummaryScreen->pageFlipDirection == 1)
CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageMovesInfo_Tilemap, 0, 0);
else
CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0);
break;
case PSS_PAGE_MOVES_INFO:
CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageMoves_Tilemap, 0, 0);
break;
}
}
static void PokeSum_CopyNewBgTilemapBeforePageFlip(void)
{
u8 newPage;
if (sMonSummaryScreen->pageFlipDirection == 1)
newPage = sMonSummaryScreen->curPageIndex - 1;
else
newPage = sMonSummaryScreen->curPageIndex + 1;
switch (newPage)
{
case PSS_PAGE_INFO:
CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0);
break;
case PSS_PAGE_SKILLS:
break;
case PSS_PAGE_MOVES:
if (sMonSummaryScreen->pageFlipDirection == 1)
CopyToBgTilemapBuffer(3, sBgTilemap_MovesPage, 0, 0);
else
CopyToBgTilemapBuffer(3, sBgTilemap_MovesInfoPage, 0, 0);
break;
case PSS_PAGE_MOVES_INFO:
CopyToBgTilemapBuffer(3, sBgTilemap_MovesInfoPage, 0, 0);
break;
}
}
static void CB2_SetUpPSS(void)
{
switch (sMonSummaryScreen->summarySetupStep)
{
case 0:
PokeSum_Setup_ResetCallbacks();
break;
case 1:
PokeSum_Setup_InitGpu();
break;
case 2:
PokeSum_Setup_SpritesReset();
break;
case 3:
if (!PokeSum_HandleLoadBgGfx())
return;
break;
case 4:
if (!PokeSum_HandleCreateSprites())
return;
break;
case 5:
PokeSum_CreateWindows();
break;
case 6:
if (!PokeSum_Setup_BufferStrings())
return;
break;
case 7:
PokeSum_PrintRightPaneText();
break;
case 8:
PokeSum_PrintBottomPaneText();
break;
case 9:
PokeSum_PrintAbilityDataOrMoveTypes();
PokeSum_PrintMonTypeIcons();
break;
case 10:
if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE || sMonSummaryScreen->mode == PSS_MODE_FORGET_MOVE)
CopyToBgTilemapBuffer(3, sBgTilemap_MovesPage, 0, 0);
else
CopyToBgTilemapBuffer(3, sBgTilemap_MovesInfoPage, 0, 0);
PokeSum_DrawPageProgressTiles();
break;
case 11:
if (sMonSummaryScreen->isEgg)
CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageEgg_Tilemap, 0, 0);
else
{
if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE || sMonSummaryScreen->mode == PSS_MODE_FORGET_MOVE)
{
CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageMoves_Tilemap, 0, 0);
CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageMovesInfo_Tilemap, 0, 0);
}
else
{
CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageInfo_Tilemap, 0, 0);
CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0);
}
}
break;
case 12:
BlendPalettes(0xffffffff, 16, 0);
PokeSum_PrintPageHeaderText(sMonSummaryScreen->curPageIndex);
CommitStaticWindowTilemaps();
break;
case 13:
BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2);
break;
case 14:
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(2);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(3);
break;
case 15:
if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE || sMonSummaryScreen->mode == PSS_MODE_FORGET_MOVE)
{
PokeSum_ShowOrHideMonIconSprite(FALSE);
ShoworHideMoveSelectionCursor(FALSE);
}
else
{
PokeSum_ShowOrHideMonPicSprite(FALSE);
PokeSum_ShowOrHideMonMarkingsSprite(FALSE);
ShowOrHideBallIconObj(FALSE);
ShowOrHideHpBarObjs(FALSE);
ShowOrHideExpBarObjs(FALSE);
}
ShowOrHideStatusIcon(FALSE);
HideShowPokerusIcon(FALSE);
HideShowShinyStar(FALSE);
break;
default:
PokeSum_Setup_SetVBlankCallback();
PokeSum_FinishSetup();
return;
}
sMonSummaryScreen->summarySetupStep++;
}
static u8 PokeSum_HandleLoadBgGfx(void)
{
switch (sMonSummaryScreen->loadBgGfxStep)
{
case 0:
LoadPalette(gSummaryScreen_Bg_Pal, BG_PLTT_ID(0), 5 * PLTT_SIZE_4BPP);
if (IsMonShiny(&sMonSummaryScreen->currentMon) == TRUE && !sMonSummaryScreen->isEgg)
{
LoadPalette(&gSummaryScreen_Bg_Pal[16 * 6], BG_PLTT_ID(0), PLTT_SIZE_4BPP);
LoadPalette(&gSummaryScreen_Bg_Pal[16 * 5], BG_PLTT_ID(1), PLTT_SIZE_4BPP);
}
else
{
LoadPalette(&gSummaryScreen_Bg_Pal[16 * 0], BG_PLTT_ID(0), PLTT_SIZE_4BPP);
LoadPalette(&gSummaryScreen_Bg_Pal[16 * 1], BG_PLTT_ID(1), PLTT_SIZE_4BPP);
}
break;
case 1:
ListMenuLoadStdPalAt(BG_PLTT_ID(6), 1);
LoadPalette(sTextHeaderPalette, BG_PLTT_ID(7), PLTT_SIZE_4BPP);
break;
case 2:
ResetTempTileDataBuffers();
break;
case 3:
DecompressAndCopyTileDataToVram(2, gSummaryScreen_Bg_Gfx, 0, 0, 0);
break;
case 4:
if (FreeTempTileDataBuffersIfPossible() == TRUE)
return FALSE;
break;
case 5:
case 6:
break;
default:
LoadPalette(sTextMovesPalette, BG_PLTT_ID(8), PLTT_SIZE_4BPP);
return TRUE;
}
sMonSummaryScreen->loadBgGfxStep++;
return FALSE;
}
static u8 PokeSum_Setup_BufferStrings(void)
{
switch (sMonSummaryScreen->bufferStringsStep)
{
case 0:
BufferMonInfo();
if (sMonSummaryScreen->isEgg)
{
sMonSummaryScreen->bufferStringsStep = 0;
return TRUE;
}
break;
case 1:
if (sMonSummaryScreen->isEgg == 0)
BufferMonSkills();
break;
case 2:
if (sMonSummaryScreen->isEgg == 0)
BufferMonMoves();
break;
default:
sMonSummaryScreen->bufferStringsStep = 0;
return TRUE;
}
sMonSummaryScreen->bufferStringsStep++;
return FALSE;
}
static void BufferMonInfo(void)
{
u8 tempStr[20];
u16 dexNum;
u16 gender;
u16 heldItem;
u32 otId;
dexNum = SpeciesToPokedexNum(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES));
if (dexNum == 0xffff)
StringCopy(sMonSummaryScreen->summary.dexNumStrBuf, gText_PokeSum_DexNoUnknown);
else
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.dexNumStrBuf, dexNum, STR_CONV_MODE_LEADING_ZEROS, IsNationalPokedexEnabled() ? 4 : 3);
sMonSkillsPrinterXpos->unk00 = 0;
if (!sMonSummaryScreen->isEgg)
{
dexNum = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES);
StringCopy(sMonSummaryScreen->summary.speciesNameStrBuf, GetSpeciesName(dexNum));
}
else
{
GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_NICKNAME, sMonSummaryScreen->summary.speciesNameStrBuf);
return;
}
sMonSummaryScreen->monTypes[0] = gSpeciesInfo[dexNum].types[0];
sMonSummaryScreen->monTypes[1] = gSpeciesInfo[dexNum].types[1];
sMonSummaryScreen->monTypes[2] = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_TERA_TYPE);
GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_NICKNAME, tempStr);
StringCopyN_Multibyte(sMonSummaryScreen->summary.nicknameStrBuf, tempStr, POKEMON_NAME_LENGTH);
StringGet_Nickname(sMonSummaryScreen->summary.nicknameStrBuf);
gender = GetMonGender(&sMonSummaryScreen->currentMon);
dexNum = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG);
if (gender == MON_FEMALE)
StringCopy(sMonSummaryScreen->summary.genderSymbolStrBuf, gText_FemaleSymbol);
else if (gender == MON_MALE)
StringCopy(sMonSummaryScreen->summary.genderSymbolStrBuf, gText_MaleSymbol);
else
StringCopy(sMonSummaryScreen->summary.genderSymbolStrBuf, gString_Dummy);
if (dexNum == SPECIES_NIDORAN_M || dexNum == SPECIES_NIDORAN_F)
if (StringCompare(sMonSummaryScreen->summary.nicknameStrBuf, gSpeciesInfo[dexNum].speciesName) == 0)
StringCopy(sMonSummaryScreen->summary.genderSymbolStrBuf, gString_Dummy);
GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_NAME, tempStr);
StringCopyN_Multibyte(sMonSummaryScreen->summary.otNameStrBuf, tempStr, PLAYER_NAME_LENGTH);
ConvertInternationalString(sMonSummaryScreen->summary.otNameStrBuf, GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_LANGUAGE));
otId = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_OT_ID) & 0xffff;
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.unk306C, otId, STR_CONV_MODE_LEADING_ZEROS, 5);
ConvertIntToDecimalStringN(tempStr, GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_LEVEL), STR_CONV_MODE_LEFT_ALIGN, 3);
StringCopy(sMonSummaryScreen->summary.levelStrBuf, gText_Lv);
StringAppendN(sMonSummaryScreen->summary.levelStrBuf, tempStr, 4);
heldItem = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HELD_ITEM);
if (heldItem == ITEM_NONE)
StringCopy(sMonSummaryScreen->summary.itemNameStrBuf, gText_PokeSum_Item_None);
else
CopyItemName(heldItem, sMonSummaryScreen->summary.itemNameStrBuf);
}
#define GetNumberRightAlign63(x) (63 - StringLength((x)) * 6)
#define GetNumberRightAlign27(x) (27 - StringLength((x)) * 6)
static const struct StatData sStatData[] = {
[STAT_HP] =
{
.monDataStat = MON_DATA_HP,
.monDataStat2 = MON_DATA_HP,
.monDataEv = MON_DATA_HP_EV,
.monDataIv = MON_DATA_HP_IV,
.monDataHyperTrained = MON_DATA_HYPER_TRAINED_HP,
.pssStat = PSS_STAT_HP,
},
[STAT_ATK] =
{
.monDataStat = MON_DATA_ATK,
.monDataStat2 = MON_DATA_ATK2,
.monDataEv = MON_DATA_ATK_EV,
.monDataIv = MON_DATA_ATK_IV,
.monDataHyperTrained = MON_DATA_HYPER_TRAINED_ATK,
.pssStat = PSS_STAT_ATK,
},
[STAT_DEF] =
{
.monDataStat = MON_DATA_DEF,
.monDataStat2 = MON_DATA_DEF2,
.monDataEv = MON_DATA_DEF_EV,
.monDataIv = MON_DATA_DEF_IV,
.monDataHyperTrained = MON_DATA_HYPER_TRAINED_DEF,
.pssStat = PSS_STAT_DEF,
},
[STAT_SPATK] =
{
.monDataStat = MON_DATA_SPATK,
.monDataStat2 = MON_DATA_SPATK2,
.monDataEv = MON_DATA_SPATK_EV,
.monDataIv = MON_DATA_SPATK_IV,
.monDataHyperTrained = MON_DATA_HYPER_TRAINED_SPATK,
.pssStat = PSS_STAT_SPA,
},
[STAT_SPDEF] =
{
.monDataStat = MON_DATA_SPDEF,
.monDataStat2 = MON_DATA_SPDEF2,
.monDataEv = MON_DATA_SPDEF_EV,
.monDataIv = MON_DATA_SPDEF_IV,
.monDataHyperTrained = MON_DATA_HYPER_TRAINED_SPDEF,
.pssStat = PSS_STAT_SPD,
},
[STAT_SPEED] =
{
.monDataStat = MON_DATA_SPEED,
.monDataStat2 = MON_DATA_SPEED2,
.monDataEv = MON_DATA_SPEED_EV,
.monDataIv = MON_DATA_SPEED_IV,
.monDataHyperTrained = MON_DATA_HYPER_TRAINED_SPEED,
.pssStat = PSS_STAT_SPE,
},
};
static void SetStatXPos(u8 stat, u16 xpos)
{
switch (stat)
{
case STAT_HP:
sMonSkillsPrinterXpos->curHpStr = xpos;
break;
case STAT_ATK:
sMonSkillsPrinterXpos->atkStr = xpos;
break;
case STAT_DEF:
sMonSkillsPrinterXpos->defStr = xpos;
break;
case STAT_SPATK:
sMonSkillsPrinterXpos->spAStr = xpos;
break;
case STAT_SPDEF:
sMonSkillsPrinterXpos->spDStr = xpos;
break;
case STAT_SPEED:
sMonSkillsPrinterXpos->speStr = xpos;
break;
}
}
static void ApplyNatureColor(u8 *str, u8 stat)
{
const u8 blue[] = _("{COLOR 7}");
const u8 red[] = _("{COLOR 1}");
const u8 none[] = _("");
u8 nature = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HIDDEN_NATURE);
u8 tmp[20];
StringCopy(tmp, str);
if (gNaturesInfo[nature].statUp == gNaturesInfo[nature].statDown)
StringCopy(str, none);
else if (gNaturesInfo[nature].statUp == stat)
StringCopy(str, red);
else if (gNaturesInfo[nature].statDown == stat)
StringCopy(str, blue);
else
StringCopy(str, none);
StringAppend(str, tmp);
}
static void BufferStatString(u8 stat)
{
u8 *dst = sMonSummaryScreen->summary.statValueStrBufs[sStatData[stat].pssStat];
u16 statValue;
if (sMonSummaryScreen->savedCallback == CB2_ReturnToTradeMenuFromSummary && sMonSummaryScreen->isEnemyParty == TRUE)
statValue = GetMonData(&sMonSummaryScreen->currentMon, sStatData[stat].monDataStat2);
else
statValue = GetMonData(&sMonSummaryScreen->currentMon, sStatData[stat].monDataStat);
ConvertIntToDecimalStringN(dst, statValue, STR_CONV_MODE_LEFT_ALIGN, 3);
if (stat == STAT_HP)
{
u8 tempStr[20];
StringAppend(dst, gText_Slash);
statValue = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MAX_HP);
ConvertIntToDecimalStringN(tempStr, statValue, STR_CONV_MODE_LEFT_ALIGN, 3);
StringAppend(dst, tempStr);
}
SetStatXPos(stat, GetNumberRightAlign63(dst));
if (stat != STAT_HP)
ApplyNatureColor(dst, stat);
}
static void BufferEVString(u8 stat)
{
u16 statValue = GetMonData(&sMonSummaryScreen->currentMon, sStatData[stat].monDataEv);
u8 *dst = sMonSummaryScreen->summary.statValueStrBufs[sStatData[stat].pssStat];
u8 tmp[20];
ConvertIntToDecimalStringN(dst, statValue, STR_CONV_MODE_LEFT_ALIGN, 3);
StringAppend(dst, gText_Slash);
ConvertIntToDecimalStringN(tmp, MAX_PER_STAT_EVS, STR_CONV_MODE_LEFT_ALIGN, 3);
StringAppend(dst, tmp);
SetStatXPos(stat, GetNumberRightAlign63(dst));
if (stat != STAT_HP)
ApplyNatureColor(dst, stat);
}
static const u8 sText_JudgeNoGood[] = _("No good");
static const u8 sText_JudgeDecent[] = _("Decent");
static const u8 sText_JudgePrettyGood[] = _("Pretty good");
static const u8 sText_JudgeVeryGood[] = _("Very good");
static const u8 sText_JudgeFantastic[] = _("Fantastic");
static const u8 sText_JudgeBest[] = _("Best");
static const u8 sText_JudgeHyperTrained[] = _("Hyper trained!");
static void BufferIVString(u8 stat)
{
bool8 isHyperTrained = GetMonData(&sMonSummaryScreen->currentMon, sStatData[stat].monDataHyperTrained);
u16 statValue = GetMonData(&sMonSummaryScreen->currentMon, sStatData[stat].monDataIv);
u8 *dst = sMonSummaryScreen->summary.statValueStrBufs[sStatData[stat].pssStat];
if (isHyperTrained)
StringCopy(dst, sText_JudgeHyperTrained);
else if (statValue == 31)
StringCopy(dst, sText_JudgeBest);
else if (statValue == 30)
StringCopy(dst, sText_JudgeFantastic);
else if (statValue > 25)
StringCopy(dst, sText_JudgeVeryGood);
else if (statValue > 15)
StringCopy(dst, sText_JudgePrettyGood);
else if (statValue > 0)
StringCopy(dst, sText_JudgeDecent);
else
StringCopy(dst, sText_JudgeNoGood);
SetStatXPos(stat, 0);
if (stat != STAT_HP)
ApplyNatureColor(dst, stat);
}
static void BufferStat(u8 stat)
{
switch (sMonSummaryScreen->skillsPageMode)
{
case PSS_SKILL_PAGE_STATS:
BufferStatString(stat);
break;
case PSS_SKILL_PAGE_IVS:
BufferIVString(stat);
break;
case PSS_SKILL_PAGE_EVS:
BufferEVString(stat);
break;
}
}
static void BufferMonSkills(void)
{
u8 level;
u16 type;
u16 species;
u32 exp;
u32 expToNextLevel;
BufferStat(STAT_HP);
BufferStat(STAT_ATK);
BufferStat(STAT_DEF);
BufferStat(STAT_SPATK);
BufferStat(STAT_SPDEF);
BufferStat(STAT_SPEED);
exp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_EXP);
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.expPointsStrBuf, exp, STR_CONV_MODE_LEFT_ALIGN, 7);
sMonSkillsPrinterXpos->expStr = GetNumberRightAlign63(sMonSummaryScreen->summary.expPointsStrBuf);
level = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_LEVEL);
expToNextLevel = 0;
if (level < 100)
{
species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES);
expToNextLevel = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - exp;
}
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.expToNextLevelStrBuf, expToNextLevel, STR_CONV_MODE_LEFT_ALIGN, 7);
sMonSkillsPrinterXpos->toNextLevel = GetNumberRightAlign63(sMonSummaryScreen->summary.expToNextLevelStrBuf);
type = GetAbilityBySpecies(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES), GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_ABILITY_NUM));
StringCopy(sMonSummaryScreen->summary.abilityNameStrBuf, gAbilitiesInfo[type].name);
StringCopy(sMonSummaryScreen->summary.abilityDescStrBuf, gAbilitiesInfo[type].description);
sMonSummaryScreen->curMonStatusAilment = StatusToAilment(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_STATUS));
if (sMonSummaryScreen->curMonStatusAilment == AILMENT_NONE)
if (CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0))
sMonSummaryScreen->curMonStatusAilment = AILMENT_PKRS;
}
static void BufferMonMoves(void)
{
u8 i;
for (i = 0; i < 4; i++)
BufferMonMoveI(i);
if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE)
BufferMonMoveI(4);
}
#define GetRightAlignXpos_NDigits(a, b) ((6 * (a)) - StringLength((b)) * 6)
static void BufferMonMoveI(u8 i)
{
if (i < 4)
sMonSummaryScreen->moveIds[i] = GetMonMoveBySlotId(&sMonSummaryScreen->currentMon, i);
if (sMonSummaryScreen->moveIds[i] == 0)
{
StringCopy(sMonSummaryScreen->summary.moveNameStrBufs[i], gText_PokeSum_OneHyphen);
StringCopy(sMonSummaryScreen->summary.moveCurPpStrBufs[i], gText_PokeSum_TwoHyphens);
StringCopy(sMonSummaryScreen->summary.movePowerStrBufs[i], gText_ThreeHyphens);
StringCopy(sMonSummaryScreen->summary.moveAccuracyStrBufs[i], gText_ThreeHyphens);
sMonSkillsPrinterXpos->curPp[i] = 0xff;
sMonSkillsPrinterXpos->maxPp[i] = 0xff;
return;
}
sMonSummaryScreen->numMoves++;
sMonSummaryScreen->moveTypes[i] = gMovesInfo[sMonSummaryScreen->moveIds[i]].type;
StringCopy(sMonSummaryScreen->summary.moveNameStrBufs[i], gMovesInfo[sMonSummaryScreen->moveIds[i]].name);
if (i >= 4 && sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE)
{
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.moveCurPpStrBufs[i],
gMovesInfo[sMonSummaryScreen->moveIds[i]].pp, STR_CONV_MODE_LEFT_ALIGN, 3);
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.moveMaxPpStrBufs[i],
gMovesInfo[sMonSummaryScreen->moveIds[i]].pp, STR_CONV_MODE_LEFT_ALIGN, 3);
}
else
{
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.moveCurPpStrBufs[i],
GetMonPpByMoveSlot(&sMonSummaryScreen->currentMon, i), STR_CONV_MODE_LEFT_ALIGN, 3);
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.moveMaxPpStrBufs[i],
CalculatePPWithBonus(sMonSummaryScreen->moveIds[i], GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_PP_BONUSES), i),
STR_CONV_MODE_LEFT_ALIGN, 3);
}
sMonSkillsPrinterXpos->curPp[i] = GetRightAlignXpos_NDigits(2, sMonSummaryScreen->summary.moveCurPpStrBufs[i]);
sMonSkillsPrinterXpos->maxPp[i] = GetRightAlignXpos_NDigits(2, sMonSummaryScreen->summary.moveMaxPpStrBufs[i]);
if (gMovesInfo[sMonSummaryScreen->moveIds[i]].power <= 1)
StringCopy(sMonSummaryScreen->summary.movePowerStrBufs[i], gText_ThreeHyphens);
else
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.movePowerStrBufs[i], gMovesInfo[sMonSummaryScreen->moveIds[i]].power, STR_CONV_MODE_RIGHT_ALIGN, 3);
if (gMovesInfo[sMonSummaryScreen->moveIds[i]].accuracy == 0)
StringCopy(sMonSummaryScreen->summary.moveAccuracyStrBufs[i], gText_ThreeHyphens);
else
ConvertIntToDecimalStringN(sMonSummaryScreen->summary.moveAccuracyStrBufs[i], gMovesInfo[sMonSummaryScreen->moveIds[i]].accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3);
}
static u8 PokeSum_HandleCreateSprites(void)
{
switch (sMonSummaryScreen->spriteCreationStep)
{
case 0:
CreateShinyStarObj(TAG_PSS_UNK_A0, TAG_PSS_UNK_A0);
break;
case 1:
CreatePokerusIconObj(TAG_PSS_UNK_96, TAG_PSS_UNK_96);
break;
case 2:
PokeSum_CreateMonMarkingsSprite();
break;
case 3:
CreateMoveSelectionCursorObjs(TAG_PSS_UNK_64, TAG_PSS_UNK_64);
break;
case 4:
CreateMonStatusIconObj(TAG_PSS_UNK_6E, TAG_PSS_UNK_6E);
break;
case 5:
CreateHpBarObjs(TAG_PSS_UNK_78, TAG_PSS_UNK_78);
break;
case 6:
CreateExpBarObjs(TAG_PSS_UNK_82, TAG_PSS_UNK_82);
break;
case 7:
CreateBallIconObj();
break;
case 8:
PokeSum_CreateMonIconSprite();
break;
case 9:
LoadCompressedSpriteSheet(&gSpriteSheet_CategoryIcons);
LoadSpritePalette(&gSpritePal_CategoryIcons);
break;
default:
PokeSum_CreateMonPicSprite();
return TRUE;
}
sMonSummaryScreen->spriteCreationStep++;
return FALSE;
}
static void PokeSum_Setup_SpritesReset(void)
{
ResetSpriteData();
ResetPaletteFade();
FreeAllSpritePalettes();
ScanlineEffect_Stop();
}
static void PokeSum_Setup_InitGpu(void)
{
DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000);
DmaClear32(3, (void *)OAM, OAM_SIZE);
DmaClear16(3, (void *)PLTT, PLTT_SIZE);
SetGpuReg(REG_OFFSET_DISPCNT, 0);
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, sBgTempaltes, NELEMS(sBgTempaltes));
ChangeBgX(0, 0, 0);
ChangeBgY(0, 0, 0);
ChangeBgX(1, 0, 0);
ChangeBgY(1, 0, 0);
ChangeBgX(2, 0, 0);
ChangeBgY(2, 0, 0);
ChangeBgX(3, 0, 0);
ChangeBgY(3, 0, 0);
DeactivateAllTextPrinters();
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN1_ON);
PokeSum_UpdateWin1ActiveFlag(sMonSummaryScreen->curPageIndex);
SetGpuReg(REG_OFFSET_WININ, (WININ_WIN0_OBJ | WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3) << 8);
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3);
SetGpuReg(REG_OFFSET_WIN1V, 32 << 8 | 135);
SetGpuReg(REG_OFFSET_WIN1H, 2 << 8 | 240);
SetBgTilemapBuffer(1, sMonSummaryScreen->bg1TilemapBuffer);
SetBgTilemapBuffer(2, sMonSummaryScreen->bg2TilemapBuffer);
SetBgTilemapBuffer(3, sMonSummaryScreen->bg3TilemapBuffer);
ShowBg(0);
ShowBg(1);
ShowBg(2);
ShowBg(3);
}
static void PokeSum_FinishSetup(void)
{
if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE || sMonSummaryScreen->mode == PSS_MODE_FORGET_MOVE)
sMonSummaryScreen->inputHandlerTaskId = CreateTask(Task_InputHandler_SelectOrForgetMove, 0);
else
sMonSummaryScreen->inputHandlerTaskId = CreateTask(Task_InputHandler_Info, 0);
SetMainCallback2(CB2_RunPokemonSummaryScreen);
}
static void PokeSum_PrintPageName(const u8 * str)
{
FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 0);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], FONT_NORMAL, 4, 1, sLevelNickTextColors[1], 0, str);
PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME]);
}
static void PokeSum_PrintControlsString(const u8 * str)
{
s32 width;
u8 r1;
FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 0);
width = GetStringWidth(FONT_SMALL, str, 0);
r1 = sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS];
AddTextPrinterParameterized3(r1, FONT_SMALL, 0x54 - width, 0, sLevelNickTextColors[1], 0, str);
PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS]);
}
static void PrintMonLevelNickOnWindow2(const u8 * str)
{
FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 0);
if (!sMonSummaryScreen->isEgg)
{
if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2, 4, 2, sLevelNickTextColors[1], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.levelStrBuf);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], FONT_NORMAL, 40, 2, sLevelNickTextColors[1], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.nicknameStrBuf);
if (GetMonGender(&sMonSummaryScreen->currentMon) == MON_FEMALE)
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], FONT_NORMAL, 105, 2, sLevelNickTextColors[3], 0, sMonSummaryScreen->summary.genderSymbolStrBuf);
else
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], FONT_NORMAL, 105, 2, sLevelNickTextColors[2], 0, sMonSummaryScreen->summary.genderSymbolStrBuf);
}
PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK]);
}
static void PokeSum_PrintRightPaneText(void)
{
FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 0);
switch (sMonSummaryScreen->curPageIndex)
{
case PSS_PAGE_INFO:
PrintInfoPage();
break;
case PSS_PAGE_SKILLS:
PrintSkillsPage();
break;
case PSS_PAGE_MOVES:
case PSS_PAGE_MOVES_INFO:
PrintMovesPage();
break;
}
PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE]);
}
u32 GetInfoPageFontIdForString(u8 *str, u32 x)
{
u8 letterSpacing = GetFontAttribute(FONT_NORMAL, FONTATTR_LETTER_SPACING);
u32 maxTextWidth = WindowWidthPx(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE]);
if (x > maxTextWidth)
maxTextWidth = 0;
else
maxTextWidth -= x;
return GetFontIdToFit(str, FONT_NORMAL, letterSpacing, maxTextWidth);
}
static void PrintInfoPage(void)
{
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 47, 19, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.speciesNameStrBuf);
if (!sMonSummaryScreen->isEgg)
{
u32 fontId;
fontId = GetInfoPageFontIdForString(sMonSummaryScreen->summary.dexNumStrBuf, 47 + sMonSkillsPrinterXpos->unk00);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], fontId, 47 + sMonSkillsPrinterXpos->unk00, 5, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.dexNumStrBuf);
fontId = GetInfoPageFontIdForString(sMonSummaryScreen->summary.otNameStrBuf, 47);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], fontId, 47, 49, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.otNameStrBuf);
fontId = GetInfoPageFontIdForString(sMonSummaryScreen->summary.unk306C, 47);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], fontId, 47, 64, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.unk306C);
fontId = GetInfoPageFontIdForString(sMonSummaryScreen->summary.itemNameStrBuf, 47);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], fontId, 47, 79, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.itemNameStrBuf);
}
else
{
u8 eggCycles;
u8 hatchMsgIndex;
eggCycles = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_FRIENDSHIP);
if (eggCycles <= 5)
hatchMsgIndex = 3;
else if (eggCycles <= 10)
hatchMsgIndex = 2;
else if (eggCycles <= 40)
hatchMsgIndex = 1;
else
hatchMsgIndex = 0;
if (sMonSummaryScreen->isBadEgg)
hatchMsgIndex = 0;
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 7, 45, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sEggHatchTimeTexts[hatchMsgIndex]);
}
}
static void PrintSkillsPage(void)
{
u8 statFontId, x, yDiff;
switch (sMonSummaryScreen->skillsPageMode)
{
case PSS_SKILL_PAGE_IVS:
x = 10;
yDiff = 1;
statFontId = FONT_SMALL;
break;
default:
x = 13;
yDiff = 0;
statFontId = FONT_NORMAL;
break;
}
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], statFontId, x + sMonSkillsPrinterXpos->curHpStr, 4 - yDiff, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_HP]);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], statFontId, x + sMonSkillsPrinterXpos->atkStr, 22 - yDiff, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_ATK]);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], statFontId, x + sMonSkillsPrinterXpos->defStr, 35 - yDiff, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_DEF]);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], statFontId, x + sMonSkillsPrinterXpos->spAStr, 48 - yDiff, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPA]);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], statFontId, x + sMonSkillsPrinterXpos->spDStr, 61 - yDiff, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPD]);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], statFontId, x + sMonSkillsPrinterXpos->speStr, 74 - yDiff, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.statValueStrBufs[PSS_STAT_SPE]);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 15 + sMonSkillsPrinterXpos->expStr, 87, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.expPointsStrBuf);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 15 + sMonSkillsPrinterXpos->toNextLevel, 100, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.expToNextLevelStrBuf);
}
#define GetMoveNamePrinterYpos(x) ((x) * 28 + 5)
#define GetMovePpPrinterYpos(x) ((x) * 28 + 16)
static void PrintMovesPage(void)
{
u8 i;
for (i = 0; i < 4; i++)
PokeSum_PrintMoveName(i);
if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)
{
if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE)
PokeSum_PrintMoveName(4);
else
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL,
3, GetMoveNamePrinterYpos(4),
sPrintMoveTextColors[0], TEXT_SKIP_DRAW, gFameCheckerText_Cancel);
}
}
static void PokeSum_PrintMoveName(u8 i)
{
u8 colorIdx = 0;
u8 curPP = GetMonPpByMoveSlot(&sMonSummaryScreen->currentMon, i);
u16 move = sMonSummaryScreen->moveIds[i];
u8 ppBonuses = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_PP_BONUSES);
u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i);
if (i == 4)
curPP = maxPP;
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 0, GetMoveNamePrinterYpos(i), sPrintMoveTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.moveNameStrBufs[i]);
if (sMonSummaryScreen->moveIds[i] == 0 || (curPP == maxPP))
colorIdx = 0;
else if (curPP == 0)
colorIdx = 3;
else if (maxPP == 3)
{
if (curPP == 2)
colorIdx = 2;
else if (curPP == 1)
colorIdx = 1;
}
else if (maxPP == 2)
{
if (curPP == 1)
colorIdx = 1;
}
else
{
if (curPP <= (maxPP / 4))
colorIdx = 2;
else if (curPP <= (maxPP / 2))
colorIdx = 1;
}
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 36, GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW,
gText_PokeSum_PP);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 46 + sMonSkillsPrinterXpos->curPp[i], GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.moveCurPpStrBufs[i]);
if (sMonSummaryScreen->moveIds[i] != MOVE_NONE)
{
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 58, GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, gText_Slash);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 64 + sMonSkillsPrinterXpos->maxPp[i], GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.moveMaxPpStrBufs[i]);
}
}
static void PokeSum_PrintBottomPaneText(void)
{
FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 0);
switch (sMonSummaryScreen->curPageIndex)
{
case PSS_PAGE_INFO:
PokeSum_PrintTrainerMemo();
break;
case PSS_PAGE_SKILLS:
PokeSum_PrintExpPoints_NextLv();
break;
case PSS_PAGE_MOVES_INFO:
PokeSum_PrintSelectedMoveStats();
break;
case PSS_PAGE_MOVES:
break;
}
PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO]);
}
static void PokeSum_PrintTrainerMemo(void)
{
if (!sMonSummaryScreen->isEgg)
PokeSum_PrintTrainerMemo_Mon();
else
PokeSum_PrintTrainerMemo_Egg();
}
static void PokeSum_PrintTrainerMemo_Mon_HeldByOT(void)
{
u8 nature;
u8 level;
u8 metLocation;
u8 levelStr[5];
u8 mapNameStr[32];
u8 natureMetOrHatchedAtLevelStr[152];
DynamicPlaceholderTextUtil_Reset();
nature = GetNature(&sMonSummaryScreen->currentMon);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gNaturesInfo[nature].name);
level = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL);
if (level == 0)
level = 5;
ConvertIntToDecimalStringN(levelStr, level, STR_CONV_MODE_LEFT_ALIGN, 3);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, levelStr);
metLocation = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LOCATION);
if (MapSecIsInKantoOrSevii(metLocation) == TRUE)
GetMapNameGeneric_(mapNameStr, metLocation);
else
{
if (sMonSummaryScreen->isEnemyParty == TRUE || IsMultiBattlePartner() == TRUE)
StringCopy(mapNameStr, gText_Somewhere);
else
StringCopy(mapNameStr, gText_PokeSum_ATrade);
}
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, mapNameStr);
// These pairs of strings are bytewise identical to each other in English,
// but Japanese uses different grammar for Bold and Gentle natures.
if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL) == 0) // Hatched
{
if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MODERN_FATEFUL_ENCOUNTER) == TRUE)
{
if (PokeSum_IsMonBoldOrGentle(nature))
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterHatched_BoldGentleGrammar);
else
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterHatched);
}
else
{
if (PokeSum_IsMonBoldOrGentle(nature))
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_Hatched_BoldGentleGrammar);
else
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_Hatched);
}
}
else
{
if (metLocation == METLOC_FATEFUL_ENCOUNTER)
{
if (PokeSum_IsMonBoldOrGentle(nature))
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet_BoldGentleGrammar);
else
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet);
}
else
{
if (PokeSum_IsMonBoldOrGentle(nature))
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_Met_BoldGentleGrammar);
else
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_Met);
}
}
AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 0, 3, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, natureMetOrHatchedAtLevelStr);
}
static void PokeSum_PrintTrainerMemo_Mon_NotHeldByOT(void)
{
u8 nature;
u8 level;
u8 metLocation;
u8 levelStr[5];
u8 mapNameStr[32];
u8 natureMetOrHatchedAtLevelStr[152];
DynamicPlaceholderTextUtil_Reset();
nature = GetNature(&sMonSummaryScreen->currentMon);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gNaturesInfo[nature].name);
level = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL);
if (level == 0)
level = 5;
ConvertIntToDecimalStringN(levelStr, level, STR_CONV_MODE_LEFT_ALIGN, 3);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, levelStr);
metLocation = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LOCATION);
if (!MapSecIsInKantoOrSevii(metLocation) || !CurrentMonIsFromGBA())
{
if (IsMultiBattlePartner() == TRUE)
{
PokeSum_PrintTrainerMemo_Mon_HeldByOT();
return;
}
if (metLocation == METLOC_FATEFUL_ENCOUNTER)
{
if (PokeSum_IsMonBoldOrGentle(nature))
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet_BoldGentleGrammar);
else
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet);
}
else
{
if (PokeSum_IsMonBoldOrGentle(nature))
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_MetInATrade_BoldGentleGrammar);
else
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_MetInATrade);
}
AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 0, 3, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, natureMetOrHatchedAtLevelStr);
return;
}
if (MapSecIsInKantoOrSevii(metLocation) == TRUE)
GetMapNameGeneric_(mapNameStr, metLocation);
else
StringCopy(mapNameStr, gText_PokeSum_ATrade);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, mapNameStr);
// These pairs of strings are bytewise identical to each other in English,
// but Japanese uses different grammar for Bold and Gentle natures.
if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LEVEL) == 0) // hatched from an EGG
{
if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MODERN_FATEFUL_ENCOUNTER) == TRUE)
{
if (PokeSum_IsMonBoldOrGentle(nature))
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyFatefulEncounterHatched_BoldGentleGrammar);
else
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyFatefulEncounterHatched);
}
else
{
if (PokeSum_IsMonBoldOrGentle(nature))
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyMet_BoldGentleGrammar);
else
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyMet);
}
}
else
{
if (metLocation == METLOC_FATEFUL_ENCOUNTER)
{
if (PokeSum_IsMonBoldOrGentle(nature))
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet_BoldGentleGrammar);
else
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_FatefulEncounterMet);
}
else
{
if (PokeSum_IsMonBoldOrGentle(nature))
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyMet_BoldGentleGrammar);
else
DynamicPlaceholderTextUtil_ExpandPlaceholders(natureMetOrHatchedAtLevelStr, gText_PokeSum_ApparentlyMet);
}
}
AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 0, 3, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, natureMetOrHatchedAtLevelStr);
}
static void PokeSum_PrintTrainerMemo_Mon(void)
{
if (PokeSum_BufferOtName_IsEqualToCurrentOwner(&sMonSummaryScreen->currentMon) == TRUE)
PokeSum_PrintTrainerMemo_Mon_HeldByOT();
else
PokeSum_PrintTrainerMemo_Mon_NotHeldByOT();
}
static void PokeSum_PrintTrainerMemo_Egg(void)
{
u8 metLocation;
u8 version;
u8 chosenStrIndex = 0;
metLocation = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_LOCATION);
if (sMonSummaryScreen->monList.mons != gEnemyParty)
{
if (metLocation == METLOC_FATEFUL_ENCOUNTER || GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MODERN_FATEFUL_ENCOUNTER) == TRUE)
chosenStrIndex = 4;
else
{
version = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_GAME);
if (version != VERSION_LEAF_GREEN && version != VERSION_FIRE_RED)
chosenStrIndex = 1;
else if (metLocation == METLOC_SPECIAL_EGG)
chosenStrIndex = 2;
if (chosenStrIndex == 0 || chosenStrIndex == 2)
if (PokeSum_BufferOtName_IsEqualToCurrentOwner(&sMonSummaryScreen->currentMon) == FALSE)
chosenStrIndex++;
}
}
else
{
if (metLocation == METLOC_FATEFUL_ENCOUNTER || GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MODERN_FATEFUL_ENCOUNTER) == TRUE)
chosenStrIndex = 4;
else
{
version = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_GAME);
if (version != VERSION_LEAF_GREEN && version != VERSION_FIRE_RED)
{
if (metLocation == METLOC_SPECIAL_EGG)
chosenStrIndex = 5;
}
else if (metLocation == METLOC_SPECIAL_EGG)
chosenStrIndex = 2;
if (PokeSum_BufferOtName_IsEqualToCurrentOwner(&sMonSummaryScreen->currentMon) == FALSE)
chosenStrIndex++;
}
}
if (sMonSummaryScreen->isBadEgg)
chosenStrIndex = 0;
AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, 0, 3, 0, 0, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sEggOriginTexts[chosenStrIndex]);
}
static void PokeSum_PrintExpPoints_NextLv(void)
{
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL,
9, 7,
sLevelNickTextColors[0], TEXT_SKIP_DRAW,
gText_PokeSum_ExpPoints);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL,
9, 20,
sLevelNickTextColors[0], TEXT_SKIP_DRAW,
gText_PokeSum_NextLv);
}
// code
static u8 ShowCategoryIcon(u32 category)
{
if (sMonSummaryScreen->categoryIconSpriteId == 0xFF)
sMonSummaryScreen->categoryIconSpriteId = CreateSprite(&gSpriteTemplate_CategoryIcons, 90, 63, 0);
gSprites[sMonSummaryScreen->categoryIconSpriteId].invisible = FALSE;
StartSpriteAnim(&gSprites[sMonSummaryScreen->categoryIconSpriteId], category);
return sMonSummaryScreen->categoryIconSpriteId;
}
static void HideCategoryIcon()
{
if (sMonSummaryScreen->categoryIconSpriteId != 0xFF)
gSprites[sMonSummaryScreen->categoryIconSpriteId].invisible = TRUE;
}
static void DestroyCategoryIcon(void)
{
if (sMonSummaryScreen->categoryIconSpriteId != 0xFF)
DestroySprite(&gSprites[sMonSummaryScreen->categoryIconSpriteId]);
sMonSummaryScreen->categoryIconSpriteId = 0xFF;
}
static void PokeSum_PrintSelectedMoveStats(void)
{
if (sMoveSelectionCursorPos < 5)
{
if (sMonSummaryScreen->mode != PSS_MODE_SELECT_MOVE && sMoveSelectionCursorPos == 4)
{
HideCategoryIcon();
return;
}
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL,
57, 1,
sLevelNickTextColors[0], TEXT_SKIP_DRAW,
sMonSummaryScreen->summary.movePowerStrBufs[sMoveSelectionCursorPos]);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL,
57, 15,
sLevelNickTextColors[0], TEXT_SKIP_DRAW,
sMonSummaryScreen->summary.moveAccuracyStrBufs[sMoveSelectionCursorPos]);
if (gMovesInfo[sMonSummaryScreen->moveIds[sMoveSelectionCursorPos]].effect != EFFECT_PLACEHOLDER)
AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL,
7, 42,
0, 0,
sLevelNickTextColors[0], TEXT_SKIP_DRAW,
gMovesInfo[sMonSummaryScreen->moveIds[sMoveSelectionCursorPos]].description);
else
AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL,
7, 42,
0, 0,
sLevelNickTextColors[0], TEXT_SKIP_DRAW,
gNotDoneYetDescription);
if (B_SHOW_CATEGORY_ICON == TRUE)
ShowCategoryIcon(GetBattleMoveCategory(sMonSummaryScreen->moveIds[sMoveSelectionCursorPos]));
}
}
static void PokeSum_PrintAbilityDataOrMoveTypes(void)
{
switch (sMonSummaryScreen->curPageIndex)
{
case PSS_PAGE_INFO:
break;
case PSS_PAGE_SKILLS:
PokeSum_PrintAbilityNameAndDesc();
break;
case PSS_PAGE_MOVES:
case PSS_PAGE_MOVES_INFO:
PokeSum_DrawMoveTypeIcons();
break;
}
PutWindowTilemap(sMonSummaryScreen->windowIds[5]);
}
static void PokeSum_PrintAbilityNameAndDesc(void)
{
FillWindowPixelBuffer(sMonSummaryScreen->windowIds[5], 0);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[5], FONT_NORMAL,
49, 1, sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.abilityNameStrBuf);
AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[5], FONT_NORMAL,
2, 15, sLevelNickTextColors[0], TEXT_SKIP_DRAW,
sMonSummaryScreen->summary.abilityDescStrBuf);
}
static void PokeSum_DrawMoveTypeIcons(void)
{
u8 i;
FillWindowPixelBuffer(sMonSummaryScreen->windowIds[5], 0);
for (i = 0; i < 4; i++)
{
if (sMonSummaryScreen->moveIds[i] == MOVE_NONE)
continue;
BlitMenuInfoIcon(sMonSummaryScreen->windowIds[5], sMonSummaryScreen->moveTypes[i] + 1, 3, GetMoveNamePrinterYpos(i));
}
if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE)
BlitMenuInfoIcon(sMonSummaryScreen->windowIds[5], sMonSummaryScreen->moveTypes[4] + 1, 3, GetMoveNamePrinterYpos(4));
}
static void PokeSum_PrintPageHeaderText(u8 curPageIndex)
{
switch (curPageIndex)
{
case PSS_PAGE_INFO:
PokeSum_PrintPageName(gText_PokeSum_PageName_PokemonInfo);
if (!sMonSummaryScreen->isEgg)
PokeSum_PrintControlsString(gText_PokeSum_Controls_PageCancel);
else
PokeSum_PrintControlsString(gText_PokeSum_Controls_Cancel);
PrintMonLevelNickOnWindow2(gText_PokeSum_NoData);
break;
case PSS_PAGE_SKILLS:
PokeSum_PrintPageName(gText_PokeSum_PageName_PokemonSkills);
PokeSum_PrintControlsString(gText_PokeSum_Controls_PageJudge);
PrintMonLevelNickOnWindow2(gText_PokeSum_NoData);
break;
case PSS_PAGE_MOVES:
PokeSum_PrintPageName(gText_PokeSum_PageName_KnownMoves);
PokeSum_PrintControlsString(gText_PokeSum_Controls_PageDetail);
PrintMonLevelNickOnWindow2(gText_PokeSum_NoData);
break;
case PSS_PAGE_MOVES_INFO:
PokeSum_PrintPageName(gText_PokeSum_PageName_KnownMoves);
if (!gMain.inBattle)
PokeSum_PrintControlsString(gText_PokeSum_Controls_PickSwitch);
else
PokeSum_PrintControlsString(gText_PokeSum_Controls_Pick);
PrintMonLevelNickOnWindow2(gText_PokeSum_NoData);
break;
case PSS_PAGE_MOVE_DELETER:
PokeSum_PrintPageName(gText_PokeSum_PageName_KnownMoves);
PokeSum_PrintControlsString(gText_PokeSum_Controls_PickDelete);
PrintMonLevelNickOnWindow2(gText_PokeSum_NoData);
break;
default:
break;
}
}
static void CommitStaticWindowTilemaps(void)
{
PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME]);
PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS]);
PutWindowTilemap(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK]);
}
static void Task_DestroyResourcesOnExit(u8 taskId)
{
PokeSum_DestroySprites();
FreeAllSpritePalettes();
if (IsCryPlayingOrClearCrySongs() == TRUE)
StopCryAndClearCrySongs();
PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex);
FreeAllWindowBuffers();
DestroyTask(taskId);
SetMainCallback2(sMonSummaryScreen->savedCallback);
sLastViewedMonIndex = GetLastViewedMonIndex();
FREE_AND_SET_NULL_IF_SET(sMonSummaryScreen);
FREE_AND_SET_NULL_IF_SET(sMonSkillsPrinterXpos);
}
static void CB2_RunPokemonSummaryScreen(void)
{
RunTasks();
AnimateSprites();
BuildOamBuffer();
UpdatePaletteFade();
}
static void PokeSum_FlipPages_SlideHpExpBarsOut(void)
{
u8 i;
for (i = 0; i < 11; i++)
{
if (sExpBarObjs->xpos[i] < 240)
{
sExpBarObjs->xpos[i] += 60;
sExpBarObjs->sprites[i]->x = sExpBarObjs->xpos[i] + 60;
}
if (i >= 9)
continue;
if (sHpBarObjs->xpos[i] < 240)
{
sHpBarObjs->xpos[i] += 60;
sHpBarObjs->sprites[i]->x = sHpBarObjs->xpos[i] + 60;
}
}
}
static void PokeSum_FlipPages_SlideHpExpBarsIn(void)
{
u8 i;
for (i = 0; i < 11; i++)
{
if (sExpBarObjs->xpos[i] > 156 + (8 * i))
{
sExpBarObjs->xpos[i] -= 60;
if (sExpBarObjs->xpos[i] < 156 + (8 * i))
sExpBarObjs->xpos[i] = 156 + (8 * i);
sExpBarObjs->sprites[i]->x = sExpBarObjs->xpos[i];
}
if (i >= 9)
continue;
if (sHpBarObjs->xpos[i] > 172 + (8 * i))
{
sHpBarObjs->xpos[i] -= 60;
if (sHpBarObjs->xpos[i] < 172 + (8 * i))
sHpBarObjs->xpos[i] = 172 + (8 * i);
sHpBarObjs->sprites[i]->x = sHpBarObjs->xpos[i];
}
}
}
static void PokeSum_FlipPages_SlideLayerLeft(void)
{
if (sMonSummaryScreen->flipPagesBgHofs < 240)
{
sMonSummaryScreen->flipPagesBgHofs += 60;
if (sMonSummaryScreen->flipPagesBgHofs > 240)
sMonSummaryScreen->flipPagesBgHofs = 240;
if (sMonSummaryScreen->whichBgLayerToTranslate == 0)
SetGpuReg(REG_OFFSET_BG2HOFS, -sMonSummaryScreen->flipPagesBgHofs);
else
SetGpuReg(REG_OFFSET_BG1HOFS, -sMonSummaryScreen->flipPagesBgHofs);
}
}
static void PokeSum_FlipPages_SlideLayeRight(void)
{
if (sMonSummaryScreen->flipPagesBgHofs >= 60)
{
sMonSummaryScreen->flipPagesBgHofs -= 60;
if (sMonSummaryScreen->flipPagesBgHofs < 0)
sMonSummaryScreen->flipPagesBgHofs = 0;
if (sMonSummaryScreen->whichBgLayerToTranslate == 0)
SetGpuReg(REG_OFFSET_BG1HOFS, -sMonSummaryScreen->flipPagesBgHofs);
else
SetGpuReg(REG_OFFSET_BG2HOFS, -sMonSummaryScreen->flipPagesBgHofs);
if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)
SetGpuReg(REG_OFFSET_BG0HOFS, -sMonSummaryScreen->flipPagesBgHofs);
}
}
static void PokeSum_FlipPages_HandleBgHofs(void)
{
if (sMonSummaryScreen->pageFlipDirection == 1) // Right
{
if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)
PokeSum_FlipPages_SlideLayerLeft();
else
PokeSum_FlipPages_SlideLayeRight();
}
else
{
if (sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES)
PokeSum_FlipPages_SlideLayeRight();
else
PokeSum_FlipPages_SlideLayerLeft();
}
}
static void PokeSum_FlipPages_HandleHpExpBarSprites(void)
{
if (sMonSummaryScreen->curPageIndex == PSS_PAGE_SKILLS
&& sMonSummaryScreen->pageFlipDirection == 0)
PokeSum_FlipPages_SlideHpExpBarsIn();
if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES
&& sMonSummaryScreen->pageFlipDirection == 1)
PokeSum_FlipPages_SlideHpExpBarsOut();
}
static void VBlankCB_PokemonSummaryScreen(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
if (sMonSummaryScreen->flippingPages == FALSE)
return;
PokeSum_FlipPages_HandleBgHofs();
PokeSum_FlipPages_HandleHpExpBarSprites();
}
static void PokeSum_Setup_ResetCallbacks(void)
{
SetVBlankCallback(NULL);
SetHBlankCallback(NULL);
}
static void PokeSum_Setup_SetVBlankCallback(void)
{
SetVBlankCallback(VBlankCB_PokemonSummaryScreen);
}
static void PokeSum_CreateWindows(void)
{
u8 i;
InitWindows(sWindowTemplates_Dummy);
for (i = 0; i < 3; i++)
sMonSummaryScreen->windowIds[i] = AddWindow(&sWindowTemplates_Permanent_Bg1[i]);
for (i = 0; i < 4; i++)
switch (sMonSummaryScreen->curPageIndex)
{
case PSS_PAGE_INFO:
sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Info[i]);
break;
case PSS_PAGE_SKILLS:
sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Skills[i]);
break;
case PSS_PAGE_MOVES:
case PSS_PAGE_MOVES_INFO:
sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Moves[i]);
break;
default:
break;
}
}
static void PokeSum_AddWindows(u8 curPageIndex)
{
u8 i;
u32 bgPriority1 = GetGpuReg(REG_OFFSET_BG1CNT) & 3;
u32 bgPriority2 = GetGpuReg(REG_OFFSET_BG2CNT) & 3;
for (i = 0; i < 7; i++)
sMonSummaryScreen->windowIds[i] = 0xff;
if ((sMonSummaryScreen->pageFlipDirection == 1 && sMonSummaryScreen->curPageIndex != PSS_PAGE_MOVES_INFO)
|| (sMonSummaryScreen->pageFlipDirection == 0 && sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES))
{
if (bgPriority2 > bgPriority1)
for (i = 0; i < 3; i++)
sMonSummaryScreen->windowIds[i] = AddWindow(&sWindowTemplates_Permanent_Bg2[i]);
else
for (i = 0; i < 3; i++)
sMonSummaryScreen->windowIds[i] = AddWindow(&sWindowTemplates_Permanent_Bg1[i]);
}
else
{
if (bgPriority2 > bgPriority1)
for (i = 0; i < 3; i++)
sMonSummaryScreen->windowIds[i] = AddWindow(&sWindowTemplates_Permanent_Bg1[i]);
else
for (i = 0; i < 3; i++)
sMonSummaryScreen->windowIds[i] = AddWindow(&sWindowTemplates_Permanent_Bg2[i]);
}
for (i = 0; i < 4; i++)
switch (curPageIndex)
{
case PSS_PAGE_INFO:
sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Info[i]);
break;
case PSS_PAGE_SKILLS:
default:
sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Skills[i]);
break;
case PSS_PAGE_MOVES:
case PSS_PAGE_MOVES_INFO:
sMonSummaryScreen->windowIds[i + 3] = AddWindow(&sWindowTemplates_Moves[i]);
break;
}
}
static void PokeSum_RemoveWindows(u8 curPageIndex)
{
u8 i;
for (i = 0; i < 7; i++)
RemoveWindow(sMonSummaryScreen->windowIds[i]);
}
static void PokeSum_SetHelpContext(void)
{
switch (sMonSummaryScreen->curPageIndex)
{
case PSS_PAGE_INFO:
SetHelpContext(HELPCONTEXT_POKEMON_INFO);
break;
case PSS_PAGE_SKILLS:
SetHelpContext(HELPCONTEXT_POKEMON_SKILLS);
break;
case PSS_PAGE_MOVES:
case PSS_PAGE_MOVES_INFO:
SetHelpContext(HELPCONTEXT_POKEMON_MOVES);
break;
}
}
static u8 PokeSum_BufferOtName_IsEqualToCurrentOwner(struct Pokemon * mon)
{
u8 multiplayerId;
u32 trainerId = 0;
if (sMonSummaryScreen->monList.mons == gEnemyParty)
{
multiplayerId = GetMultiplayerId() ^ 1;
trainerId = gLinkPlayers[multiplayerId].trainerId & 0xffff;
StringCopy(sMonSummaryScreen->summary.otNameStrBufs[0], gLinkPlayers[multiplayerId].name);
}
else
{
trainerId = GetPlayerTrainerId() & 0xffff;
StringCopy(sMonSummaryScreen->summary.otNameStrBufs[0], gSaveBlock2Ptr->playerName);
}
if (trainerId != (GetMonData(mon, MON_DATA_OT_ID) & 0xffff))
return FALSE;
GetMonData(mon, MON_DATA_OT_NAME, sMonSummaryScreen->summary.otNameStrBufs[1]);
if (!StringCompareWithoutExtCtrlCodes(sMonSummaryScreen->summary.otNameStrBufs[0], sMonSummaryScreen->summary.otNameStrBufs[1]))
return TRUE;
else
return FALSE;
return TRUE;
}
#define PAGE_PROGRESS_BASE_TILE_NUM (345)
static void PokeSum_DrawPageProgressTiles(void)
{
switch (sMonSummaryScreen->curPageIndex)
{
case PSS_PAGE_INFO:
if (!sMonSummaryScreen->isEgg)
{
FillBgTilemapBufferRect(3, 17 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 33 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 16 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 32 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 18 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 34 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 20 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 36 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 18 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 34 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 21 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 37 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 1, 1, 1, 0);
}
else
{
FillBgTilemapBufferRect(3, 17 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 33 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 48 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 64 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 2 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 0, 4, 2, 0);
}
break;
case PSS_PAGE_SKILLS:
FillBgTilemapBufferRect(3, 49 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 65 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 1 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 17 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 33 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 16 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 32 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 18 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 34 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 21 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 37 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 1, 1, 1, 0);
break;
case PSS_PAGE_MOVES:
FillBgTilemapBufferRect(3, 49 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 65 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 1 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 49 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 65 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 1 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 17 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 33 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 48 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 64 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 1, 1, 1, 0);
break;
case PSS_PAGE_MOVES_INFO:
if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE)
{
FillBgTilemapBufferRect(3, 1 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 4, 1, 0);
FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 4, 1, 0);
}
else
{
FillBgTilemapBufferRect(3, 49 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 65 + PAGE_PROGRESS_BASE_TILE_NUM, 13, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 1 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 14, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 49 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 65 + PAGE_PROGRESS_BASE_TILE_NUM, 15, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 1 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 19 + PAGE_PROGRESS_BASE_TILE_NUM, 16, 1, 1, 1, 0);
}
FillBgTilemapBufferRect(3, 50 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 66 + PAGE_PROGRESS_BASE_TILE_NUM, 17, 1, 1, 1, 0);
FillBgTilemapBufferRect(3, 48 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 0, 1, 1, 0);
FillBgTilemapBufferRect(3, 64 + PAGE_PROGRESS_BASE_TILE_NUM, 18, 1, 1, 1, 0);
break;
}
}
static void PokeSum_PrintMonTypeIcons(void)
{
switch (sMonSummaryScreen->curPageIndex)
{
case PSS_PAGE_INFO:
if (!sMonSummaryScreen->isEgg)
{
BlitMenuInfoIcon(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], sMonSummaryScreen->monTypes[0] + 1, 47, 35);
if (sMonSummaryScreen->monTypes[0] != sMonSummaryScreen->monTypes[1])
BlitMenuInfoIcon(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], sMonSummaryScreen->monTypes[1] + 1, 83, 35);
if (P_SHOW_TERA_TYPE == GEN_9 && sMonSummaryScreen->monTypes[2] != TYPE_NONE)
BlitMenuInfoIcon(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], sMonSummaryScreen->monTypes[2] + 1, 83, 5);
}
break;
case PSS_PAGE_SKILLS:
break;
case PSS_PAGE_MOVES:
break;
case PSS_PAGE_MOVES_INFO:
FillWindowPixelBuffer(sMonSummaryScreen->windowIds[6], 0);
BlitMenuInfoIcon(sMonSummaryScreen->windowIds[6], sMonSummaryScreen->monTypes[0] + 1, 0, 3);
if (sMonSummaryScreen->monTypes[0] != sMonSummaryScreen->monTypes[1])
BlitMenuInfoIcon(sMonSummaryScreen->windowIds[6], sMonSummaryScreen->monTypes[1] + 1, 36, 3);
PutWindowTilemap(sMonSummaryScreen->windowIds[6]);
break;
}
}
u8 GetLastViewedMonIndex(void)
{
return sLastViewedMonIndex;
}
u8 GetMoveSlotToReplace(void)
{
return sMoveSwapCursorPos;
}
void SetPokemonSummaryScreenMode(u8 mode)
{
sMonSummaryScreen->mode = mode;
}
static bool32 IsMultiBattlePartner(void)
{
if (!IsUpdateLinkStateCBActive()
&& IsMultiBattle() == TRUE
&& gReceivedRemoteLinkPlayers == 1
&& (sLastViewedMonIndex >= 4 || sLastViewedMonIndex == 1))
return TRUE;
return FALSE;
}
static void BufferSelectedMonData(struct Pokemon * mon)
{
if (!sMonSummaryScreen->isBoxMon)
{
struct Pokemon * partyMons = sMonSummaryScreen->monList.mons;
*mon = partyMons[GetLastViewedMonIndex()];
}
else
{
struct BoxPokemon * boxMons = sMonSummaryScreen->monList.boxMons;
BoxMonToMon(&boxMons[GetLastViewedMonIndex()], mon);
}
}
static u16 GetMonMoveBySlotId(struct Pokemon * mon, u8 moveSlot)
{
u16 move;
switch (moveSlot)
{
case 0:
move = GetMonData(mon, MON_DATA_MOVE1);
break;
case 1:
move = GetMonData(mon, MON_DATA_MOVE2);
break;
case 2:
move = GetMonData(mon, MON_DATA_MOVE3);
break;
default:
move = GetMonData(mon, MON_DATA_MOVE4);
}
return move;
}
static u16 GetMonPpByMoveSlot(struct Pokemon * mon, u8 moveSlot)
{
u16 pp;
switch (moveSlot)
{
case 0:
pp = GetMonData(mon, MON_DATA_PP1);
break;
case 1:
pp = GetMonData(mon, MON_DATA_PP2);
break;
case 2:
pp = GetMonData(mon, MON_DATA_PP3);
break;
default:
pp = GetMonData(mon, MON_DATA_PP4);
}
return pp;
}
static u8 StatusToAilment(u32 status)
{
if (GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP) == 0)
return AILMENT_FNT;
if ((status & STATUS1_PSN_ANY) != 0)
return AILMENT_PSN;
if ((status & STATUS1_PARALYSIS) != 0)
return AILMENT_PRZ;
if ((status & STATUS1_SLEEP) != 0)
return AILMENT_SLP;
if ((status & STATUS1_FREEZE) != 0)
return AILMENT_FRZ;
if ((status & STATUS1_BURN) != 0)
return AILMENT_BRN;
if (CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0))
return AILMENT_PKRS;
return AILMENT_NONE;
}
static void Task_HandleInput_SelectMove(u8 taskId)
{
u8 i;
switch (sMonSummaryScreen->selectMoveInputHandlerState)
{
case 0:
if (IsActiveOverworldLinkBusy() == TRUE || IsLinkRecvQueueAtOverworldMax() == TRUE)
return;
if (JOY_NEW(DPAD_UP))
{
if (sMoveSelectionCursorPos > 0)
{
sMonSummaryScreen->selectMoveInputHandlerState = 2;
PlaySE(SE_SELECT);
for (i = sMoveSelectionCursorPos; i > 0; i--)
if (sMonSummaryScreen->moveIds[i - 1] != 0)
{
PlaySE(SE_SELECT);
sMoveSelectionCursorPos = i - 1;
return;
}
}
else
{
sMoveSelectionCursorPos = 4;
sMonSummaryScreen->selectMoveInputHandlerState = 2;
PlaySE(SE_SELECT);
if (sMonSummaryScreen->isSwappingMoves == TRUE)
for (i = sMoveSelectionCursorPos; i > 0; i--)
if (sMonSummaryScreen->moveIds[i - 1] != 0)
{
PlaySE(SE_SELECT);
sMoveSelectionCursorPos = i - 1;
return;
}
}
}
else if (JOY_NEW(DPAD_DOWN))
{
if (sMoveSelectionCursorPos < 4)
{
u8 v0 = 4;
sMonSummaryScreen->selectMoveInputHandlerState = 2;
if (sMonSummaryScreen->isSwappingMoves == TRUE)
{
if (sMoveSelectionCursorPos == 5 - 2)
{
sMoveSelectionCursorPos = 0;
sMonSummaryScreen->selectMoveInputHandlerState = 2;
PlaySE(SE_SELECT);
return;
}
v0--;
}
for (i = sMoveSelectionCursorPos; i < v0; i++)
if (sMonSummaryScreen->moveIds[i + 1] != 0)
{
PlaySE(SE_SELECT);
sMoveSelectionCursorPos = i + 1;
return;
}
if (!sMonSummaryScreen->isSwappingMoves)
{
PlaySE(SE_SELECT);
sMoveSelectionCursorPos = i;
}
else
{
PlaySE(SE_SELECT);
sMoveSelectionCursorPos = 0;
}
return;
}
else if (sMoveSelectionCursorPos == 4)
{
sMoveSelectionCursorPos = 0;
sMonSummaryScreen->selectMoveInputHandlerState = 2;
PlaySE(SE_SELECT);
return;
}
}
else if (JOY_NEW(A_BUTTON))
{
PlaySE(SE_SELECT);
if (sMoveSelectionCursorPos == 4)
{
sMoveSelectionCursorPos = 0;
sMoveSwapCursorPos = 0;
sMonSummaryScreen->isSwappingMoves = FALSE;
ShoworHideMoveSelectionCursor(TRUE);
sMonSummaryScreen->pageFlipDirection = 0;
PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex);
sMonSummaryScreen->curPageIndex--;
sMonSummaryScreen->selectMoveInputHandlerState = 1;
return;
}
if (sMonSummaryScreen->isSwappingMoves != TRUE)
{
if (sMonSummaryScreen->isEnemyParty == FALSE
&& gMain.inBattle == 0
&& gReceivedRemoteLinkPlayers == 0)
{
sMoveSwapCursorPos = sMoveSelectionCursorPos;
sMonSummaryScreen->isSwappingMoves = TRUE;
}
return;
}
else
{
sMonSummaryScreen->isSwappingMoves = FALSE;
if (sMoveSelectionCursorPos == sMoveSwapCursorPos)
return;
if (sMonSummaryScreen->isBoxMon == 0)
SwapMonMoveSlots();
else
SwapBoxMonMoveSlots();
UpdateCurrentMonBufferFromPartyOrBox(&sMonSummaryScreen->currentMon);
BufferMonMoves();
sMonSummaryScreen->selectMoveInputHandlerState = 2;
return;
}
}
else if (JOY_NEW(B_BUTTON))
{
if (sMonSummaryScreen->isSwappingMoves == TRUE)
{
sMoveSwapCursorPos = sMoveSelectionCursorPos;
sMonSummaryScreen->isSwappingMoves = FALSE;
return;
}
if (sMoveSelectionCursorPos == 4)
{
sMoveSelectionCursorPos = 0;
sMoveSwapCursorPos = 0;
}
DestroyCategoryIcon();
ShoworHideMoveSelectionCursor(TRUE);
sMonSummaryScreen->pageFlipDirection = 0;
PokeSum_RemoveWindows(sMonSummaryScreen->curPageIndex);
sMonSummaryScreen->curPageIndex--;
sMonSummaryScreen->selectMoveInputHandlerState = 1;
}
break;
case 1:
gTasks[sMonSummaryScreen->inputHandlerTaskId].func = Task_BackOutOfSelectMove;
sMonSummaryScreen->selectMoveInputHandlerState = 0;
break;
case 2:
PokeSum_PrintRightPaneText();
PokeSum_PrintBottomPaneText();
PokeSum_PrintAbilityDataOrMoveTypes();
sMonSummaryScreen->selectMoveInputHandlerState = 3;
break;
case 3:
if (IsActiveOverworldLinkBusy() == TRUE || IsLinkRecvQueueAtOverworldMax() == TRUE)
return;
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2);
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(3);
sMonSummaryScreen->selectMoveInputHandlerState = 0;
break;
default:
break;
}
}
static void SwapMonMoveSlots(void)
{
struct Pokemon * partyMons;
struct Pokemon * mon;
u16 move1, move2;
u8 pp1, pp2;
u8 allMovesPPBonuses;
u8 move1ppBonus, move2ppBonus;
partyMons = sMonSummaryScreen->monList.mons;
mon = &partyMons[GetLastViewedMonIndex()];
move1 = GetMonData(mon, MON_DATA_MOVE1 + sMoveSelectionCursorPos);
move2 = GetMonData(mon, MON_DATA_MOVE1 + sMoveSwapCursorPos);
pp1 = GetMonData(mon, MON_DATA_PP1 + sMoveSelectionCursorPos);
pp2 = GetMonData(mon, MON_DATA_PP1 + sMoveSwapCursorPos);
allMovesPPBonuses = GetMonData(mon, MON_DATA_PP_BONUSES);
move1ppBonus = (allMovesPPBonuses & gPPUpGetMask[sMoveSelectionCursorPos]) >> (sMoveSelectionCursorPos * 2);
move2ppBonus = (allMovesPPBonuses & gPPUpGetMask[sMoveSwapCursorPos]) >> (sMoveSwapCursorPos * 2);
allMovesPPBonuses &= ~gPPUpGetMask[sMoveSelectionCursorPos];
allMovesPPBonuses &= ~gPPUpGetMask[sMoveSwapCursorPos];
allMovesPPBonuses |= (move1ppBonus << (sMoveSwapCursorPos * 2)) + (move2ppBonus << (sMoveSelectionCursorPos * 2));
SetMonData(mon, MON_DATA_MOVE1 + sMoveSelectionCursorPos, (u8 *)&move2);
SetMonData(mon, MON_DATA_MOVE1 + sMoveSwapCursorPos, (u8 *)&move1);
SetMonData(mon, MON_DATA_PP1 + sMoveSelectionCursorPos, &pp2);
SetMonData(mon, MON_DATA_PP1 + sMoveSwapCursorPos, &pp1);
SetMonData(mon, MON_DATA_PP_BONUSES, &allMovesPPBonuses);
}
static void SwapBoxMonMoveSlots(void)
{
struct BoxPokemon * boxMons;
struct BoxPokemon * boxMon;
u16 move1, move2;
u8 pp1, pp2;
u8 allMovesPPBonuses;
u8 move1ppBonus, move2ppBonus;
boxMons = sMonSummaryScreen->monList.boxMons;
boxMon = &boxMons[GetLastViewedMonIndex()];
move1 = GetBoxMonData(boxMon, MON_DATA_MOVE1 + sMoveSelectionCursorPos);
move2 = GetBoxMonData(boxMon, MON_DATA_MOVE1 + sMoveSwapCursorPos);
pp1 = GetBoxMonData(boxMon, MON_DATA_PP1 + sMoveSelectionCursorPos);
pp2 = GetBoxMonData(boxMon, MON_DATA_PP1 + sMoveSwapCursorPos);
allMovesPPBonuses = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES);
move1ppBonus = (allMovesPPBonuses & gPPUpGetMask[sMoveSelectionCursorPos]) >> (sMoveSelectionCursorPos * 2);
move2ppBonus = (allMovesPPBonuses & gPPUpGetMask[sMoveSwapCursorPos]) >> (sMoveSwapCursorPos * 2);
allMovesPPBonuses &= ~gPPUpGetMask[sMoveSelectionCursorPos];
allMovesPPBonuses &= ~gPPUpGetMask[sMoveSwapCursorPos];
allMovesPPBonuses |= (move1ppBonus << (sMoveSwapCursorPos * 2)) + (move2ppBonus << (sMoveSelectionCursorPos * 2));
SetBoxMonData(boxMon, MON_DATA_MOVE1 + sMoveSelectionCursorPos, (u8 *)&move2);
SetBoxMonData(boxMon, MON_DATA_MOVE1 + sMoveSwapCursorPos, (u8 *)&move1);
SetBoxMonData(boxMon, MON_DATA_PP1 + sMoveSelectionCursorPos, &pp2);
SetBoxMonData(boxMon, MON_DATA_PP1 + sMoveSwapCursorPos, &pp1);
SetBoxMonData(boxMon, MON_DATA_PP_BONUSES, &allMovesPPBonuses);
}
static void UpdateCurrentMonBufferFromPartyOrBox(struct Pokemon * mon)
{
if (!sMonSummaryScreen->isBoxMon)
{
struct Pokemon * partyMons;
partyMons = sMonSummaryScreen->monList.mons;
*mon = partyMons[GetLastViewedMonIndex()];
}
else
{
struct BoxPokemon * boxMons;
boxMons = sMonSummaryScreen->monList.boxMons;
BoxMonToMon(&boxMons[GetLastViewedMonIndex()], mon);
}
}
static u8 PokeSum_CanForgetSelectedMove(void)
{
u16 move;
move = GetMonMoveBySlotId(&sMonSummaryScreen->currentMon, sMoveSelectionCursorPos);
if (IsMoveHM(move) == TRUE && sMonSummaryScreen->mode != PSS_MODE_FORGET_MOVE)
return FALSE;
return TRUE;
}
static void Task_InputHandler_SelectOrForgetMove(u8 taskId)
{
u8 i;
switch (sMonSummaryScreen->selectMoveInputHandlerState)
{
case 0:
BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0);
sMonSummaryScreen->selectMoveInputHandlerState++;
break;
case 1:
if (!gPaletteFade.active)
{
PokeSum_TryPlayMonCry();
sMonSummaryScreen->selectMoveInputHandlerState++;
}
break;
case 2:
if (JOY_NEW(DPAD_UP))
{
if (sMoveSelectionCursorPos > 0)
{
sMonSummaryScreen->selectMoveInputHandlerState = 3;
PlaySE(SE_SELECT);
for (i = sMoveSelectionCursorPos; i > 0; i--)
if (sMonSummaryScreen->moveIds[i - 1] != 0)
{
PlaySE(SE_SELECT);
sMoveSelectionCursorPos = i - 1;
return;
}
}
else
{
sMoveSelectionCursorPos = 4;
sMonSummaryScreen->selectMoveInputHandlerState = 3;
PlaySE(SE_SELECT);
return;
}
}
else if (JOY_NEW(DPAD_DOWN))
{
if (sMoveSelectionCursorPos < 4)
{
u8 v0 = 4;
sMonSummaryScreen->selectMoveInputHandlerState = 3;
if (sMonSummaryScreen->isSwappingMoves == TRUE)
v0--;
for (i = sMoveSelectionCursorPos; i < v0; i++)
if (sMonSummaryScreen->moveIds[i + 1] != 0)
{
PlaySE(SE_SELECT);
sMoveSelectionCursorPos = i + 1;
return;
}
if (!sMonSummaryScreen->isSwappingMoves)
{
PlaySE(SE_SELECT);
sMoveSelectionCursorPos = i;
}
return;
}
else if (sMoveSelectionCursorPos == 4)
{
sMoveSelectionCursorPos = 0;
sMonSummaryScreen->selectMoveInputHandlerState = 3;
PlaySE(SE_SELECT);
return;
}
}
else if (JOY_NEW(A_BUTTON))
{
if (PokeSum_CanForgetSelectedMove() == TRUE || sMoveSelectionCursorPos == 4)
{
PlaySE(SE_SELECT);
sMoveSwapCursorPos = sMoveSelectionCursorPos;
gSpecialVar_0x8005 = sMoveSwapCursorPos;
sMonSummaryScreen->selectMoveInputHandlerState = 6;
}
else
{
PlaySE(SE_FAILURE);
sMonSummaryScreen->selectMoveInputHandlerState = 5;
}
}
else if (JOY_NEW(B_BUTTON))
{
sMoveSwapCursorPos = 4;
gSpecialVar_0x8005 = (u16)sMoveSwapCursorPos;
sMonSummaryScreen->selectMoveInputHandlerState = 6;
}
break;
case 3:
PokeSum_PrintRightPaneText();
PokeSum_PrintBottomPaneText();
PokeSum_PrintAbilityDataOrMoveTypes();
sMonSummaryScreen->selectMoveInputHandlerState = 4;
break;
case 4:
if (IsActiveOverworldLinkBusy() == TRUE || IsLinkRecvQueueAtOverworldMax() == TRUE)
return;
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2);
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(3);
sMonSummaryScreen->selectMoveInputHandlerState = 2;
break;
case 5:
FillWindowPixelBuffer(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 0);
AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL,
7, 42,
0, 0,
sLevelNickTextColors[0], TEXT_SKIP_DRAW,
gText_PokeSum_HmMovesCantBeForgotten);
HideCategoryIcon();
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(3);
sMonSummaryScreen->selectMoveInputHandlerState = 2;
break;
case 6:
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0);
sMonSummaryScreen->selectMoveInputHandlerState++;
break;
default:
if (!gPaletteFade.active)
Task_DestroyResourcesOnExit(taskId);
break;
}
}
static void SpriteCB_PokeSum_MonPicSprite(struct Sprite *sprite)
{
if (sMonSummaryScreen->numMonPicBounces >= 2)
return;
if (sMonPicBounceState->initDelay++ >= 2)
{
u8 arrayLen;
switch (sMonPicBounceState->vigor)
{
case 0:
sprite->y += sMonPicBounceYDelta_Under60[sMonPicBounceState->animFrame++];
arrayLen = NELEMS(sMonPicBounceYDelta_Under60);
break;
case 1:
sprite->y += sMonPicBounceYDelta_60to80[sMonPicBounceState->animFrame++];
arrayLen = NELEMS(sMonPicBounceYDelta_60to80);
break;
case 2:
sprite->y += sMonPicBounceYDelta_80to99[sMonPicBounceState->animFrame++];
arrayLen = NELEMS(sMonPicBounceYDelta_80to99);
break;
case 3:
default:
sprite->y += sMonPicBounceYDelta_Full[sMonPicBounceState->animFrame++];
arrayLen = NELEMS(sMonPicBounceYDelta_Full);
break;
}
if (sMonPicBounceState->animFrame >= arrayLen)
{
sMonPicBounceState->animFrame = 0;
sMonSummaryScreen->numMonPicBounces++;
}
sMonPicBounceState->initDelay = 0;
}
}
static void SpriteCB_PokeSum_EggPicShake(struct Sprite *sprite)
{
if (sMonSummaryScreen->numMonPicBounces >= 2)
return;
switch (sMonPicBounceState->vigor)
{
case 0:
default:
if (sMonPicBounceState->initDelay++ >= 120)
{
sprite->x += sEggPicShakeXDelta_ItWillTakeSomeTime[sMonPicBounceState->animFrame];
if (++sMonPicBounceState->animFrame >= NELEMS(sEggPicShakeXDelta_ItWillTakeSomeTime))
{
sMonPicBounceState->animFrame = 0;
sMonPicBounceState->initDelay = 0;
sMonSummaryScreen->numMonPicBounces++;
}
}
break;
case 1:
if (sMonPicBounceState->initDelay++ >= 90)
{
sprite->x += sEggPicShakeXDelta_OccasionallyMoves[sMonPicBounceState->animFrame];
if (++sMonPicBounceState->animFrame >= NELEMS(sEggPicShakeXDelta_OccasionallyMoves))
{
sMonPicBounceState->animFrame = 0;
sMonPicBounceState->initDelay = 0;
sMonSummaryScreen->numMonPicBounces++;
}
}
break;
case 2:
if (sMonPicBounceState->initDelay++ >= 60)
{
sprite->x += sEggPicShakeXDelta_AlmostReadyToHatch[sMonPicBounceState->animFrame];
if (++sMonPicBounceState->animFrame >= NELEMS(sEggPicShakeXDelta_AlmostReadyToHatch))
{
sMonPicBounceState->animFrame = 0;
sMonPicBounceState->initDelay = 0;
sMonSummaryScreen->numMonPicBounces++;
}
}
break;
}
}
static void SpriteCB_MonPicDummy(struct Sprite *sprite)
{
}
static void PokeSum_CreateMonPicSprite(void)
{
u16 spriteId;
u16 species;
u32 personality;
bool32 isShiny;
sMonPicBounceState = AllocZeroed(sizeof(struct MonPicBounceState));
species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG);
personality = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_PERSONALITY);
isShiny = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_IS_SHINY, NULL);
spriteId = CreateMonPicSprite(species, isShiny, personality, TRUE, 60, 65, 12, 0xffff);
FreeSpriteOamMatrix(&gSprites[spriteId]);
if (!IsMonSpriteNotFlipped(species))
gSprites[spriteId].hFlip = TRUE;
else
gSprites[spriteId].hFlip = FALSE;
sMonSummaryScreen->monPicSpriteId = spriteId;
PokeSum_ShowOrHideMonPicSprite(TRUE);
PokeSum_SetMonPicSpriteCallback(spriteId);
}
static void PokeSum_SetMonPicSpriteCallback(u16 spriteId)
{
u16 curHp;
u16 maxHp;
sMonSummaryScreen->numMonPicBounces = 0;
if (sMonSummaryScreen->isEgg == TRUE)
{
u8 friendship = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_FRIENDSHIP);
if (friendship <= 5)
sMonPicBounceState->vigor = 2;
else
{
if (friendship <= 10)
sMonPicBounceState->vigor = 1;
else if (friendship <= 40)
sMonPicBounceState->vigor = 0;
}
gSprites[spriteId].callback = SpriteCB_PokeSum_EggPicShake;
return;
}
if (sMonSummaryScreen->curMonStatusAilment != AILMENT_NONE && sMonSummaryScreen->curMonStatusAilment != AILMENT_PKRS)
{
if (sMonSummaryScreen->curMonStatusAilment == AILMENT_FNT)
return;
gSprites[spriteId].callback = SpriteCB_MonPicDummy;
return;
}
curHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP);
maxHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MAX_HP);
if (curHp == maxHp)
sMonPicBounceState->vigor = 3;
else if (maxHp * 0.8 <= curHp)
sMonPicBounceState->vigor = 2;
else if (maxHp * 0.6 <= curHp)
sMonPicBounceState->vigor = 1;
else
sMonPicBounceState->vigor = 0;
gSprites[spriteId].callback = SpriteCB_PokeSum_MonPicSprite;
}
static void PokeSum_ShowOrHideMonPicSprite(u8 invisible)
{
gSprites[sMonSummaryScreen->monPicSpriteId].invisible = invisible;
}
static void PokeSum_DestroyMonPicSprite(void)
{
FreeAndDestroyMonPicSprite(sMonSummaryScreen->monPicSpriteId);
FREE_AND_SET_NULL(sMonPicBounceState);
}
static void CreateBallIconObj(void)
{
u8 ballId = ItemIdToBallId(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_POKEBALL));
LoadBallGfx(ballId);
sMonSummaryScreen->ballIconSpriteId = CreateSprite(&gBallSpriteTemplates[ballId], 106, 88, 0);
gSprites[sMonSummaryScreen->ballIconSpriteId].callback = SpriteCallbackDummy;
gSprites[sMonSummaryScreen->ballIconSpriteId].oam.priority = 0;
ShowOrHideBallIconObj(TRUE);
}
static void ShowOrHideBallIconObj(u8 invisible)
{
gSprites[sMonSummaryScreen->ballIconSpriteId].invisible = invisible;
}
static void DestroyBallIconObj(void)
{
// Redundant, as DestroySpriteAndFreeResources could've been used.
DestroySpriteAndFreeResources_Ball(&gSprites[sMonSummaryScreen->ballIconSpriteId]);
}
static void PokeSum_CreateMonIconSprite(void)
{
u16 species;
u32 personality;
species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG);
personality = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_PERSONALITY);
SafeLoadMonIconPalette(species);
sMonSummaryScreen->monIconSpriteId = CreateMonIcon(species, SpriteCallbackDummy, 24, 32, 0, personality);
if (!IsMonSpriteNotFlipped(species))
gSprites[sMonSummaryScreen->monIconSpriteId].hFlip = TRUE;
else
gSprites[sMonSummaryScreen->monIconSpriteId].hFlip = FALSE;
PokeSum_ShowOrHideMonIconSprite(TRUE);
}
static void PokeSum_ShowOrHideMonIconSprite(bool8 invisible)
{
gSprites[sMonSummaryScreen->monIconSpriteId].invisible = invisible;
}
static void PokeSum_DestroyMonIconSprite(void)
{
u16 species;
species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG);
SafeFreeMonIconPalette(species);
FreeAndDestroyMonIconSprite(&gSprites[sMonSummaryScreen->monIconSpriteId]);
}
static void CreateMoveSelectionCursorObjs(u16 tileTag, u16 palTag)
{
u8 i;
u8 spriteId;
void *gfxBufferPtrs[2];
gfxBufferPtrs[0] = AllocZeroed(0x20 * 64);
gfxBufferPtrs[1] = AllocZeroed(0x20 * 64);
sMoveSelectionCursorObjs[0] = AllocZeroed(sizeof(struct MoveSelectionCursor));
sMoveSelectionCursorObjs[1] = AllocZeroed(sizeof(struct MoveSelectionCursor));
sMoveSelectionCursorObjs[2] = AllocZeroed(sizeof(struct MoveSelectionCursor));
sMoveSelectionCursorObjs[3] = AllocZeroed(sizeof(struct MoveSelectionCursor));
LZ77UnCompWram(sMoveSelectionCursorTiles_Left, gfxBufferPtrs[0]);
LZ77UnCompWram(sMoveSelectionCursorTiles_Right, gfxBufferPtrs[1]);
for (i = 0; i < 4; i++)
{
struct SpriteSheet sheet = {
.data = gfxBufferPtrs[i % 2],
.size = 0x20 * 64,
.tag = tileTag + i
};
struct SpritePalette palette = {.data = sMoveSelectionCursorPals, .tag = palTag};
struct SpriteTemplate template = {
.tileTag = tileTag + i,
.paletteTag = palTag,
.oam = &sMoveSelectionCursorOamData,
.anims = sMoveSelectionCursorOamAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_MoveSelectionCursor,
};
LoadSpriteSheet(&sheet);
LoadSpritePalette(&palette);
spriteId = CreateSprite(&template, 64 * (i % 2) + 152, sMoveSelectionCursorPos * 28 + 34, i % 2);
sMoveSelectionCursorObjs[i]->sprite = &gSprites[spriteId];
sMoveSelectionCursorObjs[i]->whichSprite = i;
sMoveSelectionCursorObjs[i]->tileTag = tileTag + i;
sMoveSelectionCursorObjs[i]->palTag = palTag;
sMoveSelectionCursorObjs[i]->sprite->subpriority = i;
if (i > 1)
StartSpriteAnim(sMoveSelectionCursorObjs[i]->sprite, 1);
}
ShoworHideMoveSelectionCursor(TRUE);
FREE_AND_SET_NULL_IF_SET(gfxBufferPtrs[0]);
FREE_AND_SET_NULL_IF_SET(gfxBufferPtrs[1]);
}
static void ShoworHideMoveSelectionCursor(bool8 invisible)
{
u8 i;
for (i = 0; i < 4; i++)
sMoveSelectionCursorObjs[i]->sprite->invisible = invisible;
}
static void SpriteCB_MoveSelectionCursor(struct Sprite *sprite)
{
u8 i;
for (i = 0; i < 4; i++)
{
if (sMonSummaryScreen->isSwappingMoves == TRUE && i > 1)
continue;
sMoveSelectionCursorObjs[i]->sprite->y = sMoveSelectionCursorPos * 28 + 34;
}
if (sMonSummaryScreen->isSwappingMoves != TRUE)
{
if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)
{
sMoveSelectionCursorObjs[0]->sprite->invisible = FALSE;
sMoveSelectionCursorObjs[1]->sprite->invisible = FALSE;
}
return;
}
for (i = 0; i < 2; i++)
{
sprite = sMoveSelectionCursorObjs[i]->sprite;
sprite->data[0]++;
if (sprite->invisible)
{
if (sprite->data[0] > 60)
{
sprite->invisible = FALSE;
sprite->data[0] = 0;
}
}
else if (sprite->data[0] > 60)
{
sprite->invisible = TRUE;
sprite->data[0] = 0;
}
}
}
static void DestroyMoveSelectionCursorObjs(void)
{
u8 i;
for (i = 0; i < 4; i++)
{
if (sMoveSelectionCursorObjs[i]->sprite != NULL)
DestroySpriteAndFreeResources(sMoveSelectionCursorObjs[i]->sprite);
FREE_AND_SET_NULL_IF_SET(sMoveSelectionCursorObjs[i]);
}
}
static void CreateMonStatusIconObj(u16 tileTag, u16 palTag)
{
u16 spriteId;
void *gfxBufferPtr;
sStatusIcon = AllocZeroed(sizeof(struct MonStatusIconObj));
gfxBufferPtr = AllocZeroed(0x20 * 32);
LZ77UnCompWram(gSummaryScreen_StatusAilmentIcon_Gfx, gfxBufferPtr);
if (sStatusIcon != NULL)
{
struct SpriteSheet sheet = {
.data = gfxBufferPtr,
.size = 0x20 * 32,
.tag = tileTag
};
struct SpritePalette palette = {.data = gSummaryScreen_StatusAilmentIcon_Pal, .tag = palTag};
struct SpriteTemplate template = {
.tileTag = tileTag,
.paletteTag = palTag,
.oam = &sStatusAilmentIconOamData,
.anims = sStatusAilmentIconAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
LoadSpriteSheet(&sheet);
LoadSpritePalette(&palette);
spriteId = CreateSprite(&template, 0, 0, 0);
sStatusIcon->sprite = &gSprites[spriteId];
sStatusIcon->tileTag = tileTag;
sStatusIcon->palTag = palTag;
}
ShowOrHideStatusIcon(TRUE);
UpdateMonStatusIconObj();
FREE_AND_SET_NULL_IF_SET(gfxBufferPtr);
}
static void DestroyMonStatusIconObj(void)
{
if (sStatusIcon->sprite != NULL)
DestroySpriteAndFreeResources(sStatusIcon->sprite);
FREE_AND_SET_NULL_IF_SET(sStatusIcon);
}
static void UpdateMonStatusIconObj(void)
{
sMonSummaryScreen->curMonStatusAilment = StatusToAilment(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_STATUS));
if (sMonSummaryScreen->curMonStatusAilment == AILMENT_NONE)
{
ShowOrHideStatusIcon(TRUE);
return;
}
StartSpriteAnim(sStatusIcon->sprite, sMonSummaryScreen->curMonStatusAilment - 1);
ShowOrHideStatusIcon(FALSE);
}
static void ShowOrHideStatusIcon(u8 invisible)
{
if (sMonSummaryScreen->curMonStatusAilment == AILMENT_NONE || sMonSummaryScreen->isEgg)
sStatusIcon->sprite->invisible = TRUE;
else
sStatusIcon->sprite->invisible = invisible;
if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)
{
if (sStatusIcon->sprite->y != 45)
{
sStatusIcon->sprite->x = 16;
sStatusIcon->sprite->y = 45;
return;
}
}
else if (sStatusIcon->sprite->y != 38)
{
sStatusIcon->sprite->x = 16;
sStatusIcon->sprite->y = 38;
return;
}
}
static void CreateHpBarObjs(u16 tileTag, u16 palTag)
{
u8 i;
u8 spriteId;
void *gfxBufferPtr;
u32 curHp;
u32 maxHp;
u8 hpBarPalTagOffset = 0;
sHpBarObjs = AllocZeroed(sizeof(struct HpBarObjs));
gfxBufferPtr = AllocZeroed(0x20 * 12);
LZ77UnCompWram(gSummaryScreen_HpBar_Gfx, gfxBufferPtr);
curHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP);
maxHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MAX_HP);
if (maxHp / 4 > curHp)
hpBarPalTagOffset = 2;
else if (maxHp / 2 > curHp)
hpBarPalTagOffset = 1;
if (gfxBufferPtr != NULL)
{
struct SpriteSheet sheet = {
.data = gfxBufferPtr,
.size = 0x20 * 12,
.tag = tileTag
};
struct SpritePalette palette1 = {.data = sHpBarPals[0], .tag = palTag};
struct SpritePalette palette2 = {.data = sHpBarPals[1], .tag = palTag + 1};
struct SpritePalette palette3 = {.data = sHpBarPals[2], .tag = palTag + 2};
LoadSpriteSheet(&sheet);
LoadSpritePalette(&palette1);
LoadSpritePalette(&palette2);
LoadSpritePalette(&palette3);
}
for (i = 0; i < 9; i++)
{
struct SpriteTemplate template = {
.tileTag = tileTag,
.paletteTag = palTag + hpBarPalTagOffset,
.oam = &sHpOrExpBarOamData,
.anims = sHpOrExpBarAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
sHpBarObjs->xpos[i] = i * 8 + 172;
spriteId = CreateSprite(&template, sHpBarObjs->xpos[i], 36, 0);
sHpBarObjs->sprites[i] = &gSprites[spriteId];
sHpBarObjs->sprites[i]->invisible = FALSE;
sHpBarObjs->sprites[i]->oam.priority = 2;
sHpBarObjs->tileTag = tileTag;
sHpBarObjs->palTag = palTag;
StartSpriteAnim(sHpBarObjs->sprites[i], 8);
}
UpdateHpBarObjs();
ShowOrHideHpBarObjs(TRUE);
FREE_AND_SET_NULL_IF_SET(gfxBufferPtr);
}
static void UpdateHpBarObjs(void)
{
u8 numWholeHpBarTiles = 0;
u8 i;
u8 animNum;
u8 two = 2;
u8 hpBarPalOffset = 0;
u32 curHp;
u32 maxHp;
s64 pointsPerTile;
s64 totalPoints;
if (sMonSummaryScreen->isEgg)
return;
curHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_HP);
maxHp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MAX_HP);
if (maxHp / 5 >= curHp)
hpBarPalOffset = 2;
else if (maxHp / 2 >= curHp)
hpBarPalOffset = 1;
switch (GetHPBarLevel(curHp, maxHp))
{
case 3:
default:
hpBarPalOffset = 0;
break;
case 2:
hpBarPalOffset = 1;
break;
case 1:
hpBarPalOffset = 2;
break;
}
for (i = 0; i < 9; i++)
sHpBarObjs->sprites[i]->oam.paletteNum = IndexOfSpritePaletteTag(TAG_PSS_UNK_78) + hpBarPalOffset;
if (curHp == maxHp)
for (i = two; i < 8; i++)
StartSpriteAnim(sHpBarObjs->sprites[i], 8);
else
{
pointsPerTile = (maxHp << 2) / 6;
totalPoints = (curHp << 2);
while (TRUE)
{
if (totalPoints <= pointsPerTile)
break;
totalPoints -= pointsPerTile;
numWholeHpBarTiles++;
}
numWholeHpBarTiles += two;
for (i = two; i < numWholeHpBarTiles; i++)
StartSpriteAnim(sHpBarObjs->sprites[i], 8);
animNum = (totalPoints * 6) / pointsPerTile;
StartSpriteAnim(sHpBarObjs->sprites[numWholeHpBarTiles], animNum);
for (i = numWholeHpBarTiles + 1; i < 8; i++)
StartSpriteAnim(sHpBarObjs->sprites[i], 0);
}
StartSpriteAnim(sHpBarObjs->sprites[0], 9);
StartSpriteAnim(sHpBarObjs->sprites[1], 10);
StartSpriteAnim(sHpBarObjs->sprites[8], 11);
}
static void DestroyHpBarObjs(void)
{
u8 i;
for (i = 0; i < 9; i++)
if (sHpBarObjs->sprites[i] != NULL)
DestroySpriteAndFreeResources(sHpBarObjs->sprites[i]);
FREE_AND_SET_NULL_IF_SET(sHpBarObjs);
}
static void ShowOrHideHpBarObjs(u8 invisible)
{
u8 i;
for (i = 0; i < 9; i++)
sHpBarObjs->sprites[i]->invisible = invisible;
}
static void CreateExpBarObjs(u16 tileTag, u16 palTag)
{
u8 i;
u8 spriteId;
void *gfxBufferPtr;
sExpBarObjs = AllocZeroed(sizeof(struct ExpBarObjs));
gfxBufferPtr = AllocZeroed(0x20 * 12);
LZ77UnCompWram(gSummaryScreen_ExpBar_Gfx, gfxBufferPtr);
if (gfxBufferPtr != NULL)
{
struct SpriteSheet sheet = {
.data = gfxBufferPtr,
.size = 0x20 * 12,
.tag = tileTag
};
struct SpritePalette palette = {.data = gSummaryScreen_HpExpBar_Pal, .tag = palTag};
LoadSpriteSheet(&sheet);
LoadSpritePalette(&palette);
}
for (i = 0; i < 11; i++)
{
struct SpriteTemplate template = {
.tileTag = tileTag,
.paletteTag = palTag,
.oam = &sHpOrExpBarOamData,
.anims = sHpOrExpBarAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
sExpBarObjs->xpos[i] = i * 8 + 156;
spriteId = CreateSprite(&template, sExpBarObjs->xpos[i], 132, 0);
sExpBarObjs->sprites[i] = &gSprites[spriteId];
sExpBarObjs->sprites[i]->oam.priority = 2;
sExpBarObjs->tileTag = tileTag;
sExpBarObjs->palTag = palTag;
}
UpdateExpBarObjs();
ShowOrHideExpBarObjs(TRUE);
FREE_AND_SET_NULL_IF_SET(gfxBufferPtr);
}
static void UpdateExpBarObjs(void)
{
u8 numWholeExpBarTiles = 0;
u8 i;
u8 level = 0;
u32 exp;
u32 totalExpToNextLevel;
u32 curExpToNextLevel;
u16 species;
s64 pointsPerTile;
s64 totalPoints;
u8 animNum;
u8 two = 2;
if (sMonSummaryScreen->isEgg)
return;
exp = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_EXP);
species = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES);
while(level < MAX_LEVEL && exp >= gExperienceTables[gSpeciesInfo[species].growthRate][level + 1])
level++;
if (level < MAX_LEVEL)
{
totalExpToNextLevel = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - gExperienceTables[gSpeciesInfo[species].growthRate][level];
curExpToNextLevel = exp - gExperienceTables[gSpeciesInfo[species].growthRate][level];
pointsPerTile = ((totalExpToNextLevel << 2) / 8);
totalPoints = (curExpToNextLevel << 2);
while (TRUE)
{
if (totalPoints <= pointsPerTile)
break;
totalPoints -= pointsPerTile;
numWholeExpBarTiles++;
}
numWholeExpBarTiles += two;
for (i = two; i < numWholeExpBarTiles; i++)
StartSpriteAnim(sExpBarObjs->sprites[i], 8);
if (numWholeExpBarTiles >= 10)
{
if (totalExpToNextLevel == curExpToNextLevel)
return;
else
StartSpriteAnim(sExpBarObjs->sprites[9], 7);
}
animNum = (totalPoints * 8) / pointsPerTile;
StartSpriteAnim(sExpBarObjs->sprites[numWholeExpBarTiles], animNum);
for (i = numWholeExpBarTiles + 1; i < 10; i++)
StartSpriteAnim(sExpBarObjs->sprites[i], 0);
}
else
for (i = two; i < 10; i++)
StartSpriteAnim(sExpBarObjs->sprites[i], 0);
StartSpriteAnim(sExpBarObjs->sprites[0], 9);
StartSpriteAnim(sExpBarObjs->sprites[1], 10);
StartSpriteAnim(sExpBarObjs->sprites[10], 11);
}
static void DestroyExpBarObjs(void)
{
u8 i;
for (i = 0; i < 11; i++)
if (sExpBarObjs->sprites[i] != NULL)
DestroySpriteAndFreeResources(sExpBarObjs->sprites[i]);
FREE_AND_SET_NULL_IF_SET(sExpBarObjs);
}
static void ShowOrHideExpBarObjs(u8 invisible)
{
u8 i;
for (i = 0; i < 11; i++)
sExpBarObjs->sprites[i]->invisible = invisible;
}
static void CreatePokerusIconObj(u16 tileTag, u16 palTag)
{
u16 spriteId;
void *gfxBufferPtr;
sPokerusIconObj = AllocZeroed(sizeof(struct PokerusIconObj));
gfxBufferPtr = AllocZeroed(0x20 * 1);
LZ77UnCompWram(sPokerusIconObjTiles, gfxBufferPtr);
if (sPokerusIconObj != NULL)
{
struct SpriteSheet sheet = {
.data = gfxBufferPtr,
.size = 0x20 * 1,
.tag = tileTag
};
struct SpritePalette palette = {.data = sPokerusIconObjPal, .tag = palTag};
struct SpriteTemplate template = {
.tileTag = tileTag,
.paletteTag = palTag,
.oam = &sPokerusIconObjOamData,
.anims = sPokerusIconObjAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
LoadSpriteSheet(&sheet);
LoadSpritePalette(&palette);
spriteId = CreateSprite(&template, 114, 92, 0);
sPokerusIconObj->sprite = &gSprites[spriteId];
sPokerusIconObj->tileTag = tileTag;
sPokerusIconObj->palTag = palTag;
}
HideShowPokerusIcon(TRUE);
ShowPokerusIconObjIfHasOrHadPokerus();
FREE_AND_SET_NULL_IF_SET(gfxBufferPtr);
}
static void DestroyPokerusIconObj(void)
{
if (sPokerusIconObj->sprite != NULL)
DestroySpriteAndFreeResources(sPokerusIconObj->sprite);
FREE_AND_SET_NULL_IF_SET(sPokerusIconObj);
}
static void ShowPokerusIconObjIfHasOrHadPokerus(void)
{
if (!CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0)
&& CheckPartyHasHadPokerus(&sMonSummaryScreen->currentMon, 0))
HideShowPokerusIcon(FALSE);
else
HideShowPokerusIcon(TRUE);
}
static void HideShowPokerusIcon(bool8 invisible)
{
if (!CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0)
&& CheckPartyHasHadPokerus(&sMonSummaryScreen->currentMon, 0))
{
sPokerusIconObj->sprite->invisible = invisible;
return;
}
else
sPokerusIconObj->sprite->invisible = TRUE;
if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)
{
sPokerusIconObj->sprite->invisible = TRUE;
sPokerusIconObj->sprite->x = 16;
sPokerusIconObj->sprite->y = 44;
}
else
{
sPokerusIconObj->sprite->x = 114;
sPokerusIconObj->sprite->y = 92;
}
}
static void CreateShinyStarObj(u16 tileTag, u16 palTag)
{
u16 spriteId;
void *gfxBufferPtr;
sShinyStarObjData = AllocZeroed(sizeof(struct ShinyStarObjData));
gfxBufferPtr = AllocZeroed(0x20 * 2);
LZ77UnCompWram(sStarObjTiles, gfxBufferPtr);
if (sShinyStarObjData != NULL)
{
struct SpriteSheet sheet = {
.data = gfxBufferPtr,
.size = 0x20 * 2,
.tag = tileTag
};
struct SpritePalette palette = {.data = sStarObjPal, .tag = palTag};
struct SpriteTemplate template = {
.tileTag = tileTag,
.paletteTag = palTag,
.oam = &sStarObjOamData,
.anims = sStarObjAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
LoadSpriteSheet(&sheet);
LoadSpritePalette(&palette);
spriteId = CreateSprite(&template, 106, 40, 0);
sShinyStarObjData->sprite = &gSprites[spriteId];
sShinyStarObjData->tileTag = tileTag;
sShinyStarObjData->palTag = palTag;
}
HideShowShinyStar(TRUE);
ShowShinyStarObjIfMonShiny();
FREE_AND_SET_NULL_IF_SET(gfxBufferPtr);
}
static void DestroyShinyStarObj(void)
{
if (sShinyStarObjData->sprite != NULL)
DestroySpriteAndFreeResources(sShinyStarObjData->sprite);
FREE_AND_SET_NULL_IF_SET(sShinyStarObjData);
}
static void HideShowShinyStar(bool8 invisible)
{
if (IsMonShiny(&sMonSummaryScreen->currentMon) == TRUE
&& !sMonSummaryScreen->isEgg)
sShinyStarObjData->sprite->invisible = invisible;
else
sShinyStarObjData->sprite->invisible = TRUE;
if (sMonSummaryScreen->curPageIndex == PSS_PAGE_MOVES_INFO)
{
sShinyStarObjData->sprite->x = 8;
sShinyStarObjData->sprite->y = 24;
}
else
{
sShinyStarObjData->sprite->x = 106;
sShinyStarObjData->sprite->y = 40;
}
}
static void ShowShinyStarObjIfMonShiny(void)
{
if (IsMonShiny(&sMonSummaryScreen->currentMon) == TRUE && !sMonSummaryScreen->isEgg)
HideShowShinyStar(FALSE);
else
HideShowShinyStar(TRUE);
}
static void PokeSum_DestroySprites(void)
{
DestroyMoveSelectionCursorObjs();
DestroyHpBarObjs();
DestroyExpBarObjs();
PokeSum_DestroyMonPicSprite();
PokeSum_DestroyMonIconSprite();
DestroyBallIconObj();
PokeSum_DestroyMonMarkingsSprite();
DestroyMonStatusIconObj();
DestroyPokerusIconObj();
DestroyShinyStarObj();
ResetSpriteData();
}
static void PokeSum_CreateSprites(void)
{
CreateBallIconObj();
ShowOrHideBallIconObj(FALSE);
PokeSum_CreateMonIconSprite();
PokeSum_CreateMonPicSprite();
PokeSum_ShowOrHideMonPicSprite(FALSE);
UpdateHpBarObjs();
UpdateExpBarObjs();
PokeSum_UpdateMonMarkingsAnim();
UpdateMonStatusIconObj();
ShowPokerusIconObjIfHasOrHadPokerus();
ShowShinyStarObjIfMonShiny();
}
static void PokeSum_CreateMonMarkingsSprite(void)
{
u32 markings = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MARKINGS);
DestroySpriteAndFreeResources(sMonSummaryScreen->markingSprite);
sMonSummaryScreen->markingSprite = CreateMonMarkingAllCombosSprite(TAG_PSS_UNK_8C, TAG_PSS_UNK_8C, sMonMarkingSpritePalette);
if (sMonSummaryScreen->markingSprite != NULL)
{
StartSpriteAnim(sMonSummaryScreen->markingSprite, markings);
sMonSummaryScreen->markingSprite->x = 20;
sMonSummaryScreen->markingSprite->y = 91;
}
PokeSum_ShowOrHideMonMarkingsSprite(TRUE);
}
static void PokeSum_DestroyMonMarkingsSprite(void)
{
DestroySpriteAndFreeResources(sMonSummaryScreen->markingSprite);
}
static void PokeSum_ShowOrHideMonMarkingsSprite(u8 invisible)
{
u32 markings = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MARKINGS);
if (markings == 0)
sMonSummaryScreen->markingSprite->invisible = TRUE;
else
sMonSummaryScreen->markingSprite->invisible = invisible;
}
static void PokeSum_UpdateMonMarkingsAnim(void)
{
u32 markings = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MARKINGS);
StartSpriteAnim(sMonSummaryScreen->markingSprite, markings);
PokeSum_ShowOrHideMonMarkingsSprite(FALSE);
}
static void PokeSum_SeekToNextMon(u8 taskId, s8 direction)
{
s8 scrollResult = -1;
if (sMonSummaryScreen->isBoxMon == TRUE)
{
if (sMonSummaryScreen->curPageIndex != PSS_PAGE_INFO)
{
if (direction == 1)
direction = 0;
else
direction = 2;
}
else
{
// Allow Eggs
if (direction == 1)
direction = 1;
else
direction = 3;
}
scrollResult = SeekToNextMonInBox(sMonSummaryScreen->monList.boxMons, GetLastViewedMonIndex(), sMonSummaryScreen->lastIndex, (u8)direction);
}
else
{
if (IsUpdateLinkStateCBActive() == FALSE
&& gReceivedRemoteLinkPlayers == 1
&& IsMultiBattle() == TRUE)
scrollResult = SeekToNextMonInMultiParty(direction);
else
scrollResult = SeekToNextMonInSingleParty(direction);
}
if (scrollResult == -1)
return;
sLastViewedMonIndex = scrollResult;
CreateTask(Task_PokeSum_SwitchDisplayedPokemon, 0);
sMonSummaryScreen->switchMonTaskState = 0;
}
static s8 SeekToNextMonInSingleParty(s8 direction)
{
struct Pokemon * partyMons = sMonSummaryScreen->monList.mons;
s8 seekDelta = 0;
if (sMonSummaryScreen->curPageIndex == 0)
{
if (direction == -1 && sLastViewedMonIndex == 0)
return -1;
else if (direction == 1 && sLastViewedMonIndex >= sMonSummaryScreen->lastIndex)
return -1;
else
return sLastViewedMonIndex + direction;
}
while (TRUE)
{
seekDelta += direction;
if (0 > sLastViewedMonIndex + seekDelta || sLastViewedMonIndex + seekDelta > sMonSummaryScreen->lastIndex)
return -1;
if (GetMonData(&partyMons[sLastViewedMonIndex + seekDelta], MON_DATA_IS_EGG) == 0)
return sLastViewedMonIndex + seekDelta;
}
return -1;
}
static u8 PokeSum_CanSeekToMon(struct Pokemon * partyMons)
{
if (GetMonData(partyMons, MON_DATA_SPECIES) != SPECIES_NONE && (sMonSummaryScreen->curPageIndex != PSS_PAGE_INFO || !GetMonData(partyMons, MON_DATA_IS_EGG)))
return TRUE;
return FALSE;
}
static s8 SeekToMonInMultiParty_SeekForward(u8 startingIdx)
{
while (TRUE)
{
startingIdx++;
if (startingIdx == 6)
return -1;
if (PokeSum_CanSeekToMon(&gPlayerParty[sMultiBattlePartyOrder[startingIdx]]) == TRUE)
break;
}
return (s8)sMultiBattlePartyOrder[startingIdx];
}
static s8 SeekToMonInMultiParty_SeekBack(u8 startingIdx)
{
while (1)
{
if (startingIdx == 0)
return -1;
startingIdx--;
if (PokeSum_CanSeekToMon(&gPlayerParty[sMultiBattlePartyOrder[startingIdx]]) == TRUE)
break;
}
return (s8)(sMultiBattlePartyOrder[startingIdx]);
}
static s8 SeekToNextMonInMultiParty(s8 direction)
{
u8 foundPartyIdx = 0;
u8 i;
for (i = 0; i < PARTY_SIZE; i++)
if (sMultiBattlePartyOrder[i] == GetLastViewedMonIndex())
{
foundPartyIdx = i;
break;
}
if ((direction == -1 && foundPartyIdx == 0)
|| (direction == 1 && foundPartyIdx == 5))
return -1;
if (direction == 1)
return SeekToMonInMultiParty_SeekForward(foundPartyIdx);
else
return SeekToMonInMultiParty_SeekBack(foundPartyIdx);
}
static void Task_PokeSum_SwitchDisplayedPokemon(u8 taskId)
{
switch (sMonSummaryScreen->switchMonTaskState)
{
case 0:
StopCryAndClearCrySongs();
sMoveSelectionCursorPos = 0;
sMoveSwapCursorPos = 0;
sMonSummaryScreen->switchMonTaskState++;
break;
case 1:
PokeSum_DestroyMonPicSprite();
PokeSum_DestroyMonIconSprite();
DestroyBallIconObj();
sMonSummaryScreen->switchMonTaskState++;
break;
case 2:
BufferSelectedMonData(&sMonSummaryScreen->currentMon);
sMonSummaryScreen->isEgg = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_IS_EGG);
sMonSummaryScreen->isBadEgg = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SANITY_IS_BAD_EGG);
if (sMonSummaryScreen->isBadEgg == TRUE)
sMonSummaryScreen->isEgg = TRUE;
sMonSummaryScreen->switchMonTaskState++;
break;
case 3:
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
if (IsMonShiny(&sMonSummaryScreen->currentMon) == TRUE && !sMonSummaryScreen->isEgg)
{
LoadPalette(&gSummaryScreen_Bg_Pal[16 * 6], BG_PLTT_ID(0), PLTT_SIZE_4BPP);
LoadPalette(&gSummaryScreen_Bg_Pal[16 * 5], BG_PLTT_ID(1), PLTT_SIZE_4BPP);
}
else
{
LoadPalette(&gSummaryScreen_Bg_Pal[16 * 0], BG_PLTT_ID(0), PLTT_SIZE_4BPP);
LoadPalette(&gSummaryScreen_Bg_Pal[16 * 1], BG_PLTT_ID(1), PLTT_SIZE_4BPP);
}
sMonSummaryScreen->switchMonTaskState++;
break;
case 4:
if (sMonSummaryScreen->curPageIndex == PSS_PAGE_INFO)
{
if (sMonSummaryScreen->isEgg)
{
CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageEgg_Tilemap, 0, 0);
CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0);
}
else
{
CopyToBgTilemapBuffer(sMonSummaryScreen->skillsPageBgNum, gSummaryScreen_PageInfo_Tilemap, 0, 0);
CopyToBgTilemapBuffer(sMonSummaryScreen->infoAndMovesPageBgNum, gSummaryScreen_PageSkills_Tilemap, 0, 0);
}
}
sMonSummaryScreen->switchMonTaskState++;
break;
case 5:
BufferMonInfo();
sMonSummaryScreen->switchMonTaskState++;
break;
case 6:
if (!sMonSummaryScreen->isEgg)
BufferMonSkills();
sMonSummaryScreen->switchMonTaskState++;
break;
case 7:
if (!sMonSummaryScreen->isEgg)
BufferMonMoves();
sMonSummaryScreen->switchMonTaskState++;
break;
case 8:
PokeSum_PrintRightPaneText();
PokeSum_PrintBottomPaneText();
PokeSum_PrintAbilityDataOrMoveTypes();
sMonSummaryScreen->switchMonTaskState++;
break;
case 9:
PokeSum_PrintMonTypeIcons();
PokeSum_DrawPageProgressTiles();
PokeSum_PrintPageHeaderText(sMonSummaryScreen->curPageIndex);
sMonSummaryScreen->switchMonTaskState++;
break;
case 10:
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_PAGE_NAME], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_CONTROLS], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_LVL_NICK], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[6], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], 2);
CopyWindowToVram(sMonSummaryScreen->windowIds[5], 2);
CopyBgTilemapBufferToVram(0);
CopyBgTilemapBufferToVram(2);
CopyBgTilemapBufferToVram(3);
sMonSummaryScreen->switchMonTaskState++;
break;
case 11:
if (!Overworld_LinkRecvQueueLengthMoreThan2() && !IsLinkRecvQueueAtOverworldMax())
{
PokeSum_CreateSprites();
PokeSum_TryPlayMonCry();
sMonSummaryScreen->switchMonTaskState++;
}
break;
default:
sMonSummaryScreen->switchMonTaskState = 0;
DestroyTask(taskId);
break;
}
}
static void PokeSum_UpdateWin1ActiveFlag(u8 curPageIndex)
{
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON);
switch (curPageIndex)
{
case PSS_PAGE_INFO:
case PSS_PAGE_SKILLS:
case PSS_PAGE_MOVES:
SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) | DISPCNT_WIN1_ON);
break;
default:
break;
}
}
static void PokeSum_TryPlayMonCry(void)
{
if (!GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_IS_EGG))
{
if (ShouldPlayNormalMonCry(&sMonSummaryScreen->currentMon) == TRUE)
PlayCry_ByMode(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG), 0, CRY_MODE_NORMAL);
else
PlayCry_ByMode(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES_OR_EGG), 0, CRY_MODE_WEAK);
}
}
static bool32 PokeSum_IsMonBoldOrGentle(u8 nature)
{
if (nature == NATURE_BOLD || nature == NATURE_GENTLE)
return TRUE;
return FALSE;
}
static bool32 CurrentMonIsFromGBA(void)
{
u8 version = GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_MET_GAME);
if (version == VERSION_LEAF_GREEN
|| version == VERSION_FIRE_RED
|| version == VERSION_RUBY
|| version == VERSION_SAPPHIRE
|| version == VERSION_EMERALD)
return TRUE;
return FALSE;
}
static bool32 MapSecIsInKantoOrSevii(u8 mapSec)
{
if (mapSec >= MAPSECS_KANTO && mapSec < MAPSEC_NONE)
return TRUE;
return FALSE;
}