]> granicus.if.org Git - nethack/commitdiff
Add whatis_moveskip option to change fast-moving cursor
authorPasi Kallinen <paxed@alt.org>
Sun, 6 Aug 2017 12:41:31 +0000 (15:41 +0300)
committerPasi Kallinen <paxed@alt.org>
Sun, 6 Aug 2017 12:41:31 +0000 (15:41 +0300)
Previously the "fast-moving" when getting a target location
was always by 8 units. If this option is on, fast-moving
will instead skip the same map glyphs. This should be much more
useful for blind players.

doc/Guidebook.mn
doc/Guidebook.tex
include/flag.h
src/cmd.c
src/do_name.c
src/options.c

index 7b70d6dface9d7271303b5e354a06fd7469eadf2..9805e32c02d20dee60af6157c3a478aa9a046519 100644 (file)
@@ -2948,6 +2948,11 @@ key.
 When getting a location on the map, and using a key to cycle through
 next and previous targets, use a menu instead to pick a target.
 (default off)
+.lp whatis_moveskip
+When getting a location on the map, and using shifted movement keys or
+meta-digit keys to fast-move, instead of moving 8 units at a time,
+move by skipping the same glyphs.
+(default off)
 .lp windowtype
 Select which windowing system to use, such as ``tty'' or ``X11''
 (default depends on version).
@@ -3259,6 +3264,8 @@ When asked for a location, the key to go to next closest object. Default is 'o'.
 When asked for a location, the key to go to previous closest object. Default is 'O'.
 .lp getpos.menu
 When asked for a location, and using one of the next or previous keys to cycle through targets, toggle showing a menu instead. Default is '!'.
+.lp getpos.moveskip
+When asked for a location, and using the shifted movement keys or meta-digit keys to fast-move around, move by skipping the same glyphs instead of by 8 units. Default is '*'.
 .lp getpos.filter
 When asked for a location, change the filtering mode when using one of the next
 or previous keys to cycle through targets. Toggles between no filtering, in view
@@ -3746,6 +3753,9 @@ relative to your character.
 .lp whatis_filter:area
 When targeting with cursor, filter possible locations so only those in
 the same area (eg. same room, or same corridor) are considered.
+.lp whatis_moveskip
+When targeting with cursor and using fast-move, skip the same glyphs instead
+of moving 8 units at a time.
 .lp nostatus_updates
 Prevent updates to the status lines at the bottom of the screen, if
 your screen-reader reads those lines. The same information can be
index 7162b909c1c019da5814722394043eca6ff3dfb3..c09cc7d1e26970a96da1e415cd2389e909b97abd 100644 (file)
@@ -3587,6 +3587,12 @@ When getting a location on the map, and using a key to cycle through
 next and previous targets, use a menu instead to pick a target.
 (default off)
 %.lp
+\item[\ib{whatis\verb+_+moveskip}]
+When getting a location on the map, and using shifted movement keys or
+meta-digit keys to fast-move, instead of moving 8 units at a time,
+move by skipping the same glyphs.
+(default off)
+%.lp
 \item[\ib{windowtype}]
 Select which windowing system to use, such as ``{\tt tty}'' or ``{\tt X11}''
 (default depends on version).
@@ -3991,6 +3997,9 @@ When asked for a location, the key to go to previous closest object. Default is
 \item{\bb{getpos.menu}}
 When asked for a location, and using one of the next or previous keys to cycle through targets, toggle showing a menu instead. Default is '{\tt !}'.
 %.lp
+\item{\bb{getpos.moveskip}}
+When asked for a location, and using the shifted movement keys or meta-digit keys to fast-move around, move by skipping the same glyphs instead of by 8 units. Default is ``{\tt *}''.
+%.lp
 \item{\bb{getpos.filter}}
 When asked for a location, change the filtering mode when using one of the next or previous keys to cycle through targets. Toggles between no filtering, in view only, and in the same area only. Default is '{\tt "}'.
 %.lp
@@ -4555,6 +4564,10 @@ relative to your character.
 When targeting with cursor, filter possible locations so only those in
 the same area (eg. same room, or same corridor) are considered.
 %.lp
+\item[\ib{whatis\verb+_+moveskip}]
+When targeting with cursor and using fast-move, skip the same glyphs instead
+of moving 8 units at a time.
+%.lp
 \item[\ib{nostatus\verb+_+updates}]
 Prevent updates to the status lines at the bottom of the screen, if
 your screen-reader reads those lines. The same information can be
