]> granicus.if.org Git - nethack/commitdiff
For travel target location, report if no known travel path
authorPasi Kallinen <paxed@alt.org>
Wed, 31 Aug 2016 19:00:45 +0000 (22:00 +0300)
committerPasi Kallinen <paxed@alt.org>
Wed, 31 Aug 2016 19:08:15 +0000 (22:08 +0300)
Yet another accessibility feature.  When asked for a location
to travel, and autodescribe is on, the location description
has "(no travel path)" appended, if there is no known path
to that location.

doc/fixes36.1
include/extern.h
include/flag.h
src/cmd.c
src/do_name.c
src/hack.c

index 332e05c6328615f30834d7ccf8252ff7f8ff4c2d..c9eaf19c8d658229b3820f7ca3b09a66e66f7b6f 100644 (file)
@@ -483,6 +483,8 @@ undead #turning takes less time at higher experience level
 peacefuls may react when you attack other peacefuls
 prevent diagonal jumping through open doorways
 different liquids when hallucinating
+when moving a cursor for travel target, show if there is no known travel
+       path to that location, if "autodescribe" is on
 
 
 Platform- and/or Interface-Specific New Features
index c5ff3444101b671ab7cfdc45ba8c5afb8d10f4c5..e2f4b622b0477e24bdf15af2ee0831e754cc778b 100644 (file)
@@ -796,6 +796,7 @@ E void NDECL(drinksink);
 
 /* ### hack.c ### */
 
+E boolean FDECL(is_valid_travelpt, (int,int));
 E anything *FDECL(uint_to_any, (unsigned));
 E anything *FDECL(long_to_any, (long));
 E anything *FDECL(monst_to_any, (struct monst *));
index 55a544471bbb7d6cdf518e597d2a06ee21274f1b..1f79f07dd6b178ce042b25dddada691d0d460e02 100644 (file)
@@ -192,6 +192,7 @@ struct instance_flags {
 #define TER_OBJ    0x04
 #define TER_MON    0x08
 #define TER_DETECT 0x10    /* detect_foo magic rather than #terrain */
+    boolean getloc_travelmode;
     coord travelcc;        /* coordinates for travel_cache */
     boolean window_inited; /* true if init_nhwindows() completed */
     boolean vision_inited; /* true if vision is ready */
index 13086a9c23fca74d8b05b908a25dda35725c7c63..441a6938aa1aaa2d9212653e13e7356ecbebf729 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -4323,11 +4323,14 @@ dotravel(VOID_ARGS)
         cc.x = u.ux;
         cc.y = u.uy;
     }
+    iflags.getloc_travelmode = TRUE;
     pline("Where do you want to travel to?");
     if (getpos(&cc, TRUE, "the desired destination") < 0) {
         /* user pressed ESC */
+        iflags.getloc_travelmode = FALSE;
         return 0;
     }
+    iflags.getloc_travelmode = FALSE;
     iflags.travelcc.x = u.tx = cc.x;
     iflags.travelcc.y = u.ty = cc.y;
     cmd[0] = CMD_TRAVEL;
index 316282f76208862974af76a6716c9533f9234c86..594cab44db56e7686731d4fa1d0eff29405dc9ec 100644 (file)
@@ -316,7 +316,9 @@ int cx, cy;
     cc.y = cy;
     if (do_screen_description(cc, TRUE, sym, tmpbuf, &firstmatch)) {
         (void) coord_desc(cx, cy, tmpbuf, iflags.getpos_coords);
-        pline("%s%s%s", firstmatch, *tmpbuf ? " " : "", tmpbuf);
+        pline("%s%s%s%s", firstmatch, *tmpbuf ? " " : "", tmpbuf,
+              (iflags.getloc_travelmode && !is_valid_travelpt(cx,cy))
+              ? " (no travel path)" : "");
         curs(WIN_MAP, cx, cy);
         flush_screen(0);
     }
index 59187dde76f1ca9a878e33a5c0db5dd889d1ffe2..1c7e44804809f298e977a7c0d618f816907c78ae 100644 (file)
@@ -10,7 +10,7 @@ STATIC_DCL void NDECL(maybe_wail);
 STATIC_DCL int NDECL(moverock);
 STATIC_DCL int FDECL(still_chewing, (XCHAR_P, XCHAR_P));
 STATIC_DCL void NDECL(dosinkfall);
-STATIC_DCL boolean FDECL(findtravelpath, (BOOLEAN_P));
+STATIC_DCL boolean FDECL(findtravelpath, (int));
 STATIC_DCL boolean FDECL(trapmove, (int, int, struct trap *));
 STATIC_DCL void NDECL(switch_terrain);
 STATIC_DCL struct monst *FDECL(monstinroom, (struct permonst *, int));
