From 6677181a4e7789e2445ed203f6cc20b55f34a947 Mon Sep 17 00:00:00 2001 From: Llywelwyn Date: Thu, 17 Aug 2023 02:00:05 +0100 Subject: [PATCH] atomising item use: refactors BUC --- src/effects/hunger.rs | 16 ++++++++++++---- src/effects/mod.rs | 7 ++++--- src/effects/triggers.rs | 14 +++++++++++--- src/gamelog/builder.rs | 9 +++++++++ 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/effects/hunger.rs b/src/effects/hunger.rs index ed9b731..b274041 100644 --- a/src/effects/hunger.rs +++ b/src/effects/hunger.rs @@ -1,12 +1,20 @@ -use super::EffectSpawner; +use super::{ + triggers::{BLESSED, CURSED, UNCURSED}, + EffectSpawner, EffectType, +}; use crate::{HungerClock, HungerState}; use specs::prelude::*; const SATIATED_DURATION: i32 = 200; -pub fn restore_food(ecs: &mut World, _damage: &EffectSpawner, target: Entity) { +pub fn restore_food(ecs: &mut World, effect: &EffectSpawner, target: Entity) { + let buc = if let EffectType::RestoreNutrition { buc } = effect.effect_type { buc } else { UNCURSED }; if let Some(hc) = ecs.write_storage::().get_mut(target) { - hc.state = HungerState::Satiated; - hc.duration = SATIATED_DURATION; + if buc == BLESSED || buc == UNCURSED { + hc.state = HungerState::Satiated; + hc.duration = SATIATED_DURATION; + } else { + hc.duration = 0; + } } } diff --git a/src/effects/mod.rs b/src/effects/mod.rs index a564cf6..5659819 100644 --- a/src/effects/mod.rs +++ b/src/effects/mod.rs @@ -11,6 +11,7 @@ mod targeting; mod triggers; pub use targeting::aoe_tiles; +pub use triggers::{BLESSED, CURSED, UNCURSED}; lazy_static! { pub static ref EFFECT_QUEUE: Mutex> = Mutex::new(VecDeque::new()); @@ -22,7 +23,7 @@ pub enum EffectType { Particle { glyph: FontCharType, fg: RGB, bg: RGB, lifespan: f32, delay: f32 }, EntityDeath, ItemUse { item: Entity }, - RestoreNutrition, + RestoreNutrition { buc: i32 }, } #[derive(Clone)] @@ -94,7 +95,7 @@ fn affect_tile(ecs: &mut World, effect: &EffectSpawner, target: usize) { fn tile_effect_hits_entities(effect: &EffectType) -> bool { match effect { EffectType::Damage { .. } => true, - EffectType::RestoreNutrition => true, + EffectType::RestoreNutrition { .. } => true, _ => false, } } @@ -114,7 +115,7 @@ fn affect_entity(ecs: &mut World, effect: &EffectSpawner, target: Entity) { } } EffectType::EntityDeath => damage::entity_death(ecs, effect, target), - EffectType::RestoreNutrition => hunger::restore_food(ecs, effect, target), + EffectType::RestoreNutrition { .. } => hunger::restore_food(ecs, effect, target), _ => {} } } diff --git a/src/effects/triggers.rs b/src/effects/triggers.rs index de8faa1..17b1663 100644 --- a/src/effects/triggers.rs +++ b/src/effects/triggers.rs @@ -1,5 +1,5 @@ use super::{add_effect, EffectType, Entity, Targets, World}; -use crate::{gamelog, gui::item_colour_ecs, gui::obfuscate_name, Consumable, ProvidesNutrition}; +use crate::{gamelog, gui::item_colour_ecs, gui::obfuscate_name, Consumable, Cursed, ProvidesNutrition}; use specs::prelude::*; pub fn item_trigger(source: Option, item: Entity, target: &Targets, ecs: &mut World) { @@ -11,17 +11,25 @@ pub fn item_trigger(source: Option, item: Entity, target: &Targets, ecs: } } +pub const BLESSED: i32 = 2; +pub const UNCURSED: i32 = 1; +pub const CURSED: i32 = 0; + fn event_trigger(source: Option, entity: Entity, target: &Targets, ecs: &mut World) { let mut logger = gamelog::Logger::new(); let mut log = false; + // Check BUC -- + // TODO: Replace this with a system checking for blessed, uncursed, or cursed. + let buc = if ecs.read_storage::().get(entity).is_some() { CURSED } else { UNCURSED }; // Providing nutrition if ecs.read_storage::().get(entity).is_some() { - add_effect(source, EffectType::RestoreNutrition, target.clone()); + add_effect(source, EffectType::RestoreNutrition { buc }, target.clone()); logger = logger .append("You eat the") .append_n(obfuscate_name(ecs, entity).0) .colour(item_colour_ecs(ecs, entity)) - .period(); + .period() + .buc(buc, Some("Blech! Rotten."), Some("Delicious.")); log = true; } if log { diff --git a/src/gamelog/builder.rs b/src/gamelog/builder.rs index c80f545..723f23f 100644 --- a/src/gamelog/builder.rs +++ b/src/gamelog/builder.rs @@ -39,6 +39,15 @@ impl Logger { return self; } + pub fn buc(mut self, buc: i32, cursed: Option, blessed: Option) -> Self { + if buc == crate::effects::CURSED && cursed.is_some() { + self.fragments.push(LogFragment { colour: RGB::named(RED), text: cursed.unwrap().to_string() }); + } else if buc == crate::effects::BLESSED && blessed.is_some() { + self.fragments.push(LogFragment { colour: RGB::named(GOLD), text: blessed.unwrap().to_string() }); + } + return self; + } + /// Pushes the finished log entry. pub fn log(self) { return append_entry(self.fragments);