#[cfg(debug_assertions)] use crate::entity::Name as EntityName; use crate::{Query, pair::{ChildOf, Pair, Wildcard}, query::term::With}; use crate::{declare_entity, Component, World}; #[derive(Debug, Default, Clone, Copy, Component)] pub struct Phase; declare_entity! { /// Initialization phase that only occurs the first tick, before [`START`]. /// Should not be used for game logic pub INIT: (Phase,); /// Phase that only occurs the first tick, after [`INIT`]. pub START: (Phase,); /// Phase that occurs every tick, before [`UPDATE`]. pub PRE_UPDATE: (Phase,); /// Phase that occurs every tick, after [`PRE_UPDATE`]. pub UPDATE: (Phase,); /// Phase that occurs every tick, after [`UPDATE`]. pub POST_UPDATE: (Phase,); } pub(crate) fn spawn_standard_phases(world: &mut World) { world.spawn_declared_entity(&INIT); world.spawn_declared_entity(&START); world.spawn_declared_entity(&PRE_UPDATE); world.spawn_declared_entity(&UPDATE); world.spawn_declared_entity(&POST_UPDATE); } #[derive(Debug, Component)] pub(crate) struct HasSystem; #[cfg(debug_assertions)] pub(crate) fn check_parents(phase_query: Query<(Pair, Option<&EntityName>), (With,)>) { for (child_of, ent_name) in &phase_query { let Some(parent_ent) = child_of.get_target_ent() else { tracing::warn!( phase_entity=ent_name .as_ref() .map(|ent_name| ent_name.name.as_ref()) .unwrap_or(""), "Parent entity of phase entity does not exist" ); continue; }; if !parent_ent.has_component(Phase::id()) { let parent_ent_name = parent_ent.get::(); tracing::warn!( phase_entity=ent_name .as_ref() .map(|ent_name| ent_name.name.as_ref()) .unwrap_or(""), parent_entity=parent_ent_name .as_ref() .map(|parent_ent_name| parent_ent_name.name.as_ref()) .unwrap_or(""), "Parent entity of phase entity is not a phase (missing Phase component)" ); } } }