summaryrefslogtreecommitdiff
path: root/src/pokemon_storage_system.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pokemon_storage_system.c')
-rw-r--r--src/pokemon_storage_system.c1048
1 files changed, 1029 insertions, 19 deletions
diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c
index 54c83e329..d9bc818ae 100644
--- a/src/pokemon_storage_system.c
+++ b/src/pokemon_storage_system.c
@@ -46,6 +46,26 @@ struct WallpaperTable
const u16 *palettes;
};
+struct Struct_02039D80
+{
+ 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];
+};
+
enum
{
BOX_OPTION_WITHDRAW,
@@ -161,8 +181,9 @@ enum
#define TAG_TILE_3 0x3
#define TAG_TILE_4 0x4
-IWRAM_DATA u8 gUnknown_03000F78[0x188];
+IWRAM_DATA u32 gUnknown_03000F78[98];
+// EWRAM DATA
extern u8 sPreviousBoxOption;
extern u8 sCurrentBoxOption;
extern u8 sMovingMonOrigBoxPos;
@@ -178,6 +199,7 @@ extern bool8 sIsMonBeingMoved;
extern u8 gUnknown_02039D0F;
extern u16 gUnknown_02039D12;
extern struct Pokemon gUnknown_02039D14;
+extern struct Struct_02039D80 *gUnknown_02039D80;
extern void sub_80F9BCC(u16, u16, u8);
extern void sub_80F9BF4(u16, u16, u8);
@@ -367,10 +389,10 @@ void PrintStorageActionText(u8 id);
s16 sub_80D00AC(void);
s8 RunCanReleaseMon(void);
u8 GetBoxCursorPosition(void);
-void sub_80D0E90(bool8 inParty, u8 boxPosition);
-void sub_80D1080(bool8 inParty, u8 boxPosition);
-void sub_80D1114(bool8 inParty, u8 boxPosition);
-void sub_80D0FAC(bool8 inParty, u8 boxPosition);
+static void Item_FromMonToMoving(u8 cursorArea, u8 cursorPos);
+static void Item_GiveMovingToMon(u8 cursorArea, u8 cursorPos);
+static void Item_TakeMons(u8 cursorArea, u8 cursorPos);
+static void Item_SwitchMonsWithMoving(u8 cursorArea, u8 cursorPos);
struct Sprite *sub_80CD2E8(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority);
static void SetWallpaperForCurrentBox(u8 wallpaperId);
static void AddWallpapersMenu(u8 wallpaperSet);
@@ -389,8 +411,8 @@ static void sub_80CAAA8(u8 arg0, bool8 isPartyMon);
const u8 *GetMovingItemName(void);
bool32 IsWaldaWallpaperUnlocked(void);
static void SetMenuText(u8 textId);
-void sub_80D0D8C(u8 arg0, u8 cursorPos);
-void sub_80D0E50(u8 arg0, u8 cursorPos);
+void sub_80D0D8C(u8 cursorArea, u8 cursorPos);
+void sub_80D0E50(u8 cursorArea, u8 cursorPos);
void sub_80D0F38(u16 item);
static struct Sprite *CreateMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 oamPriority, u8 subpriority);
static void DestroyBoxMonIcon(struct Sprite *sprite);
@@ -430,6 +452,27 @@ u8 sub_80CFA5C(void);
u8 sub_80D0BA4(void);
static bool8 sub_80CFA84(void);
static bool8 sub_80CFB44(void);
+bool8 sub_80D024C(void);
+bool8 sub_80D0344(void);
+bool8 sub_80D03B0(void);
+bool8 sub_80D0420(void);
+bool8 sub_80D04A0(void);
+bool8 sub_80D04C8(void);
+void sub_80D304C(u16 palIndex);
+void sub_80D07B0(u8 arg0, u8 arg1);
+void sub_80D0834(u8 arg0, u8 arg1);
+void sub_80D0B5C(void);
+void sub_80D062C(void);
+void sub_80D0884(u16 arg0, u16 arg1, u16 arg2);
+void sub_80D08CC(void);
+void sub_80D09A4(void);
+void sub_80D0A1C(void);
+void sub_80D0AAC(void);
+u8 sub_80D0894(void);
+void sub_80D0778(u8 arg0, u8 arg1, u8 arg2);
+void sub_80D0708(u8 arg0, u8 arg1, u8 arg2);
+void sub_80D06D0(u8 arg0, u8 arg1, u8 arg2);
+void sub_80D0740(u8 arg0, u8 arg1, u8 arg2);
// static const rom data
static const struct PSS_MenuStringPtrs gUnknown_085716C0[] =
@@ -2875,7 +2918,7 @@ static void Cb_TakeItemForMoving(u8 taskId)
break;
case 1:
sub_80CFE54(2);
- sub_80D0E90((sInPartyMenu != FALSE), GetBoxCursorPosition());
+ Item_FromMonToMoving((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
gUnknown_02039D08->state++;
break;
case 2:
@@ -2905,7 +2948,7 @@ static void Cb_GiveMovingItemToMon(u8 taskId)
break;
case 1:
sub_80CFE54(2);
- sub_80D1080((sInPartyMenu != FALSE), GetBoxCursorPosition());
+ Item_GiveMovingToMon((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
gUnknown_02039D08->state++;
break;
case 2:
@@ -2946,7 +2989,7 @@ static void Cb_ItemToBag(u8 taskId)
else
{
PlaySE(SE_SELECT);
- sub_80D1114((sInPartyMenu != FALSE), GetBoxCursorPosition());
+ Item_TakeMons((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
gUnknown_02039D08->state = 1;
}
break;
@@ -2997,7 +3040,7 @@ static void Cb_SwitchSelectedItem(u8 taskId)
break;
case 1:
sub_80CFE54(2);
- sub_80D0FAC((sInPartyMenu != FALSE), GetBoxCursorPosition());
+ Item_SwitchMonsWithMoving((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
gUnknown_02039D08->state++;
break;
case 2:
@@ -4154,9 +4197,9 @@ static void sub_80CAEAC(void)
if (!IsCursorOnBox())
{
if (sInPartyMenu)
- sub_80D0D8C(1, GetBoxCursorPosition());
+ sub_80D0D8C(CURSOR_AREA_IN_PARTY, GetBoxCursorPosition());
else
- sub_80D0D8C(0, GetBoxCursorPosition());
+ sub_80D0D8C(CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
}
if (gUnknown_02039D12 != 0)
@@ -5636,14 +5679,14 @@ static void sub_80CD894(u8 newCurosrArea, u8 newCursorPosition)
if (gUnknown_02039D08->boxOption == BOX_OPTION_MOVE_ITEMS)
{
if (sBoxCursorArea == CURSOR_AREA_IN_BOX)
- sub_80D0E50(0, sBoxCursorPosition);
+ sub_80D0E50(CURSOR_AREA_IN_BOX, sBoxCursorPosition);
else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY)
- sub_80D0E50(1, sBoxCursorPosition);
+ sub_80D0E50(CURSOR_AREA_IN_PARTY, sBoxCursorPosition);
if (newCurosrArea == CURSOR_AREA_IN_BOX)
- sub_80D0D8C(0, newCursorPosition);
+ sub_80D0D8C(newCurosrArea, newCursorPosition);
else if (newCurosrArea == CURSOR_AREA_IN_PARTY)
- sub_80D0D8C(1, newCursorPosition);
+ sub_80D0D8C(newCurosrArea, newCursorPosition);
}
if (newCurosrArea == CURSOR_AREA_IN_PARTY && sBoxCursorArea != CURSOR_AREA_IN_PARTY)
@@ -8298,13 +8341,13 @@ void sub_80CFE84(void)
void sub_80CFEA8(void)
{
if (sBoxCursorArea == CURSOR_AREA_IN_BOX)
- sub_80D0E50(0, sBoxCursorPosition);
+ sub_80D0E50(CURSOR_AREA_IN_BOX, sBoxCursorPosition);
}
void sub_80CFECC(void)
{
if (sBoxCursorArea == CURSOR_AREA_IN_BOX)
- sub_80D0D8C(0, sBoxCursorPosition);
+ sub_80D0D8C(CURSOR_AREA_IN_BOX, sBoxCursorPosition);
}
static void InitMenu(void)
@@ -8449,3 +8492,970 @@ void sub_80D013C(void)
sub_8198070(gUnknown_02039D08->field_CB0, TRUE);
RemoveWindow(gUnknown_02039D08->field_CB0);
}
+
+// 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.
+
+const struct WindowTemplate gUnknown_0857BB1C =
+{
+ .bg = 0,
+ .tilemapLeft = 10,
+ .tilemapTop = 3,
+ .width = 20,
+ .height = 18,
+ .paletteNum = 9,
+ .baseBlock = 0xA,
+};
+
+bool8 sub_80D0164(void)
+{
+ gUnknown_02039D80 = Alloc(sizeof(*gUnknown_02039D80));
+ if (gUnknown_02039D80 != NULL)
+ {
+ gUnknown_02039D08->field_2200 = AddWindow8Bit(&gUnknown_0857BB1C);
+ if (gUnknown_02039D08->field_2200 != 0xFF)
+ {
+ FillWindowPixelBuffer(gUnknown_02039D08->field_2200, 0);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+void sub_80D01B8(void)
+{
+ if (gUnknown_02039D80 != NULL)
+ Free(gUnknown_02039D80);
+}
+
+void sub_80D01D0(u8 arg0)
+{
+ gUnknown_02039D80->field_0 = arg0;
+ gUnknown_02039D80->state = 0;
+}
+
+bool8 sub_80D01E4(void)
+{
+ switch (gUnknown_02039D80->field_0)
+ {
+ 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;
+}
+
+bool8 sub_80D024C(void)
+{
+ switch (gUnknown_02039D80->state)
+ {
+ case 0:
+ HideBg(0);
+ sub_80D304C(0x80);
+ gUnknown_02039D80->state++;
+ break;
+ case 1:
+ sub_80CFE14(&gUnknown_02039D80->fromRow, &gUnknown_02039D80->fromColumn);
+ gUnknown_02039D80->toRow = gUnknown_02039D80->fromRow;
+ gUnknown_02039D80->toColumn = gUnknown_02039D80->fromColumn;
+ ChangeBgX(0, -1024, 0);
+ ChangeBgY(0, -1024, 0);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
+ FillWindowPixelBuffer8Bit(gUnknown_02039D08->field_2200, 0);
+ sub_80D07B0(gUnknown_02039D80->fromRow, gUnknown_02039D80->fromColumn);
+ SetBgAttribute(0, 4, 1);
+ PutWindowTilemap(gUnknown_02039D08->field_2200);
+ CopyWindowToVram8Bit(gUnknown_02039D08->field_2200, 3);
+ BlendPalettes(0x3F00, 8, 0x7FFF);
+ sub_80CFE54(2);
+ SetGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR);
+ gUnknown_02039D80->state++;
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ ShowBg(0);
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+bool8 sub_80D0344(void)
+{
+ switch (gUnknown_02039D80->state)
+ {
+ case 0:
+ HideBg(0);
+ gUnknown_02039D80->state++;
+ break;
+ case 1:
+ sub_80D0B5C();
+ sub_80CFE54(0);
+ gUnknown_02039D80->state++;
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ sub_80CFE84();
+ LoadPalette(stdpal_get(3), 0xD0, 0x20);
+ ShowBg(0);
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+bool8 sub_80D03B0(void)
+{
+ switch (gUnknown_02039D80->state)
+ {
+ case 0:
+ if (!sub_80CD554())
+ {
+ sub_80CFE14(&gUnknown_02039D80->field_6, &gUnknown_02039D80->field_7);
+ sub_80D062C();
+ gUnknown_02039D80->toRow = gUnknown_02039D80->field_6;
+ gUnknown_02039D80->toColumn = gUnknown_02039D80->field_7;
+ CopyWindowToVram8Bit(gUnknown_02039D08->field_2200, 2);
+ gUnknown_02039D80->state++;
+ }
+ break;
+ case 1:
+ return IsDma3ManagerBusyWithBgCopy();
+ }
+
+ return TRUE;
+}
+
+bool8 sub_80D0420(void)
+{
+ u8 var1, var2;
+
+ switch (gUnknown_02039D80->state)
+ {
+ case 0:
+ sub_80D08CC();
+ sub_80D09A4();
+ sub_80CDC64(FALSE);
+ gUnknown_02039D80->state++;
+ break;
+ case 1:
+ if (!DoMonPlaceChange())
+ {
+ sub_80CFE54(3);
+ sub_80D0884(0, 256, 8);
+ sub_80CDC64(TRUE);
+ gUnknown_02039D80->state++;
+ }
+ break;
+ case 2:
+ var1 = sub_80D0894();
+ var2 = DoMonPlaceChange();
+ if (!var1 && !var2)
+ return FALSE;
+ break;
+ }
+
+ return TRUE;
+}
+
+bool8 sub_80D04A0(void)
+{
+ u8 var1 = sub_80CD554();
+ u8 var2 = sub_80D0894();
+
+ if (!var1 && !var2)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+bool8 sub_80D04C8(void)
+{
+ switch (gUnknown_02039D80->state)
+ {
+ case 0:
+ sub_80D0AAC();
+ sub_80D0884(0, -256, 8);
+ sub_80CDC64(FALSE);
+ gUnknown_02039D80->state++;
+ break;
+ case 1:
+ if (!DoMonPlaceChange() && !sub_80D0894())
+ {
+ sub_80D0A1C();
+ sub_80CFE54(2);
+ sub_80CDC64(TRUE);
+ HideBg(0);
+ gUnknown_02039D80->state++;
+ }
+ break;
+ case 2:
+ if (!DoMonPlaceChange())
+ {
+ sub_80CFE54(0);
+ sub_80D0B5C();
+ gUnknown_02039D80->state++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ LoadPalette(stdpal_get(3), 0xD0, 0x20);
+ sub_80CFE84();
+ ShowBg(0);
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+bool8 sub_80D0580(u8 arg0)
+{
+ switch (arg0)
+ {
+ case 0:
+ if (gUnknown_02039D80->minColumn == 0)
+ return FALSE;
+ gUnknown_02039D80->minColumn--;
+ sub_80D0884(0, 1024, 6);
+ break;
+ case 1:
+ if (gUnknown_02039D80->minColumn + gUnknown_02039D80->columsTotal >= 5)
+ return FALSE;
+ gUnknown_02039D80->minColumn++;
+ sub_80D0884(0, -1024, 6);
+ break;
+ case 2:
+ if (gUnknown_02039D80->minRow == 0)
+ return FALSE;
+ gUnknown_02039D80->minRow--;
+ sub_80D0884(1024, 0, 6);
+ break;
+ case 3:
+ if (gUnknown_02039D80->minRow + gUnknown_02039D80->rowsTotal > 5)
+ return FALSE;
+ gUnknown_02039D80->minRow++;
+ sub_80D0884(-1024, 0, 6);
+ break;
+ }
+
+ return TRUE;
+}
+
+void sub_80D062C(void)
+{
+ s16 var = (abs(gUnknown_02039D80->fromRow - gUnknown_02039D80->field_6)) - (abs(gUnknown_02039D80->fromRow - gUnknown_02039D80->toRow));
+ s16 var2 = (abs(gUnknown_02039D80->fromColumn - gUnknown_02039D80->field_7)) - (abs(gUnknown_02039D80->fromColumn - gUnknown_02039D80->toColumn));
+
+ if (var > 0)
+ sub_80D06D0(gUnknown_02039D80->field_6, gUnknown_02039D80->fromColumn, gUnknown_02039D80->toColumn);
+
+ if (var < 0)
+ {
+ sub_80D0740(gUnknown_02039D80->toRow, gUnknown_02039D80->fromColumn, gUnknown_02039D80->toColumn);
+ sub_80D06D0(gUnknown_02039D80->field_6, gUnknown_02039D80->fromColumn, gUnknown_02039D80->toColumn);
+ }
+
+ if (var2 > 0)
+ sub_80D0708(gUnknown_02039D80->field_7, gUnknown_02039D80->fromRow, gUnknown_02039D80->toRow);
+
+ if (var2 < 0)
+ {
+ sub_80D0778(gUnknown_02039D80->toColumn, gUnknown_02039D80->fromRow, gUnknown_02039D80->toRow);
+ sub_80D0708(gUnknown_02039D80->field_7, gUnknown_02039D80->fromRow, gUnknown_02039D80->toRow);
+ }
+}
+
+void sub_80D06D0(u8 arg0, u8 arg1, u8 arg2)
+{
+ u8 var1 = arg1;
+
+ if (arg1 > arg2)
+ {
+ arg1 = arg2;
+ arg2 = var1;
+ }
+
+ while (arg1 <= arg2)
+ sub_80D07B0(arg0, arg1++);
+}
+
+void sub_80D0708(u8 arg0, u8 arg1, u8 arg2)
+{
+ u8 var1 = arg1;
+
+ if (arg1 > arg2)
+ {
+ arg1 = arg2;
+ arg2 = var1;
+ }
+
+ while (arg1 <= arg2)
+ sub_80D07B0(arg1++, arg0);
+}
+
+void sub_80D0740(u8 arg0, u8 arg1, u8 arg2)
+{
+ u8 var1 = arg1;
+
+ if (arg1 > arg2)
+ {
+ arg1 = arg2;
+ arg2 = var1;
+ }
+
+ while (arg1 <= arg2)
+ sub_80D0834(arg0, arg1++);
+}
+
+void sub_80D0778(u8 arg0, u8 arg1, u8 arg2)
+{
+ u8 var1 = arg1;
+
+ if (arg1 > arg2)
+ {
+ arg1 = arg2;
+ arg2 = var1;
+ }
+
+ while (arg1 <= arg2)
+ sub_80D0834(arg1++, arg0);
+}
+
+void sub_80D07B0(u8 arg0, u8 arg1)
+{
+ 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;
+
+ BlitBitmapRectToWindow4BitTo8Bit(gUnknown_02039D08->field_2200,
+ iconGfx,
+ 0,
+ 0,
+ 32,
+ 32,
+ 24 * arg0,
+ 24 * arg1,
+ 32,
+ 32,
+ index);
+ }
+}
+
+void sub_80D0834(u8 arg0, u8 arg1)
+{
+ u8 position = arg0 + (6 * arg1);
+ u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES2);
+
+ if (species != SPECIES_NONE)
+ {
+ FillWindowPixelRect8Bit(gUnknown_02039D08->field_2200,
+ 0,
+ 24 * arg0,
+ 24 * arg1,
+ 32,
+ 32);
+ }
+}
+
+void sub_80D0884(u16 arg0, u16 arg1, u16 arg2)
+{
+ gUnknown_02039D80->bgX = arg0;
+ gUnknown_02039D80->bgY = arg1;
+ gUnknown_02039D80->field_10 = arg2;
+}
+
+u8 sub_80D0894(void)
+{
+ if (gUnknown_02039D80->field_10 != 0)
+ {
+ ChangeBgX(0, gUnknown_02039D80->bgX, 1);
+ ChangeBgY(0, gUnknown_02039D80->bgY, 1);
+ gUnknown_02039D80->field_10--;
+ }
+
+ return gUnknown_02039D80->field_10;
+}
+
+void sub_80D08CC(void)
+{
+ s32 i, j, r8, r9;
+ s32 rowCount, columnCount;
+ u8 boxId;
+ u8 monArrayId;
+
+ gUnknown_02039D80->minRow = min(gUnknown_02039D80->fromRow, gUnknown_02039D80->toRow);
+ gUnknown_02039D80->minColumn = min(gUnknown_02039D80->fromColumn, gUnknown_02039D80->toColumn);
+ gUnknown_02039D80->rowsTotal = abs(gUnknown_02039D80->fromRow - gUnknown_02039D80->toRow) + 1;
+ gUnknown_02039D80->columsTotal = abs(gUnknown_02039D80->fromColumn - gUnknown_02039D80->toColumn) + 1;
+ boxId = StorageGetCurrentBox();
+ monArrayId = 0;
+ rowCount = gUnknown_02039D80->minRow + gUnknown_02039D80->rowsTotal;
+ columnCount = gUnknown_02039D80->minColumn + gUnknown_02039D80->columsTotal;
+ for (i = gUnknown_02039D80->minColumn; i < columnCount; i++)
+ {
+ u8 boxPosition = (IN_BOX_ROWS * i) + gUnknown_02039D80->minRow;
+ for (j = gUnknown_02039D80->minRow; j < rowCount; j++)
+ {
+ struct BoxPokemon *boxMon = GetBoxedMonPtr(boxId, boxPosition);
+
+ gUnknown_02039D80->boxMons[monArrayId] = *boxMon;
+ monArrayId++;
+ boxPosition++;
+ }
+ }
+}
+
+void sub_80D09A4(void)
+{
+ s32 i, j;
+ s32 rowCount = gUnknown_02039D80->minRow + gUnknown_02039D80->rowsTotal;
+ s32 columnCount = gUnknown_02039D80->minColumn + gUnknown_02039D80->columsTotal;
+ u8 boxId = StorageGetCurrentBox();
+
+ for (i = gUnknown_02039D80->minColumn; i < columnCount; i++)
+ {
+ u8 boxPosition = (IN_BOX_ROWS * i) + gUnknown_02039D80->minRow;
+ for (j = gUnknown_02039D80->minRow; j < rowCount; j++)
+ {
+ DestroyBoxMonIconAtPosition(boxPosition);
+ ZeroBoxMonAt(boxId, boxPosition);
+ boxPosition++;
+ }
+ }
+}
+
+void sub_80D0A1C(void)
+{
+ s32 i, j;
+ s32 rowCount = gUnknown_02039D80->minRow + gUnknown_02039D80->rowsTotal;
+ s32 columnCount = gUnknown_02039D80->minColumn + gUnknown_02039D80->columsTotal;
+ u8 monArrayId = 0;
+
+ for (i = gUnknown_02039D80->minColumn; i < columnCount; i++)
+ {
+ u8 boxPosition = (IN_BOX_ROWS * i) + gUnknown_02039D80->minRow;
+ for (j = gUnknown_02039D80->minRow; j < rowCount; j++)
+ {
+ if (GetBoxMonData(&gUnknown_02039D80->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES))
+ sub_80CB140(boxPosition);
+ monArrayId++;
+ boxPosition++;
+ }
+ }
+}
+
+void sub_80D0AAC(void)
+{
+ s32 i, j;
+ s32 rowCount = gUnknown_02039D80->minRow + gUnknown_02039D80->rowsTotal;
+ s32 columnCount = gUnknown_02039D80->minColumn + gUnknown_02039D80->columsTotal;
+ u8 boxId = StorageGetCurrentBox();
+ u8 monArrayId = 0;
+
+ for (i = gUnknown_02039D80->minColumn; i < columnCount; i++)
+ {
+ u8 boxPosition = (IN_BOX_ROWS * i) + gUnknown_02039D80->minRow;
+ for (j = gUnknown_02039D80->minRow; j < rowCount; j++)
+ {
+ if (GetBoxMonData(&gUnknown_02039D80->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES))
+ SetBoxMonAt(boxId, boxPosition, &gUnknown_02039D80->boxMons[monArrayId]);
+ boxPosition++;
+ monArrayId++;
+ }
+ }
+}
+
+void sub_80D0B5C(void)
+{
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ SetBgAttribute(0, 4, 0);
+ ClearGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);
+ CopyBgTilemapBufferToVram(0);
+}
+
+u8 sub_80D0BA4(void)
+{
+ return (IN_BOX_ROWS * gUnknown_02039D80->fromColumn) + gUnknown_02039D80->fromRow;
+}
+
+bool8 sub_80D0BC0(void)
+{
+ s32 i, j;
+ s32 rowCount = gUnknown_02039D80->minRow + gUnknown_02039D80->rowsTotal;
+ s32 columnCount = gUnknown_02039D80->minColumn + gUnknown_02039D80->columsTotal;
+ u8 monArrayId = 0;
+
+ for (i = gUnknown_02039D80->minColumn; i < columnCount; i++)
+ {
+ u8 boxPosition = (IN_BOX_ROWS * i) + gUnknown_02039D80->minRow;
+ for (j = gUnknown_02039D80->minRow; j < rowCount; j++)
+ {
+ if (GetBoxMonData(&gUnknown_02039D80->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)
+ && GetCurrentBoxMonData(boxPosition, MON_DATA_SANITY_HAS_SPECIES))
+ return FALSE;
+
+ monArrayId++;
+ boxPosition++;
+ }
+ }
+
+ return TRUE;
+}
+
+const u32 gUnknown_0857BB24[] = INCBIN_U32("graphics/pokemon_storage/unknown_frame.4bpp");
+
+static const struct OamData sOamData_857BBA4 =
+{
+ .y = 0,
+ .affineMode = 1,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .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
+};
+
+const struct SpriteTemplate gSpriteTemplate_857BC70 =
+{
+ .tileTag = 7,
+ .paletteTag = 0xdacb,
+ .oam = &sOamData_857BBA4,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sSpriteAffineAnimTable_857BC44,
+ .callback = SpriteCallbackDummy,
+};
+
+void sub_80D0C60(void)
+{
+ s32 i;
+ u8 spriteId;
+ struct CompressedSpriteSheet spriteSheet;
+ struct SpriteTemplate spriteTemplate;
+
+ if (gUnknown_02039D08->boxOption == BOX_OPTION_MOVE_ITEMS)
+ {
+ spriteSheet.data = gUnknown_03000F78;
+ spriteSheet.size = 0x200;
+ spriteTemplate = gSpriteTemplate_857BC70;
+
+ for (i = 0; i < 3; i++)
+ {
+ spriteSheet.tag = 7 + i;
+ LoadCompressedSpriteSheet(&spriteSheet);
+ gUnknown_02039D08->field_2204[i].tiles = GetSpriteTileStartByTag(spriteSheet.tag) * 32 + (void*)(OBJ_VRAM0);
+ gUnknown_02039D08->field_2204[i].palIndex = AllocSpritePalette(0xDACB + i);
+ gUnknown_02039D08->field_2204[i].palIndex *= 16;
+ gUnknown_02039D08->field_2204[i].palIndex += 0x100;
+ spriteTemplate.tileTag = 7 + i;
+ spriteTemplate.paletteTag = 0xDACB + i;
+ spriteId = CreateSprite(&spriteTemplate, 0, 0, 11);
+ gUnknown_02039D08->field_2204[i].sprite = &gSprites[spriteId];
+ gUnknown_02039D08->field_2204[i].sprite->invisible = TRUE;
+ gUnknown_02039D08->field_2204[i].unk10 = 0;
+ }
+ }
+ gUnknown_02039D08->movingItem = 0;
+}
+
+// The functions below handle new features of MOVE_ITEMS box option.
+
+bool32 sub_80D1324(u8 cursorArea, u8 cursorPos);
+const u32 *GetItemIconPic(u16 itemId);
+const u16 *GetItemIconPalette(u16 itemId);
+u8 sub_80D12E8(void);
+void sub_80D140C(u8 id, u8 cursorArea, u8 cursorPos);
+void sub_80D1524(u8 id, const u32 *itemTiles, const u16 *itemPal);
+void sub_80D15D4(u8 id, u8 animNum);
+void sub_80D1740(u8 id, bool8 arg1);
+u8 sub_80D1370(u8 cursorArea, u8 cursorPos);
+void sub_80D1604(u8 id, u8 arg1, u8 cursorArea, u8 cursorPos);
+void sub_80D1AD8(struct Sprite *sprite);
+
+void sub_80D0D8C(u8 cursorArea, u8 cursorPos)
+{
+ u16 heldItem;
+
+ if (gUnknown_02039D08->boxOption != BOX_OPTION_MOVE_ITEMS)
+ 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);
+ const u16 *pal = GetItemIconPalette(heldItem);
+ u8 id = sub_80D12E8();
+
+ sub_80D140C(id, cursorArea, cursorPos);
+ sub_80D1524(id, tiles, pal);
+ sub_80D15D4(id, 1);
+ sub_80D1740(id, TRUE);
+ }
+}
+
+void sub_80D0E50(u8 cursorArea, u8 cursorPos)
+{
+ u8 id;
+
+ if (gUnknown_02039D08->boxOption != BOX_OPTION_MOVE_ITEMS)
+ 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;
+
+ if (gUnknown_02039D08->boxOption != BOX_OPTION_MOVE_ITEMS)
+ 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);
+ }
+
+ gUnknown_02039D08->movingItem = gUnknown_02039D08->cursorMonItem;
+}
+
+void sub_80D0F38(u16 item)
+{
+ const u32 *tiles = GetItemIconPic(item);
+ const u16 *pal = GetItemIconPalette(item);
+ 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);
+ gUnknown_02039D08->movingItem = item;
+}
+
+static void Item_SwitchMonsWithMoving(u8 cursorArea, u8 cursorPos)
+{
+ u8 id;
+ u16 item;
+
+ if (gUnknown_02039D08->boxOption != BOX_OPTION_MOVE_ITEMS)
+ 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);
+ SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &gUnknown_02039D08->movingItem);
+ gUnknown_02039D08->movingItem = item;
+ }
+ else
+ {
+ item = GetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM);
+ SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &gUnknown_02039D08->movingItem);
+ gUnknown_02039D08->movingItem = item;
+ }
+
+ 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;
+
+ if (gUnknown_02039D08->boxOption != BOX_OPTION_MOVE_ITEMS)
+ return;
+
+ id = sub_80D1370(2, 0);
+ sub_80D15D4(id, 4);
+ sub_80D1604(id, 2, cursorArea, cursorPos);
+ if (cursorArea == CURSOR_AREA_IN_BOX)
+ {
+ SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &gUnknown_02039D08->movingItem);
+ SetBoxMonIconObjMode(cursorPos, 0);
+ }
+ else
+ {
+ SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &gUnknown_02039D08->movingItem);
+ SetPartyMonIconObjMode(cursorPos, 0);
+ }
+}
+
+static void Item_TakeMons(u8 cursorArea, u8 cursorPos)
+{
+ u8 id;
+ u16 item;
+
+ if (gUnknown_02039D08->boxOption != BOX_OPTION_MOVE_ITEMS)
+ 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);
+ }
+}
+
+void sub_80D1194(void)
+{
+ if (gUnknown_02039D08->boxOption == BOX_OPTION_MOVE_ITEMS)
+ {
+ u8 id = sub_80D1370(2, 0);
+ sub_80D15D4(id, 5);
+ sub_80D1604(id, 0, 2, 0);
+ }
+}
+
+void sub_80D11CC(void)
+{
+ s32 i;
+
+ if (gUnknown_02039D08->boxOption != BOX_OPTION_MOVE_ITEMS)
+ return;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (gUnknown_02039D08->field_2204[i].unk10 && gUnknown_02039D08->field_2204[i].unk8 == 1)
+ sub_80D1604(i, 7, 2, 0);
+ }
+}
+
+bool8 sub_80D1218(void)
+{
+ s32 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (gUnknown_02039D08->field_2204[i].unk10)
+ {
+ if (!gUnknown_02039D08->field_2204[i].sprite->affineAnimEnded && gUnknown_02039D08->field_2204[i].sprite->affineAnimBeginning)
+ return TRUE;
+ if (gUnknown_02039D08->field_2204[i].sprite->callback != SpriteCallbackDummy && gUnknown_02039D08->field_2204[i].sprite->callback != sub_80D1AD8)
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+bool8 sub_80D127C(void)
+{
+ s32 i;
+
+ if (gUnknown_02039D08->boxOption == BOX_OPTION_MOVE_ITEMS)
+ {
+ for (i = 0; i < 3; i++)
+ {
+ if (gUnknown_02039D08->field_2204[i].unk10 && gUnknown_02039D08->field_2204[i].unk8 == 2)
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+const u8 *GetMovingItemName(void)
+{
+ return ItemId_GetName(gUnknown_02039D08->movingItem);
+}
+
+u16 GetMovingItem(void)
+{
+ return gUnknown_02039D08->movingItem;
+}
+
+u8 sub_80D12E8(void)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (gUnknown_02039D08->field_2204[i].unk10 == 0)
+ {
+ gUnknown_02039D08->field_2204[i].unk10 = 1;
+ return i;
+ }
+ }
+
+ return 3;
+}
+
+bool32 sub_80D1324(u8 cursorArea, u8 cursorPos)
+{
+ s32 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (gUnknown_02039D08->field_2204[i].unk10
+ && gUnknown_02039D08->field_2204[i].unk8 == cursorArea
+ && gUnknown_02039D08->field_2204[i].unk9 == cursorPos)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+u8 sub_80D1370(u8 cursorArea, u8 cursorPos)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (gUnknown_02039D08->field_2204[i].unk10
+ && gUnknown_02039D08->field_2204[i].unk8 == cursorArea
+ && gUnknown_02039D08->field_2204[i].unk9 == cursorPos)
+ return i;
+ }
+
+ return 3;
+}
+
+u8 sub_80D13C4(struct Sprite *sprite)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (gUnknown_02039D08->field_2204[i].unk10
+ && gUnknown_02039D08->field_2204[i].sprite == sprite)
+ return i;
+ }
+
+ return 3;
+}