use ecs::actions::Actions; use ecs::phase::{Phase, UPDATE as UPDATE_PHASE}; use ecs::relationship::{ChildOf, Relationship}; use ecs::{static_entity, Component, Query, World}; #[derive(Component)] struct Wool { remaining: u32, } #[derive(Component)] struct Health { health: u32, } #[derive(Component)] struct Name { name: &'static str, } fn sheer(query: Query<(Wool, Name)>) { for (mut wool, name) in &query { if wool.remaining == 0 { println!("{} Has no wool left", name.name); continue; } // Sheer the whool wool.remaining -= 5; println!("Sheered 5 wool from {}", name.name); } } fn feed(query: Query<(Health, Name)>) { for (mut health, name) in &query { health.health += 1; println!("Feeded {} which gained 1 health", name.name); } } fn age(query: Query<(Health, Name)>, mut actions: Actions) { for (mut health, name) in &query { if health.health <= 2 { health.health = 0; println!("{} passed away", name.name); actions.stop(); continue; } health.health -= 2; println!("{} aged and lost 2 health", name.name); } } static_entity!( SHEER_PHASE, (Phase, >::new(*UPDATE_PHASE)) ); static_entity!( FEED_PHASE, (Phase, >::new(*SHEER_PHASE)) ); static_entity!( AGE_PHASE, (Phase, >::new(*FEED_PHASE)) ); fn main() { let mut world = World::new(); world.register_system(*SHEER_PHASE, sheer); world.register_system(*FEED_PHASE, feed); world.register_system(*AGE_PHASE, age); world.create_entity(( Wool { remaining: 30 }, Health { health: 3 }, Name { name: "Bessy" }, )); world.start_loop(); }