diff options
author | Luca Barbieri <luca@luca-barbieri.com> | 2010-06-07 02:52:28 +0200 |
---|---|---|
committer | Robert Vollmert <rvollmert@gmx.net> | 2010-07-29 00:43:58 +0200 |
commit | 7184b88d886d74490447b01699bd2f95dc9cc804 (patch) | |
tree | 45a5acc8744c2dfd96aff8ecd0e764f0c4cb2964 /crawl-ref/source/map_knowledge.cc | |
parent | 698259e9db09aea1c2bf60375daed4200dd25987 (diff) | |
download | crawl-ref-7184b88d886d74490447b01699bd2f95dc9cc804.tar.gz crawl-ref-7184b88d886d74490447b01699bd2f95dc9cc804.zip |
Remove env.show in favor of using env.map_knowledge
Currently env.show stores information about the LOS rectangle, while
env.map_knowledge stores the rest of the map.
This unnecessarily complicates the code, makes serialization harder,
and makes it hard to change the LOS model.
This code uses map_knowledge for both kinds of data.
Regressions are quite possible.
Signed-off-by: Robert Vollmert <rvollmert@gmx.net>
Diffstat (limited to 'crawl-ref/source/map_knowledge.cc')
-rw-r--r-- | crawl-ref/source/map_knowledge.cc | 163 |
1 files changed, 23 insertions, 140 deletions
diff --git a/crawl-ref/source/map_knowledge.cc b/crawl-ref/source/map_knowledge.cc index 37ae3718a6..ee66525e18 100644 --- a/crawl-ref/source/map_knowledge.cc +++ b/crawl-ref/source/map_knowledge.cc @@ -22,94 +22,9 @@ #endif #include "view.h" -// These are hidden from the rest of the world... use the functions -// below to get information about the map grid. -#define MAP_MAGIC_MAPPED_FLAG 0x01 -#define MAP_SEEN_FLAG 0x02 -#define MAP_CHANGED_FLAG 0x04 // FIXME: this doesn't belong here -#define MAP_DETECTED_MONSTER 0x08 -#define MAP_DETECTED_ITEM 0x10 -#define MAP_GRID_KNOWN 0xFF - -unsigned map_cell::glyph(bool clean_map) const -{ - if (!object) - return (' '); - if ((clean_map && object.is_cleanable_monster()) - || object.cls < SH_MONSTER) - { - const feature_def &fdef = get_feature_def(object); - return ((flags & MAP_SEEN_FLAG) ? fdef.symbol : fdef.magic_symbol); - } - else - return (mons_char(object.mons)); -} - -dungeon_feature_type map_cell::feat() const -{ - return (object.feat); -} - -show_item_type map_cell::item() const -{ - return (object.item); -} - -bool map_cell::known() const -{ - return (object && (flags & MAP_GRID_KNOWN)); -} - -bool map_cell::seen() const -{ - return (object && (flags & MAP_SEEN_FLAG)); -} - -unsigned get_map_knowledge_char(int x, int y) -{ - return env.map_knowledge[x][y].glyph(Options.clean_map); -} - -show_type get_map_knowledge_obj(int x, int y) -{ - return (env.map_knowledge[x][y].object); -} - -void set_map_knowledge_detected_item(int x, int y, bool detected) -{ - if (detected) - { - env.map_knowledge[x][y].flags |= MAP_DETECTED_ITEM; - env.map_knowledge[x][y].object.colour = Options.detected_item_colour; - } - else - env.map_knowledge[x][y].flags &= ~MAP_DETECTED_ITEM; -} - -bool is_map_knowledge_detected_item(int x, int y) -{ - return (env.map_knowledge[x][y].flags & MAP_DETECTED_ITEM); -} - -void set_map_knowledge_detected_mons(int x, int y, bool detected) -{ - if (detected) - { - env.map_knowledge[x][y].flags |= MAP_DETECTED_MONSTER; - env.map_knowledge[x][y].object.colour = Options.detected_monster_colour; - } - else - env.map_knowledge[x][y].flags &= ~MAP_DETECTED_MONSTER; -} - -bool is_map_knowledge_detected_mons(int x, int y) -{ - return (env.map_knowledge[x][y].flags & MAP_DETECTED_MONSTER); -} - void map_knowledge_forget_mons(const coord_def& c) { - if (!is_map_knowledge_detected_mons(c)) + if (!env.map_knowledge(c).detected_monster()) return; env.map_knowledge(c).flags &= ~MAP_DETECTED_MONSTER; @@ -126,46 +41,6 @@ void set_map_knowledge_obj(const coord_def& where, show_type obj) #endif } -bool is_map_knowledge_item(int x, int y) -{ - return (env.map_knowledge[x][y].object.cls == SH_ITEM); -} - -bool is_map_knowledge_mons(int x, int y) -{ - return (env.map_knowledge[x][y].object.cls == SH_MONSTER); -} - -int get_map_knowledge_col(const coord_def& p) -{ - return (env.map_knowledge[p.x][p.y].object.colour); -} - -bool is_terrain_known( int x, int y ) -{ - return (env.map_knowledge[x][y].known()); -} - -bool is_terrain_known(const coord_def &p) -{ - return (env.map_knowledge(p).known()); -} - -bool is_terrain_seen( int x, int y ) -{ - return (env.map_knowledge[x][y].flags & MAP_SEEN_FLAG); -} - -bool is_terrain_changed( int x, int y ) -{ - return (env.map_knowledge[x][y].flags & MAP_CHANGED_FLAG); -} - -bool is_terrain_mapped(const coord_def &p) -{ - return (env.map_knowledge(p).flags & MAP_MAGIC_MAPPED_FLAG); -} - // Used to mark dug out areas, unset when terrain is seen or mapped again. void set_terrain_changed( int x, int y ) { @@ -197,10 +72,10 @@ int count_detected_mons() // Note: assumptions are being made here about how // terrain can change (eg it used to be solid, and // thus monster/item free). - if (is_terrain_changed(*ri)) + if (env.map_knowledge(*ri).changed()) continue; - if (is_map_knowledge_detected_mons(*ri)) + if (env.map_knowledge(*ri).detected_monster()) count++; } @@ -212,13 +87,13 @@ void clear_map(bool clear_detected_items, bool clear_detected_monsters) for (rectangle_iterator ri(BOUNDARY_BORDER - 1); ri; ++ri) { const coord_def p = *ri; - if (!is_terrain_known(p)) + if (!env.map_knowledge(p).known()) continue; - if (is_map_knowledge_item(p)) + if (env.map_knowledge(p).item() != SHOW_ITEM_NONE) continue; - if (!clear_detected_items && is_map_knowledge_detected_item(p)) + if (!clear_detected_items && env.map_knowledge(p).detected_item()) continue; - if (!clear_detected_monsters && is_map_knowledge_detected_mons(p)) + if (!clear_detected_monsters && env.map_knowledge(p).detected_item()) continue; show_type plain = env.map_knowledge(p).object; @@ -233,9 +108,9 @@ void clear_map(bool clear_detected_items, bool clear_detected_monsters) #endif } - set_map_knowledge_obj(p, to_knowledge(plain)); - set_map_knowledge_detected_mons(p, false); - set_map_knowledge_detected_item(p, false); + set_map_knowledge_obj(p, plain); + env.map_knowledge(p).set_detected_monster(false); + env.map_knowledge(p).set_detected_item(false); } } @@ -296,15 +171,23 @@ void set_terrain_seen( int x, int y ) cell->flags &= (~MAP_CHANGED_FLAG); cell->flags |= MAP_SEEN_FLAG; - cell->object.colour = get_feature_def(cell->object).seen_colour; } -void clear_map_knowledge_grid( const coord_def& p ) +void set_terrain_visible(const coord_def &c) { - env.map_knowledge(p).clear(); + map_cell* cell = &env.map_knowledge(c); + set_terrain_seen(c); + if(!(cell->flags & MAP_VISIBLE_FLAG)) + { + cell->flags |= MAP_VISIBLE_FLAG; + env.visible.insert(c); + } + cell->flags &=~ (MAP_DETECTED_MONSTER | MAP_DETECTED_ITEM); } -void clear_map_knowledge_grid( int x, int y ) +void clear_terrain_visibility() { - env.map_knowledge[x][y].clear(); + for(std::set<coord_def>::iterator i = env.visible.begin(); i != env.visible.end(); ++i) + env.map_knowledge(*i).flags &=~ MAP_VISIBLE_FLAG; + env.visible.clear(); } |