From fd2a10df148e74793e490633f32d60a336444a63 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 22 Aug 2025 16:13:50 -0700 Subject: [PATCH 1/4] initial decomp work decomp more item funcs new file boundary and more decomp address review comments Match IsValidTargetItem thanks to @taxicat1 --- asm/include/main_0200CAFC.inc | 3 + asm/main_0200CAFC.s | 247 ---------------------------------- asm/main_02054E4C.s | 80 ----------- include/item_util.h | 8 ++ include/item_util_4.h | 13 ++ include/main_02054DC4.h | 4 + main.lsf | 1 + src/item_util.c | 47 +++++++ src/item_util_4.c | 66 +++++++++ src/main_02054DC4.c | 35 +++++ 10 files changed, 177 insertions(+), 327 deletions(-) create mode 100644 include/item_util_4.h create mode 100644 src/item_util_4.c diff --git a/asm/include/main_0200CAFC.inc b/asm/include/main_0200CAFC.inc index 36ccae11..acd63585 100644 --- a/asm/include/main_0200CAFC.inc +++ b/asm/include/main_0200CAFC.inc @@ -35,7 +35,10 @@ .public GetLanguage .public GetThrownItemQuantityLimit .public HandleSir0Translation +.public IsAuraBow .public IsItemValid +.public IsShoppableItem +.public IsThrownItem .public ITEM_DATA_TABLE_PTRS .public ITEM_TABLES_PTRS_1 .public LoadFileFromRom diff --git a/asm/main_0200CAFC.s b/asm/main_0200CAFC.s index 5631d9b7..20de9658 100644 --- a/asm/main_0200CAFC.s +++ b/asm/main_0200CAFC.s @@ -3,253 +3,6 @@ .text - arm_func_start GetItemMoveId16 -GetItemMoveId16: ; 0x0200CAFC - stmdb sp!, {r3, lr} - bl GetItemMoveId - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - ldmia sp!, {r3, pc} - arm_func_end GetItemMoveId16 - - arm_func_start IsThrownItem -IsThrownItem: ; 0x0200CB10 - stmdb sp!, {r3, lr} - bl GetItemCategory - cmp r0, #1 - movls r0, #1 - movhi r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, pc} - arm_func_end IsThrownItem - - arm_func_start IsNotMoney -IsNotMoney: ; 0x0200CB2C - cmp r0, #0 - moveq r0, #0 - bxeq lr - cmp r0, #0xb7 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - bx lr - arm_func_end IsNotMoney - - arm_func_start IsEdible -IsEdible: ; 0x0200CB4C - stmdb sp!, {r3, lr} - bl GetItemCategory - add r0, r0, #0xfe - and r0, r0, #0xff - cmp r0, #1 - movls r0, #1 - movhi r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, pc} - arm_func_end IsEdible - - arm_func_start IsHM -IsHM: ; 0x0200CB70 - ldr r2, _0200CBF0 ; =0x0000011D - cmp r0, r2 - moveq r0, #1 - bxeq lr - add r1, r2, #1 - cmp r0, r1 - moveq r0, #1 - bxeq lr - add r1, r2, #2 - cmp r0, r1 - moveq r0, #1 - bxeq lr - cmp r0, #0x120 - moveq r0, #1 - bxeq lr - add r1, r2, #5 - cmp r0, r1 - moveq r0, #1 - bxeq lr - add r1, r2, #6 - cmp r0, r1 - moveq r0, #1 - bxeq lr - cmp r0, #0x124 - moveq r0, #1 - bxeq lr - add r1, r2, #4 - cmp r0, r1 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - bx lr - .align 2, 0 -_0200CBF0: .word 0x0000011D - arm_func_end IsHM - - arm_func_start IsGummi -IsGummi: ; 0x0200CBF4 - cmp r0, #0x77 - movlt r0, #0 - bxlt lr - cmp r0, #0x88 - movle r0, #1 - movgt r0, #0 - and r0, r0, #0xff - bx lr - arm_func_end IsGummi - - arm_func_start IsAuraBow -IsAuraBow: ; 0x0200CC14 - cmp r0, #0x1ac - blt _0200CC2C - ldr r1, _0200CC34 ; =0x000001BB - cmp r0, r1 - movle r0, #1 - bxle lr -_0200CC2C: - mov r0, #0 - bx lr - .align 2, 0 -_0200CC34: .word 0x000001BB - arm_func_end IsAuraBow - - arm_func_start IsLosableItem -IsLosableItem: ; 0x0200CC38 - stmdb sp!, {r4, lr} - mov r4, r0 - ldrb r0, [r4] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _0200CC7C - ldrsh r0, [r4, #4] - bl IsAuraBow - cmp r0, #0 - beq _0200CC74 - ldrb r0, [r4] - tst r0, #2 - beq _0200CC7C -_0200CC74: - mov r0, #1 - ldmia sp!, {r4, pc} -_0200CC7C: - mov r0, #0 - ldmia sp!, {r4, pc} - arm_func_end IsLosableItem - - arm_func_start IsTreasureBox -IsTreasureBox: ; 0x0200CC84 - stmdb sp!, {r3, lr} - bl GetItemCategory - add r0, r0, #0xf4 - and r0, r0, #0xff - cmp r0, #2 - movls r0, #1 - movhi r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, pc} - arm_func_end IsTreasureBox - - arm_func_start IsStorableItem -IsStorableItem: ; 0x0200CCA8 - cmp r0, #0 - moveq r0, #0 - bxeq lr - cmp r0, #0xb7 - moveq r0, #0 - bxeq lr - cmp r0, #0xbb - moveq r0, #0 - bxeq lr - cmp r0, #0xb2 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - bx lr - arm_func_end IsStorableItem - - arm_func_start IsShoppableItem -IsShoppableItem: ; 0x0200CCE0 - stmdb sp!, {r4, lr} - movs r4, r0 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r4, #0xb7 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r4, #9 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r4, #0x39 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r4, #0x3a - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r4, #0x73 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r4, #0x88 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r4, #0xb9 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r4, #0xad - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r4, #0xae - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r4, #0xa - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r4, #0xb0 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r4, #0x5d - moveq r0, #0 - ldmeqia sp!, {r4, pc} - bl GetItemSellPrice - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - mov r0, r4 - bl GetItemBuyPrice - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - ldmia sp!, {r4, pc} - arm_func_end IsShoppableItem - - arm_func_start IsValidTargetItem -IsValidTargetItem: ; 0x0200CDAC - cmp r0, #0x16c - movge r0, #1 - bxge lr - mov ip, #0 - ldr r2, _0200CDF0 ; =_020A18BC - ldr r1, _0200CDF4 ; =0x00000578 - b _0200CDD8 -_0200CDC8: - cmp r0, r3 - moveq r0, #1 - bxeq lr - add ip, ip, #1 -_0200CDD8: - mov r3, ip, lsl #1 - ldrsh r3, [r2, r3] - cmp r3, r1 - bne _0200CDC8 - mov r0, #0 - bx lr - .align 2, 0 -_0200CDF0: .word _020A18BC -_0200CDF4: .word 0x00000578 - arm_func_end IsValidTargetItem - arm_func_start IsItemUsableNow IsItemUsableNow: ; 0x0200CDF8 stmdb sp!, {r4, lr} diff --git a/asm/main_02054E4C.s b/asm/main_02054E4C.s index fbe56c19..dcd2bb16 100644 --- a/asm/main_02054E4C.s +++ b/asm/main_02054E4C.s @@ -3,86 +3,6 @@ .text - arm_func_start GendersEqual -GendersEqual: ; 0x02054E4C - stmdb sp!, {r3, r4, r5, lr} - mov r5, r1 - bl GetMonsterGender - mov r4, r0 - mov r0, r5 - bl GetMonsterGender - cmp r4, r0 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, r4, r5, pc} - arm_func_end GendersEqual - - arm_func_start GendersEqualNotGenderless -GendersEqualNotGenderless: ; 0x02054E78 - stmdb sp!, {r3, r4, r5, lr} - mov r4, r0 - mov r5, r1 - bl GetMonsterGender - cmp r0, #3 - beq _02054EC0 - mov r0, r5 - bl GetMonsterGender - cmp r0, #3 - beq _02054EC0 - mov r0, r4 - bl GetMonsterGender - mov r4, r0 - mov r0, r5 - bl GetMonsterGender - cmp r4, r0 - moveq r0, #1 - ldmeqia sp!, {r3, r4, r5, pc} -_02054EC0: - mov r0, #0 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end GendersEqualNotGenderless - - arm_func_start GendersNotEqualNotGenderless -GendersNotEqualNotGenderless: ; 0x02054EC8 - stmdb sp!, {r3, r4, r5, lr} - mov r4, r0 - mov r5, r1 - bl GetMonsterGender - cmp r0, #3 - beq _02054F10 - mov r0, r5 - bl GetMonsterGender - cmp r0, #3 - beq _02054F10 - mov r0, r4 - bl GetMonsterGender - mov r4, r0 - mov r0, r5 - bl GetMonsterGender - cmp r4, r0 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, pc} -_02054F10: - mov r0, #0 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end GendersNotEqualNotGenderless - - arm_func_start sub_02054F18 -sub_02054F18: ; 0x02054F18 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - add r0, r0, #0xea - add r0, r0, #0xfd00 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - cmp r0, #2 - movls r0, #1 - movhi r0, #0 - and r0, r0, #0xff - bx lr - arm_func_end sub_02054F18 - arm_func_start sub_02054F44 sub_02054F44: ; 0x02054F44 stmdb sp!, {r4, r5, lr} diff --git a/include/item_util.h b/include/item_util.h index d0f18903..906b501b 100644 --- a/include/item_util.h +++ b/include/item_util.h @@ -6,5 +6,13 @@ // Likely a linker-generated veneer for GetItemCategory. // See https://developer.arm.com/documentation/dui0474/k/image-structure-and-generation/linker-generated-veneers/what-is-a-veneer- enum item_category GetItemCategoryVeneer(s16 item_id); +u16 GetItemMoveId16(s16 item_id); +bool8 IsThrownItem(s16 item_id); +bool8 IsNotMoney(s16 item_id); +bool8 IsEdible(s16 item_id); +bool8 IsHM(s16 item_id); +bool8 IsGummi(s16 item_id); +bool8 IsGummi(s16 item_id); +BOOL IsAuraBow(s32 item_id); #endif //PMDSKY_ITEM_UTIL_H diff --git a/include/item_util_4.h b/include/item_util_4.h new file mode 100644 index 00000000..555df2ee --- /dev/null +++ b/include/item_util_4.h @@ -0,0 +1,13 @@ +#ifndef PMDSKY_ITEM_UTIL_4_H +#define PMDSKY_ITEM_UTIL_4_H + +#include "item.h" + +BOOL IsLosableItem(struct item* item); +bool8 IsTreasureBox(s16 item_id); +bool8 IsStorableItem(s16 item_id); +bool8 IsShoppableItem(s16 item_id); +bool8 IsValidTargetItem(s16 item_id); + +#endif //PMDSKY_ITEM_UTIL_4_H + diff --git a/include/main_02054DC4.h b/include/main_02054DC4.h index ff8a7ea4..a649f45b 100644 --- a/include/main_02054DC4.h +++ b/include/main_02054DC4.h @@ -4,5 +4,9 @@ #include "util.h" bool32 DexNumbersEqual(s16 monster1, s16 monster2); +u8 GendersEqual(s16 monster1, s16 monster2); +u8 GendersEqualNotGenderless(s16 monster1, s16 monster2); +u8 GendersNotEqualNotGenderless(s16 monster1, s16 monster2); +u8 sub_02054F18(s32 _arg0); #endif //PMDSKY_MAIN_02054DC4_H diff --git a/main.lsf b/main.lsf index dadaed83..dfcdfb2d 100644 --- a/main.lsf +++ b/main.lsf @@ -37,6 +37,7 @@ Static main Object src/directory_file.o Object asm/main_0200C4CC.o Object src/item_util.o + Object src/item_util_4.o Object asm/main_0200CAFC.o Object src/item_util_1.o Object asm/main_0200E7E8.o diff --git a/src/item_util.c b/src/item_util.c index aa078583..f3c34306 100644 --- a/src/item_util.c +++ b/src/item_util.c @@ -1,7 +1,54 @@ #include "item_util.h" #include "item_util_2.h" +extern s32 GetItemMoveId(s32 item_id); + enum item_category GetItemCategoryVeneer(s16 item_id) { return GetItemCategory(item_id); } + +u16 GetItemMoveId16(s16 item_id) +{ + return GetItemMoveId(item_id); +} + +bool8 IsThrownItem(s16 item_id) +{ + return (GetItemCategory(item_id) <= CATEGORY_THROWN_ARC); +} + +bool8 IsNotMoney(s16 item_id) +{ + if (item_id == ITEM_NOTHING) return FALSE; + return (item_id != ITEM_POKE); +} + +bool8 IsEdible(s16 item_id) +{ + return ((bool8) (GetItemCategory(item_id) + 0xFE) <= 1); +} + +bool8 IsHM(s16 item_id) +{ + if(item_id == ITEM_TM_CUT) return TRUE; + else if(item_id == ITEM_TM_FLY) return TRUE; + else if(item_id == ITEM_TM_SURF) return TRUE; + else if(item_id == ITEM_TM_STRENGTH) return TRUE; + else if(item_id == ITEM_TM_ROCK_SMASH) return TRUE; + else if(item_id == ITEM_TM_WATERFALL) return TRUE; + else if(item_id == ITEM_TM_ROCK_CLIMB) return TRUE; + else if(item_id == ITEM_TM_DEFOG) return TRUE; + else return FALSE; +} + +bool8 IsGummi(s16 item_id) +{ + if(item_id < ITEM_WHITE_GUMMI) return FALSE; + return (item_id <= ITEM_WONDER_GUMMI); +} + +BOOL IsAuraBow(s32 item_id) +{ + return ((item_id >= ITEM_SILVER_BOW) && (item_id <= ITEM_FUCHSIA_BOW)); +} diff --git a/src/item_util_4.c b/src/item_util_4.c new file mode 100644 index 00000000..ab85a7ad --- /dev/null +++ b/src/item_util_4.c @@ -0,0 +1,66 @@ +#include "item_util_4.h" +#include "dungeon_util_static.h" +#include "item.h" +#include "item_util.h" +#include "item_util_2.h" + +extern s32 GetItemSellPrice(s16); +extern s32 GetItemBuyPrice(s16); + +BOOL IsLosableItem(struct item* item) +{ + return ((ItemExists(item->flags) && ((!IsAuraBow(item->id)) || (item->flags & ITEM_FLAG_IN_SHOP)))); +} + +bool8 IsTreasureBox(s16 item_id) +{ + // NOTE: FAKEMATCH + // TODO: Categories 12 - 14 + return ((u8) (GetItemCategory(item_id) + 0xF4) <= 2); +} + +bool8 IsStorableItem(s16 item_id) +{ + if (item_id == ITEM_NOTHING) return 0; + if (item_id == ITEM_POKE) return 0; + if (item_id == ITEM_TM_USED_TM) return 0; + if (item_id == ITEM_WONDER_EGG) return 0; + return 1; +} + +bool8 IsShoppableItem(s16 item_id) +{ + if (item_id == ITEM_NOTHING) return FALSE; + if (item_id == ITEM_POKE) return FALSE; + if (item_id == ITEM_GOLD_THORN) return FALSE; + if (item_id == ITEM_GOLDEN_MASK) return FALSE; + if (item_id == ITEM_AMBER_TEAR) return FALSE; + if (item_id == ITEM_GOLDEN_APPLE) return FALSE; + if (item_id == ITEM_WONDER_GUMMI) return FALSE; + if (item_id == ITEM_UNNAMED_0xB9) return FALSE; + if (item_id == ITEM_MYSTERY_PART) return FALSE; + if (item_id == ITEM_SECRET_SLAB) return FALSE; + if (item_id == ITEM_RARE_FOSSIL) return FALSE; + if (item_id == ITEM_UNNAMED_0xB0) return FALSE; + if (item_id == ITEM_GOLDEN_SEED) return FALSE; + if (GetItemSellPrice(item_id) == 0) return FALSE; + if (GetItemBuyPrice(item_id) == 0) return FALSE; + return 1; +} + +extern s16 _020A18BC[10]; + +bool8 IsValidTargetItem(s16 item_id) { + s32 var_ip; + + if (item_id >= 0x16C) return TRUE; + + for (var_ip = 0; _020A18BC[var_ip] != 0x578; var_ip++) + { + if (item_id == _020A18BC[var_ip]) { + return TRUE; + } + } + + return FALSE; +} diff --git a/src/main_02054DC4.c b/src/main_02054DC4.c index 6490ac63..f3dc67bc 100644 --- a/src/main_02054DC4.c +++ b/src/main_02054DC4.c @@ -1,4 +1,5 @@ #include "main_02054DC4.h" +#include "main_020527A8.h" #include "util.h" #include "main_020526EC.h" #include "main_02054AA4.h" @@ -15,3 +16,37 @@ bool32 DexNumbersEqual(s16 monster1, s16 monster2) { else if (IsUnown(true_base_1) && IsUnown(true_base_2)) return FALSE; else return GetDexNumber(true_base_1) == GetDexNumber(true_base_2); } + +u8 GendersEqual(s16 monster1, s16 monster2) +{ + return GetMonsterGender(monster1) == GetMonsterGender(monster2); +} + +u8 GendersEqualNotGenderless(s16 monster1, s16 monster2) +{ + + if ((GetMonsterGender(monster1) != 3) && (GetMonsterGender(monster2) != 3)) + if(GetMonsterGender(monster1) == GetMonsterGender(monster2)) + return TRUE; + return FALSE; +} + +u8 GendersNotEqualNotGenderless(s16 monster1, s16 monster2) +{ + + if ((GetMonsterGender(monster1) != 3) && (GetMonsterGender(monster2) != 3)) + if(GetMonsterGender(monster1) != GetMonsterGender(monster2)) + return TRUE; + return FALSE; +} + +u8 sub_02054F18(s32 _arg0) +{ + s32 arg0 = (u16) _arg0; + + if ((u32) (u16) (arg0 + 0xFDEA) <= 2U) { + return TRUE; + } else { + return FALSE; + } +} From 1753dbd90577a171664d804143da37b223a18a26 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 27 Aug 2025 21:25:06 -0700 Subject: [PATCH 2/4] More item decomp --- asm/include/main_0200CAFC.inc | 1 + asm/main_0200CAFC.s | 123 ---------------------------------- include/item_util_4.h | 12 ++++ src/item_util_4.c | 89 ++++++++++++++++++++++-- 4 files changed, 97 insertions(+), 128 deletions(-) diff --git a/asm/include/main_0200CAFC.inc b/asm/include/main_0200CAFC.inc index acd63585..8abb478e 100644 --- a/asm/include/main_0200CAFC.inc +++ b/asm/include/main_0200CAFC.inc @@ -35,6 +35,7 @@ .public GetLanguage .public GetThrownItemQuantityLimit .public HandleSir0Translation +.public InitItem .public IsAuraBow .public IsItemValid .public IsShoppableItem diff --git a/asm/main_0200CAFC.s b/asm/main_0200CAFC.s index 20de9658..37ae83b6 100644 --- a/asm/main_0200CAFC.s +++ b/asm/main_0200CAFC.s @@ -3,129 +3,6 @@ .text - arm_func_start IsItemUsableNow -IsItemUsableNow: ; 0x0200CDF8 - stmdb sp!, {r4, lr} - mov r4, r0 - ldrb r0, [r4] - tst r0, #2 - beq _0200CE6C - ldrsh r0, [r4, #4] - bl GetItemCategory - cmp r0, #5 - ldrnesh r0, [r4, #4] - cmpne r0, #0x47 - cmpne r0, #0x4d - cmpne r0, #0x58 - cmpne r0, #0x59 - cmpne r0, #0x5d - cmpne r0, #0x64 - cmpne r0, #0x65 - cmpne r0, #0x66 - cmpne r0, #0x67 - cmpne r0, #0x6c - beq _0200CE64 - sub r0, r0, #0x77 - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - cmp r0, #0x11 - bhi _0200CE6C -_0200CE64: - mov r0, #0 - ldmia sp!, {r4, pc} -_0200CE6C: - mov r0, #1 - ldmia sp!, {r4, pc} - arm_func_end IsItemUsableNow - - arm_func_start IsTicketItem -IsTicketItem: ; 0x0200CE74 - sub r0, r0, #0xa9 - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - cmp r0, #3 - movls r0, #1 - movhi r0, #0 - and r0, r0, #0xff - bx lr - arm_func_end IsTicketItem - - arm_func_start InitItem -InitItem: ; 0x0200CE9C - stmdb sp!, {r3, r4, r5, r6, r7, lr} - movs r6, r1 - mov r7, r0 - mov r5, r2 - mov r4, r3 - beq _0200CF44 - mov r0, #1 - strb r0, [r7] - mov r0, r6 - strh r6, [r7, #4] - mov r1, #0 - strb r1, [r7, #1] - bl IsThrownItem - cmp r0, #0 - mov r0, r6 - beq _0200CF04 - mov r1, #1 - bl GetThrownItemQuantityLimit - mov r5, r0 - mov r0, r6 - mov r1, #0 - bl GetThrownItemQuantityLimit - mov r1, r5 - bl RandRangeSafe - strh r0, [r7, #2] - b _0200CF30 -_0200CF04: - bl GetItemCategory - cmp r0, #6 - moveq r0, #1 - streqh r0, [r7, #2] - beq _0200CF30 - add r0, r0, #0xf4 - and r0, r0, #0xff - cmp r0, #2 - strlsh r5, [r7, #2] - movhi r0, #0 - strhih r0, [r7, #2] -_0200CF30: - cmp r4, #0 - ldrneb r0, [r7] - orrne r0, r0, #8 - strneb r0, [r7] - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_0200CF44: - mov r0, #0 - strb r0, [r7] - strh r6, [r7, #4] - strh r0, [r7, #2] - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end InitItem - - arm_func_start InitStandardItem -InitStandardItem: ; 0x0200CF58 - ldr ip, _0200CF68 ; =InitItem - mov r3, r2 - mov r2, #0 - bx ip - .align 2, 0 -_0200CF68: .word InitItem - arm_func_end InitStandardItem - - arm_func_start sub_0200CF6C -sub_0200CF6C: ; 0x0200CF6C - ldr ip, _0200CF74 ; =InitItem - bx ip - .align 2, 0 -_0200CF74: .word InitItem - arm_func_end sub_0200CF6C - arm_func_start InitBulkItem InitBulkItem: ; 0x0200CF78 stmdb sp!, {r4, r5, r6, lr} diff --git a/include/item_util_4.h b/include/item_util_4.h index 555df2ee..552e6388 100644 --- a/include/item_util_4.h +++ b/include/item_util_4.h @@ -3,11 +3,23 @@ #include "item.h" +struct bulk_item +{ + /* 0x0 */ s16 id; + /* 0x2 */ u16 quantity; +} BulkItem; + BOOL IsLosableItem(struct item* item); bool8 IsTreasureBox(s16 item_id); bool8 IsStorableItem(s16 item_id); bool8 IsShoppableItem(s16 item_id); bool8 IsValidTargetItem(s16 item_id); +bool8 IsItemUsableNow(struct item *item); +bool8 IsTicketItem(s16 item_id); +void InitItem(struct item* item, s16 id, s16 quantity, bool8 isSticky); +void InitStandardItem(struct item* item, s16 id, bool8 isSticky); +void sub_0200CF6C(struct item* item, s16 id, s16 quantity, bool8 isSticky); +//void InitBulkItem(struct bulk_item* item, s16 id); #endif //PMDSKY_ITEM_UTIL_4_H diff --git a/src/item_util_4.c b/src/item_util_4.c index ab85a7ad..cd663a12 100644 --- a/src/item_util_4.c +++ b/src/item_util_4.c @@ -6,6 +6,9 @@ extern s32 GetItemSellPrice(s16); extern s32 GetItemBuyPrice(s16); +extern s32 GetThrownItemQuantityLimit(s16, s32); +extern s16 RandRangeSafe(s32, s32); +extern s16 _020A18BC[10]; BOOL IsLosableItem(struct item* item) { @@ -48,14 +51,13 @@ bool8 IsShoppableItem(s16 item_id) return 1; } -extern s16 _020A18BC[10]; - -bool8 IsValidTargetItem(s16 item_id) { +bool8 IsValidTargetItem(s16 item_id) +{ s32 var_ip; - if (item_id >= 0x16C) return TRUE; + if (item_id >= ITEM_GORGEOUS_BOX_1) return TRUE; - for (var_ip = 0; _020A18BC[var_ip] != 0x578; var_ip++) + for (var_ip = 0; _020A18BC[var_ip] != NUM_ITEM_IDS; var_ip++) { if (item_id == _020A18BC[var_ip]) { return TRUE; @@ -64,3 +66,80 @@ bool8 IsValidTargetItem(s16 item_id) { return FALSE; } + +bool8 IsItemUsableNow(struct item* item) +{ + s16 item_id; + + if (item->flags & ITEM_FLAG_IN_SHOP) { + if (GetItemCategory(item->id) != CATEGORY_TMS_HMS) { + item_id = item->id; + if ((item_id != ITEM_SITRUS_BERRY) && + (item_id != ITEM_LIFE_SEED) && + (item_id != ITEM_GINSENG) && + (item_id != ITEM_JOY_SEED) && + (item_id != ITEM_GOLDEN_SEED) && + (item_id != ITEM_PROTEIN) && + (item_id != ITEM_CALCIUM) && + (item_id != ITEM_IRON) && + (item_id != ITEM_NECTAR) && + (item_id != ITEM_ZINC)) { + if ((u16) (s16) (item_id - 0x77) > 0x11) { + goto _ret; + } + } + } + return FALSE; + } +_ret: + return TRUE; +} + +bool8 IsTicketItem(s16 item_id) +{ + s32 arg0 = (u16)(s16)(item_id - ITEM_PRIZE_TICKET); + + return ((arg0) <= 3U); +} + +void InitItem(struct item* item, s16 id, s16 quantity, bool8 isSticky) +{ + s32 category; + s32 to; + + if (id != 0) { + item->flags = ITEM_FLAG_EXISTS; + item->id = id; + item->held_by = 0; + if (IsThrownItem(id)) { + to = GetThrownItemQuantityLimit(id, 1); + item->quantity = RandRangeSafe(GetThrownItemQuantityLimit(id, 0), to); + } else { + category = GetItemCategory(id); + if (category == CATEGORY_POKE) { + item->quantity = 1; + } else if ((u8) (category + 0xF4) <= 2) { + item->quantity = quantity; + } else { + item->quantity = 0; + } + } + if (isSticky != 0) { + item->flags |= ITEM_FLAG_STICKY; + } + return; + } + item->flags = 0; + item->id = id; + item->quantity = 0; +} + +void InitStandardItem(struct item* item, s16 id, bool8 isSticky) +{ + InitItem(item, id, 0, isSticky); +} + +void sub_0200CF6C(struct item* item, s16 id, s16 quantity, bool8 isSticky) +{ + InitItem(item, id, quantity, isSticky); +} From afd76a33ac6b5a3be24b47665aed93ed1a449076 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 27 Aug 2025 21:28:41 -0700 Subject: [PATCH 3/4] Decomp InitBulkItem thanks to @tgsm --- asm/main_0200CAFC.s | 36 ------------------------------------ include/item.h | 6 ++++++ include/item_util_4.h | 8 +------- src/item_util_4.c | 25 +++++++++++++++++++++++-- 4 files changed, 30 insertions(+), 45 deletions(-) diff --git a/asm/main_0200CAFC.s b/asm/main_0200CAFC.s index 37ae83b6..d52a31f2 100644 --- a/asm/main_0200CAFC.s +++ b/asm/main_0200CAFC.s @@ -3,42 +3,6 @@ .text - arm_func_start InitBulkItem -InitBulkItem: ; 0x0200CF78 - stmdb sp!, {r4, r5, r6, lr} - movs r5, r1 - mov r6, r0 - strh r5, [r6] - beq _0200CFE4 - mov r0, r5 - bl IsThrownItem - cmp r0, #0 - mov r0, r5 - beq _0200CFC8 - mov r1, #1 - bl GetThrownItemQuantityLimit - mov r4, r0 - mov r0, r5 - mov r1, #0 - bl GetThrownItemQuantityLimit - mov r1, r4 - bl RandRangeSafe - strh r0, [r6, #2] - ldmia sp!, {r4, r5, r6, pc} -_0200CFC8: - bl GetItemCategory - cmp r0, #6 - moveq r0, #1 - streqh r0, [r6, #2] - movne r0, #0 - strneh r0, [r6, #2] - ldmia sp!, {r4, r5, r6, pc} -_0200CFE4: - mov r0, #0 - strh r0, [r6, #2] - ldmia sp!, {r4, r5, r6, pc} - arm_func_end InitBulkItem - arm_func_start BulkItemToItem BulkItemToItem: ; 0x0200CFF0 stmdb sp!, {r3, r4, r5, lr} diff --git a/include/item.h b/include/item.h index 0ababff7..6f19b699 100644 --- a/include/item.h +++ b/include/item.h @@ -1661,4 +1661,10 @@ struct item_data_entry /* 0xE */ u8 flags; }; +struct bulk_item +{ + /* 0x0 */ s16 id; + /* 0x2 */ u16 quantity; +}; + #endif //PMDSKY_ITEM_H diff --git a/include/item_util_4.h b/include/item_util_4.h index 552e6388..6cd20d75 100644 --- a/include/item_util_4.h +++ b/include/item_util_4.h @@ -3,12 +3,6 @@ #include "item.h" -struct bulk_item -{ - /* 0x0 */ s16 id; - /* 0x2 */ u16 quantity; -} BulkItem; - BOOL IsLosableItem(struct item* item); bool8 IsTreasureBox(s16 item_id); bool8 IsStorableItem(s16 item_id); @@ -19,7 +13,7 @@ bool8 IsTicketItem(s16 item_id); void InitItem(struct item* item, s16 id, s16 quantity, bool8 isSticky); void InitStandardItem(struct item* item, s16 id, bool8 isSticky); void sub_0200CF6C(struct item* item, s16 id, s16 quantity, bool8 isSticky); -//void InitBulkItem(struct bulk_item* item, s16 id); +void InitBulkItem(struct bulk_item* item, s16 id); #endif //PMDSKY_ITEM_UTIL_4_H diff --git a/src/item_util_4.c b/src/item_util_4.c index cd663a12..23384c27 100644 --- a/src/item_util_4.c +++ b/src/item_util_4.c @@ -107,7 +107,7 @@ void InitItem(struct item* item, s16 id, s16 quantity, bool8 isSticky) s32 category; s32 to; - if (id != 0) { + if (id != ITEM_NOTHING) { item->flags = ITEM_FLAG_EXISTS; item->id = id; item->held_by = 0; @@ -124,7 +124,7 @@ void InitItem(struct item* item, s16 id, s16 quantity, bool8 isSticky) item->quantity = 0; } } - if (isSticky != 0) { + if (isSticky) { item->flags |= ITEM_FLAG_STICKY; } return; @@ -143,3 +143,24 @@ void sub_0200CF6C(struct item* item, s16 id, s16 quantity, bool8 isSticky) { InitItem(item, id, quantity, isSticky); } + +void InitBulkItem(struct bulk_item* item, s16 id) { + s32 to; + + item->id = id; + if (id != ITEM_NOTHING) { + if (IsThrownItem(id)) { + to = GetThrownItemQuantityLimit(id, 1); + item->quantity = RandRangeSafe(GetThrownItemQuantityLimit(id, 0), to); + } + else if (GetItemCategory(id) == CATEGORY_POKE) { + item->quantity = 1; + } else { + item->quantity = 0; + } + } + else + { + item->quantity = 0; + } +} From b3d4fda4a157eb529666254b359374d3ef27e3ef Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 3 Jan 2026 13:10:56 -0800 Subject: [PATCH 4/4] fix build --- src/item_util.c | 2 -- src/item_util_4.c | 3 --- 2 files changed, 5 deletions(-) diff --git a/src/item_util.c b/src/item_util.c index f3c34306..ae01f12d 100644 --- a/src/item_util.c +++ b/src/item_util.c @@ -1,8 +1,6 @@ #include "item_util.h" #include "item_util_2.h" -extern s32 GetItemMoveId(s32 item_id); - enum item_category GetItemCategoryVeneer(s16 item_id) { return GetItemCategory(item_id); diff --git a/src/item_util_4.c b/src/item_util_4.c index 23384c27..ddc0480b 100644 --- a/src/item_util_4.c +++ b/src/item_util_4.c @@ -4,9 +4,6 @@ #include "item_util.h" #include "item_util_2.h" -extern s32 GetItemSellPrice(s16); -extern s32 GetItemBuyPrice(s16); -extern s32 GetThrownItemQuantityLimit(s16, s32); extern s16 RandRangeSafe(s32, s32); extern s16 _020A18BC[10];