Skip to main content

wowlab_engine_domain/dbc/semantics/
aura_subtypes.rs

1use super::{ModifierFilter, ModifierOperation, SemanticSupport};
2
3const UNKNOWN_AURA_EVIDENCE: &str = "unknown SimC aura subtype requires behavior evidence";
4
5/// `misc_value_0` identities used by stat-modifying aura effects.
6#[derive(Clone, Copy, Debug, Eq, PartialEq, num_enum::TryFromPrimitive)]
7#[repr(i32)]
8#[non_exhaustive]
9pub enum StatModifierKind {
10    Primary = -2,
11    All = -1,
12    Strength = 0,
13    Agility = 1,
14    Stamina = 2,
15    Intellect = 3,
16}
17
18impl StatModifierKind {
19    #[must_use]
20    pub const fn from_attribute(attribute: wowlab_types::game::Attribute) -> Self {
21        match attribute {
22            wowlab_types::game::Attribute::Strength => Self::Strength,
23            wowlab_types::game::Attribute::Agility => Self::Agility,
24            wowlab_types::game::Attribute::Stamina => Self::Stamina,
25            wowlab_types::game::Attribute::Intellect => Self::Intellect,
26        }
27    }
28
29    #[must_use]
30    pub const fn stat_index(self) -> Option<usize> {
31        match self {
32            Self::Strength | Self::Agility | Self::Stamina | Self::Intellect => Some(self as usize),
33            Self::Primary | Self::All => None,
34        }
35    }
36
37    #[must_use]
38    pub const fn matches(self, attribute: wowlab_types::game::Attribute) -> bool {
39        match self {
40            Self::Primary => false,
41            Self::All => true,
42            Self::Strength => matches!(attribute, wowlab_types::game::Attribute::Strength),
43            Self::Agility => matches!(attribute, wowlab_types::game::Attribute::Agility),
44            Self::Stamina => matches!(attribute, wowlab_types::game::Attribute::Stamina),
45            Self::Intellect => matches!(attribute, wowlab_types::game::Attribute::Intellect),
46        }
47    }
48}
49
50/// Whether a [`AuraSubtypeKind::ModStat`] effect's `misc_value_0` targets the primary stat (the spec's main stat) rather than a specific stat index.
51#[must_use]
52pub const fn is_primary_stat_misc(misc_value_0: i32) -> bool {
53    misc_value_0 == StatModifierKind::Primary as i32
54}
55
56/// Typed aura-subtype identities used by shared engine code.
57#[derive(Clone, Copy, Debug, Eq, PartialEq)]
58#[repr(i32)]
59#[non_exhaustive]
60pub enum AuraSubtypeKind {
61    None = 0,
62    PeriodicDamage = 3,
63    Dummy = 4,
64    ModConfuse = 5,
65    Fear = 7,
66    PeriodicHeal = 8,
67    Threat = 10,
68    Stun = 12,
69    Invisibility = 18,
70    PeriodicHealPercent = 20,
71    PeriodicTriggerSpell = 23,
72    PeriodicEnergize = 24,
73    Root = 26,
74    Silence = 27,
75    SpellReflection = 28,
76    ModStat = 29,
77    ModIncreaseMovementSpeed = 31,
78    ModDecreaseMovementSpeed = 33,
79    ModIncreaseEnergy = 35,
80    Shapeshift = 36,
81    SchoolImmunity = 39,
82    DisableStealth = 41,
83    ProcTriggerSpell = 42,
84    ModParryPercent = 47,
85    ModDodgePercent = 49,
86    PeriodicLeech = 53,
87    ChangeModel = 56,
88    ModSpellCritChance = 57,
89    PacifySilence = 60,
90    ScalePercentStacking = 61,
91    ModAdditionalPowerCost = 63,
92    AbsorbDamage = 69,
93    SpellReflectionSchool = 74,
94    Unknown75 = 75,
95    MechanicImmunity = 77,
96    ModDamageDonePercent = 79,
97    TransferDamagePercent = 81,
98    ModPowerRegen = 85,
99    ModDamageTakenPercent = 87,
100    PeriodicMaxHealthDamage = 89,
101    InterruptRegen = 94,
102    ModArmorPercent = 101,
103    TemporaryThreatReduction = 103,
104    Levitate = 106,
105    AddFlatModifier = 107,
106    AddPercentModifier = 108,
107    ModPowerRegenPercent = 110,
108    ModHealingFlat = 115,
109    ModHealingReceivedPercent = 118,
110    ModIncreaseMovementSpeedStacking = 129,
111    IncreaseHealthPercent = 133,
112    ModManaRegenInterrupted = 134,
113    ModHealingDoneFlat = 135,
114    ModHealingDonePercent = 136,
115    ModTotalStatPercentage = 137,
116    ModBaseResistance = 142,
117    UnknownPartyAura145 = 145,
118    CreatureImmunities = 147,
119    ModChargeCooldownRechargeRateCategory = 148,
120    ModAggroDistance = 152,
121    ModCritDamageMultiplier = 163,
122    IncreaseMountedSpeedPercent = 172,
123    ModCritChanceVersusTargetHealth = 183,
124    ModAttackerSpellHitChance = 186,
125    ModAttackerMeleeCritChance = 187,
126    ModAttackerRangedCritChance = 188,
127    ModRating = 189,
128    UseBaseMoveSpeed = 191,
129    HasteAll = 193,
130    Unknown195 = 195,
131    ModAttackerCritChance = 197,
132    ModRageGeneratedFromAutoAttacks = 213,
133    AddPercentLabelModifier = 218,
134    AddFlatLabelModifier = 219,
135    ModSpellSchool = 220,
136    PeriodicDummy = 226,
137    ModAoeDamageTakenPercent = 229,
138    TriggerSpellWithValue = 231,
139    ModMechanicDurationPercentStacking = 232,
140    ModDebuffDurationPercent = 245,
141    ModDamagePercentDoneByTargetAuraMechanic = 249,
142    ModMechanicDamageTakenPercent = 255,
143    ModPeriodicHealingPercent = 259,
144    Unknown260 = 260,
145    IgnoreAuraState = 262,
146    DisableAbilities = 263,
147    ModDamageTakenFromCaster = 270,
148    ModDamageTakenFromCasterSpells = 271,
149    ModStanceMask = 275,
150    ModTargetArmorPercent = 280,
151    ModHealingTakenFromCasterPercent = 283,
152    CastLinkedSpellWithValue = 285,
153    ModCooldownRechargeRatePercent = 286,
154    DeflectSpells = 287,
155    ModAllCritChance = 290,
156    PreventRegeneratePower = 294,
157    ShareDamagePercent = 300,
158    AbsorbHealing = 301,
159    ModMinSpeedPercent = 305,
160    AllowCastingWhileMovingLabel = 307,
161    ModCreatureAoeDamageAvoidance = 310,
162    ReplaceAnimationSet = 312,
163    AbsorbOverkillDamageFromSchool = 316,
164    ModMasteryPercent = 318,
165    ModMeleeAutoAttackSpeedPercent = 319,
166    ApplyHastedGcdLabel = 320,
167    CastWhileMovingWhitelist = 330,
168    OverrideActionSpell = 332,
169    ModAutoAttackCritChance = 334,
170    Unknown335 = 335,
171    ModCooldownTimeCategory = 341,
172    ModRangedAndMeleeAutoAttackSpeedPercent = 342,
173    ModAutoAttackDamageTakenFromCaster = 343,
174    ModAutoAttackDamage = 344,
175    IgnoreArmorPercent = 345,
176    ModSpellHastePercent = 355,
177    OverrideAutoAttackWithAbility = 361,
178    OverrideSpellPowerByAttackPowerPercent = 366,
179    CastWhileMoving = 377,
180    ModManaRegenPercent = 379,
181    ModDamageTakenFromCasterGuardian = 380,
182    ModDamageTakenFromCasterPet = 381,
183    ModPetStat = 382,
184    AreaTrigger = 395,
185    ResourceThresholdTrigger = 396,
186    ModTimeRate = 399,
187    OverrideAttackPowerBySpellPowerPercent = 404,
188    ModRatingMultiplier = 405,
189    SetActionButtonSpellCount = 408,
190    ModCooldownChargeCategory = 411,
191    HastedCooldown = 416,
192    HastedGlobalCooldown = 417,
193    ModMaxResource = 418,
194    ModAbsorbDonePercent = 421,
195    ModAbsorbReceivedPercent = 422,
196    ModManaCostPercent = 423,
197    ModPetDamageDone = 429,
198    ModLeechPercent = 443,
199    ModRechargeTimeCategory = 453,
200    ModRechargeTimePercentCategory = 454,
201    RootRespectsThreatTable = 455,
202    HastedCooldownCategory = 457,
203    ModBonusStatPercent = 467,
204    TriggerSpellBasedOnHealthPercent = 468,
205    ModTimeRateLabel = 470,
206    ModVersatilityPercent = 471,
207    TriggerSpellOnExpire = 495,
208    IgnoreSpellChargeCooldown = 500,
209    ModGuardianDamageDonePercent = 531,
210    ModDamageTakenFromCasterSpellsLabel = 537,
211}
212
213/// Aura-382 `misc_value_0` identities for the inherited pet power being modified.
214#[derive(Clone, Copy, Debug, Eq, PartialEq)]
215#[repr(i32)]
216#[non_exhaustive]
217pub enum PetStatKind {
218    AttackPowerInheritance = 2,
219    SpellPowerInheritance = 3,
220}
221
222/// One registered DBC apply-aura subtype.
223#[derive(Clone, Copy, Debug, Eq, PartialEq)]
224pub struct AuraSubtypeSemantic {
225    pub kind: AuraSubtypeKind,
226    pub name: &'static str,
227    pub support: SemanticSupport,
228    pub handler: &'static str,
229    pub modifier: Option<(ModifierOperation, ModifierFilter)>,
230}
231
232/// Canonical registry of apply-aura subtypes understood by the engine.
233#[rustfmt::skip]
234pub const AURA_SUBTYPE_SEMANTICS: &[AuraSubtypeSemantic] = &[
235    aura(AuraSubtypeKind::None, "None", SemanticSupport::Ignored, "absence sentinel; no aura behavior to lower", None),
236    aura(AuraSubtypeKind::PeriodicDamage, "Periodic Damage", SemanticSupport::Generic, "automatic AP, SP, and flat periodic damage construction", None),
237    aura(AuraSubtypeKind::Dummy, "Dummy", SemanticSupport::ContentRequired, "spec or item content", None),
238    aura(AuraSubtypeKind::ModConfuse, "Mod Confuse", SemanticSupport::Generic, "target-generic incapacitate state with diminishing returns", None),
239    aura(AuraSubtypeKind::Fear, "Fear", SemanticSupport::Generic, "target-generic fear state with diminishing returns", None),
240    aura(AuraSubtypeKind::PeriodicHeal, "Periodic Heal", SemanticSupport::Generic, "shared periodic healing pipeline", None),
241    aura(AuraSubtypeKind::Threat, "Threat", SemanticSupport::Unsupported, "threat generation is not modelled", None),
242    aura(AuraSubtypeKind::Stun, "Stun", SemanticSupport::Generic, "target-generic stun state with diminishing returns", None),
243    aura(AuraSubtypeKind::Invisibility, "Invisibility", SemanticSupport::Unsupported, "generic invisibility state and action/proc interaction are not modelled", None),
244    aura(AuraSubtypeKind::PeriodicHealPercent, "Periodic Heal Percent", SemanticSupport::Generic, "maximum-health percentage periodic healing", None),
245    aura(AuraSubtypeKind::PeriodicTriggerSpell, "Periodic Trigger Spell", SemanticSupport::Partial, "registered aura ticks execute typed child damage, aura, resource, and charge operations; missing cadence, unsupported children, and unregistered destinations remain explicit gaps", None),
246    aura(AuraSubtypeKind::PeriodicEnergize, "Periodic Energize", SemanticSupport::Generic, "periodic resource resolution", None),
247    aura(AuraSubtypeKind::Root, "Root", SemanticSupport::Generic, "target-generic root state with diminishing returns", None),
248    aura(AuraSubtypeKind::Silence, "Silence", SemanticSupport::Generic, "target-generic silence state with diminishing returns", None),
249    aura(AuraSubtypeKind::SpellReflection, "Spell Reflection", SemanticSupport::Generic, "incoming spell reflection re-resolves damage against the caster", None),
250    aura(AuraSubtypeKind::ModStat, "Mod Stat", SemanticSupport::Generic, "stat and consumable resolution", None),
251    aura(AuraSubtypeKind::ModIncreaseMovementSpeed, "Mod Increase Movement Speed", SemanticSupport::Unsupported, "actor movement speed is not modelled", None),
252    aura(AuraSubtypeKind::ModDecreaseMovementSpeed, "Mod Decrease Movement Speed", SemanticSupport::Unsupported, "actor movement speed is not modelled", None),
253    aura(AuraSubtypeKind::ModIncreaseEnergy, "Mod Increase Energy", SemanticSupport::Generic, "resource passive resolution", None),
254    aura(AuraSubtypeKind::Shapeshift, "Shapeshift", SemanticSupport::Generic, "shared player form state and spell stance-mask gating", None),
255    aura(AuraSubtypeKind::SchoolImmunity, "School Immunity", SemanticSupport::Generic, "active actor incoming school-damage immunity", None),
256    aura(AuraSubtypeKind::DisableStealth, "Disable Stealth", SemanticSupport::Unsupported, "stealth suppression across actors is not modelled", None),
257    aura(AuraSubtypeKind::ProcTriggerSpell, "Proc Trigger Spell", SemanticSupport::Partial, "proc relation resolved; content wires trigger event", None),
258    aura(AuraSubtypeKind::ModParryPercent, "Mod Parry Percent", SemanticSupport::Unsupported, "DBC defensive parry modifiers are not applied to incoming attack resolution", None),
259    aura(AuraSubtypeKind::ModDodgePercent, "Mod Dodge Percent", SemanticSupport::Unsupported, "DBC defensive dodge modifiers are not applied to incoming attack resolution", None),
260    aura(AuraSubtypeKind::PeriodicLeech, "Periodic Leech", SemanticSupport::Generic, "periodic damage and actual-damage leech healing", None),
261    aura(AuraSubtypeKind::ChangeModel, "Change Model", SemanticSupport::Ignored, "visual model changes have no combat impact", None),
262    aura(AuraSubtypeKind::ModSpellCritChance, "Mod Spell Crit Chance", SemanticSupport::Generic, "passive stat resolution", None),
263    aura(AuraSubtypeKind::PacifySilence, "Pacify Silence", SemanticSupport::Generic, "target-generic silence state with diminishing returns; pacify has no additional Patchwerk action effect", None),
264    aura(AuraSubtypeKind::ScalePercentStacking, "Scale Percent Stacking", SemanticSupport::Ignored, "visual scale has no combat impact", None),
265    aura(AuraSubtypeKind::ModAdditionalPowerCost, "Modify Additional Power Cost", SemanticSupport::Generic, "active affected-spell optional-cost adjustment for the matching power type", None),
266    aura(AuraSubtypeKind::AbsorbDamage, "Absorb Damage", SemanticSupport::Generic, "school-filtered priority-ordered mutable damage absorbs", None),
267    aura(AuraSubtypeKind::SpellReflectionSchool, "Spell Reflection by School", SemanticSupport::Generic, "school-filtered incoming spell reflection", None),
268    aura(AuraSubtypeKind::Unknown75, "Unknown Aura 75", SemanticSupport::Unsupported, UNKNOWN_AURA_EVIDENCE, None),
269    aura(AuraSubtypeKind::MechanicImmunity, "Mechanic Immunity", SemanticSupport::Generic, "active actor incoming mechanic immunity", None),
270    aura(AuraSubtypeKind::ModDamageDonePercent, "Mod Damage Done Percent", SemanticSupport::Generic, "source-aware actor outgoing school-damage accumulation", None),
271    aura(AuraSubtypeKind::TransferDamagePercent, "Transfer Damage Percent", SemanticSupport::Generic, "pre-mitigation target damage split to aura caster", None),
272    aura(AuraSubtypeKind::ModPowerRegen, "Mod Power Regen", SemanticSupport::Generic, "active and passive DBC power-type regeneration", None),
273    aura(AuraSubtypeKind::ModDamageTakenPercent, "Mod Damage Taken Percent", SemanticSupport::Generic, "active actor incoming school-damage multiplier", None),
274    aura(AuraSubtypeKind::PeriodicMaxHealthDamage, "Periodic Max Health Percent Damage", SemanticSupport::Partial, "enemy-target max-health periodic damage; friendly-actor periodic damage dispatch is not modelled", None),
275    aura(AuraSubtypeKind::InterruptRegen, "Interrupt Regen", SemanticSupport::Generic, "active actor interrupted-regeneration state", None),
276    aura(AuraSubtypeKind::ModArmorPercent, "Mod Armor Percent", SemanticSupport::Unsupported, "DBC actor armor percentage is not applied to incoming physical mitigation", None),
277    aura(AuraSubtypeKind::TemporaryThreatReduction, "Temporary Threat Reduction", SemanticSupport::Unsupported, "temporary threat changes are not modelled", None),
278    aura(AuraSubtypeKind::Levitate, "Levitate", SemanticSupport::Unsupported, "actor movement modes are not modelled", None),
279    aura(AuraSubtypeKind::AddFlatModifier, "Add Flat Modifier", SemanticSupport::Generic, "spell modifier resolution", Some((ModifierOperation::Flat, ModifierFilter::ClassFamilyMask))),
280    aura(AuraSubtypeKind::AddPercentModifier, "Add Percent Modifier", SemanticSupport::Generic, "spell modifier resolution", Some((ModifierOperation::Percent, ModifierFilter::ClassFamilyMask))),
281    aura(AuraSubtypeKind::ModPowerRegenPercent, "Mod Power Regen Percent", SemanticSupport::Generic, "active and passive resource resolution", None),
282    aura(AuraSubtypeKind::ModHealingFlat, "Mod Healing Flat", SemanticSupport::Generic, "source-side school-filtered flat healing", None),
283    aura(AuraSubtypeKind::ModHealingReceivedPercent, "Mod Healing Received Percent", SemanticSupport::Generic, "target-side healing multiplier", None),
284    aura(AuraSubtypeKind::ModIncreaseMovementSpeedStacking, "Mod Increase Movement Speed Stacking", SemanticSupport::Unsupported, "stacking actor movement speed is not modelled", None),
285    aura(AuraSubtypeKind::IncreaseHealthPercent, "Increase Health Percent", SemanticSupport::Unsupported, "active maximum-health percentage changes are not projected onto actor health pools", None),
286    aura(AuraSubtypeKind::ModManaRegenInterrupted, "Mod Mana Regen Interrupted", SemanticSupport::Generic, "active interrupted-regeneration continuation percent", None),
287    aura(AuraSubtypeKind::ModHealingDoneFlat, "Mod Healing Done Flat", SemanticSupport::Generic, "source-side school-filtered flat healing", None),
288    aura(AuraSubtypeKind::ModHealingDonePercent, "Mod Healing Done Percent", SemanticSupport::Generic, "source-side healing multiplier", None),
289    aura(AuraSubtypeKind::ModTotalStatPercentage, "Mod Total Stat Percentage", SemanticSupport::Generic, "passive stat and buff resolution", None),
290    aura(AuraSubtypeKind::ModBaseResistance, "Mod Base Resistance", SemanticSupport::Unsupported, "actor resistance and incoming magic damage are not modelled", None),
291    aura(AuraSubtypeKind::UnknownPartyAura145, "Unknown Party Aura 145", SemanticSupport::ContentRequired, "unknown party-aura behavior requires explicit content evidence", None),
292    aura(AuraSubtypeKind::CreatureImmunities, "Creature Immunities", SemanticSupport::Generic, "active actor incoming mechanic-mask immunity", None),
293    aura(AuraSubtypeKind::ModChargeCooldownRechargeRateCategory, "Modify Charge Cooldown Recharge Rate Percent by Category", SemanticSupport::Generic, "active charge-category rate resolution and deadline reprojection", None),
294    aura(AuraSubtypeKind::ModAggroDistance, "Mod Aggro Distance", SemanticSupport::Unsupported, "aggro distance and encounter geometry are not modelled", None),
295    aura(AuraSubtypeKind::ModCritDamageMultiplier, "Mod Crit Damage Multiplier", SemanticSupport::Generic, "gear stat resolution", None),
296    aura(AuraSubtypeKind::IncreaseMountedSpeedPercent, "Increase Mounted Speed Percent", SemanticSupport::Unsupported, "mounted actor movement is not modelled", None),
297    aura(AuraSubtypeKind::ModCritChanceVersusTargetHealth, "Modify Critical Chance Versus Target Health", SemanticSupport::Generic, "active source aura adds critical chance while target health is at or above its DBC threshold", None),
298    aura(AuraSubtypeKind::ModAttackerSpellHitChance, "Mod Attacker Spell Hit Chance", SemanticSupport::Unsupported, "incoming spell hit resolution is not modelled", None),
299    aura(AuraSubtypeKind::ModAttackerMeleeCritChance, "Mod Attacker Melee Crit Chance", SemanticSupport::Unsupported, "incoming melee critical strikes are not modelled", None),
300    aura(AuraSubtypeKind::ModAttackerRangedCritChance, "Mod Attacker Ranged Crit Chance", SemanticSupport::Unsupported, "incoming ranged critical strikes are not modelled", None),
301    aura(AuraSubtypeKind::ModRating, "Mod Rating", SemanticSupport::Generic, "buff and enchant resolution", None),
302    aura(AuraSubtypeKind::UseBaseMoveSpeed, "Use Base Move Speed", SemanticSupport::Unsupported, "actor movement speed is not modelled", None),
303    aura(AuraSubtypeKind::HasteAll, "Haste All", SemanticSupport::Generic, "active and passive stat resolution", None),
304    aura(AuraSubtypeKind::Unknown195, "Unknown Aura 195", SemanticSupport::Unsupported, UNKNOWN_AURA_EVIDENCE, None),
305    aura(AuraSubtypeKind::ModAttackerCritChance, "Mod Attacker Crit Chance", SemanticSupport::Unsupported, "incoming critical strikes are not modelled", None),
306    aura(AuraSubtypeKind::ModRageGeneratedFromAutoAttacks, "Mod Rage Generated From Auto Attacks", SemanticSupport::Generic, "auto-attack-scoped active and passive Rage generation", None),
307    aura(AuraSubtypeKind::AddPercentLabelModifier, "Add Percent Label Modifier", SemanticSupport::Generic, "spell modifier resolution", Some((ModifierOperation::Percent, ModifierFilter::Label))),
308    aura(AuraSubtypeKind::AddFlatLabelModifier, "Add Flat Label Modifier", SemanticSupport::Generic, "spell modifier resolution", Some((ModifierOperation::Flat, ModifierFilter::Label))),
309    aura(AuraSubtypeKind::ModSpellSchool, "Mod Spell School", SemanticSupport::Generic, "active caster aura overrides affected damage identities before school modifiers and mitigation", None),
310    aura(AuraSubtypeKind::PeriodicDummy, "Periodic Dummy", SemanticSupport::Partial, "consumable model or content", None),
311    aura(AuraSubtypeKind::ModAoeDamageTakenPercent, "Mod AoE Damage Taken Percent", SemanticSupport::Generic, "active actor incoming area-damage school multiplier", None),
312    aura(AuraSubtypeKind::TriggerSpellWithValue, "Trigger Spell With Value", SemanticSupport::Partial, "registered passive proc activation forwards the driver value through typed child operations; unsupported proc forms and destinations remain explicit gaps", None),
313    aura(AuraSubtypeKind::ModMechanicDurationPercentStacking, "Mod Mechanic Duration Percent Stacking", SemanticSupport::Unsupported, "stacking crowd-control duration modifiers are not modelled", None),
314    aura(AuraSubtypeKind::ModDebuffDurationPercent, "Mod Debuff Duration Percent", SemanticSupport::Unsupported, "incoming debuff duration modifiers are not modelled", None),
315    aura(AuraSubtypeKind::ModDamagePercentDoneByTargetAuraMechanic, "Mod Damage Percent Done by Target Aura Mechanic", SemanticSupport::Generic, "source damage multiplier when the target carries the requested mechanic-tagged aura", None),
316    aura(AuraSubtypeKind::ModMechanicDamageTakenPercent, "Mod Mechanic Damage Taken Percent", SemanticSupport::Generic, "target damage multiplier for spells carrying the requested mechanic", None),
317    aura(AuraSubtypeKind::ModPeriodicHealingPercent, "Mod Periodic Healing Percent", SemanticSupport::Generic, "target-side periodic-healing multiplier", None),
318    aura(AuraSubtypeKind::Unknown260, "Unknown Aura 260", SemanticSupport::Unsupported, UNKNOWN_AURA_EVIDENCE, None),
319    aura(AuraSubtypeKind::IgnoreAuraState, "Ignore Aura State", SemanticSupport::Generic, "active DBC spell-gate exception", None),
320    aura(AuraSubtypeKind::DisableAbilities, "Disable Abilities", SemanticSupport::Generic, "active DBC spell-gate restriction", None),
321    aura(AuraSubtypeKind::ModDamageTakenFromCaster, "Mod Damage Taken From Caster", SemanticSupport::Generic, "active target aura applies caster-scoped damage in the damage pipeline", None),
322    aura(AuraSubtypeKind::ModDamageTakenFromCasterSpells, "Mod Damage Taken From Caster Spells", SemanticSupport::Generic, "active target aura resolves its DBC affect list in the damage pipeline", None),
323    aura(AuraSubtypeKind::ModStanceMask, "Mod Stance Mask", SemanticSupport::Generic, "active affect-listed stance-mask exceptions participate in spell usability", None),
324    aura(AuraSubtypeKind::ModTargetArmorPercent, "Mod Target Armor Percent", SemanticSupport::Generic, "passive target-armor resolution", None),
325    aura(AuraSubtypeKind::ModHealingTakenFromCasterPercent, "Mod Healing Taken From Caster Percent", SemanticSupport::Generic, "caster-scoped target healing multiplier", None),
326    aura(AuraSubtypeKind::CastLinkedSpellWithValue, "Cast Linked Spell With Value", SemanticSupport::Partial, "registered spell activation forwards the driver value through typed child operations; passive, learn, and unregistered activation forms remain unsupported", None),
327    aura(AuraSubtypeKind::ModCooldownRechargeRatePercent, "Mod Cooldown Recharge Rate Percent", SemanticSupport::Generic, "active affected-spell rate resolution and deadline reprojection", None),
328    aura(AuraSubtypeKind::DeflectSpells, "Deflect Spells", SemanticSupport::Generic, "active target spell-deflection chance", None),
329    aura(AuraSubtypeKind::ModAllCritChance, "Mod All Crit Chance", SemanticSupport::Generic, "active and passive stat resolution", None),
330    aura(AuraSubtypeKind::PreventRegeneratePower, "Prevent Regenerate Power", SemanticSupport::Generic, "active DBC power-mask regeneration prevention", None),
331    aura(AuraSubtypeKind::ShareDamagePercent, "Share Damage Percent", SemanticSupport::Generic, "post-mitigation target damage share to aura caster", None),
332    aura(AuraSubtypeKind::AbsorbHealing, "Absorb Healing", SemanticSupport::Generic, "school-filtered priority-ordered healing absorbs", None),
333    aura(AuraSubtypeKind::ModMinSpeedPercent, "Mod Min Speed Percent", SemanticSupport::Unsupported, "actor movement speed is not modelled", None),
334    aura(AuraSubtypeKind::AllowCastingWhileMovingLabel, "Allow Casting While Moving for Spells in Label", SemanticSupport::Generic, "active label-filtered movement cast exception", None),
335    aura(AuraSubtypeKind::ModCreatureAoeDamageAvoidance, "Mod Creature AoE Damage Avoidance", SemanticSupport::Generic, "target-side area-damage multiplier filtered by school", None),
336    aura(AuraSubtypeKind::ReplaceAnimationSet, "Replace Animation Set", SemanticSupport::Ignored, "client-side animation replacement has no combat impact", None),
337    aura(AuraSubtypeKind::AbsorbOverkillDamageFromSchool, "Absorb Overkill Damage From School", SemanticSupport::Generic, "school-filtered lethal-hit overkill absorbs", None),
338    aura(AuraSubtypeKind::ModMasteryPercent, "Mod Mastery Percent", SemanticSupport::Generic, "active and passive stat resolution", None),
339    aura(AuraSubtypeKind::ModMeleeAutoAttackSpeedPercent, "Mod Melee Auto Attack Speed Percent", SemanticSupport::Generic, "active and passive auto-attack timing", None),
340    aura(AuraSubtypeKind::ApplyHastedGcdLabel, "Apply Hasted GCD to Spells in Label", SemanticSupport::Generic, "passive label-filtered GCD haste classification", None),
341    aura(AuraSubtypeKind::CastWhileMovingWhitelist, "Cast While Moving Whitelist", SemanticSupport::Generic, "active affect-list movement cast exception", None),
342    aura(AuraSubtypeKind::OverrideActionSpell, "Override Action Spell", SemanticSupport::Generic, "DBC action override resolution", None),
343    aura(AuraSubtypeKind::ModAutoAttackCritChance, "Mod Auto Attack Crit Chance", SemanticSupport::Generic, "active actor aura adds critical chance to that actor's white auto-attacks only", None),
344    aura(AuraSubtypeKind::Unknown335, "Unknown Aura 335", SemanticSupport::Unsupported, UNKNOWN_AURA_EVIDENCE, None),
345    aura(AuraSubtypeKind::ModCooldownTimeCategory, "Mod Cooldown Time Category", SemanticSupport::Generic, "passive category cooldown resolution", None),
346    aura(AuraSubtypeKind::ModRangedAndMeleeAutoAttackSpeedPercent, "Mod Ranged and Melee Auto Attack Speed Percent", SemanticSupport::Generic, "active and passive auto-attack timing", None),
347    aura(AuraSubtypeKind::ModAutoAttackDamageTakenFromCaster, "Mod Auto Attack Damage Taken from Caster", SemanticSupport::Generic, "active target aura accumulation", None),
348    aura(AuraSubtypeKind::ModAutoAttackDamage, "Mod Auto Attack Damage", SemanticSupport::Generic, "passive damage resolution", None),
349    aura(AuraSubtypeKind::IgnoreArmorPercent, "Ignore Armor Percent", SemanticSupport::Generic, "active target aura bypasses armor only for its exact caster", None),
350    aura(AuraSubtypeKind::ModSpellHastePercent, "Mod Spell Haste Percent", SemanticSupport::Generic, "source-aware actor spell-haste accumulation and guardian cadence", None),
351    aura(AuraSubtypeKind::OverrideAutoAttackWithAbility, "Override Auto Attack With Ability", SemanticSupport::Generic, "active caster aura replaces main-hand white swings with its trigger spell and expiry restores white swings", None),
352    aura(AuraSubtypeKind::OverrideSpellPowerByAttackPowerPercent, "Override Spell Power by Attack Power Percent", SemanticSupport::Generic, "active owner stat override derives spell power from pre-override attack power", None),
353    aura(AuraSubtypeKind::CastWhileMoving, "Cast While Moving", SemanticSupport::Generic, "active affect-list movement cast exception", None),
354    aura(AuraSubtypeKind::ModManaRegenPercent, "Mod Mana Regen Percent", SemanticSupport::Generic, "passive resource resolution", None),
355    aura(AuraSubtypeKind::ModDamageTakenFromCasterGuardian, "Mod Damage Taken From Caster Guardian", SemanticSupport::Generic, "active target aura applies guardian-scoped damage in the damage pipeline", None),
356    aura(AuraSubtypeKind::ModDamageTakenFromCasterPet, "Mod Damage Taken From Caster Pet", SemanticSupport::Generic, "active target aura applies pet-scoped damage in the damage pipeline", None),
357    aura(AuraSubtypeKind::ModPetStat, "Mod Pet Stat", SemanticSupport::Generic, "passive NPC-filtered AP/SP inheritance resolution", None),
358    aura(AuraSubtypeKind::AreaTrigger, "Area Trigger", SemanticSupport::ContentRequired, "spec content wires area-trigger behavior", None),
359    aura(AuraSubtypeKind::ResourceThresholdTrigger, "Resource Threshold Trigger", SemanticSupport::Generic, "resource-threshold trigger resolution", None),
360    aura(AuraSubtypeKind::ModTimeRate, "Modify Time Rate", SemanticSupport::Generic, "active wall-clock aura duration and periodic cadence reprojection", None),
361    aura(AuraSubtypeKind::OverrideAttackPowerBySpellPowerPercent, "Override Attack Power by Spell Power Percent", SemanticSupport::Generic, "active owner stat override derives attack power from pre-override spell power", None),
362    aura(AuraSubtypeKind::ModRatingMultiplier, "Mod Rating Multiplier", SemanticSupport::Generic, "passive stat resolution", None),
363    aura(AuraSubtypeKind::SetActionButtonSpellCount, "Set Action Button Spell Count", SemanticSupport::Ignored, "client-side action-button display has no combat impact", None),
364    aura(AuraSubtypeKind::ModCooldownChargeCategory, "Mod Cooldown Charge Category", SemanticSupport::Generic, "passive category charge resolution", None),
365    aura(AuraSubtypeKind::HastedCooldown, "Hasted Cooldown", SemanticSupport::Generic, "passive cooldown resolution", None),
366    aura(AuraSubtypeKind::HastedGlobalCooldown, "Hasted Global Cooldown", SemanticSupport::Generic, "passive class-family GCD haste classification", None),
367    aura(AuraSubtypeKind::ModMaxResource, "Mod Max Resource", SemanticSupport::Generic, "resource passive resolution", None),
368    aura(AuraSubtypeKind::ModAbsorbDonePercent, "Mod Absorb Done Percent", SemanticSupport::Generic, "source-side absorb amount multiplier", None),
369    aura(AuraSubtypeKind::ModAbsorbReceivedPercent, "Mod Absorb Received Percent", SemanticSupport::Generic, "target-side absorb amount multiplier", None),
370    aura(AuraSubtypeKind::ModManaCostPercent, "Mod Mana Cost Percent", SemanticSupport::Generic, "active, passive, and externally sourced player mana-cost resolution", None),
371    aura(AuraSubtypeKind::ModPetDamageDone, "Mod Pet Damage Done", SemanticSupport::Generic, "passive damage resolution", None),
372    aura(AuraSubtypeKind::ModLeechPercent, "Mod Leech Percent", SemanticSupport::Generic, "damage-to-self-healing percentage", None),
373    aura(AuraSubtypeKind::ModRechargeTimeCategory, "Mod Recharge Time Category", SemanticSupport::Generic, "passive cooldown resolution", None),
374    aura(AuraSubtypeKind::ModRechargeTimePercentCategory, "Mod Recharge Time Percent Category", SemanticSupport::Generic, "passive cooldown resolution", None),
375    aura(AuraSubtypeKind::RootRespectsThreatTable, "Root Respects Threat Table", SemanticSupport::Generic, "target-generic root state; the Patchwerk target model has no threat-table branch", None),
376    aura(AuraSubtypeKind::HastedCooldownCategory, "Hasted Cooldown Category", SemanticSupport::Generic, "passive cooldown resolution", None),
377    aura(AuraSubtypeKind::ModBonusStatPercent, "Modify Bonus Stat Percent", SemanticSupport::Generic, "active non-create stat-gain percentage resolved by DBC stat selector", None),
378    aura(AuraSubtypeKind::TriggerSpellBasedOnHealthPercent, "Trigger Spell Based on Health Percent", SemanticSupport::Generic, "active affected-actor health crossing casts the DBC trigger spell", None),
379    aura(AuraSubtypeKind::ModTimeRateLabel, "Modify Time Rate for Spells in Label", SemanticSupport::Generic, "active label-scoped wall-clock aura duration and periodic cadence reprojection", None),
380    aura(AuraSubtypeKind::ModVersatilityPercent, "Mod Versatility Percent", SemanticSupport::Generic, "passive stat resolution", None),
381    aura(AuraSubtypeKind::TriggerSpellOnExpire, "Trigger Spell On Expire", SemanticSupport::Generic, "natural aura expiry schedules the DBC trigger spell with its caster coordinate", None),
382    aura(AuraSubtypeKind::IgnoreSpellChargeCooldown, "Ignore Spell Charge Cooldown", SemanticSupport::Generic, "active charge-category consumption bypass", None),
383    aura(AuraSubtypeKind::ModGuardianDamageDonePercent, "Mod Guardian Damage Done Percent", SemanticSupport::Generic, "passive guardian damage resolution", None),
384    aura(AuraSubtypeKind::ModDamageTakenFromCasterSpellsLabel, "Mod Damage Taken From Caster Spells Label", SemanticSupport::Generic, "active target aura resolves its DBC spell label in the damage pipeline", None),
385];
386
387const fn aura(
388    kind: AuraSubtypeKind,
389    name: &'static str,
390    support: SemanticSupport,
391    handler: &'static str,
392    modifier: Option<(ModifierOperation, ModifierFilter)>,
393) -> AuraSubtypeSemantic {
394    AuraSubtypeSemantic {
395        kind,
396        name,
397        support,
398        handler,
399        modifier,
400    }
401}