diff options
-rw-r--r-- | arm9/asm/bag.s | 973 | ||||
-rw-r--r-- | arm9/asm/unk_0205CE48.s | 4 | ||||
-rw-r--r-- | arm9/asm/unk_0206E2F0.s | 8 | ||||
-rw-r--r-- | arm9/global.inc | 6 | ||||
-rw-r--r-- | arm9/lib/include/MI_memory.h | 7 | ||||
-rw-r--r-- | arm9/modules/75/asm/module_75.s | 10 | ||||
-rw-r--r-- | arm9/src/bag.c | 463 | ||||
-rw-r--r-- | include/bag.h | 60 |
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 |