diff --git a/asm/include/main_0200E864.inc b/asm/include/main_0200E864.inc index 5e1884dd..353804d2 100644 --- a/asm/include/main_0200E864.inc +++ b/asm/include/main_0200E864.inc @@ -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 diff --git a/asm/include/main_0200EB30.inc b/asm/include/main_0200EB30.inc new file mode 100644 index 00000000..8f464d30 --- /dev/null +++ b/asm/include/main_0200EB30.inc @@ -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 diff --git a/asm/main_0200E864.s b/asm/main_0200E864.s index c12f2a1a..09a25997 100644 --- a/asm/main_0200E864.s +++ b/asm/main_0200E864.s @@ -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 diff --git a/asm/main_0200EB30.s b/asm/main_0200EB30.s new file mode 100644 index 00000000..7531126c --- /dev/null +++ b/asm/main_0200EB30.s @@ -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 diff --git a/include/item.h b/include/item.h index a7a0ce5c..8501618e 100644 --- a/include/item.h +++ b/include/item.h @@ -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 diff --git a/include/item_util_3.h b/include/item_util_3.h new file mode 100644 index 00000000..0f1f62cb --- /dev/null +++ b/include/item_util_3.h @@ -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 diff --git a/main.lsf b/main.lsf index cc13048b..a7101e03 100644 --- a/main.lsf +++ b/main.lsf @@ -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 diff --git a/src/dungeon_ai_item_weight.c b/src/dungeon_ai_item_weight.c index 660ec032..1d9ee38e 100644 --- a/src/dungeon_ai_item_weight.c +++ b/src/dungeon_ai_item_weight.c @@ -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: diff --git a/src/dungeon_ai_items.c b/src/dungeon_ai_items.c index 7896b736..7b811c58 100644 --- a/src/dungeon_ai_items.c +++ b/src/dungeon_ai_items.c @@ -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)) { diff --git a/src/dungeon_ai_items_1.c b/src/dungeon_ai_items_1.c index f7a613fb..a186d921 100644 --- a/src/dungeon_ai_items_1.c +++ b/src/dungeon_ai_items_1.c @@ -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; diff --git a/src/item_util_1.c b/src/item_util_1.c index f2a9a24b..7128646b 100644 --- a/src/item_util_1.c +++ b/src/item_util_1.c @@ -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; diff --git a/src/item_util_3.c b/src/item_util_3.c new file mode 100644 index 00000000..25396342 --- /dev/null +++ b/src/item_util_3.c @@ -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; +}