pokeemmo/include/item.h

251 lines
7.1 KiB
C

#ifndef GUARD_ITEM_H
#define GUARD_ITEM_H
#include "constants/item.h"
#include "constants/item_effects.h"
#include "constants/items.h"
#include "constants/moves.h"
#include "constants/tms_hms.h"
#include "constants/item_effects.h"
#include "constants/hold_effects.h"
/* Expands to:
* enum
* {
* ITEM_TM_FOCUS_PUNCH = ITEM_TM01,
* ...
* ITEM_HM_CUT = ITM_HM01,
* ...
* }; */
#define ENUM_TM(n, id) CAT(ITEM_TM_, id) = CAT(ITEM_TM, n),
#define ENUM_HM(n, id) CAT(ITEM_HM_, id) = CAT(ITEM_HM, n),
#define TO_TMHM_NUMS(a, ...) (__VA_ARGS__)
enum TMHMItemId
{
RECURSIVELY(R_ZIP(ENUM_TM, TO_TMHM_NUMS NUMBERS_256, (FOREACH_TM(APPEND_COMMA))))
RECURSIVELY(R_ZIP(ENUM_HM, TO_TMHM_NUMS NUMBERS_256, (FOREACH_HM(APPEND_COMMA))))
};
#undef ENUM_TM
#undef ENUM_HM
#undef TO_TMHM_NUMS
/* Each of these TM_HM enums corresponds an index in the list of TMs + HMs item ids in
* gTMHMItemMoveIds. The index for an item can be retrieved with GetItemTMHMIndex below.
*/
#define UNPACK_TM_HM_ENUM(_tmHm) CAT(ENUM_TM_HM_, _tmHm),
enum TMHMIndex
{
FOREACH_TMHM(UNPACK_TM_HM_ENUM)
NUM_ALL_MACHINES,
NUM_TECHNICAL_MACHINES = (0 FOREACH_TM(PLUS_ONE)),
NUM_HIDDEN_MACHINES = (0 FOREACH_HM(PLUS_ONE)),
};
#undef UNPACK_TM_HM_ENUM
enum PACKED ItemSortType
{
ITEM_TYPE_UNCATEGORIZED,
ITEM_TYPE_FIELD_USE,
ITEM_TYPE_LEVEL_UP_ITEM,
ITEM_TYPE_HEALTH_RECOVERY,
ITEM_TYPE_STATUS_RECOVERY,
ITEM_TYPE_PP_RECOVERY,
ITEM_TYPE_NATURE_MINT,
ITEM_TYPE_STAT_BOOST_DRINK,
ITEM_TYPE_STAT_BOOST_FEATHER,
ITEM_TYPE_STAT_BOOST_MOCHI,
ITEM_TYPE_BATTLE_ITEM,
ITEM_TYPE_FLUTE,
ITEM_TYPE_X_ITEM,
ITEM_TYPE_AUX_ITEM,
ITEM_TYPE_EVOLUTION_STONE,
ITEM_TYPE_EVOLUTION_ITEM,
ITEM_TYPE_SPECIAL_HELD_ITEM,
ITEM_TYPE_MEGA_STONE,
ITEM_TYPE_Z_CRYSTAL,
ITEM_TYPE_TERA_SHARD,
ITEM_TYPE_HELD_ITEM,
ITEM_TYPE_TYPE_BOOST_HELD_ITEM,
ITEM_TYPE_CONTEST_HELD_ITEM,
ITEM_TYPE_EV_BOOST_HELD_ITEM,
ITEM_TYPE_GEM,
ITEM_TYPE_PLATE,
ITEM_TYPE_MEMORY,
ITEM_TYPE_DRIVE,
ITEM_TYPE_INCENSE,
ITEM_TYPE_NECTAR,
ITEM_TYPE_GROWTH,
ITEM_TYPE_SHARD,
ITEM_TYPE_SELLABLE,
ITEM_TYPE_RELIC,
ITEM_TYPE_FOSSIL,
ITEM_TYPE_MAIL,
};
typedef void (*ItemUseFunc)(u8);
struct Item
{
u32 price;
u16 secondaryId;
ItemUseFunc fieldUseFunc;
const u8 *description;
const u8 *effect;
const u8 *name;
const u8 *pluralName;
u8 holdEffect;
u8 holdEffectParam;
u8 importance:2;
u8 notConsumed:1;
enum Pocket pocket:5;
enum ItemSortType sortType;
u8 type;
u8 battleUsage;
u8 flingPower;
const u32 *iconPic;
const u16 *iconPalette;
};
struct ALIGNED(2) BagPocket
{
struct ItemSlot *itemSlots;
u16 capacity:10;
enum Pocket id:6;
};
struct TmHmIndexKey
{
enum TMHMItemId itemId:16;
u16 moveId;
};
extern const u8 gQuestionMarksItemName[];
extern const struct Item gItemsInfo[];
extern struct BagPocket gBagPockets[];
extern const struct TmHmIndexKey gTMHMItemMoveIds[];
#define UNPACK_ITEM_TO_TM_INDEX(_tm) case CAT(ITEM_TM_, _tm): return CAT(ENUM_TM_HM_, _tm) + 1;
#define UNPACK_ITEM_TO_HM_INDEX(_hm) case CAT(ITEM_HM_, _hm): return CAT(ENUM_TM_HM_, _hm) + 1;
#define UNPACK_ITEM_TO_TM_MOVE_ID(_tm) case CAT(ITEM_TM_, _tm): return CAT(MOVE_, _tm);
#define UNPACK_ITEM_TO_HM_MOVE_ID(_hm) case CAT(ITEM_HM_, _hm): return CAT(MOVE_, _hm);
static inline enum TMHMIndex GetItemTMHMIndex(u16 item)
{
switch (item)
{
/* Expands to:
* case ITEM_TM_FOCUS_PUNCH:
* return 1;
* case ITEM_TM_DRAGON_CLAW:
* return 2;
* etc */
FOREACH_TM(UNPACK_ITEM_TO_TM_INDEX)
FOREACH_HM(UNPACK_ITEM_TO_HM_INDEX)
default:
return 0;
}
}
static inline u16 GetItemTMHMMoveId(u16 item)
{
switch (item)
{
/* Expands to:
* case ITEM_TM_FOCUS_PUNCH:
* return MOVE_FOCUS_PUNCH;
* case ITEM_TM_DRAGON_CLAW:
* return MOVE_DRAGON_CLAW;
* etc */
FOREACH_TM(UNPACK_ITEM_TO_TM_MOVE_ID)
FOREACH_HM(UNPACK_ITEM_TO_HM_MOVE_ID)
default:
return MOVE_NONE;
}
}
#undef UNPACK_ITEM_TO_TM_INDEX
#undef UNPACK_ITEM_TO_HM_INDEX
#undef UNPACK_ITEM_TO_TM_MOVE_ID
#undef UNPACK_ITEM_TO_HM_MOVE_ID
static inline enum TMHMItemId GetTMHMItemId(enum TMHMIndex index)
{
return gTMHMItemMoveIds[index].itemId;
}
static inline u16 GetTMHMMoveId(enum TMHMIndex index)
{
return gTMHMItemMoveIds[index].moveId;
}
void BagPocket_SetSlotData(struct BagPocket *pocket, u32 pocketPos, struct ItemSlot newSlot);
struct ItemSlot BagPocket_GetSlotData(struct BagPocket *pocket, u32 pocketPos);
static inline void BagPocket_SetSlotItemIdAndCount(struct BagPocket *pocket, u32 pocketPos, u16 itemId, u16 quantity)
{
BagPocket_SetSlotData(pocket, pocketPos, (struct ItemSlot) {itemId, quantity});
}
static inline u16 GetBagItemId(enum Pocket pocketId, u32 pocketPos)
{
return BagPocket_GetSlotData(&gBagPockets[pocketId], pocketPos).itemId;
}
static inline u16 GetBagItemQuantity(enum Pocket pocketId, u32 pocketPos)
{
return BagPocket_GetSlotData(&gBagPockets[pocketId], pocketPos).quantity;
}
static inline struct ItemSlot GetBagItemIdAndQuantity(enum Pocket pocketId, u32 pocketPos)
{
return BagPocket_GetSlotData(&gBagPockets[pocketId], pocketPos);
}
void ApplyNewEncryptionKeyToBagItems(u32 newKey);
void SetBagItemsPointers(void);
u8 *CopyItemName(u16 itemId, u8 *dst);
u8 *CopyItemNameHandlePlural(u16 itemId, u8 *dst, u32 quantity);
bool32 IsBagPocketNonEmpty(enum Pocket pocketId);
bool32 CheckBagHasItem(u16 itemId, u16 count);
bool32 HasAtLeastOneBerry(void);
bool32 HasAtLeastOnePokeBall(void);
bool32 CheckBagHasSpace(u16 itemId, u16 count);
u32 GetFreeSpaceForItemInBag(u16 itemId);
bool32 AddBagItem(u16 itemId, u16 count);
bool32 RemoveBagItem(u16 itemId, u16 count);
u8 CountUsedPCItemSlots(void);
bool32 CheckPCHasItem(u16 itemId, u16 count);
bool32 AddPCItem(u16 itemId, u16 count);
void RemovePCItem(u8 index, u16 count);
void CompactPCItems(void);
void SwapRegisteredBike(void);
void CompactItemsInBagPocket(enum Pocket pocketId);
void MoveItemSlotInPocket(enum Pocket pocketId, u32 from, u32 to);
void MoveItemSlotInPC(struct ItemSlot *itemSlots, u32 from, u32 to);
void ClearBag(void);
u16 CountTotalItemQuantityInBag(u16 itemId);
bool32 AddPyramidBagItem(u16 itemId, u16 count);
bool32 RemovePyramidBagItem(u16 itemId, u16 count);
const u8 *GetItemName(u16 itemId);
u32 GetItemPrice(u16 itemId);
const u8 *GetItemEffect(u32 itemId);
u32 GetItemHoldEffect(u32 itemId);
u32 GetItemHoldEffectParam(u32 itemId);
const u8 *GetItemDescription(u16 itemId);
u8 GetItemImportance(u16 itemId);
u8 GetItemConsumability(u16 itemId);
enum Pocket GetItemPocket(u16 itemId);
u8 GetItemType(u16 itemId);
ItemUseFunc GetItemFieldFunc(u16 itemId);
u8 GetItemBattleUsage(u16 itemId);
u32 GetItemSecondaryId(u32 itemId);
u32 GetItemFlingPower(u32 itemId);
u32 GetItemStatus1Mask(u16 itemId);
bool32 ItemHasVolatileFlag(u16 itemId, enum Volatile volatile);
u32 GetItemSellPrice(u32 itemId);
bool32 IsHoldEffectChoice(enum ItemHoldEffect holdEffect);
#endif // GUARD_ITEM_H