Skip to content
Snippets Groups Projects
travel.rs 1.11 KiB
Newer Older
use std::ops::SubAssign;

use bevy::math::Vec3Swizzles;
use bevy::prelude::*;

use crate::world::encounters::EncounterState;
use crate::world::towns::{CurrentResidence, TravelPath, TravelTarget};
use crate::world::PathingResult;

pub fn tick_travelling_merchant(
	mut commands: Commands,
	time: Res<Time>,
	mut merchant_query: Query<(
		Entity,
		&mut Transform,
		&mut TravelPath,
		&mut TravelTarget,
		&mut CurrentResidence,
	)>,
	encounter_state: Res<EncounterState>,
	if encounter_state.is_in_encounter() {
		return;
	}

	let delta = time.delta_seconds();
	for (entity, mut transform, mut path, mut target, mut residence) in &mut merchant_query {
		let step = path.get_step(transform.translation.xy(), 16.0) * delta;
		transform.translation.sub_assign(step.extend(0.0));

		match path.check_position(transform.translation.xy()) {
			PathingResult::PathComplete => {
				commands
					.entity(entity)
					.remove::<(TravelPath, TravelTarget)>();
				*residence = CurrentResidence::RestingAt(target.0.clone());
			}
			PathingResult::NextNode => {
				path.increment_indexes();
			}
			PathingResult::Travelling => {}
		}
	}
}