2771 lines
76 KiB
C
2771 lines
76 KiB
C
#include "global.h"
|
|
#include "gflib.h"
|
|
#include "data.h"
|
|
#include "decompress.h"
|
|
#include "dynamic_placeholder_text_util.h"
|
|
#include "event_data.h"
|
|
#include "graphics.h"
|
|
#include "help_system.h"
|
|
#include "item.h"
|
|
#include "item_menu.h"
|
|
#include "mail_data.h"
|
|
#include "menu.h"
|
|
#include "naming_screen.h"
|
|
#include "new_menu_helpers.h"
|
|
#include "pc_screen_effect.h"
|
|
#include "pokemon_icon.h"
|
|
#include "pokemon_storage_system_internal.h"
|
|
#include "pokemon_summary_screen.h"
|
|
#include "quest_log.h"
|
|
#include "strings.h"
|
|
#include "task.h"
|
|
#include "text_window.h"
|
|
#include "tilemap_util.h"
|
|
#include "trig.h"
|
|
#include "constants/items.h"
|
|
#include "constants/help_system.h"
|
|
#include "constants/songs.h"
|
|
|
|
EWRAM_DATA struct PokemonStorageSystemData *gStorage = NULL;
|
|
static EWRAM_DATA bool8 sInPartyMenu = 0;
|
|
static EWRAM_DATA u8 sCurrentBoxOption = 0;
|
|
static EWRAM_DATA u8 sDepositBoxId = 0;
|
|
static EWRAM_DATA u8 sWhichToReshow = 0;
|
|
static EWRAM_DATA u8 sLastUsedBox = 0;
|
|
static EWRAM_DATA u16 sMovingItemId = ITEM_NONE;
|
|
|
|
static void Task_InitPokeStorage(u8 taskId);
|
|
static void Task_ShowPokeStorage(u8 taskId);
|
|
static void Task_ReshowPokeStorage(u8 taskId);
|
|
static void Task_PokeStorageMain(u8 taskId);
|
|
static void Task_ShowPartyPokemon(u8 taskId);
|
|
static void Task_HidePartyPokemon(u8 taskId);
|
|
static void Task_OnSelectedMon(u8 taskId);
|
|
static void Task_MoveMon(u8 taskId);
|
|
static void Task_PlaceMon(u8 taskId);
|
|
static void Task_ShiftMon(u8 taskId);
|
|
static void Task_WithdrawMon(u8 taskId);
|
|
static void Task_DepositMenu(u8 taskId);
|
|
static void Task_ReleaseMon(u8 taskId);
|
|
static void Task_ShowMarkMenu(u8 taskId);
|
|
static void Task_TakeItemForMoving(u8 taskId);
|
|
static void Task_GiveMovingItemToMon(u8 taskId);
|
|
static void Task_ItemToBag(u8 taskId);
|
|
static void Task_SwitchSelectedItem(u8 taskId);
|
|
static void Task_ShowItemInfo(u8 taskId);
|
|
static void Task_HandleMovingMonFromParty(u8 taskId);
|
|
static void Task_PrintCantStoreMail(u8 taskId);
|
|
static void Task_HandleBoxOptions(u8 taskId);
|
|
static void Task_HandleWallpapers(u8 taskId);
|
|
static void Task_JumpBox(u8 taskId);
|
|
static void Task_NameBox(u8 taskId);
|
|
static void Task_ShowMonSummary(u8 taskId);
|
|
static void Task_GiveItemFromBag(u8 taskId);
|
|
static void Task_OnCloseBoxPressed(u8 taskId);
|
|
static void Task_OnBPressed(u8 taskId);
|
|
static void Task_ChangeScreen(u8 taskId);
|
|
static void GiveChosenBagItem(void);
|
|
static void FreePokeStorageData(void);
|
|
static void SetScrollingBackground(void);
|
|
static void ScrollBackground(void);
|
|
static void LoadPokeStorageMenuGfx(void);
|
|
static bool8 InitPokeStorageWindows(void);
|
|
static void LoadsMiscSpritePalette(void);
|
|
static void InitPalettesAndSprites(void);
|
|
static void CreateMarkingComboSprite(void);
|
|
static void CreateWaveformSprites(void);
|
|
static void RefreshDisplayMonData(void);
|
|
static void StartDisplayMonMosaic(void);
|
|
static void SpriteCB_DisplayMonMosaic(struct Sprite *sprite);
|
|
static bool8 IsDisplayMonMosaicActive(void);
|
|
static void CreateDisplayMonSprite(void);
|
|
static void LoadDisplayMonGfx(u16 species, u32 personality);
|
|
static void PrintDisplayMonInfo(void);
|
|
static void UpdateWaveformAnimation(void);
|
|
static void InitSupplementalTilemaps(void);
|
|
static void SetUpHidePartyMenu(void);
|
|
static bool8 HidePartyMenu(void);
|
|
static void UpdateCloseBoxButtonTilemap(bool8 normal);
|
|
static void StartFlashingCloseBoxButton(void);
|
|
static void StopFlashingCloseBoxButton(void);
|
|
static void UpdateCloseBoxButtonFlash(void);
|
|
static void SetPartySlotTilemaps(void);
|
|
static void SetPartySlotTilemap(u8 pos, bool8 isPartyMon);
|
|
static void UpdatePartySlotColors(void);
|
|
static void SetUpDoShowPartyMenu(void);
|
|
static bool8 DoShowPartyMenu(void);
|
|
static void InitPokeStorageBg0(void);
|
|
static void PrintStorageMessage(u8 textId);
|
|
static void ShowYesNoWindow(s8 cursorPos);
|
|
static void ClearBottomWindow(void);
|
|
static void AddWallpaperSetsMenu(void);
|
|
static void AddWallpapersMenu(u8 wallpaperSet);
|
|
static void InitCursorItemIcon(void);
|
|
static void SetPokeStorageQuestLogEvent(u8 species);
|
|
static void UpdateBoxToSendMons(void);
|
|
|
|
enum {
|
|
TILEMAP_PKMN_DATA, // The "Pkmn Data" text at the top of the display
|
|
TILEMAP_PARTY_MENU,
|
|
TILEMAP_CLOSE_BUTTON,
|
|
TILEMAP_COUNT
|
|
};
|
|
|
|
enum
|
|
{
|
|
SCREEN_CHANGE_EXIT_BOX,
|
|
SCREEN_CHANGE_SUMMARY_SCREEN,
|
|
SCREEN_CHANGE_NAME_BOX,
|
|
SCREEN_CHANGE_ITEM_FROM_BAG,
|
|
};
|
|
|
|
enum
|
|
{
|
|
MSG_EXIT_BOX,
|
|
MSG_WHAT_YOU_DO,
|
|
MSG_PICK_A_THEME,
|
|
MSG_PICK_A_WALLPAPER,
|
|
MSG_IS_SELECTED,
|
|
MSG_JUMP_TO_WHICH_BOX,
|
|
MSG_DEPOSIT_IN_WHICH_BOX,
|
|
MSG_WAS_DEPOSITED,
|
|
MSG_BOX_IS_FULL,
|
|
MSG_RELEASE_POKE,
|
|
MSG_WAS_RELEASED,
|
|
MSG_BYE_BYE,
|
|
MSG_MARK_POKE,
|
|
MSG_LAST_POKE,
|
|
MSG_PARTY_FULL,
|
|
MSG_HOLDING_POKE,
|
|
MSG_WHICH_ONE_WILL_TAKE,
|
|
MSG_CANT_RELEASE_EGG,
|
|
MSG_CONTINUE_BOX,
|
|
MSG_CAME_BACK,
|
|
MSG_WORRIED,
|
|
MSG_SURPRISE,
|
|
MSG_PLEASE_REMOVE_MAIL,
|
|
MSG_IS_SELECTED2,
|
|
MSG_GIVE_TO_MON,
|
|
MSG_PLACED_IN_BAG,
|
|
MSG_BAG_FULL,
|
|
MSG_PUT_IN_BAG,
|
|
MSG_ITEM_IS_HELD,
|
|
MSG_CHANGED_TO_ITEM,
|
|
MSG_CANT_STORE_MAIL,
|
|
};
|
|
|
|
enum
|
|
{
|
|
MSG_FMT_NONE,
|
|
MSG_FMT_MON_NAME_1,
|
|
MSG_FMT_MON_NAME_2,
|
|
MSG_FMT_MON_NAME_3,
|
|
MSG_FMT_RELEASE_MON_1,
|
|
MSG_FMT_RELEASE_MON_2,
|
|
MSG_FMT_RELEASE_MON_3,
|
|
MSG_FMT_ITEM_NAME,
|
|
};
|
|
|
|
static const u32 sScrollingBg_Gfx[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.4bpp.lz");
|
|
static const u32 sScrollingBg_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.bin.lz");
|
|
|
|
// Unused
|
|
static const u16 sMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/menu.gbapal");
|
|
|
|
static const u32 sMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/menu.bin.lz");
|
|
static const u16 sPkmnData_Tilemap[] = INCBIN_U16("graphics/pokemon_storage/pkmn_data.bin");
|
|
static const u16 sScrollingBg_Pal[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.gbapal");
|
|
static const u16 sScrollingBgMoveItems_Pal[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg_move_items.gbapal");
|
|
static const u16 sCloseBoxButton_Tilemap[] = INCBIN_U16("graphics/pokemon_storage/close_box_button.bin");
|
|
static const u16 sPartySlotFilled_Tilemap[] = INCBIN_U16("graphics/pokemon_storage/party_slot_filled.bin");
|
|
static const u16 sPartySlotEmpty_Tilemap[] = INCBIN_U16("graphics/pokemon_storage/party_slot_empty.bin");
|
|
static const u16 sPokeStorageMisc2Pal[] = INCBIN_U16("graphics/pokemon_storage/misc2.gbapal");
|
|
static const u16 sWaveform_Gfx[] = INCBIN_U16("graphics/pokemon_storage/waveform.4bpp");
|
|
|
|
// Unused
|
|
static const u16 sUnused_Pal[] = INCBIN_U16("graphics/pokemon_storage/unused.gbapal");
|
|
|
|
static const u16 sItemInfoFrame_Pal[] = INCBIN_U16("graphics/pokemon_storage/item_info_frame.gbapal");
|
|
|
|
static const struct WindowTemplate sWindowTemplates[] = {
|
|
{
|
|
.bg = 1,
|
|
.tilemapLeft = 0,
|
|
.tilemapTop = 11,
|
|
.width = 9,
|
|
.height = 7,
|
|
.paletteNum = 3,
|
|
.baseBlock = 0x0c0
|
|
}, {
|
|
.bg = 0,
|
|
.tilemapLeft = 11,
|
|
.tilemapTop = 17,
|
|
.width = 18,
|
|
.height = 2,
|
|
.paletteNum = 13,
|
|
.baseBlock = 0x014
|
|
}, {
|
|
.bg = 0,
|
|
.tilemapLeft = 0,
|
|
.tilemapTop = 12,
|
|
.width = 25,
|
|
.height = 8,
|
|
.paletteNum = 15,
|
|
.baseBlock = 0x014
|
|
},
|
|
DUMMY_WIN_TEMPLATE
|
|
};
|
|
|
|
static const struct BgTemplate sBgTemplates[] = {
|
|
{
|
|
.bg = 0,
|
|
.charBaseIndex = 0,
|
|
.mapBaseIndex = 29,
|
|
.screenSize = 0,
|
|
.paletteMode = 0,
|
|
.priority = 0,
|
|
.baseTile = 0x000
|
|
}, {
|
|
.bg = 1,
|
|
.charBaseIndex = 1,
|
|
.mapBaseIndex = 30,
|
|
.screenSize = 0,
|
|
.paletteMode = 0,
|
|
.priority = 1,
|
|
.baseTile = 0x100
|
|
}, {
|
|
.bg = 2,
|
|
.charBaseIndex = 2,
|
|
.mapBaseIndex = 27,
|
|
.screenSize = 1,
|
|
.paletteMode = 0,
|
|
.priority = 2,
|
|
.baseTile = 0x000
|
|
}, {
|
|
.bg = 3,
|
|
.charBaseIndex = 3,
|
|
.mapBaseIndex = 31,
|
|
.screenSize = 0,
|
|
.paletteMode = 0,
|
|
.priority = 3,
|
|
.baseTile = 0x000
|
|
}
|
|
};
|
|
|
|
static const struct SpritePalette sMiscSpritePalette = {
|
|
sPokeStorageMisc2Pal, PALTAG_MISC_2
|
|
};
|
|
|
|
static const struct SpriteSheet sWaveformSpriteSheet = {
|
|
sWaveform_Gfx, 0x01C0, GFXTAG_WAVEFORM
|
|
};
|
|
|
|
static const struct OamData sOamData_DisplayMon;
|
|
|
|
static const struct SpriteTemplate sSpriteTemplate_DisplayMon = {
|
|
.tileTag = GFXTAG_DISPLAY_MON,
|
|
.paletteTag = PALTAG_DISPLAY_MON,
|
|
.oam = &sOamData_DisplayMon,
|
|
.anims = gDummySpriteAnimTable,
|
|
.images = NULL,
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
.callback = SpriteCallbackDummy
|
|
};
|
|
|
|
static const struct StorageMessage sMessages[] = {
|
|
[MSG_EXIT_BOX] = {gText_ExitFromBox, MSG_FMT_NONE},
|
|
[MSG_WHAT_YOU_DO] = {gText_WhatDoYouWantToDo, MSG_FMT_NONE},
|
|
[MSG_PICK_A_THEME] = {gText_PleasePickATheme, MSG_FMT_NONE},
|
|
[MSG_PICK_A_WALLPAPER] = {gText_PickTheWallpaper, MSG_FMT_NONE},
|
|
[MSG_IS_SELECTED] = {gText_PkmnIsSelected, MSG_FMT_MON_NAME_1},
|
|
[MSG_JUMP_TO_WHICH_BOX] = {gText_JumpToWhichBox, MSG_FMT_NONE},
|
|
[MSG_DEPOSIT_IN_WHICH_BOX] = {gText_DepositInWhichBox, MSG_FMT_NONE},
|
|
[MSG_WAS_DEPOSITED] = {gText_PkmnWasDeposited, MSG_FMT_MON_NAME_1},
|
|
[MSG_BOX_IS_FULL] = {gText_BoxIsFull2, MSG_FMT_NONE},
|
|
[MSG_RELEASE_POKE] = {gText_ReleaseThisPokemon, MSG_FMT_NONE},
|
|
[MSG_WAS_RELEASED] = {gText_PkmnWasReleased, MSG_FMT_RELEASE_MON_1},
|
|
[MSG_BYE_BYE] = {gText_ByeByePkmn, MSG_FMT_RELEASE_MON_3},
|
|
[MSG_MARK_POKE] = {gText_MarkYourPkmn, MSG_FMT_NONE},
|
|
[MSG_LAST_POKE] = {gText_ThatsYourLastPkmn, MSG_FMT_NONE},
|
|
[MSG_PARTY_FULL] = {gText_YourPartysFull, MSG_FMT_NONE},
|
|
[MSG_HOLDING_POKE] = {gText_YoureHoldingAPkmn, MSG_FMT_NONE},
|
|
[MSG_WHICH_ONE_WILL_TAKE] = {gText_WhichOneWillYouTake, MSG_FMT_NONE},
|
|
[MSG_CANT_RELEASE_EGG] = {gText_YouCantReleaseAnEgg, MSG_FMT_NONE},
|
|
[MSG_CONTINUE_BOX] = {gText_ContinueBoxOperations, MSG_FMT_NONE},
|
|
[MSG_CAME_BACK] = {gText_PkmnCameBack, MSG_FMT_MON_NAME_1},
|
|
[MSG_WORRIED] = {gText_WasItWorriedAboutYou, MSG_FMT_NONE},
|
|
[MSG_SURPRISE] = {gText_FourEllipsesExclamation, MSG_FMT_NONE},
|
|
[MSG_PLEASE_REMOVE_MAIL] = {gText_PleaseRemoveTheMail, MSG_FMT_NONE},
|
|
[MSG_IS_SELECTED2] = {gText_PkmnIsSelected, MSG_FMT_ITEM_NAME},
|
|
[MSG_GIVE_TO_MON] = {gText_GiveToAPkmn, MSG_FMT_NONE},
|
|
[MSG_PLACED_IN_BAG] = {gText_PlacedItemInBag, MSG_FMT_ITEM_NAME},
|
|
[MSG_BAG_FULL] = {gText_BagIsFull2, MSG_FMT_NONE},
|
|
[MSG_PUT_IN_BAG] = {gText_PutItemInBag, MSG_FMT_NONE},
|
|
[MSG_ITEM_IS_HELD] = {gText_ItemIsNowHeld, MSG_FMT_ITEM_NAME},
|
|
[MSG_CHANGED_TO_ITEM] = {gText_ChangedToNewItem, MSG_FMT_ITEM_NAME},
|
|
[MSG_CANT_STORE_MAIL] = {gText_MailCantBeStored, MSG_FMT_NONE},
|
|
};
|
|
|
|
static const struct WindowTemplate sYesNoWindowTemplate = {
|
|
.bg = 0,
|
|
.tilemapLeft = 24,
|
|
.tilemapTop = 11,
|
|
.width = 5,
|
|
.height = 4,
|
|
.paletteNum = 15,
|
|
.baseBlock = 0x05c
|
|
};
|
|
|
|
static const struct OamData sOamData_DisplayMon = {
|
|
.y = 0,
|
|
.affineMode = ST_OAM_AFFINE_OFF,
|
|
.objMode = ST_OAM_OBJ_NORMAL,
|
|
.mosaic = FALSE,
|
|
.bpp = ST_OAM_4BPP,
|
|
.shape = SPRITE_SHAPE(64x64),
|
|
.x = 0,
|
|
.matrixNum = 0,
|
|
.size = SPRITE_SIZE(64x64),
|
|
.tileNum = 0x000,
|
|
.priority = 0,
|
|
.paletteNum = 0
|
|
};
|
|
|
|
// Waveform
|
|
|
|
static const struct OamData sOamData_Waveform = {
|
|
.y = 0,
|
|
.affineMode = ST_OAM_AFFINE_OFF,
|
|
.objMode = ST_OAM_OBJ_NORMAL,
|
|
.mosaic = FALSE,
|
|
.bpp = ST_OAM_4BPP,
|
|
.shape = SPRITE_SHAPE(16x8),
|
|
.x = 0,
|
|
.matrixNum = 0,
|
|
.size = SPRITE_SIZE(16x8),
|
|
.tileNum = 0x000,
|
|
.priority = 0,
|
|
.paletteNum = 0
|
|
};
|
|
|
|
static const union AnimCmd sAnim_Waveform_LeftOff[] = {
|
|
ANIMCMD_FRAME(0, 5),
|
|
ANIMCMD_END
|
|
};
|
|
|
|
static const union AnimCmd sAnim_Waveform_LeftOn[] = {
|
|
ANIMCMD_FRAME(2, 8),
|
|
ANIMCMD_FRAME(4, 8),
|
|
ANIMCMD_FRAME(6, 8),
|
|
ANIMCMD_JUMP(0)
|
|
};
|
|
|
|
static const union AnimCmd sAnim_Waveform_RightOff[] = {
|
|
ANIMCMD_FRAME(8, 5),
|
|
ANIMCMD_END
|
|
};
|
|
|
|
static const union AnimCmd sAnim_Waveform_RightOn[] = {
|
|
ANIMCMD_FRAME(10, 8),
|
|
ANIMCMD_FRAME(4, 8),
|
|
ANIMCMD_FRAME(12, 8),
|
|
ANIMCMD_JUMP(0)
|
|
};
|
|
|
|
static const union AnimCmd *const sAnims_Waveform[] = {
|
|
sAnim_Waveform_LeftOff,
|
|
sAnim_Waveform_LeftOn,
|
|
sAnim_Waveform_RightOff,
|
|
sAnim_Waveform_RightOn
|
|
};
|
|
|
|
static const struct SpriteTemplate sSpriteTemplate_Waveform = {
|
|
.tileTag = GFXTAG_WAVEFORM,
|
|
.paletteTag = PALTAG_MISC_2,
|
|
.oam = &sOamData_Waveform,
|
|
.anims = sAnims_Waveform,
|
|
.images = NULL,
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
.callback = SpriteCallbackDummy,
|
|
};
|
|
|
|
static void VBlankCB_PokeStorage(void)
|
|
{
|
|
LoadOam();
|
|
ProcessSpriteCopyRequests();
|
|
UnkUtil_Run();
|
|
TransferPlttBuffer();
|
|
SetGpuReg(REG_OFFSET_BG2HOFS, gStorage->bg2_X);
|
|
}
|
|
|
|
static void CB2_PokeStorage(void)
|
|
{
|
|
RunTasks();
|
|
DoScheduledBgTilemapCopiesToVram();
|
|
ScrollBackground();
|
|
UpdateCloseBoxButtonFlash();
|
|
AnimateSprites();
|
|
BuildOamBuffer();
|
|
}
|
|
|
|
void EnterPokeStorage(u8 boxOption)
|
|
{
|
|
ResetTasks();
|
|
sCurrentBoxOption = boxOption;
|
|
gStorage = Alloc(sizeof(struct PokemonStorageSystemData));
|
|
if (gStorage == NULL)
|
|
SetMainCallback2(CB2_ExitPokeStorage);
|
|
else
|
|
{
|
|
gStorage->boxOption = boxOption;
|
|
gStorage->isReopening = FALSE;
|
|
sMovingItemId = 0;
|
|
gStorage->state = 0;
|
|
gStorage->taskId = CreateTask(Task_InitPokeStorage, 3);
|
|
SetHelpContext(HELPCONTEXT_BILLS_PC);
|
|
sLastUsedBox = StorageGetCurrentBox();
|
|
SetMainCallback2(CB2_PokeStorage);
|
|
}
|
|
}
|
|
|
|
void CB2_ReturnToPokeStorage(void)
|
|
{
|
|
ResetTasks();
|
|
gStorage = Alloc(sizeof(struct PokemonStorageSystemData));
|
|
if (gStorage == NULL)
|
|
SetMainCallback2(CB2_ExitPokeStorage);
|
|
else
|
|
{
|
|
gStorage->boxOption = sCurrentBoxOption;
|
|
gStorage->isReopening = TRUE;
|
|
gStorage->state = 0;
|
|
gStorage->taskId = CreateTask(Task_InitPokeStorage, 3);
|
|
SetHelpContext(HELPCONTEXT_BILLS_PC);
|
|
SetMainCallback2(CB2_PokeStorage);
|
|
}
|
|
}
|
|
|
|
static void ResetAllBgCoords(void)
|
|
{
|
|
SetGpuReg(REG_OFFSET_BG0HOFS, 0);
|
|
SetGpuReg(REG_OFFSET_BG0VOFS, 0);
|
|
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
|
|
SetGpuReg(REG_OFFSET_BG1VOFS, 0);
|
|
SetGpuReg(REG_OFFSET_BG2HOFS, 0);
|
|
SetGpuReg(REG_OFFSET_BG2VOFS, 0);
|
|
SetGpuReg(REG_OFFSET_BG3HOFS, 0);
|
|
SetGpuReg(REG_OFFSET_BG3VOFS, 0);
|
|
}
|
|
|
|
static void ResetForPokeStorage(void)
|
|
{
|
|
ResetPaletteFade();
|
|
ResetSpriteData();
|
|
FreeSpriteTileRanges();
|
|
FreeAllSpritePalettes();
|
|
ClearDma3Requests();
|
|
gReservedSpriteTileCount = 0x280;
|
|
UnkUtil_Init(&gStorage->unkUtil, gStorage->unkUtilData, ARRAY_COUNT(gStorage->unkUtilData));
|
|
gKeyRepeatStartDelay = 20;
|
|
ClearScheduledBgCopiesToVram();
|
|
TilemapUtil_Init(TILEMAP_COUNT);
|
|
TilemapUtil_SetTilemap(TILEMAP_PKMN_DATA, 1, sPkmnData_Tilemap, 8, 4);
|
|
TilemapUtil_SetPos(TILEMAP_PKMN_DATA, 1, 0);
|
|
gStorage->closeBoxFlashing = FALSE;
|
|
}
|
|
|
|
static void InitStartingPosData(void)
|
|
{
|
|
ClearSavedCursorPos();
|
|
sInPartyMenu = gStorage->boxOption == OPTION_DEPOSIT;
|
|
sDepositBoxId = 0;
|
|
}
|
|
|
|
static void SetMonIconTransparency(void)
|
|
{
|
|
if (gStorage->boxOption == OPTION_MOVE_ITEMS)
|
|
{
|
|
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL);
|
|
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(7, 11));
|
|
}
|
|
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP);
|
|
}
|
|
|
|
static void SetPokeStorageTask(TaskFunc newFunc)
|
|
{
|
|
gTasks[gStorage->taskId].func = newFunc;
|
|
gStorage->state = 0;
|
|
}
|
|
|
|
static void Task_InitPokeStorage(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
SetVBlankCallback(NULL);
|
|
SetGpuReg(REG_OFFSET_DISPCNT, 0);
|
|
ResetForPokeStorage();
|
|
if (gStorage->isReopening)
|
|
{
|
|
switch (sWhichToReshow)
|
|
{
|
|
case SCREEN_CHANGE_NAME_BOX - 1:
|
|
LoadSavedMovingMon();
|
|
break;
|
|
case SCREEN_CHANGE_SUMMARY_SCREEN - 1:
|
|
SetSelectionAfterSummaryScreen();
|
|
break;
|
|
case SCREEN_CHANGE_ITEM_FROM_BAG - 1:
|
|
GiveChosenBagItem();
|
|
break;
|
|
}
|
|
}
|
|
LoadPokeStorageMenuGfx();
|
|
LoadsMiscSpritePalette();
|
|
break;
|
|
case 1:
|
|
if (!InitPokeStorageWindows())
|
|
{
|
|
SetPokeStorageTask(Task_ChangeScreen);
|
|
return;
|
|
}
|
|
break;
|
|
case 2:
|
|
PutWindowTilemap(0);
|
|
ClearWindowTilemap(1);
|
|
CpuFill32(0, (void *)VRAM, 0x200);
|
|
LoadUserWindowGfx(1, 0xB, 0xE0);
|
|
break;
|
|
case 3:
|
|
ResetAllBgCoords();
|
|
if (!gStorage->isReopening)
|
|
InitStartingPosData();
|
|
break;
|
|
case 4:
|
|
InitMonIconFields();
|
|
if (!gStorage->isReopening)
|
|
InitCursor();
|
|
else
|
|
InitCursorOnReopen();
|
|
break;
|
|
case 5:
|
|
if (!MultiMove_Init())
|
|
{
|
|
SetPokeStorageTask(Task_ChangeScreen);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
SetScrollingBackground();
|
|
InitPokeStorageBg0();
|
|
}
|
|
break;
|
|
case 6:
|
|
InitPalettesAndSprites();
|
|
break;
|
|
case 7:
|
|
InitSupplementalTilemaps();
|
|
break;
|
|
case 8:
|
|
CreateInitBoxTask(StorageGetCurrentBox());
|
|
break;
|
|
case 9:
|
|
if (IsInitBoxActive())
|
|
return;
|
|
|
|
if (gStorage->boxOption != OPTION_MOVE_ITEMS)
|
|
{
|
|
gStorage->markMenu.baseTileTag = GFXTAG_MARKING_MENU;
|
|
gStorage->markMenu.basePaletteTag = PALTAG_MARKING_MENU;
|
|
InitMonMarkingsMenu(&gStorage->markMenu);
|
|
BufferMonMarkingsMenuTiles();
|
|
}
|
|
else
|
|
{
|
|
CreateItemIconSprites();
|
|
InitCursorItemIcon();
|
|
}
|
|
break;
|
|
case 10:
|
|
SetMonIconTransparency();
|
|
if (!gStorage->isReopening)
|
|
{
|
|
BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);
|
|
SetPokeStorageTask(Task_ShowPokeStorage);
|
|
}
|
|
else
|
|
{
|
|
BlendPalettes(PALETTES_ALL, 16, RGB_BLACK);
|
|
SetPokeStorageTask(Task_ReshowPokeStorage);
|
|
}
|
|
SetVBlankCallback(VBlankCB_PokeStorage);
|
|
return;
|
|
default:
|
|
return;
|
|
}
|
|
|
|
gStorage->state++;
|
|
}
|
|
|
|
static void Task_ShowPokeStorage(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
PlaySE(SE_PC_LOGIN);
|
|
BeginPCScreenEffect_TurnOn(20, 0, 1);
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (!IsPCScreenEffectRunning_TurnOn())
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_ReshowPokeStorage(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
BeginNormalPaletteFade(PALETTES_ALL, -1, 0x10, 0, RGB_BLACK);
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (!UpdatePaletteFade())
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_PokeStorageMain(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
switch (HandleInput())
|
|
{
|
|
case INPUT_MOVE_CURSOR:
|
|
PlaySE(SE_SELECT);
|
|
gStorage->state = 1;
|
|
break;
|
|
case INPUT_SHOW_PARTY:
|
|
if (gStorage->boxOption != OPTION_MOVE_MONS && gStorage->boxOption != OPTION_MOVE_ITEMS)
|
|
{
|
|
PrintStorageMessage(MSG_WHICH_ONE_WILL_TAKE);
|
|
gStorage->state = 3;
|
|
}
|
|
else
|
|
{
|
|
ClearSavedCursorPos();
|
|
SetPokeStorageTask(Task_ShowPartyPokemon);
|
|
}
|
|
break;
|
|
case INPUT_HIDE_PARTY:
|
|
if (gStorage->boxOption == OPTION_MOVE_MONS)
|
|
{
|
|
if (IsMonBeingMoved() && ItemIsMail(gStorage->displayMonItemId))
|
|
gStorage->state = 5;
|
|
else
|
|
SetPokeStorageTask(Task_HidePartyPokemon);
|
|
}
|
|
else if (gStorage->boxOption == OPTION_MOVE_ITEMS)
|
|
SetPokeStorageTask(Task_HidePartyPokemon);
|
|
break;
|
|
case INPUT_CLOSE_BOX:
|
|
SetPokeStorageTask(Task_OnCloseBoxPressed);
|
|
break;
|
|
case INPUT_PRESSED_B:
|
|
SetPokeStorageTask(Task_OnBPressed);
|
|
break;
|
|
case INPUT_BOX_OPTIONS:
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageTask(Task_HandleBoxOptions);
|
|
break;
|
|
case INPUT_IN_MENU:
|
|
SetPokeStorageTask(Task_OnSelectedMon);
|
|
break;
|
|
case INPUT_SCROLL_RIGHT:
|
|
PlaySE(SE_SELECT);
|
|
gStorage->newCurrBoxId = StorageGetCurrentBox() + 1;
|
|
if (gStorage->newCurrBoxId >= TOTAL_BOXES_COUNT)
|
|
gStorage->newCurrBoxId = 0;
|
|
if (gStorage->boxOption != OPTION_MOVE_ITEMS)
|
|
{
|
|
SetUpScrollToBox(gStorage->newCurrBoxId);
|
|
gStorage->state = 2;
|
|
}
|
|
else
|
|
{
|
|
TryHideItemAtCursor();
|
|
gStorage->state = 10;
|
|
}
|
|
break;
|
|
case INPUT_SCROLL_LEFT:
|
|
PlaySE(SE_SELECT);
|
|
gStorage->newCurrBoxId = StorageGetCurrentBox() - 1;
|
|
if (gStorage->newCurrBoxId < 0)
|
|
gStorage->newCurrBoxId = TOTAL_BOXES_COUNT - 1;
|
|
if (gStorage->boxOption != OPTION_MOVE_ITEMS)
|
|
{
|
|
SetUpScrollToBox(gStorage->newCurrBoxId);
|
|
gStorage->state = 2;
|
|
}
|
|
else
|
|
{
|
|
TryHideItemAtCursor();
|
|
gStorage->state = 10;
|
|
}
|
|
break;
|
|
case INPUT_DEPOSIT:
|
|
if (!CanMovePartyMon())
|
|
{
|
|
if (ItemIsMail(gStorage->displayMonItemId))
|
|
gStorage->state = 5;
|
|
else
|
|
{
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageTask(Task_DepositMenu);
|
|
}
|
|
}
|
|
else
|
|
gStorage->state = 4;
|
|
break;
|
|
case INPUT_MOVE_MON:
|
|
if (CanMovePartyMon())
|
|
gStorage->state = 4;
|
|
|
|
else
|
|
{
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageTask(Task_MoveMon);
|
|
}
|
|
break;
|
|
case INPUT_SHIFT_MON:
|
|
if (!CanShiftMon())
|
|
gStorage->state = 4;
|
|
else
|
|
{
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageTask(Task_ShiftMon);
|
|
}
|
|
break;
|
|
case INPUT_WITHDRAW:
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageTask(Task_WithdrawMon);
|
|
break;
|
|
case INPUT_PLACE_MON:
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageTask(Task_PlaceMon);
|
|
break;
|
|
case INPUT_TAKE_ITEM:
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageTask(Task_TakeItemForMoving);
|
|
break;
|
|
case INPUT_GIVE_ITEM:
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageTask(Task_GiveMovingItemToMon);
|
|
break;
|
|
case INPUT_SWITCH_ITEMS:
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageTask(Task_SwitchSelectedItem);
|
|
break;
|
|
case INPUT_MULTIMOVE_START:
|
|
PlaySE(SE_SELECT);
|
|
MultiMove_SetFunction(MULTIMOVE_START);
|
|
gStorage->state = 7;
|
|
break;
|
|
case INPUT_MULTIMOVE_SINGLE:
|
|
MultiMove_SetFunction(MULTIMOVE_SINGLE);
|
|
gStorage->state = 8;
|
|
break;
|
|
case INPUT_MULTIMOVE_CHANGE_SELECTION:
|
|
PlaySE(SE_SELECT);
|
|
MultiMove_SetFunction(MULTIMOVE_CHANGE_SELECTION);
|
|
gStorage->state = 9;
|
|
break;
|
|
case INPUT_MULTIMOVE_GRAB_SELECTION:
|
|
MultiMove_SetFunction(MULTIMOVE_GRAB_SELECTION);
|
|
gStorage->state = 7;
|
|
break;
|
|
case INPUT_MULTIMOVE_MOVE_MONS:
|
|
PlaySE(SE_SELECT);
|
|
MultiMove_SetFunction(MULTIMOVE_MOVE_MONS);
|
|
gStorage->state = 9;
|
|
break;
|
|
case INPUT_MULTIMOVE_PLACE_MONS:
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageQuestLogEvent(3);
|
|
MultiMove_SetFunction(MULTIMOVE_PLACE_MONS);
|
|
gStorage->state = 7;
|
|
break;
|
|
case INPUT_MULTIMOVE_UNABLE:
|
|
PlaySE(SE_FAILURE);
|
|
break;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (!UpdateCursorPos())
|
|
{
|
|
if (IsCursorOnCloseBox())
|
|
StartFlashingCloseBoxButton();
|
|
else
|
|
StopFlashingCloseBoxButton();
|
|
|
|
if (gStorage->setMosaic)
|
|
StartDisplayMonMosaic();
|
|
gStorage->state = 0;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!ScrollToBox())
|
|
{
|
|
SetCurrentBox(gStorage->newCurrBoxId);
|
|
if (!sInPartyMenu && !IsMonBeingMoved())
|
|
{
|
|
DoTrySetDisplayMonData();
|
|
StartDisplayMonMosaic();
|
|
}
|
|
|
|
if (gStorage->boxOption == OPTION_MOVE_ITEMS)
|
|
{
|
|
TryShowItemAtCursor();
|
|
gStorage->state = 11;
|
|
}
|
|
else
|
|
gStorage->state = 0;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
ClearBottomWindow();
|
|
gStorage->state = 0;
|
|
}
|
|
break;
|
|
case 4:
|
|
PlaySE(SE_FAILURE);
|
|
PrintStorageMessage(MSG_LAST_POKE);
|
|
gStorage->state = 6;
|
|
break;
|
|
case 5:
|
|
PlaySE(SE_FAILURE);
|
|
PrintStorageMessage(MSG_PLEASE_REMOVE_MAIL);
|
|
gStorage->state = 6;
|
|
break;
|
|
case 6:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
case 7:
|
|
if (!MultiMove_RunFunction())
|
|
gStorage->state = 0;
|
|
break;
|
|
case 8:
|
|
if (!MultiMove_RunFunction())
|
|
SetPokeStorageTask(Task_MoveMon);
|
|
break;
|
|
case 9:
|
|
if (!MultiMove_RunFunction())
|
|
{
|
|
if (gStorage->setMosaic)
|
|
StartDisplayMonMosaic();
|
|
gStorage->state = 0;
|
|
}
|
|
break;
|
|
case 10:
|
|
if (!IsItemIconAnimActive())
|
|
{
|
|
SetUpScrollToBox(gStorage->newCurrBoxId);
|
|
gStorage->state = 2;
|
|
}
|
|
break;
|
|
case 11:
|
|
if (!IsItemIconAnimActive())
|
|
gStorage->state = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_ShowPartyPokemon(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
SetUpDoShowPartyMenu();
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (!DoShowPartyMenu())
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_HidePartyPokemon(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
PlaySE(SE_SELECT);
|
|
SetUpHidePartyMenu();
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (!HidePartyMenu())
|
|
{
|
|
SetCursorBoxPosition(GetSavedCursorPos());
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!UpdateCursorPos())
|
|
{
|
|
if (gStorage->setMosaic)
|
|
StartDisplayMonMosaic();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_OnSelectedMon(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
if (!IsDisplayMonMosaicActive())
|
|
{
|
|
PlaySE(SE_SELECT);
|
|
if (gStorage->boxOption != OPTION_MOVE_ITEMS)
|
|
PrintStorageMessage(MSG_IS_SELECTED);
|
|
else if (IsActiveItemMoving() || gStorage->displayMonItemId != 0)
|
|
PrintStorageMessage(MSG_IS_SELECTED2);
|
|
else
|
|
PrintStorageMessage(MSG_GIVE_TO_MON);
|
|
|
|
AddMenu();
|
|
gStorage->state = 1;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (!IsMenuLoading())
|
|
gStorage->state = 2;
|
|
break;
|
|
case 2:
|
|
switch (HandleMenuInput())
|
|
{
|
|
case MENU_B_PRESSED:
|
|
case MENU_TEXT_CANCEL:
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
case MENU_TEXT_MOVE:
|
|
if (CanMovePartyMon())
|
|
gStorage->state = 3;
|
|
else
|
|
{
|
|
PlaySE(SE_SELECT);
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_MoveMon);
|
|
}
|
|
break;
|
|
case MENU_TEXT_PLACE:
|
|
PlaySE(SE_SELECT);
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_PlaceMon);
|
|
break;
|
|
case MENU_TEXT_SHIFT:
|
|
if (!CanShiftMon())
|
|
gStorage->state = 3;
|
|
else
|
|
{
|
|
PlaySE(SE_SELECT);
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_ShiftMon);
|
|
}
|
|
break;
|
|
case MENU_TEXT_WITHDRAW:
|
|
PlaySE(SE_SELECT);
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_WithdrawMon);
|
|
break;
|
|
case MENU_TEXT_STORE:
|
|
if (CanMovePartyMon())
|
|
gStorage->state = 3;
|
|
else if (ItemIsMail(gStorage->displayMonItemId))
|
|
gStorage->state = 4;
|
|
else
|
|
{
|
|
PlaySE(SE_SELECT);
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_DepositMenu);
|
|
}
|
|
break;
|
|
case MENU_TEXT_RELEASE:
|
|
if (CanMovePartyMon())
|
|
gStorage->state = 3;
|
|
else if (gStorage->displayMonIsEgg)
|
|
gStorage->state = 5;
|
|
else if (ItemIsMail(gStorage->displayMonItemId))
|
|
gStorage->state = 4;
|
|
else
|
|
{
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageTask(Task_ReleaseMon);
|
|
}
|
|
break;
|
|
case MENU_TEXT_SUMMARY:
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageTask(Task_ShowMonSummary);
|
|
break;
|
|
case MENU_TEXT_MARK:
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageTask(Task_ShowMarkMenu);
|
|
break;
|
|
case MENU_TEXT_TAKE:
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageTask(Task_TakeItemForMoving);
|
|
break;
|
|
case MENU_TEXT_GIVE:
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageTask(Task_GiveMovingItemToMon);
|
|
break;
|
|
case MENU_TEXT_BAG:
|
|
SetPokeStorageTask(Task_ItemToBag);
|
|
break;
|
|
case MENU_TEXT_SWITCH:
|
|
SetPokeStorageTask(Task_SwitchSelectedItem);
|
|
break;
|
|
case MENU_TEXT_GIVE2:
|
|
SetPokeStorageTask(Task_GiveItemFromBag);
|
|
break;
|
|
case MENU_TEXT_INFO:
|
|
SetPokeStorageTask(Task_ShowItemInfo);
|
|
break;
|
|
}
|
|
break;
|
|
case 3:
|
|
PlaySE(SE_FAILURE);
|
|
PrintStorageMessage(MSG_LAST_POKE);
|
|
gStorage->state = 6;
|
|
break;
|
|
case 5:
|
|
PlaySE(SE_FAILURE);
|
|
PrintStorageMessage(MSG_CANT_RELEASE_EGG);
|
|
gStorage->state = 6;
|
|
break;
|
|
case 4:
|
|
PlaySE(SE_FAILURE);
|
|
PrintStorageMessage(MSG_PLEASE_REMOVE_MAIL);
|
|
gStorage->state = 6;
|
|
break;
|
|
case 6:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_MoveMon(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
InitMonPlaceChange(CHANGE_GRAB);
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (!DoMonPlaceChange())
|
|
{
|
|
if (sInPartyMenu)
|
|
SetPokeStorageTask(Task_HandleMovingMonFromParty);
|
|
else
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_PlaceMon(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
SetPokeStorageQuestLogEvent(1);
|
|
InitMonPlaceChange(CHANGE_PLACE);
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (!DoMonPlaceChange())
|
|
{
|
|
if (sInPartyMenu)
|
|
SetPokeStorageTask(Task_HandleMovingMonFromParty);
|
|
else
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_ShiftMon(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
SetPokeStorageQuestLogEvent(0);
|
|
InitMonPlaceChange(CHANGE_SHIFT);
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (!DoMonPlaceChange())
|
|
{
|
|
StartDisplayMonMosaic();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_WithdrawMon(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
if (CalculatePlayerPartyCount() == PARTY_SIZE)
|
|
{
|
|
PrintStorageMessage(MSG_PARTY_FULL);
|
|
gStorage->state = 1;
|
|
}
|
|
else
|
|
{
|
|
SaveCursorPos();
|
|
InitMonPlaceChange(CHANGE_GRAB);
|
|
gStorage->state = 2;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!DoMonPlaceChange())
|
|
{
|
|
SetMovingMonPriority(1);
|
|
SetUpDoShowPartyMenu();
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (!DoShowPartyMenu())
|
|
{
|
|
SetPokeStorageQuestLogEvent(1);
|
|
InitMonPlaceChange(CHANGE_PLACE);
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (!DoMonPlaceChange())
|
|
{
|
|
UpdatePartySlotColors();
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 5:
|
|
SetPokeStorageTask(Task_HidePartyPokemon);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_DepositMenu(u8 taskId)
|
|
{
|
|
u8 boxId;
|
|
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
PrintStorageMessage(MSG_DEPOSIT_IN_WHICH_BOX);
|
|
LoadChooseBoxMenuGfx(&gStorage->chooseBoxMenu, GFXTAG_CHOOSE_BOX_MENU_CENTER, PALTAG_MISC_1, 3, FALSE);
|
|
CreateChooseBoxMenuSprites(sDepositBoxId);
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
boxId = HandleBoxChooseSelectionInput();
|
|
switch (boxId)
|
|
{
|
|
case BOXID_NONE_CHOSEN:
|
|
break;
|
|
case BOXID_CANCELED:
|
|
ClearBottomWindow();
|
|
DestroyChooseBoxMenuSprites();
|
|
FreeBoxSelectionPopupSpriteGfx();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
default:
|
|
if (TryStorePartyMonInBox(boxId))
|
|
{
|
|
sDepositBoxId = boxId;
|
|
SetPokeStorageQuestLogEvent(2);
|
|
ClearBottomWindow();
|
|
DestroyChooseBoxMenuSprites();
|
|
FreeBoxSelectionPopupSpriteGfx();
|
|
gStorage->state = 2;
|
|
}
|
|
else
|
|
{
|
|
PrintStorageMessage(MSG_BOX_IS_FULL);
|
|
gStorage->state = 4;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case 2:
|
|
CompactPartySlots();
|
|
CompactPartySprites();
|
|
gStorage->state++;
|
|
break;
|
|
case 3:
|
|
if (GetNumPartySpritesCompacting() == 0)
|
|
{
|
|
ResetSelectionAfterDeposit();
|
|
StartDisplayMonMosaic();
|
|
UpdatePartySlotColors();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
case 4:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
PrintStorageMessage(MSG_DEPOSIT_IN_WHICH_BOX);
|
|
gStorage->state = 1;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_ReleaseMon(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
PrintStorageMessage(MSG_RELEASE_POKE);
|
|
ShowYesNoWindow(1);
|
|
gStorage->state++;
|
|
// fallthrough
|
|
case 1:
|
|
switch (Menu_ProcessInputNoWrapClearOnChoose())
|
|
{
|
|
case MENU_B_PRESSED:
|
|
case 1:
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
case 0:
|
|
ClearBottomWindow();
|
|
InitCanReleaseMonVars();
|
|
InitReleaseMon();
|
|
gStorage->state++;
|
|
break;
|
|
}
|
|
break;
|
|
case 2:
|
|
RunCanReleaseMon();
|
|
if (!TryHideReleaseMon())
|
|
{
|
|
while (TRUE)
|
|
{
|
|
// keep checking until status is no longer RELEASE_MON_UNDETERMINED
|
|
s8 canReleaseStatus = RunCanReleaseMon();
|
|
if (canReleaseStatus == RELEASE_MON_ALLOWED)
|
|
{
|
|
gStorage->state++;
|
|
break;
|
|
}
|
|
else if (canReleaseStatus == RELEASE_MON_NOT_ALLOWED)
|
|
{
|
|
gStorage->state = 8; // Can't release the mon.
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 3:
|
|
ReleaseMon();
|
|
RefreshDisplayMonData();
|
|
PrintStorageMessage(MSG_WAS_RELEASED);
|
|
gStorage->state++;
|
|
break;
|
|
case 4:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
PrintStorageMessage(MSG_BYE_BYE);
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 5:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
ClearBottomWindow();
|
|
if (sInPartyMenu)
|
|
{
|
|
CompactPartySlots();
|
|
CompactPartySprites();
|
|
gStorage->state++;
|
|
}
|
|
else
|
|
gStorage->state = 7;
|
|
}
|
|
break;
|
|
case 6:
|
|
if (GetNumPartySpritesCompacting() == 0)
|
|
{
|
|
DoTrySetDisplayMonData();
|
|
StartDisplayMonMosaic();
|
|
UpdatePartySlotColors();
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 7:
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
case 8:
|
|
// Start "can't release" sequence
|
|
PrintStorageMessage(MSG_WAS_RELEASED);
|
|
gStorage->state++;
|
|
break;
|
|
case 9:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
PrintStorageMessage(MSG_SURPRISE);
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 10:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
ClearBottomWindow();
|
|
DoReleaseMonComeBackAnim();
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 11:
|
|
if (!ResetReleaseMonSpritePtr())
|
|
{
|
|
TrySetCursorFistAnim();
|
|
PrintStorageMessage(MSG_CAME_BACK);
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 12:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
PrintStorageMessage(MSG_WORRIED);
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 13:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_ShowMarkMenu(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
PrintStorageMessage(MSG_MARK_POKE);
|
|
gStorage->markMenu.markings = gStorage->displayMonMarkings;
|
|
OpenMonMarkingsMenu(gStorage->displayMonMarkings, 176, 16);
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (!HandleMonMarkingsMenuInput())
|
|
{
|
|
FreeMonMarkingsMenu();
|
|
ClearBottomWindow();
|
|
SetMonMarkings(gStorage->markMenu.markings);
|
|
RefreshDisplayMonData();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_TakeItemForMoving(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
if (!ItemIsMail(gStorage->displayMonItemId))
|
|
{
|
|
ClearBottomWindow();
|
|
gStorage->state++;
|
|
}
|
|
else
|
|
SetPokeStorageTask(Task_PrintCantStoreMail);
|
|
break;
|
|
case 1:
|
|
StartCursorAnim(CURSOR_ANIM_OPEN);
|
|
Item_FromMonToMoving(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
|
|
gStorage->state++;
|
|
break;
|
|
case 2:
|
|
if (!IsItemIconAnimActive())
|
|
{
|
|
StartCursorAnim(CURSOR_ANIM_FIST);
|
|
ClearBottomWindow();
|
|
DoTrySetDisplayMonData();
|
|
PrintDisplayMonInfo();
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_GiveMovingItemToMon(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
ClearBottomWindow();
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
StartCursorAnim(CURSOR_ANIM_OPEN);
|
|
Item_GiveMovingToMon(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
|
|
gStorage->state++;
|
|
break;
|
|
case 2:
|
|
if (!IsItemIconAnimActive())
|
|
{
|
|
StartCursorAnim(CURSOR_ANIM_BOUNCE);
|
|
DoTrySetDisplayMonData();
|
|
PrintDisplayMonInfo();
|
|
PrintStorageMessage(MSG_ITEM_IS_HELD);
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
ClearBottomWindow();
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_ItemToBag(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
if (!AddBagItem(gStorage->displayMonItemId, 1))
|
|
{
|
|
PlaySE(SE_FAILURE);
|
|
PrintStorageMessage(MSG_BAG_FULL);
|
|
gStorage->state = 3;
|
|
}
|
|
else
|
|
{
|
|
PlaySE(SE_SELECT);
|
|
Item_TakeMons(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
|
|
gStorage->state = 1;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (!IsItemIconAnimActive())
|
|
{
|
|
PrintStorageMessage(MSG_PLACED_IN_BAG);
|
|
gStorage->state = 2;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
ClearBottomWindow();
|
|
DoTrySetDisplayMonData();
|
|
PrintDisplayMonInfo();
|
|
gStorage->state = 4;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
case 3:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_SwitchSelectedItem(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
if (!ItemIsMail(gStorage->displayMonItemId))
|
|
{
|
|
ClearBottomWindow();
|
|
gStorage->state++;
|
|
}
|
|
else
|
|
SetPokeStorageTask(Task_PrintCantStoreMail);
|
|
break;
|
|
case 1:
|
|
StartCursorAnim(CURSOR_ANIM_OPEN);
|
|
Item_SwitchMonsWithMoving(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
|
|
gStorage->state++;
|
|
break;
|
|
case 2:
|
|
if (!IsItemIconAnimActive())
|
|
{
|
|
StartCursorAnim(CURSOR_ANIM_FIST);
|
|
DoTrySetDisplayMonData();
|
|
PrintDisplayMonInfo();
|
|
PrintStorageMessage(MSG_CHANGED_TO_ITEM);
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
ClearBottomWindow();
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_ShowItemInfo(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
ClearBottomWindow();
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
PlaySE(SE_WIN_OPEN);
|
|
PrintItemDescription();
|
|
InitItemInfoWindow();
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (!UpdateItemInfoWindowSlideIn())
|
|
gStorage->state++;
|
|
break;
|
|
case 3:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
gStorage->state++;
|
|
break;
|
|
case 4:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
PlaySE(SE_WIN_OPEN);
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 5:
|
|
if (!UpdateItemInfoWindowSlideOut())
|
|
gStorage->state++;
|
|
break;
|
|
case 6:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_CloseBoxWhileHoldingItem(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
PlaySE(SE_SELECT);
|
|
PrintStorageMessage(MSG_PUT_IN_BAG);
|
|
ShowYesNoWindow(0);
|
|
gStorage->state = 1;
|
|
break;
|
|
case 1:
|
|
switch (Menu_ProcessInputNoWrapClearOnChoose())
|
|
{
|
|
case MENU_B_PRESSED:
|
|
case 1:
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
case 0:
|
|
if (AddBagItem(gStorage->movingItemId, 1) == TRUE)
|
|
{
|
|
ClearBottomWindow();
|
|
gStorage->state = 3;
|
|
}
|
|
else
|
|
{
|
|
PrintStorageMessage(MSG_BAG_FULL);
|
|
gStorage->state = 2;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
ClearBottomWindow();
|
|
gStorage->state = 5;
|
|
}
|
|
break;
|
|
case 3:
|
|
MoveItemFromCursorToBag();
|
|
gStorage->state = 4;
|
|
break;
|
|
case 4:
|
|
if (!IsItemIconAnimActive())
|
|
{
|
|
StartCursorAnim(CURSOR_ANIM_BOUNCE);
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
case 5:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_HandleMovingMonFromParty(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
CompactPartySlots();
|
|
CompactPartySprites();
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (GetNumPartySpritesCompacting() == 0)
|
|
{
|
|
UpdatePartySlotColors();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_PrintCantStoreMail(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
PrintStorageMessage(MSG_CANT_STORE_MAIL);
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
gStorage->state++;
|
|
break;
|
|
case 2:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
ClearBottomWindow();
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_HandleBoxOptions(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
PrintStorageMessage(MSG_WHAT_YOU_DO);
|
|
AddMenu();
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (IsMenuLoading())
|
|
return;
|
|
gStorage->state++;
|
|
case 2:
|
|
switch (HandleMenuInput())
|
|
{
|
|
case MENU_B_PRESSED:
|
|
case MENU_TEXT_CANCEL:
|
|
AnimateBoxScrollArrows(TRUE);
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
case MENU_TEXT_NAME:
|
|
PlaySE(SE_SELECT);
|
|
SetPokeStorageTask(Task_NameBox);
|
|
break;
|
|
case MENU_TEXT_WALLPAPER:
|
|
PlaySE(SE_SELECT);
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_HandleWallpapers);
|
|
break;
|
|
case MENU_TEXT_JUMP:
|
|
PlaySE(SE_SELECT);
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_JumpBox);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_HandleWallpapers(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
AddWallpaperSetsMenu();
|
|
PrintStorageMessage(MSG_PICK_A_THEME);
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (!IsMenuLoading())
|
|
gStorage->state++;
|
|
break;
|
|
case 2:
|
|
gStorage->wallpaperSetId = HandleMenuInput();
|
|
switch (gStorage->wallpaperSetId)
|
|
{
|
|
case MENU_B_PRESSED:
|
|
AnimateBoxScrollArrows(TRUE);
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
case MENU_TEXT_SCENERY_1:
|
|
case MENU_TEXT_SCENERY_2:
|
|
case MENU_TEXT_SCENERY_3:
|
|
case MENU_TEXT_ETCETERA:
|
|
PlaySE(SE_SELECT);
|
|
RemoveMenu();
|
|
gStorage->wallpaperSetId -= MENU_TEXT_SCENERY_1;
|
|
gStorage->state++;
|
|
break;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (!IsDma3ManagerBusyWithBgCopy())
|
|
{
|
|
AddWallpapersMenu(gStorage->wallpaperSetId);
|
|
PrintStorageMessage(MSG_PICK_A_WALLPAPER);
|
|
gStorage->state++;
|
|
}
|
|
break;
|
|
case 4:
|
|
gStorage->wallpaperId = HandleMenuInput();
|
|
switch (gStorage->wallpaperId)
|
|
{
|
|
case MENU_NOTHING_CHOSEN:
|
|
break;
|
|
case MENU_B_PRESSED:
|
|
ClearBottomWindow();
|
|
gStorage->state = 0;
|
|
break;
|
|
default:
|
|
PlaySE(SE_SELECT);
|
|
ClearBottomWindow();
|
|
gStorage->wallpaperId -= MENU_TEXT_FOREST;
|
|
SetWallpaperForCurrentBox(gStorage->wallpaperId);
|
|
gStorage->state++;
|
|
break;
|
|
}
|
|
break;
|
|
case 5:
|
|
if (!DoWallpaperGfxChange())
|
|
{
|
|
AnimateBoxScrollArrows(TRUE);
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_JumpBox(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
PrintStorageMessage(MSG_JUMP_TO_WHICH_BOX);
|
|
LoadChooseBoxMenuGfx(&gStorage->chooseBoxMenu, GFXTAG_CHOOSE_BOX_MENU_CENTER, PALTAG_MISC_1, 3, FALSE);
|
|
CreateChooseBoxMenuSprites(StorageGetCurrentBox());
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
gStorage->newCurrBoxId = HandleBoxChooseSelectionInput();
|
|
switch (gStorage->newCurrBoxId)
|
|
{
|
|
case BOXID_NONE_CHOSEN:
|
|
break;
|
|
default:
|
|
ClearBottomWindow();
|
|
DestroyChooseBoxMenuSprites();
|
|
FreeBoxSelectionPopupSpriteGfx();
|
|
if (gStorage->newCurrBoxId == BOXID_CANCELED || gStorage->newCurrBoxId == StorageGetCurrentBox())
|
|
{
|
|
AnimateBoxScrollArrows(TRUE);
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
else
|
|
gStorage->state++;
|
|
break;
|
|
}
|
|
break;
|
|
case 2:
|
|
SetUpScrollToBox(gStorage->newCurrBoxId);
|
|
gStorage->state++;
|
|
break;
|
|
case 3:
|
|
if (!ScrollToBox())
|
|
{
|
|
SetCurrentBox(gStorage->newCurrBoxId);
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_NameBox(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
SaveMovingMon();
|
|
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (!UpdatePaletteFade())
|
|
{
|
|
sWhichToReshow = SCREEN_CHANGE_NAME_BOX - 1;
|
|
gStorage->screenChangeType = SCREEN_CHANGE_NAME_BOX;
|
|
SetPokeStorageTask(Task_ChangeScreen);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_ShowMonSummary(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
InitSummaryScreenData();
|
|
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (!UpdatePaletteFade())
|
|
{
|
|
sWhichToReshow = SCREEN_CHANGE_SUMMARY_SCREEN - 1;
|
|
gStorage->screenChangeType = SCREEN_CHANGE_SUMMARY_SCREEN;
|
|
SetPokeStorageTask(Task_ChangeScreen);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_GiveItemFromBag(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
|
|
gStorage->state++;
|
|
break;
|
|
case 1:
|
|
if (!UpdatePaletteFade())
|
|
{
|
|
sWhichToReshow = SCREEN_CHANGE_ITEM_FROM_BAG - 1;
|
|
gStorage->screenChangeType = SCREEN_CHANGE_ITEM_FROM_BAG;
|
|
SetPokeStorageTask(Task_ChangeScreen);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_OnCloseBoxPressed(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
if (IsMonBeingMoved())
|
|
{
|
|
PlaySE(SE_FAILURE);
|
|
PrintStorageMessage(MSG_HOLDING_POKE);
|
|
gStorage->state = 1;
|
|
}
|
|
else if (IsActiveItemMoving())
|
|
SetPokeStorageTask(Task_CloseBoxWhileHoldingItem);
|
|
else
|
|
{
|
|
PlaySE(SE_SELECT);
|
|
PrintStorageMessage(MSG_EXIT_BOX);
|
|
ShowYesNoWindow(0);
|
|
gStorage->state = 2;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
case 2:
|
|
switch (Menu_ProcessInputNoWrapClearOnChoose())
|
|
{
|
|
case MENU_B_PRESSED:
|
|
case 1:
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
case 0:
|
|
PlaySE(SE_PC_OFF);
|
|
ClearBottomWindow();
|
|
gStorage->state++;
|
|
break;
|
|
}
|
|
break;
|
|
case 3:
|
|
BeginPCScreenEffect_TurnOff(20, 0, 1);
|
|
gStorage->state++;
|
|
break;
|
|
case 4:
|
|
if (!IsPCScreenEffectRunning_TurnOff())
|
|
{
|
|
UpdateBoxToSendMons();
|
|
gPlayerPartyCount = CalculatePlayerPartyCount();
|
|
gStorage->screenChangeType = SCREEN_CHANGE_EXIT_BOX;
|
|
SetPokeStorageTask(Task_ChangeScreen);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_OnBPressed(u8 taskId)
|
|
{
|
|
switch (gStorage->state)
|
|
{
|
|
case 0:
|
|
if (IsMonBeingMoved())
|
|
{
|
|
PlaySE(SE_FAILURE);
|
|
PrintStorageMessage(MSG_HOLDING_POKE);
|
|
gStorage->state = 1;
|
|
}
|
|
else if (IsActiveItemMoving())
|
|
SetPokeStorageTask(Task_CloseBoxWhileHoldingItem);
|
|
else
|
|
{
|
|
PlaySE(SE_SELECT);
|
|
PrintStorageMessage(MSG_CONTINUE_BOX);
|
|
ShowYesNoWindow(0);
|
|
gStorage->state = 2;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
|
|
{
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
}
|
|
break;
|
|
case 2:
|
|
switch (Menu_ProcessInputNoWrapClearOnChoose())
|
|
{
|
|
case 0:
|
|
ClearBottomWindow();
|
|
SetPokeStorageTask(Task_PokeStorageMain);
|
|
break;
|
|
case 1:
|
|
case MENU_B_PRESSED:
|
|
PlaySE(SE_PC_OFF);
|
|
ClearBottomWindow();
|
|
gStorage->state++;
|
|
break;
|
|
}
|
|
break;
|
|
case 3:
|
|
BeginPCScreenEffect_TurnOff(20, 0, 0);
|
|
gStorage->state++;
|
|
break;
|
|
case 4:
|
|
if (!IsPCScreenEffectRunning_TurnOff())
|
|
{
|
|
UpdateBoxToSendMons();
|
|
gPlayerPartyCount = CalculatePlayerPartyCount();
|
|
gStorage->screenChangeType = SCREEN_CHANGE_EXIT_BOX;
|
|
SetPokeStorageTask(Task_ChangeScreen);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void Task_ChangeScreen(u8 taskId)
|
|
{
|
|
struct Pokemon *party;
|
|
u8 mode, cursorPos, lastIndex;
|
|
u8 screenChangeType = gStorage->screenChangeType;
|
|
|
|
if (gStorage->boxOption == OPTION_MOVE_ITEMS && IsActiveItemMoving() == TRUE)
|
|
sMovingItemId = GetMovingItem();
|
|
else
|
|
sMovingItemId = ITEM_NONE;
|
|
|
|
switch (screenChangeType)
|
|
{
|
|
case SCREEN_CHANGE_EXIT_BOX:
|
|
default:
|
|
FreePokeStorageData();
|
|
SetMainCallback2(CB2_ExitPokeStorage);
|
|
break;
|
|
case SCREEN_CHANGE_SUMMARY_SCREEN:
|
|
party = gStorage->summaryMonPtr.mon;
|
|
cursorPos = gStorage->summaryCursorPos;
|
|
lastIndex = gStorage->summaryLastIndex;
|
|
mode = gStorage->summaryScreenMode;
|
|
FreePokeStorageData();
|
|
ShowPokemonSummaryScreen(party, cursorPos, lastIndex, CB2_ReturnToPokeStorage, mode);
|
|
break;
|
|
case SCREEN_CHANGE_NAME_BOX:
|
|
FreePokeStorageData();
|
|
DoNamingScreen(NAMING_SCREEN_BOX, GetBoxNamePtr(StorageGetCurrentBox()), 0, 0, 0, CB2_ReturnToPokeStorage);
|
|
break;
|
|
case SCREEN_CHANGE_ITEM_FROM_BAG:
|
|
FreePokeStorageData();
|
|
GoToBagMenu(ITEMMENULOCATION_PCBOX, OPEN_BAG_ITEMS, CB2_ReturnToPokeStorage);
|
|
break;
|
|
}
|
|
|
|
DestroyTask(taskId);
|
|
}
|
|
|
|
static void GiveChosenBagItem(void)
|
|
{
|
|
u16 item = gSpecialVar_ItemId;
|
|
|
|
if (item != ITEM_NONE)
|
|
{
|
|
u8 id = GetBoxCursorPosition();
|
|
|
|
if (sInPartyMenu)
|
|
SetMonData(&gPlayerParty[id], MON_DATA_HELD_ITEM, &item);
|
|
else
|
|
SetCurrentBoxMonData(id, MON_DATA_HELD_ITEM, &item);
|
|
|
|
RemoveBagItem(item, 1);
|
|
}
|
|
}
|
|
|
|
static void FreePokeStorageData(void)
|
|
{
|
|
TilemapUtil_Free();
|
|
MultiMove_Free();
|
|
FREE_AND_SET_NULL(gStorage);
|
|
FreeAllWindowBuffers();
|
|
}
|
|
|
|
static void SetScrollingBackground(void)
|
|
{
|
|
SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_16COLOR | BGCNT_SCREENBASE(31));
|
|
DecompressAndLoadBgGfxUsingHeap(3, sScrollingBg_Gfx, 0, 0, 0);
|
|
LZ77UnCompVram(sScrollingBg_Tilemap, (void *)BG_SCREEN_ADDR(31));
|
|
}
|
|
|
|
static void ScrollBackground(void)
|
|
{
|
|
ChangeBgX(3, 128, 1);
|
|
ChangeBgY(3, 128, 2);
|
|
}
|
|
|
|
static void LoadPokeStorageMenuGfx(void)
|
|
{
|
|
InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));
|
|
DecompressAndLoadBgGfxUsingHeap(1, gPokeStorageMenu_Gfx, 0, 0, 0);
|
|
LZ77UnCompWram(sMenu_Tilemap, gStorage->menuTilemapBuffer);
|
|
SetBgTilemapBuffer(1, gStorage->menuTilemapBuffer);
|
|
ShowBg(1);
|
|
ScheduleBgCopyTilemapToVram(1);
|
|
}
|
|
|
|
static bool8 InitPokeStorageWindows(void)
|
|
{
|
|
if (!InitWindows(sWindowTemplates))
|
|
return FALSE;
|
|
|
|
DeactivateAllTextPrinters();
|
|
return TRUE;
|
|
}
|
|
|
|
static void LoadsMiscSpritePalette(void)
|
|
{
|
|
LoadSpritePalette(&sMiscSpritePalette);
|
|
}
|
|
|
|
static void InitPalettesAndSprites(void)
|
|
{
|
|
LoadPalette(gPokeStorageInterface_Pal, 0, 0x20);
|
|
LoadPalette(gPokeStorageInterface_NoDisplayMon_Pal, 0x20, 0x20);
|
|
LoadPalette(sItemInfoFrame_Pal, 0xF0, 0x20);
|
|
if (gStorage->boxOption != OPTION_MOVE_ITEMS)
|
|
LoadPalette(sScrollingBg_Pal, 0x30, sizeof(sScrollingBg_Pal));
|
|
else
|
|
LoadPalette(sScrollingBgMoveItems_Pal, 0x30, sizeof(sScrollingBgMoveItems_Pal));
|
|
|
|
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_16COLOR | BGCNT_SCREENBASE(30));
|
|
CreateDisplayMonSprite();
|
|
CreateMarkingComboSprite();
|
|
CreateWaveformSprites();
|
|
RefreshDisplayMonData();
|
|
}
|
|
|
|
static void CreateMarkingComboSprite(void)
|
|
{
|
|
gStorage->markingComboSprite = CreateMonMarkingComboSprite(GFXTAG_MARKING_COMBO, PALTAG_MARKING_COMBO, NULL);
|
|
gStorage->markingComboSprite->oam.priority = 1;
|
|
gStorage->markingComboSprite->subpriority = 1;
|
|
gStorage->markingComboSprite->x = 40;
|
|
gStorage->markingComboSprite->y = 150;
|
|
gStorage->markingComboTilesPtr = (void *)OBJ_VRAM0 + 32 * GetSpriteTileStartByTag(GFXTAG_MARKING_COMBO);
|
|
}
|
|
|
|
static void CreateWaveformSprites(void)
|
|
{
|
|
u16 i;
|
|
struct SpriteSheet sheet = sWaveformSpriteSheet;
|
|
|
|
LoadSpriteSheet(&sheet);
|
|
for (i = 0; i < 2; i++)
|
|
{
|
|
u8 spriteId = CreateSprite(&sSpriteTemplate_Waveform, i * 63 + 8, 9, 2);
|
|
gStorage->waveformSprites[i] = &gSprites[spriteId];
|
|
}
|
|
}
|
|
|
|
static void RefreshDisplayMonData(void)
|
|
{
|
|
LoadDisplayMonGfx(gStorage->displayMonSpecies, gStorage->displayMonPersonality);
|
|
PrintDisplayMonInfo();
|
|
UpdateWaveformAnimation();
|
|
ScheduleBgCopyTilemapToVram(0);
|
|
}
|
|
|
|
static void StartDisplayMonMosaic(void)
|
|
{
|
|
RefreshDisplayMonData();
|
|
if (gStorage->displayMonSprite)
|
|
{
|
|
gStorage->displayMonSprite->oam.mosaic = TRUE;
|
|
gStorage->displayMonSprite->data[0] = 10;
|
|
gStorage->displayMonSprite->data[1] = 1;
|
|
gStorage->displayMonSprite->callback = SpriteCB_DisplayMonMosaic;
|
|
SetGpuReg(REG_OFFSET_MOSAIC, (gStorage->displayMonSprite->data[0] << 12) | (gStorage->displayMonSprite->data[0] << 8));
|
|
}
|
|
}
|
|
|
|
static u8 IsDisplayMonMosaicActive(void)
|
|
{
|
|
return gStorage->displayMonSprite->oam.mosaic;
|
|
}
|
|
|
|
static void SpriteCB_DisplayMonMosaic(struct Sprite *sprite)
|
|
{
|
|
sprite->data[0] -= sprite->data[1];
|
|
if (sprite->data[0] < 0)
|
|
sprite->data[0] = 0;
|
|
SetGpuReg(REG_OFFSET_MOSAIC, (sprite->data[0] << 12) | (sprite->data[0] << 8));
|
|
if (sprite->data[0] == 0)
|
|
{
|
|
sprite->oam.mosaic = FALSE;
|
|
sprite->callback = SpriteCallbackDummy;
|
|
}
|
|
}
|
|
|
|
static void CreateDisplayMonSprite(void)
|
|
{
|
|
u16 i;
|
|
u16 tileStart;
|
|
u8 palSlot;
|
|
u8 spriteId;
|
|
struct SpriteSheet sheet = {gStorage->tileBuffer, MON_PIC_SIZE, GFXTAG_DISPLAY_MON};
|
|
struct SpritePalette palette = {gStorage->displayMonPalBuffer, PALTAG_DISPLAY_MON};
|
|
struct SpriteTemplate template = sSpriteTemplate_DisplayMon;
|
|
|
|
for (i = 0; i < MON_PIC_SIZE; i++)
|
|
gStorage->tileBuffer[i] = 0;
|
|
for (i = 0; i < 0x10; i++)
|
|
gStorage->displayMonPalBuffer[i] = 0;
|
|
|
|
gStorage->displayMonSprite = NULL;
|
|
|
|
do
|
|
{
|
|
tileStart = LoadSpriteSheet(&sheet);
|
|
if (tileStart == 0)
|
|
break;
|
|
|
|
palSlot = LoadSpritePalette(&palette);
|
|
if (palSlot == 0xFF)
|
|
break;
|
|
|
|
spriteId = CreateSprite(&template, 40, 48, 0);
|
|
if (spriteId == MAX_SPRITES)
|
|
break;
|
|
|
|
gStorage->displayMonSprite = &gSprites[spriteId];
|
|
gStorage->displayMonPalOffset = palSlot * 16 + 0x100;
|
|
gStorage->displayMonTilePtr = (void *)OBJ_VRAM0 + tileStart * 32;
|
|
} while (FALSE);
|
|
|
|
if (gStorage->displayMonSprite == NULL)
|
|
{
|
|
FreeSpriteTilesByTag(GFXTAG_DISPLAY_MON);
|
|
FreeSpritePaletteByTag(PALTAG_DISPLAY_MON);
|
|
}
|
|
}
|
|
|
|
static void LoadDisplayMonGfx(u16 species, u32 personality)
|
|
{
|
|
if (gStorage->displayMonSprite == NULL)
|
|
return;
|
|
|
|
if (species != SPECIES_NONE)
|
|
{
|
|
HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gStorage->tileBuffer, species, personality);
|
|
LZ77UnCompWram(gStorage->displayMonPalette, gStorage->displayMonPalBuffer);
|
|
CpuCopy32(gStorage->tileBuffer, gStorage->displayMonTilePtr, 0x800);
|
|
LoadPalette(gStorage->displayMonPalBuffer, gStorage->displayMonPalOffset, 0x20);
|
|
gStorage->displayMonSprite->invisible = FALSE;
|
|
}
|
|
else
|
|
gStorage->displayMonSprite->invisible = TRUE;
|
|
}
|
|
|
|
static void PrintDisplayMonInfo(void)
|
|
{
|
|
u16 i;
|
|
u16 y;
|
|
FillWindowPixelBuffer(0, PIXEL_FILL(1));
|
|
if (gStorage->boxOption != OPTION_MOVE_ITEMS)
|
|
{
|
|
for (i = 0, y = 0; i < 3; i++, y += 14)
|
|
AddTextPrinterParameterized(0, FONT_2, gStorage->displayMonTexts[i], i == 2 ? 10 : 6, y, TEXT_SKIP_DRAW, NULL);
|
|
|
|
AddTextPrinterParameterized(0, FONT_0, gStorage->displayMonTexts[3], 6, y + 2, TEXT_SKIP_DRAW, NULL);
|
|
}
|
|
else
|
|
{
|
|
AddTextPrinterParameterized(0, FONT_0, gStorage->displayMonTexts[3], 6, 0, TEXT_SKIP_DRAW, NULL);
|
|
for (i = 0, y = 15; i < 3; i++, y += 14)
|
|
AddTextPrinterParameterized(0, FONT_2, gStorage->displayMonTexts[i], i == 2 ? 10 : 6, y, TEXT_SKIP_DRAW, NULL);
|
|
}
|
|
|
|
CopyWindowToVram(0, COPYWIN_GFX);
|
|
if (gStorage->displayMonSpecies != SPECIES_NONE)
|
|
{
|
|
UpdateMonMarkingTiles(gStorage->displayMonMarkings, gStorage->markingComboTilesPtr);
|
|
gStorage->markingComboSprite->invisible = FALSE;
|
|
}
|
|
else
|
|
gStorage->markingComboSprite->invisible = TRUE;
|
|
}
|
|
|
|
static void UpdateWaveformAnimation(void)
|
|
{
|
|
u16 i;
|
|
|
|
if (gStorage->displayMonSpecies != SPECIES_NONE)
|
|
{
|
|
TilemapUtil_SetRect(TILEMAP_PKMN_DATA, 0, 0, 8, 2);
|
|
for (i = 0; i < 2; i++)
|
|
StartSpriteAnimIfDifferent(gStorage->waveformSprites[i], i * 2 + 1);
|
|
}
|
|
else
|
|
{
|
|
TilemapUtil_SetRect(TILEMAP_PKMN_DATA, 0, 2, 8, 2);
|
|
for (i = 0; i < 2; i++)
|
|
StartSpriteAnim(gStorage->waveformSprites[i], i * 2);
|
|
}
|
|
|
|
TilemapUtil_Update(TILEMAP_PKMN_DATA);
|
|
ScheduleBgCopyTilemapToVram(1);
|
|
}
|
|
|
|
static void InitSupplementalTilemaps(void)
|
|
{
|
|
LZ77UnCompWram(gPokeStoragePartyMenu_Tilemap, gStorage->partyMenuTilemapBuffer);
|
|
LoadPalette(gPokeStoragePartyMenu_Pal, 0x10, 0x20);
|
|
TilemapUtil_SetTilemap(TILEMAP_PARTY_MENU, 1, gStorage->partyMenuTilemapBuffer, 12, 22);
|
|
TilemapUtil_SetTilemap(TILEMAP_CLOSE_BUTTON, 1, sCloseBoxButton_Tilemap, 9, 4);
|
|
TilemapUtil_SetPos(TILEMAP_PARTY_MENU, 10, 0);
|
|
TilemapUtil_SetPos(TILEMAP_CLOSE_BUTTON, 21, 0);
|
|
SetPartySlotTilemaps();
|
|
if (sInPartyMenu)
|
|
{
|
|
UpdateCloseBoxButtonTilemap(TRUE);
|
|
CreatePartyMonsSprites(TRUE);
|
|
TilemapUtil_Update(TILEMAP_CLOSE_BUTTON);
|
|
TilemapUtil_Update(TILEMAP_PARTY_MENU);
|
|
}
|
|
else
|
|
{
|
|
TilemapUtil_SetRect(TILEMAP_PARTY_MENU, 0, 20, 12, 2);
|
|
UpdateCloseBoxButtonTilemap(TRUE);
|
|
TilemapUtil_Update(TILEMAP_PARTY_MENU);
|
|
TilemapUtil_Update(TILEMAP_CLOSE_BUTTON);
|
|
}
|
|
|
|
ScheduleBgCopyTilemapToVram(1);
|
|
gStorage->closeBoxFlashing = FALSE;
|
|
}
|
|
|
|
static void SetUpShowPartyMenu(void)
|
|
{
|
|
gStorage->partyMenuUnused1 = 20;
|
|
gStorage->partyMenuY = 2;
|
|
gStorage->partyMenuMoveTimer = 0;
|
|
CreatePartyMonsSprites(FALSE);
|
|
}
|
|
|
|
static bool8 ShowPartyMenu(void)
|
|
{
|
|
if (gStorage->partyMenuMoveTimer == 20)
|
|
return FALSE;
|
|
|
|
gStorage->partyMenuUnused1--;
|
|
gStorage->partyMenuY++;
|
|
TilemapUtil_Move(TILEMAP_PARTY_MENU, 3, 1);
|
|
TilemapUtil_Update(TILEMAP_PARTY_MENU);
|
|
ScheduleBgCopyTilemapToVram(1);
|
|
MovePartySprites(8);
|
|
if (++gStorage->partyMenuMoveTimer == 20)
|
|
{
|
|
sInPartyMenu = TRUE;
|
|
return FALSE;
|
|
}
|
|
else
|
|
return TRUE;
|
|
}
|
|
|
|
static void SetUpHidePartyMenu(void)
|
|
{
|
|
gStorage->partyMenuUnused1 = 0;
|
|
gStorage->partyMenuY = 22;
|
|
gStorage->partyMenuMoveTimer = 0;
|
|
if (gStorage->boxOption == OPTION_MOVE_ITEMS)
|
|
MoveHeldItemWithPartyMenu();
|
|
}
|
|
|
|
static bool8 HidePartyMenu(void)
|
|
{
|
|
if (gStorage->partyMenuMoveTimer != 20)
|
|
{
|
|
gStorage->partyMenuUnused1++;
|
|
gStorage->partyMenuY--;
|
|
TilemapUtil_Move(TILEMAP_PARTY_MENU, 3, -1);
|
|
TilemapUtil_Update(TILEMAP_PARTY_MENU);
|
|
FillBgTilemapBufferRect_Palette0(1, 0x100, 10, gStorage->partyMenuY, 12, 1);
|
|
MovePartySprites(-8);
|
|
if (++gStorage->partyMenuMoveTimer != 20)
|
|
{
|
|
ScheduleBgCopyTilemapToVram(1);
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
sInPartyMenu = FALSE;
|
|
DestroyAllPartyMonIcons();
|
|
CompactPartySlots();
|
|
TilemapUtil_SetRect(TILEMAP_CLOSE_BUTTON, 0, 0, 9, 2);
|
|
TilemapUtil_Update(TILEMAP_CLOSE_BUTTON);
|
|
ScheduleBgCopyTilemapToVram(1);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void UpdateCloseBoxButtonTilemap(bool8 normal)
|
|
{
|
|
if (normal)
|
|
TilemapUtil_SetRect(TILEMAP_CLOSE_BUTTON, 0, 0, 9, 2);
|
|
else
|
|
TilemapUtil_SetRect(TILEMAP_CLOSE_BUTTON, 0, 2, 9, 2);
|
|
|
|
TilemapUtil_Update(TILEMAP_CLOSE_BUTTON);
|
|
ScheduleBgCopyTilemapToVram(1);
|
|
}
|
|
|
|
static void StartFlashingCloseBoxButton(void)
|
|
{
|
|
gStorage->closeBoxFlashing = TRUE;
|
|
gStorage->closeBoxFlashTimer = 30;
|
|
gStorage->closeBoxFlashState = TRUE;
|
|
}
|
|
|
|
static void StopFlashingCloseBoxButton(void)
|
|
{
|
|
if (gStorage->closeBoxFlashing)
|
|
{
|
|
gStorage->closeBoxFlashing = FALSE;
|
|
UpdateCloseBoxButtonTilemap(TRUE);
|
|
}
|
|
}
|
|
|
|
static void UpdateCloseBoxButtonFlash(void)
|
|
{
|
|
if (gStorage->closeBoxFlashing && ++gStorage->closeBoxFlashTimer > 30)
|
|
{
|
|
gStorage->closeBoxFlashTimer = 0;
|
|
gStorage->closeBoxFlashState = (gStorage->closeBoxFlashState == FALSE);
|
|
UpdateCloseBoxButtonTilemap(gStorage->closeBoxFlashState);
|
|
}
|
|
}
|
|
|
|
static void SetPartySlotTilemaps(void)
|
|
{
|
|
u8 i;
|
|
|
|
// Skips first party slot, it should always be drawn
|
|
// as if it has a Pokémon in it
|
|
for (i = 1; i < PARTY_SIZE; i++)
|
|
{
|
|
s32 species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES);
|
|
SetPartySlotTilemap(i, (species != SPECIES_NONE));
|
|
}
|
|
}
|
|
|
|
static void SetPartySlotTilemap(u8 pos, bool8 isFilled)
|
|
{
|
|
u16 i, j, index;
|
|
const u16 *tilemap;
|
|
|
|
if (isFilled)
|
|
tilemap = sPartySlotFilled_Tilemap;
|
|
else
|
|
tilemap = sPartySlotEmpty_Tilemap;
|
|
|
|
index = 3 * (3 * (pos - 1) + 1);
|
|
index *= 4;
|
|
index += 7;
|
|
for (i = 0; i < 3; i++)
|
|
{
|
|
for (j = 0; j < 4; j++)
|
|
gStorage->partyMenuTilemapBuffer[index + j] = tilemap[j];
|
|
|
|
tilemap += 4;
|
|
index += 12;
|
|
}
|
|
}
|
|
|
|
static void UpdatePartySlotColors(void)
|
|
{
|
|
SetPartySlotTilemaps();
|
|
TilemapUtil_SetRect(TILEMAP_PARTY_MENU, 0, 0, 12, 22);
|
|
TilemapUtil_Update(TILEMAP_PARTY_MENU);
|
|
ScheduleBgCopyTilemapToVram(1);
|
|
}
|
|
|
|
static void SetUpDoShowPartyMenu(void)
|
|
{
|
|
gStorage->showPartyMenuState = 0;
|
|
PlaySE(SE_WIN_OPEN);
|
|
SetUpShowPartyMenu();
|
|
}
|
|
|
|
static bool8 DoShowPartyMenu(void)
|
|
{
|
|
switch (gStorage->showPartyMenuState)
|
|
{
|
|
case 0:
|
|
if (!ShowPartyMenu())
|
|
{
|
|
SetCursorInParty();
|
|
gStorage->showPartyMenuState++;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (!UpdateCursorPos())
|
|
{
|
|
if (gStorage->setMosaic)
|
|
StartDisplayMonMosaic();
|
|
gStorage->showPartyMenuState++;
|
|
}
|
|
break;
|
|
case 2:
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
static void InitPokeStorageBg0(void)
|
|
{
|
|
SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(29));
|
|
LoadStdWindowGfx(1, 2, 0xD0);
|
|
FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 17);
|
|
CopyBgTilemapBufferToVram(0);
|
|
}
|
|
|
|
static void PrintStorageMessage(u8 id)
|
|
{
|
|
u8 *txtPtr;
|
|
|
|
DynamicPlaceholderTextUtil_Reset();
|
|
switch (sMessages[id].format)
|
|
{
|
|
case MSG_FMT_NONE:
|
|
break;
|
|
case MSG_FMT_MON_NAME_1:
|
|
case MSG_FMT_MON_NAME_2:
|
|
case MSG_FMT_MON_NAME_3:
|
|
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStorage->displayMonNickname);
|
|
break;
|
|
case MSG_FMT_RELEASE_MON_1:
|
|
case MSG_FMT_RELEASE_MON_2:
|
|
case MSG_FMT_RELEASE_MON_3:
|
|
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStorage->releaseMonName);
|
|
break;
|
|
case MSG_FMT_ITEM_NAME:
|
|
if (IsActiveItemMoving())
|
|
txtPtr = StringCopy(gStorage->itemName, GetMovingItemName());
|
|
else
|
|
txtPtr = StringCopy(gStorage->itemName, gStorage->displayMonTexts[3]);
|
|
|
|
while (*(txtPtr - 1) == CHAR_SPACE)
|
|
txtPtr--;
|
|
|
|
*txtPtr = EOS;
|
|
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStorage->itemName);
|
|
break;
|
|
}
|
|
|
|
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStorage->actionText, sMessages[id].text);
|
|
FillWindowPixelBuffer(1, PIXEL_FILL(1));
|
|
AddTextPrinterParameterized(1, FONT_1, gStorage->actionText, 0, 2, TEXT_SKIP_DRAW, NULL);
|
|
DrawTextBorderOuter(1, 2, 13);
|
|
PutWindowTilemap(1);
|
|
CopyWindowToVram(1, COPYWIN_GFX);
|
|
ScheduleBgCopyTilemapToVram(0);
|
|
}
|
|
|
|
static void ShowYesNoWindow(s8 cursorPos)
|
|
{
|
|
CreateYesNoMenu(&sYesNoWindowTemplate, FONT_1, 0, 2, 11, 14, 1);
|
|
Menu_MoveCursorNoWrapAround(cursorPos);
|
|
}
|
|
|
|
static void ClearBottomWindow(void)
|
|
{
|
|
ClearStdWindowAndFrameToTransparent(1, FALSE);
|
|
ScheduleBgCopyTilemapToVram(0);
|
|
}
|
|
|
|
static void AddWallpaperSetsMenu(void)
|
|
{
|
|
InitMenu();
|
|
SetMenuText(MENU_TEXT_SCENERY_1);
|
|
SetMenuText(MENU_TEXT_SCENERY_2);
|
|
SetMenuText(MENU_TEXT_SCENERY_3);
|
|
SetMenuText(MENU_TEXT_ETCETERA);
|
|
AddMenu();
|
|
}
|
|
|
|
static void AddWallpapersMenu(u8 wallpaperSet)
|
|
{
|
|
InitMenu();
|
|
switch (wallpaperSet)
|
|
{
|
|
case 0: // SCENERY_1
|
|
SetMenuText(MENU_TEXT_FOREST);
|
|
SetMenuText(MENU_TEXT_CITY);
|
|
SetMenuText(MENU_TEXT_DESERT);
|
|
SetMenuText(MENU_TEXT_SAVANNA);
|
|
break;
|
|
case 1: // SCENERY_2
|
|
SetMenuText(MENU_TEXT_CRAG);
|
|
SetMenuText(MENU_TEXT_VOLCANO);
|
|
SetMenuText(MENU_TEXT_SNOW);
|
|
SetMenuText(MENU_TEXT_CAVE);
|
|
break;
|
|
case 2: // SCENERY_3
|
|
SetMenuText(MENU_TEXT_BEACH);
|
|
SetMenuText(MENU_TEXT_SEAFLOOR);
|
|
SetMenuText(MENU_TEXT_RIVER);
|
|
SetMenuText(MENU_TEXT_SKY);
|
|
break;
|
|
case 3: // ETCETERA
|
|
SetMenuText(MENU_TEXT_POLKADOT);
|
|
SetMenuText(MENU_TEXT_POKECENTER);
|
|
SetMenuText(MENU_TEXT_MACHINE);
|
|
SetMenuText(MENU_TEXT_SIMPLE);
|
|
break;
|
|
}
|
|
AddMenu();
|
|
}
|
|
|
|
u8 GetCurrentBoxOption(void)
|
|
{
|
|
return sCurrentBoxOption;
|
|
}
|
|
|
|
static void InitCursorItemIcon(void)
|
|
{
|
|
if (!IsCursorOnBoxTitle())
|
|
{
|
|
if (sInPartyMenu)
|
|
TryLoadItemIconAtPos(CURSOR_AREA_IN_PARTY, GetBoxCursorPosition());
|
|
else
|
|
TryLoadItemIconAtPos(CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
|
|
}
|
|
|
|
if (sMovingItemId != ITEM_NONE)
|
|
{
|
|
InitItemIconInCursor(sMovingItemId);
|
|
StartCursorAnim(CURSOR_ANIM_FIST);
|
|
}
|
|
}
|
|
|
|
static void SetPokeStorageQuestLogEvent(u8 action)
|
|
{
|
|
u16 event;
|
|
struct PokeStorageQuestLogData *questLogData;
|
|
u8 box1 = GetMovingMonOriginalBoxId();
|
|
u16 species1 = gStorage->displayMonSpecies;
|
|
u16 species2;
|
|
u8 box2;
|
|
if (sInPartyMenu)
|
|
{
|
|
box2 = TOTAL_BOXES_COUNT;
|
|
species2 = GetMonData(&gPlayerParty[GetBoxCursorPosition()], MON_DATA_SPECIES2);
|
|
}
|
|
else
|
|
{
|
|
box2 = StorageGetCurrentBox();
|
|
species2 = GetCurrentBoxMonData(GetBoxCursorPosition(), MON_DATA_SPECIES2);
|
|
}
|
|
questLogData = &gStorage->pokeStorageQuestLogData;
|
|
|
|
switch (action)
|
|
{
|
|
default:
|
|
return;
|
|
case 0:
|
|
if (sInPartyMenu)
|
|
{
|
|
if (box1 == TOTAL_BOXES_COUNT)
|
|
return;
|
|
else
|
|
event = QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON;
|
|
}
|
|
else
|
|
{
|
|
if (box1 == TOTAL_BOXES_COUNT)
|
|
// Should upmerge but doesn't
|
|
event = QL_EVENT_SWITCHED_PARTY_MON_FOR_PC_MON;
|
|
else
|
|
event = box1 != box2 ? QL_EVENT_SWITCHED_MONS_BETWEEN_BOXES : QL_EVENT_SWITCHED_MONS_WITHIN_BOX;
|
|
}
|
|
questLogData->species1 = species1;
|
|
questLogData->species2 = species2;
|
|
questLogData->box1 = box1;
|
|
questLogData->box2 = box2;
|
|
break;
|
|
case 1:
|
|
questLogData->species1 = species1;
|
|
questLogData->species2 = SPECIES_NONE;
|
|
questLogData->box1 = box1;
|
|
questLogData->box2 = 0xFF;
|
|
if (sInPartyMenu)
|
|
{
|
|
if (box1 == TOTAL_BOXES_COUNT)
|
|
return;
|
|
else
|
|
event = QL_EVENT_WITHDREW_MON_PC;
|
|
}
|
|
else
|
|
{
|
|
if (box1 == TOTAL_BOXES_COUNT)
|
|
{
|
|
event = QL_EVENT_DEPOSITED_MON_PC;
|
|
questLogData->box1 = box2;
|
|
}
|
|
else if (box1 != box2)
|
|
{
|
|
event = QL_EVENT_MOVED_MON_BETWEEN_BOXES;
|
|
questLogData->box2 = box2;
|
|
}
|
|
else
|
|
event = QL_EVENT_MOVED_MON_WITHIN_BOX;
|
|
}
|
|
break;
|
|
case 2:
|
|
event = QL_EVENT_DEPOSITED_MON_PC;
|
|
questLogData->species1 = species1;
|
|
questLogData->species2 = SPECIES_NONE;
|
|
questLogData->box1 = sDepositBoxId;
|
|
questLogData->box2 = 0xFF;
|
|
break;
|
|
case 3:
|
|
event = QL_EVENT_SWITCHED_MULTIPLE_MONS;
|
|
questLogData->species1 = SPECIES_NONE;
|
|
questLogData->species2 = SPECIES_NONE;
|
|
questLogData->box1 = box1;
|
|
questLogData->box2 = box2;
|
|
break;
|
|
}
|
|
SetQuestLogEvent(event, (const u16 *)questLogData);
|
|
}
|
|
|
|
static void UpdateBoxToSendMons(void)
|
|
{
|
|
if (sLastUsedBox != StorageGetCurrentBox())
|
|
{
|
|
FlagClear(FLAG_SHOWN_BOX_WAS_FULL_MESSAGE);
|
|
VarSet(VAR_PC_BOX_TO_SEND_MON, StorageGetCurrentBox());
|
|
}
|
|
}
|