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