1/* SCCS Id: @(#)youprop.h 3.4 1999/07/02 */ 2/* Copyright (c) 1989 Mike Threepoint */ 3/* NetHack may be freely redistributed. See license for details. */ 4 5#ifndef YOUPROP_H 6#define YOUPROP_H 7 8#include "prop.h" 9#include "permonst.h" 10#include "mondata.h" 11#include "pm.h" 12 13 14/* KMH, intrinsics patch. 15 * Reorganized and rewritten for >32-bit properties. 16 * HXxx refers to intrinsic bitfields while in human form. 17 * EXxx refers to extrinsic bitfields from worn objects. 18 * BXxx refers to the cause of the property being blocked. 19 * Xxx refers to any source, including polymorph forms. 20 */ 21 22 23#define maybe_polyd(if_so,if_not) (Upolyd ? (if_so) : (if_not)) 24 25 26/*** Resistances to troubles ***/ 27/* With intrinsics and extrinsics */ 28#define HFire_resistance u.uprops[FIRE_RES].intrinsic 29#define EFire_resistance u.uprops[FIRE_RES].extrinsic 30#define Fire_resistance (HFire_resistance || EFire_resistance || \ 31 resists_fire(&youmonst)) 32 33#define HCold_resistance u.uprops[COLD_RES].intrinsic 34#define ECold_resistance u.uprops[COLD_RES].extrinsic 35#define Cold_resistance (HCold_resistance || ECold_resistance || \ 36 resists_cold(&youmonst)) 37 38#define HSleep_resistance u.uprops[SLEEP_RES].intrinsic 39#define ESleep_resistance u.uprops[SLEEP_RES].extrinsic 40#define Sleep_resistance (HSleep_resistance || ESleep_resistance || \ 41 resists_sleep(&youmonst)) 42 43#define HDisint_resistance u.uprops[DISINT_RES].intrinsic 44#define EDisint_resistance u.uprops[DISINT_RES].extrinsic 45#define Disint_resistance (HDisint_resistance || EDisint_resistance || \ 46 resists_disint(&youmonst)) 47 48#define HShock_resistance u.uprops[SHOCK_RES].intrinsic 49#define EShock_resistance u.uprops[SHOCK_RES].extrinsic 50#define Shock_resistance (HShock_resistance || EShock_resistance || \ 51 resists_elec(&youmonst)) 52 53#define HPoison_resistance u.uprops[POISON_RES].intrinsic 54#define EPoison_resistance u.uprops[POISON_RES].extrinsic 55#define Poison_resistance (HPoison_resistance || EPoison_resistance || \ 56 resists_poison(&youmonst)) 57 58#define HDrain_resistance u.uprops[DRAIN_RES].intrinsic 59#define EDrain_resistance u.uprops[DRAIN_RES].extrinsic 60#define Drain_resistance (HDrain_resistance || EDrain_resistance || \ 61 resists_drli(&youmonst)) 62 63/* Intrinsics only */ 64#define HSick_resistance u.uprops[SICK_RES].intrinsic 65#define Sick_resistance (HSick_resistance || \ 66 youmonst.data->mlet == S_FUNGUS || \ 67 youmonst.data == &mons[PM_GHOUL] || \ 68 defends(AD_DISE,uwep)) 69#define Invulnerable u.uprops[INVULNERABLE].intrinsic /* [Tom] */ 70 71/* Extrinsics only */ 72#define EAntimagic u.uprops[ANTIMAGIC].extrinsic 73#define Antimagic (EAntimagic || \ 74 (Upolyd && resists_magm(&youmonst))) 75 76#define EAcid_resistance u.uprops[ACID_RES].extrinsic 77#define Acid_resistance (EAcid_resistance || resists_acid(&youmonst)) 78 79#define EStone_resistance u.uprops[STONE_RES].extrinsic 80#define Stone_resistance (EStone_resistance || resists_ston(&youmonst)) 81 82 83/*** Troubles ***/ 84/* Pseudo-property */ 85#define Punished (uball) 86 87/* Those implemented solely as timeouts (we use just intrinsic) */ 88#define HStun u.uprops[STUNNED].intrinsic 89#define Stunned (HStun || u.umonnum == PM_STALKER || \ 90 youmonst.data->mlet == S_BAT) 91 /* Note: birds will also be stunned */ 92 93#define HConfusion u.uprops[CONFUSION].intrinsic 94#define Confusion HConfusion 95 96#define Blinded u.uprops[BLINDED].intrinsic 97#define Blindfolded (ublindf && ublindf->otyp != LENSES) 98 /* ...means blind because of a cover */ 99#define Blind ((Blinded || Blindfolded || !haseyes(youmonst.data)) && \ 100 !(ublindf && ublindf->oartifact == ART_EYES_OF_THE_OVERWORLD)) 101 /* ...the Eyes operate even when you really are blind 102 or don't have any eyes */ 103 104#define Sick u.uprops[SICK].intrinsic 105#define Stoned u.uprops[STONED].intrinsic 106#define Strangled u.uprops[STRANGLED].intrinsic 107#define Vomiting u.uprops[VOMITING].intrinsic 108#define Glib u.uprops[GLIB].intrinsic 109#define Slimed u.uprops[SLIMED].intrinsic /* [Tom] */ 110 111/* Hallucination is solely a timeout; its resistance is extrinsic */ 112#define HHallucination u.uprops[HALLUC].intrinsic 113#define EHalluc_resistance u.uprops[HALLUC_RES].extrinsic 114#define Halluc_resistance (EHalluc_resistance || \ 115 (Upolyd && dmgtype(youmonst.data, AD_HALU))) 116#define Hallucination (HHallucination && !Halluc_resistance) 117 118/* Timeout, plus a worn mask */ 119#define HFumbling u.uprops[FUMBLING].intrinsic 120#define EFumbling u.uprops[FUMBLING].extrinsic 121#define Fumbling (HFumbling || EFumbling) 122 123#define HWounded_legs u.uprops[WOUNDED_LEGS].intrinsic 124#define EWounded_legs u.uprops[WOUNDED_LEGS].extrinsic 125#define Wounded_legs (HWounded_legs || EWounded_legs) 126 127#define HSleeping u.uprops[SLEEPING].intrinsic 128#define ESleeping u.uprops[SLEEPING].extrinsic 129#define Sleeping (HSleeping || ESleeping) 130 131#define HHunger u.uprops[HUNGER].intrinsic 132#define EHunger u.uprops[HUNGER].extrinsic 133#define Hunger (HHunger || EHunger) 134 135 136/*** Vision and senses ***/ 137#define HSee_invisible u.uprops[SEE_INVIS].intrinsic 138#define ESee_invisible u.uprops[SEE_INVIS].extrinsic 139#define See_invisible (HSee_invisible || ESee_invisible || \ 140 perceives(youmonst.data)) 141 142#define HTelepat u.uprops[TELEPAT].intrinsic 143#define ETelepat u.uprops[TELEPAT].extrinsic 144#define Blind_telepat (HTelepat || ETelepat || \ 145 telepathic(youmonst.data)) 146#define Unblind_telepat (ETelepat) 147 148#define HWarning u.uprops[WARNING].intrinsic 149#define EWarning u.uprops[WARNING].extrinsic 150#define Warning (HWarning || EWarning) 151 152/* Warning for a specific type of monster */ 153#define HWarn_of_mon u.uprops[WARN_OF_MON].intrinsic 154#define EWarn_of_mon u.uprops[WARN_OF_MON].extrinsic 155#define Warn_of_mon (HWarn_of_mon || EWarn_of_mon) 156 157#define HUndead_warning u.uprops[WARN_UNDEAD].intrinsic 158#define Undead_warning (HUndead_warning) 159 160#define HSearching u.uprops[SEARCHING].intrinsic 161#define ESearching u.uprops[SEARCHING].extrinsic 162#define Searching (HSearching || ESearching) 163 164#define HClairvoyant u.uprops[CLAIRVOYANT].intrinsic 165#define EClairvoyant u.uprops[CLAIRVOYANT].extrinsic 166#define BClairvoyant u.uprops[CLAIRVOYANT].blocked 167#define Clairvoyant ((HClairvoyant || EClairvoyant) &&\ 168 !BClairvoyant) 169 170#define HInfravision u.uprops[INFRAVISION].intrinsic 171#define EInfravision u.uprops[INFRAVISION].extrinsic 172#define Infravision (HInfravision || EInfravision || \ 173 infravision(youmonst.data)) 174 175#define HDetect_monsters u.uprops[DETECT_MONSTERS].intrinsic 176#define EDetect_monsters u.uprops[DETECT_MONSTERS].extrinsic 177#define Detect_monsters (HDetect_monsters || EDetect_monsters) 178 179 180/*** Appearance and behavior ***/ 181#define Adornment u.uprops[ADORNED].extrinsic 182 183#define HInvis u.uprops[INVIS].intrinsic 184#define EInvis u.uprops[INVIS].extrinsic 185#define BInvis u.uprops[INVIS].blocked 186#define Invis ((HInvis || EInvis || \ 187 pm_invisible(youmonst.data)) && !BInvis) 188#define Invisible (Invis && !See_invisible) 189 /* Note: invisibility also hides inventory and steed */ 190 191#define EDisplaced u.uprops[DISPLACED].extrinsic 192#define Displaced EDisplaced 193 194#define HStealth u.uprops[STEALTH].intrinsic 195#define EStealth u.uprops[STEALTH].extrinsic 196#define BStealth u.uprops[STEALTH].blocked 197#define Stealth ((HStealth || EStealth) && !BStealth) 198 199#define HAggravate_monster u.uprops[AGGRAVATE_MONSTER].intrinsic 200#define EAggravate_monster u.uprops[AGGRAVATE_MONSTER].extrinsic 201#define Aggravate_monster (HAggravate_monster || EAggravate_monster) 202 203#define HConflict u.uprops[CONFLICT].intrinsic 204#define EConflict u.uprops[CONFLICT].extrinsic 205#define Conflict (HConflict || EConflict) 206 207 208/*** Transportation ***/ 209#define HJumping u.uprops[JUMPING].intrinsic 210#define EJumping u.uprops[JUMPING].extrinsic 211#define Jumping (HJumping || EJumping) 212 213#define HTeleportation u.uprops[TELEPORT].intrinsic 214#define ETeleportation u.uprops[TELEPORT].extrinsic 215#define Teleportation (HTeleportation || ETeleportation || \ 216 can_teleport(youmonst.data)) 217 218#define HTeleport_control u.uprops[TELEPORT_CONTROL].intrinsic 219#define ETeleport_control u.uprops[TELEPORT_CONTROL].extrinsic 220#define Teleport_control (HTeleport_control || ETeleport_control || \ 221 control_teleport(youmonst.data)) 222 223#define HLevitation u.uprops[LEVITATION].intrinsic 224#define ELevitation u.uprops[LEVITATION].extrinsic 225#define Levitation (HLevitation || ELevitation || \ 226 is_floater(youmonst.data)) 227 /* Can't touch surface, can't go under water; overrides all others */ 228#define Lev_at_will (((HLevitation & I_SPECIAL) != 0L || \ 229 (ELevitation & W_ARTI) != 0L) && \ 230 (HLevitation & ~(I_SPECIAL|TIMEOUT)) == 0L && \ 231 (ELevitation & ~W_ARTI) == 0L && \ 232 !is_floater(youmonst.data)) 233 234#define EFlying u.uprops[FLYING].extrinsic 235#ifdef STEED 236# define Flying (EFlying || is_flyer(youmonst.data) || \ 237 (u.usteed && is_flyer(u.usteed->data))) 238#else 239# define Flying (EFlying || is_flyer(youmonst.data)) 240#endif 241 /* May touch surface; does not override any others */ 242 243#define Wwalking (u.uprops[WWALKING].extrinsic && \ 244 !Is_waterlevel(&u.uz)) 245 /* Don't get wet, can't go under water; overrides others except levitation */ 246 /* Wwalking is meaningless on water level */ 247 248#define HSwimming u.uprops[SWIMMING].intrinsic 249#define ESwimming u.uprops[SWIMMING].extrinsic /* [Tom] */ 250#ifdef STEED 251# define Swimming (HSwimming || ESwimming || \ 252 is_swimmer(youmonst.data) || \ 253 (u.usteed && is_swimmer(u.usteed->data))) 254#else 255# define Swimming (HSwimming || ESwimming || \ 256 is_swimmer(youmonst.data)) 257#endif 258 /* Get wet, don't go under water unless if amphibious */ 259 260#define HMagical_breathing u.uprops[MAGICAL_BREATHING].intrinsic 261#define EMagical_breathing u.uprops[MAGICAL_BREATHING].extrinsic 262#define Amphibious (HMagical_breathing || EMagical_breathing || \ 263 amphibious(youmonst.data)) 264 /* Get wet, may go under surface */ 265 266#define Breathless (HMagical_breathing || EMagical_breathing || \ 267 breathless(youmonst.data)) 268 269#define Underwater (u.uinwater) 270/* Note that Underwater and u.uinwater are both used in code. 271 The latter form is for later implementation of other in-water 272 states, like swimming, wading, etc. */ 273 274#define HPasses_walls u.uprops[PASSES_WALLS].intrinsic 275#define EPasses_walls u.uprops[PASSES_WALLS].extrinsic 276#define Passes_walls (HPasses_walls || EPasses_walls || \ 277 passes_walls(youmonst.data)) 278 279 280/*** Physical attributes ***/ 281#define HSlow_digestion u.uprops[SLOW_DIGESTION].intrinsic 282#define ESlow_digestion u.uprops[SLOW_DIGESTION].extrinsic 283#define Slow_digestion (HSlow_digestion || ESlow_digestion) /* KMH */ 284 285#define HHalf_spell_damage u.uprops[HALF_SPDAM].intrinsic 286#define EHalf_spell_damage u.uprops[HALF_SPDAM].extrinsic 287#define Half_spell_damage (HHalf_spell_damage || EHalf_spell_damage) 288 289#define HHalf_physical_damage u.uprops[HALF_PHDAM].intrinsic 290#define EHalf_physical_damage u.uprops[HALF_PHDAM].extrinsic 291#define Half_physical_damage (HHalf_physical_damage || EHalf_physical_damage) 292 293#define HRegeneration u.uprops[REGENERATION].intrinsic 294#define ERegeneration u.uprops[REGENERATION].extrinsic 295#define Regeneration (HRegeneration || ERegeneration || \ 296 regenerates(youmonst.data)) 297 298#define HEnergy_regeneration u.uprops[ENERGY_REGENERATION].intrinsic 299#define EEnergy_regeneration u.uprops[ENERGY_REGENERATION].extrinsic 300#define Energy_regeneration (HEnergy_regeneration || EEnergy_regeneration) 301 302#define HProtection u.uprops[PROTECTION].intrinsic 303#define EProtection u.uprops[PROTECTION].extrinsic 304#define Protection (HProtection || EProtection) 305 306#define HProtection_from_shape_changers \ 307 u.uprops[PROT_FROM_SHAPE_CHANGERS].intrinsic 308#define EProtection_from_shape_changers \ 309 u.uprops[PROT_FROM_SHAPE_CHANGERS].extrinsic 310#define Protection_from_shape_changers \ 311 (HProtection_from_shape_changers || \ 312 EProtection_from_shape_changers) 313 314#define HPolymorph u.uprops[POLYMORPH].intrinsic 315#define EPolymorph u.uprops[POLYMORPH].extrinsic 316#define Polymorph (HPolymorph || EPolymorph) 317 318#define HPolymorph_control u.uprops[POLYMORPH_CONTROL].intrinsic 319#define EPolymorph_control u.uprops[POLYMORPH_CONTROL].extrinsic 320#define Polymorph_control (HPolymorph_control || EPolymorph_control) 321 322#define HUnchanging u.uprops[UNCHANGING].intrinsic 323#define EUnchanging u.uprops[UNCHANGING].extrinsic 324#define Unchanging (HUnchanging || EUnchanging) /* KMH */ 325 326#define HFast u.uprops[FAST].intrinsic 327#define EFast u.uprops[FAST].extrinsic 328#define Fast (HFast || EFast) 329#define Very_fast ((HFast & ~INTRINSIC) || EFast) 330 331#define EReflecting u.uprops[REFLECTING].extrinsic 332#define Reflecting (EReflecting || \ 333 (youmonst.data == &mons[PM_SILVER_DRAGON])) 334 335#define Free_action u.uprops[FREE_ACTION].extrinsic /* [Tom] */ 336 337#define Fixed_abil u.uprops[FIXED_ABIL].extrinsic /* KMH */ 338 339#define Lifesaved u.uprops[LIFESAVED].extrinsic 340 341 342#endif /* YOUPROP_H */ 343