diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/item.c | 153 | ||||
-rw-r--r-- | src/item_menu.c | 237 |
2 files changed, 389 insertions, 1 deletions
diff --git a/src/item.c b/src/item.c index a5ed99a82..33aa87768 100644 --- a/src/item.c +++ b/src/item.c @@ -129,6 +129,7 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count) return TRUE; } +#ifdef NONMATCHING bool8 AddBagItem(u16 itemId, u16 count) { u8 i; @@ -193,6 +194,158 @@ bool8 AddBagItem(u16 itemId, u16 count) memcpy(gBagPockets[pocket].itemSlots, newItems, gBagPockets[pocket].capacity * sizeof(struct ItemSlot)); return TRUE; } +#else +__attribute__((naked)) +bool8 AddBagItem(u16 itemId, u16 count) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + sub sp, 0x100\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r8, r0\n\ + lsls r1, 16\n\ + lsrs r4, r1, 16\n\ + bl ItemId_GetPocket\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080A9510\n\ + mov r0, r8\n\ + bl ItemId_GetPocket\n\ + subs r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + ldr r1, _080A94F8 @ =gBagPockets\n\ + lsls r0, r6, 3\n\ + adds r5, r0, r1\n\ + ldr r1, [r5]\n\ + ldrb r2, [r5, 0x4]\n\ + lsls r2, 2\n\ + mov r0, sp\n\ + bl memcpy\n\ + ldr r7, _080A94FC @ =0x000003e7\n\ + cmp r6, 0x3\n\ + beq _080A9468\n\ + movs r7, 0x63\n\ +_080A9468:\n\ + movs r1, 0\n\ + ldrb r0, [r5, 0x4]\n\ + cmp r1, r0\n\ + bcs _080A94B2\n\ + subs r0, r6, 0x2\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r12, r0\n\ +_080A9478:\n\ + lsls r0, r1, 2\n\ + mov r2, sp\n\ + adds r3, r2, r0\n\ + ldrh r0, [r3]\n\ + cmp r0, r8\n\ + bne _080A94A6\n\ + ldrh r2, [r3, 0x2]\n\ + adds r0, r2, r4\n\ + cmp r0, r7\n\ + ble _080A9500\n\ + mov r0, r12\n\ + cmp r0, 0x1\n\ + bls _080A9510\n\ + subs r0, r7, r2\n\ + subs r0, r4, r0\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + strh r7, [r3, 0x2]\n\ + ldr r2, _080A94F8 @ =gBagPockets\n\ + mov r9, r2\n\ + lsls r3, r6, 3\n\ + cmp r4, 0\n\ + beq _080A9516\n\ +_080A94A6:\n\ + adds r0, r1, 0x1\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + ldrb r0, [r5, 0x4]\n\ + cmp r1, r0\n\ + bcc _080A9478\n\ +_080A94B2:\n\ + ldr r2, _080A94F8 @ =gBagPockets\n\ + mov r9, r2\n\ + lsls r3, r6, 3\n\ + cmp r4, 0\n\ + beq _080A9516\n\ + movs r1, 0\n\ + adds r0, r3, r2\n\ + ldrb r0, [r0, 0x4]\n\ + cmp r1, r0\n\ + bcs _080A94F2\n\ + mov r6, r9\n\ + adds r5, r3, r6\n\ +_080A94CA:\n\ + lsls r0, r1, 2\n\ + mov r6, sp\n\ + adds r2, r6, r0\n\ + ldrh r0, [r2]\n\ + cmp r0, 0\n\ + bne _080A94E6\n\ + mov r0, r8\n\ + strh r0, [r2]\n\ + cmp r4, r7\n\ + bls _080A9514\n\ + subs r0, r4, r7\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + strh r7, [r2, 0x2]\n\ +_080A94E6:\n\ + adds r0, r1, 0x1\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + ldrb r2, [r5, 0x4]\n\ + cmp r1, r2\n\ + bcc _080A94CA\n\ +_080A94F2:\n\ + cmp r4, 0\n\ + beq _080A9516\n\ + b _080A9510\n\ + .align 2, 0\n\ +_080A94F8: .4byte gBagPockets\n\ +_080A94FC: .4byte 0x000003e7\n\ +_080A9500:\n\ + strh r0, [r3, 0x2]\n\ + ldr r0, _080A950C @ =gBagPockets\n\ + lsls r1, r6, 3\n\ + adds r1, r0\n\ + b _080A951A\n\ + .align 2, 0\n\ +_080A950C: .4byte gBagPockets\n\ +_080A9510:\n\ + movs r0, 0\n\ + b _080A9528\n\ +_080A9514:\n\ + strh r4, [r2, 0x2]\n\ +_080A9516:\n\ + mov r6, r9\n\ + adds r1, r3, r6\n\ +_080A951A:\n\ + ldr r0, [r1]\n\ + ldrb r2, [r1, 0x4]\n\ + lsls r2, 2\n\ + mov r1, sp\n\ + bl memcpy\n\ + movs r0, 0x1\n\ +_080A9528:\n\ + add sp, 0x100\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif bool8 RemoveBagItem(u16 itemId, u16 count) { 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; +} |