wowlab_engine_combat/state/
ground_effect.rs1use wowlab_types::sim::SpatialTransform;
2
3use super::{DamageEffectRef, RuntimeDamageDef};
4use crate::systems::DamageFlags;
5
6#[derive(Clone, Copy, Debug)]
8pub struct GroundEffectSpec {
9 pub(crate) geometry_effect: DamageEffectRef,
10 pub(crate) damage_effect: DamageEffectRef,
11 pub(crate) profile_spell_id: u32,
12 pub(crate) pulse_count: u8,
13 pub(crate) pulse_period_ms: u32,
14 pub(crate) first_pulse_delay_ms: u32,
15 pub(crate) multiplier: f64,
16 pub(crate) flags: DamageFlags,
17}
18
19impl GroundEffectSpec {
20 #[must_use]
21 pub const fn new(geometry_effect: (u32, u8), damage_effect: (u32, u8)) -> Self {
22 Self {
23 geometry_effect: DamageEffectRef::new(geometry_effect.0, geometry_effect.1),
24 damage_effect: DamageEffectRef::new(damage_effect.0, damage_effect.1),
25 profile_spell_id: damage_effect.0,
26 pulse_count: 1,
27 pulse_period_ms: 0,
28 first_pulse_delay_ms: 0,
29 multiplier: 1.0,
30 flags: DamageFlags::empty(),
31 }
32 }
33
34 #[must_use]
35 pub const fn pulses(mut self, count: u8, period_ms: u32) -> Self {
36 self.pulse_count = count;
37 self.pulse_period_ms = period_ms;
38
39 self
40 }
41
42 #[must_use]
43 pub const fn first_pulse_after(mut self, delay_ms: u32) -> Self {
44 self.first_pulse_delay_ms = delay_ms;
45
46 self
47 }
48
49 #[must_use]
50 pub const fn multiplier(mut self, multiplier: f64) -> Self {
51 self.multiplier = multiplier;
52
53 self
54 }
55
56 #[must_use]
57 pub const fn flags(mut self, flags: DamageFlags) -> Self {
58 self.flags = flags;
59
60 self
61 }
62}
63
64#[derive(Clone, Copy, Debug)]
65pub(crate) struct PendingGroundPulse {
66 pub(crate) geometry_effect: DamageEffectRef,
67 pub(crate) damage_effect: DamageEffectRef,
68 pub(crate) profile_spell_id: u32,
69 pub(crate) damage: RuntimeDamageDef,
70 pub(crate) destination: SpatialTransform,
71 pub(crate) flags: DamageFlags,
72}