Skip to main content

wowlab_engine_combat/state/
ground_effect.rs

1use wowlab_types::sim::SpatialTransform;
2
3use super::{DamageEffectRef, RuntimeDamageDef};
4use crate::systems::DamageFlags;
5
6/// A location-locked sequence of damage pulses.
7#[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}