use ::bracket_lib::prelude::*; use ::specs::prelude::*; use crate::components::{Equipped, InBackpack, Position}; use crate::map::Map; pub fn entity_position(ecs: &World, target: Entity) -> Option { if let Some(pos) = ecs.read_storage::().get(target) { let map = ecs.fetch::(); return Some(map.xy_idx(pos.x, pos.y) as i32); } None } pub fn aoe_tiles(map: &Map, target: Point, radius: i32) -> Vec { let mut blast_tiles = field_of_view(target, radius, &*map); blast_tiles.retain(|p| p.x > 0 && p.x < map.width - 1 && p.y > 0 && p.y < map.height - 1); let mut result = Vec::new(); for t in blast_tiles.iter() { result.push(map.xy_idx(t.x, t.y) as i32); } result } pub fn find_item_position(ecs: &World, target: Entity, creator: Option) -> Option { let positions = ecs.read_storage::(); let map = ecs.fetch::(); // Easy - it has a position if let Some(pos) = positions.get(target) { return Some(map.xy_idx(pos.x, pos.y) as i32); } // Maybe it is carried? if let Some(carried) = ecs.read_storage::().get(target) { if let Some(pos) = positions.get(carried.owner) { return Some(map.xy_idx(pos.x, pos.y) as i32); } } // Maybe it is equipped? if let Some(equipped) = ecs.read_storage::().get(target) { if let Some(pos) = positions.get(equipped.owner) { return Some(map.xy_idx(pos.x, pos.y) as i32); } } // Maybe the creator has a position? if let Some(creator) = creator { if let Some(pos) = positions.get(creator) { return Some(map.xy_idx(pos.x, pos.y) as i32); } } // No idea - give up None }