From f620ad507fe86f50e66e6b15e62b842682a64814 Mon Sep 17 00:00:00 2001 From: dshaligram Date: Thu, 25 Oct 2007 14:59:57 +0000 Subject: [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 --- crawl-ref/source/dungeon.cc | 77 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) (limited to 'crawl-ref/source/dungeon.cc') 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 dgn_colour_grid; + typedef std::map 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; -- cgit v1.2.3-54-g00ecf