diff --git a/include/flag.h b/include/flag.h index d41a598f8..551cd004e 100644 --- a/include/flag.h +++ b/include/flag.h @@ -212,12 +212,14 @@ struct instance_flags { #define TER_OBJ 0x04 #define TER_MON 0x08 #define TER_DETECT 0x10 /* detect_foo magic rather than #terrain */ - boolean getloc_travelmode; - int getdir_ok2click; /* for #therecmdmenu */ - int getloc_click; /* 0 or CLICK_1 (left) or CLICK_2 (right) */ + int getdir_click; /* as input to getdir(): non-zero, accept simulated + * click that's not adjacent to or on hero; + * as output from getdir(): simulated button used + * 0 (none) or CLICK_1 (left) or CLICK_2 (right) */ int getloc_filter; /* GFILTER_foo */ - boolean getloc_usemenu; boolean getloc_moveskip; + boolean getloc_travelmode; + boolean getloc_usemenu; coord travelcc; /* coordinates for travel_cache */ boolean trav_debug; /* display travel path (#if DEBUG only) */ boolean window_inited; /* true if init_nhwindows() completed */ diff --git a/include/you.h b/include/you.h index 25730b56b..898d091a4 100644 --- a/include/you.h +++ b/include/you.h @@ -347,17 +347,17 @@ enum utotypes { /*** Information about the player ***/ struct you { - coordxy ux, uy; /* current map coordinates */ - schar dx, dy, dz; /* direction of move (or zap or ... ) */ - schar di; /* direction of FF */ - coordxy tx, ty; /* destination of travel */ - coordxy ux0, uy0; /* initial position FF */ + coordxy ux, uy; /* current map coordinates */ + int dx, dy, dz; /* x,y,z deltas; direction of move (or zap or ... ) + * usually +1 or 0 or -1 */ + coordxy tx, ty; /* destination of travel */ + coordxy ux0, uy0; /* previous ux,uy */ d_level uz, uz0; /* your level on this and the previous turn */ d_level utolev; /* level monster teleported you to, or uz */ uchar utotype; /* bitmask of goto_level() flags for utolev */ boolean umoved; /* changed map location (post-move) */ int last_str_turn; /* 0: none, 1: half turn, 2: full turn - +: turn right, -: turn left */ + * +: turn right, -: turn left */ int ulevel; /* 1 to MAXULEV (30) */ int ulevelmax; /* highest level, but might go down (to throttle * lost level recovery via blessed full healing) */ diff --git a/src/cmd.c b/src/cmd.c index 78cb793e3..5d463413a 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -4490,9 +4490,9 @@ getdir(const char *s) /* caller expects simulated click to be relative to hero's spot */ u.dx = cc.x - u.ux; u.dy = cc.y - u.uy; - /* getdir_ok2click actually means ok to click farther than + /* non-zero getdir_click actually means ok to click farther than one spot away from hero; adjacent click is always allowed */ - if (!iflags.getdir_ok2click) { + if (!iflags.getdir_click) { u.dx = sgn(u.dx); u.dy = sgn(u.dy); } @@ -4518,7 +4518,7 @@ getdir(const char *s) break; } } - iflags.getloc_click = mod; + iflags.getdir_click = mod; return (pos >= 0); } else if (!(is_mov = movecmd(dirsym, MV_ANY)) && !u.dz) { boolean did_help = FALSE, help_requested; @@ -4767,16 +4767,18 @@ static int dotherecmdmenu(void) { char ch; - int dir; + int dir, click; - iflags.getdir_ok2click = TRUE; + iflags.getdir_click = CLICK_1 | CLICK_2; /* allow 'far' click */ dir = getdir((const char *) 0); - iflags.getdir_ok2click = FALSE; + click = iflags.getdir_click; + iflags.getdir_click = 0; + if (!dir || !isok(u.ux + u.dx, u.uy + u.dy)) return ECMD_CANCEL; if (u.dx || u.dy) - ch = there_cmd_menu(u.ux + u.dx, u.uy + u.dy, iflags.getloc_click); + ch = there_cmd_menu(u.ux + u.dx, u.uy + u.dy, click); else ch = here_cmd_menu(); @@ -5229,7 +5231,8 @@ act_on_act( } } -/* offer choice of actions to perform at adjacent location */ +/* offer choice of actions to perform at adjacent location ; + a few choices can be farther away */ static char there_cmd_menu(coordxy x, coordxy y, int mod) { diff --git a/src/do_name.c b/src/do_name.c index c85d53b37..4de715afa 100644 --- a/src/do_name.c +++ b/src/do_name.c @@ -782,7 +782,6 @@ getpos(coord *ccp, boolean force, const char *goal) } if (c == cmd_from_func(do_run) || c == cmd_from_func(do_rush)) { c = readchar_poskey(&tx, &ty, &sidx); - iflags.getloc_click = sidx; /* [is this useful?] */ rushrun = TRUE; } if (c == 0) {