2017-10-09 19:32:57 +02:00
# include "global.h"
2018-08-15 06:56:11 +02:00
# include "main.h"
2017-09-20 21:07:24 +02:00
# include "battle.h"
2018-08-15 06:56:11 +02:00
# include "battle_anim.h"
2018-10-30 22:17:03 +01:00
# include "frontier_util.h"
2018-08-15 06:56:11 +02:00
# include "battle_message.h"
# include "battle_tent.h"
2018-12-24 00:02:29 +01:00
# include "battle_factory.h"
2017-10-09 19:17:13 +02:00
# include "bg.h"
2018-08-15 06:56:11 +02:00
# include "contest.h"
# include "contest_effect.h"
# include "data2.h"
# include "daycare.h"
2017-09-20 21:07:24 +02:00
# include "decompress.h"
2018-08-15 06:56:11 +02:00
# include "dynamic_placeholder_text_util.h"
# include "event_data.h"
# include "gpu_regs.h"
# include "graphics.h"
# include "international_string_util.h"
2017-10-19 01:25:08 +02:00
# include "item.h"
# include "link.h"
2017-09-20 21:07:24 +02:00
# include "m4a.h"
2018-11-29 12:24:28 +01:00
# include "alloc.h"
2018-08-15 06:56:11 +02:00
# include "menu.h"
# include "menu_helpers.h"
# include "mon_markings.h"
# include "party_menu.h"
2017-09-20 21:07:24 +02:00
# include "palette.h"
2018-08-15 06:56:11 +02:00
# include "pokeball.h"
2017-09-20 21:07:24 +02:00
# include "pokemon.h"
2018-08-15 06:56:11 +02:00
# include "pokemon_storage_system.h"
2018-08-15 10:44:20 +02:00
# include "pokemon_summary_screen.h"
2018-08-15 06:56:11 +02:00
# include "region_map.h"
# include "scanline_effect.h"
2017-09-20 21:07:24 +02:00
# include "sound.h"
# include "sprite.h"
# include "string_util.h"
2018-08-15 06:56:11 +02:00
# include "strings.h"
2017-09-20 21:07:24 +02:00
# include "task.h"
2017-10-19 01:25:08 +02:00
# include "text.h"
2018-08-15 06:56:11 +02:00
# include "tv.h"
2017-09-20 21:07:24 +02:00
# include "window.h"
2018-08-15 06:56:11 +02:00
# include "constants/items.h"
# include "constants/moves.h"
2018-08-15 10:44:20 +02:00
# include "constants/region_map_sections.h"
2019-02-04 13:44:09 +01:00
# include "constants/rgb.h"
2018-08-15 06:56:11 +02:00
# include "constants/songs.h"
# include "constants/species.h"
2017-10-19 01:25:08 +02:00
2019-02-04 13:44:09 +01:00
static EWRAM_DATA struct PssData
2018-08-15 06:56:11 +02:00
{
2018-08-15 07:05:48 +02:00
/*0x00*/ union {
2018-08-15 06:56:11 +02:00
struct Pokemon * mons ;
struct BoxPokemon * boxMons ;
} monList ;
2018-08-15 07:05:48 +02:00
/*0x04*/ MainCallback callback ;
/*0x08*/ struct Sprite * markingsSprite ;
2017-10-20 22:28:38 +02:00
/*0x0C*/ struct Pokemon currentMon ;
2018-08-15 06:56:11 +02:00
/*0x70*/ struct PokeSummary
{
u16 species ; // 0x0
u16 species2 ; // 0x2
u8 isEgg ; // 0x4
u8 level ; // 0x5
2018-08-15 10:44:20 +02:00
u8 ribbonCount ; // 0x6
2018-08-15 06:56:11 +02:00
u8 unk7 ; // 0x7
u8 altAbility ; // 0x8
u8 metLocation ; // 0x9
u8 metLevel ; // 0xA
u8 metGame ; // 0xB
u32 pid ; // 0xC
u32 exp ; // 0x10
u16 moves [ 4 ] ; // 0x14
u8 pp [ 4 ] ; // 0x1C
u16 currentHP ; // 0x20
u16 maxHP ; // 0x22
u16 atk ; // 0x24
u16 def ; // 0x26
u16 spatk ; // 0x28
u16 spdef ; // 0x2A
u16 speed ; // 0x2C
u16 item ; // 0x2E
u16 friendship ; // 0x30
u8 OTGender ; // 0x32
u8 nature ; // 0x33
u8 ppBonuses ; // 0x34
u8 sanity ; // 0x35
u8 OTName [ 8 ] ; // 0x36
u8 unk3E [ 9 ] ; // 0x3E
u32 OTID ; // 0x48
} summary ;
2018-08-15 20:47:10 +02:00
u16 bgTilemapBuffers [ 4 ] [ 2 ] [ 0x400 ] ;
2018-08-15 06:56:11 +02:00
u8 mode ;
bool8 isBoxMon ;
u8 curMonIndex ;
u8 maxMonIndex ;
2018-08-15 10:44:20 +02:00
u8 currPageIndex ;
u8 minPageIndex ;
u8 maxPageIndex ;
2019-02-19 10:09:42 +01:00
bool8 lockMonFlag ; // This is used to prevent the player from changing pokemon in the move deleter select, etc, but it is not needed because the input is handled differently there
2018-08-15 06:56:11 +02:00
u16 newMove ;
u8 firstMoveIndex ;
u8 secondMoveIndex ;
bool8 unk40C8 ;
2019-02-19 10:09:42 +01:00
u8 bgDisplayOrder ; // Determines the order page backgrounds are loaded while scrolling between them
2018-08-15 06:56:11 +02:00
u8 filler40CA ;
u8 windowIds [ 8 ] ;
u8 spriteIds [ 28 ] ;
bool8 unk40EF ;
2019-02-19 10:09:42 +01:00
s16 switchCounter ; // Used for various switch statement cases that decompress/load graphics or pokemon data
2017-09-20 21:07:24 +02:00
u8 unk_filler4 [ 6 ] ;
2018-08-16 00:58:41 +02:00
} * pssData = NULL ;
2019-02-19 10:09:42 +01:00
EWRAM_DATA u8 gLastViewedMonIndex = 0 ;
static EWRAM_DATA u8 sUnknown_0203CF21 = 0 ;
2019-02-24 03:55:24 +01:00
ALIGNED ( 4 ) static EWRAM_DATA u8 sUnknownTaskId = 0 ;
ALIGNED ( 4 ) extern const struct CompressedSpriteSheet gMonFrontPicTable [ ] ;
2018-08-15 06:56:11 +02:00
struct UnkStruct_61CC04
{
const u16 * ptr ;
u16 field_4 ;
u8 field_6 ;
u8 field_7 ;
u8 field_8 ;
u8 field_9 ;
2017-09-20 21:07:24 +02:00
} ;
2018-08-15 06:56:11 +02:00
// forward declarations
2018-08-15 20:47:10 +02:00
static bool8 SummaryScreen_LoadGraphics ( void ) ;
static void SummaryScreen_LoadingCB2 ( void ) ;
2018-08-15 10:44:20 +02:00
static void InitBGs ( void ) ;
2018-08-16 00:58:41 +02:00
static bool8 SummaryScreen_DecompressGraphics ( void ) ;
static void CopyMonToSummaryStruct ( struct Pokemon * a ) ;
static bool8 ExtractMonDataToSummaryStruct ( struct Pokemon * a ) ;
static void sub_81C0348 ( void ) ;
2019-02-04 13:44:09 +01:00
static void CloseSummaryScreen ( u8 taskId ) ;
static void HandleInput ( u8 taskId ) ;
static void ChangePokemon ( u8 taskId , s8 a ) ;
2018-08-16 00:58:41 +02:00
static void sub_81C0704 ( u8 taskId ) ;
static s8 sub_81C08F8 ( s8 a ) ;
static s8 sub_81C09B4 ( s8 a ) ;
static bool8 sub_81C0A50 ( struct Pokemon * mon ) ;
2019-02-04 13:44:09 +01:00
static void ChangePage ( u8 taskId , s8 a ) ;
2019-02-19 10:09:42 +01:00
static void PssScrollRight ( u8 taskId ) ;
static void PssScrollRightEnd ( u8 taskId ) ;
static void PssScrollLeft ( u8 taskId ) ;
static void PssScrollLeftEnd ( u8 taskId ) ;
static void CheckExperienceProgressBar ( void ) ;
2018-08-16 00:58:41 +02:00
static void sub_81C0E48 ( u8 taskId ) ;
2019-02-04 13:44:09 +01:00
static void HandleInput_MoveSelect ( u8 taskId ) ;
2018-08-16 00:58:41 +02:00
static bool8 sub_81C1040 ( void ) ;
static void sub_81C1070 ( s16 * a , s8 b , u8 * c ) ;
static void sub_81C11F4 ( u8 a ) ;
static void sub_81C129C ( u8 a ) ;
static void sub_81C12E4 ( u8 taskId ) ;
static void sub_81C13B0 ( u8 taskId , bool8 b ) ;
static void SwapMonMoves ( struct Pokemon * mon , u8 moveIndex1 , u8 moveIndex2 ) ;
static void SwapBoxMonMoves ( struct BoxPokemon * mon , u8 moveIndex1 , u8 moveIndex2 ) ;
static void sub_81C171C ( u8 taskId ) ;
2019-02-19 10:09:42 +01:00
static void HandleReplaceMoveInput ( u8 taskId ) ;
static bool8 CanReplaceMove ( void ) ;
static void ShowHMMovesCantBeForgottenWindow ( u8 a ) ;
static void HandleHMMovesCantBeForgottenInput ( u8 taskId ) ;
static void DrawPagination ( void ) ;
2018-08-16 00:58:41 +02:00
static void sub_81C1DA4 ( u16 a , s16 b ) ;
static void sub_81C1E20 ( u8 taskId ) ;
static void sub_81C1EFC ( u16 a , s16 b , u16 c ) ;
static void sub_81C1F80 ( u8 taskId ) ;
static void sub_81C2074 ( u16 a , s16 b ) ;
static void sub_81C20F0 ( u8 taskId ) ;
static void sub_81C2194 ( u16 * a , u16 b , u8 c ) ;
2019-02-19 10:09:42 +01:00
static void DrawPokerusCuredSymbol ( struct Pokemon * mon ) ;
2018-09-02 14:47:12 +02:00
static void DrawExperienceProgressBar ( struct Pokemon * mon ) ;
2019-02-02 23:14:04 +01:00
static void DrawContestMoveHearts ( u16 move ) ;
2019-02-19 10:09:42 +01:00
static void LimitEggSummaryPageDisplay ( void ) ;
2019-02-04 13:44:09 +01:00
static void ResetWindows ( void ) ;
2018-08-16 00:58:41 +02:00
static void sub_81C25E8 ( void ) ;
static void sub_81C2628 ( void ) ;
static void sub_81C2794 ( void ) ;
static void sub_81C27DC ( struct Pokemon * mon , u16 a ) ;
static void PrintPageNamesAndStatsPageToWindows ( void ) ;
2019-02-04 13:44:09 +01:00
static void CreatePageWindowTilemaps ( u8 a ) ;
static void ClearPageWindowTilemaps ( u8 a ) ;
2018-08-16 00:58:41 +02:00
static void SummaryScreen_RemoveWindowByIndex ( u8 a ) ;
2019-02-04 12:38:44 +01:00
static void PrintPageSpecificText ( u8 a ) ;
static void CreateTextPrinterTask ( u8 a ) ;
static void PrintInfoPageText ( void ) ;
2019-02-04 13:44:09 +01:00
static void Task_PrintInfoPage ( u8 taskId ) ;
2018-08-16 00:58:41 +02:00
static void PrintMonOTName ( void ) ;
static void PrintMonOTID ( void ) ;
static void PrintMonAbilityName ( void ) ;
static void PrintMonAbilityDescription ( void ) ;
static void BufferMonTrainerMemo ( void ) ;
static void PrintMonTrainerMemo ( void ) ;
static void BufferNatureString ( void ) ;
static void GetMetLevelString ( u8 * a ) ;
static bool8 DoesMonOTMatchOwner ( void ) ;
static bool8 DidMonComeFromGBAGames ( void ) ;
static bool8 IsInGamePartnerMon ( void ) ;
static void PrintEggOTName ( void ) ;
static void PrintEggOTID ( void ) ;
static void PrintEggState ( void ) ;
static void PrintEggMemo ( void ) ;
2019-02-04 13:44:09 +01:00
static void Task_PrintSkillsPage ( u8 taskId ) ;
2018-08-16 00:58:41 +02:00
static void PrintHeldItemName ( void ) ;
2019-02-04 12:38:44 +01:00
static void PrintSkillsPageText ( void ) ;
2018-08-16 00:58:41 +02:00
static void PrintRibbonCount ( void ) ;
static void BufferLeftColumnStats ( void ) ;
static void PrintLeftColumnStats ( void ) ;
static void BufferRightColumnStats ( void ) ;
static void PrintRightColumnStats ( void ) ;
static void PrintExpPointsNextLevel ( void ) ;
2019-02-04 12:38:44 +01:00
static void PrintBattleMoves ( void ) ;
2019-02-04 13:44:09 +01:00
static void Task_PrintBattleMoves ( u8 taskId ) ;
2018-08-16 00:58:41 +02:00
static void PrintMoveNameAndPP ( u8 a ) ;
2019-02-04 12:38:44 +01:00
static void PrintContestMoves ( void ) ;
2019-02-04 13:44:09 +01:00
static void Task_PrintContestMoves ( u8 taskId ) ;
2018-08-16 00:58:41 +02:00
static void PrintContestMoveDescription ( u8 a ) ;
static void PrintMoveDetails ( u16 a ) ;
static void PrintNewMoveDetailsOrCancelText ( void ) ;
static void sub_81C4064 ( void ) ;
static void sub_81C40A0 ( u8 a , u8 b ) ;
static void PrintHMMovesCantBeForgotten ( void ) ;
2019-02-04 12:38:44 +01:00
static void ResetSpriteIds ( void ) ;
2019-02-02 23:14:04 +01:00
static void SetSpriteInvisibility ( u8 spriteArrayId , bool8 invisible ) ;
static void HidePageSpecificSprites ( void ) ;
static void SetTypeIcons ( void ) ;
static void CreateMoveTypeIcons ( void ) ;
static void SetMonTypeIcons ( void ) ;
static void SetMoveTypeIcons ( void ) ;
static void SetContestMoveTypeIcons ( void ) ;
static void SetNewMoveTypeIcon ( void ) ;
2018-08-16 00:58:41 +02:00
static void sub_81C4568 ( u8 a , u8 b ) ;
2019-02-02 23:14:04 +01:00
static u8 CreatePokemonSprite ( struct Pokemon * a , s16 * b ) ;
2018-08-16 00:58:41 +02:00
static u8 sub_81C47B4 ( struct Pokemon * unused ) ;
2019-02-04 15:35:49 +01:00
static void SpriteCB_Pokemon ( struct Sprite * ) ;
2019-02-19 10:09:42 +01:00
static void StopPokemonAnimations ( void ) ;
2018-08-16 00:58:41 +02:00
static void CreateMonMarkingsSprite ( struct Pokemon * mon ) ;
static void RemoveAndCreateMonMarkingsSprite ( struct Pokemon * mon ) ;
static void CreateCaughtBallSprite ( struct Pokemon * mon ) ;
static void CreateSetStatusSprite ( void ) ;
static void sub_81C4AF8 ( u8 a ) ;
static void sub_81C4BE4 ( struct Sprite * sprite ) ;
static void sub_81C4C60 ( u8 a ) ;
static void sub_81C4C84 ( u8 a ) ;
static void sub_81C4D18 ( u8 a ) ;
2017-09-20 21:07:24 +02:00
2018-08-12 00:03:19 +02:00
// const rom data
# include "data/text/move_descriptions.h"
2018-08-15 06:56:11 +02:00
# include "data/text/nature_names.h"
2019-02-19 10:09:42 +01:00
static const struct BgTemplate sUnknown_0861CBB4 [ ] =
2018-08-15 06:56:11 +02:00
{
{
. bg = 0 ,
. charBaseIndex = 0 ,
. mapBaseIndex = 31 ,
. screenSize = 0 ,
. paletteMode = 0 ,
. priority = 0 ,
. baseTile = 0 ,
} ,
{
. bg = 1 ,
. charBaseIndex = 2 ,
. mapBaseIndex = 27 ,
. screenSize = 1 ,
. paletteMode = 0 ,
. priority = 1 ,
. baseTile = 0 ,
} ,
{
. bg = 2 ,
. charBaseIndex = 2 ,
. mapBaseIndex = 25 ,
. screenSize = 1 ,
. paletteMode = 0 ,
. priority = 2 ,
. baseTile = 0 ,
} ,
{
. bg = 3 ,
. charBaseIndex = 2 ,
. mapBaseIndex = 29 ,
. screenSize = 1 ,
. paletteMode = 0 ,
. priority = 3 ,
. baseTile = 0 ,
} ,
} ;
2019-02-19 10:09:42 +01:00
static const u16 sUnknown_0861CBC4 [ ] = INCBIN_U16 ( " graphics/interface/unk_tilemap2.bin " ) ;
static const struct UnkStruct_61CC04 sUnknown_0861CBEC =
2018-08-15 06:56:11 +02:00
{
2019-02-19 10:09:42 +01:00
sUnknown_0861CBC4 , 1 , 10 , 2 , 0 , 18
2018-08-15 06:56:11 +02:00
} ;
2019-02-19 10:09:42 +01:00
static const struct UnkStruct_61CC04 sUnknown_0861CBF8 =
2018-08-15 06:56:11 +02:00
{
2019-02-19 10:09:42 +01:00
sUnknown_0861CBC4 , 1 , 10 , 2 , 0 , 50
2018-08-15 06:56:11 +02:00
} ;
2019-02-19 10:09:42 +01:00
static const struct UnkStruct_61CC04 sUnknown_0861CC04 =
2018-08-15 06:56:11 +02:00
{
gSummaryScreenPowAcc_Tilemap , 0 , 10 , 7 , 0 , 45
} ;
2019-02-19 10:09:42 +01:00
static const struct UnkStruct_61CC04 sUnknown_0861CC10 =
2018-08-15 06:56:11 +02:00
{
gUnknown_08DC3C34 , 0 , 10 , 7 , 0 , 45
} ;
static const s8 gUnknown_0861CC1C [ ] = { 0 , 2 , 3 , 1 , 4 , 5 } ;
2019-02-19 10:09:42 +01:00
static const struct WindowTemplate sSummaryTemplate [ ] =
2018-08-15 06:56:11 +02:00
{
2018-12-29 17:57:35 +01:00
{ //Text for Pokemon Info
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 0 ,
. tilemapTop = 0 ,
. width = 11 ,
. height = 2 ,
. paletteNum = 6 ,
. baseBlock = 1 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Text for Pokemon Skills
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 0 ,
. tilemapTop = 0 ,
. width = 11 ,
. height = 2 ,
. paletteNum = 6 ,
. baseBlock = 23 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Text for Battle Moves
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 0 ,
. tilemapTop = 0 ,
. width = 11 ,
. height = 2 ,
. paletteNum = 6 ,
. baseBlock = 45 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Text for Contest Moves
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 0 ,
. tilemapTop = 0 ,
. width = 11 ,
. height = 2 ,
. paletteNum = 6 ,
. baseBlock = 67 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Text on Pokemon Info: Button prompt: Cancel
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 22 ,
. tilemapTop = 0 ,
. width = 8 ,
. height = 2 ,
. paletteNum = 7 ,
. baseBlock = 89 ,
2018-09-02 15:49:29 +02:00
} ,
2018-12-29 17:57:35 +01:00
{ //Info button found under moves
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 22 ,
. tilemapTop = 0 ,
. width = 8 ,
. height = 2 ,
. paletteNum = 7 ,
. baseBlock = 105 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Switch button under moves when viewing moves
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 22 ,
. tilemapTop = 0 ,
. width = 8 ,
. height = 2 ,
. paletteNum = 7 ,
. baseBlock = 121 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Unknown
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 11 ,
. tilemapTop = 4 ,
. width = 0 ,
. height = 2 ,
. paletteNum = 6 ,
. baseBlock = 137 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Unknown
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 11 ,
. tilemapTop = 4 ,
. width = 18 ,
. height = 2 ,
. paletteNum = 6 ,
. baseBlock = 137 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Type on pokemon info page
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 11 ,
. tilemapTop = 6 ,
. width = 18 ,
. height = 2 ,
. paletteNum = 6 ,
. baseBlock = 173 ,
} ,
2018-12-29 17:57:35 +01:00
{ //HP, Attack and Defense text
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 10 ,
. tilemapTop = 7 ,
. width = 6 ,
. height = 6 ,
. paletteNum = 6 ,
. baseBlock = 209 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Sp. atk, Sp. Def and Speed texxt
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 22 ,
. tilemapTop = 7 ,
. width = 5 ,
. height = 6 ,
. paletteNum = 6 ,
. baseBlock = 245 ,
} ,
2018-12-29 17:57:35 +01:00
{ //EXP and next lvl.
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 10 ,
. tilemapTop = 14 ,
. width = 11 ,
. height = 4 ,
. paletteNum = 6 ,
. baseBlock = 275 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Unknown
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 0 ,
. tilemapTop = 18 ,
. width = 6 ,
. height = 2 ,
. paletteNum = 6 ,
. baseBlock = 319 ,
} ,
2018-12-29 17:57:35 +01:00
{ //move text: Power, Accuracy and their numeric values.
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 1 ,
. tilemapTop = 15 ,
. width = 9 ,
. height = 4 ,
. paletteNum = 6 ,
. baseBlock = 331 ,
} ,
2018-12-29 17:57:35 +01:00
{ //contest text: appeal and jam
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 1 ,
. tilemapTop = 15 ,
. width = 5 ,
. height = 4 ,
. paletteNum = 6 ,
. baseBlock = 367 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Unknown
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 22 ,
. tilemapTop = 4 ,
. width = 0 ,
. height = 2 ,
. paletteNum = 6 ,
. baseBlock = 387 ,
} ,
2018-12-29 17:57:35 +01:00
{ //No.
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 1 ,
. tilemapTop = 2 ,
. width = 4 ,
. height = 2 ,
. paletteNum = 7 ,
. baseBlock = 387 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Upper name
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 1 ,
. tilemapTop = 12 ,
. width = 9 ,
. height = 2 ,
. paletteNum = 6 ,
. baseBlock = 395 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Lower name
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 1 ,
. tilemapTop = 14 ,
. width = 9 ,
. height = 4 ,
. paletteNum = 6 ,
. baseBlock = 413 ,
} ,
2018-08-15 06:56:11 +02:00
DUMMY_WIN_TEMPLATE
} ;
2019-02-19 10:09:42 +01:00
static const struct WindowTemplate sPageInfoTemplate [ ] =
2018-08-15 06:56:11 +02:00
{
2018-12-29 17:57:35 +01:00
{ //Original Trainer
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 11 ,
. tilemapTop = 4 ,
. width = 11 ,
. height = 2 ,
. paletteNum = 6 ,
. baseBlock = 449 ,
} ,
2018-12-29 17:57:35 +01:00
{ //ID numbers
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 22 ,
. tilemapTop = 4 ,
. width = 7 ,
. height = 2 ,
. paletteNum = 6 ,
. baseBlock = 471 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Ability
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 11 ,
. tilemapTop = 9 ,
. width = 18 ,
. height = 4 ,
. paletteNum = 6 ,
. baseBlock = 485 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Trainer Memo
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 11 ,
. tilemapTop = 14 ,
. width = 18 ,
. height = 6 ,
. paletteNum = 6 ,
. baseBlock = 557 ,
} ,
2018-08-15 06:56:11 +02:00
} ;
2019-02-19 10:09:42 +01:00
static const struct WindowTemplate sPageSkillsTemplate [ ] =
2018-08-15 06:56:11 +02:00
{
2018-12-29 17:57:35 +01:00
{ //Held Item string
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 10 ,
. tilemapTop = 4 ,
. width = 10 ,
. height = 2 ,
. paletteNum = 6 ,
. baseBlock = 449 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Ribbon string
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 20 ,
. tilemapTop = 4 ,
. width = 10 ,
. height = 2 ,
. paletteNum = 6 ,
. baseBlock = 469 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Stat numbers left (HP, ATK & DEF)
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 16 ,
. tilemapTop = 7 ,
. width = 6 ,
. height = 6 ,
. paletteNum = 6 ,
. baseBlock = 489 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Stat numbers right (SP.ATK, SP.DEF & SPEED)
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 27 ,
. tilemapTop = 7 ,
. width = 3 ,
. height = 6 ,
. paletteNum = 6 ,
. baseBlock = 525 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Exp numbers
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 24 ,
. tilemapTop = 14 ,
. width = 6 ,
. height = 4 ,
. paletteNum = 6 ,
. baseBlock = 543 ,
} ,
2018-08-15 06:56:11 +02:00
} ;
2019-02-19 10:09:42 +01:00
static const struct WindowTemplate sPageMovesTemplate [ ] = // This is used for both battle and contest moves
2018-08-15 06:56:11 +02:00
{
2018-12-29 17:57:35 +01:00
{ //Move names?
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 15 ,
. tilemapTop = 4 ,
. width = 9 ,
. height = 10 ,
. paletteNum = 6 ,
. baseBlock = 449 ,
} ,
2018-12-29 17:57:35 +01:00
{ //PP Numbers
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 24 ,
. tilemapTop = 4 ,
. width = 6 ,
. height = 10 ,
. paletteNum = 8 ,
. baseBlock = 539 ,
} ,
2018-12-29 17:57:35 +01:00
{ //Move description text
2018-10-27 00:53:07 +02:00
. bg = 0 ,
2018-09-02 14:47:12 +02:00
. tilemapLeft = 10 ,
. tilemapTop = 15 ,
. width = 20 ,
. height = 4 ,
. paletteNum = 6 ,
. baseBlock = 599 ,
} ,
2018-08-15 06:56:11 +02:00
} ;
static const u8 sTextColors_861CD2C [ ] [ 3 ] =
{
{ 0 , 1 , 2 } ,
{ 0 , 3 , 4 } ,
{ 0 , 5 , 6 } ,
{ 0 , 7 , 8 } ,
{ 0 , 9 , 10 } ,
{ 0 , 11 , 12 } ,
{ 0 , 13 , 14 } ,
{ 0 , 7 , 8 } ,
{ 13 , 15 , 14 } ,
{ 0 , 1 , 2 } ,
{ 0 , 3 , 4 } ,
{ 0 , 5 , 6 } ,
{ 0 , 7 , 8 }
} ;
2019-02-04 12:38:44 +01:00
2019-02-19 10:09:42 +01:00
static const u8 sSummaryAButtonBitmap [ ] = INCBIN_U8 ( " graphics/interface/summary_a_button.4bpp " ) ;
static const u8 sSummaryBButtonBitmap [ ] = INCBIN_U8 ( " graphics/interface/summary_b_button.4bpp " ) ;
2019-02-04 12:38:44 +01:00
static void ( * const sTextPrinterFunctions [ ] ) ( void ) =
2018-08-15 06:56:11 +02:00
{
2019-02-04 12:38:44 +01:00
PrintInfoPageText ,
PrintSkillsPageText ,
PrintBattleMoves ,
PrintContestMoves
2018-08-15 06:56:11 +02:00
} ;
2019-02-04 12:38:44 +01:00
static void ( * const sTextPrinterTasks [ ] ) ( u8 taskId ) =
2018-08-15 06:56:11 +02:00
{
2019-02-04 13:44:09 +01:00
Task_PrintInfoPage ,
Task_PrintSkillsPage ,
Task_PrintBattleMoves ,
Task_PrintContestMoves
2018-08-15 06:56:11 +02:00
} ;
2019-02-04 12:38:44 +01:00
2019-02-19 10:09:42 +01:00
static const u8 sMemoNatureTextColor [ ] = _ ( " {COLOR LIGHT_RED}{SHADOW GREEN} " ) ;
static const u8 sMemoMiscTextColor [ ] = _ ( " {COLOR WHITE}{SHADOW DARK_GREY} " ) ; // This is also affected by palettes, apparently
static const u8 sStatsLeftColumnLayout [ ] = _ ( " {SPECIAL_F7 0x00}/{SPECIAL_F7 0x01} \n {SPECIAL_F7 0x02} \n {SPECIAL_F7 0x03} " ) ;
static const u8 sStatsRightColumnLayout [ ] = _ ( " {SPECIAL_F7 0x00} \n {SPECIAL_F7 0x01} \n {SPECIAL_F7 0x02} " ) ;
static const u8 sMovesPPLayout [ ] = _ ( " {PP}{SPECIAL_F7 0x00}/{SPECIAL_F7 0x01} " ) ;
2018-09-01 18:31:53 +02:00
# define TAG_MOVE_TYPES 30002
static const struct OamData sOamData_MoveTypes =
2018-08-15 06:56:11 +02:00
{
. y = 0 ,
. affineMode = 0 ,
. objMode = 0 ,
. mosaic = 0 ,
. bpp = 0 ,
. shape = 1 ,
. x = 0 ,
. matrixNum = 0 ,
. size = 2 ,
. tileNum = 0 ,
. priority = 1 ,
. paletteNum = 0 ,
. affineParam = 0 ,
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeNormal [ ] = {
ANIMCMD_FRAME ( TYPE_NORMAL * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeFighting [ ] = {
ANIMCMD_FRAME ( TYPE_FIGHTING * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeFlying [ ] = {
ANIMCMD_FRAME ( TYPE_FLYING * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypePoison [ ] = {
ANIMCMD_FRAME ( TYPE_POISON * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeGround [ ] = {
ANIMCMD_FRAME ( TYPE_GROUND * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeRock [ ] = {
ANIMCMD_FRAME ( TYPE_ROCK * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeBug [ ] = {
ANIMCMD_FRAME ( TYPE_BUG * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeGhost [ ] = {
ANIMCMD_FRAME ( TYPE_GHOST * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeSteel [ ] = {
ANIMCMD_FRAME ( TYPE_STEEL * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeMystery [ ] = {
ANIMCMD_FRAME ( TYPE_MYSTERY * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeFire [ ] = {
ANIMCMD_FRAME ( TYPE_FIRE * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeWater [ ] = {
ANIMCMD_FRAME ( TYPE_WATER * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeGrass [ ] = {
ANIMCMD_FRAME ( TYPE_GRASS * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeElectric [ ] = {
ANIMCMD_FRAME ( TYPE_ELECTRIC * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypePsychic [ ] = {
ANIMCMD_FRAME ( TYPE_PSYCHIC * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeIce [ ] = {
ANIMCMD_FRAME ( TYPE_ICE * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeDragon [ ] = {
ANIMCMD_FRAME ( TYPE_DRAGON * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_TypeDark [ ] = {
ANIMCMD_FRAME ( TYPE_DARK * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_CategoryCool [ ] = {
ANIMCMD_FRAME ( ( CONTEST_CATEGORY_COOL + NUMBER_OF_MON_TYPES ) * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_CategoryBeauty [ ] = {
ANIMCMD_FRAME ( ( CONTEST_CATEGORY_BEAUTY + NUMBER_OF_MON_TYPES ) * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_CategoryCute [ ] = {
ANIMCMD_FRAME ( ( CONTEST_CATEGORY_CUTE + NUMBER_OF_MON_TYPES ) * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_CategorySmart [ ] = {
ANIMCMD_FRAME ( ( CONTEST_CATEGORY_SMART + NUMBER_OF_MON_TYPES ) * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd sSpriteAnim_CategoryTough [ ] = {
ANIMCMD_FRAME ( ( CONTEST_CATEGORY_TOUGH + NUMBER_OF_MON_TYPES ) * 8 , 0 , FALSE , FALSE ) ,
2018-08-15 06:56:11 +02:00
ANIMCMD_END
} ;
2018-09-01 18:31:53 +02:00
static const union AnimCmd * const sSpriteAnimTable_MoveTypes [ NUMBER_OF_MON_TYPES + CONTEST_CATEGORIES_COUNT ] = {
sSpriteAnim_TypeNormal ,
sSpriteAnim_TypeFighting ,
sSpriteAnim_TypeFlying ,
sSpriteAnim_TypePoison ,
sSpriteAnim_TypeGround ,
sSpriteAnim_TypeRock ,
sSpriteAnim_TypeBug ,
sSpriteAnim_TypeGhost ,
sSpriteAnim_TypeSteel ,
sSpriteAnim_TypeMystery ,
sSpriteAnim_TypeFire ,
sSpriteAnim_TypeWater ,
sSpriteAnim_TypeGrass ,
sSpriteAnim_TypeElectric ,
sSpriteAnim_TypePsychic ,
sSpriteAnim_TypeIce ,
sSpriteAnim_TypeDragon ,
sSpriteAnim_TypeDark ,
sSpriteAnim_CategoryCool ,
sSpriteAnim_CategoryBeauty ,
sSpriteAnim_CategoryCute ,
sSpriteAnim_CategorySmart ,
sSpriteAnim_CategoryTough ,
} ;
static const struct CompressedSpriteSheet sSpriteSheet_MoveTypes =
2018-08-15 06:56:11 +02:00
{
. data = gMoveTypes_Gfx ,
2018-09-01 18:31:53 +02:00
. size = ( NUMBER_OF_MON_TYPES + CONTEST_CATEGORIES_COUNT ) * 0x100 ,
. tag = TAG_MOVE_TYPES
2018-08-15 06:56:11 +02:00
} ;
2018-09-01 18:31:53 +02:00
static const struct SpriteTemplate sSpriteTemplate_MoveTypes =
2018-08-15 06:56:11 +02:00
{
2018-09-01 18:31:53 +02:00
. tileTag = TAG_MOVE_TYPES ,
. paletteTag = TAG_MOVE_TYPES ,
. oam = & sOamData_MoveTypes ,
. anims = sSpriteAnimTable_MoveTypes ,
2018-08-15 06:56:11 +02:00
. images = NULL ,
. affineAnims = gDummySpriteAffineAnimTable ,
. callback = SpriteCallbackDummy
} ;
2018-09-01 18:31:53 +02:00
static const u8 sMoveTypeToOamPaletteNum [ NUMBER_OF_MON_TYPES + CONTEST_CATEGORIES_COUNT ] =
{
[ TYPE_NORMAL ] = 13 ,
[ TYPE_FIGHTING ] = 13 ,
[ TYPE_FLYING ] = 14 ,
[ TYPE_POISON ] = 14 ,
[ TYPE_GROUND ] = 13 ,
[ TYPE_ROCK ] = 13 ,
[ TYPE_BUG ] = 15 ,
[ TYPE_GHOST ] = 14 ,
[ TYPE_STEEL ] = 13 ,
[ TYPE_MYSTERY ] = 15 ,
[ TYPE_FIRE ] = 13 ,
[ TYPE_WATER ] = 14 ,
[ TYPE_GRASS ] = 15 ,
[ TYPE_ELECTRIC ] = 13 ,
[ TYPE_PSYCHIC ] = 14 ,
[ TYPE_ICE ] = 14 ,
[ TYPE_DRAGON ] = 15 ,
[ TYPE_DARK ] = 13 ,
[ NUMBER_OF_MON_TYPES + CONTEST_CATEGORY_COOL ] = 13 ,
[ NUMBER_OF_MON_TYPES + CONTEST_CATEGORY_BEAUTY ] = 14 ,
[ NUMBER_OF_MON_TYPES + CONTEST_CATEGORY_CUTE ] = 14 ,
[ NUMBER_OF_MON_TYPES + CONTEST_CATEGORY_SMART ] = 15 ,
[ NUMBER_OF_MON_TYPES + CONTEST_CATEGORY_TOUGH ] = 13 ,
} ;
2018-08-15 06:56:11 +02:00
static const struct OamData gOamData_861CFF4 =
{
. y = 0 ,
. affineMode = 0 ,
. objMode = 0 ,
. mosaic = 0 ,
. bpp = 0 ,
. shape = 0 ,
. x = 0 ,
. matrixNum = 0 ,
. size = 1 ,
. tileNum = 0 ,
. priority = 1 ,
. paletteNum = 0 ,
. affineParam = 0 ,
} ;
2019-02-19 10:09:42 +01:00
static const union AnimCmd sSpriteAnim_861CFFC [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 0 , 0 , FALSE , FALSE ) ,
ANIMCMD_END
} ;
2019-02-19 10:09:42 +01:00
static const union AnimCmd sSpriteAnim_861D004 [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 4 , 0 , FALSE , FALSE ) ,
ANIMCMD_END
} ;
2019-02-19 10:09:42 +01:00
static const union AnimCmd sSpriteAnim_861D00C [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 8 , 0 , FALSE , FALSE ) ,
ANIMCMD_END
} ;
2019-02-19 10:09:42 +01:00
static const union AnimCmd sSpriteAnim_861D014 [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 12 , 0 , FALSE , FALSE ) ,
ANIMCMD_END
} ;
2019-02-19 10:09:42 +01:00
static const union AnimCmd sSpriteAnim_861D01C [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 16 , 0 , FALSE , FALSE ) ,
ANIMCMD_END
} ;
2019-02-19 10:09:42 +01:00
static const union AnimCmd sSpriteAnim_861D024 [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 16 , 0 , TRUE , FALSE ) ,
ANIMCMD_END
} ;
2019-02-19 10:09:42 +01:00
static const union AnimCmd sSpriteAnim_861D02C [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 20 , 0 , FALSE , FALSE ) ,
ANIMCMD_END
} ;
2019-02-19 10:09:42 +01:00
static const union AnimCmd sSpriteAnim_861D034 [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 24 , 0 , FALSE , FALSE ) ,
ANIMCMD_END
} ;
2019-02-19 10:09:42 +01:00
static const union AnimCmd sSpriteAnim_861D03C [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 24 , 0 , TRUE , FALSE ) ,
ANIMCMD_END
} ;
2019-02-19 10:09:42 +01:00
static const union AnimCmd sSpriteAnim_861D044 [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 28 , 0 , FALSE , FALSE ) ,
ANIMCMD_END
} ;
2019-02-19 10:09:42 +01:00
static const union AnimCmd * const sSpriteAnimTable_861D04C [ ] = {
sSpriteAnim_861CFFC ,
sSpriteAnim_861D004 ,
sSpriteAnim_861D00C ,
sSpriteAnim_861D014 ,
sSpriteAnim_861D01C ,
sSpriteAnim_861D024 ,
sSpriteAnim_861D02C ,
sSpriteAnim_861D034 ,
sSpriteAnim_861D03C ,
sSpriteAnim_861D044 ,
} ;
static const struct CompressedSpriteSheet sMoveSelectorSpriteSheet =
{
. data = gMoveSelectorBitmap ,
2018-08-15 06:56:11 +02:00
. size = 0x400 ,
. tag = 30000
} ;
static const struct CompressedSpritePalette gUnknown_0861D07C =
{
. data = gUnknown_08D97CF4 ,
. tag = 30000
} ;
2018-08-16 22:53:01 +02:00
static const struct SpriteTemplate gUnknown_0861D084 =
2018-08-15 06:56:11 +02:00
{
. tileTag = 30000 ,
. paletteTag = 30000 ,
. oam = & gOamData_861CFF4 ,
2019-02-19 10:09:42 +01:00
. anims = sSpriteAnimTable_861D04C ,
2018-08-15 06:56:11 +02:00
. images = NULL ,
. affineAnims = gDummySpriteAffineAnimTable ,
. callback = SpriteCallbackDummy
} ;
2018-09-02 14:47:12 +02:00
static const struct OamData sOamData_StatusCondition =
2018-08-15 06:56:11 +02:00
{
. y = 0 ,
. affineMode = 0 ,
. objMode = 0 ,
. mosaic = 0 ,
. bpp = 0 ,
. shape = 1 ,
. x = 0 ,
. matrixNum = 0 ,
. size = 1 ,
. tileNum = 0 ,
. priority = 3 ,
. paletteNum = 0 ,
. affineParam = 0 ,
} ;
2018-09-02 14:47:12 +02:00
static const union AnimCmd sSpriteAnim_StatusPoison [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 0 , 0 , FALSE , FALSE ) ,
ANIMCMD_END
} ;
2018-09-02 14:47:12 +02:00
static const union AnimCmd sSpriteAnim_StatusParalyzed [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 4 , 0 , FALSE , FALSE ) ,
ANIMCMD_END
} ;
2018-09-02 14:47:12 +02:00
static const union AnimCmd sSpriteAnim_StatusSleep [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 8 , 0 , FALSE , FALSE ) ,
ANIMCMD_END
} ;
2018-09-02 14:47:12 +02:00
static const union AnimCmd sSpriteAnim_StatusFrozen [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 12 , 0 , FALSE , FALSE ) ,
ANIMCMD_END
} ;
2018-09-02 14:47:12 +02:00
static const union AnimCmd sSpriteAnim_StatusBurn [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 16 , 0 , FALSE , FALSE ) ,
ANIMCMD_END
} ;
2018-09-02 14:47:12 +02:00
static const union AnimCmd sSpriteAnim_StatusPokerus [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 20 , 0 , FALSE , FALSE ) ,
ANIMCMD_END
} ;
2018-09-02 14:47:12 +02:00
static const union AnimCmd sSpriteAnim_StatusFaint [ ] = {
2018-08-15 06:56:11 +02:00
ANIMCMD_FRAME ( 24 , 0 , FALSE , FALSE ) ,
ANIMCMD_END
} ;
2018-09-02 14:47:12 +02:00
static const union AnimCmd * const sSpriteAnimTable_StatusCondition [ ] = {
sSpriteAnim_StatusPoison ,
sSpriteAnim_StatusParalyzed ,
sSpriteAnim_StatusSleep ,
sSpriteAnim_StatusFrozen ,
sSpriteAnim_StatusBurn ,
sSpriteAnim_StatusPokerus ,
sSpriteAnim_StatusFaint ,
2018-08-15 06:56:11 +02:00
} ;
2019-02-02 23:14:04 +01:00
static const struct CompressedSpriteSheet sStatusIconsSpriteSheet =
2018-08-15 06:56:11 +02:00
{
. data = gStatusGfx_Icons ,
. size = 0x380 ,
. tag = 30001
} ;
2019-02-02 23:14:04 +01:00
static const struct CompressedSpritePalette sStatusIconsSpritePalette =
2018-08-15 06:56:11 +02:00
{
. data = gStatusPal_Icons ,
. tag = 30001
} ;
2018-09-02 14:47:12 +02:00
static const struct SpriteTemplate sSpriteTemplate_StatusCondition =
2018-08-15 06:56:11 +02:00
{
. tileTag = 30001 ,
. paletteTag = 30001 ,
2018-09-02 14:47:12 +02:00
. oam = & sOamData_StatusCondition ,
. anims = sSpriteAnimTable_StatusCondition ,
2018-08-15 06:56:11 +02:00
. images = NULL ,
. affineAnims = gDummySpriteAffineAnimTable ,
. callback = SpriteCallbackDummy
} ;
2019-02-19 10:09:42 +01:00
static const u16 sSummaryMarkingsPalette [ ] = INCBIN_U16 ( " graphics/interface/summary_markings.gbapal " ) ;
2018-08-12 00:03:19 +02:00
// code
2018-08-15 10:44:20 +02:00
void ShowPokemonSummaryScreen ( u8 mode , void * mons , u8 monIndex , u8 maxMonIndex , void ( * callback ) ( void ) )
2018-08-15 06:56:11 +02:00
{
2018-08-16 00:58:41 +02:00
pssData = AllocZeroed ( sizeof ( * pssData ) ) ;
pssData - > mode = mode ;
pssData - > monList . mons = mons ;
pssData - > curMonIndex = monIndex ;
pssData - > maxMonIndex = maxMonIndex ;
pssData - > callback = callback ;
2018-08-15 06:56:11 +02:00
2018-12-10 21:36:52 +01:00
if ( mode = = PSS_MODE_BOX )
2018-08-16 00:58:41 +02:00
pssData - > isBoxMon = TRUE ;
2017-09-20 21:07:24 +02:00
else
2018-08-16 00:58:41 +02:00
pssData - > isBoxMon = FALSE ;
2018-08-16 22:53:01 +02:00
2018-08-15 06:56:11 +02:00
switch ( mode )
2017-09-20 21:07:24 +02:00
{
2018-08-15 10:44:20 +02:00
case PSS_MODE_NORMAL :
2018-12-10 21:36:52 +01:00
case PSS_MODE_BOX :
2018-08-16 00:58:41 +02:00
pssData - > minPageIndex = 0 ;
pssData - > maxPageIndex = 3 ;
2017-10-03 21:42:28 +02:00
break ;
2018-08-15 10:44:20 +02:00
case PSS_MODE_UNK1 :
2018-08-16 00:58:41 +02:00
pssData - > minPageIndex = 0 ;
pssData - > maxPageIndex = 3 ;
pssData - > unk40C8 = TRUE ;
2017-10-03 21:42:28 +02:00
break ;
2018-08-15 10:44:20 +02:00
case PSS_MODE_SELECT_MOVE :
2018-08-16 00:58:41 +02:00
pssData - > minPageIndex = 2 ;
pssData - > maxPageIndex = 3 ;
2019-02-19 10:09:42 +01:00
pssData - > lockMonFlag = TRUE ;
2017-10-03 21:42:28 +02:00
break ;
2017-09-20 21:07:24 +02:00
}
2018-08-15 06:56:11 +02:00
2018-08-16 00:58:41 +02:00
pssData - > currPageIndex = pssData - > minPageIndex ;
2018-08-15 20:47:10 +02:00
SummaryScreen_SetUnknownTaskId ( - 1 ) ;
2018-08-15 06:56:11 +02:00
2017-10-09 19:32:57 +02:00
if ( gMonSpritesGfxPtr = = 0 )
2017-09-20 21:07:24 +02:00
sub_806F2AC ( 0 , 0 ) ;
2018-08-16 22:53:01 +02:00
2018-08-15 20:47:10 +02:00
SetMainCallback2 ( SummaryScreen_LoadingCB2 ) ;
2017-09-20 21:07:24 +02:00
}
2018-08-15 06:56:11 +02:00
void ShowSelectMovePokemonSummaryScreen ( struct Pokemon * mons , u8 monIndex , u8 maxMonIndex , void ( * callback ) ( void ) , u16 newMove )
2017-09-20 21:07:24 +02:00
{
2018-08-15 10:44:20 +02:00
ShowPokemonSummaryScreen ( PSS_MODE_SELECT_MOVE , mons , monIndex , maxMonIndex , callback ) ;
2018-08-16 00:58:41 +02:00
pssData - > newMove = newMove ;
2017-09-20 21:07:24 +02:00
}
2018-08-15 10:44:20 +02:00
void ShowPokemonSummaryScreenSet40EF ( u8 mode , struct BoxPokemon * mons , u8 monIndex , u8 maxMonIndex , void ( * callback ) ( void ) )
2017-09-20 21:07:24 +02:00
{
2018-08-15 10:44:20 +02:00
ShowPokemonSummaryScreen ( mode , mons , monIndex , maxMonIndex , callback ) ;
2018-08-16 00:58:41 +02:00
pssData - > unk40EF = TRUE ;
2017-09-20 21:07:24 +02:00
}
2018-08-15 20:47:10 +02:00
static void SummaryScreen_MainCB2 ( void )
2017-09-20 21:07:24 +02:00
{
RunTasks ( ) ;
AnimateSprites ( ) ;
BuildOamBuffer ( ) ;
do_scheduled_bg_tilemap_copies_to_vram ( ) ;
UpdatePaletteFade ( ) ;
}
2018-08-15 20:47:10 +02:00
static void SummaryScreen_VBlank ( void )
2017-09-20 21:07:24 +02:00
{
LoadOam ( ) ;
ProcessSpriteCopyRequests ( ) ;
TransferPlttBuffer ( ) ;
}
2018-08-15 20:47:10 +02:00
static void SummaryScreen_LoadingCB2 ( void )
2017-09-20 21:07:24 +02:00
{
2018-08-15 20:47:10 +02:00
while ( sub_81221EC ( ) ! = TRUE & & SummaryScreen_LoadGraphics ( ) ! = TRUE & & sub_81221AC ( ) ! = TRUE ) ;
2017-09-20 21:07:24 +02:00
}
2018-08-15 20:47:10 +02:00
static bool8 SummaryScreen_LoadGraphics ( void )
2017-09-20 21:07:24 +02:00
{
2017-10-03 21:42:28 +02:00
switch ( gMain . state )
{
case 0 :
SetVBlankHBlankCallbacksToNull ( ) ;
2017-12-09 21:23:40 +01:00
ResetVramOamAndBgCntRegs ( ) ;
2017-10-03 21:42:28 +02:00
clear_scheduled_bg_copies_to_vram ( ) ;
gMain . state + + ;
break ;
case 1 :
2018-01-16 18:59:06 +01:00
ScanlineEffect_Stop ( ) ;
2017-10-03 21:42:28 +02:00
gMain . state + + ;
break ;
case 2 :
ResetPaletteFade ( ) ;
gPaletteFade . bufferTransferDisabled = 1 ;
gMain . state + + ;
break ;
case 3 :
ResetSpriteData ( ) ;
gMain . state + + ;
break ;
case 4 :
FreeAllSpritePalettes ( ) ;
gMain . state + + ;
break ;
case 5 :
2018-08-15 10:44:20 +02:00
InitBGs ( ) ;
2019-02-19 10:09:42 +01:00
pssData - > switchCounter = 0 ;
2017-10-03 21:42:28 +02:00
gMain . state + + ;
break ;
case 6 :
2018-08-16 00:58:41 +02:00
if ( SummaryScreen_DecompressGraphics ( ) ! = FALSE )
2017-10-03 21:42:28 +02:00
gMain . state + + ;
break ;
case 7 :
2019-02-04 13:44:09 +01:00
ResetWindows ( ) ;
2017-10-03 21:42:28 +02:00
gMain . state + + ;
break ;
case 8 :
2019-02-19 10:09:42 +01:00
DrawPagination ( ) ;
2017-10-03 21:42:28 +02:00
gMain . state + + ;
break ;
case 9 :
2018-08-16 00:58:41 +02:00
CopyMonToSummaryStruct ( & pssData - > currentMon ) ;
2019-02-19 10:09:42 +01:00
pssData - > switchCounter = 0 ;
2017-10-03 21:42:28 +02:00
gMain . state + + ;
break ;
case 10 :
2018-08-16 00:58:41 +02:00
if ( ExtractMonDataToSummaryStruct ( & pssData - > currentMon ) ! = 0 )
2017-10-03 21:42:28 +02:00
gMain . state + + ;
break ;
case 11 :
sub_81C25E8 ( ) ;
gMain . state + + ;
break ;
case 12 :
2018-08-16 00:58:41 +02:00
PrintPageNamesAndStatsPageToWindows ( ) ;
2017-10-03 21:42:28 +02:00
gMain . state + + ;
break ;
case 13 :
2019-02-04 12:38:44 +01:00
PrintPageSpecificText ( pssData - > currPageIndex ) ;
2017-10-03 21:42:28 +02:00
gMain . state + + ;
break ;
case 14 :
sub_81C0348 ( ) ;
gMain . state + + ;
break ;
case 15 :
2019-02-04 13:44:09 +01:00
CreatePageWindowTilemaps ( pssData - > currPageIndex ) ;
2017-10-03 21:42:28 +02:00
gMain . state + + ;
break ;
case 16 :
2019-02-04 12:38:44 +01:00
ResetSpriteIds ( ) ;
2019-02-02 23:14:04 +01:00
CreateMoveTypeIcons ( ) ;
2019-02-19 10:09:42 +01:00
pssData - > switchCounter = 0 ;
2017-10-03 21:42:28 +02:00
gMain . state + + ;
break ;
case 17 :
2019-02-19 10:09:42 +01:00
pssData - > spriteIds [ 0 ] = CreatePokemonSprite ( & pssData - > currentMon , & pssData - > switchCounter ) ;
2018-12-05 15:31:01 +01:00
if ( pssData - > spriteIds [ 0 ] ! = 0xFF )
2017-09-20 21:07:24 +02:00
{
2019-02-19 10:09:42 +01:00
pssData - > switchCounter = 0 ;
2017-10-03 21:42:28 +02:00
gMain . state + + ;
2017-09-20 21:07:24 +02:00
}
2017-10-03 21:42:28 +02:00
break ;
case 18 :
2018-08-16 00:58:41 +02:00
CreateMonMarkingsSprite ( & pssData - > currentMon ) ;
2017-10-03 21:42:28 +02:00
gMain . state + + ;
break ;
case 19 :
2018-08-16 00:58:41 +02:00
CreateCaughtBallSprite ( & pssData - > currentMon ) ;
2017-10-03 21:42:28 +02:00
gMain . state + + ;
break ;
case 20 :
2018-08-15 20:47:10 +02:00
CreateSetStatusSprite ( ) ;
2017-10-03 21:42:28 +02:00
gMain . state + + ;
break ;
case 21 :
2019-02-02 23:14:04 +01:00
SetTypeIcons ( ) ;
2017-10-03 21:42:28 +02:00
gMain . state + + ;
break ;
case 22 :
2018-08-16 00:58:41 +02:00
if ( pssData - > mode ! = PSS_MODE_SELECT_MOVE )
2019-02-04 13:44:09 +01:00
CreateTask ( HandleInput , 0 ) ;
2017-10-03 21:42:28 +02:00
else
CreateTask ( sub_81C171C , 0 ) ;
gMain . state + + ;
break ;
case 23 :
BlendPalettes ( - 1 , 16 , 0 ) ;
gMain . state + + ;
break ;
case 24 :
2019-02-04 13:44:09 +01:00
BeginNormalPaletteFade ( 0xFFFFFFFF , 0 , 16 , 0 , RGB_BLACK ) ;
2017-10-03 21:42:28 +02:00
gPaletteFade . bufferTransferDisabled = 0 ;
gMain . state + + ;
break ;
default :
2018-08-15 20:47:10 +02:00
SetVBlankCallback ( SummaryScreen_VBlank ) ;
SetMainCallback2 ( SummaryScreen_MainCB2 ) ;
2017-10-03 21:42:28 +02:00
return TRUE ;
}
return FALSE ;
2017-09-20 21:07:24 +02:00
}
2018-08-15 10:44:20 +02:00
static void InitBGs ( void )
2017-09-20 21:07:24 +02:00
{
ResetBgsAndClearDma3BusyFlags ( 0 ) ;
2019-02-19 10:09:42 +01:00
InitBgsFromTemplates ( 0 , sUnknown_0861CBB4 , ARRAY_COUNT ( sUnknown_0861CBB4 ) ) ;
2018-08-16 00:58:41 +02:00
SetBgTilemapBuffer ( 1 , pssData - > bgTilemapBuffers [ PSS_PAGE_BATTLE_MOVES ] [ 0 ] ) ;
SetBgTilemapBuffer ( 2 , pssData - > bgTilemapBuffers [ PSS_PAGE_SKILLS ] [ 0 ] ) ;
SetBgTilemapBuffer ( 3 , pssData - > bgTilemapBuffers [ PSS_PAGE_INFO ] [ 0 ] ) ;
2017-12-09 21:23:40 +01:00
ResetAllBgsCoordinates ( ) ;
2017-09-20 21:07:24 +02:00
schedule_bg_copy_tilemap_to_vram ( 1 ) ;
schedule_bg_copy_tilemap_to_vram ( 2 ) ;
schedule_bg_copy_tilemap_to_vram ( 3 ) ;
2017-10-20 22:18:29 +02:00
SetGpuReg ( REG_OFFSET_DISPCNT , 0x1040 ) ;
SetGpuReg ( REG_OFFSET_BLDCNT , 0 ) ;
2017-09-20 21:07:24 +02:00
ShowBg ( 0 ) ;
ShowBg ( 1 ) ;
ShowBg ( 2 ) ;
ShowBg ( 3 ) ;
}
2018-08-16 00:58:41 +02:00
static bool8 SummaryScreen_DecompressGraphics ( void )
2017-09-20 21:07:24 +02:00
{
2019-02-19 10:09:42 +01:00
switch ( pssData - > switchCounter )
2017-09-20 21:07:24 +02:00
{
2017-10-03 21:42:28 +02:00
case 0 :
reset_temp_tile_data_buffers ( ) ;
2019-02-19 10:09:42 +01:00
decompress_and_copy_tile_data_to_vram ( 1 , & gStatusScreenBitmap , 0 , 0 , 0 ) ;
pssData - > switchCounter + + ;
2017-10-03 21:42:28 +02:00
break ;
case 1 :
if ( free_temp_tile_data_buffers_if_possible ( ) ! = 1 )
{
2019-02-19 10:09:42 +01:00
LZDecompressWram ( gPageInfoTilemap , pssData - > bgTilemapBuffers [ PSS_PAGE_INFO ] [ 0 ] ) ;
pssData - > switchCounter + + ;
2017-10-03 21:42:28 +02:00
}
break ;
case 2 :
2018-11-07 19:35:31 +01:00
LZDecompressWram ( gUnknown_08D98CC8 , pssData - > bgTilemapBuffers [ PSS_PAGE_INFO ] [ 1 ] ) ;
2019-02-19 10:09:42 +01:00
pssData - > switchCounter + + ;
2017-10-03 21:42:28 +02:00
break ;
case 3 :
2019-02-19 10:09:42 +01:00
LZDecompressWram ( gPageSkillsTilemap , pssData - > bgTilemapBuffers [ PSS_PAGE_SKILLS ] [ 1 ] ) ;
pssData - > switchCounter + + ;
2017-10-03 21:42:28 +02:00
break ;
case 4 :
2019-02-19 10:09:42 +01:00
LZDecompressWram ( gPageBattleMovesTilemap , pssData - > bgTilemapBuffers [ PSS_PAGE_BATTLE_MOVES ] [ 1 ] ) ;
pssData - > switchCounter + + ;
2017-10-03 21:42:28 +02:00
break ;
case 5 :
2019-02-19 10:09:42 +01:00
LZDecompressWram ( gPageContestMovesTilemap , pssData - > bgTilemapBuffers [ PSS_PAGE_CONTEST_MOVES ] [ 1 ] ) ;
pssData - > switchCounter + + ;
2017-10-03 21:42:28 +02:00
break ;
case 6 :
2019-02-19 10:09:42 +01:00
LoadCompressedPalette ( gStatusScreenPalette , 0 , 0x100 ) ;
2017-10-03 21:42:28 +02:00
LoadPalette ( & gUnknown_08D85620 , 0x81 , 0x1E ) ;
2019-02-19 10:09:42 +01:00
pssData - > switchCounter + + ;
2017-10-03 21:42:28 +02:00
break ;
case 7 :
2018-12-17 23:00:08 +01:00
LoadCompressedSpriteSheet ( & sSpriteSheet_MoveTypes ) ;
2019-02-19 10:09:42 +01:00
pssData - > switchCounter + + ;
2017-10-03 21:42:28 +02:00
break ;
case 8 :
2019-02-19 10:09:42 +01:00
LoadCompressedSpriteSheet ( & sMoveSelectorSpriteSheet ) ;
pssData - > switchCounter + + ;
2017-10-03 21:42:28 +02:00
break ;
case 9 :
2019-02-02 23:14:04 +01:00
LoadCompressedSpriteSheet ( & sStatusIconsSpriteSheet ) ;
2019-02-19 10:09:42 +01:00
pssData - > switchCounter + + ;
2017-10-03 21:42:28 +02:00
break ;
case 10 :
2019-02-02 23:14:04 +01:00
LoadCompressedSpritePalette ( & sStatusIconsSpritePalette ) ;
2019-02-19 10:09:42 +01:00
pssData - > switchCounter + + ;
2017-10-03 21:42:28 +02:00
break ;
case 11 :
2018-12-17 23:00:08 +01:00
LoadCompressedSpritePalette ( & gUnknown_0861D07C ) ;
2019-02-19 10:09:42 +01:00
pssData - > switchCounter + + ;
2017-10-03 21:42:28 +02:00
break ;
case 12 :
2018-12-19 03:15:59 +01:00
LoadCompressedPalette ( gMoveTypes_Pal , 0x1D0 , 0x60 ) ;
2019-02-19 10:09:42 +01:00
pssData - > switchCounter = 0 ;
2018-08-15 06:56:11 +02:00
return TRUE ;
2017-09-20 21:07:24 +02:00
}
2018-08-15 06:56:11 +02:00
return FALSE ;
2017-09-20 21:07:24 +02:00
}
2018-08-16 00:58:41 +02:00
static void CopyMonToSummaryStruct ( struct Pokemon * mon )
2017-09-20 21:07:24 +02:00
{
2018-08-16 00:58:41 +02:00
if ( ! pssData - > isBoxMon )
2017-09-20 21:07:24 +02:00
{
2018-08-16 00:58:41 +02:00
struct Pokemon * partyMon = pssData - > monList . mons ;
* mon = partyMon [ pssData - > curMonIndex ] ;
2017-09-20 21:07:24 +02:00
}
else
2017-09-22 21:17:59 +02:00
{
2018-08-16 00:58:41 +02:00
struct BoxPokemon * boxMon = pssData - > monList . boxMons ;
BoxMonToMon ( & boxMon [ pssData - > curMonIndex ] , mon ) ;
2017-09-22 21:17:59 +02:00
}
2017-09-20 21:07:24 +02:00
}
2018-08-16 00:58:41 +02:00
static bool8 ExtractMonDataToSummaryStruct ( struct Pokemon * a )
2017-09-20 21:07:24 +02:00
{
u32 i ;
2018-08-16 00:58:41 +02:00
struct PokeSummary * sum = & pssData - > summary ;
2019-02-19 10:09:42 +01:00
switch ( pssData - > switchCounter )
2017-09-20 21:07:24 +02:00
{
2017-10-03 21:42:28 +02:00
case 0 :
sum - > species = GetMonData ( a , MON_DATA_SPECIES ) ;
sum - > species2 = GetMonData ( a , MON_DATA_SPECIES2 ) ;
sum - > exp = GetMonData ( a , MON_DATA_EXP ) ;
sum - > level = GetMonData ( a , MON_DATA_LEVEL ) ;
2017-10-20 22:18:29 +02:00
sum - > altAbility = GetMonData ( a , MON_DATA_ALT_ABILITY ) ;
2017-10-03 21:42:28 +02:00
sum - > item = GetMonData ( a , MON_DATA_HELD_ITEM ) ;
sum - > pid = GetMonData ( a , MON_DATA_PERSONALITY ) ;
2018-12-15 23:58:47 +01:00
sum - > sanity = GetMonData ( a , MON_DATA_SANITY_IS_BAD_EGG ) ;
2018-08-15 10:44:20 +02:00
if ( sum - > sanity )
sum - > isEgg = TRUE ;
2017-10-03 21:42:28 +02:00
else
sum - > isEgg = GetMonData ( a , MON_DATA_IS_EGG ) ;
2018-08-16 22:53:01 +02:00
2017-10-03 21:42:28 +02:00
break ;
case 1 :
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2017-10-03 21:42:28 +02:00
{
sum - > moves [ i ] = GetMonData ( a , MON_DATA_MOVE1 + i ) ;
sum - > pp [ i ] = GetMonData ( a , MON_DATA_PP1 + i ) ;
}
sum - > ppBonuses = GetMonData ( a , MON_DATA_PP_BONUSES ) ;
break ;
case 2 :
2018-12-10 21:36:52 +01:00
if ( pssData - > monList . mons = = gPlayerParty | | pssData - > mode = = PSS_MODE_BOX | | pssData - > unk40EF = = TRUE )
2017-10-03 21:42:28 +02:00
{
sum - > nature = GetNature ( a ) ;
sum - > currentHP = GetMonData ( a , MON_DATA_HP ) ;
sum - > maxHP = GetMonData ( a , MON_DATA_MAX_HP ) ;
sum - > atk = GetMonData ( a , MON_DATA_ATK ) ;
sum - > def = GetMonData ( a , MON_DATA_DEF ) ;
sum - > spatk = GetMonData ( a , MON_DATA_SPATK ) ;
sum - > spdef = GetMonData ( a , MON_DATA_SPDEF ) ;
2017-10-24 03:43:26 +02:00
sum - > speed = GetMonData ( a , MON_DATA_SPEED ) ;
2017-10-03 21:42:28 +02:00
}
else
{
sum - > nature = GetNature ( a ) ;
sum - > currentHP = GetMonData ( a , MON_DATA_HP ) ;
sum - > maxHP = GetMonData ( a , MON_DATA_MAX_HP ) ;
sum - > atk = GetMonData ( a , MON_DATA_ATK2 ) ;
sum - > def = GetMonData ( a , MON_DATA_DEF2 ) ;
sum - > spatk = GetMonData ( a , MON_DATA_SPATK2 ) ;
sum - > spdef = GetMonData ( a , MON_DATA_SPDEF2 ) ;
2017-10-26 20:47:14 +02:00
sum - > speed = GetMonData ( a , MON_DATA_SPEED2 ) ;
2017-10-03 21:42:28 +02:00
}
break ;
case 3 :
GetMonData ( a , MON_DATA_OT_NAME , & sum - > OTName ) ;
ConvertInternationalString ( ( u8 * ) & sum - > OTName , GetMonData ( a , MON_DATA_LANGUAGE ) ) ;
sum - > unk7 = sub_81B205C ( a ) ;
sum - > OTGender = GetMonData ( a , MON_DATA_OT_GENDER ) ;
sum - > OTID = GetMonData ( a , MON_DATA_OT_ID ) ;
sum - > metLocation = GetMonData ( a , MON_DATA_MET_LOCATION ) ;
sum - > metLevel = GetMonData ( a , MON_DATA_MET_LEVEL ) ;
sum - > metGame = GetMonData ( a , MON_DATA_MET_GAME ) ;
sum - > friendship = GetMonData ( a , MON_DATA_FRIENDSHIP ) ;
break ;
default :
2018-08-15 10:44:20 +02:00
sum - > ribbonCount = GetMonData ( a , MON_DATA_RIBBON_COUNT ) ;
2017-10-03 21:42:28 +02:00
return TRUE ;
2017-09-20 21:07:24 +02:00
}
2019-02-19 10:09:42 +01:00
pssData - > switchCounter + + ;
2017-10-03 21:42:28 +02:00
return FALSE ;
2017-09-20 21:07:24 +02:00
}
2018-08-16 00:58:41 +02:00
static void sub_81C0348 ( void )
2017-09-20 21:07:24 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > currPageIndex ! = PSS_PAGE_BATTLE_MOVES & & pssData - > currPageIndex ! = PSS_PAGE_CONTEST_MOVES )
2017-09-20 21:07:24 +02:00
{
sub_81C1DA4 ( 0 , 255 ) ;
sub_81C1EFC ( 0 , 255 , 0 ) ;
}
else
{
2019-02-02 23:14:04 +01:00
DrawContestMoveHearts ( pssData - > summary . moves [ pssData - > firstMoveIndex ] ) ;
2018-08-16 00:58:41 +02:00
sub_81C2194 ( pssData - > bgTilemapBuffers [ PSS_PAGE_BATTLE_MOVES ] [ 0 ] , 3 , 0 ) ;
sub_81C2194 ( pssData - > bgTilemapBuffers [ PSS_PAGE_CONTEST_MOVES ] [ 0 ] , 1 , 0 ) ;
SetBgTilemapBuffer ( 1 , pssData - > bgTilemapBuffers [ PSS_PAGE_CONTEST_MOVES ] [ 0 ] ) ;
SetBgTilemapBuffer ( 2 , pssData - > bgTilemapBuffers [ PSS_PAGE_BATTLE_MOVES ] [ 0 ] ) ;
2017-09-20 21:07:24 +02:00
ChangeBgX ( 2 , 0x10000 , 1 ) ;
2018-08-15 06:56:11 +02:00
ClearWindowTilemap ( 19 ) ;
ClearWindowTilemap ( 13 ) ;
2017-09-20 21:07:24 +02:00
}
2018-08-16 00:58:41 +02:00
if ( pssData - > summary . unk7 = = 0 )
2017-10-03 21:42:28 +02:00
{
2017-09-20 21:07:24 +02:00
sub_81C2074 ( 0 , 0xFF ) ;
2017-10-03 21:42:28 +02:00
}
2017-09-20 21:07:24 +02:00
else
{
2018-08-16 00:58:41 +02:00
if ( pssData - > currPageIndex ! = PSS_PAGE_BATTLE_MOVES & & pssData - > currPageIndex ! = PSS_PAGE_CONTEST_MOVES )
2018-08-15 06:56:11 +02:00
PutWindowTilemap ( 13 ) ;
2017-09-20 21:07:24 +02:00
}
2019-02-19 10:09:42 +01:00
LimitEggSummaryPageDisplay ( ) ;
DrawPokerusCuredSymbol ( & pssData - > currentMon ) ;
2017-09-20 21:07:24 +02:00
}
2018-08-16 00:58:41 +02:00
static void sub_81C0434 ( void )
2017-09-20 21:07:24 +02:00
{
FreeAllWindowBuffers ( ) ;
2018-08-16 00:58:41 +02:00
Free ( pssData ) ;
2017-09-20 21:07:24 +02:00
}
2019-02-04 13:44:09 +01:00
static void BeginCloseSummaryScreen ( u8 taskId )
2017-09-20 21:07:24 +02:00
{
2019-02-04 13:44:09 +01:00
BeginNormalPaletteFade ( 0xFFFFFFFF , 0 , 0 , 16 , RGB_BLACK ) ;
gTasks [ taskId ] . func = CloseSummaryScreen ;
2017-09-20 21:07:24 +02:00
}
2019-02-04 13:44:09 +01:00
static void CloseSummaryScreen ( u8 taskId )
2017-09-20 21:07:24 +02:00
{
2018-08-16 00:58:41 +02:00
if ( sub_81221EC ( ) ! = TRUE & & ! gPaletteFade . active )
2017-09-20 21:07:24 +02:00
{
2018-08-16 00:58:41 +02:00
SetMainCallback2 ( pssData - > callback ) ;
2019-02-19 10:09:42 +01:00
gLastViewedMonIndex = pssData - > curMonIndex ;
2018-08-15 20:47:10 +02:00
SummaryScreen_DestroyUnknownTask ( ) ;
2017-09-20 21:07:24 +02:00
ResetSpriteData ( ) ;
FreeAllSpritePalettes ( ) ;
StopCryAndClearCrySongs ( ) ;
2018-01-10 04:30:54 +01:00
m4aMPlayVolumeControl ( & gMPlayInfo_BGM , 0xFFFF , 0x100 ) ;
2017-10-09 19:32:57 +02:00
if ( gMonSpritesGfxPtr = = 0 )
2017-09-20 21:07:24 +02:00
sub_806F47C ( 0 ) ;
sub_81C0434 ( ) ;
DestroyTask ( taskId ) ;
}
}
2019-02-04 13:44:09 +01:00
static void HandleInput ( u8 taskId )
2017-09-20 21:07:24 +02:00
{
2018-08-16 00:58:41 +02:00
if ( sub_81221EC ( ) ! = TRUE & & ! gPaletteFade . active )
2017-09-20 21:07:24 +02:00
{
if ( gMain . newKeys & DPAD_UP )
2017-10-03 21:42:28 +02:00
{
2019-02-04 13:44:09 +01:00
ChangePokemon ( taskId , - 1 ) ;
2017-10-03 21:42:28 +02:00
}
2017-09-20 21:07:24 +02:00
else if ( gMain . newKeys & DPAD_DOWN )
{
2019-02-04 13:44:09 +01:00
ChangePokemon ( taskId , 1 ) ;
2017-09-20 21:07:24 +02:00
}
else if ( ( gMain . newKeys & DPAD_LEFT ) | | GetLRKeysState ( ) = = 1 )
2017-10-03 21:42:28 +02:00
{
2019-02-04 13:44:09 +01:00
ChangePage ( taskId , - 1 ) ;
2017-10-03 21:42:28 +02:00
}
2017-09-20 21:07:24 +02:00
else if ( ( gMain . newKeys & DPAD_RIGHT ) | | GetLRKeysState ( ) = = 2 )
2017-10-03 21:42:28 +02:00
{
2019-02-04 13:44:09 +01:00
ChangePage ( taskId , 1 ) ;
2017-10-03 21:42:28 +02:00
}
2017-09-20 21:07:24 +02:00
else if ( gMain . newKeys & A_BUTTON )
{
2018-08-16 00:58:41 +02:00
if ( pssData - > currPageIndex ! = PSS_PAGE_SKILLS )
2017-09-20 21:07:24 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > currPageIndex = = PSS_PAGE_INFO )
2017-09-20 21:07:24 +02:00
{
2019-02-19 10:09:42 +01:00
StopPokemonAnimations ( ) ;
2017-10-03 21:42:28 +02:00
PlaySE ( SE_SELECT ) ;
2019-02-04 13:44:09 +01:00
BeginCloseSummaryScreen ( taskId ) ;
2017-09-20 21:07:24 +02:00
}
else
{
2017-10-03 21:42:28 +02:00
PlaySE ( SE_SELECT ) ;
2017-09-20 21:07:24 +02:00
sub_81C0E48 ( taskId ) ;
}
}
}
else if ( gMain . newKeys & B_BUTTON )
{
2019-02-19 10:09:42 +01:00
StopPokemonAnimations ( ) ;
2017-10-03 21:42:28 +02:00
PlaySE ( SE_SELECT ) ;
2019-02-04 13:44:09 +01:00
BeginCloseSummaryScreen ( taskId ) ;
2017-09-20 21:07:24 +02:00
}
}
}
2019-02-04 13:44:09 +01:00
static void ChangePokemon ( u8 taskId , s8 a )
2017-09-20 21:07:24 +02:00
{
s8 r4_2 ;
2017-09-22 21:17:59 +02:00
2019-02-19 10:09:42 +01:00
if ( ! pssData - > lockMonFlag )
2017-09-20 21:07:24 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > isBoxMon = = TRUE )
2017-09-20 21:07:24 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > currPageIndex ! = PSS_PAGE_INFO )
2017-09-20 21:07:24 +02:00
{
2017-09-22 21:17:59 +02:00
if ( a = = 1 )
a = 0 ;
else
a = 2 ;
2017-09-20 21:07:24 +02:00
}
else
2017-09-22 21:17:59 +02:00
{
if ( a = = 1 )
a = 1 ;
else
a = 3 ;
}
2018-08-16 00:58:41 +02:00
r4_2 = sub_80D214C ( pssData - > monList . boxMons , pssData - > curMonIndex , pssData - > maxMonIndex , a ) ;
2017-09-20 21:07:24 +02:00
}
2018-12-20 01:55:51 +01:00
else if ( IsMultiBattle ( ) = = TRUE )
2017-09-20 21:07:24 +02:00
{
r4_2 = sub_81C09B4 ( a ) ;
}
else
2017-09-22 21:17:59 +02:00
{
2017-09-20 21:07:24 +02:00
r4_2 = sub_81C08F8 ( a ) ;
2017-09-22 21:17:59 +02:00
}
2018-12-05 15:31:01 +01:00
if ( r4_2 ! = - 1 )
2017-09-20 21:07:24 +02:00
{
2017-09-22 21:17:59 +02:00
PlaySE ( SE_SELECT ) ;
2018-08-16 00:58:41 +02:00
if ( pssData - > summary . unk7 ! = 0 )
2017-09-20 21:07:24 +02:00
{
2019-02-02 23:14:04 +01:00
SetSpriteInvisibility ( 2 , 1 ) ;
2018-08-15 10:44:20 +02:00
ClearWindowTilemap ( 13 ) ;
2017-09-20 21:07:24 +02:00
schedule_bg_copy_tilemap_to_vram ( 0 ) ;
sub_81C2074 ( 0 , 2 ) ;
}
2018-08-16 00:58:41 +02:00
pssData - > curMonIndex = r4_2 ;
2017-09-20 21:07:24 +02:00
gTasks [ taskId ] . data [ 0 ] = 0 ;
gTasks [ taskId ] . func = sub_81C0704 ;
}
}
2017-09-21 03:25:48 +02:00
}
2018-08-16 00:58:41 +02:00
static void sub_81C0704 ( u8 taskId )
2017-09-21 03:25:48 +02:00
{
s16 * data = gTasks [ taskId ] . data ;
2017-09-23 00:28:18 +02:00
2017-09-21 03:25:48 +02:00
switch ( data [ 0 ] )
{
2017-09-23 00:28:18 +02:00
case 0 :
StopCryAndClearCrySongs ( ) ;
break ;
case 1 :
2018-08-15 20:47:10 +02:00
SummaryScreen_DestroyUnknownTask ( ) ;
2018-08-16 00:58:41 +02:00
DestroySpriteAndFreeResources ( & gSprites [ pssData - > spriteIds [ 0 ] ] ) ;
2017-09-23 00:28:18 +02:00
break ;
case 2 :
2018-08-16 00:58:41 +02:00
DestroySpriteAndFreeResources ( & gSprites [ pssData - > spriteIds [ 1 ] ] ) ;
2017-09-23 00:28:18 +02:00
break ;
case 3 :
2018-08-16 00:58:41 +02:00
CopyMonToSummaryStruct ( & pssData - > currentMon ) ;
2019-02-19 10:09:42 +01:00
pssData - > switchCounter = 0 ;
2017-09-23 00:28:18 +02:00
break ;
case 4 :
2018-08-16 00:58:41 +02:00
if ( ExtractMonDataToSummaryStruct ( & pssData - > currentMon ) = = FALSE )
2017-09-23 00:28:18 +02:00
return ;
break ;
case 5 :
2018-08-16 00:58:41 +02:00
RemoveAndCreateMonMarkingsSprite ( & pssData - > currentMon ) ;
2017-09-23 00:28:18 +02:00
break ;
case 6 :
2018-08-16 00:58:41 +02:00
CreateCaughtBallSprite ( & pssData - > currentMon ) ;
2017-09-23 00:28:18 +02:00
break ;
case 7 :
2018-08-16 00:58:41 +02:00
if ( pssData - > summary . unk7 )
2017-09-23 00:28:18 +02:00
sub_81C2074 ( 10 , - 2 ) ;
2019-02-19 10:09:42 +01:00
DrawPokerusCuredSymbol ( & pssData - > currentMon ) ;
2017-09-23 00:28:18 +02:00
data [ 1 ] = 0 ;
break ;
case 8 :
2019-02-02 23:14:04 +01:00
pssData - > spriteIds [ 0 ] = CreatePokemonSprite ( & pssData - > currentMon , & data [ 1 ] ) ;
2018-12-05 15:31:01 +01:00
if ( pssData - > spriteIds [ 0 ] = = 0xFF )
2017-09-23 00:28:18 +02:00
return ;
2018-08-16 00:58:41 +02:00
gSprites [ pssData - > spriteIds [ 0 ] ] . data [ 2 ] = 1 ;
2019-02-19 10:09:42 +01:00
CheckExperienceProgressBar ( ) ;
2017-09-23 00:28:18 +02:00
data [ 1 ] = 0 ;
break ;
case 9 :
2019-02-02 23:14:04 +01:00
SetTypeIcons ( ) ;
2017-09-23 00:28:18 +02:00
break ;
case 10 :
sub_81C25E8 ( ) ;
break ;
case 11 :
2019-02-04 12:38:44 +01:00
PrintPageSpecificText ( pssData - > currPageIndex ) ;
2019-02-19 10:09:42 +01:00
LimitEggSummaryPageDisplay ( ) ;
2017-09-23 00:28:18 +02:00
break ;
case 12 :
2018-08-16 00:58:41 +02:00
gSprites [ pssData - > spriteIds [ 0 ] ] . data [ 2 ] = 0 ;
2017-09-23 00:28:18 +02:00
break ;
default :
if ( sub_81221EC ( ) = = 0 & & FuncIsActiveTask ( sub_81C20F0 ) = = 0 )
{
data [ 0 ] = 0 ;
2019-02-04 13:44:09 +01:00
gTasks [ taskId ] . func = HandleInput ;
2017-09-23 00:28:18 +02:00
}
return ;
2017-09-21 03:25:48 +02:00
}
2017-09-23 00:28:18 +02:00
data [ 0 ] + + ;
2017-09-22 21:17:59 +02:00
}
2018-08-16 00:58:41 +02:00
static s8 sub_81C08F8 ( s8 a )
2017-09-22 21:17:59 +02:00
{
2018-08-16 00:58:41 +02:00
struct Pokemon * mon = pssData - > monList . mons ;
2017-09-24 02:23:55 +02:00
2018-08-16 00:58:41 +02:00
if ( pssData - > currPageIndex = = PSS_PAGE_INFO )
2017-09-22 21:17:59 +02:00
{
2018-08-16 00:58:41 +02:00
if ( a = = - 1 & & pssData - > curMonIndex = = 0 )
2018-12-05 15:31:01 +01:00
return - 1 ;
2018-08-16 00:58:41 +02:00
else if ( a = = 1 & & pssData - > curMonIndex > = pssData - > maxMonIndex )
2018-12-05 15:31:01 +01:00
return - 1 ;
2018-08-15 20:47:10 +02:00
else
2018-08-16 00:58:41 +02:00
return pssData - > curMonIndex + a ;
2017-09-22 21:17:59 +02:00
}
else
{
2018-08-16 00:58:41 +02:00
s8 index = pssData - > curMonIndex ;
2017-09-24 02:23:55 +02:00
do
2017-09-22 21:17:59 +02:00
{
2017-09-24 02:23:55 +02:00
index + = a ;
2018-08-16 00:58:41 +02:00
if ( index < 0 | | index > pssData - > maxMonIndex )
2018-12-05 15:31:01 +01:00
return - 1 ;
2017-10-20 22:18:29 +02:00
} while ( GetMonData ( & mon [ index ] , MON_DATA_IS_EGG ) ! = 0 ) ;
2017-09-24 02:23:55 +02:00
return index ;
2017-09-22 21:17:59 +02:00
}
}
2018-08-16 00:58:41 +02:00
static s8 sub_81C09B4 ( s8 a )
2017-09-22 21:17:59 +02:00
{
2018-08-16 00:58:41 +02:00
struct Pokemon * mon = pssData - > monList . mons ;
2017-09-22 21:17:59 +02:00
s8 r5 = 0 ;
2017-09-24 02:23:55 +02:00
u8 i ;
for ( i = 0 ; i < 6 ; i + + )
2017-09-22 21:17:59 +02:00
{
2018-08-16 00:58:41 +02:00
if ( gUnknown_0861CC1C [ i ] = = pssData - > curMonIndex )
2017-09-22 21:17:59 +02:00
{
2017-09-24 02:23:55 +02:00
r5 = i ;
break ;
2017-09-22 21:17:59 +02:00
}
}
2017-09-24 02:23:55 +02:00
2018-08-15 06:56:11 +02:00
while ( TRUE )
2017-09-22 21:17:59 +02:00
{
int b ;
2018-08-15 06:56:11 +02:00
const s8 * c = gUnknown_0861CC1C ;
2017-09-24 02:23:55 +02:00
2017-09-22 21:17:59 +02:00
r5 + = a ;
2017-09-24 02:23:55 +02:00
if ( r5 < 0 | | r5 > = 6 )
2018-12-05 15:31:01 +01:00
return - 1 ;
2017-09-24 02:23:55 +02:00
b = c [ r5 ] ;
2017-10-20 22:18:29 +02:00
if ( sub_81C0A50 ( & mon [ b ] ) = = TRUE )
2017-09-24 02:23:55 +02:00
return b ;
2017-09-22 21:17:59 +02:00
}
}
2018-08-16 00:58:41 +02:00
static bool8 sub_81C0A50 ( struct Pokemon * mon )
2017-09-22 21:17:59 +02:00
{
2018-08-16 00:58:41 +02:00
if ( GetMonData ( mon , MON_DATA_SPECIES ) = = SPECIES_NONE )
2017-10-03 21:42:28 +02:00
return FALSE ;
2018-08-16 00:58:41 +02:00
else if ( pssData - > curMonIndex ! = 0 | | GetMonData ( mon , MON_DATA_IS_EGG ) = = 0 )
2017-10-03 21:42:28 +02:00
return TRUE ;
2017-09-22 21:17:59 +02:00
else
2017-10-03 21:42:28 +02:00
return FALSE ;
2017-09-24 02:23:55 +02:00
}
2019-02-04 13:44:09 +01:00
static void ChangePage ( u8 taskId , s8 b )
2017-09-24 02:23:55 +02:00
{
2018-08-16 00:58:41 +02:00
struct PokeSummary * summary = & pssData - > summary ;
2017-09-24 02:23:55 +02:00
s16 * data = gTasks [ taskId ] . data ;
if ( summary - > isEgg )
return ;
2018-08-16 00:58:41 +02:00
else if ( b = = - 1 & & pssData - > currPageIndex = = pssData - > minPageIndex )
2017-09-24 02:23:55 +02:00
return ;
2018-08-16 00:58:41 +02:00
else if ( b = = 1 & & pssData - > currPageIndex = = pssData - > maxPageIndex )
2017-09-24 02:23:55 +02:00
return ;
2018-08-16 22:53:01 +02:00
2017-09-24 02:23:55 +02:00
PlaySE ( SE_SELECT ) ;
2019-02-04 13:44:09 +01:00
ClearPageWindowTilemaps ( pssData - > currPageIndex ) ;
2018-08-16 00:58:41 +02:00
pssData - > currPageIndex + = b ;
2017-09-24 02:23:55 +02:00
data [ 0 ] = 0 ;
if ( b = = 1 )
2019-02-19 10:09:42 +01:00
SetTaskFuncWithFollowupFunc ( taskId , PssScrollRight , gTasks [ taskId ] . func ) ;
2017-09-24 02:23:55 +02:00
else
2019-02-19 10:09:42 +01:00
SetTaskFuncWithFollowupFunc ( taskId , PssScrollLeft , gTasks [ taskId ] . func ) ;
2019-02-04 12:38:44 +01:00
CreateTextPrinterTask ( pssData - > currPageIndex ) ;
2019-02-02 23:14:04 +01:00
HidePageSpecificSprites ( ) ;
2017-09-24 02:23:55 +02:00
}
2019-02-19 10:09:42 +01:00
static void PssScrollRight ( u8 taskId ) // Scroll right
2017-09-24 02:23:55 +02:00
{
s16 * data = gTasks [ taskId ] . data ;
if ( data [ 0 ] = = 0 )
{
2019-02-19 10:09:42 +01:00
if ( pssData - > bgDisplayOrder = = 0 )
2017-09-24 02:23:55 +02:00
{
data [ 1 ] = 1 ;
2018-12-26 13:05:02 +01:00
SetBgAttribute ( 1 , BG_ATTR_PRIORITY , 1 ) ;
SetBgAttribute ( 2 , BG_ATTR_PRIORITY , 2 ) ;
2017-09-24 02:23:55 +02:00
schedule_bg_copy_tilemap_to_vram ( 1 ) ;
}
else
{
data [ 1 ] = 2 ;
2018-12-26 13:05:02 +01:00
SetBgAttribute ( 2 , BG_ATTR_PRIORITY , 1 ) ;
SetBgAttribute ( 1 , BG_ATTR_PRIORITY , 2 ) ;
2017-09-24 02:23:55 +02:00
schedule_bg_copy_tilemap_to_vram ( 2 ) ;
}
ChangeBgX ( data [ 1 ] , 0 , 0 ) ;
2018-08-16 00:58:41 +02:00
SetBgTilemapBuffer ( data [ 1 ] , pssData - > bgTilemapBuffers [ pssData - > currPageIndex ] [ 0 ] ) ;
2017-09-24 02:23:55 +02:00
ShowBg ( 1 ) ;
ShowBg ( 2 ) ;
}
ChangeBgX ( data [ 1 ] , 0x2000 , 1 ) ;
data [ 0 ] + = 32 ;
if ( data [ 0 ] > 0xFF )
2019-02-19 10:09:42 +01:00
gTasks [ taskId ] . func = PssScrollRightEnd ;
2017-09-24 02:23:55 +02:00
}
2019-02-19 10:09:42 +01:00
static void PssScrollRightEnd ( u8 taskId ) // display right
2017-09-24 02:23:55 +02:00
{
s16 * data = gTasks [ taskId ] . data ;
2019-02-19 10:09:42 +01:00
pssData - > bgDisplayOrder ^ = 1 ;
2017-09-24 02:23:55 +02:00
data [ 1 ] = 0 ;
data [ 0 ] = 0 ;
2019-02-19 10:09:42 +01:00
DrawPagination ( ) ;
2019-02-04 13:44:09 +01:00
CreatePageWindowTilemaps ( pssData - > currPageIndex ) ;
2019-02-02 23:14:04 +01:00
SetTypeIcons ( ) ;
2019-02-19 10:09:42 +01:00
CheckExperienceProgressBar ( ) ;
2017-09-24 02:23:55 +02:00
SwitchTaskToFollowupFunc ( taskId ) ;
}
2019-02-19 10:09:42 +01:00
static void PssScrollLeft ( u8 taskId ) // Scroll left
2017-09-24 02:23:55 +02:00
{
s16 * data = gTasks [ taskId ] . data ;
if ( data [ 0 ] = = 0 )
{
2019-02-19 10:09:42 +01:00
if ( pssData - > bgDisplayOrder = = 0 )
2017-09-24 02:23:55 +02:00
data [ 1 ] = 2 ;
else
data [ 1 ] = 1 ;
ChangeBgX ( data [ 1 ] , 0x10000 , 0 ) ;
}
ChangeBgX ( data [ 1 ] , 0x2000 , 2 ) ;
data [ 0 ] + = 32 ;
if ( data [ 0 ] > 0xFF )
2019-02-19 10:09:42 +01:00
gTasks [ taskId ] . func = PssScrollLeftEnd ;
2017-09-24 02:23:55 +02:00
}
2019-02-19 10:09:42 +01:00
static void PssScrollLeftEnd ( u8 taskId ) // display left
2017-09-24 02:23:55 +02:00
{
s16 * data = gTasks [ taskId ] . data ;
2019-02-19 10:09:42 +01:00
if ( pssData - > bgDisplayOrder = = 0 )
2017-09-24 02:23:55 +02:00
{
2018-12-26 13:05:02 +01:00
SetBgAttribute ( 1 , BG_ATTR_PRIORITY , 1 ) ;
SetBgAttribute ( 2 , BG_ATTR_PRIORITY , 2 ) ;
2017-09-24 02:23:55 +02:00
schedule_bg_copy_tilemap_to_vram ( 2 ) ;
}
else
{
2018-12-26 13:05:02 +01:00
SetBgAttribute ( 2 , BG_ATTR_PRIORITY , 1 ) ;
SetBgAttribute ( 1 , BG_ATTR_PRIORITY , 2 ) ;
2017-09-24 02:23:55 +02:00
schedule_bg_copy_tilemap_to_vram ( 1 ) ;
}
2018-08-16 00:58:41 +02:00
if ( pssData - > currPageIndex > 1 )
2017-09-24 02:23:55 +02:00
{
2018-08-16 00:58:41 +02:00
SetBgTilemapBuffer ( data [ 1 ] , ( u8 * ) pssData + ( ( pssData - > currPageIndex < < 12 ) + 0xFFFFF0BC ) ) ;
2017-09-24 02:23:55 +02:00
ChangeBgX ( data [ 1 ] , 0x10000 , 0 ) ;
}
ShowBg ( 1 ) ;
ShowBg ( 2 ) ;
2019-02-19 10:09:42 +01:00
pssData - > bgDisplayOrder ^ = 1 ;
2017-09-24 02:23:55 +02:00
data [ 1 ] = 0 ;
data [ 0 ] = 0 ;
2019-02-19 10:09:42 +01:00
DrawPagination ( ) ;
2019-02-04 13:44:09 +01:00
CreatePageWindowTilemaps ( pssData - > currPageIndex ) ;
2019-02-02 23:14:04 +01:00
SetTypeIcons ( ) ;
2019-02-19 10:09:42 +01:00
CheckExperienceProgressBar ( ) ;
2017-09-24 02:23:55 +02:00
SwitchTaskToFollowupFunc ( taskId ) ;
}
2019-02-19 10:09:42 +01:00
static void CheckExperienceProgressBar ( void )
2017-09-24 02:23:55 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > currPageIndex = = 1 )
2018-09-02 14:47:12 +02:00
DrawExperienceProgressBar ( & pssData - > currentMon ) ;
2017-09-24 02:23:55 +02:00
}
2018-08-16 00:58:41 +02:00
static void sub_81C0E48 ( u8 taskId )
2017-09-24 02:23:55 +02:00
{
u16 move ;
2018-08-16 00:58:41 +02:00
pssData - > firstMoveIndex = 0 ;
move = pssData - > summary . moves [ pssData - > firstMoveIndex ] ;
2017-09-24 02:23:55 +02:00
ClearWindowTilemap ( 0x13 ) ;
2018-08-16 00:58:41 +02:00
if ( gSprites [ pssData - > spriteIds [ 2 ] ] . invisible = = 0 )
2017-09-24 02:23:55 +02:00
ClearWindowTilemap ( 0xD ) ;
sub_81C1DA4 ( 9 , - 3 ) ;
sub_81C1EFC ( 9 , - 3 , move ) ;
2018-08-16 00:58:41 +02:00
if ( ! pssData - > unk40C8 )
2017-09-24 02:23:55 +02:00
{
ClearWindowTilemap ( 5 ) ;
PutWindowTilemap ( 6 ) ;
}
2018-08-16 00:58:41 +02:00
sub_81C2194 ( pssData - > bgTilemapBuffers [ PSS_PAGE_BATTLE_MOVES ] [ 0 ] , 3 , 0 ) ;
sub_81C2194 ( pssData - > bgTilemapBuffers [ PSS_PAGE_CONTEST_MOVES ] [ 0 ] , 1 , 0 ) ;
2018-08-15 20:47:10 +02:00
PrintMoveDetails ( move ) ;
2018-08-15 10:44:20 +02:00
PrintNewMoveDetailsOrCancelText ( ) ;
2019-02-02 23:14:04 +01:00
SetNewMoveTypeIcon ( ) ;
2017-09-24 02:23:55 +02:00
schedule_bg_copy_tilemap_to_vram ( 0 ) ;
schedule_bg_copy_tilemap_to_vram ( 1 ) ;
schedule_bg_copy_tilemap_to_vram ( 2 ) ;
sub_81C4AF8 ( 8 ) ;
2019-02-04 13:44:09 +01:00
gTasks [ taskId ] . func = HandleInput_MoveSelect ;
2017-09-24 02:23:55 +02:00
}
2019-02-04 13:44:09 +01:00
static void HandleInput_MoveSelect ( u8 taskId )
2017-09-24 02:23:55 +02:00
{
u8 id = taskId ;
s16 * data = gTasks [ taskId ] . data ;
2017-10-03 21:42:28 +02:00
2017-09-24 02:23:55 +02:00
if ( sub_81221EC ( ) ! = 1 )
{
if ( gMain . newKeys & DPAD_UP )
{
data [ 0 ] = 4 ;
2018-08-16 00:58:41 +02:00
sub_81C1070 ( data , - 1 , & pssData - > firstMoveIndex ) ;
2017-09-24 02:23:55 +02:00
}
else if ( gMain . newKeys & DPAD_DOWN )
{
data [ 0 ] = 4 ;
2018-08-16 00:58:41 +02:00
sub_81C1070 ( data , 1 , & pssData - > firstMoveIndex ) ;
2017-09-24 02:23:55 +02:00
}
else if ( gMain . newKeys & A_BUTTON )
{
2018-08-16 00:58:41 +02:00
if ( pssData - > unk40C8 = = TRUE
| | ( pssData - > newMove = = MOVE_NONE & & pssData - > firstMoveIndex = = MAX_MON_MOVES ) )
2017-09-24 02:23:55 +02:00
{
PlaySE ( SE_SELECT ) ;
sub_81C11F4 ( taskId ) ;
}
2017-10-03 21:42:28 +02:00
else if ( sub_81C1040 ( ) = = TRUE )
2017-09-24 02:23:55 +02:00
{
PlaySE ( SE_SELECT ) ;
sub_81C129C ( taskId ) ;
}
else
2017-10-03 21:42:28 +02:00
{
PlaySE ( SE_HAZURE ) ;
}
2017-09-24 02:23:55 +02:00
}
else if ( gMain . newKeys & B_BUTTON )
{
PlaySE ( SE_SELECT ) ;
sub_81C11F4 ( id ) ;
}
}
}
2018-08-16 00:58:41 +02:00
static bool8 sub_81C1040 ( void )
2017-09-24 02:23:55 +02:00
{
u8 i ;
2018-12-25 18:50:15 +01:00
for ( i = 1 ; i < MAX_MON_MOVES ; i + + )
2017-09-24 02:23:55 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > summary . moves [ i ] ! = 0 )
2017-10-03 21:42:28 +02:00
return TRUE ;
2017-09-24 02:23:55 +02:00
}
2017-10-03 21:42:28 +02:00
return FALSE ;
2017-09-24 02:23:55 +02:00
}
2018-08-16 00:58:41 +02:00
static void sub_81C1070 ( s16 * a , s8 b , u8 * c )
2017-09-24 02:23:55 +02:00
{
s8 i ;
2017-10-03 21:42:28 +02:00
s8 moveIndex ;
u16 move ;
2017-09-24 02:23:55 +02:00
PlaySE ( SE_SELECT ) ;
2017-10-03 21:42:28 +02:00
moveIndex = * c ;
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2017-09-24 02:23:55 +02:00
{
2017-10-03 21:42:28 +02:00
moveIndex + = b ;
if ( moveIndex > a [ 0 ] )
moveIndex = 0 ;
else if ( moveIndex < 0 )
moveIndex = a [ 0 ] ;
2018-12-25 18:50:15 +01:00
if ( moveIndex = = MAX_MON_MOVES )
2017-10-03 21:42:28 +02:00
{
2018-08-16 00:58:41 +02:00
move = pssData - > newMove ;
2017-09-24 02:23:55 +02:00
break ;
2017-10-03 21:42:28 +02:00
}
2018-08-16 00:58:41 +02:00
move = pssData - > summary . moves [ moveIndex ] ;
2017-10-03 21:42:28 +02:00
if ( move ! = 0 )
break ;
}
2019-02-02 23:14:04 +01:00
DrawContestMoveHearts ( move ) ;
2017-10-03 21:42:28 +02:00
schedule_bg_copy_tilemap_to_vram ( 1 ) ;
schedule_bg_copy_tilemap_to_vram ( 2 ) ;
2018-08-15 20:47:10 +02:00
PrintMoveDetails ( move ) ;
2018-08-16 00:58:41 +02:00
if ( ( * c = = 4 & & pssData - > newMove = = MOVE_NONE ) | | a [ 1 ] = = 1 )
2017-10-03 21:42:28 +02:00
{
ClearWindowTilemap ( 19 ) ;
2018-08-16 00:58:41 +02:00
if ( ! gSprites [ pssData - > spriteIds [ 2 ] ] . invisible )
2017-10-03 21:42:28 +02:00
ClearWindowTilemap ( 13 ) ;
schedule_bg_copy_tilemap_to_vram ( 0 ) ;
sub_81C1DA4 ( 9 , - 3 ) ;
sub_81C1EFC ( 9 , - 3 , move ) ;
}
2018-08-16 00:58:41 +02:00
if ( * c ! = 4 & & moveIndex = = 4 & & pssData - > newMove = = MOVE_NONE )
2017-10-03 21:42:28 +02:00
{
ClearWindowTilemap ( 14 ) ;
ClearWindowTilemap ( 15 ) ;
schedule_bg_copy_tilemap_to_vram ( 0 ) ;
sub_81C1DA4 ( 0 , 3 ) ;
sub_81C1EFC ( 0 , 3 , 0 ) ;
}
* c = moveIndex ;
2018-08-16 00:58:41 +02:00
if ( c = = & pssData - > firstMoveIndex )
2017-10-03 21:42:28 +02:00
sub_81C4D18 ( 8 ) ;
else
sub_81C4D18 ( 18 ) ;
}
2018-08-16 00:58:41 +02:00
static void sub_81C11F4 ( u8 taskId )
2017-10-03 21:42:28 +02:00
{
sub_81C4C60 ( 8 ) ;
ClearWindowTilemap ( 6 ) ;
PutWindowTilemap ( 5 ) ;
2018-08-15 20:47:10 +02:00
PrintMoveDetails ( 0 ) ;
2018-08-16 00:58:41 +02:00
sub_81C2194 ( pssData - > bgTilemapBuffers [ PSS_PAGE_BATTLE_MOVES ] [ 0 ] , 3 , 1 ) ;
sub_81C2194 ( pssData - > bgTilemapBuffers [ PSS_PAGE_CONTEST_MOVES ] [ 0 ] , 1 , 1 ) ;
2017-10-03 21:42:28 +02:00
sub_81C4064 ( ) ;
2018-08-16 00:58:41 +02:00
if ( pssData - > firstMoveIndex ! = MAX_MON_MOVES )
2017-10-03 21:42:28 +02:00
{
ClearWindowTilemap ( 14 ) ;
ClearWindowTilemap ( 15 ) ;
sub_81C1DA4 ( 0 , 3 ) ;
sub_81C1EFC ( 0 , 3 , 0 ) ;
2017-09-24 02:23:55 +02:00
}
2017-10-03 21:42:28 +02:00
schedule_bg_copy_tilemap_to_vram ( 0 ) ;
schedule_bg_copy_tilemap_to_vram ( 1 ) ;
schedule_bg_copy_tilemap_to_vram ( 2 ) ;
2019-02-04 13:44:09 +01:00
gTasks [ taskId ] . func = HandleInput ;
2017-10-03 21:42:28 +02:00
}
2018-08-16 00:58:41 +02:00
static void sub_81C129C ( u8 taskId )
2017-10-03 21:42:28 +02:00
{
2018-08-16 00:58:41 +02:00
pssData - > secondMoveIndex = pssData - > firstMoveIndex ;
2017-10-03 21:42:28 +02:00
sub_81C4C84 ( 1 ) ;
sub_81C4AF8 ( 18 ) ;
gTasks [ taskId ] . func = sub_81C12E4 ;
}
2018-08-16 00:58:41 +02:00
static void sub_81C12E4 ( u8 taskId )
2017-10-03 21:42:28 +02:00
{
s16 * data = gTasks [ taskId ] . data ;
2018-08-15 10:44:20 +02:00
if ( sub_81221EC ( ) ! = TRUE )
2017-10-03 21:42:28 +02:00
{
if ( gMain . newKeys & DPAD_UP )
{
data [ 0 ] = 3 ;
2018-08-16 00:58:41 +02:00
sub_81C1070 ( & data [ 0 ] , - 1 , & pssData - > secondMoveIndex ) ;
2017-10-03 21:42:28 +02:00
}
else if ( gMain . newKeys & DPAD_DOWN )
{
data [ 0 ] = 3 ;
2018-08-16 00:58:41 +02:00
sub_81C1070 ( & data [ 0 ] , 1 , & pssData - > secondMoveIndex ) ;
2017-10-03 21:42:28 +02:00
}
else if ( gMain . newKeys & A_BUTTON )
{
2018-08-16 00:58:41 +02:00
if ( pssData - > firstMoveIndex = = pssData - > secondMoveIndex )
2017-10-03 21:42:28 +02:00
{
sub_81C13B0 ( taskId , 0 ) ;
}
else
2018-08-15 10:44:20 +02:00
{
2017-10-03 21:42:28 +02:00
sub_81C13B0 ( taskId , 1 ) ;
2018-08-15 10:44:20 +02:00
}
2017-10-03 21:42:28 +02:00
}
else if ( gMain . newKeys & B_BUTTON )
2018-08-15 10:44:20 +02:00
{
sub_81C13B0 ( taskId , 0 ) ;
}
2017-10-03 21:42:28 +02:00
}
}
2018-08-16 00:58:41 +02:00
static void sub_81C13B0 ( u8 taskId , bool8 b )
2017-10-03 21:42:28 +02:00
{
u16 move ;
2018-08-15 10:44:20 +02:00
2017-10-03 21:42:28 +02:00
PlaySE ( SE_SELECT ) ;
sub_81C4C84 ( 0 ) ;
sub_81C4C60 ( 18 ) ;
2018-08-15 10:44:20 +02:00
if ( b = = TRUE )
2017-10-03 21:42:28 +02:00
{
2018-08-16 00:58:41 +02:00
if ( ! pssData - > isBoxMon )
2017-10-03 21:42:28 +02:00
{
2018-08-16 00:58:41 +02:00
struct Pokemon * why = pssData - > monList . mons ;
SwapMonMoves ( & why [ pssData - > curMonIndex ] , pssData - > firstMoveIndex , pssData - > secondMoveIndex ) ;
2017-10-03 21:42:28 +02:00
}
else
{
2018-08-16 00:58:41 +02:00
struct BoxPokemon * why = pssData - > monList . boxMons ;
SwapBoxMonMoves ( & why [ pssData - > curMonIndex ] , pssData - > firstMoveIndex , pssData - > secondMoveIndex ) ;
2017-10-03 21:42:28 +02:00
}
2018-08-16 00:58:41 +02:00
CopyMonToSummaryStruct ( & pssData - > currentMon ) ;
sub_81C40A0 ( pssData - > firstMoveIndex , pssData - > secondMoveIndex ) ;
sub_81C4568 ( pssData - > firstMoveIndex , pssData - > secondMoveIndex ) ;
pssData - > firstMoveIndex = pssData - > secondMoveIndex ;
2017-10-03 21:42:28 +02:00
}
2018-08-15 10:44:20 +02:00
2018-08-16 00:58:41 +02:00
move = pssData - > summary . moves [ pssData - > firstMoveIndex ] ;
2018-08-15 20:47:10 +02:00
PrintMoveDetails ( move ) ;
2019-02-02 23:14:04 +01:00
DrawContestMoveHearts ( move ) ;
2017-10-03 21:42:28 +02:00
schedule_bg_copy_tilemap_to_vram ( 1 ) ;
schedule_bg_copy_tilemap_to_vram ( 2 ) ;
2019-02-04 13:44:09 +01:00
gTasks [ taskId ] . func = HandleInput_MoveSelect ;
2017-10-03 21:42:28 +02:00
}
2018-08-16 00:58:41 +02:00
static void SwapMonMoves ( struct Pokemon * mon , u8 moveIndex1 , u8 moveIndex2 )
{
struct PokeSummary * summary = & pssData - > summary ;
u16 move1 = summary - > moves [ moveIndex1 ] ;
u16 move2 = summary - > moves [ moveIndex2 ] ;
u8 move1pp = summary - > pp [ moveIndex1 ] ;
u8 move2pp = summary - > pp [ moveIndex2 ] ;
u8 ppBonuses = summary - > ppBonuses ;
// Calculate PP bonuses
2019-02-19 10:09:42 +01:00
u8 ppUpMask1 = gPPUpGetMask [ moveIndex1 ] ;
2018-08-16 00:58:41 +02:00
u8 ppBonusMove1 = ( ppBonuses & ppUpMask1 ) > > ( moveIndex1 * 2 ) ;
2019-02-19 10:09:42 +01:00
u8 ppUpMask2 = gPPUpGetMask [ moveIndex2 ] ;
2018-08-16 00:58:41 +02:00
u8 ppBonusMove2 = ( ppBonuses & ppUpMask2 ) > > ( moveIndex2 * 2 ) ;
ppBonuses & = ~ ppUpMask1 ;
ppBonuses & = ~ ppUpMask2 ;
ppBonuses | = ( ppBonusMove1 < < ( moveIndex2 * 2 ) ) + ( ppBonusMove2 < < ( moveIndex1 * 2 ) ) ;
// Swap the moves
SetMonData ( mon , MON_DATA_MOVE1 + moveIndex1 , & move2 ) ;
SetMonData ( mon , MON_DATA_MOVE1 + moveIndex2 , & move1 ) ;
SetMonData ( mon , MON_DATA_PP1 + moveIndex1 , & move2pp ) ;
SetMonData ( mon , MON_DATA_PP1 + moveIndex2 , & move1pp ) ;
SetMonData ( mon , MON_DATA_PP_BONUSES , & ppBonuses ) ;
2018-08-16 22:53:01 +02:00
2018-08-16 00:58:41 +02:00
summary - > moves [ moveIndex1 ] = move2 ;
summary - > moves [ moveIndex2 ] = move1 ;
summary - > pp [ moveIndex1 ] = move2pp ;
summary - > pp [ moveIndex2 ] = move1pp ;
summary - > ppBonuses = ppBonuses ;
}
static void SwapBoxMonMoves ( struct BoxPokemon * mon , u8 moveIndex1 , u8 moveIndex2 )
{
struct PokeSummary * summary = & pssData - > summary ;
u16 move1 = summary - > moves [ moveIndex1 ] ;
u16 move2 = summary - > moves [ moveIndex2 ] ;
u8 move1pp = summary - > pp [ moveIndex1 ] ;
u8 move2pp = summary - > pp [ moveIndex2 ] ;
u8 ppBonuses = summary - > ppBonuses ;
2017-10-03 21:42:28 +02:00
2018-08-16 00:58:41 +02:00
// Calculate PP bonuses
2019-02-19 10:09:42 +01:00
u8 ppUpMask1 = gPPUpGetMask [ moveIndex1 ] ;
2018-08-16 00:58:41 +02:00
u8 ppBonusMove1 = ( ppBonuses & ppUpMask1 ) > > ( moveIndex1 * 2 ) ;
2019-02-19 10:09:42 +01:00
u8 ppUpMask2 = gPPUpGetMask [ moveIndex2 ] ;
2018-08-16 00:58:41 +02:00
u8 ppBonusMove2 = ( ppBonuses & ppUpMask2 ) > > ( moveIndex2 * 2 ) ;
ppBonuses & = ~ ppUpMask1 ;
ppBonuses & = ~ ppUpMask2 ;
ppBonuses | = ( ppBonusMove1 < < ( moveIndex2 * 2 ) ) + ( ppBonusMove2 < < ( moveIndex1 * 2 ) ) ;
2017-10-03 21:42:28 +02:00
2018-08-16 00:58:41 +02:00
// Swap the moves
SetBoxMonData ( mon , MON_DATA_MOVE1 + moveIndex1 , & move2 ) ;
SetBoxMonData ( mon , MON_DATA_MOVE1 + moveIndex2 , & move1 ) ;
SetBoxMonData ( mon , MON_DATA_PP1 + moveIndex1 , & move2pp ) ;
SetBoxMonData ( mon , MON_DATA_PP1 + moveIndex2 , & move1pp ) ;
SetBoxMonData ( mon , MON_DATA_PP_BONUSES , & ppBonuses ) ;
2018-08-16 22:53:01 +02:00
2018-08-16 00:58:41 +02:00
summary - > moves [ moveIndex1 ] = move2 ;
summary - > moves [ moveIndex2 ] = move1 ;
summary - > pp [ moveIndex1 ] = move2pp ;
summary - > pp [ moveIndex2 ] = move1pp ;
summary - > ppBonuses = ppBonuses ;
}
static void sub_81C171C ( u8 taskId )
2017-10-09 19:17:13 +02:00
{
2019-02-02 23:14:04 +01:00
SetNewMoveTypeIcon ( ) ;
2017-10-09 19:17:13 +02:00
sub_81C4AF8 ( 8 ) ;
2019-02-19 10:09:42 +01:00
gTasks [ taskId ] . func = HandleReplaceMoveInput ;
2017-10-09 19:17:13 +02:00
}
2019-02-19 10:09:42 +01:00
static void HandleReplaceMoveInput ( u8 taskId )
2017-10-09 19:17:13 +02:00
{
s16 * data = gTasks [ taskId ] . data ;
2017-11-14 20:23:25 +01:00
2017-10-09 19:17:13 +02:00
if ( sub_81221EC ( ) ! = 1 )
{
if ( gPaletteFade . active ! = 1 )
{
if ( gMain . newKeys & DPAD_UP )
{
data [ 0 ] = 4 ;
2018-08-16 00:58:41 +02:00
sub_81C1070 ( data , - 1 , & pssData - > firstMoveIndex ) ;
2017-10-09 19:17:13 +02:00
}
else if ( gMain . newKeys & DPAD_DOWN )
{
data [ 0 ] = 4 ;
2018-08-16 00:58:41 +02:00
sub_81C1070 ( data , 1 , & pssData - > firstMoveIndex ) ;
2017-10-09 19:17:13 +02:00
}
else if ( gMain . newKeys & DPAD_LEFT | | GetLRKeysState ( ) = = 1 )
{
2019-02-04 13:44:09 +01:00
ChangePage ( taskId , - 1 ) ;
2017-10-09 19:17:13 +02:00
}
else if ( gMain . newKeys & DPAD_RIGHT | | GetLRKeysState ( ) = = 2 )
{
2019-02-04 13:44:09 +01:00
ChangePage ( taskId , 1 ) ;
2017-10-09 19:17:13 +02:00
}
else if ( gMain . newKeys & A_BUTTON )
{
2019-02-19 10:09:42 +01:00
if ( CanReplaceMove ( ) = = TRUE )
2017-10-09 19:17:13 +02:00
{
2019-02-19 10:09:42 +01:00
StopPokemonAnimations ( ) ;
2017-10-09 19:17:13 +02:00
PlaySE ( SE_SELECT ) ;
2019-02-19 10:09:42 +01:00
sUnknown_0203CF21 = pssData - > firstMoveIndex ;
gSpecialVar_0x8005 = sUnknown_0203CF21 ;
2019-02-04 13:44:09 +01:00
BeginCloseSummaryScreen ( taskId ) ;
2017-10-09 19:17:13 +02:00
}
else
{
2018-05-11 07:33:32 +02:00
PlaySE ( SE_HAZURE ) ;
2019-02-19 10:09:42 +01:00
ShowHMMovesCantBeForgottenWindow ( taskId ) ;
2017-10-09 19:17:13 +02:00
}
}
else if ( gMain . newKeys & B_BUTTON )
{
u32 var1 ;
2019-02-19 10:09:42 +01:00
StopPokemonAnimations ( ) ;
2017-10-09 19:17:13 +02:00
PlaySE ( SE_SELECT ) ;
2019-02-19 10:09:42 +01:00
sUnknown_0203CF21 = 4 ;
2017-10-09 19:17:13 +02:00
gSpecialVar_0x8005 = 4 ;
2019-02-04 13:44:09 +01:00
BeginCloseSummaryScreen ( taskId ) ;
2017-11-14 20:23:25 +01:00
}
2017-10-09 19:17:13 +02:00
}
}
}
2019-02-19 10:09:42 +01:00
static bool8 CanReplaceMove ( void )
2017-10-09 19:17:13 +02:00
{
2018-12-24 21:59:05 +01:00
if ( pssData - > firstMoveIndex = = MAX_MON_MOVES | | pssData - > newMove = = MOVE_NONE | | IsMoveHm ( pssData - > summary . moves [ pssData - > firstMoveIndex ] ) ! = 1 )
2017-10-22 21:01:34 +02:00
return TRUE ;
2017-10-09 19:17:13 +02:00
else
2017-10-22 21:01:34 +02:00
return FALSE ;
2017-10-09 19:17:13 +02:00
}
2019-02-19 10:09:42 +01:00
static void ShowHMMovesCantBeForgottenWindow ( u8 taskId )
2017-10-09 19:17:13 +02:00
{
ClearWindowTilemap ( 14 ) ;
ClearWindowTilemap ( 15 ) ;
schedule_bg_copy_tilemap_to_vram ( 0 ) ;
sub_81C1DA4 ( 0 , 3 ) ;
sub_81C1EFC ( 0 , 3 , 0 ) ;
2018-08-16 00:58:41 +02:00
PrintHMMovesCantBeForgotten ( ) ;
2019-02-19 10:09:42 +01:00
gTasks [ taskId ] . func = HandleHMMovesCantBeForgottenInput ;
2017-10-09 19:17:13 +02:00
}
2019-02-19 10:09:42 +01:00
// This redraws the power/accuracy window when the player scrolls out of the "HM Moves can't be forgotten" message
static void HandleHMMovesCantBeForgottenInput ( u8 taskId )
2017-10-09 19:17:13 +02:00
{
s16 * data = gTasks [ taskId ] . data ;
u16 move ;
if ( FuncIsActiveTask ( sub_81C1E20 ) ! = 1 )
{
if ( gMain . newKeys & DPAD_UP )
{
data [ 1 ] = 1 ;
data [ 0 ] = 4 ;
2018-08-16 00:58:41 +02:00
sub_81C1070 ( & data [ 0 ] , - 1 , & pssData - > firstMoveIndex ) ;
2017-10-09 19:17:13 +02:00
data [ 1 ] = 0 ;
2019-02-19 10:09:42 +01:00
gTasks [ taskId ] . func = HandleReplaceMoveInput ;
2017-10-09 19:17:13 +02:00
}
else if ( gMain . newKeys & DPAD_DOWN )
{
data [ 1 ] = 1 ;
data [ 0 ] = 4 ;
2018-08-16 00:58:41 +02:00
sub_81C1070 ( & data [ 0 ] , 1 , & pssData - > firstMoveIndex ) ;
2017-10-09 19:17:13 +02:00
data [ 1 ] = 0 ;
2019-02-19 10:09:42 +01:00
gTasks [ taskId ] . func = HandleReplaceMoveInput ;
2017-10-09 19:17:13 +02:00
}
else if ( gMain . newKeys & DPAD_LEFT | | GetLRKeysState ( ) = = 1 )
{
2018-08-16 00:58:41 +02:00
if ( pssData - > currPageIndex ! = 2 )
2017-10-09 19:17:13 +02:00
{
ClearWindowTilemap ( 19 ) ;
2018-08-16 00:58:41 +02:00
if ( ! gSprites [ pssData - > spriteIds [ 2 ] ] . invisible )
2017-10-09 19:17:13 +02:00
ClearWindowTilemap ( 13 ) ;
2018-08-16 00:58:41 +02:00
move = pssData - > summary . moves [ pssData - > firstMoveIndex ] ;
2019-02-19 10:09:42 +01:00
gTasks [ taskId ] . func = HandleReplaceMoveInput ;
2019-02-04 13:44:09 +01:00
ChangePage ( taskId , - 1 ) ;
2017-10-09 19:17:13 +02:00
sub_81C1DA4 ( 9 , - 2 ) ;
sub_81C1EFC ( 9 , - 2 , move ) ;
}
}
else if ( gMain . newKeys & DPAD_RIGHT | | GetLRKeysState ( ) = = 2 )
{
2018-08-16 00:58:41 +02:00
if ( pssData - > currPageIndex ! = 3 )
2017-10-09 19:17:13 +02:00
{
ClearWindowTilemap ( 19 ) ;
2018-08-16 00:58:41 +02:00
if ( ! gSprites [ pssData - > spriteIds [ 2 ] ] . invisible )
2017-10-09 19:17:13 +02:00
ClearWindowTilemap ( 13 ) ;
2018-08-16 00:58:41 +02:00
move = pssData - > summary . moves [ pssData - > firstMoveIndex ] ;
2019-02-19 10:09:42 +01:00
gTasks [ taskId ] . func = HandleReplaceMoveInput ;
2019-02-04 13:44:09 +01:00
ChangePage ( taskId , 1 ) ;
2017-10-09 19:17:13 +02:00
sub_81C1DA4 ( 9 , - 2 ) ;
sub_81C1EFC ( 9 , - 2 , move ) ;
}
}
else if ( gMain . newKeys & ( A_BUTTON | B_BUTTON ) )
{
ClearWindowTilemap ( 19 ) ;
2018-08-16 00:58:41 +02:00
if ( ! gSprites [ pssData - > spriteIds [ 2 ] ] . invisible )
2017-10-09 19:17:13 +02:00
ClearWindowTilemap ( 13 ) ;
2018-08-16 00:58:41 +02:00
move = pssData - > summary . moves [ pssData - > firstMoveIndex ] ;
2018-08-15 20:47:10 +02:00
PrintMoveDetails ( move ) ;
2017-10-09 19:17:13 +02:00
schedule_bg_copy_tilemap_to_vram ( 0 ) ;
sub_81C1DA4 ( 9 , - 3 ) ;
sub_81C1EFC ( 9 , - 3 , move ) ;
2019-02-19 10:09:42 +01:00
gTasks [ taskId ] . func = HandleReplaceMoveInput ;
2017-10-09 19:17:13 +02:00
}
}
}
2018-08-15 06:56:11 +02:00
u8 sub_81C1B94 ( void )
2017-10-09 19:17:13 +02:00
{
2019-02-19 10:09:42 +01:00
return sUnknown_0203CF21 ;
2017-10-09 19:17:13 +02:00
}
2019-02-19 10:09:42 +01:00
static void DrawPagination ( void ) // Updates the pagination dots at the top of the summary screen
2017-10-09 19:17:13 +02:00
{
u16 * alloced = Alloc ( 32 ) ;
u8 i ;
2018-08-16 00:58:41 +02:00
2017-10-09 19:17:13 +02:00
for ( i = 0 ; i < 4 ; i + + )
{
2018-08-16 00:58:41 +02:00
u8 j = i * 2 ;
if ( i < pssData - > minPageIndex )
2017-10-09 19:17:13 +02:00
{
2018-08-16 00:58:41 +02:00
alloced [ j + 0 ] = 0x40 ;
alloced [ j + 1 ] = 0x40 ;
alloced [ j + 8 ] = 0x50 ;
alloced [ j + 9 ] = 0x50 ;
2017-10-09 19:17:13 +02:00
}
2018-08-16 00:58:41 +02:00
else if ( i > pssData - > maxPageIndex )
2017-10-09 19:17:13 +02:00
{
2018-08-16 00:58:41 +02:00
alloced [ j + 0 ] = 0x4A ;
alloced [ j + 1 ] = 0x4A ;
alloced [ j + 8 ] = 0x5A ;
alloced [ j + 9 ] = 0x5A ;
2017-10-09 19:17:13 +02:00
}
2018-08-16 00:58:41 +02:00
else if ( i < pssData - > currPageIndex )
2017-10-09 19:17:13 +02:00
{
2018-08-16 00:58:41 +02:00
alloced [ j + 0 ] = 0x46 ;
alloced [ j + 1 ] = 0x47 ;
alloced [ j + 8 ] = 0x56 ;
alloced [ j + 9 ] = 0x57 ;
2017-10-09 19:17:13 +02:00
}
2018-08-16 00:58:41 +02:00
else if ( i = = pssData - > currPageIndex )
2017-10-09 19:17:13 +02:00
{
2018-08-16 00:58:41 +02:00
if ( i ! = pssData - > maxPageIndex )
2017-10-09 19:17:13 +02:00
{
2018-08-16 00:58:41 +02:00
alloced [ j + 0 ] = 0x41 ;
alloced [ j + 1 ] = 0x42 ;
alloced [ j + 8 ] = 0x51 ;
alloced [ j + 9 ] = 0x52 ;
2017-10-09 19:17:13 +02:00
}
else
{
2018-08-16 00:58:41 +02:00
alloced [ j + 0 ] = 0x4B ;
alloced [ j + 1 ] = 0x4C ;
alloced [ j + 8 ] = 0x5B ;
alloced [ j + 9 ] = 0x5C ;
2017-10-09 19:17:13 +02:00
}
}
2018-08-16 00:58:41 +02:00
else if ( i ! = pssData - > maxPageIndex )
2017-10-09 19:17:13 +02:00
{
2018-08-16 00:58:41 +02:00
alloced [ j + 0 ] = 0x43 ;
alloced [ j + 1 ] = 0x44 ;
alloced [ j + 8 ] = 0x53 ;
alloced [ j + 9 ] = 0x54 ;
2017-10-09 19:17:13 +02:00
}
else
{
2018-08-16 00:58:41 +02:00
alloced [ j + 0 ] = 0x48 ;
alloced [ j + 1 ] = 0x49 ;
alloced [ j + 8 ] = 0x58 ;
alloced [ j + 9 ] = 0x59 ;
2017-10-09 19:17:13 +02:00
}
}
CopyToBgTilemapBufferRect_ChangePalette ( 3 , alloced , 11 , 0 , 8 , 2 , 16 ) ;
schedule_bg_copy_tilemap_to_vram ( 3 ) ;
Free ( alloced ) ;
}
2018-08-16 00:58:41 +02:00
static void sub_81C1CB0 ( const struct UnkStruct_61CC04 * unkStruct , u16 * dest , u8 c , bool8 d )
2017-10-09 19:17:13 +02:00
{
2018-08-15 06:56:11 +02:00
u16 i ;
u16 * alloced = Alloc ( unkStruct - > field_6 * 2 * unkStruct - > field_7 ) ;
CpuFill16 ( unkStruct - > field_4 , alloced , unkStruct - > field_6 * 2 * unkStruct - > field_7 ) ;
if ( unkStruct - > field_6 ! = c )
2017-10-09 19:17:13 +02:00
{
if ( ! d )
{
2018-08-15 06:56:11 +02:00
for ( i = 0 ; i < unkStruct - > field_7 ; i + + )
2017-10-09 19:17:13 +02:00
{
2018-08-15 06:56:11 +02:00
CpuCopy16 ( & unkStruct - > ptr [ c + unkStruct - > field_6 * i ] , & alloced [ unkStruct - > field_6 * i ] , ( unkStruct - > field_6 - c ) * 2 ) ;
2017-10-09 19:17:13 +02:00
}
}
else
{
2018-08-15 06:56:11 +02:00
for ( i = 0 ; i < unkStruct - > field_7 ; i + + )
2017-10-09 19:17:13 +02:00
{
2018-08-15 06:56:11 +02:00
CpuCopy16 ( & unkStruct - > ptr [ unkStruct - > field_6 * i ] , & alloced [ c + unkStruct - > field_6 * i ] , ( unkStruct - > field_6 - c ) * 2 ) ;
2017-10-09 19:17:13 +02:00
}
}
}
2018-08-15 06:56:11 +02:00
for ( i = 0 ; i < unkStruct - > field_7 ; i + + )
2017-10-09 19:17:13 +02:00
{
2018-08-15 06:56:11 +02:00
CpuCopy16 ( & alloced [ unkStruct - > field_6 * i ] , & dest [ ( unkStruct - > field_9 + i ) * 32 + unkStruct - > field_8 ] , unkStruct - > field_6 * 2 ) ;
2017-10-09 19:17:13 +02:00
}
Free ( alloced ) ;
}
2018-08-16 00:58:41 +02:00
static void sub_81C1DA4 ( u16 a , s16 b )
2017-10-09 19:17:13 +02:00
{
2019-02-19 10:09:42 +01:00
if ( b > sUnknown_0861CC04 . field_6 )
b = sUnknown_0861CC04 . field_6 ;
if ( b = = 0 | | b = = sUnknown_0861CC04 . field_6 )
2017-10-09 19:17:13 +02:00
{
2019-02-19 10:09:42 +01:00
sub_81C1CB0 ( & sUnknown_0861CC04 , pssData - > bgTilemapBuffers [ PSS_PAGE_BATTLE_MOVES ] [ 0 ] , b , 1 ) ;
2017-10-09 19:17:13 +02:00
}
else
{
u8 taskId = FindTaskIdByFunc ( sub_81C1E20 ) ;
2018-12-05 15:31:01 +01:00
if ( taskId = = 0xFF )
2017-10-09 19:17:13 +02:00
{
taskId = CreateTask ( sub_81C1E20 , 8 ) ;
}
gTasks [ taskId ] . data [ 0 ] = b ;
gTasks [ taskId ] . data [ 1 ] = a ;
}
}
2018-08-16 00:58:41 +02:00
static void sub_81C1E20 ( u8 taskId )
2017-10-09 19:17:13 +02:00
{
s16 * data = gTasks [ taskId ] . data ;
data [ 1 ] + = data [ 0 ] ;
if ( data [ 1 ] < 0 )
{
data [ 1 ] = 0 ;
}
2019-02-19 10:09:42 +01:00
else if ( data [ 1 ] > sUnknown_0861CC04 . field_6 )
2017-10-09 19:17:13 +02:00
{
2019-02-19 10:09:42 +01:00
data [ 1 ] = sUnknown_0861CC04 . field_6 ;
2017-10-09 19:17:13 +02:00
}
2019-02-19 10:09:42 +01:00
sub_81C1CB0 ( & sUnknown_0861CC04 , pssData - > bgTilemapBuffers [ PSS_PAGE_BATTLE_MOVES ] [ 0 ] , data [ 1 ] , 1 ) ;
if ( data [ 1 ] < = 0 | | data [ 1 ] > = sUnknown_0861CC04 . field_6 )
2017-10-09 19:17:13 +02:00
{
if ( data [ 0 ] < 0 )
{
2018-08-16 00:58:41 +02:00
if ( pssData - > currPageIndex = = 2 )
2017-10-09 19:17:13 +02:00
PutWindowTilemap ( 14 ) ;
}
else
{
2018-08-16 00:58:41 +02:00
if ( ! gSprites [ pssData - > spriteIds [ 2 ] ] . invisible )
2017-10-09 19:17:13 +02:00
PutWindowTilemap ( 13 ) ;
PutWindowTilemap ( 19 ) ;
}
schedule_bg_copy_tilemap_to_vram ( 0 ) ;
DestroyTask ( taskId ) ;
}
schedule_bg_copy_tilemap_to_vram ( 1 ) ;
schedule_bg_copy_tilemap_to_vram ( 2 ) ;
}
2018-08-16 00:58:41 +02:00
static void sub_81C1EFC ( u16 a , s16 b , u16 move )
2017-10-09 19:17:13 +02:00
{
2019-02-19 10:09:42 +01:00
if ( b > sUnknown_0861CC10 . field_6 )
b = sUnknown_0861CC10 . field_6 ;
if ( b = = 0 | | b = = sUnknown_0861CC10 . field_6 )
sub_81C1CB0 ( & sUnknown_0861CC10 , pssData - > bgTilemapBuffers [ PSS_PAGE_CONTEST_MOVES ] [ 0 ] , b , 1 ) ;
2017-10-09 19:17:13 +02:00
else
{
u8 taskId = FindTaskIdByFunc ( sub_81C1F80 ) ;
2018-12-05 15:31:01 +01:00
if ( taskId = = 0xFF )
2017-10-09 19:17:13 +02:00
taskId = CreateTask ( sub_81C1F80 , 8 ) ;
gTasks [ taskId ] . data [ 0 ] = b ;
gTasks [ taskId ] . data [ 1 ] = a ;
gTasks [ taskId ] . data [ 2 ] = move ;
}
}
2018-08-16 00:58:41 +02:00
static void sub_81C1F80 ( u8 taskId )
2017-10-09 19:17:13 +02:00
{
s16 * data = gTasks [ taskId ] . data ;
data [ 1 ] + = data [ 0 ] ;
if ( data [ 1 ] < 0 )
{
data [ 1 ] = 0 ;
}
2019-02-19 10:09:42 +01:00
else if ( data [ 1 ] > sUnknown_0861CC10 . field_6 )
2017-10-09 19:17:13 +02:00
{
2019-02-19 10:09:42 +01:00
data [ 1 ] = sUnknown_0861CC10 . field_6 ;
2017-10-09 19:17:13 +02:00
}
2019-02-19 10:09:42 +01:00
sub_81C1CB0 ( & sUnknown_0861CC10 , pssData - > bgTilemapBuffers [ PSS_PAGE_CONTEST_MOVES ] [ 0 ] , data [ 1 ] , 1 ) ;
if ( data [ 1 ] < = 0 | | data [ 1 ] > = sUnknown_0861CC10 . field_6 )
2017-10-09 19:17:13 +02:00
{
if ( data [ 0 ] < 0 )
{
2019-02-19 10:09:42 +01:00
if ( pssData - > currPageIndex = = 3 & & FuncIsActiveTask ( PssScrollRight ) = = 0 )
2017-10-09 19:17:13 +02:00
PutWindowTilemap ( 15 ) ;
2019-02-02 23:14:04 +01:00
DrawContestMoveHearts ( data [ 2 ] ) ;
2017-10-09 19:17:13 +02:00
}
2017-11-14 20:23:25 +01:00
else
2017-10-09 19:17:13 +02:00
{
2018-08-16 00:58:41 +02:00
if ( ! gSprites [ pssData - > spriteIds [ 2 ] ] . invisible )
2017-10-09 19:17:13 +02:00
{
PutWindowTilemap ( 13 ) ;
}
PutWindowTilemap ( 19 ) ;
}
schedule_bg_copy_tilemap_to_vram ( 0 ) ;
DestroyTask ( taskId ) ;
}
schedule_bg_copy_tilemap_to_vram ( 1 ) ;
schedule_bg_copy_tilemap_to_vram ( 2 ) ;
}
2018-08-16 00:58:41 +02:00
static void sub_81C2074 ( u16 a , s16 b )
2017-10-09 19:17:13 +02:00
{
2019-02-19 10:09:42 +01:00
if ( b > sUnknown_0861CBEC . field_6 )
b = sUnknown_0861CBEC . field_6 ;
if ( b = = 0 | | b = = sUnknown_0861CBEC . field_6 )
2017-10-09 19:17:13 +02:00
{
2019-02-19 10:09:42 +01:00
sub_81C1CB0 ( & sUnknown_0861CBEC , pssData - > bgTilemapBuffers [ PSS_PAGE_INFO ] [ 0 ] , b , 0 ) ;
sub_81C1CB0 ( & sUnknown_0861CBF8 , pssData - > bgTilemapBuffers [ PSS_PAGE_INFO ] [ 0 ] , b , 0 ) ;
2017-10-09 19:17:13 +02:00
}
else
{
u8 taskId = CreateTask ( sub_81C20F0 , 8 ) ;
gTasks [ taskId ] . data [ 0 ] = b ;
gTasks [ taskId ] . data [ 1 ] = a ;
}
}
2018-08-16 00:58:41 +02:00
static void sub_81C20F0 ( u8 taskId )
2017-10-09 19:17:13 +02:00
{
s16 * data = gTasks [ taskId ] . data ;
data [ 1 ] + = data [ 0 ] ;
if ( data [ 1 ] < 0 )
data [ 1 ] = 0 ;
2019-02-19 10:09:42 +01:00
else if ( data [ 1 ] > sUnknown_0861CBEC . field_6 )
data [ 1 ] = sUnknown_0861CBEC . field_6 ;
sub_81C1CB0 ( & sUnknown_0861CBEC , pssData - > bgTilemapBuffers [ PSS_PAGE_INFO ] [ 0 ] , data [ 1 ] , 0 ) ;
sub_81C1CB0 ( & sUnknown_0861CBF8 , pssData - > bgTilemapBuffers [ PSS_PAGE_INFO ] [ 0 ] , data [ 1 ] , 0 ) ;
2017-10-09 19:17:13 +02:00
schedule_bg_copy_tilemap_to_vram ( 3 ) ;
2019-02-19 10:09:42 +01:00
if ( data [ 1 ] < = 0 | | data [ 1 ] > = sUnknown_0861CBEC . field_6 )
2017-10-09 19:17:13 +02:00
{
if ( data [ 0 ] < 0 )
{
2018-08-15 20:47:10 +02:00
CreateSetStatusSprite ( ) ;
2017-10-09 19:17:13 +02:00
PutWindowTilemap ( 13 ) ;
schedule_bg_copy_tilemap_to_vram ( 0 ) ;
}
DestroyTask ( taskId ) ;
}
}
2018-08-16 00:58:41 +02:00
static void sub_81C2194 ( u16 * output , u16 palette , bool8 c )
2017-10-09 19:17:13 +02:00
{
u16 i ;
2018-08-15 06:56:11 +02:00
u32 var ;
2018-08-16 00:58:41 +02:00
palette * = 0x1000 ;
2017-10-09 19:17:13 +02:00
var = 0x56A ;
if ( c = = 0 )
{
for ( i = 0 ; i < 20 ; i + + )
{
2018-08-15 06:56:11 +02:00
output [ var + i ] = gSummaryScreenWindow_Tilemap [ i ] + palette ;
output [ var + i + 0x20 ] = gSummaryScreenWindow_Tilemap [ i ] + palette ;
output [ var + i + 0x40 ] = gSummaryScreenWindow_Tilemap [ i + 20 ] + palette ;
2017-10-09 19:17:13 +02:00
}
}
else
{
for ( i = 0 ; i < 20 ; i + + )
{
2018-08-15 06:56:11 +02:00
output [ var + i ] = gSummaryScreenWindow_Tilemap [ i + 20 ] + palette ;
output [ var + i + 0x20 ] = gSummaryScreenWindow_Tilemap [ i + 40 ] + palette ;
output [ var + i + 0x40 ] = gSummaryScreenWindow_Tilemap [ i + 40 ] + palette ;
2017-10-09 19:17:13 +02:00
}
}
2017-10-09 22:49:14 +02:00
}
2018-08-15 06:56:11 +02:00
2019-02-19 10:09:42 +01:00
static void DrawPokerusCuredSymbol ( struct Pokemon * mon ) // This checks if the mon has been cured of pokerus
2017-10-09 22:49:14 +02:00
{
2019-02-19 10:09:42 +01:00
if ( ! CheckPartyPokerus ( mon , 0 ) & & CheckPartyHasHadPokerus ( mon , 0 ) ) // If yes it draws the cured symbol
2017-10-09 22:49:14 +02:00
{
2018-08-16 00:58:41 +02:00
pssData - > bgTilemapBuffers [ PSS_PAGE_INFO ] [ 0 ] [ 0x223 ] = 0x2C ;
pssData - > bgTilemapBuffers [ PSS_PAGE_INFO ] [ 1 ] [ 0x223 ] = 0x2C ;
2017-10-09 22:49:14 +02:00
}
else
{
2018-08-16 00:58:41 +02:00
pssData - > bgTilemapBuffers [ PSS_PAGE_INFO ] [ 0 ] [ 0x223 ] = 0x81A ;
pssData - > bgTilemapBuffers [ PSS_PAGE_INFO ] [ 1 ] [ 0x223 ] = 0x81A ;
2017-10-09 22:49:14 +02:00
}
schedule_bg_copy_tilemap_to_vram ( 3 ) ;
}
2018-08-16 00:58:41 +02:00
static void sub_81C228C ( bool8 isMonShiny )
2017-10-09 22:49:14 +02:00
{
2018-08-15 10:44:20 +02:00
if ( ! isMonShiny )
2017-10-09 22:49:14 +02:00
sub_8199C30 ( 3 , 1 , 4 , 8 , 8 , 0 ) ;
else
sub_8199C30 ( 3 , 1 , 4 , 8 , 8 , 5 ) ;
schedule_bg_copy_tilemap_to_vram ( 3 ) ;
2017-10-19 01:25:08 +02:00
}
2018-09-02 14:47:12 +02:00
static void DrawExperienceProgressBar ( struct Pokemon * unused )
2017-10-19 01:25:08 +02:00
{
2018-09-02 14:47:12 +02:00
s64 numExpProgressBarTicks ;
2018-08-16 00:58:41 +02:00
struct PokeSummary * summary = & pssData - > summary ;
2017-10-19 01:25:08 +02:00
u16 * r9 ;
u8 i ;
2018-10-17 04:47:08 +02:00
if ( summary - > level < MAX_LEVEL )
2017-10-19 01:25:08 +02:00
{
2018-09-02 14:47:12 +02:00
u32 expBetweenLevels = gExperienceTables [ gBaseStats [ summary - > species ] . growthRate ] [ summary - > level + 1 ] - gExperienceTables [ gBaseStats [ summary - > species ] . growthRate ] [ summary - > level ] ;
u32 expSinceLastLevel = summary - > exp - gExperienceTables [ gBaseStats [ summary - > species ] . growthRate ] [ summary - > level ] ;
2017-10-19 01:25:08 +02:00
2018-09-02 14:47:12 +02:00
// Calculate the number of 1-pixel "ticks" to illuminate in the experience progress bar.
// There are 8 tiles that make up the bar, and each tile has 8 "ticks". Hence, the numerator
// is multiplied by 64.
numExpProgressBarTicks = expSinceLastLevel * 64 / expBetweenLevels ;
if ( numExpProgressBarTicks = = 0 & & expSinceLastLevel ! = 0 )
numExpProgressBarTicks = 1 ;
2017-10-19 01:25:08 +02:00
}
else
{
2018-09-02 14:47:12 +02:00
numExpProgressBarTicks = 0 ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
r9 = & pssData - > bgTilemapBuffers [ PSS_PAGE_SKILLS ] [ 1 ] [ 0x255 ] ;
2017-10-19 01:25:08 +02:00
for ( i = 0 ; i < 8 ; i + + )
{
2018-09-02 14:47:12 +02:00
if ( numExpProgressBarTicks > 7 )
2017-10-19 01:25:08 +02:00
r9 [ i ] = 0x206A ;
else
2018-09-02 14:47:12 +02:00
r9 [ i ] = 0x2062 + ( numExpProgressBarTicks % 8 ) ;
numExpProgressBarTicks - = 8 ;
if ( numExpProgressBarTicks < 0 )
numExpProgressBarTicks = 0 ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
if ( GetBgTilemapBuffer ( 1 ) = = pssData - > bgTilemapBuffers [ PSS_PAGE_SKILLS ] [ 0 ] )
2017-10-19 01:25:08 +02:00
schedule_bg_copy_tilemap_to_vram ( 1 ) ;
else
schedule_bg_copy_tilemap_to_vram ( 2 ) ;
}
2019-02-02 23:14:04 +01:00
static void DrawContestMoveHearts ( u16 move )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
u16 * tilemap = pssData - > bgTilemapBuffers [ PSS_PAGE_CONTEST_MOVES ] [ 1 ] ;
2017-10-19 01:25:08 +02:00
u8 i ;
2018-08-15 10:44:20 +02:00
u8 effectValue ;
2017-10-19 01:25:08 +02:00
if ( move ! = MOVE_NONE )
{
2018-08-15 10:44:20 +02:00
effectValue = gContestEffects [ gContestMoves [ move ] . effect ] . appeal ;
2018-08-16 22:53:01 +02:00
2018-12-05 15:31:01 +01:00
if ( effectValue ! = 0xFF )
2018-08-15 10:44:20 +02:00
effectValue / = 10 ;
2018-08-16 22:53:01 +02:00
2018-08-15 10:44:20 +02:00
for ( i = 0 ; i < 8 ; i + + )
2017-10-19 01:25:08 +02:00
{
2018-12-05 15:31:01 +01:00
if ( effectValue ! = 0xFF & & i < effectValue )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
tilemap [ ( i / 4 * 32 ) + ( i & 3 ) + 0x1E6 ] = 0x103A ;
2017-10-19 01:25:08 +02:00
}
else
2018-08-15 10:44:20 +02:00
{
tilemap [ ( i / 4 * 32 ) + ( i & 3 ) + 0x1E6 ] = 0x1039 ;
}
2017-10-19 01:25:08 +02:00
}
2018-08-15 10:44:20 +02:00
effectValue = gContestEffects [ gContestMoves [ move ] . effect ] . jam ;
2018-12-05 15:31:01 +01:00
if ( effectValue ! = 0xFF )
2018-08-15 10:44:20 +02:00
effectValue / = 10 ;
2018-08-16 22:53:01 +02:00
2018-08-15 10:44:20 +02:00
for ( i = 0 ; i < 8 ; i + + )
2017-10-19 01:25:08 +02:00
{
2018-12-05 15:31:01 +01:00
if ( effectValue ! = 0xFF & & i < effectValue )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
tilemap [ ( i / 4 * 32 ) + ( i & 3 ) + 0x226 ] = 0x103C ;
2017-10-19 01:25:08 +02:00
}
else
2018-08-15 10:44:20 +02:00
{
tilemap [ ( i / 4 * 32 ) + ( i & 3 ) + 0x226 ] = 0x103D ;
}
2017-10-19 01:25:08 +02:00
}
}
}
2019-02-19 10:09:42 +01:00
static void LimitEggSummaryPageDisplay ( void ) // If the pokemon is an egg, limit the number of pages displayed to 1
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > summary . isEgg )
2017-10-19 01:25:08 +02:00
ChangeBgX ( 3 , 0x10000 , 0 ) ;
else
ChangeBgX ( 3 , 0 , 0 ) ;
}
2019-02-04 13:44:09 +01:00
static void ResetWindows ( void )
2017-10-19 01:25:08 +02:00
{
u8 i ;
2019-02-19 10:09:42 +01:00
InitWindows ( sSummaryTemplate ) ;
2017-10-19 01:25:08 +02:00
DeactivateAllTextPrinters ( ) ;
2018-08-15 10:44:20 +02:00
2017-10-19 01:25:08 +02:00
for ( i = 0 ; i < 20 ; i + + )
2018-08-15 10:44:20 +02:00
{
2017-10-19 01:25:08 +02:00
FillWindowPixelBuffer ( i , 0 ) ;
2018-08-15 10:44:20 +02:00
}
2019-02-04 13:44:09 +01:00
for ( i = 0 ; i < ARRAY_COUNT ( pssData - > windowIds ) ; i + + )
2018-08-15 10:44:20 +02:00
{
2018-12-05 15:31:01 +01:00
pssData - > windowIds [ i ] = 0xFF ;
2018-08-15 10:44:20 +02:00
}
2017-10-19 01:25:08 +02:00
}
2018-08-15 10:44:20 +02:00
static void SummaryScreen_PrintTextOnWindow ( u8 windowId , const u8 * string , u8 x , u8 y , u8 lineSpacing , u8 colorId )
2017-10-19 01:25:08 +02:00
{
2018-09-08 23:38:30 +02:00
AddTextPrinterParameterized4 ( windowId , 1 , x , y , 0 , lineSpacing , sTextColors_861CD2C [ colorId ] , 0 , string ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void sub_81C25E8 ( void )
2017-10-19 01:25:08 +02:00
{
FillWindowPixelBuffer ( 17 , 0 ) ;
FillWindowPixelBuffer ( 18 , 0 ) ;
FillWindowPixelBuffer ( 19 , 0 ) ;
2018-08-16 00:58:41 +02:00
if ( ! pssData - > summary . isEgg )
2017-10-19 01:25:08 +02:00
sub_81C2628 ( ) ;
else
sub_81C2794 ( ) ;
schedule_bg_copy_tilemap_to_vram ( 0 ) ;
}
2018-08-16 00:58:41 +02:00
static void sub_81C2628 ( void )
2017-10-19 01:25:08 +02:00
{
u8 strArray [ 16 ] ;
2018-08-16 00:58:41 +02:00
struct Pokemon * mon = & pssData - > currentMon ;
struct PokeSummary * summary = & pssData - > summary ;
2018-08-15 10:44:20 +02:00
u16 dexNum = SpeciesToPokedexNum ( summary - > species ) ;
2018-12-05 15:31:01 +01:00
if ( dexNum ! = 0xFFFF )
2017-10-19 01:25:08 +02:00
{
StringCopy ( gStringVar1 , & gText_UnkCtrlF908Clear01 [ 0 ] ) ;
2018-08-15 10:44:20 +02:00
ConvertIntToDecimalStringN ( gStringVar2 , dexNum , 2 , 3 ) ;
2017-10-19 01:25:08 +02:00
StringAppend ( gStringVar1 , gStringVar2 ) ;
2018-08-15 10:44:20 +02:00
if ( ! IsMonShiny ( mon ) )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( 17 , gStringVar1 , 0 , 1 , 0 , 1 ) ;
sub_81C228C ( FALSE ) ;
2017-10-19 01:25:08 +02:00
}
else
{
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( 17 , gStringVar1 , 0 , 1 , 0 , 7 ) ;
sub_81C228C ( TRUE ) ;
2017-10-19 01:25:08 +02:00
}
PutWindowTilemap ( 17 ) ;
}
else
{
ClearWindowTilemap ( 17 ) ;
2018-08-15 10:44:20 +02:00
if ( ! IsMonShiny ( mon ) )
sub_81C228C ( FALSE ) ;
2017-10-19 01:25:08 +02:00
else
2018-08-15 10:44:20 +02:00
sub_81C228C ( TRUE ) ;
2017-10-19 01:25:08 +02:00
}
StringCopy ( gStringVar1 , & gText_LevelSymbol [ 0 ] ) ;
ConvertIntToDecimalStringN ( gStringVar2 , summary - > level , 0 , 3 ) ;
StringAppend ( gStringVar1 , gStringVar2 ) ;
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( 19 , gStringVar1 , 0x18 , 17 , 0 , 1 ) ;
2017-10-19 01:25:08 +02:00
GetMonNickname ( mon , gStringVar1 ) ;
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( 18 , gStringVar1 , 0 , 1 , 0 , 1 ) ;
2017-10-19 01:25:08 +02:00
strArray [ 0 ] = CHAR_SLASH ;
StringCopy ( & strArray [ 1 ] , & gSpeciesNames [ summary - > species2 ] [ 0 ] ) ;
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( 19 , & strArray [ 0 ] , 0 , 1 , 0 , 1 ) ;
2017-10-19 01:25:08 +02:00
sub_81C27DC ( mon , summary - > species2 ) ;
PutWindowTilemap ( 18 ) ;
PutWindowTilemap ( 19 ) ;
}
2018-08-16 00:58:41 +02:00
static void sub_81C2794 ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
GetMonNickname ( & pssData - > currentMon , gStringVar1 ) ;
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( 18 , gStringVar1 , 0 , 1 , 0 , 1 ) ;
2017-10-19 01:25:08 +02:00
PutWindowTilemap ( 18 ) ;
ClearWindowTilemap ( 17 ) ;
ClearWindowTilemap ( 19 ) ;
}
2018-08-16 00:58:41 +02:00
static void sub_81C27DC ( struct Pokemon * mon , u16 species )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
if ( species ! = SPECIES_NIDORAN_M & & species ! = SPECIES_NIDORAN_F )
2017-10-19 01:25:08 +02:00
{
u8 gender = GetMonGender ( mon ) ;
switch ( gender )
{
2018-08-15 20:47:10 +02:00
case MON_MALE :
2018-08-16 00:58:41 +02:00
SummaryScreen_PrintTextOnWindow ( 19 , gText_MaleSymbol , 57 , 17 , 0 , 3 ) ;
2017-10-19 01:25:08 +02:00
break ;
2018-08-15 20:47:10 +02:00
case MON_FEMALE :
2018-08-16 00:58:41 +02:00
SummaryScreen_PrintTextOnWindow ( 19 , gText_FemaleSymbol , 57 , 17 , 0 , 4 ) ;
2017-10-19 01:25:08 +02:00
break ;
}
}
}
2018-08-16 00:58:41 +02:00
static void PrintAOrBButtonIcon ( u8 windowId , bool8 bButton , u32 x )
2018-08-15 10:44:20 +02:00
{
2019-02-19 10:09:42 +01:00
// sSummaryBButtonBitmap - 0x80 = sSummaryAButtonBitmap
BlitBitmapToWindow ( windowId , ( bButton ) ? sSummaryBButtonBitmap : sSummaryBButtonBitmap - 0x80 , x , 0 , 16 , 16 ) ;
2018-08-15 10:44:20 +02:00
}
2018-08-16 00:58:41 +02:00
static void PrintPageNamesAndStatsPageToWindows ( void )
2018-08-15 10:44:20 +02:00
{
int stringXPos ;
int iconXPos ;
int statsXPos ;
SummaryScreen_PrintTextOnWindow ( 0 , gText_PkmnInfo , 2 , 1 , 0 , 1 ) ;
SummaryScreen_PrintTextOnWindow ( 1 , gText_PkmnSkills , 2 , 1 , 0 , 1 ) ;
SummaryScreen_PrintTextOnWindow ( 2 , gText_BattleMoves , 2 , 1 , 0 , 1 ) ;
SummaryScreen_PrintTextOnWindow ( 3 , gText_ContestMoves , 2 , 1 , 0 , 1 ) ;
2018-08-15 20:47:10 +02:00
stringXPos = GetStringRightAlignXOffset ( 1 , gText_Cancel2 , 62 ) ;
2018-08-15 10:44:20 +02:00
iconXPos = stringXPos - 16 ;
if ( iconXPos < 0 )
iconXPos = 0 ;
PrintAOrBButtonIcon ( 4 , FALSE , iconXPos ) ;
SummaryScreen_PrintTextOnWindow ( 4 , gText_Cancel2 , stringXPos , 1 , 0 , 0 ) ;
2018-08-16 22:53:01 +02:00
2018-08-15 10:44:20 +02:00
stringXPos = GetStringRightAlignXOffset ( 1 , gText_Info , 0x3E ) ;
iconXPos = stringXPos - 16 ;
if ( iconXPos < 0 )
iconXPos = 0 ;
PrintAOrBButtonIcon ( 5 , FALSE , iconXPos ) ;
SummaryScreen_PrintTextOnWindow ( 5 , gText_Info , stringXPos , 1 , 0 , 0 ) ;
2018-08-16 22:53:01 +02:00
2018-08-15 10:44:20 +02:00
stringXPos = GetStringRightAlignXOffset ( 1 , gText_Switch , 0x3E ) ;
iconXPos = stringXPos - 16 ;
if ( iconXPos < 0 )
iconXPos = 0 ;
PrintAOrBButtonIcon ( 6 , FALSE , iconXPos ) ;
SummaryScreen_PrintTextOnWindow ( 6 , gText_Switch , stringXPos , 1 , 0 , 0 ) ;
2018-08-16 22:53:01 +02:00
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( 8 , gText_RentalPkmn , 0 , 1 , 0 , 1 ) ;
SummaryScreen_PrintTextOnWindow ( 9 , gText_TypeSlash , 0 , 1 , 0 , 0 ) ;
statsXPos = 6 + GetStringCenterAlignXOffset ( 1 , gText_HP4 , 42 ) ;
SummaryScreen_PrintTextOnWindow ( 10 , gText_HP4 , statsXPos , 1 , 0 , 1 ) ;
statsXPos = 6 + GetStringCenterAlignXOffset ( 1 , gText_Attack3 , 42 ) ;
SummaryScreen_PrintTextOnWindow ( 10 , gText_Attack3 , statsXPos , 17 , 0 , 1 ) ;
statsXPos = 6 + GetStringCenterAlignXOffset ( 1 , gText_Defense3 , 42 ) ;
SummaryScreen_PrintTextOnWindow ( 10 , gText_Defense3 , statsXPos , 33 , 0 , 1 ) ;
statsXPos = 2 + GetStringCenterAlignXOffset ( 1 , gText_SpAtk4 , 36 ) ;
SummaryScreen_PrintTextOnWindow ( 11 , gText_SpAtk4 , statsXPos , 1 , 0 , 1 ) ;
statsXPos = 2 + GetStringCenterAlignXOffset ( 1 , gText_SpDef4 , 36 ) ;
SummaryScreen_PrintTextOnWindow ( 11 , gText_SpDef4 , statsXPos , 17 , 0 , 1 ) ;
statsXPos = 2 + GetStringCenterAlignXOffset ( 1 , gText_Speed2 , 36 ) ;
SummaryScreen_PrintTextOnWindow ( 11 , gText_Speed2 , statsXPos , 33 , 0 , 1 ) ;
SummaryScreen_PrintTextOnWindow ( 12 , gText_ExpPoints , 6 , 1 , 0 , 1 ) ;
SummaryScreen_PrintTextOnWindow ( 12 , gText_NextLv , 6 , 17 , 0 , 1 ) ;
SummaryScreen_PrintTextOnWindow ( 13 , gText_Status , 2 , 1 , 0 , 1 ) ;
SummaryScreen_PrintTextOnWindow ( 14 , gText_Power , 0 , 1 , 0 , 1 ) ;
SummaryScreen_PrintTextOnWindow ( 14 , gText_Accuracy2 , 0 , 17 , 0 , 1 ) ;
SummaryScreen_PrintTextOnWindow ( 15 , gText_Appeal , 0 , 1 , 0 , 1 ) ;
SummaryScreen_PrintTextOnWindow ( 15 , gText_Jam , 0 , 17 , 0 , 1 ) ;
2017-10-19 01:25:08 +02:00
}
2019-02-04 13:44:09 +01:00
static void CreatePageWindowTilemaps ( u8 page )
2017-10-19 01:25:08 +02:00
{
u8 i ;
2018-08-15 20:47:10 +02:00
2017-10-19 01:25:08 +02:00
ClearWindowTilemap ( 0 ) ;
ClearWindowTilemap ( 1 ) ;
ClearWindowTilemap ( 2 ) ;
ClearWindowTilemap ( 3 ) ;
2018-08-15 20:47:10 +02:00
2019-02-04 13:44:09 +01:00
switch ( page )
2017-10-19 01:25:08 +02:00
{
2019-02-04 13:44:09 +01:00
case PSS_PAGE_INFO :
2017-10-19 01:25:08 +02:00
PutWindowTilemap ( 0 ) ;
PutWindowTilemap ( 4 ) ;
2019-02-07 19:58:09 +01:00
if ( InBattleFactory ( ) = = TRUE | | sub_81B9E94 ( ) = = TRUE )
2017-10-19 01:25:08 +02:00
PutWindowTilemap ( 8 ) ;
PutWindowTilemap ( 9 ) ;
break ;
2019-02-04 13:44:09 +01:00
case PSS_PAGE_SKILLS :
2017-10-19 01:25:08 +02:00
PutWindowTilemap ( 1 ) ;
PutWindowTilemap ( 10 ) ;
PutWindowTilemap ( 11 ) ;
PutWindowTilemap ( 12 ) ;
break ;
2019-02-04 13:44:09 +01:00
case PSS_PAGE_BATTLE_MOVES :
2017-10-19 01:25:08 +02:00
PutWindowTilemap ( 2 ) ;
2018-08-16 00:58:41 +02:00
if ( pssData - > mode = = PSS_MODE_SELECT_MOVE )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > newMove ! = MOVE_NONE | | pssData - > firstMoveIndex ! = MAX_MON_MOVES )
2017-10-19 01:25:08 +02:00
PutWindowTilemap ( 14 ) ;
}
else
2018-08-15 10:44:20 +02:00
{
2017-10-19 01:25:08 +02:00
PutWindowTilemap ( 5 ) ;
2018-08-15 10:44:20 +02:00
}
2017-10-19 01:25:08 +02:00
break ;
2019-02-04 13:44:09 +01:00
case PSS_PAGE_CONTEST_MOVES :
2017-10-19 01:25:08 +02:00
PutWindowTilemap ( 3 ) ;
2018-08-16 00:58:41 +02:00
if ( pssData - > mode = = PSS_MODE_SELECT_MOVE )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > newMove ! = MOVE_NONE | | pssData - > firstMoveIndex ! = MAX_MON_MOVES )
2017-10-19 01:25:08 +02:00
PutWindowTilemap ( 15 ) ;
}
else
2018-08-15 10:44:20 +02:00
{
2017-10-19 01:25:08 +02:00
PutWindowTilemap ( 5 ) ;
2018-08-15 10:44:20 +02:00
}
2017-10-19 01:25:08 +02:00
break ;
}
2018-08-15 20:47:10 +02:00
2019-02-04 13:44:09 +01:00
for ( i = 0 ; i < ARRAY_COUNT ( pssData - > windowIds ) ; i + + )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
PutWindowTilemap ( pssData - > windowIds [ i ] ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-15 20:47:10 +02:00
2017-10-19 01:25:08 +02:00
schedule_bg_copy_tilemap_to_vram ( 0 ) ;
}
2019-02-04 13:44:09 +01:00
static void ClearPageWindowTilemaps ( u8 page )
2017-10-19 01:25:08 +02:00
{
u8 i ;
2019-02-04 13:44:09 +01:00
switch ( page )
2017-10-19 01:25:08 +02:00
{
2019-02-04 13:44:09 +01:00
case PSS_PAGE_INFO :
2017-10-19 01:25:08 +02:00
ClearWindowTilemap ( 4 ) ;
2019-02-07 19:58:09 +01:00
if ( InBattleFactory ( ) = = TRUE | | sub_81B9E94 ( ) = = TRUE )
2017-10-19 01:25:08 +02:00
ClearWindowTilemap ( 8 ) ;
ClearWindowTilemap ( 9 ) ;
break ;
2019-02-04 13:44:09 +01:00
case PSS_PAGE_SKILLS :
2017-10-19 01:25:08 +02:00
ClearWindowTilemap ( 10 ) ;
ClearWindowTilemap ( 11 ) ;
ClearWindowTilemap ( 12 ) ;
break ;
2019-02-04 13:44:09 +01:00
case PSS_PAGE_BATTLE_MOVES :
2018-08-16 00:58:41 +02:00
if ( pssData - > mode = = PSS_MODE_SELECT_MOVE )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > newMove ! = MOVE_NONE | | pssData - > firstMoveIndex ! = MAX_MON_MOVES )
2017-10-19 01:25:08 +02:00
ClearWindowTilemap ( 14 ) ;
}
else
2018-08-15 10:44:20 +02:00
{
2017-10-19 01:25:08 +02:00
ClearWindowTilemap ( 5 ) ;
2018-08-15 10:44:20 +02:00
}
2017-10-19 01:25:08 +02:00
break ;
2019-02-04 13:44:09 +01:00
case PSS_PAGE_CONTEST_MOVES :
2018-08-16 00:58:41 +02:00
if ( pssData - > mode = = PSS_MODE_SELECT_MOVE )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > newMove ! = MOVE_NONE | | pssData - > firstMoveIndex ! = MAX_MON_MOVES )
2017-10-19 01:25:08 +02:00
ClearWindowTilemap ( 15 ) ;
}
else
2018-08-15 10:44:20 +02:00
{
2017-10-19 01:25:08 +02:00
ClearWindowTilemap ( 5 ) ;
2018-08-15 10:44:20 +02:00
}
2017-10-19 01:25:08 +02:00
break ;
}
2018-08-15 20:47:10 +02:00
2019-02-04 13:44:09 +01:00
for ( i = 0 ; i < ARRAY_COUNT ( pssData - > windowIds ) ; i + + )
2018-08-15 20:47:10 +02:00
{
SummaryScreen_RemoveWindowByIndex ( i ) ;
}
2017-10-19 01:25:08 +02:00
schedule_bg_copy_tilemap_to_vram ( 0 ) ;
}
2018-08-16 00:58:41 +02:00
static u8 AddWindowFromTemplateList ( const struct WindowTemplate * template , u8 templateId )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
u8 * windowIdPtr = & ( pssData - > windowIds [ templateId ] ) ;
2018-12-05 15:31:01 +01:00
if ( * windowIdPtr = = 0xFF )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
* windowIdPtr = AddWindow ( & template [ templateId ] ) ;
2018-04-12 19:06:07 +02:00
FillWindowPixelBuffer ( * windowIdPtr , 0 ) ;
2017-10-19 01:25:08 +02:00
}
2018-04-12 19:06:07 +02:00
return * windowIdPtr ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void SummaryScreen_RemoveWindowByIndex ( u8 windowIndex )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
u8 * windowIdPtr = & ( pssData - > windowIds [ windowIndex ] ) ;
2018-12-05 15:31:01 +01:00
if ( * windowIdPtr ! = 0xFF )
2017-10-19 01:25:08 +02:00
{
2018-04-12 19:06:07 +02:00
ClearWindowTilemap ( * windowIdPtr ) ;
RemoveWindow ( * windowIdPtr ) ;
2018-12-05 15:31:01 +01:00
* windowIdPtr = 0xFF ;
2017-10-19 01:25:08 +02:00
}
}
2019-02-04 12:38:44 +01:00
static void PrintPageSpecificText ( u8 pageIndex )
2017-10-19 01:25:08 +02:00
{
u16 i ;
2019-02-04 13:44:09 +01:00
for ( i = 0 ; i < ARRAY_COUNT ( pssData - > windowIds ) ; i + + )
2017-10-19 01:25:08 +02:00
{
2018-12-05 15:31:01 +01:00
if ( pssData - > windowIds [ i ] ! = 0xFF )
2018-08-16 00:58:41 +02:00
FillWindowPixelBuffer ( pssData - > windowIds [ i ] , 0 ) ;
2017-10-19 01:25:08 +02:00
}
2019-02-04 12:38:44 +01:00
sTextPrinterFunctions [ pageIndex ] ( ) ;
2017-10-19 01:25:08 +02:00
}
2019-02-04 12:38:44 +01:00
static void CreateTextPrinterTask ( u8 pageIndex )
2017-10-19 01:25:08 +02:00
{
2019-02-04 12:38:44 +01:00
CreateTask ( sTextPrinterTasks [ pageIndex ] , 16 ) ;
2017-10-19 01:25:08 +02:00
}
2019-02-04 12:38:44 +01:00
static void PrintInfoPageText ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > summary . isEgg )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
PrintEggOTName ( ) ;
PrintEggOTID ( ) ;
PrintEggState ( ) ;
PrintEggMemo ( ) ;
2017-10-19 01:25:08 +02:00
}
else
{
2018-08-15 10:44:20 +02:00
PrintMonOTName ( ) ;
PrintMonOTID ( ) ;
PrintMonAbilityName ( ) ;
PrintMonAbilityDescription ( ) ;
BufferMonTrainerMemo ( ) ;
PrintMonTrainerMemo ( ) ;
2017-10-19 01:25:08 +02:00
}
}
2019-02-04 13:44:09 +01:00
static void Task_PrintInfoPage ( u8 taskId )
2017-10-19 01:25:08 +02:00
{
s16 * data = gTasks [ taskId ] . data ;
2018-08-15 10:44:20 +02:00
switch ( data [ 0 ] )
2017-10-19 01:25:08 +02:00
{
case 1 :
2018-08-15 10:44:20 +02:00
PrintMonOTName ( ) ;
2017-10-19 01:25:08 +02:00
break ;
case 2 :
2018-08-15 10:44:20 +02:00
PrintMonOTID ( ) ;
2017-10-19 01:25:08 +02:00
break ;
case 3 :
2018-08-15 10:44:20 +02:00
PrintMonAbilityName ( ) ;
2017-10-19 01:25:08 +02:00
break ;
case 4 :
2018-08-15 10:44:20 +02:00
PrintMonAbilityDescription ( ) ;
2017-10-19 01:25:08 +02:00
break ;
case 5 :
2018-08-15 10:44:20 +02:00
BufferMonTrainerMemo ( ) ;
2017-10-19 01:25:08 +02:00
break ;
case 6 :
2018-08-15 10:44:20 +02:00
PrintMonTrainerMemo ( ) ;
break ;
case 7 :
2017-10-19 01:25:08 +02:00
DestroyTask ( taskId ) ;
return ;
}
data [ 0 ] + + ;
}
2018-08-16 00:58:41 +02:00
static void PrintMonOTName ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
u8 windowId ;
int x ;
2019-02-07 19:58:09 +01:00
if ( InBattleFactory ( ) ! = TRUE & & sub_81B9E94 ( ) ! = TRUE )
2017-10-19 01:25:08 +02:00
{
2019-02-19 10:09:42 +01:00
windowId = AddWindowFromTemplateList ( sPageInfoTemplate , 0 ) ;
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( windowId , gText_OTSlash , 0 , 1 , 0 , 1 ) ;
x = GetStringWidth ( 1 , gText_OTSlash , 0 ) ;
2018-08-16 00:58:41 +02:00
if ( pssData - > summary . OTGender = = 0 )
SummaryScreen_PrintTextOnWindow ( windowId , pssData - > summary . OTName , x , 1 , 0 , 5 ) ;
2017-10-19 01:25:08 +02:00
else
2018-08-16 00:58:41 +02:00
SummaryScreen_PrintTextOnWindow ( windowId , pssData - > summary . OTName , x , 1 , 0 , 6 ) ;
2017-10-19 01:25:08 +02:00
}
}
2018-08-16 00:58:41 +02:00
static void PrintMonOTID ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
int xPos ;
2019-02-07 19:58:09 +01:00
if ( InBattleFactory ( ) ! = TRUE & & sub_81B9E94 ( ) ! = TRUE )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
ConvertIntToDecimalStringN ( StringCopy ( gStringVar1 , gText_UnkCtrlF907F908 ) , ( u16 ) pssData - > summary . OTID , 2 , 5 ) ;
2018-08-15 10:44:20 +02:00
xPos = GetStringRightAlignXOffset ( 1 , gStringVar1 , 56 ) ;
2019-02-19 10:09:42 +01:00
SummaryScreen_PrintTextOnWindow ( AddWindowFromTemplateList ( sPageInfoTemplate , 1 ) , gStringVar1 , xPos , 1 , 0 , 1 ) ;
2017-10-19 01:25:08 +02:00
}
}
2018-08-16 00:58:41 +02:00
static void PrintMonAbilityName ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
u8 ability = GetAbilityBySpecies ( pssData - > summary . species , pssData - > summary . altAbility ) ;
2019-02-19 10:09:42 +01:00
SummaryScreen_PrintTextOnWindow ( AddWindowFromTemplateList ( sPageInfoTemplate , 2 ) , gAbilityNames [ ability ] , 0 , 1 , 0 , 1 ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void PrintMonAbilityDescription ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
u8 ability = GetAbilityBySpecies ( pssData - > summary . species , pssData - > summary . altAbility ) ;
2019-02-19 10:09:42 +01:00
SummaryScreen_PrintTextOnWindow ( AddWindowFromTemplateList ( sPageInfoTemplate , 2 ) , gAbilityDescriptionPointers [ ability ] , 0 , 17 , 0 , 0 ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void BufferMonTrainerMemo ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
struct PokeSummary * sum = & pssData - > summary ;
2018-08-15 06:56:11 +02:00
const u8 * text ;
2018-08-16 22:53:01 +02:00
2018-07-25 06:18:23 +02:00
DynamicPlaceholderTextUtil_Reset ( ) ;
2019-02-19 10:09:42 +01:00
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 0 , sMemoNatureTextColor ) ;
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 1 , sMemoMiscTextColor ) ;
2018-08-15 10:44:20 +02:00
BufferNatureString ( ) ;
2019-02-07 19:58:09 +01:00
if ( InBattleFactory ( ) = = TRUE | | sub_81B9E94 ( ) = = TRUE | | IsInGamePartnerMon ( ) = = TRUE )
2018-08-15 10:44:20 +02:00
{
2018-07-25 06:18:23 +02:00
DynamicPlaceholderTextUtil_ExpandPlaceholders ( gStringVar4 , gText_XNature ) ;
2018-08-15 10:44:20 +02:00
}
2017-10-19 01:25:08 +02:00
else
{
2018-08-15 10:44:20 +02:00
u8 * metLevelString = Alloc ( 32 ) ;
u8 * metLocationString = Alloc ( 32 ) ;
GetMetLevelString ( metLevelString ) ;
if ( sum - > metLocation < MAPSEC_NONE )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
sub_8124610 ( metLocationString , sum - > metLocation ) ;
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 4 , metLocationString ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-15 10:44:20 +02:00
if ( DoesMonOTMatchOwner ( ) = = TRUE )
2017-10-19 01:25:08 +02:00
{
if ( sum - > metLevel = = 0 )
2018-08-15 10:44:20 +02:00
text = ( sum - > metLocation > = MAPSEC_NONE ) ? gText_XNatureHatchedSomewhereAt : gText_XNatureHatchedAtYZ ;
2017-10-19 01:25:08 +02:00
else
2018-08-15 10:44:20 +02:00
text = ( sum - > metLocation > = MAPSEC_NONE ) ? gText_XNatureMetSomewhereAt : gText_XNatureMetAtYZ ;
2017-10-19 01:25:08 +02:00
}
2019-01-08 20:40:11 +01:00
else if ( sum - > metLocation = = METLOC_FATEFUL_ENCOUNTER )
2018-08-15 10:44:20 +02:00
{
2017-10-19 01:25:08 +02:00
text = gText_XNatureFatefulEncounter ;
2018-08-15 10:44:20 +02:00
}
2019-01-08 20:40:11 +01:00
else if ( sum - > metLocation ! = METLOC_IN_GAME_TRADE & & DidMonComeFromGBAGames ( ) )
2018-08-15 10:44:20 +02:00
{
text = ( sum - > metLocation > = MAPSEC_NONE ) ? gText_XNatureObtainedInTrade : gText_XNatureProbablyMetAt ;
}
2017-10-19 01:25:08 +02:00
else
2018-08-15 10:44:20 +02:00
{
2017-10-19 01:25:08 +02:00
text = gText_XNatureObtainedInTrade ;
2018-08-15 10:44:20 +02:00
}
2018-07-25 06:18:23 +02:00
DynamicPlaceholderTextUtil_ExpandPlaceholders ( gStringVar4 , text ) ;
2018-08-15 10:44:20 +02:00
Free ( metLevelString ) ;
Free ( metLocationString ) ;
2017-10-19 01:25:08 +02:00
}
}
2018-08-16 00:58:41 +02:00
static void PrintMonTrainerMemo ( void )
2017-10-19 01:25:08 +02:00
{
2019-02-19 10:09:42 +01:00
SummaryScreen_PrintTextOnWindow ( AddWindowFromTemplateList ( sPageInfoTemplate , 3 ) , gStringVar4 , 0 , 1 , 0 , 0 ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void BufferNatureString ( void )
2017-10-19 01:25:08 +02:00
{
2019-02-04 13:44:09 +01:00
struct PssData * sumStruct = pssData ;
2018-07-25 06:18:23 +02:00
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 2 , gNatureNamePointers [ sumStruct - > summary . nature ] ) ;
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 5 , gText_EmptyString5 ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void GetMetLevelString ( u8 * output )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
u8 level = pssData - > summary . metLevel ;
2017-10-19 01:25:08 +02:00
if ( level = = 0 )
2018-03-06 13:29:10 +01:00
level = EGG_HATCH_LEVEL ;
2018-08-15 10:44:20 +02:00
ConvertIntToDecimalStringN ( output , level , 0 , 3 ) ;
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 3 , output ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static bool8 DoesMonOTMatchOwner ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
struct PokeSummary * sum = & pssData - > summary ;
2018-08-15 10:44:20 +02:00
u32 trainerId ;
u8 gender ;
2018-08-15 06:56:11 +02:00
2018-08-16 00:58:41 +02:00
if ( pssData - > monList . mons = = gEnemyParty )
2017-10-19 01:25:08 +02:00
{
2018-08-15 06:56:11 +02:00
u8 multiID = GetMultiplayerId ( ) ^ 1 ;
2018-08-15 10:44:20 +02:00
trainerId = ( u16 ) gLinkPlayers [ multiID ] . trainerId ;
gender = gLinkPlayers [ multiID ] . gender ;
2017-10-19 01:25:08 +02:00
StringCopy ( gStringVar1 , gLinkPlayers [ multiID ] . name ) ;
}
else
{
2018-08-15 10:44:20 +02:00
trainerId = GetPlayerIDAsU32 ( ) & 0xFFFF ;
gender = gSaveBlock2Ptr - > playerGender ;
2017-10-19 01:25:08 +02:00
StringCopy ( gStringVar1 , gSaveBlock2Ptr - > playerName ) ;
}
2018-08-15 10:44:20 +02:00
if ( gender ! = sum - > OTGender | | trainerId ! = ( sum - > OTID & 0xFFFF ) | | StringCompareWithoutExtCtrlCodes ( gStringVar1 , sum - > OTName ) )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
return FALSE ;
2017-10-19 01:25:08 +02:00
}
2018-08-15 10:44:20 +02:00
return TRUE ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static bool8 DidMonComeFromGBAGames ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
struct PokeSummary * sum = & pssData - > summary ;
2018-08-15 10:44:20 +02:00
if ( sum - > metGame > 0 & & sum - > metGame < = VERSION_LEAF_GREEN )
2017-10-22 21:01:34 +02:00
return TRUE ;
return FALSE ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
bool8 DidMonComeFromRSE ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
struct PokeSummary * sum = & pssData - > summary ;
2018-08-15 10:44:20 +02:00
if ( sum - > metGame > 0 & & sum - > metGame < = VERSION_EMERALD )
2017-10-22 21:01:34 +02:00
return TRUE ;
return FALSE ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static bool8 IsInGamePartnerMon ( void )
2017-10-19 01:25:08 +02:00
{
if ( ( gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER ) & & gMain . inBattle )
{
2018-08-16 00:58:41 +02:00
if ( pssData - > curMonIndex = = 1 | | pssData - > curMonIndex = = 4 | | pssData - > curMonIndex = = 5 )
2017-10-22 21:01:34 +02:00
return TRUE ;
2017-10-19 01:25:08 +02:00
}
2017-10-22 21:01:34 +02:00
return FALSE ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void PrintEggOTName ( void )
2017-10-19 01:25:08 +02:00
{
2019-02-19 10:09:42 +01:00
u32 windowId = AddWindowFromTemplateList ( sPageInfoTemplate , 0 ) ;
2018-08-15 06:56:11 +02:00
u32 width = GetStringWidth ( 1 , gText_OTSlash , 0 ) ;
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( windowId , gText_OTSlash , 0 , 1 , 0 , 1 ) ;
SummaryScreen_PrintTextOnWindow ( windowId , gText_FiveMarks , width , 1 , 0 , 1 ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void PrintEggOTID ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
int x ;
2017-10-19 01:25:08 +02:00
StringCopy ( gStringVar1 , gText_UnkCtrlF907F908 ) ;
StringAppend ( gStringVar1 , gText_FiveMarks ) ;
2018-08-15 10:44:20 +02:00
x = GetStringRightAlignXOffset ( 1 , gStringVar1 , 56 ) ;
2019-02-19 10:09:42 +01:00
SummaryScreen_PrintTextOnWindow ( AddWindowFromTemplateList ( sPageInfoTemplate , 1 ) , gStringVar1 , x , 1 , 0 , 1 ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void PrintEggState ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-15 06:56:11 +02:00
const u8 * text ;
2018-08-16 00:58:41 +02:00
struct PokeSummary * sum = & pssData - > summary ;
2018-08-15 10:44:20 +02:00
2018-08-16 00:58:41 +02:00
if ( pssData - > summary . sanity = = TRUE )
2017-10-19 01:25:08 +02:00
text = gText_EggWillTakeALongTime ;
else if ( sum - > friendship < = 5 )
text = gText_EggAboutToHatch ;
else if ( sum - > friendship < = 10 )
text = gText_EggWillHatchSoon ;
else if ( sum - > friendship < = 40 )
text = gText_EggWillTakeSomeTime ;
else
text = gText_EggWillTakeALongTime ;
2018-08-16 22:53:01 +02:00
2019-02-19 10:09:42 +01:00
SummaryScreen_PrintTextOnWindow ( AddWindowFromTemplateList ( sPageInfoTemplate , 2 ) , text , 0 , 1 , 0 , 0 ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void PrintEggMemo ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-15 06:56:11 +02:00
const u8 * text ;
2018-08-16 00:58:41 +02:00
struct PokeSummary * sum = & pssData - > summary ;
2018-08-15 10:44:20 +02:00
2018-08-16 00:58:41 +02:00
if ( pssData - > summary . sanity ! = 1 )
2017-10-19 01:25:08 +02:00
{
2019-01-08 20:40:11 +01:00
if ( sum - > metLocation = = METLOC_FATEFUL_ENCOUNTER )
2017-10-19 01:25:08 +02:00
text = gText_PeculiarEggNicePlace ;
2018-08-16 00:58:41 +02:00
else if ( DidMonComeFromGBAGames ( ) = = FALSE | | DoesMonOTMatchOwner ( ) = = FALSE )
2017-10-19 01:25:08 +02:00
text = gText_PeculiarEggTrade ;
2019-01-08 20:40:11 +01:00
else if ( sum - > metLocation = = METLOC_SPECIAL_EGG )
2018-08-16 00:58:41 +02:00
text = ( DidMonComeFromRSE ( ) = = TRUE ) ? gText_EggFromHotSprings : gText_EggFromTraveler ;
2017-10-19 01:25:08 +02:00
else
text = gText_OddEggFoundByCouple ;
}
else
2018-08-15 10:44:20 +02:00
{
2017-10-19 01:25:08 +02:00
text = gText_OddEggFoundByCouple ;
2018-08-15 10:44:20 +02:00
}
2019-02-19 10:09:42 +01:00
SummaryScreen_PrintTextOnWindow ( AddWindowFromTemplateList ( sPageInfoTemplate , 3 ) , text , 0 , 1 , 0 , 0 ) ;
2017-10-19 01:25:08 +02:00
}
2019-02-04 12:38:44 +01:00
static void PrintSkillsPageText ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
PrintHeldItemName ( ) ;
PrintRibbonCount ( ) ;
BufferLeftColumnStats ( ) ;
PrintLeftColumnStats ( ) ;
BufferRightColumnStats ( ) ;
PrintRightColumnStats ( ) ;
PrintExpPointsNextLevel ( ) ;
2017-10-19 01:25:08 +02:00
}
2019-02-04 13:44:09 +01:00
static void Task_PrintSkillsPage ( u8 taskId )
2017-10-19 01:25:08 +02:00
{
s16 * data = gTasks [ taskId ] . data ;
2018-08-15 10:44:20 +02:00
switch ( data [ 0 ] )
2017-10-19 01:25:08 +02:00
{
case 1 :
2018-08-15 10:44:20 +02:00
PrintHeldItemName ( ) ;
2017-10-19 01:25:08 +02:00
break ;
case 2 :
2018-08-15 10:44:20 +02:00
PrintRibbonCount ( ) ;
2017-10-19 01:25:08 +02:00
break ;
case 3 :
2018-08-15 10:44:20 +02:00
BufferLeftColumnStats ( ) ;
2017-10-19 01:25:08 +02:00
break ;
case 4 :
2018-08-15 10:44:20 +02:00
PrintLeftColumnStats ( ) ;
2017-10-19 01:25:08 +02:00
break ;
case 5 :
2018-08-15 10:44:20 +02:00
BufferRightColumnStats ( ) ;
2017-10-19 01:25:08 +02:00
break ;
case 6 :
2018-08-15 10:44:20 +02:00
PrintRightColumnStats ( ) ;
2017-10-19 01:25:08 +02:00
break ;
case 7 :
2018-08-15 10:44:20 +02:00
PrintExpPointsNextLevel ( ) ;
break ;
case 8 :
2017-10-19 01:25:08 +02:00
DestroyTask ( taskId ) ;
return ;
}
data [ 0 ] + + ;
}
2018-08-16 00:58:41 +02:00
static void PrintHeldItemName ( void )
2017-10-19 01:25:08 +02:00
{
2018-04-29 13:36:26 +02:00
const u8 * text ;
2017-10-19 01:25:08 +02:00
int offset ;
2018-08-15 10:44:20 +02:00
2018-12-18 11:38:08 +01:00
if ( pssData - > summary . item = = ITEM_ENIGMA_BERRY & & IsMultiBattle ( ) = = TRUE & & ( pssData - > curMonIndex = = 1 | | pssData - > curMonIndex = = 4 | | pssData - > curMonIndex = = 5 ) )
2017-10-19 01:25:08 +02:00
{
2018-04-29 13:36:26 +02:00
text = ItemId_GetName ( ITEM_ENIGMA_BERRY ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
else if ( pssData - > summary . item = = ITEM_NONE )
2018-08-15 10:44:20 +02:00
{
2017-10-19 01:25:08 +02:00
text = gText_None ;
2018-08-15 10:44:20 +02:00
}
2017-10-19 01:25:08 +02:00
else
{
2018-08-16 00:58:41 +02:00
CopyItemName ( pssData - > summary . item , gStringVar1 ) ;
2017-10-19 01:25:08 +02:00
text = gStringVar1 ;
}
2018-08-15 10:44:20 +02:00
offset = GetStringCenterAlignXOffset ( 1 , text , 72 ) + 6 ;
2019-02-19 10:09:42 +01:00
SummaryScreen_PrintTextOnWindow ( AddWindowFromTemplateList ( sPageSkillsTemplate , 0 ) , text , offset , 1 , 0 , 0 ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void PrintRibbonCount ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-15 06:56:11 +02:00
const u8 * text ;
2017-10-19 01:25:08 +02:00
int offset ;
2018-08-15 10:44:20 +02:00
2018-08-16 00:58:41 +02:00
if ( pssData - > summary . ribbonCount = = 0 )
2018-08-15 10:44:20 +02:00
{
2017-10-19 01:25:08 +02:00
text = gText_None ;
2018-08-15 10:44:20 +02:00
}
2017-10-19 01:25:08 +02:00
else
{
2018-08-16 00:58:41 +02:00
ConvertIntToDecimalStringN ( gStringVar1 , pssData - > summary . ribbonCount , 1 , 2 ) ;
2017-10-19 01:25:08 +02:00
StringExpandPlaceholders ( gStringVar4 , gText_RibbonsVar1 ) ;
text = gStringVar4 ;
}
2018-08-15 10:44:20 +02:00
offset = GetStringCenterAlignXOffset ( 1 , text , 70 ) + 6 ;
2019-02-19 10:09:42 +01:00
SummaryScreen_PrintTextOnWindow ( AddWindowFromTemplateList ( sPageSkillsTemplate , 1 ) , text , offset , 1 , 0 , 0 ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void BufferLeftColumnStats ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
u8 * currentHPString = Alloc ( 8 ) ;
u8 * maxHPString = Alloc ( 8 ) ;
u8 * attackString = Alloc ( 8 ) ;
u8 * defenseString = Alloc ( 8 ) ;
2018-08-16 00:58:41 +02:00
ConvertIntToDecimalStringN ( currentHPString , pssData - > summary . currentHP , 1 , 3 ) ;
ConvertIntToDecimalStringN ( maxHPString , pssData - > summary . maxHP , 1 , 3 ) ;
ConvertIntToDecimalStringN ( attackString , pssData - > summary . atk , 1 , 7 ) ;
ConvertIntToDecimalStringN ( defenseString , pssData - > summary . def , 1 , 7 ) ;
2018-08-16 22:53:01 +02:00
2018-07-25 06:18:23 +02:00
DynamicPlaceholderTextUtil_Reset ( ) ;
2018-08-15 10:44:20 +02:00
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 0 , currentHPString ) ;
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 1 , maxHPString ) ;
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 2 , attackString ) ;
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 3 , defenseString ) ;
2019-02-19 10:09:42 +01:00
DynamicPlaceholderTextUtil_ExpandPlaceholders ( gStringVar4 , sStatsLeftColumnLayout ) ;
2018-08-16 22:53:01 +02:00
2018-08-15 10:44:20 +02:00
Free ( currentHPString ) ;
Free ( maxHPString ) ;
Free ( attackString ) ;
Free ( defenseString ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void PrintLeftColumnStats ( void )
2017-10-19 01:25:08 +02:00
{
2019-02-19 10:09:42 +01:00
SummaryScreen_PrintTextOnWindow ( AddWindowFromTemplateList ( sPageSkillsTemplate , 2 ) , gStringVar4 , 4 , 1 , 0 , 0 ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void BufferRightColumnStats ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
ConvertIntToDecimalStringN ( gStringVar1 , pssData - > summary . spatk , 1 , 3 ) ;
ConvertIntToDecimalStringN ( gStringVar2 , pssData - > summary . spdef , 1 , 3 ) ;
ConvertIntToDecimalStringN ( gStringVar3 , pssData - > summary . speed , 1 , 3 ) ;
2018-08-16 22:53:01 +02:00
2018-07-25 06:18:23 +02:00
DynamicPlaceholderTextUtil_Reset ( ) ;
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 0 , gStringVar1 ) ;
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 1 , gStringVar2 ) ;
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 2 , gStringVar3 ) ;
2019-02-19 10:09:42 +01:00
DynamicPlaceholderTextUtil_ExpandPlaceholders ( gStringVar4 , sStatsRightColumnLayout ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void PrintRightColumnStats ( void )
2017-10-19 01:25:08 +02:00
{
2019-02-19 10:09:42 +01:00
SummaryScreen_PrintTextOnWindow ( AddWindowFromTemplateList ( sPageSkillsTemplate , 3 ) , gStringVar4 , 2 , 1 , 0 , 0 ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void PrintExpPointsNextLevel ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
struct PokeSummary * sum = & pssData - > summary ;
2019-02-19 10:09:42 +01:00
u8 windowId = AddWindowFromTemplateList ( sPageSkillsTemplate , 4 ) ;
2017-10-19 01:25:08 +02:00
int offset ;
u32 expToNextLevel ;
2018-08-15 10:44:20 +02:00
2017-10-19 01:25:08 +02:00
ConvertIntToDecimalStringN ( gStringVar1 , sum - > exp , 1 , 7 ) ;
2018-08-15 10:44:20 +02:00
offset = GetStringRightAlignXOffset ( 1 , gStringVar1 , 42 ) + 2 ;
SummaryScreen_PrintTextOnWindow ( windowId , gStringVar1 , offset , 1 , 0 , 0 ) ;
2018-10-17 04:47:08 +02:00
if ( sum - > level < MAX_LEVEL )
2017-10-19 01:25:08 +02:00
expToNextLevel = gExperienceTables [ gBaseStats [ sum - > species ] . growthRate ] [ sum - > level + 1 ] - sum - > exp ;
else
expToNextLevel = 0 ;
2018-08-16 22:53:01 +02:00
2017-10-19 01:25:08 +02:00
ConvertIntToDecimalStringN ( gStringVar1 , expToNextLevel , 1 , 6 ) ;
2018-08-15 10:44:20 +02:00
offset = GetStringRightAlignXOffset ( 1 , gStringVar1 , 42 ) + 2 ;
SummaryScreen_PrintTextOnWindow ( windowId , gStringVar1 , offset , 17 , 0 , 0 ) ;
2017-10-19 01:25:08 +02:00
}
2019-02-04 12:38:44 +01:00
static void PrintBattleMoves ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
PrintMoveNameAndPP ( 0 ) ;
PrintMoveNameAndPP ( 1 ) ;
PrintMoveNameAndPP ( 2 ) ;
PrintMoveNameAndPP ( 3 ) ;
2018-08-16 00:58:41 +02:00
if ( pssData - > mode = = PSS_MODE_SELECT_MOVE )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
PrintNewMoveDetailsOrCancelText ( ) ;
2018-08-16 00:58:41 +02:00
if ( pssData - > firstMoveIndex = = MAX_MON_MOVES )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > newMove ! = MOVE_NONE )
PrintMoveDetails ( pssData - > newMove ) ;
2017-10-19 01:25:08 +02:00
}
else
2018-08-15 10:44:20 +02:00
{
2018-08-16 00:58:41 +02:00
PrintMoveDetails ( pssData - > summary . moves [ pssData - > firstMoveIndex ] ) ;
2018-08-15 10:44:20 +02:00
}
2017-10-19 01:25:08 +02:00
}
}
2019-02-04 13:44:09 +01:00
static void Task_PrintBattleMoves ( u8 taskId )
2017-10-19 01:25:08 +02:00
{
s16 * data = gTasks [ taskId ] . data ;
2018-08-15 10:44:20 +02:00
switch ( data [ 0 ] )
2017-10-19 01:25:08 +02:00
{
case 1 :
2018-08-15 10:44:20 +02:00
PrintMoveNameAndPP ( 0 ) ;
2017-10-19 01:25:08 +02:00
break ;
case 2 :
2018-08-15 10:44:20 +02:00
PrintMoveNameAndPP ( 1 ) ;
2017-10-19 01:25:08 +02:00
break ;
case 3 :
2018-08-15 10:44:20 +02:00
PrintMoveNameAndPP ( 2 ) ;
2017-10-19 01:25:08 +02:00
break ;
case 4 :
2018-08-15 10:44:20 +02:00
PrintMoveNameAndPP ( 3 ) ;
2017-10-19 01:25:08 +02:00
break ;
case 5 :
2018-08-16 00:58:41 +02:00
if ( pssData - > mode = = PSS_MODE_SELECT_MOVE )
2018-08-15 10:44:20 +02:00
PrintNewMoveDetailsOrCancelText ( ) ;
break ;
case 6 :
2018-08-16 00:58:41 +02:00
if ( pssData - > mode = = PSS_MODE_SELECT_MOVE )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > firstMoveIndex = = MAX_MON_MOVES )
data [ 1 ] = pssData - > newMove ;
2017-10-19 01:25:08 +02:00
else
2018-08-16 00:58:41 +02:00
data [ 1 ] = pssData - > summary . moves [ pssData - > firstMoveIndex ] ;
2017-10-19 01:25:08 +02:00
}
break ;
2018-08-15 10:44:20 +02:00
case 7 :
2018-08-16 00:58:41 +02:00
if ( pssData - > mode = = PSS_MODE_SELECT_MOVE )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > newMove ! = MOVE_NONE | | pssData - > firstMoveIndex ! = MAX_MON_MOVES )
2018-08-15 20:47:10 +02:00
PrintMoveDetails ( data [ 1 ] ) ;
2017-10-19 01:25:08 +02:00
}
break ;
2018-08-15 10:44:20 +02:00
case 8 :
2017-10-19 01:25:08 +02:00
DestroyTask ( taskId ) ;
return ;
}
data [ 0 ] + + ;
}
2018-08-16 00:58:41 +02:00
static void PrintMoveNameAndPP ( u8 moveIndex )
2017-10-19 01:25:08 +02:00
{
2018-08-15 06:56:11 +02:00
u8 pp ;
u32 ppState ;
const u8 * text ;
u32 offset ;
2019-02-04 13:44:09 +01:00
struct PssData * summaryStruct = pssData ;
2019-02-19 10:09:42 +01:00
u8 moveNameWindowId = AddWindowFromTemplateList ( sPageMovesTemplate , 0 ) ;
u8 ppValueWindowId = AddWindowFromTemplateList ( sPageMovesTemplate , 1 ) ;
2018-08-15 10:44:20 +02:00
u16 move = summaryStruct - > summary . moves [ moveIndex ] ;
2018-08-15 06:56:11 +02:00
if ( move ! = 0 )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
pp = CalculatePPWithBonus ( move , summaryStruct - > summary . ppBonuses , moveIndex ) ;
SummaryScreen_PrintTextOnWindow ( moveNameWindowId , gMoveNames [ move ] , 0 , moveIndex * 16 + 1 , 0 , 1 ) ;
ConvertIntToDecimalStringN ( gStringVar1 , summaryStruct - > summary . pp [ moveIndex ] , 1 , 2 ) ;
2018-08-15 06:56:11 +02:00
ConvertIntToDecimalStringN ( gStringVar2 , pp , 1 , 2 ) ;
2018-07-25 06:18:23 +02:00
DynamicPlaceholderTextUtil_Reset ( ) ;
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 0 , gStringVar1 ) ;
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 1 , gStringVar2 ) ;
2019-02-19 10:09:42 +01:00
DynamicPlaceholderTextUtil_ExpandPlaceholders ( gStringVar4 , sMovesPPLayout ) ;
2017-10-19 01:25:08 +02:00
text = gStringVar4 ;
2018-08-15 10:44:20 +02:00
ppState = GetCurrentPpToMaxPpState ( summaryStruct - > summary . pp [ moveIndex ] , pp ) + 9 ;
offset = GetStringRightAlignXOffset ( 1 , text , 44 ) ;
2017-10-19 01:25:08 +02:00
}
else
{
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( moveNameWindowId , gText_OneDash , 0 , moveIndex * 16 + 1 , 0 , 1 ) ;
2017-10-19 01:25:08 +02:00
text = gText_TwoDashes ;
2018-08-15 06:56:11 +02:00
ppState = 12 ;
2018-08-15 10:44:20 +02:00
offset = GetStringCenterAlignXOffset ( 1 , text , 44 ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( ppValueWindowId , text , offset , moveIndex * 16 + 1 , 0 , ppState ) ;
2017-10-19 01:25:08 +02:00
}
2018-08-16 00:58:41 +02:00
static void PrintMovePowerAndAccuracy ( u16 moveIndex )
2017-10-19 01:25:08 +02:00
{
2018-08-15 06:56:11 +02:00
const u8 * text ;
2018-08-15 10:44:20 +02:00
if ( moveIndex ! = 0 )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
FillWindowPixelRect ( 14 , 0 , 53 , 0 , 19 , 32 ) ;
if ( gBattleMoves [ moveIndex ] . power < 2 )
{
2017-10-19 01:25:08 +02:00
text = gText_ThreeDashes ;
2018-08-15 10:44:20 +02:00
}
2017-10-19 01:25:08 +02:00
else
{
2018-08-15 10:44:20 +02:00
ConvertIntToDecimalStringN ( gStringVar1 , gBattleMoves [ moveIndex ] . power , 1 , 3 ) ;
2017-10-19 01:25:08 +02:00
text = gStringVar1 ;
}
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( 14 , text , 53 , 1 , 0 , 0 ) ;
if ( gBattleMoves [ moveIndex ] . accuracy = = 0 )
{
2017-10-19 01:25:08 +02:00
text = gText_ThreeDashes ;
2018-08-15 10:44:20 +02:00
}
2017-10-19 01:25:08 +02:00
else
{
2018-08-15 10:44:20 +02:00
ConvertIntToDecimalStringN ( gStringVar1 , gBattleMoves [ moveIndex ] . accuracy , 1 , 3 ) ;
2017-10-19 01:25:08 +02:00
text = gStringVar1 ;
}
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( 14 , text , 53 , 17 , 0 , 0 ) ;
2017-10-19 01:25:08 +02:00
}
}
2019-02-04 12:38:44 +01:00
static void PrintContestMoves ( void )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
PrintMoveNameAndPP ( 0 ) ;
PrintMoveNameAndPP ( 1 ) ;
PrintMoveNameAndPP ( 2 ) ;
PrintMoveNameAndPP ( 3 ) ;
2018-08-16 00:58:41 +02:00
if ( pssData - > mode = = PSS_MODE_SELECT_MOVE )
2017-10-19 01:25:08 +02:00
{
2018-08-15 10:44:20 +02:00
PrintNewMoveDetailsOrCancelText ( ) ;
2018-08-16 00:58:41 +02:00
PrintContestMoveDescription ( pssData - > firstMoveIndex ) ;
2017-10-19 01:25:08 +02:00
}
}
2019-02-04 13:44:09 +01:00
static void Task_PrintContestMoves ( u8 taskId )
2017-10-19 01:25:08 +02:00
{
s16 * data = gTasks [ taskId ] . data ;
s16 dataa = data [ 0 ] - 1 ;
2017-11-14 20:23:25 +01:00
2017-10-19 01:25:08 +02:00
switch ( dataa )
{
case 0 :
2018-08-15 10:44:20 +02:00
PrintMoveNameAndPP ( 0 ) ;
2017-10-19 01:25:08 +02:00
break ;
case 1 :
2018-08-15 10:44:20 +02:00
PrintMoveNameAndPP ( 1 ) ;
2017-10-19 01:25:08 +02:00
break ;
case 2 :
2018-08-15 10:44:20 +02:00
PrintMoveNameAndPP ( 2 ) ;
2017-10-19 01:25:08 +02:00
break ;
case 3 :
2018-08-15 10:44:20 +02:00
PrintMoveNameAndPP ( 3 ) ;
2017-10-19 01:25:08 +02:00
break ;
case 4 :
2018-08-16 00:58:41 +02:00
if ( pssData - > mode = = PSS_MODE_SELECT_MOVE )
2018-08-15 10:44:20 +02:00
PrintNewMoveDetailsOrCancelText ( ) ;
2017-10-19 01:25:08 +02:00
break ;
case 5 :
2018-08-16 00:58:41 +02:00
if ( pssData - > mode = = PSS_MODE_SELECT_MOVE )
2017-10-19 01:25:08 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > newMove ! = MOVE_NONE | | pssData - > firstMoveIndex ! = MAX_MON_MOVES )
PrintContestMoveDescription ( pssData - > firstMoveIndex ) ;
2017-10-19 01:25:08 +02:00
}
break ;
case 6 :
DestroyTask ( taskId ) ;
return ;
}
data [ 0 ] + + ;
2017-11-14 20:23:25 +01:00
}
2018-07-28 23:26:19 +02:00
2018-08-16 00:58:41 +02:00
static void PrintContestMoveDescription ( u8 moveSlot )
2018-07-28 23:26:19 +02:00
{
u16 move ;
2018-12-25 18:50:15 +01:00
if ( moveSlot = = MAX_MON_MOVES )
2018-08-16 00:58:41 +02:00
move = pssData - > newMove ;
2018-07-28 23:26:19 +02:00
else
2018-08-16 00:58:41 +02:00
move = pssData - > summary . moves [ moveSlot ] ;
2018-07-28 23:26:19 +02:00
if ( move ! = MOVE_NONE )
{
2019-02-19 10:09:42 +01:00
u8 windowId = AddWindowFromTemplateList ( sPageMovesTemplate , 2 ) ;
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( windowId , gContestEffectDescriptionPointers [ gContestMoves [ move ] . effect ] , 6 , 1 , 0 , 0 ) ;
2018-07-28 23:26:19 +02:00
}
}
2018-08-16 00:58:41 +02:00
static void PrintMoveDetails ( u16 move )
2018-07-28 23:26:19 +02:00
{
2019-02-19 10:09:42 +01:00
u8 windowId = AddWindowFromTemplateList ( sPageMovesTemplate , 2 ) ;
2018-07-28 23:26:19 +02:00
FillWindowPixelBuffer ( windowId , 0 ) ;
if ( move ! = MOVE_NONE )
{
2018-08-16 00:58:41 +02:00
if ( pssData - > currPageIndex = = 2 )
2018-07-28 23:26:19 +02:00
{
2018-08-15 10:44:20 +02:00
PrintMovePowerAndAccuracy ( move ) ;
SummaryScreen_PrintTextOnWindow ( windowId , gMoveDescriptionPointers [ move - 1 ] , 6 , 1 , 0 , 0 ) ;
2018-07-28 23:26:19 +02:00
}
else
{
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( windowId , gContestEffectDescriptionPointers [ gContestMoves [ move ] . effect ] , 6 , 1 , 0 , 0 ) ;
2018-07-28 23:26:19 +02:00
}
PutWindowTilemap ( windowId ) ;
}
else
{
ClearWindowTilemap ( windowId ) ;
}
schedule_bg_copy_tilemap_to_vram ( 0 ) ;
}
2018-08-16 00:58:41 +02:00
static void PrintNewMoveDetailsOrCancelText ( void )
2018-07-28 23:26:19 +02:00
{
2019-02-19 10:09:42 +01:00
u8 windowId1 = AddWindowFromTemplateList ( sPageMovesTemplate , 0 ) ;
u8 windowId2 = AddWindowFromTemplateList ( sPageMovesTemplate , 1 ) ;
2018-08-15 10:44:20 +02:00
2018-08-16 00:58:41 +02:00
if ( pssData - > newMove = = MOVE_NONE )
2018-07-28 23:26:19 +02:00
{
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( windowId1 , gText_Cancel , 0 , 65 , 0 , 1 ) ;
2018-07-28 23:26:19 +02:00
}
else
{
2018-08-16 00:58:41 +02:00
u16 move = pssData - > newMove ;
2018-08-15 10:44:20 +02:00
2018-08-16 00:58:41 +02:00
if ( pssData - > currPageIndex = = 2 )
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( windowId1 , gMoveNames [ move ] , 0 , 65 , 0 , 6 ) ;
2018-07-28 23:26:19 +02:00
else
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( windowId1 , gMoveNames [ move ] , 0 , 65 , 0 , 5 ) ;
2018-07-28 23:26:19 +02:00
ConvertIntToDecimalStringN ( gStringVar1 , gBattleMoves [ move ] . pp , 1 , 2 ) ;
DynamicPlaceholderTextUtil_Reset ( ) ;
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 0 , gStringVar1 ) ;
DynamicPlaceholderTextUtil_SetPlaceholderPtr ( 1 , gStringVar1 ) ;
2019-02-19 10:09:42 +01:00
DynamicPlaceholderTextUtil_ExpandPlaceholders ( gStringVar4 , sMovesPPLayout ) ;
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( windowId2 , gStringVar4 , GetStringRightAlignXOffset ( 1 , gStringVar4 , 0x2C ) , 0x41 , 0 , 12 ) ;
2018-07-28 23:26:19 +02:00
}
}
2018-08-16 00:58:41 +02:00
static void sub_81C4064 ( void )
2018-07-28 23:26:19 +02:00
{
2019-02-19 10:09:42 +01:00
u8 windowId = AddWindowFromTemplateList ( sPageMovesTemplate , 0 ) ;
2018-08-15 10:44:20 +02:00
FillWindowPixelRect ( windowId , 0 , 0 , 66 , 72 , 16 ) ;
2018-07-28 23:26:19 +02:00
CopyWindowToVram ( windowId , 2 ) ;
}
2018-08-16 00:58:41 +02:00
static void sub_81C40A0 ( u8 moveIndex1 , u8 moveIndex2 )
2018-07-28 23:26:19 +02:00
{
2019-02-19 10:09:42 +01:00
u8 windowId1 = AddWindowFromTemplateList ( sPageMovesTemplate , 0 ) ;
u8 windowId2 = AddWindowFromTemplateList ( sPageMovesTemplate , 1 ) ;
2018-07-28 23:26:19 +02:00
2018-08-15 10:44:20 +02:00
FillWindowPixelRect ( windowId1 , 0 , 0 , moveIndex1 * 16 , 0x48 , 0x10 ) ;
FillWindowPixelRect ( windowId1 , 0 , 0 , moveIndex2 * 16 , 0x48 , 0x10 ) ;
2018-07-28 23:26:19 +02:00
2018-08-15 10:44:20 +02:00
FillWindowPixelRect ( windowId2 , 0 , 0 , moveIndex1 * 16 , 0x30 , 0x10 ) ;
FillWindowPixelRect ( windowId2 , 0 , 0 , moveIndex2 * 16 , 0x30 , 0x10 ) ;
2018-07-28 23:26:19 +02:00
2018-08-15 10:44:20 +02:00
PrintMoveNameAndPP ( moveIndex1 ) ;
PrintMoveNameAndPP ( moveIndex2 ) ;
2018-07-28 23:26:19 +02:00
}
2018-08-16 00:58:41 +02:00
static void PrintHMMovesCantBeForgotten ( void )
2018-07-28 23:26:19 +02:00
{
2019-02-19 10:09:42 +01:00
u8 windowId = AddWindowFromTemplateList ( sPageMovesTemplate , 2 ) ;
2018-07-28 23:26:19 +02:00
FillWindowPixelBuffer ( windowId , 0 ) ;
2018-08-15 10:44:20 +02:00
SummaryScreen_PrintTextOnWindow ( windowId , gText_HMMovesCantBeForgotten2 , 6 , 1 , 0 , 0 ) ;
2018-07-28 23:26:19 +02:00
}
2019-02-04 12:38:44 +01:00
static void ResetSpriteIds ( void )
2018-07-28 23:26:19 +02:00
{
u8 i ;
2019-02-04 12:38:44 +01:00
for ( i = 0 ; i < ARRAY_COUNT ( pssData - > spriteIds ) ; i + + )
2018-08-16 00:58:41 +02:00
{
2018-12-05 15:31:01 +01:00
pssData - > spriteIds [ i ] = 0xFF ;
2018-08-16 00:58:41 +02:00
}
2018-07-28 23:26:19 +02:00
}
2018-08-16 00:58:41 +02:00
static void DestroySpriteInArray ( u8 spriteArrayId )
2018-07-28 23:26:19 +02:00
{
2018-12-05 15:31:01 +01:00
if ( pssData - > spriteIds [ spriteArrayId ] ! = 0xFF )
2018-07-28 23:26:19 +02:00
{
2018-08-16 00:58:41 +02:00
DestroySprite ( & gSprites [ pssData - > spriteIds [ spriteArrayId ] ] ) ;
2018-12-05 15:31:01 +01:00
pssData - > spriteIds [ spriteArrayId ] = 0xFF ;
2018-07-28 23:26:19 +02:00
}
}
2019-02-02 23:14:04 +01:00
static void SetSpriteInvisibility ( u8 spriteArrayId , bool8 invisible )
2018-07-28 23:26:19 +02:00
{
2018-08-16 00:58:41 +02:00
gSprites [ pssData - > spriteIds [ spriteArrayId ] ] . invisible = invisible ;
2018-07-28 23:26:19 +02:00
}
2019-02-02 23:14:04 +01:00
static void HidePageSpecificSprites ( void )
2018-07-28 23:26:19 +02:00
{
2019-02-02 23:14:04 +01:00
// Keeps Pokémon, caught ball and status sprites visible.
2018-07-28 23:26:19 +02:00
u8 i ;
2019-02-04 12:38:44 +01:00
for ( i = 3 ; i < ARRAY_COUNT ( pssData - > spriteIds ) ; i + + )
2018-07-28 23:26:19 +02:00
{
2018-12-05 15:31:01 +01:00
if ( pssData - > spriteIds [ i ] ! = 0xFF )
2019-02-02 23:14:04 +01:00
SetSpriteInvisibility ( i , TRUE ) ;
2018-07-28 23:26:19 +02:00
}
}
2019-02-02 23:14:04 +01:00
static void SetTypeIcons ( void )
2018-07-28 23:26:19 +02:00
{
2018-08-16 00:58:41 +02:00
switch ( pssData - > currPageIndex )
2018-07-28 23:26:19 +02:00
{
2019-02-02 23:14:04 +01:00
case PSS_PAGE_INFO :
SetMonTypeIcons ( ) ;
2018-07-28 23:26:19 +02:00
break ;
2019-02-02 23:14:04 +01:00
case PSS_PAGE_BATTLE_MOVES :
SetMoveTypeIcons ( ) ;
SetNewMoveTypeIcon ( ) ;
2018-07-28 23:26:19 +02:00
break ;
2019-02-02 23:14:04 +01:00
case PSS_PAGE_CONTEST_MOVES :
SetContestMoveTypeIcons ( ) ;
SetNewMoveTypeIcon ( ) ;
2018-07-28 23:26:19 +02:00
break ;
}
}
2019-02-02 23:14:04 +01:00
static void CreateMoveTypeIcons ( void )
2018-07-28 23:26:19 +02:00
{
u8 i ;
for ( i = 3 ; i < 8 ; i + + )
{
2018-12-05 15:31:01 +01:00
if ( pssData - > spriteIds [ i ] = = 0xFF )
2018-09-01 18:31:53 +02:00
pssData - > spriteIds [ i ] = CreateSprite ( & sSpriteTemplate_MoveTypes , 0 , 0 , 2 ) ;
2018-07-28 23:26:19 +02:00
2019-02-02 23:14:04 +01:00
SetSpriteInvisibility ( i , TRUE ) ;
2018-07-28 23:26:19 +02:00
}
}
2018-08-16 00:58:41 +02:00
static void SetMoveTypeSpritePosAndType ( u8 typeId , u8 x , u8 y , u8 spriteArrayId )
2018-07-28 23:26:19 +02:00
{
2018-08-16 00:58:41 +02:00
struct Sprite * sprite = & gSprites [ pssData - > spriteIds [ spriteArrayId ] ] ;
2018-07-28 23:26:19 +02:00
StartSpriteAnim ( sprite , typeId ) ;
2018-09-01 18:31:53 +02:00
sprite - > oam . paletteNum = sMoveTypeToOamPaletteNum [ typeId ] ;
2018-07-28 23:26:19 +02:00
sprite - > pos1 . x = x + 16 ;
sprite - > pos1 . y = y + 8 ;
2019-02-02 23:14:04 +01:00
SetSpriteInvisibility ( spriteArrayId , FALSE ) ;
2018-07-28 23:26:19 +02:00
}
2019-02-02 23:14:04 +01:00
static void SetMonTypeIcons ( void )
2018-07-28 23:26:19 +02:00
{
2018-08-16 00:58:41 +02:00
struct PokeSummary * summary = & pssData - > summary ;
2018-07-28 23:26:19 +02:00
if ( summary - > isEgg )
{
2018-08-16 00:58:41 +02:00
SetMoveTypeSpritePosAndType ( TYPE_MYSTERY , 120 , 48 , 3 ) ;
2019-02-02 23:14:04 +01:00
SetSpriteInvisibility ( 4 , TRUE ) ;
2018-07-28 23:26:19 +02:00
}
else
{
2018-08-16 00:58:41 +02:00
SetMoveTypeSpritePosAndType ( gBaseStats [ summary - > species ] . type1 , 0x78 , 0x30 , 3 ) ;
2018-07-28 23:26:19 +02:00
if ( gBaseStats [ summary - > species ] . type1 ! = gBaseStats [ summary - > species ] . type2 )
{
2018-08-16 00:58:41 +02:00
SetMoveTypeSpritePosAndType ( gBaseStats [ summary - > species ] . type2 , 0xA0 , 0x30 , 4 ) ;
2019-02-02 23:14:04 +01:00
SetSpriteInvisibility ( 4 , FALSE ) ;
2018-07-28 23:26:19 +02:00
}
else
{
2019-02-02 23:14:04 +01:00
SetSpriteInvisibility ( 4 , TRUE ) ;
2018-07-28 23:26:19 +02:00
}
}
}
2019-02-02 23:14:04 +01:00
static void SetMoveTypeIcons ( void )
2018-07-28 23:26:19 +02:00
{
u8 i ;
2018-08-16 00:58:41 +02:00
struct PokeSummary * summary = & pssData - > summary ;
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2018-07-28 23:26:19 +02:00
{
if ( summary - > moves [ i ] ! = MOVE_NONE )
2018-08-16 00:58:41 +02:00
SetMoveTypeSpritePosAndType ( gBattleMoves [ summary - > moves [ i ] ] . type , 0x55 , 0x20 + ( i * 0x10 ) , i + 3 ) ;
2018-07-28 23:26:19 +02:00
else
2019-02-02 23:14:04 +01:00
SetSpriteInvisibility ( i + 3 , TRUE ) ;
2018-07-28 23:26:19 +02:00
}
}
2019-02-02 23:14:04 +01:00
static void SetContestMoveTypeIcons ( void )
2018-07-28 23:26:19 +02:00
{
u8 i ;
2018-08-16 00:58:41 +02:00
struct PokeSummary * summary = & pssData - > summary ;
2018-12-25 18:50:15 +01:00
for ( i = 0 ; i < MAX_MON_MOVES ; i + + )
2018-07-28 23:26:19 +02:00
{
if ( summary - > moves [ i ] ! = MOVE_NONE )
2018-08-16 00:58:41 +02:00
SetMoveTypeSpritePosAndType ( NUMBER_OF_MON_TYPES + gContestMoves [ summary - > moves [ i ] ] . contestCategory , 0x55 , 0x20 + ( i * 0x10 ) , i + 3 ) ;
2018-07-28 23:26:19 +02:00
else
2019-02-02 23:14:04 +01:00
SetSpriteInvisibility ( i + 3 , TRUE ) ;
2018-07-28 23:26:19 +02:00
}
}
2019-02-02 23:14:04 +01:00
static void SetNewMoveTypeIcon ( void )
2018-07-28 23:26:19 +02:00
{
2018-08-16 00:58:41 +02:00
if ( pssData - > newMove = = MOVE_NONE )
2018-07-28 23:26:19 +02:00
{
2019-02-02 23:14:04 +01:00
SetSpriteInvisibility ( 7 , TRUE ) ;
2018-07-28 23:26:19 +02:00
}
else
{
2018-08-16 00:58:41 +02:00
if ( pssData - > currPageIndex = = 2 )
SetMoveTypeSpritePosAndType ( gBattleMoves [ pssData - > newMove ] . type , 85 , 96 , 7 ) ;
2018-08-15 06:56:11 +02:00
else
2018-08-16 00:58:41 +02:00
SetMoveTypeSpritePosAndType ( NUMBER_OF_MON_TYPES + gContestMoves [ pssData - > newMove ] . contestCategory , 85 , 96 , 7 ) ;
2018-08-15 06:56:11 +02:00
}
}
2018-08-16 00:58:41 +02:00
static void sub_81C4568 ( u8 a0 , u8 a1 )
2018-08-15 06:56:11 +02:00
{
2018-08-16 00:58:41 +02:00
struct Sprite * sprite1 = & gSprites [ pssData - > spriteIds [ a0 + 3 ] ] ;
struct Sprite * sprite2 = & gSprites [ pssData - > spriteIds [ a1 + 3 ] ] ;
2018-08-15 06:56:11 +02:00
u8 temp = sprite1 - > animNum ;
sprite1 - > animNum = sprite2 - > animNum ;
sprite2 - > animNum = temp ;
temp = sprite1 - > oam . paletteNum ;
sprite1 - > oam . paletteNum = sprite2 - > oam . paletteNum ;
sprite2 - > oam . paletteNum = temp ;
sprite1 - > animBeginning = TRUE ;
sprite1 - > animEnded = FALSE ;
sprite2 - > animBeginning = TRUE ;
sprite2 - > animEnded = FALSE ;
}
2019-02-02 23:14:04 +01:00
static u8 CreatePokemonSprite ( struct Pokemon * mon , s16 * a1 )
2018-08-15 06:56:11 +02:00
{
const struct CompressedSpritePalette * pal ;
2018-08-16 00:58:41 +02:00
struct PokeSummary * summary = & pssData - > summary ;
2018-08-15 06:56:11 +02:00
switch ( * a1 )
{
default :
return sub_81C47B4 ( mon ) ;
case 0 :
if ( gMain . inBattle )
{
2018-08-16 00:58:41 +02:00
if ( sub_80688F8 ( 3 , pssData - > curMonIndex ) )
2018-08-15 06:56:11 +02:00
{
HandleLoadSpecialPokePic_DontHandleDeoxys ( & gMonFrontPicTable [ summary - > species2 ] , gMonSpritesGfxPtr - > sprites [ 1 ] , summary - > species2 , summary - > pid ) ;
}
else
{
HandleLoadSpecialPokePic_2 ( & gMonFrontPicTable [ summary - > species2 ] , gMonSpritesGfxPtr - > sprites [ 1 ] , summary - > species2 , summary - > pid ) ;
}
}
else
{
if ( gMonSpritesGfxPtr ! = NULL )
{
2018-12-10 21:36:52 +01:00
if ( pssData - > monList . mons = = gPlayerParty | | pssData - > mode = = PSS_MODE_BOX | | pssData - > unk40EF = = TRUE )
2018-08-15 06:56:11 +02:00
{
HandleLoadSpecialPokePic_2 ( & gMonFrontPicTable [ summary - > species2 ] , gMonSpritesGfxPtr - > sprites [ 1 ] , summary - > species2 , summary - > pid ) ;
}
else
{
HandleLoadSpecialPokePic_DontHandleDeoxys ( & gMonFrontPicTable [ summary - > species2 ] , gMonSpritesGfxPtr - > sprites [ 1 ] , summary - > species2 , summary - > pid ) ;
}
}
else
{
2018-12-10 21:36:52 +01:00
if ( pssData - > monList . mons = = gPlayerParty | | pssData - > mode = = PSS_MODE_BOX | | pssData - > unk40EF = = TRUE )
2018-08-15 06:56:11 +02:00
{
HandleLoadSpecialPokePic_2 ( & gMonFrontPicTable [ summary - > species2 ] , sub_806F4F8 ( 0 , 1 ) , summary - > species2 , summary - > pid ) ;
}
else
{
HandleLoadSpecialPokePic_DontHandleDeoxys ( & gMonFrontPicTable [ summary - > species2 ] , sub_806F4F8 ( 0 , 1 ) , summary - > species2 , summary - > pid ) ;
}
}
}
( * a1 ) + + ;
2019-02-04 15:35:49 +01:00
return 0xFF ;
2018-08-15 06:56:11 +02:00
case 1 :
pal = GetMonSpritePalStructFromOtIdPersonality ( summary - > species2 , summary - > OTID , summary - > pid ) ;
2018-12-17 23:00:08 +01:00
LoadCompressedSpritePalette ( pal ) ;
2018-08-15 06:56:11 +02:00
SetMultiuseSpriteTemplateToPokemon ( pal - > tag , 1 ) ;
( * a1 ) + + ;
2019-02-04 15:35:49 +01:00
return 0xFF ;
2018-08-15 06:56:11 +02:00
}
}
2019-02-04 15:35:49 +01:00
static void PlayMonCry ( void )
2018-08-15 06:56:11 +02:00
{
2018-08-16 00:58:41 +02:00
struct PokeSummary * summary = & pssData - > summary ;
2018-08-15 06:56:11 +02:00
if ( ! summary - > isEgg )
{
2018-08-16 00:58:41 +02:00
if ( ShouldPlayNormalMonCry ( & pssData - > currentMon ) = = TRUE )
2018-08-15 06:56:11 +02:00
{
PlayCry3 ( summary - > species2 , 0 , 0 ) ;
}
2018-07-28 23:26:19 +02:00
else
2018-08-15 06:56:11 +02:00
{
PlayCry3 ( summary - > species2 , 0 , 11 ) ;
}
}
}
2018-08-16 00:58:41 +02:00
static u8 sub_81C47B4 ( struct Pokemon * unused )
2018-08-15 06:56:11 +02:00
{
2018-08-16 00:58:41 +02:00
struct PokeSummary * summary = & pssData - > summary ;
2018-08-15 06:56:11 +02:00
u8 spriteId = CreateSprite ( & gMultiuseSpriteTemplate , 40 , 64 , 5 ) ;
struct Sprite * sprite = & gSprites [ spriteId ] ;
FreeSpriteOamMatrix ( sprite ) ;
sprite - > data [ 0 ] = summary - > species2 ;
sprite - > data [ 2 ] = 0 ;
2019-02-04 15:35:49 +01:00
gSprites [ spriteId ] . callback = SpriteCB_Pokemon ;
2018-08-15 06:56:11 +02:00
sprite - > oam . priority = 0 ;
if ( ! IsMonSpriteNotFlipped ( summary - > species2 ) )
{
sprite - > hFlip = TRUE ;
}
else
{
sprite - > hFlip = FALSE ;
}
return spriteId ;
}
2019-02-04 15:35:49 +01:00
static void SpriteCB_Pokemon ( struct Sprite * sprite )
2018-08-15 06:56:11 +02:00
{
2018-08-16 00:58:41 +02:00
struct PokeSummary * summary = & pssData - > summary ;
2018-08-15 06:56:11 +02:00
if ( ! gPaletteFade . active & & sprite - > data [ 2 ] ! = 1 )
{
sprite - > data [ 1 ] = IsMonSpriteNotFlipped ( sprite - > data [ 0 ] ) ;
2019-02-04 15:35:49 +01:00
PlayMonCry ( ) ;
2018-08-15 06:56:11 +02:00
PokemonSummaryDoMonAnimation ( sprite , sprite - > data [ 0 ] , summary - > isEgg ) ;
}
}
2018-08-15 20:47:10 +02:00
void SummaryScreen_SetUnknownTaskId ( u8 a0 )
2018-08-15 06:56:11 +02:00
{
2018-08-15 20:47:10 +02:00
sUnknownTaskId = a0 ;
2018-08-15 06:56:11 +02:00
}
2018-08-15 20:47:10 +02:00
void SummaryScreen_DestroyUnknownTask ( void )
2018-08-15 06:56:11 +02:00
{
2018-12-05 15:31:01 +01:00
if ( sUnknownTaskId ! = 0xFF )
2018-08-15 06:56:11 +02:00
{
2018-08-15 20:47:10 +02:00
DestroyTask ( sUnknownTaskId ) ;
2018-12-05 15:31:01 +01:00
sUnknownTaskId = 0xFF ;
2018-08-15 06:56:11 +02:00
}
}
2018-08-16 00:58:41 +02:00
static bool32 SummaryScreen_DoesSpriteHaveCallback ( void )
2018-08-15 06:56:11 +02:00
{
2018-08-16 00:58:41 +02:00
if ( gSprites [ pssData - > spriteIds [ 0 ] ] . callback = = SpriteCallbackDummy )
2018-08-15 06:56:11 +02:00
{
return FALSE ;
}
else
{
return TRUE ;
}
}
2019-02-19 10:09:42 +01:00
static void StopPokemonAnimations ( void ) // A subtle effect, this function stops pokemon animations when leaving the PSS
2018-08-15 06:56:11 +02:00
{
u16 i ;
u16 paletteIndex ;
2018-08-16 00:58:41 +02:00
gSprites [ pssData - > spriteIds [ 0 ] ] . animPaused = TRUE ;
gSprites [ pssData - > spriteIds [ 0 ] ] . callback = SpriteCallbackDummy ;
2019-02-19 10:09:42 +01:00
StopPokemonAnimationDelayTask ( ) ;
2018-08-15 06:56:11 +02:00
2018-08-16 00:58:41 +02:00
paletteIndex = ( gSprites [ pssData - > spriteIds [ 0 ] ] . oam . paletteNum * 16 ) | 0x100 ;
2018-08-16 22:53:01 +02:00
2018-08-15 06:56:11 +02:00
for ( i = 0 ; i < 16 ; i + + )
{
gPlttBufferUnfaded [ ( u16 ) ( i + paletteIndex ) ] = gPlttBufferFaded [ ( u16 ) ( i + paletteIndex ) ] ;
}
}
2018-08-16 00:58:41 +02:00
static void CreateMonMarkingsSprite ( struct Pokemon * mon )
2018-08-15 06:56:11 +02:00
{
2019-02-19 10:09:42 +01:00
struct Sprite * sprite = sub_811FF94 ( 30003 , 30003 , sSummaryMarkingsPalette ) ;
2018-08-15 06:56:11 +02:00
2018-08-16 00:58:41 +02:00
pssData - > markingsSprite = sprite ;
2018-08-15 06:56:11 +02:00
if ( sprite ! = NULL )
{
StartSpriteAnim ( sprite , GetMonData ( mon , MON_DATA_MARKINGS ) ) ;
2018-08-16 00:58:41 +02:00
pssData - > markingsSprite - > pos1 . x = 60 ;
pssData - > markingsSprite - > pos1 . y = 26 ;
pssData - > markingsSprite - > oam . priority = 1 ;
2018-08-15 06:56:11 +02:00
}
}
2018-08-16 00:58:41 +02:00
static void RemoveAndCreateMonMarkingsSprite ( struct Pokemon * mon )
2018-08-15 06:56:11 +02:00
{
2018-08-16 00:58:41 +02:00
DestroySprite ( pssData - > markingsSprite ) ;
2018-08-15 06:56:11 +02:00
FreeSpriteTilesByTag ( 30003 ) ;
2018-08-15 20:47:10 +02:00
CreateMonMarkingsSprite ( mon ) ;
2018-08-15 06:56:11 +02:00
}
2018-08-16 00:58:41 +02:00
static void CreateCaughtBallSprite ( struct Pokemon * mon )
2018-08-15 06:56:11 +02:00
{
u8 ball = ItemIdToBallId ( GetMonData ( mon , MON_DATA_POKEBALL ) ) ;
LoadBallGfx ( ball ) ;
2018-08-16 00:58:41 +02:00
pssData - > spriteIds [ 1 ] = CreateSprite ( & gBallSpriteTemplates [ ball ] , 16 , 136 , 0 ) ;
gSprites [ pssData - > spriteIds [ 1 ] ] . callback = SpriteCallbackDummy ;
gSprites [ pssData - > spriteIds [ 1 ] ] . oam . priority = 3 ;
2018-08-15 06:56:11 +02:00
}
2018-08-16 00:58:41 +02:00
static void CreateSetStatusSprite ( void )
2018-08-15 06:56:11 +02:00
{
2018-08-16 00:58:41 +02:00
u8 * spriteId = & pssData - > spriteIds [ 2 ] ;
2018-08-15 06:56:11 +02:00
u8 anim ;
2018-12-05 15:31:01 +01:00
if ( * spriteId = = 0xFF )
2018-08-15 06:56:11 +02:00
{
2018-09-02 14:47:12 +02:00
* spriteId = CreateSprite ( & sSpriteTemplate_StatusCondition , 64 , 152 , 0 ) ;
2018-08-15 06:56:11 +02:00
}
2018-08-16 00:58:41 +02:00
anim = sub_81B205C ( & pssData - > currentMon ) ;
2018-08-15 06:56:11 +02:00
if ( anim ! = 0 )
{
StartSpriteAnim ( & gSprites [ * spriteId ] , anim - 1 ) ;
2019-02-02 23:14:04 +01:00
SetSpriteInvisibility ( 2 , FALSE ) ;
2018-08-15 06:56:11 +02:00
}
else
{
2019-02-02 23:14:04 +01:00
SetSpriteInvisibility ( 2 , TRUE ) ;
2018-08-15 06:56:11 +02:00
}
}
2018-08-16 00:58:41 +02:00
static void sub_81C4AF8 ( u8 a0 )
2018-08-15 06:56:11 +02:00
{
u8 i ;
2018-08-16 00:58:41 +02:00
u8 * spriteIds = & pssData - > spriteIds [ a0 ] ;
2018-08-15 06:56:11 +02:00
2018-08-16 00:58:41 +02:00
if ( pssData - > currPageIndex > 1 )
2018-08-15 06:56:11 +02:00
{
u8 subsprite = 0 ;
if ( a0 = = 8 )
{
subsprite = 1 ;
}
for ( i = 0 ; i < 10 ; i + + )
{
spriteIds [ i ] = CreateSprite ( & gUnknown_0861D084 , i * 16 + 89 , 40 , subsprite ) ;
if ( i = = 0 )
{
StartSpriteAnim ( & gSprites [ spriteIds [ 0 ] ] , 4 ) ;
}
else if ( i = = 9 )
{
StartSpriteAnim ( & gSprites [ spriteIds [ 9 ] ] , 5 ) ;
}
else
{
StartSpriteAnim ( & gSprites [ spriteIds [ i ] ] , 6 ) ;
}
gSprites [ spriteIds [ i ] ] . callback = sub_81C4BE4 ;
gSprites [ spriteIds [ i ] ] . data [ 0 ] = a0 ;
gSprites [ spriteIds [ i ] ] . data [ 1 ] = 0 ;
}
}
}
2018-08-16 00:58:41 +02:00
static void sub_81C4BE4 ( struct Sprite * sprite )
2018-08-15 06:56:11 +02:00
{
if ( sprite - > animNum > 3 & & sprite - > animNum < 7 )
{
sprite - > data [ 1 ] = ( sprite - > data [ 1 ] + 1 ) & 0x1F ;
if ( sprite - > data [ 1 ] > 24 )
{
sprite - > invisible = TRUE ;
}
2018-07-28 23:26:19 +02:00
else
2018-08-15 06:56:11 +02:00
{
sprite - > invisible = FALSE ;
}
}
else
{
sprite - > data [ 1 ] = 0 ;
sprite - > invisible = FALSE ;
}
if ( sprite - > data [ 0 ] = = 8 )
{
2018-08-16 00:58:41 +02:00
sprite - > pos2 . y = pssData - > firstMoveIndex * 16 ;
2018-08-15 06:56:11 +02:00
}
else
{
2018-08-16 00:58:41 +02:00
sprite - > pos2 . y = pssData - > secondMoveIndex * 16 ;
2018-08-15 06:56:11 +02:00
}
}
2018-08-16 00:58:41 +02:00
static void sub_81C4C60 ( u8 a0 )
2018-08-15 06:56:11 +02:00
{
u8 i ;
for ( i = 0 ; i < 10 ; i + + )
{
2018-08-15 20:47:10 +02:00
DestroySpriteInArray ( a0 + i ) ;
2018-08-15 06:56:11 +02:00
}
}
2018-08-16 00:58:41 +02:00
static void sub_81C4C84 ( u8 a0 )
2018-08-15 06:56:11 +02:00
{
u8 i ;
2018-08-16 00:58:41 +02:00
u8 * spriteIds = & pssData - > spriteIds [ 8 ] ;
2018-08-15 06:56:11 +02:00
a0 * = 3 ;
for ( i = 0 ; i < 10 ; i + + )
{
if ( i = = 0 )
{
StartSpriteAnim ( & gSprites [ spriteIds [ 0 ] ] , a0 + 4 ) ;
}
else if ( i = = 9 )
{
StartSpriteAnim ( & gSprites [ spriteIds [ 9 ] ] , a0 + 5 ) ;
}
else
{
StartSpriteAnim ( & gSprites [ spriteIds [ i ] ] , a0 + 6 ) ;
}
}
}
2018-08-16 00:58:41 +02:00
static void sub_81C4D18 ( u8 firstSpriteId )
2018-08-15 06:56:11 +02:00
{
u8 i ;
2018-08-16 00:58:41 +02:00
u8 * spriteIds = & pssData - > spriteIds [ firstSpriteId ] ;
2018-08-15 06:56:11 +02:00
for ( i = 0 ; i < 10 ; i + + )
{
gSprites [ spriteIds [ i ] ] . data [ 1 ] = 0 ;
gSprites [ spriteIds [ i ] ] . invisible = FALSE ;
2018-07-28 23:26:19 +02:00
}
}