atomising item use: refactors BUC
This commit is contained in:
parent
a00b7ae805
commit
6677181a4e
4 changed files with 36 additions and 10 deletions
|
|
@ -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::<HungerClock>().get_mut(target) {
|
||||
if buc == BLESSED || buc == UNCURSED {
|
||||
hc.state = HungerState::Satiated;
|
||||
hc.duration = SATIATED_DURATION;
|
||||
} else {
|
||||
hc.duration = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<VecDeque<EffectSpawner>> = 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),
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<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) {
|
||||
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::<Cursed>().get(entity).is_some() { CURSED } else { UNCURSED };
|
||||
// Providing nutrition
|
||||
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
|
||||
.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 {
|
||||
|
|
|
|||
|
|
@ -39,6 +39,15 @@ impl Logger {
|
|||
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.
|
||||
pub fn log(self) {
|
||||
return append_entry(self.fragments);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue