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.
This commit is contained in:
nethack.rankin
2006-11-26 05:15:52 +00:00
parent 95729beb4a
commit 59354953cc
4 changed files with 54 additions and 13 deletions

View File

@@ -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);

View File

@@ -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:

View File

@@ -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;

View File

@@ -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;