From: PatR Date: Mon, 4 May 2020 16:50:11 +0000 (-0700) Subject: displacer beast as food X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=16562b2892436d1823d7c978a2595673df16b2d8;p=nethack displacer beast as food Make eating a displacer beast corpse or a tin of displacer beast meat confer temporary Displacement lasting 6d6 turns. --- diff --git a/include/extern.h b/include/extern.h index 376e50f20..f41f9531a 100644 --- a/include/extern.h +++ b/include/extern.h @@ -489,6 +489,7 @@ E int NDECL(take_off); #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 *)); diff --git a/include/youprop.h b/include/youprop.h index 0faafe102..c7bce068c 100644 --- a/include/youprop.h +++ b/include/youprop.h @@ -180,8 +180,9 @@ #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 diff --git a/src/do_wear.c b/src/do_wear.c index 13630e557..0aebf7ffb 100644 --- a/src/do_wear.c +++ b/src/do_wear.c @@ -22,7 +22,6 @@ static NEARDATA const long takeoff_order[] = { 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); @@ -114,10 +113,11 @@ boolean 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; @@ -128,8 +128,8 @@ boolean on; 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 */ @@ -142,7 +142,8 @@ boolean on; || (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"); diff --git a/src/eat.c b/src/eat.c index 5171785f5..ea4572f33 100644 --- a/src/eat.c +++ b/src/eat.c @@ -1075,6 +1075,11 @@ int pm; 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 */ diff --git a/src/timeout.c b/src/timeout.c index ae7cf9e69..d1494b73d 100644 --- a/src/timeout.c +++ b/src/timeout.c @@ -681,6 +681,10 @@ nh_timeout() spoteffects(TRUE); } break; + case DISPLACED: + if (!Displaced) /* give a message */ + toggle_displacement((struct obj *) 0, 0L, FALSE); + break; case WARN_OF_MON: /* timed Warn_of_mon is via #wizintrinsic only */ if (!Warn_of_mon) {