]> granicus.if.org Git - nethack/commitdiff
wiz_identify change (trunk only)
authornethack.allison <nethack.allison>
Sat, 14 Jan 2006 17:02:22 +0000 (17:02 +0000)
committernethack.allison <nethack.allison>
Sat, 14 Jan 2006 17:02:22 +0000 (17:02 +0000)
This patch alters wiz_identify so that it displays an
inventory menu with all items shown identified
without actually identifying them.

You can just press ^I (or whatever the wiz_identify command
is) a second time, while the menu is displayed to actually identify
them (tested with TTY menus only).

include/flag.h
src/cmd.c
src/eat.c
src/invent.c
src/objnam.c

index 5a8c1e898a6f6ce6f282dab291ceb878bb009ef9..b4bcb101b82bfa6a58de14433a975ab16c82066b 100644 (file)
@@ -152,32 +152,39 @@ struct sysflag {
  */
 
 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 */
index bc6bf27dd9455d62063f73f05b2d51e00adba0bd..f2beb6d9ccefda99402f7c251ad8d2e9ce611b32 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -150,6 +150,7 @@ STATIC_PTR int NDECL(doattributes);
 STATIC_PTR int NDECL(doconduct); /**/
 STATIC_PTR boolean NDECL(minimal_enlightenment);
 
+STATIC_DCL char FDECL(cmd_from_func, (int NDECL((*))));
 STATIC_DCL void FDECL(enlght_line, (const char *,const char *,const char *,char *));
 STATIC_DCL char *FDECL(enlght_combatinc, (const char *,int,int,char *));
 #if defined(UNIX) || defined(SAFERHANGUP)
@@ -516,9 +517,13 @@ wiz_wish() /* Unlimited wishes for debug mode by Paul Polderman */
 STATIC_PTR int
 wiz_identify()
 {
-       if (wizard)     identify_pack(0);
-       else            pline("Unavailable command '^I'.");
-       return 0;
+       if (wizard) {
+               iflags.override_ID = (int)cmd_from_func(wiz_identify);
+               if (display_inventory((char *)0, TRUE) == -1)
+                       identify_pack(0);
+               iflags.override_ID = 0;
+       } else pline("Unavailable command '^I'.");
+       return 0;
 }
 
 /* ^F command - reveal the level map and any traps on it */
@@ -1749,6 +1754,17 @@ boolean initial;
     Cmd.move_SW = Cmd.dirchars[7];
 }
 
+STATIC_OVL char
+cmd_from_func(fn)
+int NDECL((*fn));
+{
+       int i;
+       for (i = 0; i < SIZE(cmdlist); ++i)
+               if (cmdlist[i].f_funct == fn)
+                       return cmdlist[i].f_char;
+       return 0;
+}
+
 /* decide whether a character (user input keystroke) requests screen repaint */
 boolean
 redraw_cmd(c)
index 86ea00471dd77d1a82683178cd5c5c1fbcc8711d..8d6dc02e7a3bd861981c6c57a91f5c8e5ecb5e75 100644 (file)
--- a/src/eat.c
+++ b/src/eat.c
@@ -1176,7 +1176,7 @@ char *buf;
            else if (mnum == NON_PM)
                Strcpy(buf, "empty tin");
            else {
-               if (obj->cknown && obj->spe < 0) {
+               if ((obj->cknown || iflags.override_ID) && obj->spe < 0) {
                    int r = tin_variety(obj, TRUE);
                    if (r == ROTTEN_TIN || r == HOMEMADE_TIN) {
                        /* put these before the word tin */
index f128178dce9b3fd33737a9152a713fa9d6a08548..00b17b0298bd1d0fe97985dfc25cec3b7001186a 100644 (file)
@@ -1732,7 +1732,7 @@ long* out_cnt;
        /* oxymoron? temporarily assign permanent inventory letters */
        if (!flags.invlet_constant) reassign();
 
-       if (lets && strlen(lets) == 1) {
+       if (lets && strlen(lets) == 1 && !iflags.override_ID) {
            /* when only one item of interest, use pline instead of menus;
               we actually use a fake message-line menu in order to allow
               the user to perform selection at the --More-- prompt for tty */
@@ -1750,6 +1750,18 @@ long* out_cnt;
        }
 
        start_menu(win);
+#ifdef WIZARD
+       if (wizard && iflags.override_ID) {
+               char prompt[BUFSZ];
+               any.a_char = -1;
+               /* wiz_identify stuffed the wiz_identify cmd character
+                  into iflags.override_ID */
+               Sprintf(prompt, "Debug Identify (%s to permanently identify)",
+                               visctrl(iflags.override_ID));
+               add_menu(win, NO_GLYPH, &any,' ', iflags.override_ID, ATR_NONE,
+                               prompt, MENU_UNSELECTED);
+       }
+#endif
 nextclass:
        classcount = 0;
        any.a_void = 0;         /* set all bits to zero */
index ffae54960670658f0d8d2a056d15984d40f605b9..a3acb6c58d46e6e47124830a97a2484fe91f5c81 100644 (file)
@@ -167,12 +167,14 @@ boolean
 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
@@ -224,6 +226,7 @@ register struct obj *obj;
        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))
@@ -239,16 +242,26 @@ register struct obj *obj;
        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)
@@ -264,7 +277,7 @@ register struct obj *obj;
                if (typ == LENSES)
                        Strcpy(buf, "pair of ");
 
-               if (!obj->dknown)
+               if (!dknown)
                        Strcat(buf, dn ? dn : actualn);
                else if (nn)
                        Strcat(buf, actualn);
@@ -290,11 +303,11 @@ register struct obj *obj;
                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;
                }
@@ -341,7 +354,7 @@ register struct obj *obj;
                }
 
                Strcpy(buf, actualn);
