Skip to main content

wowlab_engine_combat/builder/spell_builder/
aoe.rs

1use super::SpellDefinitionDraft;
2
3impl SpellDefinitionDraft {
4    /// Hard cap on targets selected by a multi-target spell (`0` = unlimited).
5    pub fn max_targets(mut self, n: u8) -> Self {
6        self.aoe_max_targets = n;
7
8        self
9    }
10
11    /// Beyond this count, per-target damage is multiplied by `sqrt(reduced_aoe_targets / hits)`.
12    pub fn reduced_aoe_targets(mut self, n: u8) -> Self {
13        self.aoe_reduced_targets = n;
14
15        self
16    }
17
18    /// Number of targets that always receive full damage before sqrt scaling.
19    pub fn full_amount_targets(mut self, n: u8) -> Self {
20        self.aoe_full_targets = n;
21
22        self
23    }
24
25    /// Flat multiplier applied to every `AoE` hit (default `1.0`).
26    pub fn base_aoe_multiplier(mut self, m: f64) -> Self {
27        self.aoe_base_mult = m;
28
29        self
30    }
31
32    /// Mark a manually-authored spell as multi-target.
33    pub fn multi_target(mut self) -> Self {
34        self.is_aoe = true;
35
36        self
37    }
38
39    /// Apply a DBC chain-target count independently of the chain damage multiplier.
40    pub fn chain_targets(mut self, n: u8) -> Self {
41        self.aoe_max_targets = n;
42        self.chain_targeting = n > 0;
43
44        if self.chain_targeting {
45            self.is_aoe = true;
46        }
47
48        self
49    }
50
51    /// Mark whether resolved DBC or manifest semantics select chain geometry.
52    pub fn chain_targeting(mut self, enabled: bool) -> Self {
53        self.chain_targeting = enabled;
54
55        if enabled {
56            self.is_aoe = true;
57        }
58
59        self
60    }
61
62    /// Chain decay multiplier per hop. Hit `k` gets `mult.powi(k)`.
63    pub fn chain_multiplier(mut self, m: f64) -> Self {
64        self.chain_multiplier = m;
65
66        self
67    }
68
69    /// Split damage: total damage is divided across hits.
70    pub fn split_damage(mut self) -> Self {
71        self.split = true;
72
73        self
74    }
75}