From: nethack.allison Date: Wed, 4 Sep 2002 01:31:20 +0000 (+0000) Subject: menu loot suggestion from newsgroup X-Git-Tag: MOVE2GIT~2440 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5797f8110b3d5916e233bcb4d48b401805ba9e04;p=nethack menu loot suggestion from newsgroup Newsgroups: rec.games.roguelike.nethack Subject: Re: YANI - empty containers interface On Mon, 2 Sep 2002 12:13:49 +0300, wrote: > I find the behaviour when trying to put something in an empty container > quite irritating. Let's remind it: > #loot > "The is empty. Do you want to put something in it? (y/n)" > This means I have to read the message and to press 'y' or to cancel via > Esc. > For comparison, non-empty containers behave like this - please forgive > me that I've forgotten the exact words: > #loot > "Do what? > o - take out > i - put in > b - both of the above" > So my suggestion is to change the behaviour of empty containers to be > the same as non-empty ones. That is: > #loot > "Do what? > i - put in" > This way, I don't have to look at the container. If I want to put > something in, pressing 'i' will lead to the same results in both cases. This part of the suggestion was not implemented, however: > If I want to take something out, then pressing 'o' or 'b' - although > they are not in the list of choices - will display a message "This > is empty" and end the #loot-ing session. --- diff --git a/src/pickup.c b/src/pickup.c index 1df2f4353..c52538f02 100644 --- a/src/pickup.c +++ b/src/pickup.c @@ -32,7 +32,7 @@ STATIC_PTR int FDECL(in_container,(struct obj *)); STATIC_PTR int FDECL(ck_bag,(struct obj *)); STATIC_PTR int FDECL(out_container,(struct obj *)); STATIC_DCL int FDECL(menu_loot, (int, struct obj *, BOOLEAN_P)); -STATIC_DCL int FDECL(in_or_out_menu, (const char *,struct obj *)); +STATIC_DCL int FDECL(in_or_out_menu, (const char *,struct obj *, BOOLEAN_P, BOOLEAN_P)); STATIC_DCL int FDECL(container_at, (int, int, BOOLEAN_P)); STATIC_DCL boolean FDECL(able_to_loot, (int, int)); STATIC_DCL boolean FDECL(mon_beside, (int, int)); @@ -1911,11 +1911,12 @@ register int held; struct monst *shkp; boolean one_by_one, allflag, loot_out = FALSE, loot_in = FALSE; char select[MAXOCLASSES+1]; - char qbuf[QBUFSZ]; + char qbuf[QBUFSZ], emptymsg[QBUFSZ]; long loss = 0L; int cnt = 0, used = 0, lcnt = 0, menu_on_request; + emptymsg[0] = '\0'; if (obj->olocked) { pline("%s to be locked.", Tobjnam(obj, "seem")); if (held) You("must put it down to unlock."); @@ -2003,14 +2004,20 @@ register int held; obj->owt = weight(obj); - if (!cnt) { - pline("%s %s empty.", Yname2(obj), otense(obj, "are")); - } else { + if (!cnt) Sprintf(emptymsg, "%s %s empty.", Yname2(obj), otense(obj, "are")); + if (cnt || flags.menu_style == MENU_FULL) { Sprintf(qbuf, "Do you want to take %s out of %s?", something, yname(obj)); if (flags.menu_style != MENU_TRADITIONAL) { if (flags.menu_style == MENU_FULL) { - int t = in_or_out_menu("Do what?", current_container); + int t; + char menuprompt[QBUFSZ]; + boolean outokay = (cnt != 0); + boolean inokay = (invent != 0); + menuprompt[0] = '\0'; + if (!cnt) Sprintf(menuprompt, "%s ", emptymsg); + Strcat(menuprompt, "Do what?"); + t = in_or_out_menu(menuprompt, current_container, outokay, inokay); if (t <= 0) return 0; loot_out = (t & 0x01) != 0; loot_in = (t & 0x02) != 0; @@ -2056,6 +2063,8 @@ ask_again2: return used; } } + } else { + pline("%s", emptymsg); /* is empty. */ } #ifndef GOLDOBJ @@ -2067,7 +2076,7 @@ ask_again2: You("don't have anything to put in."); return used; } - if (flags.menu_style != MENU_FULL || !cnt) { + if (flags.menu_style != MENU_FULL) { loot_in = (yn_function("Do you wish to put something in?", ynqchars, 'n') == 'y'); } @@ -2200,9 +2209,10 @@ boolean put_in; } STATIC_OVL int -in_or_out_menu(prompt, obj) +in_or_out_menu(prompt, obj, outokay, inokay) const char *prompt; struct obj *obj; +boolean outokay, inokay; { winid win; anything any; @@ -2214,15 +2224,24 @@ struct obj *obj; any.a_void = 0; win = create_nhwindow(NHW_MENU); start_menu(win); - any.a_int = 1; - Sprintf(buf,"Take %s out of %s", something, the(xname(obj))); - add_menu(win, NO_GLYPH, &any, *menuselector++, 0, ATR_NONE, buf, MENU_UNSELECTED); - any.a_int = 2; - Sprintf(buf,"Put %s into %s", something, the(xname(obj))); - add_menu(win, NO_GLYPH, &any, *menuselector++, 0, ATR_NONE, buf, MENU_UNSELECTED); - any.a_int = 3; - add_menu(win, NO_GLYPH, &any, *menuselector, 0, ATR_NONE, - "Both of the above", MENU_UNSELECTED); + if (outokay) { + any.a_int = 1; + Sprintf(buf,"Take %s out of %s", something, the(xname(obj))); + add_menu(win, NO_GLYPH, &any, *menuselector, 0, ATR_NONE, + buf, MENU_UNSELECTED); + } + menuselector++; + if (inokay) { + any.a_int = 2; + Sprintf(buf,"Put %s into %s", something, the(xname(obj))); + add_menu(win, NO_GLYPH, &any, *menuselector, 0, ATR_NONE, buf, MENU_UNSELECTED); + } + menuselector++; + if (outokay && inokay) { + any.a_int = 3; + add_menu(win, NO_GLYPH, &any, *menuselector, 0, ATR_NONE, + "Both of the above", MENU_UNSELECTED); + } end_menu(win, prompt); n = select_menu(win, PICK_ONE, &pick_list); destroy_nhwindow(win);