From: PatR Date: Tue, 12 Sep 2017 11:14:44 +0000 (-0700) Subject: address #H5590 - paranoid_confirm vs lycanthropy X-Git-Tag: NetHack-3.6.1_RC01~375 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5710944258a683ad5219d262ea055ac9a41f0571;p=nethack address #H5590 - paranoid_confirm vs lycanthropy 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. --- diff --git a/doc/Guidebook.mn b/doc/Guidebook.mn index de4415790..9a2667110 100644 --- a/doc/Guidebook.mn +++ b/doc/Guidebook.mn @@ -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. diff --git a/doc/Guidebook.tex b/doc/Guidebook.tex index c4a026a22..02923ba38 100644 --- a/doc/Guidebook.tex +++ b/doc/Guidebook.tex @@ -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. diff --git a/doc/fixes36.1 b/doc/fixes36.1 index f07eb50c6..76989dbfb 100644 --- a/doc/fixes36.1 +++ b/doc/fixes36.1 @@ -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 diff --git a/include/flag.h b/include/flag.h index ac3844fc3..a51eb68ef 100644 --- a/include/flag.h +++ b/include/flag.h @@ -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 */ diff --git a/src/options.c b/src/options.c index 903c54971..2c83c4af3 100644 --- a/src/options.c +++ b/src/options.c @@ -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" diff --git a/src/timeout.c b/src/timeout.c index 81285fc37..c0bc89bc6 100644 --- a/src/timeout.c +++ b/src/timeout.c @@ -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(); } diff --git a/src/were.c b/src/were.c index c8ee49650..b61d16402 100644 --- a/src/were.c +++ b/src/were.c @@ -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 */