summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/item_menu.c283
1 files changed, 280 insertions, 3 deletions
diff --git a/src/item_menu.c b/src/item_menu.c
index 3e2282583..00ba284bd 100755
--- a/src/item_menu.c
+++ b/src/item_menu.c
@@ -39,7 +39,8 @@ struct unkBagStruct {
void* unk0;
u8 unk4[0x800];
u8 unk804;
- u8 filler4[11];
+ u8 filler4;
+ u8 unk806[10];
u8 unk810[10];
u8 unk81A;
u8 unk81B:4;
@@ -92,6 +93,8 @@ extern u8 GetMenuCursorDimensionByFont(u8, u8);
extern u8 AddScrollIndicatorArrowPair(void*, void*);
extern void sub_80D6FB4(struct BagPocket*);
extern void sub_80D6F64(struct BagPocket*);
+extern u8 GetLRKeysState(void);
+extern void sub_81AC23C(u8);
void GoToBagMenu(u8 bagMenuType, u8 pocketId, void ( *postExitMenuMainCallback2)());
void CB2_Bag(void);
@@ -101,7 +104,7 @@ bool8 load_bag_menu_graphics(void);
void setup_bag_menu_textboxes(void);
void allocate_bag_item_list_buffers(void);
void load_bag_item_list_buffers(u8);
-void bag_menu_print_pocket_names(u8*, u8);
+void bag_menu_print_pocket_names(u8*, u8*);
void bag_menu_copy_pocket_name_to_window(u8);
void bag_menu_draw_pocket_indicator_square(u8, u8);
void AddBagVisualObject(u8);
@@ -129,9 +132,13 @@ void set_callback3_to_bag(u8);
void sub_81ABC54(u8, s16);
u8 bag_menu_add_window(u8);
u8 GetSwitchBagPocketDirection(void);
-void SwitchBagPocket(u8, s8, u8);
+void SwitchBagPocket(u8, s16, u16);
bool8 sub_81AC2C0(void);
void bag_menu_swap_items(u8);
+void SetBagVisualPocketId(u8, u8);
+void RemoveBagObject(u8);
+void AddSwitchPocketRotatingBallObject(s16);
+void sub_81AC10C(u8);
extern u8 *gPocketNamesStringsTable[];
extern struct BgTemplate gUnknown_08613F90[];
@@ -842,3 +849,273 @@ void set_callback3_to_bag(u8 taskId)
schedule_bg_copy_tilemap_to_vram(0);
gTasks[taskId].func = Task_BagMenu;
}
+
+u8 GetSwitchBagPocketDirection(void)
+{
+ u8 LRKeys;
+ if (gUnknown_0203CE54->unk81B != 0)
+ return 0;
+ LRKeys = GetLRKeysState();
+ if ((gMain.newKeys & DPAD_LEFT) || LRKeys == 1)
+ {
+ PlaySE(SE_SELECT);
+ return 1;
+ }
+ if ((gMain.newKeys & DPAD_RIGHT) || LRKeys == 2)
+ {
+ PlaySE(SE_SELECT);
+ return 2;
+ }
+ return 0;
+}
+
+
+void ChangeBagPocketId(u8 *bagPocketId, s8 deltaBagPocketId)
+{
+ if (deltaBagPocketId == 1 && *bagPocketId == 4)
+ *bagPocketId = 0;
+ else if (deltaBagPocketId == -1 && *bagPocketId == 0)
+ {
+ *bagPocketId = 4;
+ }
+ else
+ *bagPocketId += deltaBagPocketId;
+}
+
+#ifdef NONMATCHING
+void SwitchBagPocket(u8 taskId, s16 deltaBagPocketId, u16 a3)
+{
+ s16* data = gTasks[taskId].data;
+ u8 pocketId;
+
+
+ data[13] = 0;
+ data[12] = 0;
+ data[11] = deltaBagPocketId;
+ if (a3 == 0)
+ {
+ ClearWindowTilemap(0);
+ ClearWindowTilemap(1);
+ sub_81AE6C8(data[0], &gUnknown_0203CE58.unk12[gUnknown_0203CE58.pocket], &gUnknown_0203CE58.unk8[gUnknown_0203CE58.pocket]);
+ schedule_bg_copy_tilemap_to_vram(0);
+ gSprites[gUnknown_0203CE54->unk806[gUnknown_0203CE54->unk81B_1 ^ 1]].invisible = 1;
+ sub_81AB824();
+ }
+ pocketId = gUnknown_0203CE58.pocket;
+ ChangeBagPocketId(&pocketId, deltaBagPocketId);
+ if (deltaBagPocketId == 1)
+ {
+ bag_menu_print_pocket_names(gPocketNamesStringsTable[gUnknown_0203CE58.pocket], gPocketNamesStringsTable[pocketId]);
+ bag_menu_copy_pocket_name_to_window(0);
+ }
+ else
+ {
+ bag_menu_print_pocket_names(gPocketNamesStringsTable[pocketId], gPocketNamesStringsTable[gUnknown_0203CE58.pocket]);
+ bag_menu_copy_pocket_name_to_window(8);
+ }
+ bag_menu_draw_pocket_indicator_square(gUnknown_0203CE58.pocket, 0);
+ bag_menu_draw_pocket_indicator_square(pocketId, 1);
+ FillBgTilemapBufferRect_Palette0(2, 11, 14, 2, 15, 16);
+ schedule_bg_copy_tilemap_to_vram(2);
+ SetBagVisualPocketId(pocketId, 1);
+ RemoveBagObject(1);
+ AddSwitchPocketRotatingBallObject(deltaBagPocketId);
+ SetTaskFuncWithFollowupFunc(taskId, sub_81AC10C, gTasks[taskId].func);
+}
+#else
+__attribute__((naked))
+void SwitchBagPocket(u8 taskId, s16 deltaBagPocketId, u16 a3)
+{
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ sub sp, 0xC\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ lsls r1, 16\n\
+ lsrs r5, r1, 16\n\
+ lsls r2, 16\n\
+ lsls r0, r6, 2\n\
+ adds r0, r6\n\
+ lsls r0, 3\n\
+ ldr r1, =gTasks + 0x8\n\
+ adds r4, r0, r1\n\
+ movs r0, 0\n\
+ strh r0, [r4, 0x1A]\n\
+ strh r0, [r4, 0x18]\n\
+ strh r5, [r4, 0x16]\n\
+ cmp r2, 0\n\
+ bne _081AC026\n\
+ movs r0, 0\n\
+ bl ClearWindowTilemap\n\
+ movs r0, 0x1\n\
+ bl ClearWindowTilemap\n\
+ ldrb r0, [r4]\n\
+ ldr r3, =gUnknown_0203CE58\n\
+ ldrb r2, [r3, 0x5]\n\
+ lsls r2, 1\n\
+ adds r1, r3, 0\n\
+ adds r1, 0x12\n\
+ adds r1, r2, r1\n\
+ adds r3, 0x8\n\
+ adds r2, r3\n\
+ bl sub_81AE6C8\n\
+ movs r0, 0\n\
+ bl schedule_bg_copy_tilemap_to_vram\n\
+ ldr r3, =gSprites\n\
+ ldr r0, =gUnknown_0203CE54\n\
+ ldr r2, [r0]\n\
+ ldr r1, =0x0000081b\n\
+ adds r0, r2, r1\n\
+ ldrb r1, [r0]\n\
+ lsls r1, 26\n\
+ lsrs r1, 30\n\
+ movs r0, 0x1\n\
+ eors r0, r1\n\
+ adds r2, r0\n\
+ ldr r0, =0x00000806\n\
+ adds r2, r0\n\
+ ldrb r1, [r2]\n\
+ lsls r0, r1, 4\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r3\n\
+ adds r0, 0x3E\n\
+ ldrb r1, [r0]\n\
+ movs r2, 0x4\n\
+ orrs r1, r2\n\
+ strb r1, [r0]\n\
+ bl sub_81AB824\n\
+_081AC026:\n\
+ ldr r4, =gUnknown_0203CE58\n\
+ ldrb r1, [r4, 0x5]\n\
+ add r0, sp, 0x8\n\
+ strb r1, [r0]\n\
+ lsls r1, r5, 24\n\
+ asrs r1, 24\n\
+ bl ChangeBagPocketId\n\
+ lsls r0, r5, 16\n\
+ asrs r1, r0, 16\n\
+ adds r5, r0, 0\n\
+ cmp r1, 0x1\n\
+ bne _081AC07C\n\
+ ldr r2, =gPocketNamesStringsTable\n\
+ ldrb r0, [r4, 0x5]\n\
+ lsls r0, 2\n\
+ adds r0, r2\n\
+ ldr r0, [r0]\n\
+ add r1, sp, 0x8\n\
+ ldrb r1, [r1]\n\
+ lsls r1, 2\n\
+ adds r1, r2\n\
+ ldr r1, [r1]\n\
+ bl bag_menu_print_pocket_names\n\
+ movs r0, 0\n\
+ bl bag_menu_copy_pocket_name_to_window\n\
+ b _081AC09A\n\
+ .pool\n\
+_081AC07C:\n\
+ ldr r2, =gPocketNamesStringsTable\n\
+ add r0, sp, 0x8\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 2\n\
+ adds r0, r2\n\
+ ldr r0, [r0]\n\
+ ldrb r1, [r4, 0x5]\n\
+ lsls r1, 2\n\
+ adds r1, r2\n\
+ ldr r1, [r1]\n\
+ bl bag_menu_print_pocket_names\n\
+ movs r0, 0x8\n\
+ bl bag_menu_copy_pocket_name_to_window\n\
+_081AC09A:\n\
+ ldr r0, =gUnknown_0203CE58\n\
+ ldrb r0, [r0, 0x5]\n\
+ movs r1, 0\n\
+ bl bag_menu_draw_pocket_indicator_square\n\
+ add r0, sp, 0x8\n\
+ ldrb r0, [r0]\n\
+ movs r1, 0x1\n\
+ bl bag_menu_draw_pocket_indicator_square\n\
+ movs r0, 0xF\n\
+ str r0, [sp]\n\
+ movs r0, 0x10\n\
+ str r0, [sp, 0x4]\n\
+ movs r0, 0x2\n\
+ movs r1, 0xB\n\
+ movs r2, 0xE\n\
+ movs r3, 0x2\n\
+ bl FillBgTilemapBufferRect_Palette0\n\
+ movs r0, 0x2\n\
+ bl schedule_bg_copy_tilemap_to_vram\n\
+ add r0, sp, 0x8\n\
+ ldrb r0, [r0]\n\
+ movs r1, 0x1\n\
+ bl SetBagVisualPocketId\n\
+ movs r0, 0x1\n\
+ bl RemoveBagObject\n\
+ asrs r0, r5, 16\n\
+ bl AddSwitchPocketRotatingBallObject\n\
+ ldr r1, =sub_81AC10C\n\
+ ldr r2, =gTasks\n\
+ lsls r0, r6, 2\n\
+ adds r0, r6\n\
+ lsls r0, 3\n\
+ adds r0, r2\n\
+ ldr r2, [r0]\n\
+ adds r0, r6, 0\n\
+ bl SetTaskFuncWithFollowupFunc\n\
+ add sp, 0xC\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .pool\n\
+ .syntax divided\n");
+}
+#endif
+
+void sub_81AC10C(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ if (!sub_81221AC() && !IsWallysBag())
+ {
+ switch (GetSwitchBagPocketDirection())
+ {
+ case 1:
+ ChangeBagPocketId(&gUnknown_0203CE58.pocket, data[11]);
+ SwitchTaskToFollowupFunc(taskId);
+ SwitchBagPocket(taskId, -1, 1);
+ return;
+ case 2:
+ ChangeBagPocketId(&gUnknown_0203CE58.pocket, data[11]);
+ SwitchTaskToFollowupFunc(taskId);
+ SwitchBagPocket(taskId, 1, 1);
+ return;
+ }
+ }
+ switch (data[13])
+ {
+ case 0:
+ sub_81AC23C(data[12]);
+ if (!(++data[12] & 1))
+ {
+ if (data[11] == 1)
+ bag_menu_copy_pocket_name_to_window(data[12] >> 1);
+ else
+ bag_menu_copy_pocket_name_to_window(8 - (data[12] >> 1));
+ }
+ if (data[12] == 16)
+ data[13]++;
+ break;
+ case 1:
+ ChangeBagPocketId(&gUnknown_0203CE58.pocket, data[11]);
+ load_bag_item_list_buffers(gUnknown_0203CE58.pocket);
+ data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gUnknown_0203CE58.unk12[gUnknown_0203CE58.pocket], gUnknown_0203CE58.unk8[gUnknown_0203CE58.pocket]);
+ PutWindowTilemap(1);
+ PutWindowTilemap(2);
+ schedule_bg_copy_tilemap_to_vram(0);
+ bag_menu_add_pocket_scroll_arrow_indicators_maybe();
+ bag_menu_add_list_scroll_arrow_indicators_maybe();
+ SwitchTaskToFollowupFunc(taskId);
+ }
+}