From c490ab114b0a4270d5b9852f88dd0b361bcc5f97 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Thu, 18 Nov 2021 10:28:49 -0500 Subject: [PATCH] Implement the hunger system --- src/hunger_system.rs | 82 ++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 4 +++ 2 files changed, 86 insertions(+) create mode 100644 src/hunger_system.rs diff --git a/src/hunger_system.rs b/src/hunger_system.rs new file mode 100644 index 0000000..981ac5d --- /dev/null +++ b/src/hunger_system.rs @@ -0,0 +1,82 @@ +use crate::components::{HungerClock, HungerState, SufferDamage}; +use crate::{game_log::GameLog, RunState}; +use specs::prelude::*; + +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 + ReadExpect<'a, RunState>, + WriteStorage<'a, SufferDamage>, + WriteExpect<'a, GameLog>, + ); + + fn run(&mut self, data: Self::SystemData) { + let (entities, mut hunger_clock, player_entity, runstate, mut inflict_damage, mut log) = + data; + + for (entity, mut clock) in (&entities, &mut hunger_clock).join() { + let mut proceed = false; + + match *runstate { + RunState::PlayerTurn => { + if entity == *player_entity { + proceed = true; + } + } + RunState::MonsterTurn => { + if entity != *player_entity { + proceed = true; + } + } + _ => proceed = false, + } + + if proceed { + clock.duration -= 1; + + if clock.duration < 1 { + match clock.state { + HungerState::WellFed => { + clock.state = HungerState::Normal; + clock.duration = 200; + + if entity == *player_entity { + log.entries.push("You are no longer well fed.".to_string()); + } + } + HungerState::Normal => { + clock.state = HungerState::Hungry; + clock.duration = 200; + + if entity == *player_entity { + log.entries.push("You are hungry.".to_string()); + } + } + HungerState::Hungry => { + clock.state = HungerState::Starving; + clock.duration = 200; + + if entity == *player_entity { + log.entries.push("You are starving!".to_string()); + } + } + HungerState::Starving => { + // Inflict damage from hunger + if entity == *player_entity { + log.entries + .push("Your hunger pangs are getting painful!".to_string()); + } + + SufferDamage::new_damage(&mut inflict_damage, entity, 1); + } + } + } + } + } + } +} diff --git a/src/main.rs b/src/main.rs index 96103d6..510bbe3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ mod components; mod damage_system; mod game_log; mod gui; +mod hunger_system; mod inventory_system; mod map; mod map_indexing_system; @@ -101,6 +102,9 @@ impl State { let mut item_remove = ItemRemoveSystem {}; item_remove.run_now(&self.ecs); + let mut hunger = hunger_system::HungerSystem {}; + hunger.run_now(&self.ecs); + let mut particles = particle_system::ParticleSpawnSystem {}; particles.run_now(&self.ecs);