Skip to main content

wowlab_engine_content/hooks/outlaw_rogue/
procs.rs

1use wowlab_engine_combat::DamageOps as _;
2use wowlab_engine_combat::ResourceOps as _;
3use wowlab_engine_combat::AuraOps as _;
4use wowlab_engine_combat::{DamageFlags, HookCtx, MasteryCtx};
5use wowlab_engine_domain::dbc::ResolvedGameDataEffectExt as _;
6use wowlab_engine_rng::proc_chance;
7use wowlab_types::sim::SpellIdx;
8
9use crate::generated::specs::outlaw_rogue::{AURA_OPPORTUNITY, EFFECT, REPORTED_SPELL};
10
11use super::{config::outlaw_config, roll_the_bones::rtb_tier};
12
13const OPPORTUNITY_BASE_CHANCE: f64 = 0.30;
14const OPPORTUNITY_RTB_BONUS: f64 = 0.20;
15const INSTANT_POISON_CHANCE: f64 = 0.30;
16
17pub(super) fn opportunity_chance(ctx: &HookCtx<'_>) -> f64 {
18    let mut chance = OPPORTUNITY_BASE_CHANCE;
19
20    if rtb_tier(ctx) >= 1 {
21        chance += OPPORTUNITY_RTB_BONUS;
22    }
23
24    chance
25}
26
27pub(super) fn proc_main_gauche(ctx: &mut HookCtx<'_>) {
28    let mastery_spell = SpellIdx::from_raw(EFFECT::MAIN_GAUCHE_MASTERY_COEF.0);
29    let Some(chance) = ctx.game_data().proc_chance(mastery_spell) else {
30        return;
31    };
32
33    if !proc_chance(ctx.rng(), chance) {
34        return;
35    }
36
37    let coef = ctx
38        .game_data()
39        .effect_ap_coefficient(EFFECT::MAIN_GAUCHE_DAMAGE)
40        + ctx.effect_points(EFFECT::MAIN_GAUCHE_MASTERY_COEF);
41
42    ctx.deal_damage_ap(REPORTED_SPELL::MAIN_GAUCHE, coef, DamageFlags::PHYSICAL);
43}
44
45pub(super) fn proc_instant_poison(ctx: &mut HookCtx<'_>) {
46    if proc_chance(ctx.rng(), INSTANT_POISON_CHANCE) {
47        let coef = ctx
48            .game_data()
49            .effect_ap_coefficient(EFFECT::INSTANT_POISON_DAMAGE);
50
51        ctx.deal_damage_ap(
52            REPORTED_SPELL::INSTANT_POISON_DAMAGE,
53            coef,
54            DamageFlags::empty(),
55        );
56    }
57}
58
59pub(super) fn proc_melee_hit(ctx: &mut HookCtx<'_>) {
60    proc_main_gauche(ctx);
61    proc_instant_poison(ctx);
62}
63
64pub(super) fn apply_opportunity(ctx: &mut HookCtx<'_>) {
65    let cfg = outlaw_config(ctx);
66
67    ctx.apply_aura_n(
68        AURA_OPPORTUNITY.raw(),
69        1 + i32::try_from(cfg.fan_the_hammer_extra).unwrap_or(i32::MAX),
70    );
71    let deal_fate = cfg.deal_fate_cp;
72
73    if deal_fate > 0.0 {
74        ctx.gain_secondary_resource(deal_fate);
75    }
76}
77
78/// Keeps Main Gauche out of the global damage multiplier path.
79#[must_use]
80pub(crate) const fn mastery(_ctx: &MasteryCtx<'_>) -> f64 {
81    1.0
82}