use std::fmt::Display; use ecs::event::{Event, Id as EventId}; use ecs::{Component, Query, World}; #[derive(Component)] struct Health { health: u32, } #[derive(Component)] enum AttackStrength { Strong, Weak, } #[derive(Component)] struct EnemyName { name: String, } impl Display for EnemyName { fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { self.name.fmt(formatter) } } fn do_attacks( attacker_query: Query<(AttackStrength,)>, enemy_query: Query<(Health, EnemyName)>, ) { for (attack_strength,) in &attacker_query { for (mut health, enemy_name) in &enemy_query { let damage = match *attack_strength { AttackStrength::Strong => 20, AttackStrength::Weak => 10, }; if health.health <= damage { println!("Enemy '{}' died", *enemy_name); health.health = 0; continue; } health.health -= damage; println!("Enemy '{}' took {damage} damage", *enemy_name); } } } #[derive(Debug, PartialEq, Eq, Hash)] struct Start; impl Event for Start { fn id(&self) -> EventId { EventId::of::() } } fn main() { let mut world = World::new(); world.register_system(&Start, do_attacks); 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(&Start); }