From b5b513fb444b6a3001b90e6373fbe488e437c392 Mon Sep 17 00:00:00 2001 From: PatR Date: Wed, 7 Feb 2018 17:31:44 -0800 Subject: [PATCH] 'Iu' vs unknown container contents An inventory of unpaid items where more than one was present would show |> bag's contents N zorkmids if any of the items were inside a container whose contents aren't known. But if there was only one item (so container must be owned by hero) the 'Iu' output menu was skipped for pline and yielded |> scroll of magic mapping 133 zorkmids Force the menu display if the lone unpaid item is inside a container whose contents are unknown. I'm not sure whether a hero-owned container can have both unknown contents and an unpaid item in normal play. I managed it while trying to fix a reported problem--except I can no longer find the relevant report--where itemized shop billing also revealed unseen container contents (for any number of items, not just 1). That isn't fixed yet, but I want to get the simpler 'Iu' part out of the way. --- doc/fixes36.1 | 2 ++ include/extern.h | 3 ++- src/invent.c | 14 +++++++++----- src/mkobj.c | 19 ++++++++++++++++++- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/doc/fixes36.1 b/doc/fixes36.1 index 9e430def8..9b8633956 100644 --- a/doc/fixes36.1 +++ b/doc/fixes36.1 @@ -507,6 +507,8 @@ shopkeepers in their own shop and priests in their own temple are no longer frightened by hero standing on scroll of scare monster the Wizard, Angels and lawful minions, the Riders, shopkeep/priest in own room are never frightened by tooled horns +'Iu' would reveal unknown container contents if carrying one unpaid item inside + a hero-owned container whose contents weren't known Fixes to Post-3.6.0 Problems that Were Exposed Via git Repository diff --git a/include/extern.h b/include/extern.h index afbf4e498..24a0c06cd 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1,4 +1,4 @@ -/* NetHack 3.6 extern.h $NHDT-Date: 1517128658 2018/01/28 08:37:38 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.624 $ */ +/* NetHack 3.6 extern.h $NHDT-Date: 1518053385 2018/02/08 01:29:45 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.625 $ */ /* Copyright (c) Steve Creps, 1988. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1284,6 +1284,7 @@ E struct obj *FDECL(splitobj, (struct obj *, long)); E struct obj *FDECL(unsplitobj, (struct obj *)); E void NDECL(clear_splitobjs); E void FDECL(replace_object, (struct obj *, struct obj *)); +E struct obj *FDECL(unknwn_contnr_contents, (struct obj *)); E void FDECL(bill_dummy_object, (struct obj *)); E void FDECL(costly_alteration, (struct obj *, int)); E struct obj *FDECL(mksobj, (int, BOOLEAN_P, BOOLEAN_P)); diff --git a/src/invent.c b/src/invent.c index 89d823eec..828a947df 100644 --- a/src/invent.c +++ b/src/invent.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 invent.c $NHDT-Date: 1512473628 2017/12/05 11:33:48 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.223 $ */ +/* NetHack 3.6 invent.c $NHDT-Date: 1518053384 2018/02/08 01:29:44 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.224 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -2541,22 +2541,26 @@ STATIC_OVL void dounpaid() { winid win; - struct obj *otmp, *marker; + struct obj *otmp, *marker, *contnr; register char ilet; char *invlet = flags.inv_order; int classcount, count, num_so_far; long cost, totcost; count = count_unpaid(invent); + otmp = marker = contnr = (struct obj *) 0; if (count == 1) { - marker = (struct obj *) 0; otmp = find_unpaid(invent, &marker); + contnr = unknwn_contnr_contents(otmp); + } + if (otmp && !contnr) { + /* 1 item; use pline instead of popup menu */ cost = unpaid_cost(otmp, FALSE); iflags.suppress_price++; /* suppress "(unpaid)" suffix */ pline1(xprname(otmp, distant_name(otmp, doname), - carried(otmp) ? otmp->invlet : CONTAINED_SYM, TRUE, - cost, 0L)); + carried(otmp) ? otmp->invlet : CONTAINED_SYM, + TRUE, cost, 0L)); iflags.suppress_price--; return; } diff --git a/src/mkobj.c b/src/mkobj.c index 567b84528..ee6928111 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 mkobj.c $NHDT-Date: 1513298759 2017/12/15 00:45:59 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.129 $ */ +/* NetHack 3.6 mkobj.c $NHDT-Date: 1518053380 2018/02/08 01:29:40 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.130 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -579,6 +579,23 @@ struct obj *otmp; } } +/* is 'obj' inside a container whose contents aren't known? + if so, return the outermost container meeting that criterium */ +struct obj * +unknwn_contnr_contents(obj) +struct obj *obj; +{ + struct obj *result = 0, *parent; + + while (obj->where == OBJ_CONTAINED) { + parent = obj->ocontainer; + if (!parent->cknown) + result = parent; + obj = parent; + } + return result; +} + /* * Create a dummy duplicate to put on shop bill. The duplicate exists * only in the billobjs chain. This function is used when a shop object