OSDN Git Service

shrink mine
[nethackexpress/trunk.git] / include / youprop.h
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 */