]> granicus.if.org Git - nethack/commitdiff
Show object symbols in menu headings
authorPasi Kallinen <paxed@alt.org>
Wed, 25 Mar 2015 20:13:28 +0000 (22:13 +0200)
committerPasi Kallinen <paxed@alt.org>
Wed, 25 Mar 2015 20:13:28 +0000 (22:13 +0200)
... in menus where those object symbols act as menu accelerators.
Toggleable via "menu_objsyms" boolean option, defaults to off.

doc/Guidebook.mn
doc/fixes35.0
include/extern.h
include/flag.h
src/invent.c
src/o_init.c
src/options.c
src/pickup.c

index 04cb9ea5f0101fdbe8722cace50cdcbd36276a8c..14aa20239f0fcd698d9d0983f79da10fff93be93 100644 (file)
@@ -2100,6 +2100,9 @@ Default '|'.
 Menu character accelerator to goto the next menu page.
 Implemented by the Amiga, Gem and tty ports.
 Default '>'.
+.lp menu_objsyms
+Show object symbols in menu headings in menus where
+the object symbols act as menu accelerators (default off).
 .lp menu_previous_page 
 Menu character accelerator to goto the previous menu page.
 Implemented by the Amiga, Gem and tty ports.
index f22cdc80d18572356d456c24852cc1d95a0e6131..a639b1ff6cea7719006511b6e549456dac7ac195 100644 (file)
@@ -883,6 +883,8 @@ add option mention_walls, which gives feedback when bumping against a wall
 fix invalid pointer dereference in morguemon if ndemon returns NON_PM
 after object loss through polyshudder don't get left hiding under nothing 
        if you're polymorphed into a hider
+show object symbols in menu headings in menus where those object symbols
+       act as menu accelerators, toggleable via "menu_objsyms" option
 
 
 Platform- and/or Interface-Specific Fixes
index da9bf7effb331a5681221307d09182bbc9f9eb2b..30e6c6d4394905b6339a35d7ddc15dd2fe90faa4 100644 (file)
@@ -911,7 +911,7 @@ E int NDECL(dopramulet);
 E int NDECL(doprtool);
 E int NDECL(doprinuse);
 E void FDECL(useupf, (struct obj *,long));
-E char *FDECL(let_to_name, (CHAR_P,BOOLEAN_P));
+E char *FDECL(let_to_name, (CHAR_P,BOOLEAN_P,BOOLEAN_P));
 E void NDECL(free_invbuf);
 E void NDECL(reassign);
 E int NDECL(doorganize);
index add59340e79da33684f75b771d5dd5e283e20212..e7ebafa260034aa70d71f2eb48f8b585a71c1802 100644 (file)
@@ -191,6 +191,7 @@ struct instance_flags {
        boolean  news;          /* print news */
        boolean  mention_walls; /* give feedback when bumping walls */
        boolean  menu_tab_sep;  /* Use tabs to separate option menu fields */
+       boolean  menu_head_objsym; /* Show obj symbol in menu headings */
        boolean  menu_requested; /* Flag for overloaded use of 'm' prefix
                                  * on some non-move commands */
        boolean  renameallowed; /* can change hero name during role selection */
index 12f0ef1b3e3e65bf7b52bc9dd18c48f95fc5e3d6..e5100ee5e53ca7235ac95028f02de3e11a5b35ea 100644 (file)
@@ -1789,7 +1789,7 @@ nextclass:
                        if (!flags.sortpack || otmp->oclass == *invlet) {
                            if (flags.sortpack && !classcount) {
                                add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
-                                   let_to_name(*invlet, FALSE), MENU_UNSELECTED);
+                                        let_to_name(*invlet, FALSE, (want_reply && iflags.menu_head_objsym)), MENU_UNSELECTED);
                                classcount++;
                            }
                            any.a_char = ilet;
@@ -1863,7 +1863,7 @@ char avoidlet;
                        if (flags.sortpack && !classcount) {
                                any = zeroany;          /* zero */
                                add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
-                                   let_to_name(*invlet, FALSE), MENU_UNSELECTED);
+                                        let_to_name(*invlet, FALSE, FALSE), MENU_UNSELECTED);
                                classcount++;
                        }
                        any.a_char = ilet;