index 6d5e438b59cc4940097f0c919bf6760ceeefa11f..ac3844fc3dd0790d577546ca981186a41217d59b 100644 (file)
@@ -204,6 +204,7 @@ struct instance_flags {
     boolean getloc_travelmode;
     int getloc_filter;     /* GFILTER_foo */
     boolean getloc_usemenu;
+    boolean getloc_moveskip;
     coord travelcc;        /* coordinates for travel_cache */
     boolean window_inited; /* true if init_nhwindows() completed */
     boolean vision_inited; /* true if vision is ready */
@@ -496,6 +497,7 @@ enum nh_keyfunc {
     NHKF_GETPOS_HELP,
     NHKF_GETPOS_MENU,
     NHKF_GETPOS_LIMITVIEW,
+    NHKF_GETPOS_MOVESKIP,
 
     NUM_NHKF
 };
index 53a800bd9248775ddc7f0259d57a6607fa95cd06..cd7faedc8884be92a9950502af403186f214b88f 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -3749,6 +3749,7 @@ struct {
     { NHKF_GETPOS_INTERESTING_PREV, 'A', "getpos.all.prev" },
     { NHKF_GETPOS_HELP,      '?', "getpos.help" },
     { NHKF_GETPOS_LIMITVIEW, '"', "getpos.filter" },
+    { NHKF_GETPOS_MOVESKIP,  '*', "getpos.moveskip" },
     { NHKF_GETPOS_MENU,      '!', "getpos.menu" }
 };
 
index 16818c0d9876c0c9ec376a07879fa46086550fa1..7dec3fb7da043e2f0ac58841900842ed97c9f37f 100644 (file)
@@ -90,13 +90,17 @@ const char *goal;
     char sbuf[BUFSZ];
     boolean doing_what_is;
     winid tmpwin = create_nhwindow(NHW_MENU);
+    const char *const fastmovemode[2] = { "8 units at a time",
+                                          "skipping same glyphs" };
 
     Sprintf(sbuf,
             "Use '%c', '%c', '%c', '%c' to move the cursor to %s.", /* hjkl */
             Cmd.move_W, Cmd.move_S, Cmd.move_N, Cmd.move_E, goal);
     putstr(tmpwin, 0, sbuf);
-    putstr(tmpwin, 0,
-           "Use 'H', 'J', 'K', 'L' to move the cursor 8 units at a time.");
+    Sprintf(sbuf,
+            "Use 'H', 'J', 'K', 'L' to fast-move the cursor, %s.",
+            fastmovemode[iflags.getloc_moveskip]);
+    putstr(tmpwin, 0, sbuf);
     putstr(tmpwin, 0, "Or enter a background symbol (ex. '<').");
     Sprintf(sbuf, "Use '%s' to move the cursor on yourself.",
            visctrl(Cmd.spkeys[NHKF_GETPOS_SELF]));
@@ -129,6 +133,11 @@ const char *goal;
                              visctrl(Cmd.spkeys[NHKF_GETPOS_INTERESTING_PREV]),
                              GLOC_INTERESTING);
     }
+    Sprintf(sbuf, "Use '%s' to change fast-move mode to %s.",
+            visctrl(Cmd.spkeys[NHKF_GETPOS_MOVESKIP]),
+            fastmovemode[!iflags.getloc_moveskip]);
+    putstr(tmpwin, 0, sbuf);
+
     Sprintf(sbuf, "Use '%s' to toggle menu listing for possible targets.",
             visctrl(Cmd.spkeys[NHKF_GETPOS_MENU]));
     putstr(tmpwin, 0, sbuf);
@@ -720,8 +729,23 @@ const char *goal;
             } else if (Cmd.alphadirchars[i] == lowc((char) c)
                        || (Cmd.num_pad && Cmd.dirchars[i] == (c & 0177))) {
                 /* a shifted movement letter or Meta-digit */
-                dx = 8 * xdir[i];
-                dy = 8 * ydir[i];
+                if (iflags.getloc_moveskip) {
+                    /* skip same glyphs */
+                    int glyph = glyph_at(cx, cy);
+
+                    dx = xdir[i];
+                    dy = ydir[i];
+                    while (isok(cx + dx, cy + dy)
+                           && glyph == glyph_at(cx + dx, cy + dy)
+                           && isok(cx + dx+xdir[i], cy+dy+ydir[i])
+                           && glyph == glyph_at(cx + dx+xdir[i], cy + dy+ydir[i])) {
+                        dx += xdir[i];
+                        dy += ydir[i];
+                    }
+                } else {
+                    dx = 8 * xdir[i];
+                    dy = 8 * ydir[i];
+                }
             } else
                 continue;
 
@@ -801,6 +825,10 @@ const char *goal;
             cx = u.ux;
             cy = u.uy;
             goto nxtc;
+        } else if (c == Cmd.spkeys[NHKF_GETPOS_MOVESKIP]) {
+            iflags.getloc_moveskip = !iflags.getloc_moveskip;
+            pline("%skipping over similar terrain when fastmoving the cursor.",
+                  iflags.getloc_moveskip ? "S" : "Not s");
         } else if ((cp = index(mMoOdDxX, c)) != 0) { /* 'm|M', 'o|O', &c */
             /* nearest or farthest monster or object or door or unexplored */
             int gtmp = (int) (cp - mMoOdDxX), /* 0..7 */
index e4c878dd064426e697ab74914c8e7e76c45cc41d..0bfacc09d95180dbc39b2d77af3354cf9bab7505 100644 (file)
@@ -233,6 +233,7 @@ static struct Bool_Opt {
     { "vt_tiledata", (boolean *) 0, FALSE, SET_IN_FILE },
 #endif
     { "whatis_menu", &iflags.getloc_usemenu, FALSE, SET_IN_GAME },
+    { "whatis_moveskip", &iflags.getloc_moveskip, FALSE, SET_IN_GAME },
     { "wizweight", &iflags.wizweight, FALSE, SET_IN_WIZGAME },
     { "wraptext", &iflags.wc2_wraptext, FALSE, SET_IN_GAME },
 #ifdef ZEROCOMP