Skip to content

Commit 2952d3c

Browse files
committed
[DemonHunter] voidfall proc rate is stack-dependent for vengeance
WCL analysis (55,865 eligible casts) shows voidfall building proc chance decreases with current stack count, rather than being a flat rate from spell data (effectN(3) = 35%): 0 stacks: 39.8% [95% CI: 39.2-40.4%] (p<0.0001 vs 35%) 1 stack: 32.1% [95% CI: 31.4-32.7%] (p<0.0001 vs 35%) 2 stacks: 27.5% [95% CI: 26.8-28.3%] (p<0.0001 vs 35%) Vengeance only — Devourer retains the flat spell data rate pending separate WCL analysis. Defaults exposed as player options for tuning. Local sim impact on Vengeance Annihilator build: -1.14% DPS (66,349 -> 65,591), driven by fewer voidfall meteor procs (37.6 -> 36.5 per fight).
1 parent 12b2c91 commit 2952d3c

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

engine/class_modules/sc_demon_hunter.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1215,6 +1215,10 @@ class demon_hunter_t : public parse_player_effects_t
12151215
double wounded_quarry_chance_vengeance = 0.30;
12161216
// Proc rate for Wounded Quarry for Havoc
12171217
double wounded_quarry_chance_havoc = 0.10;
1218+
// Proc rate for Voidfall per current building stack count (from WCL analysis)
1219+
double voidfall_proc_chance_0_stacks = 0.40;
1220+
double voidfall_proc_chance_1_stacks = 0.32;
1221+
double voidfall_proc_chance_2_stacks = 0.275;
12181222
// How many seconds that Vengeful Retreat locks out Felblade
12191223
double felblade_lockout_from_vengeful_retreat = 0.6;
12201224
bool enable_dungeon_slice = false;
@@ -2948,7 +2952,30 @@ struct voidfall_building_trigger_t : public BASE
29482952
if ( !BASE::p()->talent.annihilator.voidfall->ok() )
29492953
return;
29502954

2951-
if ( !BASE::rng().roll( BASE::p()->talent.annihilator.voidfall->effectN( 3 ).percent() ) )
2955+
// Vengeance: proc chance decreases with current building stacks (from WCL analysis)
2956+
// Devourer: use flat spell data rate (no WCL data yet)
2957+
double proc_chance;
2958+
if ( BASE::p()->specialization() == DEMON_HUNTER_VENGEANCE )
2959+
{
2960+
int stacks = BASE::p()->buff.voidfall_building->check();
2961+
switch ( stacks )
2962+
{
2963+
case 0:
2964+
proc_chance = BASE::p()->options.voidfall_proc_chance_0_stacks;
2965+
break;
2966+
case 1:
2967+
proc_chance = BASE::p()->options.voidfall_proc_chance_1_stacks;
2968+
break;
2969+
default:
2970+
proc_chance = BASE::p()->options.voidfall_proc_chance_2_stacks;
2971+
break;
2972+
}
2973+
}
2974+
else
2975+
{
2976+
proc_chance = BASE::p()->talent.annihilator.voidfall->effectN( 3 ).percent();
2977+
}
2978+
if ( !BASE::rng().roll( proc_chance ) )
29522979
return;
29532980

29542981
// can't gain building while spending is up
@@ -10113,6 +10140,9 @@ void demon_hunter_t::create_options()
1011310140
opt_float( "soul_fragment_movement_consume_chance", options.soul_fragment_movement_consume_chance, 0, 1 ) );
1011410141
add_option( opt_float( "wounded_quarry_chance_vengeance", options.wounded_quarry_chance_vengeance, 0, 1 ) );
1011510142
add_option( opt_float( "wounded_quarry_chance_havoc", options.wounded_quarry_chance_havoc, 0, 1 ) );
10143+
add_option( opt_float( "voidfall_proc_chance_0_stacks", options.voidfall_proc_chance_0_stacks, 0, 1 ) );
10144+
add_option( opt_float( "voidfall_proc_chance_1_stacks", options.voidfall_proc_chance_1_stacks, 0, 1 ) );
10145+
add_option( opt_float( "voidfall_proc_chance_2_stacks", options.voidfall_proc_chance_2_stacks, 0, 1 ) );
1011610146
add_option(
1011710147
opt_float( "felblade_lockout_from_vengeful_retreat", options.felblade_lockout_from_vengeful_retreat, 0, 1 ) );
1011810148
add_option( opt_bool( "enable_dungeon_slice", options.enable_dungeon_slice ) );

0 commit comments

Comments
 (0)