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;
}
}
}
|