Skip to content
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 25 additions & 1 deletion engine/class_modules/sc_demon_hunter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -916,6 +916,7 @@ class demon_hunter_t : public parse_player_effects_t
const spell_data_t* thrill_of_the_fight_haste_buff;
const spell_data_t* thrill_of_the_fight_damage_buff;
double wounded_quarry_proc_rate;
std::array<double, 3> voidfall_proc_chances;

// Annihilator
const spell_data_t* voidfall_meteor;
Expand Down Expand Up @@ -1215,6 +1216,15 @@ class demon_hunter_t : public parse_player_effects_t
double wounded_quarry_chance_vengeance = 0.30;
// Proc rate for Wounded Quarry for Havoc
double wounded_quarry_chance_havoc = 0.10;
// Voidfall proc rate per building stack count (WCL analysis, ~72k casts).
// Fits rate = base - k*sqrt(stacks) within 0.5pp, but no spell data
// parameterizes the decay, so these are likely server-side lookup tables.
double voidfall_proc_chance_0_stacks_vengeance = 0.385;
double voidfall_proc_chance_1_stacks_vengeance = 0.325;
double voidfall_proc_chance_2_stacks_vengeance = 0.30;
double voidfall_proc_chance_0_stacks_havoc = 0.41;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these should be devourer

double voidfall_proc_chance_1_stacks_havoc = 0.34;
double voidfall_proc_chance_2_stacks_havoc = 0.325;
// How many seconds that Vengeful Retreat locks out Felblade
double felblade_lockout_from_vengeful_retreat = 0.6;
bool enable_dungeon_slice = false;
Expand Down Expand Up @@ -2948,7 +2958,8 @@ struct voidfall_building_trigger_t : public BASE
if ( !BASE::p()->talent.annihilator.voidfall->ok() )
return;

if ( !BASE::rng().roll( BASE::p()->talent.annihilator.voidfall->effectN( 3 ).percent() ) )
int stacks = std::min( BASE::p()->buff.voidfall_building->check(), 2 );
if ( !BASE::rng().roll( BASE::p()->hero_spec.voidfall_proc_chances[ stacks ] ) )
return;

// can't gain building while spending is up
Expand Down Expand Up @@ -10113,6 +10124,12 @@ void demon_hunter_t::create_options()
opt_float( "soul_fragment_movement_consume_chance", options.soul_fragment_movement_consume_chance, 0, 1 ) );
add_option( opt_float( "wounded_quarry_chance_vengeance", options.wounded_quarry_chance_vengeance, 0, 1 ) );
add_option( opt_float( "wounded_quarry_chance_havoc", options.wounded_quarry_chance_havoc, 0, 1 ) );
add_option( opt_float( "voidfall_proc_chance_0_stacks_vengeance", options.voidfall_proc_chance_0_stacks_vengeance, 0, 1 ) );
add_option( opt_float( "voidfall_proc_chance_1_stacks_vengeance", options.voidfall_proc_chance_1_stacks_vengeance, 0, 1 ) );
add_option( opt_float( "voidfall_proc_chance_2_stacks_vengeance", options.voidfall_proc_chance_2_stacks_vengeance, 0, 1 ) );
add_option( opt_float( "voidfall_proc_chance_0_stacks_havoc", options.voidfall_proc_chance_0_stacks_havoc, 0, 1 ) );

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

add_option( opt_float( "voidfall_proc_chance_1_stacks_havoc", options.voidfall_proc_chance_1_stacks_havoc, 0, 1 ) );
add_option( opt_float( "voidfall_proc_chance_2_stacks_havoc", options.voidfall_proc_chance_2_stacks_havoc, 0, 1 ) );
add_option(
opt_float( "felblade_lockout_from_vengeful_retreat", options.felblade_lockout_from_vengeful_retreat, 0, 1 ) );
add_option( opt_bool( "enable_dungeon_slice", options.enable_dungeon_slice ) );
Expand Down Expand Up @@ -10981,20 +10998,27 @@ void demon_hunter_t::init_spells()
hero_spec.meteor_shower_driver = talent_spell_lookup( talent.annihilator.dark_matter, 1264126 );
hero_spec.meteor_shower_damage = hero_spec.meteor_shower_driver->effectN( 1 ).trigger();
hero_spec.world_killer = talent_spell_lookup( talent.annihilator.world_killer, 1256618 );
hero_spec.voidfall_proc_chances = { options.voidfall_proc_chance_0_stacks_havoc,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

options.voidfall_proc_chance_1_stacks_havoc,
options.voidfall_proc_chance_2_stacks_havoc };
break;
case DEMON_HUNTER_VENGEANCE:
hero_spec.voidfall_meteor = talent_spell_lookup( talent.annihilator.voidfall, 1256303 );
hero_spec.catastrophe_dot = talent_spell_lookup( talent.annihilator.catastrophe, 1256667 );
hero_spec.meteor_shower_driver = talent_spell_lookup( talent.annihilator.dark_matter, 1264128 );
hero_spec.meteor_shower_damage = hero_spec.meteor_shower_driver->effectN( 1 ).trigger();
hero_spec.world_killer = talent_spell_lookup( talent.annihilator.world_killer, 1256616 );
hero_spec.voidfall_proc_chances = { options.voidfall_proc_chance_0_stacks_vengeance,
options.voidfall_proc_chance_1_stacks_vengeance,
options.voidfall_proc_chance_2_stacks_vengeance };
break;
default:
hero_spec.voidfall_meteor = spell_data_t::not_found();
hero_spec.catastrophe_dot = spell_data_t::not_found();
hero_spec.meteor_shower_driver = spell_data_t::not_found();
hero_spec.meteor_shower_damage = spell_data_t::not_found();
hero_spec.world_killer = spell_data_t::not_found();
hero_spec.voidfall_proc_chances = { 0, 0, 0 };
break;
}

Expand Down