You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

553 lines
14 KiB

/**
* @file itemdat.h
*
* Interface of all item data.
*/
#ifndef __ITEMDAT_H__
#define __ITEMDAT_H__
DEVILUTION_BEGIN_NAMESPACE
#ifdef __cplusplus
extern "C" {
#endif
typedef enum item_drop_rate {
IDROP_NEVER,
IDROP_REGULAR,
IDROP_DOUBLE,
} item_drop_rate;
typedef enum item_class {
ICLASS_NONE,
ICLASS_WEAPON,
ICLASS_ARMOR,
ICLASS_MISC,
ICLASS_GOLD,
ICLASS_QUEST,
} item_class;
typedef enum item_equip_type {
ILOC_NONE,
ILOC_ONEHAND,
ILOC_TWOHAND,
ILOC_ARMOR,
ILOC_HELM,
ILOC_RING,
ILOC_AMULET,
ILOC_UNEQUIPABLE,
ILOC_BELT,
ILOC_INVALID = -1,
} item_equip_type;
/// Item graphic IDs; frame_num-11 of objcurs.cel.
typedef enum item_cursor_graphic {
// 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_WAR_BOW = 119,
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
} item_cursor_graphic;
typedef enum item_type {
ITYPE_MISC,
ITYPE_SWORD,
ITYPE_AXE,
ITYPE_BOW,
ITYPE_MACE,
ITYPE_SHIELD,
ITYPE_LARMOR,
ITYPE_HELM,
ITYPE_MARMOR,
ITYPE_HARMOR,
ITYPE_STAFF,
ITYPE_GOLD,
ITYPE_RING,
ITYPE_AMULET,
ITYPE_NONE = -1,
} item_type;
typedef enum unique_base_item {
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,
} unique_base_item;
typedef enum item_special_effect {
// clang-format off
ISPL_NONE = 0x00000000,
ISPL_INFRAVISION = 0x00000001,
ISPL_RNDSTEALLIFE = 0x00000002,
ISPL_RNDARROWVEL = 0x00000004,
ISPL_FIRE_ARROWS = 0x00000008,
ISPL_FIREDAM = 0x00000010,
ISPL_LIGHTDAM = 0x00000020,
ISPL_DRAINLIFE = 0x00000040,
ISPL_UNKNOWN_1 = 0x00000080,
ISPL_NOHEALPLR = 0x00000100,
ISPL_MULT_ARROWS = 0x00000200,
ISPL_UNKNOWN_3 = 0x00000400,
ISPL_KNOCKBACK = 0x00000800,
ISPL_NOHEALMON = 0x00001000,
ISPL_STEALMANA_3 = 0x00002000,
ISPL_STEALMANA_5 = 0x00004000,
ISPL_STEALLIFE_3 = 0x00008000,
ISPL_STEALLIFE_5 = 0x00010000,
ISPL_QUICKATTACK = 0x00020000,
ISPL_FASTATTACK = 0x00040000,
ISPL_FASTERATTACK = 0x00080000,
ISPL_FASTESTATTACK = 0x00100000,
ISPL_FASTRECOVER = 0x00200000,
ISPL_FASTERRECOVER = 0x00400000,
ISPL_FASTESTRECOVER = 0x00800000,
ISPL_FASTBLOCK = 0x01000000,
ISPL_LIGHT_ARROWS = 0x02000000,
ISPL_THORNS = 0x04000000,
ISPL_NOMANA = 0x08000000,
ISPL_ABSHALFTRAP = 0x10000000,
ISPL_UNKNOWN_4 = 0x20000000,
ISPL_3XDAMVDEM = 0x40000000,
ISPL_ALLRESZERO = 0x80000000,
// clang-format on
} item_special_effect;
typedef enum item_misc_id {
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,
} item_misc_id;
typedef struct ItemDataStruct {
enum item_drop_rate iRnd;
enum item_class iClass;
enum item_equip_type iLoc;
enum item_cursor_graphic iCurs;
enum item_type itype;
enum unique_base_item iItemId;
const char *iName;
const char *iSName;
Sint8 iMinMLvl;
Sint32 iDurability;
Sint32 iMinDam;
Sint32 iMaxDam;
Sint32 iMinAC;
Sint32 iMaxAC;
Sint8 iMinStr;
Sint8 iMinMag;
Sint8 iMinDex;
Sint32 iFlags; // item_special_effect as bit flags
enum item_misc_id iMiscId;
enum spell_id iSpell;
BOOL iUsable;
Sint32 iValue;
Sint32 iMaxValue;
} ItemDataStruct;
typedef enum item_effect_type {
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,
IPL_0x30, // Unknown
IPL_0x31, // Unknown
IPL_FIREBALL, /* only used in hellfire */
IPL_0x33, // Unknown
IPL_ABSHALFTRAP,
IPL_KNOCKBACK,
IPL_NOHEALMON,
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,
IPL_ONEHAND,
IPL_3XDAMVDEM,
IPL_ALLRESZERO,
IPL_0x47, // Unknown
IPL_DRAINLIFE,
IPL_RNDSTEALLIFE,
IPL_INFRAVISION,
IPL_SETAC,
IPL_ADDACLIFE,
IPL_ADDMANAAC,
IPL_FIRERESCLVL,
IPL_AC_CURSE,
IDI_LASTDIABLO = IPL_AC_CURSE,
IPL_FIRERES_CURSE,
IPL_LIGHTRES_CURSE,
IPL_MAGICRES_CURSE,
IPL_ALLRES_CURSE,
IPL_DEVASTATION,
IPL_DECAY,
IPL_PERIL,
IPL_JESTERS,
IPL_CRYSTALLINE,
IPL_DOPPELGANGER,
IPL_ACDEMON,
IPL_ACUNDEAD,
IPL_MANATOLIFE,
IPL_LIFETOMANA,
IPL_INVALID = -1,
} item_effect_type;
typedef enum goodorevil {
GOE_ANY,
GOE_EVIL,
GOE_GOOD,
} goodorevil;
typedef enum affix_item_type {
// clang-format off
PLT_MISC = 0x000001,
PLT_BOW = 0x000010,
PLT_STAFF = 0x000100,
PLT_WEAP = 0x001000,
PLT_SHLD = 0x010000,
PLT_ARMO = 0x100000,
// clang-format on
} affix_item_type;
typedef struct PLStruct {
const char *PLName;
enum item_effect_type PLPower;
Sint32 PLParam1;
Sint32 PLParam2;
Sint8 PLMinLvl;
Sint32 PLIType; // affix_item_type as bit flags
enum goodorevil PLGOE;
bool PLDouble;
bool PLOk;
Sint32 PLMinVal;
Sint32 PLMaxVal;
Sint32 PLMultVal;
} PLStruct;
typedef struct UItemStruct {
const char *UIName;
enum unique_base_item UIItemId;
Sint8 UIMinLvl;
Sint8 UINumPL;
Sint32 UIValue;
enum item_effect_type UIPower1;
Sint32 UIParam1;
Sint32 UIParam2;
enum item_effect_type UIPower2;
Sint32 UIParam3;
Sint32 UIParam4;
enum item_effect_type UIPower3;
Sint32 UIParam5;
Sint32 UIParam6;
enum item_effect_type UIPower4;
Sint32 UIParam7;
Sint32 UIParam8;
enum item_effect_type UIPower5;
Sint32 UIParam9;
Sint32 UIParam10;
enum item_effect_type UIPower6;
Sint32 UIParam11;
Sint32 UIParam12;
} UItemStruct;
extern ItemDataStruct AllItemsList[];
extern const PLStruct PL_Prefix[];
extern const PLStruct PL_Suffix[];
extern const UItemStruct UniqueItemList[];
#ifdef __cplusplus
}
#endif
DEVILUTION_END_NAMESPACE
#endif /* __ITEMDAT_H__ */