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. */
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.
23 #define maybe_polyd(if_so,if_not) (Upolyd ? (if_so) : (if_not))
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))
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))
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))
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))
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))
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))
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))
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] */
72 #define EAntimagic u.uprops[ANTIMAGIC].extrinsic
73 #define Antimagic (EAntimagic || \
74 (Upolyd && resists_magm(&youmonst)))
76 #define EAcid_resistance u.uprops[ACID_RES].extrinsic
77 #define Acid_resistance (EAcid_resistance || resists_acid(&youmonst))
79 #define EStone_resistance u.uprops[STONE_RES].extrinsic
80 #define Stone_resistance (EStone_resistance || resists_ston(&youmonst))
85 #define Punished (uball)
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 */
93 #define HConfusion u.uprops[CONFUSION].intrinsic
94 #define Confusion HConfusion
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 */
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] */
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)
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)
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)
127 #define HSleeping u.uprops[SLEEPING].intrinsic
128 #define ESleeping u.uprops[SLEEPING].extrinsic
129 #define Sleeping (HSleeping || ESleeping)
131 #define HHunger u.uprops[HUNGER].intrinsic
132 #define EHunger u.uprops[HUNGER].extrinsic
133 #define Hunger (HHunger || EHunger)
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))
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)
148 #define HWarning u.uprops[WARNING].intrinsic
149 #define EWarning u.uprops[WARNING].extrinsic
150 #define Warning (HWarning || EWarning)
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)
157 #define HUndead_warning u.uprops[WARN_UNDEAD].intrinsic
158 #define Undead_warning (HUndead_warning)
160 #define HSearching u.uprops[SEARCHING].intrinsic
161 #define ESearching u.uprops[SEARCHING].extrinsic
162 #define Searching (HSearching || ESearching)
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) &&\
170 #define HInfravision u.uprops[INFRAVISION].intrinsic
171 #define EInfravision u.uprops[INFRAVISION].extrinsic
172 #define Infravision (HInfravision || EInfravision || \
173 infravision(youmonst.data))
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)
180 /*** Appearance and behavior ***/
181 #define Adornment u.uprops[ADORNED].extrinsic
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 */
191 #define EDisplaced u.uprops[DISPLACED].extrinsic
192 #define Displaced EDisplaced
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)
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)
203 #define HConflict u.uprops[CONFLICT].intrinsic
204 #define EConflict u.uprops[CONFLICT].extrinsic
205 #define Conflict (HConflict || EConflict)
208 /*** Transportation ***/
209 #define HJumping u.uprops[JUMPING].intrinsic
210 #define EJumping u.uprops[JUMPING].extrinsic
211 #define Jumping (HJumping || EJumping)
213 #define HTeleportation u.uprops[TELEPORT].intrinsic
214 #define ETeleportation u.uprops[TELEPORT].extrinsic
215 #define Teleportation (HTeleportation || ETeleportation || \
216 can_teleport(youmonst.data))
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))
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))
234 #define EFlying u.uprops[FLYING].extrinsic
236 # define Flying (EFlying || is_flyer(youmonst.data) || \
237 (u.usteed && is_flyer(u.usteed->data)))
239 # define Flying (EFlying || is_flyer(youmonst.data))
241 /* May touch surface; does not override any others */
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 */
248 #define HSwimming u.uprops[SWIMMING].intrinsic
249 #define ESwimming u.uprops[SWIMMING].extrinsic /* [Tom] */
251 # define Swimming (HSwimming || ESwimming || \
252 is_swimmer(youmonst.data) || \
253 (u.usteed && is_swimmer(u.usteed->data)))
255 # define Swimming (HSwimming || ESwimming || \
256 is_swimmer(youmonst.data))
258 /* Get wet, don't go under water unless if amphibious */
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 */
266 #define Breathless (HMagical_breathing || EMagical_breathing || \
267 breathless(youmonst.data))
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. */
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))
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 */
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)
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)
293 #define HRegeneration u.uprops[REGENERATION].intrinsic
294 #define ERegeneration u.uprops[REGENERATION].extrinsic
295 #define Regeneration (HRegeneration || ERegeneration || \
296 regenerates(youmonst.data))
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)
302 #define HProtection u.uprops[PROTECTION].intrinsic
303 #define EProtection u.uprops[PROTECTION].extrinsic
304 #define Protection (HProtection || EProtection)
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)
314 #define HPolymorph u.uprops[POLYMORPH].intrinsic
315 #define EPolymorph u.uprops[POLYMORPH].extrinsic
316 #define Polymorph (HPolymorph || EPolymorph)
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)
322 #define HUnchanging u.uprops[UNCHANGING].intrinsic
323 #define EUnchanging u.uprops[UNCHANGING].extrinsic
324 #define Unchanging (HUnchanging || EUnchanging) /* KMH */
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)
331 #define EReflecting u.uprops[REFLECTING].extrinsic
332 #define Reflecting (EReflecting || \
333 (youmonst.data == &mons[PM_SILVER_DRAGON]))
335 #define Free_action u.uprops[FREE_ACTION].extrinsic /* [Tom] */
337 #define Fixed_abil u.uprops[FIXED_ABIL].extrinsic /* KMH */
339 #define Lifesaved u.uprops[LIFESAVED].extrinsic
342 #endif /* YOUPROP_H */