-/* 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. */
#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 */
-/* 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. */
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;
(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;
}
}
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);
-/* 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. */
* 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)
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;
}