1$#include "angband.h"
2$#include "script.h"
3
4typedef char* cptr;
5typedef int errr;
6typedef int sint;
7
8
9/***** Constants *****/
10
11/*
12 * Special "xtra" object powers for ego items and some artifacts
13 */
14
15/* Sustain one stat */
16#define EGO_XTRA_SUSTAIN        1
17
18/* Resistances */
19#define EGO_XTRA_LO_RESIST      2
20#define EGO_XTRA_HI_RESIST      3
21#define EGO_XTRA_ANY_RESIST     4
22
23/* Special ability */
24#define EGO_XTRA_ABILITY        5
25
26/* Special ability OR high resist */
27#define EGO_XTRA_POWER          6
28
29/*
30 * Use tvals for the item tester functions in stores
31 */
32#define TV_ANY			 0		/* Used for matching all objects */
33#define TV_SKELETON      1		/* Skeletons ('~') */
34#define TV_BOTTLE        2		/* Empty bottles ('!') */
35#define TV_JUNK          3		/* Sticks, Pottery, etc ('~') */
36#define TV_SPIKE         5		/* Spikes ('~') */
37#define TV_CHEST         7		/* Chests ('&') */
38#define TV_FIGURINE      8		/* Magical figurines */
39#define TV_STATUE        9		/* Statue */
40/*#define TV_CORPSE       10  */ /* Corpses are now fields */
41#define TV_SHOT         16		/* Ammo for slings */
42#define TV_ARROW        17		/* Ammo for bows */
43#define TV_BOLT         18		/* Ammo for x-bows */
44#define TV_BOW          19		/* Slings/Bows/Xbows */
45#define TV_DIGGING      20		/* Shovels/Picks */
46#define TV_HAFTED       21		/* Priest Weapons */
47#define TV_POLEARM      22		/* Axes and Pikes */
48#define TV_SWORD        23		/* Edged Weapons */
49#define TV_BOOTS        30		/* Boots */
50#define TV_GLOVES       31		/* Gloves */
51#define TV_HELM         32		/* Helms */
52#define TV_CROWN        33		/* Crowns */
53#define TV_SHIELD       34		/* Shields */
54#define TV_CLOAK        35		/* Cloaks */
55#define TV_SOFT_ARMOR   36		/* Soft Armor */
56#define TV_HARD_ARMOR   37		/* Hard Armor */
57#define TV_DRAG_ARMOR   38		/* Dragon Scale Mail */
58#define TV_LITE         39		/* Lites (including Specials) */
59#define TV_AMULET       40		/* Amulets (including Specials) */
60#define TV_RING         45		/* Rings (including Specials) */
61#define TV_STAFF        55
62#define TV_WAND         65
63#define TV_ROD          66
64#define TV_SCROLL       70
65#define TV_POTION       75
66#define TV_FLASK        77
67#define TV_FOOD         80
68#define TV_LIFE_BOOK    90
69#define TV_SORCERY_BOOK 91
70#define TV_NATURE_BOOK  92
71#define TV_CHAOS_BOOK   93
72#define TV_DEATH_BOOK   94
73#define TV_TRUMP_BOOK   95
74#define TV_ARCANE_BOOK  96
75#define TV_GOLD         100		/* Gold can only be picked up by players */
76
77#define TV_BOOKS_MIN    TV_LIFE_BOOK	/* First tval of spellbooks */
78#define TV_BOOKS_MAX    TV_ARCANE_BOOK	/* Last tval of spellbooks */
79
80
81/*
82 * Use sval codes for wand of wonder
83 */
84#define SV_WAND_HEAL_MONSTER             0
85#define SV_WAND_HASTE_MONSTER            1
86#define SV_WAND_CLONE_MONSTER            2
87#define SV_WAND_TELEPORT_AWAY            3
88#define SV_WAND_DISARMING                4
89#define SV_WAND_TRAP_DOOR_DEST           5
90#define SV_WAND_STONE_TO_MUD             6
91#define SV_WAND_LITE                     7
92#define SV_WAND_SLEEP_MONSTER            8
93#define SV_WAND_SLOW_MONSTER             9
94#define SV_WAND_CONFUSE_MONSTER         10
95#define SV_WAND_FEAR_MONSTER            11
96#define SV_WAND_DRAIN_LIFE              12
97#define SV_WAND_POLYMORPH               13
98#define SV_WAND_STINKING_CLOUD          14
99#define SV_WAND_MAGIC_MISSILE           15
100#define SV_WAND_ACID_BOLT               16
101#define SV_WAND_CHARM_MONSTER           17
102#define SV_WAND_FIRE_BOLT               18
103#define SV_WAND_COLD_BOLT               19
104#define SV_WAND_ACID_BALL               20
105#define SV_WAND_ELEC_BALL               21
106#define SV_WAND_FIRE_BALL               22
107#define SV_WAND_COLD_BALL               23
108#define SV_WAND_WONDER                  24
109
110
111
112/*
113 * As of 2.7.8, the "object flags" are valid for all objects, and as
114 * of 2.7.9, these flags are not actually stored with the object.
115 *
116 * Note that "flags1" contains all flags dependant on "pval" (including
117 * stat bonuses, but NOT stat sustainers), plus all "extra attack damage"
118 * flags (SLAY_XXX and BRAND_XXX).
119 *
120 * Note that "flags2" contains all "resistances" (including "Stat Sustainers",
121 * actual immunities, and resistances).  Note that "Hold Life" is really an
122 * "immunity" to ExpLoss, and "Free Action" is "immunity to paralysis".
123 *
124 * Note that "flags3" contains everything else -- including the three "CURSED"
125 * flags, and the "BLESSED" flag, several "item display" parameters, some new
126 * flags for powerful Bows, and flags which affect the player in a "general"
127 * way (LITE, TELEPATHY, SEE_INVIS, SLOW_DIGEST, REGEN, FEATHER), including
128 * all the "general" curses (TELEPORT, AGGRAVATE, EXP_DRAIN).  It also has
129 * four new flags called "ITEM_IGNORE_XXX" which lets an item specify that
130 * it can not be affected by various forms of destruction.  This is NOT as
131 * powerful as actually granting resistance/immunity to the wearer.
132 */
133
134#define TR0_STR                 0x00000001L     /* STR += "pval" */
135#define TR0_INT                 0x00000002L     /* INT += "pval" */
136#define TR0_WIS                 0x00000004L     /* WIS += "pval" */
137#define TR0_DEX                 0x00000008L     /* DEX += "pval" */
138#define TR0_CON                 0x00000010L     /* CON += "pval" */
139#define TR0_CHR                 0x00000020L     /* CHR += "pval" */
140#define TR0_XXX1                0x00000040L     /* Later */
141#define TR0_SP                  0x00000080L     /* Extra mana */
142#define TR0_STEALTH             0x00000100L     /* Stealth += "pval" */
143#define TR0_SEARCH              0x00000200L     /* Search += "pval" */
144#define TR0_INFRA               0x00000400L     /* Infra += "pval" */
145#define TR0_TUNNEL              0x00000800L     /* Tunnel += "pval" */
146#define TR0_SPEED               0x00001000L     /* Speed += "pval" */
147#define TR0_BLOWS               0x00002000L     /* Blows += "pval" */
148#define TR0_CHAOTIC             0x00004000L
149#define TR0_VAMPIRIC            0x00008000L
150#define TR0_SLAY_ANIMAL         0x00010000L
151#define TR0_SLAY_EVIL           0x00020000L
152#define TR0_SLAY_UNDEAD         0x00040000L
153#define TR0_SLAY_DEMON          0x00080000L
154#define TR0_SLAY_ORC            0x00100000L
155#define TR0_SLAY_TROLL          0x00200000L
156#define TR0_SLAY_GIANT          0x00400000L
157#define TR0_SLAY_DRAGON         0x00800000L
158#define TR0_KILL_DRAGON         0x01000000L     /* Execute Dragon */
159#define TR0_VORPAL              0x02000000L     /* Later */
160#define TR0_IMPACT              0x04000000L     /* Cause Earthquakes */
161#define TR0_BRAND_POIS          0x08000000L
162#define TR0_BRAND_ACID          0x10000000L
163#define TR0_BRAND_ELEC          0x20000000L
164#define TR0_BRAND_FIRE          0x40000000L
165#define TR0_BRAND_COLD          0x80000000L
166
167#define TR1_SUST_STR            0x00000001L
168#define TR1_SUST_INT            0x00000002L
169#define TR1_SUST_WIS            0x00000004L
170#define TR1_SUST_DEX            0x00000008L
171#define TR1_SUST_CON            0x00000010L
172#define TR1_SUST_CHR            0x00000020L
173#define TR1_XXX1                0x00000040L     /* Later */
174#define TR1_IM_POIS             0x00000080L
175#define TR1_IM_ACID             0x00000100L
176#define TR1_IM_ELEC             0x00000200L
177#define TR1_IM_FIRE             0x00000400L
178#define TR1_IM_COLD             0x00000800L
179#define TR1_THROW               0x00001000L     /* Throwing items */
180#define TR1_REFLECT             0x00002000L     /* Reflect 'bolts' */
181#define TR1_FREE_ACT            0x00004000L     /* Free Action */
182#define TR1_HOLD_LIFE           0x00008000L     /* Hold Life */
183#define TR1_RES_ACID            0x00010000L
184#define TR1_RES_ELEC            0x00020000L
185#define TR1_RES_FIRE            0x00040000L
186#define TR1_RES_COLD            0x00080000L
187#define TR1_RES_POIS            0x00100000L
188#define TR1_RES_FEAR            0x00200000L     /* Added for Zangband */
189#define TR1_RES_LITE            0x00400000L
190#define TR1_RES_DARK            0x00800000L
191#define TR1_RES_BLIND           0x01000000L
192#define TR1_RES_CONF            0x02000000L
193#define TR1_RES_SOUND           0x04000000L
194#define TR1_RES_SHARDS          0x08000000L
195#define TR1_RES_NETHER          0x10000000L
196#define TR1_RES_NEXUS           0x20000000L
197#define TR1_RES_CHAOS           0x40000000L
198#define TR1_RES_DISEN           0x80000000L
199
200
201#define TR2_SH_FIRE             0x00000001L     /* Immolation (Fire) */
202#define TR2_SH_ELEC             0x00000002L     /* Electric Sheath */
203#define TR2_QUESTITEM           0x00000004L     /* quest level item -KMW- */
204#define TR2_XXX4                0x00000008L     /* Later */
205#define TR2_NO_TELE             0x00000010L     /* Anti-teleportation */
206#define TR2_NO_MAGIC            0x00000020L     /* Anti-magic */
207#define TR2_XXX7                0x00000040L     /* Later */
208#define TR2_TY_CURSE            0x00000080L     /* The Ancient Curse */
209#define TR2_EASY_KNOW           0x00000100L     /* Aware -> Known */
210#define TR2_HIDE_TYPE           0x00000200L     /* Hide "pval" description */
211#define TR2_SHOW_MODS           0x00000400L     /* Always show Tohit/Todam */
212#define TR2_INSTA_ART           0x00000800L     /* Item must be an artifact */
213#define TR2_FEATHER             0x00001000L     /* Feather Falling */
214#define TR2_LITE                0x00002000L     /* Permanent Light */
215#define TR2_SEE_INVIS           0x00004000L     /* See Invisible */
216#define TR2_TELEPATHY           0x00008000L     /* Telepathy */
217#define TR2_SLOW_DIGEST         0x00010000L     /* Item slows down digestion */
218#define TR2_REGEN               0x00020000L     /* Item induces regeneration */
219#define TR2_XTRA_MIGHT          0x00040000L     /* Bows get extra multiplier */
220#define TR2_XTRA_SHOTS          0x00080000L     /* Bows get extra shots */
221#define TR2_IGNORE_ACID         0x00100000L     /* Item ignores Acid Damage */
222#define TR2_IGNORE_ELEC         0x00200000L     /* Item ignores Elec Damage */
223#define TR2_IGNORE_FIRE         0x00400000L     /* Item ignores Fire Damage */
224#define TR2_IGNORE_COLD         0x00800000L     /* Item ignores Cold Damage */
225#define TR2_ACTIVATE            0x01000000L     /* Item can be activated */
226#define TR2_DRAIN_EXP           0x02000000L     /* Item drains Experience */
227#define TR2_TELEPORT            0x04000000L     /* Item teleports player */
228#define TR2_AGGRAVATE           0x08000000L     /* Item aggravates monsters */
229#define TR2_BLESSED             0x10000000L     /* Item is Blessed */
230#define TR2_CURSED              0x20000000L     /* Item is Cursed */
231#define TR2_HEAVY_CURSE         0x40000000L     /* Item is Heavily Cursed */
232#define TR2_PERMA_CURSE         0x80000000L     /* Item is Perma Cursed */
233
234
235#define TR3_LUCK_10             0x00000001L
236#define TR3_WILD_SHOT           0x00000002L
237#define TR3_WILD_WALK           0x00000004L
238#define TR3_EASY_ENCHANT        0x00000008L
239#define TR3_XXX5                0x00000010L
240#define TR3_XXX6                0x00000020L
241#define TR3_XXX7                0x00000040L
242#define TR3_XXX8                0x00000080L
243#define TR3_IM_LITE             0x00000100L
244#define TR3_IM_DARK             0x00000200L
245#define TR3_SH_ACID             0x00000400L
246#define TR3_SH_COLD             0x00000800L
247#define TR3_MUTATE              0x00001000L
248#define TR3_PATRON              0x00002000L
249#define TR3_STRANGE_LUCK        0x00004000L
250#define TR3_PASS_WALL           0x00008000L
251#define TR3_GHOUL_TOUCH         0x00010000L
252#define TR3_PSI_CRIT            0x00020000L
253#define TR3_RETURN              0x00040000L
254#define TR3_EXPLODE             0x00080000L
255#define TR3_HURT_ACID           0x00100000L
256#define TR3_HURT_ELEC           0x00200000L
257#define TR3_HURT_FIRE           0x00400000L
258#define TR3_HURT_COLD           0x00800000L
259#define TR3_HURT_LITE           0x01000000L
260#define TR3_HURT_DARK           0x02000000L
261#define TR3_XXX27               0x04000000L
262#define TR3_XXX28               0x08000000L
263#define TR3_AUTO_CURSE          0x10000000L
264#define TR3_DRAIN_STATS         0x20000000L
265#define TR3_CANT_EAT            0x40000000L
266#define TR3_SLOW_HEAL           0x80000000L
267
268
269/***** Types *****/
270
271struct object_type
272{
273	s16b k_idx;			/* Kind index (zero if "dead") */
274
275	s16b iy;			/* Y-position on map, or zero */
276	s16b ix;			/* X-position on map, or zero */
277
278	byte tval;			/* Item type (from kind) */
279	byte sval;			/* Item sub-type (from kind) */
280
281	s16b pval;			/* Item extra-parameter */
282
283	byte discount;		/* Discount (if any) */
284
285	byte number;		/* Number of items */
286
287	s16b weight;		/* Item weight */
288
289	s16b to_h;			/* Plusses to hit */
290	s16b to_d;			/* Plusses to damage */
291	s16b to_a;			/* Plusses to AC */
292
293	s16b ac;			/* Normal AC */
294
295	s16b timeout;		/* Timeout Counter */
296
297	byte dd;			/* Damage dice/sides */
298	byte ds;
299
300	u16b inscription;	/* Inscription index */
301	u16b xtra_name;      /* Extra Name (Artifacts and ego items) */
302
303	u32b flags[4];        /* Flags */
304
305	u32b kn_flags[4];     /* Known Flags */
306
307	s16b next_o_idx;	/* Next object in stack (if any) */
308
309	s32b cost;			/* Object "base cost" */
310
311	byte feeling;       /* Game generated inscription number (eg, pseudo-id) */
312
313	byte a_idx;		/* Artifact number */
314
315	byte info;			/* Special flags */
316
317	bool allocated;	/* Held in the o_list[] array */
318
319};
320
321
322struct bonuses_type
323{
324	int stat[6];
325	int sp_bonus;
326	int skills[MAX_SKILL];
327	int see_infra;
328	int pspeed;
329	int extra_blows;
330	int extra_shots;
331};
332
333
334/***** Functions *****/
335
336extern bool item_tester_hook_weapon(const object_type *o_ptr);
337extern bool item_tester_hook_melee_weapon(const object_type *o_ptr);
338extern bool item_tester_hook_nonsword(const object_type *o_ptr);
339extern bool item_tester_hook_ammo(const object_type *o_ptr);
340extern bool item_tester_hook_fletcher(const object_type *o_ptr);
341extern bool item_tester_hook_armour(const object_type *o_ptr);
342extern bool item_tester_hook_soft_armour(const object_type *o_ptr);
343extern bool item_tester_hook_hard_armour(const object_type *o_ptr);
344extern bool item_tester_hook_helm(const object_type *o_ptr);
345extern bool item_tester_hook_pure_hard_armour(const object_type *o_ptr);
346extern bool item_tester_hook_weapon_armour(const object_type *o_ptr);
347extern bool item_tester_hook_wear(const object_type *o_ptr);
348extern bool item_tester_hook_recharge(const object_type *o_ptr);
349extern bool item_tester_hook_jewel(const object_type *o_ptr);
350extern bool item_tester_hook_tval(const object_type *o_ptr, byte tval);
351extern bool item_tester_hook_is_blessed(const object_type *o_ptr);
352extern bool item_tester_hook_is_good(const object_type *o_ptr);
353extern bool item_tester_hook_is_great(const object_type *o_ptr);
354extern bool item_tester_hook_is_book(const object_type *o_ptr);
355extern void add_ego_flags(object_type *o_ptr, byte ego);
356extern void add_ego_power(int power, object_type *o_ptr);
357extern void acquirement(int x1, int y1, int num, bool great, bool known);
358extern void ring_of_power(int dir);
359