wowlab_engine_combat/systems/damage_pipeline/setup/
passive_damage.rs1use wowlab_types::sim::SpellIdx;
2
3use crate::{
4 state::CombatState,
5 systems::damage_pipeline::{DamageFlags, DamageRequest},
6};
7
8pub(super) struct PassiveDamageAdjustments {
9 pub(super) spell: SpellIdx,
10 pub(super) damage_mult: f64,
11 pub(super) direct_flat: f64,
12 pub(super) crit_chance: f64,
13 pub(super) crit_chance_mult: f64,
14 pub(super) power_coefficient_add: f64,
15}
16
17pub(super) fn passive_damage_adjustments(
18 state: &CombatState,
19 request: &DamageRequest,
20 mastery: f64,
21) -> PassiveDamageAdjustments {
22 let is_periodic = request.flags.contains(DamageFlags::PERIODIC);
23 let ignore_player = request
24 .flags
25 .contains(DamageFlags::IGNORE_PLAYER_MULTIPLIERS);
26 let spell = SpellIdx::from_raw(request.effect.spell_id);
27 let data = &state.config.game_data;
28
29 PassiveDamageAdjustments {
30 spell,
31 damage_mult: data.passive_damage_mult(spell, is_periodic),
32 direct_flat: if is_periodic || ignore_player {
33 0.0
34 } else {
35 data.passive_direct_damage_flat(spell, mastery)
36 },
37 crit_chance: data.passive_crit_chance(spell),
38 crit_chance_mult: data.passive_crit_chance_mult(spell),
39 power_coefficient_add: if ignore_player {
40 0.0
41 } else {
42 data.power_coefficient_mastery_add(spell, request.effect.effect_index) * mastery
43 },
44 }
45}