summaryrefslogtreecommitdiff
path: root/src/systems/deduplicate.rs
blob: e9fb88af8f47dcbb9d7fc524d4d2dcba634a15a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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;
		}
	}
}