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

use bevy::math::Vec3Swizzles;
use bevy::prelude::*;
use serde::{Deserialize, Serialize};
use crate::persistance::SaveFileEvent;
use crate::world::encounters::EncounterState;
use crate::world::towns::{CurrentResidence, TravelPath, TravelTarget};
use crate::world::PathingResult;

#[derive(Component, Serialize, Deserialize, Debug, Copy, Clone, Default)]
pub struct DistanceTravelled(pub f32);

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

	let delta = time.delta_seconds();
	for (entity, mut transform, mut path, mut target, mut residence, mut high_score) in
		&mut merchant_query
	{
		let step = path.get_step(transform.translation.xy(), 16.0) * delta;
		high_score.0 += step.length();
		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());
				autosave.send(SaveFileEvent::autosave());
			}
			PathingResult::NextNode => {
				path.increment_indexes();
			}
			PathingResult::TravelTo(new_point) => {
				transform.translation = new_point.extend(transform.translation.z);
			}
			PathingResult::Travelling => {}
		}
	}
}