rust-rl/src/effects/targeting.rs
2023-08-21 20:20:46 +01:00

45 lines
1.6 KiB
Rust

use crate::{Equipped, InBackpack, Map, Position};
use rltk::prelude::*;
use specs::prelude::*;
pub fn entity_position(ecs: &World, target: Entity) -> Option<usize> {
if let Some(position) = ecs.read_storage::<Position>().get(target) {
let map = ecs.fetch::<Map>();
return Some(map.xy_idx(position.x, position.y));
}
return None;
}
pub fn aoe_tiles(map: &Map, target: rltk::Point, radius: i32) -> Vec<usize> {
let mut blast_tiles = rltk::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));
}
result
}
pub fn find_item_position(ecs: &World, target: Entity) -> Option<i32> {
let positions = ecs.read_storage::<Position>();
let map = ecs.fetch::<Map>();
// Does it have a position?
if let Some(pos) = positions.get(target) {
return Some(map.xy_idx(pos.x, pos.y) as i32);
}
// If not, is it carried?
if let Some(carried) = ecs.read_storage::<InBackpack>().get(target) {
if let Some(pos) = positions.get(carried.owner) {
return Some(map.xy_idx(pos.x, pos.y) as i32);
}
}
// Is it equipped?
if let Some(carried) = ecs.read_storage::<Equipped>().get(target) {
if let Some(pos) = positions.get(carried.owner) {
return Some(map.xy_idx(pos.x, pos.y) as i32);
}
}
// Out of luck: give up
console::log("DEBUGINFO: Failed to find item position");
None
}