Skip to main content

wowlab_engine_domain/dbc/semantics/
control.rs

1use super::AuraSubtypeKind;
2
3/// Target-generic loss-of-control category lowered from a DBC aura subtype.
4#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
5#[non_exhaustive]
6pub enum CrowdControlKind {
7    Stun,
8    Root,
9    Fear,
10    Silence,
11    Incapacitate,
12}
13
14/// Authoritative `TrinityCore` diminishing-return groups used by represented CC.
15#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
16#[repr(u8)]
17#[non_exhaustive]
18pub enum DiminishingGroup {
19    None = 0,
20    Root = 1,
21    Stun = 2,
22    Incapacitate = 3,
23    Disorient = 4,
24    Silence = 5,
25    AoeKnockback = 6,
26    Taunt = 7,
27    LimitOnly = 8,
28}
29
30/// Generic control behavior carried by a DBC apply-aura subtype.
31#[derive(Clone, Copy, Debug, Eq, PartialEq)]
32pub struct CrowdControlSemantic {
33    pub kind: CrowdControlKind,
34    pub diminishing: DiminishingGroup,
35}
36
37#[must_use]
38pub const fn crowd_control_semantic(subtype: AuraSubtypeKind) -> Option<CrowdControlSemantic> {
39    let (kind, diminishing) = match subtype {
40        AuraSubtypeKind::Stun => (CrowdControlKind::Stun, DiminishingGroup::Stun),
41        AuraSubtypeKind::Root | AuraSubtypeKind::RootRespectsThreatTable => {
42            (CrowdControlKind::Root, DiminishingGroup::Root)
43        }
44        AuraSubtypeKind::Fear => (CrowdControlKind::Fear, DiminishingGroup::Disorient),
45        AuraSubtypeKind::Silence | AuraSubtypeKind::PacifySilence => {
46            (CrowdControlKind::Silence, DiminishingGroup::Silence)
47        }
48        AuraSubtypeKind::ModConfuse => (
49            CrowdControlKind::Incapacitate,
50            DiminishingGroup::Incapacitate,
51        ),
52        _ => return None,
53    };
54
55    Some(CrowdControlSemantic { kind, diminishing })
56}