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