@@ -1991,7 +1991,7 @@ dounpaid()
            if (otmp->unpaid) {
                if (!flags.sortpack || otmp->oclass == *invlet) {
                    if (flags.sortpack && !classcount) {
-                       putstr(win, 0, let_to_name(*invlet, TRUE));
+                       putstr(win, 0, let_to_name(*invlet, TRUE, FALSE));
                        classcount++;
                    }
 
@@ -2009,7 +2009,7 @@ dounpaid()
     if (count > num_so_far) {
        /* something unpaid is contained */
        if (flags.sortpack)
-           putstr(win, 0, let_to_name(CONTAINED_SYM, TRUE));
+           putstr(win, 0, let_to_name(CONTAINED_SYM, TRUE, FALSE));
        /*
         * Search through the container objects in the inventory for
         * unpaid items.  The top level inventory items have already
@@ -2701,10 +2701,12 @@ static NEARDATA char *invbuf = (char *)0;
 static NEARDATA unsigned invbufsiz = 0;
 
 char *
-let_to_name(let,unpaid)
+let_to_name(let,unpaid,showsym)
 char let;
-boolean unpaid;
+boolean unpaid,showsym;
 {
+       const char *ocsymfmt = "  ('%c')";
+       const int invbuf_sympadding = 8; /* arbitrary */
        const char *class_name;
        const char *pos;
        int oclass = (let >= 1 && let < MAXOCLASSES) ? let : 0;
@@ -2717,7 +2719,8 @@ boolean unpaid;
        else
            class_name = names[0];
 
-       len = strlen(class_name) + (unpaid ? sizeof "unpaid_" : sizeof "");
+       len = strlen(class_name) + (unpaid ? sizeof "unpaid_" : sizeof "") +
+           (oclass ? (strlen(ocsymfmt)+invbuf_sympadding) : 0);
        if (len > invbufsiz) {
            if (invbuf) free((genericptr_t)invbuf);
            invbufsiz = len + 10; /* add slop to reduce incremental realloc */
@@ -2727,6 +2730,15 @@ boolean unpaid;
            Strcat(strcpy(invbuf, "Unpaid "), class_name);
        else
            Strcpy(invbuf, class_name);
+       if ((oclass != 0) && showsym) {
+           char *bp = eos(invbuf);
+           int mlen = invbuf_sympadding - strlen(class_name);
+           while (--mlen > 0) {
+               *bp = ' '; bp++;
+           }
+           *bp = '\0';
+           Sprintf(eos(invbuf), ocsymfmt, def_oc_syms[oclass].sym);
+       }
        return invbuf;
 }
 
index 4ae8892e951affe8342254b9f3d063c1df0c23df..3d95a0d6f14d9ddc261cc3a43a9ad7c147d5f2f2 100644 (file)
@@ -446,7 +446,7 @@ dodiscovered()                              /* free after Robert Viduya */
            if ((dis = disco[i]) != 0 && interesting_to_discover(dis)) {
                ct++;
                if (oclass != prev_class) {
-                   putstr(tmpwin, iflags.menu_headings, let_to_name(oclass, FALSE));
+                   putstr(tmpwin, iflags.menu_headings, let_to_name(oclass, FALSE, FALSE));
                    prev_class = oclass;
                }
                Sprintf(buf, "%s %s",(objects[dis].oc_pre_discovered ? "*" : " "),
@@ -472,7 +472,7 @@ char *buf;
 {
     char *s;
 
-    Strcpy(buf, let_to_name(oclass, FALSE));
+    Strcpy(buf, let_to_name(oclass, FALSE, FALSE));
     for (s = buf; *s; ++s) *s = lowc(*s);
     return buf;
 }
@@ -615,7 +615,7 @@ doclassdisco()
        break;
     default:
        oclass = def_char_to_objclass(c);
-       Sprintf(buf, "Discovered %s", let_to_name(oclass, FALSE));
+       Sprintf(buf, "Discovered %s", let_to_name(oclass, FALSE, FALSE));
        putstr(tmpwin, iflags.menu_headings, buf);
        for (i = bases[(int)oclass];
                i < NUM_OBJECTS && objects[i].oc_class == oclass; ++i) {
@@ -672,7 +672,7 @@ rename_disco()
            if (oclass != prev_class) {
                any.a_int = 0;
                add_menu(tmpwin, NO_GLYPH, &any, ' ', iflags.menu_headings,
-                       ATR_NONE, let_to_name(oclass, FALSE), MENU_UNSELECTED);
+                        ATR_NONE, let_to_name(oclass, FALSE, FALSE), MENU_UNSELECTED);
                prev_class = oclass;
            }
            any.a_int = dis;
index d1f5b26deb35ebaa6b29b14a3ec66323d12da6b7..28560335188d260f8afb26ac965a19f6e9f0dccc 100644 (file)
@@ -142,6 +142,7 @@ static struct Bool_Opt
        {"mention_walls", &iflags.mention_walls, FALSE, SET_IN_GAME},
        /* for menu debugging only*/
        {"menu_tab_sep", &iflags.menu_tab_sep, FALSE, SET_IN_GAME},
+       {"menu_objsyms", &iflags.menu_head_objsym, FALSE, SET_IN_GAME},
        {"mouse_support", &iflags.wc_mouse_support, TRUE, DISP_IN_GAME},        /*WC*/
 #ifdef NEWS
        {"news", &iflags.news, TRUE, DISP_IN_GAME},
index 1d78dea7656a6b316781f7b4f613d8a049476575..476d85798e11cc9d9bac678f42e5518423ef0885 100644 (file)
@@ -769,7 +769,9 @@ boolean FDECL((*allow), (OBJ_P));/* allow function */
                    if (sorted && !printed_type_name) {
                        any = zeroany;
                        add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
-                                       let_to_name(*pack, FALSE), MENU_UNSELECTED);
+                                let_to_name(*pack, FALSE,
+                                            (how != PICK_NONE) && iflags.menu_head_objsym),
+                                MENU_UNSELECTED);
                        printed_type_name = TRUE;
                    }
 
@@ -928,8 +930,10 @@ int how;                   /* type of query */
                        any.a_int = curr->oclass;
                        add_menu(win, NO_GLYPH, &any, invlet++,
                                def_oc_syms[(int)objects[curr->otyp].oc_class].sym,
-                               ATR_NONE, let_to_name(*pack, FALSE),
-                               MENU_UNSELECTED);
+                                ATR_NONE,
+                                let_to_name(*pack, FALSE,
+                                            (how != PICK_NONE) && iflags.menu_head_objsym),
+                                MENU_UNSELECTED);
                        collected_type_name = TRUE;
                   }
                }