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