atomising item use: refactors BUC

This commit is contained in:
Llywelwyn 2023-08-17 02:00:05 +01:00
parent a00b7ae805
commit 6677181a4e
4 changed files with 36 additions and 10 deletions

View file

@ -1,12 +1,20 @@
use super::EffectSpawner; use super::{
triggers::{BLESSED, CURSED, UNCURSED},
EffectSpawner, EffectType,
};
use crate::{HungerClock, HungerState}; use crate::{HungerClock, HungerState};
use specs::prelude::*; use specs::prelude::*;
const SATIATED_DURATION: i32 = 200; 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::<HungerClock>().get_mut(target) { if let Some(hc) = ecs.write_storage::<HungerClock>().get_mut(target) {
hc.state = HungerState::Satiated; if buc == BLESSED || buc == UNCURSED {
hc.duration = SATIATED_DURATION; hc.state = HungerState::Satiated;
hc.duration = SATIATED_DURATION;
} else {
hc.duration = 0;
}
} }
} }

View file

@ -11,6 +11,7 @@ mod targeting;
mod triggers; mod triggers;
pub use targeting::aoe_tiles; pub use targeting::aoe_tiles;
pub use triggers::{BLESSED, CURSED, UNCURSED};
lazy_static! { lazy_static! {
pub static ref EFFECT_QUEUE: Mutex<VecDeque<EffectSpawner>> = Mutex::new(VecDeque::new()); pub static ref EFFECT_QUEUE: Mutex<VecDeque<EffectSpawner>> = Mutex::new(VecDeque::new());
@ -22,7 +23,7 @@ pub enum EffectType {
Particle { glyph: FontCharType, fg: RGB, bg: RGB, lifespan: f32, delay: f32 }, Particle { glyph: FontCharType, fg: RGB, bg: RGB, lifespan: f32, delay: f32 },
EntityDeath, EntityDeath,
ItemUse { item: Entity }, ItemUse { item: Entity },
RestoreNutrition, RestoreNutrition { buc: i32 },
} }
#[derive(Clone)] #[derive(Clone)]
@ -94,7 +95,7 @@ fn affect_tile(ecs: &mut World, effect: &EffectSpawner, target: usize) {
fn tile_effect_hits_entities(effect: &EffectType) -> bool { fn tile_effect_hits_entities(effect: &EffectType) -> bool {
match effect { match effect {
EffectType::Damage { .. } => true, EffectType::Damage { .. } => true,
EffectType::RestoreNutrition => true, EffectType::RestoreNutrition { .. } => true,
_ => false, _ => false,
} }
} }
@ -114,7 +115,7 @@ fn affect_entity(ecs: &mut World, effect: &EffectSpawner, target: Entity) {
} }
} }
EffectType::EntityDeath => damage::entity_death(ecs, effect, target), EffectType::EntityDeath => damage::entity_death(ecs, effect, target),
EffectType::RestoreNutrition => hunger::restore_food(ecs, effect, target), EffectType::RestoreNutrition { .. } => hunger::restore_food(ecs, effect, target),
_ => {} _ => {}
} }
} }

View file

@ -1,5 +1,5 @@
use super::{add_effect, EffectType, Entity, Targets, World}; 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::*; use specs::prelude::*;
pub fn item_trigger(source: Option<Entity>, item: Entity, target: &Targets, ecs: &mut World) { pub fn item_trigger(source: Option<Entity>, item: Entity, target: &Targets, ecs: &mut World) {
@ -11,17 +11,25 @@ pub fn item_trigger(source: Option<Entity>, 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: Entity, target: &Targets, ecs: &mut World) { fn event_trigger(source: Option<Entity>, entity: Entity, target: &Targets, ecs: &mut World) {
let mut logger = gamelog::Logger::new(); let mut logger = gamelog::Logger::new();
let mut log = false; let mut log = false;
// Check BUC --
// TODO: Replace this with a system checking for blessed, uncursed, or cursed.
let buc = if ecs.read_storage::<Cursed>().get(entity).is_some() { CURSED } else { UNCURSED };
// Providing nutrition // Providing nutrition
if ecs.read_storage::<ProvidesNutrition>().get(entity).is_some() { if ecs.read_storage::<ProvidesNutrition>().get(entity).is_some() {
add_effect(source, EffectType::RestoreNutrition, target.clone()); add_effect(source, EffectType::RestoreNutrition { buc }, target.clone());
logger = logger logger = logger
.append("You eat the") .append("You eat the")
.append_n(obfuscate_name(ecs, entity).0) .append_n(obfuscate_name(ecs, entity).0)
.colour(item_colour_ecs(ecs, entity)) .colour(item_colour_ecs(ecs, entity))
.period(); .period()
.buc(buc, Some("Blech! Rotten."), Some("Delicious."));
log = true; log = true;
} }
if log { if log {

View file

@ -39,6 +39,15 @@ impl Logger {
return self; return self;
} }
pub fn buc<T: ToString>(mut self, buc: i32, cursed: Option<T>, blessed: Option<T>) -> 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. /// Pushes the finished log entry.
pub fn log(self) { pub fn log(self) {
return append_entry(self.fragments); return append_entry(self.fragments);