## Balance Druid ## July 10, 2021 ## Changes: ## - Added Solar Beam. ## - Changed target_if cases to cycle_targets. ## - Removed unnecessary variables (i.e., prev_starsurge -> prev.starsurge). ## - Avoid precasting Wrath if it's the wrong Eclipse. ## - Make Convoke the Spirits a little more flexible (if you hadn't hit it simultaneously with BOAT + Celestial Alignment, it'd skip). ## - Make most 'fight_remains' scenarios apply to boss fights only. ## - Treat Tome of Blah Blah Blah as a special trinket. ## Annotated Balance APL can be found at https://balance-simc.github.io/Balance-SimC/md.html?file=balance.txt actions.precombat=kindred_spirits # The variable is set to 0 with no stat on use trinkets, 1 when the first one is on use, 2 if the second is and 3 if both are actions.precombat+=/variable,name=on_use_trinket,value=0 actions.precombat+=/variable,name=on_use_trinket,op=add,value=1,if=trinket.1.has_use_buff&trinket.1.cooldown.duration&!trinket.1.is.tome_of_monstrous_constructions actions.precombat+=/variable,name=on_use_trinket,op=add,value=2,if=trinket.2.has_use_buff&trinket.2.cooldown.duration&!trinket.2.is.tome_of_monstrous_constructions # These trinkets are not autmatically detected as on use stat trinkets. Always adding 1 means they will always be preferred independent of slot actions.precombat+=/variable,name=on_use_trinket,op=add,value=1,if=equipped.inscrutable_quantum_device|equipped.empyreal_ordnance|equipped.soulletting_ruby actions.precombat+=/moonkin_form # Precast 2 Wrath and a Starsurge on ST with Night Fae and BoAT or Starfire otherwise actions.precombat+=/wrath,line_cd=10,if=(eclipse.lunar_next|eclipse.in_solar|eclipse.in_both|eclipse.any_next) actions.precombat+=/wrath,if=(eclipse.lunar_next|eclipse.in_solar|eclipse.in_both|eclipse.any_next)&prev.1.wrath&!prev.2.wrath actions.precombat+=/starfire,if=!runeforge.balance_of_all_things|!covenant.night_fae|!spell_targets.starfall=1|!talent.natures_balance.enabled|(eclipse.solar_next|eclipse.in_lunar|eclipse.in_both|eclipse.any_next) actions.precombat+=/starsurge,if=runeforge.balance_of_all_things&covenant.night_fae&spell_targets.starfall=1 ## Executed every time the actor is available. actions=solar_beam # Sets AoE on 3+ without drift and with Starlord and 2+ otherwise actions+=/variable,name=is_aoe,value=spell_targets.starfall>1&(!talent.starlord.enabled|talent.stellar_drift.enabled)|spell_targets.starfall>2 # Sets cleave when Starfire can hit 2+ targets which is relevant for the Eclipse to be preferred and which filler to cast actions+=/variable,name=is_cleave,value=spell_targets.starfire>1 # Use Berserking with CA/Inc or after Convoke in CA/Inc actions+=/berserking,if=(!covenant.night_fae|!cooldown.convoke_the_spirits.up)&buff.ca_inc.remains>15&buff.ravenous_frenzy.remains<4&!covenant.venthyr|covenant.venthyr&buff.ca_inc.up&buff.ravenous_frenzy.up&(buff.ravenous_frenzy.remains<11-5*runeforge.sinful_hysteria|buff.ca_inc.remains<11|1%spell_haste<1.55) # Pot with a CA/Inc that isn't a Pulsar proc or when the fight is about to end actions+=/potion,if=buff.ca_inc.remains>15&(!runeforge.sinful_hysteria|buff.ravenous_frenzy.remains<17-2*buff.bloodlust.up&buff.ravenous_frenzy.up)|boss&fight_remains<25 # Calculates whether using Convoke now will allow you to still cast the same amount of Convoke+CA/Inc casts actions+=/variable,name=convoke_desync,value=ceil((fight_remains-15-cooldown.ca_inc.remains)%180)=ceil((fight_remains-15-120-cooldown.convoke_the_spirits.remains)%180)&!raid_event.adds.exists|cooldown.ca_inc.remains>interpolated_fight_remains|cooldown.convoke_the_spirits.remains>interpolated_fight_remains-10|!covenant.night_fae|action.convoke_the_spirits.disabled # Used to delay the usage of CA/Inc when using double on use and prevent usage when an add event is about to die actions+=/variable,name=cd_condition,value=(fight_remains>15|raid_event.adds.in>50)&(((equipped.empyreal_ordnance&((cooldown.empyreal_ordnance.remains<160|covenant.venthyr&cooldown.empyreal_ordnance.remains<167+(11*runeforge.sinful_hysteria))&!cooldown.empyreal_ordnance.ready))|(equipped.soulletting_ruby&(!covenant.night_fae|cooldown.soulletting_ruby_345801.remains<114))|(cooldown.berserking.ready|!race.troll)&((equipped.inscrutable_quantum_device&cooldown.inscrutable_quantum_device.ready)|(equipped.shadowed_orb_of_torment&cooldown.tormented_insight_355321.remains)|((variable.on_use_trinket=1|variable.on_use_trinket=3)&(trinket.1.ready_cooldown|trinket.1.cooldown.remains>interpolated_fight_remains-10)|variable.on_use_trinket=2&(trinket.2.ready_cooldown|trinket.2.cooldown.remains>interpolated_fight_remains-10)|variable.on_use_trinket=0)))|covenant.kyrian)|boss&fight_remains200|boss&fight_remains<25+(40-buff.thrill_seeker.stack*2)|buff.thrill_seeker.stack>38-(runeforge.sinful_hysteria*5) # Use Empyreal Ordnance 20secs before a CA/Inc use. actions+=/use_item,name=empyreal_ordnance,if=cooldown.ca_inc.remains<20&cooldown.convoke_the_spirits.remains<20&(variable.thrill_seeker_wait|buff.thrill_seeker.stack>30+(runeforge.sinful_hysteria*6))|boss&fight_remains<37 # Use Soulleting Ruby 6secs before a CA/Inc use. actions+=/use_item,name=soulletting_ruby,if=cooldown.ca_inc.remains<6&!covenant.venthyr&!covenant.night_fae|covenant.night_fae&cooldown.convoke_the_spirits.remains<6&(variable.convoke_desync|cooldown.ca_inc.remains<6)|covenant.venthyr&(!runeforge.sinful_hysteria&cooldown.ca_inc.remains<6|buff.ravenous_frenzy.remains<14+(5*equipped.instructors_divine_bell)&buff.ravenous_frenzy.up)|boss&fight_remains<25 actions+=/use_item,name=inscrutable_quantum_device,if=buff.ca_inc.remains>15&(!runeforge.sinful_hysteria|buff.ravenous_frenzy.remains<12+(3*buff.bloodlust.up)+((7-5*buff.bloodlust.up)*equipped.instructors_divine_bell)&buff.ravenous_frenzy.up)|boss&fight_remains<25 # Use right before cds actions+=/use_item,name=shadowed_orb_of_torment,if=(cooldown.ca_inc.ready&!covenant.night_fae&variable.thrill_seeker_wait|covenant.night_fae&cooldown.convoke_the_spirits.ready&(variable.convoke_desync|cooldown.ca_inc.ready))&dot.sunfire.ticking&(dot.stellar_flare.ticking|!talent.stellar_flare.enabled|spell_targets.starfire>3)&(dot.moonfire.ticking)&(variable.is_aoe|runeforge.balance_of_all_things|astral_power>=90|buff.bloodlust.up)&(cooldown.berserking.ready|!race.troll)|boss&fight_remains<40 # This is a rather elaborate way to make all on use stat trinkets to be lined up with CA/Inc and Convoke and use the 2nd slot on cd if both trinkets are on use stat trinkets actions+=/use_items,slots=trinket1,if=variable.on_use_trinket=2&!trinket.2.ready_cooldown|(variable.on_use_trinket=1|variable.on_use_trinket=3)&(buff.ca_inc.up&(!covenant.venthyr|buff.ravenous_frenzy.remains+(5*runeforge.sinful_hysteria)<=trinket.1.buff_duration&buff.ravenous_frenzy.up|buff.ravenous_frenzy_sinful_hysteria.up)|cooldown.ca_inc.remains+2>trinket.1.cooldown.duration&!buff.ca_inc.up&(!covenant.night_fae|!variable.convoke_desync)&!covenant.kyrian|covenant.night_fae&variable.convoke_desync&cooldown.convoke_the_spirits.up&!cooldown.ca_inc.up&((buff.eclipse_lunar.remains>10|buff.eclipse_solar.remains>10)&!runeforge.balance_of_all_things|(buff.balance_of_all_things_nature.stack=5|buff.balance_of_all_things_arcane.stack=8))|buff.kindred_empowerment_energize.up)|fight_remains<20|variable.on_use_trinket=0 actions+=/use_items,slots=trinket2,if=variable.on_use_trinket!=2&!trinket.1.ready_cooldown|variable.on_use_trinket=2&(buff.ca_inc.up&(!covenant.venthyr|buff.ravenous_frenzy.remains+(5*runeforge.sinful_hysteria)<=trinket.2.buff_duration&buff.ravenous_frenzy.up|buff.ravenous_frenzy_sinful_hysteria.up)|cooldown.ca_inc.remains+2>trinket.2.cooldown.duration&!buff.ca_inc.up&(!covenant.night_fae|!variable.convoke_desync)&!covenant.kyrian&(!buff.ca_inc.up|!covenant.venthyr)|covenant.night_fae&variable.convoke_desync&cooldown.convoke_the_spirits.up&!cooldown.ca_inc.up&((buff.eclipse_lunar.remains>10|buff.eclipse_solar.remains>10)&!runeforge.balance_of_all_things|(buff.balance_of_all_things_nature.stack=5|buff.balance_of_all_things_arcane.stack=8)))|buff.kindred_empowerment_energize.up|fight_remains<20|variable.on_use_trinket=0 # Uses all other on use items on cd actions+=/use_items # Decide action list based on situation/legis actions+=/run_action_list,name=aoe,strict=1,if=variable.is_aoe actions+=/run_action_list,name=boat,strict=1,if=runeforge.balance_of_all_things.equipped actions+=/run_action_list,name=st # Calculates whether the Dreamcatcher buff will fall off within the next cast actions.aoe=variable,name=dream_will_fall_off,value=(buff.timeworn_dreambinder.remains5&talent.soul_of_the_forest.enabled|spell_targets.starfire>7) # Use Convoke when at less than 50 AsP and line up with CA/Inc actions.aoe+=/convoke_the_spirits,if=!druid.no_cds&((variable.convoke_desync&!cooldown.ca_inc.ready|buff.ca_inc.up)&(buff.eclipse_lunar.remains>6|buff.eclipse_solar.remains>6)&(!runeforge.balance_of_all_things|buff.balance_of_all_things_nature.stack>3|buff.balance_of_all_things_arcane.stack>3)|boss&fight_remains<10&!cooldown.ca_inc.ready) # Use Frenzy with CA/Inc actions.aoe+=/ravenous_frenzy,if=buff.ca_inc.remains>15 # Use Sunfire in pandemic on anything that lives 14secs and less with more targets and at the end of a Solar Eclipse at 14 secs or less remaining as to not having to refresh during Lunar Eclipse actions.aoe+=/sunfire,cycle_targets=1,if=(refreshable|buff.eclipse_solar.remains<3&eclipse.in_solar&remains<14&talent.soul_of_the_forest.enabled)&target.time_to_die>14-spell_targets+remains&(eclipse.in_any|remains=4)&(!runeforge.lycaras_fleeting_glimpse|time%%45>buff.starfall.remains+2)&target.time_to_die>5 # With Stellar Drift use on cd when refreshable but still wait for Lycaras proc and don't use before CDs. Still use before Convoke since that will proc another Starfall actions.aoe+=/starfall,if=talent.stellar_drift.enabled&buff.starfall.refreshable&(!runeforge.lycaras_fleeting_glimpse|time%%45>4)&target.time_to_die>3 # With Dreambinder use Starfall to keep up the buff by also using Starfall on 5 seconds or less remaining actions.aoe+=/starfall,if=runeforge.timeworn_dreambinder&spell_targets.starfall>=3&(!buff.timeworn_dreambinder.up&buff.starfall.refreshable|(variable.dream_will_fall_off&(buff.starfall.remains<3|spell_targets.starfall>2&talent.stellar_drift.enabled&buff.starfall.remains<5))) # Calculates whether a Starsurge use will cause Starfall to fall off, and use Starsurge to keep Dreambinder stack up actions.aoe+=/variable,name=starfall_wont_fall_off,value=astral_power>80-(10*buff.timeworn_dreambinder.stack)-(buff.starfall.remains*3%spell_haste*!talent.stellar_drift.enabled)-(cooldown.starfall.remains*3%spell_haste*talent.stellar_drift.enabled)-(dot.fury_of_elune.remains*5)&(buff.starfall.up|cooldown.starfall.remains) # Use Starsurge with Dreambinder to keep up the buff without losing Starfall uptime and use Starsurge on 4+ BoAT stacks until 4 targets actions.aoe+=/starsurge,if=variable.dream_will_fall_off&variable.starfall_wont_fall_off&!variable.ignore_starsurge|(buff.balance_of_all_things_nature.stack>3|buff.balance_of_all_things_arcane.stack>3)&spell_targets.starfall<4&variable.starfall_wont_fall_off # Use swarm so that you get max uptime by using it as late as possible on less than 3 stacks or just when 3+ stacks expire actions.aoe+=/adaptive_swarm,cycle_targets=1,if=!ticking&!action.adaptive_swarm_damage.in_flight|dot.adaptive_swarm_damage.stack<3&dot.adaptive_swarm_damage.remains<3 # Refresh Moonfire if CA/Inc is ready, there are less than 5 targets in Lunar Eclipse with SotF, less than 10 otherwise in any Eclipse or up to 5 targets before a Lunar Eclipse. Don't refresh during Kindred Empowerment unless in Solar Eclipse actions.aoe+=/moonfire,cycle_targets=1,if=refreshable&target.time_to_die>((14+(spell_targets.starfire*2*buff.eclipse_lunar.up))+remains)%(1+talent.twin_moons.enabled)&(cooldown.ca_inc.ready&!druid.no_cds&(variable.convoke_desync|cooldown.convoke_the_spirits.ready|!covenant.night_fae)|spell_targets.starfire<((6-(buff.eclipse_lunar.up*2))*(1+talent.twin_moons.enabled))&!eclipse.solar_next|(eclipse.in_solar|(eclipse.in_both|eclipse.in_lunar)&!talent.soul_of_the_forest.enabled|buff.primordial_arcanic_pulsar.value>=250)&(spell_targets.starfire<10*(1+talent.twin_moons.enabled))&astral_power>50-buff.starfall.remains*6)&(!buff.kindred_empowerment_energize.up|eclipse.in_solar|!covenant.kyrian)&!buff.ravenous_frenzy_sinful_hysteria.up # Use FoN on cd without capping actions.aoe+=/force_of_nature,if=ap_check actions.aoe+=/variable,name=cd_condition_aoe,value=!druid.no_cds&variable.cd_condition&((buff.starfall.up|talent.stellar_drift.enabled|covenant.night_fae)&(!buff.solstice.up&!buff.ca_inc.up&(!talent.fury_of_elune.enabled|buff.ca_inc.duration>cooldown.fury_of_elune.remains+8)&variable.thrill_seeker_wait&(!covenant.night_fae|cooldown.convoke_the_spirits.up&(buff.starfall.remains<2|!talent.stellar_drift.enabled))&target.time_to_die>buff.ca_inc.duration*0.7)|fight_remains=250)&buff.starfall.up&(cooldown.ca_inc.remains>50|druid.no_cds) # Refresh flare on up to 3 targets without CA/Inc being about to expire and not overcapping actions.aoe+=/stellar_flare,cycle_targets=1,if=refreshable&time_to_die>15&spell_targets.starfire<4&ap_check&(buff.ca_inc.remains>10|!buff.ca_inc.up) # Use FoE if inside an Eclipse and line it up with a Pulsar proc and Adaptive Swarm actions.aoe+=/fury_of_elune,if=eclipse.in_any&ap_check&buff.primordial_arcanic_pulsar.value<250&(dot.adaptive_swarm_damage.ticking|!covenant.necrolord|spell_targets>2)&(buff.ravenous_frenzy.remains<9-(5*runeforge.sinful_hysteria)&buff.ravenous_frenzy.up|!buff.ravenous_frenzy.up)&(!cooldown.ca_inc.up|buff.thrill_seeker.stack<15&fight_remains<200&fight_remains>100|!soulbind.thrill_seeker.enabled)&(soulbind.thrill_seeker.enabled|cooldown.ca_inc.remains>30) # Use a Starfall Oneth proc unless Starfall is already up or you are about to overcap AsP actions.aoe+=/starfall,if=buff.oneths_perception.up&(buff.starfall.refreshable|astral_power>90) # Dump AsP before Convoke with Starfall and then Starsurge actions.aoe+=/starfall,if=covenant.night_fae&!talent.stellar_drift.enabled&(variable.convoke_desync|cooldown.ca_inc.up|buff.ca_inc.up)&cooldown.convoke_the_spirits.remainsexecute_time|(charges=2&recharge_time<5)|charges=3)&ap_check actions.aoe+=/half_moon,if=(buff.eclipse_solar.remains>execute_time|(charges=2&recharge_time<5)|charges=3)&ap_check&(buff.ravenous_frenzy.remains<5&buff.ravenous_frenzy.up&!runeforge.sinful_hysteria|!buff.ravenous_frenzy.up) actions.aoe+=/full_moon,if=(buff.eclipse_solar.remains>execute_time&(cooldown.ca_inc.remains>50|cooldown.convoke_the_spirits.remains>50)|(charges=2&recharge_time<5)|charges=3)&ap_check&(buff.ravenous_frenzy.remains<5&buff.ravenous_frenzy.up&!runeforge.sinful_hysteria|!buff.ravenous_frenzy.up) # Use WoE on CD actions.aoe+=/warrior_of_elune # Calculates whether to use Starfire in Solar which is at 5 targets+1 for every 20% mastery or 4 Starsurge Empowerment stacks actions.aoe+=/variable,name=starfire_in_solar,value=spell_targets.starfire>4+floor(mastery_value*100%20)+floor(buff.starsurge_empowerment_solar.stack%4) # Calculates whether to Wrath during Frenzy actions.aoe+=/variable,name=wrath_in_frenzy,value=1%spell_haste<2-(0.2*(spell_targets.starfire-1)*(1+talent.soul_of_the_forest.enabled*1.5))+0.15*buff.ravenous_frenzy.remains # Use Wrath in Solar Eclipse or if no Starfire will fit into CA/Inc anymore actions.aoe+=/wrath,if=(eclipse.lunar_next|eclipse.any_next&variable.is_cleave)&(target.time_to_die>4|eclipse.lunar_in_2|fight_remains<10)|buff.eclipse_solar.remainsexecute_time # Use Starfire if in Lunar Eclipse, in Solar Eclipse on 4+ targets or to proc Solar Eclipse actions.aoe+=/starfire # Fallthru actions.aoe+=/run_action_list,name=fallthru # Frenzy with CA/Inc actions.boat=ravenous_frenzy,if=buff.ca_inc.remains>15 # Use Adaptive Swarm when at less than 4 BoAT stacks and to refresh a <=2 stack as late as possible or time it so it arrives just after a 3+ stack expires actions.boat+=/adaptive_swarm,cycle_targets=1,if=buff.balance_of_all_things_nature.stack<8&buff.balance_of_all_things_arcane.stack<8&(!dot.adaptive_swarm_damage.ticking&!action.adaptive_swarm_damage.in_flight&(!dot.adaptive_swarm_heal.ticking|dot.adaptive_swarm_heal.remains>3)|dot.adaptive_swarm_damage.stack<3&dot.adaptive_swarm_damage.remains<5&dot.adaptive_swarm_damage.ticking) # Use Convoke with CA/Inc when possible and otherwise with a BoAT buff when desyncing actions.boat+=/convoke_the_spirits,if=!druid.no_cds&((variable.convoke_desync&!cooldown.ca_inc.ready|buff.ca_inc.up)&(buff.balance_of_all_things_nature.stack=8|buff.balance_of_all_things_arcane.stack=8)|boss&fight_remains<10) # FoE as the first gcd in the a BoAT window or with the Kyrian buff or with a 8+sec Adaptive Swarm and wait for CA/Inc if it wont be up again before the cd is finished actions.boat+=/fury_of_elune,if=(((buff.balance_of_all_things_nature.stack>6|buff.balance_of_all_things_arcane.stack>6)&(!covenant.venthyr|!buff.ravenous_frenzy.up))&(druid.no_cds|cooldown.ca_inc.remains>50|(covenant.night_fae&cooldown.convoke_the_spirits.remains>50)))|(dot.adaptive_swarm_damage.remains>8&cooldown.ca_inc.remains>10&covenant.necrolord)|boss&interpolated_fight_remains<8&!cooldown.ca_inc.ready|covenant.kyrian&buff.kindred_empowerment.up|covenant.venthyr&buff.ravenous_frenzy.remains<9&buff.ravenous_frenzy.up # Cancel Starlord with a new BoAT buff and CA/Inc isn't about to be used actions.boat+=/cancel_buff,name=starlord,if=(buff.balance_of_all_things_nature.remains>7.5|buff.balance_of_all_things_arcane.remains>7.5)&(cooldown.ca_inc.remains>7|(cooldown.empower_bond.remains>7&!buff.kindred_empowerment_energize.up&covenant.kyrian))&astral_power>=30 # Dump Starsurges with a BoAT buff but not when pooling for CA/Inc or Kindred Spirits actions.boat+=/starsurge,if=(buff.balance_of_all_things_nature.stack>2|buff.balance_of_all_things_arcane.stack>2)&(covenant.night_fae|cooldown.ca_inc.remains>7|!variable.cd_condition&!covenant.kyrian|(cooldown.empower_bond.remains>7&!buff.kindred_empowerment_energize.up&covenant.kyrian))&(!dot.fury_of_elune.ticking|!cooldown.ca_inc.ready|!cooldown.convoke_the_spirits.ready) # Dump Starsurges before Convoke actions.boat+=/starsurge,if=(cooldown.convoke_the_spirits.remains<5&!druid.no_cds&(variable.convoke_desync|cooldown.ca_inc.remains<5)&variable.cd_condition)&!dot.fury_of_elune.ticking&covenant.night_fae&!druid.no_cds&eclipse.in_any&astral_power>40 # Don't dot during the end of Ravenous Frenzy, during kindred empowerment or in the last gcd of an Eclipse actions.boat+=/variable,name=dot_requirements,value=(buff.ravenous_frenzy.remains>5|!buff.ravenous_frenzy.up)&(buff.kindred_empowerment_energize.remainsgcd.max|buff.eclipse_lunar.remains>gcd.max) actions.boat+=/sunfire,cycle_targets=1,if=refreshable&target.time_to_die>16&ap_check&variable.dot_requirements actions.boat+=/moonfire,cycle_targets=1,if=refreshable&target.time_to_die>13.5&ap_check&variable.dot_requirements actions.boat+=/stellar_flare,cycle_targets=1,if=refreshable&target.time_to_die>16+remains&ap_check&variable.dot_requirements # FoN on cd without capping actions.boat+=/force_of_nature,if=ap_check # Empower Bond when about to enter a new BoAT window and save for CA/Inc actions.boat+=/empower_bond,if=(eclipse.lunar_next|eclipse.solar_next|eclipse.any_next|buff.balance_of_all_things_nature.remains>7.5|buff.balance_of_all_things_arcane.remains>7.5|astral_power>90&cooldown.ca_inc.ready&!druid.no_cds)&(cooldown.ca_inc.remains>30|cooldown.ca_inc.ready)|boss&interpolated_fight_remains<10 # FoE right before using CA actions.boat+=/fury_of_elune,if=cooldown.ca_inc.ready&variable.cd_condition&(astral_power>90&!covenant.night_fae|covenant.night_fae&astral_power<40)&!covenant.venthyr&(!covenant.night_fae|cooldown.convoke_the_spirits.ready)&!druid.no_cds # CA/Inc when at 90+ AsP (orlower than 40 AsP with Convoke) without losing time in Bloodlust and line up with Convoke if it was desynced actions.boat+=/variable,name=cd_condition_boat,value=!druid.no_cds&variable.cd_condition&((astral_power>90&(buff.kindred_empowerment_energize.up|!covenant.kyrian)|buff.bloodlust.up&buff.bloodlust.remains110|astral_power+variable.aspPerSec*buff.eclipse_lunar.remains+dot.fury_of_elune.ticks_remain*2.5>110)&eclipse.in_any&(!buff.ca_inc.up|!talent.starlord.enabled)&((!cooldown.ca_inc.up|covenant.kyrian&!cooldown.empower_bond.up)|covenant.night_fae)&(!covenant.venthyr|!buff.ca_inc.up|astral_power>90)|(talent.starlord.enabled&buff.ca_inc.up&(buff.starlord.stack<3|astral_power>90))|buff.ca_inc.up&!buff.ravenous_frenzy.up&!talent.starlord.enabled # Use Moons in Lunar Eclipse and save Half+Full Moon for CA/Inc actions.boat+=/new_moon,if=(buff.eclipse_lunar.remains>execute_time|(charges=2&recharge_time<5)|charges=3)&ap_check actions.boat+=/half_moon,if=(buff.eclipse_lunar.remains>execute_time&(cooldown.ca_inc.remains>50|cooldown.convoke_the_spirits.remains>50)|(charges=2&recharge_time<5)|charges=3)&ap_check actions.boat+=/full_moon,if=(buff.eclipse_lunar.remains>execute_time&(cooldown.ca_inc.remains>50|cooldown.convoke_the_spirits.remains>50)|(charges=2&recharge_time<5)|charges=3)&ap_check # WoE on cd actions.boat+=/warrior_of_elune # Use Starfire to proc Solar Eclipse or when in only Lunar Eclipse and use WoE procs if in Lunar Eclipse actions.boat+=/starfire,if=eclipse.in_lunar|eclipse.solar_next|eclipse.any_next|buff.warrior_of_elune.up&buff.eclipse_lunar.up|(buff.ca_inc.remainsremains*22%18 actions.fallthru+=/moonfire # Use Starsurge to keep up the Dreambinder buff if it would expire before finishing the next cast or to dump before Convoke actions.st=starsurge,if=runeforge.timeworn_dreambinder&(eclipse.in_any&!((buff.timeworn_dreambinder.remains>action.wrath.execute_time+0.1&(eclipse.in_both|eclipse.in_solar|eclipse.lunar_next)|buff.timeworn_dreambinder.remains>action.starfire.execute_time+0.1&(eclipse.in_lunar|eclipse.solar_next|eclipse.any_next))|!buff.timeworn_dreambinder.up)|(buff.ca_inc.up|variable.convoke_desync)&cooldown.convoke_the_spirits.ready&covenant.night_fae)&(!covenant.kyrian|cooldown.empower_bond.remains>8)&(buff.ca_inc.up|!cooldown.ca_inc.ready) # Use Adaptive Swarm when there is no active swarm, as late as possible on swarm with 2 or fewer stacks or on a 3+ swarm so that the new swarm arrives just after that swarm expires actions.st+=/adaptive_swarm,cycle_targets=1,if=!dot.adaptive_swarm_damage.ticking&!action.adaptive_swarm_damage.in_flight&(!dot.adaptive_swarm_heal.ticking|dot.adaptive_swarm_heal.remains>5)|dot.adaptive_swarm_damage.stack<3&dot.adaptive_swarm_damage.remains<3&dot.adaptive_swarm_damage.ticking # Uses Convoke if CA/Inc is up or you are desyncing CA/Inc with Convoke and you are below 40 AsP actions.st+=/convoke_the_spirits,if=!druid.no_cds&((variable.convoke_desync&!cooldown.ca_inc.ready&!runeforge.primordial_arcanic_pulsar|buff.ca_inc.up)&astral_power<=40&(buff.eclipse_lunar.remains>10|buff.eclipse_solar.remains>10)|boss&fight_remains<10&!cooldown.ca_inc.ready) # Condition for all dots that makes sure they aren't refreshed when Ravenous Frenzy has less than 5 secs remaining or the kyrian buff is about to fall off or any Eclipse is about to expire actions.st+=/variable,name=dot_requirements,value=(buff.ravenous_frenzy.remains>5|!buff.ravenous_frenzy.up)&!buff.ravenous_frenzy_sinful_hysteria.up&(buff.kindred_empowerment_energize.remainsgcd.max|buff.eclipse_lunar.remains>gcd.max|(!buff.eclipse_lunar.up|!buff.eclipse_solar.up)&!talent.solstice.enabled) # Condition that checks if you are outside eclipse to only dot there or ignore this with Solstice actions.st+=/variable,name=dot_outside_eclipse,value=(!buff.eclipse_solar.up&!buff.eclipse_lunar.up)|talent.solstice.enabled actions.st+=/moonfire,cycle_targets=1,if=refreshable&(buff.eclipse_solar.remains>remains|buff.eclipse_lunar.remains>remains|variable.dot_outside_eclipse)&refreshable&target.time_to_die>12&ap_check&variable.dot_requirements actions.st+=/sunfire,cycle_targets=1,if=refreshable&(buff.eclipse_solar.remains>remains|buff.eclipse_lunar.remains>remains|variable.dot_outside_eclipse)&refreshable&target.time_to_die>12&ap_check&variable.dot_requirements actions.st+=/stellar_flare,cycle_targets=1,if=refreshable&(buff.eclipse_solar.remains>remains|buff.eclipse_lunar.remains>remains|variable.dot_outside_eclipse)&refreshable&target.time_to_die>16&ap_check&variable.dot_requirements # Use FoN on cd without capping actions.st+=/force_of_nature,if=ap_check # Use Kindred Spirits with any long enough lasting Eclipse and try to line it up with Pulsar and CA/Inc actions.st+=/empower_bond,if=((buff.eclipse_solar.remains>10|buff.eclipse_lunar.remains>10)&cooldown.ca_inc.remains>30&(buff.primordial_arcanic_pulsar.value<240|!runeforge.primordial_arcanic_pulsar.equipped))|buff.primordial_arcanic_pulsar.value>=270|cooldown.ca_inc.ready&astral_power>90 # Use CA/Inc with Convoke/Kindred Spirits and don't overwrite Pulsar or when Bloodlust would expire before CA/Inc expires actions.st+=/variable,name=cd_condition_st,value=!druid.no_cds&variable.cd_condition&((cooldown.empyreal_ordnance.remains<167+(11*runeforge.sinful_hysteria)&equipped.empyreal_ordnance)|astral_power>=90&(!talent.fury_of_elune.enabled|buff.ca_inc.duration>cooldown.fury_of_elune.remains+8)&variable.thrill_seeker_wait&(buff.kindred_empowerment_energize.up|!covenant.kyrian)&target.time_to_die>buff.ca_inc.duration*0.7|boss&fight_remains15|buff.ca_inc.duration<30&variable.cd_condition_st actions.st+=/celestial_alignment,if=variable.cd_condition_st&(!buff.ca_inc.duration>30|!covenant.venthyr)|buff.ravenous_frenzy.up&buff.ravenous_frenzy.remains<9+conduit.precise_alignment.time_value+(!buff.bloodlust.up&!talent.starlord.enabled) actions.st+=/incarnation,if=variable.cd_condition_st # Variable used on abilities that want to be saved for CA/Inc so that they arent wasted just before them actions.st+=/variable,name=save_for_ca_inc,value=!cooldown.ca_inc.ready|!variable.convoke_desync&covenant.night_fae|druid.no_cds # Uses FoE if in an Eclipse and tries to line it up with Pulsar, CA/Inc and Adaptive Swarm actions.st+=/fury_of_elune,if=eclipse.in_any&ap_check&buff.primordial_arcanic_pulsar.value<240&(dot.adaptive_swarm_damage.ticking|!covenant.necrolord)&variable.save_for_ca_inc&(buff.ravenous_frenzy.remains<9-(5*runeforge.sinful_hysteria)&buff.ravenous_frenzy.up|!buff.ravenous_frenzy.up) # Use Oneth Starfall procs if Starfall isn't up actions.st+=/starfall,if=buff.oneths_perception.up&buff.starfall.refreshable actions.st+=/cancel_buff,name=starlord,if=buff.starlord.remains<5&(buff.eclipse_solar.remains>5|buff.eclipse_lunar.remains>5)&astral_power>90 # Dumps AsP before Convoke using the Convoke condition to check if Convoke is actually about to be cast actions.st+=/starsurge,if=covenant.night_fae&variable.convoke_desync&cooldown.convoke_the_spirits.remains<5&!druid.no_cds&eclipse.in_any&astral_power>40 # Use Starfall with Stellar Drift and no Starlord, when no Starfall is up, you are in Lunar Eclipse for 8+secs or to proc Pulsar when above 90 AsP or adpative swarm has 8+secs remaining or is in flight. Note that under the same conditions it's dps neutral to Starfall during Ravenous Frenzy, when you'd still end up with 90+asp for the last globals. actions.st+=/starfall,if=talent.stellar_drift.enabled&!talent.starlord.enabled&buff.starfall.refreshable&(buff.eclipse_lunar.remains>8&eclipse.in_lunar&buff.primordial_arcanic_pulsar.value<250|buff.primordial_arcanic_pulsar.value>=250&astral_power>90|dot.adaptive_swarm_damage.remains>8|action.adaptive_swarm_damage.in_flight)&cooldown.ca_inc.remains>10 # Use Starsurge Oneth procs and dump AsP when CA/Inc or the Venthyr buff is about to fall off or you'd cap AsP actions.st+=/starsurge,if=buff.oneths_clear_vision.up|buff.kindred_empowerment_energize.up|buff.ca_inc.up&(buff.ravenous_frenzy.remains90&eclipse.in_any # Try to make the best of Starlord by stacking it up quickly in any Eclipse but Pulsar isnt about to be procced actions.st+=/starsurge,if=talent.starlord.enabled&!runeforge.timeworn_dreambinder&(buff.starlord.up|astral_power>90)&buff.starlord.stack<3&(buff.eclipse_solar.up|buff.eclipse_lunar.up)&buff.primordial_arcanic_pulsar.value<270&(cooldown.ca_inc.remains>10|!variable.convoke_desync&covenant.night_fae) # Estimates how much AsP are gained per second actions.st+=/variable,name=aspPerSec,value=eclipse.in_lunar*8%action.starfire.execute_time+!eclipse.in_lunar*(6+talent.soul_of_the_forest.enabled*3)%action.wrath.execute_time+0.45%spell_haste+0.5*talent.natures_balance.enabled # Dump Starsurge in a 7+sec Solar Eclipse, don't let it proc Pulsar (that is handled by either the Starfall line or the AsP>90 line for Starsurge), don't overwrite an Oneth proc and let the above line handle Starlord actions.st+=/starsurge,if=!runeforge.timeworn_dreambinder&(buff.primordial_arcanic_pulsar.value<270|buff.primordial_arcanic_pulsar.value<250&talent.stellar_drift.enabled)&(eclipse.in_solar&astral_power+variable.aspPerSec*buff.eclipse_solar.remains+dot.fury_of_elune.ticks_remain*2.5>80|eclipse.in_lunar&astral_power+variable.aspPerSec*buff.eclipse_lunar.remains+dot.fury_of_elune.ticks_remain*2.5>90)&!buff.oneths_perception.up&!talent.starlord.enabled&(cooldown.ca_inc.remains>7|soulbind.thrill_seeker.enabled&buff.thrill_seeker.stack<33-(runeforge.sinful_hysteria*5)&fight_remains>100&fight_remains<200)&(cooldown.kindred_spirits.remains>7|!covenant.kyrian) # Use Moons in Lunar Eclipse and save Half+Full Moon for CA/Inc and Kindred Empowerment actions.st+=/new_moon,if=(buff.eclipse_lunar.remains>execute_time|(charges=2&recharge_time<5)|charges=3)&ap_check&variable.save_for_ca_inc actions.st+=/half_moon,if=(buff.eclipse_lunar.remains>execute_time&!covenant.kyrian|(buff.kindred_empowerment_energize.up&covenant.kyrian)|(charges=2&recharge_time<5)|charges=3|buff.ca_inc.up)&ap_check&variable.save_for_ca_inc&(buff.ravenous_frenzy.remains<(5-2*runeforge.sinful_hysteria)&buff.ravenous_frenzy.up|!buff.ravenous_frenzy.up) actions.st+=/full_moon,if=(buff.eclipse_lunar.remains>execute_time&!covenant.kyrian|(buff.kindred_empowerment_energize.up&covenant.kyrian)|(charges=2&recharge_time<5)|charges=3|buff.ca_inc.up)&ap_check&variable.save_for_ca_inc&(buff.ravenous_frenzy.remains<5&buff.ravenous_frenzy.up&!runeforge.sinful_hysteria|!buff.ravenous_frenzy.up) # Use WoE on cd actions.st+=/warrior_of_elune # Use Starfire to proc Solar Eclipse, CA/Inc has less time than a Wrath execute left or only Lunar Eclipse is up actions.st+=/starfire,if=eclipse.in_lunar|eclipse.solar_next|eclipse.any_next|(buff.warrior_of_elune.up|spell_haste<0.45&!covenant.venthyr|spell_haste<0.4&covenant.venthyr)&buff.eclipse_lunar.up|(buff.ca_inc.remains