1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
//! Contains the `StatBundle` struct, which is a bundle of all stats an entity might have.
use bevy::{prelude::*, utils::hashbrown::HashMap};
use crate::{enums::StatEnum, Stat};
/// Bundle that contains data for all stats an entity might have.
#[derive(Component, Default, Debug, Reflect)]
pub struct StatBundle {
/// A mapping of stat to stat value.
pub stats: HashMap<StatEnum, Stat>,
}
impl StatBundle {
/// Creates a new stats bundle with the given stats.
#[must_use]
pub fn new(stats: Vec<(StatEnum, f32)>) -> Self {
let mut stats_map = HashMap::new();
for stat in stats {
stats_map.insert(stat.0, Stat::new(stat.1));
}
Self { stats: stats_map }
}
/// Add a new stat to the stats bundle. If the stat already exists, it will be overwritten.
pub fn add_stat(&mut self, stat: StatEnum) {
self.stats.insert(stat, Stat::default());
}
/// Get a specific stat from the stats bundle.
///
/// If the stat does not exist, it will return None.
#[must_use]
pub fn get_stat(&self, stat: &StatEnum) -> Option<&Stat> {
self.stats.get(stat)
}
/// Update the value of a specific stat.
///
/// If the stat does not exist, it will be added.
pub fn update_stat(&mut self, stat: StatEnum, value: f32) {
if let Some(stat) = self.stats.get_mut(&stat) {
stat.set_base_value(value);
} else {
self.stats.insert(stat, Stat::new(value));
}
}
/// Update the bonus of a specific stat.
///
/// If the stat does not exist, it will be added.
pub fn update_stat_bonus(&mut self, stat: StatEnum, value: f32) {
if let Some(stat) = self.stats.get_mut(&stat) {
stat.set_bonus_value(value);
} else {
self.stats.insert(stat.clone(), Stat::new(0.0));
self.update_stat_bonus(stat, value);
}
}
}