From: Pasi Kallinen Date: Wed, 31 Aug 2016 19:00:45 +0000 (+0300) Subject: For travel target location, report if no known travel path X-Git-Tag: NetHack-3.6.1_RC01~617 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f82205c232f9d53e076e77746f133beca727707e;p=nethack For travel target location, report if no known travel path 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. --- diff --git a/doc/fixes36.1 b/doc/fixes36.1 index 332e05c63..c9eaf19c8 100644 --- a/doc/fixes36.1 +++ b/doc/fixes36.1 @@ -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 diff --git a/include/extern.h b/include/extern.h index c5ff34441..e2f4b622b 100644 --- a/include/extern.h +++ b/include/extern.h @@ -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 *)); diff --git a/include/flag.h b/include/flag.h index 55a544471..1f79f07dd 100644 --- a/include/flag.h +++ b/include/flag.h @@ -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 */ diff --git a/src/cmd.c b/src/cmd.c index 13086a9c2..441a6938a 100644 --- 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; diff --git a/src/do_name.c b/src/do_name.c index 316282f76..594cab44d 100644 --- a/src/do_name.c +++ b/src/do_name.c @@ -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); } diff --git a/src/hack.c b/src/hack.c index 59187dde7..1c7e44804 100644 --- a/src/hack.c +++ b/src/hack.c @@ -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) */