From 27c9ec9af6ab78a7b8736daa117d915d40c8a8ca Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Sun, 16 Aug 2026 16:28:07 -0700 Subject: [PATCH] Decomp four bag accessors; extend struct bag_items past maybeMoney Decompile from asm: GetMoneyStored 0x0201070C GetEggSpecies 0x0201077C GetUnkGameState0x13a6 0x020107AC GetEggHatchTimer 0x020107DC Each dereferences BAG_ITEMS_PTR_MIRROR and reads one field. struct bag_items in include/item.h ended at 0x13A0, immediately before every offset these four use, so it gains four fields: a word at 0x13A0, a signed halfword at 0x13A4 and halfwords at 0x13A6 and 0x13A8. The widths come from the loads -- GetEggSpecies uses ldrsh where the other two halfword readers use ldrh. The fields are placeholders rather than named after their accessors. The function names are suggestive, and a later pmdsky-debug sync can name them; the offsets and widths are facts read off the asm, which is all this commit claims. Extending a shared struct is the risk here, so it was checked rather than assumed. The four fields are appended past the end, after maybeMoney, so no existing member moves. All four translation units that use struct bag_items -- dungeon_ai_items.c, main_0200ECFC.c, main_0200EDC0.c and overlay_31_02383478.c -- are rebuilt by this commit's build and the ROM still matches. The two constants the target splits the offset into differ per function (0x1300 + 0xa8 against 0x1000 + 0x3a0) because each is a valid ARM immediate encoding of the same address; the compiler reproduces the choice from the field offset alone. No comments are added to any pmd-sky file. Authored by Claude (Opus 5) under human direction. Confirmed by a matching build: build/pmdsky.us/pmdsky.us.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/main_0200EDFC.inc | 12 - asm/include/main_02010724.inc | 2 + asm/include/main_02010794.inc | 2 + asm/include/main_020107C4.inc | 2 + asm/include/main_020107F4.inc | 14 + asm/main_0200EDFC.s | 718 ---------------------------------- asm/main_02010724.s | 37 ++ asm/main_02010794.s | 15 + asm/main_020107C4.s | 15 + asm/main_020107F4.s | 623 +++++++++++++++++++++++++++++ include/item.h | 4 + include/main_0201070C.h | 6 + include/main_0201077C.h | 6 + include/main_020107AC.h | 6 + include/main_020107DC.h | 6 + main.lsf | 8 + src/main_0201070C.c | 9 + src/main_0201077C.c | 9 + src/main_020107AC.c | 9 + src/main_020107DC.c | 9 + 20 files changed, 782 insertions(+), 730 deletions(-) create mode 100644 asm/include/main_02010724.inc create mode 100644 asm/include/main_02010794.inc create mode 100644 asm/include/main_020107C4.inc create mode 100644 asm/include/main_020107F4.inc create mode 100644 asm/main_02010724.s create mode 100644 asm/main_02010794.s create mode 100644 asm/main_020107C4.s create mode 100644 asm/main_020107F4.s create mode 100644 include/main_0201070C.h create mode 100644 include/main_0201077C.h create mode 100644 include/main_020107AC.h create mode 100644 include/main_020107DC.h create mode 100644 src/main_0201070C.c create mode 100644 src/main_0201077C.c create mode 100644 src/main_020107AC.c create mode 100644 src/main_020107DC.c diff --git a/asm/include/main_0200EDFC.inc b/asm/include/main_0200EDFC.inc index 0f73fa0f..abc6c954 100644 --- a/asm/include/main_0200EDFC.inc +++ b/asm/include/main_0200EDFC.inc @@ -3,31 +3,19 @@ .public AreItemsEquivalent .public BAG_ITEMS_PTR_MIRROR .public BulkItemToItem -.public EXCLUSIVE_ITEM_ATTACK_BOOSTS -.public EXCLUSIVE_ITEM_DEFENSE_BOOSTS -.public EXCLUSIVE_ITEM_SPECIAL_ATTACK_BOOSTS -.public EXCLUSIVE_ITEM_SPECIAL_DEFENSE_BOOSTS -.public EXCLUSIVE_ITEM_STAT_BOOST_DATA_INDEXES .public GetCurrentBagCapacity -.public GetItemCategory .public GetItemCategoryVeneer -.public GetItemIdFromList .public GetMoneyQuantity .public GetRankStorageSize -.public InitBulkItem .public IsItemInTimeDarkness .public IsItemValidVeneer .public IsStorableItem .public IsThrownItem .public IsTreasureBox .public ItemZInit -.public KECLEON_SHOP_ITEM_TABLE_LISTS_1 -.public KECLEON_SHOP_ITEM_TABLE_LISTS_2 .public MemAlloc .public MemFree -.public RandIntSafe .public RemoveEmptyItems .public SetItemAcquired .public SortItemList -.public sub_0200D1F0 .public sub_020582E0 diff --git a/asm/include/main_02010724.inc b/asm/include/main_02010724.inc new file mode 100644 index 00000000..0b50efa5 --- /dev/null +++ b/asm/include/main_02010724.inc @@ -0,0 +1,2 @@ +#pragma once +.public BAG_ITEMS_PTR_MIRROR diff --git a/asm/include/main_02010794.inc b/asm/include/main_02010794.inc new file mode 100644 index 00000000..0b50efa5 --- /dev/null +++ b/asm/include/main_02010794.inc @@ -0,0 +1,2 @@ +#pragma once +.public BAG_ITEMS_PTR_MIRROR diff --git a/asm/include/main_020107C4.inc b/asm/include/main_020107C4.inc new file mode 100644 index 00000000..0b50efa5 --- /dev/null +++ b/asm/include/main_020107C4.inc @@ -0,0 +1,2 @@ +#pragma once +.public BAG_ITEMS_PTR_MIRROR diff --git a/asm/include/main_020107F4.inc b/asm/include/main_020107F4.inc new file mode 100644 index 00000000..c3dbbfee --- /dev/null +++ b/asm/include/main_020107F4.inc @@ -0,0 +1,14 @@ +#pragma once +.public BAG_ITEMS_PTR_MIRROR +.public EXCLUSIVE_ITEM_ATTACK_BOOSTS +.public EXCLUSIVE_ITEM_DEFENSE_BOOSTS +.public EXCLUSIVE_ITEM_SPECIAL_ATTACK_BOOSTS +.public EXCLUSIVE_ITEM_SPECIAL_DEFENSE_BOOSTS +.public EXCLUSIVE_ITEM_STAT_BOOST_DATA_INDEXES +.public GetItemCategory +.public GetItemIdFromList +.public InitBulkItem +.public KECLEON_SHOP_ITEM_TABLE_LISTS_1 +.public KECLEON_SHOP_ITEM_TABLE_LISTS_2 +.public RandIntSafe +.public sub_0200D1F0 diff --git a/asm/main_0200EDFC.s b/asm/main_0200EDFC.s index f0c86223..fa357537 100644 --- a/asm/main_0200EDFC.s +++ b/asm/main_0200EDFC.s @@ -2062,721 +2062,3 @@ SetActiveKecleonShop: ; 0x020106C4 .align 2, 0 _02010708: .word BAG_ITEMS_PTR_MIRROR arm_func_end SetActiveKecleonShop - - arm_func_start GetMoneyStored -GetMoneyStored: ; 0x0201070C - ldr r0, _02010720 ; =BAG_ITEMS_PTR_MIRROR - ldr r0, [r0] - add r0, r0, #0x1000 - ldr r0, [r0, #0x3a0] - bx lr - .align 2, 0 -_02010720: .word BAG_ITEMS_PTR_MIRROR - arm_func_end GetMoneyStored - - arm_func_start SetMoneyStored -SetMoneyStored: ; 0x02010724 - ldr r1, _02010750 ; =0x0098967F - cmp r0, r1 - movgt r0, r1 - bgt _0201073C - cmp r0, #0 - movlt r0, #0 -_0201073C: - ldr r1, _02010754 ; =BAG_ITEMS_PTR_MIRROR - ldr r1, [r1] - add r1, r1, #0x1000 - str r0, [r1, #0x3a0] - bx lr - .align 2, 0 -_02010750: .word 0x0098967F -_02010754: .word BAG_ITEMS_PTR_MIRROR - arm_func_end SetMoneyStored - - arm_func_start AddMoneyStored -AddMoneyStored: ; 0x02010758 - ldr r1, _02010774 ; =BAG_ITEMS_PTR_MIRROR - ldr ip, _02010778 ; =SetMoneyStored - ldr r1, [r1] - add r1, r1, #0x1000 - ldr r1, [r1, #0x3a0] - add r0, r1, r0 - bx ip - .align 2, 0 -_02010774: .word BAG_ITEMS_PTR_MIRROR -_02010778: .word SetMoneyStored - arm_func_end AddMoneyStored - - arm_func_start GetEggSpecies -GetEggSpecies: ; 0x0201077C - ldr r0, _02010790 ; =BAG_ITEMS_PTR_MIRROR - ldr r0, [r0] - add r0, r0, #0x1300 - ldrsh r0, [r0, #0xa4] - bx lr - .align 2, 0 -_02010790: .word BAG_ITEMS_PTR_MIRROR - arm_func_end GetEggSpecies - - arm_func_start SetEggSpecies -SetEggSpecies: ; 0x02010794 - ldr r1, _020107A8 ; =BAG_ITEMS_PTR_MIRROR - ldr r1, [r1] - add r1, r1, #0x1300 - strh r0, [r1, #0xa4] - bx lr - .align 2, 0 -_020107A8: .word BAG_ITEMS_PTR_MIRROR - arm_func_end SetEggSpecies - - arm_func_start GetUnkGameState0x13a6 -GetUnkGameState0x13a6: ; 0x020107AC - ldr r0, _020107C0 ; =BAG_ITEMS_PTR_MIRROR - ldr r0, [r0] - add r0, r0, #0x1300 - ldrh r0, [r0, #0xa6] - bx lr - .align 2, 0 -_020107C0: .word BAG_ITEMS_PTR_MIRROR - arm_func_end GetUnkGameState0x13a6 - - arm_func_start SetUnkGameState0x13a6 -SetUnkGameState0x13a6: ; 0x020107C4 - ldr r1, _020107D8 ; =BAG_ITEMS_PTR_MIRROR - ldr r1, [r1] - add r1, r1, #0x1300 - strh r0, [r1, #0xa6] - bx lr - .align 2, 0 -_020107D8: .word BAG_ITEMS_PTR_MIRROR - arm_func_end SetUnkGameState0x13a6 - - arm_func_start GetEggHatchTimer -GetEggHatchTimer: ; 0x020107DC - ldr r0, _020107F0 ; =BAG_ITEMS_PTR_MIRROR - ldr r0, [r0] - add r0, r0, #0x1300 - ldrh r0, [r0, #0xa8] - bx lr - .align 2, 0 -_020107F0: .word BAG_ITEMS_PTR_MIRROR - arm_func_end GetEggHatchTimer - - arm_func_start SetEggHatchTimer -SetEggHatchTimer: ; 0x020107F4 - ldr r1, _02010808 ; =BAG_ITEMS_PTR_MIRROR - ldr r1, [r1] - add r1, r1, #0x1300 - strh r0, [r1, #0xa8] - bx lr - .align 2, 0 -_02010808: .word BAG_ITEMS_PTR_MIRROR - arm_func_end SetEggHatchTimer - - arm_func_start DecrementEggHatchTimer -DecrementEggHatchTimer: ; 0x0201080C - ldr r0, _0201082C ; =BAG_ITEMS_PTR_MIRROR - ldr r0, [r0] - add r0, r0, #0x1300 - ldrh r1, [r0, #0xa8] - cmp r1, #0 - subne r1, r1, #1 - strneh r1, [r0, #0xa8] - bx lr - .align 2, 0 -_0201082C: .word BAG_ITEMS_PTR_MIRROR - arm_func_end DecrementEggHatchTimer - - arm_func_start RemoveInvalidKecleonShop1Items -RemoveInvalidKecleonShop1Items: ; 0x02010830 - ldr r1, _02010868 ; =BAG_ITEMS_PTR_MIRROR - mov r0, #0 - ldr r1, [r1] - mov r2, r0 - add r1, r1, #0x1000 - ldr r3, [r1, #0x32c] -_02010848: - mov r1, r2, lsl #2 - ldrsh r1, [r3, r1] - add r2, r2, #1 - cmp r1, #0 - addne r0, r0, #1 - cmp r2, #8 - blt _02010848 - bx lr - .align 2, 0 -_02010868: .word BAG_ITEMS_PTR_MIRROR - arm_func_end RemoveInvalidKecleonShop1Items - - arm_func_start RemoveItemFromKecleonShop1 -RemoveItemFromKecleonShop1: ; 0x0201086C - ldr r1, _02010894 ; =BAG_ITEMS_PTR_MIRROR - mov r3, r0, lsl #2 - ldr r1, [r1] - mov r2, #0 - add r1, r1, #0x1000 - ldr r1, [r1, #0x32c] - strh r2, [r1, r3] - add r0, r1, r0, lsl #2 - strh r2, [r0, #2] - bx lr - .align 2, 0 -_02010894: .word BAG_ITEMS_PTR_MIRROR - arm_func_end RemoveItemFromKecleonShop1 - - arm_func_start GetCurrentKecleonShop1ItemByIndex -GetCurrentKecleonShop1ItemByIndex: ; 0x02010898 - ldr r1, _020108B0 ; =BAG_ITEMS_PTR_MIRROR - ldr r1, [r1] - add r1, r1, #0x1000 - ldr r1, [r1, #0x32c] - add r0, r1, r0, lsl #2 - bx lr - .align 2, 0 -_020108B0: .word BAG_ITEMS_PTR_MIRROR - arm_func_end GetCurrentKecleonShop1ItemByIndex - - arm_func_start sub_020108B4 -sub_020108B4: ; 0x020108B4 - stmdb sp!, {r3, r4, r5, lr} - mov r0, #0 - mov r4, r0 - ldr r2, _02010950 ; =BAG_ITEMS_PTR_MIRROR - b _020108E8 -_020108C8: - ldr r1, [r2] - mov r3, r0, lsl #2 - add r1, r1, #0x1000 - ldr r1, [r1, #0x32c] - ldrsh r1, [r1, r3] - cmp r1, #0 - bne _020108F0 - add r0, r0, #1 -_020108E8: - cmp r0, #8 - blt _020108C8 -_020108F0: - cmp r0, #8 - beq _02010944 - cmp r0, r4 - ble _0201092C - ldr r1, [r2] - mov r3, r0, lsl #2 - add r1, r1, #0x1000 - ldr r5, [r1, #0x32c] - mov lr, r4, lsl #2 - ldrh r1, [r5, r3] - add ip, r5, r0, lsl #2 - add r3, r5, r4, lsl #2 - strh r1, [r5, lr] - ldrh r1, [ip, #2] - strh r1, [r3, #2] -_0201092C: - add r0, r0, #1 - add r4, r4, #1 - b _020108E8 -_02010938: - and r0, r4, #0xff - bl RemoveItemFromKecleonShop1 - add r4, r4, #1 -_02010944: - cmp r4, #8 - blt _02010938 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_02010950: .word BAG_ITEMS_PTR_MIRROR - arm_func_end sub_020108B4 - - arm_func_start SortKecleonItems1 -SortKecleonItems1: ; 0x02010954 - stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} - sub sp, sp, #4 - mov r6, #0 -_02010960: - add r7, r6, #1 - mov r5, r6, lsl #2 - ldr r4, _02010A48 ; =BAG_ITEMS_PTR_MIRROR - b _02010A2C -_02010970: - ldr r0, [r4] - add r0, r0, #0x1000 - ldr r0, [r0, #0x32c] - ldrsh r0, [r5, r0] - bl sub_0200D1F0 - ldr r1, [r4] - mov r2, r7, lsl #2 - add r1, r1, #0x1000 - ldr r1, [r1, #0x32c] - mov r8, r0 - ldrsh r0, [r1, r2] - bl sub_0200D1F0 - cmp r8, r0 - bgt _020109D0 - bne _02010A28 - ldr r0, [r4] - add r0, r0, #0x1000 - ldr r0, [r0, #0x32c] - add r1, r5, r0 - add r0, r0, r7, lsl #2 - ldrh r1, [r1, #2] - ldrh r0, [r0, #2] - cmp r1, r0 - bhs _02010A28 -_020109D0: - ldr r1, [r4] - mov r0, r7, lsl #2 - add r1, r1, #0x1000 - ldr r8, [r1, #0x32c] - add lr, r5, r8 - ldrh ip, [r5, r8] - ldrh r3, [lr, #2] - ldrh r1, [r8, r0] - add r2, r8, r7, lsl #2 - strh ip, [sp] - strh r1, [r5, r8] - ldrh r1, [r2, #2] - strh r3, [sp, #2] - ldrh r3, [sp] - strh r1, [lr, #2] - ldr r1, [r4] - ldrh r2, [sp, #2] - add r1, r1, #0x1000 - ldr r1, [r1, #0x32c] - strh r3, [r1, r0] - add r0, r1, r7, lsl #2 - strh r2, [r0, #2] -_02010A28: - add r7, r7, #1 -_02010A2C: - cmp r7, #8 - blt _02010970 - add r6, r6, #1 - cmp r6, #7 - blt _02010960 - add sp, sp, #4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} - .align 2, 0 -_02010A48: .word BAG_ITEMS_PTR_MIRROR - arm_func_end SortKecleonItems1 - - arm_func_start GenerateKecleonItems1 -GenerateKecleonItems1: ; 0x02010A4C - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r8, r0 - mov r4, #0 -_02010A58: - and r0, r4, #0xff - bl RemoveItemFromKecleonShop1 - add r4, r4, #1 - cmp r4, #8 - blt _02010A58 - ldr r0, _02010AC0 ; =KECLEON_SHOP_ITEM_TABLE_LISTS_1 - ldr r5, _02010AC4 ; =0x0000270F - ldr r6, [r0, r8, lsl #2] - mov r7, #0 -_02010A7C: - mov r0, r5 - bl RandIntSafe - mov r4, r0 - mov r0, r5 - bl RandIntSafe - mov r2, r0 - mov r0, r6 - mov r1, r4 - bl GetItemIdFromList - bl AddItemToKecleonShop1 - add r7, r7, #1 - cmp r7, #8 - blt _02010A7C - bl SortKecleonItems1 - mov r0, r8 - bl GenerateKecleonItems2 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_02010AC0: .word KECLEON_SHOP_ITEM_TABLE_LISTS_1 -_02010AC4: .word 0x0000270F - arm_func_end GenerateKecleonItems1 - - arm_func_start AddItemToKecleonShop1 -AddItemToKecleonShop1: ; 0x02010AC8 - stmdb sp!, {r3, lr} - mov r1, r0 - add r0, sp, #0 - bl InitBulkItem - ldr r0, _02010B38 ; =BAG_ITEMS_PTR_MIRROR - mov r2, #0 - ldr r3, [r0] - add r0, r3, #0x1000 - b _02010B28 -_02010AEC: - ldr r1, [r0, #0x32c] - mov ip, r2, lsl #2 - ldrsh r1, [r1, ip] - cmp r1, #0 - bne _02010B24 - add r0, r3, #0x1000 - ldr r3, [r0, #0x32c] - ldrh r1, [sp] - add r2, r3, ip - mov r0, #0 - strh r1, [r3, ip] - ldrh r1, [sp, #2] - strh r1, [r2, #2] - ldmia sp!, {r3, pc} -_02010B24: - add r2, r2, #1 -_02010B28: - cmp r2, #8 - blt _02010AEC - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_02010B38: .word BAG_ITEMS_PTR_MIRROR - arm_func_end AddItemToKecleonShop1 - - arm_func_start RemoveInvalidKecleonShop2Items -RemoveInvalidKecleonShop2Items: ; 0x02010B3C - ldr r1, _02010B74 ; =BAG_ITEMS_PTR_MIRROR - mov r0, #0 - ldr r1, [r1] - mov r2, r0 - add r1, r1, #0x1000 - ldr r3, [r1, #0x370] -_02010B54: - mov r1, r2, lsl #2 - ldrsh r1, [r3, r1] - add r2, r2, #1 - cmp r1, #0 - addne r0, r0, #1 - cmp r2, #4 - blt _02010B54 - bx lr - .align 2, 0 -_02010B74: .word BAG_ITEMS_PTR_MIRROR - arm_func_end RemoveInvalidKecleonShop2Items - - arm_func_start RemoveItemFromKecleonShop2 -RemoveItemFromKecleonShop2: ; 0x02010B78 - ldr r1, _02010BA0 ; =BAG_ITEMS_PTR_MIRROR - mov r3, r0, lsl #2 - ldr r1, [r1] - mov r2, #0 - add r1, r1, #0x1000 - ldr r1, [r1, #0x370] - strh r2, [r1, r3] - add r0, r1, r0, lsl #2 - strh r2, [r0, #2] - bx lr - .align 2, 0 -_02010BA0: .word BAG_ITEMS_PTR_MIRROR - arm_func_end RemoveItemFromKecleonShop2 - - arm_func_start GetCurrentKecleonShop2ItemByIndex -GetCurrentKecleonShop2ItemByIndex: ; 0x02010BA4 - ldr r1, _02010BBC ; =BAG_ITEMS_PTR_MIRROR - ldr r1, [r1] - add r1, r1, #0x1000 - ldr r1, [r1, #0x370] - add r0, r1, r0, lsl #2 - bx lr - .align 2, 0 -_02010BBC: .word BAG_ITEMS_PTR_MIRROR - arm_func_end GetCurrentKecleonShop2ItemByIndex - - arm_func_start sub_02010BC0 -sub_02010BC0: ; 0x02010BC0 - stmdb sp!, {r3, r4, r5, lr} - mov r0, #0 - mov r4, r0 - ldr r2, _02010C5C ; =BAG_ITEMS_PTR_MIRROR - b _02010BF4 -_02010BD4: - ldr r1, [r2] - mov r3, r0, lsl #2 - add r1, r1, #0x1000 - ldr r1, [r1, #0x370] - ldrsh r1, [r1, r3] - cmp r1, #0 - bne _02010BFC - add r0, r0, #1 -_02010BF4: - cmp r0, #4 - blt _02010BD4 -_02010BFC: - cmp r0, #4 - beq _02010C50 - cmp r0, r4 - ble _02010C38 - ldr r1, [r2] - mov r3, r0, lsl #2 - add r1, r1, #0x1000 - ldr r5, [r1, #0x370] - mov lr, r4, lsl #2 - ldrh r1, [r5, r3] - add ip, r5, r0, lsl #2 - add r3, r5, r4, lsl #2 - strh r1, [r5, lr] - ldrh r1, [ip, #2] - strh r1, [r3, #2] -_02010C38: - add r0, r0, #1 - add r4, r4, #1 - b _02010BF4 -_02010C44: - and r0, r4, #0xff - bl RemoveItemFromKecleonShop2 - add r4, r4, #1 -_02010C50: - cmp r4, #4 - blt _02010C44 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_02010C5C: .word BAG_ITEMS_PTR_MIRROR - arm_func_end sub_02010BC0 - - arm_func_start SortKecleonItems2 -SortKecleonItems2: ; 0x02010C60 - stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} - sub sp, sp, #4 - mov r6, #0 -_02010C6C: - add r7, r6, #1 - mov r5, r6, lsl #2 - ldr r4, _02010D54 ; =BAG_ITEMS_PTR_MIRROR - b _02010D38 -_02010C7C: - ldr r0, [r4] - add r0, r0, #0x1000 - ldr r0, [r0, #0x370] - ldrsh r0, [r5, r0] - bl sub_0200D1F0 - ldr r1, [r4] - mov r2, r7, lsl #2 - add r1, r1, #0x1000 - ldr r1, [r1, #0x370] - mov r8, r0 - ldrsh r0, [r1, r2] - bl sub_0200D1F0 - cmp r8, r0 - bgt _02010CDC - bne _02010D34 - ldr r0, [r4] - add r0, r0, #0x1000 - ldr r0, [r0, #0x370] - add r1, r5, r0 - add r0, r0, r7, lsl #2 - ldrh r1, [r1, #2] - ldrh r0, [r0, #2] - cmp r1, r0 - bhs _02010D34 -_02010CDC: - ldr r1, [r4] - mov r0, r7, lsl #2 - add r1, r1, #0x1000 - ldr r8, [r1, #0x370] - add lr, r5, r8 - ldrh ip, [r5, r8] - ldrh r3, [lr, #2] - ldrh r1, [r8, r0] - add r2, r8, r7, lsl #2 - strh ip, [sp] - strh r1, [r5, r8] - ldrh r1, [r2, #2] - strh r3, [sp, #2] - ldrh r3, [sp] - strh r1, [lr, #2] - ldr r1, [r4] - ldrh r2, [sp, #2] - add r1, r1, #0x1000 - ldr r1, [r1, #0x370] - strh r3, [r1, r0] - add r0, r1, r7, lsl #2 - strh r2, [r0, #2] -_02010D34: - add r7, r7, #1 -_02010D38: - cmp r7, #4 - blt _02010C7C - add r6, r6, #1 - cmp r6, #3 - blt _02010C6C - add sp, sp, #4 - ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} - .align 2, 0 -_02010D54: .word BAG_ITEMS_PTR_MIRROR - arm_func_end SortKecleonItems2 - - arm_func_start GenerateKecleonItems2 -GenerateKecleonItems2: ; 0x02010D58 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r5, r0 - mov r4, #0 -_02010D64: - and r0, r4, #0xff - bl RemoveItemFromKecleonShop2 - add r4, r4, #1 - cmp r4, #4 - blt _02010D64 - ldr r0, _02010DC4 ; =KECLEON_SHOP_ITEM_TABLE_LISTS_2 - mov r7, #0 - ldr r6, [r0, r5, lsl #2] - ldr r5, _02010DC8 ; =0x0000270F -_02010D88: - mov r0, r5 - bl RandIntSafe - mov r4, r0 - mov r0, r5 - bl RandIntSafe - mov r2, r0 - mov r0, r6 - mov r1, r4 - bl GetItemIdFromList - bl AddItemToKecleonShop2 - add r7, r7, #1 - cmp r7, #4 - blt _02010D88 - bl SortKecleonItems2 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_02010DC4: .word KECLEON_SHOP_ITEM_TABLE_LISTS_2 -_02010DC8: .word 0x0000270F - arm_func_end GenerateKecleonItems2 - - arm_func_start AddItemToKecleonShop2 -AddItemToKecleonShop2: ; 0x02010DCC - stmdb sp!, {r3, lr} - mov r1, r0 - add r0, sp, #0 - bl InitBulkItem - ldr r0, _02010E3C ; =BAG_ITEMS_PTR_MIRROR - mov r2, #0 - ldr r3, [r0] - add r0, r3, #0x1000 - b _02010E2C -_02010DF0: - ldr r1, [r0, #0x370] - mov ip, r2, lsl #2 - ldrsh r1, [r1, ip] - cmp r1, #0 - bne _02010E28 - add r0, r3, #0x1000 - ldr r3, [r0, #0x370] - ldrh r1, [sp] - add r2, r3, ip - mov r0, #0 - strh r1, [r3, ip] - ldrh r1, [sp, #2] - strh r1, [r2, #2] - ldmia sp!, {r3, pc} -_02010E28: - add r2, r2, #1 -_02010E2C: - cmp r2, #4 - blt _02010DF0 - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_02010E3C: .word BAG_ITEMS_PTR_MIRROR - arm_func_end AddItemToKecleonShop2 - - arm_func_start GetExclusiveItemOffset -GetExclusiveItemOffset: ; 0x02010E40 - stmdb sp!, {r4, lr} - mov r4, r0 - bl GetItemCategory - cmp r0, #0xf - movne r0, #0 - subeq r0, r4, #0x1bc - moveq r0, r0, lsl #0x10 - moveq r0, r0, asr #0x10 - ldmia sp!, {r4, pc} - arm_func_end GetExclusiveItemOffset - - arm_func_start ApplyExclusiveItemStatBoosts -ApplyExclusiveItemStatBoosts: ; 0x02010E64 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - sub sp, sp, #8 - mov r7, r1 - mov r6, r2 - mov r5, r3 - ldr r4, [sp, #0x28] - bl GetExclusiveItemOffset - ldr r1, _02010F6C ; =EXCLUSIVE_ITEM_STAT_BOOST_DATA_INDEXES - ldrb r2, [r7] - ldrb r1, [r1, r0, lsl #1] - ldrb r0, [r4] - strh r2, [sp, #4] - ldrb r2, [r5] - strh r0, [sp, #2] - ldrb r3, [r6] - ldr r0, _02010F70 ; =EXCLUSIVE_ITEM_ATTACK_BOOSTS - mov r1, r1, lsl #2 - strh r3, [sp, #6] - strh r2, [sp] - ldrsb r2, [r0, r1] - ldr r0, _02010F74 ; =EXCLUSIVE_ITEM_SPECIAL_ATTACK_BOOSTS - ldrh sb, [sp, #4] - ldrsb r8, [r0, r1] - mov r0, r2, lsl #0x10 - add r0, sb, r0, lsr #16 - strh r0, [sp, #4] - mov r0, r8, lsl #0x10 - ldrh lr, [sp, #6] - ldrh r2, [sp, #4] - ldr ip, _02010F78 ; =EXCLUSIVE_ITEM_DEFENSE_BOOSTS - add r0, lr, r0, lsr #16 - ldrsb lr, [ip, r1] - ldr r3, _02010F7C ; =EXCLUSIVE_ITEM_SPECIAL_DEFENSE_BOOSTS - ldrsh ip, [sp, #2] - ldrsb r1, [r3, r1] - strh r0, [sp, #6] - ldrsh r8, [sp] - add r0, ip, r1 - strh r0, [sp, #2] - cmp r2, #0xff - movhi r0, #0xff - strhih r0, [sp, #4] - ldrh r0, [sp, #6] - add r3, r8, lr - ldrh r2, [sp, #4] - cmp r0, #0xff - movhi r0, #0xff - strh r3, [sp] - strhih r0, [sp, #6] - ldrsh r0, [sp] - strb r2, [r7] - cmp r0, #0xff - movgt r0, #0xff - strgth r0, [sp] - ldrsh r0, [sp, #2] - ldrsh r1, [sp] - cmp r0, #0xff - movgt r0, #0xff - strgth r0, [sp, #2] - ldrh r0, [sp, #6] - strb r0, [r6] - ldrsh r0, [sp, #2] - strb r1, [r5] - strb r0, [r4] - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_02010F6C: .word EXCLUSIVE_ITEM_STAT_BOOST_DATA_INDEXES -_02010F70: .word EXCLUSIVE_ITEM_ATTACK_BOOSTS -_02010F74: .word EXCLUSIVE_ITEM_SPECIAL_ATTACK_BOOSTS -_02010F78: .word EXCLUSIVE_ITEM_DEFENSE_BOOSTS -_02010F7C: .word EXCLUSIVE_ITEM_SPECIAL_DEFENSE_BOOSTS - arm_func_end ApplyExclusiveItemStatBoosts - - arm_func_start SetExclusiveItemEffect -SetExclusiveItemEffect: ; 0x02010F80 - cmp r1, #0 - bxeq lr - mov ip, r1, lsr #5 - ldr r3, [r0, ip, lsl #2] - sub r1, r1, ip, lsl #5 - mov r2, #1 - orr r1, r3, r2, lsl r1 - str r1, [r0, ip, lsl #2] - bx lr - arm_func_end SetExclusiveItemEffect diff --git a/asm/main_02010724.s b/asm/main_02010724.s new file mode 100644 index 00000000..7b90a22d --- /dev/null +++ b/asm/main_02010724.s @@ -0,0 +1,37 @@ + .include "asm/macros.inc" + .include "main_02010724.inc" + + .text + + arm_func_start SetMoneyStored +SetMoneyStored: ; 0x02010724 + ldr r1, _02010750 ; =0x0098967F + cmp r0, r1 + movgt r0, r1 + bgt _0201073C + cmp r0, #0 + movlt r0, #0 +_0201073C: + ldr r1, _02010754 ; =BAG_ITEMS_PTR_MIRROR + ldr r1, [r1] + add r1, r1, #0x1000 + str r0, [r1, #0x3a0] + bx lr + .align 2, 0 +_02010750: .word 0x0098967F +_02010754: .word BAG_ITEMS_PTR_MIRROR + arm_func_end SetMoneyStored + + arm_func_start AddMoneyStored +AddMoneyStored: ; 0x02010758 + ldr r1, _02010774 ; =BAG_ITEMS_PTR_MIRROR + ldr ip, _02010778 ; =SetMoneyStored + ldr r1, [r1] + add r1, r1, #0x1000 + ldr r1, [r1, #0x3a0] + add r0, r1, r0 + bx ip + .align 2, 0 +_02010774: .word BAG_ITEMS_PTR_MIRROR +_02010778: .word SetMoneyStored + arm_func_end AddMoneyStored diff --git a/asm/main_02010794.s b/asm/main_02010794.s new file mode 100644 index 00000000..5854e073 --- /dev/null +++ b/asm/main_02010794.s @@ -0,0 +1,15 @@ + .include "asm/macros.inc" + .include "main_02010794.inc" + + .text + + arm_func_start SetEggSpecies +SetEggSpecies: ; 0x02010794 + ldr r1, _020107A8 ; =BAG_ITEMS_PTR_MIRROR + ldr r1, [r1] + add r1, r1, #0x1300 + strh r0, [r1, #0xa4] + bx lr + .align 2, 0 +_020107A8: .word BAG_ITEMS_PTR_MIRROR + arm_func_end SetEggSpecies diff --git a/asm/main_020107C4.s b/asm/main_020107C4.s new file mode 100644 index 00000000..5faafa0d --- /dev/null +++ b/asm/main_020107C4.s @@ -0,0 +1,15 @@ + .include "asm/macros.inc" + .include "main_020107C4.inc" + + .text + + arm_func_start SetUnkGameState0x13a6 +SetUnkGameState0x13a6: ; 0x020107C4 + ldr r1, _020107D8 ; =BAG_ITEMS_PTR_MIRROR + ldr r1, [r1] + add r1, r1, #0x1300 + strh r0, [r1, #0xa6] + bx lr + .align 2, 0 +_020107D8: .word BAG_ITEMS_PTR_MIRROR + arm_func_end SetUnkGameState0x13a6 diff --git a/asm/main_020107F4.s b/asm/main_020107F4.s new file mode 100644 index 00000000..e5671a7b --- /dev/null +++ b/asm/main_020107F4.s @@ -0,0 +1,623 @@ + .include "asm/macros.inc" + .include "main_020107F4.inc" + + .text + + arm_func_start SetEggHatchTimer +SetEggHatchTimer: ; 0x020107F4 + ldr r1, _02010808 ; =BAG_ITEMS_PTR_MIRROR + ldr r1, [r1] + add r1, r1, #0x1300 + strh r0, [r1, #0xa8] + bx lr + .align 2, 0 +_02010808: .word BAG_ITEMS_PTR_MIRROR + arm_func_end SetEggHatchTimer + + arm_func_start DecrementEggHatchTimer +DecrementEggHatchTimer: ; 0x0201080C + ldr r0, _0201082C ; =BAG_ITEMS_PTR_MIRROR + ldr r0, [r0] + add r0, r0, #0x1300 + ldrh r1, [r0, #0xa8] + cmp r1, #0 + subne r1, r1, #1 + strneh r1, [r0, #0xa8] + bx lr + .align 2, 0 +_0201082C: .word BAG_ITEMS_PTR_MIRROR + arm_func_end DecrementEggHatchTimer + + arm_func_start RemoveInvalidKecleonShop1Items +RemoveInvalidKecleonShop1Items: ; 0x02010830 + ldr r1, _02010868 ; =BAG_ITEMS_PTR_MIRROR + mov r0, #0 + ldr r1, [r1] + mov r2, r0 + add r1, r1, #0x1000 + ldr r3, [r1, #0x32c] +_02010848: + mov r1, r2, lsl #2 + ldrsh r1, [r3, r1] + add r2, r2, #1 + cmp r1, #0 + addne r0, r0, #1 + cmp r2, #8 + blt _02010848 + bx lr + .align 2, 0 +_02010868: .word BAG_ITEMS_PTR_MIRROR + arm_func_end RemoveInvalidKecleonShop1Items + + arm_func_start RemoveItemFromKecleonShop1 +RemoveItemFromKecleonShop1: ; 0x0201086C + ldr r1, _02010894 ; =BAG_ITEMS_PTR_MIRROR + mov r3, r0, lsl #2 + ldr r1, [r1] + mov r2, #0 + add r1, r1, #0x1000 + ldr r1, [r1, #0x32c] + strh r2, [r1, r3] + add r0, r1, r0, lsl #2 + strh r2, [r0, #2] + bx lr + .align 2, 0 +_02010894: .word BAG_ITEMS_PTR_MIRROR + arm_func_end RemoveItemFromKecleonShop1 + + arm_func_start GetCurrentKecleonShop1ItemByIndex +GetCurrentKecleonShop1ItemByIndex: ; 0x02010898 + ldr r1, _020108B0 ; =BAG_ITEMS_PTR_MIRROR + ldr r1, [r1] + add r1, r1, #0x1000 + ldr r1, [r1, #0x32c] + add r0, r1, r0, lsl #2 + bx lr + .align 2, 0 +_020108B0: .word BAG_ITEMS_PTR_MIRROR + arm_func_end GetCurrentKecleonShop1ItemByIndex + + arm_func_start sub_020108B4 +sub_020108B4: ; 0x020108B4 + stmdb sp!, {r3, r4, r5, lr} + mov r0, #0 + mov r4, r0 + ldr r2, _02010950 ; =BAG_ITEMS_PTR_MIRROR + b _020108E8 +_020108C8: + ldr r1, [r2] + mov r3, r0, lsl #2 + add r1, r1, #0x1000 + ldr r1, [r1, #0x32c] + ldrsh r1, [r1, r3] + cmp r1, #0 + bne _020108F0 + add r0, r0, #1 +_020108E8: + cmp r0, #8 + blt _020108C8 +_020108F0: + cmp r0, #8 + beq _02010944 + cmp r0, r4 + ble _0201092C + ldr r1, [r2] + mov r3, r0, lsl #2 + add r1, r1, #0x1000 + ldr r5, [r1, #0x32c] + mov lr, r4, lsl #2 + ldrh r1, [r5, r3] + add ip, r5, r0, lsl #2 + add r3, r5, r4, lsl #2 + strh r1, [r5, lr] + ldrh r1, [ip, #2] + strh r1, [r3, #2] +_0201092C: + add r0, r0, #1 + add r4, r4, #1 + b _020108E8 +_02010938: + and r0, r4, #0xff + bl RemoveItemFromKecleonShop1 + add r4, r4, #1 +_02010944: + cmp r4, #8 + blt _02010938 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_02010950: .word BAG_ITEMS_PTR_MIRROR + arm_func_end sub_020108B4 + + arm_func_start SortKecleonItems1 +SortKecleonItems1: ; 0x02010954 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #4 + mov r6, #0 +_02010960: + add r7, r6, #1 + mov r5, r6, lsl #2 + ldr r4, _02010A48 ; =BAG_ITEMS_PTR_MIRROR + b _02010A2C +_02010970: + ldr r0, [r4] + add r0, r0, #0x1000 + ldr r0, [r0, #0x32c] + ldrsh r0, [r5, r0] + bl sub_0200D1F0 + ldr r1, [r4] + mov r2, r7, lsl #2 + add r1, r1, #0x1000 + ldr r1, [r1, #0x32c] + mov r8, r0 + ldrsh r0, [r1, r2] + bl sub_0200D1F0 + cmp r8, r0 + bgt _020109D0 + bne _02010A28 + ldr r0, [r4] + add r0, r0, #0x1000 + ldr r0, [r0, #0x32c] + add r1, r5, r0 + add r0, r0, r7, lsl #2 + ldrh r1, [r1, #2] + ldrh r0, [r0, #2] + cmp r1, r0 + bhs _02010A28 +_020109D0: + ldr r1, [r4] + mov r0, r7, lsl #2 + add r1, r1, #0x1000 + ldr r8, [r1, #0x32c] + add lr, r5, r8 + ldrh ip, [r5, r8] + ldrh r3, [lr, #2] + ldrh r1, [r8, r0] + add r2, r8, r7, lsl #2 + strh ip, [sp] + strh r1, [r5, r8] + ldrh r1, [r2, #2] + strh r3, [sp, #2] + ldrh r3, [sp] + strh r1, [lr, #2] + ldr r1, [r4] + ldrh r2, [sp, #2] + add r1, r1, #0x1000 + ldr r1, [r1, #0x32c] + strh r3, [r1, r0] + add r0, r1, r7, lsl #2 + strh r2, [r0, #2] +_02010A28: + add r7, r7, #1 +_02010A2C: + cmp r7, #8 + blt _02010970 + add r6, r6, #1 + cmp r6, #7 + blt _02010960 + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .align 2, 0 +_02010A48: .word BAG_ITEMS_PTR_MIRROR + arm_func_end SortKecleonItems1 + + arm_func_start GenerateKecleonItems1 +GenerateKecleonItems1: ; 0x02010A4C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + mov r4, #0 +_02010A58: + and r0, r4, #0xff + bl RemoveItemFromKecleonShop1 + add r4, r4, #1 + cmp r4, #8 + blt _02010A58 + ldr r0, _02010AC0 ; =KECLEON_SHOP_ITEM_TABLE_LISTS_1 + ldr r5, _02010AC4 ; =0x0000270F + ldr r6, [r0, r8, lsl #2] + mov r7, #0 +_02010A7C: + mov r0, r5 + bl RandIntSafe + mov r4, r0 + mov r0, r5 + bl RandIntSafe + mov r2, r0 + mov r0, r6 + mov r1, r4 + bl GetItemIdFromList + bl AddItemToKecleonShop1 + add r7, r7, #1 + cmp r7, #8 + blt _02010A7C + bl SortKecleonItems1 + mov r0, r8 + bl GenerateKecleonItems2 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_02010AC0: .word KECLEON_SHOP_ITEM_TABLE_LISTS_1 +_02010AC4: .word 0x0000270F + arm_func_end GenerateKecleonItems1 + + arm_func_start AddItemToKecleonShop1 +AddItemToKecleonShop1: ; 0x02010AC8 + stmdb sp!, {r3, lr} + mov r1, r0 + add r0, sp, #0 + bl InitBulkItem + ldr r0, _02010B38 ; =BAG_ITEMS_PTR_MIRROR + mov r2, #0 + ldr r3, [r0] + add r0, r3, #0x1000 + b _02010B28 +_02010AEC: + ldr r1, [r0, #0x32c] + mov ip, r2, lsl #2 + ldrsh r1, [r1, ip] + cmp r1, #0 + bne _02010B24 + add r0, r3, #0x1000 + ldr r3, [r0, #0x32c] + ldrh r1, [sp] + add r2, r3, ip + mov r0, #0 + strh r1, [r3, ip] + ldrh r1, [sp, #2] + strh r1, [r2, #2] + ldmia sp!, {r3, pc} +_02010B24: + add r2, r2, #1 +_02010B28: + cmp r2, #8 + blt _02010AEC + mov r0, #1 + ldmia sp!, {r3, pc} + .align 2, 0 +_02010B38: .word BAG_ITEMS_PTR_MIRROR + arm_func_end AddItemToKecleonShop1 + + arm_func_start RemoveInvalidKecleonShop2Items +RemoveInvalidKecleonShop2Items: ; 0x02010B3C + ldr r1, _02010B74 ; =BAG_ITEMS_PTR_MIRROR + mov r0, #0 + ldr r1, [r1] + mov r2, r0 + add r1, r1, #0x1000 + ldr r3, [r1, #0x370] +_02010B54: + mov r1, r2, lsl #2 + ldrsh r1, [r3, r1] + add r2, r2, #1 + cmp r1, #0 + addne r0, r0, #1 + cmp r2, #4 + blt _02010B54 + bx lr + .align 2, 0 +_02010B74: .word BAG_ITEMS_PTR_MIRROR + arm_func_end RemoveInvalidKecleonShop2Items + + arm_func_start RemoveItemFromKecleonShop2 +RemoveItemFromKecleonShop2: ; 0x02010B78 + ldr r1, _02010BA0 ; =BAG_ITEMS_PTR_MIRROR + mov r3, r0, lsl #2 + ldr r1, [r1] + mov r2, #0 + add r1, r1, #0x1000 + ldr r1, [r1, #0x370] + strh r2, [r1, r3] + add r0, r1, r0, lsl #2 + strh r2, [r0, #2] + bx lr + .align 2, 0 +_02010BA0: .word BAG_ITEMS_PTR_MIRROR + arm_func_end RemoveItemFromKecleonShop2 + + arm_func_start GetCurrentKecleonShop2ItemByIndex +GetCurrentKecleonShop2ItemByIndex: ; 0x02010BA4 + ldr r1, _02010BBC ; =BAG_ITEMS_PTR_MIRROR + ldr r1, [r1] + add r1, r1, #0x1000 + ldr r1, [r1, #0x370] + add r0, r1, r0, lsl #2 + bx lr + .align 2, 0 +_02010BBC: .word BAG_ITEMS_PTR_MIRROR + arm_func_end GetCurrentKecleonShop2ItemByIndex + + arm_func_start sub_02010BC0 +sub_02010BC0: ; 0x02010BC0 + stmdb sp!, {r3, r4, r5, lr} + mov r0, #0 + mov r4, r0 + ldr r2, _02010C5C ; =BAG_ITEMS_PTR_MIRROR + b _02010BF4 +_02010BD4: + ldr r1, [r2] + mov r3, r0, lsl #2 + add r1, r1, #0x1000 + ldr r1, [r1, #0x370] + ldrsh r1, [r1, r3] + cmp r1, #0 + bne _02010BFC + add r0, r0, #1 +_02010BF4: + cmp r0, #4 + blt _02010BD4 +_02010BFC: + cmp r0, #4 + beq _02010C50 + cmp r0, r4 + ble _02010C38 + ldr r1, [r2] + mov r3, r0, lsl #2 + add r1, r1, #0x1000 + ldr r5, [r1, #0x370] + mov lr, r4, lsl #2 + ldrh r1, [r5, r3] + add ip, r5, r0, lsl #2 + add r3, r5, r4, lsl #2 + strh r1, [r5, lr] + ldrh r1, [ip, #2] + strh r1, [r3, #2] +_02010C38: + add r0, r0, #1 + add r4, r4, #1 + b _02010BF4 +_02010C44: + and r0, r4, #0xff + bl RemoveItemFromKecleonShop2 + add r4, r4, #1 +_02010C50: + cmp r4, #4 + blt _02010C44 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_02010C5C: .word BAG_ITEMS_PTR_MIRROR + arm_func_end sub_02010BC0 + + arm_func_start SortKecleonItems2 +SortKecleonItems2: ; 0x02010C60 + stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} + sub sp, sp, #4 + mov r6, #0 +_02010C6C: + add r7, r6, #1 + mov r5, r6, lsl #2 + ldr r4, _02010D54 ; =BAG_ITEMS_PTR_MIRROR + b _02010D38 +_02010C7C: + ldr r0, [r4] + add r0, r0, #0x1000 + ldr r0, [r0, #0x370] + ldrsh r0, [r5, r0] + bl sub_0200D1F0 + ldr r1, [r4] + mov r2, r7, lsl #2 + add r1, r1, #0x1000 + ldr r1, [r1, #0x370] + mov r8, r0 + ldrsh r0, [r1, r2] + bl sub_0200D1F0 + cmp r8, r0 + bgt _02010CDC + bne _02010D34 + ldr r0, [r4] + add r0, r0, #0x1000 + ldr r0, [r0, #0x370] + add r1, r5, r0 + add r0, r0, r7, lsl #2 + ldrh r1, [r1, #2] + ldrh r0, [r0, #2] + cmp r1, r0 + bhs _02010D34 +_02010CDC: + ldr r1, [r4] + mov r0, r7, lsl #2 + add r1, r1, #0x1000 + ldr r8, [r1, #0x370] + add lr, r5, r8 + ldrh ip, [r5, r8] + ldrh r3, [lr, #2] + ldrh r1, [r8, r0] + add r2, r8, r7, lsl #2 + strh ip, [sp] + strh r1, [r5, r8] + ldrh r1, [r2, #2] + strh r3, [sp, #2] + ldrh r3, [sp] + strh r1, [lr, #2] + ldr r1, [r4] + ldrh r2, [sp, #2] + add r1, r1, #0x1000 + ldr r1, [r1, #0x370] + strh r3, [r1, r0] + add r0, r1, r7, lsl #2 + strh r2, [r0, #2] +_02010D34: + add r7, r7, #1 +_02010D38: + cmp r7, #4 + blt _02010C7C + add r6, r6, #1 + cmp r6, #3 + blt _02010C6C + add sp, sp, #4 + ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} + .align 2, 0 +_02010D54: .word BAG_ITEMS_PTR_MIRROR + arm_func_end SortKecleonItems2 + + arm_func_start GenerateKecleonItems2 +GenerateKecleonItems2: ; 0x02010D58 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r0 + mov r4, #0 +_02010D64: + and r0, r4, #0xff + bl RemoveItemFromKecleonShop2 + add r4, r4, #1 + cmp r4, #4 + blt _02010D64 + ldr r0, _02010DC4 ; =KECLEON_SHOP_ITEM_TABLE_LISTS_2 + mov r7, #0 + ldr r6, [r0, r5, lsl #2] + ldr r5, _02010DC8 ; =0x0000270F +_02010D88: + mov r0, r5 + bl RandIntSafe + mov r4, r0 + mov r0, r5 + bl RandIntSafe + mov r2, r0 + mov r0, r6 + mov r1, r4 + bl GetItemIdFromList + bl AddItemToKecleonShop2 + add r7, r7, #1 + cmp r7, #4 + blt _02010D88 + bl SortKecleonItems2 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_02010DC4: .word KECLEON_SHOP_ITEM_TABLE_LISTS_2 +_02010DC8: .word 0x0000270F + arm_func_end GenerateKecleonItems2 + + arm_func_start AddItemToKecleonShop2 +AddItemToKecleonShop2: ; 0x02010DCC + stmdb sp!, {r3, lr} + mov r1, r0 + add r0, sp, #0 + bl InitBulkItem + ldr r0, _02010E3C ; =BAG_ITEMS_PTR_MIRROR + mov r2, #0 + ldr r3, [r0] + add r0, r3, #0x1000 + b _02010E2C +_02010DF0: + ldr r1, [r0, #0x370] + mov ip, r2, lsl #2 + ldrsh r1, [r1, ip] + cmp r1, #0 + bne _02010E28 + add r0, r3, #0x1000 + ldr r3, [r0, #0x370] + ldrh r1, [sp] + add r2, r3, ip + mov r0, #0 + strh r1, [r3, ip] + ldrh r1, [sp, #2] + strh r1, [r2, #2] + ldmia sp!, {r3, pc} +_02010E28: + add r2, r2, #1 +_02010E2C: + cmp r2, #4 + blt _02010DF0 + mov r0, #1 + ldmia sp!, {r3, pc} + .align 2, 0 +_02010E3C: .word BAG_ITEMS_PTR_MIRROR + arm_func_end AddItemToKecleonShop2 + + arm_func_start GetExclusiveItemOffset +GetExclusiveItemOffset: ; 0x02010E40 + stmdb sp!, {r4, lr} + mov r4, r0 + bl GetItemCategory + cmp r0, #0xf + movne r0, #0 + subeq r0, r4, #0x1bc + moveq r0, r0, lsl #0x10 + moveq r0, r0, asr #0x10 + ldmia sp!, {r4, pc} + arm_func_end GetExclusiveItemOffset + + arm_func_start ApplyExclusiveItemStatBoosts +ApplyExclusiveItemStatBoosts: ; 0x02010E64 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + sub sp, sp, #8 + mov r7, r1 + mov r6, r2 + mov r5, r3 + ldr r4, [sp, #0x28] + bl GetExclusiveItemOffset + ldr r1, _02010F6C ; =EXCLUSIVE_ITEM_STAT_BOOST_DATA_INDEXES + ldrb r2, [r7] + ldrb r1, [r1, r0, lsl #1] + ldrb r0, [r4] + strh r2, [sp, #4] + ldrb r2, [r5] + strh r0, [sp, #2] + ldrb r3, [r6] + ldr r0, _02010F70 ; =EXCLUSIVE_ITEM_ATTACK_BOOSTS + mov r1, r1, lsl #2 + strh r3, [sp, #6] + strh r2, [sp] + ldrsb r2, [r0, r1] + ldr r0, _02010F74 ; =EXCLUSIVE_ITEM_SPECIAL_ATTACK_BOOSTS + ldrh sb, [sp, #4] + ldrsb r8, [r0, r1] + mov r0, r2, lsl #0x10 + add r0, sb, r0, lsr #16 + strh r0, [sp, #4] + mov r0, r8, lsl #0x10 + ldrh lr, [sp, #6] + ldrh r2, [sp, #4] + ldr ip, _02010F78 ; =EXCLUSIVE_ITEM_DEFENSE_BOOSTS + add r0, lr, r0, lsr #16 + ldrsb lr, [ip, r1] + ldr r3, _02010F7C ; =EXCLUSIVE_ITEM_SPECIAL_DEFENSE_BOOSTS + ldrsh ip, [sp, #2] + ldrsb r1, [r3, r1] + strh r0, [sp, #6] + ldrsh r8, [sp] + add r0, ip, r1 + strh r0, [sp, #2] + cmp r2, #0xff + movhi r0, #0xff + strhih r0, [sp, #4] + ldrh r0, [sp, #6] + add r3, r8, lr + ldrh r2, [sp, #4] + cmp r0, #0xff + movhi r0, #0xff + strh r3, [sp] + strhih r0, [sp, #6] + ldrsh r0, [sp] + strb r2, [r7] + cmp r0, #0xff + movgt r0, #0xff + strgth r0, [sp] + ldrsh r0, [sp, #2] + ldrsh r1, [sp] + cmp r0, #0xff + movgt r0, #0xff + strgth r0, [sp, #2] + ldrh r0, [sp, #6] + strb r0, [r6] + ldrsh r0, [sp, #2] + strb r1, [r5] + strb r0, [r4] + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +_02010F6C: .word EXCLUSIVE_ITEM_STAT_BOOST_DATA_INDEXES +_02010F70: .word EXCLUSIVE_ITEM_ATTACK_BOOSTS +_02010F74: .word EXCLUSIVE_ITEM_SPECIAL_ATTACK_BOOSTS +_02010F78: .word EXCLUSIVE_ITEM_DEFENSE_BOOSTS +_02010F7C: .word EXCLUSIVE_ITEM_SPECIAL_DEFENSE_BOOSTS + arm_func_end ApplyExclusiveItemStatBoosts + + arm_func_start SetExclusiveItemEffect +SetExclusiveItemEffect: ; 0x02010F80 + cmp r1, #0 + bxeq lr + mov ip, r1, lsr #5 + ldr r3, [r0, ip, lsl #2] + sub r1, r1, ip, lsl #5 + mov r2, #1 + orr r1, r3, r2, lsl r1 + str r1, [r0, ip, lsl #2] + bx lr + arm_func_end SetExclusiveItemEffect diff --git a/include/item.h b/include/item.h index 0706969c..2e7f0592 100644 --- a/include/item.h +++ b/include/item.h @@ -1656,6 +1656,10 @@ struct bag_items { /* 0x388 */ u8 active_inventory_idx; u8 fill2[0x1009]; u32 maybeMoney[NUM_INVENTORIES]; // indexed with an u8, uses same indexes as Inventory + u32 field_0x13A0; + s16 field_0x13A4; + u16 field_0x13A6; + u16 field_0x13A8; }; struct bulk_item diff --git a/include/main_0201070C.h b/include/main_0201070C.h new file mode 100644 index 00000000..b234e505 --- /dev/null +++ b/include/main_0201070C.h @@ -0,0 +1,6 @@ +#ifndef PMDSKY_MAIN_0201070C_H +#define PMDSKY_MAIN_0201070C_H + +u32 GetMoneyStored(void); + +#endif diff --git a/include/main_0201077C.h b/include/main_0201077C.h new file mode 100644 index 00000000..83d16aad --- /dev/null +++ b/include/main_0201077C.h @@ -0,0 +1,6 @@ +#ifndef PMDSKY_MAIN_0201077C_H +#define PMDSKY_MAIN_0201077C_H + +s16 GetEggSpecies(void); + +#endif diff --git a/include/main_020107AC.h b/include/main_020107AC.h new file mode 100644 index 00000000..963e758b --- /dev/null +++ b/include/main_020107AC.h @@ -0,0 +1,6 @@ +#ifndef PMDSKY_MAIN_020107AC_H +#define PMDSKY_MAIN_020107AC_H + +u16 GetUnkGameState0x13a6(void); + +#endif diff --git a/include/main_020107DC.h b/include/main_020107DC.h new file mode 100644 index 00000000..7718f9cf --- /dev/null +++ b/include/main_020107DC.h @@ -0,0 +1,6 @@ +#ifndef PMDSKY_MAIN_020107DC_H +#define PMDSKY_MAIN_020107DC_H + +u16 GetEggHatchTimer(void); + +#endif diff --git a/main.lsf b/main.lsf index 75843f14..1a9dcb3a 100644 --- a/main.lsf +++ b/main.lsf @@ -71,6 +71,14 @@ Static main Object src/main_0200ECFC.o Object src/main_0200EDC0.o Object asm/main_0200EDFC.o + Object src/main_0201070C.o + Object asm/main_02010724.o + Object src/main_0201077C.o + Object asm/main_02010794.o + Object src/main_020107AC.o + Object asm/main_020107C4.o + Object src/main_020107DC.o + Object asm/main_020107F4.o Object src/exclusive_item.o Object asm/main_02010FC4.o Object src/moves_1.o diff --git a/src/main_0201070C.c b/src/main_0201070C.c new file mode 100644 index 00000000..79d4c484 --- /dev/null +++ b/src/main_0201070C.c @@ -0,0 +1,9 @@ +#include "main_0201070C.h" +#include "item.h" + +extern struct bag_items *BAG_ITEMS_PTR_MIRROR; + +u32 GetMoneyStored(void) +{ + return BAG_ITEMS_PTR_MIRROR->field_0x13A0; +} diff --git a/src/main_0201077C.c b/src/main_0201077C.c new file mode 100644 index 00000000..0f7b64ac --- /dev/null +++ b/src/main_0201077C.c @@ -0,0 +1,9 @@ +#include "main_0201077C.h" +#include "item.h" + +extern struct bag_items *BAG_ITEMS_PTR_MIRROR; + +s16 GetEggSpecies(void) +{ + return BAG_ITEMS_PTR_MIRROR->field_0x13A4; +} diff --git a/src/main_020107AC.c b/src/main_020107AC.c new file mode 100644 index 00000000..eacafaba --- /dev/null +++ b/src/main_020107AC.c @@ -0,0 +1,9 @@ +#include "main_020107AC.h" +#include "item.h" + +extern struct bag_items *BAG_ITEMS_PTR_MIRROR; + +u16 GetUnkGameState0x13a6(void) +{ + return BAG_ITEMS_PTR_MIRROR->field_0x13A6; +} diff --git a/src/main_020107DC.c b/src/main_020107DC.c new file mode 100644 index 00000000..8fbacea2 --- /dev/null +++ b/src/main_020107DC.c @@ -0,0 +1,9 @@ +#include "main_020107DC.h" +#include "item.h" + +extern struct bag_items *BAG_ITEMS_PTR_MIRROR; + +u16 GetEggHatchTimer(void) +{ + return BAG_ITEMS_PTR_MIRROR->field_0x13A8; +}