*/
struct instance_flags {
- boolean cbreak; /* in cbreak mode, rogue format */
- boolean DECgraphics; /* use DEC VT-xxx extended character set */
- boolean echo; /* 1 to echo characters */
- boolean IBMgraphics; /* use IBM extended character set */
+ /* stuff that really isn't option or platform related. They are
+ * set and cleared during the game to control the internal
+ * behaviour of various NetHack functions and probably warrant
+ * a structure of their own elsewhere some day.
+ */
+ int in_lava_effects; /* hack for Boots_off() */
+ int purge_monsters; /* # of dead monsters still on fmon list */
+ int override_ID; /* true to force full identification of objects */
+ coord travelcc; /* coordinates for travel_cache */
+ boolean window_inited; /* true if init_nhwindows() completed */
+ boolean vision_inited; /* true if vision is ready */
+#ifdef WIZARD
+ boolean sanity_check; /* run sanity checks */
+ boolean mon_polycontrol; /* debug: control monster polymorphs */
+#endif
+ /* stuff that is related to options and/or user or platform preferences */
unsigned msg_history; /* hint: # of top lines to save */
+ int menu_headings; /* ATR for menu headings */
+ int *opt_booldup; /* for duplication of boolean opts in config file */
+ int *opt_compdup; /* for duplication of compound opts in config file */
+ boolean cbreak; /* in cbreak mode, rogue format */
boolean num_pad; /* use numbers for movement commands */
boolean news; /* print news */
- boolean window_inited; /* true if init_nhwindows() completed */
- boolean vision_inited; /* true if vision is ready */
boolean menu_tab_sep; /* Use tabs to separate option menu fields */
boolean menu_requested; /* Flag for overloaded use of 'm' prefix
* on some non-move commands */
boolean zerocomp; /* write zero-compressed save files */
boolean rlecomp; /* run-length comp of levels when writing savefile */
uchar num_pad_mode;
- int in_lava_effects; /* hack for Boots_off() */
- int menu_headings; /* ATR for menu headings */
- int purge_monsters; /* # of dead monsters still on fmon list */
- int *opt_booldup; /* for duplication of boolean opts in config file */
- int *opt_compdup; /* for duplication of compound opts in config file */
+ boolean DECgraphics; /* use DEC VT-xxx extended character set */
+ boolean echo; /* 1 to echo characters */
+ boolean IBMgraphics; /* use IBM extended character set */
uchar bouldersym; /* symbol for boulder display */
- coord travelcc; /* coordinates for travel_cache */
-#ifdef WIZARD
- boolean sanity_check; /* run sanity checks */
- boolean mon_polycontrol; /* debug: control monster polymorphs */
-#endif
#ifdef TTY_GRAPHICS
char prevmsg_window; /* type of old message window to use */
boolean extmenu; /* extended commands use menu interface */
obj_is_pname(obj)
register struct obj *obj;
{
- return((boolean)(obj->dknown && obj->known && obj->onamelth &&
- /* Since there aren't any objects which are both
- artifacts and unique, the last check is redundant. */
- obj->oartifact && !objects[obj->otyp].oc_unique));
+ return((boolean)(
+ ((obj->dknown && obj->known) || iflags.override_ID) && obj->onamelth &&
+ /* Since there aren't any objects which are both
+ artifacts and unique, the last check is redundant. */
+ obj->oartifact && !objects[obj->otyp].oc_unique));
}
+
/* Give the name of an object seen at a distance. Unlike xname/doname,
* we don't want to set dknown if it's not set already. The kludge used is
* to temporarily set Blind so that xname() skips the dknown setting. This
const char *dn = OBJ_DESCR(*ocl);
const char *un = ocl->oc_uname;
boolean pluralize = (obj->quan != 1L);
+ boolean known, dknown, bknown;
buf = nextobuf() + PREFIX; /* leave room for "17 -3 " */
if (Role_if(PM_SAMURAI) && Japanese_item_name(typ))
if (!nn && ocl->oc_uses_known && ocl->oc_unique) obj->known = 0;
if (!Blind) obj->dknown = TRUE;
if (Role_if(PM_PRIEST)) obj->bknown = TRUE;
+
+ if (iflags.override_ID) {
+ known = dknown = bknown = TRUE;
+ nn = 1;
+ } else {
+ known = obj->known;
+ dknown = obj->dknown;
+ bknown = obj->bknown;
+ }
+
if (obj_is_pname(obj))
goto nameit;
switch (obj->oclass) {
case AMULET_CLASS:
- if (!obj->dknown)
+ if (!dknown)
Strcpy(buf, "amulet");
else if (typ == AMULET_OF_YENDOR ||
typ == FAKE_AMULET_OF_YENDOR)
/* each must be identified individually */
- Strcpy(buf, obj->known ? actualn : dn);
+ Strcpy(buf, known ? actualn : dn);
else if (nn)
Strcpy(buf, actualn);
else if (un)
if (typ == LENSES)
Strcpy(buf, "pair of ");
- if (!obj->dknown)
+ if (!dknown)
Strcat(buf, dn ? dn : actualn);
else if (nn)
Strcat(buf, actualn);
if(is_boots(obj) || is_gloves(obj)) Strcpy(buf,"pair of ");
if(obj->otyp >= ELVEN_SHIELD && obj->otyp <= ORCISH_SHIELD
- && !obj->dknown) {
+ && !dknown) {
Strcpy(buf, "shield");
break;
}
- if(obj->otyp == SHIELD_OF_REFLECTION && !obj->dknown) {
+ if(obj->otyp == SHIELD_OF_REFLECTION && !dknown) {
Strcpy(buf, "smooth shield");
break;
}
}
Strcpy(buf, actualn);
- if (typ == TIN && obj->known)
+ if (typ == TIN && known)
tin_details(obj, omndx, buf);
break;
case COIN_CLASS:
(obj->owt > ocl->oc_weight) ? "very " : "");
break;
case POTION_CLASS:
- if (obj->dknown && obj->odiluted)
+ if (dknown && obj->odiluted)
Strcpy(buf, "diluted ");
- if(nn || un || !obj->dknown) {
+ if(nn || un || !dknown) {
Strcat(buf, "potion");
- if(!obj->dknown) break;
+ if(!dknown) break;
if(nn) {
Strcat(buf, " of ");
if (typ == POT_WATER &&
- obj->bknown && (obj->blessed || obj->cursed)) {
+ bknown && (obj->blessed || obj->cursed)) {
Strcat(buf, obj->blessed ? "holy " : "unholy ");
}
Strcat(buf, actualn);
break;
case SCROLL_CLASS:
Strcpy(buf, "scroll");
- if(!obj->dknown) break;
+ if(!dknown) break;
if(nn) {
Strcat(buf, " of ");
Strcat(buf, actualn);
}
break;
case WAND_CLASS:
- if(!obj->dknown)
+ if(!dknown)
Strcpy(buf, "wand");
else if(nn)
Sprintf(buf, "wand of %s", actualn);
Sprintf(buf, "%s wand", dn);
break;
case SPBOOK_CLASS:
- if (!obj->dknown) {
+ if (!dknown) {
Strcpy(buf, "spellbook");
} else if (nn) {
if (typ != SPE_BOOK_OF_THE_DEAD)
Sprintf(buf, "%s spellbook", dn);
break;
case RING_CLASS:
- if(!obj->dknown)
+ if(!dknown)
Strcpy(buf, "ring");
else if(nn)
Sprintf(buf, "ring of %s", actualn);
{
const char *rock =
(ocl->oc_material == MINERAL) ? "stone" : "gem";
- if (!obj->dknown) {
+ if (!dknown) {
Strcpy(buf, rock);
} else if (!nn) {
if (un) Sprintf(buf,"%s called %s", rock, un);
}
if (pluralize) Strcpy(buf, makeplural(buf));
- if (obj->onamelth && obj->dknown) {
+ if (obj->onamelth && dknown) {
Strcat(buf, " named ");
nameit:
Strcat(buf, ONAME(obj));
the_unique_obj(obj)
register struct obj *obj;
{
- if (!obj->dknown)
+ boolean known = (obj->known || iflags.override_ID);
+ if (!obj->dknown && !iflags.override_ID)
return FALSE;
- else if (obj->otyp == FAKE_AMULET_OF_YENDOR && !obj->known)
+ else if (obj->otyp == FAKE_AMULET_OF_YENDOR && !known)
return TRUE; /* lie */
else
return (boolean)(objects[obj->otyp].oc_unique &&
- (obj->known || obj->otyp == AMULET_OF_YENDOR));
+ (known || obj->otyp == AMULET_OF_YENDOR));
}
/* should monster type be prefixed with "the"? (mostly used for corpses) */
char *prefix;
{
boolean iscrys = (obj->otyp == CRYSKNIFE);
+ boolean rknown;
+ rknown = (iflags.override_ID == 0) ? obj->rknown : TRUE;
if (!is_damageable(obj) && !iscrys) return;
Strcat(prefix, is_corrodeable(obj) ? "corroded " :
"rotted ");
}
- if (obj->rknown && obj->oerodeproof)
+ if (rknown && obj->oerodeproof)
Strcat(prefix,
iscrys ? "fixed " :
is_rustprone(obj) ? "rustproof " :
register struct obj *obj;
{
boolean ispoisoned = FALSE;
+ boolean known, cknown, bknown, lknown;
int omndx = obj->corpsenm;
char prefix[PREFIX];
char tmpbuf[PREFIX+1];
*/
register char *bp = xname(obj);
+ if (iflags.override_ID) known = cknown = bknown = lknown = TRUE;
+ else {
+ known = obj->known;
+ cknown = obj->cknown;
+ bknown = obj->bknown;
+ lknown = obj->lknown;
+ }
+
/* When using xname, we want "poisoned arrow", and when using
* doname, we want "poisoned +0 arrow". This kludge is about the only
* way to do it, at least until someone overhauls xname() and doname(),
#endif
/* "empty" goes at the beginning, but item count goes at the end */
- if (obj->cknown &&
+ if (cknown &&
(Is_container(obj) || obj->otyp == STATUE) && !Has_contents(obj))
Strcat(prefix, "empty ");
- if (obj->bknown &&
+ if (bknown &&
obj->oclass != COIN_CLASS &&
(obj->otyp != POT_WATER || !objects[POT_WATER].oc_name_known
|| (!obj->cursed && !obj->blessed))) {
Strcat(prefix, "cursed ");
else if (obj->blessed)
Strcat(prefix, "blessed ");
- else if ((!obj->known || !objects[obj->otyp].oc_charged ||
+ else if ((!known || !objects[obj->otyp].oc_charged ||
(obj->oclass == ARMOR_CLASS ||
obj->oclass == RING_CLASS))
/* For most items with charges or +/-, if you know how many
Strcat(prefix, "uncursed ");
}
- if (obj->lknown && Is_box(obj)) {
+ if (lknown && Is_box(obj)) {
if (obj->obroken)
Strcat(prefix, "unlockable ");
else if (obj->olocked)
if (obj->greased) Strcat(prefix, "greased ");
- if (obj->cknown && Has_contents(obj)) {
+ if (cknown && Has_contents(obj)) {
struct obj *curr;
long itemcount = 0L;
Strcat(prefix, "poisoned ");
plus:
add_erosion_words(obj, prefix);
- if(obj->known) {
+ if(known) {
Strcat(prefix, sitoa(obj->spe));
Strcat(prefix, " ");
}
case WAND_CLASS:
add_erosion_words(obj, prefix);
charges:
- if(obj->known)
+ if(known)
Sprintf(eos(bp), " (%d:%d)", (int)obj->recharged, obj->spe);
break;
case POTION_CLASS:
Strcat(bp, body_part(HAND));
Strcat(bp, ")");
}
- if(obj->known && objects[obj->otyp].oc_charged) {
+ if(known && objects[obj->otyp].oc_charged) {
Strcat(prefix, sitoa(obj->spe));
Strcat(prefix, " ");
}
CXN_ARTICLE|CXN_NOCORPSE));
} else if (obj->otyp == EGG) {
#if 0 /* corpses don't tell if they're stale either */
- if (obj->known && stale_egg(obj))
+ if (known && stale_egg(obj))
Strcat(prefix, "stale ");
#endif
- if (omndx >= LOW_PM && (obj->known ||
+ if (omndx >= LOW_PM && (known ||
(mvitals[omndx].mvflags & MV_KNOWS_EGG))) {
Strcat(prefix, mons[omndx].mname);
Strcat(prefix, " ");