## Demonology Warlock ## https://github.com/simulationcraft/simc/ ## September 11, 2022 ## 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. ## - 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. ## - 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. # 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 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) ## actions.precombat+=/variable,name=first_tyrant_time,op=set,value=12 ## actions.precombat+=/variable,name=first_tyrant_time,op=add,value=action.grimoire_felguard.execute_time,if=talent.grimoire_felguard.enabled ## actions.precombat+=/variable,name=first_tyrant_time,op=add,value=action.summon_vilefiend.execute_time,if=talent.summon_vilefiend.enabled ## actions.precombat+=/variable,name=first_tyrant_time,op=add,value=gcd.max,if=talent.grimoire_felguard.enabled|talent.summon_vilefiend.enabled ## actions.precombat+=/variable,name=first_tyrant_time,op=sub,value=action.summon_demonic_tyrant.execute_time+action.shadow_bolt.execute_time ## actions.precombat+=/variable,name=first_tyrant_time,op=min,value=10 ## actions.precombat+=/variable,name=in_opener,op=set,value=1 actions.precombat+=/variable,name=use_bolt_timings,op=set,value=runeforge.shard_of_annihilation&(runeforge.balespiders_burning_core+talent.sacrificed_souls.enabled+talent.power_siphon.enabled>1) # Executed every time the actor is available. actions=spell_lock actions+=/call_felhunter actions+=/axe_toss actions+=/devour_magic 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|runeforge.decaying_soul_satchel)&cooldown.summon_demonic_tyrant.remains_expected0&!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 actions+=/call_action_list,name=trinkets 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&timefirst_tyrant_time|soulbind.refined_palate&variable.next_tyrant_cd<38)|(variable.use_bolt_timings&buff.shard_of_annihilation.up) actions+=/call_action_list,name=tyrant_setup 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) 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) 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 actions+=/shadow_bolt,if=soul_shard<5&runeforge.balespiders_burning_core&buff.balespiders_burning_core.remains<5 actions+=/doom,if=refreshable # 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_cdfirst_tyrant_time-gcd.max 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 # Spend Demonic Cores for Soul Shards until Tyrant cooldown is close to ready actions+=/demonbolt,if=buff.demonic_core.react&soul_shard<4&variable.next_tyrant_cd>20 # During Tyrant setup, spend Demonic Cores for Soul Shards actions+=/demonbolt,if=buff.demonic_core.react&soul_shard<4&variable.next_tyrant_cd<12 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 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 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 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 # 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 actions+=/shadow_bolt actions.slow_trinkets=use_item,name=soulletting_ruby,cycle_targets=1,if=variable.buff_sync_cd30) 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 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.remains45|variable.use_buff_trinkets actions.trinkets+=/call_action_list,name=pure_damage_trinks,if=time>first_tyrant_time&variable.buff_sync_cd>20 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