summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/bag.s973
-rw-r--r--arm9/asm/unk_0205CE48.s4
-rw-r--r--arm9/asm/unk_0206E2F0.s8
-rw-r--r--arm9/global.inc6
-rw-r--r--arm9/lib/include/MI_memory.h7
-rw-r--r--arm9/modules/75/asm/module_75.s10
-rw-r--r--arm9/src/bag.c463
-rw-r--r--include/bag.h60
8 files changed, 544 insertions, 987 deletions
diff --git a/arm9/asm/bag.s b/arm9/asm/bag.s
deleted file mode 100644
index dba33611..00000000
--- a/arm9/asm/bag.s
+++ /dev/null
@@ -1,973 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- thumb_func_start Sav2_Bag_sizeof
-Sav2_Bag_sizeof: ; 0x0206EB80
- ldr r0, _0206EB84 ; =0x00000774
- bx lr
- .balign 4
-_0206EB84: .word 0x00000774
-
- thumb_func_start Sav2_Bag_new
-Sav2_Bag_new: ; 0x0206EB88
- push {r4, lr}
- ldr r1, _0206EB9C ; =0x00000774
- bl AllocFromHeap
- add r4, r0, #0x0
- bl Sav2_Bag_init
- add r0, r4, #0x0
- pop {r4, pc}
- nop
-_0206EB9C: .word 0x00000774
-
- thumb_func_start Sav2_Bag_init
-Sav2_Bag_init: ; 0x0206EBA0
- ldr r3, _0206EBAC ; =MIi_CpuClear16
- add r1, r0, #0x0
- mov r0, #0x0
- ldr r2, _0206EBB0 ; =0x00000774
- bx r3
- nop
-_0206EBAC: .word MIi_CpuClear16
-_0206EBB0: .word 0x00000774
-
- thumb_func_start Sav2_Bag_copy
-Sav2_Bag_copy: ; 0x0206EBB4
- ldr r3, _0206EBBC ; =MI_CpuCopy8
- ldr r2, _0206EBC0 ; =0x00000774
- bx r3
- nop
-_0206EBBC: .word MI_CpuCopy8
-_0206EBC0: .word 0x00000774
-
- thumb_func_start FUN_0206EBC4
-FUN_0206EBC4: ; 0x0206EBC4
- mov r1, #0x77
- lsl r1, r1, #0x4
- ldr r0, [r0, r1]
- bx lr
-
- thumb_func_start FUN_0206EBCC
-FUN_0206EBCC: ; 0x0206EBCC
- mov r2, #0x77
- lsl r2, r2, #0x4
- str r1, [r0, r2]
- bx lr
-
- thumb_func_start GetItemPocket
-GetItemPocket: ; 0x0206EBD4
- ; int GetItemPocket(struct BagData * bag, u16 item_id, struct ItemSlot ** slot_p, u32 * count_p, u32 heap_id)
- ; Loads pocket pointer and capacity into passed pointers
- ; Returns pocket ID
- push {r4-r6, lr}
- add r5, r2, #0x0
- add r4, r0, #0x0
- add r0, r1, #0x0
- ldr r2, [sp, #0x10]
- mov r1, #0x5
- add r6, r3, #0x0
- bl GetItemAttr
- cmp r0, #0x7
- bhi _0206EC64
- add r1, r0, r0
- add r1, pc
- ldrh r1, [r1, #0x6]
- lsl r1, r1, #0x10
- asr r1, r1, #0x10
- add pc, r1
-_0206EBF6: ; jump table (using 16-bit offset)
- .short _0206EC14 - _0206EBF6 - 2; case 0 (POCKET_ITEMS)
- .short _0206EC28 - _0206EBF6 - 2; case 1 (POCKET_MEDICINE)
- .short _0206EC34 - _0206EBF6 - 2; case 2 (POCKET_BALLS)
- .short _0206EC58 - _0206EBF6 - 2; case 3 (POCKET_TMHMS)
- .short _0206EC1C - _0206EBF6 - 2; case 4 (POCKET_BERRIES)
- .short _0206EC4C - _0206EBF6 - 2; case 5 (POCKET_MAIL)
- .short _0206EC40 - _0206EBF6 - 2; case 6 (POCKET_BATTLE_ITEMS)
- .short _0206EC06 - _0206EBF6 - 2; case 7 (POCKET_KEY_ITEMS)
-_0206EC06:
- mov r1, #0xa5
- lsl r1, r1, #0x2
- add r1, r4, r1
- str r1, [r5, #0x0]
- mov r1, #0x32
- str r1, [r6, #0x0]
- pop {r4-r6, pc}
-_0206EC14:
- str r4, [r5, #0x0]
- mov r1, #0xa5
- str r1, [r6, #0x0]
- pop {r4-r6, pc}
-_0206EC1C:
- ldr r1, _0206EC68 ; =0x000005BC
- add r1, r4, r1
- str r1, [r5, #0x0]
- mov r1, #0x40
- str r1, [r6, #0x0]
- pop {r4-r6, pc}
-_0206EC28:
- ldr r1, _0206EC6C ; =0x0000051C
- add r1, r4, r1
- str r1, [r5, #0x0]
- mov r1, #0x28
- str r1, [r6, #0x0]
- pop {r4-r6, pc}
-_0206EC34:
- ldr r1, _0206EC70 ; =0x000006BC
- add r1, r4, r1
- str r1, [r5, #0x0]
- mov r1, #0xf
- str r1, [r6, #0x0]
- pop {r4-r6, pc}
-_0206EC40:
- ldr r1, _0206EC74 ; =0x000006F8
- add r1, r4, r1
- str r1, [r5, #0x0]
- mov r1, #0x1e
- str r1, [r6, #0x0]
- pop {r4-r6, pc}
-_0206EC4C:
- ldr r1, _0206EC78 ; =0x000004EC
- add r1, r4, r1
- str r1, [r5, #0x0]
- mov r1, #0xc
- str r1, [r6, #0x0]
- pop {r4-r6, pc}
-_0206EC58:
- mov r1, #0xd7
- lsl r1, r1, #0x2
- add r1, r4, r1
- str r1, [r5, #0x0]
- mov r1, #0x64
- str r1, [r6, #0x0]
-_0206EC64:
- pop {r4-r6, pc}
- nop
-_0206EC68: .word 0x000005BC
-_0206EC6C: .word 0x0000051C
-_0206EC70: .word 0x000006BC
-_0206EC74: .word 0x000006F8
-_0206EC78: .word 0x000004EC
-
- thumb_func_start BagGetItemSlotForAddInternal
-BagGetItemSlotForAddInternal: ; 0x0206EC7C
- ; Returns a pointer to the bag item slot in the current pocket
- ; that has capacity for the item/quantity being added
- ; NULL if no such luck
- push {r4-r7}
- add r5, r1, #0x0
- mov r1, #0x0
- add r7, r0, #0x0
- add r4, r2, #0x0
- mov r12, r3
- mvn r1, r1
- mov r0, #0x0
- cmp r5, #0x0
- bls _0206ECCA
- add r2, r7, #0x0
- add r3, r1, #0x0
-_0206EC94:
- ldrh r6, [r2, #0x0]
- cmp r4, r6
- bne _0206ECB2
- lsl r0, r0, #0x2
- add r0, r7, r0
- ldrh r2, [r0, #0x2]
- mov r1, r12
- add r2, r1, r2
- add r1, sp, #0x0
- ldrh r1, [r1, #0x10]
- cmp r2, r1
- ble _0206ECDC
- mov r0, #0x0
- pop {r4-r7}
- bx lr
-_0206ECB2:
- cmp r1, r3
- bne _0206ECC2
- cmp r6, #0x0
- bne _0206ECC2
- ldrh r6, [r2, #0x2]
- cmp r6, #0x0
- bne _0206ECC2
- add r1, r0, #0x0
-_0206ECC2:
- add r0, r0, #0x1
- add r2, r2, #0x4
- cmp r0, r5
- blo _0206EC94
-_0206ECCA:
- mov r0, #0x0
- mvn r0, r0
- cmp r1, r0
- bne _0206ECD8
- mov r0, #0x0
- pop {r4-r7}
- bx lr
-_0206ECD8:
- lsl r0, r1, #0x2
- add r0, r7, r0
-_0206ECDC:
- pop {r4-r7}
- bx lr
-
- thumb_func_start BagGetItemSlotForAdd
-BagGetItemSlotForAdd: ; 0x0206ECE0
- ; Returns a pointer to the bag item slot that has capacity
- ; for the item/quantity being added
- ; NULL if no such luck
- push {r4-r5, lr}
- sub sp, #0xc
- add r4, r2, #0x0
- str r3, [sp, #0x0]
- add r2, sp, #0x8
- add r3, sp, #0x4
- add r5, r1, #0x0
- bl GetItemPocket
- cmp r0, #0x3 ; POCKET_TMHMS
- bne _0206ED0A
- mov r0, #0x63
- str r0, [sp, #0x0]
- ldr r0, [sp, #0x8]
- ldr r1, [sp, #0x4]
- add r2, r5, #0x0
- add r3, r4, #0x0
- bl BagGetItemSlotForAddInternal
- add sp, #0xc
- pop {r4-r5, pc}
-_0206ED0A:
- ldr r0, _0206ED20 ; =0x000003E7
- add r2, r5, #0x0
- str r0, [sp, #0x0]
- ldr r0, [sp, #0x8]
- ldr r1, [sp, #0x4]
- add r3, r4, #0x0
- bl BagGetItemSlotForAddInternal
- add sp, #0xc
- pop {r4-r5, pc}
- nop
-_0206ED20: .word 0x000003E7
-
- thumb_func_start BagHasSpaceForItem
-BagHasSpaceForItem: ; 0x0206ED24
- ; Returns bool whether space exists for the item being added
- push {r3, lr}
- bl BagGetItemSlotForAdd
- cmp r0, #0x0
- beq _0206ED32
- mov r0, #0x1
- pop {r3, pc}
-_0206ED32:
- mov r0, #0x0
- pop {r3, pc}
- .balign 4
-
- thumb_func_start BagAddItem
-BagAddItem: ; 0x0206ED38
- push {r4-r7, lr}
- sub sp, #0xc
- add r7, r0, #0x0
- add r5, r1, #0x0
- add r4, r2, #0x0
- add r6, r3, #0x0
- bl BagGetItemSlotForAdd
- str r0, [sp, #0x8]
- cmp r0, #0x0
- bne _0206ED54
- add sp, #0xc
- mov r0, #0x0
- pop {r4-r7, pc}
-_0206ED54:
- strh r5, [r0, #0x0]
- ldr r1, [sp, #0x8]
- add r2, sp, #0x8
- ldrh r0, [r1, #0x2]
- add r3, sp, #0x4
- add r0, r0, r4
- strh r0, [r1, #0x2]
- add r0, r7, #0x0
- add r1, r5, #0x0
- str r6, [sp, #0x0]
- bl GetItemPocket
- sub r0, r0, #0x3
- cmp r0, #0x1
- bhi _0206ED7A
- ; POCKET_TMHMS, POCKET_BERRIES
- ldr r0, [sp, #0x8]
- ldr r1, [sp, #0x4]
- bl SortPocket
-_0206ED7A:
- mov r0, #0x1
- add sp, #0xc
- pop {r4-r7, pc}
-
- thumb_func_start BagGetItemSlotForRemoveInternal
-BagGetItemSlotForRemoveInternal: ; 0x0206ED80
- push {r3-r6}
- mov r5, #0x0
- cmp r1, #0x0
- bls _0206EDA8
- add r6, r0, #0x0
-_0206ED8A:
- ldrh r4, [r6, #0x0]
- cmp r2, r4
- bne _0206EDA0
- lsl r1, r5, #0x2
- add r0, r0, r1
- ldrh r1, [r0, #0x2]
- cmp r1, r3
- bhs _0206EDAA
- mov r0, #0x0
- pop {r3-r6}
- bx lr
-_0206EDA0:
- add r5, r5, #0x1
- add r6, r6, #0x4
- cmp r5, r1
- blo _0206ED8A
-_0206EDA8:
- mov r0, #0x0
-_0206EDAA:
- pop {r3-r6}
- bx lr
- .balign 4
-
- thumb_func_start BagGetItemSlotForRemove
-BagGetItemSlotForRemove: ; 0x0206EDB0
- push {r4-r5, lr}
- sub sp, #0xc
- add r4, r2, #0x0
- str r3, [sp, #0x0]
- add r2, sp, #0x8
- add r3, sp, #0x4
- add r5, r1, #0x0
- bl GetItemPocket
- ldr r0, [sp, #0x8]
- ldr r1, [sp, #0x4]
- add r2, r5, #0x0
- add r3, r4, #0x0
- bl BagGetItemSlotForRemoveInternal
- add sp, #0xc
- pop {r4-r5, pc}
- .balign 4
-
- thumb_func_start BagTakeItem
-BagTakeItem: ; 0x0206EDD4
- push {r4-r7, lr}
- sub sp, #0xc
- add r6, r0, #0x0
- add r7, r1, #0x0
- add r5, r2, #0x0
- add r4, r3, #0x0
- bl BagGetItemSlotForRemove
- str r0, [sp, #0x8]
- cmp r0, #0x0
- bne _0206EDF0
- add sp, #0xc
- mov r0, #0x0
- pop {r4-r7, pc}
-_0206EDF0:
- ldrh r1, [r0, #0x2]
- sub r1, r1, r5
- strh r1, [r0, #0x2]
- ldr r1, [sp, #0x8]
- ldrh r0, [r1, #0x2]
- cmp r0, #0x0
- bne _0206EE02
- mov r0, #0x0
- strh r0, [r1, #0x0]
-_0206EE02:
- str r4, [sp, #0x0]
- add r0, r6, #0x0
- add r1, r7, #0x0
- add r2, sp, #0x8
- add r3, sp, #0x4
- bl GetItemPocket
- ldr r0, [sp, #0x8]
- ldr r1, [sp, #0x4]
- bl PocketCompaction
- mov r0, #0x1
- add sp, #0xc
- pop {r4-r7, pc}
- .balign 4
-
- thumb_func_start BagTakeItem2
-BagTakeItem2: ; 0x0206EE20
- push {r4-r6, lr}
- add r5, r0, #0x0
- add r6, r1, #0x0
- add r4, r3, #0x0
- bl BagGetItemSlotForRemoveInternal
- cmp r0, #0x0
- bne _0206EE34
- mov r0, #0x0
- pop {r4-r6, pc}
-_0206EE34:
- ldrh r1, [r0, #0x2]
- sub r1, r1, r4
- strh r1, [r0, #0x2]
- ldrh r1, [r0, #0x2]
- cmp r1, #0x0
- bne _0206EE44
- mov r1, #0x0
- strh r1, [r0, #0x0]
-_0206EE44:
- add r0, r5, #0x0
- add r1, r6, #0x0
- bl PocketCompaction
- mov r0, #0x1
- pop {r4-r6, pc}
-
- thumb_func_start BagHasItem
-BagHasItem: ; 0x0206EE50
- push {r3, lr}
- bl BagGetItemSlotForRemove
- cmp r0, #0x0
- beq _0206EE5E
- mov r0, #0x1
- pop {r3, pc}
-_0206EE5E:
- mov r0, #0x0
- pop {r3, pc}
- .balign 4
-
- thumb_func_start BagPocketNotEmpty
-BagPocketNotEmpty: ; 0x0206EE64
- cmp r1, #0x7
- bhi _0206EEC4
- add r1, r1, r1
- add r1, pc
- ldrh r1, [r1, #0x6]
- lsl r1, r1, #0x10
- asr r1, r1, #0x10
- add pc, r1
-_0206EE74: ; jump table (using 16-bit offset)
- .short _0206EE8E - _0206EE74 - 2; case 0
- .short _0206EE9A - _0206EE74 - 2; case 1
- .short _0206EEA2 - _0206EE74 - 2; case 2
- .short _0206EEBA - _0206EE74 - 2; case 3
- .short _0206EE92 - _0206EE74 - 2; case 4
- .short _0206EEB2 - _0206EE74 - 2; case 5
- .short _0206EEAA - _0206EE74 - 2; case 6
- .short _0206EE84 - _0206EE74 - 2; case 7
-_0206EE84:
- mov r1, #0xa5
- lsl r1, r1, #0x2
- add r0, r0, r1
- mov r2, #0x32
- b _0206EEC8
-_0206EE8E:
- mov r2, #0xa5
- b _0206EEC8
-_0206EE92:
- ldr r1, _0206EEE4 ; =0x000005BC
- mov r2, #0x40
- add r0, r0, r1
- b _0206EEC8
-_0206EE9A:
- ldr r1, _0206EEE8 ; =0x0000051C
- mov r2, #0x28
- add r0, r0, r1
- b _0206EEC8
-_0206EEA2:
- ldr r1, _0206EEEC ; =0x000006BC
- mov r2, #0xf
- add r0, r0, r1
- b _0206EEC8
-_0206EEAA:
- ldr r1, _0206EEF0 ; =0x000006F8
- mov r2, #0x1e
- add r0, r0, r1
- b _0206EEC8
-_0206EEB2:
- ldr r1, _0206EEF4 ; =0x000004EC
- mov r2, #0xc
- add r0, r0, r1
- b _0206EEC8
-_0206EEBA:
- mov r1, #0xd7
- lsl r1, r1, #0x2
- add r0, r0, r1
- mov r2, #0x64
- b _0206EEC8
-_0206EEC4:
- mov r0, #0x0
- bx lr
-_0206EEC8:
- mov r3, #0x0
- cmp r2, #0x0
- bls _0206EEE0
-_0206EECE:
- ldrh r1, [r0, #0x0]
- cmp r1, #0x0
- beq _0206EED8
- mov r0, #0x1
- bx lr
-_0206EED8:
- add r3, r3, #0x1
- add r0, r0, #0x4
- cmp r3, r2
- blo _0206EECE
-_0206EEE0:
- mov r0, #0x0
- bx lr
- .balign 4
-_0206EEE4: .word 0x000005BC
-_0206EEE8: .word 0x0000051C
-_0206EEEC: .word 0x000006BC
-_0206EEF0: .word 0x000006F8
-_0206EEF4: .word 0x000004EC
-
- thumb_func_start BagGetQuantity
-BagGetQuantity: ; 0x0206EEF8
- push {r3, lr}
- add r3, r2, #0x0
- mov r2, #0x1
- bl BagGetItemSlotForRemove
- cmp r0, #0x0
- bne _0206EF0A
- mov r0, #0x0
- pop {r3, pc}
-_0206EF0A:
- ldrh r0, [r0, #0x2]
- pop {r3, pc}
- .balign 4
-
- thumb_func_start PocketGetQuantity
-PocketGetQuantity: ; 0x0206EF10
- push {r3, lr}
- mov r3, #0x1
- bl BagGetItemSlotForRemoveInternal
- cmp r0, #0x0
- bne _0206EF20
- mov r0, #0x0
- pop {r3, pc}
-_0206EF20:
- ldrh r0, [r0, #0x2]
- pop {r3, pc}
-
- thumb_func_start SwapItemSlots
-SwapItemSlots: ; 0x0206EF24
- push {r3}
- sub sp, #0x4
- ldrh r3, [r0, #0x0]
- add r2, sp, #0x0
- strh r3, [r2, #0x0]
- ldrh r3, [r0, #0x2]
- strh r3, [r2, #0x2]
- ldrh r3, [r1, #0x0]
- strh r3, [r0, #0x0]
- ldrh r3, [r1, #0x2]
- strh r3, [r0, #0x2]
- ldrh r0, [r2, #0x0]
- strh r0, [r1, #0x0]
- ldrh r0, [r2, #0x2]
- strh r0, [r1, #0x2]
- add sp, #0x4
- pop {r3}
- bx lr
-
- thumb_func_start PocketCompaction
-PocketCompaction: ; 0x0206EF48
- push {r4-r7, lr}
- sub sp, #0xc
- str r0, [sp, #0x0]
- mov r0, #0x0
- add r7, r1, #0x0
- str r0, [sp, #0x4]
- sub r0, r7, #0x1
- str r0, [sp, #0x8]
- beq _0206EF8E
- ldr r4, [sp, #0x0]
-_0206EF5C:
- ldr r0, [sp, #0x4]
- add r6, r0, #0x1
- cmp r6, r7
- bhs _0206EF80
- ldr r0, [sp, #0x0]
- lsl r1, r6, #0x2
- add r5, r0, r1
-_0206EF6A:
- ldrh r0, [r4, #0x2]
- cmp r0, #0x0
- bne _0206EF78
- add r0, r4, #0x0
- add r1, r5, #0x0
- bl SwapItemSlots
-_0206EF78:
- add r6, r6, #0x1
- add r5, r5, #0x4
- cmp r6, r7
- blo _0206EF6A
-_0206EF80:
- ldr r0, [sp, #0x4]
- add r4, r4, #0x4
- add r1, r0, #0x1
- ldr r0, [sp, #0x8]
- str r1, [sp, #0x4]
- cmp r1, r0
- blo _0206EF5C
-_0206EF8E:
- add sp, #0xc
- pop {r4-r7, pc}
- .balign 4
-
- thumb_func_start SortPocket
-SortPocket: ; 0x0206EF94
- push {r4-r7, lr}
- sub sp, #0xc
- str r0, [sp, #0x0]
- mov r0, #0x0
- add r7, r1, #0x0
- str r0, [sp, #0x4]
- sub r0, r7, #0x1
- str r0, [sp, #0x8]
- beq _0206EFE8
- ldr r4, [sp, #0x0]
-_0206EFA8:
- ldr r0, [sp, #0x4]
- add r6, r0, #0x1
- cmp r6, r7
- bhs _0206EFDA
- ldr r0, [sp, #0x0]
- lsl r1, r6, #0x2
- add r5, r0, r1
-_0206EFB6:
- ldrh r0, [r4, #0x2]
- cmp r0, #0x0
- beq _0206EFCA
- ldrh r0, [r5, #0x2]
- cmp r0, #0x0
- beq _0206EFD2
- ldrh r1, [r4, #0x0]
- ldrh r0, [r5, #0x0]
- cmp r1, r0
- bls _0206EFD2
-_0206EFCA:
- add r0, r4, #0x0
- add r1, r5, #0x0
- bl SwapItemSlots
-_0206EFD2:
- add r6, r6, #0x1
- add r5, r5, #0x4
- cmp r6, r7
- blo _0206EFB6
-_0206EFDA:
- ldr r0, [sp, #0x4]
- add r4, r4, #0x4
- add r1, r0, #0x1
- ldr r0, [sp, #0x8]
- str r1, [sp, #0x4]
- cmp r1, r0
- blo _0206EFA8
-_0206EFE8:
- add sp, #0xc
- pop {r4-r7, pc}
-
- thumb_func_start CreateBagView
-CreateBagView: ; 0x0206EFEC
- push {r3-r7, lr}
- add r5, r0, #0x0
- lsl r0, r2, #0x18
- add r7, r1, #0x0
- lsr r0, r0, #0x18
- bl BagView_new
- add r6, r0, #0x0
- ldrb r0, [r7, #0x0]
- mov r4, #0x0
- cmp r0, #0xff
- beq _0206F0BE
-_0206F004:
- ldrb r0, [r7, r4]
- cmp r0, #0x7
- bhi _0206F0B6
- add r0, r0, r0
- add r0, pc
- ldrh r0, [r0, #0x6]
- lsl r0, r0, #0x10
- asr r0, r0, #0x10
- add pc, r0
-_0206F016: ; jump table (using 16-bit offset)
- .short _0206F03A - _0206F016 - 2; case 0
- .short _0206F05C - _0206F016 - 2; case 1
- .short _0206F06E - _0206F016 - 2; case 2
- .short _0206F0A4 - _0206F016 - 2; case 3
- .short _0206F04A - _0206F016 - 2; case 4
- .short _0206F092 - _0206F016 - 2; case 5
- .short _0206F080 - _0206F016 - 2; case 6
- .short _0206F026 - _0206F016 - 2; case 7
-_0206F026:
- mov r1, #0xa5
- lsl r1, r1, #0x2
- lsl r3, r4, #0x18
- add r0, r6, #0x0
- add r1, r5, r1
- mov r2, #0x7
- lsr r3, r3, #0x18
- bl BagView_setitem
- b _0206F0B6
-_0206F03A:
- lsl r3, r4, #0x18
- add r0, r6, #0x0
- add r1, r5, #0x0
- mov r2, #0x0
- lsr r3, r3, #0x18
- bl BagView_setitem
- b _0206F0B6
-_0206F04A:
- ldr r1, _0206F0C4 ; =0x000005BC
- lsl r3, r4, #0x18
- add r0, r6, #0x0
- add r1, r5, r1
- mov r2, #0x4
- lsr r3, r3, #0x18
- bl BagView_setitem
- b _0206F0B6
-_0206F05C:
- ldr r1, _0206F0C8 ; =0x0000051C
- lsl r3, r4, #0x18
- add r0, r6, #0x0
- add r1, r5, r1
- mov r2, #0x1
- lsr r3, r3, #0x18
- bl BagView_setitem
- b _0206F0B6
-_0206F06E:
- ldr r1, _0206F0CC ; =0x000006BC
- lsl r3, r4, #0x18
- add r0, r6, #0x0
- add r1, r5, r1
- mov r2, #0x2
- lsr r3, r3, #0x18
- bl BagView_setitem
- b _0206F0B6
-_0206F080:
- ldr r1, _0206F0D0 ; =0x000006F8
- lsl r3, r4, #0x18
- add r0, r6, #0x0
- add r1, r5, r1
- mov r2, #0x6
- lsr r3, r3, #0x18
- bl BagView_setitem
- b _0206F0B6
-_0206F092:
- ldr r1, _0206F0D4 ; =0x000004EC
- lsl r3, r4, #0x18
- add r0, r6, #0x0
- add r1, r5, r1
- mov r2, #0x5
- lsr r3, r3, #0x18
- bl BagView_setitem
- b _0206F0B6
-_0206F0A4:
- mov r1, #0xd7
- lsl r1, r1, #0x2
- lsl r3, r4, #0x18
- add r0, r6, #0x0
- add r1, r5, r1
- mov r2, #0x3
- lsr r3, r3, #0x18
- bl BagView_setitem
-_0206F0B6:
- add r4, r4, #0x1
- ldrb r0, [r7, r4]
- cmp r0, #0xff
- bne _0206F004
-_0206F0BE:
- add r0, r6, #0x0
- pop {r3-r7, pc}
- nop
-_0206F0C4: .word 0x000005BC
-_0206F0C8: .word 0x0000051C
-_0206F0CC: .word 0x000006BC
-_0206F0D0: .word 0x000006F8
-_0206F0D4: .word 0x000004EC
-
- thumb_func_start BagGetPocketSlotN
-BagGetPocketSlotN: ; 0x0206F0D8
- cmp r1, #0x7
- bhi _0206F136
- add r1, r1, r1
- add r1, pc
- ldrh r1, [r1, #0x6]
- lsl r1, r1, #0x10
- asr r1, r1, #0x10
- add pc, r1
-_0206F0E8: ; jump table (using 16-bit offset)
- .short _0206F102 - _0206F0E8 - 2; case 0
- .short _0206F10E - _0206F0E8 - 2; case 1
- .short _0206F116 - _0206F0E8 - 2; case 2
- .short _0206F12E - _0206F0E8 - 2; case 3
- .short _0206F106 - _0206F0E8 - 2; case 4
- .short _0206F126 - _0206F0E8 - 2; case 5
- .short _0206F11E - _0206F0E8 - 2; case 6
- .short _0206F0F8 - _0206F0E8 - 2; case 7
-_0206F0F8:
- mov r1, #0xa5
- lsl r1, r1, #0x2
- add r0, r0, r1
- mov r3, #0x32
- b _0206F136
-_0206F102:
- mov r3, #0xa5
- b _0206F136
-_0206F106:
- ldr r1, _0206F144 ; =0x000005BC
- mov r3, #0x40
- add r0, r0, r1
- b _0206F136
-_0206F10E:
- ldr r1, _0206F148 ; =0x0000051C
- mov r3, #0x28
- add r0, r0, r1
- b _0206F136
-_0206F116:
- ldr r1, _0206F14C ; =0x000006BC
- mov r3, #0xf
- add r0, r0, r1
- b _0206F136
-_0206F11E:
- ldr r1, _0206F150 ; =0x000006F8
- mov r3, #0x1e
- add r0, r0, r1
- b _0206F136
-_0206F126:
- ldr r1, _0206F154 ; =0x000004EC
- mov r3, #0xc
- add r0, r0, r1
- b _0206F136
-_0206F12E:
- mov r1, #0xd7
- lsl r1, r1, #0x2
- add r0, r0, r1
- mov r3, #0x64
-_0206F136:
- cmp r2, r3
- blo _0206F13E
- mov r0, #0x0
- bx lr
-_0206F13E:
- lsl r1, r2, #0x2
- add r0, r0, r1
- bx lr
- .balign 4
-_0206F144: .word 0x000005BC
-_0206F148: .word 0x0000051C
-_0206F14C: .word 0x000006BC
-_0206F150: .word 0x000006F8
-_0206F154: .word 0x000004EC
-
- thumb_func_start Sav2_Bag_get
-Sav2_Bag_get: ; 0x0206F158
- ldr r3, _0206F160 ; =SavArray_get
- mov r1, #0x3
- bx r3
- nop
-_0206F160: .word SavArray_get
-
- thumb_func_start FUN_0206F164
-FUN_0206F164: ; 0x0206F164
- push {r4, lr}
- mov r1, #0x24
- bl AllocFromHeap
- add r4, r0, #0x0
- mov r0, #0x0
- add r1, r4, #0x0
- mov r2, #0x24
- bl MIi_CpuClear16
- add r0, r4, #0x0
- pop {r4, pc}
-
- thumb_func_start FUN_0206F17C
-FUN_0206F17C: ; 0x0206F17C
- push {r3-r4}
- add r4, r0, r1
- ldrb r4, [r4, #0x8]
- strb r4, [r2, #0x0]
- ldrb r0, [r0, r1]
- strb r0, [r3, #0x0]
- pop {r3-r4}
- bx lr
-
- thumb_func_start FUN_0206F18C
-FUN_0206F18C: ; 0x0206F18C
- ldrh r0, [r0, #0x10]
- bx lr
-
- thumb_func_start FUN_0206F190
-FUN_0206F190: ; 0x0206F190
- push {r3-r4}
- add r4, r0, r1
- strb r2, [r4, #0x8]
- strb r3, [r0, r1]
- pop {r3-r4}
- bx lr
-
- thumb_func_start FUN_0206F19C
-FUN_0206F19C: ; 0x0206F19C
- strh r1, [r0, #0x10]
- bx lr
-
- thumb_func_start FUN_0206F1A0
-FUN_0206F1A0: ; 0x0206F1A0
- add r1, r0, r1
- ldrb r0, [r1, #0x19]
- strb r0, [r2, #0x0]
- ldrb r0, [r1, #0x14]
- strb r0, [r3, #0x0]
- bx lr
-
- thumb_func_start FUN_0206F1AC
-FUN_0206F1AC: ; 0x0206F1AC
- ldrh r0, [r0, #0x1e]
- bx lr
-
- thumb_func_start FUN_0206F1B0
-FUN_0206F1B0: ; 0x0206F1B0
- ldrh r0, [r0, #0x20]
- bx lr
-
- thumb_func_start FUN_0206F1B4
-FUN_0206F1B4: ; 0x0206F1B4
- ldrh r0, [r0, #0x22]
- bx lr
-
- thumb_func_start FUN_0206F1B8
-FUN_0206F1B8: ; 0x0206F1B8
- add r0, r0, r1
- strb r2, [r0, #0x19]
- strb r3, [r0, #0x14]
- bx lr
-
- thumb_func_start FUN_0206F1C0
-FUN_0206F1C0: ; 0x0206F1C0
- push {r4-r6, lr}
- mov r4, #0x0
- add r5, r0, #0x0
- add r6, r4, #0x0
-_0206F1C8:
- add r0, r5, #0x0
- add r1, r4, #0x0
- add r2, r6, #0x0
- add r3, r6, #0x0
- bl FUN_0206F1B8
- add r4, r4, #0x1
- cmp r4, #0x5
- blo _0206F1C8
- add r0, r5, #0x0
- mov r1, #0x0
- bl FUN_0206F1EC
- pop {r4-r6, pc}
-
- thumb_func_start FUN_0206F1E4
-FUN_0206F1E4: ; 0x0206F1E4
- strh r1, [r0, #0x1e]
- strh r2, [r0, #0x20]
- bx lr
- .balign 4
-
- thumb_func_start FUN_0206F1EC
-FUN_0206F1EC: ; 0x0206F1EC
- strh r1, [r0, #0x22]
- bx lr
diff --git a/arm9/asm/unk_0205CE48.s b/arm9/asm/unk_0205CE48.s
index d492b9a9..76fa972e 100644
--- a/arm9/asm/unk_0205CE48.s
+++ b/arm9/asm/unk_0205CE48.s
@@ -1390,7 +1390,7 @@ FUN_0205D8B8: ; 0x0205D8B8
ldr r0, [r5, #0x0]
ldr r0, [r0, #0xc]
bl Sav2_Bag_get
- bl FUN_0206EBC4
+ bl Bag_GetRegisteredItem
add r2, r0, #0x0
ldr r0, [r5, #0x0]
lsl r2, r2, #0x10
@@ -1705,7 +1705,7 @@ _0205DB54:
_0205DB66:
ldr r0, [r5, #0xc]
bl Sav2_Bag_get
- bl FUN_0206EBC4
+ bl Bag_GetRegisteredItem
lsl r0, r0, #0x10
lsr r0, r0, #0x10
mov r1, #0x6
diff --git a/arm9/asm/unk_0206E2F0.s b/arm9/asm/unk_0206E2F0.s
index d2649dcb..8694a11b 100644
--- a/arm9/asm/unk_0206E2F0.s
+++ b/arm9/asm/unk_0206E2F0.s
@@ -199,7 +199,7 @@ FUN_0206E3F8: ; 0x0206E3F8
b _0206E4FA
_0206E428:
mov r1, #0x1b
- lsl r1, r1, #0x4
+ lsl r1, r1, #0x4 ; ITEM_POINT_CARD
cmp r5, r1
bne _0206E454
add r0, r6, #0x0
@@ -218,7 +218,7 @@ _0206E428:
bl FUN_0200AD38
b _0206E4FA
_0206E454:
- add r2, r1, #0x2
+ add r2, r1, #0x2 ; ITEM_SEAL_CASE
cmp r5, r2
bne _0206E47E
add r0, r6, #0x0
@@ -237,7 +237,7 @@ _0206E454:
bl FUN_0200AD38
b _0206E4FA
_0206E47E:
- add r2, r1, #0x3
+ add r2, r1, #0x3 ; ITEM_FASHION_CASE
cmp r5, r2
bne _0206E4C0
add r0, r6, #0x0
@@ -266,7 +266,7 @@ _0206E47E:
bl FUN_0200AD38
b _0206E4FA
_0206E4C0:
- add r1, #0xc
+ add r1, #0xc ; ITEM_COIN_CASE
cmp r5, r1
bne _0206E4EA
add r0, r6, #0x0
diff --git a/arm9/global.inc b/arm9/global.inc
index 6f468e66..771f1c76 100644
--- a/arm9/global.inc
+++ b/arm9/global.inc
@@ -5015,12 +5015,12 @@
.extern Sav2_Bag_new
.extern Sav2_Bag_init
.extern Sav2_Bag_copy
-.extern FUN_0206EBC4
-.extern FUN_0206EBCC
+.extern Bag_GetRegisteredItem
+.extern Bag_SetRegisteredItem
.extern BagHasSpaceForItem
.extern BagAddItem
.extern BagTakeItem
-.extern BagTakeItem2
+.extern PocketTakeItem
.extern BagHasItem
.extern BagPocketNotEmpty
.extern BagGetQuantity
diff --git a/arm9/lib/include/MI_memory.h b/arm9/lib/include/MI_memory.h
index c39c7895..d79e9dcb 100644
--- a/arm9/lib/include/MI_memory.h
+++ b/arm9/lib/include/MI_memory.h
@@ -12,6 +12,13 @@ void MIi_CpuCopy16(const void *src, void *dst, u32 size);
void MIi_CpuClear32(u32 data, void *destp, u32 size);
+void MIi_CpuClear16(u16 data, void *destp, u32 size);
+
+static inline void MI_CpuClear16(void * destp, u32 size)
+{
+ MIi_CpuClear16(0, destp, size);
+}
+
static inline void MI_CpuFill32(void *dest, u32 data, u32 size)
{
MIi_CpuClear32(data, dest, size);
diff --git a/arm9/modules/75/asm/module_75.s b/arm9/modules/75/asm/module_75.s
index 22f2d1a4..7cd217ef 100644
--- a/arm9/modules/75/asm/module_75.s
+++ b/arm9/modules/75/asm/module_75.s
@@ -1795,7 +1795,7 @@ _021E79C6:
add r0, r4, #0
add r0, #0xc8
ldr r0, [r0]
- bl FUN_0206EBC4
+ bl Bag_GetRegisteredItem
ldr r2, [r6]
lsl r1, r5, #2
ldrh r1, [r2, r1]
@@ -4209,7 +4209,7 @@ _021E8C84:
add r0, r5, #0
add r0, #0xc8
ldr r0, [r0]
- bl FUN_0206EBC4
+ bl Bag_GetRegisteredItem
add r1, r5, #0
add r1, #0xc4
ldr r1, [r1]
@@ -5004,7 +5004,7 @@ MOD75_021E92BC: ; 0x021E92BC
ldrh r2, [r2]
ldrh r3, [r4, r3]
sub r1, r1, #3
- bl BagTakeItem2
+ bl PocketTakeItem
add r0, r4, #0
add r0, #0xc4
ldr r3, [r0]
@@ -5604,7 +5604,7 @@ MOD75_021E97A8: ; 0x021E97A8
add r1, #0x66
ldrh r1, [r1]
ldr r0, [r0]
- bl FUN_0206EBCC
+ bl Bag_SetRegisteredItem
mov r0, #0x57
lsl r0, r0, #2
ldr r0, [r4, r0]
@@ -5629,7 +5629,7 @@ MOD75_021E97E4: ; 0x021E97E4
add r0, #0xc8
ldr r0, [r0]
mov r1, #0
- bl FUN_0206EBCC
+ bl Bag_SetRegisteredItem
mov r0, #0x57
lsl r0, r0, #2
ldr r0, [r4, r0]
diff --git a/arm9/src/bag.c b/arm9/src/bag.c
new file mode 100644
index 00000000..819c7739
--- /dev/null
+++ b/arm9/src/bag.c
@@ -0,0 +1,463 @@
+#include "global.h"
+#include "MI_memory.h"
+#include "bag.h"
+#include "itemtool.h"
+#include "heap.h"
+
+#pragma thumb on
+
+u32 Sav2_Bag_sizeof(void)
+{
+ return sizeof(struct Bag);
+}
+
+struct Bag * Sav2_Bag_new(u32 heap_id)
+{
+ struct Bag * ret = (struct Bag *)AllocFromHeap(heap_id, sizeof(struct Bag));
+ Sav2_Bag_init(ret);
+ return ret;
+}
+
+void Sav2_Bag_init(struct Bag * bag)
+{
+ MI_CpuClear16(bag, sizeof(struct Bag));
+}
+
+void Sav2_Bag_copy(const struct Bag * src, struct Bag * dest)
+{
+ MI_CpuCopy8(src, dest, sizeof(struct Bag));
+}
+
+u32 Bag_GetRegisteredItem(struct Bag * bag)
+{
+ return bag->registeredItem;
+}
+
+void Bag_SetRegisteredItem(struct Bag * bag, u32 item)
+{
+ bag->registeredItem = item;
+}
+
+u32 GetItemPocket(struct Bag * bag, u16 item_id, struct ItemSlot ** slot_p, u32 * count_p, u32 heap_id)
+{
+ u32 pocket = GetItemAttr(item_id, 5, heap_id);
+ switch (pocket)
+ {
+ case POCKET_KEY_ITEMS:
+ *slot_p = bag->keyItems;
+ *count_p = NUM_BAG_KEY_ITEMS;
+ break;
+ case POCKET_ITEMS:
+ *slot_p = bag->items;
+ *count_p = NUM_BAG_ITEMS;
+ break;
+ case POCKET_BERRIES:
+ *slot_p = bag->berries;
+ *count_p = NUM_BAG_BERRIES;
+ break;
+ case POCKET_MEDICINE:
+ *slot_p = bag->medicine;
+ *count_p = NUM_BAG_MEDICINE;
+ break;
+ case POCKET_BALLS:
+ *slot_p = bag->balls;
+ *count_p = NUM_BAG_BALLS;
+ break;
+ case POCKET_BATTLE_ITEMS:
+ *slot_p = bag->battleItems;
+ *count_p = NUM_BAG_BATTLE_ITEMS;
+ break;
+ case POCKET_MAIL:
+ *slot_p = bag->mail;
+ *count_p = NUM_BAG_MAIL;
+ break;
+ case POCKET_TMHMS:
+ *slot_p = bag->TMsHMs;
+ *count_p = NUM_BAG_TMS_HMS;
+ break;
+ }
+ return pocket;
+}
+
+struct ItemSlot * BagGetItemSlotForAddInternal(struct ItemSlot * slots, u32 count, u16 item_id, u16 quantity, u16 maxquantity)
+{
+ int i;
+ int found = -1;
+ for (i = 0; i < count; i++)
+ {
+ if (slots[i].id == item_id)
+ {
+ if (quantity + slots[i].quantity > maxquantity)
+ return NULL;
+ return &slots[i];
+ }
+ if (found == -1 && slots[i].id == ITEM_NONE && slots[i].quantity == 0)
+ {
+ found = i;
+ }
+ }
+ if (found == -1)
+ return NULL;
+ return &slots[found];
+}
+
+struct ItemSlot * PocketGetItemSlotForAdd(struct Bag * bag, u16 item_id, u16 quantity, u32 heap_id)
+{
+ struct ItemSlot * slots;
+ u32 count;
+ u32 pocket = GetItemPocket(bag, item_id, &slots, &count, heap_id);
+ if (pocket == POCKET_TMHMS)
+ {
+ return BagGetItemSlotForAddInternal(slots, count, item_id, quantity, 99);
+ }
+ else
+ {
+ return BagGetItemSlotForAddInternal(slots, count, item_id, quantity, 999);
+ }
+}
+
+BOOL BagHasSpaceForItem(struct Bag * bag, u16 item_id, u16 quantity, u32 heap_id)
+{
+ return PocketGetItemSlotForAdd(bag, item_id, quantity, heap_id) != NULL;
+}
+
+BOOL BagAddItem(struct Bag * bag, u16 item_id, u16 quantity, u32 heap_id)
+{
+ struct ItemSlot * slots = PocketGetItemSlotForAdd(bag, item_id, quantity, heap_id);
+ if (slots == NULL)
+ return FALSE;
+ slots->id = item_id;
+ slots->quantity += quantity;
+ u32 count;
+ u32 pocket = GetItemPocket(bag, item_id, &slots, &count, heap_id);
+ if (pocket == POCKET_TMHMS || pocket == POCKET_BERRIES)
+ {
+ SortPocket(slots, count);
+ }
+ return TRUE;
+}
+
+struct ItemSlot * PocketGetItemSlotForRemove(struct ItemSlot * slots, u32 count, u16 item_id, u16 quantity)
+{
+ int i;
+ for (i = 0; i < count; i++)
+ {
+ if (slots[i].id == item_id)
+ {
+ if (slots[i].quantity >= quantity)
+ return &slots[i];
+ return NULL;
+ }
+ }
+ return NULL;
+}
+
+struct ItemSlot * BagGetItemSlotForRemove(struct Bag * bag, u16 item_id, u16 quantity, u32 heap_id)
+{
+ struct ItemSlot * slots;
+ u32 count;
+ (void)GetItemPocket(bag, item_id, &slots, &count, heap_id);
+ return PocketGetItemSlotForRemove(slots, count, item_id, quantity);
+}
+
+BOOL BagTakeItem(struct Bag * bag, u16 item_id, u16 quantity, u32 heap_id)
+{
+ struct ItemSlot * slots = BagGetItemSlotForRemove(bag, item_id, quantity, heap_id);
+ if (slots == NULL)
+ return FALSE;
+ slots->quantity -= quantity;
+ if (slots->quantity == 0)
+ slots->id = ITEM_NONE;
+ u32 count;
+ (void)GetItemPocket(bag, item_id, &slots, &count, heap_id);
+ PocketCompaction(slots, count);
+ return TRUE;
+}
+
+BOOL PocketTakeItem(struct ItemSlot * slots, u32 count, u16 item_id, u16 quantity)
+{
+ struct ItemSlot * slot = PocketGetItemSlotForRemove(slots, count, item_id, quantity);
+ if (slot == NULL)
+ return FALSE;
+ slot->quantity -= quantity;
+ if (slot->quantity == 0)
+ slot->id = ITEM_NONE;
+ PocketCompaction(slots, count);
+ return TRUE;
+}
+
+BOOL BagHasItem(struct Bag * bag, u16 item_id, u16 quantity, u32 heap_id)
+{
+ return BagGetItemSlotForRemove(bag, item_id, quantity, heap_id) != NULL;
+}
+
+BOOL BagPocketNotEmpty(struct Bag * bag, u32 pocket)
+{
+ struct ItemSlot * slots;
+ u32 count;
+ switch (pocket)
+ {
+ case POCKET_KEY_ITEMS:
+ slots = bag->keyItems;
+ count = NUM_BAG_KEY_ITEMS;
+ break;
+ case POCKET_ITEMS:
+ slots = bag->items;
+ count = NUM_BAG_ITEMS;
+ break;
+ case POCKET_BERRIES:
+ slots = bag->berries;
+ count = NUM_BAG_BERRIES;
+ break;
+ case POCKET_MEDICINE:
+ slots = bag->medicine;
+ count = NUM_BAG_MEDICINE;
+ break;
+ case POCKET_BALLS:
+ slots = bag->balls;
+ count = NUM_BAG_BALLS;
+ break;
+ case POCKET_BATTLE_ITEMS:
+ slots = bag->battleItems;
+ count = NUM_BAG_BATTLE_ITEMS;
+ break;
+ case POCKET_MAIL:
+ slots = bag->mail;
+ count = NUM_BAG_MAIL;
+ break;
+ case POCKET_TMHMS:
+ slots = bag->TMsHMs;
+ count = NUM_BAG_TMS_HMS;
+ break;
+ default:
+ return FALSE;
+ }
+ int i;
+ for (i = 0; i < count; i++)
+ {
+ if (slots[i].id != ITEM_NONE)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+u16 BagGetQuantity(struct Bag * bag, u16 item_id, u32 heap_id)
+{
+ struct ItemSlot * slot = BagGetItemSlotForRemove(bag, item_id, 1, heap_id);
+ if (slot == NULL)
+ return 0;
+ return slot->quantity;
+}
+
+u16 PocketGetQuantity(struct ItemSlot * slots, u32 count, u16 item_id)
+{
+ struct ItemSlot * slot = PocketGetItemSlotForRemove(slots, count, item_id, 1);
+ if (slot == NULL)
+ return 0;
+ return slot->quantity;
+}
+
+void SwapItemSlots(struct ItemSlot * a, struct ItemSlot * b)
+{
+ struct ItemSlot tmp;
+
+ tmp = *a;
+ *a = *b;
+ *b = tmp;
+}
+
+void PocketCompaction(struct ItemSlot * slots, u32 count)
+{
+ int i, j;
+ for (i = 0; i < count - 1; i++)
+ {
+ for (j = i + 1; j < count; j++)
+ {
+ if (slots[i].quantity == 0)
+ {
+ SwapItemSlots(&slots[i], &slots[j]);
+ }
+ }
+ }
+}
+
+void SortPocket(struct ItemSlot * slots, u32 count)
+{
+ int i, j;
+ for (i = 0; i < count - 1; i++)
+ {
+ for (j = i + 1; j < count; j++)
+ {
+ if (slots[i].quantity == 0 || (slots[j].quantity != 0 && slots[i].id > slots[j].id))
+ {
+ SwapItemSlots(&slots[i], &slots[j]);
+ }
+ }
+ }
+}
+
+extern struct BagView * BagView_new(u8 heap_id);
+extern void BagView_setitem(struct BagView * view, struct ItemSlot * slot, u8 pocket, u8 idx);
+
+struct BagView * CreateBagView(struct Bag * bag, const u8 * pockets, u32 heap_id)
+{
+ struct BagView * view = BagView_new((u8)heap_id);
+ int i;
+ for (i = 0; pockets[i] != 0xFF; i++)
+ {
+ switch (pockets[i])
+ {
+ case POCKET_KEY_ITEMS:
+ BagView_setitem(view, bag->keyItems, POCKET_KEY_ITEMS, (u8)i);
+ break;
+ case POCKET_ITEMS:
+ BagView_setitem(view, bag->items, POCKET_ITEMS, (u8)i);
+ break;
+ case POCKET_BERRIES:
+ BagView_setitem(view, bag->berries, POCKET_BERRIES, (u8)i);
+ break;
+ case POCKET_MEDICINE:
+ BagView_setitem(view, bag->medicine, POCKET_MEDICINE, (u8)i);
+ break;
+ case POCKET_BALLS:
+ BagView_setitem(view, bag->balls, POCKET_BALLS, (u8)i);
+ break;
+ case POCKET_BATTLE_ITEMS:
+ BagView_setitem(view, bag->battleItems, POCKET_BATTLE_ITEMS, (u8)i);
+ break;
+ case POCKET_MAIL:
+ BagView_setitem(view, bag->mail, POCKET_MAIL, (u8)i);
+ break;
+ case POCKET_TMHMS:
+ BagView_setitem(view, bag->TMsHMs, POCKET_TMHMS, (u8)i);
+ break;
+ }
+ }
+ return view;
+}
+
+struct ItemSlot * BagGetPocketSlotN(struct Bag * bag, u32 pocket, u32 slot)
+{
+ struct ItemSlot * slots;
+ u32 count;
+ switch (pocket)
+ {
+ case POCKET_KEY_ITEMS:
+ slots = bag->keyItems;
+ count = NUM_BAG_KEY_ITEMS;
+ break;
+ case POCKET_ITEMS:
+ slots = bag->items;
+ count = NUM_BAG_ITEMS;
+ break;
+ case POCKET_BERRIES:
+ slots = bag->berries;
+ count = NUM_BAG_BERRIES;
+ break;
+ case POCKET_MEDICINE:
+ slots = bag->medicine;
+ count = NUM_BAG_MEDICINE;
+ break;
+ case POCKET_BALLS:
+ slots = bag->balls;
+ count = NUM_BAG_BALLS;
+ break;
+ case POCKET_BATTLE_ITEMS:
+ slots = bag->battleItems;
+ count = NUM_BAG_BATTLE_ITEMS;
+ break;
+ case POCKET_MAIL:
+ slots = bag->mail;
+ count = NUM_BAG_MAIL;
+ break;
+ case POCKET_TMHMS:
+ slots = bag->TMsHMs;
+ count = NUM_BAG_TMS_HMS;
+ break;
+ }
+ if (slot >= count)
+ return NULL;
+ return &slots[slot];
+}
+
+struct Bag * Sav2_Bag_get(struct SaveBlock2 * sav2)
+{
+ return (struct Bag *)SavArray_get(sav2, 3);
+}
+
+struct UnkStruct_0206F164 * FUN_0206F164(u32 heap_id)
+{
+ struct UnkStruct_0206F164 * ret = (struct UnkStruct_0206F164 *)AllocFromHeap(heap_id, sizeof(struct UnkStruct_0206F164));
+ MI_CpuClear16(ret, sizeof(struct UnkStruct_0206F164));
+ return ret;
+}
+
+void FUN_0206F17C(struct UnkStruct_0206F164 * a0, u32 a1, u8 * a2, u8 * a3)
+{
+ *a2 = a0->unk_08[a1];
+ *a3 = a0->unk_00[a1];
+}
+
+u16 FUN_0206F18C(struct UnkStruct_0206F164 * a0)
+{
+ return a0->unk_10;
+}
+
+void FUN_0206F190(struct UnkStruct_0206F164 * a0, u32 a1, u8 a2, u8 a3)
+{
+ a0->unk_08[a1] = a2;
+ a0->unk_00[a1] = a3;
+}
+
+void FUN_0206F19C(struct UnkStruct_0206F164 * a0, u16 a1)
+{
+ a0->unk_10 = a1;
+}
+
+void FUN_0206F1A0(struct UnkStruct_0206F164 * a0, u32 a1, u8 * a2, u8 * a3)
+{
+ *a2 = a0->unk_19[a1];
+ *a3 = a0->unk_14[a1];
+}
+
+u16 FUN_0206F1AC(struct UnkStruct_0206F164 * a0)
+{
+ return a0->unk_1e;
+}
+
+u16 FUN_0206F1B0(struct UnkStruct_0206F164 * a0)
+{
+ return a0->unk_20;
+}
+
+u16 FUN_0206F1B4(struct UnkStruct_0206F164 * a0)
+{
+ return a0->unk_22;
+}
+
+void FUN_0206F1B8(struct UnkStruct_0206F164 * a0, u32 a1, u8 a2, u8 a3)
+{
+ a0->unk_19[a1] = a2;
+ a0->unk_14[a1] = a3;
+}
+
+void FUN_0206F1C0(struct UnkStruct_0206F164 * a0)
+{
+ u32 i;
+ for (i = 0; i < 5; i++)
+ {
+ FUN_0206F1B8(a0, i, 0, 0);
+ }
+ FUN_0206F1EC(a0, 0);
+}
+
+void FUN_0206F1E4(struct UnkStruct_0206F164 * a0, u16 a1, u16 a2)
+{
+ a0->unk_1e = a1;
+ a0->unk_20 = a2;
+}
+
+void FUN_0206F1EC(struct UnkStruct_0206F164 * a0, u16 a1)
+{
+ a0->unk_22 = a1;
+}
diff --git a/include/bag.h b/include/bag.h
index d4b4ff3c..00adbe58 100644
--- a/include/bag.h
+++ b/include/bag.h
@@ -2,6 +2,7 @@
#define POKEDIAMOND_BAG_H
#include "itemtool.h"
+#include "save_block_2.h"
struct Bag
{
@@ -16,4 +17,63 @@ struct Bag
u32 registeredItem;
};
+struct BagView
+{
+ struct ItemSlot * slots;
+ u32 count;
+ u8 pocket;
+};
+
+struct UnkStruct_0206F164
+{
+ u8 unk_00[8];
+ u8 unk_08[8];
+ u16 unk_10;
+ u8 filler_12[2];
+ u8 unk_14[5];
+ u8 unk_19[5];
+ u16 unk_1e;
+ u16 unk_20;
+ u16 unk_22;
+};
+
+u32 Sav2_Bag_sizeof(void);
+struct Bag * Sav2_Bag_new(u32 heap_id);
+void Sav2_Bag_init(struct Bag * bag);
+void Sav2_Bag_copy(const struct Bag * src, struct Bag * dest);
+u32 Bag_GetRegisteredItem(struct Bag * bag);
+void Bag_SetRegisteredItem(struct Bag * bag, u32 item);
+u32 GetItemPocket(struct Bag * bag, u16 item_id, struct ItemSlot ** slot_p, u32 * count_p, u32 heap_id);
+struct ItemSlot * BagGetItemSlotForAddInternal(struct ItemSlot * slots, u32 count, u16 item_id, u16 quantity, u16 maxquantity);
+struct ItemSlot * PocketGetItemSlotForAdd(struct Bag * bag, u16 item_id, u16 quantity, u32 heap_id);
+BOOL BagHasSpaceForItem(struct Bag * bag, u16 item_id, u16 quantity, u32 heap_id);
+BOOL BagAddItem(struct Bag * bag, u16 item_id, u16 quantity, u32 heap_id);
+struct ItemSlot * PocketGetItemSlotForRemove(struct ItemSlot * slots, u32 count, u16 item_id, u16 quantity);
+struct ItemSlot * BagGetItemSlotForRemove(struct Bag * bag, u16 item_id, u16 quantity, u32 heap_id);
+BOOL BagTakeItem(struct Bag * bag, u16 item_id, u16 quantity, u32 heap_id);
+BOOL PocketTakeItem(struct ItemSlot * slots, u32 count, u16 item_id, u16 quantity);
+BOOL BagHasItem(struct Bag * bag, u16 item_id, u16 quantity, u32 heap_id);
+BOOL BagPocketNotEmpty(struct Bag * bag, u32 pocket);
+u16 BagGetQuantity(struct Bag * bag, u16 item_id, u32 heap_id);
+u16 PocketGetQuantity(struct ItemSlot * slots, u32 count, u16 item_id);
+void SwapItemSlots(struct ItemSlot * a, struct ItemSlot * b);
+void PocketCompaction(struct ItemSlot * slots, u32 count);
+void SortPocket(struct ItemSlot * slots, u32 count);
+struct BagView * CreateBagView(struct Bag * bag, const u8 * pockets, u32 heap_id);
+struct ItemSlot * BagGetPocketSlotN(struct Bag * bag, u32 pocket, u32 slot);
+struct Bag * Sav2_Bag_get(struct SaveBlock2 * sav2);
+struct UnkStruct_0206F164 * FUN_0206F164(u32 heap_id);
+void FUN_0206F17C(struct UnkStruct_0206F164 * a0, u32 a1, u8 * a2, u8 * a3);
+u16 FUN_0206F18C(struct UnkStruct_0206F164 * a0);
+void FUN_0206F190(struct UnkStruct_0206F164 * a0, u32 a1, u8 a2, u8 a3);
+void FUN_0206F19C(struct UnkStruct_0206F164 * a0, u16 a1);
+void FUN_0206F1A0(struct UnkStruct_0206F164 * a0, u32 a1, u8 * a2, u8 * a3);
+u16 FUN_0206F1AC(struct UnkStruct_0206F164 * a0);
+u16 FUN_0206F1B0(struct UnkStruct_0206F164 * a0);
+u16 FUN_0206F1B4(struct UnkStruct_0206F164 * a0);
+void FUN_0206F1B8(struct UnkStruct_0206F164 * a0, u32 a1, u8 a2, u8 a3);
+void FUN_0206F1C0(struct UnkStruct_0206F164 * a0);
+void FUN_0206F1E4(struct UnkStruct_0206F164 * a0, u16 a1, u16 a2);
+void FUN_0206F1EC(struct UnkStruct_0206F164 * a0, u16 a1);
+
#endif //POKEDIAMOND_BAG_H