diff options
Diffstat (limited to 'src/item_menu.c')
-rw-r--r-- | src/item_menu.c | 237 |
1 files changed, 236 insertions, 1 deletions
diff --git a/src/item_menu.c b/src/item_menu.c index bbb91296f..91853588b 100644 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -8,6 +8,8 @@ #include "palette.h" #include "rom4.h" #include "sprite.h" +#include "strings.h" +#include "strings2.h" #include "task.h" #include "text.h" #include "unknown_task.h" @@ -22,38 +24,98 @@ struct UnknownStruct1 u8 unk3; }; +extern u8 gUnknown_02038558; extern s8 gUnknown_02038559; extern u8 gUnknown_0203855A; extern u8 gUnknown_0203855B; extern u8 gUnknown_0203855C; +extern u8 gUnknown_02038562; +extern u8 gUnknown_02038564; extern u8 gUnknown_03000700; extern u8 gUnknown_03000701; +extern const u8 *gUnknown_03000704; extern struct UnknownStruct1 gUnknown_03005D10[]; extern struct ItemSlot *gUnknown_03005D24; +extern bool8 gLinkOpen; extern void gpu_pal_allocator_reset__manage_upper_four(void); extern void sub_80F9020(void); extern void sub_80F9988(); +extern void sub_809D104(u16 *, u16, u16, const u8 *, u16, u16, u16, u16); extern const struct CompressedSpriteSheet gUnknown_083C1CC8; extern const struct CompressedSpriteSheet gUnknown_083C1CD0; extern const struct CompressedSpritePalette gUnknown_083C1CD8; +const struct BagPocket gBagPockets[NUM_BAG_POCKETS] = +{ + // pointer to items, capacity + {gSaveBlock1.bagPocket_Items, 20}, + {gSaveBlock1.bagPocket_PokeBalls, 16}, + {gSaveBlock1.bagPocket_TMHM, 64}, + {gSaveBlock1.bagPocket_Berries, 46}, + {gSaveBlock1.bagPocket_KeyItems, 20}, +}; + +void sub_80A5B78(u8); +void sub_80A5F14(u8); +void sub_80A5F80(u8); +void sub_80A5FAC(u8); +void ItemMenu_UseInBattle(u8); +void sub_80A7124(u8); +void ItemMenu_Give(u8); +void sub_80A6178(u8); +void sub_80A69E0(u8); + +const struct MenuAction2 gUnknown_083C1640[] = +{ + {OtherText_Use, sub_80A5B78}, + {OtherText_Toss, sub_80A5F14}, + {gOtherText_CancelNoTerminator, sub_80A5F80}, + {OtherText_Register, sub_80A5FAC}, + {OtherText_Use, ItemMenu_UseInBattle}, + {gOtherText_CancelNoTerminator, sub_80A7124}, + {OtherText_Give2, ItemMenu_Give}, + {OtherText_CheckTag, sub_80A6178}, + {gOtherText_CancelWithTerminator, NULL}, + {OtherText_Confirm, sub_80A69E0}, +}; + +extern const u8 gUnknown_083C1690[][6]; +/* +const u8 gUnknown_083C1690[][6] = +{ + {0, 1, 6, 2, 0, 0}, + {6, 1, 8, 2, 0, 0}, + {0, 8, 6, 2, 0, 0}, + {7, 0, 1, 8, 6, 2}, + {0, 8, 3, 2, 0, 0}, +}; +*/ + void sub_80A34E8(void); bool8 sub_80A3520(void); void sub_80A362C(void); void sub_80A3740(void); +void sub_80A396C(u16 *, u8, u8, u8); void sub_80A39B8(u16 *, u8); +void sub_80A39E4(u16 *, u8, u8, s8); void sub_80A3AC0(u16 *, u8); -void sub_80A3C34(); +void sub_80A3C34(struct ItemSlot *, u32); void sub_80A3D08(void); +void sub_80A3D24(u8); void sub_80A3D40(void); void sub_80A48E8(); void ItemListMenu_InitDescription(); +void ItemListMenu_ChangeDescription(); +void sub_80A4F68(u8); +void sub_80A50C8(u8); void ItemListMenu_InitMenu(void); void sub_80A740C(void); void sub_80A751C(void); +void sub_80A7590(void); void sub_80A7630(void); +void sub_80A76A0(void); void sub_80A770C(void); void sub_80A7828(void); void sub_80A78B8(void); @@ -337,3 +399,176 @@ void ClearBag(void) ClearItemSlots(gBagPockets[i].itemSlots, gBagPockets[i].capacity); sub_80A3684(); } + +extern const u16 gUnknown_083C1704[]; + +void sub_80A3740(void) +{ + u16 arr[2]; + + // TODO: This is a local array + memcpy(arr, gUnknown_083C1704, 4); + LoadPalette(&arr[1], 0xD1, sizeof(arr[1])); + LoadPalette(&arr[0], 0xD8, sizeof(arr[0])); +} + +void sub_80A3770(void) +{ + if (gUnknown_03000701 == 0) + { + gUnknown_03000704 = gUnknown_083C1690[gUnknown_02038559]; + if (gUnknown_02038559 != 3) + gUnknown_02038564 = 4; + else + gUnknown_02038564 = 6; + } +} + +void sub_80A37C0(u8 taskId) +{ + gTasks[taskId].func = sub_80A50C8; + StartVerticalScrollIndicators(0); + StartVerticalScrollIndicators(1); + StartVerticalScrollIndicators(2); + StartVerticalScrollIndicators(3); +} + +void sub_80A37F8(u8 taskId) +{ + u8 r5 = gUnknown_0203855A; + + if (r5 < 16) + { + gUnknown_0203855A++; + sub_80A396C(gBGTilemapBuffers[2], r5, gUnknown_0203855A, 0x4F); + sub_80A39E4(gBGTilemapBuffers[2], gUnknown_02038559 + 1, gUnknown_0203855A / 2, gTasks[taskId].data[5]); + gUnknown_02038558 = 1; + sub_80A48E8(taskId, r5 / 2, gUnknown_0203855A / 2 - 1); + gUnknown_02038558 = 0; + return; + } + + if (gLinkOpen == TRUE) + { + u32 val = gUnknown_03005D10[gUnknown_02038559].unk1 + gUnknown_03005D10[gUnknown_02038559].unk0; + + ItemListMenu_ChangeDescription((s16)gUnknown_03005D24[val].itemId, gUnknown_02038562); + gUnknown_02038562++; + } + else + { + while (gUnknown_02038562 < 3) + { + u32 val = gUnknown_03005D10[gUnknown_02038559].unk1 + gUnknown_03005D10[gUnknown_02038559].unk0; + + ItemListMenu_ChangeDescription((s16)gUnknown_03005D24[val].itemId, gUnknown_02038562); + gUnknown_02038562++; + } + } + if (gUnknown_02038562 == 3) + { + gUnknown_0203855A = 16; + gUnknown_0203855B = gUnknown_02038559 + 1; + sub_80A37C0(FindTaskIdByFunc(sub_80A4F68)); + DestroyTask(taskId); + ItemListMenu_InitMenu(); + sub_80F979C(2, 0); + sub_80F979C(3, 0); + } +} + +void sub_80A3954(u16 *a) +{ + CpuCopy16(gUnknown_08E77004, a, 0x800); +} + +void sub_80A396C(u16 *a, u8 b, u8 c, u8 d) +{ + u16 *dst = a + 14 + (b + 2) * 32; + u16 i; + + while (c > b++) + { + for (i = 0; i < 15; i++) + dst[i] = d; + dst += 32; + } +} + +void sub_80A39B8(u16 *a, u8 b) +{ + u8 var = b * 2; + + sub_809D104(a, 4, 10, gUnknown_08E96EC8, 0, var, 8, 2); +} + +void sub_80A39E4(u16 *a, u8 b, u8 c, s8 d) +{ + u16 r2 = b * 2; + u16 r7; + + if (d == -1) + { + r7 = (b + 1) * 2; + if (b == 5) + r7 = 2; + + sub_809D104(a, 4, 10, gUnknown_08E96EC8, 8 - c, r2, c, 2); + sub_809D104(a, c + 4, 10, gUnknown_08E96EC8, 0, r7, 8 - c, 2); + } + else if (d == 1) + { + r7 = (b - 1) * 2; + if (b == 1) + r7 = 10; + + sub_809D104(a, 4, 10, gUnknown_08E96EC8, c, r7, 8 - c, 2); + sub_809D104(a, 12 - c, 10, gUnknown_08E96EC8, 0, r2, c, 2); + } +} + +void sub_80A3AC0(u16 *a, u8 b) +{ + u8 i; + + for (i = 0; i < 5; i++) + { + if (i == b) + a[0x125 + i] = 0x107D; + else + a[0x125 + i] = 0x107C; + } +} + +void sub_80A3B04(u16 *a, s8 b) +{ + u8 taskId; + + gUnknown_02038559 += b; + if (gUnknown_02038559 >= NUM_BAG_POCKETS) + gUnknown_02038559 = 0; + if (gUnknown_02038559 < 0) + gUnknown_02038559 = NUM_BAG_POCKETS - 1; + sub_80A76A0(); + sub_80A7590(); + gUnknown_03005D24 = gBagPockets[gUnknown_02038559].itemSlots; + sub_80A3D24(gUnknown_02038559); + gUnknown_0203855A = 0; + sub_80A3954(a); + sub_80A396C(a, 0, 16, 3); + sub_80A39B8(a, 0); + gUnknown_0203855B = 6; + gUnknown_02038562 = 0; + taskId = FindTaskIdByFunc(sub_80A37F8); + if (taskId == 0xFF) + taskId = CreateTask(sub_80A37F8, 8); + gTasks[taskId].data[5] = b; +} + +void swap32(struct ItemSlot *a, struct ItemSlot *b) +{ + struct ItemSlot temp = *a; + + *a = *b; + *b = temp; +} |