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 <noreply@anthropic.com>
This commit is contained in:
cecilarmitais
2026-08-16 16:28:07 -07:00
parent 0888986aaf
commit 27c9ec9af6
20 changed files with 782 additions and 730 deletions

View File

@@ -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

View File

@@ -0,0 +1,2 @@
#pragma once
.public BAG_ITEMS_PTR_MIRROR

View File

@@ -0,0 +1,2 @@
#pragma once
.public BAG_ITEMS_PTR_MIRROR

View File

@@ -0,0 +1,2 @@
#pragma once
.public BAG_ITEMS_PTR_MIRROR

View File

@@ -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

View File

@@ -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

37
asm/main_02010724.s Normal file
View File

@@ -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

15
asm/main_02010794.s Normal file
View File

@@ -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

15
asm/main_020107C4.s Normal file
View File

@@ -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

623
asm/main_020107F4.s Normal file
View File

@@ -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

View File

@@ -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

6
include/main_0201070C.h Normal file
View File

@@ -0,0 +1,6 @@
#ifndef PMDSKY_MAIN_0201070C_H
#define PMDSKY_MAIN_0201070C_H
u32 GetMoneyStored(void);
#endif

6
include/main_0201077C.h Normal file
View File

@@ -0,0 +1,6 @@
#ifndef PMDSKY_MAIN_0201077C_H
#define PMDSKY_MAIN_0201077C_H
s16 GetEggSpecies(void);
#endif

6
include/main_020107AC.h Normal file
View File

@@ -0,0 +1,6 @@
#ifndef PMDSKY_MAIN_020107AC_H
#define PMDSKY_MAIN_020107AC_H
u16 GetUnkGameState0x13a6(void);
#endif

6
include/main_020107DC.h Normal file
View File

@@ -0,0 +1,6 @@
#ifndef PMDSKY_MAIN_020107DC_H
#define PMDSKY_MAIN_020107DC_H
u16 GetEggHatchTimer(void);
#endif

View File

@@ -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

9
src/main_0201070C.c Normal file
View File

@@ -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;
}

9
src/main_0201077C.c Normal file
View File

@@ -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;
}

9
src/main_020107AC.c Normal file
View File

@@ -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;
}

9
src/main_020107DC.c Normal file
View File

@@ -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;
}