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.
This commit is contained in:
PatR
2017-09-12 04:14:44 -07:00
parent 8d1e0d1756
commit 5710944258
7 changed files with 77 additions and 47 deletions

View 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.

View 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.

View 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

View 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 */

View 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"

View 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();
}

View 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 */