glorbs/src/game/systems/creature.rs

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);
}
}