]> granicus.if.org Git - nethack/commitdiff
click_to_cmd() vs #therecmdmenu
authorPatR <rankin@nethack.org>
Thu, 17 Dec 2020 19:38:18 +0000 (11:38 -0800)
committerPatR <rankin@nethack.org>
Thu, 17 Dec 2020 19:38:18 +0000 (11:38 -0800)
Clicking on an adjacent location while 'herecmd_menu' is On
didn't run therecmd as intended.  If it had, maybe somebody
would have noticed how broken it is.  This reorganizes the mouse
click handling but leaves therecmd commented out since it hasn't
been fixed.

The #therecmdmenu command and tentative click handling for
adjacent spots should probably be removed.  They've been in place
for slightly over three years and nobody has ever reported that
they don't work properly.

src/cmd.c

index 7e98f675d669e912e732bbf83fef02919a0405b7..65c05546b0bc0e750df4c25e469314adf9022625 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -1,4 +1,4 @@
-/* NetHack 3.7 cmd.c   $NHDT-Date: 1608175318 2020/12/17 03:21:58 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.436 $ */
+/* NetHack 3.7 cmd.c   $NHDT-Date: 1608233885 2020/12/17 19:38:05 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.437 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /*-Copyright (c) Robert Patrick Rankin, 2013. */
 /* NetHack may be freely redistributed.  See license for details. */
@@ -4001,6 +4001,9 @@ const char *text;
     }
 }
 
+/* offer choice of actions to perform at adjacent location <x,y>;
+   does not work as intended because the actions that get invoked
+   ask for a direction or target instead of using our <x,y> */
 static char
 there_cmd_menu(doit, x, y)
 boolean doit;
@@ -4074,6 +4077,18 @@ int x, y;
         add_herecmd_menuitem(win, doapply, buf);
     }
 #if 0
+    if (mtmp) {
+        Sprintf(buf, "%s %s", mon_nam(mtmp),
+                !has_mname(mtmp) ? "Name" : "Rename"), ++K;
+        /* need a way to pass mtmp or <ux+dx,uy+dy>to an 'int f()' function
+           as well as reorganizinging do_mname() to use that function */
+        add_herecmd_menuitem(win, XXX(), buf);
+    }
+#endif
+#if 0
+    /* these are necessary if click_to_cmd() is deferring to us; however,
+       moving/fighting aren't implmented as independent commands so don't
+       fit our menu's use of command functions */
     if (mtmp || glyph_is_invisible(glyph_at(x, y))) {
         /* "Attack %s", mtmp ? mon_nam(mtmp) : "unseen creature" */
     } else {
@@ -4089,7 +4104,7 @@ int x, y;
         npick = 0;
     }
     destroy_nhwindow(win);
-    ch = '\0';
+    ch = '\033';
     if (npick > 0) {
         int NDECL((*func)) = picks->item.a_nfunc;
         free((genericptr_t) picks);
@@ -4183,7 +4198,7 @@ boolean doit;
     end_menu(win, "What do you want to do?");
     npick = select_menu(win, PICK_ONE, &picks);
     destroy_nhwindow(win);
-    ch = '\0';
+    ch = '\033';
     if (npick > 0) {
         int NDECL((*func)) = picks->item.a_nfunc;
         free((genericptr_t) picks);
@@ -4208,16 +4223,33 @@ int x, y, mod;
 {
     static char cmd[4];
     struct obj *o;
-    int dir;
-
-    cmd[1] = '\0';
+    int dir, udist;
 
+    cmd[0] = cmd[1] = '\0';
     if (iflags.clicklook && mod == CLICK_2) {
         g.clicklook_cc.x = x;
         g.clicklook_cc.y = y;
         cmd[0] = g.Cmd.spkeys[NHKF_CLICKLOOK];
         return cmd;
     }
+    /* this used to be inside the 'if (flags.travelcmd)' block, but
+       handle click-on-self even when travel is disabled; unlike
+       accidentally zooming across the level because of a stray click,
+       clicking on self can easily be cancelled if it wasn't intended */
+    if (iflags.herecmd_menu && isok(x, y)) {
+        udist = distu(x, y);
+        if (!udist) {
+            cmd[0] = here_cmd_menu(FALSE);
+            return cmd;
+        } else if (udist <= 2) {
+#if 0       /* there_cmd_menu() is broken; the commands it invokes
+             * tend to ask for a direction or target instead of using
+             * the adjacent coordinates that are being passed to it */
+            cmd[0] = there_cmd_menu(FALSE, x, y);
+            return cmd;
+#endif
+        }
+    }
 
     x -= u.ux;
     y -= u.uy;
@@ -4233,11 +4265,6 @@ int x, y, mod;
         }
 
         if (x == 0 && y == 0) {
-            if (iflags.herecmd_menu) {
-                cmd[0] = here_cmd_menu(FALSE);
-                return cmd;
-            }
-
             /* here */
             if (IS_FOUNTAIN(levl[u.ux][u.uy].typ)
                 || IS_SINK(levl[u.ux][u.uy].typ)) {
@@ -4264,17 +4291,10 @@ int x, y, mod;
         /* directional commands */
 
         dir = xytod(x, y);
-
         if (!m_at(u.ux + x, u.uy + y)
             && !test_move(u.ux, u.uy, x, y, TEST_MOVE)) {
             cmd[1] = g.Cmd.dirchars[dir];
             cmd[2] = '\0';
-            if (iflags.herecmd_menu) {
-                cmd[0] = there_cmd_menu(FALSE, u.ux + x, u.uy + y);
-                if (cmd[0] == '\0')
-                    cmd[1] = '\0';
-                return cmd;
-            }
 
             if (IS_DOOR(levl[u.ux + x][u.uy + y].typ)) {
                 /* slight assistance to player: choose kick/open for them */