use ::specs::prelude::*; use super::{add_effect, EffectType, Targets}; use crate::components::{ Confusion, Consumable, Hidden, InflictsDamage, MagicMapper, Name, ProvidesFood, ProvidesHealing, SingleActivation, TeleportTo, TownPortal, }; use crate::{GameLog, Map, RunState}; pub fn item_trigger(creator: Option, item: Entity, targets: &Targets, ecs: &mut World) { // Use the item via the generic system event_trigger(creator, item, targets, ecs); // If it was a consumable, then it gets deleted if ecs.read_storage::().get(item).is_some() { ecs.entities() .delete(item) .expect("Failed to delete consumable item"); } } pub fn trigger(creator: Option, trigger: Entity, targets: &Targets, ecs: &mut World) { // The triggering item is no longer hidden ecs.write_storage::().remove(trigger); // Use the item via the generic system event_trigger(creator, trigger, targets, ecs); // If it was a single activation, then it gets deleted if ecs .read_storage::() .get(trigger) .is_some() { ecs.entities() .delete(trigger) .expect("Failed to delete SingleActivation tag"); } } fn event_trigger(creator: Option, entity: Entity, targets: &Targets, ecs: &mut World) { let mut gamelog = ecs.fetch_mut::(); // Providing food if ecs.read_storage::().get(entity).is_some() { add_effect(creator, EffectType::WellFed, targets.clone()); let names = ecs.read_storage::(); gamelog.append(format!("You eat the {}.", names.get(entity).unwrap().name)); } // Magic mapper if ecs.read_storage::().get(entity).is_some() { let mut runstate = ecs.fetch_mut::(); gamelog.append("The map is revealed to you!"); *runstate = RunState::MagicMapReveal { row: 0 }; } // Town Portal if ecs.read_storage::().get(entity).is_some() { let map = ecs.fetch::(); if map.depth == 1 { gamelog.append("You are already in town, so the scroll does nothing."); } else { gamelog.append("You are teleported back to town!"); let mut runstate = ecs.fetch_mut::(); *runstate = RunState::TownPortal; } } // Healing if let Some(heal) = ecs.read_storage::().get(entity) { add_effect( creator, EffectType::Healing { amount: heal.heal_amount, }, targets.clone(), ); } // Damage if let Some(damage) = ecs.read_storage::().get(entity) { add_effect( creator, EffectType::Damage { amount: damage.damage, }, targets.clone(), ); } // Confusion if let Some(confusion) = ecs.read_storage::().get(entity) { add_effect( creator, EffectType::Confusion { turns: confusion.turns, }, targets.clone(), ); } // Teleport if let Some(teleport) = ecs.read_storage::().get(entity) { add_effect( creator, EffectType::TeleportTo { x: teleport.x, y: teleport.y, depth: teleport.depth, player_only: teleport.player_only, }, targets.clone(), ); } }