diff --git a/doc/fixes35.0 b/doc/fixes35.0 index 8628384c2..f80ad40a1 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -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 diff --git a/include/hack.h b/include/hack.h index ee023e80f..d9abaee5f 100644 --- a/include/hack.h +++ b/include/hack.h @@ -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 */ diff --git a/src/invent.c b/src/invent.c index 67875b3f2..77d7e3e36 100644 --- a/src/invent.c +++ b/src/invent.c @@ -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); diff --git a/src/pickup.c b/src/pickup.c index dc23dcca0..5106f2a83 100644 --- a/src/pickup.c +++ b/src/pickup.c @@ -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; }