1 /** 2 * @file itemdat.h 3 * 4 * Interface of all item data. 5 */ 6 #ifndef __ITEMDAT_H__ 7 #define __ITEMDAT_H__ 8 9 DEVILUTION_BEGIN_NAMESPACE 10 11 #ifdef __cplusplus 12 extern "C" { 13 #endif 14 15 typedef enum item_drop_rate { 16 IDROP_NEVER, 17 IDROP_REGULAR, 18 IDROP_DOUBLE, 19 } item_drop_rate; 20 21 typedef enum item_class { 22 ICLASS_NONE, 23 ICLASS_WEAPON, 24 ICLASS_ARMOR, 25 ICLASS_MISC, 26 ICLASS_GOLD, 27 ICLASS_QUEST, 28 } item_class; 29 30 typedef enum item_equip_type { 31 ILOC_NONE, 32 ILOC_ONEHAND, 33 ILOC_TWOHAND, 34 ILOC_ARMOR, 35 ILOC_HELM, 36 ILOC_RING, 37 ILOC_AMULET, 38 ILOC_UNEQUIPABLE, 39 ILOC_BELT, 40 ILOC_INVALID = -1, 41 } item_equip_type; 42 43 /// Item graphic IDs; frame_num-11 of objcurs.cel. 44 typedef enum item_cursor_graphic { 45 // clang-format off 46 ICURS_POTION_OF_FULL_MANA = 0, 47 ICURS_SCROLL_OF = 1, 48 ICURS_GOLD_SMALL = 4, 49 ICURS_GOLD_MEDIUM = 5, 50 ICURS_GOLD_LARGE = 6, 51 ICURS_RING_OF_TRUTH = 10, 52 ICURS_RING = 12, 53 ICURS_SPECTRAL_ELIXIR = 15, 54 ICURS_GOLDEN_ELIXIR = 17, 55 ICURS_EMPYREAN_BAND = 18, 56 ICURS_EAR_SORCERER = 19, 57 ICURS_EAR_WARRIOR = 20, 58 ICURS_EAR_ROGUE = 21, 59 ICURS_BLOOD_STONE = 25, 60 ICURS_OIL = 30, 61 ICURS_ELIXIR_OF_VITALITY = 31, 62 ICURS_POTION_OF_HEALING = 32, 63 ICURS_POTION_OF_FULL_REJUVENATION = 33, 64 ICURS_ELIXIR_OF_MAGIC = 34, 65 ICURS_POTION_OF_FULL_HEALING = 35, 66 ICURS_ELIXIR_OF_DEXTERITY = 36, 67 ICURS_POTION_OF_REJUVENATION = 37, 68 ICURS_ELIXIR_OF_STRENGTH = 38, 69 ICURS_POTION_OF_MANA = 39, 70 ICURS_BRAIN = 40, 71 ICURS_OPTIC_AMULET = 44, 72 ICURS_AMULET = 45, 73 ICURS_DAGGER = 51, 74 ICURS_BLADE = 56, 75 ICURS_BASTARD_SWORD = 57, 76 ICURS_MACE = 59, 77 ICURS_LONG_SWORD = 60, 78 ICURS_BROAD_SWORD = 61, 79 ICURS_FALCHION = 62, 80 ICURS_MORNING_STAR = 63, 81 ICURS_SHORT_SWORD = 64, 82 ICURS_CLAYMORE = 65, 83 ICURS_CLUB = 66, 84 ICURS_SABRE = 67, 85 ICURS_SPIKED_CLUB = 70, 86 ICURS_SCIMITAR = 72, 87 ICURS_FULL_HELM = 75, 88 ICURS_MAGIC_ROCK = 76, 89 ICURS_THE_UNDEAD_CROWN = 78, 90 ICURS_HELM = 82, 91 ICURS_BUCKLER = 83, 92 ICURS_VIEL_OF_STEEL = 85, 93 ICURS_BOOK_GREY = 86, 94 ICURS_BOOK_RED = 87, 95 ICURS_BOOK_BLUE = 88, 96 ICURS_BLACK_MUSHROOM = 89, 97 ICURS_SKULL_CAP = 90, 98 ICURS_CAP = 91, 99 ICURS_HARLEQUIN_CREST = 93, 100 ICURS_CROWN = 95, 101 ICURS_MAP_OF_THE_STARS = 96, 102 ICURS_FUNGAL_TOME = 97, 103 ICURS_GREAT_HELM = 98, 104 ICURS_BATTLE_AXE = 101, 105 ICURS_HUNTERS_BOW = 102, 106 ICURS_FIELD_PLATE = 103, 107 ICURS_SMALL_SHIELD = 105, 108 ICURS_CLEAVER = 106, 109 ICURS_STUDDED_LEATHER_ARMOR = 107, 110 ICURS_SHORT_STAFF = 109, 111 ICURS_TWO_HANDED_SWORD = 110, 112 ICURS_CHAIN_MAIL = 111, 113 ICURS_SMALL_AXE = 112, 114 ICURS_KITE_SHIELD = 113, 115 ICURS_SCALE_MAIL = 114, 116 ICURS_SHORT_BOW = 118, 117 ICURS_LONG_WAR_BOW = 119, 118 ICURS_WAR_HAMMER = 121, 119 ICURS_MAUL = 122, 120 ICURS_LONG_STAFF = 123, 121 ICURS_WAR_STAFF = 124, 122 ICURS_TAVERN_SIGN = 126, 123 ICURS_HARD_LEATHER_ARMOR = 127, 124 ICURS_RAGS = 128, 125 ICURS_QUILTED_ARMOR = 129, 126 ICURS_FLAIL = 131, 127 ICURS_TOWER_SHIELD = 132, 128 ICURS_COMPOSITE_BOW = 133, 129 ICURS_GREAT_SWORD = 134, 130 ICURS_LEATHER_ARMOR = 135, 131 ICURS_SPLINT_MAIL = 136, 132 ICURS_ROBE = 137, 133 ICURS_ANVIL_OF_FURY = 140, 134 ICURS_BROAD_AXE = 141, 135 ICURS_LARGE_AXE = 142, 136 ICURS_GREAT_AXE = 143, 137 ICURS_AXE = 144, 138 ICURS_LARGE_SHIELD = 147, 139 ICURS_GOTHIC_SHIELD = 148, 140 ICURS_CLOAK = 149, 141 ICURS_CAPE = 150, 142 ICURS_FULL_PLATE_MAIL = 151, 143 ICURS_GOTHIC_PLATE = 152, 144 ICURS_BREAST_PLATE = 153, 145 ICURS_RING_MAIL = 154, 146 ICURS_STAFF_OF_LAZARUS = 155, 147 ICURS_ARKAINES_VALOR = 157, 148 ICURS_SHORT_WAR_BOW = 165, 149 ICURS_COMPOSITE_STAFF = 166, 150 ICURS_SHORT_BATTLE_BOW = 167, 151 ICURS_GOLD = 168, 152 ICURS_AURIC_AMULET = 180, 153 ICURS_RUNE_BOMB = 187, 154 ICURS_THEODORE = 188, 155 ICURS_TORN_NOTE_1 = 189, 156 ICURS_TORN_NOTE_2 = 190, 157 ICURS_TORN_NOTE_3 = 191, 158 ICURS_RECONSTRUCTED_NOTE = 192, 159 ICURS_RUNE_OF_FIRE = 193, 160 ICURS_GREATER_RUNE_OF_FIRE = 194, 161 ICURS_RUNE_OF_LIGHTNING = 195, 162 ICURS_GREATER_RUNE_OF_LIGHTNING = 196, 163 ICURS_RUNE_OF_STONE = 197, 164 ICURS_GREY_SUIT = 198, 165 ICURS_BROWN_SUIT = 199, 166 ICURS_BOVINE = 226, 167 // clang-format on 168 } item_cursor_graphic; 169 170 typedef enum item_type { 171 ITYPE_MISC, 172 ITYPE_SWORD, 173 ITYPE_AXE, 174 ITYPE_BOW, 175 ITYPE_MACE, 176 ITYPE_SHIELD, 177 ITYPE_LARMOR, 178 ITYPE_HELM, 179 ITYPE_MARMOR, 180 ITYPE_HARMOR, 181 ITYPE_STAFF, 182 ITYPE_GOLD, 183 ITYPE_RING, 184 ITYPE_AMULET, 185 ITYPE_NONE = -1, 186 } item_type; 187 188 typedef enum unique_base_item { 189 UITYPE_NONE, 190 UITYPE_SHORTBOW, 191 UITYPE_LONGBOW, 192 UITYPE_HUNTBOW, 193 UITYPE_COMPBOW, 194 UITYPE_WARBOW, 195 UITYPE_BATTLEBOW, 196 UITYPE_DAGGER, 197 UITYPE_FALCHION, 198 UITYPE_CLAYMORE, 199 UITYPE_BROADSWR, 200 UITYPE_SABRE, 201 UITYPE_SCIMITAR, 202 UITYPE_LONGSWR, 203 UITYPE_BASTARDSWR, 204 UITYPE_TWOHANDSWR, 205 UITYPE_GREATSWR, 206 UITYPE_CLEAVER, 207 UITYPE_LARGEAXE, 208 UITYPE_BROADAXE, 209 UITYPE_SMALLAXE, 210 UITYPE_BATTLEAXE, 211 UITYPE_GREATAXE, 212 UITYPE_MACE, 213 UITYPE_MORNSTAR, 214 UITYPE_SPIKCLUB, 215 UITYPE_MAUL, 216 UITYPE_WARHAMMER, 217 UITYPE_FLAIL, 218 UITYPE_LONGSTAFF, 219 UITYPE_SHORTSTAFF, 220 UITYPE_COMPSTAFF, 221 UITYPE_QUARSTAFF, 222 UITYPE_WARSTAFF, 223 UITYPE_SKULLCAP, 224 UITYPE_HELM, 225 UITYPE_GREATHELM, 226 UITYPE_CROWN, 227 UITYPE_38, 228 UITYPE_RAGS, 229 UITYPE_STUDARMOR, 230 UITYPE_CLOAK, 231 UITYPE_ROBE, 232 UITYPE_CHAINMAIL, 233 UITYPE_LEATHARMOR, 234 UITYPE_BREASTPLATE, 235 UITYPE_CAPE, 236 UITYPE_PLATEMAIL, 237 UITYPE_FULLPLATE, 238 UITYPE_BUCKLER, 239 UITYPE_SMALLSHIELD, 240 UITYPE_LARGESHIELD, 241 UITYPE_KITESHIELD, 242 UITYPE_GOTHSHIELD, 243 UITYPE_RING, 244 UITYPE_55, 245 UITYPE_AMULET, 246 UITYPE_SKCROWN, 247 UITYPE_INFRARING, 248 UITYPE_OPTAMULET, 249 UITYPE_TRING, 250 UITYPE_HARCREST, 251 UITYPE_MAPOFDOOM, 252 UITYPE_ELIXIR, 253 UITYPE_ARMOFVAL, 254 UITYPE_STEELVEIL, 255 UITYPE_GRISWOLD, 256 UITYPE_LGTFORGE, 257 UITYPE_LAZSTAFF, 258 UITYPE_BOVINE, 259 UITYPE_INVALID = -1, 260 } unique_base_item; 261 262 typedef enum item_special_effect { 263 // clang-format off 264 ISPL_NONE = 0x00000000, 265 ISPL_INFRAVISION = 0x00000001, 266 ISPL_RNDSTEALLIFE = 0x00000002, 267 ISPL_RNDARROWVEL = 0x00000004, 268 ISPL_FIRE_ARROWS = 0x00000008, 269 ISPL_FIREDAM = 0x00000010, 270 ISPL_LIGHTDAM = 0x00000020, 271 ISPL_DRAINLIFE = 0x00000040, 272 ISPL_UNKNOWN_1 = 0x00000080, 273 ISPL_NOHEALPLR = 0x00000100, 274 ISPL_MULT_ARROWS = 0x00000200, 275 ISPL_UNKNOWN_3 = 0x00000400, 276 ISPL_KNOCKBACK = 0x00000800, 277 ISPL_NOHEALMON = 0x00001000, 278 ISPL_STEALMANA_3 = 0x00002000, 279 ISPL_STEALMANA_5 = 0x00004000, 280 ISPL_STEALLIFE_3 = 0x00008000, 281 ISPL_STEALLIFE_5 = 0x00010000, 282 ISPL_QUICKATTACK = 0x00020000, 283 ISPL_FASTATTACK = 0x00040000, 284 ISPL_FASTERATTACK = 0x00080000, 285 ISPL_FASTESTATTACK = 0x00100000, 286 ISPL_FASTRECOVER = 0x00200000, 287 ISPL_FASTERRECOVER = 0x00400000, 288 ISPL_FASTESTRECOVER = 0x00800000, 289 ISPL_FASTBLOCK = 0x01000000, 290 ISPL_LIGHT_ARROWS = 0x02000000, 291 ISPL_THORNS = 0x04000000, 292 ISPL_NOMANA = 0x08000000, 293 ISPL_ABSHALFTRAP = 0x10000000, 294 ISPL_UNKNOWN_4 = 0x20000000, 295 ISPL_3XDAMVDEM = 0x40000000, 296 ISPL_ALLRESZERO = 0x80000000, 297 // clang-format on 298 } item_special_effect; 299 300 typedef enum item_misc_id { 301 IMISC_NONE, 302 IMISC_USEFIRST, 303 IMISC_FULLHEAL, 304 IMISC_HEAL, 305 IMISC_OLDHEAL, 306 IMISC_DEADHEAL, 307 IMISC_MANA, 308 IMISC_FULLMANA, 309 IMISC_POTEXP, /* add experience */ 310 IMISC_POTFORG, /* remove experience */ 311 IMISC_ELIXSTR, 312 IMISC_ELIXMAG, 313 IMISC_ELIXDEX, 314 IMISC_ELIXVIT, 315 IMISC_ELIXWEAK, /* double check with alpha */ 316 IMISC_ELIXDIS, 317 IMISC_ELIXCLUM, 318 IMISC_ELIXSICK, 319 IMISC_REJUV, 320 IMISC_FULLREJUV, 321 IMISC_USELAST, 322 IMISC_SCROLL, 323 IMISC_SCROLLT, 324 IMISC_STAFF, 325 IMISC_BOOK, 326 IMISC_RING, 327 IMISC_AMULET, 328 IMISC_UNIQUE, 329 IMISC_FOOD, /* from demo/PSX */ 330 IMISC_OILFIRST, 331 IMISC_OILOF, /* oils are beta or hellfire only */ 332 IMISC_OILACC, 333 IMISC_OILMAST, 334 IMISC_OILSHARP, 335 IMISC_OILDEATH, 336 IMISC_OILSKILL, 337 IMISC_OILBSMTH, 338 IMISC_OILFORT, 339 IMISC_OILPERM, 340 IMISC_OILHARD, 341 IMISC_OILIMP, 342 IMISC_OILLAST, 343 IMISC_MAPOFDOOM, 344 IMISC_EAR, 345 IMISC_SPECELIX, 346 IMISC_0x2D, // Unknown 347 IMISC_RUNEFIRST, 348 IMISC_RUNEF, 349 IMISC_RUNEL, 350 IMISC_GR_RUNEL, 351 IMISC_GR_RUNEF, 352 IMISC_RUNES, 353 IMISC_RUNELAST, 354 IMISC_AURIC, 355 IMISC_NOTE, 356 IMISC_INVALID = -1, 357 } item_misc_id; 358 359 typedef struct ItemDataStruct { 360 enum item_drop_rate iRnd; 361 enum item_class iClass; 362 enum item_equip_type iLoc; 363 enum item_cursor_graphic iCurs; 364 enum item_type itype; 365 enum unique_base_item iItemId; 366 const char *iName; 367 const char *iSName; 368 Sint8 iMinMLvl; 369 Sint32 iDurability; 370 Sint32 iMinDam; 371 Sint32 iMaxDam; 372 Sint32 iMinAC; 373 Sint32 iMaxAC; 374 Sint8 iMinStr; 375 Sint8 iMinMag; 376 Sint8 iMinDex; 377 Sint32 iFlags; // item_special_effect as bit flags 378 enum item_misc_id iMiscId; 379 enum spell_id iSpell; 380 BOOL iUsable; 381 Sint32 iValue; 382 Sint32 iMaxValue; 383 } ItemDataStruct; 384 385 typedef enum item_effect_type { 386 IPL_TOHIT, 387 IPL_TOHIT_CURSE, 388 IPL_DAMP, 389 IPL_DAMP_CURSE, 390 IPL_TOHIT_DAMP, 391 IPL_TOHIT_DAMP_CURSE, 392 IPL_ACP, 393 IPL_ACP_CURSE, 394 IPL_FIRERES, 395 IPL_LIGHTRES, 396 IPL_MAGICRES, 397 IPL_ALLRES, 398 IPL_SPLCOST, /* only used in beta */ 399 IPL_SPLDUR, /* only used in beta */ 400 IPL_SPLLVLADD, 401 IPL_CHARGES, 402 IPL_FIREDAM, 403 IPL_LIGHTDAM, 404 IPL_0x12, // Unknown 405 IPL_STR, 406 IPL_STR_CURSE, 407 IPL_MAG, 408 IPL_MAG_CURSE, 409 IPL_DEX, 410 IPL_DEX_CURSE, 411 IPL_VIT, 412 IPL_VIT_CURSE, 413 IPL_ATTRIBS, 414 IPL_ATTRIBS_CURSE, 415 IPL_GETHIT_CURSE, 416 IPL_GETHIT, 417 IPL_LIFE, 418 IPL_LIFE_CURSE, 419 IPL_MANA, 420 IPL_MANA_CURSE, 421 IPL_DUR, 422 IPL_DUR_CURSE, 423 IPL_INDESTRUCTIBLE, 424 IPL_LIGHT, 425 IPL_LIGHT_CURSE, 426 IPL_0x28, // Unknown 427 IPL_MULT_ARROWS, /* only used in hellfire */ 428 IPL_FIRE_ARROWS, 429 IPL_LIGHT_ARROWS, 430 IPL_INVCURS, 431 IPL_THORNS, 432 IPL_NOMANA, 433 IPL_NOHEALPLR, 434 IPL_0x30, // Unknown 435 IPL_0x31, // Unknown 436 IPL_FIREBALL, /* only used in hellfire */ 437 IPL_0x33, // Unknown 438 IPL_ABSHALFTRAP, 439 IPL_KNOCKBACK, 440 IPL_NOHEALMON, 441 IPL_STEALMANA, 442 IPL_STEALLIFE, 443 IPL_TARGAC, 444 IPL_FASTATTACK, 445 IPL_FASTRECOVER, 446 IPL_FASTBLOCK, 447 IPL_DAMMOD, 448 IPL_RNDARROWVEL, 449 IPL_SETDAM, 450 IPL_SETDUR, 451 IPL_NOMINSTR, 452 IPL_SPELL, 453 IPL_FASTSWING, 454 IPL_ONEHAND, 455 IPL_3XDAMVDEM, 456 IPL_ALLRESZERO, 457 IPL_0x47, // Unknown 458 IPL_DRAINLIFE, 459 IPL_RNDSTEALLIFE, 460 IPL_INFRAVISION, 461 IPL_SETAC, 462 IPL_ADDACLIFE, 463 IPL_ADDMANAAC, 464 IPL_FIRERESCLVL, 465 IPL_AC_CURSE, 466 IDI_LASTDIABLO = IPL_AC_CURSE, 467 IPL_FIRERES_CURSE, 468 IPL_LIGHTRES_CURSE, 469 IPL_MAGICRES_CURSE, 470 IPL_ALLRES_CURSE, 471 IPL_DEVASTATION, 472 IPL_DECAY, 473 IPL_PERIL, 474 IPL_JESTERS, 475 IPL_CRYSTALLINE, 476 IPL_DOPPELGANGER, 477 IPL_ACDEMON, 478 IPL_ACUNDEAD, 479 IPL_MANATOLIFE, 480 IPL_LIFETOMANA, 481 IPL_INVALID = -1, 482 } item_effect_type; 483 484 typedef enum goodorevil { 485 GOE_ANY, 486 GOE_EVIL, 487 GOE_GOOD, 488 } goodorevil; 489 490 typedef enum affix_item_type { 491 // clang-format off 492 PLT_MISC = 0x000001, 493 PLT_BOW = 0x000010, 494 PLT_STAFF = 0x000100, 495 PLT_WEAP = 0x001000, 496 PLT_SHLD = 0x010000, 497 PLT_ARMO = 0x100000, 498 // clang-format on 499 } affix_item_type; 500 501 typedef struct PLStruct { 502 const char *PLName; 503 enum item_effect_type PLPower; 504 Sint32 PLParam1; 505 Sint32 PLParam2; 506 Sint8 PLMinLvl; 507 Sint32 PLIType; // affix_item_type as bit flags 508 enum goodorevil PLGOE; 509 bool PLDouble; 510 bool PLOk; 511 Sint32 PLMinVal; 512 Sint32 PLMaxVal; 513 Sint32 PLMultVal; 514 } PLStruct; 515 516 typedef struct UItemStruct { 517 const char *UIName; 518 enum unique_base_item UIItemId; 519 Sint8 UIMinLvl; 520 Sint8 UINumPL; 521 Sint32 UIValue; 522 enum item_effect_type UIPower1; 523 Sint32 UIParam1; 524 Sint32 UIParam2; 525 enum item_effect_type UIPower2; 526 Sint32 UIParam3; 527 Sint32 UIParam4; 528 enum item_effect_type UIPower3; 529 Sint32 UIParam5; 530 Sint32 UIParam6; 531 enum item_effect_type UIPower4; 532 Sint32 UIParam7; 533 Sint32 UIParam8; 534 enum item_effect_type UIPower5; 535 Sint32 UIParam9; 536 Sint32 UIParam10; 537 enum item_effect_type UIPower6; 538 Sint32 UIParam11; 539 Sint32 UIParam12; 540 } UItemStruct; 541 542 extern ItemDataStruct AllItemsList[]; 543 extern const PLStruct PL_Prefix[]; 544 extern const PLStruct PL_Suffix[]; 545 extern const UItemStruct UniqueItemList[]; 546 547 #ifdef __cplusplus 548 } 549 #endif 550 551 DEVILUTION_END_NAMESPACE 552 553 #endif /* __ITEMDAT_H__ */ 554