From 2b0cc677f4092d94b31e95f3e9961ec6ed91327b Mon Sep 17 00:00:00 2001 From: troido Date: Sat, 22 Feb 2020 12:55:10 +0100 Subject: can now pick up specific object from ground --- src/resources.rs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'src/resources.rs') 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> } +impl Ground { + 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 + } +} + #[derive(Default)] pub struct NewEntities { -- cgit