Skip to content

Commit

Permalink
[Warlock] Abyssal Dominion (simulationcraft#9109)
Browse files Browse the repository at this point in the history
* Abyssal Dominion - Demonology

* Properly enable Diabolic Ritual

* Abyssal Dominion - Destruction
  • Loading branch information
Azevara authored Jul 26, 2024
1 parent 85f2202 commit 42085ae
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 11 deletions.
6 changes: 5 additions & 1 deletion engine/class_modules/warlock/sc_warlock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,9 @@ double warlock_t::composite_player_pet_damage_multiplier( const action_state_t*
if ( hero.flames_of_xoroth.ok() && !guardian )
m *= 1.0 + hero.flames_of_xoroth->effectN( 3 ).percent();

if ( hero.abyssal_dominion.ok() && buffs.abyssal_dominion->check() )
m *= 1.0 + hero.abyssal_dominion_buff->effectN( guardian ? 1 : 2 ).percent();

return m;
}

Expand Down Expand Up @@ -845,7 +848,8 @@ warlock::warlock_t::pets_t::pets_t( warlock_t* w )
overfiends( "overfiend", w ),
overlords( "overlord", w ),
mothers( "mother_of_chaos", w ),
pit_lords( "pit_lord", w )
pit_lords( "pit_lord", w ),
fragments( "infernal_fragment", w )
{ }
} // namespace warlock

Expand Down
7 changes: 6 additions & 1 deletion engine/class_modules/warlock/sc_warlock.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,8 @@ struct warlock_t : public player_t
spawner::pet_spawner_t<pets::diabolist::mother_of_chaos_t, warlock_t> mothers;
spawner::pet_spawner_t<pets::diabolist::pit_lord_t, warlock_t> pit_lords;

spawner::pet_spawner_t<pets::diabolist::infernal_fragment_t, warlock_t> fragments;

pets_t( warlock_t* w );
} warlock_pet_list;

Expand Down Expand Up @@ -348,7 +350,7 @@ struct warlock_t : public player_t
player_talent_t guillotine;
const spell_data_t* guillotine_pet;
const spell_data_t* fiendish_wrath_buff;
const spell_data_t* fiendish_wrath_dmg;
const spell_data_t* fiendish_wrath_dmg; // TODO: Multiplier fixes for this
const spell_data_t* fel_explosion;

// Destruction
Expand Down Expand Up @@ -486,6 +488,8 @@ struct warlock_t : public player_t

player_talent_t flames_of_xoroth; // TODO: 2024-07-25 Flames of Xoroth spell data has unexpected labels for effects 3 and 4, may be causing unintended values in game
player_talent_t abyssal_dominion;
const spell_data_t* abyssal_dominion_buff;
const spell_data_t* infernal_fragmentation; // TODO: Re-check damage of Infernal Fragments
player_talent_t gloom_of_nathreza;

player_talent_t ruination; // TODO: Backdraft, Indiscriminate Flames, Ritual of Ruin, Improved Chaos Bolt, Burn to Ashes?, Chaos Incarnate, Diabolic Ritual
Expand Down Expand Up @@ -602,6 +606,7 @@ struct warlock_t : public player_t
propagate_const<buff_t*> art_mother;
propagate_const<buff_t*> art_pit_lord;
propagate_const<buff_t*> infernal_bolt;
propagate_const<buff_t*> abyssal_dominion;
} buffs;

// Gains - Many are automatically handled
Expand Down
19 changes: 11 additions & 8 deletions engine/class_modules/warlock/sc_warlock_actions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1945,7 +1945,7 @@ using namespace helpers;
affected_by.touch_of_rancora = p->hero.touch_of_rancora.ok();

triggers.shadow_invocation = true;
triggers.demonic_art = true;
triggers.demonic_art = p->hero.diabolic_ritual.ok();

if ( p->talents.umbral_blaze.ok() )
{
Expand Down Expand Up @@ -2001,7 +2001,7 @@ using namespace helpers;
{
affected_by.touch_of_rancora = p->hero.touch_of_rancora.ok();

triggers.diabolic_ritual = true;
triggers.diabolic_ritual = p->hero.diabolic_ritual.ok();

add_child( impact_spell );
}
Expand Down Expand Up @@ -2304,7 +2304,7 @@ using namespace helpers;
{
may_crit = false;
affected_by.soul_conduit_base_cost = true;
triggers.diabolic_ritual = true;
triggers.diabolic_ritual = p->hero.diabolic_ritual.ok();
}

double cost_pct_multiplier() const override
Expand Down Expand Up @@ -2603,6 +2603,9 @@ using namespace helpers;

p()->buffs.tyrant->trigger();

if ( p()->hero.abyssal_dominion.ok() )
p()->buffs.abyssal_dominion->trigger();

if ( p()->buffs.dreadstalkers->check() )
p()->buffs.dreadstalkers->extend_duration( p(), extension_time );

Expand Down Expand Up @@ -2639,7 +2642,7 @@ using namespace helpers;
{
harmful = may_crit = false;

triggers.diabolic_ritual = true;
triggers.diabolic_ritual = p->hero.diabolic_ritual.ok();
}

void execute() override
Expand All @@ -2658,7 +2661,7 @@ using namespace helpers;
{
harmful = may_crit = false;

triggers.diabolic_ritual = true;
triggers.diabolic_ritual = p->hero.diabolic_ritual.ok();
}

void execute() override
Expand Down Expand Up @@ -2985,7 +2988,7 @@ using namespace helpers;
affected_by.chaos_incarnate = p->talents.chaos_incarnate.ok();
affected_by.touch_of_rancora = p->hero.touch_of_rancora.ok();

triggers.diabolic_ritual = triggers.demonic_art = true;
triggers.diabolic_ritual = triggers.demonic_art = p->hero.diabolic_ritual.ok();

base_dd_multiplier *= 1.0 + p->talents.improved_chaos_bolt->effectN( 1 ).percent();

Expand Down Expand Up @@ -3198,7 +3201,7 @@ using namespace helpers;

affected_by.touch_of_rancora = p->hero.touch_of_rancora.ok();

triggers.diabolic_ritual = triggers.demonic_art = true;
triggers.diabolic_ritual = triggers.demonic_art = p->hero.diabolic_ritual.ok();

base_costs[ RESOURCE_SOUL_SHARD ] += p->talents.inferno->effectN( 1 ).base_value() / 10.0;

Expand Down Expand Up @@ -3310,7 +3313,7 @@ using namespace helpers;
affected_by.chaos_incarnate = p->talents.chaos_incarnate.ok();
affected_by.touch_of_rancora = p->hero.touch_of_rancora.ok();

triggers.diabolic_ritual = triggers.demonic_art = true;
triggers.diabolic_ritual = triggers.demonic_art = p->hero.diabolic_ritual.ok();

base_dd_multiplier *= 1.0 + p->talents.blistering_atrophy->effectN( 1 ).percent();
}
Expand Down
7 changes: 7 additions & 0 deletions engine/class_modules/warlock/sc_warlock_init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -504,9 +504,14 @@ namespace warlock

