Skip to main content

wowlab_engine_domain/pool/
damage.rs

1use std::hash::Hash;
2
3use super::base::Pool;
4
5#[derive(Clone, Debug)]
6pub struct DamagePool<K> {
7    state: Pool<K, f64>,
8}
9
10impl<K> DamagePool<K>
11where
12    K: Eq + Hash,
13{
14    #[must_use]
15    pub fn new() -> Self {
16        Self::default()
17    }
18
19    pub fn add(&mut self, key: K, amount: f64) -> f64 {
20        let value = self.state.value_mut(key);
21
22        *value += amount;
23
24        *value
25    }
26
27    pub fn remaining(&self, key: &K) -> f64 {
28        self.state.get(key).copied().unwrap_or_default()
29    }
30
31    pub fn take(&mut self, key: &K) -> f64 {
32        self.state.take(key)
33    }
34
35    pub fn take_tick(&mut self, key: &K, remaining_ticks: f64) -> f64 {
36        let Some(pool) = self.state.get_mut(key) else {
37            return 0.0;
38        };
39        let amount = *pool / remaining_ticks.max(1.0);
40
41        *pool = (*pool - amount).max(0.0);
42
43        amount
44    }
45
46    pub fn remove(&mut self, key: &K) -> f64 {
47        self.state.remove(key).unwrap_or_default()
48    }
49
50    pub fn clear(&mut self) {
51        self.state.clear();
52    }
53}
54
55impl<K> Default for DamagePool<K> {
56    fn default() -> Self {
57        Self {
58            state: Pool::default(),
59        }
60    }
61}
62
63#[cfg(test)]
64#[path = "damage/tests.rs"]
65mod tests;