pokeemerald/src/pokemon_storage_system.c

9595 lines
247 KiB
C
Raw Normal View History

#include "global.h"
#include "malloc.h"
#include "bg.h"
2019-04-04 23:53:06 +02:00
#include "data.h"
2018-12-10 23:42:44 +01:00
#include "decompress.h"
2018-12-09 16:44:01 +01:00
#include "dma3.h"
2018-12-12 23:19:50 +01:00
#include "dynamic_placeholder_text_util.h"
2018-11-14 01:01:50 +01:00
#include "event_data.h"
2018-12-08 22:05:11 +01:00
#include "field_screen_effect.h"
#include "field_weather.h"
2018-12-24 00:02:29 +01:00
#include "fldeff_misc.h"
2018-11-14 01:01:50 +01:00
#include "gpu_regs.h"
2018-12-10 23:42:44 +01:00
#include "graphics.h"
#include "international_string_util.h"
2018-12-09 21:06:43 +01:00
#include "item.h"
2018-12-19 22:47:27 +01:00
#include "item_icon.h"
2018-12-09 16:44:01 +01:00
#include "item_menu.h"
2018-12-09 21:06:43 +01:00
#include "mail.h"
2018-11-14 01:01:50 +01:00
#include "main.h"
#include "menu.h"
2018-12-09 16:44:01 +01:00
#include "mon_markings.h"
2018-12-10 21:36:52 +01:00
#include "naming_screen.h"
2018-11-14 01:01:50 +01:00
#include "overworld.h"
#include "palette.h"
2018-12-19 22:47:27 +01:00
#include "pc_screen_effect.h"
2018-11-14 01:01:50 +01:00
#include "pokemon.h"
2018-12-12 23:19:50 +01:00
#include "pokemon_icon.h"
2018-12-10 21:36:52 +01:00
#include "pokemon_summary_screen.h"
2018-11-14 01:01:50 +01:00
#include "pokemon_storage_system.h"
#include "script.h"
#include "sound.h"
2018-11-14 01:01:50 +01:00
#include "string_util.h"
#include "strings.h"
#include "text.h"
2018-12-09 16:44:01 +01:00
#include "text_window.h"
2018-12-15 23:58:47 +01:00
#include "trig.h"
2018-11-14 01:01:50 +01:00
#include "walda_phrase.h"
#include "window.h"
2020-03-09 02:27:29 +01:00
#include "constants/items.h"
2018-12-15 23:58:47 +01:00
#include "constants/maps.h"
#include "constants/moves.h"
2018-12-09 16:44:01 +01:00
#include "constants/rgb.h"
#include "constants/songs.h"
2021-04-15 19:31:18 +02:00
enum {
BOX_OPTION_WITHDRAW,
BOX_OPTION_DEPOSIT,
BOX_OPTION_MOVE_MONS,
BOX_OPTION_MOVE_ITEMS,
BOX_OPTION_EXIT,
};
// IDs for messages to print with PrintMessage
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_FORMAT_NORMAL,
MSG_FORMAT_MON_NAME_1,
MSG_FORMAT_MON_NAME_2, // Unused
MSG_FORMAT_MON_NAME_3, // Unused
MSG_FORMAT_MON_NAME_4,
MSG_FORMAT_MON_NAME_5, // Unused
MSG_FORMAT_MON_NAME_6,
MSG_FORMAT_ITEM_NAME,
};
// IDs for menu selection items. See SetMenuText, HandleMenuInput, etc
enum {
MENU_CANCEL,
MENU_STORE,
MENU_WITHDRAW,
MENU_MOVE,
MENU_SHIFT,
MENU_PLACE,
MENU_SUMMARY,
MENU_RELEASE,
MENU_MARK,
MENU_JUMP,
MENU_WALLPAPER,
MENU_NAME,
MENU_TAKE,
MENU_GIVE,
MENU_GIVE_2,
MENU_SWITCH,
MENU_BAG,
MENU_INFO,
MENU_SCENERY_1,
MENU_SCENERY_2,
MENU_SCENERY_3,
MENU_ETCETERA,
MENU_FRIENDS,
MENU_FOREST,
MENU_CITY,
MENU_DESERT,
MENU_SAVANNA,
MENU_CRAG,
MENU_VOLCANO,
MENU_SNOW,
MENU_CAVE,
MENU_BEACH,
MENU_SEAFLOOR,
MENU_RIVER,
MENU_SKY,
MENU_POLKADOT,
MENU_POKECENTER,
MENU_MACHINE,
MENU_SIMPLE,
};
2021-04-15 20:06:25 +02:00
#define MENU_WALLPAPER_SETS_START MENU_SCENERY_1
2021-04-15 19:31:18 +02:00
#define MENU_WALLPAPERS_START MENU_FOREST
enum {
SCREEN_CHANGE_EXIT_BOX,
SCREEN_CHANGE_SUMMARY_SCREEN,
SCREEN_CHANGE_NAME_BOX,
SCREEN_CHANGE_ITEM_FROM_BAG,
};
enum {
MODE_PARTY,
MODE_BOX,
MODE_MOVE,
};
enum {
FRIENDS_ZIGZAGOON,
FRIENDS_SCREEN,
FRIENDS_HORIZONTAL,
FRIENDS_DIAGONAL,
FRIENDS_BLOCK,
FRIENDS_RIBBON,
FRIENDS_POKECENTER2,
FRIENDS_FRAME,
FRIENDS_BLANK,
FRIENDS_CIRCLES,
FRIENDS_AZUMARILL,
FRIENDS_PIKACHU,
FRIENDS_LEGENDARY,
FRIENDS_DUSCLOPS,
FRIENDS_LUDICOLO,
FRIENDS_WHISCASH,
FRIENDS_WALLPAPERS_COUNT
};
enum {
CURSOR_AREA_IN_BOX,
CURSOR_AREA_IN_PARTY,
CURSOR_AREA_BOX,
CURSOR_AREA_BUTTONS, // Party Pokemon and Close Box
};
#define TAG_PAL_WAVEFORM 0xDACA
#define TAG_PAL_DAC8 0xDAC8
#define TAG_PAL_DAC6 0xDAC6
#define TAG_PAL_DACE 0xDACE
#define TAG_PAL_DAC7 0xDAC7
2021-04-15 20:06:25 +02:00
#define PALTAG_BOX_TITLE 0xDAC9
2021-04-15 19:31:18 +02:00
#define TAG_PAL_DAC0 0xDAC0
#define TAG_PAL_DACB 0xDACB
2021-04-15 20:06:25 +02:00
#define TAG_TILE_0 0
#define TAG_TILE_1 1
#define TAG_TILE_2 2
#define GFXTAG_BOX_TITLE 3
#define GFXTAG_BOX_TITLE_ALT 4
#define TAG_TILE_WAVEFORM 5
#define GFXTAG_ARROW 6
#define TAG_TILE_7 7
#define TAG_TILE_A 10
#define TAG_TILE_D 13
#define TAG_TILE_10 16
#define TAG_TILE_12 18
2021-04-15 19:31:18 +02:00
2021-04-15 20:06:25 +02:00
struct Wallpaper
2018-12-12 23:19:50 +01:00
{
const u32 *tiles;
2021-04-15 20:06:25 +02:00
const u32 *tilemap;
2018-12-12 23:19:50 +01:00
const u16 *palettes;
};
2018-12-19 22:47:27 +01:00
struct PokemonStorageSystemFunc
{
u8 (*func)(void);
s8 unk4;
};
2021-04-15 19:31:18 +02:00
struct StorageMessage
2018-12-19 22:47:27 +01:00
{
const u8 *text;
u8 format;
};
struct StorageMenu
{
const u8 *text;
int textId;
};
struct PSS_MenuStringPtrs
{
const u8 *text;
const u8 *desc;
};
struct UnkStruct_2000028
{
const u8 *unk_00;
u8 *unk_04;
u16 unk_08;
u16 unk_0a;
2018-12-20 22:14:36 +01:00
u16 newField;
2018-12-19 22:47:27 +01:00
void (*unk_0c)(struct UnkStruct_2000028 *data);
};
struct UnkStruct_2000020
{
struct UnkStruct_2000028 *unk_00;
u8 unk_04;
u8 unk_05;
};
struct UnkPSSStruct_2002370
{
struct Sprite *unk_0000;
struct Sprite *unk_0004[4];
u32 unk_0014[3];
2021-04-15 20:06:25 +02:00
struct Sprite *arrowSprites[2];
2018-12-19 22:47:27 +01:00
u8 filler_0028[0x214];
u32 unk_023c;
u16 unk_0240;
u16 unk_0242;
u8 curBox;
u8 unk_0245;
u8 unk_0246;
};
struct UnkStorageStruct
{
struct Sprite *sprite;
u8 *tiles;
u16 palIndex;
u8 unk8;
u8 unk9;
u8 unk10;
};
struct PokemonStorageSystemData
{
u8 state;
u8 boxOption;
u8 screenChangeType;
bool8 isReshowingPSS;
u8 taskId;
struct UnkStruct_2000020 unk_0020;
struct UnkStruct_2000028 unk_0028[8];
u16 field_B0[528 / 2];
u16 field_2C0;
u16 field_2C2;
2020-07-19 03:58:01 +02:00
u8 field_2C4; // Unused
2018-12-19 22:47:27 +01:00
u8 field_2C5;
u8 showPartyMenuState;
u8 unk_02C7;
u8 unk_02C8;
bool8 unk_02C9;
s16 newCurrBoxId;
u16 bg2_X;
2020-07-19 05:08:44 +02:00
s16 wallpaperScrollSpeed;
2018-12-19 22:47:27 +01:00
u16 field_2D0;
2021-04-15 20:06:25 +02:00
u8 wallpaperOffset;
2020-07-19 03:58:01 +02:00
u8 field_2D3; // Written to, but never read.
2021-04-15 20:06:25 +02:00
u8 scrollToBoxIdUnused; // Written to, but never read.
2020-07-19 03:58:01 +02:00
u16 field_2D6; // Written to, but never read.
2021-04-15 20:06:25 +02:00
s16 scrollDirectionUnused; // Written to, but never read.
2020-07-19 03:58:01 +02:00
u16 field_2DA; // Written to, but never read.
u16 field_2DC; // Written to, but never read.
u16 field_2DE; // Written to, but never read.
u16 field_2E0; // Written to, but never read.
2018-12-20 22:14:36 +01:00
u8 filler[22];
2021-04-15 20:06:25 +02:00
u8 boxTitleTiles[1024];
u8 boxTitleCycleId;
u8 wallpaperLoadState; // Written to, but never read.
u8 wallpaperLoadBoxId;
s8 wallpaperLoadDir;
u16 boxTitlePal[16];
u16 boxTitlePalOffset;
u16 boxTitleAltPalOffset;
struct Sprite *curBoxTitleSprites[2];
struct Sprite *nextBoxTitleSprites[2];
struct Sprite *arrowSprites[2];
u32 boxTitlePalBits;
2020-07-19 03:58:01 +02:00
u8 field_73C[80]; // Unused
u16 field_78C; // Written to, but never read.
2018-12-19 22:47:27 +01:00
s16 wallpaperSetId;
s16 wallpaperId;
2021-04-15 20:06:25 +02:00
u16 wallpaperTilemap[360];
2018-12-19 22:47:27 +01:00
u8 wallpaperChangeState;
2021-04-15 20:06:25 +02:00
u8 scrollState;
u8 scrollToBoxId;
s8 scrollDirection;
2018-12-19 22:47:27 +01:00
u8 *wallpaperTiles;
struct Sprite *movingMonSprite;
struct Sprite *partySprites[PARTY_SIZE];
struct Sprite *boxMonsSprites[IN_BOX_COUNT];
struct Sprite **field_B00;
struct Sprite **field_B04;
u16 field_B08[40];
u16 field_B58[40];
u16 boxSpecies[IN_BOX_COUNT];
u32 boxPersonalities[IN_BOX_COUNT];
u8 field_C5C;
u8 field_C5D;
u8 field_C5E;
u16 field_C60;
s16 field_C62;
s16 field_C64;
u16 field_C66;
u8 field_C68;
s8 field_C69;
u8 field_C6A;
2020-07-19 03:58:01 +02:00
u8 field_C6B; // Written to, but never read.
2018-12-19 22:47:27 +01:00
struct WindowTemplate menuWindow;
struct StorageMenu menuItems[7];
u8 menuItemsCount;
u8 menuWidth;
2020-07-19 03:58:01 +02:00
u8 field_CAE; // Written to, but never read.
2021-04-15 19:31:18 +02:00
u16 menuWindowId;
2018-12-19 22:47:27 +01:00
struct Sprite *field_CB4;
struct Sprite *field_CB8;
s32 field_CBC;
s32 field_CC0;
u32 field_CC4;
u32 field_CC8;
s16 field_CCC;
s16 field_CCE;
u16 field_CD0;
s8 field_CD2;
s8 field_CD3;
u8 field_CD4;
u8 field_CD5;
u8 field_CD6;
u8 field_CD7;
u8 field_CD8[2];
const u32 *cursorMonPalette;
u32 cursorMonPersonality;
u16 cursorMonSpecies;
u16 cursorMonItem;
u16 field_CE8;
2018-12-20 22:14:36 +01:00
bool8 setMosaic;
2018-12-19 22:47:27 +01:00
u8 cursorMonMarkings;
u8 cursorMonLevel;
bool8 cursorMonIsEgg;
u8 cursorMonNick[POKEMON_NAME_LENGTH + 1];
u8 cursorMonNickText[36];
u8 cursorMonSpeciesName[36];
u8 cursorMonGenderLvlText[36];
u8 cursorMonItemName[36];
bool8 (*monPlaceChangeFunc)(void);
u8 monPlaceChangeState;
u8 field_D91;
struct Sprite *field_D94;
struct Sprite *field_D98[2];
u16 *field_DA0;
2021-02-28 23:42:11 +01:00
struct MonMarkingsMenu markMenu;
2018-12-19 22:47:27 +01:00
struct UnkPSSStruct_2002370 field_1E5C;
struct Pokemon movingMon;
struct Pokemon field_2108;
s8 field_216C;
u8 field_216D;
s8 field_216E;
s8 field_216F;
s8 field_2170;
s8 field_2171;
u16 field_2172;
u16 field_2174;
2018-12-20 22:14:36 +01:00
u16 field_2176[8];
2018-12-19 22:47:27 +01:00
u8 field_2186;
u8 field_2187;
2020-07-19 05:08:44 +02:00
u8 pokemonSummaryScreenMode;
2018-12-19 22:47:27 +01:00
union
{
struct Pokemon *mon;
struct BoxPokemon *box;
} field_218C;
u8 field_2190[40];
2021-04-15 20:06:25 +02:00
u8 boxTitleText[40];
2018-12-19 22:47:27 +01:00
u8 field_21E0[POKEMON_NAME_LENGTH + 1];
2018-12-20 22:14:36 +01:00
u8 itemName[20];
2018-12-19 22:47:27 +01:00
u8 inBoxMovingMode;
u16 field_2200;
struct UnkStorageStruct field_2204[3];
u16 movingItem;
u16 field_2236;
2020-07-19 03:58:01 +02:00
u8 field_2238; // Unused
2018-12-19 22:47:27 +01:00
u16 field_223A;
u16 *field_223C;
struct Sprite *cursorMonSprite;
2018-12-20 22:14:36 +01:00
u16 field_2244[0x40];
2018-12-19 22:47:27 +01:00
u8 field_22C4[0x800];
2020-07-19 03:58:01 +02:00
u8 field_2AC4[0x1800]; // Unused
2018-12-19 22:47:27 +01:00
u8 field_42C4[0x800];
2021-04-15 20:06:25 +02:00
u8 wallpaperBgTilemapBuffer[0x1000];
2018-12-19 22:47:27 +01:00
u8 field_5AC4[0x800];
};
2018-12-20 22:14:36 +01:00
struct UnkSubStruct_2039D84
{
s16 field_0;
s16 field_2;
u16 field_4;
u16 field_6;
s16 field_8;
s16 field_A;
};
struct UnkStruct_2039D84
{
struct UnkSubStruct_2039D84 field_0[2];
const void *field_18;
const void *field_1C;
u16 field_20;
u16 field_22;
u16 field_24;
u16 field_26;
u16 field_28;
u8 field_2A;
u8 field_2B;
u8 field_2C;
u8 field_2D;
};
// IWRAM bss
static u32 gUnknown_03000F78[98];
2018-12-17 23:00:08 +01:00
// EWRAM DATA
2018-12-20 22:14:36 +01:00
EWRAM_DATA static u8 sPreviousBoxOption = 0;
EWRAM_DATA static struct UnkPSSStruct_2002370 *gUnknown_02039D04 = NULL;
EWRAM_DATA static struct PokemonStorageSystemData *sPSSData = NULL;
EWRAM_DATA static bool8 sInPartyMenu = 0;
EWRAM_DATA static u8 sCurrentBoxOption = 0;
EWRAM_DATA static u8 gUnknown_02039D0E = 0;
EWRAM_DATA static u8 sWhichToReshow = 0;
2019-09-17 07:49:07 +02:00
EWRAM_DATA static u8 sLastUsedBox = 0;
2020-03-08 02:45:04 +01:00
EWRAM_DATA static u16 sMovingItemId = 0;
2018-12-20 22:14:36 +01:00
EWRAM_DATA static struct Pokemon gUnknown_02039D14 = {0};
EWRAM_DATA static s8 sBoxCursorArea = 0;
EWRAM_DATA static s8 sBoxCursorPosition = 0;
EWRAM_DATA static bool8 sIsMonBeingMoved = 0;
EWRAM_DATA static u8 sMovingMonOrigBoxId = 0;
EWRAM_DATA static u8 sMovingMonOrigBoxPos = 0;
EWRAM_DATA static bool8 sCanOnlyMove = 0;
2018-12-09 16:44:01 +01:00
// This file's functions.
2021-04-15 20:06:25 +02:00
static void CreatePCMenu(u8, s16 *);
static void Cb2_EnterPSS(u8);
2018-12-19 22:47:27 +01:00
static u8 GetCurrentBoxOption(void);
2018-12-16 21:10:01 +01:00
static u8 HandleInput(void);
2018-12-19 22:47:27 +01:00
static u8 sub_80CDC2C(void);
static u8 sub_80CB9BC(void);
2021-04-15 20:06:25 +02:00
static void LoadWallpaperGfx(u8, s8);
static void CreateIncomingBoxTitle(u8, s8);
static void StartBoxScrollArrowsSlide(s8);
static void SetCurrentBox(u8);
static void CreateInitBoxTask(u8);
static void sub_80C7958(u8);
static void TrimOldWallpaper(void *);
2018-12-16 21:10:01 +01:00
static void sub_80C7B14(void);
static void sub_80C7BB4(void);
2018-12-19 22:47:27 +01:00
static void ScrollBackground(void);
2018-12-16 21:10:01 +01:00
static void sub_80C7B80(void);
static void sub_80C7BE4(void);
static void sub_80CAA14(void);
static void sub_80CFDC4(void);
static void sub_80CE790(void);
static void sub_80CE8E4(void);
2018-12-19 22:47:27 +01:00
static void GiveChosenBagItem(void);
2018-12-16 21:10:01 +01:00
static void SetUpHidePartyMenu(void);
static void DestroyAllPartyMonIcons(void);
2018-12-19 22:47:27 +01:00
static void sub_80D11CC(void);
static void LoadPSSMenuGfx(void);
static void LoadWaveformSpritePalette(void);
2018-12-16 21:10:01 +01:00
static void sub_80CDC18(void);
static void sub_80CD36C(void);
static void sub_80CD3EC(void);
static void sub_80CAC1C(void);
static void sub_80CEBDC(void);
static void SetScrollingBackground(void);
static void sub_80CABE0(void);
static void sub_80CAEAC(void);
2018-12-19 22:47:27 +01:00
static void sub_80D0C60(void);
static void sub_80CFEA8(void);
2018-12-16 21:10:01 +01:00
static void sub_80CDC0C(void);
static void sub_80CAF04(void);
static void sub_80CA0D8(void);
static void AddMenu(void);
static void sub_80CE250(void);
2018-12-19 22:47:27 +01:00
static void InitCanRelaseMonVars(void);
static void sub_80D01B8(void);
static void ReleaseMon(void);
static void RefreshCursorMonData(void);
static void LoadCursorMonSprite(void);
2018-12-16 21:10:01 +01:00
static void sub_80CA154(void);
static void sub_80CA1C4(void);
static void sub_80CC064(void);
static void sub_80CE324(void);
2018-12-19 22:47:27 +01:00
static void ClearBottomWindow(void);
2018-12-16 21:10:01 +01:00
static void sub_80CA704(void);
2021-04-15 19:31:18 +02:00
static void RemoveMenu(void);
2018-12-16 21:10:01 +01:00
static void sub_80CE00C(void);
2018-12-19 22:47:27 +01:00
static void sub_80D1194(void);
2018-12-16 21:10:01 +01:00
static void PrintCursorMonInfo(void);
static void sub_80CA65C(void);
static void AddWallpaperSetsMenu(void);
2021-04-15 20:06:25 +02:00
static void CreateBoxScrollArrows(void);
2018-12-16 21:10:01 +01:00
static void InitMenu(void);
2021-04-15 20:06:25 +02:00
static void StopBoxScrollArrowsSlide(void);
2018-12-19 22:47:27 +01:00
static void sub_80CFC14(void);
2018-12-16 21:10:01 +01:00
static void sub_80CEB40(void);
2021-04-15 20:06:25 +02:00
static void CycleBoxTitleSprites(void);
2018-12-19 22:47:27 +01:00
static void sub_80D1818(void);
2021-04-15 20:06:25 +02:00
static void sub_80D19B4(u32);
2018-12-16 21:10:01 +01:00
static void sub_80CAA74(void);
2018-12-19 22:47:27 +01:00
static void PrintItemDescription(void);
2018-12-16 21:10:01 +01:00
static void sub_80CE760(void);
static void sub_80CDBA0(void);
static void sub_80CE7E8(void);
2018-12-19 22:47:27 +01:00
static void sub_80CFECC(void);
2018-12-16 21:10:01 +01:00
static void sub_80CA9EC(void);
2018-12-19 22:47:27 +01:00
static void FreePSSData(void);
2018-12-16 21:10:01 +01:00
static void AddBoxMenu(void);
2021-04-15 20:06:25 +02:00
static void CycleBoxTitleColor(void);
2018-12-19 22:47:27 +01:00
static void MoveMon(void);
static void PlaceMon(void);
2018-12-16 21:10:01 +01:00
static void sub_80CAB20(void);
static void sub_80CE22C(void);
static void sub_80CDA68(void);
static void sub_80CB950(void);
static void sub_80CA9C0(void);
static void SetUpDoShowPartyMenu(void);
2018-12-19 22:47:27 +01:00
static void BoxSetMosaic(void);
2021-04-15 20:06:25 +02:00
static void SpriteCB_JumpBoxArrow(struct Sprite *);
static void sub_80CC100(struct Sprite *);
static void sub_80CB278(struct Sprite *);
static void SpriteCB_Arrow(struct Sprite *);
2018-12-19 22:47:27 +01:00
static bool32 WaitForWallpaperGfxLoad(void);
static bool8 InitPSSWindows(void);
2018-12-16 21:10:01 +01:00
static bool8 sub_80CC0A0(void);
static bool8 sub_80CE2A8(void);
2018-12-19 22:47:27 +01:00
static bool8 sub_80D0164(void);
2021-04-15 20:06:25 +02:00
static bool8 IsInitBoxActive(void);
2018-12-19 22:47:27 +01:00
static bool8 sub_80D01E4(void);
2018-12-16 21:10:01 +01:00
static bool8 sub_80CDED4(void);
static bool8 sub_80CDF08(void);
2018-12-19 22:47:27 +01:00
static bool8 sub_80D184C(void);
static bool8 sub_80D18E4(void);
2018-12-16 21:10:01 +01:00
static bool8 DoShowPartyMenu(void);
2018-12-19 22:47:27 +01:00
static bool8 sub_80D1218(void);
static bool8 ScrollToBox(void);
static bool8 sub_80CD554(void);
2018-12-16 21:10:01 +01:00
static bool8 HidePartyMenu(void);
2018-12-19 22:47:27 +01:00
static bool8 IsActiveItemMoving(void);
static bool8 sub_80D0580(u8 arg0);
static bool8 sub_80D0BC0(void);
2018-12-16 21:10:01 +01:00
static bool8 sub_80CA2B8(void);
static bool8 DoWallpaperGfxChange(void);
2018-12-19 22:47:27 +01:00
static bool8 DoMonPlaceChange(void);
2021-04-15 20:06:25 +02:00
static bool8 IsMenuLoading(void);
2018-12-16 21:10:01 +01:00
static bool8 CanMovePartyMon(void);
2018-12-22 23:00:22 +01:00
static bool8 CanShiftMon(void);
2018-12-16 21:10:01 +01:00
static bool8 IsCursorOnCloseBox(void);
static bool8 IsCursorOnBox(void);
static bool8 IsCursorInBox(void);
static bool8 IsMonBeingMoved(void);
2021-04-15 20:06:25 +02:00
static bool8 TryStorePartyMonInBox(u8);
2018-12-16 21:10:01 +01:00
static void Cb_InitPSS(u8 taskId);
static void Cb_PlaceMon(u8 taskId);
static void Cb_ChangeScreen(u8 taskId);
static void Cb_ShowPSS(u8 taskId);
static void Cb_OnBPressed(u8 taskId);
static void Cb_HandleBoxOptions(u8 taskId);
static void Cb_OnSelectedMon(u8 taskId);
static void Cb_OnCloseBoxPressed(u8 taskId);
static void Cb_HidePartyPokemon(u8 taskId);
static void Cb_DepositMenu(u8 taskId);
static void Cb_MoveMon(u8 taskId);
static void Cb_GiveMovingItemToMon(u8 taskId);
static void Cb_SwitchSelectedItem(u8 taskId);
static void Cb_TakeItemForMoving(u8 taskId);
static void Cb_WithdrawMon(u8 taskId);
static void Cb_ShiftMon(u8 taskId);
static void Cb_ShowPartyPokemon(u8 taskId);
static void Cb_ShowItemInfo(u8 taskId);
static void Cb_GiveItemFromBag(u8 taskId);
static void Cb_ItemToBag(u8 taskId);
static void Cb_TakeItemForMoving(u8 taskId);
static void Cb_ShowMarkMenu(u8 taskId);
static void Cb_ShowMonSummary(u8 taskId);
static void Cb_ReleaseMon(u8 taskId);
static void Cb_ReshowPSS(u8 taskId);
static void Cb_MainPSS(u8 taskId);
static void Cb_JumpBox(u8 taskId);
static void Cb_HandleWallpapers(u8 taskId);
static void Cb_NameBox(u8 taskId);
static void Cb_PrintCantStoreMail(u8 taskId);
static void Cb_HandleMovingMonFromParty(u8 taskId);
2021-04-15 20:06:25 +02:00
static void SetUpScrollToBox(u8);
static void sub_80CFE54(u8);
static void SetMovingMonPriority(u8);
static void InitMonPlaceChange(u8);
static void SetMonMarkings(u8);
static void ShowYesNoWindow(s8);
static void sub_80CDBF8(u8);
static void sub_80D01D0(u8);
static void AnimateBoxScrollArrows(bool8);
static void sub_80CA984(bool8);
static void CreatePartyMonsSprites(bool8);
2021-04-15 19:31:18 +02:00
static void PrintMessage(u8 id);
static s16 HandleMenuInput(void);
2018-12-19 22:47:27 +01:00
static s8 RunCanReleaseMon(void);
static u8 GetBoxCursorPosition(void);
2021-04-15 20:06:25 +02:00
static void Item_FromMonToMoving(u8, u8);
static void Item_GiveMovingToMon(u8, u8);
static void Item_TakeMons(u8, u8);
static void Item_SwitchMonsWithMoving(u8, u8);
static struct Sprite *CreateJumpBoxArrows(u16, u16, u8, u8, u8);
static void SetWallpaperForCurrentBox(u8);
static void AddWallpapersMenu(u8);
2018-12-19 22:47:27 +01:00
static u16 GetMovingItem(void);
static void LoadCursorMonGfx(u16 species, u32 pid);
2018-12-16 21:10:01 +01:00
static void sub_80CA2D0(struct Sprite *sprite);
2021-04-15 20:06:25 +02:00
static void SpriteCB_OutgoingBoxTitle(struct Sprite *);
2018-12-16 21:10:01 +01:00
static void sub_80CBA3C(struct Sprite *sprite);
2021-04-15 20:06:25 +02:00
static void SpriteCB_IncomingBoxTitle(struct Sprite *);
2018-12-16 21:10:01 +01:00
static void sub_80CBAF0(s16 yDelta);
static void sub_80CAAA8(u8 arg0, bool8 isPartyMon);
2018-12-19 22:47:27 +01:00
static const u8 *GetMovingItemName(void);
2018-12-16 21:10:01 +01:00
static void SetMenuText(u8 textId);
2018-12-19 22:47:27 +01:00
static void sub_80D0D8C(u8 cursorArea, u8 cursorPos);
static void sub_80D0E50(u8 cursorArea, u8 cursorPos);
static void sub_80D0F38(u16 item);
2018-12-15 23:58:47 +01:00
static struct Sprite *CreateMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 oamPriority, u8 subpriority);
2018-12-16 21:10:01 +01:00
static void DestroyBoxMonIcon(struct Sprite *sprite);
2021-04-15 20:06:25 +02:00
static void SetBoxSpeciesAndPersonalities(u8);
static void sub_80CB9D0(struct Sprite *, u16);
static void Task_InitBox(u8 taskId);
static void InitBoxTitle(u8 boxId);
2020-07-19 03:58:01 +02:00
static s8 DetermineBoxScrollDirection(u8 boxId);
2021-04-15 20:06:25 +02:00
static void DrawWallpaper(const void *, s8, u8);
static s16 GetBoxTitleBaseX(const u8 *);
2018-12-16 21:10:01 +01:00
static bool8 MonPlaceChange_Shift(void);
static bool8 MonPlaceChange_Move(void);
static bool8 MonPlaceChange_Place(void);
static bool8 sub_80CDEC4(void);
static bool8 sub_80CDEB4(void);
2018-12-19 22:47:27 +01:00
static void sub_80CD444(u8 cursorArea, u8 cursorPosition, u16 *x, u16 *y);
2018-12-16 21:10:01 +01:00
static void SetShiftedMonData(u8 boxId, u8 position);
static void SetMovedMonData(u8 boxId, u8 position);
static void SetPlacedMonData(u8 boxId, u8 position);
2018-12-19 22:47:27 +01:00
static void PurgeMonOrBoxMon(u8 boxId, u8 position);
2018-12-16 21:10:01 +01:00
static void SetCursorMonData(void *pokemon, u8 mode);
2018-12-19 22:47:27 +01:00
static bool32 AtLeastThreeUsableMons(void);
2018-12-16 21:10:01 +01:00
static u8 InBoxInput_Normal(void);
static u8 InBoxInput_MovingMultiple(void);
static u8 InBoxInput_GrabbingMultiple(void);
2021-04-15 19:31:18 +02:00
static s8 GetMenuItemTextId(u8);
2018-12-19 22:47:27 +01:00
static u8 sub_80CFA5C(void);
static u8 sub_80D0BA4(void);
2018-12-16 21:10:01 +01:00
static bool8 sub_80CFA84(void);
static bool8 sub_80CFB44(void);
2018-12-19 22:47:27 +01:00
static bool8 sub_80D024C(void);
static bool8 sub_80D0344(void);
static bool8 sub_80D03B0(void);
static bool8 sub_80D0420(void);
static bool8 sub_80D04A0(void);
static bool8 sub_80D04C8(void);
static void sub_80D07B0(u8 arg0, u8 arg1);
static void sub_80D0834(u8 arg0, u8 arg1);
static void sub_80D0B5C(void);
static void sub_80D062C(void);
static void sub_80D0884(u16 arg0, u16 arg1, u16 arg2);
static void sub_80D08CC(void);
static void sub_80D09A4(void);
static void sub_80D0A1C(void);
static void sub_80D0AAC(void);
static u8 sub_80D0894(void);
static void sub_80D0778(u8 arg0, u8 arg1, u8 arg2);
static void sub_80D0708(u8 arg0, u8 arg1, u8 arg2);
static void sub_80D06D0(u8 arg0, u8 arg1, u8 arg2);
static void sub_80D0740(u8 arg0, u8 arg1, u8 arg2);
2018-12-20 22:14:36 +01:00
static void sub_80D27AC(u8 id, u16 arg1, u16 arg2, u16 arg3, u16 arg4);
static void sub_80D27F4(u8 id, u8 arg1, s8 arg2);
static void sub_80D2644(u8 id, u8 bg, const void *arg2, u16 arg3, u16 arg4);
static void sub_80D2770(u8 id, u16 arg1, u16 arg2);
static void sub_80D259C(u8 count);
static void sub_80D25F0(void);
static void sub_80D2918(u8 id);
static void sub_80D2960(u8 id);
static void sub_80D29F8(u8 id);
static void sub_80D2A90(struct UnkStruct_2000020 *arg0, struct UnkStruct_2000028 *arg1, u32 arg2);
static void sub_80D2AA4(void);
static void sub_80D2B88(struct UnkStruct_2000028 *unkStruct);
static void sub_80D2C1C(struct UnkStruct_2000028 *unkStruct);
2021-04-15 20:06:25 +02:00
static u8 GetBoxWallpaper(u8);
static void SetBoxWallpaper(u8, u8);
2018-12-16 21:10:01 +01:00
// static const rom data
static const struct PSS_MenuStringPtrs gUnknown_085716C0[] =
2017-12-22 20:10:51 +01:00
{
{gText_WithdrawPokemon, gText_WithdrawMonDescription},
{gText_DepositPokemon, gText_DepositMonDescription},
{gText_MovePokemon, gText_MoveMonDescription},
{gText_MoveItems, gText_MoveItemsDescription},
{gText_SeeYa, gText_SeeYaDescription}
};
2018-12-16 21:10:01 +01:00
static const struct WindowTemplate gUnknown_085716E8 =
2018-12-09 16:44:01 +01:00
{
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 1,
.width = 17,
.height = 10,
.paletteNum = 15,
.baseBlock = 0x1,
};
2017-12-22 20:10:51 +01:00
2018-12-16 21:10:01 +01:00
static const union AnimCmd sSpriteAnim_85716F0[] =
2017-12-22 20:10:51 +01:00
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_END
};
2018-12-16 21:10:01 +01:00
static const union AnimCmd sSpriteAnim_85716F8[] =
2017-12-22 20:10:51 +01:00
{
ANIMCMD_FRAME(4, 5),
ANIMCMD_END
};
2018-12-16 21:10:01 +01:00
static const union AnimCmd sSpriteAnim_8571700[] =
2017-12-22 20:10:51 +01:00
{
ANIMCMD_FRAME(6, 5),
ANIMCMD_END
};
2018-12-16 21:10:01 +01:00
static const union AnimCmd sSpriteAnim_8571708[] =
2017-12-22 20:10:51 +01:00
{
ANIMCMD_FRAME(10, 5),
ANIMCMD_END
};
2018-12-16 21:10:01 +01:00
static const union AnimCmd *const sSpriteAnimTable_8571710[] =
2017-12-22 20:10:51 +01:00
{
sSpriteAnim_85716F0,
sSpriteAnim_85716F8,
sSpriteAnim_8571700,
sSpriteAnim_8571708
};
2018-12-16 21:10:01 +01:00
static const union AffineAnimCmd sSpriteAffineAnim_8571720[] =
2017-12-22 20:10:51 +01:00
{
AFFINEANIMCMD_FRAME(0xE0, 0xE0, 0, 0),
AFFINEANIMCMD_END
};
2018-12-16 21:10:01 +01:00
static const union AffineAnimCmd *const sSpriteAffineAnimTable_8571730[] =
2017-12-22 20:10:51 +01:00
{
sSpriteAffineAnim_8571720
};
2019-12-10 19:48:20 +01:00
static const u8 sBoxInfoTextColors[] = {TEXT_COLOR_RED, TEXT_DYNAMIC_COLOR_6, TEXT_DYNAMIC_COLOR_5};
static const u8 sText_OutOf30[] = _("/30");
2017-12-22 20:10:51 +01:00
2018-12-16 21:10:01 +01:00
static const u16 gBoxSelectionPopupPalette[] = INCBIN_U16("graphics/unknown/unknown_57173C.gbapal");
static const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp");
static const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp");
static const u32 gPokemonStorageScrollingBGTileset[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.4bpp.lz");
static const u32 gPokemonStorageScrollingBGTilemap[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.bin.lz");
static const u32 gUnknown_08572280[] = INCBIN_U32("graphics/unknown/unknown_572280.gbapal");
static const u32 gUnknown_085722A0[] = INCBIN_U32("graphics/unknown/unknown_5722A0.bin.lz");
2018-12-09 16:44:01 +01:00
2018-12-16 21:10:01 +01:00
static const u16 gUnknown_0857239C[] =
2018-12-09 16:44:01 +01:00
{
0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118,
0x2101, 0x2102, 0x2103, 0x2104, 0x2105, 0x2106, 0x2107, 0x2108, 0x2111, 0x2112, 0x2113, 0x2114, 0x2115, 0x2116, 0x2117, 0x2118,
};
2018-12-16 21:10:01 +01:00
static const u16 gUnknown_085723DC[] = INCBIN_U16("graphics/unknown/unknown_5723DC.gbapal"); // Left-most part and Close Box.
static const u16 gUnknown_085723FC[] = INCBIN_U16("graphics/unknown/unknown_5723FC.gbapal");
static const u16 gUnknown_0857241C[] = INCBIN_U16("graphics/unknown/unknown_57241C.gbapal");
static const u16 gUnknown_0857243C[] = INCBIN_U16("graphics/unknown/unknown_57243C.gbapal");
2018-12-09 16:44:01 +01:00
2018-12-16 21:10:01 +01:00
static const u16 gUnknown_0857245C[] =
2018-12-09 16:44:01 +01:00
{
0x014c, 0x014d, 0x014e, 0x014f, 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x015c, 0x015d, 0x015e, 0x015f, 0x0180, 0x0181, 0x0182,
2018-12-21 22:35:01 +01:00
0x0183, 0x0184, 0x0175, 0x0176, 0x0177, 0x0178, 0x0179, 0x017a, 0x017b, 0x017c, 0x017d, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189,
0x018a, 0x018b, 0x018c, 0x018d
2018-12-09 16:44:01 +01:00
};
2018-12-16 21:10:01 +01:00
static const u16 gUnknown_085724A4[] =
2018-12-09 16:44:01 +01:00
{
0x1140, 0x1141, 0x1141, 0x1142, 0x1150, 0x1151, 0x1151, 0x1152, 0x1160, 0x1161, 0x1161, 0x1162,
};
2018-12-16 21:10:01 +01:00
static const u16 gUnknown_085724BC[] =
2018-12-09 16:44:01 +01:00
{
0x1143, 0x1144, 0x1144, 0x1145, 0x1153, 0x1154, 0x1154, 0x1155, 0x1163, 0x1164, 0x1164, 0x1165,
};
2018-12-16 21:10:01 +01:00
static const u16 gWaveformPalette[] = INCBIN_U16("graphics/pokemon_storage/waveform.gbapal");
static const u32 gWaveformTiles[] = INCBIN_U32("graphics/pokemon_storage/waveform.4bpp");
static const u32 gUnknown_085726B4[] = INCBIN_U32("graphics/unused/unknown_5726B4.gbapal");
static const u32 gUnknown_085726F4[] = INCBIN_U32("graphics/unknown/unknown_5726F4.gbapal");
2018-12-09 16:44:01 +01:00
2018-12-16 21:10:01 +01:00
static const struct WindowTemplate gUnknown_08572714[] =
2018-12-09 16:44:01 +01:00
{
{ // 0
.bg = 1,
.tilemapLeft = 0,
.tilemapTop = 11,
.width = 9,
.height = 7,
.paletteNum = 3,
.baseBlock = 0xC0,
},
{ // 1
.bg = 0,
.tilemapLeft = 11,
.tilemapTop = 17,
.width = 18,
.height = 2,
.paletteNum = 15,
.baseBlock = 0x14,
},
{ // 2
.bg = 0,
.tilemapLeft = 0,
.tilemapTop = 13,
.width = 21,
.height = 7,
.paletteNum = 15,
.baseBlock = 0x14,
},
DUMMY_WIN_TEMPLATE
};
2018-12-16 21:10:01 +01:00
static const struct BgTemplate gUnknown_08572734[] =
2018-12-09 16:44:01 +01:00
{
{
.bg = 0,
.charBaseIndex = 0,
.mapBaseIndex = 29,
.screenSize = 0,
.paletteMode = 0,
.priority = 0,
.baseTile = 0
},
{
.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 = 0
},
{
.bg = 3,
.charBaseIndex = 3,
.mapBaseIndex = 31,
.screenSize = 0,
.paletteMode = 0,
.priority = 3,
.baseTile = 0
},
};
2018-12-16 21:10:01 +01:00
static const struct SpritePalette gWaveformSpritePalette =
2018-12-09 16:44:01 +01:00
{
2018-12-10 23:42:44 +01:00
gWaveformPalette, TAG_PAL_WAVEFORM
2018-12-09 16:44:01 +01:00
};
2018-12-16 21:10:01 +01:00
static const struct SpriteSheet gWaveformSpriteSheet =
2018-12-09 16:44:01 +01:00
{
2018-12-10 23:42:44 +01:00
gWaveformTiles, sizeof(gWaveformTiles), TAG_TILE_WAVEFORM
2018-12-09 16:44:01 +01:00
};
2018-12-16 21:10:01 +01:00
static const struct OamData sOamData_857286C;
static const struct SpriteTemplate sSpriteTemplate_CursorMon =
2018-12-09 16:44:01 +01:00
{
2018-12-10 23:42:44 +01:00
.tileTag = TAG_TILE_2,
.paletteTag = TAG_PAL_DAC6,
.oam = &sOamData_857286C,
2018-12-09 16:44:01 +01:00
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
2021-04-15 19:31:18 +02:00
static const struct StorageMessage sMessages[] =
{
[MSG_EXIT_BOX] = {gText_ExitFromBox, MSG_FORMAT_NORMAL},
[MSG_WHAT_YOU_DO] = {gText_WhatDoYouWantToDo, MSG_FORMAT_NORMAL},
[MSG_PICK_A_THEME] = {gText_PleasePickATheme, MSG_FORMAT_NORMAL},
[MSG_PICK_A_WALLPAPER] = {gText_PickTheWallpaper, MSG_FORMAT_NORMAL},
[MSG_IS_SELECTED] = {gText_PkmnIsSelected, MSG_FORMAT_MON_NAME_1},
[MSG_JUMP_TO_WHICH_BOX] = {gText_JumpToWhichBox, MSG_FORMAT_NORMAL},
[MSG_DEPOSIT_IN_WHICH_BOX] = {gText_DepositInWhichBox, MSG_FORMAT_NORMAL},
[MSG_WAS_DEPOSITED] = {gText_PkmnWasDeposited, MSG_FORMAT_MON_NAME_1},
[MSG_BOX_IS_FULL] = {gText_BoxIsFull2, MSG_FORMAT_NORMAL},
[MSG_RELEASE_POKE] = {gText_ReleaseThisPokemon, MSG_FORMAT_NORMAL},
[MSG_WAS_RELEASED] = {gText_PkmnWasReleased, MSG_FORMAT_MON_NAME_4},
[MSG_BYE_BYE] = {gText_ByeByePkmn, MSG_FORMAT_MON_NAME_6},
[MSG_MARK_POKE] = {gText_MarkYourPkmn, MSG_FORMAT_NORMAL},
[MSG_LAST_POKE] = {gText_ThatsYourLastPkmn, MSG_FORMAT_NORMAL},
[MSG_PARTY_FULL] = {gText_YourPartysFull, MSG_FORMAT_NORMAL},
[MSG_HOLDING_POKE] = {gText_YoureHoldingAPkmn, MSG_FORMAT_NORMAL},
[MSG_WHICH_ONE_WILL_TAKE] = {gText_WhichOneWillYouTake, MSG_FORMAT_NORMAL},
[MSG_CANT_RELEASE_EGG] = {gText_YouCantReleaseAnEgg, MSG_FORMAT_NORMAL},
[MSG_CONTINUE_BOX] = {gText_ContinueBoxOperations, MSG_FORMAT_NORMAL},
[MSG_CAME_BACK] = {gText_PkmnCameBack, MSG_FORMAT_MON_NAME_1},
[MSG_WORRIED] = {gText_WasItWorriedAboutYou, MSG_FORMAT_NORMAL},
[MSG_SURPRISE] = {gText_FourEllipsesExclamation, MSG_FORMAT_NORMAL},
[MSG_PLEASE_REMOVE_MAIL] = {gText_PleaseRemoveTheMail, MSG_FORMAT_NORMAL},
[MSG_IS_SELECTED2] = {gText_PkmnIsSelected, MSG_FORMAT_ITEM_NAME},
[MSG_GIVE_TO_MON] = {gText_GiveToAPkmn, MSG_FORMAT_NORMAL},
[MSG_PLACED_IN_BAG] = {gText_PlacedItemInBag, MSG_FORMAT_ITEM_NAME},
[MSG_BAG_FULL] = {gText_BagIsFull2, MSG_FORMAT_NORMAL},
[MSG_PUT_IN_BAG] = {gText_PutItemInBag, MSG_FORMAT_NORMAL},
[MSG_ITEM_IS_HELD] = {gText_ItemIsNowHeld, MSG_FORMAT_ITEM_NAME},
[MSG_CHANGED_TO_ITEM] = {gText_ChangedToNewItem, MSG_FORMAT_ITEM_NAME},
[MSG_CANT_STORE_MAIL] = {gText_MailCantBeStored, MSG_FORMAT_NORMAL},
2018-12-09 16:44:01 +01:00
};
2018-12-16 21:10:01 +01:00
static const struct WindowTemplate sYesNoWindowTemplate =
2018-12-10 23:42:44 +01:00
{
.bg = 0,
.tilemapLeft = 24,
.tilemapTop = 11,
.width = 5,
.height = 4,
.paletteNum = 15,
.baseBlock = 0x5C,
};
2018-12-16 21:10:01 +01:00
static const struct OamData sOamData_857286C =
2018-12-10 23:42:44 +01:00
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
2018-12-10 23:42:44 +01:00
.mosaic = 0,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(64x64),
2018-12-10 23:42:44 +01:00
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(64x64),
2018-12-10 23:42:44 +01:00
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0
};
2018-12-16 21:10:01 +01:00
static const struct OamData sOamData_8572874 =
2018-12-10 23:42:44 +01:00
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
2018-12-10 23:42:44 +01:00
.mosaic = 0,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(16x8),
2018-12-10 23:42:44 +01:00
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(16x8),
2018-12-10 23:42:44 +01:00
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0
};
2018-12-16 21:10:01 +01:00
static const union AnimCmd sSpriteAnim_857287C[] =
2018-12-10 23:42:44 +01:00
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_END
};
2018-12-16 21:10:01 +01:00
static const union AnimCmd sSpriteAnim_8572884[] =
2018-12-10 23:42:44 +01:00
{
ANIMCMD_FRAME(2, 8),
ANIMCMD_FRAME(4, 8),
ANIMCMD_FRAME(6, 8),
ANIMCMD_JUMP(0)
};
2018-12-16 21:10:01 +01:00
static const union AnimCmd sSpriteAnim_8572894[] =
2018-12-10 23:42:44 +01:00
{
ANIMCMD_FRAME(8, 5),
ANIMCMD_END
};
2018-12-16 21:10:01 +01:00
static const union AnimCmd sSpriteAnim_857289C[] =
2018-12-10 23:42:44 +01:00
{
ANIMCMD_FRAME(10, 8),
ANIMCMD_FRAME(4, 8),
ANIMCMD_FRAME(12, 8),
ANIMCMD_JUMP(0)
};
2018-12-16 21:10:01 +01:00
static const union AnimCmd *const sSpriteAnimTable_85728AC[] =
2018-12-10 23:42:44 +01:00
{
sSpriteAnim_857287C,
sSpriteAnim_8572884,
sSpriteAnim_8572894,
sSpriteAnim_857289C
};
2018-12-21 22:35:01 +01:00
static const struct SpriteTemplate sSpriteTemplate_Waveform =
2018-12-10 23:42:44 +01:00
{
2018-12-21 22:35:01 +01:00
.tileTag = TAG_TILE_WAVEFORM,
.paletteTag = TAG_PAL_WAVEFORM,
2018-12-10 23:42:44 +01:00
.oam = &sOamData_8572874,
.anims = sSpriteAnimTable_85728AC,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
2018-12-16 21:10:01 +01:00
static const struct OamData sOamData_85728EC;
static const struct SpriteTemplate gUnknown_085728D4 =
2018-12-10 23:42:44 +01:00
{
2018-12-21 22:35:01 +01:00
.tileTag = TAG_TILE_12,
.paletteTag = TAG_PAL_DAC0,
2018-12-10 23:42:44 +01:00
.oam = &sOamData_85728EC,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
2018-12-16 21:10:01 +01:00
static const struct OamData sOamData_85728EC =
2018-12-10 23:42:44 +01:00
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
2018-12-10 23:42:44 +01:00
.mosaic = 0,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(32x32),
2018-12-10 23:42:44 +01:00
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(32x32),
2018-12-10 23:42:44 +01:00
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0
};
2018-12-16 21:10:01 +01:00
static const union AffineAnimCmd gSpriteAffineAnim_85728F4[] =
2018-12-10 23:42:44 +01:00
{
AFFINEANIMCMD_FRAME(-2, -2, 0, 120),
AFFINEANIMCMD_END
};
2018-12-16 21:10:01 +01:00
static const union AffineAnimCmd gSpriteAffineAnim_8572904[] =
2018-12-10 23:42:44 +01:00
{
AFFINEANIMCMD_FRAME(16, 16, 0, 0),
AFFINEANIMCMD_FRAME(16, 16, 0, 15),
AFFINEANIMCMD_END
};
2018-12-16 21:10:01 +01:00
static const union AffineAnimCmd *const gSpriteAffineAnimTable_857291C[] =
2018-12-10 23:42:44 +01:00
{
gSpriteAffineAnim_85728F4,
gSpriteAffineAnim_8572904
};
2021-04-15 20:06:25 +02:00
#include "data/wallpapers.h"
2018-12-15 23:58:47 +01:00
// Unknown Unused data.
2018-12-16 21:10:01 +01:00
static const u16 gUnknown_0857B07C = 0x23BA;
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
static const struct SpriteSheet sSpriteSheet_Arrow = {sArrow_Gfx, 0x80, GFXTAG_ARROW};
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
static const struct OamData sOamData_BoxTitle =
2018-12-15 23:58:47 +01:00
{
.shape = SPRITE_SHAPE(32x16),
.size = SPRITE_SIZE(32x16),
2018-12-15 23:58:47 +01:00
.priority = 2
};
2021-04-15 20:06:25 +02:00
static const union AnimCmd sAnim_BoxTitle_Left[] =
2018-12-15 23:58:47 +01:00
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_END
};
2021-04-15 20:06:25 +02:00
static const union AnimCmd sAnim_BoxTitle_Right[] =
2018-12-15 23:58:47 +01:00
{
ANIMCMD_FRAME(8, 5),
ANIMCMD_END
};
2021-04-15 20:06:25 +02:00
static const union AnimCmd *const sAnims_BoxTitle[] =
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
sAnim_BoxTitle_Left,
sAnim_BoxTitle_Right
2018-12-15 23:58:47 +01:00
};
2021-04-15 20:06:25 +02:00
static const struct SpriteTemplate sSpriteTemplate_BoxTitle =
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
.tileTag = GFXTAG_BOX_TITLE,
.paletteTag = PALTAG_BOX_TITLE,
.oam = &sOamData_BoxTitle,
.anims = sAnims_BoxTitle,
.images NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
2018-12-15 23:58:47 +01:00
};
2021-04-15 20:06:25 +02:00
static const struct OamData sOamData_Arrow =
2018-12-15 23:58:47 +01:00
{
.shape = SPRITE_SHAPE(8x16),
.size = SPRITE_SIZE(8x16),
2018-12-15 23:58:47 +01:00
.priority = 2
};
2021-04-15 20:06:25 +02:00
static const union AnimCmd sAnim_Arrow_Left[] =
2018-12-15 23:58:47 +01:00
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_END
};
2021-04-15 20:06:25 +02:00
static const union AnimCmd sAnim_Arrow_Right[] =
2018-12-15 23:58:47 +01:00
{
ANIMCMD_FRAME(2, 5),
ANIMCMD_END
};
2021-04-15 20:06:25 +02:00
static const union AnimCmd *const sAnims_Arrow[] =
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
sAnim_Arrow_Left,
sAnim_Arrow_Right
2018-12-15 23:58:47 +01:00
};
2021-04-15 20:06:25 +02:00
static const struct SpriteTemplate sSpriteTemplate_Arrow =
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
.tileTag = GFXTAG_ARROW,
.paletteTag = TAG_PAL_WAVEFORM,
.oam = &sOamData_Arrow,
.anims = sAnims_Arrow,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_Arrow
2018-12-15 23:58:47 +01:00
};
2018-12-19 22:47:27 +01:00
static const u16 gHandCursorPalette[] = INCBIN_U16("graphics/pokemon_storage/hand_cursor.gbapal");
static const u8 gHandCursorTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor.4bpp");
static const u8 gHandCursorShadowTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor_shadow.4bpp");
2018-12-15 23:58:47 +01:00
2017-12-22 20:10:51 +01:00
// code
2019-10-07 04:58:25 +02:00
void DrawTextWindowAndBufferTiles(const u8 *string, void *dst, u8 zero1, u8 zero2, s32 bytesToBuffer)
2019-01-26 19:20:14 +01:00
{
2019-10-11 00:46:42 +02:00
s32 i, tileBytesToBuffer, remainingBytes;
2019-01-26 19:20:14 +01:00
u16 windowId;
u8 txtColor[3];
u8 *tileData1, *tileData2;
struct WindowTemplate winTemplate = {0};
winTemplate.width = 24;
winTemplate.height = 2;
windowId = AddWindow(&winTemplate);
2019-10-04 01:39:37 +02:00
FillWindowPixelBuffer(windowId, PIXEL_FILL(zero2));
2019-01-26 19:20:14 +01:00
tileData1 = (u8*) GetWindowAttribute(windowId, WINDOW_TILE_DATA);
tileData2 = (winTemplate.width * 32) + tileData1;
2019-10-04 01:39:37 +02:00
if (!zero1)
txtColor[0] = TEXT_COLOR_TRANSPARENT;
2019-01-26 19:20:14 +01:00
else
2019-10-04 01:39:37 +02:00
txtColor[0] = zero2;
2019-10-05 16:41:37 +02:00
txtColor[1] = TEXT_DYNAMIC_COLOR_6;
txtColor[2] = TEXT_DYNAMIC_COLOR_5;
2019-01-26 19:20:14 +01:00
AddTextPrinterParameterized4(windowId, 1, 0, 1, 0, 0, txtColor, -1, string);
2019-10-07 04:58:25 +02:00
tileBytesToBuffer = bytesToBuffer;
if (tileBytesToBuffer > 6u)
tileBytesToBuffer = 6;
2019-10-11 00:46:42 +02:00
remainingBytes = bytesToBuffer - 6;
2019-10-07 04:58:25 +02:00
if (tileBytesToBuffer > 0)
2019-01-26 19:20:14 +01:00
{
2019-10-07 04:58:25 +02:00
for (i = tileBytesToBuffer; i != 0; i--)
2019-01-26 19:20:14 +01:00
{
CpuCopy16(tileData1, dst, 0x80);
CpuCopy16(tileData2, dst + 0x80, 0x80);
tileData1 += 0x80;
tileData2 += 0x80;
dst += 0x100;
}
}
2019-10-11 00:46:42 +02:00
// Never used. bytesToBuffer is always passed <= 6, so remainingBytes is always <= 0 here
if (remainingBytes > 0)
CpuFill16((zero2 << 4) | zero2, dst, (u32)(remainingBytes) * 0x100);
2019-01-26 19:20:14 +01:00
RemoveWindow(windowId);
}
2019-01-26 20:56:06 +01:00
// Unused
void sub_80C6EAC(const u8 *string, void *dst, u16 arg2, u8 arg3, u8 clr2, u8 clr3)
{
u32 var;
u8 windowId;
u8 txtColor[3];
u8 *tileData1, *tileData2;
struct WindowTemplate winTemplate = {0};
winTemplate.width = StringLength_Multibyte(string);
winTemplate.height = 2;
var = winTemplate.width * 32;
windowId = AddWindow(&winTemplate);
FillWindowPixelBuffer(windowId, PIXEL_FILL(arg3));
2019-01-26 20:56:06 +01:00
tileData1 = (u8*) GetWindowAttribute(windowId, WINDOW_TILE_DATA);
tileData2 = (winTemplate.width * 32) + tileData1;
txtColor[0] = arg3;
txtColor[1] = clr2;
txtColor[2] = clr3;
AddTextPrinterParameterized4(windowId, 1, 0, 2, 0, 0, txtColor, -1, string);
CpuCopy16(tileData1, dst, var);
CpuCopy16(tileData2, dst + arg2, var);
RemoveWindow(windowId);
2019-01-26 19:20:14 +01:00
}
2017-11-11 14:45:08 +01:00
u8 CountMonsInBox(u8 boxId)
{
u16 i, count;
2017-11-11 14:45:08 +01:00
for (i = 0, count = 0; i < IN_BOX_COUNT; i++)
{
2018-12-15 23:58:47 +01:00
if (GetBoxMonDataAt(boxId, i, MON_DATA_SPECIES) != SPECIES_NONE)
2017-11-11 14:45:08 +01:00
count++;
}
return count;
}
s16 GetFirstFreeBoxSpot(u8 boxId)
{
u16 i;
for (i = 0; i < IN_BOX_COUNT; i++)
{
2018-12-15 23:58:47 +01:00
if (GetBoxMonDataAt(boxId, i, MON_DATA_SPECIES) == SPECIES_NONE)
2017-11-11 14:45:08 +01:00
return i;
}
return -1; // all spots are taken
}
u8 CountPartyNonEggMons(void)
{
u16 i, count;
for (i = 0, count = 0; i < PARTY_SIZE; i++)
{
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
{
count++;
}
}
return count;
}
u8 CountPartyAliveNonEggMonsExcept(u8 slotToIgnore)
{
u16 i, count;
for (i = 0, count = 0; i < PARTY_SIZE; i++)
{
if (i != slotToIgnore
&& GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)
&& GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0)
{
count++;
}
}
return count;
}
u16 CountPartyAliveNonEggMons_IgnoreVar0x8004Slot(void)
{
return CountPartyAliveNonEggMonsExcept(gSpecialVar_0x8004);
}
u8 CountPartyMons(void)
{
u16 i, count;
for (i = 0, count = 0; i < PARTY_SIZE; i++)
{
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE)
{
count++;
}
}
return count;
}
2018-12-10 23:42:44 +01:00
u8 *StringCopyAndFillWithSpaces(u8 *dst, const u8 *src, u16 n)
2017-11-11 14:45:08 +01:00
{
u8 *str;
for (str = StringCopy(dst, src); str < dst + n; str++)
*str = CHAR_SPACE;
*str = EOS;
return str;
}
2018-12-16 21:10:01 +01:00
static void sub_80C7128(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, u16 src_left, u16 src_top, u16 dest_width, u16 dest_height, u16 src_width)
{
u16 i;
dest_width *= 2;
dest += dest_top * 0x20 + dest_left;
src += src_top * src_width + src_left;
for (i = 0; i < dest_height; i++)
{
CpuCopy16(src, dest, dest_width);
dest += 0x20;
src += src_width;
}
}
2018-12-16 21:10:01 +01:00
static void sub_80C71A4(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height)
{
u16 i;
dest += dest_top * 0x20 + dest_left;
width *= 2;
for (i = 0; i < height; dest += 0x20, i++)
Dma3FillLarge16_(0, dest, width);
}
2018-12-19 22:47:27 +01:00
static void Task_PokemonStorageSystemPC(u8 taskId)
{
2018-12-10 21:36:52 +01:00
struct Task *task = &gTasks[taskId];
switch (task->data[0])
{
case 0:
2018-12-10 21:36:52 +01:00
CreatePCMenu(task->data[1], &task->data[15]);
2020-02-07 18:48:47 +01:00
LoadMessageBoxAndBorderGfx();
DrawDialogueFrame(0, 0);
FillWindowPixelBuffer(0, PIXEL_FILL(1));
AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, TEXT_SPEED_FF, NULL, 2, 1, 3);
CopyWindowToVram(0, 3);
CopyWindowToVram(task->data[15], 3);
task->data[0]++;
break;
case 1:
if (IsWeatherNotFadingIn())
{
task->data[0]++;
}
break;
case 2:
2018-11-05 21:45:54 +01:00
task->data[2] = Menu_ProcessInput();
switch(task->data[2])
{
2019-02-02 11:04:38 +01:00
case MENU_NOTHING_CHOSEN:
task->data[3] = task->data[1];
if (JOY_NEW(DPAD_UP) && --task->data[3] < 0)
task->data[3] = 4;
if (JOY_NEW(DPAD_DOWN) && ++task->data[3] > 4)
task->data[3] = 0;
if (task->data[1] != task->data[3])
{
task->data[1] = task->data[3];
FillWindowPixelBuffer(0, PIXEL_FILL(1));
AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3);
}
break;
2019-02-02 11:04:38 +01:00
case MENU_B_PRESSED:
case 4:
ClearStdWindowAndFrame(task->data[15], TRUE);
ScriptContext2_Disable();
EnableBothScriptContexts();
RemoveWindow(task->data[15]);
DestroyTask(taskId);
break;
default:
if (task->data[2] == 0 && CountPartyMons() == PARTY_SIZE)
{
FillWindowPixelBuffer(0, PIXEL_FILL(1));
AddTextPrinterParameterized2(0, 1, gText_PartyFull, 0, NULL, 2, 1, 3);
task->data[0] = 3;
}
else if (task->data[2] == 1 && CountPartyMons() == 1)
{
FillWindowPixelBuffer(0, PIXEL_FILL(1));
AddTextPrinterParameterized2(0, 1, gText_JustOnePkmn, 0, NULL, 2, 1, 3);
task->data[0] = 3;
}
else
{
2019-12-15 17:42:50 +01:00
FadeScreen(FADE_TO_BLACK, 0);
task->data[0] = 4;
}
break;
}
break;
case 3:
if (JOY_NEW(A_BUTTON | B_BUTTON))
{
FillWindowPixelBuffer(0, PIXEL_FILL(1));
AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3);
task->data[0] = 2;
}
else if (JOY_NEW(DPAD_UP))
{
if (--task->data[1] < 0)
task->data[1] = 4;
2018-12-16 21:10:01 +01:00
Menu_MoveCursor(-1);
task->data[1] = Menu_GetCursorPos();
FillWindowPixelBuffer(0, PIXEL_FILL(1));
AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3);
task->data[0] = 2;
}
else if (JOY_NEW(DPAD_DOWN))
{
if (++task->data[1] > 3)
task->data[1] = 0;
2018-12-16 21:10:01 +01:00
Menu_MoveCursor(1);
task->data[1] = Menu_GetCursorPos();
FillWindowPixelBuffer(0, PIXEL_FILL(1));
AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3);
task->data[0] = 2;
}
break;
case 4:
if (!gPaletteFade.active)
{
2018-12-27 23:30:47 +01:00
CleanupOverworldWindowsAndTilemaps();
2018-12-10 21:36:52 +01:00
Cb2_EnterPSS(task->data[2]);
RemoveWindow(task->data[15]);
DestroyTask(taskId);
}
break;
}
}
2018-12-10 21:36:52 +01:00
void ShowPokemonStorageSystemPC(void)
{
2018-12-10 21:36:52 +01:00
u8 taskId = CreateTask(Task_PokemonStorageSystemPC, 80);
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = 0;
ScriptContext2_Enable();
}
2018-12-19 22:47:27 +01:00
static void FieldCb_ReturnToPcMenu(void)
{
u8 taskId;
MainCallback vblankCb = gMain.vblankCallback;
SetVBlankCallback(NULL);
2018-12-10 21:36:52 +01:00
taskId = CreateTask(Task_PokemonStorageSystemPC, 80);
gTasks[taskId].data[0] = 0;
2018-12-12 23:19:50 +01:00
gTasks[taskId].data[1] = sPreviousBoxOption;
2018-12-10 21:36:52 +01:00
Task_PokemonStorageSystemPC(taskId);
SetVBlankCallback(vblankCb);
2019-12-17 09:24:44 +01:00
FadeInFromBlack();
}
2018-12-19 22:47:27 +01:00
static void CreatePCMenu(u8 whichMenu, s16 *windowIdPtr)
{
s16 windowId;
struct WindowTemplate winTemplate = gUnknown_085716E8;
winTemplate.width = GetMaxWidthInMenuTable((void *)gUnknown_085716C0, ARRAY_COUNT(gUnknown_085716C0));
windowId = AddWindow(&winTemplate);
DrawStdWindowFrame(windowId, FALSE);
PrintMenuTable(windowId, ARRAY_COUNT(gUnknown_085716C0), (void *)gUnknown_085716C0);
InitMenuInUpperLeftCornerPlaySoundWhenAPressed(windowId, ARRAY_COUNT(gUnknown_085716C0), whichMenu);
*windowIdPtr = windowId;
}
2018-12-19 22:47:27 +01:00
static void Cb2_ExitPSS(void)
{
2018-12-12 23:19:50 +01:00
sPreviousBoxOption = GetCurrentBoxOption();
2018-12-10 21:36:52 +01:00
gFieldCallback = FieldCb_ReturnToPcMenu;
SetMainCallback2(CB2_ReturnToField);
}
2018-12-19 22:47:27 +01:00
static s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode)
{
s16 i;
s16 direction;
if (mode == 0 || mode == 1)
{
direction = 1;
}
else
{
direction = -1;
}
if (mode == 1 || mode == 3)
{
for (i = startIdx + direction; i >= 0 && i <= stopIdx; i += direction)
{
if (GetBoxMonData(box + i, MON_DATA_SPECIES) != 0)
return i;
}
}
else
{
for (i = startIdx + direction; i >= 0 && i <= stopIdx; i += direction)
{
if (GetBoxMonData(box + i, MON_DATA_SPECIES) != 0 && !GetBoxMonData(box + i, MON_DATA_IS_EGG))
return i;
}
}
return -1;
}
void ResetPokemonStorageSystem(void)
{
2018-12-15 23:58:47 +01:00
u16 boxId, boxPosition;
SetCurrentBox(0);
for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++)
{
2018-12-15 23:58:47 +01:00
for (boxPosition = 0; boxPosition < IN_BOX_COUNT; boxPosition++)
ZeroBoxMonAt(boxId, boxPosition);
}
for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++)
{
u8 *dest = StringCopy(GetBoxNamePtr(boxId), gText_Box);
ConvertIntToDecimalStringN(dest, boxId + 1, STR_CONV_MODE_LEFT_ALIGN, 2);
}
2021-04-15 20:06:25 +02:00
for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++)
2021-04-15 20:06:25 +02:00
SetBoxWallpaper(boxId, boxId % (MAX_DEFAULT_WALLPAPER + 1));
ResetWaldaWallpaper();
}
2018-12-16 21:10:01 +01:00
static void sub_80C77E8(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3, bool32 loadPal)
{
struct SpritePalette palette =
{
gBoxSelectionPopupPalette, palTag
};
struct SpriteSheet sheets[] =
{
{gBoxSelectionPopupCenterTiles, 0x800, tileTag},
{gBoxSelectionPopupSidesTiles, 0x180, tileTag + 1},
{}
};
if (loadPal)
LoadSpritePalette(&palette);
LoadSpriteSheets(sheets);
gUnknown_02039D04 = a0;
a0->unk_0240 = tileTag;
a0->unk_0242 = palTag;
a0->unk_0246 = a3;
a0->unk_023c = loadPal;
}
2018-12-16 21:10:01 +01:00
static void sub_80C7890(void)
{
if (gUnknown_02039D04->unk_023c)
FreeSpritePaletteByTag(gUnknown_02039D04->unk_0242);
FreeSpriteTilesByTag(gUnknown_02039D04->unk_0240);
FreeSpriteTilesByTag(gUnknown_02039D04->unk_0240 + 1);
}
2018-12-16 21:10:01 +01:00
static void sub_80C78D4(u8 curBox)
{
sub_80C7958(curBox);
}
2018-12-16 21:10:01 +01:00
static void sub_80C78E4(void)
{
sub_80C7B14();
}
2018-12-22 23:00:22 +01:00
static u8 HandleBoxChooseSelectionInput(void)
{
if (JOY_NEW(B_BUTTON))
{
PlaySE(SE_SELECT);
return 201;
}
if (JOY_NEW(A_BUTTON))
{
PlaySE(SE_SELECT);
return gUnknown_02039D04->curBox;
}
if (JOY_NEW(DPAD_LEFT))
{
PlaySE(SE_SELECT);
sub_80C7BB4();
}
else if (JOY_NEW(DPAD_RIGHT))
{
PlaySE(SE_SELECT);
sub_80C7B80();
}
return 200;
}
2018-12-16 21:10:01 +01:00
static void sub_80C7958(u8 curBox)
2017-11-11 14:45:08 +01:00
{
u16 i;
u8 spriteId;
struct SpriteTemplate template;
struct OamData oamData = {};
oamData.size = SPRITE_SIZE(64x64);
oamData.paletteNum = 1;
template = (struct SpriteTemplate){
0, 0, &oamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
};
gUnknown_02039D04->curBox = curBox;
template.tileTag = gUnknown_02039D04->unk_0240;
template.paletteTag = gUnknown_02039D04->unk_0242;
2018-12-22 23:00:22 +01:00
spriteId = CreateSprite(&template, 160, 96, 0);
gUnknown_02039D04->unk_0000 = gSprites + spriteId;
oamData.shape = SPRITE_SHAPE(8x32);
oamData.size = SPRITE_SIZE(8x32);
template.tileTag = gUnknown_02039D04->unk_0240 + 1;
template.anims = sSpriteAnimTable_8571710;
for (i = 0; i < 4; i++)
{
u16 r5;
2018-12-22 23:00:22 +01:00
spriteId = CreateSprite(&template, 124, 80, gUnknown_02039D04->unk_0246);
gUnknown_02039D04->unk_0004[i] = gSprites + spriteId;
r5 = 0;
if (i & 2)
{
2018-12-22 23:00:22 +01:00
gUnknown_02039D04->unk_0004[i]->pos1.x = 196;
r5 = 2;
}
if (i & 1)
{
2018-12-22 23:00:22 +01:00
gUnknown_02039D04->unk_0004[i]->pos1.y = 112;
gUnknown_02039D04->unk_0004[i]->oam.size = 0;
r5++;
}
StartSpriteAnim(gUnknown_02039D04->unk_0004[i], r5);
}
for (i = 0; i < 2; i++)
{
2021-04-15 20:06:25 +02:00
gUnknown_02039D04->arrowSprites[i] = CreateJumpBoxArrows(72 * i + 124, 88, i, 0, gUnknown_02039D04->unk_0246);
if (gUnknown_02039D04->arrowSprites[i])
{
2021-04-15 20:06:25 +02:00
gUnknown_02039D04->arrowSprites[i]->data[0] = (i == 0 ? -1 : 1);
gUnknown_02039D04->arrowSprites[i]->callback = SpriteCB_JumpBoxArrow;
}
}
sub_80C7BE4();
}
2018-12-16 21:10:01 +01:00
static void sub_80C7B14(void)
{
u16 i;
if (gUnknown_02039D04->unk_0000)
{
DestroySprite(gUnknown_02039D04->unk_0000);
gUnknown_02039D04->unk_0000 = NULL;
}
for (i = 0; i < 4; i++)
{
if (gUnknown_02039D04->unk_0004[i])
{
DestroySprite(gUnknown_02039D04->unk_0004[i]);
gUnknown_02039D04->unk_0004[i] = NULL;
}
}
for (i = 0; i < 2; i++)
{
2021-04-15 20:06:25 +02:00
if (gUnknown_02039D04->arrowSprites[i])
DestroySprite(gUnknown_02039D04->arrowSprites[i]);
}
}
2018-12-16 21:10:01 +01:00
static void sub_80C7B80(void)
{
if (++gUnknown_02039D04->curBox >= TOTAL_BOXES_COUNT)
gUnknown_02039D04->curBox = 0;
sub_80C7BE4();
}
2018-12-16 21:10:01 +01:00
static void sub_80C7BB4(void)
{
gUnknown_02039D04->curBox = (gUnknown_02039D04->curBox == 0 ? TOTAL_BOXES_COUNT - 1 : gUnknown_02039D04->curBox - 1);
sub_80C7BE4();
}
2018-12-16 21:10:01 +01:00
static void sub_80C7BE4(void)
{
2019-12-10 19:48:20 +01:00
u8 numBoxMonsText[16];
struct WindowTemplate winTemplate;
u8 windowId;
u8 *boxName = GetBoxNamePtr(gUnknown_02039D04->curBox);
u8 nPokemonInBox = CountMonsInBox(gUnknown_02039D04->curBox);
u32 winTileData;
s32 center;
memset(&winTemplate, 0, sizeof(winTemplate));
winTemplate.width = 8;
winTemplate.height = 4;
windowId = AddWindow(&winTemplate);
FillWindowPixelBuffer(windowId, PIXEL_FILL(4));
2018-12-22 23:00:22 +01:00
center = GetStringCenterAlignXOffset(1, boxName, 64);
2019-12-10 19:48:20 +01:00
AddTextPrinterParameterized3(windowId, 1, center, 1, sBoxInfoTextColors, TEXT_SPEED_FF, boxName);
2019-12-10 19:48:20 +01:00
ConvertIntToDecimalStringN(numBoxMonsText, nPokemonInBox, STR_CONV_MODE_RIGHT_ALIGN, 2);
StringAppend(numBoxMonsText, sText_OutOf30);
center = GetStringCenterAlignXOffset(1, numBoxMonsText, 64);
AddTextPrinterParameterized3(windowId, 1, center, 17, sBoxInfoTextColors, TEXT_SPEED_FF, numBoxMonsText);
winTileData = GetWindowAttribute(windowId, WINDOW_TILE_DATA);
CpuCopy32((void *)winTileData, (void *)OBJ_VRAM0 + 0x100 + (GetSpriteTileStartByTag(gUnknown_02039D04->unk_0240) * 32), 0x400);
RemoveWindow(windowId);
}
2021-04-15 20:06:25 +02:00
static void SpriteCB_JumpBoxArrow(struct Sprite *sprite)
{
if (++sprite->data[1] > 3)
2017-11-11 14:45:08 +01:00
{
sprite->data[1] = 0;
sprite->pos2.x += sprite->data[0];
if (++sprite->data[2] > 5)
2017-11-11 14:45:08 +01:00
{
sprite->data[2] = 0;
sprite->pos2.x = 0;
2017-11-11 14:45:08 +01:00
}
}
}
2018-12-19 22:47:27 +01:00
static void VblankCb_PSS(void)
{
LoadOam();
ProcessSpriteCopyRequests();
sub_80D2AA4();
TransferPlttBuffer();
2018-12-20 22:14:36 +01:00
SetGpuReg(REG_OFFSET_BG2HOFS, sPSSData->bg2_X);
}
2018-12-19 22:47:27 +01:00
static void Cb2_PSS(void)
{
RunTasks();
DoScheduledBgTilemapCopiesToVram();
2018-12-10 23:42:44 +01:00
ScrollBackground();
sub_80CAA14();
AnimateSprites();
BuildOamBuffer();
}
2018-12-09 16:44:01 +01:00
2018-12-19 22:47:27 +01:00
static void Cb2_EnterPSS(u8 boxOption)
2018-12-09 16:44:01 +01:00
{
ResetTasks();
2018-12-12 23:19:50 +01:00
sCurrentBoxOption = boxOption;
sPSSData = Alloc(sizeof(*sPSSData));
2018-12-20 22:14:36 +01:00
if (sPSSData == NULL)
2018-12-09 16:44:01 +01:00
{
2018-12-10 21:36:52 +01:00
SetMainCallback2(Cb2_ExitPSS);
2018-12-09 16:44:01 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->boxOption = boxOption;
sPSSData->isReshowingPSS = FALSE;
2020-03-09 02:27:29 +01:00
sMovingItemId = ITEM_NONE;
2018-12-20 22:14:36 +01:00
sPSSData->state = 0;
sPSSData->taskId = CreateTask(Cb_InitPSS, 3);
2019-09-17 07:49:07 +02:00
sLastUsedBox = StorageGetCurrentBox();
2018-12-10 23:42:44 +01:00
SetMainCallback2(Cb2_PSS);
2018-12-09 16:44:01 +01:00
}
}
2018-12-19 22:47:27 +01:00
static void Cb2_ReturnToPSS(void)
2018-12-09 16:44:01 +01:00
{
ResetTasks();
sPSSData = Alloc(sizeof(*sPSSData));
2018-12-20 22:14:36 +01:00
if (sPSSData == NULL)
2018-12-09 16:44:01 +01:00
{
2018-12-10 21:36:52 +01:00
SetMainCallback2(Cb2_ExitPSS);
2018-12-09 16:44:01 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->boxOption = sCurrentBoxOption;
sPSSData->isReshowingPSS = TRUE;
sPSSData->state = 0;
sPSSData->taskId = CreateTask(Cb_InitPSS, 3);
2018-12-10 23:42:44 +01:00
SetMainCallback2(Cb2_PSS);
2018-12-09 16:44:01 +01:00
}
}
2018-12-19 22:47:27 +01:00
static void ResetAllBgCoords(void)
2018-12-09 16:44:01 +01:00
{
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);
}
2018-12-16 21:10:01 +01:00
static void sub_80C7E98(void)
2018-12-09 16:44:01 +01:00
{
ResetPaletteFade();
ResetSpriteData();
FreeSpriteTileRanges();
FreeAllSpritePalettes();
ClearDma3Requests();
gReservedSpriteTileCount = 0x280;
2018-12-20 22:14:36 +01:00
sub_80D2A90(&sPSSData->unk_0020, sPSSData->unk_0028, 8);
2018-12-09 16:44:01 +01:00
gKeyRepeatStartDelay = 20;
ClearScheduledBgCopiesToVram();
2018-12-09 16:44:01 +01:00
sub_80D259C(3);
sub_80D2644(0, 1, gUnknown_0857239C, 8, 4);
sub_80D2770(0, 1, 0);
2018-12-20 22:14:36 +01:00
sPSSData->unk_02C7 = 0;
2018-12-09 16:44:01 +01:00
}
2018-12-16 21:10:01 +01:00
static void sub_80C7F1C(void)
2018-12-09 16:44:01 +01:00
{
sub_80CDC0C();
2018-12-20 22:14:36 +01:00
sInPartyMenu = (sPSSData->boxOption == BOX_OPTION_DEPOSIT);
2018-12-09 16:44:01 +01:00
gUnknown_02039D0E = 0;
}
2020-03-08 03:05:22 +01:00
static void SetMonIconTransparency(void)
2018-12-09 16:44:01 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
2018-12-09 16:44:01 +01:00
{
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);
}
2018-12-16 21:10:01 +01:00
static void SetPSSCallback(TaskFunc newFunc)
2018-12-09 16:44:01 +01:00
{
2018-12-20 22:14:36 +01:00
gTasks[sPSSData->taskId].func = newFunc;
sPSSData->state = 0;
2018-12-09 16:44:01 +01:00
}
2018-12-16 21:10:01 +01:00
static void Cb_InitPSS(u8 taskId)
2018-12-09 16:44:01 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 16:44:01 +01:00
{
case 0:
SetVBlankCallback(NULL);
SetGpuReg(REG_OFFSET_DISPCNT, 0);
sub_80C7E98();
2018-12-20 22:14:36 +01:00
if (sPSSData->isReshowingPSS)
2018-12-09 16:44:01 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sWhichToReshow)
2018-12-09 16:44:01 +01:00
{
case 1:
sub_80CE790();
break;
case 0:
sub_80CE8E4();
break;
case 2:
2018-12-10 23:42:44 +01:00
GiveChosenBagItem();
2018-12-09 16:44:01 +01:00
break;
}
}
2018-12-10 23:42:44 +01:00
LoadPSSMenuGfx();
LoadWaveformSpritePalette();
2018-12-09 16:44:01 +01:00
break;
case 1:
2018-12-10 23:42:44 +01:00
if (!InitPSSWindows())
2018-12-09 16:44:01 +01:00
{
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_ChangeScreen);
2018-12-09 16:44:01 +01:00
return;
}
break;
case 2:
PutWindowTilemap(0);
ClearWindowTilemap(1);
CpuFill32(0, (void *)VRAM, 0x200);
LoadUserWindowBorderGfx(1, 0xB, 0xE0);
break;
case 3:
2018-12-10 23:42:44 +01:00
ResetAllBgCoords();
2018-12-20 22:14:36 +01:00
if (!sPSSData->isReshowingPSS)
2018-12-09 16:44:01 +01:00
sub_80C7F1C();
break;
case 4:
sub_80CAF04();
2018-12-20 22:14:36 +01:00
if (!sPSSData->isReshowingPSS)
2018-12-09 16:44:01 +01:00
sub_80CD36C();
else
sub_80CD3EC();
break;
case 5:
if (!sub_80D0164())
{
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_ChangeScreen);
2018-12-09 16:44:01 +01:00
return;
}
else
{
2018-12-10 23:42:44 +01:00
SetScrollingBackground();
2018-12-09 16:44:01 +01:00
sub_80CAC1C();
}
break;
case 6:
sub_80CA0D8();
break;
case 7:
sub_80CA704();
break;
case 8:
2021-04-15 20:06:25 +02:00
CreateInitBoxTask(StorageGetCurrentBox());
2018-12-09 16:44:01 +01:00
break;
case 9:
2021-04-15 20:06:25 +02:00
if (IsInitBoxActive())
2018-12-09 16:44:01 +01:00
return;
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-09 16:44:01 +01:00
{
2020-03-09 02:27:29 +01:00
sPSSData->markMenu.baseTileTag = TAG_TILE_D;
sPSSData->markMenu.basePaletteTag = TAG_PAL_DACE;
2021-02-28 23:22:26 +01:00
InitMonMarkingsMenu(&sPSSData->markMenu);
BufferMonMarkingsMenuTiles();
2018-12-09 16:44:01 +01:00
}
else
{
sub_80D0C60();
sub_80CAEAC();
}
break;
case 10:
2020-03-08 03:05:22 +01:00
SetMonIconTransparency();
2018-12-20 22:14:36 +01:00
if (!sPSSData->isReshowingPSS)
2018-12-09 16:44:01 +01:00
{
2021-02-24 17:01:02 +01:00
BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK);
2018-12-10 23:42:44 +01:00
SetPSSCallback(Cb_ShowPSS);
2018-12-09 16:44:01 +01:00
}
else
{
2021-02-24 17:01:02 +01:00
BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK);
2018-12-12 23:19:50 +01:00
SetPSSCallback(Cb_ReshowPSS);
2018-12-09 16:44:01 +01:00
}
2018-12-10 23:42:44 +01:00
SetVBlankCallback(VblankCb_PSS);
2018-12-09 16:44:01 +01:00
return;
default:
return;
}
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 16:44:01 +01:00
}
2018-12-16 21:10:01 +01:00
static void Cb_ShowPSS(u8 taskId)
2018-12-09 16:44:01 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 16:44:01 +01:00
{
case 0:
PlaySE(SE_PC_LOGIN);
2020-06-29 17:41:09 +02:00
ComputerScreenOpenEffect(20, 0, 1);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 16:44:01 +01:00
break;
case 1:
2020-06-29 17:41:09 +02:00
if (!IsComputerScreenOpenEffectActive())
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 16:44:01 +01:00
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_ReshowPSS(u8 taskId)
2018-12-09 16:44:01 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 16:44:01 +01:00
{
case 0:
2021-02-24 17:01:02 +01:00
BeginNormalPaletteFade(PALETTES_ALL, -1, 0x10, 0, RGB_BLACK);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 16:44:01 +01:00
break;
case 1:
if (!UpdatePaletteFade())
{
2018-12-20 22:14:36 +01:00
if (sWhichToReshow == 2 && gSpecialVar_ItemId != 0)
2018-12-09 16:44:01 +01:00
{
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_ITEM_IS_HELD);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 16:44:01 +01:00
}
else
{
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 16:44:01 +01:00
}
}
break;
case 2:
if (!IsDma3ManagerBusyWithBgCopy() && JOY_NEW(A_BUTTON | B_BUTTON))
2018-12-09 16:44:01 +01:00
{
2018-12-09 21:06:43 +01:00
ClearBottomWindow();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 16:44:01 +01:00
}
break;
case 3:
if (!IsDma3ManagerBusyWithBgCopy())
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 16:44:01 +01:00
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_MainPSS(u8 taskId)
2018-12-09 16:44:01 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 16:44:01 +01:00
{
case 0:
2018-12-16 21:10:01 +01:00
switch (HandleInput())
2018-12-09 16:44:01 +01:00
{
case 1:
PlaySE(SE_SELECT);
2018-12-20 22:14:36 +01:00
sPSSData->state = 1;
2018-12-09 16:44:01 +01:00
break;
case 5:
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_MONS && sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-09 16:44:01 +01:00
{
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_WHICH_ONE_WILL_TAKE);
2018-12-20 22:14:36 +01:00
sPSSData->state = 3;
2018-12-09 16:44:01 +01:00
}
else
{
sub_80CDC0C();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_ShowPartyPokemon);
2018-12-09 16:44:01 +01:00
}
break;
case 6:
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption == BOX_OPTION_MOVE_MONS)
2018-12-09 16:44:01 +01:00
{
2018-12-20 22:14:36 +01:00
if (IsMonBeingMoved() && ItemIsMail(sPSSData->cursorMonItem))
sPSSData->state = 5;
2018-12-09 16:44:01 +01:00
else
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_HidePartyPokemon);
2018-12-09 16:44:01 +01:00
}
2018-12-20 22:14:36 +01:00
else if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
2018-12-09 21:06:43 +01:00
{
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_HidePartyPokemon);
2018-12-09 21:06:43 +01:00
}
2018-12-09 16:44:01 +01:00
break;
case 4:
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_OnCloseBoxPressed);
2018-12-09 16:44:01 +01:00
break;
2018-12-09 21:06:43 +01:00
case 19:
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_OnBPressed);
2018-12-09 16:44:01 +01:00
break;
case 7:
PlaySE(SE_SELECT);
2018-12-09 21:06:43 +01:00
SetPSSCallback(Cb_HandleBoxOptions);
2018-12-09 16:44:01 +01:00
break;
case 8:
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_OnSelectedMon);
2018-12-09 16:44:01 +01:00
break;
case 9:
PlaySE(SE_SELECT);
2018-12-20 22:14:36 +01:00
sPSSData->newCurrBoxId = StorageGetCurrentBox() + 1;
if (sPSSData->newCurrBoxId >= TOTAL_BOXES_COUNT)
sPSSData->newCurrBoxId = 0;
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-09 16:44:01 +01:00
{
2018-12-20 22:14:36 +01:00
SetUpScrollToBox(sPSSData->newCurrBoxId);
sPSSData->state = 2;
2018-12-09 16:44:01 +01:00
}
else
{
sub_80CFEA8();
2018-12-20 22:14:36 +01:00
sPSSData->state = 10;
2018-12-09 16:44:01 +01:00
}
break;
case 10:
PlaySE(SE_SELECT);
2018-12-20 22:14:36 +01:00
sPSSData->newCurrBoxId = StorageGetCurrentBox() - 1;
if (sPSSData->newCurrBoxId < 0)
sPSSData->newCurrBoxId = TOTAL_BOXES_COUNT - 1;
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-09 16:44:01 +01:00
{
2018-12-20 22:14:36 +01:00
SetUpScrollToBox(sPSSData->newCurrBoxId);
sPSSData->state = 2;
2018-12-09 16:44:01 +01:00
}
else
{
sub_80CFEA8();
2018-12-20 22:14:36 +01:00
sPSSData->state = 10;
2018-12-09 16:44:01 +01:00
}
break;
case 11:
2018-12-16 21:10:01 +01:00
if (!CanMovePartyMon())
2018-12-09 16:44:01 +01:00
{
2018-12-20 22:14:36 +01:00
if (ItemIsMail(sPSSData->cursorMonItem))
2018-12-09 16:44:01 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->state = 5;
2018-12-09 16:44:01 +01:00
}
else
{
PlaySE(SE_SELECT);
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_DepositMenu);
2018-12-09 16:44:01 +01:00
}
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->state = 4;
2018-12-09 16:44:01 +01:00
}
break;
case 13:
2018-12-16 21:10:01 +01:00
if (CanMovePartyMon())
2018-12-09 16:44:01 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->state = 4;
2018-12-09 16:44:01 +01:00
}
else
{
PlaySE(SE_SELECT);
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MoveMon);
2018-12-09 16:44:01 +01:00
}
break;
case 14:
2018-12-22 23:00:22 +01:00
if (!CanShiftMon())
2018-12-09 16:44:01 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->state = 4;
2018-12-09 16:44:01 +01:00
}
else
{
PlaySE(SE_SELECT);
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_ShiftMon);
2018-12-09 16:44:01 +01:00
}
break;
case 12:
PlaySE(SE_SELECT);
2018-12-09 21:06:43 +01:00
SetPSSCallback(Cb_WithdrawMon);
2018-12-09 16:44:01 +01:00
break;
case 15:
PlaySE(SE_SELECT);
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_PlaceMon);
2018-12-09 16:44:01 +01:00
break;
case 16:
PlaySE(SE_SELECT);
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_TakeItemForMoving);
2018-12-09 16:44:01 +01:00
break;
case 17:
PlaySE(SE_SELECT);
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_GiveMovingItemToMon);
2018-12-09 16:44:01 +01:00
break;
case 18:
PlaySE(SE_SELECT);
2018-12-09 21:06:43 +01:00
SetPSSCallback(Cb_SwitchSelectedItem);
2018-12-09 16:44:01 +01:00
break;
case 20:
PlaySE(SE_SELECT);
sub_80D01D0(0);
2018-12-20 22:14:36 +01:00
sPSSData->state = 7;
2018-12-09 16:44:01 +01:00
break;
case 22:
sub_80D01D0(1);
2018-12-20 22:14:36 +01:00
sPSSData->state = 8;
2018-12-09 16:44:01 +01:00
break;
case 21:
PlaySE(SE_SELECT);
sub_80D01D0(2);
2018-12-20 22:14:36 +01:00
sPSSData->state = 9;
2018-12-09 16:44:01 +01:00
break;
case 23:
2018-12-09 21:06:43 +01:00
sub_80D01D0(3);
2018-12-20 22:14:36 +01:00
sPSSData->state = 7;
2018-12-09 16:44:01 +01:00
break;
case 25:
PlaySE(SE_SELECT);
sub_80D01D0(4);
2018-12-20 22:14:36 +01:00
sPSSData->state = 9;
2018-12-09 16:44:01 +01:00
break;
case 26:
PlaySE(SE_SELECT);
sub_80D01D0(5);
2018-12-20 22:14:36 +01:00
sPSSData->state = 7;
2018-12-09 16:44:01 +01:00
break;
2018-12-09 21:06:43 +01:00
case 24:
2020-08-21 00:02:00 +02:00
PlaySE(SE_FAILURE);
2018-12-09 21:06:43 +01:00
break;
2018-12-09 16:44:01 +01:00
}
break;
case 1:
2018-12-09 21:06:43 +01:00
if (!sub_80CD554())
2018-12-09 16:44:01 +01:00
{
2018-12-09 21:06:43 +01:00
if (IsCursorOnCloseBox())
sub_80CA9C0();
2018-12-09 16:44:01 +01:00
else
2018-12-09 21:06:43 +01:00
sub_80CA9EC();
2018-12-10 21:36:52 +01:00
2018-12-20 22:14:36 +01:00
if (sPSSData->setMosaic)
2018-12-09 16:44:01 +01:00
BoxSetMosaic();
2018-12-20 22:14:36 +01:00
sPSSData->state = 0;
2018-12-09 16:44:01 +01:00
}
break;
case 2:
2018-12-09 21:06:43 +01:00
if (!ScrollToBox())
2018-12-09 16:44:01 +01:00
{
2018-12-20 22:14:36 +01:00
SetCurrentBox(sPSSData->newCurrBoxId);
2018-12-09 21:06:43 +01:00
if (!sInPartyMenu && !IsMonBeingMoved())
2018-12-09 16:44:01 +01:00
{
2018-12-09 21:06:43 +01:00
sub_80CE00C();
2018-12-09 16:44:01 +01:00
BoxSetMosaic();
}
2018-12-09 21:06:43 +01:00
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
2018-12-09 21:06:43 +01:00
{
sub_80CFECC();
2018-12-20 22:14:36 +01:00
sPSSData->state = 11;
2018-12-09 21:06:43 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->state = 0;
2018-12-09 21:06:43 +01:00
}
2018-12-09 16:44:01 +01:00
}
break;
case 3:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 16:44:01 +01:00
{
2018-12-09 21:06:43 +01:00
ClearBottomWindow();
2018-12-20 22:14:36 +01:00
sPSSData->state = 0;
2018-12-09 16:44:01 +01:00
}
break;
case 4:
2020-08-21 00:02:00 +02:00
PlaySE(SE_FAILURE);
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_LAST_POKE);
2018-12-20 22:14:36 +01:00
sPSSData->state = 6;
2018-12-09 16:44:01 +01:00
break;
case 5:
2020-08-21 00:02:00 +02:00
PlaySE(SE_FAILURE);
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_PLEASE_REMOVE_MAIL);
2018-12-20 22:14:36 +01:00
sPSSData->state = 6;
2018-12-09 16:44:01 +01:00
break;
case 6:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 16:44:01 +01:00
{
2018-12-09 21:06:43 +01:00
ClearBottomWindow();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
break;
case 7:
if (!sub_80D01E4())
2018-12-20 22:14:36 +01:00
sPSSData->state = 0;
2018-12-09 21:06:43 +01:00
break;
case 8:
if (!sub_80D01E4())
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MoveMon);
2018-12-09 21:06:43 +01:00
break;
case 9:
if (!sub_80D01E4())
{
2018-12-20 22:14:36 +01:00
if (sPSSData->setMosaic)
2018-12-09 21:06:43 +01:00
BoxSetMosaic();
2018-12-20 22:14:36 +01:00
sPSSData->state = 0;
2018-12-09 21:06:43 +01:00
}
break;
case 10:
if (!sub_80D1218())
{
2018-12-20 22:14:36 +01:00
SetUpScrollToBox(sPSSData->newCurrBoxId);
sPSSData->state = 2;
2018-12-09 21:06:43 +01:00
}
break;
case 11:
if (!sub_80D1218())
2018-12-20 22:14:36 +01:00
sPSSData->state = 0;
2018-12-09 21:06:43 +01:00
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_ShowPartyPokemon(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
2018-12-12 23:19:50 +01:00
SetUpDoShowPartyMenu();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 1:
2018-12-12 23:19:50 +01:00
if (!DoShowPartyMenu())
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_HidePartyPokemon(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
PlaySE(SE_SELECT);
2018-12-12 23:19:50 +01:00
SetUpHidePartyMenu();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 1:
2018-12-12 23:19:50 +01:00
if (!HidePartyMenu())
2018-12-09 21:06:43 +01:00
{
sub_80CDBF8(sub_80CDC2C());
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 2:
if (!sub_80CD554())
{
2018-12-20 22:14:36 +01:00
if (sPSSData->setMosaic)
2018-12-09 21:06:43 +01:00
BoxSetMosaic();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_OnSelectedMon(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
if (!sub_80CA2B8())
{
PlaySE(SE_SELECT);
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_IS_SELECTED);
2018-12-20 22:14:36 +01:00
else if (IsActiveItemMoving() || sPSSData->cursorMonItem != 0)
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_IS_SELECTED2);
2018-12-09 21:06:43 +01:00
else
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_GIVE_TO_MON);
2018-12-09 21:06:43 +01:00
2018-12-16 21:10:01 +01:00
AddMenu();
2018-12-20 22:14:36 +01:00
sPSSData->state = 1;
2018-12-09 21:06:43 +01:00
}
break;
2021-04-15 20:06:25 +02:00
case 1:
if (!IsMenuLoading())
2018-12-20 22:14:36 +01:00
sPSSData->state = 2;
2018-12-09 21:06:43 +01:00
break;
case 2:
2021-04-15 19:31:18 +02:00
switch (HandleMenuInput())
2018-12-09 21:06:43 +01:00
{
2021-04-15 19:31:18 +02:00
case MENU_B_PRESSED:
case MENU_CANCEL:
2018-12-09 21:06:43 +01:00
ClearBottomWindow();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
break;
2021-04-15 19:31:18 +02:00
case MENU_MOVE:
2018-12-16 21:10:01 +01:00
if (CanMovePartyMon())
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->state = 3;
2018-12-09 21:06:43 +01:00
}
else
{
PlaySE(SE_SELECT);
ClearBottomWindow();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MoveMon);
2018-12-09 21:06:43 +01:00
}
break;
2021-04-15 19:31:18 +02:00
case MENU_PLACE:
2018-12-09 21:06:43 +01:00
PlaySE(SE_SELECT);
ClearBottomWindow();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_PlaceMon);
2018-12-09 21:06:43 +01:00
break;
2021-04-15 19:31:18 +02:00
case MENU_SHIFT:
2018-12-22 23:00:22 +01:00
if (!CanShiftMon())
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->state = 3;
2018-12-09 21:06:43 +01:00
}
else
{
PlaySE(SE_SELECT);
ClearBottomWindow();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_ShiftMon);
2018-12-09 21:06:43 +01:00
}
break;
2021-04-15 19:31:18 +02:00
case MENU_WITHDRAW:
2018-12-09 21:06:43 +01:00
PlaySE(SE_SELECT);
ClearBottomWindow();
SetPSSCallback(Cb_WithdrawMon);
break;
2021-04-15 19:31:18 +02:00
case MENU_STORE:
2018-12-16 21:10:01 +01:00
if (CanMovePartyMon())
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->state = 3;
2018-12-09 21:06:43 +01:00
}
2018-12-20 22:14:36 +01:00
else if (ItemIsMail(sPSSData->cursorMonItem))
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->state = 4;
2018-12-09 21:06:43 +01:00
}
else
{
PlaySE(SE_SELECT);
ClearBottomWindow();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_DepositMenu);
2018-12-09 21:06:43 +01:00
}
break;
2021-04-15 19:31:18 +02:00
case MENU_RELEASE:
2018-12-16 21:10:01 +01:00
if (CanMovePartyMon())
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->state = 3;
2018-12-09 21:06:43 +01:00
}
2018-12-20 22:14:36 +01:00
else if (sPSSData->cursorMonIsEgg)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->state = 5; // Cannot release an Egg.
2018-12-09 21:06:43 +01:00
}
2018-12-20 22:14:36 +01:00
else if (ItemIsMail(sPSSData->cursorMonItem))
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->state = 4;
2018-12-09 21:06:43 +01:00
}
else
{
PlaySE(SE_SELECT);
SetPSSCallback(Cb_ReleaseMon);
}
break;
2021-04-15 19:31:18 +02:00
case MENU_SUMMARY:
2018-12-09 21:06:43 +01:00
PlaySE(SE_SELECT);
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_ShowMonSummary);
2018-12-09 21:06:43 +01:00
break;
2021-04-15 19:31:18 +02:00
case MENU_MARK:
2018-12-09 21:06:43 +01:00
PlaySE(SE_SELECT);
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_ShowMarkMenu);
2018-12-09 21:06:43 +01:00
break;
2021-04-15 19:31:18 +02:00
case MENU_TAKE:
2018-12-09 21:06:43 +01:00
PlaySE(SE_SELECT);
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_TakeItemForMoving);
2018-12-09 21:06:43 +01:00
break;
2021-04-15 19:31:18 +02:00
case MENU_GIVE:
2018-12-09 21:06:43 +01:00
PlaySE(SE_SELECT);
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_GiveMovingItemToMon);
2018-12-09 21:06:43 +01:00
break;
2021-04-15 19:31:18 +02:00
case MENU_BAG:
2018-12-09 21:06:43 +01:00
SetPSSCallback(Cb_ItemToBag);
break;
2021-04-15 19:31:18 +02:00
case MENU_SWITCH:
2018-12-09 21:06:43 +01:00
PlaySE(SE_SELECT);
SetPSSCallback(Cb_SwitchSelectedItem);
break;
2021-04-15 19:31:18 +02:00
case MENU_GIVE_2:
2018-12-09 21:06:43 +01:00
PlaySE(SE_SELECT);
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_GiveItemFromBag);
2018-12-09 21:06:43 +01:00
break;
2021-04-15 19:31:18 +02:00
case MENU_INFO:
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_ShowItemInfo);
2018-12-09 21:06:43 +01:00
break;
}
break;
case 3:
2020-08-21 00:02:00 +02:00
PlaySE(SE_FAILURE);
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_LAST_POKE);
2018-12-20 22:14:36 +01:00
sPSSData->state = 6;
2018-12-09 21:06:43 +01:00
break;
case 5:
2020-08-21 00:02:00 +02:00
PlaySE(SE_FAILURE);
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_CANT_RELEASE_EGG);
2018-12-20 22:14:36 +01:00
sPSSData->state = 6;
2018-12-09 21:06:43 +01:00
break;
case 4:
2020-08-21 00:02:00 +02:00
PlaySE(SE_FAILURE);
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_PLEASE_REMOVE_MAIL);
2018-12-20 22:14:36 +01:00
sPSSData->state = 6;
2018-12-09 21:06:43 +01:00
break;
case 6:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
ClearBottomWindow();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_MoveMon(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
2018-12-15 23:58:47 +01:00
InitMonPlaceChange(0);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 1:
2018-12-15 23:58:47 +01:00
if (!DoMonPlaceChange())
2018-12-09 21:06:43 +01:00
{
if (sInPartyMenu)
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_HandleMovingMonFromParty);
2018-12-09 21:06:43 +01:00
else
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_PlaceMon(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
2018-12-15 23:58:47 +01:00
InitMonPlaceChange(1);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 1:
2018-12-15 23:58:47 +01:00
if (!DoMonPlaceChange())
2018-12-09 21:06:43 +01:00
{
if (sInPartyMenu)
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_HandleMovingMonFromParty);
2018-12-09 21:06:43 +01:00
else
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_ShiftMon(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
2018-12-15 23:58:47 +01:00
InitMonPlaceChange(2);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 1:
2018-12-15 23:58:47 +01:00
if (!DoMonPlaceChange())
2018-12-09 21:06:43 +01:00
{
BoxSetMosaic();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_WithdrawMon(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
if (CalculatePlayerPartyCount() == PARTY_SIZE)
{
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_PARTY_FULL);
2018-12-20 22:14:36 +01:00
sPSSData->state = 1;
2018-12-09 21:06:43 +01:00
}
else
{
sub_80CDC18();
2018-12-15 23:58:47 +01:00
InitMonPlaceChange(0);
2018-12-20 22:14:36 +01:00
sPSSData->state = 2;
2018-12-09 21:06:43 +01:00
}
break;
case 1:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
ClearBottomWindow();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
break;
case 2:
2018-12-15 23:58:47 +01:00
if (!DoMonPlaceChange())
2018-12-09 21:06:43 +01:00
{
2018-12-16 21:10:01 +01:00
SetMovingMonPriority(1);
2018-12-12 23:19:50 +01:00
SetUpDoShowPartyMenu();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 3:
2018-12-12 23:19:50 +01:00
if (!DoShowPartyMenu())
2018-12-09 21:06:43 +01:00
{
2018-12-15 23:58:47 +01:00
InitMonPlaceChange(1);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 4:
2018-12-15 23:58:47 +01:00
if (!DoMonPlaceChange())
2018-12-09 21:06:43 +01:00
{
sub_80CAB20();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 5:
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_HidePartyPokemon);
2018-12-09 21:06:43 +01:00
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_DepositMenu(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-15 23:58:47 +01:00
u8 boxId;
2018-12-09 21:06:43 +01:00
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_DEPOSIT_IN_WHICH_BOX);
2018-12-20 22:14:36 +01:00
sub_80C77E8(&sPSSData->field_1E5C, TAG_TILE_A, TAG_PAL_DAC7, 3, FALSE);
2018-12-09 21:06:43 +01:00
sub_80C78D4(gUnknown_02039D0E);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 1:
2018-12-22 23:00:22 +01:00
boxId = HandleBoxChooseSelectionInput();
if (boxId == 200)
{
// no box chosen yet
}
2018-12-15 23:58:47 +01:00
else if (boxId == 201)
2018-12-09 21:06:43 +01:00
{
ClearBottomWindow();
sub_80C78E4();
sub_80C7890();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
else
{
2018-12-15 23:58:47 +01:00
if (TryStorePartyMonInBox(boxId))
2018-12-09 21:06:43 +01:00
{
2018-12-15 23:58:47 +01:00
gUnknown_02039D0E = boxId;
2018-12-09 21:06:43 +01:00
ClearBottomWindow();
sub_80C78E4();
sub_80C7890();
2018-12-20 22:14:36 +01:00
sPSSData->state = 2;
2018-12-09 21:06:43 +01:00
}
else
{
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_BOX_IS_FULL);
2018-12-20 22:14:36 +01:00
sPSSData->state = 4;
2018-12-09 21:06:43 +01:00
}
}
break;
case 2:
CompactPartySlots();
sub_80CB950();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 3:
if (!sub_80CB9BC())
{
sub_80CE22C();
BoxSetMosaic();
sub_80CAB20();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
break;
case 4:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_DEPOSIT_IN_WHICH_BOX);
2018-12-20 22:14:36 +01:00
sPSSData->state = 1;
2018-12-09 21:06:43 +01:00
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_ReleaseMon(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_RELEASE_POKE);
2018-12-12 23:19:50 +01:00
ShowYesNoWindow(1);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
// fallthrough
case 1:
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
2018-12-22 23:00:22 +01:00
case MENU_B_PRESSED:
2018-12-15 23:58:47 +01:00
case 1:
ClearBottomWindow();
SetPSSCallback(Cb_MainPSS);
break;
case 0:
ClearBottomWindow();
2018-12-16 21:10:01 +01:00
InitCanRelaseMonVars();
2018-12-15 23:58:47 +01:00
sub_80CE250();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-15 23:58:47 +01:00
break;
2018-12-09 21:06:43 +01:00
}
break;
case 2:
2018-12-16 21:10:01 +01:00
RunCanReleaseMon();
2018-12-09 21:06:43 +01:00
if (!sub_80CE2A8())
{
while (1)
{
2018-12-16 21:10:01 +01:00
s8 r0 = RunCanReleaseMon();
2018-12-09 21:06:43 +01:00
if (r0 == 1)
{
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
}
2018-12-16 21:10:01 +01:00
else if (r0 == 0)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->state = 8; // Can't release the mon.
2018-12-09 21:06:43 +01:00
break;
}
}
}
break;
case 3:
2018-12-16 21:10:01 +01:00
ReleaseMon();
RefreshCursorMonData();
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_WAS_RELEASED);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 4:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_BYE_BYE);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 5:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
ClearBottomWindow();
if (sInPartyMenu)
{
CompactPartySlots();
sub_80CB950();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->state = 7;
2018-12-09 21:06:43 +01:00
}
}
break;
case 6:
if (!sub_80CB9BC())
{
sub_80CE00C();
BoxSetMosaic();
sub_80CAB20();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 7:
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
break;
case 8:
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_WAS_RELEASED);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 9:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_SURPRISE);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 10:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
ClearBottomWindow();
sub_80CC064();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 11:
if (!sub_80CC0A0())
{
sub_80CE324();
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_CAME_BACK);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 12:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_WORRIED);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 13:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
ClearBottomWindow();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_ShowMarkMenu(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_MARK_POKE);
2020-03-09 02:27:29 +01:00
sPSSData->markMenu.markings = sPSSData->cursorMonMarkings;
2021-02-28 23:22:26 +01:00
OpenMonMarkingsMenu(sPSSData->cursorMonMarkings, 0xb0, 0x10);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 1:
2021-02-28 23:22:26 +01:00
if (!HandleMonMarkingsMenuInput())
2018-12-09 21:06:43 +01:00
{
2021-02-28 23:22:26 +01:00
FreeMonMarkingsMenu();
2018-12-09 21:06:43 +01:00
ClearBottomWindow();
2020-03-09 02:27:29 +01:00
SetMonMarkings(sPSSData->markMenu.markings);
2018-12-16 21:10:01 +01:00
RefreshCursorMonData();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_TakeItemForMoving(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
2018-12-20 22:14:36 +01:00
if (!ItemIsMail(sPSSData->cursorMonItem))
2018-12-09 21:06:43 +01:00
{
ClearBottomWindow();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
else
{
SetPSSCallback(Cb_PrintCantStoreMail);
}
break;
case 1:
sub_80CFE54(2);
2018-12-17 23:00:08 +01:00
Item_FromMonToMoving((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 2:
if (!sub_80D1218())
{
sub_80CFE54(3);
ClearBottomWindow();
sub_80CE00C();
2018-12-11 23:09:12 +01:00
PrintCursorMonInfo();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 3:
if (!IsDma3ManagerBusyWithBgCopy())
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_GiveMovingItemToMon(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
ClearBottomWindow();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 1:
sub_80CFE54(2);
2018-12-17 23:00:08 +01:00
Item_GiveMovingToMon((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 2:
if (!sub_80D1218())
{
sub_80CFE54(0);
sub_80CE00C();
2018-12-11 23:09:12 +01:00
PrintCursorMonInfo();
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_ITEM_IS_HELD);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 3:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
ClearBottomWindow();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 4:
if (!IsDma3ManagerBusyWithBgCopy())
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_ItemToBag(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
2018-12-20 22:14:36 +01:00
if (!AddBagItem(sPSSData->cursorMonItem, 1))
2018-12-09 21:06:43 +01:00
{
2020-08-21 00:02:00 +02:00
PlaySE(SE_FAILURE);
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_BAG_FULL);
2018-12-20 22:14:36 +01:00
sPSSData->state = 3;
2018-12-09 21:06:43 +01:00
}
else
{
PlaySE(SE_SELECT);
2018-12-17 23:00:08 +01:00
Item_TakeMons((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
2018-12-20 22:14:36 +01:00
sPSSData->state = 1;
2018-12-09 21:06:43 +01:00
}
break;
case 1:
if (!sub_80D1218())
{
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_PLACED_IN_BAG);
2018-12-20 22:14:36 +01:00
sPSSData->state = 2;
2018-12-09 21:06:43 +01:00
}
break;
case 2:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
ClearBottomWindow();
sub_80CE00C();
2018-12-11 23:09:12 +01:00
PrintCursorMonInfo();
2018-12-20 22:14:36 +01:00
sPSSData->state = 4;
2018-12-09 21:06:43 +01:00
}
break;
case 4:
if (!IsDma3ManagerBusyWithBgCopy())
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
break;
case 3:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
ClearBottomWindow();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_SwitchSelectedItem(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
2018-12-20 22:14:36 +01:00
if (!ItemIsMail(sPSSData->cursorMonItem))
2018-12-09 21:06:43 +01:00
{
ClearBottomWindow();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
else
{
SetPSSCallback(Cb_PrintCantStoreMail);
}
break;
case 1:
sub_80CFE54(2);
2018-12-17 23:00:08 +01:00
Item_SwitchMonsWithMoving((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 2:
if (!sub_80D1218())
{
sub_80CFE54(3);
sub_80CE00C();
2018-12-11 23:09:12 +01:00
PrintCursorMonInfo();
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_CHANGED_TO_ITEM);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 3:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
ClearBottomWindow();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 4:
if (!IsDma3ManagerBusyWithBgCopy())
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_ShowItemInfo(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
ClearBottomWindow();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 1:
if (!IsDma3ManagerBusyWithBgCopy())
{
PlaySE(SE_WIN_OPEN);
2018-12-19 22:47:27 +01:00
PrintItemDescription();
2018-12-09 21:06:43 +01:00
sub_80D1818();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 2:
if (!sub_80D184C())
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 3:
if (!IsDma3ManagerBusyWithBgCopy())
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 4:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
PlaySE(SE_WIN_OPEN);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 5:
if (!sub_80D18E4())
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 6:
if (!IsDma3ManagerBusyWithBgCopy())
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_CloseBoxWhileHoldingItem(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
PlaySE(SE_SELECT);
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_PUT_IN_BAG);
2018-12-12 23:19:50 +01:00
ShowYesNoWindow(0);
2018-12-20 22:14:36 +01:00
sPSSData->state = 1;
2018-12-09 21:06:43 +01:00
break;
case 1:
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
2018-12-22 23:00:22 +01:00
case MENU_B_PRESSED:
2018-12-09 21:06:43 +01:00
case 1:
ClearBottomWindow();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
break;
case 0:
2018-12-20 22:14:36 +01:00
if (AddBagItem(sPSSData->movingItem, 1) == TRUE)
2018-12-09 21:06:43 +01:00
{
ClearBottomWindow();
2018-12-20 22:14:36 +01:00
sPSSData->state = 3;
2018-12-09 21:06:43 +01:00
}
else
{
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_BAG_FULL);
2018-12-20 22:14:36 +01:00
sPSSData->state = 2;
2018-12-09 21:06:43 +01:00
}
break;
}
break;
case 2:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
ClearBottomWindow();
2018-12-20 22:14:36 +01:00
sPSSData->state = 5;
2018-12-09 21:06:43 +01:00
}
break;
case 3:
sub_80D1194();
2018-12-20 22:14:36 +01:00
sPSSData->state = 4;
2018-12-09 21:06:43 +01:00
break;
case 4:
if (!sub_80D1218())
{
sub_80CFE54(0);
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
break;
case 5:
if (!IsDma3ManagerBusyWithBgCopy())
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_HandleMovingMonFromParty(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
CompactPartySlots();
sub_80CB950();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 1:
if (!sub_80CB9BC())
{
sub_80CAB20();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_PrintCantStoreMail(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_CANT_STORE_MAIL);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 1:
if (!IsDma3ManagerBusyWithBgCopy())
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 2:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-09 21:06:43 +01:00
{
ClearBottomWindow();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 3:
if (!IsDma3ManagerBusyWithBgCopy())
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_HandleBoxOptions(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_WHAT_YOU_DO);
2018-12-16 21:10:01 +01:00
AddMenu();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 1:
2021-04-15 20:06:25 +02:00
if (IsMenuLoading())
2018-12-09 21:06:43 +01:00
return;
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
case 2:
2021-04-15 19:31:18 +02:00
switch (HandleMenuInput())
2018-12-09 21:06:43 +01:00
{
2021-04-15 19:31:18 +02:00
case MENU_B_PRESSED:
case MENU_CANCEL:
2021-04-15 20:06:25 +02:00
AnimateBoxScrollArrows(TRUE);
2018-12-09 21:06:43 +01:00
ClearBottomWindow();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
break;
2021-04-15 19:31:18 +02:00
case MENU_NAME:
2018-12-09 21:06:43 +01:00
PlaySE(SE_SELECT);
SetPSSCallback(Cb_NameBox);
break;
2021-04-15 19:31:18 +02:00
case MENU_WALLPAPER:
2018-12-09 21:06:43 +01:00
PlaySE(SE_SELECT);
ClearBottomWindow();
SetPSSCallback(Cb_HandleWallpapers);
break;
2021-04-15 19:31:18 +02:00
case MENU_JUMP:
2018-12-09 21:06:43 +01:00
PlaySE(SE_SELECT);
ClearBottomWindow();
SetPSSCallback(Cb_JumpBox);
break;
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_HandleWallpapers(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
2018-12-16 21:10:01 +01:00
AddWallpaperSetsMenu();
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_PICK_A_THEME);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 1:
2021-04-15 20:06:25 +02:00
if (!IsMenuLoading())
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 2:
2021-04-15 19:31:18 +02:00
sPSSData->wallpaperSetId = HandleMenuInput();
2018-12-20 22:14:36 +01:00
switch (sPSSData->wallpaperSetId)
2018-12-09 21:06:43 +01:00
{
2021-04-15 19:31:18 +02:00
case MENU_B_PRESSED:
2021-04-15 20:06:25 +02:00
AnimateBoxScrollArrows(TRUE);
2018-12-09 21:06:43 +01:00
ClearBottomWindow();
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
break;
2021-04-15 19:31:18 +02:00
case MENU_SCENERY_1:
case MENU_SCENERY_2:
case MENU_SCENERY_3:
case MENU_ETCETERA:
2018-12-09 21:06:43 +01:00
PlaySE(SE_SELECT);
2021-04-15 19:31:18 +02:00
RemoveMenu();
2021-04-15 20:06:25 +02:00
sPSSData->wallpaperSetId -= MENU_WALLPAPER_SETS_START;
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
2021-04-15 19:31:18 +02:00
case MENU_FRIENDS:
// New wallpaper from Walda.
2018-12-09 21:06:43 +01:00
PlaySE(SE_SELECT);
2021-04-15 20:06:25 +02:00
sPSSData->wallpaperId = WALLPAPER_FRIENDS;
2021-04-15 19:31:18 +02:00
RemoveMenu();
2018-12-09 21:06:43 +01:00
ClearBottomWindow();
2018-12-20 22:14:36 +01:00
sPSSData->state = 6;
2018-12-09 21:06:43 +01:00
break;
}
break;
case 3:
if (!IsDma3ManagerBusyWithBgCopy())
{
2018-12-20 22:14:36 +01:00
AddWallpapersMenu(sPSSData->wallpaperSetId);
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_PICK_A_WALLPAPER);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
case 4:
2021-04-15 19:31:18 +02:00
sPSSData->wallpaperId = HandleMenuInput();
2018-12-20 22:14:36 +01:00
switch (sPSSData->wallpaperId)
2018-12-09 21:06:43 +01:00
{
2021-04-15 19:31:18 +02:00
case MENU_NOTHING_CHOSEN:
2018-12-09 21:06:43 +01:00
break;
2021-04-15 19:31:18 +02:00
case MENU_B_PRESSED:
2018-12-09 21:06:43 +01:00
ClearBottomWindow();
2018-12-20 22:14:36 +01:00
sPSSData->state = 0;
2018-12-09 21:06:43 +01:00
break;
default:
PlaySE(SE_SELECT);
ClearBottomWindow();
2021-04-15 19:31:18 +02:00
sPSSData->wallpaperId -= MENU_WALLPAPERS_START;
2018-12-20 22:14:36 +01:00
SetWallpaperForCurrentBox(sPSSData->wallpaperId);
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
}
break;
case 5:
if (!DoWallpaperGfxChange())
{
2021-04-15 20:06:25 +02:00
AnimateBoxScrollArrows(TRUE);
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
break;
case 6:
if (!IsDma3ManagerBusyWithBgCopy())
{
2018-12-20 22:14:36 +01:00
SetWallpaperForCurrentBox(sPSSData->wallpaperId);
sPSSData->state = 5;
2018-12-09 21:06:43 +01:00
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_JumpBox(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_JUMP_TO_WHICH_BOX);
2018-12-20 22:14:36 +01:00
sub_80C77E8(&sPSSData->field_1E5C, TAG_TILE_A, TAG_PAL_DAC7, 3, FALSE);
2018-12-09 21:06:43 +01:00
sub_80C78D4(StorageGetCurrentBox());
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 1:
2018-12-22 23:00:22 +01:00
sPSSData->newCurrBoxId = HandleBoxChooseSelectionInput();
2018-12-20 22:14:36 +01:00
switch (sPSSData->newCurrBoxId)
2018-12-09 21:06:43 +01:00
{
case 200:
break;
default:
ClearBottomWindow();
sub_80C78E4();
sub_80C7890();
2018-12-20 22:14:36 +01:00
if (sPSSData->newCurrBoxId == 201 || sPSSData->newCurrBoxId == StorageGetCurrentBox())
2018-12-09 21:06:43 +01:00
{
2021-04-15 20:06:25 +02:00
AnimateBoxScrollArrows(TRUE);
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
}
break;
}
break;
case 2:
2018-12-20 22:14:36 +01:00
SetUpScrollToBox(sPSSData->newCurrBoxId);
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 3:
if (!ScrollToBox())
{
2018-12-20 22:14:36 +01:00
SetCurrentBox(sPSSData->newCurrBoxId);
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_MainPSS);
2018-12-09 21:06:43 +01:00
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_NameBox(u8 taskId)
2018-12-09 21:06:43 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-09 21:06:43 +01:00
{
case 0:
sub_80CE760();
2021-02-24 17:01:02 +01:00
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-09 21:06:43 +01:00
break;
case 1:
if (!UpdatePaletteFade())
{
2018-12-20 22:14:36 +01:00
sWhichToReshow = 1;
sPSSData->screenChangeType = SCREEN_CHANGE_NAME_BOX;
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_ChangeScreen);
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_ShowMonSummary(u8 taskId)
2018-12-10 21:36:52 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-10 21:36:52 +01:00
{
case 0:
sub_80CE7E8();
2021-02-24 17:01:02 +01:00
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-10 21:36:52 +01:00
break;
case 1:
if (!UpdatePaletteFade())
{
2018-12-20 22:14:36 +01:00
sWhichToReshow = 0;
sPSSData->screenChangeType = SCREEN_CHANGE_SUMMARY_SCREEN;
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_ChangeScreen);
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_GiveItemFromBag(u8 taskId)
2018-12-10 21:36:52 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-10 21:36:52 +01:00
{
case 0:
2021-02-24 17:01:02 +01:00
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-10 21:36:52 +01:00
break;
case 1:
if (!UpdatePaletteFade())
{
2018-12-20 22:14:36 +01:00
sWhichToReshow = 2;
sPSSData->screenChangeType = SCREEN_CHANGE_ITEM_FROM_BAG;
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_ChangeScreen);
2018-12-09 16:44:01 +01:00
}
break;
}
}
2018-12-10 21:36:52 +01:00
2018-12-16 21:10:01 +01:00
static void Cb_OnCloseBoxPressed(u8 taskId)
2018-12-10 21:36:52 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-10 21:36:52 +01:00
{
case 0:
if (IsMonBeingMoved())
{
2020-08-21 00:02:00 +02:00
PlaySE(SE_FAILURE);
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_HOLDING_POKE);
2018-12-20 22:14:36 +01:00
sPSSData->state = 1;
2018-12-10 21:36:52 +01:00
}
2018-12-19 22:47:27 +01:00
else if (IsActiveItemMoving())
2018-12-10 21:36:52 +01:00
{
SetPSSCallback(Cb_CloseBoxWhileHoldingItem);
}
else
{
PlaySE(SE_SELECT);
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_EXIT_BOX);
2018-12-12 23:19:50 +01:00
ShowYesNoWindow(0);
2018-12-20 22:14:36 +01:00
sPSSData->state = 2;
2018-12-10 21:36:52 +01:00
}
break;
case 1:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-10 21:36:52 +01:00
{
ClearBottomWindow();
SetPSSCallback(Cb_MainPSS);
}
break;
case 2:
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
2018-12-22 23:00:22 +01:00
case MENU_B_PRESSED:
2018-12-10 21:36:52 +01:00
case 1:
ClearBottomWindow();
SetPSSCallback(Cb_MainPSS);
break;
case 0:
PlaySE(SE_PC_OFF);
ClearBottomWindow();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-10 21:36:52 +01:00
break;
}
break;
case 3:
2020-06-29 17:41:09 +02:00
ComputerScreenCloseEffect(20, 0, 1);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-10 21:36:52 +01:00
break;
case 4:
2020-06-29 17:41:09 +02:00
if (!IsComputerScreenCloseEffectActive())
2018-12-10 21:36:52 +01:00
{
sub_80CABE0();
gPlayerPartyCount = CalculatePlayerPartyCount();
2018-12-20 22:14:36 +01:00
sPSSData->screenChangeType = SCREEN_CHANGE_EXIT_BOX;
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_ChangeScreen);
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_OnBPressed(u8 taskId)
2018-12-10 21:36:52 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->state)
2018-12-10 21:36:52 +01:00
{
case 0:
if (IsMonBeingMoved())
{
2020-08-21 00:02:00 +02:00
PlaySE(SE_FAILURE);
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_HOLDING_POKE);
2018-12-20 22:14:36 +01:00
sPSSData->state = 1;
2018-12-10 21:36:52 +01:00
}
2018-12-19 22:47:27 +01:00
else if (IsActiveItemMoving())
2018-12-10 21:36:52 +01:00
{
SetPSSCallback(Cb_CloseBoxWhileHoldingItem);
}
else
{
PlaySE(SE_SELECT);
2021-04-15 19:31:18 +02:00
PrintMessage(MSG_CONTINUE_BOX);
2018-12-12 23:19:50 +01:00
ShowYesNoWindow(0);
2018-12-20 22:14:36 +01:00
sPSSData->state = 2;
2018-12-10 21:36:52 +01:00
}
break;
case 1:
if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY))
2018-12-10 21:36:52 +01:00
{
ClearBottomWindow();
SetPSSCallback(Cb_MainPSS);
}
break;
case 2:
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
case 0:
ClearBottomWindow();
SetPSSCallback(Cb_MainPSS);
break;
case 1:
2018-12-22 23:00:22 +01:00
case MENU_B_PRESSED:
2018-12-10 21:36:52 +01:00
PlaySE(SE_PC_OFF);
ClearBottomWindow();
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-10 21:36:52 +01:00
break;
}
break;
case 3:
2020-06-29 17:41:09 +02:00
ComputerScreenCloseEffect(20, 0, 0);
2018-12-20 22:14:36 +01:00
sPSSData->state++;
2018-12-10 21:36:52 +01:00
break;
case 4:
2020-06-29 17:41:09 +02:00
if (!IsComputerScreenCloseEffectActive())
2018-12-10 21:36:52 +01:00
{
sub_80CABE0();
gPlayerPartyCount = CalculatePlayerPartyCount();
2018-12-20 22:14:36 +01:00
sPSSData->screenChangeType = SCREEN_CHANGE_EXIT_BOX;
2018-12-10 21:36:52 +01:00
SetPSSCallback(Cb_ChangeScreen);
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void Cb_ChangeScreen(u8 taskId)
2018-12-10 21:36:52 +01:00
{
struct BoxPokemon *boxMons;
u8 mode, monIndex, maxMonIndex;
2018-12-20 22:14:36 +01:00
u8 screenChangeType = sPSSData->screenChangeType;
2018-12-10 21:36:52 +01:00
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS && IsActiveItemMoving() == TRUE)
2020-03-08 02:45:04 +01:00
sMovingItemId = GetMovingItem();
2018-12-10 21:36:52 +01:00
else
2020-03-09 02:27:29 +01:00
sMovingItemId = ITEM_NONE;
2018-12-10 21:36:52 +01:00
switch (screenChangeType)
{
case SCREEN_CHANGE_EXIT_BOX:
default:
FreePSSData();
SetMainCallback2(Cb2_ExitPSS);
break;
case SCREEN_CHANGE_SUMMARY_SCREEN:
2018-12-20 22:14:36 +01:00
boxMons = sPSSData->field_218C.box;
monIndex = sPSSData->field_2187;
maxMonIndex = sPSSData->field_2186;
2020-07-19 05:08:44 +02:00
mode = sPSSData->pokemonSummaryScreenMode;
2018-12-10 21:36:52 +01:00
FreePSSData();
if (mode == PSS_MODE_NORMAL && boxMons == &gUnknown_02039D14.box)
ShowPokemonSummaryScreenSet40EF(mode, boxMons, monIndex, maxMonIndex, Cb2_ReturnToPSS);
else
ShowPokemonSummaryScreen(mode, boxMons, monIndex, maxMonIndex, Cb2_ReturnToPSS);
break;
case SCREEN_CHANGE_NAME_BOX:
FreePSSData();
DoNamingScreen(NAMING_SCREEN_BOX, GetBoxNamePtr(StorageGetCurrentBox()), 0, 0, 0, Cb2_ReturnToPSS);
break;
case SCREEN_CHANGE_ITEM_FROM_BAG:
FreePSSData();
2020-05-14 10:37:09 +02:00
GoToBagMenu(ITEMMENULOCATION_PCBOX, 0, Cb2_ReturnToPSS);
2018-12-10 21:36:52 +01:00
break;
}
DestroyTask(taskId);
}
2018-12-10 23:42:44 +01:00
2018-12-19 22:47:27 +01:00
static void GiveChosenBagItem(void)
2018-12-10 23:42:44 +01:00
{
u16 item = gSpecialVar_ItemId;
if (item != 0)
{
u8 id = GetBoxCursorPosition();
if (sInPartyMenu)
SetMonData(&gPlayerParty[id], MON_DATA_HELD_ITEM, &item);
else
SetCurrentBoxMonData(id, MON_DATA_HELD_ITEM, &item);
RemoveBagItem(item, 1);
}
}
2018-12-19 22:47:27 +01:00
static void FreePSSData(void)
2018-12-10 23:42:44 +01:00
{
sub_80D25F0();
sub_80D01B8();
2018-12-20 22:14:36 +01:00
FREE_AND_SET_NULL(sPSSData);
2018-12-10 23:42:44 +01:00
FreeAllWindowBuffers();
}
2018-12-16 21:10:01 +01:00
static void SetScrollingBackground(void)
2018-12-10 23:42:44 +01:00
{
SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_16COLOR | BGCNT_SCREENBASE(31));
DecompressAndLoadBgGfxUsingHeap(3, gPokemonStorageScrollingBGTileset, 0, 0, 0);
LZ77UnCompVram(gPokemonStorageScrollingBGTilemap, (void *)BG_SCREEN_ADDR(31));
2018-12-10 23:42:44 +01:00
}
2018-12-19 22:47:27 +01:00
static void ScrollBackground(void)
2018-12-10 23:42:44 +01:00
{
ChangeBgX(3, 128, 1);
ChangeBgY(3, 128, 2);
}
2018-12-19 22:47:27 +01:00
static void LoadPSSMenuGfx(void)
2018-12-10 23:42:44 +01:00
{
InitBgsFromTemplates(0, gUnknown_08572734, ARRAY_COUNT(gUnknown_08572734));
DecompressAndLoadBgGfxUsingHeap(1, gPSSMenu_Gfx, 0, 0, 0);
2018-12-20 22:14:36 +01:00
LZ77UnCompWram(gUnknown_085722A0, sPSSData->field_5AC4);
SetBgTilemapBuffer(1, sPSSData->field_5AC4);
2018-12-10 23:42:44 +01:00
ShowBg(1);
2020-05-14 10:37:09 +02:00
ScheduleBgCopyTilemapToVram(1);
2018-12-10 23:42:44 +01:00
}
2018-12-19 22:47:27 +01:00
static bool8 InitPSSWindows(void)
2018-12-10 23:42:44 +01:00
{
if (!InitWindows(gUnknown_08572714))
{
return FALSE;
}
else
{
DeactivateAllTextPrinters();
return TRUE;
}
}
2018-12-19 22:47:27 +01:00
static void LoadWaveformSpritePalette(void)
2018-12-10 23:42:44 +01:00
{
LoadSpritePalette(&gWaveformSpritePalette);
}
2018-12-16 21:10:01 +01:00
static void sub_80CA0D8(void)
2018-12-10 23:42:44 +01:00
{
LoadPalette(gUnknown_085723DC, 0, 0x20);
LoadPalette(gUnknown_085723FC, 0x20, 0x20);
LoadPalette(gUnknown_085726F4, 0xF0, 0x20);
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-10 23:42:44 +01:00
LoadPalette(gUnknown_0857241C, 0x30, 0x20);
else
LoadPalette(gUnknown_0857243C, 0x30, 0x20);
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_16COLOR | BGCNT_SCREENBASE(30));
2018-12-11 23:09:12 +01:00
LoadCursorMonSprite();
2018-12-10 23:42:44 +01:00
sub_80CA154();
sub_80CA1C4();
2018-12-16 21:10:01 +01:00
RefreshCursorMonData();
2018-12-10 23:42:44 +01:00
}
2018-12-16 21:10:01 +01:00
static void sub_80CA154(void)
2018-12-10 23:42:44 +01:00
{
2021-02-28 23:22:26 +01:00
sPSSData->field_D94 = CreateMonMarkingComboSprite(TAG_TILE_10, TAG_PAL_DAC8, NULL);
2018-12-20 22:14:36 +01:00
sPSSData->field_D94->oam.priority = 1;
sPSSData->field_D94->subpriority = 1;
sPSSData->field_D94->pos1.x = 40;
sPSSData->field_D94->pos1.y = 150;
sPSSData->field_DA0 = (void*) OBJ_VRAM0 + 32 * GetSpriteTileStartByTag(TAG_TILE_10);
2018-12-10 23:42:44 +01:00
}
2018-12-16 21:10:01 +01:00
static void sub_80CA1C4(void)
2018-12-10 23:42:44 +01:00
{
u16 i;
struct SpriteSheet sheet = gWaveformSpriteSheet;
LoadSpriteSheet(&sheet);
for (i = 0; i < 2; i++)
{
2018-12-21 22:35:01 +01:00
u8 spriteId = CreateSprite(&sSpriteTemplate_Waveform, i * 63 + 8, 9, 2);
2018-12-20 22:14:36 +01:00
sPSSData->field_D98[i] = &gSprites[spriteId];
2018-12-10 23:42:44 +01:00
}
}
2018-12-11 23:09:12 +01:00
2018-12-19 22:47:27 +01:00
static void RefreshCursorMonData(void)
2018-12-11 23:09:12 +01:00
{
2018-12-20 22:14:36 +01:00
LoadCursorMonGfx(sPSSData->cursorMonSpecies, sPSSData->cursorMonPersonality);
2018-12-11 23:09:12 +01:00
PrintCursorMonInfo();
sub_80CA65C();
2020-05-14 10:37:09 +02:00
ScheduleBgCopyTilemapToVram(0);
2018-12-11 23:09:12 +01:00
}
2018-12-19 22:47:27 +01:00
static void BoxSetMosaic(void)
2018-12-11 23:09:12 +01:00
{
2018-12-16 21:10:01 +01:00
RefreshCursorMonData();
2018-12-20 22:14:36 +01:00
if (sPSSData->cursorMonSprite)
2018-12-11 23:09:12 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->cursorMonSprite->oam.mosaic = TRUE;
sPSSData->cursorMonSprite->data[0] = 10;
sPSSData->cursorMonSprite->data[1] = 1;
sPSSData->cursorMonSprite->callback = sub_80CA2D0;
SetGpuReg(REG_OFFSET_MOSAIC, (sPSSData->cursorMonSprite->data[0] << 12) | (sPSSData->cursorMonSprite->data[0] << 8));
2018-12-11 23:09:12 +01:00
}
}
2018-12-19 22:47:27 +01:00
static u8 sub_80CA2B8(void)
2018-12-11 23:09:12 +01:00
{
2018-12-20 22:14:36 +01:00
return sPSSData->cursorMonSprite->oam.mosaic;
2018-12-11 23:09:12 +01:00
}
2018-12-16 21:10:01 +01:00
static void sub_80CA2D0(struct Sprite *sprite)
2018-12-11 23:09:12 +01:00
{
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;
}
}
2018-12-19 22:47:27 +01:00
static void LoadCursorMonSprite(void)
2018-12-11 23:09:12 +01:00
{
u16 i;
u16 tileStart;
u8 palSlot;
u8 spriteId;
2021-03-29 15:38:19 +02:00
struct SpriteSheet sheet = {sPSSData->field_22C4, MON_PIC_SIZE, TAG_TILE_2};
2018-12-20 22:14:36 +01:00
struct SpritePalette palette = {sPSSData->field_2244, TAG_PAL_DAC6};
2018-12-11 23:09:12 +01:00
struct SpriteTemplate template = sSpriteTemplate_CursorMon;
2021-03-29 15:38:19 +02:00
for (i = 0; i < MON_PIC_SIZE; i++)
2018-12-20 22:14:36 +01:00
sPSSData->field_22C4[i] = 0;
2018-12-11 23:09:12 +01:00
for (i = 0; i < 0x10; i++)
2018-12-20 22:14:36 +01:00
sPSSData->field_2244[i] = 0;
2018-12-11 23:09:12 +01:00
2018-12-20 22:14:36 +01:00
sPSSData->cursorMonSprite = NULL;
2018-12-11 23:09:12 +01:00
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;
2018-12-20 22:14:36 +01:00
sPSSData->cursorMonSprite = &gSprites[spriteId];
sPSSData->field_223A = palSlot * 16 + 0x100;
sPSSData->field_223C = (void*) OBJ_VRAM0 + tileStart * 32;
2018-12-11 23:09:12 +01:00
} while (0);
2018-12-20 22:14:36 +01:00
if (sPSSData->cursorMonSprite == NULL)
2018-12-11 23:09:12 +01:00
{
FreeSpriteTilesByTag(TAG_TILE_2);
FreeSpritePaletteByTag(TAG_PAL_DAC6);
}
}
2018-12-19 22:47:27 +01:00
static void LoadCursorMonGfx(u16 species, u32 pid)
2018-12-11 23:09:12 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->cursorMonSprite == NULL)
2018-12-11 23:09:12 +01:00
return;
if (species != SPECIES_NONE)
{
2018-12-20 22:14:36 +01:00
LoadSpecialPokePic(&gMonFrontPicTable[species], sPSSData->field_22C4, species, pid, TRUE);
LZ77UnCompWram(sPSSData->cursorMonPalette, sPSSData->field_2244);
2021-03-29 15:38:19 +02:00
CpuCopy32(sPSSData->field_22C4, sPSSData->field_223C, MON_PIC_SIZE);
2018-12-20 22:14:36 +01:00
LoadPalette(sPSSData->field_2244, sPSSData->field_223A, 0x20);
sPSSData->cursorMonSprite->invisible = FALSE;
2018-12-11 23:09:12 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->cursorMonSprite->invisible = TRUE;
2018-12-11 23:09:12 +01:00
}
}
2018-12-16 21:10:01 +01:00
static void PrintCursorMonInfo(void)
2018-12-11 23:09:12 +01:00
{
FillWindowPixelBuffer(0, PIXEL_FILL(1));
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-11 23:09:12 +01:00
{
2018-12-20 22:14:36 +01:00
AddTextPrinterParameterized(0, 1, sPSSData->cursorMonNickText, 6, 0, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(0, 2, sPSSData->cursorMonSpeciesName, 6, 15, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(0, 2, sPSSData->cursorMonGenderLvlText, 10, 29, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(0, 0, sPSSData->cursorMonItemName, 6, 43, TEXT_SPEED_FF, NULL);
2018-12-11 23:09:12 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
AddTextPrinterParameterized(0, 0, sPSSData->cursorMonItemName, 6, 0, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(0, 1, sPSSData->cursorMonNickText, 6, 13, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(0, 2, sPSSData->cursorMonSpeciesName, 6, 28, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(0, 2, sPSSData->cursorMonGenderLvlText, 10, 42, TEXT_SPEED_FF, NULL);
2018-12-11 23:09:12 +01:00
}
CopyWindowToVram(0, 2);
2018-12-20 22:14:36 +01:00
if (sPSSData->cursorMonSpecies != SPECIES_NONE)
2018-12-11 23:09:12 +01:00
{
2021-02-28 23:22:26 +01:00
UpdateMonMarkingTiles(sPSSData->cursorMonMarkings, sPSSData->field_DA0);
2018-12-20 22:14:36 +01:00
sPSSData->field_D94->invisible = FALSE;
2018-12-11 23:09:12 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->field_D94->invisible = TRUE;
2018-12-11 23:09:12 +01:00
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CA65C(void)
2018-12-11 23:09:12 +01:00
{
u16 i;
2018-12-20 22:14:36 +01:00
if (sPSSData->cursorMonSpecies != SPECIES_NONE)
2018-12-11 23:09:12 +01:00
{
sub_80D27AC(0, 0, 0, 8, 2);
for (i = 0; i < 2; i++)
2018-12-20 22:14:36 +01:00
StartSpriteAnimIfDifferent(sPSSData->field_D98[i], i * 2 + 1);
2018-12-11 23:09:12 +01:00
}
else
{
sub_80D27AC(0, 0, 2, 8, 2);
for (i = 0; i < 2; i++)
2018-12-20 22:14:36 +01:00
StartSpriteAnim(sPSSData->field_D98[i], i * 2);
2018-12-11 23:09:12 +01:00
}
sub_80D2918(0);
2020-05-14 10:37:09 +02:00
ScheduleBgCopyTilemapToVram(1);
2018-12-11 23:09:12 +01:00
}
2018-12-12 23:19:50 +01:00
2018-12-16 21:10:01 +01:00
static void sub_80CA704(void)
2018-12-12 23:19:50 +01:00
{
2018-12-20 22:14:36 +01:00
LZ77UnCompWram(gUnknown_08DD36C8, sPSSData->field_B0);
2018-12-12 23:19:50 +01:00
LoadPalette(gPSSMenu_Pal, 0x10, 0x20);
2018-12-20 22:14:36 +01:00
sub_80D2644(1, 1, sPSSData->field_B0, 12, 22);
2018-12-12 23:19:50 +01:00
sub_80D2644(2, 1, gUnknown_0857245C, 9, 4);
sub_80D2770(1, 10, 0);
sub_80D2770(2, 21, 0);
sub_80CAA74();
if (sInPartyMenu)
{
sub_80CA984(TRUE);
2018-12-15 23:58:47 +01:00
CreatePartyMonsSprites(TRUE);
2018-12-12 23:19:50 +01:00
sub_80D2918(2);
sub_80D2918(1);
}
else
{
sub_80D27AC(1, 0, 20, 12, 2);
sub_80CA984(TRUE);
sub_80D2918(1);
sub_80D2918(2);
}
2020-05-14 10:37:09 +02:00
ScheduleBgCopyTilemapToVram(1);
2018-12-20 22:14:36 +01:00
sPSSData->unk_02C7 = 0;
2018-12-12 23:19:50 +01:00
}
2018-12-16 21:10:01 +01:00
static void SetUpShowPartyMenu(void)
2018-12-12 23:19:50 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_2C0 = 20;
sPSSData->field_2C2 = 2;
sPSSData->field_2C5 = 0;
2018-12-15 23:58:47 +01:00
CreatePartyMonsSprites(FALSE);
2018-12-12 23:19:50 +01:00
}
2018-12-16 21:10:01 +01:00
static bool8 ShowPartyMenu(void)
2018-12-12 23:19:50 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2C5 == 20)
2018-12-12 23:19:50 +01:00
return FALSE;
2018-12-20 22:14:36 +01:00
sPSSData->field_2C0--;
sPSSData->field_2C2++;
2018-12-12 23:19:50 +01:00
sub_80D27F4(1, 3, 1);
sub_80D2918(1);
2020-05-14 10:37:09 +02:00
ScheduleBgCopyTilemapToVram(1);
2018-12-12 23:19:50 +01:00
sub_80CBAF0(8);
2018-12-20 22:14:36 +01:00
if (++sPSSData->field_2C5 == 20)
2018-12-12 23:19:50 +01:00
{
sInPartyMenu = TRUE;
return FALSE;
}
else
{
return TRUE;
}
}
2018-12-16 21:10:01 +01:00
static void SetUpHidePartyMenu(void)
2018-12-12 23:19:50 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_2C0 = 0;
sPSSData->field_2C2 = 22;
sPSSData->field_2C5 = 0;
if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
2018-12-12 23:19:50 +01:00
sub_80D11CC();
}
2018-12-16 21:10:01 +01:00
static bool8 HidePartyMenu(void)
2018-12-12 23:19:50 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2C5 != 20)
2018-12-12 23:19:50 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_2C0++;
sPSSData->field_2C2--;
2018-12-12 23:19:50 +01:00
sub_80D27F4(1, 3, -1);
sub_80D2918(1);
2018-12-20 22:14:36 +01:00
FillBgTilemapBufferRect_Palette0(1, 0x100, 10, sPSSData->field_2C2, 12, 1);
2018-12-12 23:19:50 +01:00
sub_80CBAF0(-8);
2018-12-20 22:14:36 +01:00
if (++sPSSData->field_2C5 != 20)
2018-12-12 23:19:50 +01:00
{
2020-05-14 10:37:09 +02:00
ScheduleBgCopyTilemapToVram(1);
2018-12-12 23:19:50 +01:00
return TRUE;
}
else
{
sInPartyMenu = FALSE;
2018-12-15 23:58:47 +01:00
DestroyAllPartyMonIcons();
2018-12-12 23:19:50 +01:00
CompactPartySlots();
sub_80D27AC(2, 0, 0, 9, 2);
sub_80D2918(2);
2020-05-14 10:37:09 +02:00
ScheduleBgCopyTilemapToVram(1);
2018-12-12 23:19:50 +01:00
return FALSE;
}
}
return FALSE;
}
2018-12-16 21:10:01 +01:00
static void sub_80CA984(bool8 arg0)
2018-12-12 23:19:50 +01:00
{
if (arg0)
sub_80D27AC(2, 0, 0, 9, 2);
else
sub_80D27AC(2, 0, 2, 9, 2);
sub_80D2918(2);
2020-05-14 10:37:09 +02:00
ScheduleBgCopyTilemapToVram(1);
2018-12-12 23:19:50 +01:00
}
2018-12-16 21:10:01 +01:00
static void sub_80CA9C0(void)
2018-12-12 23:19:50 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->unk_02C7 = 1;
sPSSData->unk_02C8 = 30;
sPSSData->unk_02C9 = TRUE;
2018-12-12 23:19:50 +01:00
}
2018-12-16 21:10:01 +01:00
static void sub_80CA9EC(void)
2018-12-12 23:19:50 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->unk_02C7)
2018-12-12 23:19:50 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->unk_02C7 = 0;
2018-12-12 23:19:50 +01:00
sub_80CA984(TRUE);
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CAA14(void)
2018-12-12 23:19:50 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->unk_02C7 && ++sPSSData->unk_02C8 > 30)
2018-12-12 23:19:50 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->unk_02C8 = 0;
sPSSData->unk_02C9 = (sPSSData->unk_02C9 == FALSE);
sub_80CA984(sPSSData->unk_02C9);
2018-12-12 23:19:50 +01:00
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CAA74(void)
2018-12-12 23:19:50 +01:00
{
u8 i;
for (i = 1; i < PARTY_SIZE; i++)
{
s32 species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES);
sub_80CAAA8(i, (species != SPECIES_NONE));
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CAAA8(u8 arg0, bool8 isPartyMon)
2018-12-12 23:19:50 +01:00
{
u16 i, j, index;
const u16 *data;
if (isPartyMon)
data = gUnknown_085724A4;
else
data = gUnknown_085724BC;
index = 3 * (3 * (arg0 - 1) + 1);
index *= 4;
index += 7;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
2018-12-20 22:14:36 +01:00
sPSSData->field_B0[index + j] = data[j];
2018-12-12 23:19:50 +01:00
}
data += 4;
index += 12;
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CAB20(void)
2018-12-12 23:19:50 +01:00
{
sub_80CAA74();
sub_80D27AC(1, 0, 0, 12, 22);
sub_80D2918(1);
2020-05-14 10:37:09 +02:00
ScheduleBgCopyTilemapToVram(1);
2018-12-12 23:19:50 +01:00
}
2018-12-16 21:10:01 +01:00
static void SetUpDoShowPartyMenu(void)
2018-12-12 23:19:50 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->showPartyMenuState = 0;
2018-12-12 23:19:50 +01:00
PlaySE(SE_WIN_OPEN);
SetUpShowPartyMenu();
}
2018-12-16 21:10:01 +01:00
static bool8 DoShowPartyMenu(void)
2018-12-12 23:19:50 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->showPartyMenuState)
2018-12-12 23:19:50 +01:00
{
case 0:
if (!ShowPartyMenu())
{
sub_80CDBA0();
2018-12-20 22:14:36 +01:00
sPSSData->showPartyMenuState++;
2018-12-12 23:19:50 +01:00
}
break;
case 1:
if (!sub_80CD554())
{
2018-12-20 22:14:36 +01:00
if (sPSSData->setMosaic)
2018-12-12 23:19:50 +01:00
BoxSetMosaic();
2018-12-20 22:14:36 +01:00
sPSSData->showPartyMenuState++;
2018-12-12 23:19:50 +01:00
}
break;
case 2:
return FALSE;
}
return TRUE;
}
2018-12-16 21:10:01 +01:00
static void sub_80CABE0(void)
2018-12-12 23:19:50 +01:00
{
2019-09-17 07:49:07 +02:00
if (sLastUsedBox != StorageGetCurrentBox())
2018-12-12 23:19:50 +01:00
{
2019-09-17 07:49:07 +02:00
FlagClear(FLAG_SHOWN_BOX_WAS_FULL_MESSAGE);
VarSet(VAR_PC_BOX_TO_SEND_MON, StorageGetCurrentBox());
2018-12-12 23:19:50 +01:00
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CAC1C(void)
2018-12-12 23:19:50 +01:00
{
SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(29));
LoadUserWindowBorderGfx(1, 2, 208);
FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 17);
CopyBgTilemapBufferToVram(0);
}
2021-04-15 19:31:18 +02:00
static void PrintMessage(u8 id)
2018-12-12 23:19:50 +01:00
{
u8 *txtPtr;
DynamicPlaceholderTextUtil_Reset();
2021-04-15 19:31:18 +02:00
switch (sMessages[id].format)
2018-12-12 23:19:50 +01:00
{
2021-04-15 19:31:18 +02:00
case MSG_FORMAT_NORMAL:
2018-12-12 23:19:50 +01:00
break;
2021-04-15 19:31:18 +02:00
case MSG_FORMAT_MON_NAME_1:
case MSG_FORMAT_MON_NAME_2:
case MSG_FORMAT_MON_NAME_3:
2018-12-20 22:14:36 +01:00
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPSSData->cursorMonNick);
2018-12-12 23:19:50 +01:00
break;
2021-04-15 19:31:18 +02:00
case MSG_FORMAT_MON_NAME_4:
case MSG_FORMAT_MON_NAME_5:
case MSG_FORMAT_MON_NAME_6:
2018-12-20 22:14:36 +01:00
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPSSData->field_21E0);
2018-12-12 23:19:50 +01:00
break;
2021-04-15 19:31:18 +02:00
case MSG_FORMAT_ITEM_NAME:
2018-12-19 22:47:27 +01:00
if (IsActiveItemMoving())
2018-12-20 22:14:36 +01:00
txtPtr = StringCopy(sPSSData->itemName, GetMovingItemName());
2018-12-12 23:19:50 +01:00
else
2018-12-20 22:14:36 +01:00
txtPtr = StringCopy(sPSSData->itemName, sPSSData->cursorMonItemName);
2018-12-12 23:19:50 +01:00
while (*(txtPtr - 1) == CHAR_SPACE)
txtPtr--;
*txtPtr = EOS;
2018-12-20 22:14:36 +01:00
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPSSData->itemName);
2018-12-12 23:19:50 +01:00
break;
}
2021-04-15 19:31:18 +02:00
DynamicPlaceholderTextUtil_ExpandPlaceholders(sPSSData->field_2190, sMessages[id].text);
FillWindowPixelBuffer(1, PIXEL_FILL(1));
2018-12-20 22:14:36 +01:00
AddTextPrinterParameterized(1, 1, sPSSData->field_2190, 0, 1, TEXT_SPEED_FF, NULL);
2019-04-01 00:59:52 +02:00
DrawTextBorderOuter(1, 2, 14);
2018-12-12 23:19:50 +01:00
PutWindowTilemap(1);
CopyWindowToVram(1, 2);
2020-05-14 10:37:09 +02:00
ScheduleBgCopyTilemapToVram(0);
2018-12-12 23:19:50 +01:00
}
2018-12-19 22:47:27 +01:00
static void ShowYesNoWindow(s8 cursorPos)
2018-12-12 23:19:50 +01:00
{
CreateYesNoMenu(&sYesNoWindowTemplate, 11, 14, 0);
2018-12-16 21:10:01 +01:00
Menu_MoveCursorNoWrapAround(cursorPos);
2018-12-12 23:19:50 +01:00
}
2018-12-19 22:47:27 +01:00
static void ClearBottomWindow(void)
2018-12-12 23:19:50 +01:00
{
ClearStdWindowAndFrameToTransparent(1, FALSE);
2020-05-14 10:37:09 +02:00
ScheduleBgCopyTilemapToVram(0);
2018-12-12 23:19:50 +01:00
}
2018-12-16 21:10:01 +01:00
static void AddWallpaperSetsMenu(void)
2018-12-12 23:19:50 +01:00
{
2018-12-16 21:10:01 +01:00
InitMenu();
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_SCENERY_1);
SetMenuText(MENU_SCENERY_2);
SetMenuText(MENU_SCENERY_3);
SetMenuText(MENU_ETCETERA);
2018-12-12 23:19:50 +01:00
if (IsWaldaWallpaperUnlocked())
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_FRIENDS);
2018-12-16 21:10:01 +01:00
AddMenu();
2018-12-12 23:19:50 +01:00
}
2018-12-16 21:10:01 +01:00
static void AddWallpapersMenu(u8 wallpaperSet)
2018-12-12 23:19:50 +01:00
{
2018-12-16 21:10:01 +01:00
InitMenu();
2018-12-12 23:19:50 +01:00
switch (wallpaperSet)
{
2021-04-15 20:06:25 +02:00
case MENU_SCENERY_1 - MENU_WALLPAPER_SETS_START:
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_FOREST);
SetMenuText(MENU_CITY);
SetMenuText(MENU_DESERT);
SetMenuText(MENU_SAVANNA);
2018-12-12 23:19:50 +01:00
break;
2021-04-15 20:06:25 +02:00
case MENU_SCENERY_2 - MENU_WALLPAPER_SETS_START:
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_CRAG);
SetMenuText(MENU_VOLCANO);
SetMenuText(MENU_SNOW);
SetMenuText(MENU_CAVE);
2018-12-12 23:19:50 +01:00
break;
2021-04-15 20:06:25 +02:00
case MENU_SCENERY_3 - MENU_WALLPAPER_SETS_START:
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_BEACH);
SetMenuText(MENU_SEAFLOOR);
SetMenuText(MENU_RIVER);
SetMenuText(MENU_SKY);
2018-12-12 23:19:50 +01:00
break;
2021-04-15 20:06:25 +02:00
case MENU_ETCETERA - MENU_WALLPAPER_SETS_START:
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_POLKADOT);
SetMenuText(MENU_POKECENTER);
SetMenuText(MENU_MACHINE);
SetMenuText(MENU_SIMPLE);
2018-12-12 23:19:50 +01:00
break;
}
2018-12-16 21:10:01 +01:00
AddMenu();
2018-12-12 23:19:50 +01:00
}
2018-12-19 22:47:27 +01:00
static u8 GetCurrentBoxOption(void)
2018-12-12 23:19:50 +01:00
{
return sCurrentBoxOption;
}
2018-12-16 21:10:01 +01:00
static void sub_80CAEAC(void)
2018-12-12 23:19:50 +01:00
{
if (!IsCursorOnBox())
{
if (sInPartyMenu)
2018-12-17 23:00:08 +01:00
sub_80D0D8C(CURSOR_AREA_IN_PARTY, GetBoxCursorPosition());
2018-12-12 23:19:50 +01:00
else
2018-12-17 23:00:08 +01:00
sub_80D0D8C(CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
2018-12-12 23:19:50 +01:00
}
2020-03-09 02:27:29 +01:00
if (sMovingItemId != ITEM_NONE)
2018-12-12 23:19:50 +01:00
{
2020-03-08 02:45:04 +01:00
sub_80D0F38(sMovingItemId);
2018-12-12 23:19:50 +01:00
sub_80CFE54(3);
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CAF04(void)
2018-12-12 23:19:50 +01:00
{
u16 i;
LoadMonIconPalettes();
for (i = 0; i < 40; i++)
2018-12-20 22:14:36 +01:00
sPSSData->field_B08[i] = 0;
2018-12-12 23:19:50 +01:00
for (i = 0; i < 40; i++)
2018-12-20 22:14:36 +01:00
sPSSData->field_B58[i] = 0;
2018-12-12 23:19:50 +01:00
for (i = 0; i < PARTY_SIZE; i++)
2018-12-20 22:14:36 +01:00
sPSSData->partySprites[i] = NULL;
2018-12-12 23:19:50 +01:00
for (i = 0; i < IN_BOX_COUNT; i++)
2018-12-20 22:14:36 +01:00
sPSSData->boxMonsSprites[i] = NULL;
2018-12-12 23:19:50 +01:00
2018-12-20 22:14:36 +01:00
sPSSData->movingMonSprite = NULL;
sPSSData->field_78C = 0;
2018-12-12 23:19:50 +01:00
}
2018-12-15 23:58:47 +01:00
2018-12-19 22:47:27 +01:00
static u8 sub_80CAFAC(void)
2018-12-15 23:58:47 +01:00
{
return (IsCursorInBox() ? 2 : 1);
}
2018-12-19 22:47:27 +01:00
static void CreateMovingMonIcon(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
u32 personality = GetMonData(&sPSSData->movingMon, MON_DATA_PERSONALITY);
u16 species = GetMonData(&sPSSData->movingMon, MON_DATA_SPECIES2);
2018-12-15 23:58:47 +01:00
u8 priority = sub_80CAFAC();
2018-12-20 22:14:36 +01:00
sPSSData->movingMonSprite = CreateMonIconSprite(species, personality, 0, 0, priority, 7);
sPSSData->movingMonSprite->callback = sub_80CC100;
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
static void InitBoxMonSprites(u8 boxId)
2018-12-15 23:58:47 +01:00
{
u8 boxPosition;
u16 i, j, count;
u16 species;
u32 personality;
count = 0;
boxPosition = 0;
2021-04-15 20:06:25 +02:00
// For each box slot, create a Pokémon icon if a species is present
2018-12-22 23:00:22 +01:00
for (i = 0; i < IN_BOX_COLUMNS; i++)
2018-12-15 23:58:47 +01:00
{
for (j = 0; j < IN_BOX_ROWS; j++)
{
species = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_SPECIES2);
if (species != SPECIES_NONE)
{
personality = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_PERSONALITY);
2018-12-20 22:14:36 +01:00
sPSSData->boxMonsSprites[count] = CreateMonIconSprite(species, personality, 8 * (3 * j) + 100, 8 * (3 * i) + 44, 2, 19 - j);
2018-12-15 23:58:47 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->boxMonsSprites[count] = NULL;
2018-12-15 23:58:47 +01:00
}
boxPosition++;
count++;
}
}
2021-04-15 20:06:25 +02:00
// If in item mode, set all Pokémon icons with no item to be transparent
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
2018-12-15 23:58:47 +01:00
{
for (boxPosition = 0; boxPosition < IN_BOX_COUNT; boxPosition++)
{
2021-04-15 20:06:25 +02:00
if (GetBoxMonDataAt(boxId, boxPosition, MON_DATA_HELD_ITEM) == ITEM_NONE)
sPSSData->boxMonsSprites[boxPosition]->oam.objMode = ST_OAM_OBJ_BLEND;
2018-12-15 23:58:47 +01:00
}
}
}
2018-12-19 22:47:27 +01:00
static void sub_80CB140(u8 boxPosition)
2018-12-15 23:58:47 +01:00
{
u16 species = GetCurrentBoxMonData(boxPosition, MON_DATA_SPECIES2);
if (species != SPECIES_NONE)
{
s16 x = 8 * (3 * (boxPosition % IN_BOX_ROWS)) + 100;
s16 y = 8 * (3 * (boxPosition / IN_BOX_ROWS)) + 44;
u32 personality = GetCurrentBoxMonData(boxPosition, MON_DATA_PERSONALITY);
2018-12-20 22:14:36 +01:00
sPSSData->boxMonsSprites[boxPosition] = CreateMonIconSprite(species, personality, x, y, 2, 19 - (boxPosition % IN_BOX_ROWS));
if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
sPSSData->boxMonsSprites[boxPosition]->oam.objMode = ST_OAM_OBJ_BLEND;
2018-12-15 23:58:47 +01:00
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CB1F0(s16 arg0)
2018-12-15 23:58:47 +01:00
{
u16 i;
for (i = 0; i < IN_BOX_COUNT; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->boxMonsSprites[i] != NULL)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->boxMonsSprites[i]->data[2] = arg0;
sPSSData->boxMonsSprites[i]->data[4] = 1;
sPSSData->boxMonsSprites[i]->callback = sub_80CB278;
2018-12-15 23:58:47 +01:00
}
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CB234(struct Sprite *sprite)
2018-12-15 23:58:47 +01:00
{
if (sprite->data[1] != 0)
{
sprite->data[1]--;
sprite->pos1.x += sprite->data[2];
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->field_C66--;
2018-12-15 23:58:47 +01:00
sprite->pos1.x = sprite->data[3];
sprite->callback = SpriteCallbackDummy;
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CB278(struct Sprite *sprite)
2018-12-15 23:58:47 +01:00
{
if (sprite->data[4] != 0)
{
sprite->data[4]--;
}
else
{
sprite->pos1.x += sprite->data[2];
sprite->data[5] = sprite->pos1.x + sprite->pos2.x;
if (sprite->data[5] <= 68 || sprite->data[5] >= 252)
sprite->callback = SpriteCallbackDummy;
}
}
2018-12-16 21:10:01 +01:00
static void DestroyAllIconsInRow(u8 row)
2018-12-15 23:58:47 +01:00
{
u16 column;
u8 boxPosition = row;
2018-12-22 23:00:22 +01:00
for (column = 0; column < IN_BOX_COLUMNS; column++)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->boxMonsSprites[boxPosition] != NULL)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
DestroyBoxMonIcon(sPSSData->boxMonsSprites[boxPosition]);
sPSSData->boxMonsSprites[boxPosition] = NULL;
2018-12-15 23:58:47 +01:00
}
boxPosition += IN_BOX_ROWS;
}
}
2018-12-19 22:47:27 +01:00
static u8 sub_80CB2F8(u8 row, u16 times, s16 xDelta)
2018-12-15 23:58:47 +01:00
{
s32 i;
u16 y = 44;
s16 xDest = 8 * (3 * row) + 100;
u16 x = xDest - ((times + 1) * xDelta);
u8 subpriority = 19 - row;
u8 count = 0;
u8 boxPosition = row;
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-15 23:58:47 +01:00
{
2018-12-22 23:00:22 +01:00
for (i = 0; i < IN_BOX_COLUMNS; i++)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->boxSpecies[boxPosition] != SPECIES_NONE)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->boxMonsSprites[boxPosition] = CreateMonIconSprite(sPSSData->boxSpecies[boxPosition],
sPSSData->boxPersonalities[boxPosition],
2018-12-15 23:58:47 +01:00
x, y, 2, subpriority);
2018-12-20 22:14:36 +01:00
if (sPSSData->boxMonsSprites[boxPosition] != NULL)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->boxMonsSprites[boxPosition]->data[1] = times;
sPSSData->boxMonsSprites[boxPosition]->data[2] = xDelta;
sPSSData->boxMonsSprites[boxPosition]->data[3] = xDest;
sPSSData->boxMonsSprites[boxPosition]->callback = sub_80CB234;
2018-12-15 23:58:47 +01:00
count++;
}
}
boxPosition += IN_BOX_ROWS;
y += 24;
}
}
else
{
2018-12-22 23:00:22 +01:00
for (i = 0; i < IN_BOX_COLUMNS; i++)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->boxSpecies[boxPosition] != SPECIES_NONE)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->boxMonsSprites[boxPosition] = CreateMonIconSprite(sPSSData->boxSpecies[boxPosition],
sPSSData->boxPersonalities[boxPosition],
2018-12-15 23:58:47 +01:00
x, y, 2, subpriority);
2018-12-20 22:14:36 +01:00
if (sPSSData->boxMonsSprites[boxPosition] != NULL)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->boxMonsSprites[boxPosition]->data[1] = times;
sPSSData->boxMonsSprites[boxPosition]->data[2] = xDelta;
sPSSData->boxMonsSprites[boxPosition]->data[3] = xDest;
sPSSData->boxMonsSprites[boxPosition]->callback = sub_80CB234;
if (GetBoxMonDataAt(sPSSData->field_C5C, boxPosition, MON_DATA_HELD_ITEM) == 0)
sPSSData->boxMonsSprites[boxPosition]->oam.objMode = ST_OAM_OBJ_BLEND;
2018-12-15 23:58:47 +01:00
count++;
}
}
boxPosition += IN_BOX_ROWS;
y += 24;
}
}
return count;
}
2018-12-16 21:10:01 +01:00
static void sub_80CB4CC(u8 boxId, s8 direction)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_C6A = 0;
sPSSData->field_C6B = boxId;
sPSSData->field_C69 = direction;
sPSSData->field_C60 = 32;
sPSSData->field_C64 = -(6 * direction);
sPSSData->field_C66 = 0;
2018-12-15 23:58:47 +01:00
SetBoxSpeciesAndPersonalities(boxId);
if (direction > 0)
2018-12-20 22:14:36 +01:00
sPSSData->field_C68 = 0;
2018-12-15 23:58:47 +01:00
else
2018-12-20 22:14:36 +01:00
sPSSData->field_C68 = IN_BOX_ROWS - 1;
2018-12-15 23:58:47 +01:00
2018-12-20 22:14:36 +01:00
sPSSData->field_C62 = (24 * sPSSData->field_C68) + 100;
sub_80CB1F0(sPSSData->field_C64);
2018-12-15 23:58:47 +01:00
}
2018-12-16 21:10:01 +01:00
static bool8 sub_80CB584(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_C60 != 0)
sPSSData->field_C60--;
2018-12-15 23:58:47 +01:00
2018-12-20 22:14:36 +01:00
switch (sPSSData->field_C6A)
2018-12-15 23:58:47 +01:00
{
case 0:
2018-12-20 22:14:36 +01:00
sPSSData->field_C62 += sPSSData->field_C64;
if (sPSSData->field_C62 <= 64 || sPSSData->field_C62 >= 252)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
DestroyAllIconsInRow(sPSSData->field_C68);
sPSSData->field_C62 += sPSSData->field_C69 * 24;
sPSSData->field_C6A++;
2018-12-15 23:58:47 +01:00
}
break;
case 1:
2018-12-20 22:14:36 +01:00
sPSSData->field_C62 += sPSSData->field_C64;
sPSSData->field_C66 += sub_80CB2F8(sPSSData->field_C68, sPSSData->field_C60, sPSSData->field_C64);
if ((sPSSData->field_C69 > 0 && sPSSData->field_C68 == IN_BOX_ROWS - 1)
|| (sPSSData->field_C69 < 0 && sPSSData->field_C68 == 0))
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_C6A++;
2018-12-15 23:58:47 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->field_C68 += sPSSData->field_C69;
sPSSData->field_C6A = 0;
2018-12-15 23:58:47 +01:00
}
break;
case 2:
2018-12-20 22:14:36 +01:00
if (sPSSData->field_C66 == 0)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_C60++;
2018-12-15 23:58:47 +01:00
return FALSE;
}
break;
default:
return FALSE;
}
return TRUE;
}
2018-12-16 21:10:01 +01:00
static void SetBoxSpeciesAndPersonalities(u8 boxId)
2018-12-15 23:58:47 +01:00
{
s32 i, j, boxPosition;
boxPosition = 0;
2018-12-22 23:00:22 +01:00
for (i = 0; i < IN_BOX_COLUMNS; i++)
2018-12-15 23:58:47 +01:00
{
for (j = 0; j < IN_BOX_ROWS; j++)
{
2018-12-20 22:14:36 +01:00
sPSSData->boxSpecies[boxPosition] = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_SPECIES2);
if (sPSSData->boxSpecies[boxPosition] != SPECIES_NONE)
sPSSData->boxPersonalities[boxPosition] = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_PERSONALITY);
2018-12-15 23:58:47 +01:00
boxPosition++;
}
}
2018-12-20 22:14:36 +01:00
sPSSData->field_C5C = boxId;
2018-12-15 23:58:47 +01:00
}
2018-12-19 22:47:27 +01:00
static void DestroyBoxMonIconAtPosition(u8 boxPosition)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->boxMonsSprites[boxPosition] != NULL)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
DestroyBoxMonIcon(sPSSData->boxMonsSprites[boxPosition]);
sPSSData->boxMonsSprites[boxPosition] = NULL;
2018-12-15 23:58:47 +01:00
}
}
2018-12-19 22:47:27 +01:00
static void SetBoxMonIconObjMode(u8 boxPosition, u8 objMode)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->boxMonsSprites[boxPosition] != NULL)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->boxMonsSprites[boxPosition]->oam.objMode = objMode;
2018-12-15 23:58:47 +01:00
}
}
2018-12-19 22:47:27 +01:00
static void CreatePartyMonsSprites(bool8 arg0)
2018-12-15 23:58:47 +01:00
{
u16 i, count;
u16 species = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES2);
u32 personality = GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY);
2018-12-20 22:14:36 +01:00
sPSSData->partySprites[0] = CreateMonIconSprite(species, personality, 104, 64, 1, 12);
2018-12-15 23:58:47 +01:00
count = 1;
for (i = 1; i < PARTY_SIZE; i++)
{
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
if (species != SPECIES_NONE)
{
personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY);
2018-12-20 22:14:36 +01:00
sPSSData->partySprites[i] = CreateMonIconSprite(species, personality, 152, 8 * (3 * (i - 1)) + 16, 1, 12);
2018-12-15 23:58:47 +01:00
count++;
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->partySprites[i] = NULL;
2018-12-15 23:58:47 +01:00
}
}
if (!arg0)
{
for (i = 0; i < count; i++)
{
2018-12-20 22:14:36 +01:00
sPSSData->partySprites[i]->pos1.y -= 160;
sPSSData->partySprites[i]->invisible = TRUE;
2018-12-15 23:58:47 +01:00
}
}
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
2018-12-15 23:58:47 +01:00
{
for (i = 0; i < PARTY_SIZE; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->partySprites[i] != NULL && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == 0)
sPSSData->partySprites[i]->oam.objMode = ST_OAM_OBJ_BLEND;
2018-12-15 23:58:47 +01:00
}
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CB950(void)
2018-12-15 23:58:47 +01:00
{
u16 i, count;
2018-12-20 22:14:36 +01:00
sPSSData->field_C5E = 0;
2018-12-15 23:58:47 +01:00
for (i = 0, count = 0; i < PARTY_SIZE; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->partySprites[i] != NULL)
2018-12-15 23:58:47 +01:00
{
if (i != count)
{
2018-12-20 22:14:36 +01:00
sub_80CB9D0(sPSSData->partySprites[i], count);
sPSSData->partySprites[i] = NULL;
sPSSData->field_C5E++;
2018-12-15 23:58:47 +01:00
}
count++;
}
}
}
2018-12-19 22:47:27 +01:00
static u8 sub_80CB9BC(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
return sPSSData->field_C5E;
2018-12-15 23:58:47 +01:00
}
2018-12-16 21:10:01 +01:00
static void sub_80CB9D0(struct Sprite *sprite, u16 partyId)
2018-12-15 23:58:47 +01:00
{
s16 x, y;
sprite->data[1] = partyId;
if (partyId == 0)
x = 104, y = 64;
else
x = 152, y = 8 * (3 * (partyId - 1)) + 16;
sprite->data[2] = (u16)(sprite->pos1.x) * 8;
sprite->data[3] = (u16)(sprite->pos1.y) * 8;
sprite->data[4] = ((x * 8) - sprite->data[2]) / 8;
sprite->data[5] = ((y * 8) - sprite->data[3]) / 8;
sprite->data[6] = 8;
sprite->callback = sub_80CBA3C;
}
2018-12-16 21:10:01 +01:00
static void sub_80CBA3C(struct Sprite *sprite)
2018-12-15 23:58:47 +01:00
{
if (sprite->data[6] != 0)
{
s16 x = sprite->data[2] += sprite->data[4];
s16 y = sprite->data[3] += sprite->data[5];
sprite->pos1.x = x / 8u;
sprite->pos1.y = y / 8u;
sprite->data[6]--;
}
else
{
if (sprite->data[1] == 0)
{
sprite->pos1.x = 104;
sprite->pos1.y = 64;
}
else
{
sprite->pos1.x = 152;
sprite->pos1.y = 8 * (3 * (sprite->data[1] - 1)) + 16;
}
sprite->callback = SpriteCallbackDummy;
2018-12-20 22:14:36 +01:00
sPSSData->partySprites[sprite->data[1]] = sprite;
sPSSData->field_C5E--;
2018-12-15 23:58:47 +01:00
}
}
2018-12-16 21:10:01 +01:00
static void DestroyMovingMonIcon(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->movingMonSprite != NULL)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
DestroyBoxMonIcon(sPSSData->movingMonSprite);
sPSSData->movingMonSprite = NULL;
2018-12-15 23:58:47 +01:00
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CBAF0(s16 yDelta)
2018-12-15 23:58:47 +01:00
{
u16 i, posY;
for (i = 0; i < PARTY_SIZE; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->partySprites[i] != NULL)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->partySprites[i]->pos1.y += yDelta;
posY = sPSSData->partySprites[i]->pos1.y + sPSSData->partySprites[i]->pos2.y + sPSSData->partySprites[i]->centerToCornerVecY;
2018-12-15 23:58:47 +01:00
posY += 16;
if (posY > 192)
2018-12-20 22:14:36 +01:00
sPSSData->partySprites[i]->invisible = TRUE;
2018-12-15 23:58:47 +01:00
else
2018-12-20 22:14:36 +01:00
sPSSData->partySprites[i]->invisible = FALSE;
2018-12-15 23:58:47 +01:00
}
}
}
2018-12-16 21:10:01 +01:00
static void DestroyPartyMonIcon(u8 partyId)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->partySprites[partyId] != NULL)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
DestroyBoxMonIcon(sPSSData->partySprites[partyId]);
sPSSData->partySprites[partyId] = NULL;
2018-12-15 23:58:47 +01:00
}
}
2018-12-16 21:10:01 +01:00
static void DestroyAllPartyMonIcons(void)
2018-12-15 23:58:47 +01:00
{
u16 i;
for (i = 0; i < PARTY_SIZE; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->partySprites[i] != NULL)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
DestroyBoxMonIcon(sPSSData->partySprites[i]);
sPSSData->partySprites[i] = NULL;
2018-12-15 23:58:47 +01:00
}
}
}
2018-12-19 22:47:27 +01:00
static void SetPartyMonIconObjMode(u8 partyId, u8 objMode)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->partySprites[partyId] != NULL)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->partySprites[partyId]->oam.objMode = objMode;
2018-12-15 23:58:47 +01:00
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CBC14(u8 mode, u8 id)
2018-12-15 23:58:47 +01:00
{
if (mode == MODE_PARTY)
{
2018-12-20 22:14:36 +01:00
sPSSData->movingMonSprite = sPSSData->partySprites[id];
sPSSData->partySprites[id] = NULL;
2018-12-15 23:58:47 +01:00
}
else if (mode == MODE_BOX)
{
2018-12-20 22:14:36 +01:00
sPSSData->movingMonSprite = sPSSData->boxMonsSprites[id];
sPSSData->boxMonsSprites[id] = NULL;
2018-12-15 23:58:47 +01:00
}
else
{
return;
}
2018-12-20 22:14:36 +01:00
sPSSData->movingMonSprite->callback = sub_80CC100;
sPSSData->movingMonSprite->oam.priority = sub_80CAFAC();
sPSSData->movingMonSprite->subpriority = 7;
2018-12-15 23:58:47 +01:00
}
2018-12-16 21:10:01 +01:00
static void sub_80CBCAC(u8 boxId, u8 position)
2018-12-15 23:58:47 +01:00
{
if (boxId == TOTAL_BOXES_COUNT) // party mon
{
2018-12-20 22:14:36 +01:00
sPSSData->partySprites[position] = sPSSData->movingMonSprite;
sPSSData->partySprites[position]->oam.priority = 1;
sPSSData->partySprites[position]->subpriority = 12;
2018-12-15 23:58:47 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->boxMonsSprites[position] = sPSSData->movingMonSprite;
sPSSData->boxMonsSprites[position]->oam.priority = 2;
sPSSData->boxMonsSprites[position]->subpriority = 19 - (position % IN_BOX_ROWS);
2018-12-15 23:58:47 +01:00
}
2018-12-20 22:14:36 +01:00
sPSSData->movingMonSprite->callback = SpriteCallbackDummy;
sPSSData->movingMonSprite = NULL;
2018-12-15 23:58:47 +01:00
}
2018-12-16 21:10:01 +01:00
static void sub_80CBD5C(u8 boxId, u8 position)
2018-12-15 23:58:47 +01:00
{
if (boxId == TOTAL_BOXES_COUNT) // party mon
2018-12-20 22:14:36 +01:00
sPSSData->field_B00 = &sPSSData->partySprites[position];
2018-12-15 23:58:47 +01:00
else
2018-12-20 22:14:36 +01:00
sPSSData->field_B00 = &sPSSData->boxMonsSprites[position];
2018-12-15 23:58:47 +01:00
2018-12-20 22:14:36 +01:00
sPSSData->movingMonSprite->callback = SpriteCallbackDummy;
sPSSData->field_C5D = 0;
2018-12-15 23:58:47 +01:00
}
2018-12-16 21:10:01 +01:00
static bool8 sub_80CBDC4(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_C5D == 16)
2018-12-15 23:58:47 +01:00
return FALSE;
2018-12-20 22:14:36 +01:00
sPSSData->field_C5D++;
if (sPSSData->field_C5D & 1)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
(*sPSSData->field_B00)->pos1.y--;
sPSSData->movingMonSprite->pos1.y++;
2018-12-15 23:58:47 +01:00
}
2018-12-20 22:14:36 +01:00
(*sPSSData->field_B00)->pos2.x = gSineTable[sPSSData->field_C5D * 8] / 16;
sPSSData->movingMonSprite->pos2.x = -(gSineTable[sPSSData->field_C5D * 8] / 16);
if (sPSSData->field_C5D == 8)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->movingMonSprite->oam.priority = (*sPSSData->field_B00)->oam.priority;
sPSSData->movingMonSprite->subpriority = (*sPSSData->field_B00)->subpriority;
(*sPSSData->field_B00)->oam.priority = sub_80CAFAC();
(*sPSSData->field_B00)->subpriority = 7;
2018-12-15 23:58:47 +01:00
}
2018-12-20 22:14:36 +01:00
if (sPSSData->field_C5D == 16)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
struct Sprite *sprite = sPSSData->movingMonSprite;
sPSSData->movingMonSprite = (*sPSSData->field_B00);
*sPSSData->field_B00 = sprite;
2018-12-15 23:58:47 +01:00
2018-12-20 22:14:36 +01:00
sPSSData->movingMonSprite->callback = sub_80CC100;
(*sPSSData->field_B00)->callback = SpriteCallbackDummy;
2018-12-15 23:58:47 +01:00
}
return TRUE;
}
2018-12-16 21:10:01 +01:00
static void sub_80CBF14(u8 mode, u8 position)
2018-12-15 23:58:47 +01:00
{
switch (mode)
{
case MODE_PARTY:
2018-12-20 22:14:36 +01:00
sPSSData->field_B04 = &sPSSData->partySprites[position];
2018-12-15 23:58:47 +01:00
break;
case MODE_BOX:
2018-12-20 22:14:36 +01:00
sPSSData->field_B04 = &sPSSData->boxMonsSprites[position];
2018-12-15 23:58:47 +01:00
break;
2020-03-09 02:27:29 +01:00
case MODE_MOVE:
2018-12-20 22:14:36 +01:00
sPSSData->field_B04 = &sPSSData->movingMonSprite;
2018-12-15 23:58:47 +01:00
break;
default:
return;
}
2018-12-20 22:14:36 +01:00
if (*sPSSData->field_B04 != NULL)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
InitSpriteAffineAnim(*sPSSData->field_B04);
(*sPSSData->field_B04)->oam.affineMode = ST_OAM_AFFINE_NORMAL;
2018-12-20 22:14:36 +01:00
(*sPSSData->field_B04)->affineAnims = gSpriteAffineAnimTable_857291C;
StartSpriteAffineAnim(*sPSSData->field_B04, 0);
2018-12-15 23:58:47 +01:00
}
}
2018-12-16 21:10:01 +01:00
static bool8 sub_80CBFD8(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (*sPSSData->field_B04 == NULL || (*sPSSData->field_B04)->invisible)
2018-12-15 23:58:47 +01:00
return FALSE;
2018-12-20 22:14:36 +01:00
if ((*sPSSData->field_B04)->affineAnimEnded)
(*sPSSData->field_B04)->invisible = TRUE;
2018-12-15 23:58:47 +01:00
return TRUE;
}
2018-12-16 21:10:01 +01:00
static void sub_80CC020(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (*sPSSData->field_B04 != NULL)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
FreeOamMatrix((*sPSSData->field_B04)->oam.matrixNum);
DestroyBoxMonIcon(*sPSSData->field_B04);
*sPSSData->field_B04 = NULL;
2018-12-15 23:58:47 +01:00
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CC064(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (*sPSSData->field_B04 != NULL)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
(*sPSSData->field_B04)->invisible = FALSE;
StartSpriteAffineAnim(*sPSSData->field_B04, 1);
2018-12-15 23:58:47 +01:00
}
}
2018-12-16 21:10:01 +01:00
static bool8 sub_80CC0A0(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_B04 == NULL)
2018-12-15 23:58:47 +01:00
return FALSE;
2018-12-20 22:14:36 +01:00
if ((*sPSSData->field_B04)->affineAnimEnded)
sPSSData->field_B04 = NULL;
2018-12-15 23:58:47 +01:00
return TRUE;
}
2018-12-16 21:10:01 +01:00
static void SetMovingMonPriority(u8 priority)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->movingMonSprite->oam.priority = priority;
2018-12-15 23:58:47 +01:00
}
2018-12-16 21:10:01 +01:00
static void sub_80CC100(struct Sprite *sprite)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sprite->pos1.x = sPSSData->field_CB4->pos1.x;
sprite->pos1.y = sPSSData->field_CB4->pos1.y + sPSSData->field_CB4->pos2.y + 4;
2018-12-15 23:58:47 +01:00
}
2018-12-16 21:10:01 +01:00
static u16 sub_80CC124(u16 species)
2018-12-15 23:58:47 +01:00
{
u16 i, var;
for (i = 0; i < 40; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_B58[i] == species)
2018-12-15 23:58:47 +01:00
break;
}
if (i == 40)
{
for (i = 0; i < 40; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_B58[i] == 0)
2018-12-15 23:58:47 +01:00
break;
}
if (i == 40)
return 0xFFFF;
}
2018-12-20 22:14:36 +01:00
sPSSData->field_B58[i] = species;
sPSSData->field_B08[i]++;
2018-12-15 23:58:47 +01:00
var = 16 * i;
CpuCopy32(GetMonIconTiles(species, TRUE), (void*)(OBJ_VRAM0) + var * 32, 0x200);
return var;
}
2018-12-16 21:10:01 +01:00
static void sub_80CC1E0(u16 species)
2018-12-15 23:58:47 +01:00
{
u16 i;
for (i = 0; i < 40; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_B58[i] == species)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (--sPSSData->field_B08[i] == 0)
sPSSData->field_B58[i] = 0;
2018-12-15 23:58:47 +01:00
break;
}
}
}
static struct Sprite *CreateMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 oamPriority, u8 subpriority)
{
u16 tileNum;
u8 spriteId;
struct SpriteTemplate tempalte = gUnknown_085728D4;
species = GetIconSpecies(species, personality);
tempalte.paletteTag = 0xDAC0 + gMonIconPaletteIndices[species];
tileNum = sub_80CC124(species);
if (tileNum == 0xFFFF)
return NULL;
spriteId = CreateSprite(&tempalte, x, y, subpriority);
if (spriteId == MAX_SPRITES)
{
sub_80CC1E0(species);
return NULL;
}
gSprites[spriteId].oam.tileNum = tileNum;
gSprites[spriteId].oam.priority = oamPriority;
gSprites[spriteId].data[0] = species;
return &gSprites[spriteId];
}
2018-12-16 21:10:01 +01:00
static void DestroyBoxMonIcon(struct Sprite *sprite)
2018-12-15 23:58:47 +01:00
{
sub_80CC1E0(sprite->data[0]);
DestroySprite(sprite);
}
2021-04-15 20:06:25 +02:00
#define tState data[0]
#define tDmaIdx data[1]
#define tBoxId data[2]
static void CreateInitBoxTask(u8 boxId)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
u8 taskId = CreateTask(Task_InitBox, 2);
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
gTasks[taskId].tBoxId = boxId;
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
static bool8 IsInitBoxActive(void)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
return FuncIsActiveTask(Task_InitBox);
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
static void Task_InitBox(u8 taskId)
2018-12-15 23:58:47 +01:00
{
struct Task *task = &gTasks[taskId];
2021-04-15 20:06:25 +02:00
switch (task->tState)
2018-12-15 23:58:47 +01:00
{
case 0:
2021-04-15 20:06:25 +02:00
sPSSData->wallpaperOffset = 0;
2018-12-20 22:14:36 +01:00
sPSSData->bg2_X = 0;
2021-04-15 20:06:25 +02:00
task->tDmaIdx = RequestDma3Fill(0, sPSSData->wallpaperBgTilemapBuffer, sizeof(sPSSData->wallpaperBgTilemapBuffer), 1);
2018-12-15 23:58:47 +01:00
break;
case 1:
2021-04-15 20:06:25 +02:00
if (CheckForSpaceForDma3Request(task->tDmaIdx) == -1)
2018-12-15 23:58:47 +01:00
return;
2021-04-15 20:06:25 +02:00
SetBgTilemapBuffer(2, sPSSData->wallpaperBgTilemapBuffer);
2018-12-15 23:58:47 +01:00
ShowBg(2);
break;
case 2:
2021-04-15 20:06:25 +02:00
LoadWallpaperGfx(task->tBoxId, 0);
2018-12-15 23:58:47 +01:00
break;
case 3:
if (!WaitForWallpaperGfxLoad())
return;
2021-04-15 20:06:25 +02:00
InitBoxTitle(task->tBoxId);
CreateBoxScrollArrows();
InitBoxMonSprites(task->tBoxId);
2018-12-15 23:58:47 +01:00
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(27) | BGCNT_TXT512x256);
break;
case 4:
DestroyTask(taskId);
break;
default:
2021-04-15 20:06:25 +02:00
task->tState = 0;
2018-12-15 23:58:47 +01:00
return;
}
2021-04-15 20:06:25 +02:00
task->tState++;
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
#undef tState
#undef tDmaIdx
#undef tBoxId
2018-12-16 21:10:01 +01:00
static void SetUpScrollToBox(u8 boxId)
2018-12-15 23:58:47 +01:00
{
2020-07-19 03:58:01 +02:00
s8 direction = DetermineBoxScrollDirection(boxId);
2018-12-15 23:58:47 +01:00
2020-07-19 05:08:44 +02:00
sPSSData->wallpaperScrollSpeed = (direction > 0) ? 6 : -6;
2018-12-20 22:14:36 +01:00
sPSSData->field_2D3 = (direction > 0) ? 1 : 2;
sPSSData->field_2D0 = 32;
2021-04-15 20:06:25 +02:00
sPSSData->scrollToBoxIdUnused = boxId;
2018-12-20 22:14:36 +01:00
sPSSData->field_2D6 = (direction <= 0) ? 5 : 0;
2021-04-15 20:06:25 +02:00
sPSSData->scrollDirectionUnused = direction;
2018-12-20 22:14:36 +01:00
sPSSData->field_2DA = (direction > 0) ? 264 : 56;
sPSSData->field_2DC = (direction <= 0) ? 5 : 0;
sPSSData->field_2DE = 0;
sPSSData->field_2E0 = 2;
2021-04-15 20:06:25 +02:00
sPSSData->scrollToBoxId = boxId;
sPSSData->scrollDirection = direction;
sPSSData->scrollState = 0;
2018-12-15 23:58:47 +01:00
}
2018-12-19 22:47:27 +01:00
static bool8 ScrollToBox(void)
2018-12-15 23:58:47 +01:00
{
bool8 var;
2021-04-15 20:06:25 +02:00
switch (sPSSData->scrollState)
2018-12-15 23:58:47 +01:00
{
case 0:
2021-04-15 20:06:25 +02:00
LoadWallpaperGfx(sPSSData->scrollToBoxId, sPSSData->scrollDirection);
sPSSData->scrollState++;
2018-12-15 23:58:47 +01:00
case 1:
if (!WaitForWallpaperGfxLoad())
return TRUE;
2021-04-15 20:06:25 +02:00
sub_80CB4CC(sPSSData->scrollToBoxId, sPSSData->scrollDirection);
CreateIncomingBoxTitle(sPSSData->scrollToBoxId, sPSSData->scrollDirection);
StartBoxScrollArrowsSlide(sPSSData->scrollDirection);
2018-12-15 23:58:47 +01:00
break;
case 2:
var = sub_80CB584();
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2D0 != 0)
2018-12-15 23:58:47 +01:00
{
2020-07-19 05:08:44 +02:00
sPSSData->bg2_X += sPSSData->wallpaperScrollSpeed;
2018-12-20 22:14:36 +01:00
if (--sPSSData->field_2D0 != 0)
2018-12-15 23:58:47 +01:00
return TRUE;
2021-04-15 20:06:25 +02:00
CycleBoxTitleSprites();
StopBoxScrollArrowsSlide();
2018-12-15 23:58:47 +01:00
}
return var;
}
2021-04-15 20:06:25 +02:00
sPSSData->scrollState++;
2018-12-15 23:58:47 +01:00
return TRUE;
}
2020-07-19 03:58:01 +02:00
static s8 DetermineBoxScrollDirection(u8 boxId)
2018-12-15 23:58:47 +01:00
{
u8 i;
u8 currentBox = StorageGetCurrentBox();
for (i = 0; currentBox != boxId; i++)
{
currentBox++;
if (currentBox >= TOTAL_BOXES_COUNT)
currentBox = 0;
}
return (i < TOTAL_BOXES_COUNT / 2) ? 1 : -1;
}
2018-12-16 21:10:01 +01:00
static void SetWallpaperForCurrentBox(u8 wallpaperId)
2018-12-15 23:58:47 +01:00
{
u8 boxId = StorageGetCurrentBox();
SetBoxWallpaper(boxId, wallpaperId);
2018-12-20 22:14:36 +01:00
sPSSData->wallpaperChangeState = 0;
2018-12-15 23:58:47 +01:00
}
2018-12-16 21:10:01 +01:00
static bool8 DoWallpaperGfxChange(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->wallpaperChangeState)
2018-12-15 23:58:47 +01:00
{
case 0:
2021-04-15 20:06:25 +02:00
BeginNormalPaletteFade(sPSSData->boxTitlePalBits, 1, 0, 16, RGB_WHITEALPHA);
2018-12-20 22:14:36 +01:00
sPSSData->wallpaperChangeState++;
2018-12-15 23:58:47 +01:00
break;
case 1:
if (!UpdatePaletteFade())
{
u8 curBox = StorageGetCurrentBox();
LoadWallpaperGfx(curBox, 0);
2018-12-20 22:14:36 +01:00
sPSSData->wallpaperChangeState++;
2018-12-15 23:58:47 +01:00
}
break;
case 2:
if (WaitForWallpaperGfxLoad() == TRUE)
{
2021-04-15 20:06:25 +02:00
CycleBoxTitleColor();
BeginNormalPaletteFade(sPSSData->boxTitlePalBits, 1, 16, 0, RGB_WHITEALPHA);
2018-12-20 22:14:36 +01:00
sPSSData->wallpaperChangeState++;
2018-12-15 23:58:47 +01:00
}
break;
case 3:
if (!UpdatePaletteFade())
2018-12-20 22:14:36 +01:00
sPSSData->wallpaperChangeState++;
2018-12-15 23:58:47 +01:00
break;
case 4:
return FALSE;
}
return TRUE;
}
2018-12-19 22:47:27 +01:00
static void LoadWallpaperGfx(u8 boxId, s8 direction)
2018-12-15 23:58:47 +01:00
{
u8 wallpaperId;
2021-04-15 20:06:25 +02:00
const struct Wallpaper *wallpaper;
2018-12-15 23:58:47 +01:00
void *iconGfx;
2021-04-15 20:06:25 +02:00
u32 tilesSize, iconSize;
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
sPSSData->wallpaperLoadState = 0;
sPSSData->wallpaperLoadBoxId = boxId;
sPSSData->wallpaperLoadDir = direction;
if (sPSSData->wallpaperLoadDir != 0)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
sPSSData->wallpaperOffset = (sPSSData->wallpaperOffset == 0);
TrimOldWallpaper(sPSSData->wallpaperBgTilemapBuffer);
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
wallpaperId = GetBoxWallpaper(sPSSData->wallpaperLoadBoxId);
2018-12-15 23:58:47 +01:00
if (wallpaperId != WALLPAPER_FRIENDS)
{
2021-04-15 20:06:25 +02:00
wallpaper = &sWallpapers[wallpaperId];
LZ77UnCompWram(wallpaper->tilemap, sPSSData->wallpaperTilemap);
DrawWallpaper(sPSSData->wallpaperTilemap, sPSSData->wallpaperLoadDir, sPSSData->wallpaperOffset);
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
if (sPSSData->wallpaperLoadDir != 0)
LoadPalette(wallpaper->palettes, (sPSSData->wallpaperOffset * 32) + 0x40, 0x40);
2018-12-15 23:58:47 +01:00
else
2021-04-15 20:06:25 +02:00
CpuCopy16(wallpaper->palettes, &gPlttBufferUnfaded[(sPSSData->wallpaperOffset * 32) + 0x40], 0x40);
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
sPSSData->wallpaperTiles = malloc_and_decompress(wallpaper->tiles, &tilesSize);
LoadBgTiles(2, sPSSData->wallpaperTiles, tilesSize, sPSSData->wallpaperOffset << 8);
2018-12-15 23:58:47 +01:00
}
else
{
2021-04-15 20:06:25 +02:00
wallpaper = &sWaldaWallpapers[GetWaldaWallpaperPatternId()];
LZ77UnCompWram(wallpaper->tilemap, sPSSData->wallpaperTilemap);
DrawWallpaper(sPSSData->wallpaperTilemap, sPSSData->wallpaperLoadDir, sPSSData->wallpaperOffset);
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
CpuCopy16(wallpaper->palettes, sPSSData->wallpaperTilemap, 0x40);
CpuCopy16(GetWaldaWallpaperColorsPtr(), &sPSSData->wallpaperTilemap[1], 4);
CpuCopy16(GetWaldaWallpaperColorsPtr(), &sPSSData->wallpaperTilemap[17], 4);
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
if (sPSSData->wallpaperLoadDir != 0)
LoadPalette(sPSSData->wallpaperTilemap, (sPSSData->wallpaperOffset * 32) + 0x40, 0x40);
2018-12-15 23:58:47 +01:00
else
2021-04-15 20:06:25 +02:00
CpuCopy16(sPSSData->wallpaperTilemap, &gPlttBufferUnfaded[(sPSSData->wallpaperOffset * 32) + 0x40], 0x40);
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
sPSSData->wallpaperTiles = malloc_and_decompress(wallpaper->tiles, &tilesSize);
iconGfx = malloc_and_decompress(sWaldaWallpaperIcons[GetWaldaWallpaperIconId()], &iconSize);
CpuCopy32(iconGfx, sPSSData->wallpaperTiles + 0x800, iconSize);
2018-12-15 23:58:47 +01:00
Free(iconGfx);
2021-04-15 20:06:25 +02:00
LoadBgTiles(2, sPSSData->wallpaperTiles, tilesSize, sPSSData->wallpaperOffset << 8);
2018-12-15 23:58:47 +01:00
}
CopyBgTilemapBufferToVram(2);
}
2018-12-19 22:47:27 +01:00
static bool32 WaitForWallpaperGfxLoad(void)
2018-12-15 23:58:47 +01:00
{
if (IsDma3ManagerBusyWithBgCopy())
return FALSE;
2018-12-20 22:14:36 +01:00
if (sPSSData->wallpaperTiles != NULL)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
Free(sPSSData->wallpaperTiles);
sPSSData->wallpaperTiles = NULL;
2018-12-15 23:58:47 +01:00
}
return TRUE;
}
2021-04-15 20:06:25 +02:00
static void DrawWallpaper(const void *tilemap, s8 direction, u8 offset)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
s16 var = (offset * 2) + 3;
2018-12-20 22:14:36 +01:00
s16 x = ((sPSSData->bg2_X / 8 + 10) + (direction * 24)) & 0x3F;
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
CopyRectToBgTilemapBufferRect(2, tilemap, 0, 0, 0x14, 0x12, x, 2, 0x14, 0x12, 0x11, offset << 8, var);
2018-12-15 23:58:47 +01:00
if (direction == 0)
return;
if (direction > 0)
2018-12-15 23:58:47 +01:00
x *= 1, x += 0x14; // x * 1 is needed to match, but can be safely removed as it makes no functional difference
else
x -= 4;
FillBgTilemapBufferRect(2, 0, x, 2, 4, 0x12, 0x11);
}
2021-04-15 20:06:25 +02:00
static void TrimOldWallpaper(void *tilemap)
2018-12-15 23:58:47 +01:00
{
u16 i;
2021-04-15 20:06:25 +02:00
u16 *dest = tilemap;
2018-12-20 22:14:36 +01:00
s16 r3 = ((sPSSData->bg2_X / 8) + 30) & 0x3F;
2018-12-15 23:58:47 +01:00
if (r3 <= 31)
dest += r3 + 0x260;
else
dest += r3 + 0x640;
for (i = 0; i < 0x2C; i++)
{
*dest++ = 0;
r3 = (r3 + 1) & 0x3F;
if (r3 == 0)
dest -= 0x420;
if (r3 == 0x20)
dest += 0x3e0;
}
}
2021-04-15 20:06:25 +02:00
static void InitBoxTitle(u8 boxId)
2018-12-15 23:58:47 +01:00
{
u8 tagIndex;
2021-04-15 20:06:25 +02:00
s16 x;
2018-12-15 23:58:47 +01:00
u16 i;
2021-04-15 20:06:25 +02:00
struct SpriteSheet spriteSheet = {sPSSData->boxTitleTiles, 0x200, GFXTAG_BOX_TITLE};
2018-12-15 23:58:47 +01:00
struct SpritePalette palettes[] = {
2021-04-15 20:06:25 +02:00
{sPSSData->boxTitlePal, PALTAG_BOX_TITLE},
2018-12-15 23:58:47 +01:00
{}
};
u16 wallpaperId = GetBoxWallpaper(boxId);
2021-04-15 20:06:25 +02:00
sPSSData->boxTitlePal[14] = sBoxTitleColors[wallpaperId][0]; // Shadow color
sPSSData->boxTitlePal[15] = sBoxTitleColors[wallpaperId][1]; // Text Color
2018-12-15 23:58:47 +01:00
LoadSpritePalettes(palettes);
2021-04-15 20:06:25 +02:00
sPSSData->boxTitlePalBits = 0x3f0;
tagIndex = IndexOfSpritePaletteTag(PALTAG_BOX_TITLE);
sPSSData->boxTitlePalOffset = 0x10e + 16 * tagIndex;
sPSSData->boxTitlePalBits |= 0x10000 << tagIndex;
// The below seems intended to have separately tracked
// the incoming wallpaper title's palette, but as they now
// share a palette tag, all colors (and fields in some cases)
// this is redundant along with the use of boxTitleAltPalOffset
tagIndex = IndexOfSpritePaletteTag(PALTAG_BOX_TITLE);
sPSSData->boxTitleAltPalOffset = 0x10e + 16 * tagIndex;
sPSSData->boxTitlePalBits |= 0x10000 << tagIndex;
StringCopyPadded(sPSSData->boxTitleText, GetBoxNamePtr(boxId), 0, 8);
DrawTextWindowAndBufferTiles(sPSSData->boxTitleText, sPSSData->boxTitleTiles, 0, 0, 2);
2018-12-15 23:58:47 +01:00
LoadSpriteSheet(&spriteSheet);
2021-04-15 20:06:25 +02:00
x = GetBoxTitleBaseX(GetBoxNamePtr(boxId));
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
// Title is split across two sprites
2018-12-15 23:58:47 +01:00
for (i = 0; i < 2; i++)
{
2021-04-15 20:06:25 +02:00
u8 spriteId = CreateSprite(&sSpriteTemplate_BoxTitle, x + i * 32, 28, 24);
sPSSData->curBoxTitleSprites[i] = &gSprites[spriteId];
StartSpriteAnim(sPSSData->curBoxTitleSprites[i], i);
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
sPSSData->boxTitleCycleId = 0;
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
// Sprite data for moving title text
#define sSpeed data[0]
// Flipped between incoming/outgoing for some reason
#define sIncomingX data[1]
#define sIncomingDelay data[2]
#define sOutgoingDelay data[1]
#define sOutgoingX data[2]
static void CreateIncomingBoxTitle(u8 boxId, s8 direction)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
u16 palOffset;
s16 x, adjustedX;
2018-12-15 23:58:47 +01:00
u16 i;
2021-04-15 20:06:25 +02:00
struct SpriteSheet spriteSheet = {sPSSData->boxTitleTiles, 0x200, GFXTAG_BOX_TITLE};
struct SpriteTemplate template = sSpriteTemplate_BoxTitle;
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
sPSSData->boxTitleCycleId = (sPSSData->boxTitleCycleId == 0);
if (sPSSData->boxTitleCycleId == 0)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
spriteSheet.tag = GFXTAG_BOX_TITLE;
palOffset = sPSSData->boxTitlePalOffset;
2018-12-15 23:58:47 +01:00
}
else
{
2021-04-15 20:06:25 +02:00
spriteSheet.tag = GFXTAG_BOX_TITLE_ALT;
palOffset = sPSSData->boxTitlePalOffset;
template.tileTag = GFXTAG_BOX_TITLE_ALT;
template.paletteTag = PALTAG_BOX_TITLE;
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
StringCopyPadded(sPSSData->boxTitleText, GetBoxNamePtr(boxId), 0, 8);
DrawTextWindowAndBufferTiles(sPSSData->boxTitleText, sPSSData->boxTitleTiles, 0, 0, 2);
2018-12-15 23:58:47 +01:00
LoadSpriteSheet(&spriteSheet);
2021-04-15 20:06:25 +02:00
LoadPalette(sBoxTitleColors[GetBoxWallpaper(boxId)], palOffset, 4);
x = GetBoxTitleBaseX(GetBoxNamePtr(boxId));
adjustedX = x;
adjustedX += direction * 192;
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
// Title is split across two sprites
2018-12-15 23:58:47 +01:00
for (i = 0; i < 2; i++)
{
2021-04-15 20:06:25 +02:00
u8 spriteId = CreateSprite(&template, i * 32 + adjustedX, 28, 24);
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
sPSSData->nextBoxTitleSprites[i] = &gSprites[spriteId];
sPSSData->nextBoxTitleSprites[i]->sSpeed = (-direction) * 6;
sPSSData->nextBoxTitleSprites[i]->sIncomingX = i * 32 + x;
sPSSData->nextBoxTitleSprites[i]->sIncomingDelay = 0;
sPSSData->nextBoxTitleSprites[i]->callback = SpriteCB_IncomingBoxTitle;
StartSpriteAnim(sPSSData->nextBoxTitleSprites[i], i);
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
sPSSData->curBoxTitleSprites[i]->sSpeed = (-direction) * 6;
sPSSData->curBoxTitleSprites[i]->sOutgoingDelay = 1;
sPSSData->curBoxTitleSprites[i]->callback = SpriteCB_OutgoingBoxTitle;
2018-12-15 23:58:47 +01:00
}
}
2021-04-15 20:06:25 +02:00
static void CycleBoxTitleSprites(void)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
if (sPSSData->boxTitleCycleId == 0)
FreeSpriteTilesByTag(GFXTAG_BOX_TITLE_ALT);
2018-12-15 23:58:47 +01:00
else
2021-04-15 20:06:25 +02:00
FreeSpriteTilesByTag(GFXTAG_BOX_TITLE);
2018-12-15 23:58:47 +01:00
2021-04-15 20:06:25 +02:00
sPSSData->curBoxTitleSprites[0] = sPSSData->nextBoxTitleSprites[0];
sPSSData->curBoxTitleSprites[1] = sPSSData->nextBoxTitleSprites[1];
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
static void SpriteCB_IncomingBoxTitle(struct Sprite *sprite)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
if (sprite->sIncomingDelay != 0)
sprite->sIncomingDelay--;
else if ((sprite->pos1.x += sprite->sSpeed) == sprite->sIncomingX)
2018-12-15 23:58:47 +01:00
sprite->callback = SpriteCallbackDummy;
}
2021-04-15 20:06:25 +02:00
static void SpriteCB_OutgoingBoxTitle(struct Sprite *sprite)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
if (sprite->sOutgoingDelay != 0)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
sprite->sOutgoingDelay--;
2018-12-15 23:58:47 +01:00
}
else
{
2021-04-15 20:06:25 +02:00
sprite->pos1.x += sprite->sSpeed;
sprite->sOutgoingX = sprite->pos1.x + sprite->pos2.x;
if (sprite->sOutgoingX < 64 || sprite->sOutgoingX > DISPLAY_WIDTH + 16)
2018-12-15 23:58:47 +01:00
DestroySprite(sprite);
}
}
2021-04-15 20:06:25 +02:00
#undef sSpeed
#undef sIncomingX
#undef sIncomingDelay
#undef sOutgoingDelay
#undef sOutgoingX
static void CycleBoxTitleColor(void)
2018-12-15 23:58:47 +01:00
{
u8 boxId = StorageGetCurrentBox();
u8 wallpaperId = GetBoxWallpaper(boxId);
2021-04-15 20:06:25 +02:00
if (sPSSData->boxTitleCycleId == 0)
CpuCopy16(sBoxTitleColors[wallpaperId], gPlttBufferUnfaded + sPSSData->boxTitlePalOffset, 4);
2018-12-15 23:58:47 +01:00
else
2021-04-15 20:06:25 +02:00
CpuCopy16(sBoxTitleColors[wallpaperId], gPlttBufferUnfaded + sPSSData->boxTitleAltPalOffset, 4);
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
static s16 GetBoxTitleBaseX(const u8 *string)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
return DISPLAY_WIDTH - 64 - GetStringWidth(1, string, 0) / 2;
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
// Sprite data for box scroll arrows
#define sState data[0]
#define sTimer data[1]
#define sSpeed data[3]
static void CreateBoxScrollArrows(void)
2018-12-15 23:58:47 +01:00
{
u16 i;
2021-04-15 20:06:25 +02:00
LoadSpriteSheet(&sSpriteSheet_Arrow);
2018-12-15 23:58:47 +01:00
for (i = 0; i < 2; i++)
{
2021-04-15 20:06:25 +02:00
u8 spriteId = CreateSprite(&sSpriteTemplate_Arrow, 92 + i * 136, 28, 22);
2018-12-15 23:58:47 +01:00
if (spriteId != MAX_SPRITES)
{
struct Sprite *sprite = &gSprites[spriteId];
StartSpriteAnim(sprite, i);
2021-04-15 20:06:25 +02:00
sprite->sSpeed = (i == 0) ? -1 : 1;
sPSSData->arrowSprites[i] = sprite;
2018-12-15 23:58:47 +01:00
}
}
if (IsCursorOnBox())
2021-04-15 20:06:25 +02:00
AnimateBoxScrollArrows(TRUE);
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
// Slide box scroll arrows horizontally for box change
static void StartBoxScrollArrowsSlide(s8 direction)
2018-12-15 23:58:47 +01:00
{
u16 i;
for (i = 0; i < 2; i++)
{
2021-04-15 20:06:25 +02:00
sPSSData->arrowSprites[i]->pos2.x = 0;
sPSSData->arrowSprites[i]->sState = 2;
2018-12-15 23:58:47 +01:00
}
if (direction < 0)
{
2021-04-15 20:06:25 +02:00
sPSSData->arrowSprites[0]->sTimer = 29;
sPSSData->arrowSprites[1]->sTimer = 5;
sPSSData->arrowSprites[0]->data[2] = 72;
sPSSData->arrowSprites[1]->data[2] = 72;
2018-12-15 23:58:47 +01:00
}
else
{
2021-04-15 20:06:25 +02:00
sPSSData->arrowSprites[0]->sTimer = 5;
sPSSData->arrowSprites[1]->sTimer = 29;
sPSSData->arrowSprites[0]->data[2] = DISPLAY_WIDTH + 8;
sPSSData->arrowSprites[1]->data[2] = DISPLAY_WIDTH + 8;
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
sPSSData->arrowSprites[0]->data[7] = 0;
sPSSData->arrowSprites[1]->data[7] = 1;
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
// New box's scroll arrows have entered, stop sliding and set their position
static void StopBoxScrollArrowsSlide(void)
2018-12-15 23:58:47 +01:00
{
u16 i;
for (i = 0; i < 2; i++)
{
2021-04-15 20:06:25 +02:00
sPSSData->arrowSprites[i]->pos1.x = 136 * i + 92;
sPSSData->arrowSprites[i]->pos2.x = 0;
sPSSData->arrowSprites[i]->invisible = FALSE;
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
AnimateBoxScrollArrows(TRUE);
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
// Bounce scroll arrows while title is selected
static void AnimateBoxScrollArrows(bool8 animate)
2018-12-15 23:58:47 +01:00
{
u16 i;
2021-04-15 20:06:25 +02:00
if (animate)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
// Start arrows moving
2018-12-15 23:58:47 +01:00
for (i = 0; i < 2; i++)
{
2021-04-15 20:06:25 +02:00
sPSSData->arrowSprites[i]->sState = 1;
sPSSData->arrowSprites[i]->sTimer = 0;
sPSSData->arrowSprites[i]->data[2] = 0;
sPSSData->arrowSprites[i]->data[4] = 0;
2018-12-15 23:58:47 +01:00
}
}
else
{
2021-04-15 20:06:25 +02:00
// Stop arrows moving
2018-12-15 23:58:47 +01:00
for (i = 0; i < 2; i++)
2021-04-15 20:06:25 +02:00
sPSSData->arrowSprites[i]->sState = 0;
2018-12-15 23:58:47 +01:00
}
}
2021-04-15 20:06:25 +02:00
static void SpriteCB_Arrow(struct Sprite *sprite)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
switch (sprite->sState)
2018-12-15 23:58:47 +01:00
{
case 0:
sprite->pos2.x = 0;
break;
case 1:
2021-04-15 20:06:25 +02:00
if (++sprite->sTimer > 3)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
sprite->sTimer = 0;
sprite->pos2.x += sprite->sSpeed;
2018-12-15 23:58:47 +01:00
if (++sprite->data[2] > 5)
{
sprite->data[2] = 0;
sprite->pos2.x = 0;
}
}
break;
case 2:
2021-04-15 20:06:25 +02:00
sprite->sState = 3;
2018-12-15 23:58:47 +01:00
break;
case 3:
2020-07-19 05:08:44 +02:00
sprite->pos1.x -= sPSSData->wallpaperScrollSpeed;
2021-04-15 20:06:25 +02:00
if (sprite->pos1.x <= 72 || sprite->pos1.x >= DISPLAY_WIDTH + 8)
2018-12-15 23:58:47 +01:00
sprite->invisible = TRUE;
2021-04-15 20:06:25 +02:00
if (--sprite->sTimer == 0)
2018-12-15 23:58:47 +01:00
{
sprite->pos1.x = sprite->data[2];
sprite->invisible = FALSE;
2021-04-15 20:06:25 +02:00
sprite->sState = 4;
2018-12-15 23:58:47 +01:00
}
break;
case 4:
2020-07-19 05:08:44 +02:00
sprite->pos1.x -= sPSSData->wallpaperScrollSpeed;
2018-12-15 23:58:47 +01:00
break;
}
}
2021-04-15 20:06:25 +02:00
#undef sState
#undef sSpeed
static struct Sprite *CreateJumpBoxArrows(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
u8 spriteId = CreateSprite(&sSpriteTemplate_Arrow, x, y, subpriority);
2018-12-15 23:58:47 +01:00
if (spriteId == MAX_SPRITES)
return NULL;
animId %= 2;
StartSpriteAnim(&gSprites[spriteId], animId);
gSprites[spriteId].oam.priority = priority;
gSprites[spriteId].callback = SpriteCallbackDummy;
return &gSprites[spriteId];
}
2018-12-16 21:10:01 +01:00
static void sub_80CD36C(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_DEPOSIT)
2018-12-15 23:58:47 +01:00
sBoxCursorArea = CURSOR_AREA_IN_BOX;
else
sBoxCursorArea = CURSOR_AREA_IN_PARTY;
sBoxCursorPosition = 0;
sIsMonBeingMoved = FALSE;
sMovingMonOrigBoxId = 0;
sMovingMonOrigBoxPos = 0;
sCanOnlyMove = FALSE;
sub_80CDC0C();
sub_80CFC14();
2018-12-20 22:14:36 +01:00
sPSSData->field_CD6 = 1;
sPSSData->inBoxMovingMode = 0;
2018-12-15 23:58:47 +01:00
sub_80CEB40();
}
2018-12-16 21:10:01 +01:00
static void sub_80CD3EC(void)
2018-12-15 23:58:47 +01:00
{
sub_80CFC14();
sub_80CEBDC();
2018-12-20 22:14:36 +01:00
sPSSData->field_CD6 = 1;
sPSSData->inBoxMovingMode = 0;
2018-12-15 23:58:47 +01:00
if (sIsMonBeingMoved)
{
2018-12-20 22:14:36 +01:00
sPSSData->movingMon = gUnknown_02039D14;
2018-12-16 21:10:01 +01:00
CreateMovingMonIcon();
2018-12-15 23:58:47 +01:00
}
}
2018-12-19 22:47:27 +01:00
static void sub_80CD444(u8 cursorArea, u8 cursorPosition, u16 *x, u16 *y)
2018-12-15 23:58:47 +01:00
{
2018-12-16 21:10:01 +01:00
switch (cursorArea)
2018-12-15 23:58:47 +01:00
{
2018-12-16 21:10:01 +01:00
case CURSOR_AREA_IN_BOX:
*x = (cursorPosition % IN_BOX_ROWS) * 24 + 100;
*y = (cursorPosition / IN_BOX_ROWS) * 24 + 32;
2018-12-15 23:58:47 +01:00
break;
2018-12-16 21:10:01 +01:00
case CURSOR_AREA_IN_PARTY:
if (cursorPosition == 0)
2018-12-15 23:58:47 +01:00
{
2018-12-16 21:10:01 +01:00
*x = 0x68;
*y = 0x34;
2018-12-15 23:58:47 +01:00
}
2018-12-16 21:10:01 +01:00
else if (cursorPosition == PARTY_SIZE)
2018-12-15 23:58:47 +01:00
{
2018-12-16 21:10:01 +01:00
*x = 0x98;
*y = 0x84;
2018-12-15 23:58:47 +01:00
}
else
{
2018-12-16 21:10:01 +01:00
*x = 0x98;
*y = (cursorPosition - 1) * 24 + 4;
2018-12-15 23:58:47 +01:00
}
break;
2018-12-16 21:10:01 +01:00
case CURSOR_AREA_BOX:
*x = 0xa2;
*y = 0x0c;
2018-12-15 23:58:47 +01:00
break;
2018-12-16 21:10:01 +01:00
case CURSOR_AREA_BUTTONS:
*y = sIsMonBeingMoved ? 8 : 14;
*x = cursorPosition * 0x58 + 0x78;
2018-12-15 23:58:47 +01:00
break;
case 4:
2018-12-16 21:10:01 +01:00
*x = 0xa0;
*y = 0x60;
2018-12-15 23:58:47 +01:00
break;
}
}
2018-12-16 21:10:01 +01:00
static u16 sub_80CD504(void)
2018-12-15 23:58:47 +01:00
{
switch (sBoxCursorArea)
{
case CURSOR_AREA_IN_PARTY:
return GetMonData(&gPlayerParty[sBoxCursorPosition], MON_DATA_SPECIES);
case CURSOR_AREA_IN_BOX:
return GetCurrentBoxMonData(sBoxCursorPosition, MON_DATA_SPECIES);
default:
return SPECIES_NONE;
}
}
2018-12-19 22:47:27 +01:00
static bool8 sub_80CD554(void)
2018-12-15 23:58:47 +01:00
{
s16 tmp;
2018-12-20 22:14:36 +01:00
if (sPSSData->field_CD0 == 0)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-15 23:58:47 +01:00
return FALSE;
else
return sub_80D1218();
}
2018-12-20 22:14:36 +01:00
else if (--sPSSData->field_CD0 != 0)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_CBC += sPSSData->field_CC4;
sPSSData->field_CC0 += sPSSData->field_CC8;
sPSSData->field_CB4->pos1.x = sPSSData->field_CBC >> 8;
sPSSData->field_CB4->pos1.y = sPSSData->field_CC0 >> 8;
2021-04-15 20:06:25 +02:00
if (sPSSData->field_CB4->pos1.x > DISPLAY_WIDTH + 16)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
tmp = sPSSData->field_CB4->pos1.x - (DISPLAY_WIDTH + 16);
sPSSData->field_CB4->pos1.x = tmp + 64;
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
if (sPSSData->field_CB4->pos1.x < 64)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
tmp = 64 - sPSSData->field_CB4->pos1.x;
sPSSData->field_CB4->pos1.x = DISPLAY_WIDTH + 16 - tmp;
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
if (sPSSData->field_CB4->pos1.y > DISPLAY_HEIGHT + 16)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
tmp = sPSSData->field_CB4->pos1.y - (DISPLAY_HEIGHT + 16);
sPSSData->field_CB4->pos1.y = tmp - 16;
2018-12-15 23:58:47 +01:00
}
2021-04-15 20:06:25 +02:00
if (sPSSData->field_CB4->pos1.y < -16)
2018-12-15 23:58:47 +01:00
{
2021-04-15 20:06:25 +02:00
tmp = -16 - sPSSData->field_CB4->pos1.y;
sPSSData->field_CB4->pos1.y = DISPLAY_HEIGHT + 16 - tmp;
2018-12-15 23:58:47 +01:00
}
2018-12-20 22:14:36 +01:00
if (sPSSData->field_CD7 && --sPSSData->field_CD7 == 0)
sPSSData->field_CB4->vFlip = (sPSSData->field_CB4->vFlip == FALSE);
2018-12-15 23:58:47 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->field_CB4->pos1.x = sPSSData->field_CCC;
sPSSData->field_CB4->pos1.y = sPSSData->field_CCE;
2018-12-15 23:58:47 +01:00
sub_80CDA68();
}
return TRUE;
}
2021-02-05 08:59:26 +01:00
static void sub_80CD6AC(u8 newCursorArea, u8 newCursorPosition)
2018-12-15 23:58:47 +01:00
{
u16 x, y;
2021-02-05 08:59:26 +01:00
sub_80CD444(newCursorArea, newCursorPosition, &x, &y);
sPSSData->field_CD4 = newCursorArea;
2018-12-20 22:14:36 +01:00
sPSSData->field_CD5 = newCursorPosition;
sPSSData->field_CCC = x;
sPSSData->field_CCE = y;
2018-12-15 23:58:47 +01:00
}
2018-12-16 21:10:01 +01:00
static void sub_80CD70C(void)
2018-12-15 23:58:47 +01:00
{
int r7, r0;
2018-12-20 22:14:36 +01:00
if (sPSSData->field_CD2 != 0 || sPSSData->field_CD3 != 0)
sPSSData->field_CD0 = 12;
2018-12-15 23:58:47 +01:00
else
2018-12-20 22:14:36 +01:00
sPSSData->field_CD0 = 6;
2018-12-15 23:58:47 +01:00
2018-12-20 22:14:36 +01:00
if (sPSSData->field_CD7)
sPSSData->field_CD7 = sPSSData->field_CD0 >> 1;
2018-12-15 23:58:47 +01:00
2018-12-20 22:14:36 +01:00
switch (sPSSData->field_CD2)
2018-12-15 23:58:47 +01:00
{
default:
2018-12-20 22:14:36 +01:00
r7 = sPSSData->field_CCE - sPSSData->field_CB4->pos1.y;
2018-12-15 23:58:47 +01:00
break;
case -1:
2018-12-20 22:14:36 +01:00
r7 = sPSSData->field_CCE - 0xc0 - sPSSData->field_CB4->pos1.y;
2018-12-15 23:58:47 +01:00
break;
case 1:
2018-12-20 22:14:36 +01:00
r7 = sPSSData->field_CCE + 0xc0 - sPSSData->field_CB4->pos1.y;
2018-12-15 23:58:47 +01:00
break;
}
2018-12-20 22:14:36 +01:00
switch (sPSSData->field_CD3)
2018-12-15 23:58:47 +01:00
{
default:
2018-12-20 22:14:36 +01:00
r0 = sPSSData->field_CCC - sPSSData->field_CB4->pos1.x;
2018-12-15 23:58:47 +01:00
break;
case -1:
2018-12-20 22:14:36 +01:00
r0 = sPSSData->field_CCC - 0xc0 - sPSSData->field_CB4->pos1.x;
2018-12-15 23:58:47 +01:00
break;
case 1:
2018-12-20 22:14:36 +01:00
r0 = sPSSData->field_CCC + 0xc0 - sPSSData->field_CB4->pos1.x;
2018-12-15 23:58:47 +01:00
break;
}
r7 <<= 8;
r0 <<= 8;
2018-12-20 22:14:36 +01:00
sPSSData->field_CC4 = r0 / sPSSData->field_CD0;
sPSSData->field_CC8 = r7 / sPSSData->field_CD0;
sPSSData->field_CBC = sPSSData->field_CB4->pos1.x << 8;
sPSSData->field_CC0 = sPSSData->field_CB4->pos1.y << 8;
2018-12-15 23:58:47 +01:00
}
2021-02-05 08:59:26 +01:00
static void sub_80CD894(u8 newCursorArea, u8 newCursorPosition)
2018-12-15 23:58:47 +01:00
{
2021-02-05 08:59:26 +01:00
sub_80CD6AC(newCursorArea, newCursorPosition);
2018-12-15 23:58:47 +01:00
sub_80CD70C();
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->inBoxMovingMode == 0 && !sIsMonBeingMoved)
StartSpriteAnim(sPSSData->field_CB4, 1);
2018-12-15 23:58:47 +01:00
}
else
{
2018-12-19 22:47:27 +01:00
if (!IsActiveItemMoving())
2018-12-20 22:14:36 +01:00
StartSpriteAnim(sPSSData->field_CB4, 1);
2018-12-15 23:58:47 +01:00
}
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
2018-12-15 23:58:47 +01:00
{
if (sBoxCursorArea == CURSOR_AREA_IN_BOX)
2018-12-17 23:00:08 +01:00
sub_80D0E50(CURSOR_AREA_IN_BOX, sBoxCursorPosition);
2018-12-15 23:58:47 +01:00
else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY)
2018-12-17 23:00:08 +01:00
sub_80D0E50(CURSOR_AREA_IN_PARTY, sBoxCursorPosition);
2018-12-15 23:58:47 +01:00
2021-02-05 08:59:26 +01:00
if (newCursorArea == CURSOR_AREA_IN_BOX)
sub_80D0D8C(newCursorArea, newCursorPosition);
else if (newCursorArea == CURSOR_AREA_IN_PARTY)
sub_80D0D8C(newCursorArea, newCursorPosition);
2018-12-15 23:58:47 +01:00
}
2021-02-05 08:59:26 +01:00
if (newCursorArea == CURSOR_AREA_IN_PARTY && sBoxCursorArea != CURSOR_AREA_IN_PARTY)
2018-12-15 23:58:47 +01:00
{
2021-02-05 08:59:26 +01:00
sPSSData->field_CD6 = newCursorArea;
2018-12-20 22:14:36 +01:00
sPSSData->field_CB8->invisible = TRUE;
2018-12-15 23:58:47 +01:00
}
2021-02-05 08:59:26 +01:00
switch (newCursorArea)
2018-12-15 23:58:47 +01:00
{
2018-12-16 21:10:01 +01:00
case CURSOR_AREA_IN_PARTY:
case CURSOR_AREA_BOX:
case CURSOR_AREA_BUTTONS:
2018-12-20 22:14:36 +01:00
sPSSData->field_CB4->oam.priority = 1;
sPSSData->field_CB8->invisible = TRUE;
sPSSData->field_CB8->oam.priority = 1;
2018-12-15 23:58:47 +01:00
break;
2018-12-16 21:10:01 +01:00
case CURSOR_AREA_IN_BOX:
2018-12-20 22:14:36 +01:00
if (sPSSData->inBoxMovingMode != 0)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_CB4->oam.priority = 0;
sPSSData->field_CB8->invisible = TRUE;
2018-12-15 23:58:47 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->field_CB4->oam.priority = 2;
2018-12-15 23:58:47 +01:00
if (sBoxCursorArea == CURSOR_AREA_IN_BOX && sIsMonBeingMoved)
2018-12-16 21:10:01 +01:00
SetMovingMonPriority(2);
2018-12-15 23:58:47 +01:00
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CDA68(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sBoxCursorArea = sPSSData->field_CD4;
sBoxCursorPosition = sPSSData->field_CD5;
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->inBoxMovingMode == 0 && !sIsMonBeingMoved)
StartSpriteAnim(sPSSData->field_CB4, 0);
2018-12-15 23:58:47 +01:00
}
else
{
2018-12-19 22:47:27 +01:00
if (!IsActiveItemMoving())
2018-12-20 22:14:36 +01:00
StartSpriteAnim(sPSSData->field_CB4, 0);
2018-12-15 23:58:47 +01:00
}
sub_80CEB40();
switch (sBoxCursorArea)
{
case CURSOR_AREA_BUTTONS:
2018-12-16 21:10:01 +01:00
SetMovingMonPriority(1);
2018-12-15 23:58:47 +01:00
break;
case CURSOR_AREA_BOX:
2021-04-15 20:06:25 +02:00
AnimateBoxScrollArrows(TRUE);
2018-12-15 23:58:47 +01:00
break;
case CURSOR_AREA_IN_PARTY:
2018-12-20 22:14:36 +01:00
sPSSData->field_CB8->subpriority = 13;
2018-12-16 21:10:01 +01:00
SetMovingMonPriority(1);
2018-12-15 23:58:47 +01:00
break;
case CURSOR_AREA_IN_BOX:
2018-12-20 22:14:36 +01:00
if (sPSSData->inBoxMovingMode == 0)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_CB4->oam.priority = 1;
sPSSData->field_CB8->oam.priority = 2;
sPSSData->field_CB8->subpriority = 21;
sPSSData->field_CB8->invisible = FALSE;
2018-12-16 21:10:01 +01:00
SetMovingMonPriority(2);
2018-12-15 23:58:47 +01:00
}
break;
}
}
2018-12-16 21:10:01 +01:00
static void sub_80CDBA0(void)
2018-12-15 23:58:47 +01:00
{
u8 partyCount;
if (!sIsMonBeingMoved)
{
partyCount = 0;
}
else
{
partyCount = CalculatePlayerPartyCount();
if (partyCount >= PARTY_SIZE)
partyCount = PARTY_SIZE - 1;
}
2018-12-20 22:14:36 +01:00
if (sPSSData->field_CB4->vFlip)
sPSSData->field_CD7 = 1;
2018-12-16 21:10:01 +01:00
sub_80CD894(CURSOR_AREA_IN_PARTY, partyCount);
2018-12-15 23:58:47 +01:00
}
2018-12-16 21:10:01 +01:00
static void sub_80CDBF8(u8 cursorBoxPosition)
2018-12-15 23:58:47 +01:00
{
2018-12-16 21:10:01 +01:00
sub_80CD894(CURSOR_AREA_IN_BOX, cursorBoxPosition);
2018-12-15 23:58:47 +01:00
}
2018-12-20 22:14:36 +01:00
EWRAM_DATA static u8 gUnknown_02039D7E = 0;
2018-12-16 21:10:01 +01:00
static void sub_80CDC0C(void)
2018-12-15 23:58:47 +01:00
{
gUnknown_02039D7E = 0;
}
2018-12-16 21:10:01 +01:00
static void sub_80CDC18(void)
2018-12-15 23:58:47 +01:00
{
gUnknown_02039D7E = sBoxCursorPosition;
}
2018-12-19 22:47:27 +01:00
static u8 sub_80CDC2C(void)
2018-12-15 23:58:47 +01:00
{
return gUnknown_02039D7E;
}
2018-12-19 22:47:27 +01:00
static void InitMonPlaceChange(u8 a0)
2018-12-15 23:58:47 +01:00
{
2018-12-16 21:10:01 +01:00
static bool8 (*const placeChangeFuncs[])(void) =
{
MonPlaceChange_Move,
MonPlaceChange_Place,
MonPlaceChange_Shift,
};
2018-12-20 22:14:36 +01:00
sPSSData->monPlaceChangeFunc = placeChangeFuncs[a0];
sPSSData->monPlaceChangeState = 0;
2018-12-15 23:58:47 +01:00
}
2018-12-19 22:47:27 +01:00
static void sub_80CDC64(bool8 arg0)
2018-12-15 23:58:47 +01:00
{
if (!arg0)
2018-12-20 22:14:36 +01:00
sPSSData->monPlaceChangeFunc = sub_80CDEB4;
2018-12-15 23:58:47 +01:00
else
2018-12-20 22:14:36 +01:00
sPSSData->monPlaceChangeFunc = sub_80CDEC4;
2018-12-15 23:58:47 +01:00
2018-12-20 22:14:36 +01:00
sPSSData->monPlaceChangeState = 0;
2018-12-15 23:58:47 +01:00
}
2018-12-19 22:47:27 +01:00
static bool8 DoMonPlaceChange(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
return sPSSData->monPlaceChangeFunc();
2018-12-15 23:58:47 +01:00
}
2018-12-16 21:10:01 +01:00
static bool8 MonPlaceChange_Move(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->monPlaceChangeState)
2018-12-15 23:58:47 +01:00
{
case 0:
if (sIsMonBeingMoved)
return FALSE;
2018-12-20 22:14:36 +01:00
StartSpriteAnim(sPSSData->field_CB4, 2);
sPSSData->monPlaceChangeState++;
2018-12-15 23:58:47 +01:00
break;
case 1:
if (!sub_80CDED4())
{
2018-12-20 22:14:36 +01:00
StartSpriteAnim(sPSSData->field_CB4, 3);
2018-12-15 23:58:47 +01:00
MoveMon();
2018-12-20 22:14:36 +01:00
sPSSData->monPlaceChangeState++;
2018-12-15 23:58:47 +01:00
}
break;
case 2:
if (!sub_80CDF08())
2018-12-20 22:14:36 +01:00
sPSSData->monPlaceChangeState++;
2018-12-15 23:58:47 +01:00
break;
case 3:
return FALSE;
}
return TRUE;
}
2018-12-16 21:10:01 +01:00
static bool8 MonPlaceChange_Place(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->monPlaceChangeState)
2018-12-15 23:58:47 +01:00
{
case 0:
if (!sub_80CDED4())
{
2018-12-20 22:14:36 +01:00
StartSpriteAnim(sPSSData->field_CB4, 2);
2018-12-15 23:58:47 +01:00
PlaceMon();
2018-12-20 22:14:36 +01:00
sPSSData->monPlaceChangeState++;
2018-12-15 23:58:47 +01:00
}
break;
case 1:
if (!sub_80CDF08())
{
2018-12-20 22:14:36 +01:00
StartSpriteAnim(sPSSData->field_CB4, 0);
sPSSData->monPlaceChangeState++;
2018-12-15 23:58:47 +01:00
}
break;
case 2:
return FALSE;
}
return TRUE;
}
2018-12-16 21:10:01 +01:00
static bool8 MonPlaceChange_Shift(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->monPlaceChangeState)
2018-12-15 23:58:47 +01:00
{
case 0:
switch (sBoxCursorArea)
{
case CURSOR_AREA_IN_PARTY:
2018-12-20 22:14:36 +01:00
sPSSData->field_D91 = TOTAL_BOXES_COUNT;
2018-12-15 23:58:47 +01:00
break;
case CURSOR_AREA_IN_BOX:
2018-12-20 22:14:36 +01:00
sPSSData->field_D91 = StorageGetCurrentBox();
2018-12-15 23:58:47 +01:00
break;
default:
return FALSE;
}
2018-12-20 22:14:36 +01:00
StartSpriteAnim(sPSSData->field_CB4, 2);
sub_80CBD5C(sPSSData->field_D91, sBoxCursorPosition);
sPSSData->monPlaceChangeState++;
2018-12-15 23:58:47 +01:00
break;
case 1:
if (!sub_80CBDC4())
{
2018-12-20 22:14:36 +01:00
StartSpriteAnim(sPSSData->field_CB4, 3);
SetShiftedMonData(sPSSData->field_D91, sBoxCursorPosition);
sPSSData->monPlaceChangeState++;
2018-12-15 23:58:47 +01:00
}
break;
case 2:
return FALSE;
}
return TRUE;
}
2018-12-16 21:10:01 +01:00
static bool8 sub_80CDEB4(void)
2018-12-15 23:58:47 +01:00
{
return sub_80CDED4();
}
2018-12-16 21:10:01 +01:00
static bool8 sub_80CDEC4(void)
2018-12-15 23:58:47 +01:00
{
return sub_80CDF08();
}
2018-12-16 21:10:01 +01:00
static bool8 sub_80CDED4(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->field_CB4->pos2.y)
2018-12-15 23:58:47 +01:00
{
default:
2018-12-20 22:14:36 +01:00
sPSSData->field_CB4->pos2.y++;
2018-12-15 23:58:47 +01:00
break;
case 0:
2018-12-20 22:14:36 +01:00
sPSSData->field_CB4->pos2.y++;
2018-12-15 23:58:47 +01:00
break;
case 8:
return FALSE;
}
return TRUE;
}
2018-12-16 21:10:01 +01:00
static bool8 sub_80CDF08(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->field_CB4->pos2.y)
2018-12-15 23:58:47 +01:00
{
case 0:
return FALSE;
default:
2018-12-20 22:14:36 +01:00
sPSSData->field_CB4->pos2.y--;
2018-12-15 23:58:47 +01:00
break;
}
return TRUE;
}
2018-12-19 22:47:27 +01:00
static void MoveMon(void)
2018-12-15 23:58:47 +01:00
{
switch (sBoxCursorArea)
{
case CURSOR_AREA_IN_PARTY:
SetMovedMonData(TOTAL_BOXES_COUNT, sBoxCursorPosition);
sub_80CBC14(MODE_PARTY, sBoxCursorPosition);
break;
case CURSOR_AREA_IN_BOX:
2018-12-20 22:14:36 +01:00
if (sPSSData->inBoxMovingMode == 0)
2018-12-15 23:58:47 +01:00
{
SetMovedMonData(StorageGetCurrentBox(), sBoxCursorPosition);
sub_80CBC14(MODE_BOX, sBoxCursorPosition);
}
break;
default:
return;
}
sIsMonBeingMoved = TRUE;
}
2018-12-19 22:47:27 +01:00
static void PlaceMon(void)
2018-12-15 23:58:47 +01:00
{
u8 boxId;
switch (sBoxCursorArea)
{
case CURSOR_AREA_IN_PARTY:
SetPlacedMonData(TOTAL_BOXES_COUNT, sBoxCursorPosition);
sub_80CBCAC(TOTAL_BOXES_COUNT, sBoxCursorPosition);
break;
case CURSOR_AREA_IN_BOX:
boxId = StorageGetCurrentBox();
SetPlacedMonData(boxId, sBoxCursorPosition);
sub_80CBCAC(boxId, sBoxCursorPosition);
break;
default:
return;
}
sIsMonBeingMoved = FALSE;
}
2018-12-16 21:10:01 +01:00
static void sub_80CE00C(void)
2018-12-15 23:58:47 +01:00
{
sub_80CEB40();
}
2018-12-16 21:10:01 +01:00
static void SetMovedMonData(u8 boxId, u8 position)
2018-12-15 23:58:47 +01:00
{
if (boxId == TOTAL_BOXES_COUNT)
2018-12-20 22:14:36 +01:00
sPSSData->movingMon = gPlayerParty[sBoxCursorPosition];
2018-12-15 23:58:47 +01:00
else
2018-12-20 22:14:36 +01:00
BoxMonAtToMon(boxId, position, &sPSSData->movingMon);
2018-12-15 23:58:47 +01:00
PurgeMonOrBoxMon(boxId, position);
sMovingMonOrigBoxId = boxId;
sMovingMonOrigBoxPos = position;
}
2018-12-16 21:10:01 +01:00
static void SetPlacedMonData(u8 boxId, u8 position)
2018-12-15 23:58:47 +01:00
{
if (boxId == TOTAL_BOXES_COUNT)
{
2018-12-20 22:14:36 +01:00
gPlayerParty[position] = sPSSData->movingMon;
2018-12-15 23:58:47 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
BoxMonRestorePP(&sPSSData->movingMon.box);
SetBoxMonAt(boxId, position, &sPSSData->movingMon.box);
2018-12-15 23:58:47 +01:00
}
}
2018-12-19 22:47:27 +01:00
static void PurgeMonOrBoxMon(u8 boxId, u8 position)
2018-12-15 23:58:47 +01:00
{
if (boxId == TOTAL_BOXES_COUNT)
ZeroMonData(&gPlayerParty[position]);
else
ZeroBoxMonAt(boxId, position);
}
2018-12-16 21:10:01 +01:00
static void SetShiftedMonData(u8 boxId, u8 position)
2018-12-15 23:58:47 +01:00
{
if (boxId == TOTAL_BOXES_COUNT)
2018-12-20 22:14:36 +01:00
sPSSData->field_2108 = gPlayerParty[position];
2018-12-15 23:58:47 +01:00
else
2018-12-20 22:14:36 +01:00
BoxMonAtToMon(boxId, position, &sPSSData->field_2108);
2018-12-15 23:58:47 +01:00
SetPlacedMonData(boxId, position);
2018-12-20 22:14:36 +01:00
sPSSData->movingMon = sPSSData->field_2108;
SetCursorMonData(&sPSSData->movingMon, MODE_PARTY);
2018-12-15 23:58:47 +01:00
sMovingMonOrigBoxId = boxId;
sMovingMonOrigBoxPos = position;
}
2018-12-16 21:10:01 +01:00
static bool8 TryStorePartyMonInBox(u8 boxId)
2018-12-15 23:58:47 +01:00
{
s16 boxPosition = GetFirstFreeBoxSpot(boxId);
if (boxPosition == -1)
return FALSE;
if (sIsMonBeingMoved)
{
SetPlacedMonData(boxId, boxPosition);
2018-12-16 21:10:01 +01:00
DestroyMovingMonIcon();
2018-12-15 23:58:47 +01:00
sIsMonBeingMoved = FALSE;
}
else
{
SetMovedMonData(TOTAL_BOXES_COUNT, sBoxCursorPosition);
SetPlacedMonData(boxId, boxPosition);
DestroyPartyMonIcon(sBoxCursorPosition);
}
if (boxId == StorageGetCurrentBox())
sub_80CB140(boxPosition);
2018-12-20 22:14:36 +01:00
StartSpriteAnim(sPSSData->field_CB4, 1);
2018-12-15 23:58:47 +01:00
return TRUE;
}
2018-12-16 21:10:01 +01:00
static void sub_80CE22C(void)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
StartSpriteAnim(sPSSData->field_CB4, 0);
2018-12-15 23:58:47 +01:00
sub_80CEB40();
}
2018-12-16 21:10:01 +01:00
static void sub_80CE250(void)
2018-12-15 23:58:47 +01:00
{
u8 mode;
if (sIsMonBeingMoved)
2020-03-09 02:27:29 +01:00
mode = MODE_MOVE;
2018-12-15 23:58:47 +01:00
else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY)
mode = MODE_PARTY;
else
mode = MODE_BOX;
sub_80CBF14(mode, sBoxCursorPosition);
2018-12-20 22:14:36 +01:00
StringCopy(sPSSData->field_21E0, sPSSData->cursorMonNick);
2018-12-15 23:58:47 +01:00
}
2018-12-16 21:10:01 +01:00
static bool8 sub_80CE2A8(void)
2018-12-15 23:58:47 +01:00
{
if (!sub_80CBFD8())
{
2018-12-20 22:14:36 +01:00
StartSpriteAnim(sPSSData->field_CB4, 0);
2018-12-15 23:58:47 +01:00
return FALSE;
}
else
{
return TRUE;
}
}
2018-12-19 22:47:27 +01:00
static void ReleaseMon(void)
2018-12-15 23:58:47 +01:00
{
u8 boxId;
sub_80CC020();
if (sIsMonBeingMoved)
{
sIsMonBeingMoved = FALSE;
}
else
{
if (sBoxCursorArea == CURSOR_AREA_IN_PARTY)
boxId = TOTAL_BOXES_COUNT;
else
boxId = StorageGetCurrentBox();
PurgeMonOrBoxMon(boxId, sBoxCursorPosition);
}
sub_80CEB40();
}
2018-12-16 21:10:01 +01:00
static void sub_80CE324(void)
2018-12-15 23:58:47 +01:00
{
if (sIsMonBeingMoved)
2018-12-20 22:14:36 +01:00
StartSpriteAnim(sPSSData->field_CB4, 3);
2018-12-15 23:58:47 +01:00
}
2018-12-16 21:10:01 +01:00
struct
{
s8 mapGroup;
s8 mapNum;
u16 move;
} static const gUnknown_0857B9A4[] =
{
{MAP_GROUPS_COUNT, 0, MOVE_SURF},
{MAP_GROUPS_COUNT, 0, MOVE_DIVE},
{MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MOVE_STRENGTH},
{MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MOVE_ROCK_SMASH},
{MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MOVE_STRENGTH},
{MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MOVE_ROCK_SMASH},
};
static void sub_80CE350(u16 *moves)
2018-12-15 23:58:47 +01:00
{
s32 i;
for (i = 0; i < ARRAY_COUNT(gUnknown_0857B9A4); i++)
{
if (gUnknown_0857B9A4[i].mapGroup == MAP_GROUPS_COUNT
|| (gUnknown_0857B9A4[i].mapGroup == gSaveBlock1Ptr->location.mapGroup && gUnknown_0857B9A4[i].mapNum == gSaveBlock1Ptr->location.mapNum))
{
*moves = gUnknown_0857B9A4[i].move;
moves++;
}
}
*moves = MOVES_COUNT;
}
2018-12-19 22:47:27 +01:00
static void InitCanRelaseMonVars(void)
2018-12-15 23:58:47 +01:00
{
if (!AtLeastThreeUsableMons())
{
2018-12-20 22:14:36 +01:00
sPSSData->field_216D = 1;
sPSSData->field_216C = 0;
2018-12-15 23:58:47 +01:00
return;
}
if (sIsMonBeingMoved)
{
2018-12-20 22:14:36 +01:00
sPSSData->field_2108 = sPSSData->movingMon;
sPSSData->field_2170 = -1;
sPSSData->field_2171 = -1;
2018-12-15 23:58:47 +01:00
}
else
{
if (sBoxCursorArea == CURSOR_AREA_IN_PARTY)
{
2018-12-20 22:14:36 +01:00
sPSSData->field_2108 = gPlayerParty[sBoxCursorPosition];
sPSSData->field_2170 = TOTAL_BOXES_COUNT;
2018-12-15 23:58:47 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
BoxMonAtToMon(StorageGetCurrentBox(), sBoxCursorPosition, &sPSSData->field_2108);
sPSSData->field_2170 = StorageGetCurrentBox();
2018-12-15 23:58:47 +01:00
}
2018-12-20 22:14:36 +01:00
sPSSData->field_2171 = sBoxCursorPosition;
2018-12-15 23:58:47 +01:00
}
2018-12-20 22:14:36 +01:00
sub_80CE350(sPSSData->field_2176);
2019-03-03 09:14:08 +01:00
sPSSData->field_2174 = GetMonData(&sPSSData->field_2108, MON_DATA_KNOWN_MOVES, (u8*)sPSSData->field_2176);
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2174 != 0)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_216D = 0;
2018-12-15 23:58:47 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->field_216D = 1;
sPSSData->field_216C = 1;
2018-12-15 23:58:47 +01:00
}
2018-12-20 22:14:36 +01:00
sPSSData->field_2172 = 0;
2018-12-15 23:58:47 +01:00
}
2018-12-19 22:47:27 +01:00
static bool32 AtLeastThreeUsableMons(void)
2018-12-15 23:58:47 +01:00
{
s32 i, j, count;
count = (sIsMonBeingMoved != FALSE);
for (j = 0; j < PARTY_SIZE; j++)
{
if (GetMonData(&gPlayerParty[j], MON_DATA_SANITY_HAS_SPECIES))
count++;
}
if (count >= 3)
return TRUE;
for (i = 0; i < TOTAL_BOXES_COUNT; i++)
{
for (j = 0; j < IN_BOX_COUNT; j++)
{
2018-12-22 23:00:22 +01:00
if (CheckBoxMonSanityAt(i, j))
2018-12-15 23:58:47 +01:00
{
if (++count >= 3)
return TRUE;
}
}
}
return FALSE;
}
2018-12-19 22:47:27 +01:00
static s8 RunCanReleaseMon(void)
2018-12-15 23:58:47 +01:00
{
u16 i;
u16 knownMoves;
2018-12-20 22:14:36 +01:00
if (sPSSData->field_216D)
return sPSSData->field_216C;
2018-12-15 23:58:47 +01:00
2018-12-20 22:14:36 +01:00
switch (sPSSData->field_2172)
2018-12-15 23:58:47 +01:00
{
case 0:
for (i = 0; i < PARTY_SIZE; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2170 != TOTAL_BOXES_COUNT || sPSSData->field_2171 != i)
2018-12-15 23:58:47 +01:00
{
2019-03-03 09:14:08 +01:00
knownMoves = GetMonData(gPlayerParty + i, MON_DATA_KNOWN_MOVES, (u8*)sPSSData->field_2176);
2018-12-20 22:14:36 +01:00
sPSSData->field_2174 &= ~(knownMoves);
2018-12-15 23:58:47 +01:00
}
}
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2174 == 0)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_216D = 1;
sPSSData->field_216C = 1;
2018-12-15 23:58:47 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->field_216E = 0;
sPSSData->field_216F = 0;
sPSSData->field_2172++;
2018-12-15 23:58:47 +01:00
}
break;
case 1:
for (i = 0; i < IN_BOX_COUNT; i++)
{
2019-03-03 09:14:08 +01:00
knownMoves = GetAndCopyBoxMonDataAt(sPSSData->field_216E, sPSSData->field_216F, MON_DATA_KNOWN_MOVES, (u8*)sPSSData->field_2176);
2018-12-15 23:58:47 +01:00
if (knownMoves != 0
2018-12-20 22:14:36 +01:00
&& !(sPSSData->field_2170 == sPSSData->field_216E && sPSSData->field_2171 == sPSSData->field_216F))
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_2174 &= ~(knownMoves);
if (sPSSData->field_2174 == 0)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_216D = 1;
sPSSData->field_216C = 1;
2018-12-15 23:58:47 +01:00
break;
}
}
2018-12-20 22:14:36 +01:00
if (++sPSSData->field_216F >= IN_BOX_COUNT)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_216F = 0;
if (++sPSSData->field_216E >= TOTAL_BOXES_COUNT)
2018-12-15 23:58:47 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_216D = 1;
sPSSData->field_216C = 0;
2018-12-15 23:58:47 +01:00
}
}
}
break;
}
return -1;
}
2018-12-16 21:10:01 +01:00
static void sub_80CE760(void)
{
if (sIsMonBeingMoved)
2018-12-20 22:14:36 +01:00
gUnknown_02039D14 = sPSSData->movingMon;
2018-12-16 21:10:01 +01:00
}
static void sub_80CE790(void)
{
if (sIsMonBeingMoved)
{
if (sMovingMonOrigBoxId == TOTAL_BOXES_COUNT)
2018-12-20 22:14:36 +01:00
sPSSData->movingMon = gUnknown_02039D14;
2018-12-16 21:10:01 +01:00
else
2018-12-20 22:14:36 +01:00
sPSSData->movingMon.box = gUnknown_02039D14.box;
2018-12-16 21:10:01 +01:00
}
}
static void sub_80CE7E8(void)
{
if (sIsMonBeingMoved)
{
sub_80CE760();
2018-12-20 22:14:36 +01:00
sPSSData->field_218C.mon = &gUnknown_02039D14;
sPSSData->field_2187 = 0;
sPSSData->field_2186 = 0;
2020-07-19 05:08:44 +02:00
sPSSData->pokemonSummaryScreenMode = PSS_MODE_NORMAL;
2018-12-16 21:10:01 +01:00
}
else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY)
{
2018-12-20 22:14:36 +01:00
sPSSData->field_218C.mon = gPlayerParty;
sPSSData->field_2187 = sBoxCursorPosition;
sPSSData->field_2186 = CountPartyMons() - 1;
2020-07-19 05:08:44 +02:00
sPSSData->pokemonSummaryScreenMode = PSS_MODE_NORMAL;
2018-12-16 21:10:01 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->field_218C.box = GetBoxedMonPtr(StorageGetCurrentBox(), 0);
sPSSData->field_2187 = sBoxCursorPosition;
sPSSData->field_2186 = IN_BOX_COUNT - 1;
2020-07-19 05:08:44 +02:00
sPSSData->pokemonSummaryScreenMode = PSS_MODE_BOX;
2018-12-16 21:10:01 +01:00
}
}
static void sub_80CE8E4(void)
{
if (sIsMonBeingMoved)
sub_80CE790();
else
sBoxCursorPosition = gLastViewedMonIndex;
2018-12-16 21:10:01 +01:00
}
s16 CompactPartySlots(void)
{
s16 retVal = -1;
u16 i, last;
for (i = 0, last = 0; i < PARTY_SIZE; i++)
{
u16 species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES);
if (species != SPECIES_NONE)
{
if (i != last)
gPlayerParty[last] = gPlayerParty[i];
last++;
}
else if (retVal == -1)
2018-12-22 23:00:22 +01:00
{
2018-12-16 21:10:01 +01:00
retVal = i;
2018-12-22 23:00:22 +01:00
}
2018-12-16 21:10:01 +01:00
}
for (; last < PARTY_SIZE; last++)
ZeroMonData(gPlayerParty + last);
return retVal;
}
static void SetMonMarkings(u8 markings)
{
2018-12-20 22:14:36 +01:00
sPSSData->cursorMonMarkings = markings;
2018-12-16 21:10:01 +01:00
if (sIsMonBeingMoved)
{
2018-12-20 22:14:36 +01:00
SetMonData(&sPSSData->movingMon, MON_DATA_MARKINGS, &markings);
2018-12-16 21:10:01 +01:00
}
else
{
if (sBoxCursorArea == CURSOR_AREA_IN_PARTY)
SetMonData(gPlayerParty + sBoxCursorPosition, MON_DATA_MARKINGS, &markings);
if (sBoxCursorArea == CURSOR_AREA_IN_BOX)
SetCurrentBoxMonData(sBoxCursorPosition, MON_DATA_MARKINGS, &markings);
}
}
static bool8 CanMovePartyMon(void)
{
if (sBoxCursorArea == CURSOR_AREA_IN_PARTY && !sIsMonBeingMoved && CountPartyAliveNonEggMonsExcept(sBoxCursorPosition) == 0)
return TRUE;
else
return FALSE;
}
2018-12-22 23:00:22 +01:00
static bool8 CanShiftMon(void)
2018-12-16 21:10:01 +01:00
{
if (sIsMonBeingMoved)
{
if (sBoxCursorArea == CURSOR_AREA_IN_PARTY && CountPartyAliveNonEggMonsExcept(sBoxCursorPosition) == 0)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->cursorMonIsEgg || GetMonData(&sPSSData->movingMon, MON_DATA_HP) == 0)
2018-12-16 21:10:01 +01:00
return FALSE;
}
return TRUE;
}
return FALSE;
}
static bool8 IsMonBeingMoved(void)
{
return sIsMonBeingMoved;
}
static bool8 IsCursorOnBox(void)
{
return (sBoxCursorArea == CURSOR_AREA_BOX);
}
static bool8 IsCursorOnCloseBox(void)
{
return (sBoxCursorArea == CURSOR_AREA_BUTTONS && sBoxCursorPosition == 1);
}
static bool8 IsCursorInBox(void)
{
return (sBoxCursorArea == CURSOR_AREA_IN_BOX);
}
static void sub_80CEB40(void)
{
2018-12-20 22:14:36 +01:00
sPSSData->setMosaic = (sIsMonBeingMoved == FALSE);
2018-12-16 21:10:01 +01:00
if (!sIsMonBeingMoved)
{
switch (sBoxCursorArea)
{
case CURSOR_AREA_IN_PARTY:
if (sBoxCursorPosition < PARTY_SIZE)
{
SetCursorMonData(&gPlayerParty[sBoxCursorPosition], MODE_PARTY);
break;
}
// fallthrough
case CURSOR_AREA_BUTTONS:
case CURSOR_AREA_BOX:
2020-03-09 02:27:29 +01:00
SetCursorMonData(NULL, MODE_MOVE);
2018-12-16 21:10:01 +01:00
break;
case CURSOR_AREA_IN_BOX:
SetCursorMonData(GetBoxedMonPtr(StorageGetCurrentBox(), sBoxCursorPosition), MODE_BOX);
break;
}
}
}
static void sub_80CEBDC(void)
{
if (sIsMonBeingMoved)
SetCursorMonData(&gUnknown_02039D14, MODE_PARTY);
else
sub_80CEB40();
}
static void SetCursorMonData(void *pokemon, u8 mode)
{
u8 *txtPtr;
u16 gender;
bool8 sanityIsBadEgg;
2018-12-16 21:10:01 +01:00
2018-12-20 22:14:36 +01:00
sPSSData->cursorMonItem = 0;
2018-12-16 21:10:01 +01:00
gender = MON_MALE;
sanityIsBadEgg = FALSE;
2018-12-16 21:10:01 +01:00
if (mode == MODE_PARTY)
{
struct Pokemon *mon = (struct Pokemon *)pokemon;
2018-12-20 22:14:36 +01:00
sPSSData->cursorMonSpecies = GetMonData(mon, MON_DATA_SPECIES2);
if (sPSSData->cursorMonSpecies != SPECIES_NONE)
2018-12-16 21:10:01 +01:00
{
sanityIsBadEgg = GetMonData(mon, MON_DATA_SANITY_IS_BAD_EGG);
if (sanityIsBadEgg)
2018-12-20 22:14:36 +01:00
sPSSData->cursorMonIsEgg = TRUE;
2018-12-16 21:10:01 +01:00
else
2018-12-20 22:14:36 +01:00
sPSSData->cursorMonIsEgg = GetMonData(mon, MON_DATA_IS_EGG);
GetMonData(mon, MON_DATA_NICKNAME, sPSSData->cursorMonNick);
StringGetEnd10(sPSSData->cursorMonNick);
sPSSData->cursorMonLevel = GetMonData(mon, MON_DATA_LEVEL);
sPSSData->cursorMonMarkings = GetMonData(mon, MON_DATA_MARKINGS);
sPSSData->cursorMonPersonality = GetMonData(mon, MON_DATA_PERSONALITY);
sPSSData->cursorMonPalette = GetMonFrontSpritePal(mon);
2018-12-16 21:10:01 +01:00
gender = GetMonGender(mon);
2018-12-20 22:14:36 +01:00
sPSSData->cursorMonItem = GetMonData(mon, MON_DATA_HELD_ITEM);
2018-12-16 21:10:01 +01:00
}
}
else if (mode == MODE_BOX)
{
struct BoxPokemon *boxMon = (struct BoxPokemon *)pokemon;
2018-12-20 22:14:36 +01:00
sPSSData->cursorMonSpecies = GetBoxMonData(pokemon, MON_DATA_SPECIES2);
if (sPSSData->cursorMonSpecies != SPECIES_NONE)
2018-12-16 21:10:01 +01:00
{
u32 otId = GetBoxMonData(boxMon, MON_DATA_OT_ID);
sanityIsBadEgg = GetBoxMonData(boxMon, MON_DATA_SANITY_IS_BAD_EGG);
if (sanityIsBadEgg)
2018-12-20 22:14:36 +01:00
sPSSData->cursorMonIsEgg = TRUE;
2018-12-16 21:10:01 +01:00
else
2018-12-20 22:14:36 +01:00
sPSSData->cursorMonIsEgg = GetBoxMonData(boxMon, MON_DATA_IS_EGG);
2018-12-16 21:10:01 +01:00
2018-12-20 22:14:36 +01:00
GetBoxMonData(boxMon, MON_DATA_NICKNAME, sPSSData->cursorMonNick);
StringGetEnd10(sPSSData->cursorMonNick);
sPSSData->cursorMonLevel = GetLevelFromBoxMonExp(boxMon);
sPSSData->cursorMonMarkings = GetBoxMonData(boxMon, MON_DATA_MARKINGS);
sPSSData->cursorMonPersonality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY);
2019-07-25 18:56:08 +02:00
sPSSData->cursorMonPalette = GetMonSpritePalFromSpeciesAndPersonality(sPSSData->cursorMonSpecies, otId, sPSSData->cursorMonPersonality);
2018-12-20 22:14:36 +01:00
gender = GetGenderFromSpeciesAndPersonality(sPSSData->cursorMonSpecies, sPSSData->cursorMonPersonality);
sPSSData->cursorMonItem = GetBoxMonData(boxMon, MON_DATA_HELD_ITEM);
2018-12-16 21:10:01 +01:00
}
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->cursorMonSpecies = SPECIES_NONE;
sPSSData->cursorMonItem = 0;
2018-12-16 21:10:01 +01:00
}
2018-12-20 22:14:36 +01:00
if (sPSSData->cursorMonSpecies == SPECIES_NONE)
2018-12-16 21:10:01 +01:00
{
2018-12-20 22:14:36 +01:00
StringFill(sPSSData->cursorMonNick, CHAR_SPACE, 5);
StringFill(sPSSData->cursorMonNickText, CHAR_SPACE, 8);
StringFill(sPSSData->cursorMonSpeciesName, CHAR_SPACE, 8);
StringFill(sPSSData->cursorMonGenderLvlText, CHAR_SPACE, 8);
StringFill(sPSSData->cursorMonItemName, CHAR_SPACE, 8);
2018-12-16 21:10:01 +01:00
}
2018-12-20 22:14:36 +01:00
else if (sPSSData->cursorMonIsEgg)
2018-12-16 21:10:01 +01:00
{
if (sanityIsBadEgg)
2018-12-20 22:14:36 +01:00
StringCopyPadded(sPSSData->cursorMonNickText, sPSSData->cursorMonNick, CHAR_SPACE, 5);
2018-12-16 21:10:01 +01:00
else
2018-12-20 22:14:36 +01:00
StringCopyPadded(sPSSData->cursorMonNickText, gText_EggNickname, CHAR_SPACE, 8);
2018-12-16 21:10:01 +01:00
2018-12-20 22:14:36 +01:00
StringFill(sPSSData->cursorMonSpeciesName, CHAR_SPACE, 8);
StringFill(sPSSData->cursorMonGenderLvlText, CHAR_SPACE, 8);
StringFill(sPSSData->cursorMonItemName, CHAR_SPACE, 8);
2018-12-16 21:10:01 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
if (sPSSData->cursorMonSpecies == SPECIES_NIDORAN_F || sPSSData->cursorMonSpecies == SPECIES_NIDORAN_M)
2018-12-16 21:10:01 +01:00
gender = MON_GENDERLESS;
2018-12-20 22:14:36 +01:00
StringCopyPadded(sPSSData->cursorMonNickText, sPSSData->cursorMonNick, CHAR_SPACE, 5);
2018-12-16 21:10:01 +01:00
2018-12-20 22:14:36 +01:00
txtPtr = sPSSData->cursorMonSpeciesName;
2018-12-16 21:10:01 +01:00
*(txtPtr)++ = CHAR_SLASH;
2018-12-20 22:14:36 +01:00
StringCopyPadded(txtPtr, gSpeciesNames[sPSSData->cursorMonSpecies], CHAR_SPACE, 5);
2018-12-16 21:10:01 +01:00
2018-12-20 22:14:36 +01:00
txtPtr = sPSSData->cursorMonGenderLvlText;
2018-12-16 21:10:01 +01:00
*(txtPtr)++ = EXT_CTRL_CODE_BEGIN;
2020-08-11 05:50:49 +02:00
*(txtPtr)++ = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
2018-12-16 21:10:01 +01:00
switch (gender)
{
case MON_MALE:
2020-08-11 05:50:49 +02:00
*(txtPtr)++ = TEXT_COLOR_RED;
*(txtPtr)++ = TEXT_COLOR_WHITE;
*(txtPtr)++ = TEXT_COLOR_LIGHT_RED;
2018-12-16 21:10:01 +01:00
*(txtPtr)++ = CHAR_MALE;
break;
case MON_FEMALE:
2020-08-11 05:50:49 +02:00
*(txtPtr)++ = TEXT_COLOR_GREEN;
*(txtPtr)++ = TEXT_COLOR_WHITE;
*(txtPtr)++ = TEXT_COLOR_LIGHT_GREEN;
2018-12-16 21:10:01 +01:00
*(txtPtr)++ = CHAR_FEMALE;
break;
default:
2021-04-10 04:39:34 +02:00
*(txtPtr)++ = TEXT_COLOR_DARK_GRAY;
2020-08-11 05:50:49 +02:00
*(txtPtr)++ = TEXT_COLOR_WHITE;
2021-04-10 04:39:34 +02:00
*(txtPtr)++ = TEXT_COLOR_LIGHT_GRAY;
2020-08-11 05:50:49 +02:00
*(txtPtr)++ = CHAR_UNK_SPACER;
2018-12-16 21:10:01 +01:00
break;
}
*(txtPtr++) = EXT_CTRL_CODE_BEGIN;
2020-08-11 05:50:49 +02:00
*(txtPtr++) = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW;
2021-04-10 04:39:34 +02:00
*(txtPtr++) = TEXT_COLOR_DARK_GRAY;
2020-08-11 05:50:49 +02:00
*(txtPtr++) = TEXT_COLOR_WHITE;
2021-04-10 04:39:34 +02:00
*(txtPtr++) = TEXT_COLOR_LIGHT_GRAY;
2020-08-11 05:50:49 +02:00
*(txtPtr++) = CHAR_SPACE;
*(txtPtr++) = CHAR_EXTRA_SYMBOL;
2020-02-01 06:25:50 +01:00
*(txtPtr++) = CHAR_LV_2;
2018-12-16 21:10:01 +01:00
2018-12-20 22:14:36 +01:00
txtPtr = ConvertIntToDecimalStringN(txtPtr, sPSSData->cursorMonLevel, STR_CONV_MODE_LEFT_ALIGN, 3);
2018-12-16 21:10:01 +01:00
txtPtr[0] = CHAR_SPACE;
txtPtr[1] = EOS;
2018-12-20 22:14:36 +01:00
if (sPSSData->cursorMonItem != 0)
StringCopyPadded(sPSSData->cursorMonItemName, ItemId_GetName(sPSSData->cursorMonItem), CHAR_SPACE, 8);
2018-12-16 21:10:01 +01:00
else
2018-12-20 22:14:36 +01:00
StringFill(sPSSData->cursorMonItemName, CHAR_SPACE, 8);
2018-12-16 21:10:01 +01:00
}
}
static u8 HandleInput_InBox(void)
{
2018-12-20 22:14:36 +01:00
switch (sPSSData->inBoxMovingMode)
2018-12-16 21:10:01 +01:00
{
case 0:
default:
return InBoxInput_Normal();
case 1:
return InBoxInput_GrabbingMultiple();
case 2:
return InBoxInput_MovingMultiple();
}
}
static u8 InBoxInput_Normal(void)
{
u8 retVal;
s8 cursorArea;
s8 cursorPosition;
do
2018-12-16 21:10:01 +01:00
{
cursorArea = sBoxCursorArea;
cursorPosition = sBoxCursorPosition;
sPSSData->field_CD2 = 0;
sPSSData->field_CD3 = 0;
sPSSData->field_CD7 = 0;
if (JOY_REPEAT(DPAD_UP))
{
retVal = TRUE;
if (sBoxCursorPosition >= IN_BOX_ROWS)
{
cursorPosition -= IN_BOX_ROWS;
}
else
{
cursorArea = CURSOR_AREA_BOX;
cursorPosition = 0;
}
break;
}
else if (JOY_REPEAT(DPAD_DOWN))
2018-12-16 21:10:01 +01:00
{
retVal = TRUE;
cursorPosition += IN_BOX_ROWS;
if (cursorPosition >= IN_BOX_COUNT)
{
cursorArea = CURSOR_AREA_BUTTONS;
cursorPosition -= IN_BOX_COUNT;
cursorPosition /= 3;
2018-12-20 22:14:36 +01:00
sPSSData->field_CD2 = 1;
sPSSData->field_CD7 = 1;
2018-12-16 21:10:01 +01:00
}
break;
2018-12-16 21:10:01 +01:00
}
else if (JOY_REPEAT(DPAD_LEFT))
2018-12-16 21:10:01 +01:00
{
retVal = TRUE;
if (sBoxCursorPosition % IN_BOX_ROWS != 0)
{
cursorPosition--;
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->field_CD3 = -1;
2018-12-16 21:10:01 +01:00
cursorPosition += (IN_BOX_ROWS - 1);
}
break;
2018-12-16 21:10:01 +01:00
}
else if (JOY_REPEAT(DPAD_RIGHT))
2018-12-16 21:10:01 +01:00
{
retVal = TRUE;
if ((sBoxCursorPosition + 1) % IN_BOX_ROWS != 0)
{
cursorPosition++;
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->field_CD3 = 1;
2018-12-16 21:10:01 +01:00
cursorPosition -= (IN_BOX_ROWS - 1);
}
break;
2018-12-16 21:10:01 +01:00
}
else if (JOY_NEW(START_BUTTON))
2018-12-16 21:10:01 +01:00
{
retVal = TRUE;
cursorArea = CURSOR_AREA_BOX;
cursorPosition = 0;
break;
2018-12-16 21:10:01 +01:00
}
if ((JOY_NEW(A_BUTTON)) && sub_80CFA5C())
2018-12-16 21:10:01 +01:00
{
if (!sCanOnlyMove)
return 8;
2018-12-16 21:10:01 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_MONS || sIsMonBeingMoved == TRUE)
{
2021-04-15 19:31:18 +02:00
switch (GetMenuItemTextId(0))
2018-12-16 21:10:01 +01:00
{
2021-04-15 19:31:18 +02:00
case MENU_STORE:
return 11;
2021-04-15 19:31:18 +02:00
case MENU_WITHDRAW:
return 12;
2021-04-15 19:31:18 +02:00
case MENU_MOVE:
return 13;
2021-04-15 19:31:18 +02:00
case MENU_SHIFT:
return 14;
2021-04-15 19:31:18 +02:00
case MENU_PLACE:
return 15;
2021-04-15 19:31:18 +02:00
case MENU_TAKE:
return 16;
2021-04-15 19:31:18 +02:00
case MENU_GIVE:
return 17;
2021-04-15 19:31:18 +02:00
case MENU_SWITCH:
return 18;
2018-12-16 21:10:01 +01:00
}
}
else
2018-12-16 21:10:01 +01:00
{
sPSSData->inBoxMovingMode = 1;
return 20;
2018-12-16 21:10:01 +01:00
}
}
if (JOY_NEW(B_BUTTON))
return 19;
if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
2018-12-16 21:10:01 +01:00
{
if (JOY_HELD(L_BUTTON))
return 10;
if (JOY_HELD(R_BUTTON))
return 9;
2018-12-16 21:10:01 +01:00
}
if (JOY_NEW(SELECT_BUTTON))
2018-12-16 21:10:01 +01:00
{
sub_80CFDC4();
return 0;
2018-12-16 21:10:01 +01:00
}
retVal = 0;
} while (0);
2018-12-16 21:10:01 +01:00
if (retVal)
sub_80CD894(cursorArea, cursorPosition);
return retVal;
}
static u8 InBoxInput_GrabbingMultiple(void)
{
if (JOY_HELD(A_BUTTON))
2018-12-16 21:10:01 +01:00
{
if (JOY_REPEAT(DPAD_UP))
2018-12-16 21:10:01 +01:00
{
if (sBoxCursorPosition / IN_BOX_ROWS != 0)
{
sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - IN_BOX_ROWS);
return 21;
}
else
{
return 24;
}
}
else if (JOY_REPEAT(DPAD_DOWN))
2018-12-16 21:10:01 +01:00
{
if (sBoxCursorPosition + IN_BOX_ROWS < IN_BOX_COUNT)
{
sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + IN_BOX_ROWS);
return 21;
}
else
{
return 24;
}
}
else if (JOY_REPEAT(DPAD_LEFT))
2018-12-16 21:10:01 +01:00
{
if (sBoxCursorPosition % IN_BOX_ROWS != 0)
{
sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - 1);
return 21;
}
else
{
return 24;
}
}
else if (JOY_REPEAT(DPAD_RIGHT))
2018-12-16 21:10:01 +01:00
{
if ((sBoxCursorPosition + 1) % IN_BOX_ROWS != 0)
{
sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + 1);
return 21;
}
else
{
return 24;
}
}
else
{
return 0;
}
}
else
{
if (sub_80D0BA4() == sBoxCursorPosition)
{
2018-12-20 22:14:36 +01:00
sPSSData->inBoxMovingMode = 0;
sPSSData->field_CB8->invisible = FALSE;
2018-12-16 21:10:01 +01:00
return 22;
}
else
{
2018-12-20 22:14:36 +01:00
sIsMonBeingMoved = (sPSSData->cursorMonSpecies != SPECIES_NONE);
sPSSData->inBoxMovingMode = 2;
2018-12-16 21:10:01 +01:00
sMovingMonOrigBoxId = StorageGetCurrentBox();
return 23;
}
}
}
static u8 InBoxInput_MovingMultiple(void)
{
if (JOY_REPEAT(DPAD_UP))
2018-12-16 21:10:01 +01:00
{
if (sub_80D0580(0))
{
sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - IN_BOX_ROWS);
return 25;
}
else
{
return 24;
}
}
else if (JOY_REPEAT(DPAD_DOWN))
2018-12-16 21:10:01 +01:00
{
if (sub_80D0580(1))
{
sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + IN_BOX_ROWS);
return 25;
}
else
{
return 24;
}
}
else if (JOY_REPEAT(DPAD_LEFT))
2018-12-16 21:10:01 +01:00
{
if (sub_80D0580(2))
{
sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - 1);
return 25;
}
else
{
return 10;
}
}
else if (JOY_REPEAT(DPAD_RIGHT))
2018-12-16 21:10:01 +01:00
{
if (sub_80D0580(3))
{
sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + 1);
return 25;
}
else
{
return 9;
}
}
else if (JOY_NEW(A_BUTTON))
2018-12-16 21:10:01 +01:00
{
if (sub_80D0BC0())
{
sIsMonBeingMoved = FALSE;
2018-12-20 22:14:36 +01:00
sPSSData->inBoxMovingMode = 0;
2018-12-16 21:10:01 +01:00
return 26;
}
else
{
return 24;
}
}
else if (JOY_NEW(B_BUTTON))
2018-12-16 21:10:01 +01:00
{
return 24;
}
else
{
if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
{
if (JOY_HELD(L_BUTTON))
2018-12-16 21:10:01 +01:00
return 10;
if (JOY_HELD(R_BUTTON))
2018-12-16 21:10:01 +01:00
return 9;
}
return 0;
}
}
static u8 HandleInput_InParty(void)
{
u8 retVal;
bool8 gotoBox;
s8 cursorArea;
s8 cursorPosition;
2018-12-16 21:10:01 +01:00
do
2018-12-16 21:10:01 +01:00
{
cursorArea = sBoxCursorArea;
cursorPosition = sBoxCursorPosition;
sPSSData->field_CD3 = 0;
sPSSData->field_CD2 = 0;
sPSSData->field_CD7 = 0;
gotoBox = FALSE;
retVal = 0;
if (JOY_REPEAT(DPAD_UP))
{
if (--cursorPosition < 0)
cursorPosition = PARTY_SIZE;
if (cursorPosition != sBoxCursorPosition)
retVal = 1;
break;
}
else if (JOY_REPEAT(DPAD_DOWN))
2018-12-16 21:10:01 +01:00
{
if (++cursorPosition > PARTY_SIZE)
cursorPosition = 0;
if (cursorPosition != sBoxCursorPosition)
retVal = 1;
break;
2018-12-16 21:10:01 +01:00
}
else if (JOY_REPEAT(DPAD_LEFT) && sBoxCursorPosition != 0)
2018-12-16 21:10:01 +01:00
{
retVal = 1;
2018-12-20 22:14:36 +01:00
sPSSData->field_CD6 = sBoxCursorPosition;
2018-12-16 21:10:01 +01:00
cursorPosition = 0;
break;
2018-12-16 21:10:01 +01:00
}
else if (JOY_REPEAT(DPAD_RIGHT))
2018-12-16 21:10:01 +01:00
{
if (sBoxCursorPosition == 0)
{
retVal = 1;
2018-12-20 22:14:36 +01:00
cursorPosition = sPSSData->field_CD6;
2018-12-16 21:10:01 +01:00
}
else
{
retVal = 6;
cursorArea = CURSOR_AREA_IN_BOX;
cursorPosition = 0;
}
break;
2018-12-16 21:10:01 +01:00
}
if (JOY_NEW(A_BUTTON))
2018-12-16 21:10:01 +01:00
{
if (sBoxCursorPosition == PARTY_SIZE)
2018-12-16 21:10:01 +01:00
{
if (sPSSData->boxOption == BOX_OPTION_DEPOSIT)
return 4;
2018-12-16 21:10:01 +01:00
gotoBox = TRUE;
}
else if (sub_80CFA5C())
{
if (!sCanOnlyMove)
return 8;
2021-04-15 19:31:18 +02:00
switch (GetMenuItemTextId(0))
2018-12-16 21:10:01 +01:00
{
2021-04-15 19:31:18 +02:00
case MENU_STORE:
return 11;
2021-04-15 19:31:18 +02:00
case MENU_WITHDRAW:
return 12;
2021-04-15 19:31:18 +02:00
case MENU_MOVE:
return 13;
2021-04-15 19:31:18 +02:00
case MENU_SHIFT:
return 14;
2021-04-15 19:31:18 +02:00
case MENU_PLACE:
return 15;
2021-04-15 19:31:18 +02:00
case MENU_TAKE:
return 16;
2021-04-15 19:31:18 +02:00
case MENU_GIVE:
return 17;
2021-04-15 19:31:18 +02:00
case MENU_SWITCH:
return 18;
2018-12-16 21:10:01 +01:00
}
}
}
2018-12-16 21:10:01 +01:00
if (JOY_NEW(B_BUTTON))
{
if (sPSSData->boxOption == BOX_OPTION_DEPOSIT)
return 19;
2018-12-16 21:10:01 +01:00
gotoBox = TRUE;
}
2018-12-16 21:10:01 +01:00
if (gotoBox)
{
retVal = 6;
cursorArea = CURSOR_AREA_IN_BOX;
cursorPosition = 0;
2018-12-16 21:10:01 +01:00
}
else if (JOY_NEW(SELECT_BUTTON))
{
sub_80CFDC4();
return 0;
}
} while (0);
2018-12-21 22:35:01 +01:00
if (retVal != 0)
2018-12-16 21:10:01 +01:00
{
if (retVal != 6)
sub_80CD894(cursorArea, cursorPosition);
}
2018-12-21 22:35:01 +01:00
return retVal;
2018-12-16 21:10:01 +01:00
}
2018-12-16 21:10:01 +01:00
static u8 HandleInput_OnBox(void)
{
u8 retVal;
s8 cursorArea;
s8 cursorPosition;
2018-12-16 21:10:01 +01:00
do
2018-12-16 21:10:01 +01:00
{
sPSSData->field_CD3 = 0;
sPSSData->field_CD2 = 0;
sPSSData->field_CD7 = 0;
if (JOY_REPEAT(DPAD_UP))
{
retVal = 1;
cursorArea = CURSOR_AREA_BUTTONS;
cursorPosition = 0;
sPSSData->field_CD7 = 1;
break;
}
else if (JOY_REPEAT(DPAD_DOWN))
2018-12-16 21:10:01 +01:00
{
retVal = 1;
cursorArea = CURSOR_AREA_IN_BOX;
cursorPosition = 2;
break;
2018-12-16 21:10:01 +01:00
}
if (JOY_HELD(DPAD_LEFT))
return 10;
if (JOY_HELD(DPAD_RIGHT))
return 9;
if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
2018-12-16 21:10:01 +01:00
{
if (JOY_HELD(L_BUTTON))
2018-12-16 21:10:01 +01:00
return 10;
if (JOY_HELD(R_BUTTON))
2018-12-16 21:10:01 +01:00
return 9;
}
2018-12-16 21:10:01 +01:00
if (JOY_NEW(A_BUTTON))
{
2021-04-15 20:06:25 +02:00
AnimateBoxScrollArrows(FALSE);
AddBoxMenu();
return 7;
}
2018-12-16 21:10:01 +01:00
if (JOY_NEW(B_BUTTON))
return 19;
2018-12-16 21:10:01 +01:00
if (JOY_NEW(SELECT_BUTTON))
{
sub_80CFDC4();
return 0;
}
2018-12-16 21:10:01 +01:00
retVal = 0;
2018-12-16 21:10:01 +01:00
} while (0);
2018-12-16 21:10:01 +01:00
if (retVal)
{
if (cursorArea != CURSOR_AREA_BOX)
2021-04-15 20:06:25 +02:00
AnimateBoxScrollArrows(FALSE);
2018-12-16 21:10:01 +01:00
sub_80CD894(cursorArea, cursorPosition);
}
return retVal;
}
2018-12-16 21:10:01 +01:00
static u8 HandleInput_OnButtons(void)
{
u8 retVal;
s8 cursorArea;
s8 cursorPosition;
2018-12-16 21:10:01 +01:00
do
2018-12-16 21:10:01 +01:00
{
cursorArea = sBoxCursorArea;
cursorPosition = sBoxCursorPosition;
sPSSData->field_CD3 = 0;
sPSSData->field_CD2 = 0;
sPSSData->field_CD7 = 0;
if (JOY_REPEAT(DPAD_UP))
{
retVal = 1;
cursorArea = CURSOR_AREA_IN_BOX;
sPSSData->field_CD2 = -1;
if (sBoxCursorPosition == 0)
cursorPosition = IN_BOX_COUNT - 1 - 5;
else
cursorPosition = IN_BOX_COUNT - 1;
sPSSData->field_CD7 = 1;
break;
}
if (JOY_REPEAT(DPAD_DOWN | START_BUTTON))
2018-12-16 21:10:01 +01:00
{
retVal = 1;
cursorArea = CURSOR_AREA_BOX;
cursorPosition = 0;
2018-12-20 22:14:36 +01:00
sPSSData->field_CD7 = 1;
break;
2018-12-16 21:10:01 +01:00
}
if (JOY_REPEAT(DPAD_LEFT))
2018-12-16 21:10:01 +01:00
{
retVal = 1;
if (--cursorPosition < 0)
cursorPosition = 1;
break;
2018-12-16 21:10:01 +01:00
}
else if (JOY_REPEAT(DPAD_RIGHT))
2018-12-16 21:10:01 +01:00
{
retVal = 1;
if (++cursorPosition > 1)
cursorPosition = 0;
break;
2018-12-16 21:10:01 +01:00
}
if (JOY_NEW(A_BUTTON))
2018-12-16 21:10:01 +01:00
return (cursorPosition == 0) ? 5 : 4;
if (JOY_NEW(B_BUTTON))
2018-12-16 21:10:01 +01:00
return 19;
if (JOY_NEW(SELECT_BUTTON))
2018-12-16 21:10:01 +01:00
{
sub_80CFDC4();
return 0;
}
retVal = 0;
} while (0);
2018-12-16 21:10:01 +01:00
if (retVal != 0)
sub_80CD894(cursorArea, cursorPosition);
return retVal;
}
static u8 HandleInput(void)
{
struct
{
u8 (*func)(void);
s8 area;
}
static const inputFuncs[] =
{
{HandleInput_InBox, CURSOR_AREA_IN_BOX},
{HandleInput_InParty, CURSOR_AREA_IN_PARTY},
{HandleInput_OnBox, CURSOR_AREA_BOX},
{HandleInput_OnButtons, CURSOR_AREA_BUTTONS},
{NULL, 0},
};
u16 i = 0;
while (inputFuncs[i].func != NULL)
{
if (inputFuncs[i].area == sBoxCursorArea)
return inputFuncs[i].func();
i++;
}
return 0;
}
2018-12-19 22:47:27 +01:00
static void AddBoxMenu(void)
2018-12-16 21:10:01 +01:00
{
InitMenu();
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_JUMP);
SetMenuText(MENU_WALLPAPER);
SetMenuText(MENU_NAME);
SetMenuText(MENU_CANCEL);
2018-12-16 21:10:01 +01:00
}
2018-12-19 22:47:27 +01:00
static u8 sub_80CFA5C(void)
2018-12-16 21:10:01 +01:00
{
InitMenu();
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-16 21:10:01 +01:00
return sub_80CFA84();
else
return sub_80CFB44();
}
static bool8 sub_80CFA84(void)
{
u16 var0 = sub_80CD504();
2018-12-20 22:14:36 +01:00
switch (sPSSData->boxOption)
2018-12-16 21:10:01 +01:00
{
case BOX_OPTION_DEPOSIT:
if (var0)
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_STORE);
2018-12-16 21:10:01 +01:00
else
return FALSE;
break;
case BOX_OPTION_WITHDRAW:
if (var0)
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_WITHDRAW);
2018-12-16 21:10:01 +01:00
else
return FALSE;
break;
case BOX_OPTION_MOVE_MONS:
if (sIsMonBeingMoved)
{
if (var0)
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_SHIFT);
2018-12-16 21:10:01 +01:00
else
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_PLACE);
2018-12-16 21:10:01 +01:00
}
else
{
if (var0)
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_MOVE);
2018-12-16 21:10:01 +01:00
else
return FALSE;
}
break;
case BOX_OPTION_MOVE_ITEMS:
default:
return FALSE;
}
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_SUMMARY);
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption == BOX_OPTION_MOVE_MONS)
2018-12-16 21:10:01 +01:00
{
if (!sBoxCursorArea)
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_WITHDRAW);
2018-12-16 21:10:01 +01:00
else
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_STORE);
2018-12-16 21:10:01 +01:00
}
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_MARK);
SetMenuText(MENU_RELEASE);
SetMenuText(MENU_CANCEL);
2018-12-16 21:10:01 +01:00
return TRUE;
}
static bool8 sub_80CFB44(void)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->cursorMonSpecies == SPECIES_EGG)
2018-12-16 21:10:01 +01:00
return FALSE;
2018-12-19 22:47:27 +01:00
if (!IsActiveItemMoving())
2018-12-16 21:10:01 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->cursorMonItem == 0)
2018-12-16 21:10:01 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->cursorMonSpecies == SPECIES_NONE)
2018-12-16 21:10:01 +01:00
return FALSE;
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_GIVE_2);
2018-12-16 21:10:01 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
if (!ItemIsMail(sPSSData->cursorMonItem))
2018-12-16 21:10:01 +01:00
{
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_TAKE);
SetMenuText(MENU_BAG);
2018-12-16 21:10:01 +01:00
}
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_INFO);
2018-12-16 21:10:01 +01:00
}
}
else
{
2018-12-20 22:14:36 +01:00
if (sPSSData->cursorMonItem == 0)
2018-12-16 21:10:01 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->cursorMonSpecies == SPECIES_NONE)
2018-12-16 21:10:01 +01:00
return FALSE;
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_GIVE);
2018-12-16 21:10:01 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
if (ItemIsMail(sPSSData->cursorMonItem) == TRUE)
2018-12-16 21:10:01 +01:00
return FALSE;
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_SWITCH);
2018-12-16 21:10:01 +01:00
}
}
2021-04-15 19:31:18 +02:00
SetMenuText(MENU_CANCEL);
2018-12-16 21:10:01 +01:00
return TRUE;
}
2018-12-19 22:47:27 +01:00
static void sub_80CFBF4(struct Sprite *sprite)
2018-12-16 21:10:01 +01:00
{
2018-12-20 22:14:36 +01:00
sprite->pos1.x = sPSSData->field_CB4->pos1.x;
sprite->pos1.y = sPSSData->field_CB4->pos1.y + 20;
2018-12-16 21:10:01 +01:00
}
2018-12-19 22:47:27 +01:00
static void sub_80CFC14(void)
2018-12-16 21:10:01 +01:00
{
u16 x, y;
u8 spriteId;
u8 priority, subpriority;
struct SpriteSheet spriteSheets[] =
{
{gHandCursorTiles, 0x800, 0},
{gHandCursorShadowTiles, 0x80, 1},
{}
};
struct SpritePalette spritePalettes[] =
{
2018-12-21 22:35:01 +01:00
{gHandCursorPalette, TAG_PAL_DAC7},
2018-12-16 21:10:01 +01:00
{}
};
2018-12-22 23:00:22 +01:00
static const struct OamData sOamData_857BA0C =
{
.shape = SPRITE_SHAPE(32x32),
.size = SPRITE_SIZE(32x32),
2018-12-22 23:00:22 +01:00
.priority = 1,
};
static const struct OamData sOamData_857BA14 =
{
.shape = SPRITE_SHAPE(16x16),
.size = SPRITE_SIZE(16x16),
2018-12-22 23:00:22 +01:00
.priority = 1,
};
2018-12-16 21:10:01 +01:00
2018-12-22 23:00:22 +01:00
static const union AnimCmd sSpriteAnim_857BA1C[] =
{
ANIMCMD_FRAME(0, 30),
ANIMCMD_FRAME(16, 30),
ANIMCMD_JUMP(0)
};
static const union AnimCmd sSpriteAnim_857BA28[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_857BA30[] =
{
ANIMCMD_FRAME(32, 5),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_857BA38[] =
{
ANIMCMD_FRAME(48, 5),
ANIMCMD_END
};
2018-12-16 21:10:01 +01:00
2018-12-22 23:00:22 +01:00
static const union AnimCmd *const sSpriteAnimTable_857BA40[] =
{
sSpriteAnim_857BA1C,
sSpriteAnim_857BA28,
sSpriteAnim_857BA30,
sSpriteAnim_857BA38
};
2018-12-16 21:10:01 +01:00
2018-12-22 23:00:22 +01:00
static const struct SpriteTemplate gSpriteTemplate_857BA50 =
{
.tileTag = TAG_TILE_0,
.paletteTag = TAG_PAL_WAVEFORM,
.oam = &sOamData_857BA0C,
.anims = sSpriteAnimTable_857BA40,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
2018-12-16 21:10:01 +01:00
2018-12-22 23:00:22 +01:00
static const struct SpriteTemplate gSpriteTemplate_857BA68 =
{
.tileTag = TAG_TILE_1,
.paletteTag = TAG_PAL_WAVEFORM,
.oam = &sOamData_857BA14,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80CFBF4,
};
2018-12-16 21:10:01 +01:00
LoadSpriteSheets(spriteSheets);
LoadSpritePalettes(spritePalettes);
2018-12-21 22:35:01 +01:00
sPSSData->field_CD8[0] = IndexOfSpritePaletteTag(TAG_PAL_WAVEFORM);
sPSSData->field_CD8[1] = IndexOfSpritePaletteTag(TAG_PAL_DAC7);
2018-12-16 21:10:01 +01:00
sub_80CD444(sBoxCursorArea, sBoxCursorPosition, &x, &y);
spriteId = CreateSprite(&gSpriteTemplate_857BA50, x, y, 6);
if (spriteId != MAX_SPRITES)
{
2018-12-20 22:14:36 +01:00
sPSSData->field_CB4 = &gSprites[spriteId];
sPSSData->field_CB4->oam.paletteNum = sPSSData->field_CD8[sCanOnlyMove];
sPSSData->field_CB4->oam.priority = 1;
2018-12-16 21:10:01 +01:00
if (sIsMonBeingMoved)
2018-12-20 22:14:36 +01:00
StartSpriteAnim(sPSSData->field_CB4, 3);
2018-12-16 21:10:01 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->field_CB4 = NULL;
2018-12-16 21:10:01 +01:00
}
2018-12-22 23:00:22 +01:00
if (sBoxCursorArea == CURSOR_AREA_IN_PARTY)
2018-12-16 21:10:01 +01:00
{
subpriority = 13;
priority = 1;
}
else
{
subpriority = 21;
priority = 2;
}
spriteId = CreateSprite(&gSpriteTemplate_857BA68, 0, 0, subpriority);
if (spriteId != MAX_SPRITES)
{
2018-12-20 22:14:36 +01:00
sPSSData->field_CB8 = &gSprites[spriteId];
sPSSData->field_CB8->oam.priority = priority;
2018-12-16 21:10:01 +01:00
if (sBoxCursorArea)
2018-12-20 22:14:36 +01:00
sPSSData->field_CB8->invisible = 1;
2018-12-16 21:10:01 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->field_CB8 = NULL;
2018-12-16 21:10:01 +01:00
}
}
2018-12-19 22:47:27 +01:00
static void sub_80CFDC4(void)
2018-12-16 21:10:01 +01:00
{
sCanOnlyMove = !sCanOnlyMove;
2018-12-20 22:14:36 +01:00
sPSSData->field_CB4->oam.paletteNum = sPSSData->field_CD8[sCanOnlyMove];
2018-12-16 21:10:01 +01:00
}
2018-12-19 22:47:27 +01:00
static u8 GetBoxCursorPosition(void)
2018-12-16 21:10:01 +01:00
{
return sBoxCursorPosition;
}
2018-12-19 22:47:27 +01:00
static void sub_80CFE14(u8 *arg0, u8 *arg1)
2018-12-16 21:10:01 +01:00
{
if (sBoxCursorArea == CURSOR_AREA_IN_BOX)
{
*arg0 = sBoxCursorPosition % IN_BOX_ROWS;
*arg1 = sBoxCursorPosition / IN_BOX_ROWS;
}
else
{
*arg0 = 0;
*arg1 = 0;
}
}
2018-12-19 22:47:27 +01:00
static void sub_80CFE54(u8 animNum)
2018-12-16 21:10:01 +01:00
{
2018-12-20 22:14:36 +01:00
StartSpriteAnim(sPSSData->field_CB4, animNum);
2018-12-16 21:10:01 +01:00
}
2018-12-19 22:47:27 +01:00
static u8 sub_80CFE78(void)
2018-12-16 21:10:01 +01:00
{
return sMovingMonOrigBoxId;
}
2018-12-19 22:47:27 +01:00
static void sub_80CFE84(void)
2018-12-16 21:10:01 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_CB4->oam.priority = 1;
2018-12-16 21:10:01 +01:00
}
2018-12-19 22:47:27 +01:00
static void sub_80CFEA8(void)
2018-12-16 21:10:01 +01:00
{
if (sBoxCursorArea == CURSOR_AREA_IN_BOX)
2018-12-17 23:00:08 +01:00
sub_80D0E50(CURSOR_AREA_IN_BOX, sBoxCursorPosition);
2018-12-16 21:10:01 +01:00
}
2018-12-19 22:47:27 +01:00
static void sub_80CFECC(void)
2018-12-16 21:10:01 +01:00
{
if (sBoxCursorArea == CURSOR_AREA_IN_BOX)
2018-12-17 23:00:08 +01:00
sub_80D0D8C(CURSOR_AREA_IN_BOX, sBoxCursorPosition);
2018-12-16 21:10:01 +01:00
}
static void InitMenu(void)
{
2018-12-20 22:14:36 +01:00
sPSSData->menuItemsCount = 0;
sPSSData->menuWidth = 0;
sPSSData->menuWindow.bg = 0;
sPSSData->menuWindow.paletteNum = 15;
sPSSData->menuWindow.baseBlock = 92;
2018-12-16 21:10:01 +01:00
}
2021-04-15 19:31:18 +02:00
static const u8 *const sMenuTexts[] =
{
[MENU_CANCEL] = gPCText_Cancel,
[MENU_STORE] = gPCText_Store,
[MENU_WITHDRAW] = gPCText_Withdraw,
[MENU_MOVE] = gPCText_Move,
[MENU_SHIFT] = gPCText_Shift,
[MENU_PLACE] = gPCText_Place,
[MENU_SUMMARY] = gPCText_Summary,
[MENU_RELEASE] = gPCText_Release,
[MENU_MARK] = gPCText_Mark,
[MENU_JUMP] = gPCText_Jump,
[MENU_WALLPAPER] = gPCText_Wallpaper,
[MENU_NAME] = gPCText_Name,
[MENU_TAKE] = gPCText_Take,
[MENU_GIVE] = gPCText_Give,
[MENU_GIVE_2] = gPCText_Give,
[MENU_SWITCH] = gPCText_Switch,
[MENU_BAG] = gPCText_Bag,
[MENU_INFO] = gPCText_Info,
[MENU_SCENERY_1] = gPCText_Scenery1,
[MENU_SCENERY_2] = gPCText_Scenery2,
[MENU_SCENERY_3] = gPCText_Scenery3,
[MENU_ETCETERA] = gPCText_Etcetera,
[MENU_FRIENDS] = gPCText_Friends,
[MENU_FOREST] = gPCText_Forest,
[MENU_CITY] = gPCText_City,
[MENU_DESERT] = gPCText_Desert,
[MENU_SAVANNA] = gPCText_Savanna,
[MENU_CRAG] = gPCText_Crag,
[MENU_VOLCANO] = gPCText_Volcano,
[MENU_SNOW] = gPCText_Snow,
[MENU_CAVE] = gPCText_Cave,
[MENU_BEACH] = gPCText_Beach,
[MENU_SEAFLOOR] = gPCText_Seafloor,
[MENU_RIVER] = gPCText_River,
[MENU_SKY] = gPCText_Sky,
[MENU_POLKADOT] = gPCText_PolkaDot,
[MENU_POKECENTER] = gPCText_Pokecenter,
[MENU_MACHINE] = gPCText_Machine,
[MENU_SIMPLE] = gPCText_Simple,
2018-12-16 21:10:01 +01:00
};
static void SetMenuText(u8 textId)
{
2021-04-15 19:31:18 +02:00
if (sPSSData->menuItemsCount < ARRAY_COUNT(sPSSData->menuItems))
2018-12-16 21:10:01 +01:00
{
u8 len;
2018-12-20 22:14:36 +01:00
struct StorageMenu *menu = &sPSSData->menuItems[sPSSData->menuItemsCount];
2018-12-16 21:10:01 +01:00
2021-04-15 19:31:18 +02:00
menu->text = sMenuTexts[textId];
2018-12-16 21:10:01 +01:00
menu->textId = textId;
len = StringLength(menu->text);
2018-12-20 22:14:36 +01:00
if (len > sPSSData->menuWidth)
sPSSData->menuWidth = len;
2018-12-16 21:10:01 +01:00
2018-12-20 22:14:36 +01:00
sPSSData->menuItemsCount++;
2018-12-16 21:10:01 +01:00
}
}
2021-04-15 19:31:18 +02:00
static s8 GetMenuItemTextId(u8 menuIdx)
2018-12-16 21:10:01 +01:00
{
2021-04-15 19:31:18 +02:00
if (menuIdx >= sPSSData->menuItemsCount)
2018-12-16 21:10:01 +01:00
return -1;
else
2021-04-15 19:31:18 +02:00
return sPSSData->menuItems[menuIdx].textId;
2018-12-16 21:10:01 +01:00
}
static void AddMenu(void)
{
2018-12-20 22:14:36 +01:00
sPSSData->menuWindow.width = sPSSData->menuWidth + 2;
sPSSData->menuWindow.height = 2 * sPSSData->menuItemsCount;
sPSSData->menuWindow.tilemapLeft = 29 - sPSSData->menuWindow.width;
sPSSData->menuWindow.tilemapTop = 15 - sPSSData->menuWindow.height;
2021-04-15 19:31:18 +02:00
sPSSData->menuWindowId = AddWindow(&sPSSData->menuWindow);
ClearWindowTilemap(sPSSData->menuWindowId);
DrawStdFrameWithCustomTileAndPalette(sPSSData->menuWindowId, FALSE, 11, 14);
PrintMenuTable(sPSSData->menuWindowId, sPSSData->menuItemsCount, (void*)sPSSData->menuItems);
InitMenuInUpperLeftCornerPlaySoundWhenAPressed(sPSSData->menuWindowId, sPSSData->menuItemsCount, 0);
2020-05-14 10:37:09 +02:00
ScheduleBgCopyTilemapToVram(0);
2018-12-20 22:14:36 +01:00
sPSSData->field_CAE = 0;
2018-12-16 21:10:01 +01:00
}
2021-04-15 20:06:25 +02:00
// Called after AddMenu to determine whether or not the handler callback should
// wait to move on to the next state. Evidently there was no need to wait, and
// now it always returns FALSE
static bool8 IsMenuLoading(void)
2018-12-16 21:10:01 +01:00
{
2018-12-22 23:00:22 +01:00
return FALSE;
2018-12-16 21:10:01 +01:00
}
2021-04-15 19:31:18 +02:00
static s16 HandleMenuInput(void)
2018-12-16 21:10:01 +01:00
{
2021-04-15 19:31:18 +02:00
s32 input = MENU_NOTHING_CHOSEN;
2018-12-16 21:10:01 +01:00
do
2018-12-16 21:10:01 +01:00
{
if (JOY_NEW(A_BUTTON))
{
2021-04-15 19:31:18 +02:00
input = Menu_GetCursorPos();
break;
}
else if (JOY_NEW(B_BUTTON))
2018-12-16 21:10:01 +01:00
{
PlaySE(SE_SELECT);
2021-04-15 19:31:18 +02:00
input = MENU_B_PRESSED;
2018-12-16 21:10:01 +01:00
}
if (JOY_NEW(DPAD_UP))
2018-12-16 21:10:01 +01:00
{
PlaySE(SE_SELECT);
Menu_MoveCursor(-1);
}
else if (JOY_NEW(DPAD_DOWN))
2018-12-16 21:10:01 +01:00
{
PlaySE(SE_SELECT);
Menu_MoveCursor(1);
}
} while (0);
2018-12-16 21:10:01 +01:00
2021-04-15 19:31:18 +02:00
if (input != MENU_NOTHING_CHOSEN)
RemoveMenu();
2018-12-16 21:10:01 +01:00
2021-04-15 19:31:18 +02:00
if (input >= 0)
input = sPSSData->menuItems[input].textId;
2018-12-16 21:10:01 +01:00
2021-04-15 19:31:18 +02:00
return input;
2018-12-16 21:10:01 +01:00
}
2021-04-15 19:31:18 +02:00
static void RemoveMenu(void)
2018-12-16 21:10:01 +01:00
{
2021-04-15 19:31:18 +02:00
ClearStdWindowAndFrameToTransparent(sPSSData->menuWindowId, TRUE);
RemoveWindow(sPSSData->menuWindowId);
2018-12-16 21:10:01 +01:00
}
2018-12-17 23:00:08 +01:00
// The functions below handle moving and grabbing multiple mons at once.
// The icons are converted to background 0 which coordinates are changed while moving mons.
// There is also a bit of math involved in determining how many column/rows of mons to grab/move.
2018-12-19 22:47:27 +01:00
static const struct WindowTemplate gUnknown_0857BB1C =
2018-12-17 23:00:08 +01:00
{
.bg = 0,
.tilemapLeft = 10,
.tilemapTop = 3,
.width = 20,
.height = 18,
.paletteNum = 9,
.baseBlock = 0xA,
};
2018-12-20 22:14:36 +01:00
EWRAM_DATA static struct
{
u8 field_0;
u8 state;
u8 fromRow;
u8 fromColumn;
u8 toRow;
u8 toColumn;
u8 field_6;
u8 field_7;
u8 minRow;
u8 minColumn;
u8 rowsTotal;
u8 columsTotal;
u16 bgX;
u16 bgY;
u16 field_10;
struct BoxPokemon boxMons[IN_BOX_COUNT];
}
*sMoveMonsPtr = NULL;
2018-12-19 22:47:27 +01:00
static bool8 sub_80D0164(void)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
sMoveMonsPtr = Alloc(sizeof(*sMoveMonsPtr));
if (sMoveMonsPtr != NULL)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_2200 = AddWindow8Bit(&gUnknown_0857BB1C);
if (sPSSData->field_2200 != 0xFF)
2018-12-17 23:00:08 +01:00
{
FillWindowPixelBuffer(sPSSData->field_2200, PIXEL_FILL(0));
2018-12-17 23:00:08 +01:00
return TRUE;
}
}
return FALSE;
}
2018-12-19 22:47:27 +01:00
static void sub_80D01B8(void)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
if (sMoveMonsPtr != NULL)
Free(sMoveMonsPtr);
2018-12-17 23:00:08 +01:00
}
2018-12-19 22:47:27 +01:00
static void sub_80D01D0(u8 arg0)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->field_0 = arg0;
sMoveMonsPtr->state = 0;
2018-12-17 23:00:08 +01:00
}
2018-12-19 22:47:27 +01:00
static bool8 sub_80D01E4(void)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sMoveMonsPtr->field_0)
2018-12-17 23:00:08 +01:00
{
case 0:
return sub_80D024C();
case 1:
return sub_80D0344();
case 2:
return sub_80D03B0();
case 3:
return sub_80D0420();
case 4:
return sub_80D04A0();
case 5:
return sub_80D04C8();
}
return FALSE;
}
2018-12-19 22:47:27 +01:00
static bool8 sub_80D024C(void)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sMoveMonsPtr->state)
2018-12-17 23:00:08 +01:00
{
case 0:
HideBg(0);
sub_80D304C(0x80);
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->state++;
2018-12-17 23:00:08 +01:00
break;
case 1:
2018-12-20 22:14:36 +01:00
sub_80CFE14(&sMoveMonsPtr->fromRow, &sMoveMonsPtr->fromColumn);
sMoveMonsPtr->toRow = sMoveMonsPtr->fromRow;
sMoveMonsPtr->toColumn = sMoveMonsPtr->fromColumn;
2018-12-17 23:00:08 +01:00
ChangeBgX(0, -1024, 0);
ChangeBgY(0, -1024, 0);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
FillWindowPixelBuffer8Bit(sPSSData->field_2200, PIXEL_FILL(0));
2018-12-20 22:14:36 +01:00
sub_80D07B0(sMoveMonsPtr->fromRow, sMoveMonsPtr->fromColumn);
2018-12-26 13:05:02 +01:00
SetBgAttribute(0, BG_ATTR_PALETTEMODE, 1);
2018-12-20 22:14:36 +01:00
PutWindowTilemap(sPSSData->field_2200);
CopyWindowToVram8Bit(sPSSData->field_2200, 3);
2018-12-21 22:35:01 +01:00
BlendPalettes(0x3F00, 8, RGB_WHITE);
2018-12-17 23:00:08 +01:00
sub_80CFE54(2);
SetGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR);
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->state++;
2018-12-17 23:00:08 +01:00
break;
case 2:
if (!IsDma3ManagerBusyWithBgCopy())
{
ShowBg(0);
return FALSE;
}
break;
}
return TRUE;
}
2018-12-19 22:47:27 +01:00
static bool8 sub_80D0344(void)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sMoveMonsPtr->state)
2018-12-17 23:00:08 +01:00
{
case 0:
HideBg(0);
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->state++;
2018-12-17 23:00:08 +01:00
break;
case 1:
sub_80D0B5C();
sub_80CFE54(0);
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->state++;
2018-12-17 23:00:08 +01:00
break;
case 2:
if (!IsDma3ManagerBusyWithBgCopy())
{
sub_80CFE84();
2020-08-07 08:00:41 +02:00
LoadPalette(GetTextWindowPalette(3), 0xD0, 0x20);
2018-12-17 23:00:08 +01:00
ShowBg(0);
return FALSE;
}
break;
}
return TRUE;
}
2018-12-19 22:47:27 +01:00
static bool8 sub_80D03B0(void)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sMoveMonsPtr->state)
2018-12-17 23:00:08 +01:00
{
case 0:
if (!sub_80CD554())
{
2018-12-20 22:14:36 +01:00
sub_80CFE14(&sMoveMonsPtr->field_6, &sMoveMonsPtr->field_7);
2018-12-17 23:00:08 +01:00
sub_80D062C();
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->toRow = sMoveMonsPtr->field_6;
sMoveMonsPtr->toColumn = sMoveMonsPtr->field_7;
CopyWindowToVram8Bit(sPSSData->field_2200, 2);
sMoveMonsPtr->state++;
2018-12-17 23:00:08 +01:00
}
break;
case 1:
return IsDma3ManagerBusyWithBgCopy();
}
return TRUE;
}
2018-12-19 22:47:27 +01:00
static bool8 sub_80D0420(void)
2018-12-17 23:00:08 +01:00
{
u8 var1, var2;
2018-12-20 22:14:36 +01:00
switch (sMoveMonsPtr->state)
2018-12-17 23:00:08 +01:00
{
case 0:
sub_80D08CC();
sub_80D09A4();
sub_80CDC64(FALSE);
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->state++;
2018-12-17 23:00:08 +01:00
break;
case 1:
if (!DoMonPlaceChange())
{
sub_80CFE54(3);
sub_80D0884(0, 256, 8);
sub_80CDC64(TRUE);
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->state++;
2018-12-17 23:00:08 +01:00
}
break;
case 2:
var1 = sub_80D0894();
var2 = DoMonPlaceChange();
if (!var1 && !var2)
return FALSE;
break;
}
return TRUE;
}
2018-12-19 22:47:27 +01:00
static bool8 sub_80D04A0(void)
2018-12-17 23:00:08 +01:00
{
u8 var1 = sub_80CD554();
u8 var2 = sub_80D0894();
if (!var1 && !var2)
return FALSE;
else
return TRUE;
}
2018-12-19 22:47:27 +01:00
static bool8 sub_80D04C8(void)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
switch (sMoveMonsPtr->state)
2018-12-17 23:00:08 +01:00
{
case 0:
sub_80D0AAC();
sub_80D0884(0, -256, 8);
sub_80CDC64(FALSE);
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->state++;
2018-12-17 23:00:08 +01:00
break;
case 1:
if (!DoMonPlaceChange() && !sub_80D0894())
{
sub_80D0A1C();
sub_80CFE54(2);
sub_80CDC64(TRUE);
HideBg(0);
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->state++;
2018-12-17 23:00:08 +01:00
}
break;
case 2:
if (!DoMonPlaceChange())
{
sub_80CFE54(0);
sub_80D0B5C();
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->state++;
2018-12-17 23:00:08 +01:00
}
break;
case 3:
if (!IsDma3ManagerBusyWithBgCopy())
{
2020-08-07 08:00:41 +02:00
LoadPalette(GetTextWindowPalette(3), 0xD0, 0x20);
2018-12-17 23:00:08 +01:00
sub_80CFE84();
ShowBg(0);
return FALSE;
}
break;
}
return TRUE;
}
2018-12-19 22:47:27 +01:00
static bool8 sub_80D0580(u8 arg0)
2018-12-17 23:00:08 +01:00
{
switch (arg0)
{
case 0:
2018-12-20 22:14:36 +01:00
if (sMoveMonsPtr->minColumn == 0)
2018-12-17 23:00:08 +01:00
return FALSE;
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->minColumn--;
2018-12-17 23:00:08 +01:00
sub_80D0884(0, 1024, 6);
break;
case 1:
2018-12-20 22:14:36 +01:00
if (sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal >= 5)
2018-12-17 23:00:08 +01:00
return FALSE;
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->minColumn++;
2018-12-17 23:00:08 +01:00
sub_80D0884(0, -1024, 6);
break;
case 2:
2018-12-20 22:14:36 +01:00
if (sMoveMonsPtr->minRow == 0)
2018-12-17 23:00:08 +01:00
return FALSE;
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->minRow--;
2018-12-17 23:00:08 +01:00
sub_80D0884(1024, 0, 6);
break;
case 3:
2018-12-20 22:14:36 +01:00
if (sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal > 5)
2018-12-17 23:00:08 +01:00
return FALSE;
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->minRow++;
2018-12-17 23:00:08 +01:00
sub_80D0884(-1024, 0, 6);
break;
}
return TRUE;
}
2018-12-19 22:47:27 +01:00
static void sub_80D062C(void)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
s16 var = (abs(sMoveMonsPtr->fromRow - sMoveMonsPtr->field_6)) - (abs(sMoveMonsPtr->fromRow - sMoveMonsPtr->toRow));
s16 var2 = (abs(sMoveMonsPtr->fromColumn - sMoveMonsPtr->field_7)) - (abs(sMoveMonsPtr->fromColumn - sMoveMonsPtr->toColumn));
2018-12-17 23:00:08 +01:00
if (var > 0)
2018-12-20 22:14:36 +01:00
sub_80D06D0(sMoveMonsPtr->field_6, sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn);
2018-12-17 23:00:08 +01:00
if (var < 0)
{
2018-12-20 22:14:36 +01:00
sub_80D0740(sMoveMonsPtr->toRow, sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn);
sub_80D06D0(sMoveMonsPtr->field_6, sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn);
2018-12-17 23:00:08 +01:00
}
if (var2 > 0)
2018-12-20 22:14:36 +01:00
sub_80D0708(sMoveMonsPtr->field_7, sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow);
2018-12-17 23:00:08 +01:00
if (var2 < 0)
{
2018-12-20 22:14:36 +01:00
sub_80D0778(sMoveMonsPtr->toColumn, sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow);
sub_80D0708(sMoveMonsPtr->field_7, sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow);
2018-12-17 23:00:08 +01:00
}
}
2018-12-19 22:47:27 +01:00
static void sub_80D06D0(u8 arg0, u8 arg1, u8 arg2)
2018-12-17 23:00:08 +01:00
{
u8 var1 = arg1;
if (arg1 > arg2)
{
arg1 = arg2;
arg2 = var1;
}
while (arg1 <= arg2)
sub_80D07B0(arg0, arg1++);
}
2018-12-19 22:47:27 +01:00
static void sub_80D0708(u8 arg0, u8 arg1, u8 arg2)
2018-12-17 23:00:08 +01:00
{
u8 var1 = arg1;
if (arg1 > arg2)
{
arg1 = arg2;
arg2 = var1;
}
while (arg1 <= arg2)
sub_80D07B0(arg1++, arg0);
}
2018-12-19 22:47:27 +01:00
static void sub_80D0740(u8 arg0, u8 arg1, u8 arg2)
2018-12-17 23:00:08 +01:00
{
u8 var1 = arg1;
if (arg1 > arg2)
{
arg1 = arg2;
arg2 = var1;
}
while (arg1 <= arg2)
sub_80D0834(arg0, arg1++);
}
2018-12-19 22:47:27 +01:00
static void sub_80D0778(u8 arg0, u8 arg1, u8 arg2)
2018-12-17 23:00:08 +01:00
{
u8 var1 = arg1;
if (arg1 > arg2)
{
arg1 = arg2;
arg2 = var1;
}
while (arg1 <= arg2)
sub_80D0834(arg1++, arg0);
}
2018-12-19 22:47:27 +01:00
static void sub_80D07B0(u8 arg0, u8 arg1)
2018-12-17 23:00:08 +01:00
{
u8 position = arg0 + (6 * arg1);
u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES2);
u32 personality = GetCurrentBoxMonData(position, MON_DATA_PERSONALITY);
if (species != SPECIES_NONE)
{
const u8 *iconGfx = GetMonIconPtr(species, personality, 1);
u8 index = GetValidMonIconPalIndex(species) + 8;
2018-12-20 22:14:36 +01:00
BlitBitmapRectToWindow4BitTo8Bit(sPSSData->field_2200,
2018-12-17 23:00:08 +01:00
iconGfx,
0,
0,
32,
32,
24 * arg0,
24 * arg1,
32,
32,
index);
}
}
2018-12-19 22:47:27 +01:00
static void sub_80D0834(u8 arg0, u8 arg1)
2018-12-17 23:00:08 +01:00
{
u8 position = arg0 + (6 * arg1);
u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES2);
if (species != SPECIES_NONE)
{
2018-12-20 22:14:36 +01:00
FillWindowPixelRect8Bit(sPSSData->field_2200,
PIXEL_FILL(0),
2018-12-17 23:00:08 +01:00
24 * arg0,
24 * arg1,
32,
32);
}
}
2018-12-19 22:47:27 +01:00
static void sub_80D0884(u16 arg0, u16 arg1, u16 arg2)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->bgX = arg0;
sMoveMonsPtr->bgY = arg1;
sMoveMonsPtr->field_10 = arg2;
2018-12-17 23:00:08 +01:00
}
2018-12-19 22:47:27 +01:00
static u8 sub_80D0894(void)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
if (sMoveMonsPtr->field_10 != 0)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
ChangeBgX(0, sMoveMonsPtr->bgX, 1);
ChangeBgY(0, sMoveMonsPtr->bgY, 1);
sMoveMonsPtr->field_10--;
2018-12-17 23:00:08 +01:00
}
2018-12-20 22:14:36 +01:00
return sMoveMonsPtr->field_10;
2018-12-17 23:00:08 +01:00
}
2018-12-19 22:47:27 +01:00
static void sub_80D08CC(void)
2018-12-17 23:00:08 +01:00
{
s32 i, j;
2018-12-17 23:00:08 +01:00
s32 rowCount, columnCount;
u8 boxId;
u8 monArrayId;
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->minRow = min(sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow);
sMoveMonsPtr->minColumn = min(sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn);
sMoveMonsPtr->rowsTotal = abs(sMoveMonsPtr->fromRow - sMoveMonsPtr->toRow) + 1;
sMoveMonsPtr->columsTotal = abs(sMoveMonsPtr->fromColumn - sMoveMonsPtr->toColumn) + 1;
2018-12-17 23:00:08 +01:00
boxId = StorageGetCurrentBox();
monArrayId = 0;
2018-12-20 22:14:36 +01:00
rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal;
columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal;
for (i = sMoveMonsPtr->minColumn; i < columnCount; i++)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow;
for (j = sMoveMonsPtr->minRow; j < rowCount; j++)
2018-12-17 23:00:08 +01:00
{
struct BoxPokemon *boxMon = GetBoxedMonPtr(boxId, boxPosition);
// UB: possible null dereference
#ifdef UBFIX
if (boxMon != NULL)
sMoveMonsPtr->boxMons[monArrayId] = *boxMon;
#else
2018-12-20 22:14:36 +01:00
sMoveMonsPtr->boxMons[monArrayId] = *boxMon;
#endif
2018-12-17 23:00:08 +01:00
monArrayId++;
boxPosition++;
}
}
}
2018-12-19 22:47:27 +01:00
static void sub_80D09A4(void)
2018-12-17 23:00:08 +01:00
{
s32 i, j;
2018-12-20 22:14:36 +01:00
s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal;
s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal;
2018-12-17 23:00:08 +01:00
u8 boxId = StorageGetCurrentBox();
2018-12-20 22:14:36 +01:00
for (i = sMoveMonsPtr->minColumn; i < columnCount; i++)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow;
for (j = sMoveMonsPtr->minRow; j < rowCount; j++)
2018-12-17 23:00:08 +01:00
{
DestroyBoxMonIconAtPosition(boxPosition);
ZeroBoxMonAt(boxId, boxPosition);
boxPosition++;
}
}
}
2018-12-19 22:47:27 +01:00
static void sub_80D0A1C(void)
2018-12-17 23:00:08 +01:00
{
s32 i, j;
2018-12-20 22:14:36 +01:00
s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal;
s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal;
2018-12-17 23:00:08 +01:00
u8 monArrayId = 0;
2018-12-20 22:14:36 +01:00
for (i = sMoveMonsPtr->minColumn; i < columnCount; i++)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow;
for (j = sMoveMonsPtr->minRow; j < rowCount; j++)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
if (GetBoxMonData(&sMoveMonsPtr->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES))
2018-12-17 23:00:08 +01:00
sub_80CB140(boxPosition);
monArrayId++;
boxPosition++;
}
}
}
2018-12-19 22:47:27 +01:00
static void sub_80D0AAC(void)
2018-12-17 23:00:08 +01:00
{
s32 i, j;
2018-12-20 22:14:36 +01:00
s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal;
s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal;
2018-12-17 23:00:08 +01:00
u8 boxId = StorageGetCurrentBox();
u8 monArrayId = 0;
2018-12-20 22:14:36 +01:00
for (i = sMoveMonsPtr->minColumn; i < columnCount; i++)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow;
for (j = sMoveMonsPtr->minRow; j < rowCount; j++)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
if (GetBoxMonData(&sMoveMonsPtr->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES))
SetBoxMonAt(boxId, boxPosition, &sMoveMonsPtr->boxMons[monArrayId]);
2018-12-17 23:00:08 +01:00
boxPosition++;
monArrayId++;
}
}
}
2018-12-19 22:47:27 +01:00
static void sub_80D0B5C(void)
2018-12-17 23:00:08 +01:00
{
ChangeBgX(0, 0, 0);
ChangeBgY(0, 0, 0);
2018-12-26 13:05:02 +01:00
SetBgAttribute(0, BG_ATTR_PALETTEMODE, 0);
2018-12-17 23:00:08 +01:00
ClearGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);
CopyBgTilemapBufferToVram(0);
}
2018-12-19 22:47:27 +01:00
static u8 sub_80D0BA4(void)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
return (IN_BOX_ROWS * sMoveMonsPtr->fromColumn) + sMoveMonsPtr->fromRow;
2018-12-17 23:00:08 +01:00
}
2018-12-19 22:47:27 +01:00
static bool8 sub_80D0BC0(void)
2018-12-17 23:00:08 +01:00
{
s32 i, j;
2018-12-20 22:14:36 +01:00
s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal;
s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal;
2018-12-17 23:00:08 +01:00
u8 monArrayId = 0;
2018-12-20 22:14:36 +01:00
for (i = sMoveMonsPtr->minColumn; i < columnCount; i++)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow;
for (j = sMoveMonsPtr->minRow; j < rowCount; j++)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
if (GetBoxMonData(&sMoveMonsPtr->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)
2018-12-17 23:00:08 +01:00
&& GetCurrentBoxMonData(boxPosition, MON_DATA_SANITY_HAS_SPECIES))
return FALSE;
monArrayId++;
boxPosition++;
}
}
return TRUE;
}
2018-12-19 22:47:27 +01:00
static const u32 gUnknown_0857BB24[] = INCBIN_U32("graphics/pokemon_storage/unknown_frame.4bpp");
2018-12-17 23:00:08 +01:00
static const struct OamData sOamData_857BBA4 =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_NORMAL,
.objMode = ST_OAM_OBJ_NORMAL,
2018-12-17 23:00:08 +01:00
.mosaic = 0,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(32x32),
2018-12-17 23:00:08 +01:00
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(32x32),
2018-12-17 23:00:08 +01:00
.tileNum = 0,
.priority = 1,
.paletteNum = 0,
.affineParam = 0
};
static const union AffineAnimCmd sSpriteAffineAnim_857BBAC[] =
{
AFFINEANIMCMD_FRAME(128, 128, 0, 0),
AFFINEANIMCMD_END
};
static const union AffineAnimCmd sSpriteAffineAnim_857BBBC[] =
{
AFFINEANIMCMD_FRAME(88, 88, 0, 0),
AFFINEANIMCMD_FRAME(5, 5, 0, 8),
AFFINEANIMCMD_END
};
static const union AffineAnimCmd sSpriteAffineAnim_857BBD4[] =
{
AFFINEANIMCMD_FRAME(128, 128, 0, 0),
AFFINEANIMCMD_FRAME(-5, -5, 0, 8),
AFFINEANIMCMD_END
};
static const union AffineAnimCmd sSpriteAffineAnim_857BBEC[] =
{
AFFINEANIMCMD_FRAME(128, 128, 0, 0),
AFFINEANIMCMD_FRAME(10, 10, 0, 12),
AFFINEANIMCMD_FRAME(256, 256, 0, 0),
AFFINEANIMCMD_END
};
static const union AffineAnimCmd sSpriteAffineAnim_857BC0C[] =
{
AFFINEANIMCMD_FRAME(256, 256, 0, 0),
AFFINEANIMCMD_FRAME(-10, -10, 0, 12),
AFFINEANIMCMD_FRAME(128, 128, 0, 0),
AFFINEANIMCMD_END
};
static const union AffineAnimCmd sSpriteAffineAnim_857BC2C[] =
{
AFFINEANIMCMD_FRAME(256, 256, 0, 0),
AFFINEANIMCMD_FRAME(-5, -5, 0, 16),
AFFINEANIMCMD_END
};
static const union AffineAnimCmd sSpriteAffineAnim_857BC44[] =
{
AFFINEANIMCMD_FRAME(256, 256, 0, 0),
AFFINEANIMCMD_END
};
static const union AffineAnimCmd *const sSpriteAffineAnimTable_857BC44[] =
{
sSpriteAffineAnim_857BBAC,
sSpriteAffineAnim_857BBBC,
sSpriteAffineAnim_857BBD4,
sSpriteAffineAnim_857BBEC,
sSpriteAffineAnim_857BC0C,
sSpriteAffineAnim_857BC2C,
sSpriteAffineAnim_857BC44
};
2018-12-19 22:47:27 +01:00
static const struct SpriteTemplate gSpriteTemplate_857BC70 =
2018-12-17 23:00:08 +01:00
{
2018-12-21 22:35:01 +01:00
.tileTag = TAG_TILE_7,
.paletteTag = TAG_PAL_DACB,
2018-12-17 23:00:08 +01:00
.oam = &sOamData_857BBA4,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = sSpriteAffineAnimTable_857BC44,
.callback = SpriteCallbackDummy,
};
2018-12-19 22:47:27 +01:00
static void sub_80D0C60(void)
2018-12-17 23:00:08 +01:00
{
s32 i;
u8 spriteId;
struct CompressedSpriteSheet spriteSheet;
struct SpriteTemplate spriteTemplate;
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
2018-12-17 23:00:08 +01:00
{
spriteSheet.data = gUnknown_03000F78;
spriteSheet.size = 0x200;
spriteTemplate = gSpriteTemplate_857BC70;
for (i = 0; i < 3; i++)
{
2018-12-21 22:35:01 +01:00
spriteSheet.tag = TAG_TILE_7 + i;
2018-12-17 23:00:08 +01:00
LoadCompressedSpriteSheet(&spriteSheet);
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[i].tiles = GetSpriteTileStartByTag(spriteSheet.tag) * 32 + (void*)(OBJ_VRAM0);
2018-12-21 22:35:01 +01:00
sPSSData->field_2204[i].palIndex = AllocSpritePalette(TAG_PAL_DACB + i);
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[i].palIndex *= 16;
sPSSData->field_2204[i].palIndex += 0x100;
2018-12-21 22:35:01 +01:00
spriteTemplate.tileTag = TAG_TILE_7 + i;
spriteTemplate.paletteTag = TAG_PAL_DACB + i;
2018-12-17 23:00:08 +01:00
spriteId = CreateSprite(&spriteTemplate, 0, 0, 11);
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[i].sprite = &gSprites[spriteId];
sPSSData->field_2204[i].sprite->invisible = TRUE;
sPSSData->field_2204[i].unk10 = 0;
2018-12-17 23:00:08 +01:00
}
}
2018-12-20 22:14:36 +01:00
sPSSData->movingItem = 0;
2018-12-17 23:00:08 +01:00
}
// The functions below handle new features of MOVE_ITEMS box option.
2018-12-19 22:47:27 +01:00
static bool32 sub_80D1324(u8 cursorArea, u8 cursorPos);
static const u32 *GetItemIconPic(u16 itemId);
static const u32 *GetItemIconPalette(u16 itemId);
static u8 sub_80D12E8(void);
static void sub_80D140C(u8 id, u8 cursorArea, u8 cursorPos);
static void sub_80D1524(u8 id, const u32 *itemTiles, const u32 *itemPal);
static void sub_80D15D4(u8 id, u8 animNum);
static void sub_80D1740(u8 id, bool8 arg1);
static u8 sub_80D1370(u8 cursorArea, u8 cursorPos);
static void sub_80D1604(u8 id, u8 arg1, u8 arg2, u8 arg3);
static void sub_80D1AD8(struct Sprite *sprite);
static void sub_80D1A48(struct Sprite *sprite);
static void sub_80D1A74(struct Sprite *sprite);
static void sub_80D1B14(struct Sprite *sprite);
static void sub_80D1B94(struct Sprite *sprite);
static void sub_80D1CCC(struct Sprite *sprite);
static void sub_80D1C30(struct Sprite *sprite);
static void sub_80D0D8C(u8 cursorArea, u8 cursorPos)
2018-12-17 23:00:08 +01:00
{
u16 heldItem;
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-17 23:00:08 +01:00
return;
if (sub_80D1324(cursorArea, cursorPos))
return;
switch (cursorArea)
{
case CURSOR_AREA_IN_BOX:
if (!GetCurrentBoxMonData(cursorPos, MON_DATA_SANITY_HAS_SPECIES))
return;
heldItem = GetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM);
break;
case CURSOR_AREA_IN_PARTY:
if (cursorPos >= PARTY_SIZE || !GetMonData(&gPlayerParty[cursorPos], MON_DATA_SANITY_HAS_SPECIES))
return;
heldItem = GetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM);
break;
default:
return;
}
if (heldItem != 0)
{
const u32 *tiles = GetItemIconPic(heldItem);
2018-12-19 22:47:27 +01:00
const u32 *pal = GetItemIconPalette(heldItem);
2018-12-17 23:00:08 +01:00
u8 id = sub_80D12E8();
sub_80D140C(id, cursorArea, cursorPos);
sub_80D1524(id, tiles, pal);
sub_80D15D4(id, 1);
sub_80D1740(id, TRUE);
}
}
2018-12-19 22:47:27 +01:00
static void sub_80D0E50(u8 cursorArea, u8 cursorPos)
2018-12-17 23:00:08 +01:00
{
u8 id;
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-17 23:00:08 +01:00
return;
id = sub_80D1370(cursorArea, cursorPos);
sub_80D15D4(id, 2);
sub_80D1604(id, 0, cursorArea, cursorPos);
}
static void Item_FromMonToMoving(u8 cursorArea, u8 cursorPos)
{
u8 id;
u16 item;
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-17 23:00:08 +01:00
return;
id = sub_80D1370(cursorArea, cursorPos);
item = 0;
sub_80D15D4(id, 3);
sub_80D1604(id, 1, cursorArea, cursorPos);
sub_80D140C(id, 2, 0);
if (cursorArea == CURSOR_AREA_IN_BOX)
{
SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &item);
SetBoxMonIconObjMode(cursorPos, 1);
}
else
{
SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &item);
SetPartyMonIconObjMode(cursorPos, 1);
}
2018-12-20 22:14:36 +01:00
sPSSData->movingItem = sPSSData->cursorMonItem;
2018-12-17 23:00:08 +01:00
}
2018-12-19 22:47:27 +01:00
static void sub_80D0F38(u16 item)
2018-12-17 23:00:08 +01:00
{
const u32 *tiles = GetItemIconPic(item);
2018-12-19 22:47:27 +01:00
const u32 *pal = GetItemIconPalette(item);
2018-12-17 23:00:08 +01:00
u8 id = sub_80D12E8();
sub_80D1524(id, tiles, pal);
sub_80D15D4(id, 6);
sub_80D1604(id, 1, 0, 0);
sub_80D140C(id, 2, 0);
sub_80D1740(id, TRUE);
2018-12-20 22:14:36 +01:00
sPSSData->movingItem = item;
2018-12-17 23:00:08 +01:00
}
static void Item_SwitchMonsWithMoving(u8 cursorArea, u8 cursorPos)
{
u8 id;
u16 item;
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-17 23:00:08 +01:00
return;
id = sub_80D1370(cursorArea, cursorPos);
sub_80D15D4(id, 3);
sub_80D1604(id, 3, 2, 0);
if (cursorArea == CURSOR_AREA_IN_BOX)
{
item = GetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM);
2018-12-20 22:14:36 +01:00
SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &sPSSData->movingItem);
sPSSData->movingItem = item;
2018-12-17 23:00:08 +01:00
}
else
{
item = GetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM);
2018-12-20 22:14:36 +01:00
SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &sPSSData->movingItem);
sPSSData->movingItem = item;
2018-12-17 23:00:08 +01:00
}
id = sub_80D1370(2, 0);
sub_80D15D4(id, 4);
sub_80D1604(id, 4, cursorArea, cursorPos);
}
static void Item_GiveMovingToMon(u8 cursorArea, u8 cursorPos)
{
u8 id;
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-17 23:00:08 +01:00
return;
id = sub_80D1370(2, 0);
sub_80D15D4(id, 4);
sub_80D1604(id, 2, cursorArea, cursorPos);
if (cursorArea == CURSOR_AREA_IN_BOX)
{
2018-12-20 22:14:36 +01:00
SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &sPSSData->movingItem);
2018-12-17 23:00:08 +01:00
SetBoxMonIconObjMode(cursorPos, 0);
}
else
{
2018-12-20 22:14:36 +01:00
SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &sPSSData->movingItem);
2018-12-17 23:00:08 +01:00
SetPartyMonIconObjMode(cursorPos, 0);
}
}
static void Item_TakeMons(u8 cursorArea, u8 cursorPos)
{
u8 id;
u16 item;
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-17 23:00:08 +01:00
return;
item = 0;
id = sub_80D1370(cursorArea, cursorPos);
sub_80D15D4(id, 2);
sub_80D1604(id, 0, cursorArea, cursorPos);
if (cursorArea == CURSOR_AREA_IN_BOX)
{
SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &item);
SetBoxMonIconObjMode(cursorPos, 1);
}
else
{
SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &item);
SetPartyMonIconObjMode(cursorPos, 1);
}
}
2018-12-19 22:47:27 +01:00
static void sub_80D1194(void)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
2018-12-17 23:00:08 +01:00
{
u8 id = sub_80D1370(2, 0);
sub_80D15D4(id, 5);
sub_80D1604(id, 0, 2, 0);
}
}
2018-12-19 22:47:27 +01:00
static void sub_80D11CC(void)
2018-12-17 23:00:08 +01:00
{
s32 i;
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
2018-12-17 23:00:08 +01:00
return;
for (i = 0; i < 3; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2204[i].unk10 && sPSSData->field_2204[i].unk8 == 1)
2018-12-17 23:00:08 +01:00
sub_80D1604(i, 7, 2, 0);
}
}
2018-12-19 22:47:27 +01:00
static bool8 sub_80D1218(void)
2018-12-17 23:00:08 +01:00
{
s32 i;
for (i = 0; i < 3; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2204[i].unk10)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
if (!sPSSData->field_2204[i].sprite->affineAnimEnded && sPSSData->field_2204[i].sprite->affineAnimBeginning)
2018-12-17 23:00:08 +01:00
return TRUE;
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2204[i].sprite->callback != SpriteCallbackDummy && sPSSData->field_2204[i].sprite->callback != sub_80D1AD8)
2018-12-17 23:00:08 +01:00
return TRUE;
}
}
return FALSE;
}
2018-12-19 22:47:27 +01:00
static bool8 IsActiveItemMoving(void)
2018-12-17 23:00:08 +01:00
{
s32 i;
2018-12-20 22:14:36 +01:00
if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
2018-12-17 23:00:08 +01:00
{
for (i = 0; i < 3; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2204[i].unk10 && sPSSData->field_2204[i].unk8 == 2)
2018-12-17 23:00:08 +01:00
return TRUE;
}
}
return FALSE;
}
2018-12-19 22:47:27 +01:00
static const u8 *GetMovingItemName(void)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
return ItemId_GetName(sPSSData->movingItem);
2018-12-17 23:00:08 +01:00
}
2018-12-19 22:47:27 +01:00
static u16 GetMovingItem(void)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
return sPSSData->movingItem;
2018-12-17 23:00:08 +01:00
}
2018-12-19 22:47:27 +01:00
static u8 sub_80D12E8(void)
2018-12-17 23:00:08 +01:00
{
u8 i;
for (i = 0; i < 3; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2204[i].unk10 == 0)
2018-12-17 23:00:08 +01:00
{
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[i].unk10 = 1;
2018-12-17 23:00:08 +01:00
return i;
}
}
return 3;
}
2018-12-19 22:47:27 +01:00
static bool32 sub_80D1324(u8 cursorArea, u8 cursorPos)
2018-12-17 23:00:08 +01:00
{
s32 i;
for (i = 0; i < 3; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2204[i].unk10
&& sPSSData->field_2204[i].unk8 == cursorArea
&& sPSSData->field_2204[i].unk9 == cursorPos)
2018-12-17 23:00:08 +01:00
return TRUE;
}
return FALSE;
}
2018-12-19 22:47:27 +01:00
static u8 sub_80D1370(u8 cursorArea, u8 cursorPos)
2018-12-17 23:00:08 +01:00
{
u8 i;
for (i = 0; i < 3; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2204[i].unk10
&& sPSSData->field_2204[i].unk8 == cursorArea
&& sPSSData->field_2204[i].unk9 == cursorPos)
2018-12-17 23:00:08 +01:00
return i;
}
return 3;
}
2018-12-19 22:47:27 +01:00
static u8 sub_80D13C4(struct Sprite *sprite)
2018-12-17 23:00:08 +01:00
{
u8 i;
for (i = 0; i < 3; i++)
{
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2204[i].unk10
&& sPSSData->field_2204[i].sprite == sprite)
2018-12-17 23:00:08 +01:00
return i;
}
return 3;
}
2018-12-19 22:47:27 +01:00
static void sub_80D140C(u8 id, u8 cursorArea, u8 cursorPos)
{
u8 row, column;
if (id >= 3)
return;
switch (cursorArea)
{
case CURSOR_AREA_IN_BOX:
row = cursorPos % IN_BOX_ROWS;
column = cursorPos / IN_BOX_ROWS;
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[id].sprite->pos1.x = (24 * row) + 112;
sPSSData->field_2204[id].sprite->pos1.y = (24 * column) + 56;
sPSSData->field_2204[id].sprite->oam.priority = 2;
2018-12-19 22:47:27 +01:00
break;
case CURSOR_AREA_IN_PARTY:
if (cursorPos == 0)
{
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[id].sprite->pos1.x = 116;
sPSSData->field_2204[id].sprite->pos1.y = 76;
2018-12-19 22:47:27 +01:00
}
else
{
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[id].sprite->pos1.x = 164;
sPSSData->field_2204[id].sprite->pos1.y = 24 * (cursorPos - 1) + 28;
2018-12-19 22:47:27 +01:00
}
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[id].sprite->oam.priority = 1;
2018-12-19 22:47:27 +01:00
break;
}
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[id].unk8 = cursorArea;
sPSSData->field_2204[id].unk9 = cursorPos;
2018-12-19 22:47:27 +01:00
}
static void sub_80D1524(u8 id, const u32 *itemTiles, const u32 *itemPal)
{
s32 i;
if (id >= 3)
return;
2018-12-20 22:14:36 +01:00
CpuFastFill(0, sPSSData->field_42C4, 0x200);
LZ77UnCompWram(itemTiles, sPSSData->field_22C4);
2018-12-19 22:47:27 +01:00
for (i = 0; i < 3; i++)
2018-12-20 22:14:36 +01:00
CpuFastCopy(sPSSData->field_22C4 + (i * 0x60), sPSSData->field_42C4 + (i * 0x80), 0x60);
2018-12-19 22:47:27 +01:00
2018-12-20 22:14:36 +01:00
CpuFastCopy(sPSSData->field_42C4, sPSSData->field_2204[id].tiles, 0x200);
LZ77UnCompWram(itemPal, sPSSData->field_42C4);
LoadPalette(sPSSData->field_42C4, sPSSData->field_2204[id].palIndex, 0x20);
2018-12-19 22:47:27 +01:00
}
static void sub_80D15D4(u8 id, u8 animNum)
{
if (id >= 3)
return;
2018-12-20 22:14:36 +01:00
StartSpriteAffineAnim(sPSSData->field_2204[id].sprite, animNum);
2018-12-19 22:47:27 +01:00
}
static void sub_80D1604(u8 id, u8 arg1, u8 arg2, u8 arg3)
{
if (id >= 3)
return;
switch (arg1)
{
case 0:
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[id].sprite->data[0] = id;
sPSSData->field_2204[id].sprite->callback = sub_80D1A48;
2018-12-19 22:47:27 +01:00
break;
case 1:
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[id].sprite->data[0] = 0;
sPSSData->field_2204[id].sprite->callback = sub_80D1A74;
2018-12-19 22:47:27 +01:00
break;
case 2:
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[id].sprite->data[0] = 0;
sPSSData->field_2204[id].sprite->data[6] = arg2;
sPSSData->field_2204[id].sprite->data[7] = arg3;
sPSSData->field_2204[id].sprite->callback = sub_80D1B14;
2018-12-19 22:47:27 +01:00
break;
case 3:
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[id].sprite->data[0] = 0;
sPSSData->field_2204[id].sprite->callback = sub_80D1B94;
sPSSData->field_2204[id].sprite->data[6] = arg2;
sPSSData->field_2204[id].sprite->data[7] = arg3;
2018-12-19 22:47:27 +01:00
break;
case 4:
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[id].sprite->data[0] = 0;
sPSSData->field_2204[id].sprite->data[6] = arg2;
sPSSData->field_2204[id].sprite->data[7] = arg3;
sPSSData->field_2204[id].sprite->callback = sub_80D1C30;
2018-12-19 22:47:27 +01:00
break;
case 7:
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[id].sprite->callback = sub_80D1CCC;
2018-12-19 22:47:27 +01:00
break;
}
}
static void sub_80D1740(u8 id, bool8 arg1)
{
if (id >= 3)
return;
2018-12-20 22:14:36 +01:00
sPSSData->field_2204[id].unk10 = arg1;
sPSSData->field_2204[id].sprite->invisible = (arg1 == FALSE);
2018-12-19 22:47:27 +01:00
}
static const u32 *GetItemIconPic(u16 itemId)
{
return GetItemIconPicOrPalette(itemId, 0);
}
static const u32 *GetItemIconPalette(u16 itemId)
{
return GetItemIconPicOrPalette(itemId, 1);
}
static void PrintItemDescription(void)
{
const u8 *description;
if (IsActiveItemMoving())
2018-12-20 22:14:36 +01:00
description = ItemId_GetDescription(sPSSData->movingItem);
2018-12-19 22:47:27 +01:00
else
2018-12-20 22:14:36 +01:00
description = ItemId_GetDescription(sPSSData->cursorMonItem);
2018-12-19 22:47:27 +01:00
FillWindowPixelBuffer(2, PIXEL_FILL(1));
2018-12-19 22:47:27 +01:00
AddTextPrinterParameterized5(2, 1, description, 4, 0, 0, NULL, 0, 1);
}
static void sub_80D1818(void)
{
2018-12-20 22:14:36 +01:00
sPSSData->field_2236 = 0x15;
2018-12-19 22:47:27 +01:00
LoadBgTiles(0, gUnknown_0857BB24, 0x80, 0x13A);
sub_80D19B4(0);
}
static bool8 sub_80D184C(void)
{
s32 i, var;
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2236 == 0)
2018-12-19 22:47:27 +01:00
return FALSE;
2018-12-20 22:14:36 +01:00
sPSSData->field_2236--;
var = 0x15 - sPSSData->field_2236;
2018-12-19 22:47:27 +01:00
for (i = 0; i < var; i++)
{
2018-12-26 13:05:02 +01:00
WriteSequenceToBgTilemapBuffer(0, GetBgAttribute(0, BG_ATTR_BASETILE) + 0x14 + sPSSData->field_2236 + i, i, 13, 1, 7, 15, 21);
2018-12-19 22:47:27 +01:00
}
sub_80D19B4(var);
2018-12-20 22:14:36 +01:00
return (sPSSData->field_2236 != 0);
2018-12-19 22:47:27 +01:00
}
static bool8 sub_80D18E4(void)
{
s32 i, var;
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2236 == 0x16)
2018-12-19 22:47:27 +01:00
return FALSE;
2018-12-20 22:14:36 +01:00
if (sPSSData->field_2236 == 0)
2018-12-19 22:47:27 +01:00
FillBgTilemapBufferRect(0, 0, 21, 12, 1, 9, 17);
2018-12-20 22:14:36 +01:00
sPSSData->field_2236++;
var = 0x15 - sPSSData->field_2236;
2018-12-19 22:47:27 +01:00
for (i = 0; i < var; i++)
{
2018-12-26 13:05:02 +01:00
WriteSequenceToBgTilemapBuffer(0, GetBgAttribute(0, BG_ATTR_BASETILE) + 0x14 + sPSSData->field_2236 + i, i, 13, 1, 7, 15, 21);
2018-12-19 22:47:27 +01:00
}
if (var >= 0)
sub_80D19B4(var);
FillBgTilemapBufferRect(0, 0, var + 1, 12, 1, 9, 0x11);
2020-05-14 10:37:09 +02:00
ScheduleBgCopyTilemapToVram(0);
2018-12-19 22:47:27 +01:00
return TRUE;
}
static void sub_80D19B4(u32 arg0)
{
if (arg0 != 0)
{
FillBgTilemapBufferRect(0, 0x13A, 0, 0xC, arg0, 1, 0xFu);
FillBgTilemapBufferRect(0, 0x93A, 0, 0x14, arg0, 1, 0xFu);
}
FillBgTilemapBufferRect(0, 0x13B, arg0, 0xD, 1, 7, 0xFu);
FillBgTilemapBufferRect(0, 0x13C, arg0, 0xC, 1, 1, 0xFu);
FillBgTilemapBufferRect(0, 0x13D, arg0, 0x14, 1, 1, 0xFu);
2020-05-14 10:37:09 +02:00
ScheduleBgCopyTilemapToVram(0);
2018-12-19 22:47:27 +01:00
}
static void sub_80D1A48(struct Sprite *sprite)
{
if (sprite->affineAnimEnded)
{
sub_80D1740(sprite->data[0], FALSE);
sprite->callback = SpriteCallbackDummy;
}
}
static void sub_80D1A74(struct Sprite *sprite)
{
switch (sprite->data[0])
{
case 0:
sprite->data[1] = sprite->pos1.x << 4;
sprite->data[2] = sprite->pos1.y << 4;
sprite->data[3] = 10;
sprite->data[4] = 21;
sprite->data[5] = 0;
sprite->data[0]++;
case 1:
sprite->data[1] -= sprite->data[3];
sprite->data[2] -= sprite->data[4];
sprite->pos1.x = sprite->data[1] >> 4;
sprite->pos1.y = sprite->data[2] >> 4;
if (++sprite->data[5] > 11)
sprite->callback = sub_80D1AD8;
break;
}
}
static void sub_80D1AD8(struct Sprite *sprite)
{
2018-12-20 22:14:36 +01:00
sprite->pos1.x = sPSSData->field_CB4->pos1.x + 4;
sprite->pos1.y = sPSSData->field_CB4->pos1.y + sPSSData->field_CB4->pos2.y + 8;
sprite->oam.priority = sPSSData->field_CB4->oam.priority;
2018-12-19 22:47:27 +01:00
}
static void sub_80D1B14(struct Sprite *sprite)
{
switch (sprite->data[0])
{
case 0:
sprite->data[1] = sprite->pos1.x << 4;
sprite->data[2] = sprite->pos1.y << 4;
sprite->data[3] = 10;
sprite->data[4] = 21;
sprite->data[5] = 0;
sprite->data[0]++;
case 1:
sprite->data[1] += sprite->data[3];
sprite->data[2] += sprite->data[4];
sprite->pos1.x = sprite->data[1] >> 4;
sprite->pos1.y = sprite->data[2] >> 4;
if (++sprite->data[5] > 11)
{
sub_80D140C(sub_80D13C4(sprite), sprite->data[6], sprite->data[7]);
sprite->callback = SpriteCallbackDummy;
}
break;
}
}
static void sub_80D1B94(struct Sprite *sprite)
{
switch (sprite->data[0])
{
case 0:
sprite->data[1] = sprite->pos1.x << 4;
sprite->data[2] = sprite->pos1.y << 4;
sprite->data[3] = 10;
sprite->data[4] = 21;
sprite->data[5] = 0;
sprite->data[0]++;
case 1:
sprite->data[1] -= sprite->data[3];
sprite->data[2] -= sprite->data[4];
sprite->pos1.x = sprite->data[1] >> 4;
sprite->pos1.y = sprite->data[2] >> 4;
sprite->pos2.x = gSineTable[sprite->data[5] * 8] >> 4;
if (++sprite->data[5] > 11)
{
sub_80D140C(sub_80D13C4(sprite), sprite->data[6], sprite->data[7]);
sprite->pos2.x = 0;
sprite->callback = sub_80D1AD8;
}
break;
}
}
static void sub_80D1C30(struct Sprite *sprite)
{
switch (sprite->data[0])
{
case 0:
sprite->data[1] = sprite->pos1.x << 4;
sprite->data[2] = sprite->pos1.y << 4;
sprite->data[3] = 10;
sprite->data[4] = 21;
sprite->data[5] = 0;
sprite->data[0]++;
case 1:
sprite->data[1] += sprite->data[3];
sprite->data[2] += sprite->data[4];
sprite->pos1.x = sprite->data[1] >> 4;
sprite->pos1.y = sprite->data[2] >> 4;
sprite->pos2.x = -(gSineTable[sprite->data[5] * 8] >> 4);
if (++sprite->data[5] > 11)
{
sub_80D140C(sub_80D13C4(sprite), sprite->data[6], sprite->data[7]);
sprite->callback = SpriteCallbackDummy;
sprite->pos2.x = 0;
}
break;
}
}
static void sub_80D1CCC(struct Sprite *sprite)
{
sprite->pos1.y -= 8;
if (sprite->pos1.y + sprite->pos2.y < -16)
{
sprite->callback = SpriteCallbackDummy;
sub_80D1740(sub_80D13C4(sprite), FALSE);
}
}
void nullsub_pss(void)
{
}
void nullsub_98(void)
{
}
// Functions here are general utility functions.
u8 StorageGetCurrentBox(void)
{
return gPokemonStoragePtr->currentBox;
}
static void SetCurrentBox(u8 boxId)
{
if (boxId < TOTAL_BOXES_COUNT)
gPokemonStoragePtr->currentBox = boxId;
}
u32 GetBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request)
{
if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
return GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], request);
else
return 0;
}
void SetBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request, const void *value)
{
if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
SetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], request, value);
}
u32 GetCurrentBoxMonData(u8 boxPosition, s32 request)
{
return GetBoxMonDataAt(gPokemonStoragePtr->currentBox, boxPosition, request);
}
void SetCurrentBoxMonData(u8 boxPosition, s32 request, const void *value)
{
SetBoxMonDataAt(gPokemonStoragePtr->currentBox, boxPosition, request, value);
}
void GetBoxMonNickAt(u8 boxId, u8 boxPosition, u8 *dst)
{
if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_NICKNAME, dst);
else
*dst = EOS;
}
u32 GetBoxMonLevelAt(u8 boxId, u8 boxPosition)
{
u32 lvl;
if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT && GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_HAS_SPECIES))
lvl = GetLevelFromBoxMonExp(&gPokemonStoragePtr->boxes[boxId][boxPosition]);
2020-12-13 05:28:01 +01:00
#ifdef BUGFIX
else
#endif
2018-12-19 22:47:27 +01:00
lvl = 0;
return lvl;
}
void SetBoxMonNickAt(u8 boxId, u8 boxPosition, const u8 *nick)
{
if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
SetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_NICKNAME, nick);
}
u32 GetAndCopyBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request, void *dst)
{
if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
return GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], request, dst);
else
return 0;
}
void SetBoxMonAt(u8 boxId, u8 boxPosition, struct BoxPokemon *src)
{
if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
gPokemonStoragePtr->boxes[boxId][boxPosition] = *src;
}
void CopyBoxMonAt(u8 boxId, u8 boxPosition, struct BoxPokemon *dst)
{
if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
*dst = gPokemonStoragePtr->boxes[boxId][boxPosition];
}
void CreateBoxMonAt(u8 boxId, u8 boxPosition, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 personality, u8 otIDType, u32 otID)
{
if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
{
CreateBoxMon(&gPokemonStoragePtr->boxes[boxId][boxPosition],
species,
level,
fixedIV,
hasFixedPersonality, personality,
otIDType, otID);
}
}
void ZeroBoxMonAt(u8 boxId, u8 boxPosition)
{
if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
ZeroBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition]);
}
void BoxMonAtToMon(u8 boxId, u8 boxPosition, struct Pokemon *dst)
{
if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
BoxMonToMon(&gPokemonStoragePtr->boxes[boxId][boxPosition], dst);
}
struct BoxPokemon *GetBoxedMonPtr(u8 boxId, u8 boxPosition)
{
if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
return &gPokemonStoragePtr->boxes[boxId][boxPosition];
else
return NULL;
}
u8 *GetBoxNamePtr(u8 boxId)
{
if (boxId < TOTAL_BOXES_COUNT)
return gPokemonStoragePtr->boxNames[boxId];
else
return NULL;
}
2021-04-15 20:06:25 +02:00
static u8 GetBoxWallpaper(u8 boxId)
2018-12-19 22:47:27 +01:00
{
if (boxId < TOTAL_BOXES_COUNT)
return gPokemonStoragePtr->boxWallpapers[boxId];
else
return 0;
}
2021-04-15 20:06:25 +02:00
static void SetBoxWallpaper(u8 boxId, u8 wallpaperId)
2018-12-19 22:47:27 +01:00
{
2018-12-22 23:00:22 +01:00
if (boxId < TOTAL_BOXES_COUNT && wallpaperId < WALLPAPER_COUNT)
2018-12-19 22:47:27 +01:00
gPokemonStoragePtr->boxWallpapers[boxId] = wallpaperId;
}
2018-12-20 22:53:08 +01:00
s16 sub_80D214C(struct BoxPokemon *boxMons, u8 currIndex, u8 maxIndex, u8 arg3)
2018-12-19 22:47:27 +01:00
{
s16 i;
s16 adder = -1;
if (arg3 < 2)
adder = 1;
if (arg3 == 1 || arg3 == 3)
{
2018-12-20 22:53:08 +01:00
for (i = (s8)currIndex + adder; i >= 0 && i <= maxIndex; i += adder)
2018-12-19 22:47:27 +01:00
{
if (GetBoxMonData(&boxMons[i], MON_DATA_SPECIES) != SPECIES_NONE)
return i;
}
}
else
{
2018-12-20 22:53:08 +01:00
for (i = (s8)currIndex + adder; i >= 0 && i <= maxIndex; i += adder)
2018-12-19 22:47:27 +01:00
{
if (GetBoxMonData(&boxMons[i], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetBoxMonData(&boxMons[i], MON_DATA_IS_EGG))
return i;
}
}
return -1;
}
bool8 CheckFreePokemonStorageSpace(void)
{
s32 i, j;
for (i = 0; i < TOTAL_BOXES_COUNT; i++)
{
for (j = 0; j < IN_BOX_COUNT; j++)
{
if (!GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_HAS_SPECIES))
return TRUE;
}
}
return FALSE;
}
2018-12-22 23:00:22 +01:00
bool32 CheckBoxMonSanityAt(u32 boxId, u32 boxPosition)
2018-12-19 22:47:27 +01:00
{
if (boxId < TOTAL_BOXES_COUNT
&& boxPosition < IN_BOX_COUNT
&& GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_HAS_SPECIES)
&& !GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_IS_EGG)
&& !GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_IS_BAD_EGG))
return TRUE;
else
return FALSE;
}
u32 CountStorageNonEggMons(void)
{
s32 i, j;
u32 count = 0;
for (i = 0; i < TOTAL_BOXES_COUNT; i++)
{
for (j = 0; j < IN_BOX_COUNT; j++)
{
if (GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_HAS_SPECIES)
&& !GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_IS_EGG))
count++;
}
}
return count;
}
u32 CountAllStorageMons(void)
{
s32 i, j;
u32 count = 0;
for (i = 0; i < TOTAL_BOXES_COUNT; i++)
{
for (j = 0; j < IN_BOX_COUNT; j++)
{
if (GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_HAS_SPECIES)
|| GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_IS_EGG))
count++;
}
}
return count;
}
bool32 AnyStorageMonWithMove(u16 moveId)
{
u16 moves[] = {moveId, MOVES_COUNT};
s32 i, j;
for (i = 0; i < TOTAL_BOXES_COUNT; i++)
{
for (j = 0; j < IN_BOX_COUNT; j++)
{
if (GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_HAS_SPECIES)
&& !GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_IS_EGG)
2019-03-03 09:14:08 +01:00
&& GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_KNOWN_MOVES, (u8*)moves))
2018-12-19 22:47:27 +01:00
return TRUE;
}
}
return FALSE;
}
void ResetWaldaWallpaper(void)
{
gSaveBlock1Ptr->waldaPhrase.iconId = 0;
gSaveBlock1Ptr->waldaPhrase.patternId = 0;
gSaveBlock1Ptr->waldaPhrase.patternUnlocked = FALSE;
2018-12-21 22:35:01 +01:00
gSaveBlock1Ptr->waldaPhrase.colors[0] = RGB(21, 25, 30);
gSaveBlock1Ptr->waldaPhrase.colors[1] = RGB(6, 12, 24);
2018-12-19 22:47:27 +01:00
gSaveBlock1Ptr->waldaPhrase.text[0] = EOS;
}
void SetWaldaWallpaperLockedOrUnlocked(bool32 unlocked)
{
gSaveBlock1Ptr->waldaPhrase.patternUnlocked = unlocked;
}
bool32 IsWaldaWallpaperUnlocked(void)
{
return gSaveBlock1Ptr->waldaPhrase.patternUnlocked;
}
u32 GetWaldaWallpaperPatternId(void)
{
return gSaveBlock1Ptr->waldaPhrase.patternId;
}
void SetWaldaWallpaperPatternId(u8 id)
{
if (id < FRIENDS_WALLPAPERS_COUNT)
gSaveBlock1Ptr->waldaPhrase.patternId = id;
}
u32 GetWaldaWallpaperIconId(void)
{
return gSaveBlock1Ptr->waldaPhrase.iconId;
}
void SetWaldaWallpaperIconId(u8 id)
{
2021-04-15 20:06:25 +02:00
if (id < ARRAY_COUNT(sWaldaWallpaperIcons))
2018-12-19 22:47:27 +01:00
gSaveBlock1Ptr->waldaPhrase.iconId = id;
}
u16 *GetWaldaWallpaperColorsPtr(void)
{
return gSaveBlock1Ptr->waldaPhrase.colors;
}
void SetWaldaWallpaperColors(u16 color1, u16 color2)
{
gSaveBlock1Ptr->waldaPhrase.colors[0] = color1;
gSaveBlock1Ptr->waldaPhrase.colors[1] = color2;
}
u8 *GetWaldaPhrasePtr(void)
{
return gSaveBlock1Ptr->waldaPhrase.text;
}
void SetWaldaPhrase(const u8 *src)
{
StringCopy(gSaveBlock1Ptr->waldaPhrase.text, src);
}
bool32 IsWaldaPhraseEmpty(void)
{
return (gSaveBlock1Ptr->waldaPhrase.text[0] == EOS);
}
2018-12-20 22:14:36 +01:00
// Not sure what the purpose of these functions is.
// They seem to only be called while PSS is initialized.
EWRAM_DATA static struct UnkStruct_2039D84 *gUnknown_02039D84 = NULL;
EWRAM_DATA static u16 gUnknown_02039D88 = 0;
static void sub_80D259C(u8 count)
{
u16 i;
gUnknown_02039D84 = Alloc(sizeof(*gUnknown_02039D84) * count);
gUnknown_02039D88 = (gUnknown_02039D84 == NULL) ? 0 : count;
for (i = 0; i < gUnknown_02039D88; i++)
{
gUnknown_02039D84[i].field_18 = NULL;
gUnknown_02039D84[i].field_2C = 0;
}
}
static void sub_80D25F0(void)
{
Free(gUnknown_02039D84);
}
static void sub_80D2604(void)
{
s32 i;
for (i = 0; i < gUnknown_02039D88; i++)
{
if (gUnknown_02039D84[i].field_2C == 1)
sub_80D2918(i);
}
}
struct
{
u16 a;
u16 b;
}
static const sUnkVars[][4] =
{
2018-12-22 23:00:22 +01:00
{
{0x0100, 0x0100},
{0x0200, 0x0100},
{0x0100, 0x0200},
{0x0200, 0x0200},
},
{
{0x0080, 0x0080},
{0x0100, 0x0100},
{0x0200, 0x0200},
{0x0400, 0x0400},
},
2018-12-20 22:14:36 +01:00
};
static void sub_80D2644(u8 id, u8 bg, const void *arg2, u16 arg3, u16 arg4)
{
2018-12-26 13:05:02 +01:00
u16 bgScreenSize, bgType;
2018-12-20 22:14:36 +01:00
if (id >= gUnknown_02039D88)
return;
gUnknown_02039D84[id].field_18 = NULL;
gUnknown_02039D84[id].field_1C = arg2;
gUnknown_02039D84[id].field_2B = bg;
gUnknown_02039D84[id].field_24 = arg3;
gUnknown_02039D84[id].field_26 = arg4;
2018-12-26 13:05:02 +01:00
bgScreenSize = GetBgAttribute(bg, BG_ATTR_SCREENSIZE);
bgType = GetBgAttribute(bg, BG_ATTR_TYPE);
gUnknown_02039D84[id].field_20 = sUnkVars[bgType][bgScreenSize].a;
gUnknown_02039D84[id].field_22 = sUnkVars[bgType][bgScreenSize].b;
if (bgType != 0)
2018-12-20 22:14:36 +01:00
gUnknown_02039D84[id].field_2A = 1;
else
gUnknown_02039D84[id].field_2A = 2;
gUnknown_02039D84[id].field_28 = gUnknown_02039D84[id].field_2A * arg3;
gUnknown_02039D84[id].field_0[1].field_4 = arg3;
gUnknown_02039D84[id].field_0[1].field_6 = arg4;
gUnknown_02039D84[id].field_0[1].field_0 = 0;
gUnknown_02039D84[id].field_0[1].field_2 = 0;
gUnknown_02039D84[id].field_0[1].field_8 = 0;
gUnknown_02039D84[id].field_0[1].field_A = 0;
gUnknown_02039D84[id].field_0[0] = gUnknown_02039D84[id].field_0[1];
gUnknown_02039D84[id].field_2C = 1;
}
static void sub_80D2740(u8 id, const void *arg1)
{
if (id >= gUnknown_02039D88)
return;
gUnknown_02039D84[id].field_18 = arg1;
gUnknown_02039D84[id].field_2C = 1;
}
static void sub_80D2770(u8 id, u16 arg1, u16 arg2)
{
if (id >= gUnknown_02039D88)
return;
gUnknown_02039D84[id].field_0[1].field_8 = arg1;
gUnknown_02039D84[id].field_0[1].field_A = arg2;
gUnknown_02039D84[id].field_2C = 1;
}
static void sub_80D27AC(u8 id, u16 arg1, u16 arg2, u16 arg3, u16 arg4)
{
if (id >= gUnknown_02039D88)
return;
gUnknown_02039D84[id].field_0[1].field_0 = arg1;
gUnknown_02039D84[id].field_0[1].field_2 = arg2;
gUnknown_02039D84[id].field_0[1].field_4 = arg3;
gUnknown_02039D84[id].field_0[1].field_6 = arg4;
gUnknown_02039D84[id].field_2C = 1;
}
static void sub_80D27F4(u8 id, u8 arg1, s8 arg2)
{
if (id >= gUnknown_02039D88)
return;
switch (arg1)
{
case 0:
gUnknown_02039D84[id].field_0[1].field_8 += arg2;
gUnknown_02039D84[id].field_0[1].field_4 -= arg2;
break;
case 1:
gUnknown_02039D84[id].field_0[1].field_0 += arg2;
gUnknown_02039D84[id].field_0[1].field_4 += arg2;
break;
case 2:
gUnknown_02039D84[id].field_0[1].field_A += arg2;
gUnknown_02039D84[id].field_0[1].field_6 -= arg2;
break;
case 3:
gUnknown_02039D84[id].field_0[1].field_2 -= arg2;
gUnknown_02039D84[id].field_0[1].field_6 += arg2;
break;
case 4:
gUnknown_02039D84[id].field_0[1].field_8 += arg2;
break;
case 5:
gUnknown_02039D84[id].field_0[1].field_A += arg2;
break;
}
gUnknown_02039D84[id].field_2C = 1;
}
static void sub_80D2918(u8 id)
{
if (id >= gUnknown_02039D88)
return;
if (gUnknown_02039D84[id].field_18 != NULL)
sub_80D2960(id);
sub_80D29F8(id);
gUnknown_02039D84[id].field_0[0] = gUnknown_02039D84[id].field_0[1];
}
static void sub_80D2960(u8 id)
{
s32 i;
u32 adder = gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_20;
const void *tiles = (gUnknown_02039D84[id].field_18 + (adder * gUnknown_02039D84[id].field_0[0].field_A))
+ (gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_0[0].field_8);
for (i = 0; i < gUnknown_02039D84[id].field_0[0].field_6; i++)
{
CopyToBgTilemapBufferRect(gUnknown_02039D84[id].field_2B,
tiles,
gUnknown_02039D84[id].field_0[0].field_8,
gUnknown_02039D84[id].field_0[0].field_A + i,
gUnknown_02039D84[id].field_0[0].field_4,
1);
tiles += adder;
}
}
static void sub_80D29F8(u8 id)
{
s32 i;
u32 adder = gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_24;
const void *tiles = (gUnknown_02039D84[id].field_1C + (adder * gUnknown_02039D84[id].field_0[1].field_2))
+ (gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_0[1].field_0);
for (i = 0; i < gUnknown_02039D84[id].field_0[1].field_6; i++)
{
CopyToBgTilemapBufferRect(gUnknown_02039D84[id].field_2B,
tiles,
gUnknown_02039D84[id].field_0[1].field_8,
gUnknown_02039D84[id].field_0[1].field_A + i,
gUnknown_02039D84[id].field_0[1].field_4,
1);
tiles += adder;
}
}
EWRAM_DATA static struct UnkStruct_2000020 *gUnknown_02039D8C = NULL;
static void sub_80D2A90(struct UnkStruct_2000020 *arg0, struct UnkStruct_2000028 *arg1, u32 arg2)
{
gUnknown_02039D8C = arg0;
arg0->unk_00 = arg1;
arg0->unk_05 = arg2;
arg0->unk_04 = 0;
}
static void sub_80D2AA4(void)
{
u16 i;
if (gUnknown_02039D8C->unk_04)
{
for (i = 0; i < gUnknown_02039D8C->unk_04; i++)
{
struct UnkStruct_2000028 *unkStruct = &gUnknown_02039D8C->unk_00[i];
unkStruct->unk_0c(unkStruct);
}
gUnknown_02039D8C->unk_04 = 0;
}
}
static bool8 sub_80D2AEC(u8 *dest, u16 dLeft, u16 dTop, const u8 *src, u16 sLeft, u16 sTop, u16 width, u16 height, u16 unkArg)
{
struct UnkStruct_2000028 *unkStruct;
if (gUnknown_02039D8C->unk_04 >= gUnknown_02039D8C->unk_05)
return FALSE;
unkStruct = &gUnknown_02039D8C->unk_00[gUnknown_02039D8C->unk_04++];
unkStruct->unk_08 = width * 2;
unkStruct->unk_04 = dest + 2 * (dTop * 32 + dLeft);
unkStruct->unk_00 = src + 2 * (sTop * unkArg + sLeft);
unkStruct->newField = height;
unkStruct->unk_0a = unkArg;
unkStruct->unk_0c = sub_80D2B88;
return TRUE;
}
static void sub_80D2B88(struct UnkStruct_2000028 *unkStruct)
{
u16 i;
for (i = 0; i < unkStruct->newField; i++)
{
CpuSet(unkStruct->unk_00, unkStruct->unk_04, (unkStruct->unk_08 / 2));
unkStruct->unk_04 += 64;
unkStruct->unk_00 += (unkStruct->unk_0a * 2);
}
}
static bool8 sub_80D2BC0(void *dest, u16 dLeft, u16 dTop, u16 width, u16 height)
{
struct UnkStruct_2000028 *unkStruct;
if (gUnknown_02039D8C->unk_04 >= gUnknown_02039D8C->unk_05)
return FALSE;
unkStruct = &gUnknown_02039D8C->unk_00[gUnknown_02039D8C->unk_04++];
unkStruct->unk_08 = width * 2;
unkStruct->unk_04 = dest + ((dTop * 32) + dLeft) * 2;
unkStruct->newField = height;
unkStruct->unk_0c = sub_80D2C1C;
return TRUE;
}
static void sub_80D2C1C(struct UnkStruct_2000028 *unkStruct)
{
u16 i;
for (i = 0; i < unkStruct->newField; i++)
{
Dma3FillLarge_(0, unkStruct->unk_04, unkStruct->unk_08, 16);
unkStruct->unk_04 += 64;
}
}