diff options
| -rw-r--r-- | engine-ecs/src/lib.rs | 3 | ||||
| -rw-r--r-- | engine-ecs/src/phase.rs | 37 |
2 files changed, 40 insertions, 0 deletions
diff --git a/engine-ecs/src/lib.rs b/engine-ecs/src/lib.rs index 6656440..f0e3e36 100644 --- a/engine-ecs/src/lib.rs +++ b/engine-ecs/src/lib.rs @@ -115,6 +115,9 @@ impl World crate::phase::spawn_standard_phases(&mut world); + #[cfg(debug_assertions)] + world.register_system(*INIT_PHASE, crate::phase::check_parents); + crate::error::set_panic_hook(); world diff --git a/engine-ecs/src/phase.rs b/engine-ecs/src/phase.rs index f789120..cccf978 100644 --- a/engine-ecs/src/phase.rs +++ b/engine-ecs/src/phase.rs @@ -1,3 +1,6 @@ +#[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)] @@ -32,3 +35,37 @@ pub(crate) fn spawn_standard_phases(world: &mut World) #[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)" + ); + } + } +} |
