use ::specs::prelude::*; use crate::colors; use crate::components::{HungerClock, HungerState, MyTurn}; use crate::effects::{add_effect, EffectType, Targets}; use crate::gamelog::log_color_line; pub struct HungerSystem {} impl<'a> System<'a> for HungerSystem { #[allow(clippy::type_complexity)] type SystemData = ( Entities<'a>, WriteStorage<'a, HungerClock>, ReadExpect<'a, Entity>, // The player ReadStorage<'a, MyTurn>, ); fn run(&mut self, data: Self::SystemData) { let (entities, mut hunger_clock, player_entity, turns) = data; for (entity, mut clock, _myturn) in (&entities, &mut hunger_clock, &turns).join() { clock.duration -= 1; if clock.duration < 1 { match clock.state { HungerState::WellFed => { clock.state = HungerState::Normal; clock.duration = 200; if entity == *player_entity { log_color_line(colors::ORANGE, "You are no longer well fed"); } } HungerState::Normal => { clock.state = HungerState::Hungry; clock.duration = 200; if entity == *player_entity { log_color_line(colors::ORANGE, "You are hungry."); } } HungerState::Hungry => { clock.state = HungerState::Starving; clock.duration = 200; if entity == *player_entity { log_color_line(colors::RED, "You are starving!"); } } HungerState::Starving => { // Inflict damage from hunger if entity == *player_entity { log_color_line(colors::RED, "Your hunger pangs are getting painful!"); } add_effect( None, EffectType::Damage { amount: 1 }, Targets::Single { target: entity }, ); } } } } } }