more framework for spells

This commit is contained in:
Llywelwyn 2023-08-23 18:17:04 +01:00
parent 76c74df028
commit 02a4f33d11
8 changed files with 95 additions and 36 deletions

View file

@ -29,6 +29,9 @@ use crate::{
RunState,
SingleActivation,
BUC,
GrantsSpell,
KnownSpell,
KnownSpells,
};
use crate::config::messages::*;
use rltk::prelude::*;
@ -93,13 +96,22 @@ fn event_trigger(source: Option<Entity>, entity: Entity, target: &Targets, ecs:
particles::handle_line_particles(ecs, entity, &target);
let (logger, restored_nutrition) = handle_restore_nutrition(ecs, &mut event, logger);
let (logger, magic_mapped) = handle_magic_mapper(ecs, &mut event, logger);
let (logger, granted_spell) = handle_grant_spell(ecs, &mut event, logger);
let (logger, removed_curse) = handle_remove_curse(ecs, &mut event, logger);
let (logger, identified) = handle_identify(ecs, &mut event, logger);
let (logger, healed) = handle_healing(ecs, &mut event, logger);
let (logger, damaged) = handle_damage(ecs, &mut event, logger);
let (logger, confused) = handle_confusion(ecs, &mut event, logger);
//let (logger, dug) = handle_dig(ecs, &mut event, logger); -- NYI i.e. Wand of Digging
did_something |= restored_nutrition || magic_mapped || healed || damaged || confused || removed_curse || identified;
did_something |=
restored_nutrition ||
magic_mapped ||
granted_spell ||
healed ||
damaged ||
confused ||
removed_curse ||
identified;
if event.log {
logger.log();
@ -145,6 +157,17 @@ fn handle_magic_mapper(ecs: &mut World, event: &mut EventInfo, mut logger: gamel
return (logger, false);
}
fn handle_grant_spell(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::Logger) -> (gamelog::Logger, bool) {
if let Some(granted_spell) = ecs.read_storage::<GrantsSpell>().get(event.entity) {
if let Some(known_spells) = ecs.write_storage::<KnownSpells>().get_mut(event.source.unwrap()) {
// TODO: Check if the player knows *this* spell, and add it if not.
} else {
// TODO: Grant the KnownSpells component, and then add the spell.
}
}
return (logger, false);
}
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) {
let mut rng = ecs.write_resource::<RandomNumberGenerator>();
@ -255,21 +278,23 @@ fn handle_identify(ecs: &mut World, event: &mut EventInfo, mut logger: gamelog::
}
let mut to_identify: Vec<(Entity, String)> = Vec::new();
let mut beatitudes = ecs.write_storage::<Beatitude>();
for (e, _i, _bp, _o, name) in (
let obfuscated = ecs.read_storage::<ObfuscatedName>();
for (e, _i, _bp, name) in (
&ecs.entities(),
&ecs.read_storage::<Item>(),
&ecs.read_storage::<InBackpack>(),
&ecs.read_storage::<ObfuscatedName>(),
&ecs.read_storage::<Name>(),
)
.join()
.filter(|(_e, _i, bp, _o, name)| {
bp.owner == event.source.unwrap() &&
(!dm.identified_items.contains(&name.name.clone()) ||
!beatitudes
.get(event.source.unwrap())
.map(|beatitude| beatitude.known)
.unwrap_or(true))
.filter(|(e, _i, bp, name)| {
let in_this_backpack = bp.owner == event.source.unwrap();
let has_obfuscated_name = obfuscated.get(*e).is_some();
let already_identified = dm.identified_items.contains(&name.name.clone());
let known_beatitude = beatitudes
.get(event.source.unwrap())
.map(|b| b.known)
.unwrap_or(true);
return in_this_backpack && (has_obfuscated_name || !already_identified || !known_beatitude);
}) {
to_identify.push((e, name.name.clone()));
}