Decomped TestItemAiFlag

This commit is contained in:
AnonymousRandomPerson 2025-05-14 23:49:42 -04:00
parent 8114f38795
commit 45942ba7c2
12 changed files with 250 additions and 246 deletions

View File

@ -1,16 +1,12 @@
#pragma once
.public EnsureValidItem
.public GET_ITEM_NAME_FORMATTED_SPRINTF
.public ITEM_DATA_TABLE_PTRS
.public SprintfStatic__0200E808_EU
.public StringFromId
.public _0209808C
.public _0209809C
.public _020980AC
.public _020980B0
.public ARM9_UNKNOWN_TABLE__NA_2097FF8
.public BAG_ITEMS_PTR_MIRROR
.public EnsureValidItem
.public GET_ITEM_NAME_FORMATTED_SPRINTF
.public IsItemValid
.public ITEM_DATA_TABLE_PTRS
.public ItemZInit
.public SprintfStatic__0200E808_EU
.public strcpy
.public StringFromId
.public vsprintf

View File

@ -0,0 +1,6 @@
#pragma once
.public ARM9_UNKNOWN_TABLE__NA_2097FF8
.public BAG_ITEMS_PTR_MIRROR
.public ITEM_DATA_TABLE_PTRS
.public IsItemValid
.public ItemZInit

View File

