]> granicus.if.org Git - nethack/commitdiff
more command prefix handling
authorPatR <rankin@nethack.org>
Mon, 7 Feb 2022 02:09:23 +0000 (18:09 -0800)
committerPatR <rankin@nethack.org>
Mon, 7 Feb 2022 02:09:23 +0000 (18:09 -0800)
When a command doesn't allow a prefix, go back to showing the prefix
keystroke in the can't-do-that feedback rather than the command name
that it has for potential binding.  I went away from that earlier
after typing 'G' followed by 'o' and getting "the open command does
not accept 5 prefix" instead of "G prefix".

Fix the lookup routine which was responsible for that.  At least
partially fix it; actually it only ignores digits for !numpad.  If a
numpad user types G where it isn't allowed, the feedback will still
be about 5 instead of G.  The code is going from keystroke-used to
command-it-invokes back to keystroke-for-command which won't
necessarily yield the original keystroke because a command can be
bound to more than one key.

src/cmd.c

index c7d0e5ca7da88bf03c35537764e7e8914781995f..1fd6e3bcc8c5a3aaf8c145bb76bde97abab8368a 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -2905,6 +2905,11 @@ cmd_from_func(int (*fn)(void))
            keystroke invokes space's command */
         if (i == ' ')
             continue;
+        /* skip digits if number_pad is Off; also skip '-' unless it has
+           been bound to something other than what number_pad assigns */
+        if (((i >= '0' && i <= '9') || (i == '-' && fn == do_fight))
+            && !g.Cmd.num_pad)
+            continue;
 
         if (g.Cmd.commands[i] && g.Cmd.commands[i]->ef_funct == fn)
             return (char) i;
@@ -3848,11 +3853,13 @@ rhack(char *cmd)
                        && !(tlist->flags & (PREFIXCMD | MOVEMENTCMD))
                        && (!was_m_prefix || !accept_menu_prefix(tlist))) {
                 const char *which;
+                char pfxidx = cmd_from_func(prefix_seen->ef_funct);
 
                 /* got prefix previously but this command doesn't accept one */
-                which = (prefix_seen->ef_funct == do_reqmenu)
-                           ? "move-no-pickup or request-menu"
-                           : prefix_seen->ef_txt;
+                which = (pfxidx != 0) ? visctrl(pfxidx)
+                        : (prefix_seen->ef_funct == do_reqmenu)
+                          ? "move-no-pickup or request-menu"
+                          : prefix_seen->ef_txt;
                 pline("The %s command does not accept %s prefix.",
                       tlist->ef_txt, which);