diff options
Diffstat (limited to 'src/systems/view.rs')
| -rw-r--r-- | src/systems/view.rs | 36 |
1 files changed, 10 insertions, 26 deletions
diff --git a/src/systems/view.rs b/src/systems/view.rs index 49338ac..4419203 100644 --- a/src/systems/view.rs +++ b/src/systems/view.rs @@ -1,5 +1,4 @@ -use std::collections::{HashSet}; use specs::{ ReadStorage, @@ -14,12 +13,11 @@ use specs::{ use crate::{ Pos, Sprite, - components::{Visible, Player, Position, Inventory, New, Moved, Removed, Health, Ear}, + components::{Visible, Player, Position, Inventory, New, Health, Ear}, resources::{Size, Output, Ground}, worldmessages::{WorldMessage, FieldMessage} }; -#[derive(Default)] pub struct View; impl <'a> System<'a> for View { @@ -33,37 +31,23 @@ impl <'a> System<'a> for View { ReadStorage<'a, Player>, Write<'a, Output>, ReadStorage<'a, New>, - ReadStorage<'a, Moved>, - ReadStorage<'a, Removed>, Read<'a, Ground>, WriteStorage<'a, Ear> ); - fn run(&mut self, (entities, positions, inventories, healths, visible, size, players, mut output, new, moved, removed, ground, mut ears): Self::SystemData) { + fn run(&mut self, (entities, positions, inventories, healths, visible, size, players, mut output, new, ground, mut ears): Self::SystemData) { - let mut changed = HashSet::new(); - for (pos, _new) in (&positions, &new).join() { - changed.insert(pos.pos); - } - for (pos, mov) in (&positions, &moved).join() { - changed.insert(pos.pos); - changed.insert(mov.from); - } - for (pos, _removed) in (&positions, &removed).join() { - changed.insert(pos.pos); - } + let changes: Vec<(Pos, Vec<Sprite>)> = ground.changes + .iter() + .map(|pos| (*pos, cell_sprites(ground.components_on(*pos, &visible)))) + .collect(); - - 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, &removed)))); - } + let has_changed: bool = !changes.is_empty(); 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, &removed); + let (values, mapping) = draw_room(&ground, (size.width, size.height), &visible); let field = FieldMessage{ width: size.width, height: size.height, @@ -105,14 +89,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>, removals: &ReadStorage<Removed>) -> (Vec<usize>, Vec<Vec<Sprite>>){ +fn draw_room(ground: &Read<Ground>, (width, height): (i64, i64), visible: &ReadStorage<Visible>) -> (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, removals)); + let sprites: Vec<Sprite> = cell_sprites(ground.components_on(Pos{x, y}, visible)); values.push( match mapping.iter().position(|x| x == &sprites) { Some(index) => { |
