From 18eae23a4cf545fcf4af2541d229fe856967cd2a Mon Sep 17 00:00:00 2001 From: Llywelwyn Date: Thu, 17 Aug 2023 00:43:26 +0100 Subject: [PATCH] atomising item use: placeholder Item triggers --- src/effects/mod.rs | 9 +++++++++ src/effects/triggers.rs | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/effects/triggers.rs diff --git a/src/effects/mod.rs b/src/effects/mod.rs index 88f5f7f..40ff625 100644 --- a/src/effects/mod.rs +++ b/src/effects/mod.rs @@ -7,6 +7,7 @@ use std::sync::Mutex; mod damage; mod particles; mod targeting; +mod triggers; lazy_static! { pub static ref EFFECT_QUEUE: Mutex> = Mutex::new(VecDeque::new()); @@ -17,6 +18,7 @@ pub enum EffectType { Bloodstain, Particle { glyph: FontCharType, fg: RGB, bg: RGB, lifespan: f32, delay: f32 }, EntityDeath, + ItemUse { item: Entity }, } #[derive(Clone)] @@ -53,6 +55,13 @@ pub fn run_effects_queue(ecs: &mut World) { /// Applies an effect to the correct target(s). fn target_applicator(ecs: &mut World, effect: &EffectSpawner) { + // Item use is handled differently - it creates other effects with itself + // as the source, passing all effects attached to the item into the queue. + if let EffectType::ItemUse { item } = effect.effect_type { + triggers::item_trigger(effect.source, item, &effect.target, ecs); + return; + } + // Otherwise, just match the effect and enact it directly. match &effect.target { Targets::Tile { target } => affect_tile(ecs, effect, *target), Targets::TileList { targets } => targets.iter().for_each(|target| affect_tile(ecs, effect, *target)), diff --git a/src/effects/triggers.rs b/src/effects/triggers.rs new file mode 100644 index 0000000..22242c6 --- /dev/null +++ b/src/effects/triggers.rs @@ -0,0 +1,16 @@ +use super::{Entity, Targets, World}; +use crate::{gamelog, Consumable}; +use specs::prelude::*; + +pub fn item_trigger(source: Option, item: Entity, target: &Targets, ecs: &mut World) { + // Use the item via the generic system + event_trigger(source, item, target, ecs); + // If it's a consumable, delete it + if ecs.read_storage::().get(item).is_some() { + ecs.entities().delete(item).expect("Failed to delete item"); + } +} + +fn event_trigger(source: Option, entity: Entity, target: &Targets, ecs: &mut World) { + let logger = gamelog::Logger::new(); +}