use bevy::prelude::*;
use issun_core::mechanics::spatial::{OccupancyState, SpatialGraph};
use super::systems::{
handle_move_entity, handle_spatial_queries, log_spatial_events, OccupancyStateResource,
};
use super::types::{
MoveEntityRequest, SpatialGraphResource, SpatialLocation, SpatialQueryRequest,
SpatialQueryResult,
};
use crate::IssunSet;
pub struct SpatialPlugin {
graph: SpatialGraph,
}
impl SpatialPlugin {
pub fn with_graph(graph: SpatialGraph) -> Self {
Self { graph }
}
pub fn new() -> Self {
Self {
graph: SpatialGraph::new(),
}
}
}
impl Default for SpatialPlugin {
fn default() -> Self {
Self::new()
}
}
impl Plugin for SpatialPlugin {
fn build(&self, app: &mut App) {
app.register_type::<SpatialGraphResource>()
.register_type::<SpatialLocation>()
.register_type::<OccupancyStateResource>();
app.insert_resource(SpatialGraphResource::new(self.graph.clone()))
.insert_resource(OccupancyStateResource(OccupancyState::new()));
app.add_message::<SpatialQueryRequest>()
.add_message::<SpatialQueryResult>()
.add_message::<MoveEntityRequest>();
app.add_systems(
Update,
(
handle_spatial_queries,
handle_move_entity,
log_spatial_events,
)
.chain()
.in_set(IssunSet::Logic),
);
}
}