wowlab_engine_content/hooks/outlaw_rogue/
restless_blades.rs1use 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}