]> granicus.if.org Git - nethack/commitdiff
address #H5590 - paranoid_confirm vs lycanthropy
authorPatR <rankin@nethack.org>
Tue, 12 Sep 2017 11:14:44 +0000 (04:14 -0700)
committerPatR <rankin@nethack.org>
Tue, 12 Sep 2017 11:14:44 +0000 (04:14 -0700)
Polymorph control gives the player a chance to accept or reject a form
change due to lycanthropy, but if it occurs during combat or movement
the player might type 'y' before realizing that the prompt is pending.
Provide a paranoid_confirmation setting for 'Were-change' to allow a
player to require "yes" instead of 'y' for that.

The existing setting 'wand' is renamed to 'wand-break' and now requires
at least two letters in the config file options instead of just 1.  The
spelling of its synonym is changed from 'breakwand' to 'break-wand';
it can be shorted to as few as 2 letters (same as before) but if more
than 5 are present, the new dash is required.

Both 'wand-break' and 'Were-change' are placed before 'pray' in the 'O'
menu for paranoid_confirmation so that all the "yes" vs 'y' settings
are grouped together.

Bonus fixes:
Reverting from were-critter form to human (due to timeout) did not give
a player with polymorph control the option of remaining in creature
form; now it does.
The 'O' command's menu would not show "wand" (now "wand-break") in the
current value of paranoid_confirmation.  (A post 3.6.0 issue, so no
fixes entry included.)

The revised Guidebook.mn has been tested; Guidebook.tex has not.

doc/Guidebook.mn
doc/Guidebook.tex
doc/fixes36.1
include/flag.h
src/options.c
src/timeout.c
src/were.c

index de4415790ec5b00e5ec84f0799e15cbd7a96bf23..9a2667110f2bfd89bc65362260eacc5080329463 100644 (file)
@@ -1,4 +1,4 @@
-.\" $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.224 $ $NHDT-Date: 1498078870 2017/06/21 21:01:10 $
+.\" $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.233 $ $NHDT-Date: 1505214878 2017/09/12 11:14:38 $
 .ds h0 "NetHack Guidebook
 .ds h1
 .ds h2 %
@@ -611,6 +611,9 @@ location other than the current position.
 Wait or rest, do nothing for one turn.
 .lp a
 Apply (use) a tool (pick-axe, key, lamp...).
+.lp ""
+If used on a wand, that wand will be broken, releasing its magic in the
+process.  Confirmation is required.
 .lp A
 Remove one or more worn items, such as armor.
 .lp ""
@@ -926,10 +929,16 @@ choosing the item to adjust, enter a count prior to its letter.
 .lp #annotate
 Allows you to specify one line of text to associate with the current
 dungeon level.  All levels with annotations are displayed by the
-``#overview'' command. Autocompletes. Default key is 'M-A', and '^N' if number_pad is on.
+``#overview'' command. Autocompletes. Default key is 'M-A', and '^N'
+if number_pad is on.
 .lp #apply
 Apply (use) a tool such as a pick-axe, a key, or a lamp. Default key is 'a'.
-If the tool used acts on items on the floor, using the `m' prefix skips those items.
+.lp ""
+If the tool used acts on items on the floor, using the `m' prefix skips
+those items.
+.lp ""
+If used on a wand, that wand will be broken, releasing its magic in the
+process.  Confirmation is required.
 .lp #attributes
 Show your attributes. Default key is '^X'.
 .lp #autopickup
@@ -2726,7 +2735,7 @@ at the end from the previous order.
 .lp paranoid_confirmation
 A space separated list of specific situations where alternate
 prompting is desired.  The default is paranoid_confirmation:pray.
-.PS Confirm
+.PS Were-change
 .PL Confirm
 for any prompts which are set to require "yes" rather than 'y', also
 require "no" to reject instead of accepting any non-yes response as no
@@ -2741,11 +2750,14 @@ require "yes" rather than 'y' to confirm saving
 bones data when dying in debug mode;
 .PL attack
 require "yes" rather than 'y' to confirm attacking a peaceful monster;
