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.
This commit is contained in:
Llywelwyn 2023-10-02 22:14:00 +01:00
parent b5743819ec
commit 4d21bd46d4
5 changed files with 56 additions and 0 deletions

View file

@ -460,6 +460,12 @@ impl Intrinsics {
}
}
#[derive(Component, Serialize, Deserialize, Debug, Clone)]
pub struct IntrinsicChanged {
pub gained: HashSet<Intrinsic>,
pub lost: HashSet<Intrinsic>,
}
#[derive(Component, Debug, ConvertSaveload, Clone)]
pub struct InflictsDamage {
pub damage_type: DamageType,

View file

@ -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;

44
src/macros/mod.rs Normal file
View file

@ -0,0 +1,44 @@
// macros/mod.rs
#[macro_export]
macro_rules! player {
($ecs:expr, $component:ty) => {
{
let player = $ecs.fetch::<Entity>();
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::<Entity>();
let mut intrinsics = $ecs.write_storage::<crate::Intrinsics>();
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::<crate::IntrinsicChanged>();
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.");
}
};
}

View file

@ -111,6 +111,7 @@ fn main() -> BError {
gs.ecs.register::<SpawnParticleLine>();
gs.ecs.register::<HasDamageModifiers>();
gs.ecs.register::<Intrinsics>();
gs.ecs.register::<IntrinsicChanged>();
gs.ecs.register::<SimpleMarker<SerializeMe>>();
gs.ecs.register::<SerializationHelper>();
gs.ecs.register::<DMSerializationHelper>();

View file

@ -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,