bevy_gauge 0.2.0

A crate designed to provide an opinionated solution to handling stats, effects, abilities and tags
Documentation
use std::collections::HashMap;
use bevy::prelude::{Deref, DerefMut};
use bevy_ecs::component::Component;
use serde::Deserialize;
use crate::prelude::*;

#[derive(Component, Default, Debug, Clone, Deref, DerefMut)]
pub struct StatEffect(pub StatCollection);

impl StatEffect {
    pub fn new() -> Self {
        Self(StatCollection::new())
    }

    pub fn build(&self, stats: &StatContextRefs) -> StatEffectInstance {
        let mut instance = StatEffectInstance::new();
        for (stat, value) in self.iter() {
            let value = value.evaluate(stats);
            instance.effects.insert(stat.to_string(), value);
        }
        instance
    }

    pub fn build_instant(&self, stats: &StatContextRefs) -> InstantStatEffectInstance {
        let mut instance = InstantStatEffectInstance::new();
        for (stat, value) in self.iter() {
            let value = value.evaluate(stats);
            instance.effects.insert(stat, value);
        }
        instance
    }
}

pub struct InstantStatEffectInstance<'a> {
    pub effects: HashMap<&'a str, f32>,
}

impl<'a> InstantStatEffectInstance<'a> {
    pub fn new() -> Self {
        Self {
            effects: HashMap::new(),
        }
    }

    pub fn apply(&self, stats: &mut StatCollection) {
        for (stat, value) in self.effects.iter() {
            let _ = stats.add(stat, *value);
        }
    }

    pub fn unapply(&self, stats: &mut StatCollection) {
        for (stat, value) in self.effects.iter() {
            let _ = stats.add(stat, -value);
        }
    }
}

pub struct StatEffectInstance {
    effects: HashMap<String, f32>,
}

impl StatEffectInstance {
    pub fn new() -> Self {
        Self {
            effects: HashMap::new(),
        }
    }

    pub fn apply(&self, stats: &mut StatCollection) {
        for (stat, value) in self.effects.iter() {
            let _ = stats.add(stat, *value);
        }
    }

    pub fn unapply(&self, stats: &mut StatCollection) {
        for (stat, value) in self.effects.iter() {
            let _ = stats.add(stat, -value);
        }
    }
}