use std::collections::HashMap; use bevy::{ecs::world::CommandQueue, prelude::*, tasks::AsyncComputeTaskPool, utils::futures}; use pathfinding::prelude::astar; use shared::{events::TileModifiedEvent, resources::TileUnderCursor, sets::GameplaySet}; use world_generation::{hex_utils::HexCoord, prelude::Map, states::GeneratorState}; #[cfg(debug_assertions)] use crate::units_debug_plugin::UnitsDebugPlugin; use crate::{ assets::unit_asset::UnitAssetPlugin, components::{Path, PathTask, PathTaskPending, Target, Unit}, nav_data::NavData, resources::PathBatchId, }; pub struct UnitsPlugin; impl Plugin for UnitsPlugin { fn build(&self, app: &mut App) { app.init_resource::(); app.add_plugins(UnitAssetPlugin); #[cfg(debug_assertions)] app.add_plugins(UnitsDebugPlugin); // app.configure_loading_state(LoadingStateConfig::new(AssetLoadState::Loading).load_collection::()); app.add_systems(PostUpdate, build_navdata.run_if(in_state(GeneratorState::SpawnMap))); app.add_systems(Update, units_control.in_set(GameplaySet)); app.add_systems(Update, (move_unit, update_navdata).in_set(GameplaySet)); app.add_systems( FixedPreUpdate, (dispatch_path_requests, resolve_path_task).in_set(GameplaySet), ); } } fn build_navdata(mut commands: Commands, map: Res) { let nav_data = NavData::build(&map); commands.insert_resource(nav_data); } fn update_navdata(mut tile_updates: EventReader, mut nav_data: ResMut) { for event in tile_updates.read() { match event { TileModifiedEvent::HeightChanged(coord, new_height) => { nav_data.update_tile(coord, *new_height, 1.0); } _ => (), } } } fn units_control(tile_under_cursor: Res) {} fn move_unit( mut units: Query<(&mut Transform, &mut Path, Entity), With>, time: Res