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 => {} } } }