wowlab_engine_domain/pool/
damage.rs1use 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;