From: PatR Date: Mon, 7 Feb 2022 02:09:23 +0000 (-0800) Subject: more command prefix handling X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=568ba7b30538951ffe92a7f80b9a8431b9862057;p=nethack more command prefix handling 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. --- diff --git a/src/cmd.c b/src/cmd.c index c7d0e5ca7..1fd6e3bcc 100644 --- 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);