use std::fmt::Display; use ecs::{Query, World}; struct Health { health: u32, } enum AttackStrength { Strong, Weak, } struct EnemyName { name: String, } impl Display for EnemyName { fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { self.name.fmt(formatter) } } fn say_hello( mut query: Query<(AttackStrength,)>, mut enemy_query: Query<(Health, EnemyName)>, ) { for (attack_strength,) in query.iter_mut() { for (health, enemy_name) in enemy_query.iter_mut() { let damage = match attack_strength { AttackStrength::Strong => 20, AttackStrength::Weak => 10, }; if health.health <= damage { println!("Enemy '{enemy_name}' died"); health.health = 0; continue; } health.health -= damage; println!("Enemy '{enemy_name}' took {damage} damage"); } } } #[derive(Debug, PartialEq, Eq, Hash)] enum Event { Start, } fn main() { let mut world = World::::new(); world.register_system(Event::Start, say_hello); world.create_entity(( Health { health: 100 }, EnemyName { name: "Big spider".to_string() }, )); world.create_entity(( Health { health: 30 }, EnemyName { name: "Small goblin".to_string() }, )); world.create_entity(( Health { health: 30 }, EnemyName { name: "Headcrab".to_string() }, )); world.create_entity((AttackStrength::Strong,)); world.create_entity((AttackStrength::Weak,)); world.emit(&Event::Start); }