initial decomp work

decomp more item funcs

new file boundary and more decomp

address review comments

Match IsValidTargetItem thanks to @taxicat1
This commit is contained in:
Seth Barberee 2025-08-22 16:13:50 -07:00
parent cfc5a1d429
commit fd2a10df14
10 changed files with 177 additions and 327 deletions

View File

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

View File

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

View File

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

View File

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

13
include/item_util_4.h Normal file
View File

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

View File

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

View File

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

View File

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

66
src/item_util_4.c Normal file
View File

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

View File

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