did_something event triggers

This commit is contained in:
Llywelwyn 2023-08-21 16:58:38 +01:00
parent db9e04069a
commit 8c11951258

View file

@ -22,9 +22,9 @@ pub fn item_trigger(source: Option<Entity>, item: Entity, target: &Targets, ecs:
has_charges.uses -= 1; has_charges.uses -= 1;
} }
// Use the item via the generic system // Use the item via the generic system
event_trigger(source, item, target, ecs); let did_something = event_trigger(source, item, target, ecs);
// If it's a consumable, delete it // If it's a consumable, delete it
if ecs.read_storage::<Consumable>().get(item).is_some() { if did_something && ecs.read_storage::<Consumable>().get(item).is_some() {
ecs.entities().delete(item).expect("Failed to delete item"); ecs.entities().delete(item).expect("Failed to delete item");
} }
} }
@ -33,9 +33,9 @@ pub fn trigger(source: Option<Entity>, trigger: Entity, target: &Targets, ecs: &
// Remove hidden from the trigger // Remove hidden from the trigger
ecs.write_storage::<Hidden>().remove(trigger); ecs.write_storage::<Hidden>().remove(trigger);
// Use the trigger via the generic system // Use the trigger via the generic system
event_trigger(source, trigger, target, ecs); let did_something = event_trigger(source, trigger, target, ecs);
// If it was single-activation, delete it // If it was single-activation, delete it
if ecs.read_storage::<SingleActivation>().get(trigger).is_some() { if did_something && ecs.read_storage::<SingleActivation>().get(trigger).is_some() {
ecs.entities().delete(trigger).expect("Failed to delete entity with a SingleActivation"); ecs.entities().delete(trigger).expect("Failed to delete entity with a SingleActivation");
} }
} }
@ -52,30 +52,35 @@ struct EventInfo {
// It does almost no sanity-checking to make sure the logs only appear if the effect is taking // It does almost no sanity-checking to make sure the logs only appear if the effect is taking
// place on the player -- once monsters can use an item, their item usage will make logs for // place on the player -- once monsters can use an item, their item usage will make logs for
// the player saying they were the one who used the item. This will need refactoring then. // the player saying they were the one who used the item. This will need refactoring then.
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) -> bool {
let buc = if let Some(beatitude) = ecs.read_storage::<Beatitude>().get(entity) { let buc = if let Some(beatitude) = ecs.read_storage::<Beatitude>().get(entity) {
beatitude.buc.clone() beatitude.buc.clone()
} else { } else {
BUC::Uncursed BUC::Uncursed
}; };
let mut event = EventInfo { source, entity, target: target.clone(), buc, log: false }; let mut event = EventInfo { source, entity, target: target.clone(), buc, log: false };
let mut logger = gamelog::Logger::new(); let logger = gamelog::Logger::new();
// PROVIDES NUTRITION
logger = handle_restore_nutrition(ecs, &mut event, logger); let mut did_something = false;
// MAGIC MAPPER let (logger, restored_nutrition) = handle_restore_nutrition(ecs, &mut event, logger);
logger = handle_magic_mapper(ecs, &mut event, logger); let (logger, magic_mapped) = handle_magic_mapper(ecs, &mut event, logger);
// DOES HEALING let (logger, healed) = handle_healing(ecs, &mut event, logger);
logger = handle_healing(ecs, &mut event, logger); let (logger, damaged) = handle_damage(ecs, &mut event, logger);
// DOES DAMAGE let (logger, confused) = handle_confusion(ecs, &mut event, logger);
logger = handle_damage(ecs, &mut event, logger); did_something |= restored_nutrition || magic_mapped || healed || damaged || confused;
// APPLIES CONFUSION
logger = handle_confusion(ecs, &mut event, logger);
if event.log { if event.log {
logger.log(); logger.log();
} }
return did_something;
} }
fn handle_restore_nutrition(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> gamelog::Logger { fn handle_restore_nutrition(
ecs: &mut World,
event: &mut EventInfo,
mut logger: gamelog::Logger,
) -> (gamelog::Logger, bool) {
if ecs.read_storage::<ProvidesNutrition>().get(event.entity).is_some() { if ecs.read_storage::<ProvidesNutrition>().get(event.entity).is_some() {
let amount = match event.buc { let amount = match event.buc {
BUC::Blessed => 600, BUC::Blessed => 600,
@ -91,11 +96,12 @@ fn handle_restore_nutrition(ecs: &mut World, event: &mut EventInfo, mut logger:
.period() .period()
.buc(event.buc.clone(), Some("Blech! Rotten"), Some("Delicious")); .buc(event.buc.clone(), Some("Blech! Rotten"), Some("Delicious"));
event.log = true; event.log = true;
return (logger, true);
} }
return logger; return (logger, false);
} }
fn handle_magic_mapper(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> gamelog::Logger { fn handle_magic_mapper(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> (gamelog::Logger, bool) {
if ecs.read_storage::<MagicMapper>().get(event.entity).is_some() { if ecs.read_storage::<MagicMapper>().get(event.entity).is_some() {
let mut runstate = ecs.fetch_mut::<RunState>(); let mut runstate = ecs.fetch_mut::<RunState>();
let cursed = if event.buc == BUC::Cursed { true } else { false }; let cursed = if event.buc == BUC::Cursed { true } else { false };
@ -106,11 +112,12 @@ fn handle_magic_mapper(ecs: &mut World, event: &mut EventInfo, mut logger: gamel
None, None,
); );
event.log = true; event.log = true;
return (logger, true);
} }
return logger; return (logger, false);
} }
fn handle_healing(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> gamelog::Logger { fn handle_healing(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> (gamelog::Logger, bool) {
if let Some(healing_item) = ecs.read_storage::<ProvidesHealing>().get(event.entity) { if let Some(healing_item) = ecs.read_storage::<ProvidesHealing>().get(event.entity) {
let mut rng = ecs.write_resource::<RandomNumberGenerator>(); let mut rng = ecs.write_resource::<RandomNumberGenerator>();
let buc_mod = match event.buc { let buc_mod = match event.buc {
@ -146,11 +153,12 @@ fn handle_healing(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::L
} }
event.log = true; event.log = true;
} }
return (logger, true);
} }
return logger; return (logger, false);
} }
fn handle_damage(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> gamelog::Logger { fn handle_damage(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> (gamelog::Logger, bool) {
if let Some(damage_item) = ecs.read_storage::<InflictsDamage>().get(event.entity) { if let Some(damage_item) = ecs.read_storage::<InflictsDamage>().get(event.entity) {
let mut rng = ecs.write_resource::<RandomNumberGenerator>(); let mut rng = ecs.write_resource::<RandomNumberGenerator>();
let roll = rng.roll_dice(damage_item.n_dice, damage_item.sides) + damage_item.modifier; let roll = rng.roll_dice(damage_item.n_dice, damage_item.sides) + damage_item.modifier;
@ -185,16 +193,18 @@ fn handle_damage(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Lo
} }
event.log = true; event.log = true;
} }
return (logger, true);
} }
return logger; return (logger, false);
} }
#[allow(unused_mut)] #[allow(unused_mut)]
fn handle_confusion(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> gamelog::Logger { fn handle_confusion(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> (gamelog::Logger, bool) {
if let Some(confusion) = ecs.read_storage::<Confusion>().get(event.entity) { if let Some(confusion) = ecs.read_storage::<Confusion>().get(event.entity) {
add_effect(event.source, EffectType::Confusion { turns: confusion.turns }, event.target.clone()); add_effect(event.source, EffectType::Confusion { turns: confusion.turns }, event.target.clone());
return (logger, true);
} }
return logger; return (logger, false);
} }
fn get_entity_targets(target: &Targets) -> Vec<Entity> { fn get_entity_targets(target: &Targets) -> Vec<Entity> {