From 4d21bd46d4561f81a0ad7c29115af28584f59d83 Mon Sep 17 00:00:00 2001 From: Llywelwyn Date: Mon, 2 Oct 2023 22:14:00 +0100 Subject: [PATCH] add_intr!() macro for adding intrinsics to the Player If needed, player can just be replaced by another arg to the macro so this works on every other entity - but right now the player is the only thing to gain/lose intrinsics. --- src/components.rs | 6 ++++++ src/lib.rs | 3 +++ src/macros/mod.rs | 44 ++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 1 + src/saveload_system.rs | 2 ++ 5 files changed, 56 insertions(+) create mode 100644 src/macros/mod.rs diff --git a/src/components.rs b/src/components.rs index 522b235..22f3b9e 100644 --- a/src/components.rs +++ b/src/components.rs @@ -460,6 +460,12 @@ impl Intrinsics { } } +#[derive(Component, Serialize, Deserialize, Debug, Clone)] +pub struct IntrinsicChanged { + pub gained: HashSet, + pub lost: HashSet, +} + #[derive(Component, Debug, ConvertSaveload, Clone)] pub struct InflictsDamage { pub damage_type: DamageType, diff --git a/src/lib.rs b/src/lib.rs index 812c7be..6bbdd04 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,6 +8,9 @@ extern crate serde; #[macro_use] extern crate lazy_static; +#[macro_use] +pub mod macros; + pub mod camera; pub mod components; pub mod raws; diff --git a/src/macros/mod.rs b/src/macros/mod.rs new file mode 100644 index 0000000..6d965c4 --- /dev/null +++ b/src/macros/mod.rs @@ -0,0 +1,44 @@ +// macros/mod.rs + +#[macro_export] +macro_rules! player { + ($ecs:expr, $component:ty) => { + { + let player = $ecs.fetch::(); + let component = $ecs.read_storage::<$component>(); + if let Some(player_component) = component.get(*player) { + true + } else { + false + } + } + }; +} + +#[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."); + } + } + } else { + unreachable!("add_intr!(): The player should always have an Intrinsics component."); + } + }; +} diff --git a/src/main.rs b/src/main.rs index f82ebbd..f430376 100644 --- a/src/main.rs +++ b/src/main.rs @@ -111,6 +111,7 @@ fn main() -> BError { gs.ecs.register::(); gs.ecs.register::(); gs.ecs.register::(); + gs.ecs.register::(); gs.ecs.register::>(); gs.ecs.register::(); gs.ecs.register::(); diff --git a/src/saveload_system.rs b/src/saveload_system.rs index 894e4ff..362b35f 100644 --- a/src/saveload_system.rs +++ b/src/saveload_system.rs @@ -95,6 +95,7 @@ pub fn save_game(ecs: &mut World) { IdentifiedItem, InBackpack, InflictsDamage, + IntrinsicChanged, Intrinsics, Item, KnownSpells, @@ -227,6 +228,7 @@ pub fn load_game(ecs: &mut World) { IdentifiedItem, InBackpack, InflictsDamage, + IntrinsicChanged, Intrinsics, Item, KnownSpells,