generated from hheik/bevy-template
34 lines
1.1 KiB
Rust
34 lines
1.1 KiB
Rust
use bevy::prelude::*;
|
|
|
|
use crate::game::{
|
|
creature::{Mover, WeightSlowdown},
|
|
item::Inventory,
|
|
work::Worker,
|
|
};
|
|
|
|
pub fn worker_movement(
|
|
mut worker_query: Query<(Entity, &Mover, &Worker, &mut Transform)>,
|
|
slowdown_query: Query<(&Inventory, &WeightSlowdown)>,
|
|
global_query: Query<&GlobalTransform>,
|
|
time: Res<Time>,
|
|
) {
|
|
for (entity, mover, worker, mut transform) in worker_query.iter_mut() {
|
|
let Some(task) = worker.task.as_ref() else {
|
|
continue;
|
|
};
|
|
let (Ok(from), Ok(to)) = (global_query.get(entity), global_query.get(task.target)) else {
|
|
continue;
|
|
};
|
|
let diff = (to.translation() - from.translation()).xy();
|
|
let dist = diff.length().max(0.);
|
|
let dir = diff.normalize_or_zero();
|
|
let weight_mult = slowdown_query
|
|
.get(entity)
|
|
.map_or(1.0, |(inventory, slowdown)| {
|
|
slowdown.multiplier(inventory.weight())
|
|
});
|
|
let movement = dir.extend(0.) * mover.speed * weight_mult * time.delta_secs();
|
|
transform.translation += movement.clamp_length_max(dist);
|
|
}
|
|
}
|