summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/dungeon.cc
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-10-25 14:59:57 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-10-25 14:59:57 +0000
commitf620ad507fe86f50e66e6b15e62b842682a64814 (patch)
treeceecaa9d5f7b3f0341a49e5da4343a4ea1dc5d94 /crawl-ref/source/dungeon.cc
parent2b246a2f1016744c425f9cc9009cfd6b780619b3 (diff)
downloadcrawl-ref-f620ad507fe86f50e66e6b15e62b842682a64814.tar.gz
crawl-ref-f620ad507fe86f50e66e6b15e62b842682a64814.zip
[1804809] Fixed buggy handling of colour overlays.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2570 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/dungeon.cc')
-rw-r--r--crawl-ref/source/dungeon.cc77
1 files changed, 77 insertions, 0 deletions
diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc
index c0ab8006d5..dbfdaae04d 100644
--- a/crawl-ref/source/dungeon.cc
+++ b/crawl-ref/source/dungeon.cc
@@ -228,6 +228,8 @@ static int vault_grid( vault_placement &,
int &num_runes, int rune_subst = -1, bool foll = false);
static int dgn_random_map_for_place(bool wantmini);
+static void dgn_load_colour_grid();
+static void dgn_map_colour_fixup();
// ALTAR FUNCTIONS
static dungeon_feature_type pick_an_altar();
@@ -253,6 +255,34 @@ static bool use_random_maps = true;
static bool dgn_check_connectivity = false;
static int dgn_zones = 0;
+struct coloured_feature
+{
+ dungeon_feature_type feature;
+ int colour;
+
+ coloured_feature() : feature(DNGN_UNSEEN), colour(BLACK) { }
+ coloured_feature(dungeon_feature_type f, int c)
+ : feature(f), colour(c)
+ {
+ }
+};
+
+struct dgn_colour_override_manager
+{
+ dgn_colour_override_manager()
+ {
+ dgn_load_colour_grid();
+ }
+
+ ~dgn_colour_override_manager()
+ {
+ dgn_map_colour_fixup();
+ }
+};
+
+typedef FixedArray< coloured_feature, GXM, GYM > dungeon_colour_grid;
+static std::auto_ptr<dungeon_colour_grid> dgn_colour_grid;
+
typedef std::map<std::string, std::string> callback_map;
static callback_map level_type_post_callbacks;
@@ -290,7 +320,10 @@ bool builder(int level_number, int level_type)
#endif
if (!dgn_level_vetoed && valid_dungeon_level(level_number, level_type))
+ {
+ dgn_map_colour_fixup();
return (true);
+ }
you.uniq_map_tags = uniq_tags;
you.uniq_map_names = uniq_names;
@@ -323,6 +356,35 @@ void level_clear_vault_memory()
dgn_map_mask.init(0);
}
+static void dgn_load_colour_grid()
+{
+ dgn_colour_grid.reset(new dungeon_colour_grid);
+ dungeon_colour_grid &dcgrid(*dgn_colour_grid);
+ for (int y = Y_BOUND_1; y <= Y_BOUND_2; ++y)
+ for (int x = X_BOUND_1; x <= X_BOUND_2; ++x)
+ if (env.grid_colours[x][y] != BLACK)
+ dcgrid[x][y] =
+ coloured_feature(grd[x][y], env.grid_colours[x][y]);
+}
+
+static void dgn_map_colour_fixup()
+{
+ if (!dgn_colour_grid.get())
+ return;
+
+ // If the original coloured feature has been changed, reset the colour.
+ const dungeon_colour_grid &dcgrid(*dgn_colour_grid);
+ for (int y = Y_BOUND_1; y <= Y_BOUND_2; ++y)
+ for (int x = X_BOUND_1; x <= X_BOUND_2; ++x)
+ if (dcgrid[x][y].colour != BLACK
+ && grd[x][y] != dcgrid[x][y].feature)
+ {
+ env.grid_colours[x][y] = BLACK;
+ }
+
+ dgn_colour_grid.reset(NULL);
+}
+
bool set_level_flags(unsigned long flags, bool silent)
{
bool could_control = allow_control_teleport(true);
@@ -381,6 +443,17 @@ bool unset_level_flags(unsigned long flags, bool silent)
return (old_flags != env.level_flags);
}
+void dgn_set_grid_colour_at(const coord_def &c, int colour)
+{
+ if (colour != BLACK)
+ {
+ env.grid_colours(c) = colour;
+ if (!dgn_colour_grid.get())
+ dgn_colour_grid.reset( new dungeon_colour_grid );
+ (*dgn_colour_grid)(c) = coloured_feature(grd(c), colour);
+ }
+}
+
static void dgn_register_vault(const map_def &map)
{
if (!map.has_tag("allow_dup"))
@@ -614,6 +687,8 @@ static bool valid_dungeon_level(int level_number, int level_type)
static void reset_level()
{
level_clear_vault_memory();
+ dgn_colour_grid.reset(NULL);
+
vault_chance = 9;
minivault_chance = 3;
use_random_maps = true;
@@ -3661,6 +3736,8 @@ static dungeon_feature_type dgn_find_rune_subst_tags(const std::string &tags)
bool dgn_place_map(int map, bool generating_level, bool clobber,
bool make_no_exits, const coord_def &where)
{
+ const dgn_colour_override_manager colour_man;
+
const map_def *mdef = map_by_index(map);
bool did_map = false;
bool fixup = false;