Skip to main content

wowlab_engine_combat/systems/damage_pipeline/setup/
passive_damage.rs

1use crate::{
2    state::CombatInstance,
3    systems::damage_pipeline::{BoundDamageRequest, DamageFlags},
4};
5
6#[derive(Clone, Copy)]
7pub(super) struct PassiveDamageAdjustments {
8    pub(super) damage_mult: f64,
9    pub(super) direct_flat: f64,
10    pub(super) crit_chance: f64,
11    pub(super) crit_chance_mult: f64,
12    pub(super) power_coefficient_add: f64,
13}
14
15pub(super) fn passive_damage_adjustments(
16    program: &crate::state::CombatProgram,
17    _state: &CombatInstance,
18    request: &BoundDamageRequest,
19    mastery: f64,
20) -> PassiveDamageAdjustments {
21    let is_periodic = request.flags.contains(DamageFlags::PERIODIC);
22    let ignore_player = request
23        .flags
24        .contains(DamageFlags::IGNORE_PLAYER_MULTIPLIERS);
25    let effect = program.damage.effect_at(request.binding.effect);
26    let modifiers = program.damage.action_at(effect.action).passive;
27
28    PassiveDamageAdjustments {
29        damage_mult: if is_periodic {
30            modifiers.periodic_damage_mult
31        } else {
32            modifiers.direct_damage_mult
33        },
34        direct_flat: if is_periodic || ignore_player {
35            0.0
36        } else {
37            modifiers.direct_damage_flat + modifiers.direct_damage_flat_mastery * mastery
38        },
39        crit_chance: modifiers.crit_chance_bonus,
40        crit_chance_mult: modifiers.crit_chance_mult,
41        power_coefficient_add: if ignore_player {
42            0.0
43        } else {
44            program
45                .damage
46                .effect_at(request.binding.effect)
47                .power_coefficient_mastery_add
48                * mastery
49        },
50    }
51}