Skip to main content

wowlab_engine_content/hooks/outlaw_rogue/
roll_the_bones.rs

1use 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
21// Cumulative Roll the Bones tier distribution: 55%/30%/10%/5%.
22const RTB_TIER_THRESHOLDS: [f64; 3] = [0.55, 0.85, 0.95];
23
24// Sleight of Hand can promote a roll only through the third tier.
25const 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    // #t(block: rust_unchecked_indexing) count is 1..=RTB_BUFF_COUNT, RTB_AURAS has RTB_BUFF_COUNT elements
54    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}