Skip to main content

wowlab_engine_content/hooks/affliction_warlock/
config.rs

1use wowlab_engine_ports::HandlerParams;
2
3use wowlab_engine_domain::dbc::ResolvedGameDataEffectExt as _;
4use wowlab_types::constants::HUNDRED;
5
6use crate::generated::specs::affliction_warlock::{EFFECT, SET_BONUS, TALENT};
7
8#[derive(Clone, Copy, Debug, Default)]
9#[expect(
10    clippy::struct_excessive_bools,
11    reason = "these flags represent independent Affliction talent selections"
12)]
13pub(super) struct AfflictionConfig {
14    pub(super) demoniacs_fervor: bool,
15    pub(super) manifested_avarice: bool,
16    pub(super) soul_anathema: bool,
17    pub(super) shadow_of_nathreza_rank: u8,
18    pub(super) shadow_of_death: bool,
19    pub(super) mid2_2pc: bool,
20    pub(super) mid2_4pc: bool,
21    pub(super) mid2_corruption_mult: f64,
22    pub(super) mid2_agony_mult: f64,
23    pub(super) mid2_seed_effectiveness: f64,
24    pub(super) impetuous_normal_mult: f64,
25    pub(super) impetuous_haunt_mult: f64,
26    pub(super) impetuous_dark_harvest_mult: f64,
27    pub(super) impetuous_dark_harvest_haunt_mult: f64,
28}
29
30#[derive(Clone, Copy, Debug, Default)]
31pub(super) struct AfflictionRuntime {
32    pub(super) manifested_avarice_attempts: u32,
33    pub(super) dark_harvest_ticks: u8,
34}
35
36pub(super) fn affliction_config(params: &HandlerParams<'_>) -> AfflictionConfig {
37    let shadow_of_nathreza_rank = params.talent_ranks(TALENT::SHADOW_OF_NATHREZA);
38
39    AfflictionConfig {
40        demoniacs_fervor: params.talent_picked(TALENT::DEMONIACS_FERVOR),
41        manifested_avarice: params.talent_picked(TALENT::MANIFESTED_AVARICE),
42        soul_anathema: params.talent_picked(TALENT::SOUL_ANATHEMA),
43        shadow_of_nathreza_rank,
44        shadow_of_death: params.talent_picked(TALENT::SHADOW_OF_DEATH),
45        mid2_2pc: params
46            .set_bonus_auras
47            .contains(&SET_BONUS::MID2_AFFLICTION_2PC),
48        mid2_4pc: params
49            .set_bonus_auras
50            .contains(&SET_BONUS::MID2_AFFLICTION_4PC),
51        mid2_corruption_mult: 1.0
52            + params
53                .game_data
54                .effect_base_points(EFFECT::MID2_AFFLICTION_2PC_CORRUPTION)
55                / HUNDRED,
56        mid2_agony_mult: 1.0
57            + params
58                .game_data
59                .effect_base_points(EFFECT::MID2_AFFLICTION_2PC_AGONY)
60                / HUNDRED,
61        mid2_seed_effectiveness: params
62            .game_data
63            .effect_base_points(EFFECT::MID2_AFFLICTION_4PC_SEED)
64            / HUNDRED,
65        impetuous_normal_mult: if params.talent_picked(TALENT::IMPETUOUS_WRATH) {
66            1.0 + params
67                .game_data
68                .effect_base_points(EFFECT::IMPETUOUS_WRATH_NORMAL)
69                / HUNDRED
70        } else {
71            1.0
72        },
73        impetuous_haunt_mult: if params.talent_picked(TALENT::IMPETUOUS_WRATH) {
74            1.0 + params
75                .game_data
76                .effect_base_points(EFFECT::IMPETUOUS_WRATH_HAUNT)
77                / HUNDRED
78        } else {
79            1.0
80        },
81        impetuous_dark_harvest_mult: if params.talent_picked(TALENT::IMPETUOUS_WRATH) {
82            1.0 + params
83                .game_data
84                .effect_base_points(EFFECT::IMPETUOUS_WRATH_DARK_HARVEST)
85                / HUNDRED
86        } else {
87            1.0
88        },
89        impetuous_dark_harvest_haunt_mult: if params.talent_picked(TALENT::IMPETUOUS_WRATH) {
90            1.0 + params
91                .game_data
92                .effect_base_points(EFFECT::IMPETUOUS_WRATH_DARK_HARVEST_HAUNT)
93                / HUNDRED
94        } else {
95            1.0
96        },
97    }
98}