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 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue