]> granicus.if.org Git - nethack/commitdiff
displacer beast as food
authorPatR <rankin@nethack.org>
Mon, 4 May 2020 16:50:11 +0000 (09:50 -0700)
committerPatR <rankin@nethack.org>
Mon, 4 May 2020 16:50:11 +0000 (09:50 -0700)
Make eating a displacer beast corpse or a tin of displacer beast
meat confer temporary Displacement lasting 6d6 turns.

include/extern.h
include/youprop.h
src/do_wear.c
src/eat.c
src/timeout.c

index 376e50f20e633d182176156b63074929e45a471c..f41f9531a65bcfe49e1be74c767563211b4094c1 100644 (file)
@@ -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 *));
index 0faafe102055a8f4bfefd5a08ed0fc086ddc84ca..c7bce068cbf8c034fb3f174e86c825be2c9e629e 100644 (file)
 #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
index 13630e557b523bbcf8bb7b04f186ec1615232479..0aebf7ffbf321ff75760af465eeac1f3d90f1df2 100644 (file)
@@ -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");
index 5171785f594fc930214242c40df0c8086e178d75..ea4572f33227e67f5b9428411d1efc2eaa85284a 100644 (file)
--- 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 */
index ae7cf9e69ac32b89d8cbdb6a7fb875a12e482b54..d1494b73dcfd3e16e7b1e8cbfd2b892365f2362c 100644 (file)
@@ -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) {