From 59354953cced79ec3ecce17c0541f8b451345d67 Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Sun, 26 Nov 2006 05:15:52 +0000 Subject: [PATCH] minimal_xname (trunk only) simple_typename and obj_typename operate on item types rather than particular objects so have to assume that the item involved has been seen. That means that simple_typename(obj->otyp) is not suitable; if obj->dknown hasn't been set, it gives away information. This adds mininal_xname(obj) to be used for that purpose. I'm not aware of any straightforward way to actually expose the original problem; it's more than hypothetical but not something anyone's likely to have come across. Not fixed: test driver program reveals that obj_typename(GOLD_PIECE) and simple_typename(GOLD_PIECE) yield "coin of gold piece". But I don't think there's any way to get nethack to show that to the user. --- src/apply.c | 2 +- src/mkobj.c | 7 +++---- src/objnam.c | 56 +++++++++++++++++++++++++++++++++++++++++++++------- src/worn.c | 2 +- 4 files changed, 54 insertions(+), 13 deletions(-) diff --git a/src/apply.c b/src/apply.c index 0b4103fd2..a53a38932 100644 --- a/src/apply.c +++ b/src/apply.c @@ -697,7 +697,7 @@ struct obj *obj; boolean vis; if(!getdir((char *)0)) return 0; - mirror = simple_typename(obj->otyp); /* "mirror" or "looking glass" */ + mirror = simpleonames(obj); /* "mirror" or "looking glass" */ if(obj->cursed && !rn2(2)) { if (!Blind) pline_The("%s fogs up and doesn't reflect!", mirror); diff --git a/src/mkobj.c b/src/mkobj.c index f0985d19b..418190209 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -517,7 +517,7 @@ int alter_type; xchar ox, oy; char objroom; boolean set_bknown; - const char *those, *them, *what; + const char *those, *them; struct monst *shkp = 0; if (alter_type < 0 || alter_type >= SIZE(alteration_verbs)) { @@ -559,10 +559,9 @@ int alter_type; case OBJ_FREE: /* obj_no_longer_held() */ case OBJ_INVENT: if (set_bknown) obj->bknown = 1; - what = simple_typename(obj->otyp); - if (obj->quan != 1L) what = makeplural(what); verbalize("You %s %s %s, you pay for %s!", - alteration_verbs[alter_type], those, what, them); + alteration_verbs[alter_type], those, + simpleonames(obj), them); bill_dummy_object(obj); break; case OBJ_FLOOR: diff --git a/src/objnam.c b/src/objnam.c index 37ec1b220..c56b4930e 100644 --- a/src/objnam.c +++ b/src/objnam.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)objnam.c 3.5 2006/10/16 */ +/* SCCS Id: @(#)objnam.c 3.5 2006/11/25 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -13,6 +13,7 @@ STATIC_DCL char *FDECL(strprepend,(char *,const char *)); STATIC_DCL boolean FDECL(wishymatch, (const char *,const char *,BOOLEAN_P)); STATIC_DCL char *NDECL(nextobuf); STATIC_DCL void FDECL(releaseobuf, (char *)); +STATIC_DCL char *FDECL(minimal_xname, (struct obj *)); STATIC_DCL void FDECL(add_erosion_words, (struct obj *, char *)); struct Jitem { @@ -490,6 +491,47 @@ nameit: return(buf); } +/* similar to simple_typename but minimal_xname operates on a particular + object rather than its general type; it formats the most basic info: + potion -- if description not known + brown potion -- if oc_name_known not set + potion of object detection -- if discovered + */ +static char * +minimal_xname(obj) +struct obj *obj; +{ + char *bufp; + struct obj bareobj; + struct objclass saveobcls; + int otyp = obj->otyp; + + /* suppress user-supplied name */ + saveobcls.oc_uname = objects[otyp].oc_uname; + objects[otyp].oc_uname = 0; + /* suppress actual name if object's description is unknown */ + saveobcls.oc_name_known = objects[otyp].oc_name_known; + if (!obj->dknown) objects[otyp].oc_name_known = 0; + + /* caveat: this makes a lot of assumptions about which fields + are required in order for xname() to yield a sensible result */ + bareobj = zeroobj; + bareobj.otyp = otyp; + bareobj.oclass = obj->oclass; + bareobj.dknown = obj->dknown; + /* suppress known except for amulets (needed for fakes and real A-of-Y) */ + bareobj.known = (obj->oclass == AMULET_CLASS) ? obj->known : + /* default is "on" for types which don't use it */ + !objects[otyp].oc_uses_known; + bareobj.quan = 1L; /* don't want plural */ + bufp = distant_name(&bareobj, xname); /* xname(&bareobj) */ + if (!strncmp(bufp, "uncursed ", 9)) bufp += 9; /* Role_if(PM_PRIEST) */ + + objects[otyp].oc_uname = saveobcls.oc_uname; + objects[otyp].oc_name_known = saveobcls.oc_name_known; + return bufp; +} + /* xname() output augmented for multishot missile feedback */ char * mshot_xname(obj) @@ -1099,7 +1141,7 @@ unsigned lenlimit; outbuf = (*func)(obj); if (altfunc && (unsigned)strlen(outbuf) > lenlimit) { /* still long; use the alternate function (usually one of - the jackets around simple_typename()) */ + the jackets around minimal_xname()) */ releaseobuf(outbuf); outbuf = (*altfunc)(obj); } @@ -1469,9 +1511,9 @@ struct obj *obj; return s; } -/* returns "your simple_typename(obj->otyp)" - * or "Foobar's simple_typename(obj->otyp)" - * or "the simple_typename(obj-otyp)" +/* returns "your minimal_xname(obj)" + * or "Foobar's minimal_xname(obj)" + * or "the minimal_xname(obj)" */ char * ysimple_name(obj) @@ -1481,7 +1523,7 @@ struct obj *obj; char *s = shk_your(outbuf, obj); /* assert( s == outbuf ); */ int space_left = BUFSZ - 1 - strlen(s); - return strncat(s, simple_typename(obj->otyp), space_left); + return strncat(s, minimal_xname(obj), space_left); } /* capitalized variant of ysimple_name() */ @@ -1500,7 +1542,7 @@ char * simpleonames(obj) struct obj *obj; { - char *simpleoname = simple_typename(obj->otyp); + char *simpleoname = minimal_xname(obj); if (obj->quan != 1L) simpleoname = makeplural(simpleoname); return simpleoname; diff --git a/src/worn.c b/src/worn.c index aabb79049..9f8dd9371 100644 --- a/src/worn.c +++ b/src/worn.c @@ -498,7 +498,7 @@ outer_break: buf, distant_name(best,doname)); if (autocurse) pline("%s %s %s %s for a moment.", - s_suffix(Monnam(mon)), simple_typename(best->otyp), + s_suffix(Monnam(mon)), simpleonames(best), otense(best, "glow"), hcolor(NH_BLACK)); } /* can see it */ m_delay += objects[best->otyp].oc_delay;