You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

152 lines
14 KiB

5 years ago
## Demonology Warlock
## https://github.com/simulationcraft/simc/
## April 28, 2022
5 years ago
## Changes:
## - Spell Lock.
## - Only recommend Demonbolt pre-combat if it is instant (or hardcast for bosses); don't overcap shards if you're at 5 in the opener.
5 years ago
## - Power Siphon allowed pre-combat to proc instant Demonbolt.
## - PvP talent interrupt.
## - Avoid SB->HoG spam when you're not about to summon a Tyrant.
## - Fleshcraft/Volatile Solvent cancel_if changed to interrupt_if.
4 years ago
## - Try to avoid wasting Demonic Core stacks.
## - Try to make opener priority only work if we can actually open with a Tyrant.
## - Improve compatibility with M+ builds.
5 years ago
# Executed before combat begins. Accepts non-harmful actions only.
actions.precombat+=/fel_domination,if=time>0&!pet.alive
actions.precombat+=/summon_pet
actions.precombat+=/use_item,name=tome_of_monstrous_constructions
actions.precombat+=/use_item,name=soleahs_secret_technique
actions.precombat+=/fleshcraft
actions.precombat+=/power_siphon,if=buff.wild_imps.stack>1&buff.demonic_core.stack<=2
4 years ago
actions.precombat+=/use_item,name=shadowed_orb_of_torment
actions.precombat+=/demonbolt,if=soul_shards<5&(boss|action.demonbolt.cast=0)
actions.precombat+=/shadow_bolt,if=soul_shards<5&!(boss|action.demonbolt.cast=0)
4 years ago
## actions.precombat+=/variable,name=first_tyrant_time,op=set,value=10
## actions.precombat+=/variable,name=in_opener,op=set,value=1
actions.precombat+=/variable,name=use_bolt_timings,op=set,value=runeforge.balespiders_burning_core&runeforge.shard_of_annihilation
5 years ago
# Executed every time the actor is available.
actions=spell_lock
actions+=/call_felhunter
actions+=/axe_toss
actions+=/devour_magic
4 years ago
actions=variable,name=next_tyrant_cd,op=set,value=cooldown.summon_demonic_tyrant.remains_expected,if=!soulbind.field_of_blossoms|cooldown.summon_demonic_tyrant.remains_expected>cooldown.soul_rot.remains_expected
actions+=/variable,name=next_tyrant_cd,op=set,value=cooldown.soul_rot.remains_expected,if=soulbind.field_of_blossoms&cooldown.summon_demonic_tyrant.remains_expected<cooldown.soul_rot.remains_expected
## actions+=/variable,name=in_opener,op=set,value=0,if=pet.demonic_tyrant.active
actions+=/variable,name=buff_sync_cd,op=set,value=variable.next_tyrant_cd,if=!variable.use_bolt_timings&!in_opener
actions+=/variable,name=buff_sync_cd,op=set,value=12,if=!variable.use_bolt_timings&in_opener&!pet.dreadstalker.active
actions+=/variable,name=buff_sync_cd,op=set,value=0,if=!variable.use_bolt_timings&in_opener&pet.dreadstalker.active&buff.wild_imps.stack>0&!talent.vilefiend.enabled
actions+=/variable,name=buff_sync_cd,op=set,value=0,if=!variable.use_bolt_timings&in_opener&pet.dreadstalker.active&prev_gcd.1.hand_of_guldan&talent.vilefiend.enabled
actions+=/variable,name=buff_sync_cd,op=set,value=cooldown.decimating_bolt.remains_expected,if=variable.use_bolt_timings
5 years ago
actions+=/call_action_list,name=trinkets
4 years ago
actions+=/call_action_list,name=ogcd,if=(!variable.use_bolt_timings&pet.demonic_tyrant.active)|(variable.use_bolt_timings&buff.shard_of_annihilation.up&(!talent.power_siphon.enabled|buff.power_siphon.up))
actions+=/implosion,if=boss&fight_remains<2*gcd
actions+=/call_action_list,name=opener,strict=1,if=toggle.cooldowns&time<first_tyrant_time
5 years ago
actions+=/call_action_list,name=covenant_ability,strict=1,if=soulbind.grove_invigoration|soulbind.field_of_blossoms|soulbind.combat_meditation|covenant.necrolord
4 years ago
actions+=/potion,if=(!variable.use_bolt_timings&variable.next_tyrant_cd<gcd.max&time>first_tyrant_time|soulbind.refined_palate&variable.next_tyrant_cd<38)|(variable.use_bolt_timings&buff.shard_of_annihilation.up)
5 years ago
actions+=/call_action_list,name=tyrant_setup
4 years ago
actions+=/demonic_strength,if=(!runeforge.wilfreds_sigil_of_superior_summoning&variable.next_tyrant_cd>9)|(pet.demonic_tyrant.active&pet.demonic_tyrant.remains<6*gcd.max)
actions+=/call_dreadstalkers,if=variable.use_bolt_timings&cooldown.summon_demonic_tyrant.remains_expected>22
actions+=/call_dreadstalkers,if=!variable.use_bolt_timings&(variable.next_tyrant_cd>20-5*!runeforge.wilfreds_sigil_of_superior_summoning)
actions+=/bilescourge_bombers,if=buff.tyrant.down&variable.next_tyrant_cd>5
actions+=/implosion,if=active_enemies>1+(1*talent.sacrificed_souls.enabled)&buff.wild_imps.stack>=6&buff.tyrant.down&variable.next_tyrant_cd>5&(buff.implosive_potential.down|buff.wild_imps.stack*(1+4*(spell_targets.implosion>2))>=buff.implosive_potential.v1)
4 years ago
actions+=/implosion,if=active_enemies>2&buff.wild_imps.stack>=6&buff.tyrant.down&variable.next_tyrant_cd>5&!runeforge.implosive_potential&(!talent.from_the_shadows.enabled|debuff.from_the_shadows.up)
actions+=/implosion,if=active_enemies>1+(1*talent.sacrificed_souls.enabled)&buff.wild_imps.stack>=6+(3*talent.soul_conduit.enabled)&buff.tyrant.down&variable.next_tyrant_cd>5&(buff.implosive_potential.down|buff.wild_imps.stack*(1+4*(spell_targets.implosion>2))>=buff.implosive_potential.v1)
actions+=/implosion,if=active_enemies>2&buff.wild_imps.stack>=6+(3*talent.soul_conduit.enabled)&buff.tyrant.down&variable.next_tyrant_cd>5&!runeforge.implosive_potential&(!talent.from_the_shadows.enabled|debuff.from_the_shadows.up)
5 years ago
actions+=/grimoire_felguard,if=boss&time_to_die<30
actions+=/summon_vilefiend,if=boss&time_to_die<28
actions+=/summon_demonic_tyrant,if=boss&time_to_die<15
actions+=/hand_of_guldan,if=soul_shard=5
4 years ago
actions+=/shadow_bolt,if=soul_shard<5&runeforge.balespiders_burning_core&buff.balespiders_burning_core.remains<5
actions+=/doom,if=refreshable
5 years ago
# If Dreadstalkers are already active, no need to save shards
actions+=/hand_of_guldan,if=soul_shard>=3&(pet.dreadstalker.active|pet.demonic_tyrant.active)
actions+=/hand_of_guldan,if=soul_shard>=1&buff.nether_portal.up&cooldown.call_dreadstalkers.remains>2*gcd.max
actions+=/hand_of_guldan,if=soul_shard>=1&buff.wild_imps.stack>2&pet.dreadstalker.remains>0.5+cast_time+action.summon_demonic_tyrant.cast_time&pet.dreadstalker.remains<0.5+cast_time+action.summon_demonic_tyrant.cast_time+(0>?(3-soul_shard))*action.shadow_bolt.cast_time&variable.next_tyrant_cd<gcd.max&time>first_tyrant_time-gcd.max
5 years ago
actions+=/call_action_list,name=covenant_ability,strict=1,if=!covenant.venthyr
# Without Sacrificed Souls, Soul Strike is stronger than Demonbolt, so it has a higher priority
actions+=/soul_strike,if=!talent.sacrificed_souls.enabled
actions+=/power_siphon,if=!variable.use_bolt_timings&buff.wild_imps.stack>1&buff.demonic_core.stack<3
actions+=/power_siphon,if=variable.use_bolt_timings&buff.shard_of_annihilation.up&buff.shard_of_annihilation.stack<3
5 years ago
# Spend Demonic Cores for Soul Shards until Tyrant cooldown is close to ready
4 years ago
actions+=/demonbolt,if=buff.demonic_core.react&soul_shard<4&variable.next_tyrant_cd>20
5 years ago
# During Tyrant setup, spend Demonic Cores for Soul Shards
4 years ago
actions+=/demonbolt,if=buff.demonic_core.react&soul_shard<4&variable.next_tyrant_cd<12
5 years ago
actions+=/demonbolt,if=buff.demonic_core.react&soul_shard<4&(buff.demonic_core.stack>2|talent.sacrificed_souls.enabled)
actions+=/power_siphon,if=variable.use_bolt_timings&buff.shard_of_annihilation.up
4 years ago
actions+=/demonbolt,if=set_bonus.tier28_2pc&soul_shard<4&((6-soul_shard)*action.shadow_bolt.execute_time>pet.dreadstalker.remains-action.hand_of_guldan.execute_time-action.demonbolt.execute_time)&buff.demonic_core.stack>=1
5 years ago
actions+=/demonbolt,if=buff.demonic_core.react&soul_shard<4&active_enemies>1
actions+=/soul_strike
actions+=/call_action_list,name=covenant_ability
# If you can get back to 5 Soul Shards before Dreadstalkers cooldown is ready, it's okay to spend them now
4 years ago
actions+=/hand_of_guldan,if=soul_shard>=3&variable.next_tyrant_cd>25&(talent.demonic_calling.enabled|cooldown.call_dreadstalkers.remains>((5-soul_shard)*action.shadow_bolt.execute_time)+action.hand_of_guldan.execute_time)
actions+=/doom,cycle_targets=1,if=refreshable&time>first_tyrant_time
4 years ago
# Use Demonbolt if you're going to lose Demonic Core stacks, even if it'd waste a soul shard.
actions+=/demonbolt,if=buff.demonic_core.react&buff.demonic_core.remains<1+gcd.max*buff.demonic_core.stack
5 years ago
actions+=/shadow_bolt
4 years ago
actions.slow_trinkets=use_item,name=soulletting_ruby,cycle_targets=1,if=variable.buff_sync_cd<target.distance%5-(2*gcd.max*variable.use_bolt_timings)
actions.slow_trinkets+=/use_item,name=sunblood_amethyst,if=variable.buff_sync_cd<target.distance%5+(2*variable.use_bolt_timings)
actions.slow_trinkets+=/use_item,name=empyreal_ordnance,if=variable.buff_sync_cd<(target.distance%5)+12+(2*variable.use_bolt_timings)
5 years ago
actions.covenant_ability=soul_rot,if=(soulbind.field_of_blossoms|runeforge.decaying_soul_satchel)&pet.demonic_tyrant.active
actions.covenant_ability+=/soul_rot,if=soulbind.grove_invigoration&!runeforge.decaying_soul_satchel&(variable.next_tyrant_cd<20|variable.next_tyrant_cd>30)
actions.covenant_ability+=/soul_rot,if=!(soulbind.field_of_blossoms|soulbind.grove_invigoration)&!runeforge.decaying_soul_satchel&!pet.demonic_tyrant.active&variable.next_tyrant_cd>18
4 years ago
actions.covenant_ability+=/decimating_bolt,cycle_targets=1,if=min:target.health.pct,if=!variable.use_bolt_timings&soulbind.lead_by_example&(pet.demonic_tyrant.active&soul_shard<2|!pet.demonic_tyrant.active&variable.next_tyrant_cd>40)
actions.covenant_ability+=/decimating_bolt,cycle_targets=1,if=min:target.health.pct,if=!variable.use_bolt_timings&soulbind.kevins_oozeling&(pet.demonic_tyrant.active|!pet.demonic_tyrant.active&variable.next_tyrant_cd>40)
actions.covenant_ability+=/decimating_bolt,cycle_targets=1,if=!variable.use_bolt_timings&(soulbind.forgeborne_reveries|(soulbind.volatile_solvent&!soulbind.kevins_oozeling))&!pet.demonic_tyrant.active
actions.covenant_ability+=/decimating_bolt,cycle_targets=1,if=variable.use_bolt_timings&(!talent.power_siphon|cooldown.power_siphon.remains<action.decimating_bolt.execute_time)&!cooldown.summon_demonic_tyrant.up&(pet.demonic_tyrant.remains<8|cooldown.summon_demonic_tyrant.remains_expected<30)
actions.covenant_ability+=/fleshcraft,if=soulbind.volatile_solvent&buff.volatile_solvent.down,interrupt_if=buff.volatile_solvent.up
5 years ago
actions.covenant_ability+=/scouring_tithe,if=soulbind.combat_meditation&pet.demonic_tyrant.active
actions.covenant_ability+=/scouring_tithe,if=!soulbind.combat_meditation
actions.covenant_ability+=/impending_catastrophe,if=pet.demonic_tyrant.active&soul_shard=0
actions.hp_trinks=use_item,name=sinful_gladiators_emblem
actions.hp_trinks+=/use_item,name=sinful_aspirants_emblem
actions.ogcd=berserking
actions.ogcd+=/blood_fury
actions.ogcd+=/fireblood
actions.ogcd+=/use_items
4 years ago
actions.opener=soul_rot,if=soulbind.grove_invigoration
actions.opener+=/nether_portal
actions.opener+=/grimoire_felguard
actions.opener+=/summon_vilefiend
actions.opener+=/shadow_bolt,if=soul_shard<5&cooldown.call_dreadstalkers.up
4 years ago
actions.opener+=/shadow_bolt,if=variable.use_bolt_timings&soul_shard<5&buff.balespiders_burning_core.stack<4
4 years ago
actions.opener+=/call_dreadstalkers
5 years ago
actions.pure_damage_trinks=use_item,name=dreadfire_vessel
4 years ago
actions.pure_damage_trinks+=/use_item,name=resonant_reservoir
actions.pure_damage_trinks+=/use_item,name=architects_ingenuity_core
actions.pure_damage_trinks+=/use_item,name=cosmic_gladiators_resonator
actions.pure_damage_trinks+=/use_item,name=dreadfire_vessel
5 years ago
actions.pure_damage_trinks+=/use_item,name=soul_igniter
actions.pure_damage_trinks+=/use_item,name=glyph_of_assimilation,if=active_enemies=1
actions.pure_damage_trinks+=/use_item,name=darkmoon_deck_putrescence
actions.pure_damage_trinks+=/use_item,name=ebonsoul_vise
actions.pure_damage_trinks+=/use_item,name=unchained_gladiators_shackles
actions.trinkets=variable,name=use_buff_trinkets,value=(!variable.use_bolt_timings&pet.demonic_tyrant.active)|(variable.use_bolt_timings&buff.shard_of_annihilation.up)
actions.trinkets+=/use_item,name=scars_of_fraternal_strife,if=!buff.scars_of_fraternal_strife_4.up
actions.trinkets+=/use_item,name=scars_of_fraternal_strife,if=buff.scars_of_fraternal_strife_4.up&pet.demonic_tyrant.active
actions.trinkets+=/use_item,name=shadowed_orb_of_torment,if=variable.buff_sync_cd<22
actions.trinkets+=/use_item,name=moonlit_prism,if=variable.use_bolt_timings&pet.demonic_tyrant.active
actions.trinkets+=/use_item,name=grim_eclipse,if=variable.buff_sync_cd<7
4 years ago
actions.trinkets+=/call_action_list,name=hp_trinks,if=talent.demonic_consumption.enabled&variable.next_tyrant_cd<20
# Effects that travel slowly from the target require additional, separate handling
5 years ago
actions.trinkets+=/call_action_list,name=slow_trinkets
actions.trinkets+=/use_item,name=overflowing_anima_cage,if=variable.use_buff_trinkets
actions.trinkets+=/use_item,slot=trinket1,if=trinket.1.has_use_buff&variable.use_buff_trinkets
actions.trinkets+=/use_item,slot=trinket2,if=trinket.2.has_use_buff&variable.use_buff_trinkets
4 years ago
actions.trinkets+=/call_action_list,name=pure_damage_trinks,if=time>first_tyrant_time&variable.buff_sync_cd>20
5 years ago
4 years ago
actions.tyrant_setup=nether_portal,if=variable.next_tyrant_cd<15
actions.tyrant_setup+=/grimoire_felguard,if=variable.next_tyrant_cd<17-(action.summon_demonic_tyrant.execute_time+action.shadow_bolt.execute_time)&(cooldown.call_dreadstalkers.remains<17-(action.summon_demonic_tyrant.execute_time+action.summon_vilefiend.execute_time+action.shadow_bolt.execute_time)|pet.dreadstalker.remains>variable.next_tyrant_cd+action.summon_demonic_tyrant.execute_time)
actions.tyrant_setup+=/summon_vilefiend,if=(variable.next_tyrant_cd<15-(action.summon_demonic_tyrant.execute_time)&(cooldown.call_dreadstalkers.remains<15-(action.summon_demonic_tyrant.execute_time+action.summon_vilefiend.execute_time)|pet.dreadstalker.remains>variable.next_tyrant_cd+action.summon_demonic_tyrant.execute_time))|(!runeforge.wilfreds_sigil_of_superior_summoning&variable.next_tyrant_cd>40)
actions.tyrant_setup+=/call_dreadstalkers,if=variable.next_tyrant_cd<12-(action.summon_demonic_tyrant.execute_time+action.shadow_bolt.execute_time)
actions.tyrant_setup+=/summon_demonic_tyrant,if=time>first_tyrant_time&(pet.dreadstalker.active&pet.dreadstalker.remains>action.summon_demonic_tyrant.execute_time)&(!talent.summon_vilefiend.enabled|pet.vilefiend.active)&(soul_shard=0|(pet.dreadstalker.active&pet.dreadstalker.remains<action.summon_demonic_tyrant.execute_time+action.shadow_bolt.execute_time)|(pet.vilefiend.active&pet.vilefiend.remains<action.summon_demonic_tyrant.execute_time+action.shadow_bolt.execute_time)|(buff.grimoire_felguard.up&buff.grimoire_felguard.remains<action.summon_demonic_tyrant.execute_time+action.shadow_bolt.execute_time))