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.iter().filter(|a| ctx.is_aura_active(a.raw())).count()
29}
30
31pub(crate) fn roll_the_bones_hook(ctx: &mut HookCtx<'_>) {
32 let cfg = outlaw_config(ctx);
33
34 for aura in RTB_AURAS {
35 ctx.consume_aura(aura.raw());
36 }
37
38 let mut count = roll_tier(ctx.rng(), &RTB_TIER_THRESHOLDS) + 1;
39
40 if cfg.sleight_of_hand_chance > 0.0
41 && count < SLEIGHT_OF_HAND_TIER_CAP
42 && proc_chance(ctx.rng(), cfg.sleight_of_hand_chance)
43 {
44 count += 1;
45 }
46
47 if ctx.consume_aura(AURA_LOADED_DICE.raw()) {
48 count += 1;
49 }
50
51 let count = count.min(RTB_BUFF_COUNT);
52
53 for aura in &RTB_AURAS[..count] {
55 ctx.apply_aura(aura.raw());
56 }
57}
58
59pub(crate) fn keep_it_rolling_hook(ctx: &mut HookCtx<'_>) {
60 for aura in RTB_AURAS {
61 if ctx.is_aura_active(aura.raw()) {
62 ctx.apply_aura(aura.raw());
63 }
64 }
65}