wowlab_engine_content/hooks/outlaw_rogue/
roll_the_bones.rs1use wowlab_engine_combat::AuraOps as _;
2use wowlab_engine_combat::{HookCtx, LocalAuraIdx};
3use wowlab_engine_rng::{proc_chance, roll_tier};
4
5use crate::generated::specs::outlaw_rogue::{
6 AURA_DOUBLE_TROUBLE, AURA_JACKPOT, AURA_LOADED_DICE, AURA_ONE_OF_A_KIND, AURA_TRIPLE_THREAT,
7};
8
9use super::config::outlaw_config;
10
11const RTB_BUFF_COUNT: usize = 4;
12
13#[rustfmt::skip]
14const RTB_AURAS: [LocalAuraIdx; RTB_BUFF_COUNT] = [
15 AURA_ONE_OF_A_KIND,
16 AURA_DOUBLE_TROUBLE,
17 AURA_TRIPLE_THREAT,
18 AURA_JACKPOT,
19];
20
21const RTB_TIER_THRESHOLDS: [f64; 3] = [0.55, 0.85, 0.95];
23
24const SLEIGHT_OF_HAND_TIER_CAP: usize = 3;
26
27pub(super) fn rtb_tier(ctx: &HookCtx<'_>) -> usize {
28 RTB_AURAS
29 .iter()
30 .filter(|a| ctx.is_aura_active(**a))
31 .count()
32}
33
34pub(crate) fn roll_the_bones_hook(ctx: &mut HookCtx<'_>) {
35 let cfg = outlaw_config(ctx);
36
37 for aura in RTB_AURAS {
38 ctx.consume_aura(aura);
39 }
40
41 let mut count = roll_tier(ctx.rng(), &RTB_TIER_THRESHOLDS) + 1;
42
43 if cfg.sleight_of_hand_chance > 0.0
44 && count < SLEIGHT_OF_HAND_TIER_CAP
45 && proc_chance(ctx.rng(), cfg.sleight_of_hand_chance)
46 {
47 count += 1;
48 }
49
50 if ctx.consume_aura(AURA_LOADED_DICE) {
51 count += 1;
52 }
53
54 let count = count.min(RTB_BUFF_COUNT);
55
56 for aura in &RTB_AURAS[..count] {
58 ctx.apply_aura(*aura);
59 }
60}
61
62pub(crate) fn keep_it_rolling_hook(ctx: &mut HookCtx<'_>) {
63 for aura in RTB_AURAS {
64 if ctx.is_aura_active(aura) {
65 ctx.apply_aura(aura);
66 }
67 }
68}