\#wizidentify bug - 'Not carrying anything.'

when carrying things.  The fuzzer toggled on 'perm_invent' and after
interrupting it I used ^I.  Having 'perm_invent' enabled makes the
inventory code avoid having a totally empty inventory display (by
supplying "Not carrying anything" instead--in the menu rather than
via normal pline) so that interface code will see a change and know
that an update is needed.  But to decide whether the menu was empty,
the inventory code was testing union 'any' field 'a_char' to check
whether some item had used the union (implying that something had
been passed to add_menu()), but wizidentify (^I) uses field 'a_obj'
instead.  Apparently the a_char bits stayed 0 because the menu ended
up with "Not carrying anything" after a list of inventory items.
Switch to a separate variable to track whether anything has been put
into the menu instead of trying to rely on the union.

Unrelated but noticed when checking other "Not carrying anything"
instances, the #adjust command ends early when there's no inventory
but it was asking for a letter to adjust even when the only thing in
inventory was gold in '$' slot, which isn't allowed to be adjusted
away from that slot.  Treat gold-only like no-invent.
This commit is contained in:
PatR
2019-06-23 11:31:21 -07:00
parent c968f03af3
commit 83410a3d4f
2 changed files with 20 additions and 10 deletions

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 invent.c $NHDT-Date: 1558234540 2019/05/19 02:55:40 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.258 $ */
/* NetHack 3.6 invent.c $NHDT-Date: 1561314651 2019/06/23 18:30:51 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.259 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Derek S. Ray, 2015. */
/* NetHack may be freely redistributed. See license for details. */
@@ -2550,7 +2550,7 @@ long *out_cnt;
menu_item *selected;
unsigned sortflags;
Loot *sortedinvent, *srtinv;
boolean wizid = FALSE;
boolean wizid = FALSE, gotsomething = FALSE;
if (lets && !*lets)
lets = 0; /* simplify tests: (lets) instead of (lets && *lets) */
@@ -2654,13 +2654,14 @@ long *out_cnt;
/* wiz_identify stuffed the wiz_identify command character (^I)
into iflags.override_ID for our use as an accelerator;
it could be ambiguous if player has assigned a letter to
the #wizidentify command */
the #wizidentify command, so include it as a group accelator
but use '_' as the primary selector */
if (unid_cnt > 1)
Sprintf(eos(prompt), " (%s for all)",
visctrl(iflags.override_ID));
add_menu(win, NO_GLYPH, &any, '_', iflags.override_ID, ATR_NONE,
prompt, MENU_UNSELECTED);
wizid = TRUE;
wizid = gotsomething = TRUE;
}
} else if (xtra_choice) {
/* wizard override ID and xtra_choice are mutually exclusive */
@@ -2670,6 +2671,7 @@ long *out_cnt;
any.a_char = HANDS_SYM; /* '-' */
add_menu(win, NO_GLYPH, &any, HANDS_SYM, 0, ATR_NONE,
xtra_choice, MENU_UNSELECTED);
gotsomething = TRUE;
}
nextclass:
classcount = 0;
@@ -2695,6 +2697,7 @@ long *out_cnt;
add_menu(win, obj_to_glyph(otmp, rn2_on_display_rng), &any, ilet,
wizid ? def_oc_syms[(int) otmp->oclass].sym : 0,
ATR_NONE, doname(otmp), MENU_UNSELECTED);
gotsomething = TRUE;
}
}
if (flags.sortpack) {
@@ -2712,13 +2715,14 @@ long *out_cnt;
any.a_char = '*';
add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE,
"(list everything)", MENU_UNSELECTED);
gotsomething = TRUE;
}
unsortloot(&sortedinvent);
/* for permanent inventory where we intend to show everything but
nothing has been listed (because there isn't anyhing to list;
recognized via any.a_char still being zero; the n==0 case above
gets skipped for perm_invent), put something into the menu */
if (iflags.perm_invent && !lets && !any.a_char) {
the n==0 case above gets skipped for perm_invent), put something
into the menu */
if (iflags.perm_invent && !lets && !gotsomething) {
any = zeroany;
add_menu(win, NO_GLYPH, &any, 0, 0, 0,
not_carrying_anything, MENU_UNSELECTED);
@@ -4016,8 +4020,11 @@ doorganize() /* inventory organizer by Del Lamb */
const char *adj_type;
boolean ever_mind = FALSE, collect;
if (!invent) {
You("aren't carrying anything to adjust.");
/* when no invent, or just gold in '$' slot, there's nothing to adjust */
if (!invent || (invent->oclass == COIN_CLASS
&& invent->invlet == GOLD_SYM && !invent->nobj)) {
You("aren't carrying anything %s.",
!invent ? "to adjust" : "adjustable");
return 0;
}