Skip to main content

wowlab_engine_domain/dbc/semantics/
control.rs

1// #t(file: rust_magic_numbers) Ordinals mirror the finite server control taxonomy declared by the enum.
2
3use super::AuraSubtypeKind;
4
5/// Target-generic loss-of-control category lowered from a DBC aura subtype.
6#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
7#[non_exhaustive]
8pub enum CrowdControlKind {
9    Stun,
10    Root,
11    Fear,
12    Silence,
13    Incapacitate,
14}
15
16impl CrowdControlKind {
17    pub const COUNT: usize = 5;
18
19    #[must_use]
20    pub const fn ordinal(self) -> usize {
21        // #t(rust_magic_numbers) values mirror the finite server taxonomy declared by this enum.
22        match self {
23            Self::Stun => 0,
24            Self::Root => 1,
25            Self::Fear => 2,
26            Self::Silence => 3,
27            Self::Incapacitate => 4,
28        }
29    }
30}
31
32/// Authoritative `TrinityCore` diminishing-return groups used by represented CC.
33#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
34#[repr(u8)]
35#[non_exhaustive]
36pub enum DiminishingGroup {
37    None = 0,
38    Root = 1,
39    Stun = 2,
40    Incapacitate = 3,
41    Disorient = 4,
42    Silence = 5,
43    AoeKnockback = 6,
44    Taunt = 7,
45    LimitOnly = 8,
46}
47
48impl DiminishingGroup {
49    pub const COUNT: usize = 9;
50
51    #[must_use]
52    pub const fn ordinal(self) -> usize {
53        self as usize
54    }
55}
56
57/// Generic control behavior carried by a DBC apply-aura subtype.
58#[derive(Clone, Copy, Debug, Eq, PartialEq)]
59pub struct CrowdControlSemantic {
60    pub kind: CrowdControlKind,
61    pub diminishing: DiminishingGroup,
62}
63
64#[must_use]
65pub const fn crowd_control_semantic(subtype: AuraSubtypeKind) -> Option<CrowdControlSemantic> {
66    let (kind, diminishing) = match subtype {
67        AuraSubtypeKind::Stun => (CrowdControlKind::Stun, DiminishingGroup::Stun),
68        AuraSubtypeKind::Root | AuraSubtypeKind::RootRespectsThreatTable => {
69            (CrowdControlKind::Root, DiminishingGroup::Root)
70        }
71        AuraSubtypeKind::Fear => (CrowdControlKind::Fear, DiminishingGroup::Disorient),
72        AuraSubtypeKind::Silence | AuraSubtypeKind::PacifySilence => {
73            (CrowdControlKind::Silence, DiminishingGroup::Silence)
74        }
75        AuraSubtypeKind::ModConfuse => (
76            CrowdControlKind::Incapacitate,
77            DiminishingGroup::Incapacitate,
78        ),
79        _ => return None,
80    };
81
82    Some(CrowdControlSemantic { kind, diminishing })
83}