/** * @file itemdat.h * * Interface of all item data. */ #pragma once #include #include "objdat.h" #include "spelldat.h" #include "utils/stdcompat/string_view.hpp" namespace devilution { /** @todo add missing values and apply */ enum _item_indexes : int16_t { // TODO defines all indexes in AllItemsList IDI_GOLD, IDI_WARRIOR, IDI_WARRSHLD, IDI_WARRCLUB, IDI_ROGUE, IDI_SORCERER, IDI_CLEAVER, IDI_FIRSTQUEST = IDI_CLEAVER, IDI_SKCROWN, IDI_INFRARING, IDI_ROCK, IDI_OPTAMULET, IDI_TRING, IDI_BANNER, IDI_HARCREST, IDI_STEELVEIL, IDI_GLDNELIX, IDI_ANVIL, IDI_MUSHROOM, IDI_BRAIN, IDI_FUNGALTM, IDI_SPECELIX, IDI_BLDSTONE, IDI_MAPOFDOOM, IDI_LASTQUEST = IDI_MAPOFDOOM, IDI_EAR, IDI_HEAL, IDI_MANA, IDI_IDENTIFY, IDI_PORTAL, IDI_ARMOFVAL, IDI_FULLHEAL, IDI_FULLMANA, IDI_GRISWOLD, IDI_LGTFORGE, IDI_LAZSTAFF, IDI_RESURRECT, IDI_OIL, IDI_SHORTSTAFF, IDI_BARDSWORD, IDI_BARDDAGGER, IDI_RUNEBOMB, IDI_THEODORE, IDI_AURIC, IDI_NOTE1, IDI_NOTE2, IDI_NOTE3, IDI_FULLNOTE, IDI_BROWNSUIT, IDI_GREYSUIT, IDI_SORCERER_DIABLO = 166, IDI_LAST = IDI_SORCERER_DIABLO, IDI_NONE = -1, }; enum item_drop_rate : uint8_t { IDROP_NEVER, IDROP_REGULAR, IDROP_DOUBLE, }; enum item_class : uint8_t { ICLASS_NONE, ICLASS_WEAPON, ICLASS_ARMOR, ICLASS_MISC, ICLASS_GOLD, ICLASS_QUEST, }; enum item_equip_type : int8_t { ILOC_NONE, ILOC_ONEHAND, ILOC_TWOHAND, ILOC_ARMOR, ILOC_HELM, ILOC_RING, ILOC_AMULET, ILOC_UNEQUIPABLE, ILOC_BELT, ILOC_INVALID = -1, }; /// Item graphic IDs; frame_num-11 of objcurs.cel. enum item_cursor_graphic : uint8_t { // clang-format off ICURS_POTION_OF_FULL_MANA = 0, ICURS_SCROLL_OF = 1, ICURS_GOLD_SMALL = 4, ICURS_GOLD_MEDIUM = 5, ICURS_GOLD_LARGE = 6, ICURS_RING_OF_TRUTH = 10, ICURS_RING = 12, ICURS_SPECTRAL_ELIXIR = 15, ICURS_GOLDEN_ELIXIR = 17, ICURS_EMPYREAN_BAND = 18, ICURS_EAR_SORCERER = 19, ICURS_EAR_WARRIOR = 20, ICURS_EAR_ROGUE = 21, ICURS_BLOOD_STONE = 25, ICURS_OIL = 30, ICURS_ELIXIR_OF_VITALITY = 31, ICURS_POTION_OF_HEALING = 32, ICURS_POTION_OF_FULL_REJUVENATION = 33, ICURS_ELIXIR_OF_MAGIC = 34, ICURS_POTION_OF_FULL_HEALING = 35, ICURS_ELIXIR_OF_DEXTERITY = 36, ICURS_POTION_OF_REJUVENATION = 37, ICURS_ELIXIR_OF_STRENGTH = 38, ICURS_POTION_OF_MANA = 39, ICURS_BRAIN = 40, ICURS_OPTIC_AMULET = 44, ICURS_AMULET = 45, ICURS_DAGGER = 51, ICURS_BLADE = 56, ICURS_BASTARD_SWORD = 57, ICURS_MACE = 59, ICURS_LONG_SWORD = 60, ICURS_BROAD_SWORD = 61, ICURS_FALCHION = 62, ICURS_MORNING_STAR = 63, ICURS_SHORT_SWORD = 64, ICURS_CLAYMORE = 65, ICURS_CLUB = 66, ICURS_SABRE = 67, ICURS_SPIKED_CLUB = 70, ICURS_SCIMITAR = 72, ICURS_FULL_HELM = 75, ICURS_MAGIC_ROCK = 76, ICURS_THE_UNDEAD_CROWN = 78, ICURS_HELM = 82, ICURS_BUCKLER = 83, ICURS_VIEL_OF_STEEL = 85, ICURS_BOOK_GREY = 86, ICURS_BOOK_RED = 87, ICURS_BOOK_BLUE = 88, ICURS_BLACK_MUSHROOM = 89, ICURS_SKULL_CAP = 90, ICURS_CAP = 91, ICURS_HARLEQUIN_CREST = 93, ICURS_CROWN = 95, ICURS_MAP_OF_THE_STARS = 96, ICURS_FUNGAL_TOME = 97, ICURS_GREAT_HELM = 98, ICURS_BATTLE_AXE = 101, ICURS_HUNTERS_BOW = 102, ICURS_FIELD_PLATE = 103, ICURS_SMALL_SHIELD = 105, ICURS_CLEAVER = 106, ICURS_STUDDED_LEATHER_ARMOR = 107, ICURS_SHORT_STAFF = 109, ICURS_TWO_HANDED_SWORD = 110, ICURS_CHAIN_MAIL = 111, ICURS_SMALL_AXE = 112, ICURS_KITE_SHIELD = 113, ICURS_SCALE_MAIL = 114, ICURS_SHORT_BOW = 118, ICURS_LONG_BATTLE_BOW = 119, ICURS_LONG_WAR_BOW = 120, ICURS_WAR_HAMMER = 121, ICURS_MAUL = 122, ICURS_LONG_STAFF = 123, ICURS_WAR_STAFF = 124, ICURS_TAVERN_SIGN = 126, ICURS_HARD_LEATHER_ARMOR = 127, ICURS_RAGS = 128, ICURS_QUILTED_ARMOR = 129, ICURS_FLAIL = 131, ICURS_TOWER_SHIELD = 132, ICURS_COMPOSITE_BOW = 133, ICURS_GREAT_SWORD = 134, ICURS_LEATHER_ARMOR = 135, ICURS_SPLINT_MAIL = 136, ICURS_ROBE = 137, ICURS_ANVIL_OF_FURY = 140, ICURS_BROAD_AXE = 141, ICURS_LARGE_AXE = 142, ICURS_GREAT_AXE = 143, ICURS_AXE = 144, ICURS_LARGE_SHIELD = 147, ICURS_GOTHIC_SHIELD = 148, ICURS_CLOAK = 149, ICURS_CAPE = 150, ICURS_FULL_PLATE_MAIL = 151, ICURS_GOTHIC_PLATE = 152, ICURS_BREAST_PLATE = 153, ICURS_RING_MAIL = 154, ICURS_STAFF_OF_LAZARUS = 155, ICURS_ARKAINES_VALOR = 157, ICURS_SHORT_WAR_BOW = 165, ICURS_COMPOSITE_STAFF = 166, ICURS_SHORT_BATTLE_BOW = 167, ICURS_GOLD = 168, ICURS_AURIC_AMULET = 180, ICURS_RUNE_BOMB = 187, ICURS_THEODORE = 188, ICURS_TORN_NOTE_1 = 189, ICURS_TORN_NOTE_2 = 190, ICURS_TORN_NOTE_3 = 191, ICURS_RECONSTRUCTED_NOTE = 192, ICURS_RUNE_OF_FIRE = 193, ICURS_GREATER_RUNE_OF_FIRE = 194, ICURS_RUNE_OF_LIGHTNING = 195, ICURS_GREATER_RUNE_OF_LIGHTNING = 196, ICURS_RUNE_OF_STONE = 197, ICURS_GREY_SUIT = 198, ICURS_BROWN_SUIT = 199, ICURS_BOVINE = 226, // clang-format on }; enum class ItemType : int8_t { Misc, Sword, Axe, Bow, Mace, Shield, LightArmor, Helm, MediumArmor, HeavyArmor, Staff, Gold, Ring, Amulet, None = -1, }; string_view ItemTypeToString(ItemType itemType); enum unique_base_item : int8_t { UITYPE_NONE, UITYPE_SHORTBOW, UITYPE_LONGBOW, UITYPE_HUNTBOW, UITYPE_COMPBOW, UITYPE_WARBOW, UITYPE_BATTLEBOW, UITYPE_DAGGER, UITYPE_FALCHION, UITYPE_CLAYMORE, UITYPE_BROADSWR, UITYPE_SABRE, UITYPE_SCIMITAR, UITYPE_LONGSWR, UITYPE_BASTARDSWR, UITYPE_TWOHANDSWR, UITYPE_GREATSWR, UITYPE_CLEAVER, UITYPE_LARGEAXE, UITYPE_BROADAXE, UITYPE_SMALLAXE, UITYPE_BATTLEAXE, UITYPE_GREATAXE, UITYPE_MACE, UITYPE_MORNSTAR, UITYPE_SPIKCLUB, UITYPE_MAUL, UITYPE_WARHAMMER, UITYPE_FLAIL, UITYPE_LONGSTAFF, UITYPE_SHORTSTAFF, UITYPE_COMPSTAFF, UITYPE_QUARSTAFF, UITYPE_WARSTAFF, UITYPE_SKULLCAP, UITYPE_HELM, UITYPE_GREATHELM, UITYPE_CROWN, UITYPE_38, UITYPE_RAGS, UITYPE_STUDARMOR, UITYPE_CLOAK, UITYPE_ROBE, UITYPE_CHAINMAIL, UITYPE_LEATHARMOR, UITYPE_BREASTPLATE, UITYPE_CAPE, UITYPE_PLATEMAIL, UITYPE_FULLPLATE, UITYPE_BUCKLER, UITYPE_SMALLSHIELD, UITYPE_LARGESHIELD, UITYPE_KITESHIELD, UITYPE_GOTHSHIELD, UITYPE_RING, UITYPE_55, UITYPE_AMULET, UITYPE_SKCROWN, UITYPE_INFRARING, UITYPE_OPTAMULET, UITYPE_TRING, UITYPE_HARCREST, UITYPE_MAPOFDOOM, UITYPE_ELIXIR, UITYPE_ARMOFVAL, UITYPE_STEELVEIL, UITYPE_GRISWOLD, UITYPE_LGTFORGE, UITYPE_LAZSTAFF, UITYPE_BOVINE, UITYPE_INVALID = -1, }; enum item_special_effect { // clang-format off ISPL_NONE = 0, ISPL_INFRAVISION = 1 << 0, ISPL_RNDSTEALLIFE = 1 << 1, ISPL_RNDARROWVEL = 1 << 2, ISPL_FIRE_ARROWS = 1 << 3, ISPL_FIREDAM = 1 << 4, ISPL_LIGHTDAM = 1 << 5, ISPL_DRAINLIFE = 1 << 6, ISPL_UNKNOWN_1 = 1 << 7, ISPL_NOHEALPLR = 1 << 8, ISPL_MULT_ARROWS = 1 << 9, ISPL_UNKNOWN_3 = 1 << 10, ISPL_KNOCKBACK = 1 << 11, ISPL_NOHEALMON = 1 << 12, ISPL_STEALMANA_3 = 1 << 13, ISPL_STEALMANA_5 = 1 << 14, ISPL_STEALLIFE_3 = 1 << 15, ISPL_STEALLIFE_5 = 1 << 16, ISPL_QUICKATTACK = 1 << 17, ISPL_FASTATTACK = 1 << 18, ISPL_FASTERATTACK = 1 << 19, ISPL_FASTESTATTACK = 1 << 20, ISPL_FASTRECOVER = 1 << 21, ISPL_FASTERRECOVER = 1 << 22, ISPL_FASTESTRECOVER = 1 << 23, ISPL_FASTBLOCK = 1 << 24, ISPL_LIGHT_ARROWS = 1 << 25, ISPL_THORNS = 1 << 26, ISPL_NOMANA = 1 << 27, ISPL_ABSHALFTRAP = 1 << 28, ISPL_UNKNOWN_4 = 1 << 29, ISPL_3XDAMVDEM = 1 << 30, ISPL_ALLRESZERO = 1 << 31, // clang-format on }; typedef enum item_special_effect_hf { // clang-format off ISPLHF_DEVASTATION = 1 << 0, ISPLHF_DECAY = 1 << 1, ISPLHF_PERIL = 1 << 2, ISPLHF_JESTERS = 1 << 3, ISPLHF_DOPPELGANGER = 1 << 4, ISPLHF_ACDEMON = 1 << 5, ISPLHF_ACUNDEAD = 1 << 6, // clang-format on } item_special_effect_hf; enum item_misc_id : int8_t { IMISC_NONE, IMISC_USEFIRST, IMISC_FULLHEAL, IMISC_HEAL, IMISC_OLDHEAL, IMISC_DEADHEAL, IMISC_MANA, IMISC_FULLMANA, IMISC_POTEXP, /* add experience */ IMISC_POTFORG, /* remove experience */ IMISC_ELIXSTR, IMISC_ELIXMAG, IMISC_ELIXDEX, IMISC_ELIXVIT, IMISC_ELIXWEAK, /* double check with alpha */ IMISC_ELIXDIS, IMISC_ELIXCLUM, IMISC_ELIXSICK, IMISC_REJUV, IMISC_FULLREJUV, IMISC_USELAST, IMISC_SCROLL, IMISC_SCROLLT, IMISC_STAFF, IMISC_BOOK, IMISC_RING, IMISC_AMULET, IMISC_UNIQUE, IMISC_FOOD, /* from demo/PSX */ IMISC_OILFIRST, IMISC_OILOF, /* oils are beta or hellfire only */ IMISC_OILACC, IMISC_OILMAST, IMISC_OILSHARP, IMISC_OILDEATH, IMISC_OILSKILL, IMISC_OILBSMTH, IMISC_OILFORT, IMISC_OILPERM, IMISC_OILHARD, IMISC_OILIMP, IMISC_OILLAST, IMISC_MAPOFDOOM, IMISC_EAR, IMISC_SPECELIX, IMISC_0x2D, // Unknown IMISC_RUNEFIRST, IMISC_RUNEF, IMISC_RUNEL, IMISC_GR_RUNEL, IMISC_GR_RUNEF, IMISC_RUNES, IMISC_RUNELAST, IMISC_AURIC, IMISC_NOTE, IMISC_INVALID = -1, }; struct ItemData { enum item_drop_rate iRnd; enum item_class iClass; enum item_equip_type iLoc; enum item_cursor_graphic iCurs; enum ItemType itype; enum unique_base_item iItemId; const char *iName; const char *iSName; uint8_t iMinMLvl; uint8_t iDurability; uint8_t iMinDam; uint8_t iMaxDam; uint8_t iMinAC; uint8_t iMaxAC; uint8_t iMinStr; uint8_t iMinMag; uint8_t iMinDex; uint32_t iFlags; // item_special_effect as bit flags enum item_misc_id iMiscId; enum spell_id iSpell; bool iUsable; uint16_t iValue; }; enum item_effect_type : int8_t { IPL_TOHIT, IPL_TOHIT_CURSE, IPL_DAMP, IPL_DAMP_CURSE, IPL_TOHIT_DAMP, IPL_TOHIT_DAMP_CURSE, IPL_ACP, IPL_ACP_CURSE, IPL_FIRERES, IPL_LIGHTRES, IPL_MAGICRES, IPL_ALLRES, IPL_SPLCOST, /* only used in beta */ IPL_SPLDUR, /* only used in beta */ IPL_SPLLVLADD, IPL_CHARGES, IPL_FIREDAM, IPL_LIGHTDAM, IPL_0x12, // Unknown IPL_STR, IPL_STR_CURSE, IPL_MAG, IPL_MAG_CURSE, IPL_DEX, IPL_DEX_CURSE, IPL_VIT, IPL_VIT_CURSE, IPL_ATTRIBS, IPL_ATTRIBS_CURSE, IPL_GETHIT_CURSE, IPL_GETHIT, IPL_LIFE, IPL_LIFE_CURSE, IPL_MANA, IPL_MANA_CURSE, IPL_DUR, IPL_DUR_CURSE, IPL_INDESTRUCTIBLE, IPL_LIGHT, IPL_LIGHT_CURSE, IPL_0x28, // Unknown IPL_MULT_ARROWS, /* only used in hellfire */ IPL_FIRE_ARROWS, IPL_LIGHT_ARROWS, IPL_INVCURS, IPL_THORNS, IPL_NOMANA, IPL_NOHEALPLR, // unused IPL_0x30, // Unknown IPL_0x31, // Unknown IPL_FIREBALL, /* only used in hellfire */ IPL_0x33, // Unknown IPL_ABSHALFTRAP, IPL_KNOCKBACK, IPL_NOHEALMON, // unused IPL_STEALMANA, IPL_STEALLIFE, IPL_TARGAC, IPL_FASTATTACK, IPL_FASTRECOVER, IPL_FASTBLOCK, IPL_DAMMOD, IPL_RNDARROWVEL, IPL_SETDAM, IPL_SETDUR, IPL_NOMINSTR, IPL_SPELL, IPL_FASTSWING, // unused IPL_ONEHAND, IPL_3XDAMVDEM, IPL_ALLRESZERO, IPL_0x47, // Unknown IPL_DRAINLIFE, IPL_RNDSTEALLIFE, IPL_INFRAVISION, // unused IPL_SETAC, IPL_ADDACLIFE, IPL_ADDMANAAC, IPL_FIRERESCLVL, // unused IPL_AC_CURSE, IPL_LASTDIABLO = IPL_AC_CURSE, IPL_FIRERES_CURSE, IPL_LIGHTRES_CURSE, IPL_MAGICRES_CURSE, IPL_ALLRES_CURSE, // unused IPL_DEVASTATION, IPL_DECAY, IPL_PERIL, IPL_JESTERS, IPL_CRYSTALLINE, IPL_DOPPELGANGER, IPL_ACDEMON, IPL_ACUNDEAD, IPL_MANATOLIFE, IPL_LIFETOMANA, IPL_INVALID = -1, }; enum goodorevil : uint8_t { GOE_ANY, GOE_EVIL, GOE_GOOD, }; enum class AffixItemType : uint8_t { // clang-format off None = 0, Misc = 1 << 0, Bow = 1 << 1, Staff = 1 << 2, Weapon = 1 << 3, Shield = 1 << 4, Armor = 1 << 5, // clang-format on }; use_enum_as_flags(AffixItemType); struct ItemPower { item_effect_type type; int param1; int param2; }; struct PLStruct { const char *PLName; ItemPower power; int8_t PLMinLvl; AffixItemType PLIType; // AffixItemType as bit flags enum goodorevil PLGOE; bool PLDouble; bool PLOk; int minVal; int maxVal; int multVal; }; struct UniqueItem { const char *UIName; enum unique_base_item UIItemId; int8_t UIMinLvl; uint8_t UINumPL; int UIValue; ItemPower powers[6]; }; extern ItemData AllItemsList[]; extern const PLStruct ItemPrefixes[]; extern const PLStruct ItemSuffixes[]; extern const UniqueItem UniqueItems[]; } // namespace devilution