summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/dungeon.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/dungeon.cc')
-rw-r--r--crawl-ref/source/dungeon.cc96
1 files changed, 96 insertions, 0 deletions
diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc
index af0495e0e5..e96d23fc1e 100644
--- a/crawl-ref/source/dungeon.cc
+++ b/crawl-ref/source/dungeon.cc
@@ -311,6 +311,64 @@ void level_clear_vault_memory()
dgn_map_mask.init(0);
}
+bool set_level_flags(unsigned long flags, bool silent)
+{
+ bool could_control = allow_control_teleport(true);
+ bool could_map = player_in_mappable_area();
+
+ unsigned long old_flags = env.level_flags;
+ env.level_flags |= flags;
+
+ bool can_control = allow_control_teleport(true);
+ bool can_map = player_in_mappable_area();
+
+ if (you.skills[SK_TRANSLOCATIONS] > 0
+ && could_control && !can_control && !silent)
+ {
+ mpr("You sense the appearence of a powerful magical force "
+ "which warps space.", MSGCH_WARN);
+ }
+
+ if (could_map && !can_map && !silent)
+ {
+ mpr("A powerful force appears that prevents you from "
+ "remembering where you've been.", MSGCH_WARN);
+ }
+
+ return (old_flags != env.level_flags);
+}
+
+bool unset_level_flags(unsigned long flags, bool silent)
+{
+ bool could_control = allow_control_teleport(true);
+ bool could_map = player_in_mappable_area();
+
+ unsigned long old_flags = env.level_flags;
+ env.level_flags &= ~flags;
+
+ bool can_control = allow_control_teleport(true);
+ bool can_map = player_in_mappable_area();
+
+ if (you.skills[SK_TRANSLOCATIONS] > 0
+ && !could_control && can_control && !silent)
+ {
+ // Isn't really a "recovery", but I couldn't think of where
+ // else to send it.
+ mpr("You sense the disappearence of a powerful magical force "
+ "which warped space.", MSGCH_RECOVERY);
+ }
+
+ if (!could_map && can_map && !silent)
+ {
+ // Isn't really a "recovery", but I couldn't think of where
+ // else to send it.
+ mpr("You sense the disappearence the force that prevented you "
+ "from remembering where you've been.", MSGCH_RECOVERY);
+ }
+
+ return (old_flags != env.level_flags);
+}
+
static void dgn_register_vault(const map_def &map)
{
if (map.has_tag("uniq"))
@@ -461,6 +519,27 @@ static void register_place(const vault_placement &place)
if (!place.map.has_tag("transparent"))
mask_vault(place, MMT_OPAQUE);
+
+ // Now do per-square by-symbol masking
+ for (int y = place.y + place.height - 1; y >= place.y; --y)
+ for (int x = place.x + place.width - 1; x >= place.x; --x)
+ if (place.map.in_map(coord_def(x - place.x, y - place.y)))
+ {
+ int key = place.map.map.glyph(x - place.x, y - place.y);
+ const keyed_mapspec* spec = place.map.mapspec_for_key(key);
+
+ if (spec != NULL)
+ {
+ dgn_map_mask[x][y] |= (short)spec->map_mask.flags_set;
+ dgn_map_mask[x][y] &= ~((short)spec->map_mask.flags_unset);
+ }
+ }
+
+ set_branch_flags(place.map.branch_flags.flags_set, true);
+ unset_branch_flags(place.map.branch_flags.flags_unset, true);
+
+ set_level_flags(place.map.level_flags.flags_set, true);
+ unset_level_flags(place.map.level_flags.flags_unset, true);
}
static bool ensure_vault_placed(bool vault_success)
@@ -548,6 +627,23 @@ static void reset_level()
// clear all markers
env.markers.clear();
+
+ // Set default level flags
+ if (you.level_type == LEVEL_DUNGEON)
+ env.level_flags = branches[you.where_are_you].default_level_flags;
+ else if (you.level_type == LEVEL_LABYRINTH ||
+ you.level_type == LEVEL_ABYSS)
+ {
+ env.level_flags = LFLAG_NO_TELE_CONTROL | LFLAG_NOT_MAPPABLE;
+
+ if (!(you.level_type == LEVEL_LABYRINTH
+ && you.species != SP_MINOTAUR))
+ {
+ env.level_flags |= LFLAG_NO_MAGIC_MAP;
+ }
+ }
+ else
+ env.level_flags = 0;
}
static void build_layout_skeleton(int level_number, int level_type,