wowlab_engine_content/hooks/affliction_warlock/
config.rs1use 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}