@ -254,228 +254,3 @@ GetItemMoveId: ; 0x0200EA80
.align 2, 0
_0200EA9C: .word ITEM_DATA_TABLE_PTRS
arm_func_end GetItemMoveId
arm_func_start TestItemAiFlag
TestItemAiFlag: ; 0x0200EAA0
stmdb sp!, {r3, lr}
cmp r1, #0
bne _0200EAD4
bl EnsureValidItem
ldr r1, _0200EB2C ; =ITEM_DATA_TABLE_PTRS
#ifdef EUROPE
ldr r1, [r1]
#else
ldr r1, [r1, #4]
#endif
add r0, r1, r0, lsl #4
ldrb r0, [r0, #0xe]
tst r0, #0x80
movne r0, #1
moveq r0, #0
and r0, r0, #0xff
ldmia sp!, {r3, pc}
_0200EAD4:
cmp r1, #1
bne _0200EB04
bl EnsureValidItem
ldr r1, _0200EB2C ; =ITEM_DATA_TABLE_PTRS
#ifdef EUROPE
ldr r1, [r1]
#else
ldr r1, [r1, #4]
#endif
add r0, r1, r0, lsl #4
ldrb r0, [r0, #0xe]
tst r0, #0x40
movne r0, #1
moveq r0, #0
and r0, r0, #0xff
ldmia sp!, {r3, pc}
_0200EB04:
bl EnsureValidItem
ldr r1, _0200EB2C ; =ITEM_DATA_TABLE_PTRS
#ifdef EUROPE
ldr r1, [r1]
#else
ldr r1, [r1, #4]
#endif
add r0, r1, r0, lsl #4
ldrb r0, [r0, #0xe]
tst r0, #0x20
movne r0, #1
moveq r0, #0
and r0, r0, #0xff
ldmia sp!, {r3, pc}
.align 2, 0
_0200EB2C: .word ITEM_DATA_TABLE_PTRS
arm_func_end TestItemAiFlag
arm_func_start IsItemInTimeDarkness
IsItemInTimeDarkness: ; 0x0200EB30
ldr r1, _0200EB54 ; =ITEM_DATA_TABLE_PTRS
#ifdef EUROPE
ldr r1, [r1]
#else
ldr r1, [r1, #4]
#endif
add r0, r1, r0, lsl #4
ldrb r0, [r0, #0xe]
tst r0, #2
movne r0, #1
moveq r0, #0
and r0, r0, #0xff
bx lr
.align 2, 0
_0200EB54: .word ITEM_DATA_TABLE_PTRS
arm_func_end IsItemInTimeDarkness
arm_func_start IsItemValidVeneer
IsItemValidVeneer: ; 0x0200EB58
ldr ip, _0200EB60 ; =IsItemValid
bx ip
.align 2, 0
_0200EB60: .word IsItemValid
arm_func_end IsItemValidVeneer
arm_func_start sub_0200EB64
sub_0200EB64: ; 0x0200EB64
ldr r1, _0200EB88 ; =ITEM_DATA_TABLE_PTRS
mov r2, r0, lsl #0x1f
ldr r1, [r1, #8]
mov r0, r0, asr #1
ldr r3, [r1, r0, lsl #2]
ldr r0, _0200EB8C ; =0x000007FF
mov r1, r2, lsr #0x1b
and r0, r0, r3, asr r1
bx lr
.align 2, 0
_0200EB88: .word ITEM_DATA_TABLE_PTRS
_0200EB8C: .word 0x000007FF
arm_func_end sub_0200EB64
arm_func_start sub_0200EB90
sub_0200EB90: ; 0x0200EB90
mov ip, #0
ldr r2, _0200EBC8 ; =ARM9_UNKNOWN_TABLE__NA_2097FF8
b _0200EBB8
_0200EB9C:
add r1, r2, ip, lsl #2
ldrsh r1, [r1, #2]
mov r3, ip, lsl #2
cmp r0, r1
ldreqsh r0, [r2, r3]
bxeq lr
add ip, ip, #1
_0200EBB8:
cmp ip, #0x10
blt _0200EB9C
mov r0, #0
bx lr
.align 2, 0
_0200EBC8: .word ARM9_UNKNOWN_TABLE__NA_2097FF8
arm_func_end sub_0200EB90
arm_func_start SetActiveInventoryToMain
SetActiveInventoryToMain: ; 0x0200EBCC
ldr ip, _0200EBD8 ; =SetActiveInventory
mov r0, #0
bx ip
.align 2, 0
_0200EBD8: .word SetActiveInventory
arm_func_end SetActiveInventoryToMain
arm_func_start AllInventoriesZInit
AllInventoriesZInit: ; 0x0200EBDC
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr}
mov sl, #0
ldr r6, _0200EC44 ; =BAG_ITEMS_PTR_MIRROR
mov r7, sl
mov fp, sl
mov r4, #6
mov r5, #0x12c
_0200EBF8:
mul sb, sl, r5
mov r8, fp
_0200EC00:
ldr r0, [r6]
add r0, r0, sb
mla r0, r8, r4, r0
bl ItemZInit
add r8, r8, #1
cmp r8, #0x32
blt _0200EC00
ldr r0, [r6]
add r0, r0, sl, lsl #2
add r0, r0, #0x1000
add sl, sl, #1
str r7, [r0, #0x394]
cmp sl, #3
blt _0200EBF8
mov r0, r7
bl SetActiveInventory
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
.align 2, 0
_0200EC44: .word BAG_ITEMS_PTR_MIRROR
arm_func_end AllInventoriesZInit
arm_func_start SpecialEpisodeInventoryZInit
SpecialEpisodeInventoryZInit: ; 0x0200EC48
stmdb sp!, {r4, r5, r6, lr}
ldr r5, _0200EC8C ; =BAG_ITEMS_PTR_MIRROR
mov r6, #0
mov r4, #6
_0200EC58:
ldr r0, [r5]
add r0, r0, #0x12c
mla r0, r6, r4, r0
bl ItemZInit
add r6, r6, #1
cmp r6, #0x32
blt _0200EC58
ldr r0, _0200EC8C ; =BAG_ITEMS_PTR_MIRROR
mov r1, #0
ldr r0, [r0]
add r0, r0, #0x1000
str r1, [r0, #0x398]
ldmia sp!, {r4, r5, r6, pc}
.align 2, 0
_0200EC8C: .word BAG_ITEMS_PTR_MIRROR
arm_func_end SpecialEpisodeInventoryZInit
arm_func_start RescueInventoryZInit
RescueInventoryZInit: ; 0x0200EC90
stmdb sp!, {r4, r5, r6, lr}
ldr r5, _0200ECD4 ; =BAG_ITEMS_PTR_MIRROR
mov r6, #0
mov r4, #6
_0200ECA0:
ldr r0, [r5]
add r0, r0, #0x258
mla r0, r6, r4, r0
bl ItemZInit
add r6, r6, #1
cmp r6, #0x32
blt _0200ECA0
ldr r0, _0200ECD4 ; =BAG_ITEMS_PTR_MIRROR
mov r1, #0
ldr r0, [r0]
add r0, r0, #0x1000
str r1, [r0, #0x39c]
ldmia sp!, {r4, r5, r6, pc}
.align 2, 0
_0200ECD4: .word BAG_ITEMS_PTR_MIRROR
arm_func_end RescueInventoryZInit
arm_func_start SetActiveInventory
SetActiveInventory: ; 0x0200ECD8
ldr r2, _0200ECF8 ; =BAG_ITEMS_PTR_MIRROR
mov r1, #0x12c
ldr r3, [r2]
strb r0, [r3, #0x388]
ldr r2, [r2]
mla r1, r0, r1, r2
str r1, [r2, #0x384]
bx lr
.align 2, 0
_0200ECF8: .word BAG_ITEMS_PTR_MIRROR
arm_func_end SetActiveInventory

174
asm/main_0200EB30.s Normal file
View File

@ -0,0 +1,174 @@
.include "asm/macros.inc"
.include "main_0200EB30.inc"
.text
arm_func_start IsItemInTimeDarkness
IsItemInTimeDarkness: ; 0x0200EB30
ldr r1, _0200EB54 ; =ITEM_DATA_TABLE_PTRS
#ifdef EUROPE
ldr r1, [r1]
#else
ldr r1, [r1, #4]
#endif
add r0, r1, r0, lsl #4
ldrb r0, [r0, #0xe]
tst r0, #2
movne r0, #1
moveq r0, #0
and r0, r0, #0xff
bx lr
.align 2, 0
_0200EB54: .word ITEM_DATA_TABLE_PTRS
arm_func_end IsItemInTimeDarkness
arm_func_start IsItemValidVeneer
IsItemValidVeneer: ; 0x0200EB58
ldr ip, _0200EB60 ; =IsItemValid
bx ip
.align 2, 0
_0200EB60: .word IsItemValid
arm_func_end IsItemValidVeneer
arm_func_start sub_0200EB64
sub_0200EB64: ; 0x0200EB64
ldr r1, _0200EB88 ; =ITEM_DATA_TABLE_PTRS
mov r2, r0, lsl #0x1f
ldr r1, [r1, #8]
mov r0, r0, asr #1
ldr r3, [r1, r0, lsl #2]
ldr r0, _0200EB8C ; =0x000007FF
mov r1, r2, lsr #0x1b
and r0, r0, r3, asr r1
bx lr
.align 2, 0
_0200EB88: .word ITEM_DATA_TABLE_PTRS
_0200EB8C: .word 0x000007FF
arm_func_end sub_0200EB64
arm_func_start sub_0200EB90
sub_0200EB90: ; 0x0200EB90
mov ip, #0
ldr r2, _0200EBC8 ; =ARM9_UNKNOWN_TABLE__NA_2097FF8
b _0200EBB8
_0200EB9C:
add r1, r2, ip, lsl #2
ldrsh r1, [r1, #2]
mov r3, ip, lsl #2
cmp r0, r1
ldreqsh r0, [r2, r3]
bxeq lr
add ip, ip, #1
_0200EBB8:
cmp ip, #0x10
blt _0200EB9C
mov r0, #0
bx lr
.align 2, 0
_0200EBC8: .word ARM9_UNKNOWN_TABLE__NA_2097FF8
arm_func_end sub_0200EB90
arm_func_start SetActiveInventoryToMain
SetActiveInventoryToMain: ; 0x0200EBCC
ldr ip, _0200EBD8 ; =SetActiveInventory
mov r0, #0
bx ip
.align 2, 0
_0200EBD8: .word SetActiveInventory
arm_func_end SetActiveInventoryToMain
arm_func_start AllInventoriesZInit
AllInventoriesZInit: ; 0x0200EBDC
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr}
mov sl, #0
ldr r6, _0200EC44 ; =BAG_ITEMS_PTR_MIRROR
mov r7, sl
mov fp, sl
mov r4, #6
mov r5, #0x12c
_0200EBF8:
mul sb, sl, r5
mov r8, fp
_0200EC00:
ldr r0, [r6]
add r0, r0, sb
mla r0, r8, r4, r0
bl ItemZInit
add r8, r8, #1
cmp r8, #0x32
blt _0200EC00
ldr r0, [r6]
add r0, r0, sl, lsl #2
add r0, r0, #0x1000
add sl, sl, #1
str r7, [r0, #0x394]
cmp sl, #3
blt _0200EBF8
mov r0, r7
bl SetActiveInventory
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
.align 2, 0
_0200EC44: .word BAG_ITEMS_PTR_MIRROR
arm_func_end AllInventoriesZInit
arm_func_start SpecialEpisodeInventoryZInit
SpecialEpisodeInventoryZInit: ; 0x0200EC48
stmdb sp!, {r4, r5, r6, lr}
ldr r5, _0200EC8C ; =BAG_ITEMS_PTR_MIRROR
mov r6, #0
mov r4, #6
_0200EC58:
ldr r0, [r5]
add r0, r0, #0x12c
mla r0, r6, r4, r0
bl ItemZInit
add r6, r6, #1
cmp r6, #0x32
blt _0200EC58
ldr r0, _0200EC8C ; =BAG_ITEMS_PTR_MIRROR
mov r1, #0
ldr r0, [r0]
add r0, r0, #0x1000
str r1, [r0, #0x398]
ldmia sp!, {r4, r5, r6, pc}
.align 2, 0
_0200EC8C: .word BAG_ITEMS_PTR_MIRROR
arm_func_end SpecialEpisodeInventoryZInit
arm_func_start RescueInventoryZInit
RescueInventoryZInit: ; 0x0200EC90
stmdb sp!, {r4, r5, r6, lr}
ldr r5, _0200ECD4 ; =BAG_ITEMS_PTR_MIRROR
mov r6, #0
mov r4, #6
_0200ECA0:
ldr r0, [r5]
add r0, r0, #0x258
mla r0, r6, r4, r0
bl ItemZInit
add r6, r6, #1
cmp r6, #0x32
blt _0200ECA0
ldr r0, _0200ECD4 ; =BAG_ITEMS_PTR_MIRROR
mov r1, #0
ldr r0, [r0]
add r0, r0, #0x1000
str r1, [r0, #0x39c]
ldmia sp!, {r4, r5, r6, pc}
.align 2, 0
_0200ECD4: .word BAG_ITEMS_PTR_MIRROR
arm_func_end RescueInventoryZInit
arm_func_start SetActiveInventory
SetActiveInventory: ; 0x0200ECD8
ldr r2, _0200ECF8 ; =BAG_ITEMS_PTR_MIRROR
mov r1, #0x12c
ldr r3, [r2]
strb r0, [r3, #0x388]
ldr r2, [r2]
mla r1, r0, r1, r2
str r1, [r2, #0x384]
bx lr
.align 2, 0
_0200ECF8: .word BAG_ITEMS_PTR_MIRROR
arm_func_end SetActiveInventory

View File

@ -1442,9 +1442,9 @@ enum item_flag {
};
enum item_ai_flag {
ITEM_AI_FLAG_TARGET_SELF,
ITEM_AI_FLAG_TARGET_ALLY,
ITEM_AI_FLAG_TARGET_ENEMY,
ITEM_FLAG_CONSUMABLE,
ITEM_FLAG_THROWABLE_AT_ALLY,
ITEM_FLAG_THROWABLE_AT_ENEMY,
NUM_ITEM_AI_FLAGS
};
@ -1453,6 +1453,13 @@ enum item_target_flag {
ITEM_TARGET_ALLY = 1 << 1
};
enum item_data_flag {
ITEM_DATA_FLAG_VALID = 1 << 0,
ITEM_DATA_FLAG_CONSUMABLE = 1 << 5,
ITEM_DATA_FLAG_THROWABLE_AT_ALLY = 1 << 6,
ITEM_DATA_FLAG_THROWABLE_AT_ENEMY = 1 << 7,
};
#define GROUND_ITEM_TOOLBOX_INDEX 0x80
#define HELD_ITEM_TOOLBOX_INDEX 0x81
#define INVENTORY_SIZE 52
@ -1506,7 +1513,7 @@ struct item_data_entry
/* 0x0 */ u8 *name;
/* 0x4 */ enum item_category category;
u8 fill5[0xE - 0x5];
/* 0xE */ bool8 valid;
/* 0xE */ u8 flags;
};
#endif //PMDSKY_ITEM_H

15
include/item_util_3.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef PMDSKY_ITEM_UTIL_3_H
#define PMDSKY_ITEM_UTIL_3_H
#include "util.h"
// Returns a boolean indicating whether the item is consumable, throwable at an ally, or throwable at an enemy, depending on item_flag.
// The table used for this is inaccessible in the code, as it is loaded from a file in the ROM at runtime.
// Bit 7 in the table corresponds to ITEM_FLAG_CONSUMABLE, bit 6 to ITEM_FLAG_THROWABLE_AT_ALLY, and bit 5 to ITEM_FLAG_THROWABLE_AT_ENEMY.
//
// item_id: item_id enum
// flag: item_flag enum. Function will test a different allowed AI action depending on the value.
// return: bool
bool8 TestItemAiFlag(s16 item_id, s32 flag);
#endif //PMDSKY_ITEM_UTIL_3_H

View File

@ -27,6 +27,8 @@ Static main
Object asm/main_0200E7E8.o
Object src/item_util_2.o
Object asm/main_0200E864.o
Object src/item_util_3.o
Object asm/main_0200EB30.o
Object src/main_0200ECFC.o
Object asm/main_0200ED1C.o
Object src/moves.o

View File

@ -17,8 +17,8 @@ u32 GetAiUseItemProbability(struct entity *item_consumer, struct item *item, u32
{
u32 item_weight = 0;
struct monster *pokemon_info = GetEntInfo(item_consumer);
bool8 target_other = (flags & 1) != 0;
bool8 target_ally = (flags & 2) != 0;
bool8 target_other = (flags & ITEM_TARGET_OTHER) != 0;
bool8 target_ally = (flags & ITEM_TARGET_ALLY) != 0;
switch (item->id)
{
case ITEM_STICK:

View File

@ -11,6 +11,7 @@
#include "dungeon_util_static.h"
#include "item.h"
#include "item_util.h"
#include "item_util_3.h"
#define NUM_POTENTIAL_ROCK_TARGETS 20
@ -21,7 +22,6 @@ u32 AI_THROWN_ITEM_DIRECTIONS[NUM_DIRECTIONS] = {0};
extern volatile s32 AI_THROWN_ITEM_ACTION_CHOICE_COUNT;
extern struct bag_items *BAG_ITEMS_PTR_MIRROR;
extern bool8 TestItemAiFlag(s16 item_id, s32 flag);
extern void GetPossibleAiArcItemTargets(struct entity *user, struct item *item, struct position positions[], bool8 always_add_position);
extern s32 GetDirectionTowardsPosition(struct position *origin, struct position *target);
extern struct item *GetItemInfo(struct entity *item_entity);
@ -58,7 +58,7 @@ void AiDecideUseItem(struct entity *entity)
enum item_category item_type = GetItemCategoryVeneer(item->id);
if (item_type == CATEGORY_THROWN_LINE)
{
GetPossibleAiThrownItemDirections(entity, ITEM_AI_FLAG_TARGET_ENEMY, item, TRUE);
GetPossibleAiThrownItemDirections(entity, ITEM_FLAG_THROWABLE_AT_ENEMY, item, TRUE);
for (i = 0; i < AI_THROWN_ITEM_ACTION_CHOICE_COUNT; i++)
{
if (DungeonRandOutcome__022EAB20(AI_THROWN_ITEM_PROBABILITIES[i]))
@ -149,7 +149,7 @@ void AiDecideUseItem(struct entity *entity)
if (ItemSticky(item_flags))
continue;
if (TestItemAiFlag(item->id, ITEM_AI_FLAG_TARGET_SELF))
if (TestItemAiFlag(item->id, ITEM_FLAG_CONSUMABLE))
{
u32 item_weight = GetAiUseItemProbability(entity, item, ITEM_TARGET_ALLY);
if (item_weight != 0)
@ -172,7 +172,7 @@ void AiDecideUseItem(struct entity *entity)
if (MonsterCanThrowItems(pokemon_info))
{
for (thrown_ai_flag = ITEM_AI_FLAG_TARGET_ALLY; thrown_ai_flag < NUM_ITEM_AI_FLAGS; thrown_ai_flag++)
for (thrown_ai_flag = ITEM_FLAG_THROWABLE_AT_ALLY; thrown_ai_flag < NUM_ITEM_AI_FLAGS; thrown_ai_flag++)
{
if (TestItemAiFlag(item->id, thrown_ai_flag))
{

View File

@ -37,7 +37,7 @@ void GetPossibleAiThrownItemDirections(struct entity *entity, s32 ally_or_enemy,
continue;
s32 targeting_flags;
if (ally_or_enemy == ITEM_AI_FLAG_TARGET_ALLY)
if (ally_or_enemy == ITEM_FLAG_THROWABLE_AT_ALLY)
{
if (GetTreatmentBetweenMonsters(entity, target_pokemon, FALSE, FALSE) == TREATMENT_TREAT_AS_ALLY)
targeting_flags = ITEM_TARGET_OTHER | ITEM_TARGET_ALLY;

View File

@ -5,7 +5,7 @@ extern struct item_data_entry *ITEM_DATA_TABLE_PTRS[3];
bool8 IsItemValid(s16 item_id)
{
if (ITEM_DATA_TABLE_PTRS[ITEM_DATA_TABLE_PTRS_INDEX][item_id].valid & 1)
if (ITEM_DATA_TABLE_PTRS[ITEM_DATA_TABLE_PTRS_INDEX][item_id].flags & ITEM_DATA_FLAG_VALID)
return TRUE;
return FALSE;

29
src/item_util_3.c Normal file
View File

@ -0,0 +1,29 @@
#include "item_util_3.h"
#include "item.h"
#include "item_util_2.h"
extern struct item_data_entry *ITEM_DATA_TABLE_PTRS[3];
bool8 TestItemAiFlag(s16 item_id, s32 flag)
{
if (flag == 0)
{
item_id = EnsureValidItem(item_id);
if (ITEM_DATA_TABLE_PTRS[ITEM_DATA_TABLE_PTRS_INDEX][item_id].flags & ITEM_DATA_FLAG_THROWABLE_AT_ENEMY)
return TRUE;
return FALSE;
}
if (flag == 1)
{
item_id = EnsureValidItem(item_id);
if (ITEM_DATA_TABLE_PTRS[ITEM_DATA_TABLE_PTRS_INDEX][item_id].flags & ITEM_DATA_FLAG_THROWABLE_AT_ALLY)
return TRUE;
return FALSE;
}
item_id = EnsureValidItem(item_id);
if (ITEM_DATA_TABLE_PTRS[ITEM_DATA_TABLE_PTRS_INDEX][item_id].flags & ITEM_DATA_FLAG_CONSUMABLE)
return TRUE;
return FALSE;
}