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
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    // #t(block: rust_unchecked_indexing) count is 1..=RTB_BUFF_COUNT, RTB_AURAS has RTB_BUFF_COUNT elements
57    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}