diff options
author | Dennis <dhilhorst2000@gmail.com> | 2021-07-17 18:45:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-17 09:45:13 -0700 |
commit | bad7f7f688253c87c2cb2d063ea57c884cb6adff (patch) | |
tree | f853042438f42634f8d64b6daec015f3e287d77a | |
parent | a65d358927f668cb5e34a6046afef5bd61380a28 (diff) |
More item related decomp (#45)
* decompile sub_80918EC
* some more item related functions
* more item functions
* more decomp, fix types in other places
* more small functions
* more item related decomp
* one more weird branching item function
* fix global.h includes
* figured out branch pattern
* decompile sub_8090F58
* make temporary struct for function
* :crab: items.s is gone :crab:
* some renaming
* rename some obvious item related constants
* fix spelling error
38 files changed, 1447 insertions, 2215 deletions
diff --git a/asm/code_8027C84.s b/asm/code_8027C84.s index c2bbfa0..5057e00 100644 --- a/asm/code_8027C84.s +++ b/asm/code_8027C84.s @@ -97,7 +97,7 @@ sub_8027D40: add r4, sp, 0x10 adds r0, r4, 0 adds r1, r5, 0 - bl sub_8090B64 + bl HeldItemToSlot movs r5, 0 str r5, [sp, 0x4] add r0, sp, 0x4 diff --git a/asm/code_803C1D0.s b/asm/code_803C1D0.s index 81cd652..fe52d74 100644 --- a/asm/code_803C1D0.s +++ b/asm/code_803C1D0.s @@ -533,7 +533,7 @@ _0803C59E: beq _0803C5C6 ldrb r0, [r6, 0x4] ldrb r1, [r5, 0x2] - bl sub_8091E60 + bl xxx_bit_lut_lookup_8091E50 lsls r0, 24 cmp r0, 0 beq _0803C5C6 @@ -605,7 +605,7 @@ _0803C624: beq _0803C64C ldrb r0, [r6, 0x4] ldrb r1, [r4, 0x2] - bl sub_8091E60 + bl xxx_bit_lut_lookup_8091E50 lsls r0, 24 cmp r0, 0 beq _0803C64C diff --git a/asm/code_80428A0.s b/asm/code_80428A0.s index 70dee43..402ea92 100644 --- a/asm/code_80428A0.s +++ b/asm/code_80428A0.s @@ -6366,7 +6366,7 @@ sub_8045C28: lsrs r4, r1, 24 adds r1, r4, 0 movs r2, 0 - bl sub_8090A8C + bl xxx_init_itemslot_8090A8C movs r7, 0 adds r0, r4, 0 bl IsNotSpecialItem @@ -8668,7 +8668,7 @@ _08046DC8: adds r0, r1 movs r1, 0x7A movs r2, 0 - bl sub_8090A8C + bl xxx_init_itemslot_8090A8C _08046E1E: cmp r7, 0 bne _08046D96 @@ -8917,7 +8917,7 @@ _08047012: adds r0, r2, 0 movs r1, 0x46 movs r2, 0 - bl sub_8090A8C + bl xxx_init_itemslot_8090A8C _0804702C: adds r5, 0x1 cmp r5, 0x13 @@ -8948,7 +8948,7 @@ _08047038: adds r0, r2, 0 movs r1, 0x46 movs r2, 0 - bl sub_8090A8C + bl xxx_init_itemslot_8090A8C _0804706C: adds r5, 0x1 cmp r5, 0x3 diff --git a/asm/code_8048480.s b/asm/code_8048480.s index d2f141e..61085f7 100644 --- a/asm/code_8048480.s +++ b/asm/code_8048480.s @@ -19331,13 +19331,13 @@ sub_805193C: mov r0, sp movs r1, 0x76 movs r2, 0 - bl sub_8090A8C + bl xxx_init_itemslot_8090A8C b _08051974 _0805196A: mov r0, sp adds r1, r5, 0 movs r2, 0 - bl sub_8090A8C + bl xxx_init_itemslot_8090A8C _08051974: mov r0, sp ldrb r0, [r0] diff --git a/asm/code_8057824.s b/asm/code_8057824.s index 6324830..8cf0799 100644 --- a/asm/code_8057824.s +++ b/asm/code_8057824.s @@ -8213,7 +8213,7 @@ _0805B75E: lsrs r1, 24 adds r0, r2, 0 movs r2, 0 - bl sub_8090A8C + bl xxx_init_itemslot_8090A8C movs r7, 0x1 _0805B790: adds r4, 0x1 @@ -8238,7 +8238,7 @@ _0805B790: lsrs r1, 24 mov r0, r8 movs r2, 0 - bl sub_8090A8C + bl xxx_init_itemslot_8090A8C movs r7, 0x1 _0805B7C2: cmp r7, 0 @@ -40347,7 +40347,7 @@ _0806BAFC: beq _0806BB24 adds r0, r4, 0 movs r2, 0 - bl sub_8090A8C + bl xxx_init_itemslot_8090A8C ldr r2, [sp, 0x24] strb r5, [r2] _0806BB24: diff --git a/asm/code_80958E8.s b/asm/code_80958E8.s index 40e970d..89a0109 100644 --- a/asm/code_80958E8.s +++ b/asm/code_80958E8.s @@ -554,7 +554,7 @@ _08095F34: beq _08095F48 lsrs r1, r4, 24 adds r0, r7, 0 - bl sub_8091E60 + bl xxx_bit_lut_lookup_8091E50 lsls r0, 24 cmp r0, 0 beq _08095F6A diff --git a/asm/friend_list_menu.s b/asm/friend_list_menu.s index d9a0e57..caa5a02 100644 --- a/asm/friend_list_menu.s +++ b/asm/friend_list_menu.s @@ -13139,7 +13139,7 @@ _08025668: ldr r1, [r5] adds r1, 0x14 add r0, sp, 0x8 - bl sub_8090B64 + bl HeldItemToSlot add r0, sp, 0x8 bl sub_801B3C0 b _08025720 @@ -13973,7 +13973,7 @@ _08025D24: ldr r1, [r5] adds r1, 0x14 adds r0, r4, 0 - bl sub_8090B64 + bl HeldItemToSlot movs r1, 0 str r1, [sp] mov r0, sp @@ -14144,7 +14144,7 @@ sub_8025E68: add r4, sp, 0x10 adds r0, r4, 0 adds r1, r5, 0 - bl sub_8090B64 + bl HeldItemToSlot movs r5, 0 str r5, [sp, 0x4] add r0, sp, 0x4 @@ -14721,7 +14721,7 @@ _08026350: ldr r1, [r4] adds r1, 0x10 add r0, sp, 0x14 - bl sub_8090B64 + bl HeldItemToSlot add r0, sp, 0x14 bl sub_801B3C0 b _080264BA @@ -15876,7 +15876,7 @@ _08026C84: ldr r1, [r5] adds r1, 0x10 adds r0, r4, 0 - bl sub_8090B64 + bl HeldItemToSlot movs r1, 0 str r1, [sp] mov r0, sp @@ -16027,7 +16027,7 @@ sub_8026DAC: add r4, sp, 0x10 adds r0, r4, 0 adds r1, r5, 0 - bl sub_8090B64 + bl HeldItemToSlot movs r5, 0 str r5, [sp, 0x4] add r0, sp, 0x4 diff --git a/asm/items.s b/asm/items.s deleted file mode 100644 index 5587b92..0000000 --- a/asm/items.s +++ /dev/null @@ -1,352 +0,0 @@ - .include "constants/gba_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_8090E14 -sub_8090E14: - push {r4-r7,lr} - sub sp, 0x50 - adds r6, r0, 0 - adds r5, r1, 0 - adds r7, r2, 0 - movs r4, 0 - cmp r7, 0 - beq _08090E2C - ldrb r1, [r7, 0x8] - negs r0, r1 - orrs r0, r1 - lsrs r4, r0, 31 -_08090E2C: - ldrb r0, [r5, 0x2] - bl GetItemType - lsls r0, 24 - cmp r0, 0 - bne _08090E3E - cmp r4, 0 - bne _08090E50 - b _08090E70 -_08090E3E: - ldrb r0, [r5, 0x2] - bl GetItemType - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08090E90 - cmp r4, 0 - beq _08090E70 -_08090E50: - ldr r1, _08090E68 - ldrb r0, [r5, 0x2] - ldr r2, _08090E6C - ldr r2, [r2] - lsls r0, 5 - adds r0, r2 - ldr r2, [r0] - ldrb r3, [r5, 0x1] - mov r0, sp - bl ExpandPlaceholdersBuffer - b _08090EC4 - .align 2, 0 -_08090E68: .4byte gUnknown_8109770 -_08090E6C: .4byte gItemParametersData -_08090E70: - ldr r1, _08090E88 - ldrb r0, [r5, 0x2] - ldr r2, _08090E8C - ldr r2, [r2] - lsls r0, 5 - adds r0, r2 - ldr r2, [r0] - mov r0, sp - bl ExpandPlaceholdersBuffer - b _08090EC4 - .align 2, 0 -_08090E88: .4byte gUnknown_8109778 -_08090E8C: .4byte gItemParametersData -_08090E90: - ldrb r0, [r5, 0x2] - cmp r0, 0x69 - bne _08090EB0 - ldr r4, _08090EAC - adds r0, r5, 0 - bl GetMoneyValue - adds r2, r0, 0 - mov r0, sp - adds r1, r4, 0 - bl ExpandPlaceholdersBuffer - b _08090EC4 - .align 2, 0 -_08090EAC: .4byte gUnknown_810977C -_08090EB0: - ldrb r0, [r5, 0x2] - ldr r1, _08090F2C - ldr r1, [r1] - lsls r0, 5 - adds r0, r1 - ldr r1, [r0] - mov r0, sp - movs r2, 0x50 - bl strncpy -_08090EC4: - ldrb r1, [r5] - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _08090EE2 - ldr r1, _08090F30 - adds r0, r6, 0 - mov r2, sp - bl ExpandPlaceholdersBuffer - mov r0, sp - adds r1, r6, 0 - movs r2, 0x50 - bl strncpy -_08090EE2: - cmp r7, 0 - beq _08090F38 - ldrb r0, [r7, 0x4] - cmp r0, 0 - beq _08090F0A - ldrb r1, [r5] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - beq _08090F0A - ldr r1, _08090F34 - adds r0, r6, 0 - mov r2, sp - bl ExpandPlaceholdersBuffer - mov r0, sp - adds r1, r6, 0 - movs r2, 0x50 - bl strncpy -_08090F0A: - ldr r0, [r7] - cmp r0, 0x1 - beq _08090F14 - cmp r0, 0x3 - bne _08090F44 -_08090F14: - ldrb r1, [r5] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _08090F38 - adds r0, r6, 0 - mov r1, sp - adds r2, r5, 0 - adds r3, r7, 0 - bl sub_8090F58 - b _08090F50 - .align 2, 0 -_08090F2C: .4byte gItemParametersData -_08090F30: .4byte gUnknown_8109784 -_08090F34: .4byte gUnknown_810978C -_08090F38: - adds r0, r6, 0 - mov r1, sp - movs r2, 0x50 - bl strncpy - b _08090F50 -_08090F44: - adds r0, r6, 0 - mov r1, sp - adds r2, r5, 0 - adds r3, r7, 0 - bl sub_8090F58 -_08090F50: - add sp, 0x50 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8090E14 - - thumb_func_start sub_8090F58 -sub_8090F58: - push {r4-r6,lr} - sub sp, 0x2C - adds r5, r0, 0 - adds r6, r1, 0 - adds r0, r2, 0 - adds r4, r3, 0 - cmp r4, 0 - bne _08090F6C - adds r0, r5, 0 - b _08090F94 -_08090F6C: - ldr r1, [r4] - cmp r1, 0x1 - bcc _08090F8A - cmp r1, 0x2 - bhi _08090F7E - bl GetStackBuyValue - adds r1, r0, 0 - b _08090F8C -_08090F7E: - cmp r1, 0x4 - bhi _08090F8A - bl GetStackSellValue - adds r1, r0, 0 - b _08090F8C -_08090F8A: - movs r1, 0 -_08090F8C: - cmp r1, 0 - bne _08090F9C - adds r0, r5, 0 - adds r1, r6, 0 -_08090F94: - movs r2, 0x50 - bl strncpy - b _08090FDE -_08090F9C: - movs r2, 0x6 - ldrsh r0, [r4, r2] - cmp r0, 0 - beq _08090FC8 - adds r0, r1, 0 - add r1, sp, 0x4 - movs r2, 0x1 - bl sub_8090FEC - ldr r1, _08090FC4 - movs r0, 0x6 - ldrsh r3, [r4, r0] - add r2, sp, 0x4 - str r2, [sp] - adds r0, r5, 0 - adds r2, r6, 0 - bl ExpandPlaceholdersBuffer - b _08090FDE - .align 2, 0 -_08090FC4: .4byte gUnknown_8109794 -_08090FC8: - adds r0, r1, 0 - add r1, sp, 0x4 - movs r2, 0 - bl sub_8090FEC - ldr r1, _08090FE8 - adds r0, r5, 0 - adds r2, r6, 0 - add r3, sp, 0x4 - bl ExpandPlaceholdersBuffer -_08090FDE: - add sp, 0x2C - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08090FE8: .4byte gUnknown_81097A4 - thumb_func_end sub_8090F58 - - thumb_func_start sub_8090FEC -sub_8090FEC: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - adds r5, r0, 0 - adds r4, r1, 0 - lsls r2, 24 - lsrs r2, 24 - mov r10, r2 - movs r0, 0 - mov r8, r0 - movs r6, 0 - movs r2, 0 - ldr r1, _08091050 - mov r9, r1 - mov r12, r9 -_0809100E: - movs r1, 0 - lsls r3, r2, 2 - ldr r7, _08091054 - adds r0, r3, r7 - ldr r0, [r0] - adds r7, r2, 0x1 - cmp r5, r0 - blt _0809102C - ldr r2, _08091054 -_08091020: - adds r0, r3, r2 - ldr r0, [r0] - subs r5, r0 - adds r1, 0x1 - cmp r5, r0 - bge _08091020 -_0809102C: - cmp r1, 0x9 - ble _08091032 - movs r1, 0x9 -_08091032: - cmp r1, 0 - beq _0809105C - movs r0, 0x1 - mov r8, r0 - lsls r1, 1 - mov r2, r12 - adds r0, r1, r2 - ldrb r0, [r0] - strb r0, [r4] - adds r4, 0x1 - ldr r0, _08091058 - adds r1, r0 - ldrb r0, [r1] - b _0809106C - .align 2, 0 -_08091050: .4byte gUnknown_81097C4 -_08091054: .4byte gUnknown_81097B0 -_08091058: .4byte gUnknown_81097C5 -_0809105C: - mov r1, r8 - cmp r1, 0 - beq _08091074 - mov r2, r12 - ldrb r0, [r2] - strb r0, [r4] - adds r4, 0x1 - ldrb r0, [r2, 0x1] -_0809106C: - strb r0, [r4] - adds r4, 0x1 - adds r6, 0x1 - b _08091080 -_08091074: - mov r0, r10 - cmp r0, 0 - beq _08091080 - movs r0, 0x60 - strb r0, [r4] - adds r4, 0x1 -_08091080: - adds r2, r7, 0 - cmp r2, 0x4 - ble _0809100E - lsls r1, r5, 1 - mov r2, r9 - adds r0, r1, r2 - ldrb r0, [r0] - strb r0, [r4] - adds r4, 0x1 - mov r0, r9 - adds r0, 0x1 - adds r1, r0 - ldrb r0, [r1] - strb r0, [r4] - adds r6, 0x1 - movs r0, 0 - strb r0, [r4, 0x1] - adds r0, r6, 0 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8090FEC - - .align 2,0 diff --git a/asm/items_1.s b/asm/items_1.s deleted file mode 100644 index 625ba0a..0000000 --- a/asm/items_1.s +++ /dev/null @@ -1,1009 +0,0 @@ - .include "constants/gba_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_80918EC -sub_80918EC: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - movs r0, 0 -_080918F8: - adds r1, r0, 0x1 - mov r8, r1 - mov r6, r8 - cmp r1, 0x7 - bgt _08091964 - ldr r1, _08091978 - mov r9, r1 - lsls r7, r0, 2 - movs r0, 0x8C - lsls r0, 2 - mov r10, r0 -_0809190E: - mov r1, r9 - ldr r0, [r1] - adds r0, r7 - add r0, r10 - ldrb r0, [r0] - bl GetItemOrder - adds r4, r0, 0 - mov r1, r9 - ldr r0, [r1] - lsls r5, r6, 2 - adds r0, r5 - add r0, r10 - ldrb r0, [r0] - bl GetItemOrder - cmp r4, r0 - bgt _0809194C - cmp r4, r0 - bne _0809195E - mov r1, r9 - ldr r0, [r1] - adds r2, r0, r7 - ldr r1, _0809197C - adds r2, r1 - adds r0, r5 - adds r0, r1 - ldrb r1, [r2] - ldrb r0, [r0] - cmp r1, r0 - bcs _0809195E -_0809194C: - mov r1, r9 - ldr r0, [r1] - add r0, r10 - adds r2, r0, r7 - ldr r3, [r2] - adds r0, r5 - ldr r1, [r0] - str r1, [r2] - str r3, [r0] -_0809195E: - adds r6, 0x1 - cmp r6, 0x7 - ble _0809190E -_08091964: - mov r0, r8 - cmp r0, 0x6 - ble _080918F8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08091978: .4byte gTeamInventory_203B460 -_0809197C: .4byte 0x00000231 - thumb_func_end sub_80918EC - - thumb_func_start sub_8091980 -sub_8091980: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x10 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - mov r1, sp - ldr r0, _080919F4 - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldr r0, [r0] - str r0, [r1] - movs r5, 0 -_0809199C: - lsls r0, r5, 24 - lsrs r0, 24 - bl xxx_init_unk230_substruct - adds r5, 0x1 - cmp r5, 0x7 - ble _0809199C - mov r0, r8 - lsls r7, r0, 2 - ldr r6, _080919F8 - movs r5, 0x7 -_080919B2: - adds r0, r6, 0 - bl RandomCapped - adds r4, r0, 0 - adds r0, r6, 0 - bl RandomCapped - adds r2, r0, 0 - mov r1, sp - adds r0, r1, r7 - ldr r0, [r0] - adds r1, r4, 0 - bl sub_8091E94 - lsls r0, 24 - lsrs r0, 24 - bl sub_80919FC - subs r5, 0x1 - cmp r5, 0 - bge _080919B2 - bl sub_80918EC - mov r0, r8 - bl sub_8091BB4 - add sp, 0x10 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080919F4: .4byte gUnknown_81097E8 -_080919F8: .4byte 0x0000270f - thumb_func_end sub_8091980 - - thumb_func_start sub_80919FC -sub_80919FC: - push {r4,r5,lr} - sub sp, 0x4 - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - mov r0, sp - bl sub_8090B08 - movs r3, 0 - ldr r5, _08091A34 - movs r4, 0x8C - lsls r4, 2 -_08091A14: - ldr r1, [r5] - lsls r2, r3, 2 - adds r0, r1, r2 - adds r0, r4 - ldrb r0, [r0] - cmp r0, 0 - bne _08091A38 - movs r3, 0x8C - lsls r3, 2 - adds r0, r1, r3 - adds r0, r2 - ldr r1, [sp] - str r1, [r0] - movs r0, 0 - b _08091A40 - .align 2, 0 -_08091A34: .4byte gTeamInventory_203B460 -_08091A38: - adds r3, 0x1 - cmp r3, 0x7 - ble _08091A14 - movs r0, 0x1 -_08091A40: - add sp, 0x4 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_80919FC - - thumb_func_start sub_8091A48 -sub_8091A48: - push {lr} - movs r3, 0 - ldr r0, _08091A70 - ldr r0, [r0] - movs r2, 0x94 - lsls r2, 2 - adds r1, r0, r2 - movs r2, 0x3 -_08091A58: - ldrb r0, [r1] - cmp r0, 0 - beq _08091A60 - adds r3, 0x1 -_08091A60: - adds r1, 0x4 - subs r2, 0x1 - cmp r2, 0 - bge _08091A58 - adds r0, r3, 0 - pop {r1} - bx r1 - .align 2, 0 -_08091A70: .4byte gTeamInventory_203B460 - thumb_func_end sub_8091A48 - - thumb_func_start sub_8091A74 -sub_8091A74: - lsls r0, 24 - ldr r1, _08091A8C - lsrs r0, 22 - movs r2, 0x94 - lsls r2, 2 - adds r0, r2 - ldr r1, [r1] - adds r1, r0 - movs r0, 0 - strb r0, [r1] - strb r0, [r1, 0x1] - bx lr - .align 2, 0 -_08091A8C: .4byte gTeamInventory_203B460 - thumb_func_end sub_8091A74 - - thumb_func_start sub_8091A90 -sub_8091A90: - lsls r0, 24 - ldr r1, _08091AA4 - lsrs r0, 22 - movs r2, 0x94 - lsls r2, 2 - adds r0, r2 - ldr r1, [r1] - adds r1, r0 - adds r0, r1, 0 - bx lr - .align 2, 0 -_08091AA4: .4byte gTeamInventory_203B460 - thumb_func_end sub_8091A90 - - thumb_func_start sub_8091AA8 -sub_8091AA8: - push {r4-r7,lr} - movs r2, 0 - movs r4, 0 - ldr r7, _08091AB8 - movs r6, 0x94 - lsls r6, 2 - movs r3, 0 - b _08091AD4 - .align 2, 0 -_08091AB8: .4byte gTeamInventory_203B460 -_08091ABC: - cmp r2, r4 - ble _08091ACE - ldr r0, [r7] - lsls r1, r4, 2 - adds r0, r6 - adds r1, r0, r1 - adds r0, r3 - ldr r0, [r0] - str r0, [r1] -_08091ACE: - adds r3, 0x4 - adds r2, 0x1 - adds r4, 0x1 -_08091AD4: - cmp r2, 0x3 - bgt _08091AFE - ldr r0, [r7] - adds r0, r3 - adds r0, r6 - ldrb r0, [r0] - cmp r0, 0 - bne _08091AFE - ldr r5, _08091B1C - movs r1, 0x94 - lsls r1, 2 -_08091AEA: - adds r3, 0x4 - adds r2, 0x1 - cmp r2, 0x3 - bgt _08091AFE - ldr r0, [r5] - adds r0, r3 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0 - beq _08091AEA -_08091AFE: - cmp r2, 0x4 - bne _08091ABC - cmp r4, 0x3 - bgt _08091B14 -_08091B06: - lsls r0, r4, 24 - lsrs r0, 24 - bl sub_8091A74 - adds r4, 0x1 - cmp r4, 0x3 - ble _08091B06 -_08091B14: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08091B1C: .4byte gTeamInventory_203B460 - thumb_func_end sub_8091AA8 - - thumb_func_start sub_8091B20 -sub_8091B20: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - movs r0, 0 -_08091B2C: - adds r1, r0, 0x1 - mov r8, r1 - mov r6, r8 - cmp r1, 0x3 - bgt _08091B98 - ldr r1, _08091BAC - mov r9, r1 - lsls r7, r0, 2 - movs r0, 0x94 - lsls r0, 2 - mov r10, r0 -_08091B42: - mov r1, r9 - ldr r0, [r1] - adds r0, r7 - add r0, r10 - ldrb r0, [r0] - bl GetItemOrder - adds r4, r0, 0 - mov r1, r9 - ldr r0, [r1] - lsls r5, r6, 2 - adds r0, r5 - add r0, r10 - ldrb r0, [r0] - bl GetItemOrder - cmp r4, r0 - bgt _08091B80 - cmp r4, r0 - bne _08091B92 - mov r1, r9 - ldr r0, [r1] - adds r2, r0, r7 - ldr r1, _08091BB0 - adds r2, r1 - adds r0, r5 - adds r0, r1 - ldrb r1, [r2] - ldrb r0, [r0] - cmp r1, r0 - bcs _08091B92 -_08091B80: - mov r1, r9 - ldr r0, [r1] - add r0, r10 - adds r2, r0, r7 - ldr r3, [r2] - adds r0, r5 - ldr r1, [r0] - str r1, [r2] - str r3, [r0] -_08091B92: - adds r6, 0x1 - cmp r6, 0x3 - ble _08091B42 -_08091B98: - mov r0, r8 - cmp r0, 0x2 - ble _08091B2C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08091BAC: .4byte gTeamInventory_203B460 -_08091BB0: .4byte 0x00000251 - thumb_func_end sub_8091B20 - - thumb_func_start sub_8091BB4 -sub_8091BB4: - push {r4-r7,lr} - sub sp, 0x10 - lsls r0, 24 - lsrs r4, r0, 24 - mov r1, sp - ldr r0, _08091C14 - ldm r0!, {r2,r3,r5} - stm r1!, {r2,r3,r5} - ldr r0, [r0] - str r0, [r1] - movs r5, 0 -_08091BCA: - lsls r0, r5, 24 - lsrs r0, 24 - bl sub_8091A74 - adds r5, 0x1 - cmp r5, 0x3 - ble _08091BCA - lsls r7, r4, 2 - ldr r6, _08091C18 - movs r5, 0x3 -_08091BDE: - adds r0, r6, 0 - bl RandomCapped - adds r4, r0, 0 - adds r0, r6, 0 - bl RandomCapped - adds r2, r0, 0 - mov r1, sp - adds r0, r1, r7 - ldr r0, [r0] - adds r1, r4, 0 - bl sub_8091E94 - lsls r0, 24 - lsrs r0, 24 - bl sub_8091C1C - subs r5, 0x1 - cmp r5, 0 - bge _08091BDE - bl sub_8091B20 - add sp, 0x10 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08091C14: .4byte gUnknown_81097F8 -_08091C18: .4byte 0x0000270f - thumb_func_end sub_8091BB4 - - thumb_func_start sub_8091C1C -sub_8091C1C: - push {r4,r5,lr} - sub sp, 0x4 - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - mov r0, sp - bl sub_8090B08 - movs r3, 0 - ldr r5, _08091C54 - movs r4, 0x94 - lsls r4, 2 -_08091C34: - ldr r1, [r5] - lsls r2, r3, 2 - adds r0, r1, r2 - adds r0, r4 - ldrb r0, [r0] - cmp r0, 0 - bne _08091C58 - movs r3, 0x94 - lsls r3, 2 - adds r0, r1, r3 - adds r0, r2 - ldr r1, [sp] - str r1, [r0] - movs r0, 0 - b _08091C60 - .align 2, 0 -_08091C54: .4byte gTeamInventory_203B460 -_08091C58: - adds r3, 0x1 - cmp r3, 0x3 - ble _08091C34 - movs r0, 0x1 -_08091C60: - add sp, 0x4 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_8091C1C - - thumb_func_start sub_8091C68 -sub_8091C68: - push {r4-r6,lr} - sub sp, 0x10 - adds r3, r0, 0 - adds r2, r1, 0 - mov r0, sp - adds r1, r3, 0 - bl sub_809486C - movs r4, 0 - ldr r5, _08091D10 -_08091C7C: - lsls r0, r4, 2 - ldr r1, [r5] - adds r1, r0 - mov r0, sp - bl sub_8091E28 - adds r4, 0x1 - cmp r4, 0x13 - ble _08091C7C - ldr r6, _08091D10 - movs r5, 0x50 - movs r4, 0xEF -_08091C94: - ldr r1, [r6] - adds r1, r5 - mov r0, sp - movs r2, 0xA - bl sub_809488C - adds r5, 0x2 - subs r4, 0x1 - cmp r4, 0 - bge _08091C94 - ldr r6, _08091D10 - movs r5, 0x8C - lsls r5, 2 - movs r4, 0x7 -_08091CB0: - ldr r1, [r6] - adds r1, r5 - mov r0, sp - bl sub_8091DE0 - adds r5, 0x4 - subs r4, 0x1 - cmp r4, 0 - bge _08091CB0 - ldr r6, _08091D10 - movs r5, 0x94 - lsls r5, 2 - movs r4, 0x3 -_08091CCA: - ldr r1, [r6] - adds r1, r5 - mov r0, sp - bl sub_8091DE0 - adds r5, 0x4 - subs r4, 0x1 - cmp r4, 0 - bge _08091CCA - ldr r4, _08091D10 - ldr r1, [r4] - movs r0, 0x98 - lsls r0, 2 - adds r1, r0 - mov r0, sp - movs r2, 0x18 - bl sub_809488C - ldr r1, [r4] - movs r0, 0x99 - lsls r0, 2 - adds r1, r0 - mov r0, sp - movs r2, 0x18 - bl sub_809488C - mov r0, sp - bl nullsub_102 - ldr r0, [sp, 0x8] - add sp, 0x10 - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_08091D10: .4byte gTeamInventory_203B460 - thumb_func_end sub_8091C68 - - thumb_func_start sub_8091D14 -sub_8091D14: - push {r4-r6,lr} - sub sp, 0x10 - adds r3, r0, 0 - adds r2, r1, 0 - mov r0, sp - adds r1, r3, 0 - bl sub_809485C - movs r4, 0 - ldr r5, _08091DBC -_08091D28: - lsls r0, r4, 2 - ldr r1, [r5] - adds r1, r0 - mov r0, sp - bl sub_8091E00 - adds r4, 0x1 - cmp r4, 0x13 - ble _08091D28 - ldr r6, _08091DBC - movs r5, 0x50 - movs r4, 0xEF -_08091D40: - ldr r1, [r6] - adds r1, r5 - mov r0, sp - movs r2, 0xA - bl sub_8094924 - adds r5, 0x2 - subs r4, 0x1 - cmp r4, 0 - bge _08091D40 - ldr r6, _08091DBC - movs r5, 0x8C - lsls r5, 2 - movs r4, 0x7 -_08091D5C: - ldr r1, [r6] - adds r1, r5 - mov r0, sp - bl sub_8091DC0 - adds r5, 0x4 - subs r4, 0x1 - cmp r4, 0 - bge _08091D5C - ldr r6, _08091DBC - movs r5, 0x94 - lsls r5, 2 - movs r4, 0x3 -_08091D76: - ldr r1, [r6] - adds r1, r5 - mov r0, sp - bl sub_8091DC0 - adds r5, 0x4 - subs r4, 0x1 - cmp r4, 0 - bge _08091D76 - ldr r4, _08091DBC - ldr r1, [r4] - movs r0, 0x98 - lsls r0, 2 - adds r1, r0 - mov r0, sp - movs r2, 0x18 - bl sub_8094924 - ldr r1, [r4] - movs r0, 0x99 - lsls r0, 2 - adds r1, r0 - mov r0, sp - movs r2, 0x18 - bl sub_8094924 - mov r0, sp - bl nullsub_102 - ldr r0, [sp, 0x8] - add sp, 0x10 - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_08091DBC: .4byte gTeamInventory_203B460 - thumb_func_end sub_8091D14 - - thumb_func_start sub_8091DC0 -sub_8091DC0: - push {r4,r5,lr} - adds r5, r0, 0 - adds r4, r1, 0 - movs r2, 0x8 - bl sub_8094924 - adds r4, 0x1 - adds r0, r5, 0 - adds r1, r4, 0 - movs r2, 0x7 - bl sub_8094924 - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_8091DC0 - - thumb_func_start sub_8091DE0 -sub_8091DE0: - push {r4,r5,lr} - adds r5, r0, 0 - adds r4, r1, 0 - movs r2, 0x8 - bl sub_809488C - adds r4, 0x1 - adds r0, r5, 0 - adds r1, r4, 0 - movs r2, 0x7 - bl sub_809488C - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_8091DE0 - - thumb_func_start sub_8091E00 -sub_8091E00: - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - movs r2, 0x8 - bl sub_8094924 - adds r1, r5, 0x1 - adds r0, r4, 0 - movs r2, 0x7 - bl sub_8094924 - adds r5, 0x2 - adds r0, r4, 0 - adds r1, r5, 0 - movs r2, 0x8 - bl sub_8094924 - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_8091E00 - - thumb_func_start sub_8091E28 -sub_8091E28: - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - movs r2, 0x8 - bl sub_809488C - adds r1, r5, 0x1 - adds r0, r4, 0 - movs r2, 0x7 - bl sub_809488C - adds r5, 0x2 - adds r0, r4, 0 - adds r1, r5, 0 - movs r2, 0x8 - bl sub_809488C - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_8091E28 - - thumb_func_start sub_8091E50 -sub_8091E50: - lsls r0, 24 - ldr r1, _08091E5C - lsrs r0, 22 - adds r0, r1 - ldr r0, [r0] - bx lr - .align 2, 0 -_08091E5C: .4byte gUnknown_810AF50 - thumb_func_end sub_8091E50 - - thumb_func_start sub_8091E60 -sub_8091E60: - push {r4,lr} - lsls r0, 24 - lsrs r3, r0, 24 - lsls r0, r1, 24 - lsrs r4, r0, 24 - cmp r3, 0x3E - bhi _08091E8C - ldr r2, _08091E88 - lsrs r0, 27 - lsls r1, r3, 5 - adds r0, r1 - adds r0, r2 - ldrb r0, [r0] - movs r1, 0x7 - ands r1, r4 - asrs r0, r1 - movs r1, 0x1 - ands r0, r1 - b _08091E8E - .align 2, 0 -_08091E88: .4byte gUnknown_8108F64 -_08091E8C: - movs r0, 0 -_08091E8E: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_8091E60 - - thumb_func_start sub_8091E94 -sub_8091E94: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - ldr r4, _08091EE4 - add sp, r4 - mov r8, r1 - mov r10, r2 - ldr r1, _08091EE8 - subs r0, 0x1 - lsls r0, 2 - adds r0, r1 - movs r3, 0 - add r1, sp, 0x18 - mov r9, r1 - ldr r2, _08091EEC - mov r12, r2 - add r6, sp, 0x1F8 - ldr r2, [r0] - adds r7, r6, 0 - movs r4, 0 -_08091EC0: - ldrh r1, [r2] - cmp r1, r12 - bls _08091EF4 - ldrh r0, [r2] - ldr r1, _08091EF0 - adds r0, r1 - cmp r0, 0 - beq _08091EFC - movs r5, 0 - adds r1, r7, r4 -_08091ED4: - strh r5, [r1] - adds r1, 0x2 - adds r4, 0x2 - adds r3, 0x1 - subs r0, 0x1 - cmp r0, 0 - bne _08091ED4 - b _08091EFC - .align 2, 0 -_08091EE4: .4byte 0xfffffc10 -_08091EE8: .4byte gUnknown_8108E58 -_08091EEC: .4byte 0x0000752f -_08091EF0: .4byte 0xffff8ad0 -_08091EF4: - adds r0, r6, r4 - strh r1, [r0] - adds r4, 0x2 - adds r3, 0x1 -_08091EFC: - adds r2, 0x2 - cmp r3, 0xFB - ble _08091EC0 - movs r3, 0xB - add r2, sp, 0x1F8 - mov r1, sp -_08091F08: - ldrh r0, [r2] - strh r0, [r1] - adds r2, 0x2 - adds r1, 0x2 - subs r3, 0x1 - cmp r3, 0 - bge _08091F08 - mov r2, r9 - add r1, sp, 0x210 - movs r3, 0xEF -_08091F1C: - ldrh r0, [r1] - strh r0, [r2] - adds r1, 0x2 - adds r2, 0x2 - subs r3, 0x1 - cmp r3, 0 - bge _08091F1C - movs r7, 0xC - movs r6, 0 - mov r0, sp - movs r2, 0 - ldrsh r0, [r0, r2] - cmp r0, 0 - beq _08091F4A - mov r0, sp - movs r1, 0 - ldrsh r0, [r0, r1] - cmp r0, r8 - blt _08091F4A - movs r7, 0 - b _08091F66 -_08091F46: - mov r8, r5 - b _08091F9C -_08091F4A: - adds r6, 0x1 - cmp r6, 0xB - bgt _08091F66 - lsls r0, r6, 1 - mov r2, sp - adds r1, r2, r0 - movs r2, 0 - ldrsh r0, [r1, r2] - cmp r0, 0 - beq _08091F4A - cmp r0, r8 - blt _08091F4A - lsls r0, r6, 24 - lsrs r7, r0, 24 -_08091F66: - movs r0, 0x46 - mov r8, r0 - cmp r7, 0xC - beq _08091F9C - movs r6, 0 - mov r4, r9 -_08091F72: - movs r1, 0 - ldrsh r0, [r4, r1] - cmp r0, 0 - beq _08091F94 - lsls r0, r6, 24 - lsrs r5, r0, 24 - adds r0, r5, 0 - bl GetItemType - lsls r0, 24 - lsrs r0, 24 - cmp r0, r7 - bne _08091F94 - movs r2, 0 - ldrsh r0, [r4, r2] - cmp r0, r10 - bge _08091F46 -_08091F94: - adds r4, 0x2 - adds r6, 0x1 - cmp r6, 0xEF - ble _08091F72 -_08091F9C: - mov r0, r8 - movs r3, 0xFC - lsls r3, 2 - add sp, r3 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8091E94 - - thumb_func_start sub_8091FB4 -sub_8091FB4: - push {r4-r6,lr} - movs r6, 0 -_08091FB8: - ldr r0, _08092038 - lsls r1, r6, 2 - ldr r0, [r0] - adds r4, r0, r1 - ldrb r1, [r4] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08091FE8 - movs r0, 0xF7 - ands r0, r1 - movs r5, 0 - strb r0, [r4] - ldrb r0, [r4, 0x2] - cmp r0, 0x69 - bne _08091FE8 - adds r0, r4, 0 - bl GetMoneyValue - bl AddToTeamMoney - strb r5, [r4, 0x2] - strb r5, [r4, 0x1] - strb r5, [r4] -_08091FE8: - adds r6, 0x1 - cmp r6, 0x13 - ble _08091FB8 - bl FillInventoryGaps - movs r6, 0 -_08091FF4: - movs r0, 0x58 - adds r1, r6, 0 - muls r1, r0 - ldr r0, _0809203C - ldr r0, [r0] - adds r2, r1, r0 - ldrb r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08092026 - adds r4, r2, 0 - adds r4, 0x28 - ldrb r0, [r4] - cmp r0, 0 - beq _08092026 - cmp r0, 0x69 - bne _08092026 - adds r0, r4, 0 - bl GetMoneyValue2 - bl AddToTeamMoney - movs r0, 0 - strb r0, [r4] -_08092026: - adds r6, 0x1 - movs r0, 0xCE - lsls r0, 1 - cmp r6, r0 - ble _08091FF4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08092038: .4byte gTeamInventory_203B460 -_0809203C: .4byte gRecruitedPokemonRef - thumb_func_end sub_8091FB4 - - .align 2,0
\ No newline at end of file diff --git a/asm/kangaskhan_storage_2.s b/asm/kangaskhan_storage_2.s index 0d1743f..13f1b92 100644 --- a/asm/kangaskhan_storage_2.s +++ b/asm/kangaskhan_storage_2.s @@ -661,7 +661,7 @@ _080187E0: adds r0, 0x8 ldrb r1, [r1, 0x10] movs r2, 0 - bl sub_8090A8C + bl xxx_init_itemslot_8090A8C ldr r1, [r4] movs r0, 0x1 strb r0, [r1, 0x9] @@ -680,7 +680,7 @@ _0801880C: adds r0, 0x8 ldrb r1, [r1, 0x10] movs r2, 0 - bl sub_8090A8C + bl xxx_init_itemslot_8090A8C ldr r1, [r4] movs r0, 0x1 strb r0, [r1, 0x9] diff --git a/asm/kecleon_items.s b/asm/kecleon_items.s index a0f9646..90bf697 100644 --- a/asm/kecleon_items.s +++ b/asm/kecleon_items.s @@ -1223,7 +1223,7 @@ _08019874: adds r0, r1, 0 adds r0, 0x20 ldrb r0, [r0] - bl sub_809185C + bl xxx_get_inv_unk230_at_809185C bl sub_8091274 ldr r0, [r4] adds r0, 0x20 @@ -1237,13 +1237,13 @@ _080198AC: adds r0, r1, 0 adds r0, 0x21 ldrb r0, [r0] - bl sub_8091A90 + bl xxx_get_unk250_at_8091A90 bl sub_8091274 ldr r0, [r4] adds r0, 0x21 ldrb r0, [r0] - bl sub_8091A74 - bl sub_8091AA8 + bl xxx_init_inv_unk250_at_8091A74 + bl xxx_fill_inv_unk250_gaps_8091AA8 _080198C8: movs r0, 0xA6 lsls r0, 1 @@ -1419,7 +1419,7 @@ _08019A04: ldr r0, [r4] adds r0, 0x20 ldrb r0, [r0] - bl sub_809185C + bl xxx_get_inv_unk230_at_809185C b _08019A3C .align 2, 0 _08019A24: .4byte gUnknown_203B210 @@ -1431,7 +1431,7 @@ _08019A28: ldr r0, [r4] adds r0, 0x21 ldrb r0, [r0] - bl sub_8091A90 + bl xxx_get_unk250_at_8091A90 _08019A3C: adds r5, r0, 0 ldr r4, _08019A68 @@ -1439,7 +1439,7 @@ _08019A3C: adds r0, 0x1C ldrb r1, [r5] movs r2, 0 - bl sub_8090A8C + bl xxx_init_itemslot_8090A8C ldr r1, [r4] ldrb r0, [r5, 0x1] strb r0, [r1, 0x1D] @@ -1466,7 +1466,7 @@ _08019A6C: ldr r0, [r4] adds r0, 0x20 ldrb r0, [r0] - bl sub_809185C + bl xxx_get_inv_unk230_at_809185C b _08019AA4 .align 2, 0 _08019A8C: .4byte gUnknown_203B210 @@ -1478,7 +1478,7 @@ _08019A90: ldr r0, [r4] adds r0, 0x21 ldrb r0, [r0] - bl sub_8091A90 + bl xxx_get_unk250_at_8091A90 _08019AA4: adds r5, r0, 0 ldr r4, _08019AD0 @@ -1486,7 +1486,7 @@ _08019AA4: adds r0, 0x1C ldrb r1, [r5] movs r2, 0 - bl sub_8090A8C + bl xxx_init_itemslot_8090A8C ldr r1, [r4] ldrb r0, [r5, 0x1] strb r0, [r1, 0x1D] diff --git a/asm/pokemon.s b/asm/pokemon.s index ab75d5f..4f14847 100644 --- a/asm/pokemon.s +++ b/asm/pokemon.s @@ -226,7 +226,7 @@ sub_808CFD0: adds r0, r7, 0 adds r0, 0x28 adds r1, r4, 0 - bl sub_8090B08 + bl xxx_init_helditem_8090B08 mov r4, r8 str r4, [r7, 0x1C] adds r0, r7, 0 @@ -387,7 +387,7 @@ sub_808D144: adds r0, r5, 0 adds r0, 0x28 ldrb r1, [r7, 0x6] - bl sub_8090B08 + bl xxx_init_helditem_8090B08 ldr r0, [r7, 0x24] str r0, [r5, 0x1C] adds r0, r5, 0 diff --git a/asm/pokemon_2.s b/asm/pokemon_2.s index 8232d41..f2e7742 100644 --- a/asm/pokemon_2.s +++ b/asm/pokemon_2.s @@ -92,7 +92,7 @@ _0808DEDA: beq _0808DF00 adds r0, r2, 0 mov r1, r12 - bl sub_8090B64 + bl HeldItemToSlot b _0808DF06 _0808DF00: strb r0, [r2, 0x2] @@ -204,7 +204,7 @@ _0808DFB2: beq _0808DFD4 adds r0, r6, 0 adds r1, r7, 0 - bl sub_8090BB0 + bl SlotToHeldItem b _0808DFD6 _0808DFD4: strb r1, [r6] @@ -230,7 +230,7 @@ sub_808DFDC: beq _0808E004 adds r0, r3, 0 adds r0, 0x28 - bl sub_8090BB0 + bl SlotToHeldItem b _0808E00A .align 2, 0 _0808E000: .4byte gRecruitedPokemonRef diff --git a/asm/pokemon_3.s b/asm/pokemon_3.s index 50a9aec..e3647fc 100644 --- a/asm/pokemon_3.s +++ b/asm/pokemon_3.s @@ -2379,7 +2379,7 @@ _08090026: strb r1, [r0] subs r0, 0x34 adds r1, r4, 0 - bl sub_8090B64 + bl HeldItemToSlot ldrh r0, [r6, 0x14] strh r0, [r5, 0x3E] ldr r0, [r6, 0x4] diff --git a/asm/pokemon_square.s b/asm/pokemon_square.s index b6469c8..7ff1b2c 100644 --- a/asm/pokemon_square.s +++ b/asm/pokemon_square.s @@ -117,7 +117,7 @@ _08019F24: bl sub_8019FB0 lsls r0, 24 lsrs r0, 24 - bl sub_809185C + bl xxx_get_inv_unk230_at_809185C ldrb r2, [r0] lsls r2, 16 ldr r3, _08019F68 @@ -376,7 +376,7 @@ _0801A122: adds r0, r6 lsls r0, 24 lsrs r0, 24 - bl sub_809185C + bl xxx_get_inv_unk230_at_809185C ldrb r2, [r0] lsls r2, 16 ldr r3, _0801A1AC @@ -478,7 +478,7 @@ _0801A208: .4byte gUnknown_203B214 sub_801A20C: push {r4-r6,lr} adds r6, r0, 0 - bl sub_8091A48 + bl xxx_count_non_empty_inv_unk250_8091A48 cmp r0, 0 beq _0801A2A0 ldr r5, _0801A294 @@ -518,7 +518,7 @@ sub_801A20C: movs r2, 0x1 bl sub_800641C ldr r4, [r5] - bl sub_8091A48 + bl xxx_count_non_empty_inv_unk250_8091A48 adds r1, r0, 0 adds r0, r4, 0 movs r2, 0xA @@ -585,7 +585,7 @@ _0801A2F0: bl sub_801A37C lsls r0, 24 lsrs r0, 24 - bl sub_8091A90 + bl xxx_get_unk250_at_8091A90 ldrb r2, [r0] lsls r2, 16 ldr r3, _0801A334 @@ -680,7 +680,7 @@ sub_801A398: movs r1, 0 movs r2, 0 bl sub_800641C - bl sub_8091A48 + bl xxx_count_non_empty_inv_unk250_8091A48 adds r1, r0, 0 ldr r0, [r5] strh r1, [r0, 0x22] @@ -844,7 +844,7 @@ _0801A4EE: adds r0, r6 lsls r0, 24 lsrs r0, 24 - bl sub_8091A90 + bl xxx_get_unk250_at_8091A90 ldrb r2, [r0] lsls r2, 16 ldr r3, _0801A578 diff --git a/data/data_80F4278.s b/data/data_80F4278.s index ce6db28..9555514 100644 --- a/data/data_80F4278.s +++ b/data/data_80F4278.s @@ -7970,6 +7970,7 @@ gUnknown_8108084: @ 8108084 .global gUnknown_8108E58 gUnknown_8108E58: @ 8108E58 @ replacing .incbin "baserom.gba", 0x00108e58, 0x68 +@ u16*s .4byte 0x8108184 .4byte 0x810819c .4byte 0x81081ea diff --git a/include/code_8092334.h b/include/code_8092334.h new file mode 100644 index 0000000..6f7fcae --- /dev/null +++ b/include/code_8092334.h @@ -0,0 +1,21 @@ +#ifndef GUARD_CODE_8092334_H +#define GUARD_CODE_8092334_H + + +struct unkStruct_8094924 +{ + // size: 0x10? + u8 *unk0; // head? + u8 *unk4; // tail? + u32 unk8; + u32 unkC; +}; + +void sub_809486C(struct unkStruct_8094924 *r0, u8 *r1, s32 size); +void nullsub_102(struct unkStruct_8094924 *r0); +void sub_809488C(struct unkStruct_8094924 *r0, u8 *r1, s32 size); +void sub_809485C(struct unkStruct_8094924 *r0, u8 *r1, s32 size); +void sub_80948E4(struct unkStruct_8094924 *r0, u8 *r1, s32 size); +void sub_8094924(struct unkStruct_8094924 *r0, u8 *r1, s32 size); + +#endif
\ No newline at end of file diff --git a/include/friend_area_action_menu.h b/include/friend_area_action_menu.h index aa82d6b..371811f 100644 --- a/include/friend_area_action_menu.h +++ b/include/friend_area_action_menu.h @@ -16,7 +16,7 @@ struct unkStruct_203B2BC s16 unk8; u16 unkA; u32 unkC; - struct ItemSlot_ALT unk10; + struct HeldItem unk10; u8 unk14; u8 fill15[3]; struct unkSubStruct_203B2BC *unk18; diff --git a/include/item.h b/include/item.h index 76db8a8..579c5c7 100644 --- a/include/item.h +++ b/include/item.h @@ -1,6 +1,8 @@ #ifndef GUARD_ITEMS_H #define GUARD_ITEMS_H +#include "code_8092334.h" + struct Item { /* 0x0 */ u8 *namePointer; @@ -28,11 +30,9 @@ struct ItemSlot u8 itemIndex; }; -struct ItemSlot_ALT -{ - u8 itemIndex; - u8 numItems; - u8 unk2; +struct HeldItem { + u8 itemIndex; + u8 numItems; }; struct unkStruct_80915F4 @@ -41,6 +41,15 @@ struct unkStruct_80915F4 u16 unk2; }; +struct unkStruct_8090F58 +{ + u32 unk0; + u8 unk4; + u8 unk5; + s16 unk6; + u8 unk8; +}; + enum ItemType { ITEM_TYPE_THROWABLE, @@ -337,16 +346,28 @@ u8 *GetItemDescription(u8 itemIndex); u32 GetItemUnkFood(u8 itemIndex, u32 r1); s32 GetNumberOfFilledInventorySlots(void); bool8 IsThrowableItem(u8 itemIndex); -void sub_8090A8C(struct ItemSlot *param_1,u8 itemIndex,u8 param_3); -void sub_8090B08(struct ItemSlot_ALT *param_1,u8 itemIndex); -void sub_8090B64(struct ItemSlot *param_1, struct ItemSlot_ALT *param_2); -void sub_8090DC4(void* param_1,u8 itemIndex,u32 param_3); +void xxx_init_itemslot_8090A8C(struct ItemSlot *param_1,u8 itemIndex,u8 param_3); +void xxx_init_helditem_8090B08(struct HeldItem *param_1,u8 itemIndex); +void HeldItemToSlot(struct ItemSlot *param_1, struct HeldItem *param_2); +void sub_8090DC4(void* param_1,u8 itemIndex, struct unkStruct_8090F58* param_3); bool8 AddItemToInventory(const struct ItemSlot* slot); void ConvertMoneyItemToMoney(); void AddToTeamMoney(s32 amount); u32 GetMoneyValue(struct ItemSlot* slot); u16 GetItemMove(u8 index); +bool8 CanSellItem(u32 id); bool8 IsGummiItem(u8); void xxx_init_unk230_substruct(u8); +bool8 xxx_insert_unk230_80919FC(u8); +u32 xxx_count_non_empty_inv_unk250_8091A48(); +void sub_8091BB4(u8); +void sub_8090F58(void*, u8 *, struct ItemSlot *, struct unkStruct_8090F58*); + +// some sort of weird memcpy's? +// not sure what the second argument should be typed as +void sub_8091DC0(struct unkStruct_8094924 *r0, u8*); +void sub_8091DE0(struct unkStruct_8094924 *a1, u8 *a2); +void sub_8091E00(struct unkStruct_8094924 *a1, u8 *a2); +void sub_8091E28(struct unkStruct_8094924 *a1, u8 *a2); #endif diff --git a/include/pokemon.h b/include/pokemon.h index 679a1d1..23a1311 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -2,6 +2,8 @@ #define GUARD_POKEMON_H #include "file_system.h" +#include "item.h" + struct PokemonStruct { @@ -28,9 +30,7 @@ struct PokemonStruct u8 unk20[4]; u8 unk24; u8 fill25[3]; - u8 itemIndexHeld; - u8 unk29; - u8 fill2A[2]; + struct HeldItem heldItem; u8 unk2C[4]; u8 fill30[0x4C - 0x30]; /* 0x4C */ u8 name[0xA]; diff --git a/include/team_inventory.h b/include/team_inventory.h index b8b8a09..36f5a87 100644 --- a/include/team_inventory.h +++ b/include/team_inventory.h @@ -1,18 +1,13 @@ #ifndef GUARD_TEAM_INVENTORY_H #define GUARD_TEAM_INVENTORY_H -struct subStruct_203B460 -{ - u8 unk0; - u8 unk1; -}; - struct TeamInventory { struct ItemSlot teamItems[INVENTORY_SIZE]; u16 teamStorage[NUMBER_OF_ITEM_IDS]; - struct subStruct_203B460 unk230[8]; // this is probably actually the same struct as ItemSlot_ALT (see sub_80919FC) - struct subStruct_203B460 unk250[4]; // TODO: idk if this is identical struct or not.. Ghidra says sizes are same + // same type (initialized by same function): + struct HeldItem unk230[8]; + struct HeldItem unk250[4]; /* 0x260 */ s32 teamMoney; /* 0x264 */ u32 teamSavings; }; diff --git a/ld_script.txt b/ld_script.txt index 6f1e488..2196068 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -199,9 +199,6 @@ SECTIONS { src/code_8090208.o(.text); asm/code_8090208.o(.text); src/items.o(.text); - asm/items.o(.text); - src/items_1.o(.text); - asm/items_1.o(.text); src/rescue_team_info.o(.text); src/text_util.o(.text); src/friend_area.o(.text); diff --git a/src/code_8057824_1.c b/src/code_8057824_1.c index 0337dce..a6af881 100644 --- a/src/code_8057824_1.c +++ b/src/code_8057824_1.c @@ -2,6 +2,7 @@ #include "gUnknown_203B418.h" #include "code_8041D5C.h" #include "pokemon.h" +#include "item.h" extern struct unkStruct_203B418 *gUnknown_203B418; @@ -257,8 +258,7 @@ extern struct unkDungeon_8041D5C *sub_8083600(); extern void sub_80421C0(struct unkDungeon_8041D5C *, u32); extern void sub_8046D20(); extern void sub_808B1CC(u8); -extern void sub_8090A8C(u8 *, u32, u32); -extern void sub_80464C8(struct unkDungeon_8041D5C *, u32, u8 *); +extern void sub_80464C8(struct unkDungeon_8041D5C *, u32, struct ItemSlot *); extern void sub_8098044(u32); extern void PlaySoundEffect(u32); extern void sub_8085C54(u32, u32, u32, u32, u32); @@ -3003,16 +3003,16 @@ void sub_808ACC0(void) sub_8068FE0(uVar2,0x21c,0); sub_8097FA8(0x22); sub_8097FA8(0x1d); - sub_808B1CC(0x79); + sub_808B1CC(ITEM_ID_ROCK_PART); } else { - if (sub_80860A8(0x79) != 0) { + if (sub_80860A8(ITEM_ID_ROCK_PART) != 0) { sub_8098044(0x22); sub_8097FA8(0x1d); } else { - if (sub_80860A8(0x7a) != 0) { + if (sub_80860A8(ITEM_ID_MUSIC_BOX) != 0) { sub_8098044(0x22); sub_8097FA8(0x1d); } @@ -3035,16 +3035,16 @@ void sub_808AD48(void) sub_8068FE0(uVar2,0x21c,0); sub_8097FA8(0x22); sub_8097FA8(0x1d); - sub_808B1CC(0x77); + sub_808B1CC(ITEM_ID_ICE_PART); } else { - if (sub_80860A8(0x77) != 0) { + if (sub_80860A8(ITEM_ID_ICE_PART) != 0) { sub_8098044(0x22); sub_8097FA8(0x1d); } else { - if (sub_80860A8(0x7a) != 0) { + if (sub_80860A8(ITEM_ID_MUSIC_BOX) != 0) { sub_8098044(0x22); sub_8097FA8(0x1d); } @@ -3068,16 +3068,16 @@ void sub_808ADCC(void) sub_8068FE0(uVar2,0x21c,0); sub_8097FA8(0x22); sub_8097FA8(0x1d); - sub_808B1CC(0x78); + sub_808B1CC(ITEM_ID_STEEL_PART); } else { - if (sub_80860A8(0x78) != 0) { + if (sub_80860A8(ITEM_ID_STEEL_PART) != 0) { sub_8098044(0x22); sub_8097FA8(0x1d); } else { - if (sub_80860A8(0x7a) != 0) { + if (sub_80860A8(ITEM_ID_MUSIC_BOX) != 0) { sub_8098044(0x22); sub_8097FA8(0x1d); } @@ -3095,7 +3095,7 @@ void sub_808AE54(char param_1,char param_2,u32 param_3) { struct unkDungeon_8041D5C * uVar3; u8 auStack24 [4]; - u8 auStack20 [4]; + struct ItemSlot auStack20; uVar3 = sub_8085480(); @@ -3103,8 +3103,8 @@ void sub_808AE54(char param_1,char param_2,u32 param_3) if ((sub_8098100(0x22) == 0) && (param_2 == 0x2E) && (param_1 == 0x17)) { sub_808B1CC(0); if (sub_8098100(0x1d) == 0) { - sub_8090A8C(auStack20,0x79,0); - sub_80464C8(sub_8083600(),param_3,auStack20); + xxx_init_itemslot_8090A8C(&auStack20,ITEM_ID_ROCK_PART,0); + sub_80464C8(sub_8083600(),param_3,&auStack20); sub_8083E88(0x72); // Something fell from Regirock's body // Regirock was apparently guarding this item @@ -3118,7 +3118,7 @@ void sub_808AEC8(char param_1,char param_2,u32 param_3) { struct unkDungeon_8041D5C * uVar3; u8 auStack24 [4]; - u8 auStack20 [4]; + struct ItemSlot auStack20; uVar3 = sub_8085480(); @@ -3126,8 +3126,8 @@ void sub_808AEC8(char param_1,char param_2,u32 param_3) if ((sub_8098100(0x22) == 0) && (param_2 == 0x2F) && (param_1 == 0x18)) { sub_808B1CC(0); if (sub_8098100(0x1d) == 0) { - sub_8090A8C(auStack20,0x77,0); - sub_80464C8(sub_8083600(),param_3,auStack20); + xxx_init_itemslot_8090A8C(&auStack20,ITEM_ID_ICE_PART,0); + sub_80464C8(sub_8083600(),param_3,&auStack20); sub_8083E88(0x72); // Something fell from Regice's body // Regice was apparently guarding this item @@ -3140,7 +3140,7 @@ void sub_808AF3C(char param_1,char param_2,u32 param_3) { struct unkDungeon_8041D5C * uVar3; u8 auStack24 [4]; - u8 auStack20 [4]; + struct ItemSlot auStack20; uVar3 = sub_8085480(); @@ -3148,8 +3148,8 @@ void sub_808AF3C(char param_1,char param_2,u32 param_3) if ((sub_8098100(0x22) == 0) && (param_2 == 0x30) && (param_1 == 0x19)) { sub_808B1CC(0); if (sub_8098100(0x1d) == 0) { - sub_8090A8C(auStack20,0x78,0); - sub_80464C8(sub_8083600(),param_3,auStack20); + xxx_init_itemslot_8090A8C(&auStack20,ITEM_ID_STEEL_PART,0); + sub_80464C8(sub_8083600(),param_3, &auStack20); sub_8083E88(0x72); // Something fell from Registeel's body // Registeel was apparently guarding this item @@ -3165,7 +3165,7 @@ void sub_808AFB0(char param_1) uVar3 = sub_8085480(); sub_8052D44(auStack12,uVar3,0); - if ((sub_8098100(0x22) == 0) && (param_1 == 0x2E) && (sub_8098100(0x1d) == 0) && (sub_80860A8(0x79) != 0)) { + if ((sub_8098100(0x22) == 0) && (param_1 == 0x2E) && (sub_8098100(0x1d) == 0) && (sub_80860A8(ITEM_ID_ROCK_PART) != 0)) { sub_8097FD0(0x1d); sub_8045B94(gAvailablePokemonNames,sub_8083600(),0); // $m0 obatined the Rock Part that Regirock was guarding @@ -3183,7 +3183,7 @@ void sub_808B030(char param_1) uVar3 = sub_8085480(); sub_8052D44(auStack12,uVar3,0); - if ((sub_8098100(0x22) == 0) && (param_1 == 0x2F) && (sub_8098100(0x1d) == 0) && (sub_80860A8(0x77) != 0)) { + if ((sub_8098100(0x22) == 0) && (param_1 == 0x2F) && (sub_8098100(0x1d) == 0) && (sub_80860A8(ITEM_ID_ICE_PART) != 0)) { sub_8097FD0(0x1d); sub_8045B94(gAvailablePokemonNames,sub_8083600(),0); // $m0 obatined the Ice Part that Regice was guarding @@ -3201,7 +3201,7 @@ void sub_808B0B0(char param_1) uVar3 = sub_8085480(); sub_8052D44(auStack12,uVar3,0); - if ((sub_8098100(0x22) == 0) && (param_1 == 0x30) && (sub_8098100(0x1d) == 0) && (sub_80860A8(0x78) != 0)) { + if ((sub_8098100(0x22) == 0) && (param_1 == 0x30) && (sub_8098100(0x1d) == 0) && (sub_80860A8(ITEM_ID_STEEL_PART) != 0)) { sub_8097FD0(0x1d); sub_8045B94(gAvailablePokemonNames, sub_8083600(), 0); // $m0 obatined the Steel Part that Registeel was guarding @@ -3341,7 +3341,7 @@ void sub_808B1CC(u8 r0) "\tadds r0, r4, 0\n" "\tadds r1, r6, 0\n" "\tmovs r2, 0\n" - "\tbl sub_8090A8C\n" + "\tbl xxx_init_itemslot_8090A8C\n" "\tldrh r0, [r5, 0x2]\n" "\tsubs r0, 0x1\n" "\tstrh r0, [r5, 0x2]\n" diff --git a/src/code_8092334.c b/src/code_8092334.c index e5a8334..d03f888 100644 --- a/src/code_8092334.c +++ b/src/code_8092334.c @@ -1,15 +1,8 @@ #include "global.h" +#include "code_8092334.h" #include "memory.h" #include "item.h" -struct unkStruct_8094924 -{ - // size: 0x10? - u8 *unk0; // head? - u8 *unk4; // tail? - u32 unk8; - u32 unkC; -}; s16 sub_8094828(u16 r0, u8 itemIndex) { diff --git a/src/code_80958E8.c b/src/code_80958E8.c index c8fae63..a6ff84a 100644 --- a/src/code_80958E8.c +++ b/src/code_80958E8.c @@ -36,7 +36,7 @@ extern s16 sub_808E770(s16); extern bool8 sub_8092040(u8); extern u8 sub_803C1D0(u8 *, u8); extern bool8 IsNotMoneyOrUsedTMItem(u8); -extern u8 sub_8091E60(u8 ,u8 ); +extern u8 xxx_bit_lut_lookup_8091E50(u8 ,u8 ); extern u32 GetMaxItemCount(u8); extern u8 sub_803C0DC(s16); extern void sub_8096040(u8); @@ -152,7 +152,7 @@ bool8 ValidateWonderMail(struct WonderMail *data) return FALSE; // Item finding - if(data->missionType == FIND_ITEM && sub_8091E60(data->dungeon, data->targetItem) == 0) + if(data->missionType == FIND_ITEM && xxx_bit_lut_lookup_8091E50(data->dungeon, data->targetItem) == 0) return FALSE; if(data->rewardType == BLANK_4 || data->rewardType == END_REWARDS || data->rewardType > END_REWARDS) diff --git a/src/code_8098BDC.c b/src/code_8098BDC.c index 6047dfa..b77cdf8 100644 --- a/src/code_8098BDC.c +++ b/src/code_8098BDC.c @@ -58,10 +58,10 @@ extern void sub_800199C(u8, u8, u8, s32); extern void sub_8098CC8(); extern void sub_809674C(); extern void sub_80961B4(); -extern void sub_8091FB4(); +extern void ClearAllItems_8091FB4(); extern const char *sub_80A2B18(s16); extern u8 sub_8001CC4(u8, u8, u8); -extern void sub_8091980(u32); +extern void xxx_inv_unk250_random_8091980(u32); extern u8 sub_80023E4(u32); extern void sub_80118C4(u16); @@ -166,10 +166,10 @@ void sub_8098CC8(void) { temp = 3; } - sub_8091980(temp); + xxx_inv_unk250_random_8091980(temp); sub_809674C(); sub_80961B4(); - sub_8091FB4(); + ClearAllItems_8091FB4(); } bool8 sub_8098D1C(s16 r0, u32 r1, u32 r2) diff --git a/src/debug_menu_mid.c b/src/debug_menu_mid.c index 20f3f71..5244c4b 100644 --- a/src/debug_menu_mid.c +++ b/src/debug_menu_mid.c @@ -208,7 +208,7 @@ void sub_803A5A0(void) sub_803A690(); break; case 4: - sub_8090A8C(&auStack8,gUnknown_203B3F0->itemIndex,0); + xxx_init_itemslot_8090A8C(&auStack8,gUnknown_203B3F0->itemIndex,0); sub_801B3C0(&auStack8); break; case 5: diff --git a/src/friend_area_1.c b/src/friend_area_1.c index 44f00a8..ff1da5d 100644 --- a/src/friend_area_1.c +++ b/src/friend_area_1.c @@ -1,47 +1,45 @@ #include "global.h" #include "constants/friend_area.h" +#include "code_8092334.h" extern bool8 *gFriendAreas; -extern void sub_809485C(u32 *r0, u8 *r1, u32 size); -extern void sub_8094924(u32 *r0, u32 *r1, u32); -extern void nullsub_102(u32 *r0); -extern void sub_809488C(u32 *r0, u32 *r1, u32 r2); -extern void sub_809486C(u32 *r0, u8 *r1, u32 size); u32 SaveFriendAreas(u8 *r0, u32 size) { - u32 temp[5]; + struct unkStruct_8094924 unk; + u32 temp; s32 counter; - sub_809486C(temp, r0, size); + sub_809486C(&unk, r0, size); for(counter = 0; counter < NUM_FRIEND_AREAS; counter++) { if(gFriendAreas[counter] != 0) - temp[4] = -1; + temp = -1; else - temp[4] = 0; - sub_809488C(temp, &(temp[4]), 1); + temp = 0; + sub_809488C(&unk, (u8*)&temp, 1); } - nullsub_102(temp); - return temp[2]; + nullsub_102(&unk); + return unk.unk8; } u32 ReadSavedFriendAreas(u8 *r0, s32 size) { - u32 temp[5]; + struct unkStruct_8094924 unk; + u32 temp; s32 counter; - sub_809485C(temp, r0, size); + sub_809485C(&unk, r0, size); for(counter = 0; counter < NUM_FRIEND_AREAS; counter++) { - sub_8094924(temp, &(temp[4]), 1); + sub_8094924(&unk, (u8*)&temp, 1); // It's setting whether we have the friend area or not - if((temp[4] & 1)) - gFriendAreas[counter] = TRUE; + if(temp & 1) + gFriendAreas[counter] = 1; else - gFriendAreas[counter] = FALSE; + gFriendAreas[counter] = 0; } - nullsub_102(temp); - return temp[2]; + nullsub_102(&unk); + return unk.unk8; } diff --git a/src/friend_area_action_menu.c b/src/friend_area_action_menu.c index 24c0dfa..20beb31 100644 --- a/src/friend_area_action_menu.c +++ b/src/friend_area_action_menu.c @@ -201,7 +201,7 @@ void sub_8027274(void) sub_8012D60(&gUnknown_203B2BC->unk7C,gUnknown_203B2BC->menuItems,0,&gUnknown_203B2BC->unk16C,gUnknown_203B2BC->unk74,2); break; case 0xd: - sub_8090B64(&auStack12,&gUnknown_203B2BC->unk10); + HeldItemToSlot(&auStack12,&gUnknown_203B2BC->unk10); sub_801B3C0(&auStack12); break; case 0xe: diff --git a/src/friend_area_action_menu_1.c b/src/friend_area_action_menu_1.c index bff9997..5315996 100644 --- a/src/friend_area_action_menu_1.c +++ b/src/friend_area_action_menu_1.c @@ -24,7 +24,7 @@ extern void nullsub_104(); extern void sub_8091274(u8 *); extern void sub_801A928(); extern void sub_8099690(u32); -extern void sub_808D800(s16, struct ItemSlot_ALT *); +extern void sub_808D800(s16, struct HeldItem *); extern u32 sub_801A8AC(); extern u32 sub_801A6E8(u32); diff --git a/src/game_options.c b/src/game_options.c index 5328916..c5a92df 100644 --- a/src/game_options.c +++ b/src/game_options.c @@ -1,5 +1,6 @@ #include "global.h" #include "gUnknown_203B46C.h" +#include "code_8092334.h" struct unkStruct_8109954 { @@ -19,8 +20,6 @@ extern struct UnkSaveStruct1 *gUnknown_203B46C; extern struct UnkSaveStruct1 gUnknown_2038C70; extern void sub_8094C14(void); extern void sub_80099F0(u32); -extern void sub_809488C(u8 *r0, u8 *r1, u32 r2); -extern void sub_8094924(u8 *r0, u8 *r1, u32 r2); void LoadGameOptions(void) { @@ -67,7 +66,7 @@ bool32 GameOptionsNotChange(struct UnkSaveStruct1 *r0) return FALSE; } -void WriteGameOptions(u8 *param_1) +void WriteGameOptions(struct unkStruct_8094924 *param_1) { u8 zero; u8 neg_1; @@ -153,7 +152,7 @@ void WriteGameOptions(u8 *param_1) sub_809488C(param_1, &gUnknown_203B46C->unkC, 2); } -void ReadGameOptions(u8 *param_1) +void ReadGameOptions(struct unkStruct_8094924 *param_1) { u8 byteArray[4]; sub_8094924(param_1, byteArray, 2); diff --git a/src/items.c b/src/items.c index 820975c..fb0304f 100644 --- a/src/items.c +++ b/src/items.c @@ -4,20 +4,50 @@ #include "team_inventory.h" #include "random.h" #include "pokemon.h" +#include "subStruct_203B240.h" + +#include <stddef.h> extern struct TeamInventory *gTeamInventory_203B460; extern struct TeamInventory gUnknown_20389A8; extern struct FileArchive gSystemFileArchive; +extern struct unkStruct_203B45C *gRecruitedPokemonRef; extern const char gUnknown_8109764; -extern u16 *gGummiStatBoostLUT; +extern const char gUnknown_8109794[]; +extern const char gUnknown_81097A4[]; +extern s32 gUnknown_81097B0[]; +extern u8 gUnknown_81097C4[]; +extern u16 gGummiStatBoostLUT[]; +extern u8 gUnknown_202DE58[0x58]; +extern u32 gUnknown_202DE30; +extern u8* gPtrTypeText; // ptr to "Type\0" +extern u8* gPtrPPD0Text; // ptr to "PP $d0 \0" +extern u32 gUnknown_810A3F0[100]; +extern u32 gUnknown_81097E8[4]; // some sort of lookup table (16, 18, 20, 22) +extern u32 gUnknown_81097F8[4]; // some sort of lookup table (17, 19, 21, 23) +extern u32 gUnknown_810AF50[]; +extern u8 gUnknown_8108F64[0x3f][32]; // some sort of bit lookup table +extern s16 gTypeGummiIQBoost[0x12][NUMBER_OF_GUMMIS]; EWRAM_DATA struct OpenedFile *gItemParametersFile; EWRAM_DATA struct Item *gItemParametersData; extern u8 GetItemType(u8); extern u32 GetItemUnkThrow(u8, u32); -extern bool8 CanSellItem(u8); -extern void sub_8090F58(void*, u8 *, struct ItemSlot *, u32); +extern void ExpandPlaceholdersBuffer(u8 *, const u8 *, ...); +extern s32 sub_8090FEC(s32 a1, u8* a2, u8 a3); +extern void sub_80073B8(u32); +extern u32 sub_8097DF0(char *, struct subStruct_203B240 **); +extern void sub_8092A88(void*, u16); // first arg is some struct +extern void sub_80078A4(u32, u32, u32, u32, u32); +extern u32 sub_8092B00(void*); +extern u8* GetUnformattedTypeString(s16); +extern u32 sub_8092BF4(void*); +extern void sub_80073E0(u32); +extern void xxx_format_and_draw(u32, u32, u8 *, u32, u32); +extern s32 sub_8091E94(s32 a1, s32 a2, s32 a3); +extern void xxx_sort_inv_unk230_80918EC(); +bool8 xxx_insert_unk250_8091C1C(u8); void LoadItemParameters(void) { @@ -76,90 +106,90 @@ bool8 IsThrowableItem(u8 itemIndex) return TRUE; } -void sub_8090A8C(struct ItemSlot *param_1,u8 itemIndex,u8 param_3) +void xxx_init_itemslot_8090A8C(struct ItemSlot *slot, u8 itemIndex, u8 param_3) { u32 uVar3; u32 uVar4; if (itemIndex != ITEM_ID_NOTHING) { - param_1->unk0 = 1; - param_1->itemIndex = itemIndex; + slot->unk0 = 1; + slot->itemIndex = itemIndex; if (IsThrowableItem(itemIndex)) { - uVar3 = GetItemUnkThrow(itemIndex,0); - uVar4 = GetItemUnkThrow(itemIndex,1); - param_1->numItems = RandomRange(uVar3,uVar4); + uVar3 = GetItemUnkThrow(itemIndex, 0); + uVar4 = GetItemUnkThrow(itemIndex, 1); + slot->numItems = RandomRange(uVar3, uVar4); } else if (GetItemType(itemIndex) == ITEM_TYPE_MONEY) - param_1->numItems = 1; + slot->numItems = 1; else - param_1->numItems = 0; + slot->numItems = 0; if (param_3 != 0) - param_1->unk0 |= 8; + slot->unk0 |= 8; } else { - param_1->unk0 = 0; - param_1->itemIndex = ITEM_ID_NOTHING; - param_1->numItems = 0; + slot->unk0 = 0; + slot->itemIndex = ITEM_ID_NOTHING; + slot->numItems = 0; } } -void sub_8090B08(struct ItemSlot_ALT *param_1,u8 itemIndex) +void xxx_init_helditem_8090B08(struct HeldItem *held, u8 itemIndex) { u32 uVar2; u32 uVar3; if (itemIndex != ITEM_ID_NOTHING) { - param_1->itemIndex = itemIndex; + held->itemIndex = itemIndex; if (IsThrowableItem(itemIndex)) { uVar2 = GetItemUnkThrow(itemIndex,0); uVar3 = GetItemUnkThrow(itemIndex,1); - param_1->numItems = RandomRange(uVar2,uVar3); + held->numItems = RandomRange(uVar2, uVar3); } else if (GetItemType(itemIndex) == ITEM_TYPE_MONEY) - param_1->numItems = 1; + held->numItems = 1; else - param_1->numItems = 0; + held->numItems = 0; } else { - param_1->itemIndex = 0; - param_1->numItems = 0; + held->itemIndex = 0; + held->numItems = 0; } } -void sub_8090B64(struct ItemSlot *param_1, struct ItemSlot_ALT *param_2) +void HeldItemToSlot(struct ItemSlot *slot, struct HeldItem *held) { - u8 r6; + u8 is_throwable; - if(param_2->itemIndex != ITEM_ID_NOTHING) + if(held->itemIndex != ITEM_ID_NOTHING) { - param_1->unk0 = 1; - param_1->itemIndex = param_2->itemIndex; - r6 = IsThrowableItem(param_1->itemIndex); - if(r6 != 0 || GetItemType(param_1->itemIndex) == ITEM_TYPE_MONEY) - param_1->numItems = param_2->numItems; - else if(param_1->itemIndex == ITEM_ID_USED_TM) - param_1->numItems = param_2->numItems; + slot->unk0 = 1; + slot->itemIndex = held->itemIndex; + is_throwable = IsThrowableItem(slot->itemIndex); + if(is_throwable != 0 || GetItemType(slot->itemIndex) == ITEM_TYPE_MONEY) + slot->numItems = held->numItems; + else if(slot->itemIndex == ITEM_ID_USED_TM) + slot->numItems = held->numItems; else - param_1->numItems = 0; + slot->numItems = 0; } else { - param_1->itemIndex = ITEM_ID_NOTHING; - param_1->numItems = 0; - param_1->unk0 = 0; + slot->itemIndex = ITEM_ID_NOTHING; + slot->numItems = 0; + slot->unk0 = 0; } } -void sub_8090BB0(struct ItemSlot_ALT *param_1,struct ItemSlot *param_2) +void SlotToHeldItem(struct HeldItem *held,struct ItemSlot *slot) { - if ((param_2->unk0 & 1) != 0) { - param_1->itemIndex = param_2->itemIndex; - param_1->numItems = param_2->numItems; + if ((slot->unk0 & 1) != 0) { + held->itemIndex = slot->itemIndex; + held->numItems = slot->numItems; } else { - param_1->itemIndex = ITEM_ID_NOTHING; + held->itemIndex = ITEM_ID_NOTHING; } } @@ -268,13 +298,1207 @@ u32 GetItemUnkFood(u8 itemIndex, u32 r1) return gItemParametersData[itemIndex].unkFood1[r1]; } -void sub_8090DC4(void* param_1,u8 itemIndex,u32 param_3) +void sub_8090DC4(void* param_1,u8 itemIndex, struct unkStruct_8090F58* param_3) { char acStack104 [80]; struct ItemSlot unkItem; strncpy(acStack104,gItemParametersData[itemIndex].namePointer,0x50); - sub_8090A8C(&unkItem,itemIndex,0); + xxx_init_itemslot_8090A8C(&unkItem,itemIndex,0); unkItem.numItems = 1; sub_8090F58(param_1,acStack104,&unkItem,param_3); } + +extern const u8 gUnknown_8109770[]; +extern const u8 gUnknown_8109778[]; +extern const u8 gUnknown_810977C[]; +extern const u8 gUnknown_8109784[]; +extern const u8 gUnknown_810978C[]; + +void sub_8090E14(u8* ext_buffer, struct ItemSlot* slot, struct unkStruct_8090F58* a3) { + s32 unk8 = 0; + u8 buffer[80]; + + if (a3) { + unk8 = a3->unk8 != 0; + } + + if (GetItemType(slot->itemIndex) == ITEM_TYPE_THROWABLE) { + // I feel like these labels might actually be there... + if (unk8) { + ExpandPlaceholdersBuffer(buffer, gUnknown_8109770, gItemParametersData[slot->itemIndex].namePointer, slot->numItems); + } + else { + ExpandPlaceholdersBuffer(buffer, gUnknown_8109778, gItemParametersData[slot->itemIndex].namePointer); + } + } + else if (GetItemType(slot->itemIndex) == ITEM_TYPE_ROCK) { + if (unk8) { + ExpandPlaceholdersBuffer(buffer, gUnknown_8109770, gItemParametersData[slot->itemIndex].namePointer, slot->numItems); + } + else { + ExpandPlaceholdersBuffer(buffer, gUnknown_8109778, gItemParametersData[slot->itemIndex].namePointer); + } + } + else if (slot->itemIndex == 105) { + ExpandPlaceholdersBuffer(buffer, gUnknown_810977C, GetMoneyValue(slot)); + } + else { + strncpy(buffer, gItemParametersData[slot->itemIndex].namePointer, 80); + } + + if (slot->unk0 & 8) { + ExpandPlaceholdersBuffer(ext_buffer, gUnknown_8109784, buffer); + strncpy(buffer, ext_buffer, 80); + } + + if (a3) { + if (a3->unk4 && (slot->unk0 & 0x10)) { + ExpandPlaceholdersBuffer(ext_buffer, gUnknown_810978C, buffer); + strncpy(buffer, ext_buffer, 80); + } + if ((*(u32*)a3 == 1) || (*(u32*)a3 == 3)) { + if (slot->unk0 & 2) { + sub_8090F58(ext_buffer, buffer, slot, a3); + return; + } + strncpy(ext_buffer, buffer, 80); + return; + } + } + else { + strncpy(ext_buffer, buffer, 80); + return; + } + + sub_8090F58(ext_buffer, buffer, slot, a3); + return; +} + +void sub_8090F58(void* a1, u8 *a2, struct ItemSlot *slot, struct unkStruct_8090F58* a4) { + u32 unk0; + s32 value; + u8 buffer[40]; + + if (!a4) { + strncpy(a1, a2, 80); + return; + } + else { + unk0 = a4->unk0; + switch (unk0) { + case 1: + case 2: + value = GetStackBuyValue(slot); + break; + case 3: + case 4: + value = GetStackSellValue(slot); + break; + default: + value = 0; + break; + } + + if (!value) { + strncpy(a1, a2, 80); + return; + } + } + + if (a4->unk6) { + sub_8090FEC(value, buffer, 1); + ExpandPlaceholdersBuffer(a1, gUnknown_8109794, a2, a4->unk6, buffer); + } + else { + sub_8090FEC(value, buffer, 0); + ExpandPlaceholdersBuffer(a1, gUnknown_81097A4, a2, buffer); + } +} + +s32 sub_8090FEC(s32 a1, u8* strbuf, u8 a3) +{ + s32 i, count; + s32 cond = 0; + + count = 0; + for (i = 0; i < 5; i++) { + s32 div; + + div = 0; + while (a1 >= gUnknown_81097B0[i]) { + a1 -= gUnknown_81097B0[i]; + div++; + } + + if (div > 9) { + div = 9; + } + + if (div) { + cond = 1; + *strbuf++ = gUnknown_81097C4[2 * div]; + *strbuf++ = (gUnknown_81097C4 + 1)[2 * div]; // weird staggered arrays... + count++; + } + else if (cond) { + *strbuf++ = gUnknown_81097C4[0]; + *strbuf++ = (gUnknown_81097C4 + 1)[0]; // weird staggered arrays... + count++; + } + else if (a3) { + *strbuf++ = 96; // ` character? + } + } + + *strbuf++ = gUnknown_81097C4[2 * a1]; + *strbuf = (gUnknown_81097C4 + 1)[2 * a1]; + count += 1; + strbuf[1] = 0; // null termination + return count; +} + +void FillInventoryGaps() +{ + // fill inventory gaps + s32 slot_checking = 0; + s32 last_filled = 0; + + do { + while (slot_checking < INVENTORY_SIZE) { + if (slot_checking[gTeamInventory_203B460->teamItems].unk0 & 1) { + break; + } + // find next empty slot + slot_checking++; + } + + if (slot_checking == INVENTORY_SIZE) { + break; + } + + if (slot_checking > last_filled) { + // shift it down + gTeamInventory_203B460->teamItems[last_filled] = gTeamInventory_203B460->teamItems[slot_checking]; + } + slot_checking++; + last_filled++; + } while (1); + + // clear out the rest of the slots + for (; last_filled < INVENTORY_SIZE; last_filled++) { + struct ItemSlot *slot; +#ifdef NONMATCHING + slot = &gTeamInventory_203B460->teamItems[last_filled]; +#else + size_t offs = last_filled << 2; + size_t _slot = offs; + _slot += (size_t)gTeamInventory_203B460->teamItems; + slot = (struct ItemSlot*)_slot; // &gTeamInventory_203B460->teamItems[end]; +#endif + slot->itemIndex = 0; + slot->numItems = 0; + slot->unk0 = 0; + } +} + +s32 FindItemInInventory(u8 itemIndex) +{ + s32 i; + for (i = 0; i < INVENTORY_SIZE; i++) { + if ((gTeamInventory_203B460->teamItems[i].unk0 & 1) && (gTeamInventory_203B460->teamItems[i].itemIndex == itemIndex)) { + return i; + } + } + return -1; +} + +s32 GetItemCountInInventory(u8 _itemIndex) +{ +#ifdef NONMATCHING + s32 count = 0; + s32 i; + for (i = 0; i < INVENTORY_SIZE; i++) { + if ((gTeamInventory_203B460->teamItems[i].unk0 & 1) && (gTeamInventory_203B460->teamItems[i].itemIndex == _itemIndex)) { + count++; + } + } + return count; +#else + // have to do hacky stuff to fix initialization order of r6 and r2 + u32 itemIndex = _itemIndex; + s32 count = 0; + struct ItemSlot *slot = gTeamInventory_203B460->teamItems; + s32 one = 1; + s32 i = 19; + + do { + register u32 unk0 asm("r1") = slot->unk0; + u32 bottom_bit = one; + bottom_bit &= unk0; + if (bottom_bit && (slot->itemIndex == itemIndex)) { + count++; + } + slot++; + } while(--i >= 0); + return count; +#endif +} + +s32 GetItemPossessionCount(u8 itemIndex) +{ + s32 item_count = GetItemCountInInventory(itemIndex); + s32 i = 0; + + struct unkStruct_203B45C *_gRecruitedPokemonRef = gRecruitedPokemonRef; + for (i = 0; i < NUM_SPECIES; i++) { + struct PokemonStruct* pokemon = &_gRecruitedPokemonRef->pokemon[i]; + if ((1 & pokemon->unk0) + && ((pokemon->unk0 >> 1) % 2) + && (pokemon->heldItem.itemIndex != ITEM_ID_NOTHING) + && (pokemon->heldItem.itemIndex == itemIndex)) { + item_count++; + } + } + return item_count; +} + +void ShiftItemsDownFrom(s32 start) +{ + s32 i, j; + for (i = start, j = start + 1; i < 19; i++, j++) { + gTeamInventory_203B460->teamItems[i] = gTeamInventory_203B460->teamItems[j]; + } + gTeamInventory_203B460->teamItems[19].itemIndex = 0; + gTeamInventory_203B460->teamItems[19].unk0 = 0; +} + +void ClearItemSlotAt(u32 index) +{ + gTeamInventory_203B460->teamItems[index].itemIndex = ITEM_ID_NOTHING; + gTeamInventory_203B460->teamItems[index].unk0 = 0; +} + +bool8 sub_809124C(u8 itemIndex, u8 param_3) +{ + struct ItemSlot temp; + xxx_init_itemslot_8090A8C(&temp, itemIndex, param_3); + return AddItemToInventory(&temp); +} + +bool8 sub_8091274(struct HeldItem* slot) +{ + struct ItemSlot temp; + + HeldItemToSlot(&temp, slot); + return AddItemToInventory(&temp); +} + +bool8 AddItemToInventory(const struct ItemSlot* slot) +{ + s32 i; + + // try to add item to inventory, return 1 if failed + for (i = 0; i < INVENTORY_SIZE; i++) { + UNUSED struct ItemSlot* current = &gTeamInventory_203B460->teamItems[i]; + if (!(i[gTeamInventory_203B460->teamItems].unk0 & 1)) { + gTeamInventory_203B460->teamItems[i] = *slot; + return FALSE; + } + } + return TRUE; +} + +void ConvertMoneyItemToMoney() +{ + s32 i = 0; + + do { + UNUSED struct TeamInventory * _gTeamInventory_203B460 = gTeamInventory_203B460; + UNUSED size_t offs = offsetof(struct TeamInventory, teamItems[i]); + + struct ItemSlot* current_slot = &gTeamInventory_203B460->teamItems[i]; + if ((current_slot->unk0 & 1) && (current_slot->itemIndex == ITEM_ID_POKE)) { + u32 result; + + result = GetMoneyValue(current_slot); + AddToTeamMoney(result); + current_slot->itemIndex = 0; + current_slot->numItems = 0; + current_slot->unk0 = 0; + } + } while (++i < INVENTORY_SIZE); + FillInventoryGaps(); + + i = 0; + do { + s32 lowest_index = -1; + UNUSED size_t offs = offsetof(struct TeamInventory, teamItems[i]); + + bool8 item_occupied = i[gTeamInventory_203B460->teamItems].unk0 & 1; + s32 next = i + 1; + + if (item_occupied) { + s32 lowest_order = GetItemOrder(gTeamInventory_203B460->teamItems[i].itemIndex); + s32 j; + + // find next lowest + for (j = next; j < INVENTORY_SIZE; j++) { + UNUSED size_t offs = offsetof(struct TeamInventory, teamItems[j]); + if ((j[gTeamInventory_203B460->teamItems].unk0 & 1) && (lowest_order > GetItemOrder(gTeamInventory_203B460->teamItems[j].itemIndex))) { + lowest_index = j; + lowest_order = GetItemOrder(gTeamInventory_203B460->teamItems[j].itemIndex); + } + } + + if (lowest_index >= 0) { + // swap the slots + struct ItemSlot current = gTeamInventory_203B460->teamItems[i]; + gTeamInventory_203B460->teamItems[i] = gTeamInventory_203B460->teamItems[lowest_index]; + gTeamInventory_203B460->teamItems[lowest_index] = current; + } + } + } while (++i < INVENTORY_SIZE); + FillInventoryGaps(); +} + +void AddToTeamMoney(s32 amount) +{ + s32 clamped_money; + gTeamInventory_203B460->teamMoney += amount; + + // clamp money + clamped_money = 99999; + if (gTeamInventory_203B460->teamMoney <= 99999) { + if (gTeamInventory_203B460->teamMoney >= 0) { + return; + } + clamped_money = 0; + } + gTeamInventory_203B460->teamMoney = clamped_money; +} + +u16 GetItemMove(u8 index) +{ + return gItemParametersData[index].move; +} + +u32 sub_80913E0(struct ItemSlot* slot, u32 a2, struct subStruct_203B240 ** a3) +{ + u8 buffer88[88]; // some struct + + GetItemDescription(slot->itemIndex); + sub_8090DC4(buffer88, slot->itemIndex, 0); + if (slot->itemIndex == ITEM_ID_USED_TM) { + // empty TM + sub_8090DC4(&gUnknown_202DE58, (u8)(slot->numItems + 125), 0); + } + sub_80073B8(a2); + xxx_format_and_draw(16, 0, buffer88, a2, 0); + + xxx_format_and_draw(8, 24, GetItemDescription(slot->itemIndex), a2, 0); + if (GetItemType(slot->itemIndex) == ITEM_TYPE_TM) { + u8* buffer8 = buffer88 + 0x50; // field in struct + u16 move = GetItemMove(slot->itemIndex); + u8 moves_data; + u8* typestring; + u32 result; + + sub_8092A88(buffer8, move); + sub_80078A4(a2, 4, 82, 200, 7); + xxx_format_and_draw(4, 84, gPtrTypeText, a2, 0); + moves_data = sub_8092B00(buffer8); + typestring = GetUnformattedTypeString(moves_data); + xxx_format_and_draw(64, 84, typestring, a2, 0); + result = sub_8092BF4(buffer8); + gUnknown_202DE30 = result; + xxx_format_and_draw(128, 84, gPtrPPD0Text, a2, 0); + } + + sub_80073E0(a2); + return sub_8097DF0(GetItemDescription(slot->itemIndex), a3); +} + +bool8 CanSellItem(u32 id) +{ + u8 id_; + id = (u8)id; + id_ = id; + + if((id != ITEM_ID_NOTHING) + && (id != ITEM_ID_POKE) + && (id != ITEM_ID_ROCK_PART) + && (id != ITEM_ID_ICE_PART) + && (id != ITEM_ID_STEEL_PART) + && (id != ITEM_ID_MUSIC_BOX) + && (GetItemSellPrice(id_)) + && (GetItemBuyPrice(id_))) { + return TRUE; + } + return FALSE; +} + +bool8 IsNotMoneyOrUsedTMItem(u8 id) +{ + if (id == ITEM_ID_NOTHING) { + return FALSE; + } + else if (id == ITEM_ID_POKE) { + return FALSE; + } + else if (id == ITEM_ID_USED_TM) { + return FALSE; + } + return TRUE; +} + +bool8 IsNotSpecialItem(u8 id) +{ + if (id == ITEM_ID_NOTHING) { + return FALSE; + } + else if (id == ITEM_ID_POKE) { + return FALSE; + } + else if (id == ITEM_ID_ROCK_PART) { + return FALSE; + } + else if (id == ITEM_ID_ICE_PART) { + return FALSE; + } + else if (id == ITEM_ID_STEEL_PART) { + return FALSE; + } + else if (id == ITEM_ID_MUSIC_BOX) { + return FALSE; + } + return TRUE; +} + +bool8 IsEdibleItem(u8 id) +{ + if (!((GetItemType(id) == ITEM_TYPE_BERRY_SEED) || (GetItemType(id) == ITEM_TYPE_APPLE_GUMMI))) { + return FALSE; + } + return TRUE; +} + +bool8 IsHMItem(u8 id) +{ + if (id == ITEM_ID_CUT) { + return TRUE; + } + else if (id == ITEM_ID_FLY) { + return TRUE; + } + else if (id == ITEM_ID_SURF) { + return TRUE; + } + else if (id == ITEM_ID_STRENGTH) { + return TRUE; + } + else if (id == ITEM_ID_FLASH) { + return TRUE; + } + else if (id == ITEM_ID_ROCK_SMASH) { + return TRUE; + } + else if (id == ITEM_ID_WATERFALL) { + return TRUE; + } + else if (id == ITEM_ID_DIVE) { + return TRUE; + } + return FALSE; +} + +u32 GetMoneyValue(struct ItemSlot* slot) +{ + return gUnknown_810A3F0[slot->numItems]; +} + +u32 GetMoneyValueHeld(struct HeldItem* slot) +{ + // potentially different slot type (used for held item) + return gUnknown_810A3F0[slot->numItems]; +} + +void GetGummiItemStatBoost(struct PokemonStruct* pokemon, u8 itemIndex, u8 a3, struct unkStruct_80915F4* a4) +{ + // item stat buff? + s8 result; + + a4->unk0 = (u16)-1; + a4->unk2 = 0; + result = IsGummiItem(itemIndex); + if (result) { + u8 pokemon_type_0 = GetPokemonType(pokemon->speciesNum, 0); + u8 pokemon_type_1 = GetPokemonType(pokemon->speciesNum, 1); + u32 gummi_index = itemIndex - ITEM_ID_WHITE_GUMMI + 1; + s32 value0; + s32 value1; + s32 diff; + u16 boost_amount; + + value0 = gTypeGummiIQBoost[pokemon_type_0][gummi_index]; + value1 = gTypeGummiIQBoost[pokemon_type_1][gummi_index]; + diff = pokemon->IQ; + + pokemon->IQ += value0 + value1; + diff = pokemon->IQ - diff; + if (pokemon->IQ <= 0) { + pokemon->IQ = 1; + } + if (pokemon->IQ > 999) { + pokemon->IQ = 999; + } + + boost_amount = 0; + if (diff <= 8) { + boost_amount = 1; + if (diff <= 4) { + boost_amount = 3; + if (diff > 2) { + boost_amount = 2; + } + } + } + a4->unk0 = boost_amount; + if (!a3) { + u16 boost_flags; + if (!boost_amount && RandomCapped(16) == 10) { + // supa gummi (all stats boost) + boost_flags = 0xf; + } + else { + s32 random_index = RandomCapped(4); + u16* table = gGummiStatBoostLUT; + boost_flags = table[random_index]; + } + + a4->unk2 = boost_flags; + boost_flags = a4->unk2; + if (a4->unk2 & 1) { + if (pokemon->pokeAtt < 255) { + pokemon->pokeAtt++; + } + else { + // fix operand order + u16 unk2 = a4->unk2; + unk2 &= ~1; + a4->unk2 &= unk2; + } + } + if (a4->unk2 & 2) { + if (pokemon->pokeSPAtt < 255) { + pokemon->pokeSPAtt++; + } + else { + a4->unk2 &= ~2; + } + } + if (a4->unk2 & 4) { + if (pokemon->pokeDef < 255) { + pokemon->pokeDef++; + } + else { + a4->unk2 &= ~4; + } + } + if (a4->unk2 & 8) { + if (pokemon->pokeSPDef < 255) { + pokemon->pokeSPDef++; + } + else { + a4->unk2 &= ~8; + } + } + } + } +} + +bool8 IsGummiItem(u8 itemIndex) +{ + if (itemIndex < ITEM_ID_WHITE_GUMMI) { + return FALSE; + } + if (itemIndex > ITEM_ID_SILVER_GUMMI) { + return FALSE; + } + return TRUE; +} + +bool8 HasGummiItem() +{ + s32 i; + for (i = 0; i < INVENTORY_SIZE; i++) { + UNUSED size_t offs = offsetof(struct TeamInventory, teamItems[i]); + if ((i[gTeamInventory_203B460->teamItems].unk0 & 1) && IsGummiItem(i[gTeamInventory_203B460->teamItems].itemIndex)) { + return TRUE; + } + } + return FALSE; +} + +void MoveToStorage(struct ItemSlot* slot) +{ + if (IsThrowableItem(slot->itemIndex)) { + gTeamInventory_203B460->teamStorage[slot->itemIndex] += slot->numItems; + } + else { + gTeamInventory_203B460->teamStorage[slot->itemIndex]++; + } + + if (gTeamInventory_203B460->teamStorage[slot->itemIndex] > 999) { + gTeamInventory_203B460->teamStorage[slot->itemIndex] = 999; + } +} + +s32 xxx_count_inv_unk230() +{ + s32 i; + s32 counter = 0; + for (i = 0; i < 8; i++) { + if (gTeamInventory_203B460->unk230[i].itemIndex) { + counter++; + } + } + return counter; +} + +void xxx_init_unk230_substruct(u8 i) +{ + struct HeldItem* unk230; + + unk230 = &gTeamInventory_203B460->unk230[i]; + unk230->itemIndex = 0; + unk230->numItems = 0; +} + +struct HeldItem* xxx_get_inv_unk230_at_809185C(u8 i) +{ + return &gTeamInventory_203B460->unk230[i]; +} + +void xxx_fill_unk230_gaps() +{ + // fill unk230 gaps + // basically the same as FillInventoryGaps + s32 slot_checking = 0; + s32 last_filled = 0; + + do { + while (slot_checking < 8) { + if (gTeamInventory_203B460->unk230[slot_checking].itemIndex) { + break; + } + // find next empty slot + slot_checking++; + } + + if (slot_checking == 8) { + break; + } + + if (slot_checking > last_filled) { + // shift it down + gTeamInventory_203B460->unk230[last_filled] = gTeamInventory_203B460->unk230[slot_checking]; + } + slot_checking++; + last_filled++; + } while (1); + + // clear out the rest of the slots + for (; last_filled < 8; last_filled++) { + xxx_init_unk230_substruct(last_filled); + } +} + +void xxx_sort_inv_unk230_80918EC() { + s32 i; + + for (i = 0; i < 7; i++) { + s32 j; + for (j = i + 1; j < 8; j++) { + s32 order_i = GetItemOrder(gTeamInventory_203B460->unk230[i].itemIndex); + s32 order_j = GetItemOrder(gTeamInventory_203B460->unk230[j].itemIndex); + if (order_i > order_j || (order_i == order_j && gTeamInventory_203B460->unk230[i].numItems < gTeamInventory_203B460->unk230[j].numItems)) { + struct HeldItem str_i = gTeamInventory_203B460->unk230[i]; + gTeamInventory_203B460->unk230[i] = gTeamInventory_203B460->unk230[j]; + gTeamInventory_203B460->unk230[j] = str_i; + } + } + } +} + +void xxx_inv_unk250_random_8091980(u8 a1) { + u32 data[4]; + s32 i; + + memcpy(data, gUnknown_81097E8, 4 * sizeof(u32)); + for (i = 0; i < 8; i++) { + xxx_init_unk230_substruct(i); + } + for (i = 0; i < 8; i++) { + s32 rand_1 = RandomCapped(9999); + s32 rand_2 = RandomCapped(9999); + xxx_insert_unk230_80919FC(sub_8091E94(data[a1], rand_1, rand_2)); + } + xxx_sort_inv_unk230_80918EC(); + sub_8091BB4(a1); +} + +bool8 xxx_insert_unk230_80919FC(u8 itemIndex) { + struct HeldItem held; + s32 i; + + xxx_init_helditem_8090B08(&held, itemIndex); // initialize + for (i = 0; i < 8; i++) { + if (!gTeamInventory_203B460->unk230[i].itemIndex) { + gTeamInventory_203B460->unk230[i] = held; + return FALSE; + } + } + return TRUE; +} + +u32 xxx_count_non_empty_inv_unk250_8091A48() { + s32 i; + u32 count = 0; + for (i = 0; i < 4; i++) { + if (gTeamInventory_203B460->unk250[i].itemIndex) { + count++; + } + } + return count; +} + +void xxx_init_inv_unk250_at_8091A74(u8 index) { + struct HeldItem* unk250 = &gTeamInventory_203B460->unk250[index]; + unk250->itemIndex = 0; + unk250->numItems = 0; +} + +struct HeldItem* xxx_get_unk250_at_8091A90(u8 index) { + return &gTeamInventory_203B460->unk250[index]; +} + +void xxx_fill_inv_unk250_gaps_8091AA8(u8 index) { + s32 slot_checking = 0; + s32 last_filled = 0; + + do { + while (slot_checking < 4) { + if (gTeamInventory_203B460->unk250[slot_checking].itemIndex != ITEM_ID_NOTHING) { + break; + } + slot_checking++; + } + + if (slot_checking == 4) { + break; + } + + if (slot_checking > last_filled) { + // shift it down + gTeamInventory_203B460->unk250[last_filled] = gTeamInventory_203B460->unk250[slot_checking]; + } + slot_checking++; + last_filled++; + } while (1); + + // clear out the rest of the slots + for (; last_filled < 4; last_filled++) { + xxx_init_inv_unk250_at_8091A74(last_filled); + } +} + +void xxx_sort_inv_unk250_8091B20() { + s32 i; + + for (i = 0; i < 3; i++) { + s32 j; + for (j = i + 1; j < 4; j++) { + s32 order_i = GetItemOrder(gTeamInventory_203B460->unk250[i].itemIndex); + s32 order_j = GetItemOrder(gTeamInventory_203B460->unk250[j].itemIndex); + if (order_i > order_j || (order_i == order_j && gTeamInventory_203B460->unk250[i].numItems < gTeamInventory_203B460->unk250[j].numItems)) { + struct HeldItem str_i = gTeamInventory_203B460->unk250[i]; + gTeamInventory_203B460->unk250[i] = gTeamInventory_203B460->unk250[j]; + gTeamInventory_203B460->unk250[j] = str_i; + } + } + } +} + +void sub_8091BB4(u8 index) { + u32 data[4]; + s32 i; + + memcpy(data, gUnknown_81097F8, 4 * sizeof(u32)); + for (i = 0; i < 4; i++) { + xxx_init_inv_unk250_at_8091A74(i); + } + for (i = 0; i < 4; i++) { + s32 rand_1 = RandomCapped(9999); + s32 rand_2 = RandomCapped(9999); + xxx_insert_unk250_8091C1C(sub_8091E94(data[index], rand_1, rand_2)); + } + xxx_sort_inv_unk250_8091B20(); +} + +bool8 xxx_insert_unk250_8091C1C(u8 itemIndex) { + struct HeldItem held; + s32 i; + + xxx_init_helditem_8090B08(&held, itemIndex); // initialize + for (i = 0; i < 4; i++) { + if (!gTeamInventory_203B460->unk250[i].itemIndex) { + gTeamInventory_203B460->unk250[i] = held; + return FALSE; + } + } + return TRUE; +} + +s32 sub_8091C68(u8* unk0, u32 size) +{ + struct unkStruct_8094924 unk; + s32 i; + + sub_809486C(&unk, unk0, size); + for (i = 0; i < INVENTORY_SIZE; i++) { + sub_8091E28(&unk, (u8*)&gTeamInventory_203B460->teamItems[i]); + } + for (i = 0; i < NUMBER_OF_ITEM_IDS; i++) { + sub_809488C(&unk, (u8*)&gTeamInventory_203B460->teamStorage[i], 10); + } + for (i = 0; i < 8; i++) { + sub_8091DE0(&unk, (u8*)&gTeamInventory_203B460->unk230[i]); + } + for (i = 0; i < 4; i++) { + sub_8091DE0(&unk, (u8*)&gTeamInventory_203B460->unk250[i]); + } + sub_809488C(&unk, (u8*)&gTeamInventory_203B460->teamMoney, 24); + sub_809488C(&unk, (u8*)&gTeamInventory_203B460->teamSavings, 24); + nullsub_102(&unk); + return unk.unk8; +} + +s32 sub_8091D14(u8 *unk0, u32 size) +{ + struct unkStruct_8094924 unk; + s32 i; + + sub_809485C(&unk, unk0, size); + for (i = 0; i < 20; i++) { + sub_8091E00(&unk, (u8*)&gTeamInventory_203B460->teamItems[i]); + } + for (i = 0; i < 240; i++) { + sub_8094924(&unk, (u8*)&gTeamInventory_203B460->teamStorage[i], 10); + } + for (i = 0; i < 8; i++) { + sub_8091DC0(&unk, (u8*)&gTeamInventory_203B460->unk230[i]); + } + for (i = 0; i < 4; i++) { + sub_8091DC0(&unk, (u8*)&gTeamInventory_203B460->unk250[i]); + } + sub_8094924(&unk, (u8*)&gTeamInventory_203B460->teamMoney, 24); + sub_8094924(&unk, (u8*)&gTeamInventory_203B460->teamSavings, 24); + nullsub_102(&unk); + return unk.unk8; +} + +void sub_8091DC0(struct unkStruct_8094924 *a1, u8 *a2) +{ + sub_8094924(a1, a2, 8); + sub_8094924(a1, a2 + 1, 7); +} + +void sub_8091DE0(struct unkStruct_8094924 *a1, u8 *a2) +{ + sub_809488C(a1, a2, 8); + sub_809488C(a1, a2 + 1, 7); +} + +void sub_8091E00(struct unkStruct_8094924 *a1, u8 *a2) +{ + sub_8094924(a1, a2, 8); + sub_8094924(a1, a2 + 1, 7); + sub_8094924(a1, a2 + 2, 8); +} + +void sub_8091E28(struct unkStruct_8094924 *a1, u8 *a2) +{ + sub_809488C(a1, a2, 8); + sub_809488C(a1, a2 + 1, 7); + sub_809488C(a1, a2 + 2, 8); +} + +u32 sub_8091E50(u8 index) +{ + return gUnknown_810AF50[index]; +} + +u32 xxx_bit_lut_lookup_8091E50(u8 i0, u8 i1) +{ + if (i0 > 0x3e) + return 0; + else + return (gUnknown_8108F64[i0][i1 >> 3] >> (i1 & 7)) & 1; +} + + +extern u16* gUnknown_8108E58[]; + +struct UnkStruct_8091E94 { + s16 unk0[12]; + s16 unk18[0xf0]; +}; + +NAKED +s32 sub_8091E94(s32 a1, s32 a2, s32 a3) +{ +#if 0 + // this is about as good as I got it so far + s32 i; + u8 item_type; + s32 result; + + // struct of 12 + 0xf0 (NUMBER_OF_ITEM_IDS) hwords? + struct UnkStruct_8091E94 s1; + u16 s2[12 + 0xf0]; + s32 data_index; + // 30000: level up exp required? + + data_index = 0; + // compressed data? + for (i = 0; i < 252; i++) { + if (gUnknown_8108E58[a1 - 1][i] > 29999) { + s32 j; + for (j = gUnknown_8108E58[a1 - 1][i] - 30000; j != 0; j--) { + s2[data_index++] = 0; + } + } + else { + s2[data_index++] = gUnknown_8108E58[a1 - 1][i]; + } + } + + for (i = 0; i < 12; i++) { + s1.unk0[i] = s2[i]; + } + + for (i = 0; i < 240; i++) { + s1.unk18[i] = s2[12 + i]; + } + + item_type = 0; + for (i = 0; i < 12; i++) { + if (s1.unk0[i] && s1.unk0[i] >= a2){ + item_type = i; + break; + } + } + + result = 70; + if (item_type != 12) { + s32 j; + for (j = 0; j < 240; j++) { + if (s1.unk18[j] && (GetItemType(j) == item_type) && (s1.unk18[j] >= a3)) { + return result; + } + } + result = j; + } + return result; +#else + asm_unified("\tpush {r4-r7,lr}\n" +"\tmov r7, r10\n" +"\tmov r6, r9\n" +"\tmov r5, r8\n" +"\tpush {r5-r7}\n" +"\tldr r4, _08091EE4\n" +"\tadd sp, r4\n" +"\tmov r8, r1\n" +"\tmov r10, r2\n" +"\tldr r1, _08091EE8\n" +"\tsubs r0, 0x1\n" +"\tlsls r0, 2\n" +"\tadds r0, r1\n" +"\tmovs r3, 0\n" +"\tadd r1, sp, 0x18\n" +"\tmov r9, r1\n" +"\tldr r2, _08091EEC\n" +"\tmov r12, r2\n" +"\tadd r6, sp, 0x1F8\n" +"\tldr r2, [r0]\n" +"\tadds r7, r6, 0\n" +"\tmovs r4, 0\n" +"_08091EC0:\n" +"\tldrh r1, [r2]\n" +"\tcmp r1, r12\n" +"\tbls _08091EF4\n" +"\tldrh r0, [r2]\n" +"\tldr r1, _08091EF0\n" +"\tadds r0, r1\n" +"\tcmp r0, 0\n" +"\tbeq _08091EFC\n" +"\tmovs r5, 0\n" +"\tadds r1, r7, r4\n" +"_08091ED4:\n" +"\tstrh r5, [r1]\n" +"\tadds r1, 0x2\n" +"\tadds r4, 0x2\n" +"\tadds r3, 0x1\n" +"\tsubs r0, 0x1\n" +"\tcmp r0, 0\n" +"\tbne _08091ED4\n" +"\tb _08091EFC\n" +"\t.align 2, 0\n" +"_08091EE4: .4byte 0xfffffc10\n" +"_08091EE8: .4byte gUnknown_8108E58\n" +"_08091EEC: .4byte 0x0000752f\n" +"_08091EF0: .4byte 0xffff8ad0\n" +"_08091EF4:\n" +"\tadds r0, r6, r4\n" +"\tstrh r1, [r0]\n" +"\tadds r4, 0x2\n" +"\tadds r3, 0x1\n" +"_08091EFC:\n" +"\tadds r2, 0x2\n" +"\tcmp r3, 0xFB\n" +"\tble _08091EC0\n" +"\tmovs r3, 0xB\n" +"\tadd r2, sp, 0x1F8\n" +"\tmov r1, sp\n" +"_08091F08:\n" +"\tldrh r0, [r2]\n" +"\tstrh r0, [r1]\n" +"\tadds r2, 0x2\n" +"\tadds r1, 0x2\n" +"\tsubs r3, 0x1\n" +"\tcmp r3, 0\n" +"\tbge _08091F08\n" +"\tmov r2, r9\n" +"\tadd r1, sp, 0x210\n" +"\tmovs r3, 0xEF\n" +"_08091F1C:\n" +"\tldrh r0, [r1]\n" +"\tstrh r0, [r2]\n" +"\tadds r1, 0x2\n" +"\tadds r2, 0x2\n" +"\tsubs r3, 0x1\n" +"\tcmp r3, 0\n" +"\tbge _08091F1C\n" +"\tmovs r7, 0xC\n" +"\tmovs r6, 0\n" +"\tmov r0, sp\n" +"\tmovs r2, 0\n" +"\tldrsh r0, [r0, r2]\n" +"\tcmp r0, 0\n" +"\tbeq _08091F4A\n" +"\tmov r0, sp\n" +"\tmovs r1, 0\n" +"\tldrsh r0, [r0, r1]\n" +"\tcmp r0, r8\n" +"\tblt _08091F4A\n" +"\tmovs r7, 0\n" +"\tb _08091F66\n" +"_08091F46:\n" +"\tmov r8, r5\n" +"\tb _08091F9C\n" +"_08091F4A:\n" +"\tadds r6, 0x1\n" +"\tcmp r6, 0xB\n" +"\tbgt _08091F66\n" +"\tlsls r0, r6, 1\n" +"\tmov r2, sp\n" +"\tadds r1, r2, r0\n" +"\tmovs r2, 0\n" +"\tldrsh r0, [r1, r2]\n" +"\tcmp r0, 0\n" +"\tbeq _08091F4A\n" +"\tcmp r0, r8\n" +"\tblt _08091F4A\n" +"\tlsls r0, r6, 24\n" +"\tlsrs r7, r0, 24\n" +"_08091F66:\n" +"\tmovs r0, 0x46\n" +"\tmov r8, r0\n" +"\tcmp r7, 0xC\n" +"\tbeq _08091F9C\n" +"\tmovs r6, 0\n" +"\tmov r4, r9\n" +"_08091F72:\n" +"\tmovs r1, 0\n" +"\tldrsh r0, [r4, r1]\n" +"\tcmp r0, 0\n" +"\tbeq _08091F94\n" +"\tlsls r0, r6, 24\n" +"\tlsrs r5, r0, 24\n" +"\tadds r0, r5, 0\n" +"\tbl GetItemType\n" +"\tlsls r0, 24\n" +"\tlsrs r0, 24\n" +"\tcmp r0, r7\n" +"\tbne _08091F94\n" +"\tmovs r2, 0\n" +"\tldrsh r0, [r4, r2]\n" +"\tcmp r0, r10\n" +"\tbge _08091F46\n" +"_08091F94:\n" +"\tadds r4, 0x2\n" +"\tadds r6, 0x1\n" +"\tcmp r6, 0xEF\n" +"\tble _08091F72\n" +"_08091F9C:\n" +"\tmov r0, r8\n" +"\tmovs r3, 0xFC\n" +"\tlsls r3, 2\n" +"\tadd sp, r3\n" +"\tpop {r3-r5}\n" +"\tmov r8, r3\n" +"\tmov r9, r4\n" +"\tmov r10, r5\n" +"\tpop {r4-r7}\n" +"\tpop {r1}\n" +"\tbx r1\n"); +#endif +} +void ClearAllItems_8091FB4() { + s32 i; + + for (i = 0; i < INVENTORY_SIZE; i++) { + struct ItemSlot* slot = &gTeamInventory_203B460->teamItems[i]; + if (slot->unk0 & 1) { + slot->unk0 &= 0xf7; + if (slot->itemIndex == ITEM_ID_POKE) { + AddToTeamMoney(GetMoneyValue(slot)); + slot->itemIndex = 0; + slot->numItems = 0; + slot->unk0 = 0; + } + } + } + FillInventoryGaps(); + for (i = 0; i < NUM_SPECIES; i++) { + struct PokemonStruct* pokemon; +#ifdef NONMATCHING + pokemon = &i[gRecruitedPokemonRef->pokemon]; +#else + register size_t offset asm("r1") = offsetof(struct unkStruct_203B45C, pokemon[i]); + struct PokemonStruct* p = gRecruitedPokemonRef->pokemon; + size_t addr = offset + (size_t)p; + pokemon = (struct PokemonStruct*)addr; +#endif + + if ((u8)pokemon->unk0 & 1) { + if (pokemon->heldItem.itemIndex) { + if (pokemon->heldItem.itemIndex == ITEM_ID_POKE) { + AddToTeamMoney(GetMoneyValueHeld(&pokemon->heldItem)); + pokemon->heldItem.itemIndex = 0; + } + } + } + } +} diff --git a/src/items_1.c b/src/items_1.c deleted file mode 100644 index f0061ce..0000000 --- a/src/items_1.c +++ /dev/null @@ -1,648 +0,0 @@ -#include "global.h" -#include "item.h" -#include "team_inventory.h" -#include "random.h" -#include "pokemon.h" -#include "subStruct_203B240.h" - -#include <stddef.h> - -extern struct TeamInventory *gTeamInventory_203B460; -extern EWRAM_DATA struct Item *gItemParametersData; - -extern void sub_80073B8(u32); -extern u32 sub_8097DF0(char *, struct subStruct_203B240 **); -extern void sub_8092A88(void*, u16); // first arg is some struct -extern void sub_80078A4(u32, u32, u32, u32, u32); -extern u32 sub_8092B00(void*); -extern u8* GetUnformattedTypeString(s16); -extern u32 sub_8092BF4(void*); -extern void sub_80073E0(u32); -extern void xxx_format_and_draw(u32, u32, u8 *, u32, u32); - -extern u8 gUnknown_202DE58[0x58]; -extern u32 gUnknown_202DE30; -extern u8* gPtrTypeText; // ptr to "Type\0" -extern u8* gPtrPPD0Text; // ptr to "PP $d0 \0" -extern u32 gUnknown_810A3F0[100]; -extern struct unkStruct_203B45C *gRecruitedPokemonRef; -extern s16 gTypeGummiIQBoost[0x12][NUMBER_OF_GUMMIS]; -extern u16 gGummiStatBoostLUT; - - -// s32 sub_8090FEC(s32 a1, u8* a2, u8 a3) -// { -// s32 i, j; -// s32 cond = 0; - -// j = 0; -// for (i = 0; i < 4; i++) { -// s32 div = 0; -// s32 next = i + 1; -// register s32* unk_temp asm("r0"); - -// register UNUSED size_t unk_offs asm("r3") = i << 2; -// unk_temp = (s32*)0x81097B0; -// next = i + 1; -// if (a1 >= unk_temp[i]) { -// register s32 *temp_81097B0 asm("r2") = (s32*)0x81097B0; -// u32 _i = i; -// s32 diff; -// do { -// // correct other than register usage -// diff = temp_81097B0[_i]; -// a1 -= diff; -// div++; -// } while (a1 >= diff); -// } - -// if (div > 9) { -// div = 9; -// } -// // /correct - -// if (!div && !cond) { -// if (a3) { -// *a2++ = 96; -// } -// } -// else { -// u8 temp; -// if (div) { -// u32 offs; - -// cond = 1; -// offs = 2 * div; -// *a2++ = ((u8*)0x81097C4)[offs]; -// temp = ((u8*)0x81097C5)[offs]; -// } -// else { -// *a2++ = ((u8*)0x81097C4)[0]; -// temp = ((u8*)0x81097C5)[0]; -// } - -// *a2++ = temp; -// j++; -// } -// } - -// *a2++ = ((u8*)0x81097C4)[2 * a1]; -// *a2++ = ((u8*)0x81097C5)[2 * a1]; -// *a2 = 0; -// return j + 1; -// } - -void FillInventoryGaps() -{ - // fill inventory gaps - s32 slot_checking = 0; - s32 last_filled = 0; - - do { - // effectively just a while loop - if ((slot_checking < INVENTORY_SIZE) && !(slot_checking[gTeamInventory_203B460->teamItems].unk0 & 1)) { - // find next empty slot - do { - slot_checking++; - } while ((slot_checking < INVENTORY_SIZE) && !(slot_checking[gTeamInventory_203B460->teamItems].unk0 & 1)); - } - - if (slot_checking == INVENTORY_SIZE) { - break; - } - - if (slot_checking > last_filled) { - // shift it down - gTeamInventory_203B460->teamItems[last_filled] = gTeamInventory_203B460->teamItems[slot_checking]; - } - slot_checking++; - last_filled++; - } while (1); - - // clear out the rest of the slots - for (; last_filled < INVENTORY_SIZE; last_filled++) { - struct ItemSlot *slot; -#ifdef NONMATCHING - slot = &gTeamInventory_203B460->teamItems[last_filled]; -#else - size_t offs = last_filled << 2; - size_t _slot = offs; - _slot += (size_t)gTeamInventory_203B460->teamItems; - slot = (struct ItemSlot*)_slot; // &gTeamInventory_203B460->teamItems[end]; -#endif - slot->itemIndex = 0; - slot->numItems = 0; - slot->unk0 = 0; - } -} - -s32 FindItemInInventory(u8 itemIndex) -{ - s32 i; - for (i = 0; i < INVENTORY_SIZE; i++) { - if ((gTeamInventory_203B460->teamItems[i].unk0 & 1) && (gTeamInventory_203B460->teamItems[i].itemIndex == itemIndex)) { - return i; - } - } - return -1; -} - -s32 GetItemCountInInventory(u8 _itemIndex) -{ -#ifdef NONMATCHING - s32 count = 0; - s32 i; - for (i = 0; i < INVENTORY_SIZE; i++) { - if ((gTeamInventory_203B460->teamItems[i].unk0 & 1) && (gTeamInventory_203B460->teamItems[i].itemIndex == _itemIndex)) { - count++; - } - } - return count; -#else - // have to do hacky stuff to fix initialization order of r6 and r2 - u32 itemIndex = _itemIndex; - s32 count = 0; - struct ItemSlot *slot = gTeamInventory_203B460->teamItems; - s32 one = 1; - s32 i = 19; - - do { - register u32 unk0 asm("r1") = slot->unk0; - u32 bottom_bit = one; - bottom_bit &= unk0; - if (bottom_bit && (slot->itemIndex == itemIndex)) { - count++; - } - slot++; - } while(--i >= 0); - return count; -#endif -} - -s32 GetItemPossessionCount(u8 itemIndex) -{ - s32 item_count = GetItemCountInInventory(itemIndex); - s32 i = 0; - - struct unkStruct_203B45C *_gRecruitedPokemonRef = gRecruitedPokemonRef; - for (i = 0; i < NUM_SPECIES; i++) { - struct PokemonStruct* pokemon = &_gRecruitedPokemonRef->pokemon[i]; - if ((1 & pokemon->unk0) - && ((pokemon->unk0 >> 1) % 2) - && (pokemon->itemIndexHeld != ITEM_ID_NOTHING) - && (pokemon->itemIndexHeld == itemIndex)) { - item_count++; - } - } - return item_count; -} - -void ShiftItemsDownFrom(s32 start) -{ - s32 i, j; - for (i = start, j = start + 1; i < 19; i++, j++) { - gTeamInventory_203B460->teamItems[i] = gTeamInventory_203B460->teamItems[j]; - } - gTeamInventory_203B460->teamItems[19].itemIndex = 0; - gTeamInventory_203B460->teamItems[19].unk0 = 0; -} - -void ClearItemSlotAt(u32 index) -{ - gTeamInventory_203B460->teamItems[index].itemIndex = ITEM_ID_NOTHING; - gTeamInventory_203B460->teamItems[index].unk0 = 0; -} - -bool8 sub_809124C(u8 itemIndex, u8 param_3) -{ - struct ItemSlot temp; - sub_8090A8C(&temp, itemIndex, param_3); - return AddItemToInventory(&temp); -} - -bool8 sub_8091274(struct ItemSlot_ALT* slot) -{ - struct ItemSlot temp; - - sub_8090B64(&temp, slot); - return AddItemToInventory(&temp); -} - -bool8 AddItemToInventory(const struct ItemSlot* slot) -{ - s32 i; - - // try to add item to inventory, return 1 if failed - for (i = 0; i < INVENTORY_SIZE; i++) { - UNUSED struct ItemSlot* current = &gTeamInventory_203B460->teamItems[i]; - if (!(i[gTeamInventory_203B460->teamItems].unk0 & 1)) { - gTeamInventory_203B460->teamItems[i] = *slot; - return FALSE; - } - } - return TRUE; -} - -void ConvertMoneyItemToMoney() -{ - s32 i = 0; - - do { - UNUSED struct TeamInventory * _gTeamInventory_203B460 = gTeamInventory_203B460; - UNUSED size_t offs = offsetof(struct TeamInventory, teamItems[i]); - - struct ItemSlot* current_slot = &gTeamInventory_203B460->teamItems[i]; - if ((current_slot->unk0 & 1) && (current_slot->itemIndex == ITEM_ID_POKE)) { - u32 result; - - result = GetMoneyValue(current_slot); - AddToTeamMoney(result); - current_slot->itemIndex = 0; - current_slot->numItems = 0; - current_slot->unk0 = 0; - } - } while (++i < INVENTORY_SIZE); - FillInventoryGaps(); - - i = 0; - do { - s32 lowest_index = -1; - UNUSED size_t offs = offsetof(struct TeamInventory, teamItems[i]); - - bool8 item_occupied = i[gTeamInventory_203B460->teamItems].unk0 & 1; - s32 next = i + 1; - - if (item_occupied) { - s32 lowest_order = GetItemOrder(gTeamInventory_203B460->teamItems[i].itemIndex); - s32 j; - - // find next lowest - for (j = next; j < INVENTORY_SIZE; j++) { - UNUSED size_t offs = offsetof(struct TeamInventory, teamItems[j]); - if ((j[gTeamInventory_203B460->teamItems].unk0 & 1) && (lowest_order > GetItemOrder(gTeamInventory_203B460->teamItems[j].itemIndex))) { - lowest_index = j; - lowest_order = GetItemOrder(gTeamInventory_203B460->teamItems[j].itemIndex); - } - } - - if (lowest_index >= 0) { - // swap the slots - struct ItemSlot current = gTeamInventory_203B460->teamItems[i]; - gTeamInventory_203B460->teamItems[i] = gTeamInventory_203B460->teamItems[lowest_index]; - gTeamInventory_203B460->teamItems[lowest_index] = current; - } - } - } while (++i < INVENTORY_SIZE); - FillInventoryGaps(); -} - -void AddToTeamMoney(s32 amount) -{ - s32 clamped_money; - gTeamInventory_203B460->teamMoney += amount; - - // clamp money - clamped_money = 99999; - if (gTeamInventory_203B460->teamMoney <= 99999) { - if (gTeamInventory_203B460->teamMoney >= 0) { - return; - } - clamped_money = 0; - } - gTeamInventory_203B460->teamMoney = clamped_money; -} - -u16 GetItemMove(u8 index) -{ - return gItemParametersData[index].move; -} - -u32 sub_80913E0(struct ItemSlot* slot, u32 a2, struct subStruct_203B240 ** a3) -{ - u8 buffer88[88]; // some struct - - GetItemDescription(slot->itemIndex); - sub_8090DC4(buffer88, slot->itemIndex, 0); - if (slot->itemIndex == ITEM_ID_USED_TM) { - // empty TM - sub_8090DC4(&gUnknown_202DE58, (u8)(slot->numItems + 125), 0); - } - sub_80073B8(a2); - xxx_format_and_draw(16, 0, buffer88, a2, 0); - - xxx_format_and_draw(8, 24, GetItemDescription(slot->itemIndex), a2, 0); - if (GetItemType(slot->itemIndex) == ITEM_TYPE_TM) { - u8* buffer8 = buffer88 + 0x50; // field in struct - u16 move = GetItemMove(slot->itemIndex); - u8 moves_data; - u8* typestring; - u32 result; - - sub_8092A88(buffer8, move); - sub_80078A4(a2, 4, 82, 200, 7); - xxx_format_and_draw(4, 84, gPtrTypeText, a2, 0); - moves_data = sub_8092B00(buffer8); - typestring = GetUnformattedTypeString(moves_data); - xxx_format_and_draw(64, 84, typestring, a2, 0); - result = sub_8092BF4(buffer8); - gUnknown_202DE30 = result; - xxx_format_and_draw(128, 84, gPtrPPD0Text, a2, 0); - } - - sub_80073E0(a2); - return sub_8097DF0(GetItemDescription(slot->itemIndex), a3); -} - -bool8 CanSellItem(u32 id) -{ - u8 id_; - id = (u8)id; - id_ = id; - - if((id != ITEM_ID_NOTHING) - && (id != ITEM_ID_POKE) - && (id != ITEM_ID_ROCK_PART) - && (id != ITEM_ID_ICE_PART) - && (id != ITEM_ID_STEEL_PART) - && (id != ITEM_ID_MUSIC_BOX) - && (GetItemSellPrice(id_)) - && (GetItemBuyPrice(id_))) { - return TRUE; - } - return FALSE; -} - -bool8 IsNotMoneyOrUsedTMItem(u8 id) -{ - if (id == ITEM_ID_NOTHING) { - return FALSE; - } - else if (id == ITEM_ID_POKE) { - return FALSE; - } - else if (id == ITEM_ID_USED_TM) { - return FALSE; - } - return TRUE; -} - -bool8 IsNotSpecialItem(u8 id) -{ - if (id == ITEM_ID_NOTHING) { - return FALSE; - } - else if (id == ITEM_ID_POKE) { - return FALSE; - } - else if (id == ITEM_ID_ROCK_PART) { - return FALSE; - } - else if (id == ITEM_ID_ICE_PART) { - return FALSE; - } - else if (id == ITEM_ID_STEEL_PART) { - return FALSE; - } - else if (id == ITEM_ID_MUSIC_BOX) { - return FALSE; - } - return TRUE; -} - -bool8 IsEdibleItem(u8 id) -{ - if (!((GetItemType(id) == ITEM_TYPE_BERRY_SEED) || (GetItemType(id) == ITEM_TYPE_APPLE_GUMMI))) { - return FALSE; - } - return TRUE; -} - -bool8 IsHMItem(u8 id) -{ - if (id == ITEM_ID_CUT) { - return TRUE; - } - else if (id == ITEM_ID_FLY) { - return TRUE; - } - else if (id == ITEM_ID_SURF) { - return TRUE; - } - else if (id == ITEM_ID_STRENGTH) { - return TRUE; - } - else if (id == ITEM_ID_FLASH) { - return TRUE; - } - else if (id == ITEM_ID_ROCK_SMASH) { - return TRUE; - } - else if (id == ITEM_ID_WATERFALL) { - return TRUE; - } - else if (id == ITEM_ID_DIVE) { - return TRUE; - } - return FALSE; -} - -u32 GetMoneyValue(struct ItemSlot* slot) -{ - return gUnknown_810A3F0[slot->numItems]; -} - -u32 GetMoneyValue2(struct ItemSlot* slot) -{ - return gUnknown_810A3F0[slot->numItems]; -} - -void GetGummiItemStatBoost(struct PokemonStruct* pokemon, u8 itemIndex, u8 a3, struct unkStruct_80915F4* a4) -{ - // item stat buff? - s8 result; - - a4->unk0 = (u16)-1; - a4->unk2 = 0; - result = IsGummiItem(itemIndex); - if (result) { - u8 pokemon_type_0 = GetPokemonType(pokemon->speciesNum, 0); - u8 pokemon_type_1 = GetPokemonType(pokemon->speciesNum, 1); - u32 gummi_index = itemIndex - ITEM_ID_WHITE_GUMMI + 1; - s32 value0; - s32 value1; - s32 diff; - u16 boost_amount; - - value0 = gTypeGummiIQBoost[pokemon_type_0][gummi_index]; - value1 = gTypeGummiIQBoost[pokemon_type_1][gummi_index]; - diff = pokemon->IQ; - - pokemon->IQ += value0 + value1; - diff = pokemon->IQ - diff; - if (pokemon->IQ <= 0) { - pokemon->IQ = 1; - } - if (pokemon->IQ > 999) { - pokemon->IQ = 999; - } - - boost_amount = 0; - if (diff <= 8) { - boost_amount = 1; - if (diff <= 4) { - boost_amount = 3; - if (diff > 2) { - boost_amount = 2; - } - } - } - a4->unk0 = boost_amount; - if (!a3) { - u16 boost_flags; - if (!boost_amount && RandomCapped(16) == 10) { - // supa gummi (all stats boost) - boost_flags = 0xf; - } - else { - s32 random_index = RandomCapped(4); - u16* table = &gGummiStatBoostLUT; - boost_flags = table[random_index]; - } - - a4->unk2 = boost_flags; - boost_flags = a4->unk2; - if (a4->unk2 & 1) { - if (pokemon->pokeAtt < 255) { - pokemon->pokeAtt++; - } - else { - // fix operand order - u16 unk2 = a4->unk2; - unk2 &= ~1; - a4->unk2 &= unk2; - } - } - if (a4->unk2 & 2) { - if (pokemon->pokeSPAtt < 255) { - pokemon->pokeSPAtt++; - } - else { - a4->unk2 &= ~2; - } - } - if (a4->unk2 & 4) { - if (pokemon->pokeDef < 255) { - pokemon->pokeDef++; - } - else { - a4->unk2 &= ~4; - } - } - if (a4->unk2 & 8) { - if (pokemon->pokeSPDef < 255) { - pokemon->pokeSPDef++; - } - else { - a4->unk2 &= ~8; - } - } - } - } -} - -bool8 IsGummiItem(u8 itemIndex) -{ - if (itemIndex < ITEM_ID_WHITE_GUMMI) { - return FALSE; - } - if (itemIndex > ITEM_ID_SILVER_GUMMI) { - return FALSE; - } - return TRUE; -} - -bool8 HasGummiItem() -{ - s32 i; - for (i = 0; i < INVENTORY_SIZE; i++) { - UNUSED size_t offs = offsetof(struct TeamInventory, teamItems[i]); - if ((i[gTeamInventory_203B460->teamItems].unk0 & 1) && IsGummiItem(i[gTeamInventory_203B460->teamItems].itemIndex)) { - return TRUE; - } - } - return FALSE; -} - -void MoveToStorage(struct ItemSlot* slot) -{ - if (IsThrowableItem(slot->itemIndex)) { - gTeamInventory_203B460->teamStorage[slot->itemIndex] += slot->numItems; - } - else { - gTeamInventory_203B460->teamStorage[slot->itemIndex]++; - } - - if (gTeamInventory_203B460->teamStorage[slot->itemIndex] > 999) { - gTeamInventory_203B460->teamStorage[slot->itemIndex] = 999; - } -} - -s32 xxx_count_inv_unk230() -{ - s32 i; - s32 counter = 0; - for (i = 0; i < 8; i++) { - if (gTeamInventory_203B460->unk230[i].unk0) { - counter++; - } - } - return counter; -} - -void xxx_init_unk230_substruct(u8 i) -{ - struct subStruct_203B460* unk230; - - unk230 = &gTeamInventory_203B460->unk230[i]; - unk230->unk0 = 0; - unk230->unk1 = 0; -} - -struct subStruct_203B460* sub_809185C(u8 i) -{ - return &gTeamInventory_203B460->unk230[i]; -} - -void xxx_fill_unk230_gaps() -{ - // fill unk230 gaps - // basically the same as FillInventoryGaps - s32 slot_checking = 0; - s32 last_filled = 0; - - do { - // effectively just a while loop - if ((slot_checking < 8) && !gTeamInventory_203B460->unk230[slot_checking].unk0) { - do { - // find next empty slot - slot_checking++; - } while ((slot_checking < 8) && !gTeamInventory_203B460->unk230[slot_checking].unk0); - } - - if (slot_checking == 8) { - break; - } - - if (slot_checking > last_filled) { - // shift it down - gTeamInventory_203B460->unk230[last_filled] = gTeamInventory_203B460->unk230[slot_checking]; - } - slot_checking++; - last_filled++; - } while (1); - - // clear out the rest of the slots - for (; last_filled < 8; last_filled++) { - xxx_init_unk230_substruct(last_filled); - } -} diff --git a/src/kangaskhan_storage_2.c b/src/kangaskhan_storage_2.c index 691d37b..ea1b804 100644 --- a/src/kangaskhan_storage_2.c +++ b/src/kangaskhan_storage_2.c @@ -144,14 +144,14 @@ void sub_8017B88(void) else { gUnknown_203B208->itemIndex = sub_801CB24(); - sub_8090A8C(&gUnknown_203B208->unkC, gUnknown_203B208->itemIndex, 0); + xxx_init_itemslot_8090A8C(&gUnknown_203B208->unkC, gUnknown_203B208->itemIndex, 0); gUnknown_203B208->unkC.numItems = 1; UpdateKangaskhanStorageState(0x19); } break; case 4: gUnknown_203B208->itemIndex = sub_801CB24(); - sub_8090A8C(&gUnknown_203B208->unkC, gUnknown_203B208->itemIndex, 0); + xxx_init_itemslot_8090A8C(&gUnknown_203B208->unkC, gUnknown_203B208->itemIndex, 0); gUnknown_203B208->unkC.numItems = 1; UpdateKangaskhanStorageState(0x1A); break; diff --git a/src/kecleon_items_1.c b/src/kecleon_items_1.c index fb102e1..b4f1b44 100644 --- a/src/kecleon_items_1.c +++ b/src/kecleon_items_1.c @@ -10,9 +10,7 @@ extern struct unkStruct_203B210 *gUnknown_203B210; extern struct TeamInventory *gTeamInventory_203B460; extern u32 GetStackSellPrice(struct ItemSlot *); -extern bool8 CanSellItem(u8); extern u32 xxx_count_inv_unk230(void); -extern u32 sub_8091A48(void); extern s32 sub_80144A4(s32 *); void UpdateKecleonStoreState(u32); extern u32 sub_801B410(void); @@ -170,7 +168,7 @@ u32 sub_8019D8C(void) if(gUnknown_203B210->unk4) return xxx_count_inv_unk230(); else - return sub_8091A48(); + return xxx_count_non_empty_inv_unk250_8091A48(); } void sub_8019DAC(void) diff --git a/src/play_time.c b/src/play_time.c index 7622e31..8b2e567 100644 --- a/src/play_time.c +++ b/src/play_time.c @@ -1,11 +1,10 @@ #include "global.h" #include "play_time.h" +#include "code_8092334.h" extern struct PlayTimeStruct *gPlayTimeRef; EWRAM_DATA struct PlayTimeStruct gPlayTime; -extern void sub_809488C(u8 *r0, u8 *r1, u32); -extern void sub_8094924(u8 *r0, u8 *r1, u32); void InitializePlayTime(void) { @@ -76,7 +75,7 @@ void DeconstructPlayTime(struct PlayTimeStruct *r0, u32 *outHours, u32 *outMinut } } -void WritePlayTime(u8 *r0) +void WritePlayTime(struct unkStruct_8094924 *r0) { sub_809488C(r0, (&(gPlayTimeRef->frames)), 6); sub_809488C(r0, (&(gPlayTimeRef->seconds)), 6); @@ -84,10 +83,10 @@ void WritePlayTime(u8 *r0) sub_809488C(r0, (u8 *)(&(gPlayTimeRef->hours)), 14); } -void ReadPlayTime(u8 *r0) +void ReadPlayTime(struct unkStruct_8094924 *r0) { sub_8094924(r0, (&(gPlayTimeRef->frames)), 6); sub_8094924(r0, (&(gPlayTimeRef->seconds)), 6); sub_8094924(r0, (&(gPlayTimeRef->minutes)), 6); - sub_8094924(r0, (u8 *)(&(gPlayTimeRef->hours)), 14); + sub_8094924(r0, (u8*)(&(gPlayTimeRef->hours)), 14); } diff --git a/src/rescue_team_info.c b/src/rescue_team_info.c index c2a2c8f..61c0184 100644 --- a/src/rescue_team_info.c +++ b/src/rescue_team_info.c @@ -1,14 +1,10 @@ #include "global.h" #include "rescue_team_info.h" +#include "code_8092334.h" extern struct RescueTeamData *gRescueTeamInfoRef; EWRAM_DATA struct RescueTeamData gRescueTeamInfo; -extern void sub_809485C(u32 *r0, u8 *r1, u32 r2); -extern void sub_809486C(u32 *r0, u8 *r1, u32 r2); -extern void sub_809488C(u32 *r0, u8 *r1, u32 r2); -extern void sub_8094924(u32 *r0, u8 *r1, u32); -extern void nullsub_102(u32 *r0); extern u8 sub_80023E4(u32); extern void sub_80922B4(u8 *buffer, u8 *string, s32 size); extern void BoundedCopyStringtoBuffer(u8 *buffer, u8 *string, s32 size); @@ -134,7 +130,7 @@ u8 sub_80921B8(void) u32 SaveRescueTeamInfo(u8 *param_1, u32 size) { - u32 auStack36[4]; + struct unkStruct_8094924 auStack36; u8 neg1; u8 zero; u8 *puVar2; @@ -142,9 +138,9 @@ u32 SaveRescueTeamInfo(u8 *param_1, u32 size) neg1 = -1; zero = 0; - sub_809486C(auStack36, param_1, size); - sub_809488C(auStack36, gRescueTeamInfoRef->teamName, 0x58); - sub_809488C(auStack36, (u8 *)&gRescueTeamInfoRef->teamRankPts, 0x20); + sub_809486C(&auStack36, param_1, size); + sub_809488C(&auStack36, gRescueTeamInfoRef->teamName, 0x58); + sub_809488C(&auStack36, (u8 *)&gRescueTeamInfoRef->teamRankPts, 0x20); gRescueTeamInfoRef->unk10 = sub_80023E4(0); if (gRescueTeamInfoRef->unk10 != 0) @@ -155,21 +151,21 @@ u32 SaveRescueTeamInfo(u8 *param_1, u32 size) { puVar2 = &zero; } - sub_809488C(auStack36,puVar2,1); - nullsub_102(auStack36); - return auStack36[2]; + sub_809488C(&auStack36,puVar2,1); + nullsub_102(&auStack36); + return auStack36.unk8; } u32 ReadRescueTeamInfo(u8 *param_1, u32 size) { - u32 auStack32 [4]; + struct unkStruct_8094924 auStack32; u8 byteArray[4]; - sub_809485C(auStack32, param_1, size); - sub_8094924(auStack32, gRescueTeamInfoRef->teamName, 0x58); - sub_8094924(auStack32, (u8 *)&gRescueTeamInfoRef->teamRankPts, 0x20); - sub_8094924(auStack32, byteArray, 1); + sub_809485C(&auStack32, param_1, size); + sub_8094924(&auStack32, gRescueTeamInfoRef->teamName, 0x58); + sub_8094924(&auStack32, (u8 *)&gRescueTeamInfoRef->teamRankPts, 0x20); + sub_8094924(&auStack32, byteArray, 1); gRescueTeamInfoRef->unk10 = byteArray[0] & 1; - nullsub_102(auStack32); - return auStack32[2]; + nullsub_102(&auStack32); + return auStack32.unk8; } diff --git a/src/trade_items_menu.c b/src/trade_items_menu.c index b9284c0..44e2b77 100644 --- a/src/trade_items_menu.c +++ b/src/trade_items_menu.c @@ -63,7 +63,6 @@ extern void sub_80073E0(u32); extern void xxx_call_draw_string(u32, u32, u32 *, u32, u32); extern u8 sub_801CF14(u32); extern u32 sub_801D008(); -extern void sub_8090DC4(void*, u8, u32); extern void sub_801C8C4(u32, u32, s32 *, u32); void sub_8036F30(); |