2018-11-11 16:44:27 +01:00
# include "global.h"
2018-12-25 18:50:15 +01:00
# include "battle.h"
2018-11-11 16:44:27 +01:00
# include "battle_factory_screen.h"
# include "battle_factory.h"
# include "sprite.h"
# include "event_data.h"
# include "overworld.h"
# include "random.h"
# include "battle_tower.h"
# include "text.h"
# include "palette.h"
# include "task.h"
# include "main.h"
2019-09-09 03:07:54 +02:00
# include "malloc.h"
2018-11-11 16:44:27 +01:00
# include "bg.h"
# include "gpu_regs.h"
# include "string_util.h"
# include "international_string_util.h"
# include "window.h"
2019-04-04 23:53:06 +02:00
# include "data.h"
2018-11-11 16:44:27 +01:00
# include "decompress.h"
# include "pokemon_summary_screen.h"
# include "sound.h"
# include "pokedex.h"
# include "util.h"
# include "trainer_pokemon_sprites.h"
2020-07-06 23:22:37 +02:00
# include "starter_choose.h"
2020-12-28 23:32:08 +01:00
# include "strings.h"
# include "graphics.h"
2018-11-11 16:44:27 +01:00
# include "constants/battle_frontier.h"
# include "constants/songs.h"
# include "constants/rgb.h"
2020-12-28 23:32:08 +01:00
// Select_ refers to the first Pokemon selection screen where you choose your initial 3 rental Pokemon.
2020-08-31 19:36:48 +02:00
// Swap_ refers to the subsequent selection screens where you can swap a Pokemon with one from the beaten trainer
2018-11-11 16:44:27 +01:00
2020-12-28 23:32:08 +01:00
// Note that, generally, "Action" will refer to the immediate actions that can be taken on each screen,
// i.e. selecting a pokemon or selecting the Cancel button
// The "Options menu" will refer to the popup menu that shows when some actions have been selected
2020-08-31 19:36:48 +02:00
2020-12-28 23:32:08 +01:00
# define SWAP_PLAYER_SCREEN 0 // The screen where the player selects which of their pokemon to swap away
# define SWAP_ENEMY_SCREEN 1 // The screen where the player selects which new pokemon from the defeated party to swap for
2018-11-11 16:44:27 +01:00
# define SELECTABLE_MONS_COUNT 6
2020-12-30 23:35:33 +01:00
enum {
PALTAG_BALL_GRAY = 100 ,
PALTAG_BALL_SELECTED ,
PALTAG_INTERFACE ,
PALTAG_MON_PIC_BG ,
} ;
enum {
GFXTAG_BALL = 100 ,
GFXTAG_ARROW ,
GFXTAG_MENU_HIGHLIGHT_LEFT ,
GFXTAG_MENU_HIGHLIGHT_RIGHT ,
GFXTAG_ACTION_BOX_LEFT ,
GFXTAG_ACTION_BOX_RIGHT ,
GFXTAG_ACTION_HIGHLIGHT_LEFT ,
GFXTAG_ACTION_HIGHLIGHT_MIDDLE ,
GFXTAG_ACTION_HIGHLIGHT_RIGHT ,
GFXTAG_MON_PIC_BG_ANIM ,
} ;
2018-11-11 16:44:27 +01:00
2020-12-28 23:32:08 +01:00
// Tasks in this file universally use data[0] as a state for switches
# define tState data[0]
// States for both Select/Swap versions of Task_FadeSpeciesName
enum {
FADESTATE_INIT ,
FADESTATE_RUN ,
FADESTATE_DELAY
} ;
2020-12-30 23:35:33 +01:00
// Return states for the Select Actions
enum {
SELECT_SUMMARY ,
SELECT_CONTINUE_CHOOSING ,
SELECT_CONFIRM_MONS ,
SELECT_INVALID_MON ,
} ;
2020-08-31 19:36:48 +02:00
struct FactorySelectableMon
2018-11-11 16:44:27 +01:00
{
2020-07-13 06:47:30 +02:00
u16 monId ;
2020-12-28 23:32:08 +01:00
u16 ballSpriteId ;
2018-11-11 16:44:27 +01:00
u8 selectedId ; // 0 - not selected, 1 - first pokemon, 2 - second pokemon, 3 - third pokemon
struct Pokemon monData ;
} ;
2020-12-28 23:32:08 +01:00
struct FactoryMonPic
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
u8 monSpriteId ;
u8 bgSpriteId ;
2018-11-11 16:44:27 +01:00
} ;
2020-08-31 19:36:48 +02:00
struct FactorySelectScreen
2018-11-11 16:44:27 +01:00
{
u8 menuCursorPos ;
u8 menuCursor1SpriteId ;
u8 menuCursor2SpriteId ;
u8 cursorPos ;
u8 cursorSpriteId ;
u8 selectingMonsState ;
bool8 fromSummaryScreen ;
u8 yesNoCursorPos ;
2020-12-28 23:32:08 +01:00
u8 unused ;
2020-08-31 19:36:48 +02:00
struct FactorySelectableMon mons [ SELECTABLE_MONS_COUNT ] ;
2020-12-28 23:32:08 +01:00
struct FactoryMonPic monPics [ FRONTIER_PARTY_SIZE ] ; // Array so all chosen mons can be shown at once
bool8 monPicAnimating ;
2018-11-11 16:44:27 +01:00
u8 fadeSpeciesNameTaskId ;
2020-12-28 23:32:08 +01:00
bool8 fadeSpeciesNameActive ;
2020-08-31 19:36:48 +02:00
u16 speciesNameColorBackup ;
2020-12-28 23:32:08 +01:00
bool8 fadeSpeciesNameFadeOut ;
u8 fadeSpeciesNameCoeffDelay ;
u8 fadeSpeciesNameCoeff ;
u8 faceSpeciesNameDelay ;
2018-11-11 16:44:27 +01:00
} ;
2020-08-31 19:36:48 +02:00
struct SwapScreenAction
2018-11-11 16:44:27 +01:00
{
u8 id ;
void ( * func ) ( u8 taskId ) ;
} ;
2020-08-31 19:36:48 +02:00
struct FactorySwapScreen
2018-11-11 16:44:27 +01:00
{
u8 menuCursorPos ;
u8 menuCursor1SpriteId ;
u8 menuCursor2SpriteId ;
u8 cursorPos ;
u8 cursorSpriteId ;
2020-08-31 19:36:48 +02:00
u8 ballSpriteIds [ FRONTIER_PARTY_SIZE ] ;
2020-12-28 23:32:08 +01:00
u8 pkmnForSwapButtonSpriteIds [ 2 ] [ 3 ] ; // For this and sprite ID array below, [0][i] is the button background, [1][i] is the button highlight
u8 cancelButtonSpriteIds [ 2 ] [ 2 ] ;
2018-11-11 16:44:27 +01:00
u8 playerMonId ;
u8 enemyMonId ;
bool8 inEnemyScreen ;
bool8 fromSummaryScreen ;
u8 yesNoCursorPos ;
u8 actionsCount ;
2020-08-31 19:36:48 +02:00
const struct SwapScreenAction * actionsData ;
2020-12-30 23:35:33 +01:00
u8 unused [ 4 ] ;
2018-11-11 16:44:27 +01:00
bool8 monSwapped ;
u8 fadeSpeciesNameTaskId ;
2020-12-28 23:32:08 +01:00
bool8 fadeSpeciesNameActive ;
u16 speciesNameColorBackup ;
bool8 fadeSpeciesNameFadeOut ;
u8 fadeSpeciesNameCoeffDelay ;
u8 fadeSpeciesNameCoeff ;
u8 faceSpeciesNameDelay ;
struct FactoryMonPic monPic ;
bool8 monPicAnimating ;
2018-11-11 16:44:27 +01:00
} ;
2020-12-28 23:32:08 +01:00
static void SpriteCB_Pokeball ( struct Sprite * ) ;
static void SpriteCB_OpenMonPic ( struct Sprite * ) ;
static void OpenMonPic ( u8 * , bool8 * , bool8 ) ;
static void HideMonPic ( struct FactoryMonPic , bool8 * ) ;
static void CloseMonPic ( struct FactoryMonPic , bool8 * , bool8 ) ;
static void Task_OpenMonPic ( u8 ) ;
static void Task_CloseMonPic ( u8 ) ;
// Select screen
2018-11-11 16:44:27 +01:00
static void CB2_InitSelectScreen ( void ) ;
2020-12-28 23:32:08 +01:00
static void Select_SetWinRegs ( s16 , s16 , s16 , s16 ) ;
2018-11-11 16:44:27 +01:00
static void Select_InitMonsData ( void ) ;
static void Select_InitAllSprites ( void ) ;
2020-08-31 19:36:48 +02:00
static void Select_ReshowMonSprite ( void ) ;
2018-11-11 16:44:27 +01:00
static void Select_PrintSelectMonString ( void ) ;
static void Select_PrintMonSpecies ( void ) ;
static void Select_PrintMonCategory ( void ) ;
static void Select_PrintRentalPkmnString ( void ) ;
static void Select_CopyMonsToPlayerParty ( void ) ;
2020-12-30 23:35:33 +01:00
static void Select_ShowChosenMons ( void ) ;
2018-11-11 16:44:27 +01:00
static void Select_ShowYesNoOptions ( void ) ;
2020-12-30 23:35:33 +01:00
static void Select_HideChosenMons ( void ) ;
2018-11-11 16:44:27 +01:00
static void Select_ShowMenuOptions ( void ) ;
static void Select_PrintMenuOptions ( void ) ;
static void Select_PrintYesNoOptions ( void ) ;
2020-12-28 23:32:08 +01:00
static void Select_Task_FadeSpeciesName ( u8 ) ;
2020-12-30 23:35:33 +01:00
static void Select_Task_OpenChosenMonPics ( u8 ) ;
2020-12-28 23:32:08 +01:00
static void Select_Task_HandleChooseMons ( u8 ) ;
static void Select_Task_HandleMenu ( u8 ) ;
static void CreateFrontierFactorySelectableMons ( u8 ) ;
static void CreateSlateportTentSelectableMons ( u8 ) ;
static void Select_SetBallSpritePaletteNum ( u8 ) ;
2020-12-30 23:35:33 +01:00
static void Select_ErasePopupMenu ( u8 ) ;
2018-11-11 16:44:27 +01:00
static u8 Select_RunMenuOptionFunc ( void ) ;
2020-12-30 23:35:33 +01:00
static u8 Select_DeclineChosenMons ( void ) ;
2018-11-11 16:44:27 +01:00
static u8 Select_OptionSummary ( void ) ;
static u8 Select_OptionOthers ( void ) ;
static u8 Select_OptionRentDeselect ( void ) ;
2020-12-28 23:32:08 +01:00
static bool32 Select_AreSpeciesValid ( u16 ) ;
// Swap screen
static void CB2_InitSwapScreen ( void ) ;
2018-11-11 16:44:27 +01:00
static void Swap_DestroyAllSprites ( void ) ;
static void Swap_ShowYesNoOptions ( void ) ;
2020-12-28 23:32:08 +01:00
static void Swap_HideActionButtonHighlights ( void ) ;
2018-11-11 16:44:27 +01:00
static void sub_819EAC0 ( void ) ;
2020-12-28 23:32:08 +01:00
static void Swap_UpdateYesNoCursorPosition ( s8 ) ;
static void Swap_UpdateMenuCursorPosition ( s8 ) ;
static void Swap_ErasePopupMenu ( u8 ) ;
static void sub_819D770 ( u8 ) ;
static void Swap_Task_HandleChooseMons ( u8 ) ;
static void sub_819D588 ( u8 ) ;
static void Swap_PrintOnInfoWindow ( const u8 * ) ;
2018-11-11 16:44:27 +01:00
static void Swap_ShowMenuOptions ( void ) ;
static void Swap_PrintMenuOptions ( void ) ;
static void Swap_PrintYesNoOptions ( void ) ;
static void Swap_PrintMonSpecies ( void ) ;
static void Swap_PrintMonSpecies2 ( void ) ;
static void Swap_PrintMonSpecies3 ( void ) ;
static void Swap_PrintMonCategory ( void ) ;
static void Swap_InitAllSprites ( void ) ;
static void Swap_PrintPkmnSwap ( void ) ;
static void sub_819EADC ( void ) ;
static void sub_819EAF8 ( void ) ;
static void Swap_ShowSummaryMonSprite ( void ) ;
2020-12-28 23:32:08 +01:00
static void Swap_UpdateActionCursorPosition ( s8 ) ;
static void Swap_UpdateBallCursorPosition ( s8 ) ;
static void Swap_RunMenuOptionFunc ( u8 ) ;
static void Swap_OptionSwap ( u8 ) ;
static void Swap_OptionSummary ( u8 ) ;
static void Swap_OptionRechoose ( u8 ) ;
static void Swap_RunActionFunc ( u8 ) ;
static void Swap_TaskCantHaveSameMons ( u8 ) ;
2020-09-03 07:19:08 +02:00
static void Swap_CreateMonSprite ( void ) ;
2018-11-11 16:44:27 +01:00
static void Swap_PrintActionStrings ( void ) ;
static void Swap_PrintActionStrings2 ( void ) ;
2020-12-28 23:32:08 +01:00
static void Swap_PrintOneActionString ( u8 ) ;
static void Swap_InitActions ( u8 ) ;
static void Swap_HighlightActionButton ( u8 ) ;
static bool8 Swap_AlreadyHasSameSpecies ( u8 ) ;
static void Swap_ActionMon ( u8 ) ;
static void Swap_ActionCancel ( u8 ) ;
static void Swap_ActionPkmnForSwap ( u8 ) ;
2018-11-11 16:44:27 +01:00
static EWRAM_DATA u8 * sSelectMenuTilesetBuffer = NULL ;
2020-08-31 19:36:48 +02:00
static EWRAM_DATA u8 * sSelectMonPicBgTilesetBuffer = NULL ;
2018-11-11 16:44:27 +01:00
static EWRAM_DATA u8 * sSelectMenuTilemapBuffer = NULL ;
2020-08-31 19:36:48 +02:00
static EWRAM_DATA u8 * sSelectMonPicBgTilemapBuffer = NULL ;
2018-11-11 16:44:27 +01:00
static EWRAM_DATA struct Pokemon * sFactorySelectMons = NULL ;
static EWRAM_DATA u8 * sSwapMenuTilesetBuffer = NULL ;
2020-08-31 19:36:48 +02:00
static EWRAM_DATA u8 * sSwapMonPicBgTilesetBuffer = NULL ;
2018-11-11 16:44:27 +01:00
static EWRAM_DATA u8 * sSwapMenuTilemapBuffer = NULL ;
2020-08-31 19:36:48 +02:00
static EWRAM_DATA u8 * sSwapMonPicBgTilemapBuffer = NULL ;
static struct FactorySelectScreen * sFactorySelectScreen ;
static void ( * sSwap_CurrentOptionFunc ) ( u8 taskId ) ;
static struct FactorySwapScreen * sFactorySwapScreen ;
u8 ( * gFactorySelect_CurrentOptionFunc ) ( void ) ;
static const u16 sPokeballGray_Pal [ ] = INCBIN_U16 ( " graphics/battle_frontier/factory_screen/pokeball_gray.gbapal " ) ;
static const u16 sPokeballSelected_Pal [ ] = INCBIN_U16 ( " graphics/battle_frontier/factory_screen/pokeball_selected.gbapal " ) ;
static const u16 sInterface_Pal [ ] = INCBIN_U16 ( " graphics/battle_frontier/factory_screen/interface.gbapal " ) ; // Arrow, menu/action highlights, action box, etc
static const u8 sPokeball_Gfx [ ] = INCBIN_U8 ( " graphics/battle_frontier/factory_screen/pokeball.4bpp " ) ; // Unused, gPokeballSelection_Gfx used instead
static const u8 sArrow_Gfx [ ] = INCBIN_U8 ( " graphics/battle_frontier/factory_screen/arrow.4bpp " ) ;
static const u8 sMenuHighlightLeft_Gfx [ ] = INCBIN_U8 ( " graphics/battle_frontier/factory_screen/menu_highlight_left.4bpp " ) ;
static const u8 sMenuHighlightRight_Gfx [ ] = INCBIN_U8 ( " graphics/battle_frontier/factory_screen/menu_highlight_right.4bpp " ) ;
static const u8 sActionBoxLeft_Gfx [ ] = INCBIN_U8 ( " graphics/battle_frontier/factory_screen/action_box_left.4bpp " ) ;
static const u8 sActionBoxRight_Gfx [ ] = INCBIN_U8 ( " graphics/battle_frontier/factory_screen/action_box_right.4bpp " ) ;
static const u8 sActionHighlightLeft_Gfx [ ] = INCBIN_U8 ( " graphics/battle_frontier/factory_screen/action_highlight_left.4bpp " ) ;
static const u8 sActionHighlightMiddle_Gfx [ ] = INCBIN_U8 ( " graphics/battle_frontier/factory_screen/action_highlight_middle.4bpp " ) ;
static const u8 sActionHighlightRight_Gfx [ ] = INCBIN_U8 ( " graphics/battle_frontier/factory_screen/action_highlight_right.4bpp " ) ;
static const u8 sMonPicBgAnim_Gfx [ ] = INCBIN_U8 ( " graphics/battle_frontier/factory_screen/mon_pic_bg_anim.4bpp " ) ;
static const u8 sMonPicBg_Tilemap [ ] = INCBIN_U8 ( " graphics/battle_frontier/factory_screen/mon_pic_bg.bin " ) ;
static const u8 sMonPicBg_Gfx [ ] = INCBIN_U8 ( " graphics/battle_frontier/factory_screen/mon_pic_bg.4bpp " ) ;
static const u16 sMonPicBg_Pal [ ] = INCBIN_U16 ( " graphics/battle_frontier/factory_screen/mon_pic_bg.gbapal " ) ;
static const struct SpriteSheet sSelect_SpriteSheets [ ] =
{
{ sArrow_Gfx , sizeof ( sArrow_Gfx ) , GFXTAG_ARROW } ,
{ sMenuHighlightLeft_Gfx , sizeof ( sMenuHighlightLeft_Gfx ) , GFXTAG_MENU_HIGHLIGHT_LEFT } ,
{ sMenuHighlightRight_Gfx , sizeof ( sMenuHighlightRight_Gfx ) , GFXTAG_MENU_HIGHLIGHT_RIGHT } ,
{ sMonPicBgAnim_Gfx , sizeof ( sMonPicBgAnim_Gfx ) , GFXTAG_MON_PIC_BG_ANIM } ,
2018-11-11 16:44:27 +01:00
{ } ,
} ;
2020-08-31 19:36:48 +02:00
static const struct CompressedSpriteSheet sSelect_BallGfx [ ] =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
{ gPokeballSelection_Gfx , 0x800 , GFXTAG_BALL } ,
2018-11-11 16:44:27 +01:00
{ } ,
} ;
2020-08-31 19:36:48 +02:00
static const struct SpritePalette sSelect_SpritePalettes [ ] =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
{ sPokeballGray_Pal , PALTAG_BALL_GRAY } ,
{ sPokeballSelected_Pal , PALTAG_BALL_SELECTED } ,
{ sInterface_Pal , PALTAG_INTERFACE } ,
{ sMonPicBg_Pal , PALTAG_MON_PIC_BG } ,
2018-11-11 16:44:27 +01:00
{ } ,
} ;
2020-12-28 23:32:08 +01:00
u8 static ( * const sSelect_MenuOptionFuncs [ ] ) ( void ) =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
Select_OptionSummary ,
Select_OptionRentDeselect ,
Select_OptionOthers
2018-11-11 16:44:27 +01:00
} ;
static const struct BgTemplate sSelect_BgTemplates [ ] =
{
{
. bg = 0 ,
. charBaseIndex = 0 ,
. mapBaseIndex = 24 ,
. screenSize = 0 ,
. paletteMode = 0 ,
. priority = 0 ,
. baseTile = 0
} ,
{
. bg = 1 ,
. charBaseIndex = 1 ,
. mapBaseIndex = 25 ,
. screenSize = 0 ,
. paletteMode = 0 ,
. priority = 3 ,
. baseTile = 0
} ,
{
. bg = 3 ,
. charBaseIndex = 2 ,
. mapBaseIndex = 27 ,
. screenSize = 0 ,
. paletteMode = 0 ,
. priority = 2 ,
. baseTile = 0
} ,
} ;
2020-12-28 23:32:08 +01:00
enum {
SELECT_WIN_TITLE ,
SELECT_WIN_SPECIES ,
SELECT_WIN_INFO ,
SELECT_WIN_OPTIONS ,
SELECT_WIN_YES_NO ,
SELECT_WIN_MON_CATEGORY ,
} ;
2018-11-11 16:44:27 +01:00
static const struct WindowTemplate sSelect_WindowTemplates [ ] =
{
2020-12-28 23:32:08 +01:00
[ SELECT_WIN_TITLE ] = {
2018-11-11 16:44:27 +01:00
. bg = 0 ,
. tilemapLeft = 0 ,
. tilemapTop = 2 ,
. width = 12 ,
. height = 2 ,
. paletteNum = 15 ,
. baseBlock = 0x0001 ,
} ,
2020-12-28 23:32:08 +01:00
[ SELECT_WIN_SPECIES ] = {
2018-11-11 16:44:27 +01:00
. bg = 0 ,
. tilemapLeft = 19 ,
. tilemapTop = 2 ,
. width = 11 ,
. height = 2 ,
. paletteNum = 14 ,
. baseBlock = 0x0019 ,
} ,
2020-12-28 23:32:08 +01:00
[ SELECT_WIN_INFO ] = {
2018-11-11 16:44:27 +01:00
. bg = 0 ,
. tilemapLeft = 0 ,
. tilemapTop = 15 ,
. width = 20 ,
. height = 3 ,
. paletteNum = 15 ,
. baseBlock = 0x002f ,
} ,
2020-12-28 23:32:08 +01:00
[ SELECT_WIN_OPTIONS ] = {
2018-11-11 16:44:27 +01:00
. bg = 0 ,
. tilemapLeft = 22 ,
. tilemapTop = 14 ,
. width = 8 ,
. height = 6 ,
. paletteNum = 15 ,
. baseBlock = 0x006b ,
} ,
2020-12-28 23:32:08 +01:00
[ SELECT_WIN_YES_NO ] = {
2018-11-11 16:44:27 +01:00
. bg = 0 ,
. tilemapLeft = 22 ,
. tilemapTop = 14 ,
. width = 8 ,
. height = 4 ,
. paletteNum = 15 ,
. baseBlock = 0x009b ,
} ,
2020-12-28 23:32:08 +01:00
[ SELECT_WIN_MON_CATEGORY ] = {
2018-11-11 16:44:27 +01:00
. bg = 0 ,
. tilemapLeft = 15 ,
. tilemapTop = 0 ,
. width = 15 ,
. height = 2 ,
. paletteNum = 15 ,
. baseBlock = 0x00bb ,
} ,
DUMMY_WIN_TEMPLATE ,
} ;
2020-08-31 19:36:48 +02:00
static const u16 sSelectText_Pal [ ] = INCBIN_U16 ( " graphics/battle_frontier/factory_screen/text.gbapal " ) ;
2019-12-10 19:48:20 +01:00
static const u8 sMenuOptionTextColors [ ] = { TEXT_COLOR_TRANSPARENT , TEXT_COLOR_DARK_GREY , TEXT_COLOR_TRANSPARENT } ;
static const u8 sSpeciesNameTextColors [ ] = { TEXT_COLOR_TRANSPARENT , TEXT_COLOR_RED , TEXT_COLOR_TRANSPARENT } ;
2018-11-11 16:44:27 +01:00
2020-08-31 19:36:48 +02:00
static const struct OamData sOam_Select_Pokeball =
2018-11-11 16:44:27 +01:00
{
. y = 0 ,
2019-12-04 21:25:13 +01:00
. affineMode = ST_OAM_AFFINE_OFF ,
. objMode = ST_OAM_OBJ_NORMAL ,
2018-11-11 16:44:27 +01:00
. mosaic = 0 ,
2019-12-04 21:25:13 +01:00
. bpp = ST_OAM_4BPP ,
2019-03-11 08:12:15 +01:00
. shape = SPRITE_SHAPE ( 32 x32 ) ,
2018-11-11 16:44:27 +01:00
. x = 0 ,
. matrixNum = 0 ,
2019-03-11 08:12:15 +01:00
. size = SPRITE_SIZE ( 32 x32 ) ,
2018-11-11 16:44:27 +01:00
. tileNum = 0 ,
. priority = 3 ,
. paletteNum = 0 ,
. affineParam = 0 ,
} ;
2020-08-31 19:36:48 +02:00
static const struct OamData sOam_Select_Arrow =
2018-11-11 16:44:27 +01:00
{
. y = 0 ,
2019-12-04 21:25:13 +01:00
. affineMode = ST_OAM_AFFINE_OFF ,
. objMode = ST_OAM_OBJ_NORMAL ,
2018-11-11 16:44:27 +01:00
. mosaic = 0 ,
2019-12-04 21:25:13 +01:00
. bpp = ST_OAM_4BPP ,
2019-03-11 08:12:15 +01:00
. shape = SPRITE_SHAPE ( 16 x16 ) ,
2018-11-11 16:44:27 +01:00
. x = 0 ,
. matrixNum = 0 ,
2019-03-11 08:12:15 +01:00
. size = SPRITE_SIZE ( 16 x16 ) ,
2018-11-11 16:44:27 +01:00
. tileNum = 0 ,
. priority = 3 ,
. paletteNum = 0 ,
. affineParam = 0 ,
} ;
2020-08-31 19:36:48 +02:00
static const struct OamData sOam_Select_MenuHighlight =
2018-11-11 16:44:27 +01:00
{
. y = 0 ,
2019-12-04 21:25:13 +01:00
. affineMode = ST_OAM_AFFINE_OFF ,
. objMode = ST_OAM_OBJ_NORMAL ,
2018-11-11 16:44:27 +01:00
. mosaic = 0 ,
2019-12-04 21:25:13 +01:00
. bpp = ST_OAM_4BPP ,
2019-03-11 08:12:15 +01:00
. shape = SPRITE_SHAPE ( 32 x16 ) ,
2018-11-11 16:44:27 +01:00
. x = 0 ,
. matrixNum = 0 ,
2019-03-11 08:12:15 +01:00
. size = SPRITE_SIZE ( 32 x16 ) ,
2018-11-11 16:44:27 +01:00
. tileNum = 0 ,
. priority = 2 ,
. paletteNum = 0 ,
. affineParam = 0 ,
} ;
2020-08-31 19:36:48 +02:00
static const struct OamData sOam_Select_MonPicBgAnim =
2018-11-11 16:44:27 +01:00
{
. y = 0 ,
2019-12-04 21:25:13 +01:00
. affineMode = ST_OAM_AFFINE_DOUBLE ,
. objMode = ST_OAM_OBJ_BLEND ,
2018-11-11 16:44:27 +01:00
. mosaic = 0 ,
2019-12-04 21:25:13 +01:00
. bpp = ST_OAM_4BPP ,
2019-03-11 08:12:15 +01:00
. shape = SPRITE_SHAPE ( 64 x64 ) ,
2018-11-11 16:44:27 +01:00
. x = 0 ,
. matrixNum = 0 ,
2019-03-11 08:12:15 +01:00
. size = SPRITE_SIZE ( 64 x64 ) ,
2018-11-11 16:44:27 +01:00
. tileNum = 0 ,
. priority = 0 ,
. paletteNum = 0 ,
. affineParam = 1 ,
} ;
2020-08-31 19:36:48 +02:00
static const union AnimCmd sAnim_Select_Interface [ ] =
2018-11-11 16:44:27 +01:00
{
ANIMCMD_FRAME ( 0 , 1 ) ,
ANIMCMD_END ,
} ;
2020-08-31 19:36:48 +02:00
static const union AnimCmd sAnim_Select_MonPicBgAnim [ ] =
2018-11-11 16:44:27 +01:00
{
ANIMCMD_FRAME ( 0 , 1 ) ,
ANIMCMD_END ,
} ;
2020-08-31 19:36:48 +02:00
static const union AnimCmd sAnim_Select_Pokeball_Still [ ] =
2018-11-11 16:44:27 +01:00
{
ANIMCMD_FRAME ( 0 , 30 ) ,
ANIMCMD_END ,
} ;
2020-08-31 19:36:48 +02:00
static const union AnimCmd sAnim_Select_Pokeball_Moving [ ] =
2018-11-11 16:44:27 +01:00
{
ANIMCMD_FRAME ( 16 , 4 ) ,
ANIMCMD_FRAME ( 0 , 4 ) ,
ANIMCMD_FRAME ( 32 , 4 ) ,
ANIMCMD_FRAME ( 0 , 4 ) ,
ANIMCMD_FRAME ( 16 , 4 ) ,
ANIMCMD_FRAME ( 0 , 4 ) ,
ANIMCMD_FRAME ( 32 , 4 ) ,
ANIMCMD_FRAME ( 0 , 4 ) ,
ANIMCMD_FRAME ( 0 , 32 ) ,
ANIMCMD_FRAME ( 16 , 8 ) ,
ANIMCMD_FRAME ( 0 , 8 ) ,
ANIMCMD_FRAME ( 32 , 8 ) ,
ANIMCMD_FRAME ( 0 , 8 ) ,
ANIMCMD_FRAME ( 16 , 8 ) ,
ANIMCMD_FRAME ( 0 , 8 ) ,
ANIMCMD_FRAME ( 32 , 8 ) ,
ANIMCMD_FRAME ( 0 , 8 ) ,
ANIMCMD_END ,
} ;
2020-08-31 19:36:48 +02:00
static const union AnimCmd * const sAnims_Select_Interface [ ] =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
sAnim_Select_Interface ,
2018-11-11 16:44:27 +01:00
} ;
2020-08-31 19:36:48 +02:00
static const union AnimCmd * const sAnims_Select_MonPicBgAnim [ ] =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
sAnim_Select_MonPicBgAnim ,
2018-11-11 16:44:27 +01:00
} ;
2020-08-31 19:36:48 +02:00
static const union AnimCmd * const sAnims_Select_Pokeball [ ] =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
sAnim_Select_Pokeball_Still ,
sAnim_Select_Pokeball_Moving ,
2018-11-11 16:44:27 +01:00
} ;
static const union AffineAnimCmd gUnknown_0861050C [ ] =
{
AFFINEANIMCMD_FRAME ( 5 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 16 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 32 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 64 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 128 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 256 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_END ,
} ;
static const union AffineAnimCmd gUnknown_0861056C [ ] =
{
AFFINEANIMCMD_FRAME ( 128 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 64 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 32 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 16 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 5 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_END ,
} ;
static const union AffineAnimCmd gUnknown_086105BC [ ] =
{
AFFINEANIMCMD_FRAME ( 256 , 256 , 0 , 0 ) ,
AFFINEANIMCMD_END ,
} ;
2020-08-31 19:36:48 +02:00
static const union AffineAnimCmd * const sAffineAnims_Select_MonPicBgAnim [ ] =
2018-11-11 16:44:27 +01:00
{
gUnknown_0861050C ,
gUnknown_0861056C ,
gUnknown_086105BC ,
} ;
2020-08-31 19:36:48 +02:00
static const struct SpriteTemplate sSpriteTemplate_Select_Pokeball =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
. tileTag = GFXTAG_BALL ,
. paletteTag = PALTAG_BALL_GRAY ,
. oam = & sOam_Select_Pokeball ,
. anims = sAnims_Select_Pokeball ,
2018-11-11 16:44:27 +01:00
. images = NULL ,
. affineAnims = gDummySpriteAffineAnimTable ,
2020-08-31 19:36:48 +02:00
. callback = SpriteCB_Pokeball
2018-11-11 16:44:27 +01:00
} ;
2020-08-31 19:36:48 +02:00
static const struct SpriteTemplate sSpriteTemplate_Select_Arrow =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
. tileTag = GFXTAG_ARROW ,
. paletteTag = PALTAG_INTERFACE ,
. oam = & sOam_Select_Arrow ,
. anims = sAnims_Select_Interface ,
2018-11-11 16:44:27 +01:00
. images = NULL ,
. affineAnims = gDummySpriteAffineAnimTable ,
. callback = SpriteCallbackDummy
} ;
2020-08-31 19:36:48 +02:00
static const struct SpriteTemplate sSpriteTemplate_Select_MenuHighlightLeft =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
. tileTag = GFXTAG_MENU_HIGHLIGHT_LEFT ,
. paletteTag = PALTAG_INTERFACE ,
. oam = & sOam_Select_MenuHighlight ,
. anims = sAnims_Select_Interface ,
2018-11-11 16:44:27 +01:00
. images = NULL ,
. affineAnims = gDummySpriteAffineAnimTable ,
. callback = SpriteCallbackDummy
} ;
2020-08-31 19:36:48 +02:00
static const struct SpriteTemplate sSpriteTemplate_Select_MenuHighlightRight =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
. tileTag = GFXTAG_MENU_HIGHLIGHT_RIGHT ,
. paletteTag = PALTAG_INTERFACE ,
. oam = & sOam_Select_MenuHighlight ,
. anims = sAnims_Select_Interface ,
2018-11-11 16:44:27 +01:00
. images = NULL ,
. affineAnims = gDummySpriteAffineAnimTable ,
. callback = SpriteCallbackDummy
} ;
2020-08-31 19:36:48 +02:00
static const struct SpriteTemplate sSpriteTemplate_Select_MonPicBgAnim =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
. tileTag = GFXTAG_MON_PIC_BG_ANIM ,
. paletteTag = PALTAG_MON_PIC_BG ,
. oam = & sOam_Select_MonPicBgAnim ,
. anims = sAnims_Select_MonPicBgAnim ,
2018-11-11 16:44:27 +01:00
. images = NULL ,
2020-08-31 19:36:48 +02:00
. affineAnims = sAffineAnims_Select_MonPicBgAnim ,
2018-11-11 16:44:27 +01:00
. callback = SpriteCallbackDummy
} ;
2020-08-31 19:36:48 +02:00
static const struct SpriteSheet sSwap_SpriteSheets [ ] =
{
{ sArrow_Gfx , sizeof ( sArrow_Gfx ) , GFXTAG_ARROW } ,
{ sMenuHighlightLeft_Gfx , sizeof ( sMenuHighlightLeft_Gfx ) , GFXTAG_MENU_HIGHLIGHT_LEFT } ,
{ sMenuHighlightRight_Gfx , sizeof ( sMenuHighlightRight_Gfx ) , GFXTAG_MENU_HIGHLIGHT_RIGHT } ,
{ sActionBoxLeft_Gfx , sizeof ( sActionBoxLeft_Gfx ) , GFXTAG_ACTION_BOX_LEFT } ,
{ sActionBoxRight_Gfx , sizeof ( sActionBoxRight_Gfx ) , GFXTAG_ACTION_BOX_RIGHT } ,
{ sActionHighlightLeft_Gfx , 0x100 , GFXTAG_ACTION_HIGHLIGHT_LEFT } ,
{ sActionHighlightMiddle_Gfx , sizeof ( sActionHighlightMiddle_Gfx ) , GFXTAG_ACTION_HIGHLIGHT_MIDDLE } ,
{ sActionHighlightRight_Gfx , sizeof ( sActionHighlightRight_Gfx ) , GFXTAG_ACTION_HIGHLIGHT_RIGHT } ,
{ sMonPicBgAnim_Gfx , sizeof ( sMonPicBgAnim_Gfx ) , GFXTAG_MON_PIC_BG_ANIM } ,
2018-11-11 16:44:27 +01:00
{ } ,
} ;
2020-08-31 19:36:48 +02:00
static const struct CompressedSpriteSheet sSwap_BallGfx [ ] =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
{ gPokeballSelection_Gfx , 0x800 , GFXTAG_BALL } ,
2018-11-11 16:44:27 +01:00
{ } ,
} ;
2020-08-31 19:36:48 +02:00
static const struct SpritePalette sSwap_SpritePalettes [ ] =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
{ sPokeballGray_Pal , PALTAG_BALL_GRAY } ,
{ sPokeballSelected_Pal , PALTAG_BALL_SELECTED } ,
{ sInterface_Pal , PALTAG_INTERFACE } ,
{ sMonPicBg_Pal , PALTAG_MON_PIC_BG } ,
2018-11-11 16:44:27 +01:00
{ } ,
} ;
2020-08-31 19:36:48 +02:00
static const struct OamData sOam_Swap_Pokeball =
2018-11-11 16:44:27 +01:00
{
. y = 0 ,
2019-12-04 21:25:13 +01:00
. affineMode = ST_OAM_AFFINE_OFF ,
. objMode = ST_OAM_OBJ_NORMAL ,
2018-11-11 16:44:27 +01:00
. mosaic = 0 ,
2019-12-04 21:25:13 +01:00
. bpp = ST_OAM_4BPP ,
2019-12-05 04:26:43 +01:00
. shape = SPRITE_SHAPE ( 32 x32 ) ,
2018-11-11 16:44:27 +01:00
. x = 0 ,
. matrixNum = 0 ,
2019-12-05 04:26:43 +01:00
. size = SPRITE_SIZE ( 32 x32 ) ,
2018-11-11 16:44:27 +01:00
. tileNum = 0 ,
. priority = 3 ,
. paletteNum = 0 ,
. affineParam = 0 ,
} ;
2020-08-31 19:36:48 +02:00
static const struct OamData sOam_Swap_Arrow =
2018-11-11 16:44:27 +01:00
{
. y = 0 ,
2019-12-04 21:25:13 +01:00
. affineMode = ST_OAM_AFFINE_OFF ,
. objMode = ST_OAM_OBJ_NORMAL ,
2018-11-11 16:44:27 +01:00
. mosaic = 0 ,
2019-12-04 21:25:13 +01:00
. bpp = ST_OAM_4BPP ,
2019-12-05 04:26:43 +01:00
. shape = SPRITE_SHAPE ( 16 x16 ) ,
2018-11-11 16:44:27 +01:00
. x = 0 ,
. matrixNum = 0 ,
2019-12-05 04:26:43 +01:00
. size = SPRITE_SIZE ( 16 x16 ) ,
2018-11-11 16:44:27 +01:00
. tileNum = 0 ,
. priority = 3 ,
. paletteNum = 0 ,
. affineParam = 0 ,
} ;
2020-08-31 19:36:48 +02:00
static const struct OamData sOam_Swap_MenuHighlight =
2018-11-11 16:44:27 +01:00
{
. y = 0 ,
2019-12-04 21:25:13 +01:00
. affineMode = ST_OAM_AFFINE_OFF ,
. objMode = ST_OAM_OBJ_NORMAL ,
2018-11-11 16:44:27 +01:00
. mosaic = 0 ,
2019-12-04 21:25:13 +01:00
. bpp = ST_OAM_4BPP ,
2019-12-05 04:26:43 +01:00
. shape = SPRITE_SHAPE ( 32 x16 ) ,
2018-11-11 16:44:27 +01:00
. x = 0 ,
. matrixNum = 0 ,
2019-12-05 04:26:43 +01:00
. size = SPRITE_SIZE ( 32 x16 ) ,
2018-11-11 16:44:27 +01:00
. tileNum = 0 ,
. priority = 2 ,
. paletteNum = 0 ,
. affineParam = 0 ,
} ;
2020-12-28 23:32:08 +01:00
static const struct OamData sOam_Swap_MonPicBgAnim =
2018-11-11 16:44:27 +01:00
{
. y = 0 ,
2019-12-04 21:25:13 +01:00
. affineMode = ST_OAM_AFFINE_DOUBLE ,
. objMode = ST_OAM_OBJ_BLEND ,
2018-11-11 16:44:27 +01:00
. mosaic = 0 ,
2019-12-04 21:25:13 +01:00
. bpp = ST_OAM_4BPP ,
2019-12-05 04:26:43 +01:00
. shape = SPRITE_SHAPE ( 64 x64 ) ,
2018-11-11 16:44:27 +01:00
. x = 0 ,
. matrixNum = 0 ,
2019-12-05 04:26:43 +01:00
. size = SPRITE_SIZE ( 64 x64 ) ,
2018-11-11 16:44:27 +01:00
. tileNum = 0 ,
. priority = 0 ,
. paletteNum = 0 ,
. affineParam = 1 ,
} ;
2020-08-31 19:36:48 +02:00
static const union AnimCmd sAnim_Swap_Interface [ ] =
2018-11-11 16:44:27 +01:00
{
ANIMCMD_FRAME ( 0 , 1 ) ,
ANIMCMD_END ,
} ;
2020-12-28 23:32:08 +01:00
static const union AnimCmd sAnim_Swap_MonPicBgAnim [ ] =
2018-11-11 16:44:27 +01:00
{
ANIMCMD_FRAME ( 0 , 1 ) ,
ANIMCMD_END ,
} ;
2020-08-31 19:36:48 +02:00
static const union AnimCmd sAnim_Swap_Pokeball_Still [ ] =
2018-11-11 16:44:27 +01:00
{
ANIMCMD_FRAME ( 0 , 30 ) ,
ANIMCMD_END ,
} ;
2020-08-31 19:36:48 +02:00
static const union AnimCmd sAnim_Swap_Pokeball_Moving [ ] =
2018-11-11 16:44:27 +01:00
{
ANIMCMD_FRAME ( 16 , 4 ) ,
ANIMCMD_FRAME ( 0 , 4 ) ,
ANIMCMD_FRAME ( 32 , 4 ) ,
ANIMCMD_FRAME ( 0 , 4 ) ,
ANIMCMD_FRAME ( 16 , 4 ) ,
ANIMCMD_FRAME ( 0 , 4 ) ,
ANIMCMD_FRAME ( 32 , 4 ) ,
ANIMCMD_FRAME ( 0 , 4 ) ,
ANIMCMD_FRAME ( 0 , 32 ) ,
ANIMCMD_FRAME ( 16 , 8 ) ,
ANIMCMD_FRAME ( 0 , 8 ) ,
ANIMCMD_FRAME ( 32 , 8 ) ,
ANIMCMD_FRAME ( 0 , 8 ) ,
ANIMCMD_FRAME ( 16 , 8 ) ,
ANIMCMD_FRAME ( 0 , 8 ) ,
ANIMCMD_FRAME ( 32 , 8 ) ,
ANIMCMD_FRAME ( 0 , 8 ) ,
ANIMCMD_END ,
} ;
2020-08-31 19:36:48 +02:00
static const union AnimCmd * const sAnims_Swap_Interface [ ] =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
sAnim_Swap_Interface ,
2018-11-11 16:44:27 +01:00
} ;
2020-12-28 23:32:08 +01:00
static const union AnimCmd * const sAnims_Swap_MonPicBgAnim [ ] =
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
sAnim_Swap_MonPicBgAnim ,
2018-11-11 16:44:27 +01:00
} ;
2020-08-31 19:36:48 +02:00
static const union AnimCmd * const sAnims_Swap_Pokeball [ ] =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
sAnim_Swap_Pokeball_Still ,
sAnim_Swap_Pokeball_Moving ,
2018-11-11 16:44:27 +01:00
} ;
static const union AffineAnimCmd gUnknown_08610768 [ ] =
{
AFFINEANIMCMD_FRAME ( 5 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 16 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 32 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 64 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 128 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 256 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_END ,
} ;
static const union AffineAnimCmd gUnknown_086107C8 [ ] =
{
AFFINEANIMCMD_FRAME ( 128 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 64 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 32 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 16 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_FRAME ( 0 , 0 , 0 , 1 ) ,
AFFINEANIMCMD_FRAME ( 5 , 5 , 0 , 0 ) ,
AFFINEANIMCMD_END ,
} ;
static const union AffineAnimCmd gUnknown_08610818 [ ] =
{
AFFINEANIMCMD_FRAME ( 256 , 256 , 0 , 0 ) ,
AFFINEANIMCMD_END ,
} ;
2020-12-28 23:32:08 +01:00
static const union AffineAnimCmd * const sAffineAnims_Swap_MonPicBgAnim [ ] =
2018-11-11 16:44:27 +01:00
{
gUnknown_08610768 ,
gUnknown_086107C8 ,
gUnknown_08610818 ,
} ;
2020-08-31 19:36:48 +02:00
static const struct SpriteTemplate sSpriteTemplate_Swap_Pokeball =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
. tileTag = GFXTAG_BALL ,
. paletteTag = PALTAG_BALL_GRAY ,
. oam = & sOam_Swap_Pokeball ,
. anims = sAnims_Swap_Pokeball ,
2018-11-11 16:44:27 +01:00
. images = NULL ,
. affineAnims = gDummySpriteAffineAnimTable ,
2020-08-31 19:36:48 +02:00
. callback = SpriteCB_Pokeball
2018-11-11 16:44:27 +01:00
} ;
2020-08-31 19:36:48 +02:00
static const struct SpriteTemplate sSpriteTemplate_Swap_Arrow =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
. tileTag = GFXTAG_ARROW ,
. paletteTag = PALTAG_INTERFACE ,
. oam = & sOam_Swap_Arrow ,
. anims = sAnims_Swap_Interface ,
2018-11-11 16:44:27 +01:00
. images = NULL ,
. affineAnims = gDummySpriteAffineAnimTable ,
. callback = SpriteCallbackDummy
} ;
2020-08-31 19:36:48 +02:00
static const struct SpriteTemplate sSpriteTemplate_Swap_MenuHighlightLeft =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
. tileTag = GFXTAG_MENU_HIGHLIGHT_LEFT ,
. paletteTag = PALTAG_INTERFACE ,
. oam = & sOam_Swap_MenuHighlight ,
. anims = sAnims_Swap_Interface ,
2018-11-11 16:44:27 +01:00
. images = NULL ,
. affineAnims = gDummySpriteAffineAnimTable ,
. callback = SpriteCallbackDummy
} ;
2020-08-31 19:36:48 +02:00
static const struct SpriteTemplate sSpriteTemplate_Swap_MenuHighlightRight =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
. tileTag = GFXTAG_MENU_HIGHLIGHT_RIGHT ,
. paletteTag = PALTAG_INTERFACE ,
. oam = & sOam_Swap_MenuHighlight ,
. anims = sAnims_Swap_Interface ,
2018-11-11 16:44:27 +01:00
. images = NULL ,
. affineAnims = gDummySpriteAffineAnimTable ,
. callback = SpriteCallbackDummy
} ;
2020-08-31 19:36:48 +02:00
static const struct SpriteTemplate sSpriteTemplate_Swap_MonPicBgAnim =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
. tileTag = GFXTAG_MON_PIC_BG_ANIM ,
. paletteTag = PALTAG_MON_PIC_BG ,
2020-12-28 23:32:08 +01:00
. oam = & sOam_Swap_MonPicBgAnim ,
. anims = sAnims_Swap_MonPicBgAnim ,
2018-11-11 16:44:27 +01:00
. images = NULL ,
2020-12-28 23:32:08 +01:00
. affineAnims = sAffineAnims_Swap_MonPicBgAnim ,
2018-11-11 16:44:27 +01:00
. callback = SpriteCallbackDummy
} ;
2020-12-28 23:32:08 +01:00
void static ( * const sSwap_MenuOptionFuncs [ ] ) ( u8 taskId ) =
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
Swap_OptionSummary ,
Swap_OptionSwap ,
Swap_OptionRechoose ,
2018-11-11 16:44:27 +01:00
} ;
static const struct BgTemplate sSwap_BgTemplates [ 4 ] =
{
{
. bg = 0 ,
. charBaseIndex = 0 ,
. mapBaseIndex = 24 ,
. screenSize = 0 ,
. paletteMode = 0 ,
. priority = 1 ,
. baseTile = 0
} ,
{
. bg = 1 ,
. charBaseIndex = 1 ,
. mapBaseIndex = 25 ,
. screenSize = 0 ,
. paletteMode = 0 ,
. priority = 3 ,
. baseTile = 0
} ,
{
. bg = 2 ,
. charBaseIndex = 2 ,
. mapBaseIndex = 26 ,
. screenSize = 0 ,
. paletteMode = 0 ,
. priority = 0 ,
. baseTile = 0
} ,
{
. bg = 3 ,
. charBaseIndex = 2 ,
. mapBaseIndex = 27 ,
. screenSize = 0 ,
. paletteMode = 0 ,
. priority = 2 ,
. baseTile = 0
} ,
} ;
2020-12-28 23:32:08 +01:00
enum {
SWAP_WIN_TITLE ,
SWAP_WIN_SPECIES ,
SWAP_WIN_INFO ,
SWAP_WIN_OPTIONS ,
SWAP_WIN_YES_NO ,
SWAP_WIN_5 ,
SWAP_WIN_6 ,
SWAP_WIN_7 ,
SWAP_WIN_MON_CATEGORY ,
} ;
2018-11-11 16:44:27 +01:00
static const struct WindowTemplate sSwap_WindowTemplates [ ] =
{
2020-12-28 23:32:08 +01:00
[ SWAP_WIN_TITLE ] = {
2018-11-11 16:44:27 +01:00
. bg = 0 ,
. tilemapLeft = 0 ,
. tilemapTop = 2 ,
. width = 12 ,
. height = 2 ,
. paletteNum = 15 ,
. baseBlock = 0x0001 ,
} ,
2020-12-28 23:32:08 +01:00
[ SWAP_WIN_SPECIES ] = {
2018-11-11 16:44:27 +01:00
. bg = 2 ,
. tilemapLeft = 19 ,
. tilemapTop = 2 ,
. width = 11 ,
. height = 2 ,
. paletteNum = 14 ,
. baseBlock = 0x0019 ,
} ,
2020-12-28 23:32:08 +01:00
[ SWAP_WIN_INFO ] = {
2018-11-11 16:44:27 +01:00
. bg = 0 ,
. tilemapLeft = 0 ,
. tilemapTop = 15 ,
. width = 20 ,
. height = 3 ,
. paletteNum = 15 ,
. baseBlock = 0x002f ,
} ,
2020-12-28 23:32:08 +01:00
[ SWAP_WIN_OPTIONS ] = {
2018-11-11 16:44:27 +01:00
. bg = 0 ,
. tilemapLeft = 21 ,
. tilemapTop = 14 ,
. width = 9 ,
. height = 6 ,
. paletteNum = 15 ,
. baseBlock = 0x006b ,
} ,
2020-12-28 23:32:08 +01:00
[ SWAP_WIN_YES_NO ] = {
2018-11-11 16:44:27 +01:00
. bg = 0 ,
. tilemapLeft = 22 ,
. tilemapTop = 14 ,
. width = 8 ,
. height = 4 ,
. paletteNum = 15 ,
. baseBlock = 0x00a1 ,
} ,
2020-12-28 23:32:08 +01:00
[ SWAP_WIN_5 ] = {
2018-11-11 16:44:27 +01:00
. bg = 2 ,
. tilemapLeft = 21 ,
. tilemapTop = 15 ,
. width = 9 ,
. height = 5 ,
. paletteNum = 14 ,
. baseBlock = 0x006b ,
} ,
2020-12-28 23:32:08 +01:00
[ SWAP_WIN_6 ] = {
2018-11-11 16:44:27 +01:00
. bg = 2 ,
. tilemapLeft = 10 ,
. tilemapTop = 2 ,
. width = 4 ,
. height = 2 ,
. paletteNum = 14 ,
. baseBlock = 0x00c1 ,
} ,
2020-12-28 23:32:08 +01:00
[ SWAP_WIN_7 ] = {
2018-11-11 16:44:27 +01:00
. bg = 0 ,
. tilemapLeft = 19 ,
. tilemapTop = 2 ,
. width = 11 ,
. height = 2 ,
. paletteNum = 15 ,
. baseBlock = 0x00c9 ,
} ,
2020-12-28 23:32:08 +01:00
[ SWAP_WIN_MON_CATEGORY ] = {
2018-11-11 16:44:27 +01:00
. bg = 0 ,
. tilemapLeft = 15 ,
. tilemapTop = 0 ,
. width = 15 ,
. height = 2 ,
. paletteNum = 15 ,
. baseBlock = 0x00df ,
} ,
DUMMY_WIN_TEMPLATE ,
} ;
2020-08-31 19:36:48 +02:00
static const u16 sSwapText_Pal [ ] = INCBIN_U16 ( " graphics/battle_frontier/factory_screen/text.gbapal " ) ; // Identical to sSelectText_Pal
2019-12-10 19:48:20 +01:00
static const u8 sSwapMenuOptionsTextColors [ ] = { TEXT_COLOR_TRANSPARENT , TEXT_COLOR_DARK_GREY , TEXT_COLOR_TRANSPARENT } ;
static const u8 sSwapSpeciesNameTextColors [ ] = { TEXT_COLOR_TRANSPARENT , TEXT_COLOR_RED , TEXT_COLOR_TRANSPARENT } ;
2018-11-11 16:44:27 +01:00
2020-12-28 23:32:08 +01:00
# define SWAPACTION_MON 1
# define SWAPACTION_PKMN_FOR_SWAP 2
# define SWAPACTION_CANCEL 3
2020-08-31 19:36:48 +02:00
static const struct SwapScreenAction sSwap_PlayerScreenActions [ ] =
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
{ . id = SWAPACTION_MON , . func = Swap_ActionMon } ,
{ . id = SWAPACTION_MON , . func = Swap_ActionMon } ,
{ . id = SWAPACTION_MON , . func = Swap_ActionMon } ,
{ . id = SWAPACTION_CANCEL , . func = Swap_ActionCancel } ,
2018-11-11 16:44:27 +01:00
} ;
2020-08-31 19:36:48 +02:00
static const struct SwapScreenAction sSwap_EnemyScreenActions [ ] =
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
{ . id = SWAPACTION_MON , . func = Swap_ActionMon } ,
{ . id = SWAPACTION_MON , . func = Swap_ActionMon } ,
{ . id = SWAPACTION_MON , . func = Swap_ActionMon } ,
{ . id = SWAPACTION_PKMN_FOR_SWAP , . func = Swap_ActionPkmnForSwap } ,
{ . id = SWAPACTION_CANCEL , . func = Swap_ActionCancel } ,
2018-11-11 16:44:27 +01:00
} ;
2020-08-31 19:36:48 +02:00
static void SpriteCB_Pokeball ( struct Sprite * sprite )
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
if ( sprite - > oam . paletteNum = = IndexOfSpritePaletteTag ( PALTAG_BALL_SELECTED ) )
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
// Pokeball selected, do rocking animation
2018-11-11 16:44:27 +01:00
if ( sprite - > animEnded )
{
if ( sprite - > data [ 0 ] ! = 0 )
{
sprite - > data [ 0 ] - - ;
}
else if ( Random ( ) % 5 = = 0 )
{
StartSpriteAnim ( sprite , 0 ) ;
sprite - > data [ 0 ] = 32 ;
}
else
{
StartSpriteAnim ( sprite , 1 ) ;
}
}
else
{
StartSpriteAnimIfDifferent ( sprite , 1 ) ;
}
}
else
{
2020-08-31 19:36:48 +02:00
// Pokeball not selected, remain still
2018-11-11 16:44:27 +01:00
StartSpriteAnimIfDifferent ( sprite , 0 ) ;
}
}
2020-08-31 19:36:48 +02:00
static void CB2_SelectScreen ( void )
2018-11-11 16:44:27 +01:00
{
AnimateSprites ( ) ;
BuildOamBuffer ( ) ;
RunTextPrinters ( ) ;
UpdatePaletteFade ( ) ;
RunTasks ( ) ;
}
2020-08-31 19:36:48 +02:00
static void VBlankCB_SelectScreen ( void )
2018-11-11 16:44:27 +01:00
{
LoadOam ( ) ;
ProcessSpriteCopyRequests ( ) ;
TransferPlttBuffer ( ) ;
}
void DoBattleFactorySelectScreen ( void )
{
sFactorySelectScreen = NULL ;
SetMainCallback2 ( CB2_InitSelectScreen ) ;
}
2020-12-30 23:35:33 +01:00
// States for the main tasks of the Select_ functions after initialization, including:
// Select_Task_OpenSummaryScreen, Select_Task_HandleYesNo, Select_Task_HandleMenu, and Select_Task_HandleChooseMons
// Unnecessarily complicated, could easily have just kept states numbered in each task always starting at 0
// There's only one instance (Select_Task_HandleChooseMons) where a non-initial case is used
// Select_Task_Exit has its own straightforward states
# define STATE_CHOOSE_MONS_INIT 0
# define STATE_CHOOSE_MONS_HANDLE_INPUT 1
# define STATE_MENU_INIT 2
# define STATE_MENU_HANDLE_INPUT 3
# define STATE_YESNO_SHOW_OPTIONS 4
# define STATE_YESNO_HANDLE_INPUT 5
# define STATE_SUMMARY_FADE 6
# define STATE_SUMMARY_CLEAN 7
# define STATE_SUMMARY_SHOW 8
# define STATE_MENU_SHOW_OPTIONS 9
# define STATE_YESNO_SHOW_MONS 10
# define STATE_CHOOSE_MONS_INVALID 11
# define STATE_MENU_REINIT 12
# define STATE_MENU_RESHOW 13
2018-11-11 16:44:27 +01:00
static void CB2_InitSelectScreen ( void )
{
u8 taskId ;
switch ( gMain . state )
{
case 0 :
if ( sFactorySelectMons ! = NULL )
FREE_AND_SET_NULL ( sFactorySelectMons ) ;
SetHBlankCallback ( NULL ) ;
SetVBlankCallback ( NULL ) ;
CpuFill32 ( 0 , ( void * ) VRAM , VRAM_SIZE ) ;
ResetBgsAndClearDma3BusyFlags ( 0 ) ;
InitBgsFromTemplates ( 0 , sSelect_BgTemplates , ARRAY_COUNT ( sSelect_BgTemplates ) ) ;
InitWindows ( sSelect_WindowTemplates ) ;
DeactivateAllTextPrinters ( ) ;
gMain . state + + ;
break ;
case 1 :
sSelectMenuTilesetBuffer = Alloc ( 0x440 ) ;
2020-08-31 19:36:48 +02:00
sSelectMonPicBgTilesetBuffer = AllocZeroed ( 0x440 ) ;
sSelectMenuTilemapBuffer = Alloc ( BG_SCREEN_SIZE ) ;
sSelectMonPicBgTilemapBuffer = AllocZeroed ( BG_SCREEN_SIZE ) ;
2018-11-11 16:44:27 +01:00
ChangeBgX ( 0 , 0 , 0 ) ;
ChangeBgY ( 0 , 0 , 0 ) ;
ChangeBgX ( 1 , 0 , 0 ) ;
ChangeBgY ( 1 , 0 , 0 ) ;
ChangeBgX ( 3 , 0 , 0 ) ;
ChangeBgY ( 3 , 0 , 0 ) ;
SetGpuReg ( REG_OFFSET_BLDCNT , 0 ) ;
SetGpuReg ( REG_OFFSET_BLDALPHA , 0 ) ;
SetGpuReg ( REG_OFFSET_BLDY , 0 ) ;
SetGpuReg ( REG_OFFSET_MOSAIC , 0 ) ;
SetGpuReg ( REG_OFFSET_WIN0H , 0 ) ;
SetGpuReg ( REG_OFFSET_WIN0V , 0 ) ;
SetGpuReg ( REG_OFFSET_WIN1H , 0 ) ;
SetGpuReg ( REG_OFFSET_WIN1V , 0 ) ;
SetGpuReg ( REG_OFFSET_WININ , 0 ) ;
SetGpuReg ( REG_OFFSET_WINOUT , 0 ) ;
gMain . state + + ;
break ;
case 2 :
ResetPaletteFade ( ) ;
ResetSpriteData ( ) ;
ResetTasks ( ) ;
FreeAllSpritePalettes ( ) ;
CpuCopy16 ( gFrontierFactorySelectMenu_Gfx , sSelectMenuTilesetBuffer , 0x440 ) ;
2020-08-31 19:36:48 +02:00
CpuCopy16 ( sMonPicBg_Gfx , sSelectMonPicBgTilesetBuffer , 0x60 ) ;
2018-11-11 16:44:27 +01:00
LoadBgTiles ( 1 , sSelectMenuTilesetBuffer , 0x440 , 0 ) ;
2020-08-31 19:36:48 +02:00
LoadBgTiles ( 3 , sSelectMonPicBgTilesetBuffer , 0x60 , 0 ) ;
CpuCopy16 ( gFrontierFactorySelectMenu_Tilemap , sSelectMenuTilemapBuffer , BG_SCREEN_SIZE ) ;
LoadBgTilemap ( 1 , sSelectMenuTilemapBuffer , BG_SCREEN_SIZE , 0 ) ;
2018-11-11 16:44:27 +01:00
LoadPalette ( gFrontierFactorySelectMenu_Pal , 0 , 0x40 ) ;
2020-08-31 19:36:48 +02:00
LoadPalette ( sSelectText_Pal , 0xF0 , 8 ) ;
LoadPalette ( sSelectText_Pal , 0xE0 , 10 ) ;
2018-11-11 16:44:27 +01:00
if ( sFactorySelectScreen - > fromSummaryScreen = = TRUE )
2020-08-31 19:36:48 +02:00
gPlttBufferUnfaded [ 228 ] = sFactorySelectScreen - > speciesNameColorBackup ;
LoadPalette ( sMonPicBg_Pal , 0x20 , 4 ) ;
2018-11-11 16:44:27 +01:00
gMain . state + + ;
break ;
case 3 :
2020-08-31 19:36:48 +02:00
SetBgTilemapBuffer ( 3 , sSelectMonPicBgTilemapBuffer ) ;
CopyToBgTilemapBufferRect ( 3 , sMonPicBg_Tilemap , 11 , 4 , 8 , 8 ) ;
CopyToBgTilemapBufferRect ( 3 , sMonPicBg_Tilemap , 2 , 4 , 8 , 8 ) ;
CopyToBgTilemapBufferRect ( 3 , sMonPicBg_Tilemap , 20 , 4 , 8 , 8 ) ;
2018-11-11 16:44:27 +01:00
CopyBgTilemapBufferToVram ( 3 ) ;
gMain . state + + ;
break ;
case 4 :
2020-08-31 19:36:48 +02:00
LoadSpritePalettes ( sSelect_SpritePalettes ) ;
LoadSpriteSheets ( sSelect_SpriteSheets ) ;
LoadCompressedSpriteSheet ( sSelect_BallGfx ) ;
2018-11-11 16:44:27 +01:00
ShowBg ( 0 ) ;
ShowBg ( 1 ) ;
2020-08-31 19:36:48 +02:00
SetVBlankCallback ( VBlankCB_SelectScreen ) ;
2020-12-28 23:32:08 +01:00
BeginNormalPaletteFade ( 0xFFFFFFFF , 0 , 16 , 0 , RGB_BLACK ) ;
2018-11-11 16:44:27 +01:00
SetGpuReg ( REG_OFFSET_DISPCNT , DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP ) ;
if ( sFactorySelectScreen - > fromSummaryScreen = = TRUE )
{
Select_SetWinRegs ( 88 , 152 , 32 , 96 ) ;
ShowBg ( 3 ) ;
SetGpuReg ( REG_OFFSET_BLDCNT , BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ ) ;
SetGpuReg ( REG_OFFSET_BLDALPHA , BLDALPHA_BLEND ( 11 , 4 ) ) ;
}
else
{
HideBg ( 3 ) ;
}
gMain . state + + ;
break ;
case 5 :
if ( sFactorySelectScreen - > fromSummaryScreen = = TRUE )
2019-02-19 10:09:42 +01:00
sFactorySelectScreen - > cursorPos = gLastViewedMonIndex ;
2018-11-11 16:44:27 +01:00
Select_InitMonsData ( ) ;
Select_InitAllSprites ( ) ;
if ( sFactorySelectScreen - > fromSummaryScreen = = TRUE )
2020-08-31 19:36:48 +02:00
Select_ReshowMonSprite ( ) ;
2018-11-11 16:44:27 +01:00
gMain . state + + ;
break ;
case 6 :
Select_PrintSelectMonString ( ) ;
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SELECT_WIN_INFO ) ;
2018-11-11 16:44:27 +01:00
gMain . state + + ;
break ;
case 7 :
Select_PrintMonCategory ( ) ;
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SELECT_WIN_MON_CATEGORY ) ;
2018-11-11 16:44:27 +01:00
gMain . state + + ;
break ;
case 8 :
Select_PrintMonSpecies ( ) ;
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SELECT_WIN_SPECIES ) ;
2018-11-11 16:44:27 +01:00
gMain . state + + ;
break ;
case 9 :
Select_PrintRentalPkmnString ( ) ;
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SELECT_WIN_TITLE ) ;
2018-11-11 16:44:27 +01:00
gMain . state + + ;
break ;
case 10 :
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > fadeSpeciesNameTaskId = CreateTask ( Select_Task_FadeSpeciesName , 0 ) ;
2018-11-11 16:44:27 +01:00
if ( ! sFactorySelectScreen - > fromSummaryScreen )
{
2020-12-28 23:32:08 +01:00
gTasks [ sFactorySelectScreen - > fadeSpeciesNameTaskId ] . tState = 0 ;
taskId = CreateTask ( Select_Task_HandleChooseMons , 0 ) ;
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_CHOOSE_MONS_INIT ;
2018-11-11 16:44:27 +01:00
}
else
{
2020-12-28 23:32:08 +01:00
gTasks [ sFactorySelectScreen - > fadeSpeciesNameTaskId ] . tState = 1 ;
sFactorySelectScreen - > fadeSpeciesNameActive = FALSE ;
taskId = CreateTask ( Select_Task_HandleMenu , 0 ) ;
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_MENU_RESHOW ;
2018-11-11 16:44:27 +01:00
}
2020-08-31 19:36:48 +02:00
SetMainCallback2 ( CB2_SelectScreen ) ;
2018-11-11 16:44:27 +01:00
break ;
}
}
static void Select_InitMonsData ( void )
{
u8 i ;
if ( sFactorySelectScreen ! = NULL )
return ;
sFactorySelectScreen = AllocZeroed ( sizeof ( * sFactorySelectScreen ) ) ;
sFactorySelectScreen - > cursorPos = 0 ;
sFactorySelectScreen - > selectingMonsState = 1 ;
sFactorySelectScreen - > fromSummaryScreen = FALSE ;
for ( i = 0 ; i < SELECTABLE_MONS_COUNT ; i + + )
sFactorySelectScreen - > mons [ i ] . selectedId = 0 ;
if ( gSaveBlock2Ptr - > frontier . lvlMode ! = FRONTIER_LVL_TENT )
CreateFrontierFactorySelectableMons ( 0 ) ;
else
2020-12-28 23:32:08 +01:00
CreateSlateportTentSelectableMons ( 0 ) ;
2018-11-11 16:44:27 +01:00
}
static void Select_InitAllSprites ( void )
{
u8 i , cursorPos ;
s16 x ;
for ( i = 0 ; i < SELECTABLE_MONS_COUNT ; i + + )
{
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > mons [ i ] . ballSpriteId = CreateSprite ( & sSpriteTemplate_Select_Pokeball , ( 35 * i ) + 32 , 64 , 1 ) ;
gSprites [ sFactorySelectScreen - > mons [ i ] . ballSpriteId ] . data [ 0 ] = 0 ;
2018-11-11 16:44:27 +01:00
Select_SetBallSpritePaletteNum ( i ) ;
}
cursorPos = sFactorySelectScreen - > cursorPos ;
2020-12-28 23:32:08 +01:00
x = gSprites [ sFactorySelectScreen - > mons [ cursorPos ] . ballSpriteId ] . pos1 . x ;
2020-08-31 19:36:48 +02:00
sFactorySelectScreen - > cursorSpriteId = CreateSprite ( & sSpriteTemplate_Select_Arrow , x , 88 , 0 ) ;
sFactorySelectScreen - > menuCursor1SpriteId = CreateSprite ( & sSpriteTemplate_Select_MenuHighlightLeft , 176 , 112 , 0 ) ;
sFactorySelectScreen - > menuCursor2SpriteId = CreateSprite ( & sSpriteTemplate_Select_MenuHighlightRight , 176 , 144 , 0 ) ;
2018-11-11 16:44:27 +01:00
gSprites [ sFactorySelectScreen - > menuCursor1SpriteId ] . invisible = TRUE ;
gSprites [ sFactorySelectScreen - > menuCursor2SpriteId ] . invisible = TRUE ;
gSprites [ sFactorySelectScreen - > menuCursor1SpriteId ] . centerToCornerVecX = 0 ;
gSprites [ sFactorySelectScreen - > menuCursor1SpriteId ] . centerToCornerVecY = 0 ;
gSprites [ sFactorySelectScreen - > menuCursor2SpriteId ] . centerToCornerVecX = 0 ;
gSprites [ sFactorySelectScreen - > menuCursor2SpriteId ] . centerToCornerVecY = 0 ;
}
static void Select_DestroyAllSprites ( void )
{
u8 i ;
for ( i = 0 ; i < SELECTABLE_MONS_COUNT ; i + + )
2020-12-28 23:32:08 +01:00
DestroySprite ( & gSprites [ sFactorySelectScreen - > mons [ i ] . ballSpriteId ] ) ;
2018-11-11 16:44:27 +01:00
DestroySprite ( & gSprites [ sFactorySelectScreen - > cursorSpriteId ] ) ;
DestroySprite ( & gSprites [ sFactorySelectScreen - > menuCursor1SpriteId ] ) ;
DestroySprite ( & gSprites [ sFactorySelectScreen - > menuCursor2SpriteId ] ) ;
}
static void Select_UpdateBallCursorPosition ( s8 direction )
{
u8 cursorPos ;
if ( direction > 0 ) // Move cursor right.
{
if ( sFactorySelectScreen - > cursorPos ! = SELECTABLE_MONS_COUNT - 1 )
sFactorySelectScreen - > cursorPos + + ;
else
sFactorySelectScreen - > cursorPos = 0 ;
}
else // Move cursor left.
{
if ( sFactorySelectScreen - > cursorPos ! = 0 )
sFactorySelectScreen - > cursorPos - - ;
else
sFactorySelectScreen - > cursorPos = SELECTABLE_MONS_COUNT - 1 ;
}
cursorPos = sFactorySelectScreen - > cursorPos ;
2020-12-28 23:32:08 +01:00
gSprites [ sFactorySelectScreen - > cursorSpriteId ] . pos1 . x = gSprites [ sFactorySelectScreen - > mons [ cursorPos ] . ballSpriteId ] . pos1 . x ;
2018-11-11 16:44:27 +01:00
}
static void Select_UpdateMenuCursorPosition ( s8 direction )
{
if ( direction > 0 ) // Move cursor down.
{
2020-12-28 23:32:08 +01:00
if ( sFactorySelectScreen - > menuCursorPos ! = ARRAY_COUNT ( sSelect_MenuOptionFuncs ) - 1 )
2018-11-11 16:44:27 +01:00
sFactorySelectScreen - > menuCursorPos + + ;
else
sFactorySelectScreen - > menuCursorPos = 0 ;
}
else // Move cursor up.
{
if ( sFactorySelectScreen - > menuCursorPos ! = 0 )
sFactorySelectScreen - > menuCursorPos - - ;
else
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > menuCursorPos = ARRAY_COUNT ( sSelect_MenuOptionFuncs ) - 1 ;
2018-11-11 16:44:27 +01:00
}
gSprites [ sFactorySelectScreen - > menuCursor1SpriteId ] . pos1 . y = ( sFactorySelectScreen - > menuCursorPos * 16 ) + 112 ;
gSprites [ sFactorySelectScreen - > menuCursor2SpriteId ] . pos1 . y = ( sFactorySelectScreen - > menuCursorPos * 16 ) + 112 ;
}
static void Select_UpdateYesNoCursorPosition ( s8 direction )
{
if ( direction > 0 ) // Move cursor down.
{
if ( sFactorySelectScreen - > yesNoCursorPos ! = 1 )
sFactorySelectScreen - > yesNoCursorPos + + ;
else
sFactorySelectScreen - > yesNoCursorPos = 0 ;
}
else // Move cursor up.
{
if ( sFactorySelectScreen - > yesNoCursorPos ! = 0 )
sFactorySelectScreen - > yesNoCursorPos - - ;
else
sFactorySelectScreen - > yesNoCursorPos = 1 ;
}
gSprites [ sFactorySelectScreen - > menuCursor1SpriteId ] . pos1 . y = ( sFactorySelectScreen - > yesNoCursorPos * 16 ) + 112 ;
gSprites [ sFactorySelectScreen - > menuCursor2SpriteId ] . pos1 . y = ( sFactorySelectScreen - > yesNoCursorPos * 16 ) + 112 ;
}
static void Select_HandleMonSelectionChange ( void )
{
u8 i , paletteNum ;
u8 cursorPos = sFactorySelectScreen - > cursorPos ;
if ( sFactorySelectScreen - > mons [ cursorPos ] . selectedId ) // Deselect a mon.
{
2020-08-31 19:36:48 +02:00
paletteNum = IndexOfSpritePaletteTag ( PALTAG_BALL_GRAY ) ;
2020-12-30 23:35:33 +01:00
if ( sFactorySelectScreen - > selectingMonsState = = FRONTIER_PARTY_SIZE
& & sFactorySelectScreen - > mons [ cursorPos ] . selectedId = = 1 )
2018-11-11 16:44:27 +01:00
{
for ( i = 0 ; i < SELECTABLE_MONS_COUNT ; i + + )
{
2020-12-30 23:35:33 +01:00
if ( sFactorySelectScreen - > mons [ i ] . selectedId = = FRONTIER_PARTY_SIZE - 1 )
2018-11-11 16:44:27 +01:00
break ;
}
if ( i = = SELECTABLE_MONS_COUNT )
return ;
else
sFactorySelectScreen - > mons [ i ] . selectedId = 1 ;
}
sFactorySelectScreen - > mons [ cursorPos ] . selectedId = 0 ;
sFactorySelectScreen - > selectingMonsState - - ;
}
else // Select a mon.
{
2020-08-31 19:36:48 +02:00
paletteNum = IndexOfSpritePaletteTag ( PALTAG_BALL_SELECTED ) ;
2018-11-11 16:44:27 +01:00
sFactorySelectScreen - > mons [ cursorPos ] . selectedId = sFactorySelectScreen - > selectingMonsState ;
sFactorySelectScreen - > selectingMonsState + + ;
}
2020-12-28 23:32:08 +01:00
gSprites [ sFactorySelectScreen - > mons [ cursorPos ] . ballSpriteId ] . oam . paletteNum = paletteNum ;
2018-11-11 16:44:27 +01:00
}
static void Select_SetBallSpritePaletteNum ( u8 id )
{
u8 palNum ;
if ( sFactorySelectScreen - > mons [ id ] . selectedId )
2020-08-31 19:36:48 +02:00
palNum = IndexOfSpritePaletteTag ( PALTAG_BALL_SELECTED ) ;
2018-11-11 16:44:27 +01:00
else
2020-08-31 19:36:48 +02:00
palNum = IndexOfSpritePaletteTag ( PALTAG_BALL_GRAY ) ;
2018-11-11 16:44:27 +01:00
2020-12-28 23:32:08 +01:00
gSprites [ sFactorySelectScreen - > mons [ id ] . ballSpriteId ] . oam . paletteNum = palNum ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
static void Select_Task_OpenSummaryScreen ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
u8 i ;
u8 currMonId ;
2020-12-28 23:32:08 +01:00
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
2020-12-30 23:35:33 +01:00
case STATE_SUMMARY_FADE :
2018-11-11 16:44:27 +01:00
gPlttBufferUnfaded [ 228 ] = gPlttBufferFaded [ 228 ] ;
2020-12-28 23:32:08 +01:00
BeginNormalPaletteFade ( 0xFFFFFFFF , 0 , 0 , 16 , RGB_BLACK ) ;
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_SUMMARY_CLEAN ;
2018-11-11 16:44:27 +01:00
break ;
2020-12-30 23:35:33 +01:00
case STATE_SUMMARY_CLEAN :
2018-11-11 16:44:27 +01:00
if ( ! gPaletteFade . active )
{
DestroyTask ( sFactorySelectScreen - > fadeSpeciesNameTaskId ) ;
2020-12-28 23:32:08 +01:00
HideMonPic ( sFactorySelectScreen - > monPics [ 1 ] , & sFactorySelectScreen - > monPicAnimating ) ;
2018-11-11 16:44:27 +01:00
Select_DestroyAllSprites ( ) ;
FREE_AND_SET_NULL ( sSelectMenuTilesetBuffer ) ;
2020-08-31 19:36:48 +02:00
FREE_AND_SET_NULL ( sSelectMonPicBgTilesetBuffer ) ;
2018-11-11 16:44:27 +01:00
FREE_AND_SET_NULL ( sSelectMenuTilemapBuffer ) ;
2020-08-31 19:36:48 +02:00
FREE_AND_SET_NULL ( sSelectMonPicBgTilemapBuffer ) ;
2018-11-11 16:44:27 +01:00
FreeAllWindowBuffers ( ) ;
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_SUMMARY_SHOW ;
2018-11-11 16:44:27 +01:00
}
break ;
2020-12-30 23:35:33 +01:00
case STATE_SUMMARY_SHOW :
2020-08-31 19:36:48 +02:00
sFactorySelectScreen - > speciesNameColorBackup = gPlttBufferUnfaded [ 228 ] ;
2018-11-11 16:44:27 +01:00
DestroyTask ( taskId ) ;
sFactorySelectScreen - > fromSummaryScreen = TRUE ;
currMonId = sFactorySelectScreen - > cursorPos ;
sFactorySelectMons = AllocZeroed ( sizeof ( struct Pokemon ) * SELECTABLE_MONS_COUNT ) ;
for ( i = 0 ; i < SELECTABLE_MONS_COUNT ; i + + )
sFactorySelectMons [ i ] = sFactorySelectScreen - > mons [ i ] . monData ;
2020-08-31 19:36:48 +02:00
ShowPokemonSummaryScreen ( PSS_MODE_LOCK_MOVES , sFactorySelectMons , currMonId , SELECTABLE_MONS_COUNT - 1 , CB2_InitSelectScreen ) ;
2018-11-11 16:44:27 +01:00
break ;
}
}
2020-12-28 23:32:08 +01:00
static void Select_Task_Exit ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
if ( sFactorySelectScreen - > monPicAnimating = = TRUE )
return ;
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
case 0 :
BeginNormalPaletteFade ( 0xFFFFFFFF , 0 , 0 , 16 , RGB_BLACK ) ;
gTasks [ taskId ] . tState + + ;
break ;
case 1 :
if ( ! UpdatePaletteFade ( ) )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
Select_CopyMonsToPlayerParty ( ) ;
DestroyTask ( sFactorySelectScreen - > fadeSpeciesNameTaskId ) ;
Select_DestroyAllSprites ( ) ;
FREE_AND_SET_NULL ( sSelectMenuTilesetBuffer ) ;
FREE_AND_SET_NULL ( sSelectMenuTilemapBuffer ) ;
FREE_AND_SET_NULL ( sSelectMonPicBgTilemapBuffer ) ;
FREE_AND_SET_NULL ( sFactorySelectScreen ) ;
FreeAllWindowBuffers ( ) ;
SetMainCallback2 ( CB2_ReturnToFieldContinueScript ) ;
DestroyTask ( taskId ) ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
break ;
2018-11-11 16:44:27 +01:00
}
}
2020-12-30 23:35:33 +01:00
// Handles the Yes/No prompt when confirming the 3 selected rental pokemon
2020-12-28 23:32:08 +01:00
static void Select_Task_HandleYesNo ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
if ( sFactorySelectScreen - > monPicAnimating = = TRUE )
return ;
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
2020-12-30 23:35:33 +01:00
case STATE_YESNO_SHOW_MONS :
Select_ShowChosenMons ( ) ;
gTasks [ taskId ] . tState = STATE_YESNO_SHOW_OPTIONS ;
2020-12-28 23:32:08 +01:00
break ;
2020-12-30 23:35:33 +01:00
case STATE_YESNO_SHOW_OPTIONS :
2020-12-28 23:32:08 +01:00
Select_ShowYesNoOptions ( ) ;
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_YESNO_HANDLE_INPUT ;
2020-12-28 23:32:08 +01:00
break ;
2020-12-30 23:35:33 +01:00
case STATE_YESNO_HANDLE_INPUT :
2020-12-28 23:32:08 +01:00
if ( JOY_NEW ( A_BUTTON ) )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
PlaySE ( SE_SELECT ) ;
if ( sFactorySelectScreen - > yesNoCursorPos = = 0 )
2018-11-11 16:44:27 +01:00
{
2020-12-30 23:35:33 +01:00
// Selected Yes, confirmed selected pokemon
Select_HideChosenMons ( ) ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = 0 ;
gTasks [ taskId ] . func = Select_Task_Exit ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
else
2018-11-11 16:44:27 +01:00
{
2020-12-30 23:35:33 +01:00
// Selected No, continue choosing pokemon
Select_ErasePopupMenu ( SELECT_WIN_YES_NO ) ;
Select_DeclineChosenMons ( ) ;
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > fadeSpeciesNameActive = TRUE ;
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_CHOOSE_MONS_HANDLE_INPUT ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . func = Select_Task_HandleChooseMons ;
2018-11-11 16:44:27 +01:00
}
}
2020-12-28 23:32:08 +01:00
else if ( JOY_NEW ( B_BUTTON ) )
{
2020-12-30 23:35:33 +01:00
// Pressed B, Continue choosing pokemon
2020-12-28 23:32:08 +01:00
PlaySE ( SE_SELECT ) ;
2020-12-30 23:35:33 +01:00
Select_ErasePopupMenu ( SELECT_WIN_YES_NO ) ;
Select_DeclineChosenMons ( ) ;
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > fadeSpeciesNameActive = TRUE ;
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_CHOOSE_MONS_HANDLE_INPUT ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . func = Select_Task_HandleChooseMons ;
}
else if ( JOY_REPEAT ( DPAD_UP ) )
{
PlaySE ( SE_SELECT ) ;
Select_UpdateYesNoCursorPosition ( - 1 ) ;
}
else if ( JOY_REPEAT ( DPAD_DOWN ) )
{
PlaySE ( SE_SELECT ) ;
Select_UpdateYesNoCursorPosition ( 1 ) ;
}
break ;
2018-11-11 16:44:27 +01:00
}
}
2020-12-30 23:35:33 +01:00
// Handles the popup menu that shows when a pokemon is selected
2020-12-28 23:32:08 +01:00
static void Select_Task_HandleMenu ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
2020-12-30 23:35:33 +01:00
case STATE_MENU_INIT :
2018-11-11 16:44:27 +01:00
if ( ! sFactorySelectScreen - > fromSummaryScreen )
2020-12-28 23:32:08 +01:00
OpenMonPic ( & sFactorySelectScreen - > monPics [ 1 ] . bgSpriteId , & sFactorySelectScreen - > monPicAnimating , FALSE ) ;
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_MENU_SHOW_OPTIONS ;
2018-11-11 16:44:27 +01:00
break ;
2020-12-30 23:35:33 +01:00
case STATE_MENU_SHOW_OPTIONS :
2020-12-28 23:32:08 +01:00
if ( sFactorySelectScreen - > monPicAnimating ! = TRUE )
2018-11-11 16:44:27 +01:00
{
Select_ShowMenuOptions ( ) ;
sFactorySelectScreen - > fromSummaryScreen = FALSE ;
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_MENU_HANDLE_INPUT ;
2018-11-11 16:44:27 +01:00
}
break ;
2020-12-30 23:35:33 +01:00
case STATE_MENU_HANDLE_INPUT :
2020-12-28 23:32:08 +01:00
if ( JOY_NEW ( A_BUTTON ) )
2018-11-11 16:44:27 +01:00
{
u8 retVal ;
PlaySE ( SE_SELECT ) ;
retVal = Select_RunMenuOptionFunc ( ) ;
2020-12-30 23:35:33 +01:00
if ( retVal = = SELECT_CONTINUE_CHOOSING )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > fadeSpeciesNameActive = TRUE ;
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_CHOOSE_MONS_HANDLE_INPUT ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . func = Select_Task_HandleChooseMons ;
2018-11-11 16:44:27 +01:00
}
2020-12-30 23:35:33 +01:00
else if ( retVal = = SELECT_CONFIRM_MONS )
2018-11-11 16:44:27 +01:00
{
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_YESNO_SHOW_MONS ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . func = Select_Task_HandleYesNo ;
2018-11-11 16:44:27 +01:00
}
2020-12-30 23:35:33 +01:00
else if ( retVal = = SELECT_INVALID_MON )
2018-11-11 16:44:27 +01:00
{
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_CHOOSE_MONS_INVALID ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . func = Select_Task_HandleChooseMons ;
2018-11-11 16:44:27 +01:00
}
2020-12-30 23:35:33 +01:00
else // SELECT_SUMMARY
2018-11-11 16:44:27 +01:00
{
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_SUMMARY_FADE ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . func = Select_Task_OpenSummaryScreen ;
2018-11-11 16:44:27 +01:00
}
}
2020-12-28 23:32:08 +01:00
else if ( JOY_NEW ( B_BUTTON ) )
2018-11-11 16:44:27 +01:00
{
PlaySE ( SE_SELECT ) ;
2020-12-28 23:32:08 +01:00
CloseMonPic ( sFactorySelectScreen - > monPics [ 1 ] , & sFactorySelectScreen - > monPicAnimating , FALSE ) ;
2020-12-30 23:35:33 +01:00
Select_ErasePopupMenu ( SELECT_WIN_OPTIONS ) ;
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > fadeSpeciesNameActive = TRUE ;
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_CHOOSE_MONS_HANDLE_INPUT ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . func = Select_Task_HandleChooseMons ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
else if ( JOY_REPEAT ( DPAD_UP ) )
2018-11-11 16:44:27 +01:00
{
PlaySE ( SE_SELECT ) ;
Select_UpdateMenuCursorPosition ( - 1 ) ;
}
2020-12-28 23:32:08 +01:00
else if ( JOY_REPEAT ( DPAD_DOWN ) )
2018-11-11 16:44:27 +01:00
{
PlaySE ( SE_SELECT ) ;
Select_UpdateMenuCursorPosition ( 1 ) ;
}
break ;
2020-12-30 23:35:33 +01:00
case STATE_MENU_REINIT :
2018-11-11 16:44:27 +01:00
if ( ! gPaletteFade . active )
{
if ( sFactorySelectScreen - > fromSummaryScreen = = TRUE )
{
2020-08-31 19:36:48 +02:00
gPlttBufferFaded [ 228 ] = sFactorySelectScreen - > speciesNameColorBackup ;
2018-11-11 16:44:27 +01:00
gPlttBufferUnfaded [ 228 ] = gPlttBufferUnfaded [ 244 ] ;
}
sFactorySelectScreen - > fromSummaryScreen = FALSE ;
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_MENU_HANDLE_INPUT ;
2018-11-11 16:44:27 +01:00
}
break ;
2020-12-30 23:35:33 +01:00
case STATE_MENU_RESHOW :
2018-11-11 16:44:27 +01:00
Select_ShowMenuOptions ( ) ;
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_MENU_REINIT ;
2018-11-11 16:44:27 +01:00
break ;
}
}
2020-12-30 23:35:33 +01:00
// Handles input on the main selection screen, when no popup menu is open
2020-12-28 23:32:08 +01:00
static void Select_Task_HandleChooseMons ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
if ( sFactorySelectScreen - > monPicAnimating = = TRUE )
return ;
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
2020-12-30 23:35:33 +01:00
case STATE_CHOOSE_MONS_INIT :
2020-12-28 23:32:08 +01:00
if ( ! gPaletteFade . active )
2018-11-11 16:44:27 +01:00
{
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_CHOOSE_MONS_HANDLE_INPUT ;
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > fadeSpeciesNameActive = TRUE ;
}
break ;
2020-12-30 23:35:33 +01:00
case STATE_CHOOSE_MONS_HANDLE_INPUT :
2020-12-28 23:32:08 +01:00
if ( JOY_NEW ( A_BUTTON ) )
{
PlaySE ( SE_SELECT ) ;
sFactorySelectScreen - > fadeSpeciesNameActive = FALSE ;
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_MENU_INIT ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . func = Select_Task_HandleMenu ;
}
else if ( JOY_REPEAT ( DPAD_LEFT ) )
{
PlaySE ( SE_SELECT ) ;
Select_UpdateBallCursorPosition ( - 1 ) ;
Select_PrintMonCategory ( ) ;
Select_PrintMonSpecies ( ) ;
}
else if ( JOY_REPEAT ( DPAD_RIGHT ) )
{
PlaySE ( SE_SELECT ) ;
Select_UpdateBallCursorPosition ( 1 ) ;
Select_PrintMonCategory ( ) ;
Select_PrintMonSpecies ( ) ;
}
break ;
2020-12-30 23:35:33 +01:00
case STATE_CHOOSE_MONS_INVALID :
2020-12-28 23:32:08 +01:00
if ( JOY_NEW ( A_BUTTON ) )
{
PlaySE ( SE_SELECT ) ;
CloseMonPic ( sFactorySelectScreen - > monPics [ 1 ] , & sFactorySelectScreen - > monPicAnimating , FALSE ) ;
Select_PrintSelectMonString ( ) ;
sFactorySelectScreen - > fadeSpeciesNameActive = TRUE ;
2020-12-30 23:35:33 +01:00
gTasks [ taskId ] . tState = STATE_CHOOSE_MONS_HANDLE_INPUT ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
break ;
2018-11-11 16:44:27 +01:00
}
}
static void CreateFrontierFactorySelectableMons ( u8 firstMonId )
{
u8 i , j = 0 ;
u8 ivs = 0 ;
u8 level = 0 ;
2020-08-31 19:36:48 +02:00
u8 friendship = 0 ;
2018-11-11 16:44:27 +01:00
u32 otId = 0 ;
u8 battleMode = VarGet ( VAR_FRONTIER_BATTLE_MODE ) ;
u8 lvlMode = gSaveBlock2Ptr - > frontier . lvlMode ;
u8 challengeNum = gSaveBlock2Ptr - > frontier . factoryWinStreaks [ battleMode ] [ lvlMode ] / 7 ;
2020-07-13 06:47:30 +02:00
u8 rentalRank = 0 ;
2018-11-11 16:44:27 +01:00
gFacilityTrainerMons = gBattleFrontierMons ;
if ( gSaveBlock2Ptr - > frontier . lvlMode ! = FRONTIER_LVL_50 )
level = 100 ;
else
level = 50 ;
2020-07-13 06:47:30 +02:00
rentalRank = GetNumPastRentalsRank ( battleMode , lvlMode ) ;
2018-11-11 16:44:27 +01:00
otId = T1_READ_32 ( gSaveBlock2Ptr - > playerTrainerId ) ;
for ( i = 0 ; i < SELECTABLE_MONS_COUNT ; i + + )
{
2020-07-13 06:47:30 +02:00
u16 monId = gSaveBlock2Ptr - > frontier . rentalMons [ i ] . monId ;
sFactorySelectScreen - > mons [ i + firstMonId ] . monId = monId ;
if ( i < rentalRank )
2018-11-11 16:44:27 +01:00
ivs = GetFactoryMonFixedIV ( challengeNum + 1 , 0 ) ;
else
ivs = GetFactoryMonFixedIV ( challengeNum , 0 ) ;
CreateMonWithEVSpreadNatureOTID ( & sFactorySelectScreen - > mons [ i + firstMonId ] . monData ,
2020-07-13 06:47:30 +02:00
gFacilityTrainerMons [ monId ] . species ,
2018-11-11 16:44:27 +01:00
level ,
2020-07-13 06:47:30 +02:00
gFacilityTrainerMons [ monId ] . nature ,
2018-11-11 16:44:27 +01:00
ivs ,
2020-07-13 06:47:30 +02:00
gFacilityTrainerMons [ monId ] . evSpread ,
2018-11-11 16:44:27 +01:00
otId ) ;
2020-08-31 19:36:48 +02:00
friendship = 0 ;
2018-12-25 18:50:15 +01:00
for ( j = 0 ; j < MAX_MON_MOVES ; j + + )
2020-07-13 06:47:30 +02:00
SetMonMoveAvoidReturn ( & sFactorySelectScreen - > mons [ i + firstMonId ] . monData , gFacilityTrainerMons [ monId ] . moves [ j ] , j ) ;
2020-08-31 19:36:48 +02:00
SetMonData ( & sFactorySelectScreen - > mons [ i + firstMonId ] . monData , MON_DATA_FRIENDSHIP , & friendship ) ;
2020-07-13 06:47:30 +02:00
SetMonData ( & sFactorySelectScreen - > mons [ i + firstMonId ] . monData , MON_DATA_HELD_ITEM , & gBattleFrontierHeldItems [ gFacilityTrainerMons [ monId ] . itemTableId ] ) ;
2018-11-11 16:44:27 +01:00
}
}
2020-12-28 23:32:08 +01:00
static void CreateSlateportTentSelectableMons ( u8 firstMonId )
2018-11-11 16:44:27 +01:00
{
u8 i , j ;
u8 ivs = 0 ;
u8 level = 30 ;
2020-08-31 19:36:48 +02:00
u8 friendship = 0 ;
2018-11-11 16:44:27 +01:00
u32 otId = 0 ;
gFacilityTrainerMons = gSlateportBattleTentMons ;
otId = T1_READ_32 ( gSaveBlock2Ptr - > playerTrainerId ) ;
for ( i = 0 ; i < SELECTABLE_MONS_COUNT ; i + + )
{
2020-07-13 06:47:30 +02:00
u16 monId = gSaveBlock2Ptr - > frontier . rentalMons [ i ] . monId ;
sFactorySelectScreen - > mons [ i + firstMonId ] . monId = monId ;
2018-11-11 16:44:27 +01:00
CreateMonWithEVSpreadNatureOTID ( & sFactorySelectScreen - > mons [ i + firstMonId ] . monData ,
2020-07-13 06:47:30 +02:00
gFacilityTrainerMons [ monId ] . species ,
2018-11-11 16:44:27 +01:00
level ,
2020-07-13 06:47:30 +02:00
gFacilityTrainerMons [ monId ] . nature ,
2018-11-11 16:44:27 +01:00
ivs ,
2020-07-13 06:47:30 +02:00
gFacilityTrainerMons [ monId ] . evSpread ,
2018-11-11 16:44:27 +01:00
otId ) ;
2020-08-31 19:36:48 +02:00
friendship = 0 ;
2018-12-25 18:50:15 +01:00
for ( j = 0 ; j < MAX_MON_MOVES ; j + + )
2020-07-13 06:47:30 +02:00
SetMonMoveAvoidReturn ( & sFactorySelectScreen - > mons [ i + firstMonId ] . monData , gFacilityTrainerMons [ monId ] . moves [ j ] , j ) ;
2020-08-31 19:36:48 +02:00
SetMonData ( & sFactorySelectScreen - > mons [ i + firstMonId ] . monData , MON_DATA_FRIENDSHIP , & friendship ) ;
2020-07-13 06:47:30 +02:00
SetMonData ( & sFactorySelectScreen - > mons [ i + firstMonId ] . monData , MON_DATA_HELD_ITEM , & gBattleFrontierHeldItems [ gFacilityTrainerMons [ monId ] . itemTableId ] ) ;
2018-11-11 16:44:27 +01:00
}
}
static void Select_CopyMonsToPlayerParty ( void )
{
u8 i , j ;
2020-08-31 19:36:48 +02:00
for ( i = 0 ; i < FRONTIER_PARTY_SIZE ; i + + )
2018-11-11 16:44:27 +01:00
{
for ( j = 0 ; j < SELECTABLE_MONS_COUNT ; j + + )
{
if ( sFactorySelectScreen - > mons [ j ] . selectedId = = i + 1 )
{
gPlayerParty [ i ] = sFactorySelectScreen - > mons [ j ] . monData ;
2020-07-13 06:47:30 +02:00
gSaveBlock2Ptr - > frontier . rentalMons [ i ] . monId = sFactorySelectScreen - > mons [ j ] . monId ;
2019-03-03 09:14:08 +01:00
gSaveBlock2Ptr - > frontier . rentalMons [ i ] . personality = GetMonData ( & gPlayerParty [ i ] , MON_DATA_PERSONALITY , NULL ) ;
2019-05-14 15:22:16 +02:00
gSaveBlock2Ptr - > frontier . rentalMons [ i ] . abilityNum = GetBoxMonData ( & gPlayerParty [ i ] . box , MON_DATA_ABILITY_NUM , NULL ) ;
2019-02-07 19:58:09 +01:00
gSaveBlock2Ptr - > frontier . rentalMons [ i ] . ivs = GetBoxMonData ( & gPlayerParty [ i ] . box , MON_DATA_ATK_IV , NULL ) ;
2018-11-11 16:44:27 +01:00
break ;
}
}
}
CalculatePlayerPartyCount ( ) ;
}
static void Select_ShowMenuOptions ( void )
{
if ( ! sFactorySelectScreen - > fromSummaryScreen )
sFactorySelectScreen - > menuCursorPos = 0 ;
gSprites [ sFactorySelectScreen - > menuCursor1SpriteId ] . pos1 . x = 176 ;
gSprites [ sFactorySelectScreen - > menuCursor1SpriteId ] . pos1 . y = ( sFactorySelectScreen - > menuCursorPos * 16 ) + 112 ;
gSprites [ sFactorySelectScreen - > menuCursor2SpriteId ] . pos1 . x = 208 ;
gSprites [ sFactorySelectScreen - > menuCursor2SpriteId ] . pos1 . y = ( sFactorySelectScreen - > menuCursorPos * 16 ) + 112 ;
gSprites [ sFactorySelectScreen - > menuCursor1SpriteId ] . invisible = FALSE ;
gSprites [ sFactorySelectScreen - > menuCursor2SpriteId ] . invisible = FALSE ;
Select_PrintMenuOptions ( ) ;
}
static void Select_ShowYesNoOptions ( void )
{
sFactorySelectScreen - > yesNoCursorPos = 0 ;
gSprites [ sFactorySelectScreen - > menuCursor1SpriteId ] . pos1 . x = 176 ;
gSprites [ sFactorySelectScreen - > menuCursor1SpriteId ] . pos1 . y = 112 ;
gSprites [ sFactorySelectScreen - > menuCursor2SpriteId ] . pos1 . x = 208 ;
gSprites [ sFactorySelectScreen - > menuCursor2SpriteId ] . pos1 . y = 112 ;
gSprites [ sFactorySelectScreen - > menuCursor1SpriteId ] . invisible = FALSE ;
gSprites [ sFactorySelectScreen - > menuCursor2SpriteId ] . invisible = FALSE ;
Select_PrintYesNoOptions ( ) ;
}
2020-12-30 23:35:33 +01:00
static void Select_ErasePopupMenu ( u8 windowId )
2018-11-11 16:44:27 +01:00
{
gSprites [ sFactorySelectScreen - > menuCursor1SpriteId ] . invisible = TRUE ;
gSprites [ sFactorySelectScreen - > menuCursor2SpriteId ] . invisible = TRUE ;
2019-03-02 23:25:39 +01:00
FillWindowPixelBuffer ( windowId , PIXEL_FILL ( 0 ) ) ;
2018-11-11 16:44:27 +01:00
CopyWindowToVram ( windowId , 2 ) ;
ClearWindowTilemap ( windowId ) ;
}
static void Select_PrintRentalPkmnString ( void )
{
2020-12-28 23:32:08 +01:00
FillWindowPixelBuffer ( SELECT_WIN_TITLE , PIXEL_FILL ( 0 ) ) ;
AddTextPrinterParameterized ( SELECT_WIN_TITLE , 1 , gText_RentalPkmn2 , 2 , 1 , 0 , NULL ) ;
CopyWindowToVram ( SELECT_WIN_TITLE , 3 ) ;
2018-11-11 16:44:27 +01:00
}
static void Select_PrintMonSpecies ( void )
{
u16 species ;
u8 x ;
u8 monId = sFactorySelectScreen - > cursorPos ;
2020-12-28 23:32:08 +01:00
FillWindowPixelBuffer ( SELECT_WIN_SPECIES , PIXEL_FILL ( 0 ) ) ;
2018-11-11 16:44:27 +01:00
species = GetMonData ( & sFactorySelectScreen - > mons [ monId ] . monData , MON_DATA_SPECIES , NULL ) ;
StringCopy ( gStringVar4 , gSpeciesNames [ species ] ) ;
x = GetStringRightAlignXOffset ( 1 , gStringVar4 , 86 ) ;
2020-12-28 23:32:08 +01:00
AddTextPrinterParameterized3 ( SELECT_WIN_SPECIES , 1 , x , 1 , sSpeciesNameTextColors , 0 , gStringVar4 ) ;
CopyWindowToVram ( SELECT_WIN_SPECIES , 2 ) ;
2018-11-11 16:44:27 +01:00
}
static void Select_PrintSelectMonString ( void )
{
const u8 * str = NULL ;
2020-12-28 23:32:08 +01:00
FillWindowPixelBuffer ( SELECT_WIN_INFO , PIXEL_FILL ( 0 ) ) ;
2018-11-11 16:44:27 +01:00
if ( sFactorySelectScreen - > selectingMonsState = = 1 )
str = gText_SelectFirstPkmn ;
else if ( sFactorySelectScreen - > selectingMonsState = = 2 )
str = gText_SelectSecondPkmn ;
else if ( sFactorySelectScreen - > selectingMonsState = = 3 )
str = gText_SelectThirdPkmn ;
else
str = gText_TheseThreePkmnOkay ;
2020-12-28 23:32:08 +01:00
AddTextPrinterParameterized ( SELECT_WIN_INFO , 1 , str , 2 , 5 , 0 , NULL ) ;
CopyWindowToVram ( SELECT_WIN_INFO , 2 ) ;
2018-11-11 16:44:27 +01:00
}
static void Select_PrintCantSelectSameMon ( void )
{
2020-12-28 23:32:08 +01:00
FillWindowPixelBuffer ( SELECT_WIN_INFO , PIXEL_FILL ( 0 ) ) ;
AddTextPrinterParameterized ( SELECT_WIN_INFO , 1 , gText_CantSelectSamePkmn , 2 , 5 , 0 , NULL ) ;
CopyWindowToVram ( SELECT_WIN_INFO , 2 ) ;
2018-11-11 16:44:27 +01:00
}
static void Select_PrintMenuOptions ( void )
{
u8 selectedId = sFactorySelectScreen - > mons [ sFactorySelectScreen - > cursorPos ] . selectedId ;
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SELECT_WIN_OPTIONS ) ;
FillWindowPixelBuffer ( SELECT_WIN_OPTIONS , PIXEL_FILL ( 0 ) ) ;
AddTextPrinterParameterized3 ( SELECT_WIN_OPTIONS , 1 , 7 , 1 , sMenuOptionTextColors , 0 , gText_Summary ) ;
2018-11-11 16:44:27 +01:00
if ( selectedId ! = 0 )
2020-12-28 23:32:08 +01:00
AddTextPrinterParameterized3 ( SELECT_WIN_OPTIONS , 1 , 7 , 17 , sMenuOptionTextColors , 0 , gText_Deselect ) ;
2018-11-11 16:44:27 +01:00
else
2020-12-28 23:32:08 +01:00
AddTextPrinterParameterized3 ( SELECT_WIN_OPTIONS , 1 , 7 , 17 , sMenuOptionTextColors , 0 , gText_Rent ) ;
2018-11-11 16:44:27 +01:00
2020-12-28 23:32:08 +01:00
AddTextPrinterParameterized3 ( SELECT_WIN_OPTIONS , 1 , 7 , 33 , sMenuOptionTextColors , 0 , gText_Others2 ) ;
CopyWindowToVram ( SELECT_WIN_OPTIONS , 3 ) ;
2018-11-11 16:44:27 +01:00
}
static void Select_PrintYesNoOptions ( void )
{
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SELECT_WIN_YES_NO ) ;
FillWindowPixelBuffer ( SELECT_WIN_YES_NO , PIXEL_FILL ( 0 ) ) ;
AddTextPrinterParameterized3 ( SELECT_WIN_YES_NO , 1 , 7 , 1 , sMenuOptionTextColors , 0 , gText_Yes2 ) ;
AddTextPrinterParameterized3 ( SELECT_WIN_YES_NO , 1 , 7 , 17 , sMenuOptionTextColors , 0 , gText_No2 ) ;
CopyWindowToVram ( SELECT_WIN_YES_NO , 3 ) ;
2018-11-11 16:44:27 +01:00
}
static u8 Select_RunMenuOptionFunc ( void )
{
2020-08-31 19:36:48 +02:00
gFactorySelect_CurrentOptionFunc = sSelect_MenuOptionFuncs [ sFactorySelectScreen - > menuCursorPos ] ;
return gFactorySelect_CurrentOptionFunc ( ) ;
2018-11-11 16:44:27 +01:00
}
static u8 Select_OptionRentDeselect ( void )
{
u8 selectedId = sFactorySelectScreen - > mons [ sFactorySelectScreen - > cursorPos ] . selectedId ;
2020-07-13 06:47:30 +02:00
u16 monId = sFactorySelectScreen - > mons [ sFactorySelectScreen - > cursorPos ] . monId ;
if ( selectedId = = 0 & & ! Select_AreSpeciesValid ( monId ) )
2018-11-11 16:44:27 +01:00
{
Select_PrintCantSelectSameMon ( ) ;
2020-12-30 23:35:33 +01:00
Select_ErasePopupMenu ( SELECT_WIN_OPTIONS ) ;
return SELECT_INVALID_MON ;
2018-11-11 16:44:27 +01:00
}
else
{
2020-12-28 23:32:08 +01:00
CloseMonPic ( sFactorySelectScreen - > monPics [ 1 ] , & sFactorySelectScreen - > monPicAnimating , FALSE ) ;
2018-11-11 16:44:27 +01:00
Select_HandleMonSelectionChange ( ) ;
Select_PrintSelectMonString ( ) ;
2020-12-30 23:35:33 +01:00
Select_ErasePopupMenu ( SELECT_WIN_OPTIONS ) ;
if ( sFactorySelectScreen - > selectingMonsState > FRONTIER_PARTY_SIZE )
return SELECT_CONFIRM_MONS ;
2018-11-11 16:44:27 +01:00
else
2020-12-30 23:35:33 +01:00
return SELECT_CONTINUE_CHOOSING ;
2018-11-11 16:44:27 +01:00
}
}
2020-12-30 23:35:33 +01:00
static u8 Select_DeclineChosenMons ( void )
2018-11-11 16:44:27 +01:00
{
2020-12-30 23:35:33 +01:00
Select_HideChosenMons ( ) ;
2018-11-11 16:44:27 +01:00
Select_HandleMonSelectionChange ( ) ;
Select_PrintSelectMonString ( ) ;
2020-12-30 23:35:33 +01:00
Select_ErasePopupMenu ( SELECT_WIN_OPTIONS ) ;
if ( sFactorySelectScreen - > selectingMonsState > FRONTIER_PARTY_SIZE )
2018-11-11 16:44:27 +01:00
return 2 ;
else
return 1 ;
}
static u8 Select_OptionSummary ( void )
{
2020-12-30 23:35:33 +01:00
return SELECT_SUMMARY ;
2018-11-11 16:44:27 +01:00
}
static u8 Select_OptionOthers ( void )
{
2020-12-28 23:32:08 +01:00
CloseMonPic ( sFactorySelectScreen - > monPics [ 1 ] , & sFactorySelectScreen - > monPicAnimating , FALSE ) ;
2020-12-30 23:35:33 +01:00
Select_ErasePopupMenu ( SELECT_WIN_OPTIONS ) ;
return SELECT_CONTINUE_CHOOSING ;
2018-11-11 16:44:27 +01:00
}
static void Select_PrintMonCategory ( void )
{
u16 species ;
u8 text [ 30 ] ;
u8 x ;
u8 monId = sFactorySelectScreen - > cursorPos ;
if ( monId < SELECTABLE_MONS_COUNT )
{
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SELECT_WIN_MON_CATEGORY ) ;
FillWindowPixelBuffer ( SELECT_WIN_MON_CATEGORY , PIXEL_FILL ( 0 ) ) ;
2018-11-11 16:44:27 +01:00
species = GetMonData ( & sFactorySelectScreen - > mons [ monId ] . monData , MON_DATA_SPECIES , NULL ) ;
CopyMonCategoryText ( SpeciesToNationalPokedexNum ( species ) , text ) ;
x = GetStringRightAlignXOffset ( 1 , text , 0x76 ) ;
2020-12-28 23:32:08 +01:00
AddTextPrinterParameterized ( SELECT_WIN_MON_CATEGORY , 1 , text , x , 1 , 0 , NULL ) ;
CopyWindowToVram ( SELECT_WIN_MON_CATEGORY , 2 ) ;
2018-11-11 16:44:27 +01:00
}
}
2020-12-28 23:32:08 +01:00
static void Select_CreateMonSprite ( void )
2018-11-11 16:44:27 +01:00
{
u8 monId = sFactorySelectScreen - > cursorPos ;
struct Pokemon * mon = & sFactorySelectScreen - > mons [ monId ] . monData ;
u16 species = GetMonData ( mon , MON_DATA_SPECIES , NULL ) ;
u32 personality = GetMonData ( mon , MON_DATA_PERSONALITY , NULL ) ;
u32 otId = GetMonData ( mon , MON_DATA_OT_ID , NULL ) ;
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > monPics [ 1 ] . monSpriteId = CreateMonPicSprite_HandleDeoxys ( species , otId , personality , TRUE , 88 , 32 , 15 , 0xFFFF ) ;
gSprites [ sFactorySelectScreen - > monPics [ 1 ] . monSpriteId ] . centerToCornerVecX = 0 ;
gSprites [ sFactorySelectScreen - > monPics [ 1 ] . monSpriteId ] . centerToCornerVecY = 0 ;
2018-11-11 16:44:27 +01:00
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > monPicAnimating = FALSE ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
static void Select_SetMonPicAnimating ( bool8 animating )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > monPicAnimating = animating ;
2018-11-11 16:44:27 +01:00
}
2020-08-31 19:36:48 +02:00
static void Select_ReshowMonSprite ( void )
2018-11-11 16:44:27 +01:00
{
struct Pokemon * mon ;
u16 species ;
u32 personality , otId ;
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > monPics [ 1 ] . bgSpriteId = CreateSprite ( & sSpriteTemplate_Select_MonPicBgAnim , 120 , 64 , 1 ) ;
StartSpriteAffineAnim ( & gSprites [ sFactorySelectScreen - > monPics [ 1 ] . bgSpriteId ] , 2 ) ;
2018-11-11 16:44:27 +01:00
mon = & sFactorySelectScreen - > mons [ sFactorySelectScreen - > cursorPos ] . monData ;
species = GetMonData ( mon , MON_DATA_SPECIES , NULL ) ;
personality = GetMonData ( mon , MON_DATA_PERSONALITY , NULL ) ;
otId = GetMonData ( mon , MON_DATA_OT_ID , NULL ) ;
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > monPics [ 1 ] . monSpriteId = CreateMonPicSprite_HandleDeoxys ( species , otId , personality , TRUE , 88 , 32 , 15 , 0xFFFF ) ;
gSprites [ sFactorySelectScreen - > monPics [ 1 ] . monSpriteId ] . centerToCornerVecX = 0 ;
gSprites [ sFactorySelectScreen - > monPics [ 1 ] . monSpriteId ] . centerToCornerVecY = 0 ;
2018-11-11 16:44:27 +01:00
2020-12-28 23:32:08 +01:00
gSprites [ sFactorySelectScreen - > monPics [ 1 ] . bgSpriteId ] . invisible = TRUE ;
2018-11-11 16:44:27 +01:00
}
2020-12-30 23:35:33 +01:00
static void Select_CreateChosenMonsSprites ( void )
2018-11-11 16:44:27 +01:00
{
u8 i , j ;
2020-08-31 19:36:48 +02:00
for ( i = 0 ; i < FRONTIER_PARTY_SIZE ; i + + )
2018-11-11 16:44:27 +01:00
{
for ( j = 0 ; j < SELECTABLE_MONS_COUNT ; j + + )
{
if ( sFactorySelectScreen - > mons [ j ] . selectedId = = i + 1 )
{
struct Pokemon * mon = & sFactorySelectScreen - > mons [ j ] . monData ;
u16 species = GetMonData ( mon , MON_DATA_SPECIES , NULL ) ;
u32 personality = GetMonData ( mon , MON_DATA_PERSONALITY , NULL ) ;
u32 otId = GetMonData ( mon , MON_DATA_OT_ID , NULL ) ;
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > monPics [ i ] . monSpriteId = CreateMonPicSprite_HandleDeoxys ( species , otId , personality , TRUE , ( i * 72 ) + 16 , 32 , i + 13 , 0xFFFF ) ;
gSprites [ sFactorySelectScreen - > monPics [ i ] . monSpriteId ] . centerToCornerVecX = 0 ;
gSprites [ sFactorySelectScreen - > monPics [ i ] . monSpriteId ] . centerToCornerVecY = 0 ;
2018-11-11 16:44:27 +01:00
break ;
}
}
}
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > monPicAnimating = FALSE ;
2018-11-11 16:44:27 +01:00
}
2020-12-30 23:35:33 +01:00
static void SpriteCB_OpenChosenMonPics ( struct Sprite * sprite )
2018-11-11 16:44:27 +01:00
{
u8 taskId ;
2020-12-30 23:35:33 +01:00
// Current sprite is monPics[1]
2018-11-11 16:44:27 +01:00
if ( sprite - > affineAnimEnded
2020-12-28 23:32:08 +01:00
& & gSprites [ sFactorySelectScreen - > monPics [ 0 ] . bgSpriteId ] . affineAnimEnded
& & gSprites [ sFactorySelectScreen - > monPics [ 2 ] . bgSpriteId ] . affineAnimEnded )
2018-11-11 16:44:27 +01:00
{
sprite - > invisible = TRUE ;
2020-12-28 23:32:08 +01:00
gSprites [ sFactorySelectScreen - > monPics [ 0 ] . bgSpriteId ] . invisible = TRUE ;
gSprites [ sFactorySelectScreen - > monPics [ 2 ] . bgSpriteId ] . invisible = TRUE ;
2018-11-11 16:44:27 +01:00
2020-12-30 23:35:33 +01:00
taskId = CreateTask ( Select_Task_OpenChosenMonPics , 1 ) ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . func ( taskId ) ;
sprite - > callback = SpriteCallbackDummy ;
}
}
2020-12-30 23:35:33 +01:00
static void SpriteCB_CloseChosenMonPics ( struct Sprite * sprite )
2018-11-11 16:44:27 +01:00
{
2020-12-30 23:35:33 +01:00
// Current sprite is monPics[1]
2018-11-11 16:44:27 +01:00
if ( sprite - > affineAnimEnded
2020-12-28 23:32:08 +01:00
& & gSprites [ sFactorySelectScreen - > monPics [ 0 ] . bgSpriteId ] . affineAnimEnded
& & gSprites [ sFactorySelectScreen - > monPics [ 2 ] . bgSpriteId ] . affineAnimEnded )
2018-11-11 16:44:27 +01:00
{
FreeOamMatrix ( sprite - > oam . matrixNum ) ;
2020-12-28 23:32:08 +01:00
FreeOamMatrix ( gSprites [ sFactorySelectScreen - > monPics [ 0 ] . bgSpriteId ] . oam . matrixNum ) ;
FreeOamMatrix ( gSprites [ sFactorySelectScreen - > monPics [ 2 ] . bgSpriteId ] . oam . matrixNum ) ;
2018-11-11 16:44:27 +01:00
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > monPicAnimating = FALSE ;
2018-11-11 16:44:27 +01:00
2020-12-28 23:32:08 +01:00
DestroySprite ( & gSprites [ sFactorySelectScreen - > monPics [ 0 ] . bgSpriteId ] ) ;
DestroySprite ( & gSprites [ sFactorySelectScreen - > monPics [ 2 ] . bgSpriteId ] ) ;
2018-11-11 16:44:27 +01:00
DestroySprite ( sprite ) ;
}
}
2020-12-30 23:35:33 +01:00
// Task data for Select_Task_OpenChosenMonPics, Select_Task_CloseChosenMonPics, Task_CloseMonPic, and Task_OpenMonPic
2020-12-28 23:32:08 +01:00
# define tWinLeft data[3]
# ifndef UBFIX
# define tWinRight data[24] // UB: Typo? Likely meant data[4], 24 is out of bounds
# else
# define tWinRight data[4]
# endif
# define tWinTop data[5]
# define tWinBottom data[8]
# define tSpriteId data[6] // TODO: Clarify, what sprite
# define tIsSwapScreen data[7]
2020-12-30 23:35:33 +01:00
static void Select_Task_OpenChosenMonPics ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
struct Task * task = & gTasks [ taskId ] ;
2020-12-28 23:32:08 +01:00
switch ( task - > tState )
2018-11-11 16:44:27 +01:00
{
case 0 :
2020-12-28 23:32:08 +01:00
task - > tWinLeft = 16 ;
task - > tWinRight = DISPLAY_WIDTH - 16 ;
task - > tWinTop = 64 ;
task - > tWinBottom = 65 ;
2018-11-11 16:44:27 +01:00
SetGpuRegBits ( REG_OFFSET_DISPCNT , DISPCNT_WIN0_ON ) ;
2020-12-28 23:32:08 +01:00
SetGpuReg ( REG_OFFSET_WIN0H , WIN_RANGE ( task - > tWinLeft , task - > tWinRight ) ) ;
SetGpuReg ( REG_OFFSET_WIN0V , WIN_RANGE ( task - > tWinTop , task - > tWinBottom ) ) ;
2018-11-11 16:44:27 +01:00
SetGpuReg ( REG_OFFSET_WININ , WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ ) ;
SetGpuReg ( REG_OFFSET_WINOUT , WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ ) ;
break ;
case 1 :
ShowBg ( 3 ) ;
SetGpuReg ( REG_OFFSET_BLDCNT , BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ ) ;
SetGpuReg ( REG_OFFSET_BLDALPHA , BLDALPHA_BLEND ( 11 , 4 ) ) ;
break ;
case 2 :
2020-12-28 23:32:08 +01:00
task - > tWinTop - = 4 ;
task - > tWinBottom + = 4 ;
if ( task - > tWinTop < = 32 | | task - > tWinBottom > = 96 )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
task - > tWinTop = 32 ;
task - > tWinBottom = 96 ;
2018-11-11 16:44:27 +01:00
ClearGpuRegBits ( REG_OFFSET_DISPCNT , DISPCNT_WIN0_ON ) ;
}
2020-12-28 23:32:08 +01:00
SetGpuReg ( REG_OFFSET_WIN0V , WIN_RANGE ( task - > tWinTop , task - > tWinBottom ) ) ;
if ( task - > tWinTop ! = 32 )
2018-11-11 16:44:27 +01:00
return ;
break ;
default :
DestroyTask ( taskId ) ;
2020-12-30 23:35:33 +01:00
Select_CreateChosenMonsSprites ( ) ;
2018-11-11 16:44:27 +01:00
return ;
}
2020-12-28 23:32:08 +01:00
task - > tState + + ;
2018-11-11 16:44:27 +01:00
}
2020-12-30 23:35:33 +01:00
static void Select_Task_CloseChosenMonPics ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
struct Task * task = & gTasks [ taskId ] ;
2020-12-28 23:32:08 +01:00
switch ( task - > tState )
2018-11-11 16:44:27 +01:00
{
case 0 :
2020-12-28 23:32:08 +01:00
task - > tWinLeft = 16 ;
task - > tWinRight = DISPLAY_WIDTH - 16 ;
task - > tWinTop = 32 ;
task - > tWinBottom = 96 ;
2018-11-11 16:44:27 +01:00
SetGpuRegBits ( REG_OFFSET_DISPCNT , DISPCNT_WIN0_ON ) ;
2020-12-28 23:32:08 +01:00
SetGpuReg ( REG_OFFSET_WIN0H , WIN_RANGE ( task - > tWinLeft , task - > tWinRight ) ) ;
SetGpuReg ( REG_OFFSET_WIN0V , WIN_RANGE ( task - > tWinTop , task - > tWinBottom ) ) ;
2018-11-11 16:44:27 +01:00
SetGpuReg ( REG_OFFSET_WININ , WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ ) ;
SetGpuReg ( REG_OFFSET_WINOUT , WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ ) ;
2020-12-28 23:32:08 +01:00
task - > tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 1 :
2020-12-28 23:32:08 +01:00
task - > tWinTop + = 4 ;
task - > tWinBottom - = 4 ;
if ( task - > tWinTop > = 64 | | task - > tWinBottom < = 65 )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
task - > tWinTop = 64 ;
task - > tWinBottom = 65 ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
SetGpuReg ( REG_OFFSET_WIN0V , WIN_RANGE ( task - > tWinTop , task - > tWinBottom ) ) ;
if ( task - > tWinTop = = 64 )
task - > tState + + ;
2018-11-11 16:44:27 +01:00
break ;
2020-12-30 23:35:33 +01:00
default :
HideBg ( 3 ) ;
gSprites [ sFactorySelectScreen - > monPics [ 1 ] . bgSpriteId ] . invisible = FALSE ;
gSprites [ sFactorySelectScreen - > monPics [ 1 ] . bgSpriteId ] . callback = SpriteCB_CloseChosenMonPics ;
gSprites [ sFactorySelectScreen - > monPics [ 0 ] . bgSpriteId ] . invisible = FALSE ;
gSprites [ sFactorySelectScreen - > monPics [ 0 ] . bgSpriteId ] . callback = SpriteCallbackDummy ;
gSprites [ sFactorySelectScreen - > monPics [ 2 ] . bgSpriteId ] . invisible = FALSE ;
gSprites [ sFactorySelectScreen - > monPics [ 2 ] . bgSpriteId ] . callback = SpriteCallbackDummy ;
StartSpriteAffineAnim ( & gSprites [ sFactorySelectScreen - > monPics [ 1 ] . bgSpriteId ] , 1 ) ;
StartSpriteAffineAnim ( & gSprites [ sFactorySelectScreen - > monPics [ 0 ] . bgSpriteId ] , 1 ) ;
StartSpriteAffineAnim ( & gSprites [ sFactorySelectScreen - > monPics [ 2 ] . bgSpriteId ] , 1 ) ;
ClearGpuRegBits ( REG_OFFSET_DISPCNT , DISPCNT_WIN0_ON ) ;
DestroyTask ( taskId ) ;
break ;
2018-11-11 16:44:27 +01:00
}
}
2020-12-30 23:35:33 +01:00
static void Select_ShowChosenMons ( void )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > monPics [ 1 ] . bgSpriteId = CreateSprite ( & sSpriteTemplate_Select_MonPicBgAnim , 120 , 64 , 1 ) ;
sFactorySelectScreen - > monPics [ 0 ] . bgSpriteId = CreateSprite ( & sSpriteTemplate_Select_MonPicBgAnim , 44 , 64 , 1 ) ;
sFactorySelectScreen - > monPics [ 2 ] . bgSpriteId = CreateSprite ( & sSpriteTemplate_Select_MonPicBgAnim , 196 , 64 , 1 ) ;
2018-11-11 16:44:27 +01:00
2020-12-30 23:35:33 +01:00
gSprites [ sFactorySelectScreen - > monPics [ 1 ] . bgSpriteId ] . callback = SpriteCB_OpenChosenMonPics ;
2020-12-28 23:32:08 +01:00
gSprites [ sFactorySelectScreen - > monPics [ 0 ] . bgSpriteId ] . callback = SpriteCallbackDummy ;
gSprites [ sFactorySelectScreen - > monPics [ 2 ] . bgSpriteId ] . callback = SpriteCallbackDummy ;
2018-11-11 16:44:27 +01:00
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > monPicAnimating = TRUE ;
2018-11-11 16:44:27 +01:00
}
2020-12-30 23:35:33 +01:00
static void Select_HideChosenMons ( void )
2018-11-11 16:44:27 +01:00
{
u8 taskId ;
2020-12-28 23:32:08 +01:00
FreeAndDestroyMonPicSprite ( sFactorySelectScreen - > monPics [ 0 ] . monSpriteId ) ;
FreeAndDestroyMonPicSprite ( sFactorySelectScreen - > monPics [ 1 ] . monSpriteId ) ;
FreeAndDestroyMonPicSprite ( sFactorySelectScreen - > monPics [ 2 ] . monSpriteId ) ;
2018-11-11 16:44:27 +01:00
2020-12-30 23:35:33 +01:00
taskId = CreateTask ( Select_Task_CloseChosenMonPics , 1 ) ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . func ( taskId ) ;
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > monPicAnimating = TRUE ;
2018-11-11 16:44:27 +01:00
}
static void Select_SetWinRegs ( s16 mWin0H , s16 nWin0H , s16 mWin0V , s16 nWin0V )
{
SetGpuRegBits ( REG_OFFSET_DISPCNT , DISPCNT_WIN0_ON ) ;
SetGpuReg ( REG_OFFSET_WIN0H , WIN_RANGE ( mWin0H , nWin0H ) ) ;
SetGpuReg ( REG_OFFSET_WIN0V , WIN_RANGE ( mWin0V , nWin0V ) ) ;
SetGpuReg ( REG_OFFSET_WININ , WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ ) ;
SetGpuReg ( REG_OFFSET_WINOUT , WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ ) ;
}
2020-07-13 06:47:30 +02:00
static bool32 Select_AreSpeciesValid ( u16 monId )
2018-11-11 16:44:27 +01:00
{
u8 i , j ;
2020-07-13 06:47:30 +02:00
u32 species = gFacilityTrainerMons [ monId ] . species ;
2018-11-11 16:44:27 +01:00
u8 selectState = sFactorySelectScreen - > selectingMonsState ;
for ( i = 1 ; i < selectState ; i + + )
{
for ( j = 0 ; j < SELECTABLE_MONS_COUNT ; j + + )
{
if ( sFactorySelectScreen - > mons [ j ] . selectedId = = i )
{
2020-07-13 06:47:30 +02:00
if ( gFacilityTrainerMons [ sFactorySelectScreen - > mons [ j ] . monId ] . species = = species )
2018-11-11 16:44:27 +01:00
return FALSE ;
break ;
}
}
}
return TRUE ;
}
2020-12-28 23:32:08 +01:00
static void Select_Task_FadeSpeciesName ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
case FADESTATE_INIT :
sFactorySelectScreen - > fadeSpeciesNameCoeffDelay = 0 ;
sFactorySelectScreen - > fadeSpeciesNameCoeff = 0 ;
sFactorySelectScreen - > fadeSpeciesNameFadeOut = TRUE ;
gTasks [ taskId ] . tState = FADESTATE_RUN ;
2018-11-11 16:44:27 +01:00
break ;
2020-12-28 23:32:08 +01:00
case FADESTATE_RUN :
if ( sFactorySelectScreen - > fadeSpeciesNameActive )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
if ( sFactorySelectScreen - > faceSpeciesNameDelay )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = FADESTATE_DELAY ;
2018-11-11 16:44:27 +01:00
}
else
{
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > fadeSpeciesNameCoeffDelay + + ;
if ( sFactorySelectScreen - > fadeSpeciesNameCoeffDelay > 6 )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > fadeSpeciesNameCoeffDelay = 0 ;
if ( ! sFactorySelectScreen - > fadeSpeciesNameFadeOut )
sFactorySelectScreen - > fadeSpeciesNameCoeff - - ;
2018-11-11 16:44:27 +01:00
else
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > fadeSpeciesNameCoeff + + ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
BlendPalettes ( 0x4000 , sFactorySelectScreen - > fadeSpeciesNameCoeff , 0 ) ;
if ( sFactorySelectScreen - > fadeSpeciesNameCoeff > 5 )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > fadeSpeciesNameFadeOut = FALSE ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
else if ( sFactorySelectScreen - > fadeSpeciesNameCoeff = = 0 )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = FADESTATE_DELAY ;
sFactorySelectScreen - > fadeSpeciesNameFadeOut = TRUE ;
2018-11-11 16:44:27 +01:00
}
}
}
break ;
2020-12-28 23:32:08 +01:00
case FADESTATE_DELAY :
if ( sFactorySelectScreen - > faceSpeciesNameDelay > 14 )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > faceSpeciesNameDelay = 0 ;
gTasks [ taskId ] . tState = FADESTATE_RUN ;
2018-11-11 16:44:27 +01:00
}
else
{
2020-12-28 23:32:08 +01:00
sFactorySelectScreen - > faceSpeciesNameDelay + + ;
2018-11-11 16:44:27 +01:00
}
break ;
}
}
// Swap Screen's section begins here.
static void Swap_CB2 ( void )
{
AnimateSprites ( ) ;
BuildOamBuffer ( ) ;
RunTextPrinters ( ) ;
UpdatePaletteFade ( ) ;
RunTasks ( ) ;
}
static void Swap_VblankCb ( void )
{
LoadOam ( ) ;
ProcessSpriteCopyRequests ( ) ;
TransferPlttBuffer ( ) ;
}
static void CopySwappedMonData ( void )
{
2020-08-31 19:36:48 +02:00
u8 friendship ;
2018-11-11 16:44:27 +01:00
gPlayerParty [ sFactorySwapScreen - > playerMonId ] = gEnemyParty [ sFactorySwapScreen - > enemyMonId ] ;
2020-08-31 19:36:48 +02:00
friendship = 0 ;
SetMonData ( & gPlayerParty [ sFactorySwapScreen - > playerMonId ] , MON_DATA_FRIENDSHIP , & friendship ) ;
gSaveBlock2Ptr - > frontier . rentalMons [ sFactorySwapScreen - > playerMonId ] . monId = gSaveBlock2Ptr - > frontier . rentalMons [ sFactorySwapScreen - > enemyMonId + FRONTIER_PARTY_SIZE ] . monId ;
gSaveBlock2Ptr - > frontier . rentalMons [ sFactorySwapScreen - > playerMonId ] . ivs = gSaveBlock2Ptr - > frontier . rentalMons [ sFactorySwapScreen - > enemyMonId + FRONTIER_PARTY_SIZE ] . ivs ;
2019-02-07 19:58:09 +01:00
gSaveBlock2Ptr - > frontier . rentalMons [ sFactorySwapScreen - > playerMonId ] . personality = GetMonData ( & gEnemyParty [ sFactorySwapScreen - > enemyMonId ] , MON_DATA_PERSONALITY , NULL ) ;
2019-05-14 15:22:16 +02:00
gSaveBlock2Ptr - > frontier . rentalMons [ sFactorySwapScreen - > playerMonId ] . abilityNum = GetBoxMonData ( & gEnemyParty [ sFactorySwapScreen - > enemyMonId ] . box , MON_DATA_ABILITY_NUM , NULL ) ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
static void Swap_Task_OpenSummaryScreen ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
case 6 :
2020-12-28 23:32:08 +01:00
BeginNormalPaletteFade ( 0xFFFFFFFF , 0 , 0 , 16 , RGB_BLACK ) ;
gTasks [ taskId ] . tState = 7 ;
2018-11-11 16:44:27 +01:00
break ;
case 7 :
if ( ! gPaletteFade . active )
{
DestroyTask ( sFactorySwapScreen - > fadeSpeciesNameTaskId ) ;
2020-12-28 23:32:08 +01:00
HideMonPic ( sFactorySwapScreen - > monPic , & sFactorySwapScreen - > monPicAnimating ) ;
2018-11-11 16:44:27 +01:00
Swap_DestroyAllSprites ( ) ;
FREE_AND_SET_NULL ( sSwapMenuTilesetBuffer ) ;
2020-08-31 19:36:48 +02:00
FREE_AND_SET_NULL ( sSwapMonPicBgTilesetBuffer ) ;
2018-11-11 16:44:27 +01:00
FREE_AND_SET_NULL ( sSwapMenuTilemapBuffer ) ;
2020-08-31 19:36:48 +02:00
FREE_AND_SET_NULL ( sSwapMonPicBgTilemapBuffer ) ;
2018-11-11 16:44:27 +01:00
FreeAllWindowBuffers ( ) ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = 8 ;
2018-11-11 16:44:27 +01:00
}
break ;
case 8 :
DestroyTask ( taskId ) ;
sFactorySwapScreen - > fromSummaryScreen = TRUE ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > speciesNameColorBackup = gPlttBufferUnfaded [ 244 ] ;
2020-08-31 19:36:48 +02:00
ShowPokemonSummaryScreen ( PSS_MODE_NORMAL , gPlayerParty , sFactorySwapScreen - > cursorPos , FRONTIER_PARTY_SIZE - 1 , CB2_InitSwapScreen ) ;
2018-11-11 16:44:27 +01:00
break ;
}
}
2020-12-28 23:32:08 +01:00
static void Swap_Task_Exit ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
if ( sFactorySwapScreen - > monPicAnimating = = TRUE )
return ;
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
case 0 :
// Set return value for script
// TRUE if player kept their current pokemon
if ( sFactorySwapScreen - > monSwapped = = TRUE )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + + ;
gSpecialVar_Result = FALSE ;
}
else
{
gTasks [ taskId ] . tState = 2 ;
gSpecialVar_Result = TRUE ;
}
break ;
case 1 :
if ( sFactorySwapScreen - > monSwapped = = TRUE )
{
sFactorySwapScreen - > enemyMonId = sFactorySwapScreen - > cursorPos ;
CopySwappedMonData ( ) ;
}
gTasks [ taskId ] . tState + + ;
break ;
case 2 :
BeginNormalPaletteFade ( 0xFFFFFFFF , 0 , 0 , 16 , RGB_BLACK ) ;
gTasks [ taskId ] . tState + + ;
break ;
case 3 :
if ( ! UpdatePaletteFade ( ) )
{
DestroyTask ( sFactorySwapScreen - > fadeSpeciesNameTaskId ) ;
Swap_DestroyAllSprites ( ) ;
FREE_AND_SET_NULL ( sSwapMenuTilesetBuffer ) ;
FREE_AND_SET_NULL ( sSwapMonPicBgTilesetBuffer ) ;
FREE_AND_SET_NULL ( sSwapMenuTilemapBuffer ) ;
FREE_AND_SET_NULL ( sSwapMonPicBgTilemapBuffer ) ;
FREE_AND_SET_NULL ( sFactorySwapScreen ) ;
FreeAllWindowBuffers ( ) ;
SetMainCallback2 ( CB2_ReturnToFieldContinueScript ) ;
DestroyTask ( taskId ) ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
break ;
2018-11-11 16:44:27 +01:00
}
}
2020-12-28 23:32:08 +01:00
# define STATE_SHOW_YES_NO 4
# define STATE_HANDLE_INPUT 5
# define tSaidYes data[1]
# define tFollowUpTaskState data[5]
# define tFollowUpTaskPtrHi data[6]
# define tFollowUpTaskPtrLo data[7]
static void Swap_Task_HandleYesNo ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
u16 loPtr , hiPtr ;
2020-12-28 23:32:08 +01:00
if ( sFactorySwapScreen - > monPicAnimating = = TRUE )
return ;
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
case STATE_SHOW_YES_NO :
Swap_ShowYesNoOptions ( ) ;
gTasks [ taskId ] . tState = STATE_HANDLE_INPUT ;
break ;
case STATE_HANDLE_INPUT :
if ( JOY_NEW ( A_BUTTON ) )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
PlaySE ( SE_SELECT ) ;
if ( sFactorySwapScreen - > yesNoCursorPos = = 0 )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
// Selected Yes
gTasks [ taskId ] . tSaidYes = TRUE ;
hiPtr = gTasks [ taskId ] . tFollowUpTaskPtrHi ;
loPtr = gTasks [ taskId ] . tFollowUpTaskPtrLo ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . func = ( void * ) ( ( hiPtr < < 16 ) | loPtr ) ;
}
2020-12-28 23:32:08 +01:00
else
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
// Selected No
gTasks [ taskId ] . tSaidYes = FALSE ;
Swap_ErasePopupMenu ( SWAP_WIN_YES_NO ) ;
hiPtr = gTasks [ taskId ] . tFollowUpTaskPtrHi ;
loPtr = gTasks [ taskId ] . tFollowUpTaskPtrLo ;
gTasks [ taskId ] . func = ( void * ) ( ( hiPtr < < 16 ) | loPtr ) ;
2018-11-11 16:44:27 +01:00
}
}
2020-12-28 23:32:08 +01:00
else if ( JOY_NEW ( B_BUTTON ) )
{
PlaySE ( SE_SELECT ) ;
gTasks [ taskId ] . tSaidYes = FALSE ;
Swap_ErasePopupMenu ( SWAP_WIN_YES_NO ) ;
hiPtr = gTasks [ taskId ] . tFollowUpTaskPtrHi ;
loPtr = gTasks [ taskId ] . tFollowUpTaskPtrLo ;
gTasks [ taskId ] . func = ( void * ) ( ( hiPtr < < 16 ) | loPtr ) ;
}
else if ( JOY_REPEAT ( DPAD_UP ) )
{
PlaySE ( SE_SELECT ) ;
Swap_UpdateYesNoCursorPosition ( - 1 ) ;
}
else if ( JOY_REPEAT ( DPAD_DOWN ) )
{
PlaySE ( SE_SELECT ) ;
Swap_UpdateYesNoCursorPosition ( 1 ) ;
}
break ;
2018-11-11 16:44:27 +01:00
}
}
2020-12-28 23:32:08 +01:00
static void Swap_HandleQuitSwappingResposne ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
if ( gTasks [ taskId ] . tSaidYes = = TRUE )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = 0 ;
gTasks [ taskId ] . func = Swap_Task_Exit ;
2018-11-11 16:44:27 +01:00
}
else
{
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = 0 ;
gTasks [ taskId ] . tFollowUpTaskPtrHi = ( u32 ) ( Swap_Task_HandleChooseMons ) > > 16 ;
gTasks [ taskId ] . tFollowUpTaskPtrLo = ( u32 ) ( Swap_Task_HandleChooseMons ) ;
gTasks [ taskId ] . tFollowUpTaskState = 1 ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . func = sub_819D770 ;
}
}
2020-12-28 23:32:08 +01:00
static void Swap_AskQuitSwapping ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
if ( gTasks [ taskId ] . tState = = 0 )
2018-11-11 16:44:27 +01:00
{
Swap_PrintOnInfoWindow ( gText_QuitSwapping ) ;
sFactorySwapScreen - > monSwapped = FALSE ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = STATE_SHOW_YES_NO ;
gTasks [ taskId ] . tFollowUpTaskPtrHi = ( u32 ) ( Swap_HandleQuitSwappingResposne ) > > 16 ;
gTasks [ taskId ] . tFollowUpTaskPtrLo = ( u32 ) ( Swap_HandleQuitSwappingResposne ) ;
gTasks [ taskId ] . func = Swap_Task_HandleYesNo ;
2018-11-11 16:44:27 +01:00
}
}
2020-12-28 23:32:08 +01:00
static void Swap_HandleAcceptMonResponse ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
CloseMonPic ( sFactorySwapScreen - > monPic , & sFactorySwapScreen - > monPicAnimating , TRUE ) ;
if ( gTasks [ taskId ] . tSaidYes = = TRUE )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = 0 ;
gTasks [ taskId ] . func = Swap_Task_Exit ;
2018-11-11 16:44:27 +01:00
}
else
{
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = 0 ;
gTasks [ taskId ] . tFollowUpTaskPtrHi = ( u32 ) ( Swap_Task_HandleChooseMons ) > > 16 ;
gTasks [ taskId ] . tFollowUpTaskPtrLo = ( u32 ) ( Swap_Task_HandleChooseMons ) ;
gTasks [ taskId ] . tFollowUpTaskState = 1 ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . func = sub_819D770 ;
}
}
2020-12-28 23:32:08 +01:00
static void Swap_AskAcceptMon ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
if ( gTasks [ taskId ] . tState = = 0 )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
OpenMonPic ( & sFactorySwapScreen - > monPic . bgSpriteId , & sFactorySwapScreen - > monPicAnimating , TRUE ) ;
2018-11-11 16:44:27 +01:00
Swap_PrintOnInfoWindow ( gText_AcceptThisPkmn ) ;
sFactorySwapScreen - > monSwapped = TRUE ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = STATE_SHOW_YES_NO ;
gTasks [ taskId ] . tFollowUpTaskPtrHi = ( u32 ) ( Swap_HandleAcceptMonResponse ) > > 16 ;
gTasks [ taskId ] . tFollowUpTaskPtrLo = ( u32 ) ( Swap_HandleAcceptMonResponse ) ;
gTasks [ taskId ] . func = Swap_Task_HandleYesNo ;
2018-11-11 16:44:27 +01:00
}
}
2020-12-30 23:35:33 +01:00
# undef STATE_SHOW_YES_NO
# undef STATE_HANDLE_INPUT
2020-12-28 23:32:08 +01:00
static void Swap_Task_HandleMenu ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
case 2 :
if ( ! sFactorySwapScreen - > fromSummaryScreen )
2020-12-28 23:32:08 +01:00
OpenMonPic ( & sFactorySwapScreen - > monPic . bgSpriteId , & sFactorySwapScreen - > monPicAnimating , TRUE ) ;
gTasks [ taskId ] . tState = 9 ;
2018-11-11 16:44:27 +01:00
break ;
case 9 :
2020-12-28 23:32:08 +01:00
if ( sFactorySwapScreen - > monPicAnimating ! = TRUE )
2018-11-11 16:44:27 +01:00
{
Swap_ShowMenuOptions ( ) ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = 3 ;
2018-11-11 16:44:27 +01:00
}
break ;
case 3 :
2020-12-28 23:32:08 +01:00
if ( sFactorySwapScreen - > monPicAnimating ! = TRUE )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
if ( JOY_NEW ( A_BUTTON ) )
2018-11-11 16:44:27 +01:00
{
PlaySE ( SE_SELECT ) ;
Swap_RunMenuOptionFunc ( taskId ) ;
}
2020-12-28 23:32:08 +01:00
else if ( JOY_NEW ( B_BUTTON ) )
2018-11-11 16:44:27 +01:00
{
PlaySE ( SE_SELECT ) ;
2020-12-28 23:32:08 +01:00
CloseMonPic ( sFactorySwapScreen - > monPic , & sFactorySwapScreen - > monPicAnimating , TRUE ) ;
Swap_ErasePopupMenu ( SWAP_WIN_OPTIONS ) ;
gTasks [ taskId ] . tState = 0 ;
gTasks [ taskId ] . tFollowUpTaskPtrHi = ( u32 ) ( Swap_Task_HandleChooseMons ) > > 16 ;
gTasks [ taskId ] . tFollowUpTaskPtrLo = ( u32 ) ( Swap_Task_HandleChooseMons ) ;
gTasks [ taskId ] . tFollowUpTaskState = 1 ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . func = sub_819D770 ;
}
2020-12-28 23:32:08 +01:00
else if ( JOY_REPEAT ( DPAD_UP ) )
2018-11-11 16:44:27 +01:00
{
Swap_UpdateMenuCursorPosition ( - 1 ) ;
}
2020-12-28 23:32:08 +01:00
else if ( JOY_REPEAT ( DPAD_DOWN ) )
2018-11-11 16:44:27 +01:00
{
Swap_UpdateMenuCursorPosition ( 1 ) ;
}
}
break ;
}
}
2020-12-28 23:32:08 +01:00
static void Swap_Task_HandleChooseMons ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
case 0 :
if ( ! gPaletteFade . active )
{
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > fadeSpeciesNameActive = TRUE ;
gTasks [ taskId ] . tState = 1 ;
2018-11-11 16:44:27 +01:00
}
break ;
case 1 :
2020-12-28 23:32:08 +01:00
if ( JOY_NEW ( A_BUTTON ) )
2018-11-11 16:44:27 +01:00
{
PlaySE ( SE_SELECT ) ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > fadeSpeciesNameActive = FALSE ;
2018-11-11 16:44:27 +01:00
Swap_PrintMonSpecies2 ( ) ;
sub_819EAC0 ( ) ;
Swap_RunActionFunc ( taskId ) ;
}
2020-12-28 23:32:08 +01:00
else if ( JOY_NEW ( B_BUTTON ) )
2018-11-11 16:44:27 +01:00
{
PlaySE ( SE_SELECT ) ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > fadeSpeciesNameActive = FALSE ;
2018-11-11 16:44:27 +01:00
Swap_PrintMonSpecies2 ( ) ;
sub_819EAC0 ( ) ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tFollowUpTaskPtrHi = ( u32 ) ( Swap_AskQuitSwapping ) > > 16 ;
gTasks [ taskId ] . tFollowUpTaskPtrLo = ( u32 ) ( Swap_AskQuitSwapping ) ;
gTasks [ taskId ] . tState = 0 ;
gTasks [ taskId ] . tFollowUpTaskState = 0 ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . func = sub_819D588 ;
}
2020-12-28 23:32:08 +01:00
else if ( JOY_REPEAT ( DPAD_LEFT ) )
2018-11-11 16:44:27 +01:00
{
Swap_UpdateBallCursorPosition ( - 1 ) ;
Swap_PrintMonCategory ( ) ;
Swap_PrintMonSpecies ( ) ;
}
2020-12-28 23:32:08 +01:00
else if ( JOY_REPEAT ( DPAD_RIGHT ) )
2018-11-11 16:44:27 +01:00
{
Swap_UpdateBallCursorPosition ( 1 ) ;
Swap_PrintMonCategory ( ) ;
Swap_PrintMonSpecies ( ) ;
}
2020-12-28 23:32:08 +01:00
else if ( JOY_REPEAT ( DPAD_DOWN ) )
2018-11-11 16:44:27 +01:00
{
Swap_UpdateActionCursorPosition ( 1 ) ;
Swap_PrintMonCategory ( ) ;
Swap_PrintMonSpecies ( ) ;
}
2020-12-28 23:32:08 +01:00
else if ( JOY_REPEAT ( DPAD_UP ) )
2018-11-11 16:44:27 +01:00
{
Swap_UpdateActionCursorPosition ( - 1 ) ;
Swap_PrintMonCategory ( ) ;
Swap_PrintMonSpecies ( ) ;
}
break ;
}
}
2020-12-28 23:32:08 +01:00
static void Swap_Task_FadeSpeciesName ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
case FADESTATE_INIT :
sFactorySwapScreen - > fadeSpeciesNameCoeffDelay = 0 ;
sFactorySwapScreen - > fadeSpeciesNameCoeff = 0 ;
sFactorySwapScreen - > fadeSpeciesNameFadeOut = TRUE ;
gTasks [ taskId ] . tState = FADESTATE_RUN ;
2018-11-11 16:44:27 +01:00
break ;
2020-12-28 23:32:08 +01:00
case FADESTATE_RUN :
if ( sFactorySwapScreen - > fadeSpeciesNameActive )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
if ( sFactorySwapScreen - > faceSpeciesNameDelay )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = FADESTATE_DELAY ;
2018-11-11 16:44:27 +01:00
}
else
{
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > fadeSpeciesNameCoeffDelay + + ;
if ( sFactorySwapScreen - > fadeSpeciesNameCoeffDelay > 6 )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > fadeSpeciesNameCoeffDelay = 0 ;
if ( ! sFactorySwapScreen - > fadeSpeciesNameFadeOut )
sFactorySwapScreen - > fadeSpeciesNameCoeff - - ;
2018-11-11 16:44:27 +01:00
else
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > fadeSpeciesNameCoeff + + ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
BlendPalettes ( 0x4000 , sFactorySwapScreen - > fadeSpeciesNameCoeff , 0 ) ;
if ( sFactorySwapScreen - > fadeSpeciesNameCoeff > 5 )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > fadeSpeciesNameFadeOut = FALSE ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
else if ( sFactorySwapScreen - > fadeSpeciesNameCoeff = = 0 )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = FADESTATE_DELAY ;
sFactorySwapScreen - > fadeSpeciesNameFadeOut = TRUE ;
2018-11-11 16:44:27 +01:00
}
}
}
break ;
2020-12-28 23:32:08 +01:00
case FADESTATE_DELAY :
if ( sFactorySwapScreen - > faceSpeciesNameDelay > 14 )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > faceSpeciesNameDelay = 0 ;
gTasks [ taskId ] . tState = FADESTATE_RUN ;
2018-11-11 16:44:27 +01:00
}
else
{
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > faceSpeciesNameDelay + + ;
2018-11-11 16:44:27 +01:00
}
break ;
}
}
2020-12-28 23:32:08 +01:00
static void Swap_Task_FadeSpeciesName2 ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
case 0 :
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > fadeSpeciesNameCoeffDelay = 0 ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . data [ 4 ] = 0 ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 1 :
LoadPalette ( & gPlttBufferUnfaded [ 0xF0 ] , 0xE0 , 0xA ) ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 2 :
2020-12-28 23:32:08 +01:00
if ( sFactorySwapScreen - > fadeSpeciesNameCoeff > 15 )
2018-11-11 16:44:27 +01:00
{
gTasks [ taskId ] . data [ 4 ] = 1 ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > fadeSpeciesNameCoeffDelay + + ;
if ( sFactorySwapScreen - > fadeSpeciesNameCoeffDelay > 3 )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > fadeSpeciesNameCoeffDelay = 0 ;
2018-11-11 16:44:27 +01:00
gPlttBufferUnfaded [ 244 ] = gPlttBufferFaded [ 228 ] ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > fadeSpeciesNameCoeff + + ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
BlendPalettes ( 0x4000 , sFactorySwapScreen - > fadeSpeciesNameCoeff , 0 ) ;
2018-11-11 16:44:27 +01:00
break ;
}
}
2020-12-30 23:35:33 +01:00
// TODO
2018-11-11 16:44:27 +01:00
static void sub_819D12C ( u8 taskId )
{
s8 i ;
u8 var_2C ;
bool8 destroyTask ;
2020-12-28 23:32:08 +01:00
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
case 0 :
gTasks [ taskId ] . data [ 1 ] = 0 ;
gTasks [ taskId ] . data [ 2 ] = 0 ;
gTasks [ taskId ] . data [ 3 ] = 0 ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = 1 ;
2018-11-11 16:44:27 +01:00
break ;
case 1 :
var_2C = 0 ;
2020-08-31 19:36:48 +02:00
for ( i = FRONTIER_PARTY_SIZE - 1 ; i > = 0 ; i - - )
2018-11-11 16:44:27 +01:00
{
2020-08-31 19:36:48 +02:00
if ( i ! = FRONTIER_PARTY_SIZE - 1 )
2018-11-11 16:44:27 +01:00
{
u8 posX = var_2C - gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] . pos1 . x ;
if ( posX = = 16 | | gTasks [ taskId ] . data [ i + 2 ] = = 1 )
{
var_2C = gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] . pos1 . x ;
gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] . pos1 . x + = 10 ;
}
else if ( posX > 16 )
{
gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] . pos1 . x = gSprites [ sFactorySwapScreen - > ballSpriteIds [ i + 1 ] ] . pos1 . x - 48 ;
}
}
else
{
var_2C = gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] . pos1 . x ;
gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] . pos1 . x + = 10 ;
}
if ( gTasks [ taskId ] . data [ i + 1 ] = = 1 )
{
if ( gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] . pos1 . x > ( i * 48 ) + 72 )
{
gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] . pos1 . x = ( i * 48 ) + 72 ;
destroyTask = TRUE ;
}
else if ( gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] . pos1 . x = = ( i * 48 ) + 72 )
{
destroyTask = TRUE ;
}
else
{
destroyTask = FALSE ;
}
}
else
{
destroyTask = FALSE ;
}
2020-12-28 23:32:08 +01:00
if ( gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] . pos1 . x - 16 > DISPLAY_WIDTH )
2018-11-11 16:44:27 +01:00
{
var_2C = gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] . pos1 . x ;
gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] . pos1 . x = - 16 ;
if ( sFactorySwapScreen - > inEnemyScreen = = TRUE )
2020-08-31 19:36:48 +02:00
gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] . oam . paletteNum = IndexOfSpritePaletteTag ( PALTAG_BALL_SELECTED ) ;
2018-11-11 16:44:27 +01:00
else
2020-08-31 19:36:48 +02:00
gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] . oam . paletteNum = IndexOfSpritePaletteTag ( PALTAG_BALL_GRAY ) ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . data [ i + 1 ] = 1 ;
}
}
if ( destroyTask = = TRUE )
DestroyTask ( taskId ) ;
break ;
}
}
static void sub_819D324 ( u8 taskId )
{
u8 i , j ;
s32 posX = 0 ;
s8 r4 = gTasks [ taskId ] . data [ 3 ] ;
bool8 r1 ;
s16 currPosX ;
u8 taskId2 ;
if ( gTasks [ taskId ] . data [ 2 ] = = 1 )
r4 * = - 1 ;
2020-12-28 23:32:08 +01:00
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
case 0 :
2020-12-28 23:32:08 +01:00
currPosX = gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 0 ] [ 0 ] ] . pos1 . x ;
2018-11-11 16:44:27 +01:00
if ( ! gTasks [ taskId ] . data [ 2 ] )
{
2020-12-28 23:32:08 +01:00
if ( currPosX + r4 < DISPLAY_WIDTH )
2018-11-11 16:44:27 +01:00
{
r1 = TRUE ;
}
else
{
r1 = FALSE ;
2020-12-28 23:32:08 +01:00
posX = DISPLAY_WIDTH ;
2018-11-11 16:44:27 +01:00
}
}
else
{
2020-12-28 23:32:08 +01:00
if ( currPosX + r4 > DISPLAY_HEIGHT )
2018-11-11 16:44:27 +01:00
{
r1 = TRUE ;
}
else
{
r1 = FALSE ;
2020-12-28 23:32:08 +01:00
posX = DISPLAY_HEIGHT ;
2018-11-11 16:44:27 +01:00
}
}
if ( r1 = = TRUE )
{
2020-12-28 23:32:08 +01:00
for ( i = 0 ; i < ARRAY_COUNT ( sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 0 ] ) ; i + + )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
for ( j = 0 ; j < ARRAY_COUNT ( sFactorySwapScreen - > pkmnForSwapButtonSpriteIds ) ; j + + )
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ j ] [ i ] ] . pos1 . x + = r4 ;
2018-11-11 16:44:27 +01:00
}
}
else
{
2020-12-28 23:32:08 +01:00
for ( j = 0 ; j < ARRAY_COUNT ( sFactorySwapScreen - > pkmnForSwapButtonSpriteIds ) ; j + + )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ j ] [ 0 ] ] . pos1 . x = posX ;
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ j ] [ 1 ] ] . pos1 . x = posX + 16 ;
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ j ] [ 2 ] ] . pos1 . x = posX + 48 ;
2018-11-11 16:44:27 +01:00
}
taskId2 = gTasks [ taskId ] . data [ 1 ] ;
gTasks [ taskId2 ] . data [ 3 ] = 1 ;
DestroyTask ( taskId ) ;
}
break ;
case 1 :
2020-12-28 23:32:08 +01:00
currPosX = gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ 0 ] [ 0 ] ] . pos1 . x ;
2018-11-11 16:44:27 +01:00
if ( ! gTasks [ taskId ] . data [ 2 ] )
{
2020-12-28 23:32:08 +01:00
if ( currPosX + r4 < DISPLAY_WIDTH )
2018-11-11 16:44:27 +01:00
{
r1 = TRUE ;
}
else
{
r1 = FALSE ;
2020-12-28 23:32:08 +01:00
posX = DISPLAY_WIDTH ;
2018-11-11 16:44:27 +01:00
}
}
else
{
2020-12-28 23:32:08 +01:00
if ( currPosX + r4 > DISPLAY_HEIGHT + 32 )
2018-11-11 16:44:27 +01:00
{
r1 = TRUE ;
}
else
{
r1 = FALSE ;
2020-12-28 23:32:08 +01:00
posX = DISPLAY_HEIGHT + 32 ;
2018-11-11 16:44:27 +01:00
}
}
if ( r1 = = TRUE )
{
2020-12-28 23:32:08 +01:00
for ( i = 0 ; i < ARRAY_COUNT ( sFactorySwapScreen - > cancelButtonSpriteIds ) ; i + + )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
for ( j = 0 ; j < ARRAY_COUNT ( sFactorySwapScreen - > cancelButtonSpriteIds [ 0 ] ) ; j + + )
gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ j ] [ i ] ] . pos1 . x + = r4 ;
2018-11-11 16:44:27 +01:00
}
}
else
{
2020-12-28 23:32:08 +01:00
for ( j = 0 ; j < ARRAY_COUNT ( sFactorySwapScreen - > cancelButtonSpriteIds ) ; j + + )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ j ] [ 0 ] ] . pos1 . x = posX ;
gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ j ] [ 1 ] ] . pos1 . x = posX + 16 ;
2018-11-11 16:44:27 +01:00
}
taskId2 = gTasks [ taskId ] . data [ 1 ] ;
gTasks [ taskId2 ] . data [ 4 ] = 1 ;
DestroyTask ( taskId ) ;
}
break ;
}
}
static void sub_819D588 ( u8 taskId )
{
u8 anotherTaskId ;
2020-12-28 23:32:08 +01:00
u16 hiPtr , loPtr ;
2018-11-11 16:44:27 +01:00
2020-12-28 23:32:08 +01:00
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
case 0 :
2020-08-31 19:36:48 +02:00
LoadPalette ( sSwapText_Pal , 0xE0 , sizeof ( sSwapText_Pal ) ) ;
2018-11-11 16:44:27 +01:00
Swap_PrintActionStrings ( ) ;
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SWAP_WIN_5 ) ;
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 1 :
2020-12-28 23:32:08 +01:00
Swap_ErasePopupMenu ( SWAP_WIN_OPTIONS ) ;
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 2 :
2020-12-28 23:32:08 +01:00
BeginNormalPaletteFade ( 0x4000 , 0 , 0 , 16 , sPokeballGray_Pal [ 37 ] ) ;
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 3 :
if ( ! gPaletteFade . active )
{
2020-12-28 23:32:08 +01:00
FillWindowPixelBuffer ( SWAP_WIN_5 , PIXEL_FILL ( 0 ) ) ;
CopyWindowToVram ( SWAP_WIN_5 , 2 ) ;
2018-11-11 16:44:27 +01:00
if ( sFactorySwapScreen - > inEnemyScreen = = TRUE )
{
anotherTaskId = CreateTask ( sub_819D324 , 0 ) ;
gTasks [ taskId ] . data [ 3 ] = 0 ;
gTasks [ anotherTaskId ] . data [ 1 ] = taskId ;
2020-12-28 23:32:08 +01:00
gTasks [ anotherTaskId ] . tState = 0 ;
2018-11-11 16:44:27 +01:00
gTasks [ anotherTaskId ] . data [ 2 ] = 0 ;
gTasks [ anotherTaskId ] . data [ 3 ] = 6 ;
gTasks [ taskId ] . data [ 2 ] = 5 ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
}
else
{
anotherTaskId = CreateTask ( sub_819D324 , 0 ) ;
gTasks [ taskId ] . data [ 3 ] = 1 ;
gTasks [ taskId ] . data [ 4 ] = 0 ;
gTasks [ anotherTaskId ] . data [ 1 ] = taskId ;
2020-12-28 23:32:08 +01:00
gTasks [ anotherTaskId ] . tState = 1 ;
2018-11-11 16:44:27 +01:00
gTasks [ anotherTaskId ] . data [ 2 ] = 0 ;
gTasks [ anotherTaskId ] . data [ 3 ] = 6 ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + = 2 ;
2018-11-11 16:44:27 +01:00
}
}
break ;
case 4 :
if ( gTasks [ taskId ] . data [ 2 ] = = 0 )
{
anotherTaskId = CreateTask ( sub_819D324 , 0 ) ;
gTasks [ taskId ] . data [ 4 ] = 0 ;
gTasks [ anotherTaskId ] . data [ 1 ] = taskId ;
2020-12-28 23:32:08 +01:00
gTasks [ anotherTaskId ] . tState = 1 ;
2018-11-11 16:44:27 +01:00
gTasks [ anotherTaskId ] . data [ 2 ] = 0 ;
gTasks [ anotherTaskId ] . data [ 3 ] = 6 ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
}
else
{
gTasks [ taskId ] . data [ 2 ] - - ;
}
break ;
case 5 :
if ( gTasks [ taskId ] . data [ 3 ] = = 1 & & gTasks [ taskId ] . data [ 4 ] = = 1 )
{
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = gTasks [ taskId ] . tFollowUpTaskState ;
hiPtr = gTasks [ taskId ] . tFollowUpTaskPtrHi ;
loPtr = gTasks [ taskId ] . tFollowUpTaskPtrLo ;
gTasks [ taskId ] . func = ( void * ) ( ( hiPtr < < 16 ) | ( loPtr ) ) ;
2018-11-11 16:44:27 +01:00
}
break ;
}
}
static void sub_819D770 ( u8 taskId )
{
u8 anotherTaskId ;
2020-12-28 23:32:08 +01:00
u16 hiPtr , loPtr ;
if ( sFactorySwapScreen - > monPicAnimating = = TRUE )
2018-11-11 16:44:27 +01:00
return ;
2020-12-28 23:32:08 +01:00
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
case 0 :
if ( sFactorySwapScreen - > inEnemyScreen = = TRUE )
{
anotherTaskId = CreateTask ( sub_819D324 , 0 ) ;
gTasks [ taskId ] . data [ 3 ] = 0 ;
gTasks [ anotherTaskId ] . data [ 1 ] = taskId ;
2020-12-28 23:32:08 +01:00
gTasks [ anotherTaskId ] . tState = 0 ;
2018-11-11 16:44:27 +01:00
gTasks [ anotherTaskId ] . data [ 2 ] = 1 ;
gTasks [ anotherTaskId ] . data [ 3 ] = 6 ;
gTasks [ taskId ] . data [ 2 ] = 10 ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
}
else
{
anotherTaskId = CreateTask ( sub_819D324 , 0 ) ;
gTasks [ taskId ] . data [ 3 ] = 1 ;
gTasks [ taskId ] . data [ 4 ] = 0 ;
gTasks [ anotherTaskId ] . data [ 1 ] = taskId ;
2020-12-28 23:32:08 +01:00
gTasks [ anotherTaskId ] . tState = 1 ;
2018-11-11 16:44:27 +01:00
gTasks [ anotherTaskId ] . data [ 2 ] = 1 ;
gTasks [ anotherTaskId ] . data [ 3 ] = 6 ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + = 2 ;
2018-11-11 16:44:27 +01:00
}
break ;
case 1 :
if ( gTasks [ taskId ] . data [ 2 ] = = 0 )
{
anotherTaskId = CreateTask ( sub_819D324 , 0 ) ;
gTasks [ taskId ] . data [ 4 ] = 0 ;
gTasks [ anotherTaskId ] . data [ 1 ] = taskId ;
2020-12-28 23:32:08 +01:00
gTasks [ anotherTaskId ] . tState = 1 ;
2018-11-11 16:44:27 +01:00
gTasks [ anotherTaskId ] . data [ 2 ] = 1 ;
gTasks [ anotherTaskId ] . data [ 3 ] = 6 ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
}
else
{
gTasks [ taskId ] . data [ 2 ] - - ;
}
break ;
case 2 :
if ( gTasks [ taskId ] . data [ 3 ] = = 1 & & gTasks [ taskId ] . data [ 4 ] = = 1 )
{
2020-08-31 19:36:48 +02:00
gPlttBufferFaded [ 226 ] = sPokeballGray_Pal [ 37 ] ;
2018-11-11 16:44:27 +01:00
Swap_PrintActionStrings ( ) ;
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SWAP_WIN_5 ) ;
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
}
break ;
case 3 :
2020-12-28 23:32:08 +01:00
BeginNormalPaletteFade ( 0x4000 , 0 , 16 , 0 , sPokeballGray_Pal [ 37 ] ) ;
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 4 :
if ( ! gPaletteFade . active )
{
Swap_PrintOneActionString ( 0 ) ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
}
break ;
case 5 :
Swap_PrintOneActionString ( 1 ) ;
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SWAP_WIN_OPTIONS ) ;
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 6 :
2020-12-28 23:32:08 +01:00
FillWindowPixelBuffer ( SWAP_WIN_5 , PIXEL_FILL ( 0 ) ) ;
CopyWindowToVram ( SWAP_WIN_5 , 2 ) ;
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 7 :
if ( ! sFactorySwapScreen - > inEnemyScreen )
Swap_PrintOnInfoWindow ( gText_SelectPkmnToSwap ) ;
else
Swap_PrintOnInfoWindow ( gText_SelectPkmnToAccept ) ;
2020-08-31 19:36:48 +02:00
if ( sFactorySwapScreen - > cursorPos < FRONTIER_PARTY_SIZE )
2018-11-11 16:44:27 +01:00
gSprites [ sFactorySwapScreen - > cursorSpriteId ] . invisible = FALSE ;
Swap_PrintMonCategory ( ) ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 8 :
Swap_PrintMonSpecies3 ( ) ;
sub_819EADC ( ) ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > fadeSpeciesNameActive = TRUE ;
gTasks [ taskId ] . tState = gTasks [ taskId ] . tFollowUpTaskState ;
hiPtr = gTasks [ taskId ] . tFollowUpTaskPtrHi ;
loPtr = gTasks [ taskId ] . tFollowUpTaskPtrLo ;
gTasks [ taskId ] . func = ( void * ) ( ( hiPtr < < 16 ) | ( loPtr ) ) ;
2018-11-11 16:44:27 +01:00
break ;
}
}
static void sub_819D9EC ( u8 taskId )
{
u8 i ;
2020-12-28 23:32:08 +01:00
if ( sFactorySwapScreen - > monPicAnimating = = TRUE )
2018-11-11 16:44:27 +01:00
return ;
2020-12-28 23:32:08 +01:00
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
case 0 :
Swap_PrintMonSpecies3 ( ) ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 1 :
sub_819EADC ( ) ;
gSprites [ sFactorySwapScreen - > cursorSpriteId ] . invisible = TRUE ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 2 :
CreateTask ( sub_819D12C , 0 ) ;
2020-12-28 23:32:08 +01:00
gTasks [ sFactorySwapScreen - > fadeSpeciesNameTaskId ] . func = Swap_Task_FadeSpeciesName2 ;
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 3 :
if ( ! FuncIsActiveTask ( sub_819D12C ) & & gTasks [ sFactorySwapScreen - > fadeSpeciesNameTaskId ] . data [ 4 ] = = 1 )
{
sub_819EAC0 ( ) ;
if ( ! sFactorySwapScreen - > inEnemyScreen )
{
2020-12-28 23:32:08 +01:00
Swap_InitActions ( SWAP_ENEMY_SCREEN ) ;
2018-11-11 16:44:27 +01:00
}
else
{
2020-12-28 23:32:08 +01:00
Swap_InitActions ( SWAP_PLAYER_SCREEN ) ;
// Hide "Pkmn for Swap" button
for ( i = 0 ; i < ARRAY_COUNT ( sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 0 ] ) ; i + + )
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 1 ] [ i ] ] . invisible = TRUE ;
2018-11-11 16:44:27 +01:00
}
gSprites [ sFactorySwapScreen - > cursorSpriteId ] . pos1 . x = gSprites [ sFactorySwapScreen - > ballSpriteIds [ sFactorySwapScreen - > cursorPos ] ] . pos1 . x ;
2020-12-28 23:32:08 +01:00
gTasks [ sFactorySwapScreen - > fadeSpeciesNameTaskId ] . func = Swap_Task_FadeSpeciesName ;
sFactorySwapScreen - > fadeSpeciesNameCoeffDelay = 0 ;
sFactorySwapScreen - > fadeSpeciesNameCoeff = 6 ;
sFactorySwapScreen - > fadeSpeciesNameFadeOut = FALSE ;
gTasks [ sFactorySwapScreen - > fadeSpeciesNameTaskId ] . tState = 1 ;
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
}
break ;
case 4 :
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = 0 ;
gTasks [ taskId ] . tFollowUpTaskPtrHi = ( u32 ) ( Swap_Task_HandleChooseMons ) > > 16 ;
gTasks [ taskId ] . tFollowUpTaskPtrLo = ( u32 ) ( Swap_Task_HandleChooseMons ) ;
gTasks [ taskId ] . tFollowUpTaskState = 1 ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . func = sub_819D770 ;
break ;
}
}
static void Swap_InitStruct ( void )
{
if ( sFactorySwapScreen = = NULL )
{
sFactorySwapScreen = AllocZeroed ( sizeof ( * sFactorySwapScreen ) ) ;
sFactorySwapScreen - > cursorPos = 0 ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > monPicAnimating = FALSE ;
2018-11-11 16:44:27 +01:00
sFactorySwapScreen - > fromSummaryScreen = FALSE ;
}
}
void DoBattleFactorySwapScreen ( void )
{
sFactorySwapScreen = NULL ;
SetMainCallback2 ( CB2_InitSwapScreen ) ;
}
static void CB2_InitSwapScreen ( void )
{
u8 taskId ;
switch ( gMain . state )
{
case 0 :
SetHBlankCallback ( NULL ) ;
SetVBlankCallback ( NULL ) ;
CpuFill32 ( 0 , ( void * ) VRAM , VRAM_SIZE ) ;
ResetBgsAndClearDma3BusyFlags ( 0 ) ;
InitBgsFromTemplates ( 0 , sSwap_BgTemplates , ARRAY_COUNT ( sSwap_BgTemplates ) ) ;
InitWindows ( sSwap_WindowTemplates ) ;
DeactivateAllTextPrinters ( ) ;
gMain . state + + ;
break ;
case 1 :
sSwapMenuTilesetBuffer = Alloc ( 0x440 ) ;
2020-08-31 19:36:48 +02:00
sSwapMonPicBgTilesetBuffer = AllocZeroed ( 0x440 ) ;
sSwapMenuTilemapBuffer = Alloc ( BG_SCREEN_SIZE ) ;
sSwapMonPicBgTilemapBuffer = AllocZeroed ( BG_SCREEN_SIZE ) ;
2018-11-11 16:44:27 +01:00
ChangeBgX ( 0 , 0 , 0 ) ;
ChangeBgY ( 0 , 0 , 0 ) ;
ChangeBgX ( 1 , 0 , 0 ) ;
ChangeBgY ( 1 , 0 , 0 ) ;
ChangeBgX ( 2 , 0 , 0 ) ;
ChangeBgY ( 2 , 0 , 0 ) ;
ChangeBgX ( 3 , 0 , 0 ) ;
ChangeBgY ( 3 , 0 , 0 ) ;
SetGpuReg ( REG_OFFSET_BLDY , 0 ) ;
SetGpuReg ( REG_OFFSET_MOSAIC , 0 ) ;
SetGpuReg ( REG_OFFSET_WIN0H , 0 ) ;
SetGpuReg ( REG_OFFSET_WIN0V , 0 ) ;
SetGpuReg ( REG_OFFSET_WIN1H , 0 ) ;
SetGpuReg ( REG_OFFSET_WIN1V , 0 ) ;
SetGpuReg ( REG_OFFSET_WININ , 0 ) ;
SetGpuReg ( REG_OFFSET_WINOUT , 0 ) ;
gMain . state + + ;
break ;
case 2 :
ResetPaletteFade ( ) ;
ResetSpriteData ( ) ;
ResetTasks ( ) ;
FreeAllSpritePalettes ( ) ;
ResetAllPicSprites ( ) ;
CpuCopy16 ( gFrontierFactorySelectMenu_Gfx , sSwapMenuTilesetBuffer , 0x440 ) ;
2020-08-31 19:36:48 +02:00
CpuCopy16 ( sMonPicBg_Gfx , sSwapMonPicBgTilesetBuffer , 0x60 ) ;
2018-11-11 16:44:27 +01:00
LoadBgTiles ( 1 , sSwapMenuTilesetBuffer , 0x440 , 0 ) ;
2020-08-31 19:36:48 +02:00
LoadBgTiles ( 3 , sSwapMonPicBgTilesetBuffer , 0x60 , 0 ) ;
CpuCopy16 ( gFrontierFactorySelectMenu_Tilemap , sSwapMenuTilemapBuffer , BG_SCREEN_SIZE ) ;
LoadBgTilemap ( 1 , sSwapMenuTilemapBuffer , BG_SCREEN_SIZE , 0 ) ;
2018-11-11 16:44:27 +01:00
LoadPalette ( gFrontierFactorySelectMenu_Pal , 0 , 0x40 ) ;
2020-08-31 19:36:48 +02:00
LoadPalette ( sSwapText_Pal , 0xF0 , sizeof ( sSwapText_Pal ) ) ;
LoadPalette ( sSwapText_Pal , 0xE0 , sizeof ( sSwapText_Pal ) ) ;
LoadPalette ( sMonPicBg_Pal , 0x20 , 4 ) ;
2018-11-11 16:44:27 +01:00
gMain . state + + ;
break ;
case 3 :
2020-08-31 19:36:48 +02:00
SetBgTilemapBuffer ( 3 , sSwapMonPicBgTilemapBuffer ) ;
CopyToBgTilemapBufferRect ( 3 , sMonPicBg_Tilemap , 11 , 4 , 8 , 8 ) ;
2018-11-11 16:44:27 +01:00
CopyBgTilemapBufferToVram ( 3 ) ;
gMain . state + + ;
break ;
case 4 :
2020-08-31 19:36:48 +02:00
LoadSpritePalettes ( sSwap_SpritePalettes ) ;
LoadSpriteSheets ( sSwap_SpriteSheets ) ;
LoadCompressedSpriteSheet ( sSwap_BallGfx ) ;
2018-11-11 16:44:27 +01:00
SetVBlankCallback ( Swap_VblankCb ) ;
gMain . state + + ;
break ;
case 5 :
if ( sFactorySwapScreen - > fromSummaryScreen = = TRUE )
2019-02-19 10:09:42 +01:00
sFactorySwapScreen - > cursorPos = gLastViewedMonIndex ;
2018-11-11 16:44:27 +01:00
gMain . state + + ;
break ;
case 6 :
Swap_InitStruct ( ) ;
Swap_InitAllSprites ( ) ;
if ( sFactorySwapScreen - > fromSummaryScreen = = TRUE )
Swap_ShowSummaryMonSprite ( ) ;
2020-12-28 23:32:08 +01:00
Swap_InitActions ( SWAP_PLAYER_SCREEN ) ;
2018-11-11 16:44:27 +01:00
gMain . state + + ;
break ;
case 7 :
Swap_PrintOnInfoWindow ( gText_SelectPkmnToSwap ) ;
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SWAP_WIN_INFO ) ;
2018-11-11 16:44:27 +01:00
gMain . state + + ;
break ;
case 8 :
Swap_PrintMonCategory ( ) ;
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SWAP_WIN_MON_CATEGORY ) ;
2018-11-11 16:44:27 +01:00
gMain . state + + ;
break ;
case 9 :
if ( ! sFactorySwapScreen - > fromSummaryScreen )
Swap_PrintMonSpecies ( ) ;
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SWAP_WIN_SPECIES ) ;
2018-11-11 16:44:27 +01:00
gMain . state + + ;
break ;
case 10 :
Swap_PrintPkmnSwap ( ) ;
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SWAP_WIN_TITLE ) ;
2018-11-11 16:44:27 +01:00
gMain . state + + ;
break ;
case 11 :
gMain . state + + ;
break ;
case 12 :
if ( sFactorySwapScreen - > fromSummaryScreen )
Swap_PrintMonSpecies2 ( ) ;
gMain . state + + ;
break ;
case 13 :
Swap_PrintActionStrings2 ( ) ;
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SWAP_WIN_OPTIONS ) ;
2018-11-11 16:44:27 +01:00
gMain . state + + ;
break ;
case 14 :
2020-12-28 23:32:08 +01:00
BeginNormalPaletteFade ( 0xFFFFFFFF , 0 , 16 , 0 , RGB_BLACK ) ;
2018-11-11 16:44:27 +01:00
SetGpuReg ( REG_OFFSET_DISPCNT , DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP ) ;
ShowBg ( 0 ) ;
ShowBg ( 1 ) ;
ShowBg ( 2 ) ;
if ( sFactorySwapScreen - > fromSummaryScreen = = TRUE )
{
ShowBg ( 3 ) ;
SetGpuReg ( REG_OFFSET_BLDCNT , BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ ) ;
SetGpuReg ( REG_OFFSET_BLDALPHA , BLDALPHA_BLEND ( 11 , 4 ) ) ;
}
else
{
HideBg ( 3 ) ;
}
gMain . state + + ;
break ;
case 15 :
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > fadeSpeciesNameTaskId = CreateTask ( Swap_Task_FadeSpeciesName , 0 ) ;
2018-11-11 16:44:27 +01:00
if ( ! sFactorySwapScreen - > fromSummaryScreen )
{
2020-12-28 23:32:08 +01:00
gTasks [ sFactorySwapScreen - > fadeSpeciesNameTaskId ] . tState = 0 ;
taskId = CreateTask ( Swap_Task_HandleChooseMons , 0 ) ;
gTasks [ taskId ] . tState = 0 ;
2018-11-11 16:44:27 +01:00
}
else
{
sub_819EAF8 ( ) ;
2020-12-28 23:32:08 +01:00
gTasks [ sFactorySwapScreen - > fadeSpeciesNameTaskId ] . tState = 1 ;
sFactorySwapScreen - > fadeSpeciesNameActive = FALSE ;
taskId = CreateTask ( Swap_Task_HandleMenu , 0 ) ;
gTasks [ taskId ] . tState = 2 ;
2018-11-11 16:44:27 +01:00
}
SetMainCallback2 ( Swap_CB2 ) ;
break ;
}
}
static void Swap_InitAllSprites ( void )
{
u8 i ;
u8 x ;
struct SpriteTemplate spriteTemplate ;
2020-08-31 19:36:48 +02:00
spriteTemplate = sSpriteTemplate_Swap_Pokeball ;
spriteTemplate . paletteTag = PALTAG_BALL_SELECTED ;
2018-11-11 16:44:27 +01:00
2020-08-31 19:36:48 +02:00
for ( i = 0 ; i < FRONTIER_PARTY_SIZE ; i + + )
2018-11-11 16:44:27 +01:00
{
sFactorySwapScreen - > ballSpriteIds [ i ] = CreateSprite ( & spriteTemplate , ( 48 * i ) + 72 , 64 , 1 ) ;
gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] . data [ 0 ] = 0 ;
}
2020-08-31 19:36:48 +02:00
sFactorySwapScreen - > cursorSpriteId = CreateSprite ( & sSpriteTemplate_Swap_Arrow , gSprites [ sFactorySwapScreen - > ballSpriteIds [ sFactorySwapScreen - > cursorPos ] ] . pos1 . x , 88 , 0 ) ;
sFactorySwapScreen - > menuCursor1SpriteId = CreateSprite ( & sSpriteTemplate_Swap_MenuHighlightLeft , 176 , 112 , 0 ) ;
sFactorySwapScreen - > menuCursor2SpriteId = CreateSprite ( & sSpriteTemplate_Swap_MenuHighlightRight , 176 , 144 , 0 ) ;
2018-11-11 16:44:27 +01:00
gSprites [ sFactorySwapScreen - > menuCursor1SpriteId ] . invisible = TRUE ;
gSprites [ sFactorySwapScreen - > menuCursor2SpriteId ] . invisible = TRUE ;
gSprites [ sFactorySwapScreen - > menuCursor1SpriteId ] . centerToCornerVecX = 0 ;
gSprites [ sFactorySwapScreen - > menuCursor1SpriteId ] . centerToCornerVecY = 0 ;
gSprites [ sFactorySwapScreen - > menuCursor2SpriteId ] . centerToCornerVecX = 0 ;
gSprites [ sFactorySwapScreen - > menuCursor2SpriteId ] . centerToCornerVecY = 0 ;
if ( sFactorySwapScreen - > fromSummaryScreen = = TRUE )
2020-12-28 23:32:08 +01:00
x = DISPLAY_WIDTH ;
2018-11-11 16:44:27 +01:00
else
2020-12-28 23:32:08 +01:00
x = DISPLAY_WIDTH - 48 ;
2018-11-11 16:44:27 +01:00
2020-08-31 19:36:48 +02:00
// Unusual way to create sprites
// The sprite template for the selector arrow is re-used
// with the tiles swapped out
spriteTemplate = sSpriteTemplate_Swap_Arrow ;
spriteTemplate . tileTag = GFXTAG_ACTION_BOX_LEFT ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 0 ] [ 0 ] = CreateSprite ( & spriteTemplate , DISPLAY_WIDTH , 120 , 10 ) ;
2018-11-11 16:44:27 +01:00
2020-08-31 19:36:48 +02:00
spriteTemplate = sSpriteTemplate_Swap_MenuHighlightLeft ;
spriteTemplate . tileTag = GFXTAG_ACTION_BOX_RIGHT ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 0 ] [ 1 ] = CreateSprite ( & spriteTemplate , DISPLAY_WIDTH + 16 , 120 , 10 ) ;
sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 0 ] [ 2 ] = CreateSprite ( & spriteTemplate , DISPLAY_WIDTH + 48 , 120 , 10 ) ;
2018-11-11 16:44:27 +01:00
2020-08-31 19:36:48 +02:00
spriteTemplate = sSpriteTemplate_Swap_Arrow ;
spriteTemplate . tileTag = GFXTAG_ACTION_HIGHLIGHT_LEFT ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 1 ] [ 0 ] = CreateSprite ( & spriteTemplate , DISPLAY_WIDTH , 120 , 1 ) ;
2018-11-11 16:44:27 +01:00
2020-08-31 19:36:48 +02:00
spriteTemplate = sSpriteTemplate_Swap_MenuHighlightLeft ;
spriteTemplate . tileTag = GFXTAG_ACTION_HIGHLIGHT_MIDDLE ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 1 ] [ 1 ] = CreateSprite ( & spriteTemplate , DISPLAY_WIDTH + 16 , 120 , 1 ) ;
2020-08-31 19:36:48 +02:00
spriteTemplate . tileTag = GFXTAG_ACTION_HIGHLIGHT_RIGHT ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 1 ] [ 2 ] = CreateSprite ( & spriteTemplate , DISPLAY_WIDTH + 48 , 120 , 1 ) ;
2018-11-11 16:44:27 +01:00
2020-08-31 19:36:48 +02:00
spriteTemplate = sSpriteTemplate_Swap_Arrow ;
spriteTemplate . tileTag = GFXTAG_ACTION_BOX_LEFT ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > cancelButtonSpriteIds [ 0 ] [ 0 ] = CreateSprite ( & spriteTemplate , x , 144 , 10 ) ;
2018-11-11 16:44:27 +01:00
2020-08-31 19:36:48 +02:00
spriteTemplate = sSpriteTemplate_Swap_MenuHighlightLeft ;
spriteTemplate . tileTag = GFXTAG_ACTION_BOX_RIGHT ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > cancelButtonSpriteIds [ 0 ] [ 1 ] = CreateSprite ( & spriteTemplate , x + 16 , 144 , 10 ) ;
2018-11-11 16:44:27 +01:00
2020-08-31 19:36:48 +02:00
spriteTemplate = sSpriteTemplate_Swap_Arrow ;
spriteTemplate . tileTag = GFXTAG_ACTION_HIGHLIGHT_LEFT ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > cancelButtonSpriteIds [ 1 ] [ 0 ] = CreateSprite ( & spriteTemplate , x , 144 , 1 ) ;
2018-11-11 16:44:27 +01:00
2020-08-31 19:36:48 +02:00
spriteTemplate = sSpriteTemplate_Swap_MenuHighlightLeft ;
spriteTemplate . tileTag = GFXTAG_ACTION_HIGHLIGHT_RIGHT ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > cancelButtonSpriteIds [ 1 ] [ 1 ] = CreateSprite ( & spriteTemplate , x + 16 , 144 , 1 ) ;
2018-11-11 16:44:27 +01:00
for ( i = 0 ; i < 2 ; i + + )
{
2020-12-28 23:32:08 +01:00
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ i ] [ 0 ] ] . centerToCornerVecX = 0 ;
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ i ] [ 0 ] ] . centerToCornerVecY = 0 ;
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ i ] [ 1 ] ] . centerToCornerVecX = 0 ;
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ i ] [ 1 ] ] . centerToCornerVecY = 0 ;
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ i ] [ 2 ] ] . centerToCornerVecX = 0 ;
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ i ] [ 2 ] ] . centerToCornerVecY = 0 ;
gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ i ] [ 0 ] ] . centerToCornerVecX = 0 ;
gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ i ] [ 0 ] ] . centerToCornerVecY = 0 ;
gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ i ] [ 1 ] ] . centerToCornerVecX = 0 ;
gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ i ] [ 1 ] ] . centerToCornerVecY = 0 ;
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ i ] [ 0 ] ] . invisible = TRUE ;
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ i ] [ 1 ] ] . invisible = TRUE ;
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ i ] [ 2 ] ] . invisible = TRUE ;
gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ i ] [ 0 ] ] . invisible = TRUE ;
gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ i ] [ 1 ] ] . invisible = TRUE ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ 0 ] [ 0 ] ] . invisible = FALSE ;
gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ 0 ] [ 1 ] ] . invisible = FALSE ;
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 0 ] [ 0 ] ] . invisible = FALSE ;
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 0 ] [ 1 ] ] . invisible = FALSE ;
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 0 ] [ 2 ] ] . invisible = FALSE ;
2018-11-11 16:44:27 +01:00
}
static void Swap_DestroyAllSprites ( void )
{
u8 i , j ;
2020-08-31 19:36:48 +02:00
for ( i = 0 ; i < FRONTIER_PARTY_SIZE ; i + + )
2018-11-11 16:44:27 +01:00
DestroySprite ( & gSprites [ sFactorySwapScreen - > ballSpriteIds [ i ] ] ) ;
DestroySprite ( & gSprites [ sFactorySwapScreen - > cursorSpriteId ] ) ;
DestroySprite ( & gSprites [ sFactorySwapScreen - > menuCursor1SpriteId ] ) ;
DestroySprite ( & gSprites [ sFactorySwapScreen - > menuCursor2SpriteId ] ) ;
2020-12-28 23:32:08 +01:00
for ( i = 0 ; i < ARRAY_COUNT ( sFactorySwapScreen - > pkmnForSwapButtonSpriteIds ) ; i + + )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
for ( j = 0 ; j < ARRAY_COUNT ( sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 0 ] ) ; j + + )
DestroySprite ( & gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ i ] [ j ] ] ) ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
for ( i = 0 ; i < ARRAY_COUNT ( sFactorySwapScreen - > cancelButtonSpriteIds ) ; i + + )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
for ( j = 0 ; j < ARRAY_COUNT ( sFactorySwapScreen - > cancelButtonSpriteIds [ 0 ] ) ; j + + )
DestroySprite ( & gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ i ] [ j ] ] ) ;
2018-11-11 16:44:27 +01:00
}
}
static void Swap_HandleActionCursorChange ( u8 cursorId )
{
2020-08-31 19:36:48 +02:00
if ( cursorId < FRONTIER_PARTY_SIZE )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
// Cursor is on one of the pokemon
2018-11-11 16:44:27 +01:00
gSprites [ sFactorySwapScreen - > cursorSpriteId ] . invisible = FALSE ;
2020-12-28 23:32:08 +01:00
Swap_HideActionButtonHighlights ( ) ;
2018-11-11 16:44:27 +01:00
gSprites [ sFactorySwapScreen - > cursorSpriteId ] . pos1 . x = gSprites [ sFactorySwapScreen - > ballSpriteIds [ cursorId ] ] . pos1 . x ;
}
else
{
2020-12-28 23:32:08 +01:00
// Cursor is on an action button
2018-11-11 16:44:27 +01:00
gSprites [ sFactorySwapScreen - > cursorSpriteId ] . invisible = TRUE ;
2020-12-28 23:32:08 +01:00
Swap_HighlightActionButton ( sFactorySwapScreen - > actionsData [ cursorId ] . id ) ;
2018-11-11 16:44:27 +01:00
}
}
static void Swap_UpdateBallCursorPosition ( s8 direction )
{
u8 cursorPos ;
PlaySE ( SE_SELECT ) ;
if ( direction > 0 ) // Move cursor right.
{
if ( sFactorySwapScreen - > cursorPos + 1 ! = sFactorySwapScreen - > actionsCount )
sFactorySwapScreen - > cursorPos + + ;
else
sFactorySwapScreen - > cursorPos = 0 ;
}
else // Move cursor left.
{
if ( sFactorySwapScreen - > cursorPos ! = 0 )
sFactorySwapScreen - > cursorPos - - ;
else
sFactorySwapScreen - > cursorPos = sFactorySwapScreen - > actionsCount - 1 ;
}
cursorPos = sFactorySwapScreen - > cursorPos ;
Swap_HandleActionCursorChange ( cursorPos ) ;
}
static void Swap_UpdateActionCursorPosition ( s8 direction )
{
u8 cursorPos ;
PlaySE ( SE_SELECT ) ;
if ( direction > 0 ) // Move cursor down.
{
2020-08-31 19:36:48 +02:00
if ( sFactorySwapScreen - > cursorPos < FRONTIER_PARTY_SIZE )
sFactorySwapScreen - > cursorPos = FRONTIER_PARTY_SIZE ;
2018-11-11 16:44:27 +01:00
else if ( sFactorySwapScreen - > cursorPos + 1 ! = sFactorySwapScreen - > actionsCount )
sFactorySwapScreen - > cursorPos + + ;
else
sFactorySwapScreen - > cursorPos = 0 ;
}
else // Move cursor up.
{
2020-08-31 19:36:48 +02:00
if ( sFactorySwapScreen - > cursorPos < FRONTIER_PARTY_SIZE )
2018-11-11 16:44:27 +01:00
sFactorySwapScreen - > cursorPos = sFactorySwapScreen - > actionsCount - 1 ;
else if ( sFactorySwapScreen - > cursorPos ! = 0 )
sFactorySwapScreen - > cursorPos - - ;
else
sFactorySwapScreen - > cursorPos = sFactorySwapScreen - > actionsCount - 1 ;
}
cursorPos = sFactorySwapScreen - > cursorPos ;
Swap_HandleActionCursorChange ( cursorPos ) ;
}
static void Swap_UpdateYesNoCursorPosition ( s8 direction )
{
if ( direction > 0 ) // Move cursor down.
{
if ( sFactorySwapScreen - > yesNoCursorPos ! = 1 )
sFactorySwapScreen - > yesNoCursorPos + + ;
else
sFactorySwapScreen - > yesNoCursorPos = 0 ;
}
else // Move cursor up.
{
if ( sFactorySwapScreen - > yesNoCursorPos ! = 0 )
sFactorySwapScreen - > yesNoCursorPos - - ;
else
sFactorySwapScreen - > yesNoCursorPos = 1 ;
}
gSprites [ sFactorySwapScreen - > menuCursor1SpriteId ] . pos1 . y = ( sFactorySwapScreen - > yesNoCursorPos * 16 ) + 112 ;
gSprites [ sFactorySwapScreen - > menuCursor2SpriteId ] . pos1 . y = ( sFactorySwapScreen - > yesNoCursorPos * 16 ) + 112 ;
}
static void Swap_UpdateMenuCursorPosition ( s8 direction )
{
PlaySE ( SE_SELECT ) ;
if ( direction > 0 ) // Move cursor down.
{
2020-12-28 23:32:08 +01:00
if ( sFactorySwapScreen - > menuCursorPos ! = ARRAY_COUNT ( sSwap_MenuOptionFuncs ) - 1 )
2018-11-11 16:44:27 +01:00
sFactorySwapScreen - > menuCursorPos + + ;
else
sFactorySwapScreen - > menuCursorPos = 0 ;
}
else // Move cursor up.
{
if ( sFactorySwapScreen - > menuCursorPos ! = 0 )
sFactorySwapScreen - > menuCursorPos - - ;
else
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > menuCursorPos = ARRAY_COUNT ( sSwap_MenuOptionFuncs ) - 1 ;
2018-11-11 16:44:27 +01:00
}
gSprites [ sFactorySwapScreen - > menuCursor1SpriteId ] . pos1 . y = ( sFactorySwapScreen - > menuCursorPos * 16 ) + 112 ;
gSprites [ sFactorySwapScreen - > menuCursor2SpriteId ] . pos1 . y = ( sFactorySwapScreen - > menuCursorPos * 16 ) + 112 ;
}
2020-12-28 23:32:08 +01:00
static void Swap_HighlightActionButton ( u8 actionId )
2018-11-11 16:44:27 +01:00
{
u8 i ;
2020-12-28 23:32:08 +01:00
for ( i = 0 ; i < ARRAY_COUNT ( sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 0 ] ) ; i + + )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
if ( actionId = = SWAPACTION_PKMN_FOR_SWAP )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
// Show button highlight on "Pkmn for Swap"
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 1 ] [ i ] ] . invisible = FALSE ;
// Hide button highlight on Cancel
if ( i < ARRAY_COUNT ( sFactorySwapScreen - > cancelButtonSpriteIds [ 0 ] ) )
gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ 1 ] [ i ] ] . invisible = TRUE ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
else if ( actionId = = SWAPACTION_CANCEL )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
// Show button highlight on Cancel
if ( i < ARRAY_COUNT ( sFactorySwapScreen - > cancelButtonSpriteIds [ 0 ] ) )
gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ 1 ] [ i ] ] . invisible = FALSE ;
// Hide button highlight on "Pkmn for Swap"
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 1 ] [ i ] ] . invisible = TRUE ;
2018-11-11 16:44:27 +01:00
}
}
}
2020-12-28 23:32:08 +01:00
static void Swap_HideActionButtonHighlights ( void )
2018-11-11 16:44:27 +01:00
{
u8 i ;
2020-12-28 23:32:08 +01:00
for ( i = 0 ; i < ARRAY_COUNT ( sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 0 ] ) ; i + + )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
// Hide button highlight on "Pkmn for Swap"
gSprites [ sFactorySwapScreen - > pkmnForSwapButtonSpriteIds [ 1 ] [ i ] ] . invisible = TRUE ;
// Hide button highlight on Cancel
if ( i < ARRAY_COUNT ( sFactorySwapScreen - > cancelButtonSpriteIds [ 0 ] ) )
gSprites [ sFactorySwapScreen - > cancelButtonSpriteIds [ 1 ] [ i ] ] . invisible = TRUE ;
2018-11-11 16:44:27 +01:00
}
}
static void Swap_ShowMenuOptions ( void )
{
if ( sFactorySwapScreen - > fromSummaryScreen = = TRUE )
sFactorySwapScreen - > fromSummaryScreen = FALSE ;
else
sFactorySwapScreen - > menuCursorPos = 0 ;
gSprites [ sFactorySwapScreen - > menuCursor1SpriteId ] . pos1 . x = 176 ;
gSprites [ sFactorySwapScreen - > menuCursor1SpriteId ] . pos1 . y = ( sFactorySwapScreen - > menuCursorPos * 16 ) + 112 ;
gSprites [ sFactorySwapScreen - > menuCursor2SpriteId ] . pos1 . x = 208 ;
gSprites [ sFactorySwapScreen - > menuCursor2SpriteId ] . pos1 . y = ( sFactorySwapScreen - > menuCursorPos * 16 ) + 112 ;
gSprites [ sFactorySwapScreen - > menuCursor1SpriteId ] . invisible = FALSE ;
gSprites [ sFactorySwapScreen - > menuCursor2SpriteId ] . invisible = FALSE ;
Swap_PrintMenuOptions ( ) ;
}
static void Swap_ShowYesNoOptions ( void )
{
sFactorySwapScreen - > yesNoCursorPos = 0 ;
gSprites [ sFactorySwapScreen - > menuCursor1SpriteId ] . pos1 . x = 176 ;
gSprites [ sFactorySwapScreen - > menuCursor1SpriteId ] . pos1 . y = 112 ;
gSprites [ sFactorySwapScreen - > menuCursor2SpriteId ] . pos1 . x = 208 ;
gSprites [ sFactorySwapScreen - > menuCursor2SpriteId ] . pos1 . y = 112 ;
gSprites [ sFactorySwapScreen - > menuCursor1SpriteId ] . invisible = FALSE ;
gSprites [ sFactorySwapScreen - > menuCursor2SpriteId ] . invisible = FALSE ;
Swap_PrintYesNoOptions ( ) ;
}
2020-12-28 23:32:08 +01:00
static void Swap_ErasePopupMenu ( u8 windowId )
2018-11-11 16:44:27 +01:00
{
gSprites [ sFactorySwapScreen - > menuCursor1SpriteId ] . invisible = TRUE ;
gSprites [ sFactorySwapScreen - > menuCursor2SpriteId ] . invisible = TRUE ;
2019-03-02 23:25:39 +01:00
FillWindowPixelBuffer ( windowId , PIXEL_FILL ( 0 ) ) ;
2018-11-11 16:44:27 +01:00
CopyWindowToVram ( windowId , 2 ) ;
ClearWindowTilemap ( windowId ) ;
}
static void sub_819EAC0 ( void )
{
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SWAP_WIN_SPECIES ) ;
FillWindowPixelBuffer ( SWAP_WIN_SPECIES , PIXEL_FILL ( 0 ) ) ;
CopyWindowToVram ( SWAP_WIN_SPECIES , 2 ) ;
2018-11-11 16:44:27 +01:00
}
static void sub_819EADC ( void )
{
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SWAP_WIN_7 ) ;
FillWindowPixelBuffer ( SWAP_WIN_7 , PIXEL_FILL ( 0 ) ) ;
CopyWindowToVram ( SWAP_WIN_7 , 2 ) ;
2018-11-11 16:44:27 +01:00
}
static void sub_819EAF8 ( void )
{
sub_819EAC0 ( ) ;
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SWAP_WIN_5 ) ;
FillWindowPixelBuffer ( SWAP_WIN_5 , PIXEL_FILL ( 0 ) ) ;
CopyWindowToVram ( SWAP_WIN_5 , 2 ) ;
2018-11-11 16:44:27 +01:00
}
static void Swap_PrintPkmnSwap ( void )
{
2020-12-28 23:32:08 +01:00
FillWindowPixelBuffer ( SWAP_WIN_TITLE , PIXEL_FILL ( 1 ) ) ;
AddTextPrinterParameterized ( SWAP_WIN_TITLE , 1 , gText_PkmnSwap , 2 , 1 , 0 , NULL ) ;
CopyWindowToVram ( SWAP_WIN_TITLE , 3 ) ;
2018-11-11 16:44:27 +01:00
}
static void Swap_PrintMonSpecies ( void )
{
u16 species ;
u8 x ;
2020-12-28 23:32:08 +01:00
FillWindowPixelBuffer ( SWAP_WIN_SPECIES , PIXEL_FILL ( 0 ) ) ;
2020-08-31 19:36:48 +02:00
if ( sFactorySwapScreen - > cursorPos > = FRONTIER_PARTY_SIZE )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
CopyWindowToVram ( SWAP_WIN_SPECIES , 2 ) ;
2018-11-11 16:44:27 +01:00
}
else
{
u8 monId = sFactorySwapScreen - > cursorPos ;
if ( ! sFactorySwapScreen - > inEnemyScreen )
species = GetMonData ( & gPlayerParty [ monId ] , MON_DATA_SPECIES , NULL ) ;
else
species = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPECIES , NULL ) ;
StringCopy ( gStringVar4 , gSpeciesNames [ species ] ) ;
x = GetStringRightAlignXOffset ( 1 , gStringVar4 , 86 ) ;
2020-12-28 23:32:08 +01:00
AddTextPrinterParameterized3 ( SWAP_WIN_SPECIES , 1 , x , 1 , sSwapSpeciesNameTextColors , 0 , gStringVar4 ) ;
CopyWindowToVram ( SWAP_WIN_SPECIES , 3 ) ;
2018-11-11 16:44:27 +01:00
}
}
static void Swap_PrintOnInfoWindow ( const u8 * str )
{
2020-12-28 23:32:08 +01:00
FillWindowPixelBuffer ( SWAP_WIN_INFO , PIXEL_FILL ( 0 ) ) ;
AddTextPrinterParameterized ( SWAP_WIN_INFO , 1 , str , 2 , 5 , 0 , NULL ) ;
CopyWindowToVram ( SWAP_WIN_INFO , 2 ) ;
2018-11-11 16:44:27 +01:00
}
static void Swap_PrintMenuOptions ( void )
{
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SWAP_WIN_OPTIONS ) ;
FillWindowPixelBuffer ( SWAP_WIN_OPTIONS , PIXEL_FILL ( 0 ) ) ;
AddTextPrinterParameterized3 ( SWAP_WIN_OPTIONS , 1 , 15 , 1 , sSwapMenuOptionsTextColors , 0 , gText_Summary2 ) ;
AddTextPrinterParameterized3 ( SWAP_WIN_OPTIONS , 1 , 15 , 17 , sSwapMenuOptionsTextColors , 0 , gText_Swap ) ;
AddTextPrinterParameterized3 ( SWAP_WIN_OPTIONS , 1 , 15 , 33 , sSwapMenuOptionsTextColors , 0 , gText_Rechoose ) ;
CopyWindowToVram ( SWAP_WIN_OPTIONS , 3 ) ;
2018-11-11 16:44:27 +01:00
}
static void Swap_PrintYesNoOptions ( void )
{
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SWAP_WIN_YES_NO ) ;
FillWindowPixelBuffer ( SWAP_WIN_YES_NO , PIXEL_FILL ( 0 ) ) ;
AddTextPrinterParameterized3 ( SWAP_WIN_YES_NO , 1 , 7 , 1 , sSwapMenuOptionsTextColors , 0 , gText_Yes3 ) ;
AddTextPrinterParameterized3 ( SWAP_WIN_YES_NO , 1 , 7 , 17 , sSwapMenuOptionsTextColors , 0 , gText_No3 ) ;
CopyWindowToVram ( SWAP_WIN_YES_NO , 3 ) ;
2018-11-11 16:44:27 +01:00
}
static void Swap_PrintActionString ( const u8 * str , u32 y , u32 windowId )
{
s32 x = GetStringRightAlignXOffset ( 0 , str , 0x46 ) ;
2019-12-10 19:48:20 +01:00
AddTextPrinterParameterized3 ( windowId , 0 , x , y , sSwapMenuOptionsTextColors , 0 , str ) ;
2018-11-11 16:44:27 +01:00
}
static void Swap_PrintActionStrings ( void )
{
2020-12-28 23:32:08 +01:00
FillWindowPixelBuffer ( SWAP_WIN_5 , PIXEL_FILL ( 0 ) ) ;
2018-11-11 16:44:27 +01:00
switch ( sFactorySwapScreen - > inEnemyScreen )
{
case TRUE :
2020-12-28 23:32:08 +01:00
Swap_PrintActionString ( gText_PkmnForSwap , 0 , SWAP_WIN_5 ) ;
2018-11-11 16:44:27 +01:00
case FALSE :
2020-12-28 23:32:08 +01:00
Swap_PrintActionString ( gText_Cancel3 , 24 , SWAP_WIN_5 ) ;
2018-11-11 16:44:27 +01:00
break ;
}
2020-12-28 23:32:08 +01:00
CopyWindowToVram ( SWAP_WIN_5 , 3 ) ;
2018-11-11 16:44:27 +01:00
}
static void Swap_PrintActionStrings2 ( void )
{
2020-12-28 23:32:08 +01:00
FillWindowPixelBuffer ( SWAP_WIN_OPTIONS , PIXEL_FILL ( 0 ) ) ;
2018-11-11 16:44:27 +01:00
switch ( sFactorySwapScreen - > inEnemyScreen )
{
case TRUE :
2020-12-28 23:32:08 +01:00
Swap_PrintActionString ( gText_PkmnForSwap , 8 , SWAP_WIN_OPTIONS ) ;
2018-11-11 16:44:27 +01:00
case FALSE :
2020-12-28 23:32:08 +01:00
Swap_PrintActionString ( gText_Cancel3 , 32 , SWAP_WIN_OPTIONS ) ;
2018-11-11 16:44:27 +01:00
break ;
}
2020-12-28 23:32:08 +01:00
CopyWindowToVram ( SWAP_WIN_OPTIONS , 3 ) ;
2018-11-11 16:44:27 +01:00
}
static void Swap_PrintOneActionString ( u8 which )
{
switch ( which )
{
case 0 :
if ( sFactorySwapScreen - > inEnemyScreen = = TRUE )
2020-12-28 23:32:08 +01:00
Swap_PrintActionString ( gText_PkmnForSwap , 8 , SWAP_WIN_OPTIONS ) ;
2018-11-11 16:44:27 +01:00
break ;
case 1 :
2020-12-28 23:32:08 +01:00
Swap_PrintActionString ( gText_Cancel3 , 32 , SWAP_WIN_OPTIONS ) ;
2018-11-11 16:44:27 +01:00
break ;
}
2020-12-28 23:32:08 +01:00
CopyWindowToVram ( SWAP_WIN_OPTIONS , 3 ) ;
2018-11-11 16:44:27 +01:00
}
static void Swap_PrintMonSpecies2 ( void )
{
u16 species ;
u8 x ;
u16 pal [ 5 ] ;
2020-08-31 19:36:48 +02:00
CpuCopy16 ( sSwapText_Pal , pal , 8 ) ;
2018-11-11 16:44:27 +01:00
if ( ! sFactorySwapScreen - > fromSummaryScreen )
pal [ 4 ] = gPlttBufferFaded [ 228 ] ;
else
2020-12-28 23:32:08 +01:00
pal [ 4 ] = sFactorySwapScreen - > speciesNameColorBackup ;
2020-08-31 19:36:48 +02:00
LoadPalette ( pal , 0xF0 , sizeof ( sSwapText_Pal ) ) ;
2018-11-11 16:44:27 +01:00
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SWAP_WIN_7 ) ;
FillWindowPixelBuffer ( SWAP_WIN_7 , PIXEL_FILL ( 0 ) ) ;
2020-08-31 19:36:48 +02:00
if ( sFactorySwapScreen - > cursorPos > = FRONTIER_PARTY_SIZE )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
CopyWindowToVram ( SWAP_WIN_7 , 3 ) ;
2018-11-11 16:44:27 +01:00
}
else
{
u8 monId = sFactorySwapScreen - > cursorPos ;
if ( ! sFactorySwapScreen - > inEnemyScreen )
species = GetMonData ( & gPlayerParty [ monId ] , MON_DATA_SPECIES , NULL ) ;
else
species = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPECIES , NULL ) ;
StringCopy ( gStringVar4 , gSpeciesNames [ species ] ) ;
x = GetStringRightAlignXOffset ( 1 , gStringVar4 , 86 ) ;
2020-12-28 23:32:08 +01:00
AddTextPrinterParameterized3 ( SWAP_WIN_7 , 1 , x , 1 , sSwapSpeciesNameTextColors , 0 , gStringVar4 ) ;
CopyWindowToVram ( SWAP_WIN_7 , 3 ) ;
2018-11-11 16:44:27 +01:00
}
}
static void Swap_PrintMonSpecies3 ( void )
{
u16 species ;
u8 x ;
2020-08-31 19:36:48 +02:00
LoadPalette ( sSwapText_Pal , 0xE0 , sizeof ( sSwapText_Pal ) ) ;
2020-12-28 23:32:08 +01:00
CpuCopy16 ( & gPlttBufferUnfaded [ 240 ] , & gPlttBufferFaded [ 224 ] , 10 ) ;
2018-11-11 16:44:27 +01:00
2020-08-31 19:36:48 +02:00
if ( sFactorySwapScreen - > cursorPos > = FRONTIER_PARTY_SIZE )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
CopyWindowToVram ( SWAP_WIN_SPECIES , 2 ) ;
2018-11-11 16:44:27 +01:00
}
else
{
u8 monId = sFactorySwapScreen - > cursorPos ;
if ( ! sFactorySwapScreen - > inEnemyScreen )
species = GetMonData ( & gPlayerParty [ monId ] , MON_DATA_SPECIES , NULL ) ;
else
species = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPECIES , NULL ) ;
StringCopy ( gStringVar4 , gSpeciesNames [ species ] ) ;
x = GetStringRightAlignXOffset ( 1 , gStringVar4 , 86 ) ;
2020-12-28 23:32:08 +01:00
AddTextPrinterParameterized3 ( SWAP_WIN_SPECIES , 1 , x , 1 , sSwapSpeciesNameTextColors , 0 , gStringVar4 ) ;
CopyWindowToVram ( SWAP_WIN_SPECIES , 3 ) ;
2018-11-11 16:44:27 +01:00
}
}
static void Swap_PrintMonCategory ( void )
{
u16 species ;
u8 text [ 30 ] ;
u8 x ;
u8 monId = sFactorySwapScreen - > cursorPos ;
2020-12-28 23:32:08 +01:00
FillWindowPixelBuffer ( SWAP_WIN_MON_CATEGORY , PIXEL_FILL ( 0 ) ) ;
2020-08-31 19:36:48 +02:00
if ( monId > = FRONTIER_PARTY_SIZE )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
CopyWindowToVram ( SWAP_WIN_MON_CATEGORY , 2 ) ;
2018-11-11 16:44:27 +01:00
}
else
{
2020-12-28 23:32:08 +01:00
PutWindowTilemap ( SWAP_WIN_MON_CATEGORY ) ;
2018-11-11 16:44:27 +01:00
if ( ! sFactorySwapScreen - > inEnemyScreen )
species = GetMonData ( & gPlayerParty [ monId ] , MON_DATA_SPECIES , NULL ) ;
else
species = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPECIES , NULL ) ;
CopyMonCategoryText ( SpeciesToNationalPokedexNum ( species ) , text ) ;
x = GetStringRightAlignXOffset ( 1 , text , 0x76 ) ;
2020-12-28 23:32:08 +01:00
AddTextPrinterParameterized ( SWAP_WIN_MON_CATEGORY , 1 , text , x , 1 , 0 , NULL ) ;
CopyWindowToVram ( SWAP_WIN_MON_CATEGORY , 2 ) ;
2018-11-11 16:44:27 +01:00
}
}
static void Swap_InitActions ( u8 id )
{
if ( sFactorySwapScreen - > fromSummaryScreen ! = TRUE )
{
switch ( id )
{
2020-12-28 23:32:08 +01:00
case SWAP_PLAYER_SCREEN :
2018-11-11 16:44:27 +01:00
sFactorySwapScreen - > inEnemyScreen = FALSE ;
sFactorySwapScreen - > cursorPos = 0 ;
sFactorySwapScreen - > actionsCount = ARRAY_COUNT ( sSwap_PlayerScreenActions ) ;
sFactorySwapScreen - > actionsData = sSwap_PlayerScreenActions ;
break ;
2020-12-28 23:32:08 +01:00
case SWAP_ENEMY_SCREEN :
2018-11-11 16:44:27 +01:00
sFactorySwapScreen - > inEnemyScreen = TRUE ;
sFactorySwapScreen - > cursorPos = 0 ;
sFactorySwapScreen - > actionsCount = ARRAY_COUNT ( sSwap_EnemyScreenActions ) ;
sFactorySwapScreen - > actionsData = sSwap_EnemyScreenActions ;
break ;
}
}
}
static void Swap_RunMenuOptionFunc ( u8 taskId )
{
2020-08-31 19:36:48 +02:00
sSwap_CurrentOptionFunc = sSwap_MenuOptionFuncs [ sFactorySwapScreen - > menuCursorPos ] ;
sSwap_CurrentOptionFunc ( taskId ) ;
2018-11-11 16:44:27 +01:00
}
2020-08-31 19:36:48 +02:00
static void Swap_OptionSwap ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
CloseMonPic ( sFactorySwapScreen - > monPic , & sFactorySwapScreen - > monPicAnimating , TRUE ) ;
2018-11-11 16:44:27 +01:00
sFactorySwapScreen - > playerMonId = sFactorySwapScreen - > cursorPos ;
2020-12-28 23:32:08 +01:00
Swap_ErasePopupMenu ( SWAP_WIN_OPTIONS ) ;
gTasks [ taskId ] . tState = 0 ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . func = sub_819D9EC ;
}
2020-08-31 19:36:48 +02:00
static void Swap_OptionSummary ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = 6 ;
gTasks [ taskId ] . func = Swap_Task_OpenSummaryScreen ;
2018-11-11 16:44:27 +01:00
}
2020-08-31 19:36:48 +02:00
static void Swap_OptionRechoose ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
CloseMonPic ( sFactorySwapScreen - > monPic , & sFactorySwapScreen - > monPicAnimating , TRUE ) ;
Swap_ErasePopupMenu ( SWAP_WIN_OPTIONS ) ;
gTasks [ taskId ] . tState = 0 ;
gTasks [ taskId ] . tFollowUpTaskPtrHi = ( u32 ) ( Swap_Task_HandleChooseMons ) > > 16 ;
gTasks [ taskId ] . tFollowUpTaskPtrLo = ( u32 ) ( Swap_Task_HandleChooseMons ) ;
gTasks [ taskId ] . tFollowUpTaskState = 1 ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . func = sub_819D770 ;
}
static void Swap_RunActionFunc ( u8 taskId )
{
2020-08-31 19:36:48 +02:00
sSwap_CurrentOptionFunc = sFactorySwapScreen - > actionsData [ sFactorySwapScreen - > cursorPos ] . func ;
sSwap_CurrentOptionFunc ( taskId ) ;
2018-11-11 16:44:27 +01:00
}
static void Swap_ActionCancel ( u8 taskId )
{
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tFollowUpTaskPtrHi = ( u32 ) ( Swap_AskQuitSwapping ) > > 16 ;
gTasks [ taskId ] . tFollowUpTaskPtrLo = ( u32 ) ( Swap_AskQuitSwapping ) ;
gTasks [ taskId ] . tState = 0 ;
gTasks [ taskId ] . tFollowUpTaskState = 0 ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . func = sub_819D588 ;
}
static void Swap_ActionPkmnForSwap ( u8 taskId )
{
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tFollowUpTaskPtrHi = ( u32 ) ( sub_819D9EC ) > > 16 ;
gTasks [ taskId ] . tFollowUpTaskPtrLo = ( u32 ) ( sub_819D9EC ) ;
gTasks [ taskId ] . tFollowUpTaskState = 0 ;
gTasks [ taskId ] . tState = 0 ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . func = sub_819D588 ;
}
static void Swap_ActionMon ( u8 taskId )
{
if ( ! sFactorySwapScreen - > inEnemyScreen )
{
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tFollowUpTaskPtrHi = ( u32 ) ( Swap_Task_HandleMenu ) > > 16 ;
gTasks [ taskId ] . tFollowUpTaskPtrLo = ( u32 ) ( Swap_Task_HandleMenu ) ;
gTasks [ taskId ] . tFollowUpTaskState = 2 ;
2018-11-11 16:44:27 +01:00
}
else if ( Swap_AlreadyHasSameSpecies ( sFactorySwapScreen - > cursorPos ) = = TRUE )
{
2020-12-28 23:32:08 +01:00
OpenMonPic ( & sFactorySwapScreen - > monPic . bgSpriteId , & sFactorySwapScreen - > monPicAnimating , TRUE ) ;
gTasks [ taskId ] . tState = 0 ;
gTasks [ taskId ] . tFollowUpTaskState = 1 ;
gTasks [ taskId ] . func = Swap_TaskCantHaveSameMons ;
2018-11-11 16:44:27 +01:00
return ;
}
else
{
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tFollowUpTaskPtrHi = ( u32 ) ( Swap_AskAcceptMon ) > > 16 ;
gTasks [ taskId ] . tFollowUpTaskPtrLo = ( u32 ) ( Swap_AskAcceptMon ) ;
gTasks [ taskId ] . tFollowUpTaskState = 0 ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState = 0 ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . func = sub_819D588 ;
}
2020-12-28 23:32:08 +01:00
# define sIsSwapScreen data[7]
static void OpenMonPic ( u8 * spriteId , bool8 * animating , bool8 swapScreen )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
* spriteId = CreateSprite ( & sSpriteTemplate_Swap_MonPicBgAnim , 120 , 64 , 1 ) ;
gSprites [ * spriteId ] . callback = SpriteCB_OpenMonPic ;
gSprites [ * spriteId ] . sIsSwapScreen = swapScreen ;
* animating = TRUE ;
2018-11-11 16:44:27 +01:00
}
static void Swap_ShowSummaryMonSprite ( void )
{
struct Pokemon * mon ;
u16 species ;
u32 personality , otId ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > monPic . bgSpriteId = CreateSprite ( & sSpriteTemplate_Swap_MonPicBgAnim , 120 , 64 , 1 ) ;
StartSpriteAffineAnim ( & gSprites [ sFactorySwapScreen - > monPic . bgSpriteId ] , 2 ) ;
2018-11-11 16:44:27 +01:00
mon = & gPlayerParty [ sFactorySwapScreen - > cursorPos ] ;
species = GetMonData ( mon , MON_DATA_SPECIES , NULL ) ;
personality = GetMonData ( mon , MON_DATA_PERSONALITY , NULL ) ;
otId = GetMonData ( mon , MON_DATA_OT_ID , NULL ) ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > monPic . monSpriteId = CreateMonPicSprite_HandleDeoxys ( species , personality , otId , TRUE , 88 , 32 , 15 , 0xFFFF ) ; // BUG: otId and personality should be switched.
gSprites [ sFactorySwapScreen - > monPic . monSpriteId ] . centerToCornerVecX = 0 ;
gSprites [ sFactorySwapScreen - > monPic . monSpriteId ] . centerToCornerVecY = 0 ;
2018-11-11 16:44:27 +01:00
2020-12-28 23:32:08 +01:00
gSprites [ sFactorySwapScreen - > monPic . bgSpriteId ] . invisible = TRUE ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
static void CloseMonPic ( struct FactoryMonPic pic , bool8 * animating , bool8 swapScreen )
2018-11-11 16:44:27 +01:00
{
u8 taskId ;
2020-12-28 23:32:08 +01:00
FreeAndDestroyMonPicSprite ( pic . monSpriteId ) ;
2020-09-03 07:19:08 +02:00
taskId = CreateTask ( Task_CloseMonPic , 1 ) ;
gTasks [ taskId ] . tIsSwapScreen = swapScreen ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tSpriteId = pic . bgSpriteId ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . func ( taskId ) ;
2020-12-28 23:32:08 +01:00
* animating = TRUE ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
static void HideMonPic ( struct FactoryMonPic pic , bool8 * animating )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
FreeAndDestroyMonPicSprite ( pic . monSpriteId ) ;
FreeOamMatrix ( gSprites [ pic . bgSpriteId ] . oam . matrixNum ) ;
DestroySprite ( & gSprites [ pic . bgSpriteId ] ) ;
* animating = FALSE ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
static void Swap_TaskCantHaveSameMons ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
if ( sFactorySwapScreen - > monPicAnimating = = TRUE )
2018-11-11 16:44:27 +01:00
return ;
2020-12-28 23:32:08 +01:00
switch ( gTasks [ taskId ] . tState )
2018-11-11 16:44:27 +01:00
{
case 0 :
Swap_PrintOnInfoWindow ( gText_SamePkmnInPartyAlready ) ;
sFactorySwapScreen - > monSwapped = FALSE ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 1 :
2020-12-28 23:32:08 +01:00
if ( JOY_NEW ( A_BUTTON ) | | JOY_NEW ( B_BUTTON ) )
2018-11-11 16:44:27 +01:00
{
PlaySE ( SE_SELECT ) ;
2020-12-28 23:32:08 +01:00
CloseMonPic ( sFactorySwapScreen - > monPic , & sFactorySwapScreen - > monPicAnimating , TRUE ) ;
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
}
break ;
case 2 :
2020-12-28 23:32:08 +01:00
if ( sFactorySwapScreen - > monPicAnimating ! = TRUE )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
FillWindowPixelBuffer ( SWAP_WIN_5 , PIXEL_FILL ( 0 ) ) ;
CopyWindowToVram ( SWAP_WIN_5 , 2 ) ;
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
}
break ;
case 3 :
Swap_PrintOnInfoWindow ( gText_SelectPkmnToAccept ) ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 4 :
Swap_PrintMonSpecies3 ( ) ;
sub_819EADC ( ) ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > fadeSpeciesNameActive = TRUE ;
gTasks [ taskId ] . tState = gTasks [ taskId ] . tFollowUpTaskState ;
gTasks [ taskId ] . func = Swap_Task_HandleChooseMons ;
2018-11-11 16:44:27 +01:00
break ;
}
}
static bool8 Swap_AlreadyHasSameSpecies ( u8 monId )
{
u8 i ;
u16 species = GetMonData ( & gEnemyParty [ monId ] , MON_DATA_SPECIES , NULL ) ;
2020-08-31 19:36:48 +02:00
for ( i = 0 ; i < FRONTIER_PARTY_SIZE ; i + + )
2018-11-11 16:44:27 +01:00
{
if ( i ! = sFactorySwapScreen - > playerMonId & & ( u16 ) ( GetMonData ( & gPlayerParty [ i ] , MON_DATA_SPECIES , NULL ) ) = = species )
return TRUE ;
}
return FALSE ;
}
2020-09-03 07:19:08 +02:00
static void SpriteCB_OpenMonPic ( struct Sprite * sprite )
2018-11-11 16:44:27 +01:00
{
u8 taskId ;
if ( sprite - > affineAnimEnded )
{
sprite - > invisible = TRUE ;
2020-09-03 07:19:08 +02:00
taskId = CreateTask ( Task_OpenMonPic , 1 ) ;
2020-12-28 23:32:08 +01:00
gTasks [ taskId ] . tIsSwapScreen = sprite - > sIsSwapScreen ;
2018-11-11 16:44:27 +01:00
gTasks [ taskId ] . func ( taskId ) ;
sprite - > callback = SpriteCallbackDummy ;
}
}
2020-12-30 23:35:33 +01:00
static void SpriteCB_CloseMonPic ( struct Sprite * sprite )
2018-11-11 16:44:27 +01:00
{
if ( sprite - > affineAnimEnded )
{
FreeOamMatrix ( sprite - > oam . matrixNum ) ;
2020-12-28 23:32:08 +01:00
if ( sprite - > sIsSwapScreen = = TRUE )
sFactorySwapScreen - > monPicAnimating = FALSE ;
2018-11-11 16:44:27 +01:00
else
2020-12-28 23:32:08 +01:00
Select_SetMonPicAnimating ( FALSE ) ;
2018-11-11 16:44:27 +01:00
DestroySprite ( sprite ) ;
}
}
2020-09-03 07:19:08 +02:00
static void Task_OpenMonPic ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
struct Task * task = & gTasks [ taskId ] ;
2020-12-28 23:32:08 +01:00
switch ( task - > tState )
2018-11-11 16:44:27 +01:00
{
case 0 :
2020-12-30 23:35:33 +01:00
// Init
2020-09-03 07:19:08 +02:00
task - > tWinLeft = 88 ;
2020-12-28 23:32:08 +01:00
task - > tWinRight = DISPLAY_WIDTH - 88 ;
task - > tWinTop = 64 ;
task - > tWinBottom = 65 ;
2018-11-11 16:44:27 +01:00
SetGpuRegBits ( REG_OFFSET_DISPCNT , DISPCNT_WIN0_ON ) ;
2020-09-03 07:19:08 +02:00
SetGpuReg ( REG_OFFSET_WIN0H , WIN_RANGE ( task - > tWinLeft , task - > tWinRight ) ) ;
2020-12-28 23:32:08 +01:00
SetGpuReg ( REG_OFFSET_WIN0V , WIN_RANGE ( task - > tWinTop , task - > tWinBottom ) ) ;
2018-11-11 16:44:27 +01:00
SetGpuReg ( REG_OFFSET_WININ , WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ ) ;
SetGpuReg ( REG_OFFSET_WINOUT , WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ ) ;
break ;
case 1 :
2020-12-30 23:35:33 +01:00
// Show mon pic bg
2018-11-11 16:44:27 +01:00
ShowBg ( 3 ) ;
SetGpuReg ( REG_OFFSET_BLDCNT , BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ ) ;
SetGpuReg ( REG_OFFSET_BLDALPHA , BLDALPHA_BLEND ( 11 , 4 ) ) ;
break ;
case 2 :
2020-12-30 23:35:33 +01:00
// Animate mon pic bg
2020-12-28 23:32:08 +01:00
task - > tWinTop - = 4 ;
task - > tWinBottom + = 4 ;
if ( task - > tWinTop < = 32 | | task - > tWinBottom > = 96 )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
task - > tWinTop = 32 ;
task - > tWinBottom = 96 ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
SetGpuReg ( REG_OFFSET_WIN0V , WIN_RANGE ( task - > tWinTop , task - > tWinBottom ) ) ;
if ( task - > tWinTop ! = 32 )
2018-11-11 16:44:27 +01:00
return ;
break ;
default :
DestroyTask ( taskId ) ;
// UB: Should not use the task after it has been deleted.
2020-09-03 07:19:08 +02:00
if ( gTasks [ taskId ] . tIsSwapScreen = = TRUE )
Swap_CreateMonSprite ( ) ;
2018-11-11 16:44:27 +01:00
else
2020-12-28 23:32:08 +01:00
Select_CreateMonSprite ( ) ;
2018-11-11 16:44:27 +01:00
return ;
}
2020-12-28 23:32:08 +01:00
task - > tState + + ;
2018-11-11 16:44:27 +01:00
}
2020-09-03 07:19:08 +02:00
static void Task_CloseMonPic ( u8 taskId )
2018-11-11 16:44:27 +01:00
{
struct Task * task = & gTasks [ taskId ] ;
2020-09-03 07:19:08 +02:00
switch ( task - > tState )
2018-11-11 16:44:27 +01:00
{
case 0 :
2020-12-30 23:35:33 +01:00
// Init
2020-09-03 07:19:08 +02:00
task - > tWinLeft = 88 ;
2020-12-28 23:32:08 +01:00
task - > tWinRight = DISPLAY_WIDTH - 88 ;
task - > tWinTop = 32 ;
task - > tWinBottom = 96 ;
2018-11-11 16:44:27 +01:00
SetGpuRegBits ( REG_OFFSET_DISPCNT , DISPCNT_WIN0_ON ) ;
2020-09-03 07:19:08 +02:00
SetGpuReg ( REG_OFFSET_WIN0H , WIN_RANGE ( task - > tWinLeft , task - > tWinRight ) ) ;
2020-12-28 23:32:08 +01:00
SetGpuReg ( REG_OFFSET_WIN0V , WIN_RANGE ( task - > tWinTop , task - > tWinBottom ) ) ;
2018-11-11 16:44:27 +01:00
SetGpuReg ( REG_OFFSET_WININ , WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ ) ;
SetGpuReg ( REG_OFFSET_WINOUT , WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ ) ;
2020-12-28 23:32:08 +01:00
task - > tState + + ;
2018-11-11 16:44:27 +01:00
break ;
case 1 :
2020-12-30 23:35:33 +01:00
// Animate bg
2020-12-28 23:32:08 +01:00
task - > tWinTop + = 4 ;
task - > tWinBottom - = 4 ;
if ( task - > tWinTop > = 64 | | task - > tWinBottom < = 65 )
2018-11-11 16:44:27 +01:00
{
2020-12-28 23:32:08 +01:00
task - > tWinTop = 64 ;
task - > tWinBottom = 65 ;
2018-11-11 16:44:27 +01:00
}
2020-12-28 23:32:08 +01:00
SetGpuReg ( REG_OFFSET_WIN0V , WIN_RANGE ( task - > tWinTop , task - > tWinBottom ) ) ;
if ( task - > tWinTop = = 64 )
task - > tState + + ;
2018-11-11 16:44:27 +01:00
break ;
2020-12-30 23:35:33 +01:00
default :
// Hide bg
HideBg ( 3 ) ;
gSprites [ task - > tSpriteId ] . sIsSwapScreen = task - > tIsSwapScreen ;
gSprites [ task - > tSpriteId ] . invisible = FALSE ;
gSprites [ task - > tSpriteId ] . callback = SpriteCB_CloseMonPic ;
StartSpriteAffineAnim ( & gSprites [ task - > tSpriteId ] , 1 ) ;
ClearGpuRegBits ( REG_OFFSET_DISPCNT , DISPCNT_WIN0_ON ) ;
DestroyTask ( taskId ) ;
break ;
2018-11-11 16:44:27 +01:00
}
}
2020-09-03 07:19:08 +02:00
static void Swap_CreateMonSprite ( void )
2018-11-11 16:44:27 +01:00
{
struct Pokemon * mon ;
u16 species ;
u32 personality , otId ;
if ( ! sFactorySwapScreen - > inEnemyScreen )
mon = & gPlayerParty [ sFactorySwapScreen - > cursorPos ] ;
else
mon = & gEnemyParty [ sFactorySwapScreen - > cursorPos ] ;
species = GetMonData ( mon , MON_DATA_SPECIES , NULL ) ;
personality = GetMonData ( mon , MON_DATA_PERSONALITY , NULL ) ;
otId = GetMonData ( mon , MON_DATA_OT_ID , NULL ) ;
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > monPic . monSpriteId = CreateMonPicSprite_HandleDeoxys ( species , otId , personality , TRUE , 88 , 32 , 15 , 0xFFFF ) ;
gSprites [ sFactorySwapScreen - > monPic . monSpriteId ] . centerToCornerVecX = 0 ;
gSprites [ sFactorySwapScreen - > monPic . monSpriteId ] . centerToCornerVecY = 0 ;
2018-11-11 16:44:27 +01:00
2020-12-28 23:32:08 +01:00
sFactorySwapScreen - > monPicAnimating = FALSE ;
2018-11-11 16:44:27 +01:00
}