diff options
Diffstat (limited to 'engine-ecs/src/phase.rs')
| -rw-r--r-- | engine-ecs/src/phase.rs | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/engine-ecs/src/phase.rs b/engine-ecs/src/phase.rs new file mode 100644 index 0000000..cccf978 --- /dev/null +++ b/engine-ecs/src/phase.rs @@ -0,0 +1,71 @@ +#[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<ChildOf, Wildcard>, Option<&EntityName>), (With<Phase>,)>) +{ + 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("<unnamed>"), + "Parent entity of phase entity does not exist" + ); + continue; + }; + + if !parent_ent.has_component(Phase::id()) { + let parent_ent_name = parent_ent.get::<EntityName>(); + + tracing::warn!( + phase_entity=ent_name + .as_ref() + .map(|ent_name| ent_name.name.as_ref()) + .unwrap_or("<unnamed>"), + parent_entity=parent_ent_name + .as_ref() + .map(|parent_ent_name| parent_ent_name.name.as_ref()) + .unwrap_or("<unnamed>"), + "Parent entity of phase entity is not a phase (missing Phase component)" + ); + } + } +} |
