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: crate::query::Query<( crate::pair::Pair, Option<&crate::entity::Name>, crate::query::term::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)" ); } } }