use ecs::actions::Actions; use ecs::event::Event; use ecs::{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); } } #[derive(Debug)] struct EventA; impl Event for EventA {} #[derive(Debug)] struct EventB; impl Event for EventB {} #[derive(Debug)] struct EventC; impl Event for EventC {} fn main() { let mut world = World::new(); world.register_system(EventA, sheer); world.register_system(EventB, feed); world.register_system(EventC, age); world.create_entity(( Wool { remaining: 30 }, Health { health: 3 }, Name { name: "Bessy" }, )); world.event_loop::<(EventA, EventB, EventC)>(); }