hero.flames_of_xoroth = find_talent_spell( talent_tree::HERO, "Flames of Xoroth" ); // Should be ID 429657

hero.abyssal_dominion = find_talent_spell( talent_tree::HERO, "Abyssal Dominion" ); // Should be ID 429581
hero.abyssal_dominion_buff = find_spell( 456323 );
hero.infernal_fragmentation = find_spell( 456310 );

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() );
warlock_pet_list.fragments.set_default_duration( hero.infernal_fragmentation->duration() );
}

void warlock_t::init_base_stats()
Expand Down Expand Up @@ -737,6 +742,8 @@ namespace warlock
} );

buffs.infernal_bolt = make_buff( this, "infernal_bolt", hero.infernal_bolt_buff );

buffs.abyssal_dominion = make_buff( this, "Abyssal Dominion", hero.abyssal_dominion_buff );
}

void warlock_t::create_pets()
Expand Down
40 changes: 39 additions & 1 deletion engine/class_modules/warlock/sc_warlock_pets.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1618,6 +1618,8 @@ double demonic_tyrant_t::composite_player_multiplier( school_e school ) const

m *= 1.0 + buffs.reign_of_tyranny->check_stack_value();

m *= 1.0 + o()->hero.abyssal_dominion->effectN( 1 ).percent();

return m;
}

Expand Down Expand Up @@ -1695,6 +1697,8 @@ infernal_t::infernal_t( warlock_t* owner, util::string_view name )
{
resource_regeneration = regen_type::DISABLED;

primary = true;

owner_coeff.ap_from_sp = 1.65;
owner_coeff.sp_from_sp = 1.65;
}
Expand Down Expand Up @@ -1756,6 +1760,24 @@ void infernal_t::arise()
} );
}

void infernal_t::demise()
{
warlock_pet_t::demise();

if ( o()->hero.abyssal_dominion.ok() && primary )
o()->warlock_pet_list.fragments.spawn( 2u );
}

double infernal_t::composite_player_multiplier( school_e school ) const
{
double m = warlock_pet_t::composite_player_multiplier( school );

if ( o()->hero.abyssal_dominion.ok() && primary )
m *= 1.0 + o()->hero.abyssal_dominion->effectN( 3 ).percent();

return m;
}

/// Infernal End

/// Dimensional Rifts Begin
Expand Down Expand Up @@ -2135,6 +2157,8 @@ action_t* darkglare_t::create_action( util::string_view name, util::string_view

namespace diabolist
{
/// Diabolic Ritual Demons Begin

overlord_t::overlord_t( warlock_t* owner, util::string_view name )
: warlock_pet_t( owner, name, PET_WARLOCK_RANDOM, true )
{
Expand Down Expand Up @@ -2305,6 +2329,20 @@ namespace diabolist

return warlock_pet_t::create_action( name, options_str );
}
}

/// Diabolic Ritual Demons End

/// Infernal Fragment Begin

infernal_fragment_t::infernal_fragment_t( warlock_t* owner, util::string_view name )
: destruction::infernal_t( owner, name )
{
primary = false;
owner_coeff.ap_from_sp *= owner->hero.abyssal_dominion->effectN( 4 ).percent();
owner_coeff.sp_from_sp *= owner->hero.abyssal_dominion->effectN( 4 ).percent();
}

/// Infernal Fragment End
} // namespace diabolist
} // namespace pets
} // namespace warlock
8 changes: 8 additions & 0 deletions engine/class_modules/warlock/sc_warlock_pets.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -456,11 +456,14 @@ namespace destruction
struct infernal_t : public warlock_pet_t
{
buff_t* immolation;
bool primary;

infernal_t( warlock_t*, util::string_view = "infernal" );
void init_base_stats() override;
void create_buffs() override;
void arise() override;
void demise() override;
double composite_player_multiplier( school_e ) const override;
};

struct shadowy_tear_t : public warlock_pet_t
Expand Down Expand Up @@ -537,6 +540,11 @@ namespace diabolist
void arise() override;
action_t* create_action( util::string_view, util::string_view ) override;
};

struct infernal_fragment_t : public destruction::infernal_t
{
infernal_fragment_t( warlock_t*, util::string_view = "infernal_fragment" );
};
} // namespace diabolist
} // namespace pets
} // namespace warlock
Expand Down

0 comments on commit 42085ae

Please sign in to comment.