summaryrefslogtreecommitdiff
path: root/src/systems/view.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/systems/view.rs')
-rw-r--r--src/systems/view.rs36
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) => {