wowlab_engine_domain/dbc/
live_modifier.rs1use crate::dbc::semantics::{
8 AuraSubtypeKind, ModifierOperation, ModifierPropertyKind, aura_subtype_is_any,
9 aura_subtype_modifier, modifier_property_is,
10};
11
12#[derive(Clone, Copy, Debug, Eq, PartialEq)]
14#[non_exhaustive]
15pub enum LiveDamageModifierKind {
16 SpellDirectAmount,
18 SpellPeriodicAmount,
20 SpellCritChance,
22 SpellCritDamage,
24 DamageTakenFromCasterSpells,
26}
27
28#[must_use]
32pub fn live_damage_modifier(subtype: i32, property: i32) -> Option<LiveDamageModifierKind> {
33 if aura_subtype_is_any(
34 subtype,
35 &[
36 AuraSubtypeKind::ModDamageTakenFromCasterSpells,
37 AuraSubtypeKind::ModDamageTakenFromCasterSpellsLabel,
38 ],
39 ) {
40 return Some(LiveDamageModifierKind::DamageTakenFromCasterSpells);
41 }
42
43 let (operation, _) = aura_subtype_modifier(subtype)?;
44 let is_percent = operation == ModifierOperation::Percent;
45
46 if modifier_property_is(property, ModifierPropertyKind::CritChance) {
47 return Some(LiveDamageModifierKind::SpellCritChance);
48 }
49
50 if !is_percent {
51 return None;
52 }
53
54 if modifier_property_is(property, ModifierPropertyKind::CritDamage) {
55 return Some(LiveDamageModifierKind::SpellCritDamage);
56 }
57
58 if modifier_property_is(property, ModifierPropertyKind::GenericDamage) {
59 return Some(LiveDamageModifierKind::SpellDirectAmount);
60 }
61
62 if modifier_property_is(property, ModifierPropertyKind::PeriodicAmount) {
63 return Some(LiveDamageModifierKind::SpellPeriodicAmount);
64 }
65
66 None
67}
68
69#[cfg(test)]
70mod tests;