Implement the hunger system

This commit is contained in:
Timothy Warren 2021-11-18 10:28:49 -05:00
parent 15a0f1779c
commit c490ab114b
2 changed files with 86 additions and 0 deletions

82
src/hunger_system.rs Normal file
View File

@ -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);
}
}
}
}
}
}
}

View File

@ -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);