+.PL wand-break
+require "yes" rather than 'y' to confirm breaking a wand;
+.PL Were-change
+require "yes" rather than 'y' to confirm changing form due to lycanthropy
+when hero has polymorph control;
 .PL pray
 require 'y' to confirm an attempt to pray rather
 than immediately praying; on by default;
-.PL wand
-require "yes" rather than 'y' to confirm breaking a wand;
 .PL Remove
 require selection from inventory for 'R' and 'T'
 commands even when wearing just one applicable item.
index c4a026a222a9345c764d43485c567de32b7c1070..02923ba38c60d2ef0832cdb3e6a67d1eaf3fb325 100644 (file)
@@ -738,7 +738,10 @@ location other than the current position.
 Wait or rest, do nothing for one turn.
 %.lp
 \item[\tb{a}]
-Apply (use) a tool (pick-axe, key, lamp \ldots).
+Apply (use) a tool (pick-axe, key, lamp \ldots).\\
+%.lp ""
+If used on a wand, that wand will be broken, releasing its magic in the
+process.  Confirmation is required.
 %.lp
 \item[\tb{A}]
 Remove one or more worn items, such as armor.\\
@@ -1112,9 +1115,12 @@ and '{\tt \^{}N}' if {\it number\verb+_+pad\/} is on.
 %.lp
 \item[\tb{\#apply}]
 Apply (use) a tool such as a pick-axe, a key, or a lamp.
-Default key is '{\tt a}'.
+Default key is '{\tt a}'.\\
 If the tool used acts on items on the floor, using the `{\tt m}' prefix
-skips those items.
+skips those items.\\
+%.lp ""
+If used on a wand, that wand will be broken, releasing its magic in the
+process.  Confirmation is required.
 %.lp
 \item[\tb{\#attributes}]
 Show your attributes. Default key is '{\tt \^{}X}'.\\
@@ -3323,7 +3329,7 @@ prompting is desired.  The default is ``{\it paranoid\verb+_+confirmation:pray}'
 %.sd
 %.si
 \newlength{\pcwidth}
-\settowidth{\pcwidth}{\tt Confirm}
+\settowidth{\pcwidth}{\tt Were-change}
 \addtolength{\pcwidth}{\labelsep}
 \blist{\leftmargin \pcwidth \topsep 1mm \itemsep 0mm}
 \item[{\tt Confirm}]
@@ -3342,13 +3348,18 @@ bones data when dying in debug mode
 \item[{\tt attack~}]
 require ``{\tt yes}'' rather than `{\tt y}' to confirm attacking
 a peaceful monster;
+\item[{\tt wand-break}]
+require ``{\tt yes}'' rather than `{\tt y}' to confirm breaking
+a wand;
+\item[{\tt Were-change}]
+require ``{\tt yes}'' rather than `{\tt y}' to confirm changing form
+due to lycanthropy
+when hero has polymorph control;
 \item[{\tt pray~~~}]
 require `{\tt y}' to confirm an attempt to pray rather
 than immediately praying; on by default;
-\item[{\tt wand}]
-require ``{\tt yes}'' rather than `{\tt y}' to confirm breaking
-a wand;
-\item[{\tt Remove~}] require selection from inventory for `{\tt R}' and `{\tt T}'
+\item[{\tt Remove~}] require selection from inventory for `{\tt R}'
+and `{\tt T}'
 commands even when wearing just one applicable item.
 \item[{\tt all~~~~}]
 turn on all of the above.
index f07eb50c63a5d1b423e44957ccfb74e02834b38c..76989dbfb1e42b51a6b63b2e86993d16b2c70667 100644 (file)
@@ -639,6 +639,9 @@ blinded hero or monster who breathes vapor from broken potion of healing,
 sysconf definition BONES_POOLS to allow more bones files per level
 blessed scroll of fire lets you choose explosion location like stinking cloud
 optional sections in the config file, selected with CHOOSE
+new paranoid_confirm settings: wand-break to require "yes" rather than 'y'
+       to break a wand via (a)pply, and Were-change to require "yes" rather
+       than 'y' when hero inflicted with lycanthropy has polymorph control
 
 
 Platform- and/or Interface-Specific New Features
index ac3844fc3dd0790d577546ca981186a41217d59b..a51eb68ef52fe619b3f084b23fe41b5f7c5a1f80 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 flag.h  $NHDT-Date: 1498078871 2017/06/21 21:01:11 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.119 $ */
+/* NetHack 3.6 flag.h  $NHDT-Date: 1505214875 2017/09/12 11:14:35 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.123 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -60,15 +60,16 @@ struct flag {
     unsigned long suppress_alert;
 #define NEW_MOON 0
 #define FULL_MOON 4
-    int paranoia_bits; /* alternate confirmation prompting */
-#define PARANOID_CONFIRM 0x01
-#define PARANOID_QUIT 0x02
-#define PARANOID_DIE 0x04
-#define PARANOID_BONES 0x08
-#define PARANOID_HIT 0x10
-#define PARANOID_PRAY 0x20
-#define PARANOID_REMOVE 0x40
-#define PARANOID_BREAKWAND 0x80
+    unsigned paranoia_bits; /* alternate confirmation prompting */
+#define PARANOID_CONFIRM    0x0001
+#define PARANOID_QUIT       0x0002
+#define PARANOID_DIE        0x0004
+#define PARANOID_BONES      0x0008
+#define PARANOID_HIT        0x0010
+#define PARANOID_PRAY       0x0020
+#define PARANOID_REMOVE     0x0040
+#define PARANOID_BREAKWAND  0x0080
+#define PARANOID_WERECHANGE 0x0100
     int pickup_burden; /* maximum burden before prompt */
     int pile_limit;    /* controls feedback when walking over objects */
     char inv_order[MAXOCLASSES];
@@ -441,6 +442,9 @@ enum runmode_types {
 #define ParanoidRemove ((flags.paranoia_bits & PARANOID_REMOVE) != 0)
 /* breakwand: Applying a wand */
 #define ParanoidBreakwand ((flags.paranoia_bits & PARANOID_BREAKWAND) != 0)
+/* werechange: accepting randomly timed werecreature change to transform
+   from human to creature or vice versa while having polymorph control */
+#define ParanoidWerechange ((flags.paranoia_bits & PARANOID_WERECHANGE) != 0)
 
 /* command parsing, mainly dealing with number_pad handling;
    not saved and restored */
index 903c549717c70d14ee5efc987616e02184a8b887..2c83c4af357e8a58bc81d2e8a9029b8a995d74b3 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 options.c       $NHDT-Date: 1505084668 2017/09/10 23:04:28 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.301 $ */
+/* NetHack 3.6 options.c       $NHDT-Date: 1505214875 2017/09/12 11:14:35 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.302 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -1229,7 +1229,10 @@ STATIC_VAR const struct paranoia_opts {
        takes precedence and "all" isn't present in the interactive menu,
        and "d"ie vs "d"eath, synonyms for each other so doesn't matter;
        (also "p"ray vs "P"aranoia, "pray" takes precedence since "Paranoia"
-       is just a synonym for "Confirm") */
+       is just a synonym for "Confirm"); "b"ones vs "br"eak-wand, the
+       latter requires at least two letters; "wand"-break vs "Were"-change,
+       both require at least two letters during config processing and use
+       case-senstivity for 'O's interactive menu */
     { PARANOID_CONFIRM, "Confirm", 1, "Paranoia", 2,
       "for \"yes\" confirmations, require \"no\" to reject" },
     { PARANOID_QUIT, "quit", 1, "explore", 1,
@@ -1240,12 +1243,14 @@ STATIC_VAR const struct paranoia_opts {
       "yes vs y to save bones data when dying in debug mode" },
     { PARANOID_HIT, "attack", 1, "hit", 1,
       "yes vs y to attack a peaceful monster" },
+    { PARANOID_BREAKWAND, "wand-break", 2, "break-wand", 2,
+      "yes vs y to break a wand via (a)pply" },
+    { PARANOID_WERECHANGE, "Were-change", 2, (const char *) 0, 0,
+      "yes vs y to change form when lycanthropy is controllable" },
     { PARANOID_PRAY, "pray", 1, 0, 0,
       "y to pray (supersedes old \"prayconfirm\" option)" },
     { PARANOID_REMOVE, "Remove", 1, "Takeoff", 1,
       "always pick from inventory for Remove and Takeoff" },
-    { PARANOID_BREAKWAND, "wand", 1, "breakwand", 2,
-      "yes vs y to break a wand" },
     /* for config file parsing; interactive menu skips these */
     { 0, "none", 4, 0, 0, 0 }, /* require full word match */
     { ~0, "all", 3, 0, 0, 0 }, /* ditto */
@@ -2712,7 +2717,8 @@ boolean tinitial, tfrom_file;
                 if (i == SIZE(paranoia)) {
                     /* didn't match anything, so arg is bad;
                        any flags already set will stay set */
-                    config_error_add("Unknown %s parameter '%s'", fullname, op);
+                    config_error_add("Unknown %s parameter '%s'",
+                                     fullname, op);
                     return FALSE;
                 }
                 /* move on to next token */
@@ -5210,20 +5216,9 @@ char *buf;
         char tmpbuf[QBUFSZ];
 
         tmpbuf[0] = '\0';
-        if (ParanoidConfirm)
-            Strcat(tmpbuf, " Confirm");
-        if (ParanoidQuit)
-            Strcat(tmpbuf, " quit");
-        if (ParanoidDie)
-            Strcat(tmpbuf, " die");
-        if (ParanoidBones)
-            Strcat(tmpbuf, " bones");
-        if (ParanoidHit)
-            Strcat(tmpbuf, " attack");
-        if (ParanoidPray)
-            Strcat(tmpbuf, " pray");
-        if (ParanoidRemove)
-            Strcat(tmpbuf, " Remove");
+        for (i = 0; paranoia[i].flagmask != 0; ++i)
+            if (flags.paranoia_bits & paranoia[i].flagmask)
+                Sprintf(eos(tmpbuf), " %s", paranoia[i].argname);
         Strcpy(buf, tmpbuf[0] ? &tmpbuf[1] : "none");
     } else if (!strcmp(optname, "pettype")) {
         Sprintf(buf, "%s", (preferred_pet == 'c') ? "cat"
index 81285fc37b3089ca812c88e9fcef910a4e35d49f..c0bc89bc6ca52682d131765b6092e29fa983dc81 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 timeout.c       $NHDT-Date: 1496619133 2017/06/04 23:32:13 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.71 $ */
+/* NetHack 3.6 timeout.c       $NHDT-Date: 1505214876 2017/09/12 11:14:36 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.75 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -363,6 +363,8 @@ nh_timeout()
     if (u.mtimedone && !--u.mtimedone) {
         if (Unchanging)
             u.mtimedone = rnd(100 * youmonst.data->mlevel + 1);
+        else if (is_were(youmonst.data))
+            you_unwere(FALSE); /* if polycontrl, asks whether to rehumanize */
         else
             rehumanize();
     }
index c8ee496503e5616244facb56eb12f98998474d48..b61d164026ee1224374d5a39f96b78d3d92211bb 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 were.c  $NHDT-Date: 1432512763 2015/05/25 00:12:43 $  $NHDT-Branch: master $:$NHDT-Revision: 1.18 $ */
+/* NetHack 3.6 were.c  $NHDT-Date: 1505214877 2017/09/12 11:14:37 $  $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.21 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -183,7 +183,7 @@ you_were()
         /* `+4' => skip "were" prefix to get name of beast */
         Sprintf(qbuf, "Do you want to change into %s?",
                 an(mons[u.ulycn].mname + 4));
-        if (yn(qbuf) == 'n')
+        if (!paranoid_query(ParanoidWerechange, qbuf))
             return;
     }
     (void) polymon(u.ulycn);
@@ -200,8 +200,11 @@ boolean purify;
         set_ulycn(NON_PM); /* cure lycanthropy */
     }
     if (!Unchanging && is_were(youmonst.data)
-        && (!controllable_poly || yn("Remain in beast form?") == 'n'))
+        && (!controllable_poly
+            || !paranoid_query(ParanoidWerechange, "Remain in beast form?")))
         rehumanize();
+    else if (is_were(youmonst.data) && !u.mtimedone)
+        u.mtimedone = rn1(200, 200); /* 40% of initial were change */
 }
 
 /* lycanthropy is being caught or cured, but no shape change is involved */