diff options
Diffstat (limited to 'src/systems/deduplicate.rs')
| -rw-r--r-- | src/systems/deduplicate.rs | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/systems/deduplicate.rs b/src/systems/deduplicate.rs new file mode 100644 index 0000000..e9fb88a --- /dev/null +++ b/src/systems/deduplicate.rs @@ -0,0 +1,57 @@ + +use std::collections::HashSet; + +use specs::{ + Read, + WriteStorage, + ReadStorage, + Entities, + Entity, + System, + Join +}; + +use crate::{ + components::{Dedup, Removed, New, Position}, + resources::Ground +}; + + +pub struct Deduplicate; +impl <'a> System<'a> for Deduplicate { + type SystemData = ( + Entities<'a>, + WriteStorage<'a, Dedup>, + WriteStorage<'a, Removed>, + ReadStorage<'a, New>, + ReadStorage<'a, Position>, + Read<'a, Ground> + ); + fn run(&mut self, (entities, mut dedups, mut removeds, news, positions, ground): Self::SystemData) { + for (entity, dedup, position, _) in (&entities, &dedups, &positions, &news).join() { + let others: Vec<(Entity, &Dedup)> = ground.cells + .get(&position.pos) + .unwrap_or(&HashSet::new()) + .iter() + .filter_map(|e| Some((*e, dedups.get(*e)?))) + .collect(); + for (e, d) in others { + if dedup.id == d.id { + if dedup.priority > d.priority { + removeds.insert(e, Removed).unwrap(); + } else if dedup.priority < d.priority { + removeds.insert(entity, Removed).unwrap(); + } else if entity > e { + removeds.insert(e, Removed).unwrap(); + } else if entity < e { + removeds.insert(entity, Removed).unwrap(); + } + } + } + } + for (dedup, _) in (&mut dedups, &news).join() { + dedup.priority += 1; + } + } +} + |