-               if (typ == TIN && obj->known)
+               if (typ == TIN && known)
                        tin_details(obj, omndx, buf);
                break;
            case COIN_CLASS:
@@ -365,15 +378,15 @@ register struct obj *obj;
                        (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);
@@ -388,7 +401,7 @@ register struct obj *obj;
                break;
        case SCROLL_CLASS:
                Strcpy(buf, "scroll");
-               if(!obj->dknown) break;
+               if(!dknown) break;
                if(nn) {
                        Strcat(buf, " of ");
                        Strcat(buf, actualn);
@@ -404,7 +417,7 @@ register struct obj *obj;
                }
                break;
        case WAND_CLASS:
-               if(!obj->dknown)
+               if(!dknown)
                        Strcpy(buf, "wand");
                else if(nn)
                        Sprintf(buf, "wand of %s", actualn);
@@ -414,7 +427,7 @@ register struct obj *obj;
                        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)
@@ -426,7 +439,7 @@ register struct obj *obj;
                        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);
@@ -439,7 +452,7 @@ register struct obj *obj;
            {
                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);
@@ -455,7 +468,7 @@ register struct obj *obj;
        }
        if (pluralize) Strcpy(buf, makeplural(buf));
 
-       if (obj->onamelth && obj->dknown) {
+       if (obj->onamelth && dknown) {
                Strcat(buf, " named ");
 nameit:
                Strcat(buf, ONAME(obj));
@@ -490,13 +503,14 @@ boolean
 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) */
@@ -528,7 +542,9 @@ struct obj *obj;
 char *prefix;
 {
        boolean iscrys = (obj->otyp == CRYSKNIFE);
+       boolean rknown;
 
+       rknown = (iflags.override_ID == 0) ? obj->rknown : TRUE;
 
        if (!is_damageable(obj) && !iscrys) return;
 
@@ -550,7 +566,7 @@ char *prefix;
                Strcat(prefix, is_corrodeable(obj) ? "corroded " :
                        "rotted ");
        }
-       if (obj->rknown && obj->oerodeproof)
+       if (rknown && obj->oerodeproof)
                Strcat(prefix,
                       iscrys ? "fixed " :
                       is_rustprone(obj) ? "rustproof " :
@@ -563,6 +579,7 @@ doname(obj)
 register struct obj *obj;
 {
        boolean ispoisoned = FALSE;
+       boolean known, cknown, bknown, lknown;
        int omndx = obj->corpsenm;
        char prefix[PREFIX];
        char tmpbuf[PREFIX+1];
@@ -571,6 +588,14 @@ register struct obj *obj;
         */
        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(),
@@ -600,11 +625,11 @@ register struct obj *obj;
 #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))) {
@@ -615,7 +640,7 @@ register struct obj *obj;
                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
@@ -637,7 +662,7 @@ register struct obj *obj;
                Strcat(prefix, "uncursed ");
        }
 
-       if (obj->lknown && Is_box(obj)) {
+       if (lknown && Is_box(obj)) {
            if (obj->obroken)
                Strcat(prefix, "unlockable ");
            else if (obj->olocked)
@@ -648,7 +673,7 @@ register struct obj *obj;
 
        if (obj->greased) Strcat(prefix, "greased ");
 
-       if (obj->cknown && Has_contents(obj)) {
+       if (cknown && Has_contents(obj)) {
            struct obj *curr;
            long itemcount = 0L;
 
@@ -669,7 +694,7 @@ register struct obj *obj;
                        Strcat(prefix, "poisoned ");
 plus:
                add_erosion_words(obj, prefix);
-               if(obj->known) {
+               if(known) {
                        Strcat(prefix, sitoa(obj->spe));
                        Strcat(prefix, " ");
                }
@@ -721,7 +746,7 @@ plus:
        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:
@@ -737,7 +762,7 @@ ring:
                    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, " ");
                }
@@ -751,10 +776,10 @@ ring:
                                         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, " ");