Demonology Priority
wow1989 opened this issue · 32 comments
Been looking closer at the Demonology rotation. Seems to be a few holes.
Not holding onto demonic tyrant until the explosive potential buff is up.
Not holding onto demonic tyrant until dreadstalkers are up.
Reference: icy-veins
Method:
TYRANT SETUP:
Ideally you want to have 2 or more sets of Imps for every Demonic Tyrant. To easily achieve this you should have at least 2 Demonic Core charges and a fresh Explosive Potential buff.
Any thoughts?
Thanks again :)
I've gone ahead and done some research:
- The opener in SimulationCraft really, really depends on having an opening Bloodlust. If I disable Bloodlust in the sim, it won't cast Implosion until after the first Demonic Tyrant, almost 30 seconds into the sim.
This also means that dummy testing with Bloodlust is pointless, and that custom sims folks may have done without Bloodlust in the opener have been impacted.
I'm testing a change where the special opener list isn't used unless Bloodlust is up, and Implosion is used to keep EP uptime even as we approach Demonic Tyrant time.
w/ Bloodlust Disabled:
Tier 25 Demo Sim -- 84,737 Patchwerk DPS
https://www.raidbots.com/simbot/report/8yUCf6BpEjwVMGQYrkRAcX
First Summon Demonic Tyrant: 0:23:849
Modified Demo Sim -- 87,234 Patchwerk DPS
https://www.raidbots.com/simbot/report/pWfZTxkmfZPJfj3Jn3hHyC
First Summon Demonic Tyrant: 0:24:606
So, there's improvement in DPS there, with negligible delay in starting up the Tyrant. There's probably room for more optimization, but seems like a starting point.
- The addon had an error with logging cast history, which impacted the ability to put priority list entries on cooldown (i.e., the first HoG and Doom have
line_cd=30
to prevent those entries from being reused in the opener). I've solved that and will upload a fix.
I'm interested in the "fresh Explosive Potential buff" and "has imps for Demonic Tyrant" combo, but maybe you're not taking Demonic Consumption.
Regardless, there are ticket instructions for submitting priority issues, and I actually need the data that it asks for.
Additional data that helps: Sim yourself, show what's different between what your sim does and what the addon recommends. (Simming with Raidbots is easiest, since you can just link your sim there.)
But again, I need a completed ticket with your information.
Awesome, thank you for looking into it.
I’ll try to be more comprehensive with my notes in the future
Cheers
Hey,
I also see a problem in whole warlock rotation. After updated and changed the race to nightborn elf all my cds like tyrant, infernal, darkglave are no longer showing as well as trinkets and instability, so on. Do you know why ?
Starting a related-issue list here:
- If you start combat with fewer than 3 soul shards (i.e., you're going pack to pack in M+, the opener logic doesn't really work for you).
All I can say is the changes you have made have drastically improved the feel and burst damage of demonology. I found myself having to ignore a lot of the suggestions in Hekili for the opener of Demonology, but now it matches up with the rotation / opener. Bravo and keep up the great work!
That's good to hear. My Warlock is poorly geared, so trying to get 2 good HoG casts and Demonic Tyrant out while Dreadstalkers are still up has been challenging.
I'm still going to work on tweaking it a bit, as I need to be able to avoid the opener entirely when you start with fewer than 3 soul shards (i.e., M+ packs) will lead to a HoG cast that doesn't generate enough imps to Implosion and trigger Explosive Potential. Not ideal.
Only odd thing I am seeing after update is in the opener.
Current Implementation:
Demonbolt -> HOG -> SS -> Shadow Bolt (Depending on Procs this could be 5 shards) -> EP -> Shadow Bolt -> Dreadstalkers -> Build to 5 Shards -> HOG -> Build to 5 Shards -> HOG -> Demonic Strength -> Demonic Tyrant
Highest Damage Opener (I Think):
Demonbolt -> HOG -> SS -> Build to 5 Shards -> EP -> Dreadstalkers -> Build to 5 Shards -> HOG -> Build to 5 Shards -> HOG -> HOG -> Demonic Tyrant -> Demonic Strength
Hmm I believe I was incorrect in what I posted. Addon seems to be operating as per the Simcraft spec. I am doing manual rotation testing and think I have found a better rotation than both the ones I posted above while using World Vein Essence. For some reason when using World Vein Essence after DT, DT's first hit or 2 is unaffected by World Vein Essence. My current testing is showing it better to pop World Vein Essence before DT. Will continue to test and try to create a profile and run it through Simulation Craft.
After a long night I implemented the changes the best way I knew how to the APL. Simcraft sims a tiny bit less on single target, however significantly more soon as you add minions into the mix. I found leaving Hekali on single target instead of Automatic for demonology much better as Automatic uses Tyrant at really bad times. Popping Worldvein before Tyrant definitely boosts Tyrant output through my testing vs target dummies. Please give this a shot and let me know what you think. This APL will take advantage of extra Soul Shard procs before dropping dat big phat Tyrant booooooty!
Let me know what you think. Be sure to un-comment out the "first before combat begins" and comment out the second "before combat begins" to restore current functionality within Hekali.
Here are two example runs in Simc on my Character:
Before Change: https://www.raidbots.com/simbot/report/oyr1CdUF6D2cGDPe4cBHfw
After Change: https://www.raidbots.com/simbot/report/kGPsXmSiUM4LUr8ka781kW
# # Executed before combat begins. Accepts non-harmful actions only.
# # actions.precombat=flask
# # actions.precombat+=/food
# # actions.precombat+=/augmentation
# actions.precombat+=/summon_pet
# # actions.precombat+=/inner_demons,if=talent.inner_demons.enabled
# # actions.precombat+=/snapshot_stats
# actions.precombat+=/power_siphon,if=buff.wild_imps.stack>1&buff.demonic_core.stack<=2
# actions.precombat+=/potion
# actions.precombat+=/demonbolt,if=boss|action.demonbolt.cast=0
# actions.precombat+=/shadow_bolt
# Executed before combat begins. Accepts non-harmful actions only.
actions.precombat=flask
actions.precombat+=/food
actions.precombat+=/augmentation
actions.precombat+=/summon_pet
actions.precombat+=/inner_demons,if=talent.inner_demons.enabled
actions.precombat+=/snapshot_stats
actions.precombat+=/potion
actions.precombat+=/demonbolt
# Executed every time the actor is available.
actions=potion,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)&(!talent.nether_portal.enabled|cooldown.nether_portal.remains>160)|target.time_to_die<30
actions+=/use_item,name=azsharas_font_of_power,if=cooldown.summon_demonic_tyrant.remains<=20&!talent.nether_portal.enabled
actions+=/use_items,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|target.time_to_die<=15
actions+=/berserking,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|target.time_to_die<=15
actions+=/blood_fury,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|target.time_to_die<=15
actions+=/fireblood,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|target.time_to_die<=15
actions+=/blood_of_the_enemy,if=pet.demonic_tyrant.active&pet.demonic_tyrant.remains<=15-gcd*3&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)
actions+=/ripple_in_space,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|target.time_to_die<=15
actions+=/use_item,name=pocketsized_computation_device,if=cooldown.summon_demonic_tyrant.remains>=20&cooldown.summon_demonic_tyrant.remains<=cooldown.summon_demonic_tyrant.duration-15|target.time_to_die<=30
actions+=/use_item,name=rotcrusted_voodoo_doll,if=(cooldown.summon_demonic_tyrant.remains>=25|target.time_to_die<=30)
actions+=/use_item,name=shiver_venom_relic,if=(cooldown.summon_demonic_tyrant.remains>=25|target.time_to_die<=30)
actions+=/use_item,name=aquipotent_nautilus,if=(cooldown.summon_demonic_tyrant.remains>=25|target.time_to_die<=30)
actions+=/use_item,name=tidestorm_codex,if=(cooldown.summon_demonic_tyrant.remains>=25|target.time_to_die<=30)
actions+=/use_item,name=vial_of_storms,if=(cooldown.summon_demonic_tyrant.remains>=25|target.time_to_die<=30)
actions+=/call_action_list,name=opener,if=!talent.nether_portal.enabled&time<30&!cooldown.summon_demonic_tyrant.remains
actions+=/use_item,name=azsharas_font_of_power,if=(time>30|!talent.nether_portal.enabled)&talent.grimoire_felguard.enabled&(target.time_to_die>120|target.time_to_die<cooldown.summon_demonic_tyrant.remains+15)|target.time_to_die<=35
actions+=/hand_of_guldan,if=azerite.explosive_potential.rank&time<5&soul_shard>2&buff.explosive_potential.down&buff.wild_imps.stack<3&!prev_gcd.1.hand_of_guldan&!prev_gcd.2.hand_of_guldan
actions+=/demonbolt,if=soul_shard<=3&buff.demonic_core.up&buff.demonic_core.stack=4
actions+=/implosion,if=azerite.explosive_potential.rank&buff.wild_imps.stack>2&buff.explosive_potential.remains<action.shadow_bolt.execute_time&(!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>12)
actions+=/doom,if=!ticking&time_to_die>30&spell_targets.implosion<2&!buff.nether_portal.remains
actions+=/bilescourge_bombers,if=azerite.explosive_potential.rank>0&time<10&spell_targets.implosion<2&buff.dreadstalkers.remains&talent.nether_portal.enabled
actions+=/demonic_strength,if=!(essence.vision_of_perfection.minor|essence.vision_of_perfection.major)&((buff.wild_imps.stack<6|buff.demonic_power.up)|spell_targets.implosion<2)|(essence.vision_of_perfection.minor|essence.vision_of_perfection.major)&pet.demonic_tyrant.active
actions+=/call_action_list,name=nether_portal,if=talent.nether_portal.enabled&spell_targets.implosion<=2
actions+=/call_action_list,name=implosion,if=spell_targets.implosion>1
actions+=/guardian_of_azeroth,if=cooldown.summon_demonic_tyrant.remains<=15|target.time_to_die<=30
actions+=/grimoire_felguard,if=(target.time_to_die>120|target.time_to_die<cooldown.summon_demonic_tyrant.remains+15|cooldown.summon_demonic_tyrant.remains<13)
actions+=/summon_vilefiend,if=cooldown.summon_demonic_tyrant.remains>40|cooldown.summon_demonic_tyrant.remains<12
actions+=/call_dreadstalkers,if=(cooldown.summon_demonic_tyrant.remains<9&buff.demonic_calling.remains)|(cooldown.summon_demonic_tyrant.remains<11&!buff.demonic_calling.remains)|cooldown.summon_demonic_tyrant.remains>14
actions+=/the_unbound_force,if=buff.reckless_force.react
actions+=/bilescourge_bombers
actions+=/hand_of_guldan,if=(azerite.baleful_invocation.enabled|talent.demonic_consumption.enabled)&prev_gcd.1.hand_of_guldan&cooldown.summon_demonic_tyrant.remains<2
actions+=/worldvein_resonance,if=soul_shard<3&(!talent.demonic_consumption.enabled|buff.wild_imps.stack+imps_spawned_during.2000%spell_haste>=6&time_to_imps.all.remains<cast_time)
# 2000%spell_haste is shorthand for the cast time of Demonic Tyrant. The intent is to only begin casting if a certain number of imps will be out by the end of the cast.
actions+=/summon_demonic_tyrant,if=prev_gcd.1.worldvein_resonance|(soul_shard<3&(!talent.demonic_consumption.enabled|buff.wild_imps.stack+imps_spawned_during.2000%spell_haste>=6&time_to_imps.all.remains<cast_time))
actions+=/power_siphon,if=buff.wild_imps.stack>=2&buff.demonic_core.stack<=2&buff.demonic_power.down&spell_targets.implosion<2
actions+=/doom,if=talent.doom.enabled&refreshable&time_to_die>(dot.doom.remains+30)
actions+=/hand_of_guldan,if=soul_shard>=5|(soul_shard>=3&cooldown.call_dreadstalkers.remains>4&(cooldown.summon_demonic_tyrant.remains>20|(cooldown.summon_demonic_tyrant.remains<gcd*2&talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains<gcd*4&!talent.demonic_consumption.enabled))&(!talent.summon_vilefiend.enabled|cooldown.summon_vilefiend.remains>3))
actions+=/soul_strike,if=soul_shard<5&buff.demonic_core.stack<=2
actions+=/demonbolt,if=soul_shard<=3&buff.demonic_core.up&((cooldown.summon_demonic_tyrant.remains<6|cooldown.summon_demonic_tyrant.remains>22&!azerite.shadows_bite.enabled)|buff.demonic_core.stack>=3|buff.demonic_core.remains<5|time_to_die<25|buff.shadows_bite.remains)
actions+=/focused_azerite_beam,if=!pet.demonic_tyrant.active
actions+=/purifying_blast
actions+=/blood_of_the_enemy
actions+=/concentrated_flame,if=!dot.concentrated_flame_burn.remains&!action.concentrated_flame.in_flight&!pet.demonic_tyrant.active
actions+=/reaping_flames,if=!pet.demonic_tyrant.active
actions+=/call_action_list,name=build_a_shard
actions.build_a_shard=memory_of_lucid_dreams,if=soul_shard<2
actions.build_a_shard+=/soul_strike,if=!talent.demonic_consumption.enabled|time>15|prev_gcd.1.hand_of_guldan&!buff.bloodlust.remains
actions.build_a_shard+=/shadow_bolt
actions.implosion=implosion,if=(buff.wild_imps.stack>=6&(soul_shard<3|prev_gcd.1.call_dreadstalkers|buff.wild_imps.stack>=9|prev_gcd.1.bilescourge_bombers|(!prev_gcd.1.hand_of_guldan&!prev_gcd.2.hand_of_guldan))&!prev_gcd.1.hand_of_guldan&!prev_gcd.2.hand_of_guldan&buff.demonic_power.down)|(time_to_die<3&buff.wild_imps.stack>0)|(prev_gcd.2.call_dreadstalkers&buff.wild_imps.stack>2&!talent.demonic_calling.enabled)
actions.implosion+=/grimoire_felguard,if=cooldown.summon_demonic_tyrant.remains<13|!equipped.132369
actions.implosion+=/call_dreadstalkers,if=(cooldown.summon_demonic_tyrant.remains<9&buff.demonic_calling.remains)|(cooldown.summon_demonic_tyrant.remains<11&!buff.demonic_calling.remains)|cooldown.summon_demonic_tyrant.remains>14
actions.implosion+=/hand_of_guldan,if=soul_shard>=5
actions.implosion+=/hand_of_guldan,if=soul_shard>=3&(((prev_gcd.2.hand_of_guldan|buff.wild_imps.stack>=3)&buff.wild_imps.stack<9)|cooldown.summon_demonic_tyrant.remains<=gcd*2|buff.demonic_power.remains>gcd*2)
actions.implosion+=/worldvein_resonance,if=!cooldown.summon_demonic_tyrant.remains
actions.implosion+=/summon_demonic_tyrant
actions.implosion+=/demonbolt,if=prev_gcd.1.hand_of_guldan&soul_shard>=1&(buff.wild_imps.stack<=3|prev_gcd.3.hand_of_guldan)&soul_shard<4&buff.demonic_core.up
actions.implosion+=/summon_vilefiend,if=(cooldown.summon_demonic_tyrant.remains>40&spell_targets.implosion<=2)|cooldown.summon_demonic_tyrant.remains<12
actions.implosion+=/bilescourge_bombers,if=cooldown.summon_demonic_tyrant.remains>9
actions.implosion+=/focused_azerite_beam
actions.implosion+=/purifying_blast
actions.implosion+=/blood_of_the_enemy
actions.implosion+=/concentrated_flame,if=!dot.concentrated_flame_burn.remains&!action.concentrated_flame.in_flight&spell_targets.implosion<5
actions.implosion+=/soul_strike,if=soul_shard<5&buff.demonic_core.stack<=2
actions.implosion+=/demonbolt,if=soul_shard<=3&buff.demonic_core.up&(buff.demonic_core.stack>=3|buff.demonic_core.remains<=gcd*5.7)
actions.implosion+=/doom,cycle_targets=1,max_cycle_targets=7,if=refreshable
actions.implosion+=/call_action_list,name=build_a_shard
actions.nether_portal=call_action_list,name=nether_portal_building,if=cooldown.nether_portal.remains<20
actions.nether_portal+=/call_action_list,name=nether_portal_active,if=cooldown.nether_portal.remains>165
actions.nether_portal_active=bilescourge_bombers
actions.nether_portal_active+=/grimoire_felguard,if=cooldown.summon_demonic_tyrant.remains<13|!equipped.132369
actions.nether_portal_active+=/summon_vilefiend,if=cooldown.summon_demonic_tyrant.remains>40|cooldown.summon_demonic_tyrant.remains<12
actions.nether_portal_active+=/call_dreadstalkers,if=(cooldown.summon_demonic_tyrant.remains<9&buff.demonic_calling.remains)|(cooldown.summon_demonic_tyrant.remains<11&!buff.demonic_calling.remains)|cooldown.summon_demonic_tyrant.remains>14
actions.nether_portal_active+=/call_action_list,name=build_a_shard,if=soul_shard=1&(cooldown.call_dreadstalkers.remains<action.shadow_bolt.cast_time|(talent.bilescourge_bombers.enabled&cooldown.bilescourge_bombers.remains<action.shadow_bolt.cast_time))
actions.nether_portal_active+=/hand_of_guldan,if=((cooldown.call_dreadstalkers.remains>action.demonbolt.cast_time)&(cooldown.call_dreadstalkers.remains>action.shadow_bolt.cast_time))&cooldown.nether_portal.remains>(165+action.hand_of_guldan.cast_time)
actions.nether_portal_active+=/summon_demonic_tyrant,if=buff.nether_portal.remains<5&soul_shard=0
actions.nether_portal_active+=/summon_demonic_tyrant,if=buff.nether_portal.remains<action.summon_demonic_tyrant.cast_time+0.5
actions.nether_portal_active+=/demonbolt,if=buff.demonic_core.up&soul_shard<=3
actions.nether_portal_active+=/call_action_list,name=build_a_shard
actions.nether_portal_building=use_item,name=azsharas_font_of_power,if=cooldown.nether_portal.remains<=5*spell_haste
actions.nether_portal_building+=/guardian_of_azeroth,if=!cooldown.nether_portal.remains&soul_shard>=5
actions.nether_portal_building+=/nether_portal,if=soul_shard>=5
actions.nether_portal_building+=/call_dreadstalkers,if=time>=30
actions.nether_portal_building+=/hand_of_guldan,if=time>=30&cooldown.call_dreadstalkers.remains>18&soul_shard>=3
actions.nether_portal_building+=/power_siphon,if=time>=30&buff.wild_imps.stack>=2&buff.demonic_core.stack<=2&buff.demonic_power.down&soul_shard>=3
actions.nether_portal_building+=/hand_of_guldan,if=time>=30&soul_shard>=5
actions.nether_portal_building+=/call_action_list,name=build_a_shard
actions.opener=hand_of_guldan,line_cd=30,if=azerite.explosive_potential.enabled
actions.opener+=/implosion,if=azerite.explosive_potential.enabled&buff.wild_imps.stack>2&buff.explosive_potential.down
actions.opener+=/doom,line_cd=30
actions.opener+=/guardian_of_azeroth
actions.opener+=/hand_of_guldan,if=prev_gcd.1.hand_of_guldan&soul_shard>0&prev_gcd.2.soul_strike
actions.opener+=/hand_of_guldan,if=prev_gcd.1.hand_of_guldan&soul_shard>0&(buff.wild_imps.stack>1&action.hand_of_guldan.in_flight)&!cooldown.summon_demonic_tyrant.remains
actions.opener+=/bilescourge_bombers
actions.opener+=/soul_strike,line_cd=30,if=!buff.bloodlust.remains|time>5&prev_gcd.1.hand_of_guldan
actions.opener+=/summon_vilefiend,if=soul_shard=5
actions.opener+=/grimoire_felguard,if=soul_shard=5
actions.opener+=/call_dreadstalkers,if=soul_shard=5
actions.opener+=/hand_of_guldan,if=soul_shard=5
actions.opener+=/hand_of_guldan,if=soul_shard>=3&prev_gcd.2.hand_of_guldan&time>5&(prev_gcd.1.soul_strike|!talent.soul_strike.enabled&prev_gcd.1.shadow_bolt)
actions.opener+=/worldvein_resonance,if=!cooldown.summon_demonic_tyrant.remains&prev_gcd.1.hand_of_guldan&prev_gcd.2.hand_of_guldan
# 2000%spell_haste is shorthand for the cast time of Demonic Tyrant. The intent is to only begin casting if a certain number of imps will be out by the end of the cast.
actions.opener+=/summon_demonic_tyrant,if=prev_gcd.1.worldvein_resonance|(prev_gcd.1.hand_of_guldan&prev_gcd.2.hand_of_guldan|!talent.demonic_strength.enabled&buff.wild_imps.stack+imps_spawned_during.2000%spell_haste>=6)
actions.opener+=/demonbolt,if=soul_shard<=3&buff.demonic_core.remains
actions.opener+=/call_action_list,name=build_a_shard
Do you want to highlight your changes for comparison? I see the Worldvein piece in the opener. Keep in mind, that's only applicable to the first Tyrant so if that's a change that pays of consistently, you probably have more edits to make.
I found leaving Hekali on single target instead of Automatic for demonology much better as Automatic uses Tyrant at really bad times.
Why do you think that is? What additional edits would you make in response to that?
Also, your precombat changes don't really apply to the sim vs. the addon.
inner_demons
isn't an active ability in-game, so it's commented out in the addon's priority. It's just implemented in SimC that way (this is how they kickstart their demon generation).
The precombat Power Siphon is a convenience to accelerate the opener.
The Demonbolt entry is designed to just avoid taking 4 seconds to start fights on non-boss enemies.
Sure thing. Changes of that version are the following:
- Assume essence.vision_of_perfection.minor && essence.worldvein_resonance.major (This is what I am working on now.
- Ensure Worldvein is happening before Demonic Tyrant
- Expend all Souldshards with HOG before activation of Demonic Tyrant
- Only use Demonic Strength after Demonic Tyrant activation that way the damage increase is for the full duration of Demonic Strength. This also stops Demonic Strength with getting out of sync of Demonic Tyrant and using it while Demonic Tyrant isn't up.
I updated both the opener by replacing Demonic Strength with the following:
actions.opener+=/hand_of_guldan,if=prev_gcd.1.hand_of_guldan&soul_shard>0&(buff.wild_imps.stack>1&action.hand_of_guldan.in_flight)&!cooldown.summon_demonic_tyrant.remains
actions.opener+=/worldvein_resonance,if=!cooldown.summon_demonic_tyrant.remains&prev_gcd.1.hand_of_guldan&prev_gcd.2.hand_of_guldan
Changed Demonic Tyrant in opener to no longer check demonic strength and instead check when Worldvein has been used.
actions.opener+=/summon_demonic_tyrant,if=prev_gcd.1.worldvein_resonance|(prev_gcd.1.hand_of_guldan&prev_gcd.2.hand_of_guldan|!talent.demonic_strength.enabled&buff.wild_imps.stack+imps_spawned_during.2000%spell_haste>=6)
I then changed the main rotation (not opener):
Added Worldvein logic before Tyrant in normal rotation and adjusted Tyrant:
actions.opener+=/worldvein_resonance,if=!cooldown.summon_demonic_tyrant.remains&prev_gcd.1.hand_of_guldan&prev_gcd.2.hand_of_guldan
actions+=/summon_demonic_tyrant,if=prev_gcd.1.worldvein_resonance|(soul_shard<3&(!talent.demonic_consumption.enabled|buff.wild_imps.stack+imps_spawned_during.2000%spell_haste>=6&time_to_imps.all.remains<cast_time))
Changed Demonic Strength to only activate if Tyrant is active and you have VoP as essence in either minor or major slot:
actions+=/demonic_strength,if=!(essence.vision_of_perfection.minor|essence.vision_of_perfection.major)&((buff.wild_imps.stack<6|buff.demonic_power.up)|spell_targets.implosion<2)|(essence.vision_of_perfection.minor|essence.vision_of_perfection.major)&pet.demonic_tyrant.active
Removed original Worldvein Resonance trigger. I also removed the if target were to die within 20 seconds off the Tyrant itself. I don't like that logic as that will often trigger on junk mobs when you are fighting them. I feel this is just something for getting purely as high as possible single target sim rather than real world use.
Added Worldvein logic to Implosion action as well.
How does hekali determine the AOE rotation of a build? When I use AOE within hekali, it seems to completely ignore the changes I made which is why sticking with single target seems to be better for Demo.
The secret is there's no "AOE" rotation unless the priority is written that way.
spell_targets.implosion
is used throughout the Demonology priority in terms of decision-making with regard to multiple targets or single target.
Gotcha. Was my outlining of changes helpful or do you want me to post a diff of the two files?
diffs are simpler. Need to run talent combos and everything to look for adverse impacts.
I am actually having some issues still with this. There is a bug with that essence showing up on occasion. I have literally copied the if statement of the demonic_tyrant, put it right before it and it still doesn't show up in the rotation.
FYI I am currently suggesting these changes to the SimC team. They are going to review them and I will get them merged if all looks good. I also ended up making a few changes and just edited those comments above. If you already pulled the APL down to test, I would re-grab it.
One quick thing I noticed is that imps_spawned_during
works differently in the addon than in SimC. Instead of 2000%haste
(which is a 2 second cast divided by haste), you can just specify the ability name. imps_spawned_during.summon_demonic_tyrant
I fixed the issue. Thank you for the suggestion using snapshots. Below is the fixed APL. Give it a shot and let me know what you think.
# Executed before combat begins. Accepts non-harmful actions only.
actions.precombat=flask
actions.precombat+=/food
actions.precombat+=/augmentation
actions.precombat+=/summon_pet
actions.precombat+=/inner_demons,if=talent.inner_demons.enabled
actions.precombat+=/snapshot_stats
actions.precombat+=/potion
actions.precombat+=/demonbolt
# Executed every time the actor is available.
actions=potion,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)&(!talent.nether_portal.enabled|cooldown.nether_portal.remains>160)|target.time_to_die<30
actions+=/use_item,name=azsharas_font_of_power,if=cooldown.summon_demonic_tyrant.remains<=20&!talent.nether_portal.enabled
actions+=/use_items,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|target.time_to_die<=15
actions+=/berserking,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|target.time_to_die<=15
actions+=/blood_fury,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|target.time_to_die<=15
actions+=/fireblood,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|target.time_to_die<=15
actions+=/blood_of_the_enemy,if=pet.demonic_tyrant.active&pet.demonic_tyrant.remains<=15-gcd*3&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)
actions+=/worldvein_resonance,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|target.time_to_die<=15
actions+=/ripple_in_space,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|target.time_to_die<=15
actions+=/use_item,name=pocketsized_computation_device,if=cooldown.summon_demonic_tyrant.remains>=20&cooldown.summon_demonic_tyrant.remains<=cooldown.summon_demonic_tyrant.duration-15|target.time_to_die<=30
actions+=/use_item,name=rotcrusted_voodoo_doll,if=(cooldown.summon_demonic_tyrant.remains>=25|target.time_to_die<=30)
actions+=/use_item,name=shiver_venom_relic,if=(cooldown.summon_demonic_tyrant.remains>=25|target.time_to_die<=30)
actions+=/use_item,name=aquipotent_nautilus,if=(cooldown.summon_demonic_tyrant.remains>=25|target.time_to_die<=30)
actions+=/use_item,name=tidestorm_codex,if=(cooldown.summon_demonic_tyrant.remains>=25|target.time_to_die<=30)
actions+=/use_item,name=vial_of_storms,if=(cooldown.summon_demonic_tyrant.remains>=25|target.time_to_die<=30)
actions+=/call_action_list,name=opener,if=!talent.nether_portal.enabled&time<30&!cooldown.summon_demonic_tyrant.remains
actions+=/use_item,name=azsharas_font_of_power,if=(time>30|!talent.nether_portal.enabled)&talent.grimoire_felguard.enabled&(target.time_to_die>120|target.time_to_die<cooldown.summon_demonic_tyrant.remains+15)|target.time_to_die<=35
actions+=/hand_of_guldan,if=azerite.explosive_potential.rank&time<5&soul_shard>2&buff.explosive_potential.down&buff.wild_imps.stack<3&!prev_gcd.1.hand_of_guldan&!prev_gcd.2.hand_of_guldan
actions+=/demonbolt,if=soul_shard<=3&buff.demonic_core.up&buff.demonic_core.stack=4
actions+=/implosion,if=azerite.explosive_potential.rank&buff.wild_imps.stack>2&buff.explosive_potential.remains<action.shadow_bolt.execute_time&(!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>12)
actions+=/doom,if=!ticking&time_to_die>30&spell_targets.implosion<2&!buff.nether_portal.remains
actions+=/bilescourge_bombers,if=azerite.explosive_potential.rank>0&time<10&spell_targets.implosion<2&buff.dreadstalkers.remains&talent.nether_portal.enabled
actions+=/demonic_strength,if=(!(essence.vision_of_perfection.major|essence.vision_of_perfection.minor)&((buff.wild_imps.stack<6|buff.demonic_power.up)|spell_targets.implosion<2))|((essence.vision_of_perfection.minor|essence.vision_of_perfection.major)&pet.demonic_tyrant.active)
actions+=/call_action_list,name=nether_portal,if=talent.nether_portal.enabled&spell_targets.implosion<=2
actions+=/call_action_list,name=implosion,if=spell_targets.implosion>1
actions+=/guardian_of_azeroth,if=cooldown.summon_demonic_tyrant.remains<=15|target.time_to_die<=30
actions+=/grimoire_felguard,if=(target.time_to_die>120|target.time_to_die<cooldown.summon_demonic_tyrant.remains+15|cooldown.summon_demonic_tyrant.remains<13)
actions+=/summon_vilefiend,if=cooldown.summon_demonic_tyrant.remains>40|cooldown.summon_demonic_tyrant.remains<12
actions+=/call_dreadstalkers,if=(cooldown.summon_demonic_tyrant.remains<9&buff.demonic_calling.remains)|(cooldown.summon_demonic_tyrant.remains<11&!buff.demonic_calling.remains)|cooldown.summon_demonic_tyrant.remains>14
actions+=/the_unbound_force,if=buff.reckless_force.react
actions+=/bilescourge_bombers
actions+=/hand_of_guldan,if=(azerite.baleful_invocation.enabled|talent.demonic_consumption.enabled)&prev_gcd.1.hand_of_guldan&cooldown.summon_demonic_tyrant.remains<2
# 2000%spell_haste is shorthand for the cast time of Demonic Tyrant. The intent is to only begin casting if a certain number of imps will be out by the end of the cast.
actions+=/worldvein_resonance,if=soul_shard<3&(!talent.demonic_consumption.enabled|buff.wild_imps.stack+imps_spawned_during.2000%spell_haste>=6&!cooldown.summon_demonic_tyrant.remains)|target.time_to_die<20
actions+=/summon_demonic_tyrant,if=prev_gcd.1.worldvein_resonance|soul_shard<3&(!talent.demonic_consumption.enabled|buff.wild_imps.stack+imps_spawned_during.2000%spell_haste>=6&time_to_imps.all.remains<cast_time)|target.time_to_die<20
actions+=/power_siphon,if=buff.wild_imps.stack>=2&buff.demonic_core.stack<=2&buff.demonic_power.down&spell_targets.implosion<2
actions+=/doom,if=talent.doom.enabled&refreshable&time_to_die>(dot.doom.remains+30)
actions+=/hand_of_guldan,if=soul_shard>=5|(soul_shard>=3&cooldown.call_dreadstalkers.remains>4&(cooldown.summon_demonic_tyrant.remains>20|(cooldown.summon_demonic_tyrant.remains<gcd*2&talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains<gcd*4&!talent.demonic_consumption.enabled))&(!talent.summon_vilefiend.enabled|cooldown.summon_vilefiend.remains>3))
actions+=/soul_strike,if=soul_shard<5&buff.demonic_core.stack<=2
actions+=/demonbolt,if=soul_shard<=3&buff.demonic_core.up&((cooldown.summon_demonic_tyrant.remains<6|cooldown.summon_demonic_tyrant.remains>22&!azerite.shadows_bite.enabled)|buff.demonic_core.stack>=3|buff.demonic_core.remains<5|time_to_die<25|buff.shadows_bite.remains)
actions+=/focused_azerite_beam,if=!pet.demonic_tyrant.active
actions+=/purifying_blast
actions+=/blood_of_the_enemy
actions+=/concentrated_flame,if=!dot.concentrated_flame_burn.remains&!action.concentrated_flame.in_flight&!pet.demonic_tyrant.active
actions+=/reaping_flames,if=!pet.demonic_tyrant.active
actions+=/call_action_list,name=build_a_shard
actions.build_a_shard=memory_of_lucid_dreams,if=soul_shard<2
actions.build_a_shard+=/soul_strike,if=!talent.demonic_consumption.enabled|time>15|prev_gcd.1.hand_of_guldan&!buff.bloodlust.remains
actions.build_a_shard+=/shadow_bolt
actions.implosion=implosion,if=(buff.wild_imps.stack>=6&(soul_shard<3|prev_gcd.1.call_dreadstalkers|buff.wild_imps.stack>=9|prev_gcd.1.bilescourge_bombers|(!prev_gcd.1.hand_of_guldan&!prev_gcd.2.hand_of_guldan))&!prev_gcd.1.hand_of_guldan&!prev_gcd.2.hand_of_guldan&buff.demonic_power.down)|(time_to_die<3&buff.wild_imps.stack>0)|(prev_gcd.2.call_dreadstalkers&buff.wild_imps.stack>2&!talent.demonic_calling.enabled)
actions.implosion+=/grimoire_felguard,if=cooldown.summon_demonic_tyrant.remains<13|!equipped.132369
actions.implosion+=/call_dreadstalkers,if=(cooldown.summon_demonic_tyrant.remains<9&buff.demonic_calling.remains)|(cooldown.summon_demonic_tyrant.remains<11&!buff.demonic_calling.remains)|cooldown.summon_demonic_tyrant.remains>14
actions.implosion+=/worldvein_resonance,if=!cooldown.summon_demonic_tyrant.remains
actions.implosion+=/summon_demonic_tyrant
actions.implosion+=/hand_of_guldan,if=soul_shard>=5
actions.implosion+=/hand_of_guldan,if=soul_shard>=3&(((prev_gcd.2.hand_of_guldan|buff.wild_imps.stack>=3)&buff.wild_imps.stack<9)|cooldown.summon_demonic_tyrant.remains<=gcd*2|buff.demonic_power.remains>gcd*2)
actions.implosion+=/demonbolt,if=prev_gcd.1.hand_of_guldan&soul_shard>=1&(buff.wild_imps.stack<=3|prev_gcd.3.hand_of_guldan)&soul_shard<4&buff.demonic_core.up
actions.implosion+=/summon_vilefiend,if=(cooldown.summon_demonic_tyrant.remains>40&spell_targets.implosion<=2)|cooldown.summon_demonic_tyrant.remains<12
actions.implosion+=/bilescourge_bombers,if=cooldown.summon_demonic_tyrant.remains>9
actions.implosion+=/focused_azerite_beam
actions.implosion+=/purifying_blast
actions.implosion+=/blood_of_the_enemy
actions.implosion+=/concentrated_flame,if=!dot.concentrated_flame_burn.remains&!action.concentrated_flame.in_flight&spell_targets.implosion<5
actions.implosion+=/soul_strike,if=soul_shard<5&buff.demonic_core.stack<=2
actions.implosion+=/demonbolt,if=soul_shard<=3&buff.demonic_core.up&(buff.demonic_core.stack>=3|buff.demonic_core.remains<=gcd*5.7)
actions.implosion+=/doom,cycle_targets=1,max_cycle_targets=7,if=refreshable
actions.implosion+=/call_action_list,name=build_a_shard
actions.nether_portal=call_action_list,name=nether_portal_building,if=cooldown.nether_portal.remains<20
actions.nether_portal+=/call_action_list,name=nether_portal_active,if=cooldown.nether_portal.remains>165
actions.nether_portal_active=bilescourge_bombers
actions.nether_portal_active+=/grimoire_felguard,if=cooldown.summon_demonic_tyrant.remains<13|!equipped.132369
actions.nether_portal_active+=/summon_vilefiend,if=cooldown.summon_demonic_tyrant.remains>40|cooldown.summon_demonic_tyrant.remains<12
actions.nether_portal_active+=/call_dreadstalkers,if=(cooldown.summon_demonic_tyrant.remains<9&buff.demonic_calling.remains)|(cooldown.summon_demonic_tyrant.remains<11&!buff.demonic_calling.remains)|cooldown.summon_demonic_tyrant.remains>14
actions.nether_portal_active+=/call_action_list,name=build_a_shard,if=soul_shard=1&(cooldown.call_dreadstalkers.remains<action.shadow_bolt.cast_time|(talent.bilescourge_bombers.enabled&cooldown.bilescourge_bombers.remains<action.shadow_bolt.cast_time))
actions.nether_portal_active+=/hand_of_guldan,if=((cooldown.call_dreadstalkers.remains>action.demonbolt.cast_time)&(cooldown.call_dreadstalkers.remains>action.shadow_bolt.cast_time))&cooldown.nether_portal.remains>(165+action.hand_of_guldan.cast_time)
actions.nether_portal_active+=/summon_demonic_tyrant,if=buff.nether_portal.remains<5&soul_shard=0
actions.nether_portal_active+=/summon_demonic_tyrant,if=buff.nether_portal.remains<action.summon_demonic_tyrant.cast_time+0.5
actions.nether_portal_active+=/demonbolt,if=buff.demonic_core.up&soul_shard<=3
actions.nether_portal_active+=/call_action_list,name=build_a_shard
actions.nether_portal_building=use_item,name=azsharas_font_of_power,if=cooldown.nether_portal.remains<=5*spell_haste
actions.nether_portal_building+=/guardian_of_azeroth,if=!cooldown.nether_portal.remains&soul_shard>=5
actions.nether_portal_building+=/nether_portal,if=soul_shard>=5
actions.nether_portal_building+=/call_dreadstalkers,if=time>=30
actions.nether_portal_building+=/hand_of_guldan,if=time>=30&cooldown.call_dreadstalkers.remains>18&soul_shard>=3
actions.nether_portal_building+=/power_siphon,if=time>=30&buff.wild_imps.stack>=2&buff.demonic_core.stack<=2&buff.demonic_power.down&soul_shard>=3
actions.nether_portal_building+=/hand_of_guldan,if=time>=30&soul_shard>=5
actions.nether_portal_building+=/call_action_list,name=build_a_shard
actions.opener=hand_of_guldan,line_cd=30,if=azerite.explosive_potential.enabled
actions.opener+=/implosion,if=azerite.explosive_potential.enabled&buff.wild_imps.stack>2&buff.explosive_potential.down
actions.opener+=/doom,line_cd=30
actions.opener+=/guardian_of_azeroth
actions.opener+=/hand_of_guldan,if=prev_gcd.1.hand_of_guldan&soul_shard>0&prev_gcd.2.soul_strike
actions.opener+=/hand_of_guldan,if=prev_gcd.1.hand_of_guldan&!prev_gcd.2.hand_of_guldan&(buff.wild_imps.stack>1&action.hand_of_guldan.in_flight)
actions.opener+=/bilescourge_bombers
actions.opener+=/soul_strike,line_cd=30,if=!buff.bloodlust.remains|time>5&prev_gcd.1.hand_of_guldan
actions.opener+=/summon_vilefiend,if=soul_shard=5
actions.opener+=/grimoire_felguard,if=soul_shard=5
actions.opener+=/call_dreadstalkers,if=soul_shard=5
actions.opener+=/hand_of_guldan,if=soul_shard=5
actions.opener+=/hand_of_guldan,if=soul_shard>=3&prev_gcd.2.hand_of_guldan&time>5&(prev_gcd.1.soul_strike|!talent.soul_strike.enabled&prev_gcd.1.shadow_bolt)
# 2000%spell_haste is shorthand for the cast time of Demonic Tyrant. The intent is to only begin casting if a certain number of imps will be out by the end of the cast.
actions.opener+=/worldvein_resonance,if=prev_gcd.1.hand_of_guldan&prev_gcd.2.hand_of_guldan|!talent.demonic_strength.enabled&buff.wild_imps.stack+imps_spawned_during.2000%spell_haste>=6
actions.opener+=/summon_demonic_tyrant,if=prev_gcd.1.worldvein_resonance|prev_gcd.1.hand_of_guldan&prev_gcd.2.hand_of_guldan|!talent.demonic_strength.enabled&buff.wild_imps.stack+imps_spawned_during.2000%spell_haste>=6
actions.opener+=/demonbolt,if=soul_shard<=3&buff.demonic_core.remains
actions.opener+=/call_action_list,name=build_a_shard
ohhh! didn't know that! I will make adjustments. do you want me to repost a finalized version when cleanup is complete?
All cleaned up! Since I am not merging, I don't have a good way to create a diff. Let me know what you think! I feel it plays butter smooth and drops Humongous Booty Tyrants!
# Replace "imps_spawned_during.summon_demonic_tyrant" with "imps_spawned_during.2000%spell_haste" to make it a valid APL usable within SimulationCraft
# Use the following precombat actions if using within SimulationCraft
# # Executed before combat begins. Accepts non-harmful actions only.
# actions.precombat=flask
# actions.precombat+=/food
# actions.precombat+=/augmentation
# actions.precombat+=/summon_pet
# actions.precombat+=/inner_demons,if=talent.inner_demons.enabled
# actions.precombat+=/snapshot_stats
# actions.precombat+=/potion
# actions.precombat+=/demonbolt
# Hekali optimized precombat actions
# Executed before combat begins. Accepts non-harmful actions only.
# actions.precombat=flask
# actions.precombat+=/food
# actions.precombat+=/augmentation
actions.precombat+=/summon_pet
# actions.precombat+=/inner_demons,if=talent.inner_demons.enabled
# actions.precombat+=/snapshot_stats
actions.precombat+=/power_siphon,if=buff.wild_imps.stack>1&buff.demonic_core.stack<=2
actions.precombat+=/potion
actions.precombat+=/demonbolt,if=boss|action.demonbolt.cast=0
actions.precombat+=/shadow_bolt
# Executed every time the actor is available.
actions=potion,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)&(!talent.nether_portal.enabled|cooldown.nether_portal.remains>160)|time_to_die<30
actions+=/use_item,name=azsharas_font_of_power,if=cooldown.summon_demonic_tyrant.remains<=20&!talent.nether_portal.enabled
actions+=/use_items,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|time_to_die<=15
actions+=/berserking,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|time_to_die<=15
actions+=/blood_fury,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|time_to_die<=15
actions+=/fireblood,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|time_to_die<=15
actions+=/blood_of_the_enemy,if=pet.demonic_tyrant.active&pet.demonic_tyrant.remains<=15-gcd*3&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)
actions+=/worldvein_resonance,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)
actions+=/ripple_in_space,if=pet.demonic_tyrant.active&(!essence.vision_of_perfection.major|!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>=cooldown.summon_demonic_tyrant.duration-5)|time_to_die<=15
actions+=/use_item,name=pocketsized_computation_device,if=(cooldown.summon_demonic_tyrant.remains>=20&cooldown.summon_demonic_tyrant.remains<=cooldown.summon_demonic_tyrant.duration-15)|time_to_die<=30
actions+=/use_item,name=rotcrusted_voodoo_doll,if=cooldown.summon_demonic_tyrant.remains>=25|time_to_die<=30
actions+=/use_item,name=shiver_venom_relic,if=cooldown.summon_demonic_tyrant.remains>=25|time_to_die<=30
actions+=/use_item,name=aquipotent_nautilus,if=cooldown.summon_demonic_tyrant.remains>=25|time_to_die<=30
actions+=/use_item,name=tidestorm_codex,if=cooldown.summon_demonic_tyrant.remains>=25|time_to_die<=30
actions+=/use_item,name=vial_of_storms,if=cooldown.summon_demonic_tyrant.remains>=25|time_to_die<=30
actions+=/call_action_list,name=opener,if=!talent.nether_portal.enabled&time<30&!cooldown.summon_demonic_tyrant.remains
actions+=/use_item,name=azsharas_font_of_power,if=(time>30|!talent.nether_portal.enabled)&talent.grimoire_felguard.enabled&(time_to_die>120|time_to_die<cooldown.summon_demonic_tyrant.remains+15)|time_to_die<=35
actions+=/hand_of_guldan,if=azerite.explosive_potential.rank&time<5&soul_shard>2&buff.explosive_potential.down&buff.wild_imps.stack<3&!prev_gcd.1.hand_of_guldan&!prev_gcd.2.hand_of_guldan
actions+=/demonbolt,if=soul_shard<=3&buff.demonic_core.up&buff.demonic_core.stack=4
actions+=/implosion,if=azerite.explosive_potential.rank&buff.wild_imps.stack>2&buff.explosive_potential.remains<action.shadow_bolt.execute_time&(!talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains>12)
actions+=/doom,if=!ticking&time_to_die>30&spell_targets.implosion<2&!buff.nether_portal.remains
actions+=/bilescourge_bombers,if=azerite.explosive_potential.rank>0&time<10&spell_targets.implosion<2&buff.dreadstalkers.remains&talent.nether_portal.enabled
actions+=/demonic_strength,if=(essence.vision_of_perfection.major&cooldown.summon_demonic_tyrant.remains>=60)|(!essence.vision_of_perfection.major&(pet.demonic_tyrant.active|(cooldown.summon_demonic_tyrant.remains>=60&(buff.wild_imps.stack<6|spell_targets.implosion<2))))
actions+=/call_action_list,name=nether_portal,if=talent.nether_portal.enabled&spell_targets.implosion<=2
actions+=/call_action_list,name=implosion,if=spell_targets.implosion>1
actions+=/guardian_of_azeroth,if=cooldown.summon_demonic_tyrant.remains<=15|time_to_die<=30
actions+=/grimoire_felguard,if=(time_to_die>120|time_to_die<cooldown.summon_demonic_tyrant.remains+15|cooldown.summon_demonic_tyrant.remains<13)
actions+=/summon_vilefiend,if=cooldown.summon_demonic_tyrant.remains>40|cooldown.summon_demonic_tyrant.remains<12
actions+=/call_dreadstalkers,if=(cooldown.summon_demonic_tyrant.remains<9&buff.demonic_calling.remains)|(cooldown.summon_demonic_tyrant.remains<11&!buff.demonic_calling.remains)|cooldown.summon_demonic_tyrant.remains>14
actions+=/the_unbound_force,if=buff.reckless_force.react
actions+=/bilescourge_bombers
actions+=/hand_of_guldan,if=prev_gcd.1.hand_of_guldan&cooldown.summon_demonic_tyrant.remains<2&(azerite.baleful_invocation.enabled|talent.demonic_consumption.enabled)
actions+=/worldvein_resonance,if=!cooldown.summon_demonic_tyrant.remains&soul_shard<3&(!talent.demonic_consumption.enabled|buff.wild_imps.stack+imps_spawned_during.summon_demonic_tyrant>=6)
actions+=/summon_demonic_tyrant,if=prev_gcd.1.worldvein_resonance|(soul_shard<3&(!talent.demonic_consumption.enabled|(buff.wild_imps.stack+imps_spawned_during.summon_demonic_tyrant>=6&time_to_imps.all.remains<cast_time)))
actions+=/power_siphon,if=buff.wild_imps.stack>=2&buff.demonic_core.stack<=2&buff.demonic_power.down&spell_targets.implosion<2
actions+=/doom,if=talent.doom.enabled&refreshable&time_to_die>(dot.doom.remains+30)
actions+=/hand_of_guldan,if=soul_shard>=5|(soul_shard>=3&cooldown.call_dreadstalkers.remains>4&(cooldown.summon_demonic_tyrant.remains>20|(cooldown.summon_demonic_tyrant.remains<gcd*2&talent.demonic_consumption.enabled|cooldown.summon_demonic_tyrant.remains<gcd*4&!talent.demonic_consumption.enabled))&(!talent.summon_vilefiend.enabled|cooldown.summon_vilefiend.remains>3))
actions+=/soul_strike,if=soul_shard<5&buff.demonic_core.stack<=2
actions+=/demonbolt,if=soul_shard<=3&buff.demonic_core.up&((cooldown.summon_demonic_tyrant.remains<6|(cooldown.summon_demonic_tyrant.remains>22&!azerite.shadows_bite.enabled))|buff.demonic_core.stack>=3|buff.demonic_core.remains<5|time_to_die<25|buff.shadows_bite.remains)
actions+=/focused_azerite_beam,if=!pet.demonic_tyrant.active
actions+=/purifying_blast
actions+=/blood_of_the_enemy
actions+=/concentrated_flame,if=!dot.concentrated_flame_burn.remains&!action.concentrated_flame.in_flight&!pet.demonic_tyrant.active
actions+=/reaping_flames,if=!pet.demonic_tyrant.active
actions+=/call_action_list,name=build_a_shard
actions.build_a_shard=memory_of_lucid_dreams,if=soul_shard<2
actions.build_a_shard+=/soul_strike,if=!talent.demonic_consumption.enabled|time>15|(prev_gcd.1.hand_of_guldan&!buff.bloodlust.remains)
actions.build_a_shard+=/shadow_bolt
actions.implosion=implosion,if=(buff.wild_imps.stack>=6&(soul_shard<3|prev_gcd.1.call_dreadstalkers|buff.wild_imps.stack>=9|prev_gcd.1.bilescourge_bombers|(!prev_gcd.1.hand_of_guldan&!prev_gcd.2.hand_of_guldan))&!prev_gcd.1.hand_of_guldan&!prev_gcd.2.hand_of_guldan&buff.demonic_power.down)|(time_to_die<3&buff.wild_imps.stack>0)|(prev_gcd.2.call_dreadstalkers&buff.wild_imps.stack>2&!talent.demonic_calling.enabled)
actions.implosion+=/grimoire_felguard,if=cooldown.summon_demonic_tyrant.remains<13|!equipped.132369
actions.implosion+=/call_dreadstalkers,if=(cooldown.summon_demonic_tyrant.remains<9&buff.demonic_calling.remains)|(cooldown.summon_demonic_tyrant.remains<11&!buff.demonic_calling.remains)|cooldown.summon_demonic_tyrant.remains>14
actions.implosion+=/worldvein_resonance,if=!cooldown.summon_demonic_tyrant.remains
actions.implosion+=/summon_demonic_tyrant
actions.implosion+=/hand_of_guldan,if=soul_shard>=5
actions.implosion+=/hand_of_guldan,if=soul_shard>=3&(((prev_gcd.2.hand_of_guldan|buff.wild_imps.stack>=3)&buff.wild_imps.stack<9)|cooldown.summon_demonic_tyrant.remains<=gcd*2|buff.demonic_power.remains>gcd*2)
actions.implosion+=/demonbolt,if=prev_gcd.1.hand_of_guldan&soul_shard>=1&(buff.wild_imps.stack<=3|prev_gcd.3.hand_of_guldan)&soul_shard<4&buff.demonic_core.up
actions.implosion+=/summon_vilefiend,if=(cooldown.summon_demonic_tyrant.remains>40&spell_targets.implosion<=2)|cooldown.summon_demonic_tyrant.remains<12
actions.implosion+=/bilescourge_bombers,if=cooldown.summon_demonic_tyrant.remains>9
actions.implosion+=/focused_azerite_beam
actions.implosion+=/purifying_blast
actions.implosion+=/blood_of_the_enemy
actions.implosion+=/concentrated_flame,if=!dot.concentrated_flame_burn.remains&!action.concentrated_flame.in_flight&spell_targets.implosion<5
actions.implosion+=/soul_strike,if=soul_shard<5&buff.demonic_core.stack<=2
actions.implosion+=/demonbolt,if=soul_shard<=3&buff.demonic_core.up&(buff.demonic_core.stack>=3|buff.demonic_core.remains<=gcd*5.7)
actions.implosion+=/doom,cycle_targets=1,max_cycle_targets=7,if=refreshable
actions.implosion+=/call_action_list,name=build_a_shard
actions.nether_portal=call_action_list,name=nether_portal_building,if=cooldown.nether_portal.remains<20
actions.nether_portal+=/call_action_list,name=nether_portal_active,if=cooldown.nether_portal.remains>165
actions.nether_portal_active=bilescourge_bombers
actions.nether_portal_active+=/grimoire_felguard,if=cooldown.summon_demonic_tyrant.remains<13|!equipped.132369
actions.nether_portal_active+=/summon_vilefiend,if=cooldown.summon_demonic_tyrant.remains>40|cooldown.summon_demonic_tyrant.remains<12
actions.nether_portal_active+=/call_dreadstalkers,if=(cooldown.summon_demonic_tyrant.remains<9&buff.demonic_calling.remains)|(cooldown.summon_demonic_tyrant.remains<11&!buff.demonic_calling.remains)|cooldown.summon_demonic_tyrant.remains>14
actions.nether_portal_active+=/call_action_list,name=build_a_shard,if=soul_shard=1&(cooldown.call_dreadstalkers.remains<action.shadow_bolt.cast_time|(talent.bilescourge_bombers.enabled&cooldown.bilescourge_bombers.remains<action.shadow_bolt.cast_time))
actions.nether_portal_active+=/hand_of_guldan,if=((cooldown.call_dreadstalkers.remains>action.demonbolt.cast_time)&(cooldown.call_dreadstalkers.remains>action.shadow_bolt.cast_time))&cooldown.nether_portal.remains>(165+action.hand_of_guldan.cast_time)
actions.nether_portal_active+=/summon_demonic_tyrant,if=buff.nether_portal.remains<5&soul_shard=0
actions.nether_portal_active+=/summon_demonic_tyrant,if=buff.nether_portal.remains<action.summon_demonic_tyrant.cast_time+0.5
actions.nether_portal_active+=/demonbolt,if=buff.demonic_core.up&soul_shard<=3
actions.nether_portal_active+=/call_action_list,name=build_a_shard
actions.nether_portal_building=use_item,name=azsharas_font_of_power,if=cooldown.nether_portal.remains<=5*spell_haste
actions.nether_portal_building+=/guardian_of_azeroth,if=!cooldown.nether_portal.remains&soul_shard>=5
actions.nether_portal_building+=/nether_portal,if=soul_shard>=5
actions.nether_portal_building+=/call_dreadstalkers,if=time>=30
actions.nether_portal_building+=/hand_of_guldan,if=time>=30&cooldown.call_dreadstalkers.remains>18&soul_shard>=3
actions.nether_portal_building+=/power_siphon,if=time>=30&buff.wild_imps.stack>=2&buff.demonic_core.stack<=2&buff.demonic_power.down&soul_shard>=3
actions.nether_portal_building+=/hand_of_guldan,if=time>=30&soul_shard>=5
actions.nether_portal_building+=/call_action_list,name=build_a_shard
actions.opener=hand_of_guldan,line_cd=30,if=azerite.explosive_potential.enabled
actions.opener+=/implosion,if=azerite.explosive_potential.enabled&buff.wild_imps.stack>2&buff.explosive_potential.down
actions.opener+=/doom,line_cd=30
actions.opener+=/guardian_of_azeroth
actions.opener+=/hand_of_guldan,if=prev_gcd.1.hand_of_guldan&soul_shard>0&prev_gcd.2.soul_strike
actions.opener+=/hand_of_guldan,if=prev_gcd.1.hand_of_guldan&soul_shard>0&buff.wild_imps.stack>1&action.hand_of_guldan.in_flight
actions.opener+=/bilescourge_bombers
actions.opener+=/soul_strike,line_cd=30,if=!buff.bloodlust.remains|(time>5&prev_gcd.1.hand_of_guldan)
actions.opener+=/summon_vilefiend,if=soul_shard=5
actions.opener+=/grimoire_felguard,if=soul_shard=5
actions.opener+=/call_dreadstalkers,if=soul_shard=5
actions.opener+=/hand_of_guldan,if=soul_shard=5
actions.opener+=/hand_of_guldan,if=soul_shard>=3&prev_gcd.2.hand_of_guldan&time>5&(prev_gcd.1.soul_strike|(!talent.soul_strike.enabled&prev_gcd.1.shadow_bolt))
actions.opener+=/worldvein_resonance,if=(prev_gcd.1.hand_of_guldan&prev_gcd.2.hand_of_guldan)|!talent.demonic_consumption.enabled|buff.wild_imps.stack+imps_spawned_during.summon_demonic_tyrant>=6
actions.opener+=/summon_demonic_tyrant,if=prev_gcd.1.worldvein_resonance|(prev_gcd.1.hand_of_guldan&prev_gcd.2.hand_of_guldan)|!talent.demonic_consumption.enabled|buff.wild_imps.stack+imps_spawned_during.summon_demonic_tyrant>=6
actions.opener+=/demonbolt,if=soul_shard<=3&buff.demonic_core.remains
actions.opener+=/call_action_list,name=build_a_shard
So scratch the APL's I have posted here. I am working with team at simc to get a merge in of a better version. So far it's looking good and will let you know if and when it gets merged. That way this can just use the latest / official simc APL for consistency.
Thanks for the update. Glad you're helping out right at the source. One of the big challenges I've seen over time is that APL openers in SimC can be a bit of a challenge because they're built with certain assumptions that might not even hold up in SimC. Examples: opener bloodlust, enough haste in general that every action can happen fast enough -- like getting Dreadstalkers out and then enough Wild Imps to consume before they vanish.
I'll keep an eye out for changes.