// Copyright (c) Athena Dev Teams - Licensed under GNU GPL // For more information, see LICENCE in the main folder #ifndef _ITEMDB_H_ #define _ITEMDB_H_ #include "../common/db.h" #include "../common/mmo.h" // ITEM_NAME_LENGTH #include "map.h" ///Maximum allowed Item ID (range: 1 ~ 65,534) #define MAX_ITEMID USHRT_MAX ///Use apple for unknown items. #define UNKNOWN_ITEM_ID 512 /// The maximum number of item delays #define MAX_ITEMDELAYS 10 ///Designed for search functions, species max number of matches to display. #define MAX_SEARCH 5 ///Maximum amount of items a combo may require #define MAX_ITEMS_PER_COMBO 6 //The only item group required by the code to be known. See const.txt for the full list. #define IG_FINDINGORE 6 #define IG_POTION 37 #define MAX_ITEMGROUP_RANDGROUP 4 ///Max group for random item (increase this when needed). TODO: Remove this limit and use dynamic size if needed #define MAX_ROULETTE_LEVEL 7 /** client-defined value **/ #define MAX_ROULETTE_COLUMNS 9 /** client-defined value **/ #define CARD0_FORGE 0x00FF #define CARD0_CREATE 0x00FE #define CARD0_PET 0x0100 ///Marks if the card0 given is "special" (non-item id used to mark pets/created items. [Skotlex] #define itemdb_isspecial(i) (i == CARD0_FORGE || i == CARD0_CREATE || i == CARD0_PET) ///Enum of item id (for hardcoded purpose) enum item_itemid { ITEMID_RED_POTION = 501, ITEMID_YELLOW_POTION = 503, ITEMID_WHITE_POTION = 504, ITEMID_BLUE_POTION = 505, ITEMID_APPLE = 512, ITEMID_HOLY_WATER = 523, ITEMID_PUMPKIN = 535, ITEMID_RED_SLIM_POTION = 545, ITEMID_YELLOW_SLIM_POTION = 546, ITEMID_WHITE_SLIM_POTION = 547, ITEMID_WING_OF_FLY = 601, ITEMID_WING_OF_BUTTERFLY = 602, ITEMID_ANODYNE = 605, ITEMID_ALOEBERA = 606, ITEMID_POISON_BOTTLE = 678, ITEMID_EMPTY_BOTTLE = 713, ITEMID_EMPERIUM = 714, ITEMID_YELLOW_GEMSTONE = 715, ITEMID_RED_GEMSTONE = 716, ITEMID_BLUE_GEMSTONE = 717, ITEMID_ALCOHOL = 970, ITEMID_ORIDECON = 984, ITEMID_ANVIL = 986, ITEMID_ORIDECON_ANVIL = 987, ITEMID_GOLDEN_ANVIL = 988, ITEMID_EMPERIUM_ANVIL = 989, ITEMID_BLOODY_RED = 990, ITEMID_CRYSTAL_BLUE = 991, ITEMID_WIND_OF_VERDURE = 992, ITEMID_YELLOW_LIVE = 993, ITEMID_FLAME_HEART = 994, ITEMID_MISTIC_FROZEN = 995, ITEMID_ROUGH_WIND = 996, ITEMID_GREAT_NATURE = 997, ITEMID_IRON = 998, ITEMID_STEEL = 999, ITEMID_STAR_CRUMB = 1000, ITEMID_PHRACON = 1010, ITEMID_EMVERETARCON = 1011, ITEMID_TRAP = 1065, ITEMID_PAINT_BRUSH = 6122, ITEMID_STRANGE_EMBRYO = 6415, ITEMID_STONE = 7049, ITEMID_FIRE_BOTTLE = 7135, ITEMID_ACID_BOTTLE = 7136, ITEMID_MAN_EATER_BOTTLE = 7137, ITEMID_MINI_BOTTLE = 7138, ITEMID_COATING_BOTTLE = 7139, ITEMID_FRAGMENT_OF_CRYSTAL = 7321, ITEMID_SKULL_ = 7420, ITEMID_TOKEN_OF_SIEGFRIED = 7621, ITEMID_TRAP_ALLOY = 7940, ITEMID_MERCENARY_RED_POTION = 12184, ITEMID_MERCENARY_BLUE_POTION = 12185, ITEMID_BATTLE_MANUAL = 12208, ITEMID_BUBBLE_GUM = 12210, ITEMID_GIANT_FLY_WING = 12212, ITEMID_NEURALIZER = 12213, ITEMID_M_CENTER_POTION = 12241, ITEMID_M_AWAKENING_POTION = 12242, ITEMID_M_BERSERK_POTION = 12243, ITEMID_COMP_BATTLE_MANUAL = 12263, ITEMID_LOVE_ANGEL = 12287, ITEMID_SQUIRREL = 12288, ITEMID_GOGO = 12289, ITEMID_PICTURE_DIARY = 12304, ITEMID_MINI_HEART = 12305, ITEMID_NEWCOMER = 12306, ITEMID_KID = 12307, ITEMID_MAGIC_CASTLE = 12308, ITEMID_BULGING_HEAD = 12309, ITEMID_THICK_BATTLE_MANUAL = 12312, ITEMID_ANCILLA = 12333, ITEMID_DUN_TELE_SCROLL3 = 12352, ITEMID_REINS_OF_MOUNT = 12622, ITEMID_COMP_BUBBLE_GUM = 12264, ITEMID_NOBLE_NAMEPLATE = 12705, ITEMID_DUN_TELE_SCROLL1 = 14527, ITEMID_BATTLE_MANUAL25 = 14532, ITEMID_BATTLE_MANUAL100 = 14533, ITEMID_BATTLE_MANUAL300 = 14545, ITEMID_DUN_TELE_SCROLL2 = 14581, ITEMID_WOB_RUNE = 14582, ITEMID_WOB_SCHWALTZ = 14583, ITEMID_WOB_RACHEL = 14584, ITEMID_WOB_LOCAL = 14585, ITEMID_SIEGE_TELEPORT_SCROLL = 14591, ITEMID_JOB_MANUAL50 = 14592, }; ///Mercenary Scrolls enum mercenary_scroll_item_list { ITEMID_BOW_MERCENARY_SCROLL1 = 12153, ITEMID_BOW_MERCENARY_SCROLL2, ITEMID_BOW_MERCENARY_SCROLL3, ITEMID_BOW_MERCENARY_SCROLL4, ITEMID_BOW_MERCENARY_SCROLL5, ITEMID_BOW_MERCENARY_SCROLL6, ITEMID_BOW_MERCENARY_SCROLL7, ITEMID_BOW_MERCENARY_SCROLL8, ITEMID_BOW_MERCENARY_SCROLL9, ITEMID_BOW_MERCENARY_SCROLL10, ITEMID_SWORDMERCENARY_SCROLL1, ITEMID_SWORDMERCENARY_SCROLL2, ITEMID_SWORDMERCENARY_SCROLL3, ITEMID_SWORDMERCENARY_SCROLL4, ITEMID_SWORDMERCENARY_SCROLL5, ITEMID_SWORDMERCENARY_SCROLL6, ITEMID_SWORDMERCENARY_SCROLL7, ITEMID_SWORDMERCENARY_SCROLL8, ITEMID_SWORDMERCENARY_SCROLL9, ITEMID_SWORDMERCENARY_SCROLL10, ITEMID_SPEARMERCENARY_SCROLL1, ITEMID_SPEARMERCENARY_SCROLL2, ITEMID_SPEARMERCENARY_SCROLL3, ITEMID_SPEARMERCENARY_SCROLL4, ITEMID_SPEARMERCENARY_SCROLL5, ITEMID_SPEARMERCENARY_SCROLL6, ITEMID_SPEARMERCENARY_SCROLL7, ITEMID_SPEARMERCENARY_SCROLL8, ITEMID_SPEARMERCENARY_SCROLL9, ITEMID_SPEARMERCENARY_SCROLL10, }; ///Rune Knight enum rune_item_list { ITEMID_NAUTHIZ = 12725, ITEMID_RAIDO, ITEMID_BERKANA, ITEMID_ISA, ITEMID_OTHILA, ITEMID_URUZ, ITEMID_THURISAZ, ITEMID_WYRD, ITEMID_HAGALAZ, ITEMID_LUX_ANIMA = 22540, }; ///Mechanic enum mechanic_item_list { ITEMID_ACCELERATOR = 2800, ITEMID_HOVERING_BOOSTER, ITEMID_SUICIDAL_DEVICE, ITEMID_SHAPE_SHIFTER, ITEMID_COOLING_DEVICE, ITEMID_MAGNETIC_FIELD_GENERATOR, ITEMID_BARRIER_BUILDER, ITEMID_REPAIR_KIT, ITEMID_CAMOUFLAGE_GENERATOR, ITEMID_HIGH_QUALITY_COOLER, ITEMID_SPECIAL_COOLER, ITEMID_SCARLET_PTS = 6360, ITEMID_INDIGO_PTS, ITEMID_YELLOW_WISH_PTS, ITEMID_LIME_GREEN_PTS, ITEMID_REPAIR_A = 12392, ITEMID_REPAIR_B, ITEMID_REPAIR_C, }; ///Genetic enum genetic_item_list { ITEMID_SEED_OF_HORNY_PLANT = 6210, ITEMID_BLOODSUCK_PLANT_SEED, ITEMID_BOMB_MUSHROOM_SPORE, ITEMID_HP_INCREASE_POTION_SMALL = 12422, ITEMID_HP_INCREASE_POTION_MEDIUM, ITEMID_HP_INCREASE_POTION_LARGE, ITEMID_SP_INCREASE_POTION_SMALL, ITEMID_SP_INCREASE_POTION_MEDIUM, ITEMID_SP_INCREASE_POTION_LARGE, ITEMID_CONCENTRATED_WHITE_POTION_Z, ITEMID_SAVAGE_FULL_ROAST, ITEMID_COCKTAIL_WARG_BLOOD, ITEMID_MINOR_STEW, ITEMID_SIROMA_ICED_TEA, ITEMID_DROSERA_HERB_SALAD, ITEMID_PETITE_TAIL_NOODLES, ITEMID_BLACK_MASS, ITEMID_VITATA500, ITEMID_CONCENTRATED_CEROMAIN_SOUP, ITEMID_CURE_FREE = 12475, ITEMID_APPLE_BOMB = 13260, ITEMID_COCONUT_BOMB, ITEMID_MELON_BOMB, ITEMID_PINEAPPLE_BOMB, ITEMID_BANANA_BOMB, ITEMID_BLACK_LUMP, ITEMID_BLACK_HARD_LUMP, ITEMID_VERY_HARD_LUMP, ITEMID_MYSTERIOUS_POWDER, ITEMID_BOOST500_TO_THROW, ITEMID_FULL_SWINGK_TO_THROW, ITEMID_MANA_PLUS_TO_THROW, ITEMID_CURE_FREE_TO_THROW, ITEMID_STAMINA_UP_M_TO_THROW, ITEMID_DIGESTIVE_F_TO_THROW, ITEMID_HP_INC_POTS_TO_THROW, ITEMID_HP_INC_POTM_TO_THROW, ITEMID_HP_INC_POTL_TO_THROW, ITEMID_SP_INC_POTS_TO_THROW, ITEMID_SP_INC_POTM_TO_THROW, ITEMID_SP_INC_POTL_TO_THROW, ITEMID_EN_WHITE_POTZ_TO_THROW, ITEMID_VITATA500_TO_THROW, ITEMID_EN_CEL_JUICE_TO_THROW, ITEMID_SAVAGE_BBQ_TO_THROW, ITEMID_WUG_COCKTAIL_TO_THROW, ITEMID_M_BRISKET_TO_THROW, ITEMID_SIROMA_ICETEA_TO_THROW, ITEMID_DROCERA_STEW_TO_THROW, ITEMID_PETTI_NOODLE_TO_THROW, ITEMID_BLACK_THING_TO_THROW, }; ///Guillotine Cross enum poison_item_list { ITEMID_PARALYSE = 12717, ITEMID_LEECHESEND, ITEMID_OBLIVIONCURSE, ITEMID_DEATHHURT, ITEMID_TOXIN, ITEMID_PYREXIA, ITEMID_MAGICMUSHROOM, ITEMID_VENOMBLEED, }; ///Spell Books enum spell_book_item_list { ITEMID_MAGIC_BOOK_FB = 6189, ITEMID_MAGIC_BOOK_CB, ITEMID_MAGIC_BOOK_LB, ITEMID_MAGIC_BOOK_SG, ITEMID_MAGIC_BOOK_LOV, ITEMID_MAGIC_BOOK_MS, ITEMID_MAGIC_BOOK_CM, ITEMID_MAGIC_BOOK_TV, ITEMID_MAGIC_BOOK_TS, ITEMID_MAGIC_BOOK_JT, ITEMID_MAGIC_BOOK_WB, ITEMID_MAGIC_BOOK_HD, ITEMID_MAGIC_BOOK_ES, ITEMID_MAGIC_BOOK_ES_, ITEMID_MAGIC_BOOK_CL, ITEMID_MAGIC_BOOK_CR, ITEMID_MAGIC_BOOK_DL, }; ///Cash Food enum cash_food_item_list { ITEMID_STR_DISH10_ = 12202, ITEMID_AGI_DISH10_, ITEMID_INT_DISH10_, ITEMID_DEX_DISH10_, ITEMID_LUK_DISH10_, ITEMID_VIT_DISH10_, }; ///Item No Use List enum item_nouse_list { NOUSE_SITTING = 0x01, }; ///Item job enum e_item_job { ITEMJ_NORMAL = 0x01, ITEMJ_UPPER = 0x02, ITEMJ_BABY = 0x04, ITEMJ_THIRD = 0x08, ITEMJ_THIRD_TRANS = 0x10, ITEMJ_THIRD_BABY = 0x20, }; enum e_item_ammo { AMMO_ARROW = 1, AMMO_THROWABLE_DAGGER, AMMO_BULLET, AMMO_SHELL, AMMO_GRENADE, AMMO_SHURIKEN, AMMO_KUNAI, AMMO_CANNONBALL, AMMO_THROWABLE_ITEM, ///Sling items MAX_AMMO_TYPE, }; #define AMMO_TYPE_ALL ((1<name #define itemdb_jname(n) itemdb_search(n)->jname #define itemdb_type(n) itemdb_search(n)->type #define itemdb_atk(n) itemdb_search(n)->atk #define itemdb_def(n) itemdb_search(n)->def #define itemdb_look(n) itemdb_search(n)->look #define itemdb_weight(n) itemdb_search(n)->weight #define itemdb_equip(n) itemdb_search(n)->equip #define itemdb_usescript(n) itemdb_search(n)->script #define itemdb_equipscript(n) itemdb_search(n)->script #define itemdb_wlv(n) itemdb_search(n)->wlv #define itemdb_range(n) itemdb_search(n)->range #define itemdb_slot(n) itemdb_search(n)->slot #define itemdb_available(n) (itemdb_search(n)->flag.available) #define itemdb_traderight(n) (itemdb_search(n)->flag.trade_restriction) #define itemdb_viewid(n) (itemdb_search(n)->view_id) #define itemdb_autoequip(n) (itemdb_search(n)->flag.autoequip) #define itemdb_is_rune(n) ((n >= ITEMID_NAUTHIZ && n <= ITEMID_HAGALAZ) || n == ITEMID_LUX_ANIMA) #define itemdb_is_element(n) (n >= ITEMID_SCARLET_PTS && n <= ITEMID_LIME_GREEN_PTS) #define itemdb_is_spellbook(n) (n >= ITEMID_MAGIC_BOOK_FB && n <= ITEMID_MAGIC_BOOK_DL) #define itemdb_is_poison(n) (n >= ITEMID_PARALYSE && n <= ITEMID_VENOMBLEED) #define itemid_isgemstone(id) ( (id) >= ITEMID_YELLOW_GEMSTONE && (id) <= ITEMID_BLUE_GEMSTONE ) #define itemdb_iscashfood(id) ( (id) >= ITEMID_STR_DISH10_ && (id) <= ITEMID_VIT_DISH10_ ) #define itemdb_is_GNbomb(n) (n >= ITEMID_APPLE_BOMB && n <= ITEMID_VERY_HARD_LUMP) #define itemdb_is_GNthrowable(n) (n >= ITEMID_MYSTERIOUS_POWDER && n <= ITEMID_BLACK_THING_TO_THROW) const char* itemdb_typename(enum item_types type); const char *itemdb_typename_ammo (enum e_item_ammo ammo); bool itemdb_is_spellbook2(unsigned short nameid); struct s_item_group_entry *itemdb_get_randgroupitem(uint16 group_id, uint8 sub_group); unsigned short itemdb_searchrandomid(uint16 group_id, uint8 sub_group); #define itemdb_value_buy(n) itemdb_search(n)->value_buy #define itemdb_value_sell(n) itemdb_search(n)->value_sell #define itemdb_canrefine(n) (!itemdb_search(n)->flag.no_refine) //Item trade restrictions [Skotlex] bool itemdb_isdropable_sub(struct item_data *itd, int gmlv, int unused); bool itemdb_cantrade_sub(struct item_data *itd, int gmlv, int gmlv2); bool itemdb_canpartnertrade_sub(struct item_data *itd, int gmlv, int gmlv2); bool itemdb_cansell_sub(struct item_data *itd, int gmlv, int unused); bool itemdb_cancartstore_sub(struct item_data *itd, int gmlv, int unused); bool itemdb_canstore_sub(struct item_data *itd, int gmlv, int unused); bool itemdb_canguildstore_sub(struct item_data *itd, int gmlv, int unused); bool itemdb_canmail_sub(struct item_data *itd, int gmlv, int unused); bool itemdb_canauction_sub(struct item_data *itd, int gmlv, int unused); bool itemdb_isrestricted(struct item* item, int gmlv, int gmlv2, bool (*func)(struct item_data*, int, int)); #define itemdb_isdropable(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_isdropable_sub) #define itemdb_cantrade(item, gmlv, gmlv2) itemdb_isrestricted(item, gmlv, gmlv2, itemdb_cantrade_sub) #define itemdb_canpartnertrade(item, gmlv, gmlv2) itemdb_isrestricted(item, gmlv, gmlv2, itemdb_canpartnertrade_sub) #define itemdb_cansell(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_cansell_sub) #define itemdb_cancartstore(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_cancartstore_sub) #define itemdb_canstore(item, gmlv) itemdb_isrestricted(item, gmlv, 0, itemdb_canstore_sub) #define itemdb_canguildstore(item, gmlv) itemdb_isrestricted(item , gmlv, 0, itemdb_canguildstore_sub) #define itemdb_canmail(item, gmlv) itemdb_isrestricted(item , gmlv, 0, itemdb_canmail_sub) #define itemdb_canauction(item, gmlv) itemdb_isrestricted(item , gmlv, 0, itemdb_canauction_sub) bool itemdb_isequip2(struct item_data *id); #define itemdb_isequip(nameid) itemdb_isequip2(itemdb_search(nameid)) char itemdb_isidentified(unsigned short nameid); bool itemdb_isstackable2(struct item_data *id); #define itemdb_isstackable(nameid) itemdb_isstackable2(itemdb_search(nameid)) bool itemdb_isNoEquip(struct item_data *id, uint16 m); struct item_combo *itemdb_combo_exists(unsigned short combo_id); struct s_item_group_db *itemdb_group_exists(unsigned short group_id); char itemdb_pc_get_itemgroup(uint16 group_id, struct map_session_data *sd); uint16 itemdb_get_randgroupitem_count(uint16 group_id, uint8 sub_group, unsigned short nameid); bool itemdb_parse_roulette_db(void); void itemdb_reload(void); void do_final_itemdb(void); void do_init_itemdb(void); #endif /* _ITEMDB_H_ */