summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/resources/mod.rs12
-rw-r--r--src/systems/view.rs8
2 files changed, 13 insertions, 7 deletions
diff --git a/src/resources/mod.rs b/src/resources/mod.rs
index d3777e5..07669c4 100644
--- a/src/resources/mod.rs
+++ b/src/resources/mod.rs
@@ -12,7 +12,7 @@ use crate::{
RoomId,
Result,
Template,
- components::Visible,
+ components::{Visible, Removed},
playerstate::RoomPos
};
@@ -43,8 +43,14 @@ pub struct Ground {
pub cells: HashMap<Pos, HashSet<Entity>>
}
impl Ground {
- pub fn components_on<'a, C: Component>(&self, pos: Pos, component_type: &'a ReadStorage<C>) -> Vec<&'a C> {
- self.cells.get(&pos).unwrap_or(&HashSet::new()).iter().filter_map(|e| component_type.get(*e)).collect()
+ pub fn components_on<'a, C: Component>(&self, pos: Pos, component_type: &'a ReadStorage<C>, removals: &'a ReadStorage<Removed>) -> Vec<&'a C> {
+ self.cells
+ .get(&pos)
+ .unwrap_or(&HashSet::new())
+ .iter()
+ .filter(|e| !removals.contains(**e))
+ .filter_map(|e| component_type.get(*e))
+ .collect()
}
pub fn by_height(&self, pos: &Pos, visibles: &ReadStorage<Visible>, ignore: &Entity) -> Vec<Entity> {
diff --git a/src/systems/view.rs b/src/systems/view.rs
index 158a187..cff24fa 100644
--- a/src/systems/view.rs
+++ b/src/systems/view.rs
@@ -54,14 +54,14 @@ impl <'a> System<'a> for View {
let has_changed: bool = !changed.is_empty();
let mut changes: Vec<(Pos, Vec<Sprite>)> = Vec::new();
for pos in changed {
- changes.push((pos, cell_sprites(ground.components_on(pos, &visible))));
+ changes.push((pos, cell_sprites(ground.components_on(pos, &visible, &removed))));
}
output.output.clear();
for (ent, player, pos) in (&entities, &players, &positions).join() {
let mut updates = WorldMessage::default();
if new.get(ent).is_some() {
- let (values, mapping) = draw_room(&ground, (size.width, size.height), &visible);
+ let (values, mapping) = draw_room(&ground, (size.width, size.height), &visible, &removed);
let field = FieldMessage{
width: size.width,
height: size.height,
@@ -98,14 +98,14 @@ fn cell_sprites(mut visibles: Vec<&Visible>) -> Vec<Sprite> {
visibles.iter().map(|vis| vis.sprite.clone()).collect()
}
-fn draw_room(ground: &Read<Ground>, (width, height): (i64, i64), visible: &ReadStorage<Visible>) -> (Vec<usize>, Vec<Vec<Sprite>>){
+fn draw_room(ground: &Read<Ground>, (width, height): (i64, i64), visible: &ReadStorage<Visible>, removals: &ReadStorage<Removed>) -> (Vec<usize>, Vec<Vec<Sprite>>){
let size = width * height;
let mut values :Vec<usize> = Vec::with_capacity(size as usize);
let mut mapping: Vec<Vec<Sprite>> = Vec::new();
for y in 0..height {
for x in 0..width {
- let sprites: Vec<Sprite> = cell_sprites(ground.components_on(Pos{x, y}, visible));
+ let sprites: Vec<Sprite> = cell_sprites(ground.components_on(Pos{x, y}, visible, removals));
values.push(
match mapping.iter().position(|x| x == &sprites) {
Some(index) => {