use bevy::prelude::*; use shared::{resources::TileUnderCursor, sets::GameplaySet, states::AssetLoadState}; use crate::components::{LandUnit, Path, Target, Unit}; pub struct UnitsDebugPlugin; impl Plugin for UnitsDebugPlugin { fn build(&self, app: &mut App) { app.add_systems(Update, init.run_if(in_state(AssetLoadState::Loading))); app.add_systems(Update, (spawn_test_unit, set_unit_target).in_set(GameplaySet)); app.add_systems(FixedUpdate, (visualize_paths).in_set(GameplaySet)); } } #[derive(Resource)] struct TestUnit(pub Handle); fn init(mut meshes: ResMut>, mut commands: Commands) { let mesh_handle = meshes.add(Cuboid::from_length(1.0)); commands.insert_resource(TestUnit(mesh_handle)); } fn spawn_test_unit( mut commands: Commands, input: Res>, tile_under_cursor: Res, unit: Res, ) { if !input.just_pressed(KeyCode::KeyT) { return; } if let Some(contact) = tile_under_cursor.0 { info!("Spawning Test Unit"); commands.spawn(( PbrBundle { transform: Transform::from_translation(contact.surface), mesh: unit.0.clone(), ..default() }, Unit, LandUnit, )); } } fn set_unit_target( mut commands: Commands, units: Query>, input: Res>, tile_under_cursor: Res, ) { if !input.just_pressed(MouseButton::Right) { return; } if let Some(contact) = tile_under_cursor.0 { for e in units.iter() { info!("Setting Target"); let mut e = commands.entity(e); e.insert(Target(contact.tile)); } } } fn visualize_paths(units: Query<&Path, With>, mut gizmos: Gizmos) { for path in units.iter() { if path.1 > path.0.len() { continue; } for node in 1..path.0.len() { let from = path.0[node]; let to = path.0[node - 1]; let color = if node > path.1 { LinearRgba::rgb(1.0, 0.5, 0.0) } else { LinearRgba::rgb(1.0, 0.5, 1.5) }; gizmos.line(from + Vec3::Y * 0.1, to + Vec3::Y * 0.1, color); } } }