]> granicus.if.org Git - nethack/commitdiff
identify_pack (trunk only)
authornethack.rankin <nethack.rankin>
Sat, 16 Feb 2008 02:31:34 +0000 (02:31 +0000)
committernethack.rankin <nethack.rankin>
Sat, 16 Feb 2008 02:31:34 +0000 (02:31 +0000)
     Three years ago <email deleted> reported that
stepping off the end of inventory via typing space to go to the next menu
page wasted his identify scroll.  He suggested that some people might do
that because they don't know how to back up in a multi-page menu.  I
pointed out the Guidebook section that describes < and ^ to go back one
page or back to start and left things at that.  However, traditional mode
reprompts if you step through all of inventory without choosing something,
so this changes identify-via-menu to do likewise.  You can dismiss the
menu with ESC to really avoid choosing anything.

     This also makes identification of N items when you're carrying N or
fewer unID'd things behave the same as identify all:  identify everything
without any prompting.

doc/fixes35.0
include/hack.h
src/invent.c
src/pickup.c

index 8628384c293387b5e95e33f4b1f7db97ef488a37..f80ad40a1c59848429f2a3131915d2960bfd3c14 100644 (file)
@@ -280,6 +280,7 @@ implement energy vortex's previously unused energy drain attack
 changing alignment type resets alignment record to 0 (nomimally aligned)
 while polymorphed, suppress attribute gain/lose earned by pre-poly exercise
 wizard mode #monpolycontrol prompting asked about "it" when monster was unseen
+reprompt if player fails to make a menu choice during inventory identification
 
 
 Platform- and/or Interface-Specific Fixes
index ee023e80fd2a7d7d4c89e82dbea872cdd7f69230..d9abaee5f41b74ee43650cea3e497d077fbe6844 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)hack.h     3.5     2008/01/30      */
+/*     SCCS Id: @(#)hack.h     3.5     2008/02/15      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -221,7 +221,8 @@ NEARDATA extern coord bhitpos;      /* place where throw or zap hits or stops */
 #define USE_INVLET       0x4   /* use object's invlet */
 #define INVORDER_SORT    0x8   /* sort objects by packorder */
 #define SIGNAL_NOMENU    0x10  /* return -1 rather than 0 if none allowed */
-#define FEEL_COCKATRICE   0x20  /* engage cockatrice checks and react */
+#define SIGNAL_ESCAPE    0x20  /* return -2 rather than 0 for ESC */
+#define FEEL_COCKATRICE   0x40  /* engage cockatrice checks and react */
 
 /* Flags to control query_category() */
 /* BY_NEXTHERE used by query_category() too, so skip 0x01 */
index 67875b3f2ada3eee97152f8f7e2a6573ccc2a6a0..77d7e3e3632930fb85a10d51e17b80ef7bf455ed 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)invent.c   3.5     2007/11/01      */
+/*     SCCS Id: @(#)invent.c   3.5     2008/02/15      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -1626,15 +1626,16 @@ menu_identify(id_limit)
 int id_limit;
 {
     menu_item *pick_list;
-    int n, i, first = 1;
+    int n, i, first = 1, tryct = 5;
     char buf[BUFSZ];
     /* assumptions:  id_limit > 0 and at least one unID'd item is present */
 
     while (id_limit) {
        Sprintf(buf, "What would you like to identify %s?",
                first ? "first" : "next");
-       n = query_objlist(buf, invent, SIGNAL_NOMENU|USE_INVLET|INVORDER_SORT,
-               &pick_list, PICK_ANY, not_fully_identified);
+       n = query_objlist(buf, invent,
+                         SIGNAL_NOMENU|SIGNAL_ESCAPE|USE_INVLET|INVORDER_SORT,
+                         &pick_list, PICK_ANY, not_fully_identified);
 
        if (n > 0) {
            if (n > id_limit) n = id_limit;
@@ -1642,11 +1643,18 @@ int id_limit;
                (void) identify(pick_list[i].item.a_obj);
            free((genericptr_t) pick_list);
            mark_synch(); /* Before we loop to pop open another menu */
-       } else {
-           if (n < 0) pline("That was all.");
-           id_limit = 0; /* Stop now */
+           first = 0;
+       } else if (n == -2) {           /* player used ESC to quit menu */
+           break;
+       } else if (n == -1) {           /* no eligible items found */
+           pline("That was all.");
+           break;
+       } else if (!--tryct) {          /* stop re-prompting */
+           pline(thats_enough_tries);
+           break;
+       } else {                        /* try again */
+           pline("Choose an item; use ESC to decline.");
        }
-       first = 0;
     }
 }
 
@@ -1667,7 +1675,7 @@ boolean learning_id;      /* true if we just read unknown identify scroll */
     if (!unid_cnt) {
        You("have already identified all %sof your possessions.",
            learning_id ? "the rest " : "");
-    } else if (!id_limit) {
+    } else if (!id_limit || id_limit >= unid_cnt) {
        /* identify everything */
        if (unid_cnt == 1) {
            (void) identify(the_obj);
index dc23dcca06c0e249720c9da784a46f8cc0ad461b..5106f2a836a5cdd07c095f8be55cb9760f794e58 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)pickup.c   3.5     2007/04/25      */
+/*     SCCS Id: @(#)pickup.c   3.5     2008/02/15      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -717,6 +717,8 @@ menu_item **pick_list;      /* list of objects and counts to pick up */
  *     USE_INVLET        - Use object's invlet.
  *     INVORDER_SORT     - Use hero's pack order.
  *     SIGNAL_NOMENU     - Return -1 rather than 0 if nothing passes "allow".
+ *     SIGNAL_ESCAPE     - Return -1 rather than 0 if player uses ESC to
+ *                         pick nothing.
  */
 int
 query_objlist(qstr, olist, qflags, pick_list, how, allow)
@@ -808,7 +810,9 @@ boolean FDECL((*allow), (OBJ_P));/* allow function */
                if (mi->count == -1L || mi->count > mi->item.a_obj->quan)
                    mi->count = mi->item.a_obj->quan;
        } else if (n < 0) {
-           n = 0;      /* caller's don't expect -1 */
+           /* -1 is used for SIGNAL_NOMENU, so callers don't expect it
+              to indicate that the player declined to make a choice */
+           n = (qflags & SIGNAL_ESCAPE) ? -2 : 0;
        }
        return n;
 }