@@ -19,6 +19,11 @@ STATIC_DCL void FDECL(move_update, (BOOLEAN_P));
 
 #define IS_SHOP(x) (rooms[x].rtype >= SHOPBASE)
 
+/* mode values for findtravelpath() */
+#define TRAVP_TRAVEL 0
+#define TRAVP_GUESS  1
+#define TRAVP_VALID  2
+
 static anything tmp_anything;
 
 anything *
@@ -887,21 +892,25 @@ int wiz_debug_cmd_traveldisplay()
  * Returns TRUE if a path was found.
  */
 STATIC_OVL boolean
-findtravelpath(guess)
-boolean guess;
+findtravelpath(mode)
+int mode;
 {
     /* if travel to adjacent, reachable location, use normal movement rules */
-    if (!guess && context.travel1 && distmin(u.ux, u.uy, u.tx, u.ty) == 1
+    if ((mode == TRAVP_TRAVEL || mode == TRAVP_VALID) && context.travel1
+        && distmin(u.ux, u.uy, u.tx, u.ty) == 1
         && !(u.ux != u.tx && u.uy != u.ty && NODIAG(u.umonnum))) {
         context.run = 0;
         if (test_move(u.ux, u.uy, u.tx - u.ux, u.ty - u.uy, TEST_MOVE)) {
-            u.dx = u.tx - u.ux;
-            u.dy = u.ty - u.uy;
-            nomul(0);
-            iflags.travelcc.x = iflags.travelcc.y = -1;
+            if (mode == TRAVP_TRAVEL) {
+                u.dx = u.tx - u.ux;
+                u.dy = u.ty - u.uy;
+                nomul(0);
+                iflags.travelcc.x = iflags.travelcc.y = -1;
+            }
             return TRUE;
         }
-        context.run = 8;
+        if (mode == TRAVP_TRAVEL)
+            context.run = 8;
     }
     if (u.tx != u.ux || u.ty != u.uy) {
         xchar travel[COLNO][ROWNO];
@@ -917,7 +926,7 @@ boolean guess;
          * goal is the position the player knows of, or might figure out
          * (couldsee) that is closest to the target on a straight path.
          */
-        if (guess) {
+        if (mode == TRAVP_GUESS || mode == TRAVP_VALID) {
             tx = u.ux;
             ty = u.uy;
             ux = u.tx;
@@ -987,7 +996,8 @@ boolean guess;
                      * example above is never included in it, preventing
                      * the cycle.
                      */
-                    if (!isok(nx, ny) || (guess && !couldsee(nx, ny)))
+                    if (!isok(nx, ny)
+                        || ((mode == TRAVP_GUESS) && !couldsee(nx, ny)))
                         continue;
                     if ((!Passes_walls && !can_ooze(&youmonst)
                          && closed_door(x, y)) || sobj_at(BOULDER, x, y)
@@ -1009,10 +1019,11 @@ boolean guess;
                         && (levl[nx][ny].seenv
                             || (!Blind && couldsee(nx, ny)))) {
                         if (nx == ux && ny == uy) {
-                            if (!guess) {
+                            if (mode == TRAVP_TRAVEL || mode == TRAVP_VALID) {
                                 u.dx = x - ux;
                                 u.dy = y - uy;
-                                if (x == u.tx && y == u.ty) {
+                                if (mode == TRAVP_TRAVEL
+                                    && x == u.tx && y == u.ty) {
                                     nomul(0);
                                     /* reset run so domove run checks work */
                                     context.run = 8;
@@ -1052,7 +1063,7 @@ boolean guess;
         }
 
         /* if guessing, find best location in travel matrix and go there */
-        if (guess) {
+        if (mode == TRAVP_GUESS) {
             int px = tx, py = ty; /* pick location */
             int dist, nxtdist, d2, nd2;
 
@@ -1107,7 +1118,7 @@ boolean guess;
             uy = u.uy;
             set = 0;
             n = radius = 1;
-            guess = FALSE;
+            mode = TRAVP_TRAVEL;
             goto noguess;
         }
         return FALSE;
@@ -1120,6 +1131,27 @@ found:
     return FALSE;
 }
 
+boolean
+is_valid_travelpt(x,y)
+int x,y;
+{
+    int tx = u.tx;
+    int ty = u.ty;
+    boolean ret;
+    int g = glyph_at(x,y);
+    if (x == u.ux && y == u.uy)
+        return TRUE;
+    if (isok(x,y) && glyph_is_cmap(g) && S_stone == glyph_to_cmap(g)
+        && !levl[x][y].seenv)
+        return FALSE;
+    u.tx = x;
+    u.ty = y;
+    ret = findtravelpath(TRAVP_VALID);
+    u.tx = tx;
+    u.ty = ty;
+    return ret;
+}
+
 /* try to escape being stuck in a trapped state by walking out of it;
    return true iff moving should continue to intended destination
    (all failures and most successful escapes leave hero at original spot) */