]> granicus.if.org Git - nethack/commitdiff
dowhatdoes ('&') vs prefix characters
authorPatR <rankin@nethack.org>
Fri, 8 Jan 2021 20:44:45 +0000 (12:44 -0800)
committerPatR <rankin@nethack.org>
Fri, 8 Jan 2021 20:44:45 +0000 (12:44 -0800)
I noticed that the & command was claiming that ^A is an unknown
command.  Unlike the old static version, or the replaced-before-
ever-released conditional version, the fully dynamic variation
of '&' didn't know about any of the special commands:  prefix
letters, ESC, and ^A.

doc/fixes37.0
src/cmd.c

index 5f22a55025902ce07ac165e5edf869b7b0c8c018..a173aff42f5ae0db6539cb62a1afe6b68793e065 100644 (file)
@@ -1,4 +1,4 @@
-NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.424 $ $NHDT-Date: 1610098651 2021/01/08 09:37:31 $
+NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.425 $ $NHDT-Date: 1610138674 2021/01/08 20:44:34 $
 
 General Fixes and Modified Features
 -----------------------------------
@@ -359,6 +359,8 @@ when telepathically sensed pet ate a mimic corpse and temporarily took on
        overrides mimic hiding); give a different message in that case
 when a pet ate a mimic corpse and tried to temporarily look like a sink it
        ended up looking like a throne (terrain type SINK == symbol S_throne)
+have dowhatdoes ('&') catch up with '?i' to describe ^A, ESC, and movement
+       prefix keystrokes correctly instead of reporting "no such command"
 
 
 Fixes to 3.7.0-x Problems that Were Exposed Via git Repository
index 6eb890c7a393fe9bdc63135a2549e08cfec42f1c..1c7f466ed6c4aaf60462060807be55828531d113 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -1,4 +1,4 @@
-/* NetHack 3.7 cmd.c   $NHDT-Date: 1608933418 2020/12/25 21:56:58 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.440 $ */
+/* NetHack 3.7 cmd.c   $NHDT-Date: 1610138674 2021/01/08 20:44:34 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.445 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /*-Copyright (c) Robert Patrick Rankin, 2013. */
 /* NetHack may be freely redistributed.  See license for details. */
@@ -2002,6 +2002,40 @@ struct ext_func_tab extcmdlist[] = {
     { '\0', (char *) 0, (char *) 0, donull, 0, (char *) 0 } /* sentinel */
 };
 
+/* used by dokeylist() and by key2extcmdesc() for dowhatdoes() */
+static const char
+    run_desc[] = "Prefix: run until something very interesting is seen",
+    rush_desc[] = "Prefix: rush until something interesting is seen",
+    forcefight_desc[] = "Prefix: force fight even if you don't see a monster";
+
+static const struct {
+    int nhkf;
+    const char *desc;
+    boolean numpad;
+} misc_keys[] = {
+    { NHKF_ESC, "cancel current prompt or pending prefix", FALSE },
+    { NHKF_RUSH, rush_desc, FALSE },
+    { NHKF_RUSH2, rush_desc, TRUE },
+    { NHKF_RUN, run_desc, FALSE },
+    { NHKF_RUN2, run_desc, TRUE },
+    { NHKF_FIGHT, forcefight_desc, FALSE },
+    { NHKF_FIGHT2, forcefight_desc, TRUE } ,
+    { NHKF_NOPICKUP,
+      "Prefix: move without picking up objects or fighting", FALSE },
+    { NHKF_RUN_NOPICKUP,
+      "Prefix: run without picking up objects or fighting", FALSE },
+    { NHKF_REQMENU,
+      "Prefix: request a menu (for some non-movement commands)", FALSE },
+    { NHKF_COUNT,
+      "Prefix: for digits when preceding a command with a count", TRUE },
+    { NHKF_DOINV, "numpad: view full inventory", TRUE },
+    /* NHKF_DOINV2 for num_pad+pcHack_compat isn't implemented:
+    { NHKF_DOINV2, "numpad: view inventory of one class of objects", TRUE },
+    */
+    { NHKF_DOAGAIN , "repeat: perform the previous command again", FALSE },
+    { 0, (const char *) 0, FALSE }
+};
+
 /* for key2extcmddesc() to support dowhatdoes() */
 struct movcmd {
     uchar k1, k2, k3, k4; /* 'normal', 'qwertz', 'numpad', 'phone' */
@@ -2025,9 +2059,9 @@ const char *
 key2extcmddesc(key)
 uchar key;
 {
-    static char key2cmdbuf[48];
+    static char key2cmdbuf[QBUFSZ];
     const struct movcmd *mov;
-    int k, c;
+    int k, c, i, j;
     uchar M_5 = (uchar) M('5'), M_0 = (uchar) M('0');
 
     /* need to check for movement commands before checking the extended
@@ -2062,10 +2096,18 @@ uchar key;
         if (*key2cmdbuf)
             return key2cmdbuf;
     }
+    /* check prefixes before regular commands; includes ^A pseudo-command */
+    for (i = 0; misc_keys[i].desc; ++i) {
+        if (misc_keys[i].numpad && !iflags.num_pad)
+            continue;
+        j = misc_keys[i].nhkf;
+        if (key == (uchar) g.Cmd.spkeys[j])
+            return misc_keys[i].desc;
+    }
+    /* finally, check whether 'key' is a command */
     if (g.Cmd.commands[key]) {
         if (g.Cmd.commands[key]->ef_txt)
             return g.Cmd.commands[key]->ef_desc;
-
     }
     return (char *) 0;
 }
@@ -2214,38 +2256,6 @@ boolean *keys_used; /* boolean keys_used[256] */
 void
 dokeylist(VOID_ARGS)
 {
-    static const char
-        run_desc[] = "Prefix: run until something very interesting is seen",
-        rush_desc[] = "Prefix: rush until something interesting is seen",
-        forcefight_desc[] =
-                     "Prefix: force fight even if you don't see a monster";
-    static const struct {
-        int nhkf;
-        const char *desc;
-        boolean numpad;
-    } misc_keys[] = {
-        { NHKF_ESC, "cancel current prompt or pending prefix", FALSE },
-        { NHKF_RUSH, rush_desc, FALSE },
-        { NHKF_RUSH2, rush_desc, TRUE },
-        { NHKF_RUN, run_desc, FALSE },
-        { NHKF_RUN2, run_desc, TRUE },
-        { NHKF_FIGHT, forcefight_desc, FALSE },
-        { NHKF_FIGHT2, forcefight_desc, TRUE } ,
-        { NHKF_NOPICKUP,
-          "Prefix: move without picking up objects or fighting", FALSE },
-        { NHKF_RUN_NOPICKUP,
-          "Prefix: run without picking up objects or fighting", FALSE },
-        { NHKF_REQMENU,
-          "Prefix: request a menu (for some non-movement commands)", FALSE },
-        { NHKF_COUNT,
-          "Prefix: for digits when preceding a command with a count", TRUE },
-        { NHKF_DOINV, "numpad: view full inventory", TRUE },
-        /* NHKF_DOINV2 for num_pad+pcHack_compat isn't implemented */
-        /* { NHKF_DOINV2, "numpad: view inventory of one class of objects",
-             TRUE }, */
-        { NHKF_DOAGAIN , "repeat: perform the previous command again", FALSE },
-        { 0, (const char *) 0, FALSE }
-    };
     const struct ext_func_tab *extcmd;
     winid datawin;
     char buf[BUFSZ], buf2[BUFSZ];