summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/travel.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/travel.cc')
-rw-r--r--crawl-ref/source/travel.cc27
1 files changed, 25 insertions, 2 deletions
diff --git a/crawl-ref/source/travel.cc b/crawl-ref/source/travel.cc
index 26a442ccac..c5b7a790cb 100644
--- a/crawl-ref/source/travel.cc
+++ b/crawl-ref/source/travel.cc
@@ -1466,7 +1466,7 @@ void track_intersect(std::vector<level_id> &cur,
cx->branch = 0;
cx->depth = -1;
- int us = cur.size() - 1, them = targ.size() - 1;
+ int us = int(cur.size()) - 1, them = int(targ.size()) - 1;
for ( ; us >= 0 && them >= 0; us--, them--)
{
@@ -1488,7 +1488,12 @@ void track_intersect(std::vector<level_id> &cur,
*/
int level_distance(level_id first, level_id second)
{
- if (first == second) return 0;
+ if (first == second
+ || (first.level_type != LEVEL_DUNGEON
+ && first.level_type == second.level_type))
+ {
+ return 0;
+ }
std::vector<level_id> fv, sv;
@@ -1533,6 +1538,7 @@ int level_distance(level_id first, level_id second)
}
distance += sv[i].depth;
}
+
return distance;
}
@@ -1938,6 +1944,15 @@ static level_pos prompt_translevel_target()
void start_translevel_travel(const level_pos &pos)
{
+ if (!can_travel_to(pos.id))
+ return;
+
+ if (!can_travel_interlevel())
+ {
+ start_travel(pos.pos.x, pos.pos.y);
+ return;
+ }
+
travel_target = pos;
if (pos.id != level_id::current())
@@ -3170,6 +3185,14 @@ void TravelCache::fixup_levels()
i->second.fixup();
}
+bool can_travel_to(const level_id &id)
+{
+ return ((id.level_type == LEVEL_DUNGEON
+ && can_travel_interlevel())
+ || (id.level_type == LEVEL_PANDEMONIUM
+ && you.level_type == LEVEL_PANDEMONIUM));
+}
+
bool can_travel_interlevel()
{
return (player_in_mappable_area() && you.level_type != LEVEL_PANDEMONIUM);