#endif
E const char *FDECL(fingers_or_gloves, (BOOLEAN_P));
E void FDECL(off_msg, (struct obj *));
+E void FDECL(toggle_displacement, (struct obj *, long, BOOLEAN_P));
E void FDECL(set_wear, (struct obj *));
E boolean FDECL(donning, (struct obj *));
E boolean FDECL(doffing, (struct obj *));
#define Invisible (Invis && !See_invisible)
/* Note: invisibility also hides inventory and steed */
-#define EDisplaced u.uprops[DISPLACED].extrinsic
-#define Displaced EDisplaced
+#define HDisplaced u.uprops[DISPLACED].intrinsic /* timed from corpse */
+#define EDisplaced u.uprops[DISPLACED].extrinsic /* worn cloak */
+#define Displaced (HDisplaced || EDisplaced)
#define HStealth u.uprops[STEALTH].intrinsic
#define EStealth u.uprops[STEALTH].extrinsic
static void FDECL(on_msg, (struct obj *));
static void FDECL(toggle_stealth, (struct obj *, long, BOOLEAN_P));
-static void FDECL(toggle_displacement, (struct obj *, long, BOOLEAN_P));
static int NDECL(Armor_on);
/* int NDECL(Boots_on); -- moved to extern.h */
static int NDECL(Cloak_on);
}
}
-/* putting on or taking off an item which confers displacement;
+/* putting on or taking off an item which confers displacement, or gaining
+ or losing timed displacement after eating a displacer beast corpse or tin;
give feedback and discover it iff displacement state is changing *and*
- hero is able to see self (or sense monsters) */
-static
+ hero is able to see self (or sense monsters); for timed, 'obj' is Null
+ and this is only called for the message */
void
toggle_displacement(obj, oldprop, on)
struct obj *obj;
return;
if (!oldprop /* extrinsic displacement from something else */
- && !(u.uprops[DISPLACED].intrinsic) /* (theoretical) */
- && !(u.uprops[DISPLACED].blocked) /* (also theoretical) */
+ && !(u.uprops[DISPLACED].intrinsic) /* timed, from eating */
+ && !(u.uprops[DISPLACED].blocked) /* (theoretical) */
/* we don't use canseeself() here because it augments vision
with touch, which isn't appropriate for deciding whether
we'll notice that monsters have trouble spotting the hero */
|| (Unblind_telepat
|| (Blind_telepat && Blind)
|| Detect_monsters))) {
- makeknown(obj->otyp);
+ if (obj)
+ makeknown(obj->otyp);
You_feel("that monsters%s have difficulty pinpointing your location.",
on ? "" : " no longer");
polyself(0);
}
break;
+ case PM_DISPLACER_BEAST:
+ if (!Displaced) /* give a message (before setting the timeout) */
+ toggle_displacement((struct obj *) 0, 0L, TRUE);
+ incr_itimeout(&HDisplaced, d(6, 6));
+ break;
case PM_DISENCHANTER:
/* picks an intrinsic at random and removes it; there's
no feedback if hero already lacks the chosen ability */