Skip to main content

wowlab_engine_content/hooks/outlaw_rogue/
restless_blades.rs

1use wowlab_engine_combat::CooldownOps as _;
2use wowlab_engine_combat::ResourceOps as _;
3use wowlab_engine_combat::ProcOps as _;
4use wowlab_engine_combat::AuraOps as _;
5use wowlab_engine_combat::{HookCtx, LocalSpellIdx};
6use wowlab_engine_rng::proc_chance;
7
8use crate::generated::specs::outlaw_rogue::{
9    AURA_DEADLY_PURSUIT_CDR, AURA_DEADLY_PURSUIT_WAIT, SPELL_ADRENALINE_RUSH,
10    SPELL_BETWEEN_THE_EYES, SPELL_BLADE_FLURRY, SPELL_BLADE_RUSH, SPELL_KEEP_IT_ROLLING,
11    SPELL_KILLING_SPREE, SPELL_ROLL_THE_BONES, TALENT,
12};
13
14use super::{config::outlaw_config, roll_the_bones::rtb_tier};
15
16const RTB_TIER_CDR_BONUS: usize = 3;
17const DEADLY_PURSUIT_THRESHOLD: u32 = 15;
18
19#[rustfmt::skip]
20const RESTLESS_BLADES_TARGETS: [LocalSpellIdx; 7] = [
21    SPELL_ADRENALINE_RUSH,
22    SPELL_BETWEEN_THE_EYES,
23    SPELL_BLADE_FLURRY,
24    SPELL_BLADE_RUSH,
25    SPELL_KEEP_IT_ROLLING,
26    SPELL_KILLING_SPREE,
27    SPELL_ROLL_THE_BONES,
28];
29
30pub(super) fn on_finisher(ctx: &mut HookCtx<'_>) {
31    let cfg = outlaw_config(ctx);
32    let cp = ctx.last_secondary_spent();
33
34    if cp <= 0.0 {
35        return;
36    }
37
38    if cfg.restless_blades_cdr_ms_per_cp > 0 {
39        let mut cdr = f64::from(cfg.restless_blades_cdr_ms_per_cp) * cp;
40
41        if rtb_tier(ctx) >= RTB_TIER_CDR_BONUS {
42            cdr *= 1.0 + cfg.restless_blades_rtb_bonus;
43        }
44
45        let cdr_ms = wowlab_types::numeric::f64_to_u32_saturating_trunc(cdr);
46
47        for target in RESTLESS_BLADES_TARGETS {
48            ctx.reduce_cooldown(target.raw(), cdr_ms);
49        }
50    }
51
52    if cfg.ruthlessness_cp_per_cp > 0.0 {
53        let expected = cfg.ruthlessness_cp_per_cp * cp;
54        let mut refund = expected.floor();
55        let remainder = expected - refund;
56
57        if remainder > 0.0 && proc_chance(ctx.rng(), remainder) {
58            refund += 1.0;
59        }
60
61        if refund > 0.0 {
62            ctx.gain_secondary_resource(refund);
63        }
64    }
65
66    if cfg.has_deadly_pursuit {
67        if ctx.is_aura_active(AURA_DEADLY_PURSUIT_CDR.raw()) {
68            ctx.consume_aura(AURA_DEADLY_PURSUIT_CDR.raw());
69        } else if ctx.is_aura_active(AURA_DEADLY_PURSUIT_WAIT.raw()) {
70            ctx.apply_aura(AURA_DEADLY_PURSUIT_WAIT.raw());
71        } else {
72            let combo_points = wowlab_types::numeric::f64_to_u32_saturating_trunc(cp);
73
74            if ctx.advance_proc_counter_by(
75                TALENT::DEADLY_PURSUIT,
76                combo_points,
77                DEADLY_PURSUIT_THRESHOLD,
78            ) {
79                ctx.apply_aura(AURA_DEADLY_PURSUIT_WAIT.raw());
80            }
81        }
82    }
83}