## Demonology Warlock ## https://github.com/simulationcraft/simc/ ## March 16, 2022 ## Changes: ## - Spell Lock. ## - Only recommend Demonbolt pre-combat if it is instant (or hardcast for bosses). ## - Power Siphon allowed pre-combat to proc instant Demonbolt. ## - PvP talent interrupt. ## - 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. # Executed before combat begins. Accepts non-harmful actions only. actions.precombat+=/summon_pet actions.precombat+=/fleshcraft actions.precombat+=/use_item,name=tome_of_monstrous_constructions actions.precombat+=/use_item,name=soleahs_secret_technique actions.precombat+=/use_item,name=shadowed_orb_of_torment actions.precombat+=/power_siphon,if=buff.wild_imps.stack>1&buff.demonic_core.stack<=2 actions.precombat+=/demonbolt,if=(boss|action.demonbolt.cast=0)&soul_shards<4 actions.precombat+=/shadow_bolt,if=!(boss|action.demonbolt.cast=0)|soul_shards>3 ## actions.precombat+=/variable,name=first_tyrant_time,op=set,value=10 actions.precombat+=/variable,name=time_limit,op=set,value=15 ## actions.precombat+=/variable,name=in_opener,op=set,value=1 actions.precombat+=/variable,name=in_setup,op=set,value=1 actions.precombat+=/variable,name=in_buildup,op=set,value=0 actions.precombat+=/variable,name=back_to_five,op=set,value=0 actions.precombat+=/variable,name=first_hog,op=set,value=1 actions.precombat+=/variable,name=not_wilf,op=set,value=!runeforge.wilfreds_sigil_of_superior_summoning actions.precombat+=/variable,name=use_bolt_timings,op=set,value=runeforge.balespiders_burning_core&runeforge.shard_of_annihilation # 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&cooldown.summon_demonic_tyrant.remains_expected4 actions+=/call_action_list,name=trinkets actions+=/call_action_list,name=ogcd,strict=1,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+=/call_action_list,name=ramp,strict=1,if=variable.in_setup actions+=/call_action_list,name=build,strict=1,if=variable.in_buildup actions+=/doom,if=refreshable actions+=/implosion,if=target.time_to_die<2*gcd&buff.wild_imps.stack>0 actions+=/call_action_list,name=covenant_ability,strict=1,if=soulbind.grove_invigoration|soulbind.field_of_blossoms|soulbind.combat_meditation|covenant.necrolord actions+=/power_siphon,if=variable.use_bolt_timings&buff.shard_of_annihilation.up actions+=/potion,if=variable.use_bolt_timings&buff.shard_of_annihilation.up actions+=/call_action_list,name=tyrant actions+=/summon_vilefiend,if=variable.not_wilf&variable.next_tyrant_cd>45 actions+=/call_dreadstalkers,if=(variable.not_wilf|variable.use_bolt_timings)&cooldown.summon_demonic_tyrant.remains_expected>45 actions+=/call_dreadstalkers,if=(variable.not_wilf|variable.use_bolt_timings)&cooldown.summon_demonic_tyrant.remains_expected>28&cooldown.summon_demonic_tyrant.remains_expected<32 actions+=/call_dreadstalkers,if=!variable.not_wilf&!variable.use_bolt_timings&(variable.next_tyrant_cd>20-5*!runeforge.wilfreds_sigil_of_superior_summoning) 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+=/power_siphon,if=!variable.use_bolt_timings&buff.wild_imps.stack>1&buff.demonic_core.stack<3 actions+=/bilescourge_bombers,if=buff.tyrant.down&variable.next_tyrant_cd>5&!in_opener actions+=/call_action_list,name=aoe,strict=1,if=!variable.in_setup actions+=/grimoire_felguard,if=time_to_die<30 actions+=/summon_vilefiend,if=time_to_die<28 actions+=/call_dreadstalkers,if=time_to_die<20 actions+=/summon_demonic_tyrant,if=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+=/hand_of_guldan,if=soul_shard>=1&variable.in_setup&buff.demonic_core.react&variable.time_limit=1&variable.in_setup&variable.time_limit1&soul_shard<4&pet.dreadstalker.active&pet.dreadstalker.remains=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+=/call_action_list,name=covenant_ability,strict=1,if=!covenant.venthyr actions+=/soul_strike,if=!talent.sacrificed_souls.enabled actions+=/demonbolt,if=buff.demonic_core.react&soul_shard<4&variable.next_tyrant_cd>20 actions+=/demonbolt,if=buff.demonic_core.react&soul_shard<4&variable.in_setup actions+=/demonbolt,if=buff.demonic_core.react&soul_shard<4&(buff.demonic_core.stack>2|talent.sacrificed_souls.enabled) 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 actions+=/hand_of_guldan,if=soul_shard>=3&variable.next_tyrant_cd>25&((talent.demonic_calling.enabled&buff.demonic_calling.up&buff.demonic_calling.remains>cooldown.call_dreadstalkers.remains)|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.5y_per_sec_trinkets=use_item,name=soulletting_ruby,cycle_targets=1,if=variable.buff_sync_cd1+(1*talent.sacrificed_souls.enabled)&buff.wild_imps.stack>=6&buff.tyrant.down&variable.next_tyrant_cd>5 actions.aoe+=/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.aoe+=/implosion,if=active_enemies>2&buff.wild_imps.stack>=6&buff.implosive_potential.remains<2&runeforge.implosive_potential actions.aoe+=/implosion,if=buff.wild_imps.stack>=12&talent.soul_conduit.enabled&talent.from_the_shadows.enabled&runeforge.implosive_potential&buff.tyrant.down&variable.next_tyrant_cd>5 actions.build=variable,name=current_hog,op=set,value=1,if=soul_shard=1 actions.build+=/variable,name=current_hog,op=set,value=2,if=soul_shard=2 actions.build+=/variable,name=current_hog,op=set,value=3,if=soul_shard>2 actions.build+=/variable,name=allow_db,op=set,value=0 actions.build+=/variable,name=allow_db,op=set,value=1,if=(pet.dreadstalker.active&buff.demonic_core.stack>0)|(!pet.dreadstalker.active&buff.demonic_core.stack>3) actions.build+=/variable,name=time_to_setup,op=set,value=cooldown.call_dreadstalkers.remains-gcd.max-action.summon_vilefiend.execute_time-2*action.shadow_bolt.execute_time,if=talent.summon_vilefiend.enabled&talent.grimoire_felguard.enabled&cooldown.grimoire_felguard.remainsvariable.next_tyrant_cd) actions.build+=/variable,name=time_to_setup,op=set,value=cooldown.call_dreadstalkers.remains-gcd.max-action.shadow_bolt.execute_time,if=!talent.summon_vilefiend.enabled&talent.grimoire_felguard.enabled&cooldown.grimoire_felguard.remainsvariable.next_tyrant_cd) actions.build+=/variable,name=time_to_setup,op=set,value=variable.next_tyrant_cd-12.5,if=variable.not_wilf&cooldown.grimoire_felguard.remainsvariable.next_tyrant_cd)) actions.build+=/bilescourge_bombers actions.build+=/call_action_list,name=aoe actions.build+=/call_action_list,name=covenant_ability,if=covenant.necrolord&soulbind.volatile_solvent&buff.volatile_solvent_humanoid.down actions.build+=/hand_of_guldan,if=((5-(soul_shard-variable.current_hog))*action.shadow_bolt.execute_time+action.hand_of_guldan.execute_time>variable.time_to_setup|soul_shard>2)&variable.time_to_setup>(5-(soul_shard-variable.current_hog)-1)*action.shadow_bolt.execute_time+action.hand_of_guldan.execute_time actions.build+=/hand_of_guldan,if=variable.allow_db&((5-(soul_shard-variable.current_hog)-2)*action.shadow_bolt.execute_time+gcd.max+action.hand_of_guldan.execute_time>variable.time_to_setup|soul_shard>2)&variable.time_to_setup>(5-(soul_shard-variable.current_hog)-3)*action.shadow_bolt.execute_time+gcd.max+action.hand_of_guldan.execute_time actions.build+=/soul_strike,if=!talent.sacrificed_souls.enabled&soul_shard<5 actions.build+=/demonbolt,if=variable.allow_db&soul_shard<4 actions.build+=/shadow_bolt actions.covenant_ability=soul_rot,if=soulbind.grove_invigoration&(variable.next_tyrant_cd<20|variable.next_tyrant_cd>30) actions.covenant_ability+=/soul_rot,if=soulbind.field_of_blossoms&pet.demonic_tyrant.active actions.covenant_ability+=/soul_rot,if=soulbind.wild_hunt_tactics&!pet.demonic_tyrant.active&variable.next_tyrant_cd>18 actions.covenant_ability+=/decimating_bolt,cycle_targets=1,if=!variable.use_bolt_timings&(soulbind.lead_by_example|soulbind.kevins_oozeling)&(pet.demonic_tyrant.active&soul_shard<2|!pet.demonic_tyrant.active&variable.next_tyrant_cd>30) 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.remains2&buff.wild_imps.stack>=3&buff.implosive_potential.remains<1&runeforge.implosive_potential&variable.time_limit>5*gcd.max actions.ramp+=/implosion,if=active_enemies>2&buff.wild_imps.stack>=3&buff.implosive_potential.remains<2&runeforge.implosive_potential&variable.time_limit>5*gcd.max actions.ramp+=/demonbolt,if=soul_shard<4&buff.demonic_core.stack>2&cooldown.call_dreadstalkers.remains2&(talent.grimoire_felguard.enabled|talent.summon_vilefiend.enabled|covenant.night_fae|in_opener|variable.use_bolt_timings) actions.ramp+=/shadow_bolt,if=variable.back_to_five&(talent.grimoire_felguard.enabled|talent.summon_vilefiend.enabled|covenant.night_fae|in_opener|variable.use_bolt_timings) actions.trinkets=use_item,name=shadowed_orb_of_torment,if=variable.buff_sync_cd<22 actions.trinkets+=/use_item,name=scars_of_fraternal_strife actions.trinkets+=/call_action_list,name=hp_trinks,if=talent.demonic_consumption.enabled&variable.next_tyrant_cd<20 actions.trinkets+=/call_action_list,name=5y_per_sec_trinkets actions.trinkets+=/use_item,name=overflowing_anima_cage,if=(!variable.use_bolt_timings&pet.demonic_tyrant.active)|(variable.use_bolt_timings&buff.shard_of_annihilation.up) actions.trinkets+=/use_item,slot=trinket1,if=trinket.1.has_use_buff&((!variable.use_bolt_timings&pet.demonic_tyrant.active)|(variable.use_bolt_timings&buff.shard_of_annihilation.up)) actions.trinkets+=/use_item,slot=trinket2,if=trinket.2.has_use_buff&((!variable.use_bolt_timings&pet.demonic_tyrant.active)|(variable.use_bolt_timings&buff.shard_of_annihilation.up)) actions.trinkets+=/call_action_list,name=pure_damage_trinks,if=time>first_tyrant_time&variable.buff_sync_cd>20 actions.tyrant=variable,name=time_limit,op=set,value=20,if=variable.in_setup actions.tyrant+=/variable,name=time_limit,op=set,value=variable.imp_time_limit-time,if=variable.in_setup&!variable.first_hog actions.tyrant+=/variable,name=time_limit,op=set,value=buff.grimoire_felguard.remains,if=buff.grimoire_felguard.up&buff.grimoire_felguard.remains0&variable.time_limit0&variable.time_limit0&variable.time_limit0&variable.time_limit