wowlab_engine_combat/systems/damage_pipeline/setup/
passive_damage.rs1use 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}