summaryrefslogtreecommitdiff
path: root/src/resources.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/resources.rs')
-rw-r--r--src/resources.rs24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/resources.rs b/src/resources.rs
index 6e4bffb..0e9a1e3 100644
--- a/src/resources.rs
+++ b/src/resources.rs
@@ -1,6 +1,6 @@
use std::collections::{HashMap, HashSet};
-use specs::Entity;
+use specs::{Entity, ReadStorage, Component};
use crate::{
pos::Pos,
@@ -11,7 +11,8 @@ use crate::{
PlayerId,
RoomId,
util::Result,
- template::Template
+ template::Template,
+ components::Visible
};
@@ -40,6 +41,25 @@ pub struct Spawn {
pub struct Ground {
pub cells: HashMap<Pos, HashSet<Entity>>
}
+impl Ground {
+ pub fn components_on<'a, C: Component>(&self, pos: Pos, component_type: &'a ReadStorage<C>) -> 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<Visible>, ignore: &Entity) -> Vec<Entity> {
+ let mut entities: Vec<Entity> = 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
+ }
+}
+
#[derive(Default)]
pub struct NewEntities {