diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2019-06-20 10:17:05 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2019-06-20 10:17:05 -0400 |
commit | 715847bc37ed1e3d5188c00921c97aa3013ae94b (patch) | |
tree | e6227e43a933b43e0b524ba6333aca8c206db942 | |
parent | 649a351c4c11bf054ad67885e6f24e80fa690305 (diff) |
Finish item.c
-rw-r--r-- | asm/berry_crush_2.s | 2 | ||||
-rw-r--r-- | asm/berry_pouch.s | 2 | ||||
-rw-r--r-- | asm/item.s | 681 | ||||
-rw-r--r-- | asm/item_menu.s | 2 | ||||
-rw-r--r-- | asm/new_game.s | 2 | ||||
-rw-r--r-- | asm/player_pc.s | 4 | ||||
-rw-r--r-- | asm/shop.s | 2 | ||||
-rw-r--r-- | data/specials.inc | 4 | ||||
-rw-r--r-- | include/item.h | 8 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/berry.c | 16 | ||||
-rw-r--r-- | src/item.c | 233 | ||||
-rw-r--r-- | src/load_save.c | 4 | ||||
-rw-r--r-- | src/quest_log.c | 4 | ||||
-rw-r--r-- | src/tm_case.c | 4 |
15 files changed, 242 insertions, 727 deletions
diff --git a/asm/berry_crush_2.s b/asm/berry_crush_2.s index f5195a671..f5c170bdc 100644 --- a/asm/berry_crush_2.s +++ b/asm/berry_crush_2.s @@ -2963,7 +2963,7 @@ _0814D1D0: bl memset cmp r4, 0 bne _0814D202 - bl sub_8099FAC + bl CheckHasAtLeastOneBerry lsls r0, 24 cmp r0, 0 beq _0814D1FE diff --git a/asm/berry_pouch.s b/asm/berry_pouch.s index 63ad10a0c..8e8d14624 100644 --- a/asm/berry_pouch.s +++ b/asm/berry_pouch.s @@ -1443,7 +1443,7 @@ sub_813D8AC: @ 813D8AC push {r4,lr} ldr r4, _0813D904 @ =gBagPockets + 0x20 adds r0, r4, 0 - bl sub_809A720 + bl SortAndCompactBagPocket ldr r3, _0813D908 @ =gUnknown_203F36C ldr r1, [r3] movs r0, 0 diff --git a/asm/item.s b/asm/item.s deleted file mode 100644 index 7f3a0cbb4..000000000 --- a/asm/item.s +++ /dev/null @@ -1,681 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_809A5E4 -sub_809A5E4: @ 809A5E4 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - adds r5, r0, 0 - movs r4, 0 - bl sub_809A720 - movs r3, 0 - ldrb r0, [r5, 0x4] - cmp r3, r0 - bcs _0809A676 - movs r6, 0xA9 - lsls r6, 1 -_0809A604: - ldr r0, [r5] - lsls r1, r3, 2 - adds r2, r1, r0 - ldrh r0, [r2] - adds r7, r1, 0 - cmp r0, 0 - bne _0809A622 - adds r0, r2, 0x2 - str r3, [sp] - bl GetBagItemQuantity - lsls r0, 16 - ldr r3, [sp] - cmp r0, 0 - beq _0809A70A -_0809A622: - ldr r0, [r5] - adds r1, r7, r0 - ldrh r0, [r1] - cmp r0, r6 - bls _0809A66A - adds r0, r1, 0x2 - str r3, [sp] - bl GetBagItemQuantity - lsls r0, 16 - ldr r3, [sp] - cmp r0, 0 - beq _0809A66A - adds r0, r3, 0x1 - b _0809A642 -_0809A640: - adds r0, r4, 0x1 -_0809A642: - lsls r0, 16 - lsrs r4, r0, 16 - ldrb r1, [r5, 0x4] - cmp r4, r1 - bcs _0809A676 - ldr r0, [r5] - lsls r1, r4, 2 - adds r1, r0 - ldrh r0, [r1] - cmp r0, 0 - bne _0809A640 - adds r0, r1, 0x2 - str r3, [sp] - bl GetBagItemQuantity - lsls r0, 16 - ldr r3, [sp] - cmp r0, 0 - bne _0809A640 - b _0809A676 -_0809A66A: - adds r0, r3, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 - ldrb r2, [r5, 0x4] - cmp r3, r2 - bcc _0809A604 -_0809A676: - movs r6, 0 - lsls r7, r3, 2 - subs r4, r3 - mov r10, r4 - lsls r3, 1 - mov r9, r3 - ldrb r0, [r5, 0x4] - cmp r6, r0 - bcs _0809A6A6 -_0809A688: - lsls r4, r6, 2 - ldr r0, [r5] - adds r0, r4 - adds r0, 0x2 - bl GetBagItemQuantity - ldr r1, [r5] - adds r4, r1 - strh r0, [r4, 0x2] - adds r0, r6, 0x1 - lsls r0, 16 - lsrs r6, r0, 16 - ldrb r1, [r5, 0x4] - cmp r6, r1 - bcc _0809A688 -_0809A6A6: - ldrb r0, [r5, 0x4] - lsls r0, 2 - bl AllocZeroed - mov r8, r0 - ldr r0, [r5] - adds r0, r7 - mov r1, r10 - lsls r2, r1, 1 - ldr r4, _0809A71C @ =0x001fffff - ands r2, r4 - mov r1, r8 - bl CpuSet - ldr r0, [r5] - mov r2, r10 - lsls r1, r2, 2 - add r1, r8 - mov r2, r9 - ands r2, r4 - mov r9, r2 - bl CpuSet - ldr r1, [r5] - ldrb r2, [r5, 0x4] - lsls r2, 1 - ands r2, r4 - mov r0, r8 - bl CpuSet - movs r6, 0 - ldrb r0, [r5, 0x4] - cmp r6, r0 - bcs _0809A704 -_0809A6EA: - lsls r0, r6, 2 - ldr r1, [r5] - adds r1, r0 - adds r0, r1, 0x2 - ldrh r1, [r1, 0x2] - bl SetBagItemQuantity - adds r0, r6, 0x1 - lsls r0, 16 - lsrs r6, r0, 16 - ldrb r1, [r5, 0x4] - cmp r6, r1 - bcc _0809A6EA -_0809A704: - mov r0, r8 - bl Free -_0809A70A: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0809A71C: .4byte 0x001fffff - thumb_func_end sub_809A5E4 - - thumb_func_start sub_809A720 -sub_809A720: @ 809A720 - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r6, r0, 0 - movs r3, 0 - b _0809A786 -_0809A72C: - adds r1, r3, 0x1 - lsls r0, r1, 16 - lsrs r5, r0, 16 - mov r8, r1 - cmp r5, r2 - bcs _0809A780 - lsls r7, r3, 2 -_0809A73A: - ldr r0, [r6] - adds r0, r7 - adds r0, 0x2 - bl GetBagItemQuantity - lsls r0, 16 - lsls r4, r5, 2 - cmp r0, 0 - beq _0809A76A - ldr r0, [r6] - adds r0, r4 - adds r0, 0x2 - bl GetBagItemQuantity - lsls r0, 16 - cmp r0, 0 - beq _0809A774 - ldr r0, [r6] - adds r1, r7, r0 - adds r0, r4, r0 - ldrh r1, [r1] - ldrh r0, [r0] - cmp r1, r0 - bls _0809A774 -_0809A76A: - ldr r1, [r6] - adds r0, r1, r7 - adds r1, r4 - bl sub_809A578 -_0809A774: - adds r0, r5, 0x1 - lsls r0, 16 - lsrs r5, r0, 16 - ldrb r0, [r6, 0x4] - cmp r5, r0 - bcc _0809A73A -_0809A780: - mov r1, r8 - lsls r0, r1, 16 - lsrs r3, r0, 16 -_0809A786: - ldrb r2, [r6, 0x4] - cmp r3, r2 - bcc _0809A72C - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_809A720 - - thumb_func_start BagGetItemIdByPocketPosition -BagGetItemIdByPocketPosition: @ 809A798 - lsls r0, 24 - lsls r1, 16 - ldr r2, _0809A7B0 @ =gBagPockets - lsrs r0, 21 - subs r0, 0x8 - adds r0, r2 - ldr r0, [r0] - lsrs r1, 14 - adds r1, r0 - ldrh r0, [r1] - bx lr - .align 2, 0 -_0809A7B0: .4byte gBagPockets - thumb_func_end BagGetItemIdByPocketPosition - - thumb_func_start BagGetQuantityByPocketPosition -BagGetQuantityByPocketPosition: @ 809A7B4 - push {lr} - lsls r0, 24 - lsls r1, 16 - ldr r2, _0809A7D8 @ =gBagPockets - lsrs r0, 21 - subs r0, 0x8 - adds r0, r2 - lsrs r1, 14 - ldr r0, [r0] - adds r0, r1 - adds r0, 0x2 - bl GetBagItemQuantity - lsls r0, 16 - lsrs r0, 16 - pop {r1} - bx r1 - .align 2, 0 -_0809A7D8: .4byte gBagPockets - thumb_func_end BagGetQuantityByPocketPosition - - thumb_func_start sub_809A7DC -sub_809A7DC: @ 809A7DC - push {r4,lr} - lsls r0, 16 - lsrs r4, r0, 16 - adds r0, r4, 0 - bl ItemId_GetPocket - lsls r0, 24 - lsrs r0, 21 - ldr r1, _0809A7F4 @ =gUnknown_2039884 - adds r3, r0, r1 - movs r2, 0 - b _0809A816 - .align 2, 0 -_0809A7F4: .4byte gUnknown_2039884 -_0809A7F8: - ldr r0, [r3] - lsls r1, r2, 2 - adds r1, r0 - ldrh r0, [r1] - cmp r0, r4 - bne _0809A810 - adds r0, r1, 0x2 - bl GetBagItemQuantity - lsls r0, 16 - lsrs r0, 16 - b _0809A81E -_0809A810: - adds r0, r2, 0x1 - lsls r0, 16 - lsrs r2, r0, 16 -_0809A816: - ldrb r0, [r3, 0x4] - cmp r2, r0 - bcc _0809A7F8 - movs r0, 0 -_0809A81E: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_809A7DC - - thumb_func_start sub_809A824 -sub_809A824: @ 809A824 - push {r4,r5,lr} - lsls r0, 16 - lsrs r5, r0, 16 - ldr r1, _0809A894 @ =0xfea30000 - adds r0, r1 - lsrs r0, 16 - cmp r0, 0xD - bls _0809A85A - movs r0, 0xB7 - lsls r0, 1 - cmp r5, r0 - beq _0809A85A - adds r0, 0x2 - cmp r5, r0 - beq _0809A85A - adds r0, 0x1 - cmp r5, r0 - beq _0809A85A - adds r0, 0x3 - cmp r5, r0 - beq _0809A85A - adds r0, 0x1 - cmp r5, r0 - beq _0809A85A - adds r0, 0x1 - cmp r5, r0 - bne _0809A88C -_0809A85A: - ldr r0, _0809A898 @ =0x00000169 - cmp r5, r0 - bne _0809A86E - ldr r0, _0809A89C @ =gSaveBlock1Ptr - ldr r0, [r0] - ldrh r1, [r0, 0x4] - movs r0, 0x81 - lsls r0, 2 - cmp r1, r0 - bne _0809A88C -_0809A86E: - movs r0, 0x4 - bl Alloc - adds r4, r0, 0 - strh r5, [r4] - ldr r0, _0809A8A0 @ =gMapHeader - ldrb r0, [r0, 0x14] - strb r0, [r4, 0x2] - movs r0, 0x28 - adds r1, r4, 0 - bl sub_8113550 - adds r0, r4, 0 - bl Free -_0809A88C: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0809A894: .4byte 0xfea30000 -_0809A898: .4byte 0x00000169 -_0809A89C: .4byte gSaveBlock1Ptr -_0809A8A0: .4byte gMapHeader - thumb_func_end sub_809A824 - - thumb_func_start SanitizeItemId -SanitizeItemId: @ 809A8A4 - push {lr} - lsls r0, 16 - lsrs r1, r0, 16 - movs r0, 0xBB - lsls r0, 1 - cmp r1, r0 - bhi _0809A8B6 - adds r0, r1, 0 - b _0809A8B8 -_0809A8B6: - movs r0, 0 -_0809A8B8: - pop {r1} - bx r1 - thumb_func_end SanitizeItemId - - thumb_func_start ItemId_GetName -ItemId_GetName: @ 809A8BC - push {lr} - lsls r0, 16 - lsrs r0, 16 - bl SanitizeItemId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x2C - muls r0, r1 - ldr r1, _0809A8D8 @ =gItems - adds r0, r1 - pop {r1} - bx r1 - .align 2, 0 -_0809A8D8: .4byte gItems - thumb_func_end ItemId_GetName - - thumb_func_start itemid_get_number -itemid_get_number: @ 809A8DC - push {r4,lr} - lsls r0, 16 - lsrs r0, 16 - ldr r4, _0809A8FC @ =gItems - bl SanitizeItemId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x2C - muls r0, r1 - adds r0, r4 - ldrh r0, [r0, 0xE] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0809A8FC: .4byte gItems - thumb_func_end itemid_get_number - - thumb_func_start itemid_get_market_price -itemid_get_market_price: @ 809A900 - push {r4,lr} - lsls r0, 16 - lsrs r0, 16 - ldr r4, _0809A920 @ =gItems - bl SanitizeItemId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x2C - muls r0, r1 - adds r0, r4 - ldrh r0, [r0, 0x10] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0809A920: .4byte gItems - thumb_func_end itemid_get_market_price - - thumb_func_start ItemId_GetHoldEffect -ItemId_GetHoldEffect: @ 809A924 - push {r4,lr} - lsls r0, 16 - lsrs r0, 16 - ldr r4, _0809A944 @ =gItems - bl SanitizeItemId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x2C - muls r0, r1 - adds r0, r4 - ldrb r0, [r0, 0x12] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0809A944: .4byte gItems - thumb_func_end ItemId_GetHoldEffect - - thumb_func_start ItemId_GetHoldEffectParam -ItemId_GetHoldEffectParam: @ 809A948 - push {r4,lr} - lsls r0, 16 - lsrs r0, 16 - ldr r4, _0809A968 @ =gItems - bl SanitizeItemId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x2C - muls r0, r1 - adds r0, r4 - ldrb r0, [r0, 0x13] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0809A968: .4byte gItems - thumb_func_end ItemId_GetHoldEffectParam - - thumb_func_start ItemId_GetDescription -ItemId_GetDescription: @ 809A96C - push {r4,lr} - lsls r0, 16 - lsrs r0, 16 - ldr r4, _0809A98C @ =gItems - bl SanitizeItemId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x2C - muls r0, r1 - adds r4, 0x14 - adds r0, r4 - ldr r0, [r0] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0809A98C: .4byte gItems - thumb_func_end ItemId_GetDescription - - thumb_func_start itemid_is_unique -itemid_is_unique: @ 809A990 - push {r4,lr} - lsls r0, 16 - lsrs r0, 16 - ldr r4, _0809A9B0 @ =gItems - bl SanitizeItemId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x2C - muls r0, r1 - adds r0, r4 - ldrb r0, [r0, 0x18] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0809A9B0: .4byte gItems - thumb_func_end itemid_is_unique - - thumb_func_start itemid_get_x19 -itemid_get_x19: @ 809A9B4 - push {r4,lr} - lsls r0, 16 - lsrs r0, 16 - ldr r4, _0809A9D4 @ =gItems - bl SanitizeItemId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x2C - muls r0, r1 - adds r0, r4 - ldrb r0, [r0, 0x19] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0809A9D4: .4byte gItems - thumb_func_end itemid_get_x19 - - thumb_func_start ItemId_GetPocket -ItemId_GetPocket: @ 809A9D8 - push {r4,lr} - lsls r0, 16 - lsrs r0, 16 - ldr r4, _0809A9F8 @ =gItems - bl SanitizeItemId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x2C - muls r0, r1 - adds r0, r4 - ldrb r0, [r0, 0x1A] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0809A9F8: .4byte gItems - thumb_func_end ItemId_GetPocket - - thumb_func_start ItemId_GetType -ItemId_GetType: @ 809A9FC - push {r4,lr} - lsls r0, 16 - lsrs r0, 16 - ldr r4, _0809AA1C @ =gItems - bl SanitizeItemId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x2C - muls r0, r1 - adds r0, r4 - ldrb r0, [r0, 0x1B] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0809AA1C: .4byte gItems - thumb_func_end ItemId_GetType - - thumb_func_start ItemId_GetFieldFunc -ItemId_GetFieldFunc: @ 809AA20 - push {r4,lr} - lsls r0, 16 - lsrs r0, 16 - ldr r4, _0809AA40 @ =gItems - bl SanitizeItemId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x2C - muls r0, r1 - adds r4, 0x1C - adds r0, r4 - ldr r0, [r0] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0809AA40: .4byte gItems - thumb_func_end ItemId_GetFieldFunc - - thumb_func_start ItemId_GetBattleUsage -ItemId_GetBattleUsage: @ 809AA44 - push {r4,lr} - lsls r0, 16 - lsrs r0, 16 - ldr r4, _0809AA64 @ =gItems - bl SanitizeItemId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x2C - muls r0, r1 - adds r0, r4 - adds r0, 0x20 - ldrb r0, [r0] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0809AA64: .4byte gItems - thumb_func_end ItemId_GetBattleUsage - - thumb_func_start ItemId_GetBattleFunc -ItemId_GetBattleFunc: @ 809AA68 - push {r4,lr} - lsls r0, 16 - lsrs r0, 16 - ldr r4, _0809AA88 @ =gItems - bl SanitizeItemId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x2C - muls r0, r1 - adds r4, 0x24 - adds r0, r4 - ldr r0, [r0] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0809AA88: .4byte gItems - thumb_func_end ItemId_GetBattleFunc - - thumb_func_start ItemId_GetSecondaryId -ItemId_GetSecondaryId: @ 809AA8C - push {r4,lr} - lsls r0, 16 - lsrs r0, 16 - ldr r4, _0809AAAC @ =gItems - bl SanitizeItemId - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x2C - muls r0, r1 - adds r0, r4 - adds r0, 0x28 - ldrb r0, [r0] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_0809AAAC: .4byte gItems - thumb_func_end ItemId_GetSecondaryId - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/item_menu.s b/asm/item_menu.s index 4bad1609c..82ddfdae4 100644 --- a/asm/item_menu.s +++ b/asm/item_menu.s @@ -2069,7 +2069,7 @@ sub_8108DC8: @ 8108DC8 adds r4, r1, r0 ldr r0, [r4] ldrb r1, [r4, 0x4] - bl sub_809A584 + bl BagPocketCompaction ldr r3, _08108E40 @ =gUnknown_203AD10 ldr r0, [r3] adds r0, 0xA diff --git a/asm/new_game.s b/asm/new_game.s index 63bfd9523..234fefcd7 100644 --- a/asm/new_game.s +++ b/asm/new_game.s @@ -262,7 +262,7 @@ sub_8054A60: @ 8054A60 ldr r1, _08054B68 @ =0x00000296 adds r0, r1 strh r5, [r0] - bl sub_809A2DC + bl ClearItemSlotsInAllBagPockets bl sub_80EB658 bl sub_809C794 bl sub_80BDD34 diff --git a/asm/player_pc.s b/asm/player_pc.s index d0fd38a8c..f9d781513 100644 --- a/asm/player_pc.s +++ b/asm/player_pc.s @@ -9,7 +9,7 @@ sub_80EB658: @ 80EB658 push {r4-r6,lr} movs r4, 0 - bl sub_809A2A4 + bl ClearPCItemSlots ldr r1, _080EB6A8 @ =gUnknown_8402220 ldrh r0, [r1] cmp r0, 0 @@ -727,7 +727,7 @@ sub_80EBC38: @ 80EBC38 lsls r6, r0, 3 ldr r7, _080EBC6C @ =gTasks+0x8 adds r4, r6, r7 - bl sub_809A33C + bl CountItemsInPC lsls r0, 24 lsrs r0, 24 strh r0, [r4, 0x4] diff --git a/asm/shop.s b/asm/shop.s index dfe2544d1..c59fb15df 100644 --- a/asm/shop.s +++ b/asm/shop.s @@ -2259,7 +2259,7 @@ sub_809BCA0: @ 809BCA0 ldr r0, _0809BD40 @ =gTasks+0x8 adds r5, r0 ldrh r0, [r5, 0xA] - bl sub_809A7DC + bl BagGetQuantityByItemId adds r4, r0, 0 lsls r4, 16 lsrs r4, 16 diff --git a/data/specials.inc b/data/specials.inc index 0b00645de..96d0ef253 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -139,7 +139,7 @@ gSpecials:: @ 815FD60 def_special nullsub_75 def_special sub_80BDB1C def_special nullsub_75 - def_special sub_809A540 + def_special RegisteredItemHandleBikeSwap def_special CalculatePlayerPartyCount def_special CountPartyNonEggMons def_special CountPartyAliveNonEggMons_IgnoreVar0x8004Slot @@ -420,7 +420,7 @@ gSpecials:: @ 815FD60 def_special sub_812B478 def_special sub_812B484 def_special sub_810B82C - def_special sub_8099FAC + def_special CheckHasAtLeastOneBerry def_special sub_815F094 def_special sub_815F114 def_special sub_815EEB0 diff --git a/include/item.h b/include/item.h index 164dd674f..0f0adbca8 100644 --- a/include/item.h +++ b/include/item.h @@ -62,17 +62,17 @@ u8 ItemId_GetBattleUsage(u16 itemId); ItemUseFunc ItemId_GetBattleFunc(u16 itemId); u8 ItemId_GetSecondaryId(u16 itemId); u16 itemid_get_market_price(u16 itemId); -void sub_809A2DC(void); -void sub_809A2A4(void); +void ClearItemSlotsInAllBagPockets(void); +void ClearPCItemSlots(void); void CopyItemName(u16, u8 *); void sub_809A824(u16 itemId); bool8 AddBagItem(u16 itemId, u16 amount); -void sub_809A5E4(struct BagPocket *); +void SortPocketAndPlaceHMsFirst(struct BagPocket *); u16 BagGetItemIdByPocketPosition(u8 a0, u16 a1); u16 BagGetQuantityByPocketPosition(u8 a0, u16 a1); bool8 itemid_is_unique(u16 itemId); -void sub_809A584(struct ItemSlot * slots, u8 capacity); +void BagPocketCompaction(struct ItemSlot * slots, u8 capacity); u16 GetPcItemQuantity(u16 *); void ItemPcCompaction(void); diff --git a/ld_script.txt b/ld_script.txt index a46c10ee1..3079bca5d 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -140,7 +140,6 @@ SECTIONS { src/item_menu_icons.o(.text); asm/battle_anim_mon_movement.o(.text); src/item.o(.text); - asm/item.o(.text); asm/shop.o(.text); src/berry.o(.text); asm/script_menu.o(.text); diff --git a/src/berry.c b/src/berry.c index 5cbcd4e90..91d83f40c 100644 --- a/src/berry.c +++ b/src/berry.c @@ -5,7 +5,7 @@ extern const struct Berry sBerries[]; -#define ENIGMA_BERRY_STRUCT ({const struct Berry2 *berries = (const struct Berry2 *)sBerries;berries[ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY];}) +#define ENIGMA_BERRY_STRUCT ({const struct Berry2 *berries = (const struct Berry2 *)sBerries;berries[ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX];}) void sub_809C718(void) { @@ -136,10 +136,10 @@ bool32 IsEnigmaBerryValid(void) const struct Berry * sub_809C8A0(u8 berryIdx) { - if (berryIdx == ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY + 1 && IsEnigmaBerryValid()) + if (berryIdx == ITEM_TO_BERRY(ITEM_ENIGMA_BERRY) && IsEnigmaBerryValid()) return (struct Berry *)&gSaveBlock1Ptr->enigmaBerry.berry; - if (berryIdx == 0 || berryIdx > ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY + 1) + if (berryIdx == 0 || berryIdx > ITEM_TO_BERRY(ITEM_ENIGMA_BERRY)) berryIdx = 1; return &sBerries[berryIdx - 1]; @@ -147,18 +147,18 @@ const struct Berry * sub_809C8A0(u8 berryIdx) u8 ItemIdToBerryType(u16 itemId) { - if (itemId - ITEM_CHERI_BERRY < 0 || itemId - ITEM_CHERI_BERRY > ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY) + if (itemId - FIRST_BERRY_INDEX < 0 || itemId - FIRST_BERRY_INDEX > ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX) return 1; - return itemId - ITEM_CHERI_BERRY + 1; + return ITEM_TO_BERRY(itemId); } u16 BerryTypeToItemId(u16 berryType) { - if (berryType - 1 < 0 || berryType - 1 > ITEM_ENIGMA_BERRY - ITEM_CHERI_BERRY) - return ITEM_CHERI_BERRY; + if (berryType - 1 < 0 || berryType - 1 > ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX) + return FIRST_BERRY_INDEX; - return berryType + ITEM_CHERI_BERRY - 1; + return berryType + FIRST_BERRY_INDEX - 1; } void GetBerryNameByBerryType(u8 berryType, u8 * dest) diff --git a/src/item.c b/src/item.c index f1b7fdb6e..b46591e3d 100644 --- a/src/item.c +++ b/src/item.c @@ -4,10 +4,15 @@ #include "item.h" #include "item_use.h" #include "load_save.h" +#include "malloc.h" +#include "quest_log.h" #include "string_util.h" #include "strings.h" #include "constants/hold_effects.h" #include "constants/items.h" +#include "constants/maps.h" + +void SortAndCompactBagPocket(struct BagPocket * pocket); // Item descriptions and data #include "data/items.h" @@ -49,7 +54,7 @@ void ApplyNewEncryptionKeyToBagItems_(u32 key) { ApplyNewEncryptionKeyToBagItems(key); } -void sub_8099E44(void) +void SetBagPocketsPointers(void) { gBagPockets[POCKET_ITEMS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_Items; gBagPockets[POCKET_ITEMS - 1].capacity = BAG_ITEMS_COUNT; @@ -76,7 +81,7 @@ void CopyItemName(u16 itemId, u8 * dest) } } -s8 sub_8099ECC(u8 pocketId) +s8 BagPocketGetFirstEmptySlot(u8 pocketId) { u16 i; @@ -89,7 +94,7 @@ s8 sub_8099ECC(u8 pocketId) return -1; } -bool8 sub_8099F08(u8 pocketId) +bool8 IsPocketNotEmpty(u8 pocketId) { u8 i; @@ -132,7 +137,7 @@ bool8 CheckBagHasItem(u16 itemId, u16 count) return FALSE; } -bool8 sub_8099FAC(void) +bool8 CheckHasAtLeastOneBerry(void) { u8 itemId; bool8 exists; @@ -143,7 +148,7 @@ bool8 sub_8099FAC(void) gSpecialVar_Result = FALSE; return FALSE; } - for (itemId = ITEM_CHERI_BERRY; itemId <= ITEM_ENIGMA_BERRY; itemId++) + for (itemId = FIRST_BERRY_INDEX; itemId <= LAST_BERRY_INDEX; itemId++) { exists = CheckBagHasItem(itemId, 1); if (exists) @@ -185,7 +190,7 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count) } } - if (sub_8099ECC(pocket) != -1) + if (BagPocketGetFirstEmptySlot(pocket) != -1) return TRUE; return FALSE; @@ -225,7 +230,7 @@ bool8 AddBagItem(u16 itemId, u16 count) if (pocket == POCKET_TM_CASE - 1 && !CheckBagHasItem(ITEM_TM_CASE, 1)) { - idx = sub_8099ECC(POCKET_KEY_ITEMS - 1); + idx = BagPocketGetFirstEmptySlot(POCKET_KEY_ITEMS - 1); if (idx == -1) return FALSE; gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].itemId = ITEM_TM_CASE; @@ -234,7 +239,7 @@ bool8 AddBagItem(u16 itemId, u16 count) if (pocket == POCKET_BERRY_POUCH - 1 && !CheckBagHasItem(ITEM_BERRY_POUCH, 1)) { - idx = sub_8099ECC(POCKET_KEY_ITEMS - 1); + idx = BagPocketGetFirstEmptySlot(POCKET_KEY_ITEMS - 1); if (idx == -1) return FALSE; gBagPockets[POCKET_KEY_ITEMS - 1].itemSlots[idx].itemId = ITEM_BERRY_POUCH; @@ -245,7 +250,7 @@ bool8 AddBagItem(u16 itemId, u16 count) if (itemId == ITEM_BERRY_POUCH) FlagSet(FLAG_0x847); - idx = sub_8099ECC(pocket); + idx = BagPocketGetFirstEmptySlot(pocket); if (idx == -1) return FALSE; @@ -309,7 +314,7 @@ void ClearItemSlots(struct ItemSlot * slots, u8 capacity) } } -void sub_809A2A4(void) +void ClearPCItemSlots(void) { u16 i; @@ -320,7 +325,7 @@ void sub_809A2A4(void) } } -void sub_809A2DC(void) +void ClearItemSlotsInAllBagPockets(void) { u16 i; @@ -330,7 +335,7 @@ void sub_809A2DC(void) } } -s8 sub_809A304(void) +s8 PCItemsGetFirstEmptySlot(void) { s8 i; @@ -343,7 +348,7 @@ s8 sub_809A304(void) return -1; } -u8 sub_809A33C(void) +u8 CountItemsInPC(void) { u8 count = 0; u8 i; @@ -397,7 +402,7 @@ bool8 AddPCItem(u16 itemId, u16 count) } } - idx = sub_809A304(); + idx = PCItemsGetFirstEmptySlot(); if (idx == -1) return FALSE; @@ -448,7 +453,7 @@ void ItemPcCompaction(void) } } -void sub_809A540(void) +void RegisteredItemHandleBikeSwap(void) { switch (gSaveBlock1Ptr->registeredItem) { @@ -461,7 +466,7 @@ void sub_809A540(void) } } -void sub_809A578(struct ItemSlot * a, struct ItemSlot * b) +void SwapItemSlots(struct ItemSlot * a, struct ItemSlot * b) { struct ItemSlot c; c = *a; @@ -469,7 +474,7 @@ void sub_809A578(struct ItemSlot * a, struct ItemSlot * b) *b = c; } -void sub_809A584(struct ItemSlot * slots, u8 capacity) +void BagPocketCompaction(struct ItemSlot * slots, u8 capacity) { u16 i, j; @@ -479,8 +484,200 @@ void sub_809A584(struct ItemSlot * slots, u8 capacity) { if (GetBagItemQuantity(&slots[i].quantity) == 0) { - sub_809A578(&slots[i], &slots[j]); + SwapItemSlots(&slots[i], &slots[j]); } } } } + +void SortPocketAndPlaceHMsFirst(struct BagPocket * pocket) +{ + u16 i; + u16 j = 0; + u16 k; + struct ItemSlot * buff; + + SortAndCompactBagPocket(pocket); + + for (i = 0; i < pocket->capacity; i++) + { + if (pocket->itemSlots[i].itemId == ITEM_NONE && GetBagItemQuantity(&pocket->itemSlots[i].quantity) == 0) + return; + if (pocket->itemSlots[i].itemId >= ITEM_HM01 && GetBagItemQuantity(&pocket->itemSlots[i].quantity) != 0) + { + for (j = i + 1; j < pocket->capacity; j++) + { + if (pocket->itemSlots[j].itemId == ITEM_NONE && GetBagItemQuantity(&pocket->itemSlots[j].quantity) == 0) + break; + } + break; + } + } + + for (k = 0; k < pocket->capacity; k++) + pocket->itemSlots[k].quantity = GetBagItemQuantity(&pocket->itemSlots[k].quantity); + buff = AllocZeroed(pocket->capacity * sizeof(struct ItemSlot)); + CpuCopy16(pocket->itemSlots + i, buff, (j - i) * sizeof(struct ItemSlot)); + CpuCopy16(pocket->itemSlots, buff + (j - i), i * sizeof(struct ItemSlot)); + CpuCopy16(buff, pocket->itemSlots, pocket->capacity * sizeof(struct ItemSlot)); + for (k = 0; k < pocket->capacity; k++) + SetBagItemQuantity(&pocket->itemSlots[k].quantity, pocket->itemSlots[k].quantity); + Free(buff); +} + +void SortAndCompactBagPocket(struct BagPocket * pocket) +{ + u16 i, j; + + for (i = 0; i < pocket->capacity; i++) + { + for (j = i + 1; j < pocket->capacity; j++) + { + if (GetBagItemQuantity(&pocket->itemSlots[i].quantity) == 0 || (GetBagItemQuantity(&pocket->itemSlots[j].quantity) != 0 && pocket->itemSlots[i].itemId > pocket->itemSlots[j].itemId)) + SwapItemSlots(&pocket->itemSlots[i], &pocket->itemSlots[j]); + } + } +} + +u16 BagGetItemIdByPocketPosition(u8 pocketId, u16 slotId) +{ + return gBagPockets[pocketId - 1].itemSlots[slotId].itemId; +} + +u16 BagGetQuantityByPocketPosition(u8 pocketId, u16 slotId) +{ + return GetBagItemQuantity(&gBagPockets[pocketId - 1].itemSlots[slotId].quantity); +} + +u16 BagGetQuantityByItemId(u16 itemId) +{ + u16 i; + struct BagPocket * pocket = &gBagPockets[ItemId_GetPocket(itemId) - 1]; + + for (i = 0; i < pocket->capacity; i++) + { + if (pocket->itemSlots[i].itemId == itemId) + return GetBagItemQuantity(&pocket->itemSlots[i].quantity); + } + + return 0; +} + +void sub_809A824(u16 itemId) +{ + struct QuestLogStruct_809A824 + { + u16 itemId; + u8 mapSectionId; + } * ptr; + if + ( + itemId == ITEM_OAKS_PARCEL + || itemId == ITEM_POKE_FLUTE + || itemId == ITEM_SECRET_KEY + || itemId == ITEM_BIKE_VOUCHER + || itemId == ITEM_GOLD_TEETH + || itemId == ITEM_OLD_AMBER + || itemId == ITEM_CARD_KEY + || itemId == ITEM_LIFT_KEY + || itemId == ITEM_HELIX_FOSSIL + || itemId == ITEM_DOME_FOSSIL + || itemId == ITEM_SILPH_SCOPE + || itemId == ITEM_BICYCLE + || itemId == ITEM_TOWN_MAP + || itemId == ITEM_VS_SEEKER + || itemId == ITEM_TEACHY_TV + || itemId == ITEM_RAINBOW_PASS + || itemId == ITEM_TEA + || itemId == ITEM_POWDER_JAR + || itemId == ITEM_RUBY + || itemId == ITEM_SAPPHIRE + ) + { + if (itemId != ITEM_TOWN_MAP || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_GARYS_HOUSE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_GARYS_HOUSE))) + { + ptr = malloc(sizeof(*ptr)); + ptr->itemId = itemId; + ptr->mapSectionId = gMapHeader.regionMapSectionId; + sub_8113550(40, (void *)ptr); + free(ptr); + } + } +} + +u16 SanitizeItemId(u16 itemId) +{ + if (itemId >= ITEM_N_A) + return ITEM_NONE; + return itemId; +} + +const u8 * ItemId_GetName(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].name; +} + +u16 itemid_get_number(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].itemId; +} + +u16 itemid_get_market_price(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].price; +} + +u8 ItemId_GetHoldEffect(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].holdEffect; +} + +u8 ItemId_GetHoldEffectParam(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].holdEffectParam; +} + +const u8 * ItemId_GetDescription(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].description; +} + +bool8 itemid_is_unique(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].importance; +} + +u8 itemid_get_x19(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].exitsBagOnUse; +} + +u8 ItemId_GetPocket(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].pocket; +} + +u8 ItemId_GetType(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].type; +} + +ItemUseFunc ItemId_GetFieldFunc(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].fieldUseFunc; +} + +bool8 ItemId_GetBattleUsage(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].battleUsage; +} + +ItemUseFunc ItemId_GetBattleFunc(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].battleUseFunc; +} + +u8 ItemId_GetSecondaryId(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].secondaryId; +} diff --git a/src/load_save.c b/src/load_save.c index 6f388e451..8d09a86a8 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -7,7 +7,7 @@ #include "malloc.h" #include "item.h" -extern void sub_8099E44(void); +extern void SetBagPocketsPointers(void); extern void sub_8110840(void *oldSave); extern void sub_8055778(int); extern void sub_8054F38(u32 newKey); @@ -80,7 +80,7 @@ void SetSaveBlocksPointers(void) *sav1_LocalVar = (void*)(&gSaveBlock1) + offset; gPokemonStoragePtr = (void*)(&gPokemonStorage) + offset; - sub_8099E44(); + SetBagPocketsPointers(); sub_8110840(oldSave); } diff --git a/src/quest_log.c b/src/quest_log.c index 723323427..0021ee927 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -985,8 +985,8 @@ void sub_8111368(void) { gUnknown_203ADFA = 2; sub_806E6FC(); - sub_809A2DC(); - sub_809A2A4(); + ClearItemSlotsInAllBagPockets(); + ClearPCItemSlots(); if (sub_8110AC8() == 1) { sub_8111274(gUnknown_203ADF8, 0); diff --git a/src/tm_case.c b/src/tm_case.c index 120116c8d..28aba57a0 100644 --- a/src/tm_case.c +++ b/src/tm_case.c @@ -359,7 +359,7 @@ static bool8 DoSetUpTMCaseUI(void) gMain.state++; break; case 9: - sub_809A5E4(&gBagPockets[POCKET_TM_CASE - 1]); + SortPocketAndPlaceHMsFirst(&gBagPockets[POCKET_TM_CASE - 1]); gMain.state++; break; case 10: @@ -648,7 +648,7 @@ static void TMCaseSetup_GetTMCount(void) struct BagPocket * pocket = &gBagPockets[POCKET_TM_CASE - 1]; u16 i; - sub_809A584(pocket->itemSlots, pocket->capacity); + BagPocketCompaction(pocket->itemSlots, pocket->capacity); sTMCaseDynamicResources->numTMs = 0; for (i = 0; i < pocket->capacity; i++) { |