use std::collections::{HashMap, HashSet}; use specs::{ ReadStorage, Component, Entity }; use crate::{ components::{Visible, Flags, Flag}, Pos }; #[derive(Default)] pub struct Ground { pub cells: HashMap>, pub changes: HashSet } impl Ground { pub fn insert(&mut self, pos: Pos, ent: Entity){ self.cells.entry(pos).or_insert_with(HashSet::new).insert(ent); self.changes.insert(pos); } pub fn remove(&mut self, pos: &Pos, ent: Entity) -> bool{ if let Some(cell) = self.cells.get_mut(pos) { self.changes.insert(*pos); cell.remove(&ent) } else { false } } pub fn components_on<'a, C: Component>(&self, pos: Pos, component_type: &'a ReadStorage) -> Vec<&'a C> { self.cells .get(&pos) .unwrap_or(&HashSet::new()) .iter() .filter_map(|e| component_type.get(*e)) .collect() } pub fn by_height(&self, pos: &Pos, visibles: &ReadStorage, ignore: &Entity) -> Vec { let mut entities: Vec = self.cells .get(&pos).unwrap_or(&HashSet::new()) .iter() .cloned() .filter(|e| e != ignore && visibles.contains(*e)) .collect(); entities.sort_by(|a, b| visibles.get(*b).unwrap().height.partial_cmp(&visibles.get(*a).unwrap().height).unwrap() ); entities } pub fn flags_on<'a>(&self, pos: Pos, flags: &'a ReadStorage) -> HashSet { self.components_on::(pos, flags).into_iter().fold(HashSet::new(), |a, b| &a | &b.0) } }