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/systems/view.rs | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) (limited to 'src/systems/view.rs') diff --git a/src/systems/view.rs b/src/systems/view.rs index 6e53eb1..7d41820 100644 --- a/src/systems/view.rs +++ b/src/systems/view.rs @@ -1,5 +1,5 @@ -use std::collections::{HashMap, HashSet}; +use std::collections::{HashSet}; use specs::{ ReadStorage, @@ -7,8 +7,7 @@ use specs::{ Write, System, Join, - Entities, - Entity + Entities }; use crate::{Pos, Sprite}; @@ -53,14 +52,14 @@ impl <'a> System<'a> for View { let has_changed: bool = !changed.is_empty(); let mut changes: Vec<(Pos, Vec)> = Vec::new(); for pos in changed { - changes.push((pos, cell_sprites(ground.cells.get(&pos).unwrap_or(&HashSet::new()), &visible))); + changes.push((pos, cell_sprites(ground.components_on(pos, &visible)))); } output.output.clear(); for (ent, player, pos) in (&entities, &players, &positions).join() { let mut updates = WorldMessage::default(); if new.get(ent).is_some() { - let (values, mapping) = draw_room(&ground.cells, (size.width, size.height), &visible); + let (values, mapping) = draw_room(&ground, (size.width, size.height), &visible); let field = FieldMessage{ width: size.width, height: size.height, @@ -77,6 +76,13 @@ impl <'a> System<'a> for View { if let Some(health) = healths.get(ent){ updates.health = Some((health.health, health.maxhealth)); } + updates.ground = Some( + ground + .by_height(&pos.pos, &visible, &ent) + .into_iter() + .map(|ent| visible.get(ent).unwrap().name.clone()) + .collect() + ); updates.pos = Some(pos.pos); if !updates.is_empty() { output.output.insert(player.id.clone(), updates); @@ -85,23 +91,19 @@ impl <'a> System<'a> for View { } } -fn cell_sprites(entities: &HashSet, visible: &ReadStorage) -> Vec { - let mut visibles: Vec<&Visible> = entities.iter().filter_map(|ent| visible.get(*ent)).collect(); +fn cell_sprites(mut visibles: Vec<&Visible>) -> Vec { visibles.sort_by(|a, b| b.height.partial_cmp(&a.height).unwrap()); visibles.iter().map(|vis| vis.sprite.clone()).collect() } -fn draw_room(ground: &HashMap>, (width, height): (i64, i64), visible: &ReadStorage) -> (Vec, Vec>){ +fn draw_room(ground: &Read, (width, height): (i64, i64), visible: &ReadStorage) -> (Vec, Vec>){ let size = width * height; let mut values :Vec = Vec::with_capacity(size as usize); let mut mapping: Vec> = Vec::new(); for y in 0..height { for x in 0..width { - let sprites: Vec = match ground.get(&Pos{x, y}) { - Some(ents) => {cell_sprites(ents, visible)} - None => {vec![]} - }; + let sprites: Vec = cell_sprites(ground.components_on(Pos{x, y}, visible)); values.push( match mapping.iter().position(|x| x == &sprites) { Some(index) => { -- cgit