wowlab_engine_content/hooks/outlaw_rogue/
procs.rs1use 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#[must_use]
80pub(crate) const fn mastery(_ctx: &MasteryCtx<'_>) -> f64 {
81 1.0
82}