the entrance to any level; can also enter 0 at the depth prompt to go to a branch entrance.)
Also (experimentally) unifies the level-map and interlevel travel targets.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1754 c06c8d41-db1a-0410-9941-cceddc491573
45FTVJJ5FMXBXQ2GVUZVJZU6Y6NUYG2JZIHWVMONA7QYYCZQSM2QC
SOGYI2OBNZHL6HZN3ZJR5ITQHTYITILKR4D4EZPKBO23UYZW3JQAC
777QS3HZPW7YHEZPCMEOFVMAPW47RHZNUMBKERJEGOTOG4B54CEAC
YQDXXS2M7PYVJHY6KAHSRKE5ZRC6T72W7LTGNRVPKCSP5VATWAVAC
KL3WT33GGILCQNODQUHKJBVI7UCDRQCWCTYCUGDQPDIMUPV73W7AC
QS3ZRS3E6KL3YJHPKYEWCWJYRBJSXD5OOYF6Y25HZVECGPJRDB5QC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
RC6L3CIBLJEH4GWRFD7UQNGI6PZT74FRUVOYHSAN2XCC74NZUASQC
ZHFUXYUHS6V47WK2NRH7OU6RX77NRKTXOZC3MND2GG7PEEWSGFTAC
IPXXB4VRVZWOU5DKQ5ZTD37LS3QNK2R6APNZUO672YEEJT6OFAYQC
6HG6JFO47Y3BZLU7Y6G3R2CX6JFGN4X5PKK6S5IGUXUYQ5GVZYFQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
T4IH76FA5TWHFOZUJFHLQXQJENJHWTUZZP4EGNA7D4GTZY7D4ZKAC
5UVDIVD4NSXA52U4QMQIVST3GSZJ2A2YZK3RUEXKPM43YVQ7LI5AC
M47QBURKKRV2JFK6U7GQNVWK7RUTBVPBJ5FHURC55SKQSXAUFSBAC
Y66ZAXN24E3HLIBOSW4OXUTQ4X4PRGNJII4KVDQH4GQJVA6GO3NAC
XP3TQISCLEST3ZNTF6OZ6FYMHIIPMVTNVBIIG47LA5PS7J234SQAC
V6S33CAMTUXXDETG654VX2K4DA25DI6KFBTKPM2EGFDIBMAU4TJAC
SCWXQW5H65OXUP2MEJ2MEEAVPSRJDT3RQGKYCMKVTORS2334PQSQC
GACH6PWPGGUBEE7PFEPQMOZKSR7HTQGL2WLGF2AQPJD3FCCSKZNQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
// Get the LevelInfo for the specified level (defaults to the current
// level).
LevelInfo& get_level_info(branch_type branch = BRANCH_MAIN_DUNGEON,
int depth = -1)
{
return get_level_info( level_id(branch, depth) );
}
&& (travel_target.pos.x != you.x_pos
|| travel_target.pos.y != you.y_pos
|| travel_target.id !=
level_id::current()))
&& (level_target.p.pos != you.pos()
|| level_target.p.id != level_id::current()))
return CMD_NO_CMD;
return (CMD_NO_CMD);
}
// Check for entrance-only thang. If we've reached the
// entrance, kill travel.
if (level_target.entrance_only)
{
LevelInfo &li =
travel_cache.get_level_info(level_id::current());
const stair_info *si = li.get_stair(you.pos());
if (si && si->destination.id == level_target.p.id)
{
you.running = runmode;
stop_running();
return (CMD_NO_CMD);
}
// Show level+depth information and tack on an @(x,y) if the player
// wants to go to a specific square on the target level. We don't use
// actual coordinates since that will give away level information we
// don't want the player to have.
if ( branches[branch_id].depth != 1 )
snprintf(buffer, maxlen, "%s:%d%s", branch, target.id.depth,
target.pos.x != -1? " @ (x,y)" : "");
else
snprintf(buffer, maxlen, "%s%s", branch,
target.pos.x != -1? " @ (x,y)" : "");
std::ostringstream dest;
if (!skip_branch)
dest << branch;
if (branches[branch_id].depth != 1)
{
if (!skip_branch)
dest << ":";
dest << target.p.id.depth;
}
if (target.p.pos.x != -1 && !skip_coord)
dest << " @ (x,y)";
else if (target.entrance_only)
dest << " (entrance)";
return (dest.str());
level_id lid(*br, *depth);
trim_string(s);
const std::string ekey("(entrance)");
std::string::size_type epos = s.find(ekey);
if (!s.empty())
targ.entrance_only = epos != std::string::npos;
if (targ.entrance_only && !s.empty())
s = trimmed_string(s.substr(0, epos) + s.substr(epos + ekey.length()));
if (!s.empty())
targ.p.id.depth = atoi(s.c_str());
if (!targ.p.id.depth && !s.empty() && s[0] == '0')
{
targ.p.id.depth = 1;
targ.entrance_only = true;
}
return (targ);
}
static void travel_depth_munge(int munge_method,
const std::string &s,
travel_target &targ)
{
parse_travel_target(s, targ);
level_id lid(targ.p.id);
target = find_up_level();
if (target.id.depth > 0 && remember_targ)
set_trans_travel_dest(trans_travel_dest, sizeof trans_travel_dest,
target);
target.p = find_up_level();
if (target.p.id.depth > 0 && remember_targ)
trans_travel_dest = get_trans_travel_dest(target);
target = find_down_level();
if (target.id.depth > 0 && remember_targ)
set_trans_travel_dest(trans_travel_dest, sizeof trans_travel_dest,
target);
target.p = find_down_level();
if (target.p.id.depth > 0 && remember_targ)
trans_travel_dest = get_trans_travel_dest(target);
if (target.id.depth > -1 && remember_targ)
set_trans_travel_dest(trans_travel_dest, sizeof trans_travel_dest,
target);
if (target.p.id.depth > -1 && remember_targ)
trans_travel_dest = get_trans_travel_dest(target);
if (level_id::current() == travel_target.id &&
(travel_target.pos.x == -1 ||
(travel_target.pos.x == you.x_pos &&
travel_target.pos.y == you.y_pos)))
if (level_id::current() == level_target.p.id
&& (level_target.p.pos.x == -1 || level_target.p.pos == you.pos()))
if (travel_point_distance[x][y] == 0
&& (x != you.x_pos || you.running.y != you.y_pos)
&& is_travelsafe_square(x, y, false)
&& can_travel_interlevel())
if (!can_travel_interlevel())
// We'll need interlevel travel to get here.
travel_target.id = level_id::current();
travel_target.pos.x = x;
travel_target.pos.y = y;
you.running = RMODE_INTERLEVEL;
you.running.x = you.running.y = 0;
last_stair.depth = -1;
// We need the distance of the target from the various stairs around.
populate_stair_distances(travel_target);
set_trans_travel_dest(trans_travel_dest, sizeof trans_travel_dest,
travel_target);
// Start running
you.running = RMODE_TRAVEL;
start_running();
set_trans_travel_dest(dest, sizeof dest, waypoints[i]);
// All waypoints will have @ (x,y), remove that.
char *at = strchr(dest, '@');
if (at)
*--at = 0;
snprintf(choice, sizeof choice, "(%d) %-8s", i, dest);
dest = get_trans_travel_dest(waypoints[i], false, true);
snprintf(choice, sizeof choice, "(%d) %-8s", i, dest.c_str());