minigene/systems/
goto_entity_simple.rs

1use crate::*;
2
3/// Moves an entity one tile towards the targeted entity, regardless of collisions.
4pub fn goto_entity_simple_system(
5    entities: &Entities,
6    gotos: &Components<GotoEntity>,
7    positions: &mut Components<Point>,
8) -> SystemResult {
9    let mut v = vec![];
10    for (e, _, goto) in join!(&entities && &positions && &gotos) {
11        v.push((
12            e.unwrap(),
13            goto.unwrap().entity.clone(),
14            goto.unwrap().speed,
15        ));
16    }
17    for (e, t, speed) in v {
18        if let Some(target) = positions.get(t).map(|p| p.clone()) {
19            let p = positions.get_mut(e).unwrap();
20            // TODO improve when we have a Time struct
21            for _i in 0..(speed as usize) {
22                let delta_x = target.x - p.x;
23                let delta_y = target.y - p.y;
24                if delta_x.abs() >= delta_y.abs() {
25                    if delta_x > 0 {
26                        p.x += 1;
27                    } else if delta_x < 0 {
28                        p.x -= 1;
29                    }
30                } else {
31                    if delta_y > 0 {
32                        p.y += 1;
33                    } else if delta_y < 0 {
34                        p.y -= 1;
35                    }
36                }
37            }
38        }
39    }
40    Ok(())
41}