2 #include "simulationcraft.hpp" 4 #include "player/pet_spawner.hpp" 5 #include "sc_warlock_pets.hpp" 6 #include "class_modules/apl/warlock.hpp" 23 template <
typename Action,
typename Actor,
typename... Args>
24 action_t* get_action( util::string_view name, Actor* actor, Args&&... args )
26 action_t* a = actor->find_action( name );
28 a =
new Action( name, actor, std::forward<Args>( args )... );
29 assert( dynamic_cast<Action*>( a ) && a->name_str == name && a->
background );
86 int count_affliction_dots();
94 std::vector<action_t*> havoc_spells;
95 double agony_accumulator;
96 double corruption_accumulator;
97 std::vector<event_t*> wild_imp_spawns;
106 static const int INFERNAL_LIMIT = 1;
107 static const int DARKGLARE_LIMIT = 1;
110 std::array<pets::destruction::infernal_t*, INFERNAL_LIMIT> infernals;
116 std::array<pets::affliction::darkglare_t*, DARKGLARE_LIMIT> darkglare;
141 std::vector<std::string> pet_name_list;
449 gain_t* unstable_affliction_refund;
455 gain_t* incinerate_fnb_crits;
460 gain_t* shadowburn_refund;
467 gain_t* summon_demonic_tyrant;
485 proc_t* calamitous_crescendo;
486 std::array<proc_t*, 8> malefic_rapture;
493 proc_t* summon_random_demon;
495 proc_t* carnivorous_stalkers;
503 proc_t* avatar_of_destruction;
506 int initial_soul_shards;
507 std::string default_pet;
514 void init_spells()
override;
515 void init_base_stats()
override;
516 void init_scaling()
override;
517 void create_buffs()
override;
518 void init_gains()
override;
519 void init_procs()
override;
520 void init_rng()
override;
521 void init_action_list()
override;
522 void init_resources(
bool force )
override;
523 void init_special_effects()
override;
524 void reset()
override;
525 void create_options()
override;
526 int get_spawning_imp_count();
530 void malignancy_reduction_helper();
531 bool min_version_check( version_check_e version )
const;
532 action_t* create_action( util::string_view name, util::string_view options )
override;
533 pet_t* create_pet( util::string_view name, util::string_view type = {} )
override;
534 void create_pets()
override;
535 std::string create_profile( save_e )
override;
536 void copy_from(
player_t* source )
override;
537 resource_e primary_resource()
const override 539 return RESOURCE_MANA;
541 role_e primary_role()
const override 545 stat_e convert_hybrid_stat( stat_e s )
const override;
546 double matching_gear_multiplier( attribute_e attr )
const override;
547 double composite_player_multiplier( school_e school )
const override;
548 double composite_player_target_multiplier(
player_t* target, school_e school )
const override;
549 double composite_player_pet_damage_multiplier(
const action_state_t*,
bool )
const override;
550 double composite_player_target_pet_damage_multiplier(
player_t* target,
bool guardian )
const override;
551 double composite_rating_multiplier( rating_e rating )
const override;
552 void invalidate_cache( cache_e )
override;
553 double composite_spell_crit_chance()
const override;
554 double composite_spell_haste()
const override;
555 double composite_melee_haste()
const override;
556 double composite_melee_crit_chance()
const override;
557 double composite_mastery()
const override;
558 double resource_regen_per_second( resource_e )
const override;
559 double composite_attribute_multiplier( attribute_e attr )
const override;
560 void combat_begin()
override;
561 void init_assessors()
override;
562 std::unique_ptr<expr_t> create_expression( util::string_view name_str )
override;
563 std::string default_potion()
const override {
return warlock_apl::potion(
this ); }
564 std::string default_flask()
const override {
return warlock_apl::flask(
this ); }
565 std::string default_food()
const override {
return warlock_apl::food(
this ); }
566 std::string default_rune()
const override {
return warlock_apl::rune(
this ); }
567 std::string default_temporary_enchant()
const override {
return warlock_apl::temporary_enchant(
this ); }
568 void apply_affecting_auras(
action_t& action )
override;
574 return target_data[ target ];
582 td =
new warlock_td_t( target, const_cast<warlock_t&>( *
this ) );
588 action_t* create_action_warlock( util::string_view, util::string_view );
591 action_t* create_action_affliction( util::string_view, util::string_view );
592 void create_buffs_affliction();
593 void init_spells_affliction();
594 void init_gains_affliction();
595 void init_rng_affliction();
596 void init_procs_affliction();
599 action_t* create_action_demonology( util::string_view, util::string_view );
600 void create_buffs_demonology();
601 void init_spells_demonology();
602 void init_gains_demonology();
603 void init_rng_demonology();
604 void init_procs_demonology();
607 action_t* create_action_destruction( util::string_view, util::string_view );
608 void create_buffs_destruction();
609 void init_spells_destruction();
610 void init_gains_destruction();
611 void init_rng_destruction();
612 void init_procs_destruction();
615 pet_t* create_main_pet( util::string_view pet_name, util::string_view pet_type );
616 pet_t* create_demo_pet( util::string_view pet_name, util::string_view pet_type );
617 void create_all_pets();
618 std::unique_ptr<expr_t> create_pet_expression( util::string_view name_str );
633 shard_gain( p->gains.soul_conduit ),
639 virtual const char* name()
const override 641 return "soul_conduit_event";
644 virtual void execute()
override 646 double soul_conduit_rng = pl->talents.soul_conduit->effectN( 1 ).percent();
648 for (
int i = 0; i < shards_used; i++ )
650 if (
rng().roll( soul_conduit_rng ) )
652 pl->sim->
print_log(
"Soul Conduit proc occurred for Warlock {}, refunding 1.0 soul shards.", pl->name() );
653 pl->resource_gain( RESOURCE_SOUL_SHARD, 1.0, shard_gain );
654 pl->procs.soul_conduit->occur();
669 return static_cast<warlock_t*
>( player );
673 return static_cast<warlock_t*
>( player );
682 bool affected_by_woc;
683 bool affected_by_soul_tithe;
699 tick_may_crit =
true;
700 weapon_multiplier = 0.0;
701 gain = player->get_gain( name_str );
705 affected_by_woc = data().affected_by( p->
find_spell( 337130 )->effectN( 1 ) );
707 affected_by_soul_tithe = data().affected_by( p->
find_spell( 340238 )->effectN( 1 ) );
712 return static_cast<warlock_t*
>( player );
716 return static_cast<warlock_t*
>( player );
721 return p()->get_target_data( t );
726 return p()->get_target_data( t );
729 void reset()
override 740 void consume_resource()
override 742 spell_t::consume_resource();
744 if ( resource_current == RESOURCE_SOUL_SHARD && p()->in_combat )
747 if ( p()->talents.soul_conduit->ok() )
749 make_event<sc_event_t>( *p()->sim, p(), as<int>( last_resource_cost ) );
752 if ( p()->legendary.wilfreds_sigil_of_superior_summoning->ok() )
754 switch ( p()->specialization() )
756 case WARLOCK_AFFLICTION:
757 p()->cooldowns.darkglare->adjust( -last_resource_cost * p()->legendary.wilfreds_sigil_of_superior_summoning->effectN( 1 ).time_value(), false );
759 case WARLOCK_DEMONOLOGY:
760 p()->cooldowns.demonic_tyrant->adjust( -last_resource_cost * p()->legendary.wilfreds_sigil_of_superior_summoning->effectN( 2 ).time_value(), false );
762 case WARLOCK_DESTRUCTION:
763 p()->cooldowns.infernal->adjust( -last_resource_cost * p()->legendary.wilfreds_sigil_of_superior_summoning->effectN( 3 ).time_value(), false );
774 spell_t::impact( s );
777 double composite_target_multiplier(
player_t* t )
const override 779 double m = spell_t::composite_target_multiplier( t );
783 double action_multiplier()
const override 785 double pm = spell_t::action_multiplier();
787 if ( p()->
buffs.soul_tithe->check() && affected_by_soul_tithe )
788 pm *= 1.0 + p()->buffs.soul_tithe->check_stack_value();
790 pm *= 1.0 + p()->buffs.demonic_synergy->check_stack_value();
799 if ( p()->legendary.wrath_of_consumption.ok() && p()->buffs.wrath_of_consumption->check() && affected_by_woc )
800 m *= 1.0 + p()->buffs.wrath_of_consumption->check_stack_value();
807 if ( dot->is_ticking() )
809 dot->adjust_duration( extend_duration, dot->current_action->
dot_duration * 1.5 );
815 bool use_havoc()
const 818 return can_havoc && p()->havoc_target && p()->havoc_target != target;
821 int n_targets()
const override 823 if ( p()->specialization() == WARLOCK_DESTRUCTION && use_havoc() )
825 assert(spell_t::n_targets() == 0);
829 return spell_t::n_targets();
832 size_t available_targets(std::vector<player_t*>& tl)
const override 834 spell_t::available_targets(tl);
838 if ( p()->specialization() == WARLOCK_DESTRUCTION && tl.size() > 1 && use_havoc())
842 auto it = range::find(tl, p()->havoc_target);
846 tl.insert(tl.begin() + 1, p()->havoc_target);
857 if ( p()->specialization() == WARLOCK_DESTRUCTION && can_havoc )
860 base_aoe_multiplier *= p()->spec.havoc->effectN(1).percent() + p()->conduit.duplicitous_havoc.percent();
861 p()->havoc_spells.push_back(
this);
867 std::unique_ptr<expr_t> create_expression( util::string_view name_str )
override 869 return spell_t::create_expression( name_str );
894 if ( owner->warlock_pet_list.active )
896 auto pet = owner->warlock_pet_list.active;
898 pet->buffs.demonic_synergy->trigger( 1, owner->buffs.demonic_synergy->default_value );
908 std::string pet_name;
912 void _init_summon_pet_t()
914 util::tokenize( pet_name );
918 std::find( p()->pet_name_list.begin(), p()->pet_name_list.end(), pet_name ) == p()->pet_name_list.end() )
920 p()->pet_name_list.push_back( pet_name );
926 :
warlock_spell_t( p, sname.empty() ? fmt::format(
"Summon {}", n ) : sname ),
927 summoning_duration( timespan_t::zero() ),
928 pet_name( sname.empty() ? n : sname ),
931 _init_summon_pet_t();
936 summoning_duration( timespan_t::zero() ),
940 _init_summon_pet_t();
944 :
warlock_spell_t( n, p, sd ), summoning_duration( timespan_t::zero() ), pet_name( n ), pet(
nullptr )
946 _init_summon_pet_t();
949 void init_finished()
override 951 pet = debug_cast<
warlock_pet_t*>( player->find_pet( pet_name ) );
953 warlock_spell_t::init_finished();
956 virtual void execute()
override 958 pet->summon( summoning_duration );
960 warlock_spell_t::execute();
969 return warlock_spell_t::ready();
978 :
summon_pet_t( n, p,
id ), instant_cooldown( p->get_cooldown(
"instant_summon_pet" ) )
980 instant_cooldown->duration = 60_s;
981 ignore_false_positive =
true;
985 :
summon_pet_t( n, p ), instant_cooldown( p->get_cooldown(
"instant_summon_pet" ) )
987 instant_cooldown->duration = 60_s;
988 ignore_false_positive =
true;
993 warlock_spell_t::schedule_execute( state );
995 if ( p()->warlock_pet_list.active )
997 p()->warlock_pet_list.active->dismiss();
998 p()->warlock_pet_list.active =
nullptr;
1004 if ( p()->warlock_pet_list.active ==
pet )
1007 return summon_pet_t::ready();
1010 virtual void execute()
override 1012 summon_pet_t::execute();
1014 p()->warlock_pet_list.active = p()->warlock_pet_list.last =
pet;
1016 if ( p()->
buffs.grimoire_of_sacrifice->check() )
1017 p()->buffs.grimoire_of_sacrifice->expire();
1029 diff = timespan_t::from_millis( exp - delay );
1032 virtual const char* name()
const override 1037 virtual void execute()
override 1041 p->warlock_pet_list.wild_imps.spawn();
1044 auto it = std::find( p->wild_imp_spawns.begin(), p->wild_imp_spawns.end(), this );
1045 if ( it != p->wild_imp_spawns.end() )
1046 p->wild_imp_spawns.erase( it );
1052 return std::max( 0_ms, this->remains() + diff );
1059 template <
typename Base>
1066 : Base( p, name, s,
item )
1072 : Base( &p, name, s,
item )
1079 return static_cast<warlock_t*
>( Base::source );
1083 return static_cast<warlock_t*
>( Base::source );
Definition: sc_warlock.hpp:883
Definition: sc_warlock.hpp:307
Definition: sc_warlock.hpp:340
Definition: sc_warlock.hpp:281
double composite_ta_multiplier(const action_state_t *s) const override
Normal ticking modifiers that are updated every tick.
Definition: sc_warlock.hpp:795
Definition: sc_demon_hunter.cpp:42
Definition: shuffled_rng.hpp:20
Definition: sc_warlock.hpp:317
Definition: sc_warlock.hpp:1060
timespan_t dot_duration
Default full duration of dot.
Definition: action.hpp:302
Definition: attack.hpp:75
Definition: sc_warlock.hpp:477
Definition: cooldown.hpp:26
Definition: target_specific.hpp:20
void print_log(fmt::format_string< Args... > format, Args &&... args)
Convenient log function using python-like formatting.
Definition: sim.hpp:737
Definition: spell_data.hpp:398
Definition: sc_warlock.hpp:1023
Definition: sc_warlock.hpp:252
Definition: sc_warlock.hpp:382
Definition: sc_warlock.hpp:33
virtual double composite_ta_multiplier(const action_state_t *) const
Normal ticking modifiers that are updated every tick.
Definition: action.cpp:4409
Definition: action.hpp:47
Definition: unique_gear.cpp:62
Definition: sc_warlock.hpp:973
Definition: generic.hpp:567
Definition: action_state.hpp:20
Definition: runeforge_data.hpp:20
Definition: player_event.hpp:14
Definition: sc_warlock_pets.hpp:26
virtual bool ready() override
Is the ability ready based on spell characteristics.
Definition: sc_warlock.hpp:1002
Definition: covenant.cpp:108
Definition: sc_warlock.cpp:11
Definition: sc_shaman.cpp:2212
Definition: sc_warlock.hpp:625
Definition: sc_warlock.hpp:873
bool background
Enables/Disables direct execution of the ability in an action list.
Definition: action.hpp:131
Definition: sc_warlock.hpp:443
Definition: sc_warlock.hpp:905
virtual double cost() const
Resource cost of the action for current_resource()
Definition: action.cpp:1029
Class for representing InGame time.
Definition: timespan.hpp:37
Definition: player.hpp:109
void execute(action_t *, action_state_t *) override
Base rules for proc execution.
Definition: sc_warlock.hpp:892
Definition: sc_warlock.hpp:89
Definition: sc_warlock.hpp:677
Definition: covenant.hpp:34
double cost() const override
Resource cost of the action for current_resource()
Definition: sc_warlock.hpp:734
Definition: sc_warlock.hpp:326
Definition: sc_warlock.hpp:144
Definition: residual_action.hpp:35
Random number generation.
Definition: action.hpp:37
A wrapper object to enable dynamic pet spawns in simulationcraft.
Definition: pet_spawner.hpp:56
DBC-driven proc callback.
Definition: dbc_proc_callback.hpp:40
Definition: sc_demon_hunter.cpp:44
bool ready() override
Is the ability ready based on spell characteristics.
Definition: sc_warlock.hpp:963
Simulation engine.
Definition: sim.hpp:61
const spell_data_t * find_spell(util::string_view name, specialization_e s=SPEC_NONE) const
Tries to find spell data by name.
Definition: player.cpp:10165
Definition: actor_target_data.hpp:15
Definition: sc_warlock.hpp:660
Definition: sc_warlock.hpp:153
Definition: special_effect.hpp:39
Definition: sc_warlock.hpp:102