Skip to main content

wowlab_engine_application/game_data/passives/
crit.rs

1use wowlab_engine_gamedata::ResolvedGameDataBuilder;
2
3/// Reads every crit-damage term the folded passives state as a share of the caster's crit chance.
4pub(crate) fn resolve_crit_chance_scaled_crit_damage(
5    passives: &[wowlab_engine_domain::dbc::RankedPassive],
6) -> Vec<wowlab_engine_domain::dbc::CritChanceScaledCritDamage> {
7    let mut terms = Vec::new();
8
9    for (spell, ranks) in passives {
10        let Some(source_effect) =
11            wowlab_parsers::spell_desc_crit_chance_scaled_effect_index(&spell.description)
12        else {
13            continue;
14        };
15        let resolved =
16            wowlab_engine_domain::dbc::crit_chance_scaled_crit_damage(spell, source_effect, *ranks);
17
18        for term in &resolved {
19            // #t(rust_log_in_loop) one line per term is the only record of a value the DBC ships at zero
20            tracing::debug!(
21                spell_id = spell.id,
22                spell_name = spell.name.as_str(),
23                source_effect,
24                percent = term.percent,
25                axis = ?term.axis,
26                "resolved crit damage scaled by the caster's own critical strike chance"
27            );
28        }
29
30        terms.extend(resolved);
31    }
32
33    terms
34}
35
36/// Publishes the player-wide half of the crit-chance-scaled terms, keyed by DBC school mask.
37// #t(fn: rust_builder_param) this mutates the resolved-data accumulator; it is not a factory.
38pub(super) fn apply_crit_chance_scaled_player_axis(
39    builder: &mut ResolvedGameDataBuilder,
40    terms: &[wowlab_engine_domain::dbc::CritChanceScaledCritDamage],
41) {
42    for term in terms {
43        if let wowlab_engine_domain::dbc::CritChanceScaledAxis::Player(schools) = term.axis {
44            builder.push_crit_damage_per_crit_chance(i32::from(schools.bits()), term.percent);
45        }
46    }
47}