From 46bbe14beac85b515422a6d0812bb6987e5f94f6 Mon Sep 17 00:00:00 2001 From: Llywelwyn Date: Mon, 2 Oct 2023 23:02:46 +0100 Subject: [PATCH] added effects for adding intrinsics --- src/effects/intrinsics.rs | 11 +++++ src/effects/mod.rs | 8 +++- src/macros/mod.rs | 95 +++++++++++++++++++++++++++++---------- 3 files changed, 90 insertions(+), 24 deletions(-) create mode 100644 src/effects/intrinsics.rs diff --git a/src/effects/intrinsics.rs b/src/effects/intrinsics.rs new file mode 100644 index 0000000..01776e1 --- /dev/null +++ b/src/effects/intrinsics.rs @@ -0,0 +1,11 @@ +use super::{ EffectSpawner, EffectType }; +use specs::prelude::*; + +pub fn add_intrinsic(ecs: &mut World, effect: &EffectSpawner, target: Entity) { + let intrinsic = if let EffectType::AddIntrinsic { intrinsic } = &effect.effect_type { + intrinsic + } else { + unreachable!("add_intrinsic() called with the wrong EffectType") + }; + add_intr!(ecs, target, *intrinsic); +} diff --git a/src/effects/mod.rs b/src/effects/mod.rs index c23b52b..5552f5a 100644 --- a/src/effects/mod.rs +++ b/src/effects/mod.rs @@ -4,13 +4,14 @@ use bracket_lib::prelude::*; use specs::prelude::*; use std::collections::VecDeque; use std::sync::Mutex; -use crate::components::DamageType; +use crate::components::*; mod damage; mod hunger; mod particles; mod targeting; mod triggers; +mod intrinsics; pub use targeting::aoe_tiles; @@ -51,6 +52,9 @@ pub enum EffectType { ModifyNutrition { amount: i32, }, + AddIntrinsic { + intrinsic: Intrinsic, + }, TriggerFire { trigger: Entity, }, @@ -153,6 +157,7 @@ fn tile_effect_hits_entities(effect: &EffectType) -> bool { EffectType::Healing { .. } => true, EffectType::ModifyNutrition { .. } => true, EffectType::Confusion { .. } => true, + EffectType::AddIntrinsic { .. } => true, _ => false, } } @@ -175,6 +180,7 @@ fn affect_entity(ecs: &mut World, effect: &EffectSpawner, target: Entity) { } EffectType::EntityDeath => damage::entity_death(ecs, effect, target), EffectType::ModifyNutrition { .. } => hunger::modify_nutrition(ecs, effect, target), + EffectType::AddIntrinsic { .. } => intrinsics::add_intrinsic(ecs, effect, target), _ => {} } } diff --git a/src/macros/mod.rs b/src/macros/mod.rs index 6d965c4..a064f44 100644 --- a/src/macros/mod.rs +++ b/src/macros/mod.rs @@ -1,7 +1,8 @@ // macros/mod.rs #[macro_export] -macro_rules! player { +/// Used to check if the player has a given component. +macro_rules! player_has_component { ($ecs:expr, $component:ty) => { { let player = $ecs.fetch::(); @@ -16,29 +17,77 @@ macro_rules! player { } #[macro_export] -macro_rules! add_intr { - ($ecs:expr, $intrinsic:expr) => { - let player = $ecs.fetch::(); - let mut intrinsics = $ecs.write_storage::(); - if let Some(player_intrinsics) = intrinsics.get_mut(*player) { - if !player_intrinsics.list.contains(&$intrinsic) { - player_intrinsics.list.insert($intrinsic); - let mut intrinsic_changed = $ecs.write_storage::(); - if let Some(this_intrinsic_changed) = intrinsic_changed.get_mut(*player) { - this_intrinsic_changed.gained.insert($intrinsic); - } else { - intrinsic_changed.insert(*player, crate::IntrinsicChanged { - gained: { - let mut m = std::collections::HashSet::new(); - m.insert($intrinsic); - m - }, - lost: std::collections::HashSet::new() - }).expect("Failed to insert IntrinsicChanged component."); - } +/// Used to check if a given entity has a given Intrinsic. +macro_rules! has { + ($ecs:expr, $entity:expr, $intrinsic:expr) => { + { + let intrinsics = $ecs.read_storage::(); + if let Some(has_intrinsics) = intrinsics.get($entity) { + has_intrinsics.list.contains(&$intrinsic) + } else { + false + } + } + }; +} + +#[macro_export] +/// Used to check if the player has a given Intrinsic. +macro_rules! player_has { + ($ecs:expr, $intrinsic:expr) => { + { + let player = $ecs.fetch::(); + let intrinsics = $ecs.read_storage::(); + if let Some(player_intrinsics) = intrinsics.get(*player) { + player_intrinsics.list.contains(&$intrinsic) + } else { + false + } + } + }; +} + +#[macro_export] +/// Handles adding an Intrinsic to the player, and adding it to the IntrinsicChanged component. +macro_rules! add_intr { + ($ecs:expr, $entity:expr, $intrinsic:expr) => { + { + let mut intrinsics = $ecs.write_storage::(); + if let Some(player_intrinsics) = intrinsics.get_mut($entity) { + if !player_intrinsics.list.contains(&$intrinsic) { + player_intrinsics.list.insert($intrinsic); + let mut intrinsic_changed = $ecs.write_storage::(); + if let Some(this_intrinsic_changed) = intrinsic_changed.get_mut($entity) { + this_intrinsic_changed.gained.insert($intrinsic); + } else { + intrinsic_changed.insert($entity, crate::IntrinsicChanged { + gained: { + let mut m = std::collections::HashSet::new(); + m.insert($intrinsic); + m + }, + lost: std::collections::HashSet::new() + }).expect("Failed to insert IntrinsicChanged component."); + } + } + } else { + intrinsics.insert($entity, crate::Intrinsics { + list: { + let mut m = std::collections::HashSet::new(); + m.insert($intrinsic); + m + } + }).expect("Failed to insert Intrinsics component."); + let mut intrinsic_changed = $ecs.write_storage::(); + intrinsic_changed.insert($entity, crate::IntrinsicChanged { + gained: { + let mut m = std::collections::HashSet::new(); + m.insert($intrinsic); + m + }, + lost: std::collections::HashSet::new() + }).expect("Failed to insert IntrinsicChanged component."); } - } else { - unreachable!("add_intr!(): The player should always have an Intrinsics component."); } }; }