diff options
| -rw-r--r-- | src/resources/mod.rs | 12 | ||||
| -rw-r--r-- | src/systems/view.rs | 8 |
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) => { |
