Skip to main content

wowlab_engine_combat/systems/damage_pipeline/setup/
passive_damage.rs

1use 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}