Add chasing system
This commit is contained in:
parent
27f1133b60
commit
bcb66b8983
60
src/systems/chasing.rs
Normal file
60
src/systems/chasing.rs
Normal file
@ -0,0 +1,60 @@
|
||||
use crate::prelude::*;
|
||||
|
||||
#[system]
|
||||
#[read_component(Point)]
|
||||
#[read_component(ChasingPlayer)]
|
||||
#[read_component(Health)]
|
||||
#[read_component(Player)]
|
||||
pub fn chasing(#[resource] map: &Map, ecs: &SubWorld, commands: &mut CommandBuffer) {
|
||||
let mut movers = <(Entity, &Point, &ChasingPlayer)>::query();
|
||||
let mut positions = <(Entity, &Point, &Health)>::query();
|
||||
let mut player = <(&Point, &Player)>::query();
|
||||
let player_pos = player.iter(ecs).next().unwrap().0;
|
||||
let player_idx = map_idx(player_pos.x, player_pos.y);
|
||||
let search_targets = vec![player_idx];
|
||||
let dijkstra_map = DijkstraMap::new(SCREEN_WIDTH, SCREEN_HEIGHT, &search_targets, map, 1024.0);
|
||||
|
||||
movers.iter(ecs).for_each(|(entity, pos, _)| {
|
||||
let idx = map_idx(pos.x, pos.y);
|
||||
if let Some(destination) = DijkstraMap::find_lowest_exit(&dijkstra_map, idx, map) {
|
||||
let distance = DistanceAlg::Pythagoras.distance2d(*pos, *player_pos);
|
||||
let destination = if distance > 1.2 {
|
||||
map.index_to_point2d(destination)
|
||||
} else {
|
||||
*player_pos
|
||||
};
|
||||
|
||||
let mut attacked = false;
|
||||
positions
|
||||
.iter(ecs)
|
||||
.filter(|(_, target_pos, _)| **target_pos == destination)
|
||||
.for_each(|(victim, _, _)| {
|
||||
if ecs
|
||||
.entry_ref(*victim)
|
||||
.unwrap()
|
||||
.get_component::<Player>()
|
||||
.is_ok()
|
||||
{
|
||||
commands.push((
|
||||
(),
|
||||
WantsToAttack {
|
||||
attacker: *entity,
|
||||
victim: *victim,
|
||||
},
|
||||
));
|
||||
attacked = true;
|
||||
}
|
||||
});
|
||||
|
||||
if !attacked {
|
||||
commands.push((
|
||||
(),
|
||||
WantsToMove {
|
||||
entity: *entity,
|
||||
destination,
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user