From b33bddf5e83dc95581434a7e581a441349527a10 Mon Sep 17 00:00:00 2001 From: Azevara <46403881+Azevara@users.noreply.github.com> Date: Mon, 22 Jul 2024 23:07:39 -0400 Subject: [PATCH] [Warlock] Cloven Souls and Diabolist tweaks (#9078) * Quick fix for Hand of Guldan Demonic Art procs * Implement Cloven Souls * Remove energy consumption from ritual demons --- engine/class_modules/warlock/sc_warlock.cpp | 9 +++++++++ engine/class_modules/warlock/sc_warlock.hpp | 4 ++++ .../class_modules/warlock/sc_warlock_actions.cpp | 3 ++- engine/class_modules/warlock/sc_warlock_init.cpp | 3 +++ engine/class_modules/warlock/sc_warlock_pets.cpp | 14 +++++++++++++- 5 files changed, 31 insertions(+), 2 deletions(-) diff --git a/engine/class_modules/warlock/sc_warlock.cpp b/engine/class_modules/warlock/sc_warlock.cpp index a81222d5084..a6fb01e13c9 100644 --- a/engine/class_modules/warlock/sc_warlock.cpp +++ b/engine/class_modules/warlock/sc_warlock.cpp @@ -98,6 +98,9 @@ warlock_td_t::warlock_td_t( player_t* target, warlock_t& p ) range::for_each( p.havoc_spells, []( action_t* a ) { a->target_cache.is_valid = false; } ); } ); + // Diabolist + debuffs_cloven_soul = make_buff( *this, "cloven_soul", p.hero.cloven_soul_debuff ); + target->register_on_demise_callback( &p, [ this ]( player_t* ) { target_demise(); } ); } @@ -250,6 +253,9 @@ double warlock_t::composite_player_target_multiplier( player_t* target, school_e m *= 1.0 + td->debuffs_fel_sunder->check_stack_value(); } + if ( hero.cloven_souls.ok() && td->debuffs_cloven_soul->check() ) + m *= 1.0 + hero.cloven_soul_debuff->effectN( 1 ).percent(); + return m; } @@ -335,6 +341,9 @@ double warlock_t::composite_player_target_pet_damage_multiplier( player_t* targe m *= 1.0 + td->debuffs_fel_sunder->check_stack_value(); } + if ( hero.cloven_souls.ok() && td->debuffs_cloven_soul->check() ) + m *= 1.0 + hero.cloven_soul_debuff->effectN( guardian ? 3 : 2 ).percent(); + return m; } diff --git a/engine/class_modules/warlock/sc_warlock.hpp b/engine/class_modules/warlock/sc_warlock.hpp index 83be1f28435..c3b9d383e25 100644 --- a/engine/class_modules/warlock/sc_warlock.hpp +++ b/engine/class_modules/warlock/sc_warlock.hpp @@ -65,6 +65,9 @@ struct warlock_td_t : public actor_target_data_t propagate_const debuffs_pyrogenics; propagate_const debuffs_conflagrate; + // Diabolist + propagate_const debuffs_cloven_soul; + double soc_threshold; // Aff - Seed of Corruption counts damage from cross-spec spells such as Drain Life warlock_t& warlock; @@ -472,6 +475,7 @@ struct warlock_t : public player_t const spell_data_t* felseeker_dmg; player_talent_t cloven_souls; + const spell_data_t* cloven_soul_debuff; player_talent_t touch_of_rancora; player_talent_t secrets_of_the_coven; // TODO: Sargerei Technique, Dark Virtuosity, Nightfall, Imp. Shadow Bolt, Sacrificed Souls, Rune of Shadows, Demonic Calling?, Backdraft, Roaring Blaze, Indiscriminate Flames, Emberstorm, Fire and Brimstone?, Burn to Ashes, Diabolic Embers, Dimension Ripper diff --git a/engine/class_modules/warlock/sc_warlock_actions.cpp b/engine/class_modules/warlock/sc_warlock_actions.cpp index 9eaff3c8961..c075e58888d 100644 --- a/engine/class_modules/warlock/sc_warlock_actions.cpp +++ b/engine/class_modules/warlock/sc_warlock_actions.cpp @@ -1882,6 +1882,7 @@ using namespace helpers; dual = true; triggers.shadow_invocation = true; + triggers.demonic_art = true; if ( p->talents.umbral_blaze.ok() ) { @@ -1935,7 +1936,7 @@ using namespace helpers; : warlock_spell_t( "Hand of Gul'dan", p, p->warlock_base.hand_of_guldan, options_str ), impact_spell( new hog_impact_t( p ) ) { - triggers.diabolic_ritual = triggers.demonic_art = true; + triggers.diabolic_ritual = true; add_child( impact_spell ); } diff --git a/engine/class_modules/warlock/sc_warlock_init.cpp b/engine/class_modules/warlock/sc_warlock_init.cpp index de7da7bde2c..ea609d74c1e 100644 --- a/engine/class_modules/warlock/sc_warlock_init.cpp +++ b/engine/class_modules/warlock/sc_warlock_init.cpp @@ -489,6 +489,9 @@ namespace warlock hero.felseeker = find_spell( 438973 ); hero.felseeker_dmg = find_spell( 434404 ); + hero.cloven_souls = find_talent_spell( talent_tree::HERO, "Cloven Souls" ); // Should be ID 428517 + hero.cloven_soul_debuff = find_spell( 434424 ); + warlock_pet_list.overlords.set_default_duration( hero.summon_overlord->duration() ); warlock_pet_list.mothers.set_default_duration( hero.summon_mother->duration() ); warlock_pet_list.pit_lords.set_default_duration( hero.summon_pit_lord->duration() ); diff --git a/engine/class_modules/warlock/sc_warlock_pets.cpp b/engine/class_modules/warlock/sc_warlock_pets.cpp index 0145c077d5a..ce78bf03841 100644 --- a/engine/class_modules/warlock/sc_warlock_pets.cpp +++ b/engine/class_modules/warlock/sc_warlock_pets.cpp @@ -2162,6 +2162,14 @@ namespace diabolist debug_cast( p() )->cleaves--; } + + void impact( action_state_t* s ) override + { + warlock_pet_spell_t::impact( s ); + + if ( p()->o()->hero.cloven_souls.ok() ) + owner_td( s->target )->debuffs_cloven_soul->trigger(); + } }; void overlord_t::arise() @@ -2203,7 +2211,10 @@ namespace diabolist { chaos_salvo_t( warlock_pet_t* p ) : warlock_pet_spell_t( "Chaos Salvo", p, p->o()->hero.chaos_salvo ) - { tick_action = new chaos_salvo_tick_t( p ); } + { + base_costs_per_tick[ RESOURCE_ENERGY ] = 0.0; + + tick_action = new chaos_salvo_tick_t( p ); } bool ready() override { @@ -2251,6 +2262,7 @@ namespace diabolist { background = dual = true; aoe = -1; + base_costs[ RESOURCE_ENERGY ] = 0.0; } };