Hekili Priority Helper

Hekili Priority Helper

53M Downloads

APL Sync Status

github-actions opened this issue · 1 comments

commented

Last run: 2025-09-15T12:09:44.906Z

This issue updates automatically. DPS and Tank specs are checked against SimulationCraft. Healer specs are listed separately at the bottom as they are not tracked by SimC.

Spec Addon SHA SimC SHA Status
Blood Death Knight 7877e91 7877e91 ✅ Up to date
Frost Death Knight 8aa4db9 8aa4db9 ✅ Up to date
Unholy Death Knight 05c05de 05c05de ✅ Up to date
Havoc Demon Hunter 04a038d f240db3 ❌ Out of date — 2 commits missing
Vengeance Demon Hunter 65d756b 65d756b ✅ Up to date
Balance Druid 4c75fa4 9316a64 ❌ Out of date — 1 commit missing
Feral Druid 5340e2f e441c90 ❌ Out of date — 5 commits missing
Guardian Druid e9cc3d7 fdd9ea0 ❌ Out of date — 1 commit missing
Augmentation Evoker 9d80a47 9d80a47 ✅ Up to date
Devastation Evoker 2950571 2950571 ✅ Up to date
Beast Mastery Hunter f18680e f18680e ✅ Up to date
Marksmanship Hunter cf1806b cf1806b ✅ Up to date
Survival Hunter 7badbb5 7badbb5 ✅ Up to date
Arcane Mage dfeacf0 dfeacf0 ✅ Up to date
Fire Mage 06cfdce 06cfdce ✅ Up to date
Frost Mage e8d92c5 e8d92c5 ✅ Up to date
Brewmaster Monk 14cbb0c 14cbb0c ✅ Up to date
Windwalker Monk 65d756b 65d756b ✅ Up to date
Protection Paladin missing_header
Retribution Paladin db6e3c4 db6e3c4 ✅ Up to date
Shadow Priest df4f2e8 df4f2e8 ✅ Up to date
Assassination Rogue 05c3618 05c3618 ✅ Up to date
Outlaw Rogue bafa87f bafa87f ✅ Up to date
Subtlety Rogue 51e69ad 51e69ad ✅ Up to date
Elemental Shaman 6d828ce 6d828ce ✅ Up to date
Enhancement Shaman b45bf25 b45bf25 ✅ Up to date
Affliction Warlock c259d86 c259d86 ✅ Up to date
Demonology Warlock 73eaae9 9c1eb60 ❌ Out of date — 1 commit missing
Destruction Warlock 7ed50b3 7ed50b3 ✅ Up to date
Arms Warrior a54c75c a54c75c ✅ Up to date
Fury Warrior 89266d4 89266d4 ✅ Up to date
Protection Warrior bc73745 bc73745 ✅ Up to date
Restoration Druid (not tracked by SimC)
Preservation Evoker (not tracked by SimC)
Mistweaver Monk (not tracked by SimC)
Holy Paladin (not tracked by SimC)
Discipline Priest (not tracked by SimC)
Holy Priest (not tracked by SimC)
Restoration Shaman (not tracked by SimC)
commented

File-only diffs

The following diffs show only the upstream changes to each spec's .simc file between the recorded addon SHA and the latest upstream SHA.

Havoc Demon Hunter — 04a038d to f240db3 (2 commits)
@@ -11,8 +11,8 @@ actions.precombat=snapshot_stats
 actions.precombat+=/variable,name=trinket1_steroids,value=trinket.1.has_cooldown&trinket.1.has_stat.any_dps&!trinket.1.is.improvised_seaforium_pacemaker
 actions.precombat+=/variable,name=trinket2_steroids,value=trinket.2.has_cooldown&trinket.2.has_stat.any_dps&!trinket.2.is.improvised_seaforium_pacemaker
 # Blacklist for trinkets to hold trinket cooldowns for Initiative and Necessary Strike line-up outside standard trinket implementation  TODO fix to work off generic conditions instead of specifying individual trinkets for futureproof
-actions.precombat+=/variable,name=trinket1_crit,value=trinket.1.is.mad_queens_mandate|trinket.1.is.junkmaestros_mega_magnet|trinket.1.is.geargrinders_spare_keys|trinket.1.is.ravenous_honey_buzzer|trinket.1.is.grim_codex|trinket.1.is.ratfang_toxin|trinket.1.is.blastmaster3000|trinket.1.is.cursed_stone_idol|trinket.1.is.perfidious_projector
-actions.precombat+=/variable,name=trinket2_crit,value=trinket.2.is.mad_queens_mandate|trinket.2.is.junkmaestros_mega_magnet|trinket.2.is.geargrinders_spare_keys|trinket.2.is.ravenous_honey_buzzer|trinket.2.is.grim_codex|trinket.2.is.ratfang_toxin|trinket.2.is.blastmaster3000|trinket.2.is.cursed_stone_idol|trinket.2.is.perfidious_projector
+actions.precombat+=/variable,name=trinket1_crit,value=trinket.1.is.mad_queens_mandate|trinket.1.is.junkmaestros_mega_magnet|trinket.1.is.geargrinders_spare_keys|trinket.1.is.ravenous_honey_buzzer|trinket.1.is.grim_codex|trinket.1.is.ratfang_toxin|trinket.1.is.blastmaster3000|trinket.1.is.cursed_stone_idol|trinket.1.is.perfidious_projector|trinket.1.is.chaotic_nethergate
+actions.precombat+=/variable,name=trinket2_crit,value=trinket.2.is.mad_queens_mandate|trinket.2.is.junkmaestros_mega_magnet|trinket.2.is.geargrinders_spare_keys|trinket.2.is.ravenous_honey_buzzer|trinket.2.is.grim_codex|trinket.2.is.ratfang_toxin|trinket.2.is.blastmaster3000|trinket.2.is.cursed_stone_idol|trinket.2.is.perfidious_projector|trinket.2.is.chaotic_nethergate
 actions.precombat+=/variable,name=fs_tier34_2piece,value=set_bonus.thewarwithin_season_3_2pc
 actions.precombat+=/variable,name=rg_ds,default=0,op=reset
 actions.precombat+=/sigil_of_flame
@@ -34,19 +34,24 @@ actions+=/variable,name=tier33_4piece,value=(buff.initiative.up|!talent.initiati
 # Tier 33 tier set special case check for magnet due to being able to hold
 actions+=/variable,name=tier33_4piece_magnet,value=(buff.initiative.up|!talent.initiative)&(buff.necessary_sacrifice.up|!set_bonus.thewarwithin_season_2_4pc)&variable.trinket_pacemaker_proc&(trinket.1.is.junkmaestros_mega_magnet&(!trinket.2.has_cooldown|trinket.2.cooldown.remains>20))|(trinket.2.is.junkmaestros_mega_magnet&(!trinket.1.has_cooldown|trinket.1.cooldown.remains>20))
 # Double on use trinket holding for using a stat cooldown trinket and an on use damage trinket
-actions+=/variable,name=double_on_use,value=!equipped.signet_of_the_priory&!equipped.house_of_cards&!equipped.funhouse_lens&!equipped.cursed_stone_idol&!equipped.lily_of_the_eternal_weave&!equipped.arazs_ritual_forge|(trinket.1.is.house_of_cards|trinket.1.is.signet_of_the_priory|trinket.1.is.funhouse_lens|trinket.1.is.cursed_stone_idol|trinket.1.is.lily_of_the_eternal_weave|trinket.1.is.arazs_ritual_forge)&trinket.1.cooldown.remains>20|(trinket.2.is.house_of_cards|trinket.2.is.signet_of_the_priory|trinket.2.is.funhouse_lens|trinket.2.is.cursed_stone_idol|trinket.2.is.lily_of_the_eternal_weave|trinket.2.is.arazs_ritual_forge)&trinket.2.cooldown.remains>20
+actions+=/variable,name=double_on_use,value=!equipped.signet_of_the_priory&!equipped.house_of_cards&!equipped.funhouse_lens&!equipped.cursed_stone_idol&!equipped.lily_of_the_eternal_weave&!equipped.arazs_ritual_forge&!equipped.unyielding_netherprism|(trinket.1.is.house_of_cards|trinket.1.is.signet_of_the_priory|trinket.1.is.funhouse_lens|trinket.1.is.cursed_stone_idol|trinket.1.is.lily_of_the_eternal_weave|trinket.1.is.arazs_ritual_forge)&trinket.1.cooldown.remains>20|(trinket.2.is.house_of_cards|trinket.2.is.signet_of_the_priory|trinket.2.is.funhouse_lens|trinket.2.is.cursed_stone_idol|trinket.2.is.lily_of_the_eternal_weave|trinket.2.is.arazs_ritual_forge)&trinket.2.cooldown.remains>20|equipped.unyielding_netherprism&(buff.latent_energy.stack<10|cooldown.metamorphosis.remains>20)
 # Separate actionlists for each hero tree
 actions+=/run_action_list,name=ar,if=hero_tree.aldrachi_reaver
 actions+=/run_action_list,name=fs,if=hero_tree.felscarred
 
 # Aldrachi Reaver
 actions.ar=variable,name=rg_inc,op=set,value=buff.rending_strike.down&buff.glaive_flurry.up&cooldown.blade_dance.up&gcd.remains=0|variable.rg_inc&prev_gcd.1.death_sweep
+actions.ar+=/cycling_variable,name=pull_remains,op=reset
+actions.ar+=/cycling_variable,name=pull_remains,op=max,value=target.time_to_die
+actions.ar+=/retarget_auto_attack,target_if=max:debuff.reavers_mark.remains
 actions.ar+=/pick_up_fragment,type=all,use_off_gcd=1,if=fury<=90
 actions.ar+=/variable,name=fel_barrage,op=set,value=talent.fel_barrage&(cooldown.fel_barrage.remains<gcd.max*7&(active_enemies>=desired_targets+raid_event.adds.count|raid_event.adds.in<gcd.max*7|raid_event.adds.in>90)&(cooldown.metamorphosis.remains|active_enemies>2)|buff.fel_barrage.up)&!(active_enemies=1&!raid_event.adds.exists)
-actions.ar+=/chaos_strike,if=buff.rending_strike.up&buff.glaive_flurry.up&(variable.rg_ds=2|active_enemies>2)&time>10
-actions.ar+=/annihilation,if=buff.rending_strike.up&buff.glaive_flurry.up&(variable.rg_ds=2|active_enemies>2)
-actions.ar+=/reavers_glaive,if=buff.glaive_flurry.down&buff.rending_strike.down&buff.thrill_of_the_fight_damage.remains<gcd.max*4+(variable.rg_ds=2)+(cooldown.the_hunt.remains<gcd.max*3)*3+(cooldown.eye_beam.remains<gcd.max*3&talent.shattered_destiny)*3&(variable.rg_ds=0|variable.rg_ds=1&cooldown.blade_dance.up|variable.rg_ds=2&cooldown.blade_dance.remains)&(buff.thrill_of_the_fight_damage.up|!prev_gcd.1.death_sweep|!variable.rg_inc)&active_enemies<3&!action.reavers_glaive.last_used<5&debuff.essence_break.down&(buff.metamorphosis.remains>2|cooldown.eye_beam.remains<10|fight_remains<10)&(target.time_to_die>=10|fight_remains<=10)|fight_remains<=10
-actions.ar+=/reavers_glaive,if=buff.glaive_flurry.down&buff.rending_strike.down&buff.thrill_of_the_fight_damage.remains<4&(buff.thrill_of_the_fight_damage.up|!prev_gcd.1.death_sweep|!variable.rg_inc)&active_enemies>2&target.time_to_die>=10&debuff.essence_break.down|fight_remains<=10
+actions.ar+=/chaos_strike,target_if=max:target.health.pct,if=buff.rending_strike.up&buff.glaive_flurry.up&(variable.rg_ds=2|active_enemies>1)&time>10&!debuff.reavers_mark.up
+actions.ar+=/annihilation,target_if=max:target.health.pct,if=buff.rending_strike.up&buff.glaive_flurry.up&(variable.rg_ds=2|active_enemies>1)&!debuff.reavers_mark.up
+actions.ar+=/chaos_strike,target_if=max:debuff.reavers_mark.remains,if=buff.rending_strike.up&buff.glaive_flurry.up&(variable.rg_ds=2|active_enemies>1)&time>10&debuff.reavers_mark.remains
+actions.ar+=/annihilation,target_if=max:debuff.reavers_mark.remains,if=buff.rending_strike.up&buff.glaive_flurry.up&(variable.rg_ds=2|active_enemies>1)&debuff.reavers_mark.remains
+actions.ar+=/reavers_glaive,target_if=max:debuff.reavers_mark.remains,if=buff.glaive_flurry.down&buff.rending_strike.down&buff.thrill_of_the_fight_damage.remains<gcd.max*4+(variable.rg_ds=2)+(cooldown.the_hunt.remains<gcd.max*3)*3+(cooldown.eye_beam.remains<gcd.max*3&talent.shattered_destiny)*3&(variable.rg_ds=0|variable.rg_ds=1&cooldown.blade_dance.up|variable.rg_ds=2&cooldown.blade_dance.remains)&(buff.thrill_of_the_fight_damage.up|!prev_gcd.1.death_sweep|!variable.rg_inc)&active_enemies<3&!action.reavers_glaive.last_used<5&debuff.essence_break.down&(buff.metamorphosis.remains>2|cooldown.eye_beam.remains<10|fight_remains<10)&(variable.pull_remains>=10|fight_remains<=10)|fight_remains<=10
+actions.ar+=/reavers_glaive,target_if=max:debuff.reavers_mark.remains,if=buff.glaive_flurry.down&buff.rending_strike.down&buff.thrill_of_the_fight_damage.remains<4&(buff.thrill_of_the_fight_damage.up|!prev_gcd.1.death_sweep|!variable.rg_inc)&active_enemies>=2&(variable.pull_remains>=10|fight_remains<10)
 actions.ar+=/call_action_list,name=ar_cooldown
 actions.ar+=/run_action_list,name=ar_opener,if=(cooldown.eye_beam.up|cooldown.metamorphosis.up|cooldown.essence_break.up)&time<15&(raid_event.adds.in>20|talent.cycle_of_hatred)
 # Lineup Sigil of Spite with initiative and 4-piece while preferring to use outside of metamorphosis
@@ -59,29 +64,30 @@ actions.ar+=/vengeful_retreat,if=talent.initiative&talent.tactical_retreat&time>
 actions.ar+=/vengeful_retreat,use_off_gcd=1,if=talent.initiative&!talent.tactical_retreat&(cooldown.eye_beam.remains>15&gcd.remains<0.3|gcd.remains<0.2&cooldown.eye_beam.remains<=gcd.remains&cooldown.metamorphosis.remains>10)&(!variable.trinket1_steroids&!variable.trinket2_steroids|variable.trinket1_steroids&(trinket.1.stat.any.cooldown_remains<gcd.max*3|trinket.1.stat.any.cooldown_remains>30)|variable.trinket2_steroids&(trinket.2.stat.any.cooldown_remains<gcd.max*3|trinket.2.stat.any.cooldown_remains>30))&time>20&(!talent.inertia&buff.unbound_chaos.down|buff.inertia_trigger.down&buff.metamorphosis.down)
 # talent.initiative&(cooldown.eye_beam.remains>15&gcd.remains<0.3|gcd.remains<0.2&cooldown.eye_beam.remains<=gcd.remains&(buff.unbound_chaos.up|action.immolation_aura.recharge_time>6|!talent.inertia|talent.momentum)&(cooldown.metamorphosis.remains>10|cooldown.blade_dance.remains<gcd.max*2&(talent.inertia|talent.momentum|buff.metamorphosis.up)))&(!talent.student_of_suffering|cooldown.sigil_of_flame.remains)&time>10&(!variable.trinket1_steroids&!variable.trinket2_steroids|variable.trinket1_steroids&(trinket.1.cooldown.remains<gcd.max*3|trinket.1.cooldown.remains>20)|variable.trinket2_steroids&(trinket.2.cooldown.remains<gcd.max*3|trinket.2.cooldown.remains>20|talent.shattered_destiny))&(cooldown.metamorphosis.remains|hero_tree.aldrachi_reaver)&time>20
 actions.ar+=/run_action_list,name=ar_fel_barrage,if=variable.fel_barrage|!talent.demon_blades&talent.fel_barrage&(buff.fel_barrage.up|cooldown.fel_barrage.up)&buff.metamorphosis.down
-actions.ar+=/felblade,if=!talent.inertia&active_enemies=1&buff.unbound_chaos.up&buff.initiative.up&debuff.essence_break.down&buff.metamorphosis.down
-actions.ar+=/felblade,if=buff.inertia_trigger.up&talent.inertia&cooldown.eye_beam.remains<=0.5&(cooldown.metamorphosis.remains&talent.looks_can_kill|active_enemies>1)
+actions.ar+=/felblade,target_if=max:debuff.reavers_mark.remains,if=!talent.inertia&active_enemies=1&buff.unbound_chaos.up&buff.initiative.up&debuff.essence_break.down&buff.metamorphosis.down
+actions.ar+=/felblade,target_if=max:debuff.reavers_mark.remains,if=buff.inertia_trigger.up&talent.inertia&cooldown.eye_beam.remains<=0.5&(cooldown.metamorphosis.remains&talent.looks_can_kill|active_enemies>1)
 actions.ar+=/run_action_list,name=ar_meta,if=buff.metamorphosis.up
-actions.ar+=/felblade,if=buff.inertia_trigger.up&talent.inertia&buff.inertia.down&cooldown.blade_dance.remains<4&(cooldown.eye_beam.remains>5&cooldown.eye_beam.remains>buff.unbound_chaos.remains|cooldown.eye_beam.remains<=gcd.max&cooldown.vengeful_retreat.remains<=gcd.max+1)
+actions.ar+=/felblade,target_if=max:debuff.reavers_mark.remains,if=buff.inertia_trigger.up&talent.inertia&buff.inertia.down&cooldown.blade_dance.remains<4&(cooldown.eye_beam.remains>5&cooldown.eye_beam.remains>buff.unbound_chaos.remains|cooldown.eye_beam.remains<=gcd.max&cooldown.vengeful_retreat.remains<=gcd.max+1)
 actions.ar+=/immolation_aura,if=talent.a_fire_inside&talent.burning_wound&full_recharge_time<gcd.max*2&(raid_event.adds.in>full_recharge_time|active_enemies>desired_targets)
 actions.ar+=/immolation_aura,if=active_enemies>desired_targets&(active_enemies>=desired_targets+raid_event.adds.count|raid_event.adds.in>full_recharge_time)
 actions.ar+=/immolation_aura,if=fight_remains<15&cooldown.blade_dance.remains&talent.ragefire
 # actions.ar+=/blade_dance,if=buff.rending_strike.down&buff.glaive_flurry.up&active_enemies>2&cooldown.eye_beam.remains<=4&buff.thrill_of_the_fight_damage.remains<gcd.max&raid_event.adds.remains>10&(cooldown.immolation_aura.remains|!talent.burning_wound) actions.ar+=/eye_beam,if=!talent.essence_break&(!talent.chaotic_transformation|cooldown.metamorphosis.remains<5+3*talent.shattered_destiny|cooldown.metamorphosis.remains>10)&(active_enemies>desired_targets*2|raid_event.adds.in>30-talent.cycle_of_hatred.rank*2.5*buff.cycle_of_hatred.stack)&(!talent.initiative|cooldown.vengeful_retreat.remains>5|cooldown.vengeful_retreat.up&active_enemies>2|talent.shattered_destiny)
 actions.ar+=/eye_beam,if=(cooldown.blade_dance.remains<7|raid_event.adds.up)&(active_enemies>desired_targets*2&(buff.thrill_of_the_fight_damage.up|buff.rending_strike.down&buff.glaive_flurry.down)|raid_event.adds.in>30-buff.cycle_of_hatred.stack*5|fight_style.dungeonroute&!raid_event.adds.in<=40-buff.cycle_of_hatred.stack*5)&(!variable.trinket1_steroids&!variable.trinket2_steroids|variable.trinket1_steroids&(trinket.1.stat.any.cooldown_remains<gcd.max*3|trinket.1.stat.any.cooldown_remains>30-buff.cycle_of_hatred.stack*5)|variable.trinket2_steroids&(trinket.2.stat.any.cooldown_remains<gcd.max*3|trinket.2.stat.any.cooldown_remains>30-buff.cycle_of_hatred.stack*5))|fight_remains<10
 # talent.essence_break&(cooldown.essence_break.remains<gcd.max*2+5*talent.shattered_destiny|talent.shattered_destiny&cooldown.essence_break.remains>10)&(cooldown.blade_dance.remains<7|raid_event.adds.up)&(!talent.initiative|cooldown.vengeful_retreat.remains>10|!talent.inertia&!talent.momentum|raid_event.adds.up)&(active_enemies+3>=desired_targets+raid_event.adds.count|raid_event.adds.in>30-talent.cycle_of_hatred.rank*6)&(!talent.inertia|buff.inertia_trigger.up|action.immolation_aura.charges=0&action.immolation_aura.recharge_time>5)&(!raid_event.adds.up|raid_event.adds.remains>8)&(!variable.trinket1_steroids&!variable.trinket2_steroids|variable.trinket1_steroids&(trinket.1.cooldown.remains<gcd.max*3|trinket.1.cooldown.remains>20)|variable.trinket2_steroids&(trinket.2.cooldown.remains<gcd.max*3|trinket.2.cooldown.remains>20))|fight_remains<10
-actions.ar+=/blade_dance,if=(cooldown.eye_beam.remains>=gcd.max*2|active_enemies>=2&buff.glaive_flurry.up&(raid_event.adds.in>30-buff.cycle_of_hatred.stack*5|raid_event.adds.remains>=cooldown.eye_beam.remains&cooldown.eye_beam.remains<gcd.max*2))&buff.rending_strike.down
-actions.ar+=/chaos_strike,if=buff.rending_strike.up
+actions.ar+=/blade_dance,target_if=max:debuff.reavers_mark.remains,if=(cooldown.eye_beam.remains>=gcd.max*2|active_enemies>=2&buff.glaive_flurry.up&(raid_event.adds.in>30-buff.cycle_of_hatred.stack*5|raid_event.adds.remains>=cooldown.eye_beam.remains&cooldown.eye_beam.remains<gcd.max*2))&buff.rending_strike.down
+actions.ar+=/chaos_strike,target_if=max:debuff.reavers_mark.remains,if=buff.rending_strike.up
 actions.ar+=/sigil_of_flame,if=active_enemies>3|debuff.essence_break.down
-actions.ar+=/felblade,if=fury.deficit>=40+variable.fury_gen*0.5&!buff.inertia_trigger.up&(!talent.blind_fury|cooldown.eye_beam.remains>5)
+actions.ar+=/felblade,target_if=max:debuff.reavers_mark.remains,if=fury.deficit>=40+variable.fury_gen*0.5&!buff.inertia_trigger.up&(!talent.blind_fury|cooldown.eye_beam.remains>5)
 actions.ar+=/glaive_tempest,if=active_enemies>=desired_targets+raid_event.adds.count|raid_event.adds.in>10
-actions.ar+=/chaos_strike,if=debuff.essence_break.up
-actions.ar+=/throw_glaive,if=active_enemies>2&talent.furious_throws&talent.soulscar&(!talent.screaming_brutality|charges=2|full_recharge_time<cooldown.blade_dance.remains)
+actions.ar+=/chaos_strike,target_if=max:debuff.reavers_mark.remains,if=debuff.essence_break.up
+actions.ar+=/chaos_nova,if=talent.chaos_fragments&active_enemies>4
+actions.ar+=/throw_glaive,target_if=max:debuff.reavers_mark.remains,if=active_enemies>2&talent.furious_throws&talent.soulscar&(!talent.screaming_brutality|charges=2|full_recharge_time<cooldown.blade_dance.remains)
 actions.ar+=/chaos_strike,if=cooldown.eye_beam.remains>gcd.max*4|fury>=70-variable.fury_gen*gcd.max-talent.blind_fury.rank*15
-actions.ar+=/felblade,if=!talent.a_fire_inside&fury<40
+actions.ar+=/felblade,target_if=max:debuff.reavers_mark.remains,if=!talent.a_fire_inside&fury<40
 actions.ar+=/immolation_aura,if=raid_event.adds.in>full_recharge_time|active_enemies>desired_targets&active_enemies>2
 actions.ar+=/sigil_of_flame,if=buff.out_of_range.down&debuff.essence_break.down&(!talent.fel_barrage|cooldown.fel_barrage.remains>25|active_enemies=1&!raid_event.adds.exists)
-actions.ar+=/demons_bite
-actions.ar+=/throw_glaive,if=buff.unbound_chaos.down&recharge_time<cooldown.eye_beam.remains&debuff.essence_break.down&(cooldown.eye_beam.remains>8|charges_fractional>1.01)&buff.out_of_range.down&active_enemies>1&!talent.furious_throws
+actions.ar+=/demons_bite,target_if=max:debuff.reavers_mark.remains
+actions.ar+=/throw_glaive,target_if=max:debuff.reavers_mark.remains,if=buff.unbound_chaos.down&recharge_time<cooldown.eye_beam.remains&debuff.essence_break.down&(cooldown.eye_beam.remains>8|charges_fractional>1.01)&buff.out_of_range.down&active_enemies>1&!talent.furious_throws
 actions.ar+=/fel_rush,if=buff.unbound_chaos.down&recharge_time<cooldown.eye_beam.remains&debuff.essence_break.down&(cooldown.eye_beam.remains>8|charges_fractional>1.01)&active_enemies>1
 actions.ar+=/arcane_torrent,if=buff.out_of_range.down&debuff.essence_break.down&fury<100
 
@@ -97,132 +103,131 @@ actions.ar_cooldown+=/use_item,name=skardyns_grace,if=(!equipped.mad_queens_mand
 actions.ar_cooldown+=/use_item,name=house_of_cards,if=(cooldown.eye_beam.remains<gcd.max|buff.metamorphosis.up)&(raid_event.adds.remains>8|raid_event.adds.in>15)|fight_remains<25
 actions.ar_cooldown+=/use_item,name=signet_of_the_priory,if=time<20&(!talent.inertia|buff.inertia.up)&!equipped.cursed_stone_idol|(cooldown.eye_beam.remains<gcd.max|buff.metamorphosis.remains>8|cooldown.metamorphosis.up&buff.metamorphosis.up)&(raid_event.adds.remains>15|raid_event.adds.in>115|fight_style.dungeonroute&!raid_event.adds.in<=120)&(!equipped.cursed_stone_idol|(trinket.1.is.signet_of_the_priory&trinket.2.cooldown.remains>20|trinket.2.is.signet_of_the_priory&trinket.1.cooldown.remains>20))|fight_remains<25
 actions.ar_cooldown+=/use_item,name=perfidious_projector,if=variable.tier33_4piece&variable.double_on_use|fight_remains<15
+actions.ar_cooldown+=/use_item,name=chaotic_nethergate,if=variable.tier33_4piece&variable.double_on_use|fight_remains<15
 actions.ar_cooldown+=/use_item,name=ratfang_toxin,if=variable.tier33_4piece&variable.double_on_use|fight_remains<5
 actions.ar_cooldown+=/use_item,name=geargrinders_spare_keys,if=variable.tier33_4piece&variable.double_on_use|fight_remains<10
 actions.ar_cooldown+=/use_item,name=grim_codex,if=variable.tier33_4piece&variable.double_on_use|fight_remains<10
-# actions.ar_cooldown+=/use_item,name=k.u.j.0.s_flame_vents,if=((!talent.initiative|buff.initiative.up|time>5)&(buff.metamorphosis.remains>5|buff.metamorphosis.down)&(trinket.1.is.k.u.j.0.s_flame_vents&(trinket.2.cooldown.duration<10|trinket.2.cooldown.remains>10|!trinket.2.has_buff.any)|trinket.2.is.mk.u.j.0.s_flame_vents&(trinket.1.cooldown.duration<10|trinket.1.cooldown.remains>10|!trinket.1.has_buff.any))&fight_remains>120|fight_remains<10&fight_remains<buff.metamorphosis.remains)&debuff.essence_break.down|fight_remains<5
 actions.ar_cooldown+=/use_item,name=ravenous_honey_buzzer,if=(variable.tier33_4piece&(buff.inertia.down&(cooldown.essence_break.remains&debuff.essence_break.down|!talent.essence_break))&(trinket.1.is.ravenous_honey_buzzer&(trinket.2.cooldown.duration<10|trinket.2.cooldown.remains>10|!trinket.2.has_buff.any)|trinket.2.is.ravenous_honey_buzzer&(trinket.1.cooldown.duration<10|trinket.1.cooldown.remains>10|!trinket.1.has_buff.any))&fight_remains>120|fight_remains<10&fight_remains<buff.metamorphosis.remains)|fight_remains<5
 actions.ar_cooldown+=/use_item,name=blastmaster3000,if=variable.tier33_4piece&variable.double_on_use|fight_remains<10
 actions.ar_cooldown+=/use_item,name=junkmaestros_mega_magnet,if=variable.tier33_4piece_magnet&variable.double_on_use&time>10|fight_remains<5
 actions.ar_cooldown+=/do_treacherous_transmitter_task,if=cooldown.eye_beam.remains>15|cooldown.eye_beam.remains<5|fight_remains<20|buff.metamorphosis.up
 # actions.ar_cooldown+=/use_item,name=unyielding_netherprism,if=((cooldown.eye_beam.remains<gcd.max&(active_enemies>1|talent.looks_can_kill)&(buff.latent_energy.stack>11)&((trinket.1.is.unyielding_netherprism&trinket.2.cooldown.duration>=90|cooldown.metamorphosis.remains<=5)|(trinket.2.is.unyielding_netherprism&trinket.1.cooldown.duration>=90|cooldown.metamorphosis.remains<=5)))&(raid_event.adds.in>105|raid_event.adds.remains>8)|fight_remains<25)&((trinket.1.is.unyielding_netherprism&(!variable.trinket2_steroids&!trinket.2.has_cooldown|trinket.2.cooldown.remains>20)|trinket.2.is.unyielding_netherprism&(!variable.trinket1_steroids&!trinket.1.has_cooldown|trinket.1.cooldown.remains>20))|equipped.improvised_seaforium_pacemaker)
-actions.ar_cooldown+=/use_item,name=unyielding_netherprism,if=((cooldown.eye_beam.remains<gcd.max&(active_enemies>1|talent.looks_can_kill)&((trinket.1.is.unyielding_netherprism&trinket.2.cooldown.duration>=90|cooldown.metamorphosis.remains<=5)|(trinket.2.is.unyielding_netherprism&trinket.1.cooldown.duration>=90|cooldown.metamorphosis.remains<=5))|(buff.metamorphosis.up&((trinket.1.is.unyielding_netherprism&(trinket.2.cooldown.duration>=90|!trinket.2.has_cooldown))|(trinket.2.is.unyielding_netherprism&(trinket.1.cooldown.duration>=90|!trinket.1.has_cooldown))&!equipped.improvised_seaforium_pacemaker)))&(raid_event.adds.in>105|raid_event.adds.remains>8)|fight_remains<25)&((trinket.1.is.unyielding_netherprism&(!variable.trinket2_steroids&!trinket.2.has_cooldown|trinket.2.cooldown.remains>20)|trinket.2.is.unyielding_netherprism&(!variable.trinket1_steroids&!trinket.1.has_cooldown|trinket.1.cooldown.remains>20))|equipped.improvised_seaforium_pacemaker)
+actions.ar_cooldown+=/use_item,name=unyielding_netherprism,if=((cooldown.eye_beam.remains<gcd.max&(active_enemies>1|talent.looks_can_kill)&((trinket.1.is.unyielding_netherprism&trinket.2.cooldown.duration>90&variable.trinket2_steroids|cooldown.metamorphosis.remains<=5&buff.latent_energy.stack>10)|(trinket.2.is.unyielding_netherprism&trinket.1.cooldown.duration>90&variable.trinket1_steroids|cooldown.metamorphosis.remains<=5&buff.latent_energy.stack>10))|(buff.metamorphosis.up&((trinket.1.is.unyielding_netherprism&trinket.2.cooldown.duration>90&variable.trinket2_steroids)|(trinket.2.is.unyielding_netherprism&trinket.1.cooldown.duration>90&variable.trinket1_steroids)&!equipped.improvised_seaforium_pacemaker&!equipped.soleahs_secret_technique)))&(raid_event.adds.in>105|raid_event.adds.remains>8)|fight_remains<25)&((trinket.1.is.unyielding_netherprism&(!variable.trinket2_steroids|trinket.2.cooldown.duration<120|trinket.2.cooldown.remains>20)|trinket.2.is.unyielding_netherprism&(!variable.trinket1_steroids|trinket.1.cooldown.duration<120|trinket.1.cooldown.remains>20))|equipped.improvised_seaforium_pacemaker|equipped.soleahs_secret_technique)
 actions.ar_cooldown+=/use_item,slot=trinket1,if=((cooldown.eye_beam.remains<gcd.max&active_enemies>1|buff.metamorphosis.up&(cooldown.metamorphosis.remains<buff.metamorphosis.remains|cooldown.metamorphosis.remains>=20|cooldown.metamorphosis.up))&(raid_event.adds.in>trinket.1.cooldown.duration-15|raid_event.adds.remains>8|fight_style.dungeonroute&!raid_event.adds.in<=trinket.1.cooldown.duration)|!trinket.1.has_buff.any|fight_remains<25)&!trinket.1.is.mister_locknstalk&!variable.trinket1_crit&!trinket.1.is.skardyns_grace&!trinket.1.is.treacherous_transmitter&!trinket.1.is.unyielding_netherprism&!trinket.1.is.signet_of_the_priory&(!variable.special_trinket|trinket.2.cooldown.remains>20|(trinket.1.cooldown.duration>90&trinket.1.has_buff.agility))
 actions.ar_cooldown+=/use_item,slot=trinket2,if=((cooldown.eye_beam.remains<gcd.max&active_enemies>1|buff.metamorphosis.up&(cooldown.metamorphosis.remains<buff.metamorphosis.remains|cooldown.metamorphosis.remains>=20|cooldown.metamorphosis.up))&(raid_event.adds.in>trinket.2.cooldown.duration-15|raid_event.adds.remains>8|fight_style.dungeonroute&!raid_event.adds.in<=trinket.2.cooldown.duration)|!trinket.2.has_buff.any|fight_remains<25)&!trinket.2.is.mister_locknstalk&!variable.trinket2_crit&!trinket.2.is.skardyns_grace&!trinket.2.is.treacherous_transmitter&!trinket.2.is.unyielding_netherprism&!trinket.2.is.signet_of_the_priory&(!variable.special_trinket|trinket.1.cooldown.remains>20|(trinket.2.cooldown.duration>90&trinket.2.has_buff.agility))
-actions.ar_cooldown+=/the_hunt,if=debuff.essence_break.down&(active_enemies>=desired_targets+raid_event.adds.count|raid_event.adds.in>45)&(debuff.reavers_mark.up|raid_event.adds.remains>=15)&buff.reavers_glaive.down&(buff.metamorphosis.remains>5|buff.metamorphosis.down)&(!talent.initiative|buff.initiative.up|time>5)&time>5&(!talent.inertia&buff.unbound_chaos.down|buff.inertia_trigger.down)
+actions.ar_cooldown+=/the_hunt,target_if=max:debuff.reavers_mark.remains,if=debuff.essence_break.down&(active_enemies>=desired_targets+raid_event.adds.count|raid_event.adds.in>45)&(debuff.reavers_mark.up|raid_event.adds.remains>=15)&buff.reavers_glaive.down&(buff.metamorphosis.remains>5|buff.metamorphosis.down)&(!talent.initiative|buff.initiative.up|time>5)&time>5&(!talent.inertia&buff.unbound_chaos.down|buff.inertia_trigger.down)|fight_remains<=30
 actions.ar_cooldown+=/sigil_of_spite,if=debuff.essence_break.down&(debuff.reavers_mark.remains>=2-talent.quickened_sigils)&cooldown.blade_dance.remains&time>15
 
 actions.ar_fel_barrage=variable,name=generator_up,op=set,value=cooldown.felblade.remains<gcd.max|cooldown.sigil_of_flame.remains<gcd.max
 actions.ar_fel_barrage+=/variable,name=gcd_drain,op=set,value=gcd.max*32
-actions.ar_fel_barrage+=/annihilation,if=buff.inner_demon.up
+actions.ar_fel_barrage+=/annihilation,target_if=max:debuff.reavers_mark.remains,if=buff.inner_demon.up
 actions.ar_fel_barrage+=/eye_beam,if=(buff.fel_barrage.down|fury>45&talent.blind_fury)&(active_enemies>1&raid_event.adds.up|raid_event.adds.in>40-buff.cycle_of_hatred.stack*5)
 actions.ar_fel_barrage+=/essence_break,if=buff.fel_barrage.down&buff.metamorphosis.up
-actions.ar_fel_barrage+=/death_sweep,if=buff.fel_barrage.down
+actions.ar_fel_barrage+=/death_sweep,target_if=max:debuff.reavers_mark.remains,if=buff.fel_barrage.down
 actions.ar_fel_barrage+=/immolation_aura,if=(active_enemies>2|buff.fel_barrage.up)&(cooldown.eye_beam.remains>recharge_time+3)
 actions.ar_fel_barrage+=/glaive_tempest,if=buff.fel_barrage.down&active_enemies>1
-actions.ar_fel_barrage+=/blade_dance,if=buff.fel_barrage.down
+actions.ar_fel_barrage+=/blade_dance,target_if=max:debuff.reavers_mark.remains,if=buff.fel_barrage.down
 actions.ar_fel_barrage+=/fel_barrage,if=fury>100&(raid_event.adds.in>90|raid_event.adds.in<gcd.max|raid_event.adds.remains>4&active_enemies>2)
-actions.ar_fel_barrage+=/felblade,if=buff.inertia_trigger.up&buff.fel_barrage.up
+actions.ar_fel_barrage+=/felblade,target_if=max:debuff.reavers_mark.remains,if=buff.inertia_trigger.up&buff.fel_barrage.up
 # actions.ar_fel_barrage+=/fel_rush,if=buff.unbound_chaos.up&fury>20&buff.fel_barrage.up
 actions.ar_fel_barrage+=/sigil_of_flame,if=fury.deficit>40&buff.fel_barrage.up
-actions.ar_fel_barrage+=/felblade,if=buff.fel_barrage.up&fury.deficit>40
-actions.ar_fel_barrage+=/death_sweep,if=fury-variable.gcd_drain-35>0&(buff.fel_barrage.remains<3|variable.generator_up|fury>80|variable.fury_gen>18)
+actions.ar_fel_barrage+=/felblade,target_if=max:debuff.reavers_mark.remains,if=buff.fel_barrage.up&fury.deficit>40
+actions.ar_fel_barrage+=/death_sweep,target_if=max:debuff.reavers_mark.remains,if=fury-variable.gcd_drain-35>0&(buff.fel_barrage.remains<3|variable.generator_up|fury>80|variable.fury_gen>18)
 actions.ar_fel_barrage+=/glaive_tempest,if=fury-variable.gcd_drain-30>0&(buff.fel_barrage.remains<3|variable.generator_up|fury>80|variable.fury_gen>18)
-actions.ar_fel_barrage+=/blade_dance,if=fury-variable.gcd_drain-35>0&(buff.fel_barrage.remains<3|variable.generator_up|fury>80|variable.fury_gen>18)
+actions.ar_fel_barrage+=/blade_dance,target_if=max:debuff.reavers_mark.remains,if=fury-variable.gcd_drain-35>0&(buff.fel_barrage.remains<3|variable.generator_up|fury>80|variable.fury_gen>18)
 actions.ar_fel_barrage+=/arcane_torrent,if=fury.deficit>40&buff.fel_barrage.up
 # actions.ar_fel_barrage+=/fel_rush,if=buff.unbound_chaos.up
-actions.ar_fel_barrage+=/the_hunt,if=fury>40&(active_enemies>=desired_targets+raid_event.adds.count|raid_event.adds.in>80)
-actions.ar_fel_barrage+=/annihilation,if=fury-variable.gcd_drain-40>20&(buff.fel_barrage.remains<3|variable.generator_up|fury>80|variable.fury_gen>18)
-actions.ar_fel_barrage+=/chaos_strike,if=fury-variable.gcd_drain-40>20&(cooldown.fel_barrage.remains&cooldown.fel_barrage.remains<10&fury>100|buff.fel_barrage.up&(buff.fel_barrage.remains*variable.fury_gen-buff.fel_barrage.remains*32)>0)
+actions.ar_fel_barrage+=/the_hunt,target_if=max:debuff.reavers_mark.remains,if=fury>40&(active_enemies>=desired_targets+raid_event.adds.count|raid_event.adds.in>80)
+actions.ar_fel_barrage+=/annihilation,target_if=max:debuff.reavers_mark.remains,if=fury-variable.gcd_drain-40>20&(buff.fel_barrage.remains<3|variable.generator_up|fury>80|variable.fury_gen>18)
+actions.ar_fel_barrage+=/chaos_strike,target_if=max:debuff.reavers_mark.remains,if=fury-variable.gcd_drain-40>20&(cooldown.fel_barrage.remains&cooldown.fel_barrage.remains<10&fury>100|buff.fel_barrage.up&(buff.fel_barrage.remains*variable.fury_gen-buff.fel_barrage.remains*32)>0)
 actions.ar_fel_barrage+=/demons_bite
 
-actions.ar_meta=death_sweep,if=buff.metamorphosis.remains<gcd.max|debuff.essence_break.up|cooldown.metamorphosis.up&!talent.restless_hunter
+actions.ar_meta=death_sweep,target_if=max:debuff.reavers_mark.remains,if=buff.metamorphosis.remains<gcd.max|debuff.essence_break.up|cooldown.metamorphosis.up&!talent.restless_hunter
 actions.ar_meta+=/vengeful_retreat,use_off_gcd=1,if=talent.initiative&(cooldown.metamorphosis.remains&(cooldown.essence_break.remains<=0.6|cooldown.essence_break.remains>10|!talent.essence_break)|talent.restless_hunter)&cooldown.eye_beam.remains&(!talent.inertia&buff.unbound_chaos.down|buff.inertia_trigger.down)
 # actions.ar_meta+=/annihilation,if=talent.restless_hunter&buff.rending_strike.up&cooldown.essence_break.up&cooldown.metamorphosis.up
-actions.ar_meta+=/felblade,if=talent.inertia&buff.inertia_trigger.up&cooldown.essence_break.remains<=1&cooldown.blade_dance.remains<=gcd.max*2&cooldown.metamorphosis.remains<=gcd.max*3
+actions.ar_meta+=/felblade,target_if=max:debuff.reavers_mark.remains,if=talent.inertia&buff.inertia_trigger.up&cooldown.essence_break.remains<=1&cooldown.blade_dance.remains<=gcd.max*2&cooldown.metamorphosis.remains<=gcd.max*3
 # actions.ar_meta+=/fel_rush,if=talent.inertia&buff.inertia_trigger.up&cooldown.essence_break.remains<=1&cooldown.blade_dance.remains<=gcd.max*2&cooldown.metamorphosis.remains<=gcd.max*3
 actions.ar_meta+=/essence_break,if=fury>=30&talent.restless_hunter&cooldown.metamorphosis.up&(talent.inertia&buff.inertia.up|!talent.inertia)&cooldown.blade_dance.remains<=gcd.max
-actions.ar_meta+=/annihilation,if=buff.metamorphosis.remains<gcd.max|debuff.essence_break.remains&debuff.essence_break.remains<0.5&cooldown.blade_dance.remains|buff.inner_demon.up&cooldown.essence_break.up&cooldown.metamorphosis.up
-actions.ar_meta+=/felblade,if=buff.inertia_trigger.up&talent.inertia&cooldown.metamorphosis.remains&(cooldown.eye_beam.remains<=0.5|cooldown.essence_break.remains<=0.5|cooldown.blade_dance.remains<=5.5|buff.initiative.remains<gcd.remains)
+actions.ar_meta+=/annihilation,target_if=max:debuff.reavers_mark.remains,if=buff.metamorphosis.remains<gcd.max|debuff.essence_break.remains&debuff.essence_break.remains<0.5&cooldown.blade_dance.remains|buff.inner_demon.up&cooldown.essence_break.up&cooldown.metamorphosis.up
+actions.ar_meta+=/felblade,target_if=max:debuff.reavers_mark.remains,if=buff.inertia_trigger.up&talent.inertia&cooldown.metamorphosis.remains&(cooldown.eye_beam.remains<=0.5|cooldown.essence_break.remains<=0.5|cooldown.blade_dance.remains<=5.5|buff.initiative.remains<gcd.remains)
 actions.ar_meta+=/fel_rush,if=buff.inertia_trigger.up&talent.inertia&cooldown.metamorphosis.remains&active_enemies>2
 # actions.ar_meta+=/felblade,if=buff.inertia_trigger.up&talent.inertia&cooldown.blade_dance.remains<gcd.max*3&cooldown.metamorphosis.remains
 actions.ar_meta+=/fel_rush,if=buff.inertia_trigger.up&talent.inertia&cooldown.blade_dance.remains<gcd.max*3&cooldown.metamorphosis.remains&active_enemies>2
 actions.ar_meta+=/immolation_aura,if=charges=2&active_enemies>1&debuff.essence_break.down
-actions.ar_meta+=/annihilation,if=buff.inner_demon.up&(cooldown.eye_beam.remains<gcd.max*3&cooldown.blade_dance.remains|cooldown.metamorphosis.remains<gcd.max*3)
+actions.ar_meta+=/annihilation,target_if=max:debuff.reavers_mark.remains,if=buff.inner_demon.up&(cooldown.eye_beam.remains<gcd.max*3&cooldown.blade_dance.remains|cooldown.metamorphosis.remains<gcd.max*3)
 actions.ar_meta+=/essence_break,if=time<20&buff.thrill_of_the_fight_damage.remains>gcd.max*4&buff.metamorphosis.remains>=gcd.max*2&cooldown.metamorphosis.up&cooldown.death_sweep.remains<=gcd.max&buff.inertia.up
 actions.ar_meta+=/essence_break,if=fury>20&(cooldown.blade_dance.remains<gcd.max*3|cooldown.blade_dance.up)&(buff.unbound_chaos.down&!talent.inertia|buff.inertia.up)&buff.out_of_range.remains<gcd.max&(!talent.shattered_destiny|cooldown.eye_beam.remains>4)|fight_remains<10
-actions.ar_meta+=/death_sweep
+actions.ar_meta+=/death_sweep,target_if=max:debuff.reavers_mark.remains
 actions.ar_meta+=/eye_beam,if=debuff.essence_break.down&buff.inner_demon.down
 actions.ar_meta+=/glaive_tempest,if=debuff.essence_break.down&(cooldown.blade_dance.remains>gcd.max*2|fury>60)&(active_enemies>=desired_targets+raid_event.adds.count|raid_event.adds.in>10)
 actions.ar_meta+=/sigil_of_flame,if=active_enemies>2&debuff.essence_break.down
-actions.ar_meta+=/throw_glaive,if=talent.soulscar&talent.furious_throws&active_enemies>2&debuff.essence_break.down&(charges=2|full_recharge_time<cooldown.blade_dance.remains)
-actions.ar_meta+=/annihilation,if=cooldown.blade_dance.remains|fury>60|soul_fragments.total>0|buff.metamorphosis.remains<5&cooldown.felblade.up|debuff.essence_break.up
+actions.ar_meta+=/throw_glaive,target_if=max:debuff.reavers_mark.remains,if=talent.soulscar&talent.furious_throws&active_enemies=3&debuff.essence_break.down&(charges=2|full_recharge_time<cooldown.blade_dance.remains)
+actions.ar_meta+=/annihilation,target_if=max:debuff.reavers_mark.remains,if=cooldown.blade_dance.remains|fury>60|soul_fragments.total>0|buff.metamorphosis.remains<5&cooldown.felblade.up|debuff.essence_break.up
 actions.ar_meta+=/sigil_of_flame,if=buff.metamorphosis.remains>5&buff.out_of_range.down&fury.deficit>=30+variable.fury_gen*gcd.max+active_enemies*talent.flames_of_fury.rank
-actions.ar_meta+=/felblade,if=fury.deficit>=40+variable.fury_gen*0.5&!buff.inertia_trigger.up
+actions.ar_meta+=/felblade,target_if=max:debuff.reavers_mark.remains,if=fury.deficit>=40+variable.fury_gen*0.5&!buff.inertia_trigger.up
 actions.ar_meta+=/sigil_of_flame,if=debuff.essence_break.down&buff.out_of_range.down&fury.deficit>=30+variable.fury_gen*gcd.max+active_enemies*talent.flames_of_fury.rank
 actions.ar_meta+=/immolation_aura,if=buff.out_of_range.down&recharge_time<(cooldown.eye_beam.remains<?buff.metamorphosis.remains)&(active_enemies>=desired_targets+raid_event.adds.count|raid_event.adds.in>full_recharge_time)
-actions.ar_meta+=/annihilation
-actions.ar_meta+=/throw_glaive,if=buff.unbound_chaos.down&recharge_time<cooldown.eye_beam.remains&debuff.essence_break.down&(cooldown.eye_beam.remains>8|charges_fractional>1.01)&buff.out_of_range.down&active_enemies>1&!talent.furious_throws
+actions.ar_meta+=/annihilation,target_if=max:debuff.reavers_mark.remains
+actions.ar_meta+=/throw_glaive,target_if=max:debuff.reavers_mark.remains,if=buff.unbound_chaos.down&recharge_time<cooldown.eye_beam.remains&debuff.essence_break.down&(cooldown.eye_beam.remains>8|charges_fractional>1.01)&buff.out_of_range.down&active_enemies>1&!talent.furious_throws
 actions.ar_meta+=/fel_rush,if=recharge_time<cooldown.eye_beam.remains&debuff.essence_break.down&(cooldown.eye_beam.remains>8|charges_fractional>1.01)&buff.out_of_range.down&active_enemies>1
-actions.ar_meta+=/demons_bite
+actions.ar_meta+=/demons_bite,target_if=max:debuff.reavers_mark.remains
 
 actions.ar_opener=potion
-actions.ar_opener+=/the_hunt
+actions.ar_opener+=/the_hunt,target_if=max:debuff.reavers_mark.remains
 actions.ar_opener+=/vengeful_retreat,use_off_gcd=1,if=talent.initiative&time>4&buff.metamorphosis.up&(!talent.inertia|buff.inertia_trigger.down)&buff.inner_demon.down&cooldown.blade_dance.remains&gcd.remains<0.1
-actions.ar_opener+=/death_sweep,if=!talent.chaotic_transformation&cooldown.metamorphosis.up&buff.glaive_flurry.up
-actions.ar_opener+=/annihilation,if=buff.rending_strike.up&buff.thrill_of_the_fight_damage.down
-actions.ar_opener+=/felblade,if=!talent.inertia&talent.unbound_chaos&buff.unbound_chaos.up&buff.initiative.up&debuff.essence_break.down&active_enemies<=2
+actions.ar_opener+=/death_sweep,target_if=max:debuff.reavers_mark.remains,if=!talent.chaotic_transformation&cooldown.metamorphosis.up&buff.glaive_flurry.up
+actions.ar_opener+=/annihilation,target_if=max:debuff.reavers_mark.remains,if=buff.rending_strike.up&buff.thrill_of_the_fight_damage.down
+actions.ar_opener+=/felblade,target_if=max:debuff.reavers_mark.remains,if=!talent.inertia&talent.unbound_chaos&buff.unbound_chaos.up&buff.initiative.up&debuff.essence_break.down&active_enemies<=2
 actions.ar_opener+=/fel_rush,if=!talent.inertia&talent.unbound_chaos&buff.unbound_chaos.up&buff.initiative.up&debuff.essence_break.down&active_enemies>2
-actions.ar_opener+=/annihilation,if=talent.inner_demon&buff.inner_demon.up&(!talent.essence_break|cooldown.essence_break.up)
+actions.ar_opener+=/annihilation,target_if=max:debuff.reavers_mark.remains,if=talent.inner_demon&buff.inner_demon.up&(!talent.essence_break|cooldown.essence_break.up)
 actions.ar_opener+=/essence_break,if=(buff.inertia.up|!talent.inertia)&buff.metamorphosis.up&cooldown.blade_dance.remains<=gcd.max&debuff.reavers_mark.up
-actions.ar_opener+=/felblade,if=buff.inertia_trigger.up&talent.inertia&talent.restless_hunter&cooldown.essence_break.up&cooldown.metamorphosis.up&buff.metamorphosis.up&cooldown.blade_dance.remains<=gcd.max
+actions.ar_opener+=/felblade,target_if=max:debuff.reavers_mark.remains,if=buff.inertia_trigger.up&talent.inertia&talent.restless_hunter&cooldown.essence_break.up&cooldown.metamorphosis.up&buff.metamorphosis.up&cooldown.blade_dance.remains<=gcd.max
 # actions.ar_opener+=/fel_rush,if=buff.inertia_trigger.up&talent.inertia&talent.restless_hunter&cooldown.essence_break.up&cooldown.metamorphosis.up&buff.metamorphosis.up&cooldown.blade_dance.remains<=gcd.max
-actions.ar_opener+=/felblade,if=talent.inertia&buff.inertia_trigger.up&(buff.inertia.down&buff.metamorphosis.up)&debuff.essence_break.down&active_enemies<=2
+actions.ar_opener+=/felblade,target_if=max:debuff.reavers_mark.remains,if=talent.inertia&buff.inertia_trigger.up&(buff.inertia.down&buff.metamorphosis.up)&debuff.essence_break.down&active_enemies<=2
 actions.ar_opener+=/fel_rush,if=talent.inertia&buff.inertia_trigger.up&(buff.inertia.down&buff.metamorphosis.up)&debuff.essence_break.down&(cooldown.felblade.remains|active_enemies>2)
-actions.ar_opener+=/felblade,if=talent.inertia&buff.inertia_trigger.up&buff.metamorphosis.up&cooldown.metamorphosis.remains&debuff.essence_break.down
+actions.ar_opener+=/felblade,target_if=max:debuff.reavers_mark.remains,if=talent.inertia&buff.inertia_trigger.up&buff.metamorphosis.up&cooldown.metamorphosis.remains&debuff.essence_break.down
 # actions.ar_opener+=/fel_rush,if=talent.inertia&buff.inertia_trigger.up&buff.metamorphosis.up&cooldown.metamorphosis.remains
-actions.ar_opener+=/the_hunt,if=(buff.metamorphosis.up&hero_tree.aldrachi_reaver&talent.shattered_destiny|!talent.shattered_destiny&hero_tree.aldrachi_reaver|hero_tree.felscarred)&(!talent.initiative|talent.inertia|buff.initiative.up|time>5)
-actions.ar_opener+=/felblade,if=fury<40&buff.inertia_trigger.down&debuff.essence_break.down
-actions.ar_opener+=/reavers_glaive,if=debuff.reavers_mark.down&debuff.essence_break.down
-actions.ar_opener+=/chaos_strike,if=buff.rending_strike.up&active_enemies>2
-actions.ar_opener+=/blade_dance,if=buff.glaive_flurry.up&active_enemies>2
+actions.ar_opener+=/the_hunt,target_if=max:debuff.reavers_mark.remains,if=(buff.metamorphosis.up&hero_tree.aldrachi_reaver&talent.shattered_destiny|!talent.shattered_destiny&hero_tree.aldrachi_reaver|hero_tree.felscarred)&(!talent.initiative|talent.inertia|buff.initiative.up|time>5)
+actions.ar_opener+=/felblade,target_if=max:debuff.reavers_mark.remains,if=fury<40&buff.inertia_trigger.down&debuff.essence_break.down
+actions.ar_opener+=/reavers_glaive,target_if=max:debuff.reavers_mark.remains,if=debuff.reavers_mark.down&debuff.essence_break.down
+actions.ar_opener+=/chaos_strike,target_if=max:debuff.reavers_mark.remains,if=buff.rending_strike.up&active_enemies>2
+actions.ar_opener+=/blade_dance,target_if=max:debuff.reavers_mark.remains,if=buff.glaive_flurry.up&active_enemies>2
 actions.ar_opener+=/immolation_aura,if=talent.a_fire_inside&talent.burning_wound&buff.metamorphosis.down
 actions.ar_opener+=/metamorphosis,if=buff.metamorphosis.up&cooldown.blade_dance.remains>gcd.max*2&buff.inner_demon.down&(!talent.restless_hunter|prev_gcd.1.death_sweep)&(cooldown.essence_break.remains|!talent.essence_break|!talent.chaotic_transformation)
 actions.ar_opener+=/sigil_of_spite,if=debuff.reavers_mark.up&(cooldown.eye_beam.remains&cooldown.metamorphosis.remains)&debuff.essence_break.down
 actions.ar_opener+=/eye_beam,if=buff.metamorphosis.down|debuff.essence_break.down&buff.inner_demon.down&(cooldown.blade_dance.remains|talent.essence_break&cooldown.essence_break.up)
 actions.ar_opener+=/essence_break,if=cooldown.blade_dance.remains<gcd.max&!hero_tree.felscarred&!talent.shattered_destiny&buff.metamorphosis.up|cooldown.eye_beam.remains&cooldown.metamorphosis.remains
-actions.ar_opener+=/death_sweep
-actions.ar_opener+=/annihilation
-actions.ar_opener+=/demons_bite
+actions.ar_opener+=/death_sweep,target_if=max:debuff.reavers_mark.remains
+actions.ar_opener+=/annihilation,target_if=max:debuff.reavers_mark.remains
+actions.ar_opener+=/demons_bite,target_if=max:debuff.reavers_mark.remains
 
 # Fel-Scarred
 actions.fs=pick_up_fragment,type=all,use_off_gcd=1
 actions.fs+=/variable,name=fel_barrage,op=set,value=talent.fel_barrage&(cooldown.fel_barrage.remains<gcd.max*7&(active_enemies>=desired_targets+raid_event.adds.count|raid_event.adds.in<gcd.max*7|raid_event.adds.in>90)&(cooldown.metamorphosis.remains|active_enemies>2)|buff.fel_barrage.up)&!(active_enemies=1&!raid_event.adds.exists)
 actions.fs+=/call_action_list,name=fs_cooldown
-actions.fs+=/run_action_list,name=fs_opener,if=(cooldown.eye_beam.up|cooldown.metamorphosis.up|cooldown.essence_break.up|buff.demonsurge.stack<3+talent.student_of_suffering+talent.a_fire_inside)&time<15&raid_event.adds.in>40
+actions.fs+=/run_action_list,name=fs_opener,if=(cooldown.eye_beam.up|cooldown.metamorphosis.up|cooldown.essence_break.up|buff.demonsurge.stack<3+talent.student_of_suffering+talent.a_fire_inside)&time<15&raid_event.adds.in>40-buff.cycle_of_hatred.stack*5
 actions.fs+=/run_action_list,name=fs_fel_barrage,if=variable.fel_barrage&raid_event.adds.up
 actions.fs+=/immolation_aura,if=active_enemies>2&talent.ragefire&(!talent.fel_barrage|cooldown.fel_barrage.remains>recharge_time)&debuff.essence_break.down&(buff.metamorphosis.down|buff.metamorphosis.remains>5)
 actions.fs+=/immolation_aura,if=active_enemies>2&talent.ragefire&raid_event.adds.up&raid_event.adds.remains<15&raid_event.adds.remains>5&debuff.essence_break.down
 actions.fs+=/felblade,if=talent.unbound_chaos&buff.unbound_chaos.up&!talent.inertia&active_enemies<=2&(talent.student_of_suffering&cooldown.eye_beam.remains-gcd.max*2<=buff.unbound_chaos.remains|hero_tree.aldrachi_reaver)
 actions.fs+=/fel_rush,if=talent.unbound_chaos&buff.unbound_chaos.up&!talent.inertia&active_enemies>3&(talent.student_of_suffering&cooldown.eye_beam.remains-gcd.max*2<=buff.unbound_chaos.remains)
 actions.fs+=/run_action_list,name=fs_meta,if=buff.metamorphosis.up
-actions.fs+=/vengeful_retreat,use_off_gcd=1,if=talent.initiative&(cooldown.eye_beam.remains>15&gcd.remains<0.3|gcd.remains<0.2&cooldown.eye_beam.remains<=gcd.remains&(cooldown.metamorphosis.remains>10|cooldown.blade_dance.remains<gcd.max*3))&(!talent.student_of_suffering|cooldown.sigil_of_flame.remains)&(cooldown.essence_break.remains<=gcd.max*2&talent.student_of_suffering&cooldown.sigil_of_flame.remains|cooldown.essence_break.remains>=18|!talent.student_of_suffering)&cooldown.metamorphosis.remains>10&time>20
+actions.fs+=/vengeful_retreat,use_off_gcd=1,if=talent.initiative&(cooldown.eye_beam.remains>15&gcd.remains<0.3|gcd.remains<0.2&cooldown.eye_beam.remains<=gcd.remains&(cooldown.metamorphosis.remains>10|cooldown.blade_dance.remains<gcd.max*3))&(!talent.student_of_suffering|cooldown.sigil_of_flame.remains)&(cooldown.essence_break.remains<=gcd.max*2&talent.student_of_suffering&cooldown.sigil_of_flame.remains|cooldown.essence_break.remains>=18|!talent.student_of_suffering)&cooldown.metamorphosis.remains>10&time>20&(!talent.inertia|buff.inertia_trigger.down)
 actions.fs+=/run_action_list,name=fs_fel_barrage,if=variable.fel_barrage|!talent.demon_blades&talent.fel_barrage&(buff.fel_barrage.up|cooldown.fel_barrage.up)&buff.metamorphosis.down
 # actions.fs+=/felblade,if=!talent.inertia&active_enemies=1&buff.unbound_chaos.up&buff.initiative.up&debuff.essence_break.down&buff.metamorphosis.down actions.fs+=/felblade,if=buff.inertia_trigger.up&talent.inertia&buff.inertia.down&cooldown.blade_dance.remains<4&cooldown.eye_beam.remains>5&cooldown.eye_beam.remains>buff.unbound_chaos.remains-2 actions.fs+=/fel_rush,if=buff.unbound_chaos.up&talent.inertia&buff.inertia.down&cooldown.blade_dance.remains<4&cooldown.eye_beam.remains>5&(action.immolation_aura.charges>0|action.immolation_aura.recharge_time+2<cooldown.eye_beam.remains|cooldown.eye_beam.remains>buff.unbound_chaos.remains-2)
-actions.fs+=/immolation_aura,if=variable.fs_tier34_2piece&(full_recharge_time<gcd.max*3|buff.immolation_aura.down&(cooldown.eye_beam.remains<3&(!talent.essence_break|buff.cycle_of_hatred.stack<4)|talent.essence_break&cooldown.essence_break.remains<=5|talent.essence_break&((cooldown.eye_beam.remains<3)*cooldown.essence_break.remains)>recharge_time))
-actions.fs+=/immolation_aura,if=variable.fs_tier34_2piece&((cooldown.eye_beam.remains+cooldown.metamorphosis.remains)<10)
+actions.fs+=/immolation_aura,if=variable.fs_tier34_2piece&(full_recharge_time<gcd.max*3|buff.immolation_aura.down&(cooldown.eye_beam.remains<3&(!talent.essence_break|buff.cycle_of_hatred.stack<4)|talent.essence_break&cooldown.essence_break.remains<=5|talent.essence_break&((cooldown.eye_beam.remains<3)*cooldown.essence_break.remains)>recharge_time))&(!talent.dancing_with_fate.rank=2|cooldown.blade_dance.remains>=gcd.max|cooldown.eye_beam.remains<3)
+actions.fs+=/immolation_aura,if=variable.fs_tier34_2piece&((cooldown.eye_beam.remains+cooldown.metamorphosis.remains)<10)&(!talent.dancing_with_fate.rank=2|cooldown.blade_dance.remains>=gcd.max|cooldown.eye_beam.remains<3)
 actions.fs+=/immolation_aura,if=talent.a_fire_inside&talent.burning_wound&full_recharge_time<gcd.max*2&(raid_event.adds.in>full_recharge_time|active_enemies>desired_targets)
 actions.fs+=/immolation_aura,if=active_enemies>desired_targets&(active_enemies>=desired_targets+raid_event.adds.count|raid_event.adds.in>full_recharge_time)
 actions.fs+=/immolation_aura,if=fight_remains<15&cooldown.blade_dance.remains&talent.ragefire
 actions.fs+=/sigil_of_flame,if=talent.student_of_suffering&(cooldown.eye_beam.remains<=gcd.max|!talent.initiative)&(cooldown.essence_break.remains<gcd.max*3|!talent.essence_break)&(cooldown.metamorphosis.remains>10|cooldown.blade_dance.remains<gcd.max*2)
 # actions.fs+=/eye_beam,if=!talent.essence_break&(!talent.chaotic_transformation|cooldown.metamorphosis.remains<5+3*talent.shattered_destiny|cooldown.metamorphosis.remains>10)&(active_enemies>desired_targets*2|raid_event.adds.in>30-talent.cycle_of_hatred.rank*2.5*buff.cycle_of_hatred.stack)&(!talent.initiative|cooldown.vengeful_retreat.remains>5|cooldown.vengeful_retreat.up&active_enemies>2|talent.shattered_destiny)&(!talent.student_of_suffering|cooldown.sigil_of_flame.remains)
 actions.fs+=/eye_beam,if=(!talent.initiative|buff.initiative.up|cooldown.vengeful_retreat.remains>=10|cooldown.metamorphosis.up|talent.initiative&!talent.tactical_retreat)&(cooldown.blade_dance.remains<7|raid_event.adds.up)&(active_enemies>desired_targets*2|raid_event.adds.in>30-buff.cycle_of_hatred.stack*5|fight_style.dungeonroute&!raid_event.adds.in<=40-buff.cycle_of_hatred.stack*5)&(!variable.trinket1_steroids&!variable.trinket2_steroids|variable.trinket1_steroids&(trinket.1.stat.any.cooldown_remains<gcd.max*3|trinket.1.stat.any.cooldown_remains>30-buff.cycle_of_hatred.stack*5)|variable.trinket2_steroids&(trinket.2.stat.any.cooldown_remains<gcd.max*3|trinket.2.stat.any.cooldown_remains>30-buff.cycle_of_hatred.stack*5))|fight_remains<10
-actions.fs+=/felblade,if=variable.fs_tier34_2piece&talent.inertia&buff.inertia_trigger.up&(buff.immolation_aura.up|buff.inertia_trigger.remains<=0.5|cooldown.the_hunt.remains<=0.5)&active_enemies<=2
-actions.fs+=/fel_rush,if=variable.fs_tier34_2piece&talent.inertia&buff.inertia_trigger.up&(buff.immolation_aura.up|buff.inertia_trigger.remains<=gcd.max|cooldown.the_hunt.remains<=gcd.max)&(active_enemies>2|cooldown.felblade.remains>buff.inertia_trigger.remains)
+actions.fs+=/felblade,if=variable.fs_tier34_2piece&talent.inertia&buff.inertia_trigger.up&(buff.immolation_aura.up|buff.inertia_trigger.remains<=0.5|cooldown.the_hunt.remains<=0.5|active_enemies>1&cooldown.eye_beam.remains<=0.5)&active_enemies<=2
+actions.fs+=/fel_rush,if=variable.fs_tier34_2piece&talent.inertia&buff.inertia_trigger.up&(buff.immolation_aura.up|buff.inertia_trigger.remains<=gcd.max|cooldown.the_hunt.remains<=gcd.max|active_enemies>1&cooldown.eye_beam.remains<=gcd)&(active_enemies>2|cooldown.felblade.remains)
 actions.fs+=/essence_break,if=!talent.initiative&cooldown.eye_beam.remains>5
-actions.fs+=/blade_dance,if=cooldown.eye_beam.remains>=gcd.max*4&(active_enemies>3|talent.screaming_brutality&talent.soulscar)
-actions.fs+=/chaos_strike,if=variable.fs_tier34_2piece&(buff.immolation_aura.up|debuff.essence_break.up)
-actions.fs+=/blade_dance,if=cooldown.eye_beam.remains>=gcd.max*4
+actions.fs+=/blade_dance,if=cooldown.eye_beam.remains>=gcd.max*4&(active_enemies>3|talent.screaming_brutality&talent.soulscar|!variable.fs_tier34_2piece|variable.fs_tier34_2piece&(talent.dancing_with_fate.rank=2|buff.immolation_aura.down&!debuff.essence_break.up))
+actions.fs+=/chaos_strike,if=variable.fs_tier34_2piece&buff.immolation_aura.up&((cooldown.eye_beam.remains>=gcd.max*4|(fury>=70-30*(talent.student_of_suffering&(cooldown.sigil_of_flame.remains<=gcd.max|cooldown.sigil_of_flame.up))-buff.chaos_theory.up*20-variable.fury_gen))|talent.blind_fury)
 actions.fs+=/glaive_tempest,if=active_enemies>=desired_targets+raid_event.adds.count|raid_event.adds.in>10
 actions.fs+=/sigil_of_flame,if=active_enemies>3&!talent.student_of_suffering
 actions.fs+=/chaos_strike,if=debuff.essence_break.up
@@ -239,8 +244,8 @@ actions.fs+=/throw_glaive,if=recharge_time<cooldown.eye_beam.remains&debuff.esse
 actions.fs+=/fel_rush,if=buff.unbound_chaos.down&recharge_time<cooldown.eye_beam.remains&debuff.essence_break.down&(cooldown.eye_beam.remains>8|charges_fractional>1.01)&active_enemies>1
 actions.fs+=/arcane_torrent,if=buff.out_of_range.down&debuff.essence_break.down&fury<100
 
-actions.fs_cooldown=metamorphosis,if=(((cooldown.eye_beam.remains>=20|talent.cycle_of_hatred&cooldown.eye_beam.remains>=13|raid_event.adds.remains>8&raid_event.adds.remains<cooldown.eye_beam.remains)&(!talent.essence_break|debuff.essence_break.up)&buff.fel_barrage.down&(raid_event.adds.in>40|(raid_event.adds.remains>8|!talent.fel_barrage)&active_enemies>desired_targets|fight_style.dungeonroute&!raid_event.adds.in<=120)|!talent.chaotic_transformation|fight_remains<30)&buff.inner_demon.down&(!talent.restless_hunter&cooldown.blade_dance.remains>gcd.max*3|prev_gcd.1.death_sweep))&!talent.inertia&!talent.essence_break&time>15
-actions.fs_cooldown+=/metamorphosis,if=(cooldown.blade_dance.remains&((prev_gcd.1.death_sweep|prev_gcd.2.death_sweep|prev_gcd.3.death_sweep|buff.metamorphosis.up&buff.metamorphosis.remains<gcd.max)&cooldown.eye_beam.remains&buff.fel_barrage.down&(raid_event.adds.in>40|(raid_event.adds.remains>8|!talent.fel_barrage)&active_enemies>desired_targets|fight_style.dungeonroute&!raid_event.adds.in<=120)|!talent.chaotic_transformation|fight_remains<30)&(buff.inner_demon.down&(buff.rending_strike.down|!talent.restless_hunter|prev_gcd.1.death_sweep)))&(talent.inertia|talent.essence_break)&time>15
+actions.fs_cooldown=metamorphosis,if=(((cooldown.eye_beam.remains>=20|talent.cycle_of_hatred&cooldown.eye_beam.remains>=13|raid_event.adds.remains>8&raid_event.adds.remains<cooldown.eye_beam.remains)&(!talent.essence_break|debuff.essence_break.up)&buff.fel_barrage.down&(raid_event.adds.in>40|(raid_event.adds.remains>8|!talent.fel_barrage)&active_enemies>desired_targets|fight_style.dungeonroute&!raid_event.adds.in<=120)|fight_remains<30)&buff.inner_demon.down&(!talent.restless_hunter&cooldown.blade_dance.remains>gcd.max*3|prev_gcd.1.death_sweep))&!talent.inertia&!talent.essence_break&time>15
+actions.fs_cooldown+=/metamorphosis,if=(cooldown.blade_dance.remains&((prev_gcd.1.death_sweep|prev_gcd.2.death_sweep|prev_gcd.3.death_sweep|buff.metamorphosis.up&buff.metamorphosis.remains<gcd.max)&cooldown.eye_beam.remains&buff.fel_barrage.down&(raid_event.adds.in>40|(raid_event.adds.remains>8|!talent.fel_barrage)&active_enemies>desired_targets|fight_style.dungeonroute&!raid_event.adds.in<=120)|fight_remains<30)&(buff.inner_demon.down&(!talent.restless_hunter|prev_gcd.1.death_sweep)))&(talent.inertia|talent.essence_break)&time>15
 actions.fs_cooldown+=/potion,if=fight_remains<35|(buff.metamorphosis.up|debuff.essence_break.up)&time>10
 actions.fs_cooldown+=/invoke_external_buff,name=power_infusion,if=buff.metamorphosis.up|fight_remains<=20
 actions.fs_cooldown+=/variable,name=special_trinket,op=set,value=equipped.mad_queens_mandate|equipped.treacherous_transmitter|equipped.skardyns_grace|equipped.signet_of_the_priory|equipped.cursed_stone_idol
@@ -251,16 +256,16 @@ actions.fs_cooldown+=/use_item,name=skardyns_grace,if=(!equipped.mad_queens_mand
 actions.fs_cooldown+=/use_item,name=house_of_cards,if=(cooldown.eye_beam.remains<gcd.max|buff.metamorphosis.up)&(raid_event.adds.remains>8|raid_event.adds.in>15)|fight_remains<25
 actions.fs_cooldown+=/use_item,name=signet_of_the_priory,if=time<20&(!talent.inertia|buff.inertia.up)&!equipped.cursed_stone_idol|(cooldown.eye_beam.remains<gcd.max|buff.metamorphosis.remains>8|cooldown.metamorphosis.up&buff.metamorphosis.up)&(raid_event.adds.remains>15|raid_event.adds.in>115|fight_style.dungeonroute&!raid_event.adds.in<=120)&(!equipped.cursed_stone_idol|(trinket.1.is.signet_of_the_priory&trinket.2.cooldown.remains>20|trinket.2.is.signet_of_the_priory&trinket.1.cooldown.remains>20))|fight_remains<25
 actions.fs_cooldown+=/use_item,name=perfidious_projector,if=variable.tier33_4piece&variable.double_on_use|fight_remains<15
+actions.fs_cooldown+=/use_item,name=chaotic_nethergate,if=variable.tier33_4piece&variable.double_on_use|fight_remains<15
 actions.fs_cooldown+=/use_item,name=ratfang_toxin,if=variable.tier33_4piece&variable.double_on_use|fight_remains<5
 actions.fs_cooldown+=/use_item,name=geargrinders_spare_keys,if=variable.tier33_4piece&variable.double_on_use|fight_remains<10
 actions.fs_cooldown+=/use_item,name=grim_codex,if=variable.tier33_4piece&variable.double_on_use|fight_remains<10
-# actions.fs_cooldown+=/use_item,name=k.u.j.0.s_flame_vents,if=((!talent.initiative|buff.initiative.up|time>5)&(buff.metamorphosis.remains>5|buff.metamorphosis.down)&(trinket.1.is.k.u.j.0.s_flame_vents&(trinket.2.cooldown.duration<10|trinket.2.cooldown.remains>10|!trinket.2.has_buff.any)|trinket.2.is.mk.u.j.0.s_flame_vents&(trinket.1.cooldown.duration<10|trinket.1.cooldown.remains>10|!trinket.1.has_buff.any))&fight_remains>120|fight_remains<10&fight_remains<buff.metamorphosis.remains)&debuff.essence_break.down|fight_remains<5
 actions.fs_cooldown+=/use_item,name=ravenous_honey_buzzer,if=(variable.tier33_4piece&(buff.inertia.down&(cooldown.essence_break.remains&debuff.essence_break.down|!talent.essence_break))&(trinket.1.is.ravenous_honey_buzzer&(trinket.2.cooldown.duration<10|trinket.2.cooldown.remains>10|!trinket.2.has_buff.any)|trinket.2.is.ravenous_honey_buzzer&(trinket.1.cooldown.duration<10|trinket.1.cooldown.remains>10|!trinket.1.has_buff.any))&fight_remains>120|fight_remains<10&fight_remains<buff.metamorphosis.remains)|fight_remains<5
 actions.fs_cooldown+=/use_item,name=blastmaster3000,if=variable.tier33_4piece&variable.double_on_use|fight_remains<10
 actions.fs_cooldown+=/use_item,name=junkmaestros_mega_magnet,if=variable.tier33_4piece_magnet&variable.double_on_use&time>10|fight_remains<5
 actions.fs_cooldown+=/do_treacherous_transmitter_task,if=cooldown.eye_beam.remains>15|cooldown.eye_beam.remains<5|fight_remains<20|buff.metamorphosis.up
 # actions.fs_cooldown+=/use_item,name=unyielding_netherprism,if=((cooldown.eye_beam.remains<gcd.max&(active_enemies>1|talent.looks_can_kill)&(buff.latent_energy.stack>11)&((trinket.1.is.unyielding_netherprism&trinket.2.cooldown.duration>=90|cooldown.metamorphosis.remains<=5)|(trinket.2.is.unyielding_netherprism&trinket.1.cooldown.duration>=90|cooldown.metamorphosis.remains<=5)))&(raid_event.adds.in>105|raid_event.adds.remains>8)|fight_remains<25)&((trinket.1.is.unyielding_netherprism&(!variable.trinket2_steroids&!trinket.2.has_cooldown|trinket.2.cooldown.remains>20)|trinket.2.is.unyielding_netherprism&(!variable.trinket1_steroids&!trinket.1.has_cooldown|trinket.1.cooldown.remains>20))|equipped.improvised_seaforium_pacemaker)
-actions.fs_cooldown+=/use_item,name=unyielding_netherprism,if=((cooldown.eye_beam.remains<gcd.max&(active_enemies>1|talent.looks_can_kill)&((trinket.1.is.unyielding_netherprism&trinket.2.cooldown.duration>=90|cooldown.metamorphosis.remains<=5)|(trinket.2.is.unyielding_netherprism&trinket.1.cooldown.duration>=90|cooldown.metamorphosis.remains<=5))|(buff.metamorphosis.up&((trinket.1.is.unyielding_netherprism&(trinket.2.cooldown.duration>=90|!trinket.2.has_cooldown))|(trinket.2.is.unyielding_netherprism&(trinket.1.cooldown.duration>=90|!trinket.1.has_cooldown))&!equipped.improvised_seaforium_pacemaker)))&(raid_event.adds.in>105|raid_event.adds.remains>8)|fight_remains<25)&((trinket.1.is.unyielding_netherprism&(!variable.trinket2_steroids&!trinket.2.has_cooldown|trinket.2.cooldown.remains>20)|trinket.2.is.unyielding_netherprism&(!variable.trinket1_steroids&!trinket.1.has_cooldown|trinket.1.cooldown.remains>20))|equipped.improvised_seaforium_pacemaker)
+actions.fs_cooldown+=/use_item,name=unyielding_netherprism,if=(((cooldown.eye_beam.remains<gcd.max&(active_enemies>1|talent.looks_can_kill)|!talent.chaotic_transformation&buff.metamorphosis.up)&((trinket.1.is.unyielding_netherprism&trinket.2.cooldown.duration>90&variable.trinket2_steroids|cooldown.metamorphosis.remains<=5&buff.latent_energy.stack>10)|(trinket.2.is.unyielding_netherprism&trinket.1.cooldown.duration>90&variable.trinket1_steroids|cooldown.metamorphosis.remains<=5&buff.latent_energy.stack>10))|(buff.metamorphosis.up&((trinket.1.is.unyielding_netherprism&trinket.2.cooldown.duration>90&variable.trinket2_steroids)|(trinket.2.is.unyielding_netherprism&trinket.1.cooldown.duration>90&variable.trinket1_steroids)&!equipped.improvised_seaforium_pacemaker&!equipped.soleahs_secret_technique)))&(raid_event.adds.in>105|raid_event.adds.remains>8)|fight_remains<25)&((trinket.1.is.unyielding_netherprism&(!variable.trinket2_steroids|trinket.2.cooldown.duration<120|trinket.2.cooldown.remains>20)|trinket.2.is.unyielding_netherprism&(!variable.trinket1_steroids|trinket.1.cooldown.duration<120|trinket.1.cooldown.remains>20))|equipped.improvised_seaforium_pacemaker|equipped.soleahs_secret_technique)
 actions.fs_cooldown+=/use_item,slot=trinket1,if=((cooldown.eye_beam.remains<gcd.max&active_enemies>1|buff.metamorphosis.up&(cooldown.metamorphosis.remains<buff.metamorphosis.remains|cooldown.metamorphosis.remains>=20|cooldown.metamorphosis.up))&(raid_event.adds.in>trinket.1.cooldown.duration-15|raid_event.adds.remains>8|fight_style.dungeonroute&!raid_event.adds.in<=trinket.1.cooldown.duration)|!trinket.1.has_buff.any|fight_remains<25)&!trinket.1.is.mister_locknstalk&!variable.trinket1_crit&!trinket.1.is.skardyns_grace&!trinket.1.is.treacherous_transmitter&!trinket.1.is.unyielding_netherprism&!trinket.1.is.signet_of_the_priory&(!variable.special_trinket|trinket.2.cooldown.remains>20|(trinket.1.cooldown.duration>90&trinket.1.has_buff.agility))
 actions.fs_cooldown+=/use_item,slot=trinket2,if=((cooldown.eye_beam.remains<gcd.max&active_enemies>1|buff.metamorphosis.up&(cooldown.metamorphosis.remains<buff.metamorphosis.remains|cooldown.metamorphosis.remains>=20|cooldown.metamorphosis.up))&(raid_event.adds.in>trinket.2.cooldown.duration-15|raid_event.adds.remains>8|fight_style.dungeonroute&!raid_event.adds.in<=trinket.2.cooldown.duration)|!trinket.2.has_buff.any|fight_remains<25)&!trinket.2.is.mister_locknstalk&!variable.trinket2_crit&!trinket.2.is.skardyns_grace&!trinket.2.is.treacherous_transmitter&!trinket.2.is.unyielding_netherprism&!trinket.2.is.signet_of_the_priory&(!variable.special_trinket|trinket.1.cooldown.remains>20|(trinket.2.cooldown.duration>90&trinket.2.has_buff.agility))
 actions.fs_cooldown+=/the_hunt,if=debuff.essence_break.down&(active_enemies>=desired_targets+raid_event.adds.count|raid_event.adds.in>45)&(buff.metamorphosis.remains>5|buff.metamorphosis.down)&(!talent.initiative|buff.initiative.up|time>5)&time>5&(!talent.inertia&buff.unbound_chaos.down|buff.inertia_trigger.down)&buff.metamorphosis.down|fight_remains<=30
@@ -292,13 +297,14 @@ actions.fs_fel_barrage+=/annihilation,if=fury-variable.gcd_drain-40>20&(buff.fel
 actions.fs_fel_barrage+=/chaos_strike,if=fury-variable.gcd_drain-40>20&(cooldown.fel_barrage.remains&cooldown.fel_barrage.remains<10&fury>100|buff.fel_barrage.up&(buff.fel_barrage.remains*variable.fury_gen-buff.fel_barrage.remains*32)>0)
 actions.fs_fel_barrage+=/demons_bite
 
-actions.fs_meta=death_sweep,if=buff.metamorphosis.remains<gcd.max|debuff.essence_break.up&(buff.immolation_aura.down|!variable.fs_tier34_2piece)&(buff.demon_soul_tww3.down|!set_bonus.thewarwithin_season_3_4pc)|prev_gcd.1.metamorphosis&!variable.fs_tier34_2piece|buff.demonsurge_death_sweep.up&variable.fs_tier34_2piece&buff.demonsurge.remains<5|(variable.fs_tier34_2piece&cooldown.metamorphosis.up&talent.inertia)|active_enemies>=3&buff.demonsurge_death_sweep.up&(!talent.inertia|buff.inertia_trigger.down&cooldown.vengeful_retreat.remains|buff.inertia.up)&(!talent.essence_break|debuff.essence_break.up|cooldown.essence_break.remains>=5)
+actions.fs_meta=death_sweep,if=buff.metamorphosis.remains<gcd.max|debuff.essence_break.up&((buff.immolation_aura.down|!variable.fs_tier34_2piece)&(buff.demon_soul_tww3.down|!set_bonus.thewarwithin_season_3_4pc)|talent.dancing_with_fate.rank=2)|prev_gcd.1.metamorphosis&(!variable.fs_tier34_2piece|talent.dancing_with_fate.rank=2)|buff.demonsurge_death_sweep.up&variable.fs_tier34_2piece&buff.demonsurge.remains<5|(variable.fs_tier34_2piece&cooldown.metamorphosis.up&talent.inertia)|active_enemies>=3&buff.demonsurge_death_sweep.up&(!talent.inertia|buff.inertia_trigger.down&cooldown.vengeful_retreat.remains|buff.inertia.up)&(!talent.essence_break|debuff.essence_break.up|cooldown.essence_break.remains>=5)
 actions.fs_meta+=/sigil_of_flame,if=buff.demonsurge_hardcast.up&talent.student_of_suffering&debuff.essence_break.down&(talent.student_of_suffering&((talent.essence_break&cooldown.essence_break.remains>30-gcd.max|cooldown.essence_break.remains<=gcd.max+talent.inertia&(cooldown.vengeful_retreat.remains<=gcd|buff.initiative.up)+gcd.max*(cooldown.eye_beam.remains<=gcd.max))|(!talent.essence_break&(cooldown.eye_beam.remains>=10|cooldown.eye_beam.remains<=gcd.max))))
+actions.fs_meta+=/sigil_of_flame,if=buff.demonsurge_hardcast.up&buff.demonsurge_sigil_of_doom.up&(buff.demonsurge.remains<5|cooldown.blade_dance.remains&buff.metamorphosis.remains<=gcd.max)&!debuff.essence_break.up
 actions.fs_meta+=/vengeful_retreat,use_off_gcd=1,if=talent.initiative&(gcd.remains<0.3|talent.inertia&cooldown.eye_beam.remains>gcd.remains&(buff.cycle_of_hatred.stack=2|buff.cycle_of_hatred.stack=3))&(cooldown.metamorphosis.remains&(buff.demonsurge_annihilation.down&buff.demonsurge_death_sweep.down)|talent.restless_hunter&buff.demonsurge_annihilation.down)&(!talent.inertia&buff.unbound_chaos.down|buff.inertia_trigger.down)&(!talent.essence_break|cooldown.essence_break.remains>18|cooldown.essence_break.remains<=gcd.remains+talent.inertia*1.5&(!talent.student_of_suffering|(buff.student_of_suffering.up|cooldown.sigil_of_flame.remains>5)))&(cooldown.eye_beam.remains>5|cooldown.eye_beam.remains<=gcd.remains|cooldown.eye_beam.up)|cooldown.metamorphosis.up&buff.demonsurge.stack>1&talent.initiative&!talent.inertia&gcd.remains<0.3
 actions.fs_meta+=/vengeful_retreat,use_off_gcd=1,if=variable.fs_tier34_2piece&buff.inertia_trigger.down&talent.initiative
 actions.fs_meta+=/felblade,if=talent.inertia&variable.fs_tier34_2piece&buff.inertia_trigger.up
 # &active_enemies<3 actions.fs_meta+=/fel_rush,if=talent.inertia&variable.fs_tier34_2piece&buff.inertia_trigger.up&(active_enemies>=3|cooldown.felblade.remains) actions.fs_meta+=/felblade,if=talent.inertia&buff.inertia_trigger.up&cooldown.essence_break.remains<=1&hero_tree.aldrachi_reaver&cooldown.blade_dance.remains<=gcd.max*2&cooldown.metamorphosis.remains<=gcd.max*3 actions.fs_meta+=/felblade,if=talent.inertia&buff.inertia_trigger.up&debuff.essence_break.down&buff.demonsurge_hardcast.up&buff.demonsurge.stack=0&buff.demonsurge_death_sweep.up actions.fs_meta+=/fel_rush,if=talent.inertia&buff.inertia_trigger.up&debuff.essence_break.down&buff.demonsurge_hardcast.up&buff.demonsurge.stack=0&buff.demonsurge_death_sweep.up&cooldown.felblade.remains actions.fs_meta+=/fel_rush,if=talent.inertia&buff.inertia_trigger.up&cooldown.essence_break.remains<=1&hero_tree.aldrachi_reaver&cooldown.blade_dance.remains<=gcd.max*2&cooldown.metamorphosis.remains<=gcd.max*3 actions.fs_meta+=/essence_break,if=fury>=30&talent.restless_hunter&cooldown.metamorphosis.up&(talent.inertia&buff.inertia.up|!talent.inertia)&cooldown.blade_dance.remains<=gcd.max&(hero_tree.felscarred&buff.demonsurge_annihilation.down|hero_tree.aldrachi_reaver)
-actions.fs_meta+=/death_sweep,if=(talent.essence_break&buff.demonsurge_death_sweep.up&(buff.inertia.up&(cooldown.essence_break.remains>buff.inertia.remains|!talent.essence_break)|cooldown.metamorphosis.remains<=5&buff.inertia_trigger.down|buff.inertia.up&buff.demonsurge_abyssal_gaze.up)|talent.inertia&buff.inertia_trigger.down&cooldown.vengeful_retreat.remains>=gcd.max&buff.inertia.down)&(!variable.fs_tier34_2piece|!talent.inertia|active_enemies>=3&debuff.essence_break.up)
+actions.fs_meta+=/death_sweep,if=(talent.essence_break&buff.demonsurge_death_sweep.up&(buff.inertia.up&(cooldown.essence_break.remains>buff.inertia.remains|!talent.essence_break)|cooldown.metamorphosis.remains<=5&buff.inertia_trigger.down|buff.inertia.up&buff.demonsurge_abyssal_gaze.up)|talent.inertia&buff.inertia_trigger.down&cooldown.vengeful_retreat.remains>=gcd.max&buff.inertia.down)&(!variable.fs_tier34_2piece|(variable.fs_tier34_2piece&(!talent.inertia|active_enemies>=3&debuff.essence_break.up|talent.dancing_with_fate=2)))
 actions.fs_meta+=/annihilation,if=buff.metamorphosis.remains<gcd.max&cooldown.blade_dance.remains<buff.metamorphosis.remains|debuff.essence_break.remains&debuff.essence_break.remains<0.5|talent.restless_hunter&(buff.demonsurge_annihilation.up|hero_tree.aldrachi_reaver&buff.inner_demon.up)&cooldown.essence_break.up&cooldown.metamorphosis.up
 actions.fs_meta+=/annihilation,if=(buff.demonsurge_annihilation.up&talent.restless_hunter)&(cooldown.eye_beam.remains<gcd.max*3&cooldown.blade_dance.remains|cooldown.metamorphosis.remains<gcd.max*3)
 actions.fs_meta+=/felblade,if=buff.inertia_trigger.up&talent.inertia&debuff.essence_break.down&cooldown.metamorphosis.remains&cooldown.eye_beam.remains&(cooldown.blade_dance.remains<=5.5&(talent.essence_break&cooldown.essence_break.remains<=0.5|!talent.essence_break|cooldown.essence_break.remains>=buff.inertia_trigger.remains&cooldown.blade_dance.remains<=4.5&(cooldown.blade_dance.remains|cooldown.blade_dance.remains<=0.5))|buff.metamorphosis.remains<=5.5+talent.shattered_destiny*2)
@@ -307,12 +313,12 @@ actions.fs_meta+=/fel_rush,if=buff.inertia_trigger.up&talent.inertia&debuff.esse
 actions.fs_meta+=/immolation_aura,if=(active_enemies>1|talent.a_fire_inside&(talent.isolated_prey|variable.fs_tier34_2piece))&debuff.essence_break.down&(active_enemies>=3|full_recharge_time<gcd.max*2|variable.fs_tier34_2piece&buff.immolation_aura.remains<=gcd.max|variable.fs_tier34_2piece&buff.immolation_aura.down)
 actions.fs_meta+=/annihilation,if=buff.inner_demon.up&cooldown.blade_dance.remains&(cooldown.eye_beam.remains<gcd.max*3|cooldown.metamorphosis.remains<gcd.max*3)
 # actions.fs_meta+=/sigil_of_doom,if=debuff.essence_break.down&(buff.demonsurge_sigil_of_doom.up&cooldown.blade_dance.remains|talent.student_of_suffering&((talent.essence_break&cooldown.essence_break.remains>30-gcd.max|cooldown.essence_break.remains<=gcd.max*3&(!talent.inertia|buff.inertia_trigger.up))|(!talent.essence_break&(cooldown.eye_beam.remains>=30|cooldown.eye_beam.remains<=gcd.max))))
-actions.fs_meta+=/essence_break,if=fury>20&(cooldown.metamorphosis.remains>10|cooldown.blade_dance.remains<gcd.max*2&!variable.fs_tier34_2piece|variable.fs_tier34_2piece&buff.immolation_aura.up)&(buff.inertia_trigger.down|buff.inertia.up&buff.inertia.remains>=gcd.max*3|!talent.inertia|active_enemies>desired_targets&raid_event.adds.remains<cooldown.vengeful_retreat.remains+5|buff.metamorphosis.remains<=cooldown.metamorphosis.remains)&buff.out_of_range.remains<gcd.max&(!talent.shattered_destiny|cooldown.eye_beam.remains>4)&(active_enemies>1|cooldown.metamorphosis.remains>5&cooldown.eye_beam.remains)&(!buff.cycle_of_hatred.stack=3|buff.initiative.up|!talent.initiative|!talent.cycle_of_hatred)|fight_remains<5
+actions.fs_meta+=/essence_break,if=fury>20&(cooldown.metamorphosis.remains>10|cooldown.blade_dance.remains<gcd.max*2&!variable.fs_tier34_2piece|variable.fs_tier34_2piece&buff.immolation_aura.up)&(buff.inertia_trigger.down|buff.inertia.up&buff.inertia.remains>=gcd.max*3|!talent.inertia|active_enemies>desired_targets&raid_event.adds.remains<cooldown.vengeful_retreat.remains+5)&buff.out_of_range.remains<gcd.max&(!talent.shattered_destiny|cooldown.eye_beam.remains>4)&(active_enemies>1|cooldown.metamorphosis.remains>5&cooldown.eye_beam.remains)&(!buff.cycle_of_hatred.stack=3|buff.initiative.up|!talent.initiative|!talent.cycle_of_hatred|talent.inertia)|fight_remains<5
 actions.fs_meta+=/sigil_of_flame,if=buff.demonsurge_hardcast.up&buff.demonsurge_death_sweep.down&debuff.essence_break.down&(cooldown.eye_beam.remains>=20|cooldown.eye_beam.remains<=gcd.max)&(!talent.student_of_suffering|buff.demonsurge_sigil_of_doom.up)
 actions.fs_meta+=/immolation_aura,if=!variable.fs_tier34_2piece&buff.demonsurge.up&debuff.essence_break.down&buff.demonsurge_consuming_fire.up&cooldown.blade_dance.remains>=gcd.max&cooldown.eye_beam.remains>=gcd.max&fury.deficit>10+variable.fury_gen
 actions.fs_meta+=/eye_beam,if=debuff.essence_break.down&buff.inner_demon.down&(buff.metamorphosis.remains>=7|!set_bonus.thewarwithin_season_3_4pc)
 actions.fs_meta+=/eye_beam,if=buff.demonsurge_hardcast.up&debuff.essence_break.down&buff.inner_demon.down&(buff.cycle_of_hatred.stack<4|cooldown.essence_break.remains>=20-gcd.max*talent.student_of_suffering|cooldown.sigil_of_flame.remains&talent.student_of_suffering|cooldown.essence_break.remains<=gcd.max|!talent.essence_break)&(buff.metamorphosis.remains>=7|!set_bonus.thewarwithin_season_3_4pc)
-actions.fs_meta+=/death_sweep,if=(cooldown.essence_break.remains>=gcd.max*2+talent.student_of_suffering*gcd.max|debuff.essence_break.up|!talent.essence_break)&(buff.immolation_aura.down|!variable.fs_tier34_2piece|talent.screaming_brutality&talent.soulscar)&(buff.demon_soul_tww3.down|!set_bonus.thewarwithin_season_3_4pc|active_enemies>=3|talent.screaming_brutality&talent.soulscar)
+actions.fs_meta+=/death_sweep,if=(cooldown.essence_break.remains>=gcd.max*2+talent.student_of_suffering*gcd.max|debuff.essence_break.up|!talent.essence_break)&(buff.immolation_aura.down|!variable.fs_tier34_2piece|talent.screaming_brutality&talent.soulscar|talent.dancing_with_fate.rank=2)&(buff.demon_soul_tww3.down|!set_bonus.thewarwithin_season_3_4pc|active_enemies>=3|talent.screaming_brutality&talent.soulscar|talent.dancing_with_fate.rank=2)
 actions.fs_meta+=/glaive_tempest,if=debuff.essence_break.down&(cooldown.blade_dance.remains>gcd.max*2|fury>60)&(active_enemies>=desired_targets+raid_event.adds.count|raid_event.adds.in>10)
 actions.fs_meta+=/sigil_of_flame,if=active_enemies>2&debuff.essence_break.down
 # actions.fs_meta+=/throw_glaive,if=talent.soulscar&talent.furious_throws&active_enemies>1&debuff.essence_break.down
@@ -340,7 +346,7 @@ actions.fs_opener+=/vengeful_retreat,use_off_gcd=1,if=talent.initiative&time>4&b
 # actions.fs_opener+=/felblade,if=!talent.inertia&active_enemies=1&buff.unbound_chaos.up&buff.initiative.up&debuff.essence_break.down
 actions.fs_opener+=/felblade,if=talent.inertia&buff.inertia_trigger.up&hero_tree.felscarred&debuff.essence_break.down&talent.essence_break&cooldown.metamorphosis.remains&active_enemies<=2&cooldown.sigil_of_flame.remains
 # actions.fs_opener+=/immolation_aura,if=hero_tree.felscarred&charges=2&buff.student_of_suffering.up&talent.a_fire_inside&cooldown.sigil_of_flame.remains&debuff.essence_break.down actions.fs_opener+=/immolation_aura,if=hero_tree.felscarred&debuff.essence_break.down&talent.a_fire_inside&buff.metamorphosis.remains&charges=2 actions.fs_opener+=/felblade,if=buff.inertia_trigger.up&talent.inertia&talent.restless_hunter&cooldown.essence_break.up&cooldown.metamorphosis.up&(buff.demonsurge_annihilation.down|hero_tree.aldrachi_reaver)&buff.metamorphosis.up&cooldown.blade_dance.remains<=gcd.max actions.fs_opener+=/fel_rush,if=buff.inertia_trigger.up&talent.inertia&talent.restless_hunter&cooldown.essence_break.up&cooldown.metamorphosis.up&(buff.demonsurge_annihilation.down|hero_tree.aldrachi_reaver)&buff.metamorphosis.up&cooldown.blade_dance.remains<=gcd.max actions.fs_opener+=/felblade,if=talent.inertia&buff.inertia_trigger.up&(buff.inertia.down&buff.metamorphosis.up&!hero_tree.felscarred|hero_tree.felscarred&(buff.metamorphosis.down&charges>1|prev_gcd.1.eye_beam|buff.demonsurge.stack>=5))&debuff.essence_break.down actions.fs_opener+=/fel_rush,if=talent.inertia&buff.unbound_chaos.up&talent.a_fire_inside&(buff.inertia.down&buff.metamorphosis.up&!hero_tree.felscarred|hero_tree.felscarred&(buff.metamorphosis.down&charges>1|prev_gcd.1.eye_beam|buff.demonsurge.stack>=5|charges=2&buff.unbound_chaos.down))&debuff.essence_break.down actions.fs_opener+=/the_hunt,if=(buff.metamorphosis.up&hero_tree.aldrachi_reaver&talent.shattered_destiny|!talent.shattered_destiny&hero_tree.aldrachi_reaver|hero_tree.felscarred)&(!talent.initiative|talent.inertia|buff.initiative.up|time>5)
-actions.fs_opener+=/sigil_of_flame,if=buff.demonsurge_hardcast.up&(buff.inner_demon.down|buff.out_of_range.up)&debuff.essence_break.down&(!variable.fs_tier34_2piece|cooldown.essence_break.remains|!talent.essence_break)
+actions.fs_opener+=/sigil_of_flame,if=buff.demonsurge_hardcast.up&(buff.inner_demon.down|buff.out_of_range.up)&debuff.essence_break.down&(!variable.fs_tier34_2piece|cooldown.essence_break.remains&buff.inertia.down&(!talent.inertia|buff.immolation_aura.down)|!talent.essence_break|fury<=40)
 actions.fs_opener+=/annihilation,if=(buff.inner_demon.up|buff.demonsurge_annihilation.up)&(cooldown.metamorphosis.up|!talent.essence_break&cooldown.blade_dance.remains)
 actions.fs_opener+=/death_sweep,if=buff.demonsurge_death_sweep.up&!talent.restless_hunter&(!variable.fs_tier34_2piece|buff.demonsurge_hardcast.down)
 actions.fs_opener+=/annihilation,if=buff.demonsurge_annihilation.up&(!talent.essence_break|buff.inner_demon.up)
Balance Druid — 4c75fa4 to 9316a64 (1 commit)
@@ -10,66 +10,46 @@
 # Executed before combat begins. Accepts non-harmful actions only.
 # Snapshot raid buffed stats before combat begins and pre-potting is done.
 actions.precombat=snapshot_stats
-# Variable to enable sims with no CDs, type druid.no_cds in Expert Mode footer to use it
+# Executed before combat begins. Accepts non-harmful actions only.
 actions.precombat+=/variable,name=no_cd_talent,value=!talent.celestial_alignment&!talent.incarnation_chosen_of_elune|druid.no_cds
-# Variables to establish on-use trinket slots. on_use_trinket=1 is slot 1, on_use_trinket=2 is slot 2, on_use_trinket=3 is double on-use, on_use_trinket=0 is no on-use.
 actions.precombat+=/variable,name=on_use_trinket,value=0
 actions.precombat+=/variable,name=on_use_trinket,op=add,value=trinket.1.has_use_buff
 actions.precombat+=/variable,name=on_use_trinket,op=add,value=(trinket.2.has_use_buff)*2
-# Enter Moonkin Form and precast
 actions.precombat+=/moonkin_form
 actions.precombat+=/wrath
 actions.precombat+=/wrath
 actions.precombat+=/starfire,if=!talent.stellar_flare
 actions.precombat+=/stellar_flare
 
 # Executed every time the actor is available.
-# Variable to establish passive AP gen
+# Executed every time the actor is available.
 actions=variable,name=passive_asp,value=6%spell_haste+talent.natures_balance+((talent.bounteous_bloom&buff.bounteous_bloom.up)*15)+talent.orbit_breaker*dot.moonfire.ticking*(buff.orbit_breaker.stack>(27-2*buff.solstice.up))*24
-# Variable to map CA's effective CD, not always reliable to reference when using Whirling Stars
 actions+=/variable,name=ca_effective_cd,value=cooldown.ca_inc.remains<?cooldown.force_of_nature.remains
-# Pre_Cd Condition referenced in every CD except for when using 11.2 Keeper Set
 actions+=/variable,name=pre_cd_condition,value=(!talent.whirling_stars|!talent.convoke_the_spirits|cooldown.convoke_the_spirits.remains<gcd.max*2|fight_remains<cooldown.convoke_the_spirits.remains+3|cooldown.convoke_the_spirits.remains>cooldown.ca_inc.full_recharge_time+15*talent.control_of_the_dream)&(variable.on_use_trinket=0|(variable.on_use_trinket=1|variable.on_use_trinket=3)&(trinket.1.cooldown.remains>cooldown.ca_inc.full_recharge_time+(15*talent.control_of_the_dream)|!talent.convoke_the_spirits&hero_tree.elunes_chosen&(trinket.1.cooldown.duration<=100&trinket.1.cooldown.remains>cooldown.ca_inc.full_recharge_time-cooldown.ca_inc.duration|trinket.1.cooldown.duration>=100&cooldown.ca_inc.charges_fractional=1&(trinket.1.cooldown.duration>?cooldown.ca_inc.full_recharge_time))|talent.convoke_the_spirits&(cooldown.convoke_the_spirits.remains<3&(ceil((fight_remains-10)%cooldown.convoke_the_spirits.duration)>ceil((fight_remains-trinket.1.cooldown.remains-10)%cooldown.convoke_the_spirits.duration))|cooldown.convoke_the_spirits.remains>trinket.1.cooldown.remains&cooldown.ca_inc.full_recharge_time-cooldown.ca_inc.duration<trinket.1.cooldown.remains+15)|trinket.1.cooldown.remains+6>fight_remains|trinket.1.cooldown.ready)|variable.on_use_trinket=2&(trinket.2.cooldown.remains>cooldown.ca_inc.full_recharge_time+(15*talent.control_of_the_dream)|!talent.convoke_the_spirits&hero_tree.elunes_chosen&(trinket.2.cooldown.duration<=100&trinket.2.cooldown.remains>cooldown.ca_inc.full_recharge_time-cooldown.ca_inc.duration|trinket.2.cooldown.duration>=100&cooldown.ca_inc.charges_fractional=1&(trinket.2.cooldown.duration>?cooldown.ca_inc.full_recharge_time))|talent.convoke_the_spirits&(cooldown.convoke_the_spirits.remains<3&(ceil((fight_remains-10)%cooldown.convoke_the_spirits.duration)>ceil((fight_remains-trinket.2.cooldown.remains-10)%cooldown.convoke_the_spirits.duration))|cooldown.convoke_the_spirits.remains>trinket.2.cooldown.remains&cooldown.ca_inc.full_recharge_time-cooldown.ca_inc.duration<trinket.2.cooldown.remains+15)|trinket.2.cooldown.remains+6>fight_remains|trinket.2.cooldown.ready))&cooldown.ca_inc.remains<gcd.max&!buff.ca_inc.up
-# CD_condition used for CA/Incarn
 actions+=/variable,name=cd_condition,value=variable.pre_cd_condition&(fight_remains<(15+5*talent.incarnation_chosen_of_elune)*(1-talent.whirling_stars*0.2)|target.time_to_die>10&(!hero_tree.keeper_of_the_grove|buff.harmony_of_the_grove.up))
-# Convoke condition variable
-actions+=/variable,name=convoke_condition,value=fight_remains<5|(buff.ca_inc.up|cooldown.ca_inc.remains>40)&(!hero_tree.keeper_of_the_grove|buff.harmony_of_the_grove.up|cooldown.force_of_nature.remains>15)
-# Variable used to write time remaining on Eclipse
+actions+=/variable,name=convoke_condition,value=fight_remains<4+gcd.max|(buff.ca_inc.up|cooldown.ca_inc.remains>40)&(!hero_tree.keeper_of_the_grove|buff.harmony_of_the_grove.up|cooldown.force_of_nature.remains>15)
 actions+=/variable,name=eclipse_remains,value=buff.eclipse_lunar.remains<?buff.eclipse_solar.remains
-# Variable used to enter Eclipse. Negate variable.enter_lunar to enter Solar Eclipse.
 actions+=/variable,name=enter_lunar,value=talent.lunar_calling|spell_targets.starfire>3-(talent.umbral_intensity|talent.soul_of_the_forest)
-# Variable used for Balance of All Things stacks
 actions+=/variable,name=boat_stacks,value=buff.balance_of_all_things_arcane.stack+buff.balance_of_all_things_nature.stack
-# This APL is worse than original after the changes so no point running it
 actions+=/variable,name=tww3_keeper_4pc,value=hero_tree.keeper_of_the_grove&set_bonus.tww3_4pc
-# Keeper 11.2 CA condition
-actions+=/variable,name=kotg_ca_condition,value=(variable.tww3_keeper_4pc&astral_power.deficit<=50&(variable.on_use_trinket=1&trinket.1.cooldown.ready|variable.on_use_trinket=2&trinket.2.cooldown.ready|variable.on_use_trinket=0|variable.on_use_trinket=3&(trinket.1.cooldown.ready|trinket.2.cooldown.ready))&(cooldown.convoke_the_spirits.remains<gcd.max*4|!talent.convoke_the_spirits)&(cooldown.ca_inc.full_recharge_time<buff.dryad.duration&!(fight_remains<(cooldown.ca_inc.full_recharge_time+cooldown.ca_inc.duration+5>?cooldown.convoke_the_spirits.duration+4*gcd.max+3>?(trinket.1.cooldown.duration+trinket.1.proc.any_dps.duration-20*trinket.1.is.arazs_ritual_forge|trinket.2.cooldown.duration+trinket.2.proc.any_dps.duration-20*trinket.2.is.arazs_ritual_forge))&fight_remains>(cooldown.force_of_nature.duration+cooldown.force_of_nature.remains+buff.harmony_of_the_grove.duration+buff.ca_inc.duration<?cooldown.potion.remains+15))|cooldown.ca_inc.full_recharge_time>30+buff.dryad.duration&fight_remains>(cooldown.convoke_the_spirits.remains+cooldown.convoke_the_spirits.duration-4*gcd.max*talent.control_of_the_dream<?105)+4*gcd.max+5|fight_remains<cooldown.ca_inc.full_recharge_time+buff.ca_inc.duration)&cooldown.force_of_nature.remains<gcd.max*4&!buff.ca_inc.up)|buff.harmony_of_the_grove.up&(buff.dryad.remains<gcd.max&buff.dryad.up|buff.dryads_favor.up)|fight_remains<15
-# Keeper 11.2 Incarn condition
+actions+=/variable,name=kotg_single_ca_condition,value=variable.tww3_keeper_4pc&!buff.ca_inc.up&cooldown.ca_inc.ready&((variable.on_use_trinket=1&(trinket.1.cooldown.ready|fight_remains<trinket.1.cooldown.remains)|variable.on_use_trinket=2&(trinket.2.cooldown.ready|fight_remains<trinket.2.cooldown.remains)|variable.on_use_trinket=0|variable.on_use_trinket=3&(trinket.1.cooldown.ready|trinket.2.cooldown.ready|fight_remains<(trinket.1.cooldown.remains>?trinket.2.cooldown.remains)))&(cooldown.convoke_the_spirits.remains<gcd.max*3-0.5|fight_remains<cooldown.convoke_the_spirits.remains|!talent.convoke_the_spirits)&(cooldown.force_of_nature.remains<gcd.max*2-0.3&!(fight_remains>cooldown.ca_inc.full_recharge_time+buff.ca_inc.duration*0.3+gcd.max&fight_remains<cooldown.force_of_nature.remains+cooldown.force_of_nature.duration+gcd.max*2))&(cooldown.ca_inc.full_recharge_time>20&fight_remains>(cooldown.convoke_the_spirits.remains+cooldown.convoke_the_spirits.duration-gcd.max*5*talent.control_of_the_dream<?105)+gcd.max*6+4+2|fight_remains<cooldown.ca_inc.full_recharge_time+buff.ca_inc.duration+gcd.max&!(fight_remains>cooldown.ca_inc.full_recharge_time+buff.ca_inc.duration*0.3+gcd.max&cooldown.ca_inc.full_recharge_time>cooldown.force_of_nature.remains+cooldown.force_of_nature.duration+gcd.max&fight_remains>cooldown.force_of_nature.remains+cooldown.force_of_nature.duration+buff.harmony_of_the_grove.duration+gcd.max)&!(!cooldown.potion.ready&fight_remains>cooldown.potion.remains+buff.harmony_of_the_grove.duration)|!cooldown.potion.ready&fight_remains<cooldown.ca_inc.full_recharge_time+cooldown.ca_inc.duration*2+buff.dryad.duration+2&fight_remains>(cooldown.potion.remains+4+buff.dryad.duration+2+gcd.max<?cooldown.ca_inc.full_recharge_time+cooldown.ca_inc.duration+buff.dryad.duration+2+gcd.max<?(cooldown.convoke_the_spirits.remains+cooldown.convoke_the_spirits.duration-gcd.max*5*talent.control_of_the_dream<?105)+gcd.max*6+4+buff.dryad.duration+2<?(variable.on_use_trinket=1)*trinket.1.cooldown.duration+(variable.on_use_trinket=2)*trinket.2.cooldown.duration+(variable.on_use_trinket=3)*(trinket.1.cooldown.duration>?trinket.2.cooldown.duration)+4+buff.dryad.duration+2+gcd.max))|fight_remains<buff.ca_inc.duration+gcd.max*(1+(dot.moonfire.remains<(3>?fight_remains)+dot.sunfire.remains<(buff.ca_inc.duration+gcd.max>?fight_remains)<?dot.sunfire.remains<(buff.ca_inc.duration>?fight_remains)+dot.moonfire.remains<(3+gcd.max>?fight_remains))))
+actions+=/variable,name=kotg_double_ca_condition,value=variable.tww3_keeper_4pc&!buff.ca_inc.up&(variable.on_use_trinket=1&(trinket.1.cooldown.ready|trinket.1.proc.any_dps.up)|variable.on_use_trinket=2&(trinket.2.cooldown.ready|trinket.2.proc.any_dps.up)|variable.on_use_trinket=0|variable.on_use_trinket=3&(trinket.1.cooldown.ready|trinket.1.proc.any_dps.up|trinket.2.cooldown.ready|trinket.2.proc.any_dps.up))&(cooldown.convoke_the_spirits.remains<gcd.max*2-0.3|!talent.convoke_the_spirits)&(cooldown.ca_inc.full_recharge_time<4+gcd.max*3&(cooldown.force_of_nature.ready|buff.harmony_of_the_grove.up|cooldown.force_of_nature.remains<gcd.max*3-0.5&fight_remains<cooldown.force_of_nature.remains+buff.dryad.duration+2+4+gcd.max*4)|(cooldown.ca_inc.full_recharge_time-gcd.max<?cooldown.force_of_nature.remains)<buff.dryad.duration&(fight_remains<cooldown.force_of_nature.remains+buff.dryad.duration+2+4+gcd.max*2|fight_remains<cooldown.ca_inc.full_recharge_time+buff.ca_inc.duration+gcd.max&fight_remains<cooldown.ca_inc.full_recharge_time-buff.dryad.duration-gcd.max))&!(!cooldown.potion.ready&fight_remains<cooldown.ca_inc.full_recharge_time+cooldown.ca_inc.duration*2+buff.dryad.duration+2+gcd.max&fight_remains>(cooldown.potion.remains+buff.dryad.duration+2+gcd.max<?buff.dryad.duration+2+4+gcd.max*6)&(fight_remains<cooldown.ca_inc.full_recharge_time+cooldown.ca_inc.duration+buff.dryad.duration+2+gcd.max|fight_remains>((cooldown.convoke_the_spirits.remains+cooldown.convoke_the_spirits.duration-gcd.max*5*talent.control_of_the_dream<?105)+gcd.max*6+4+buff.dryad.duration+2<?(variable.on_use_trinket=1)*trinket.1.cooldown.duration+(variable.on_use_trinket=2)*trinket.2.cooldown.duration+(variable.on_use_trinket=3)*(trinket.1.cooldown.duration>?trinket.2.cooldown.duration)+4+buff.dryad.duration+2+gcd.max)))
+actions+=/variable,name=kotg_second_ca_condition,value=variable.tww3_keeper_4pc&buff.ca_inc.up&((buff.harmony_of_the_grove.up&(cooldown.convoke_the_spirits.remains>30|buff.harmony_of_the_grove.remains<gcd.max*2|buff.dryads_favor.up)&!(!cooldown.potion.ready&fight_remains<cooldown.ca_inc.full_recharge_time+cooldown.ca_inc.duration+buff.dryad.duration+2+gcd.max&fight_remains>(cooldown.potion.remains+buff.dryad.duration+2+gcd.max<?cooldown.ca_inc.full_recharge_time+buff.dryad.duration+2+gcd.max)&(fight_remains<cooldown.ca_inc.full_recharge_time+buff.dryad.duration+2+gcd.max|fight_remains>((cooldown.convoke_the_spirits.remains-gcd.max*5*talent.control_of_the_dream<?105)+gcd.max*6+4+buff.dryad.duration+2<?(variable.on_use_trinket=1)*trinket.1.cooldown.remains+(variable.on_use_trinket=2)*trinket.2.cooldown.remains+(variable.on_use_trinket=3)*(trinket.1.cooldown.remains>?trinket.2.cooldown.remains)+4+buff.dryad.duration+2+gcd.max))))|fight_remains<buff.dryad.duration+2+gcd.max)
 actions+=/variable,name=kotg_inc_condition,value=variable.tww3_keeper_4pc&astral_power.deficit<=50&(variable.on_use_trinket=1&trinket.1.cooldown.ready|variable.on_use_trinket=2&trinket.2.cooldown.ready|variable.on_use_trinket=0|variable.on_use_trinket=3&(trinket.1.cooldown.ready|trinket.2.cooldown.ready)|(trinket.1.cooldown.remains>cooldown.force_of_nature.duration|trinket.2.cooldown.remains>cooldown.force_of_nature.duration)&cooldown.force_of_nature.remains<gcd.max*2)|fight_remains<(cooldown.ca_inc.full_recharge_time>?cooldown.force_of_nature.remains)
-# Variable to pool Astral Power for CA with 11.2 4pc
-actions+=/variable,name=pool_for_cd,value=astral_power<action.starsurge.cost*3&(variable.on_use_trinket=1&trinket.1.cooldown.ready|variable.on_use_trinket=2&trinket.2.cooldown.ready|variable.on_use_trinket=3&(trinket.1.cooldown.ready|trinket.2.cooldown.ready)|variable.on_use_trinket=0)&(cooldown.convoke_the_spirits.remains<4*gcd.max|!talent.convoke_the_spirits)&(cooldown.ca_inc.full_recharge_time<buff.dryad.duration&!(fight_remains<(cooldown.ca_inc.full_recharge_time+cooldown.ca_inc.duration+5>?cooldown.convoke_the_spirits.duration+4*gcd.max+3>?(trinket.1.cooldown.duration+trinket.1.proc.any_dps.duration-20*trinket.1.is.arazs_ritual_forge|trinket.2.cooldown.duration+trinket.2.proc.any_dps.duration-20*trinket.2.is.arazs_ritual_forge))&fight_remains>(cooldown.force_of_nature.duration+cooldown.force_of_nature.remains+buff.harmony_of_the_grove.duration+buff.ca_inc.duration<?cooldown.potion.remains+15))|cooldown.ca_inc.full_recharge_time>30+buff.dryad.duration&fight_remains>(cooldown.convoke_the_spirits.remains+cooldown.convoke_the_spirits.duration-4*gcd.max*talent.control_of_the_dream<?105)+4*gcd.max+5|fight_remains<cooldown.ca_inc.full_recharge_time+buff.ca_inc.duration)&cooldown.force_of_nature.remains<4*gcd.max&!buff.ca_inc.up
-# Variable to pool Astral Power for Dryads Favor with 11.2 4pc
-actions+=/variable,name=pool_in_ca,value=buff.dryad.up&((astral_power-action.starsurge.cost)+((0<?(buff.dryad.remains-gcd.max))*(action.wrath.energize_amount%action.wrath.execute_time))+variable.passive_asp)<action.starsurge.cost*2
-# Lines for trinkets that require specific use-cases
+actions+=/variable,name=pool_for_cd,value=astral_power<(variable.kotg_single_ca_condition*action.starsurge.cost*2<?variable.kotg_double_ca_condition*(action.starsurge.cost*2-action.force_of_nature.energize_amount)<?(!buff.ca_inc.up&fight_remains>cooldown.ca_inc.remains+2+gcd.max&fight_remains<(fight_remains-cooldown.ca_inc.remains>?buff.ca_inc.duration)+5)*action.starsurge.cost*3<?(!buff.ca_inc.up&fight_remains>cooldown.ca_inc.full_recharge_time+2+gcd.max&fight_remains<(fight_remains-cooldown.ca_inc.full_recharge_time>?buff.ca_inc.duration)+4+8)*(action.starsurge.cost*3-action.force_of_nature.energize_amount*(cooldown.force_of_nature.ready)))
+actions+=/variable,name=pool_in_ca,value=buff.dryad.up&fight_remains>buff.dryad.remains&cooldown.convoke_the_spirits.remains>buff.dryad.remains&(astral_power-action.starsurge.cost+(0<?floor((buff.dryad.remains+2-gcd.max*2-0.5)%action.wrath.execute_time))*action.wrath.energize_amount)<action.starsurge.cost*2
 actions+=/use_item,name=imperfect_ascendancy_serum,if=dot.sunfire.remains>4&(dot.moonfire.remains>4|talent.treants_of_the_moon&(cooldown.force_of_nature.remains<3|buff.harmony_of_the_grove.up)&variable.ca_effective_cd<1|fight_remains<20|fight_remains<variable.ca_effective_cd&(buff.harmony_of_the_grove.up|cooldown.convoke_the_spirits.ready))&buff.spymasters_report.stack<=29
-# Generic trinket conditions
-actions+=/variable,name=generic_trinket_condition,value=(buff.dryad.up|buff.ca_inc.up)|variable.no_cd_talent|fight_remains<variable.ca_effective_cd&(buff.harmony_of_the_grove.up|cooldown.convoke_the_spirits.ready)|(buff.spymasters_report.stack+variable.ca_effective_cd%6)>29&variable.ca_effective_cd>20|variable.on_use_trinket=0
-actions+=/use_item,slot=trinket1,if=!trinket.1.is.spymasters_web&!trinket.1.is.araz_ritual_forge&!trinket.1.is.imperfect_ascendancy_serum&!trinket.1.is.treacherous_transmitter&!trinket.1.is.soulletting_ruby&(variable.on_use_trinket!=1&variable.on_use_trinket!=3&trinket.2.cooldown.remains>20|fight_remains<(20+20*(trinket.2.has_use&trinket.2.cooldown.remains<25))|variable.generic_trinket_condition)
-actions+=/use_item,slot=trinket2,if=!trinket.2.is.spymasters_web&!trinket.2.is.araz_ritual_forge&!trinket.2.is.imperfect_ascendancy_serum&!trinket.2.is.treacherous_transmitter&!trinket.2.is.soulletting_ruby&(variable.on_use_trinket<2&trinket.1.cooldown.remains>20|variable.on_use_trinket=3&trinket.1.cooldown.remains>20&(!hero_tree.keeper_of_the_grove|buff.harmony_of_the_grove.up|ceil((fight_remains-15)%trinket.2.cooldown.duration)>ceil((fight_remains-cooldown.force_of_nature.remains-15)%trinket.2.cooldown.duration))|fight_remains<(20+20*(trinket.1.has_use&trinket.1.cooldown.remains<25))|variable.generic_trinket_condition)
+actions+=/variable,name=generic_trinket_condition,value=(buff.dryad.up|buff.ca_inc.up)|variable.no_cd_talent|fight_remains<variable.ca_effective_cd&(buff.harmony_of_the_grove.up|cooldown.convoke_the_spirits.ready)&!cooldown.ca_inc.ready|(buff.spymasters_report.stack+variable.ca_effective_cd%6)>29&variable.ca_effective_cd>20|variable.on_use_trinket=0
+actions+=/use_item,slot=trinket1,if=!trinket.1.is.spymasters_web&!trinket.1.is.imperfect_ascendancy_serum&!trinket.1.is.treacherous_transmitter&!trinket.1.is.soulletting_ruby&(variable.on_use_trinket!=1&variable.on_use_trinket!=3&trinket.2.cooldown.remains>20|fight_remains<(20+20*(trinket.2.has_use&trinket.2.cooldown.remains<25))|variable.generic_trinket_condition)
+actions+=/use_item,slot=trinket2,if=!trinket.2.is.spymasters_web&!trinket.2.is.imperfect_ascendancy_serum&!trinket.2.is.treacherous_transmitter&!trinket.2.is.soulletting_ruby&(variable.on_use_trinket<2&trinket.1.cooldown.remains>20|variable.on_use_trinket=3&trinket.1.cooldown.remains>20&(!hero_tree.keeper_of_the_grove|buff.harmony_of_the_grove.up|ceil((fight_remains-15)%trinket.2.cooldown.duration)>ceil((fight_remains-cooldown.force_of_nature.remains-15)%trinket.2.cooldown.duration))|fight_remains<(20+20*(trinket.1.has_use&trinket.1.cooldown.remains<25))|variable.generic_trinket_condition)
 actions+=/use_items
 actions+=/potion,if=fight_remains<=30
-# Line needed to enable sims using Power Infusion
-actions+=/invoke_external_buff,name=power_infusion,if=variable.cd_condition&!variable.tww3_keeper_4pc|variable.tww3_keeper_4pc&variable.kotg_ca_condition
-# Troll racial when using no cd talents
+actions+=/invoke_external_buff,name=power_infusion,if=variable.cd_condition&!variable.tww3_keeper_4pc|variable.tww3_keeper_4pc&(variable.kotg_single_ca_condition|variable.kotg_double_ca_condition)
 actions+=/berserking,if=variable.no_cd_talent|fight_remains<15
-# Run AoE action list when more than 1 target
-actions+=/run_action_list,name=aoe,if=spell_targets>1
-# RUN ST action list when just 1 target and no 11.2 Keeper 4pc
-actions+=/run_action_list,name=st,if=!variable.tww3_keeper_4pc&spell_targets=1
-# Run ST action list for 11.2 Keeper 4pc
 actions+=/run_action_list,name=kotg_st,if=variable.tww3_keeper_4pc&spell_targets=1
+actions+=/run_action_list,name=st,if=!variable.tww3_keeper_4pc&spell_targets=1
+actions+=/run_action_list,name=aoe,if=spell_targets>1
 
-# Spend Dryads Favor on AoE (this is wonky)
 actions.aoe=starsurge,if=buff.dryads_favor.up
 actions.aoe+=/wrath,if=variable.enter_lunar&eclipse.in_eclipse&variable.eclipse_remains<cast_time
 actions.aoe+=/starfire,if=!variable.enter_lunar&eclipse.in_eclipse&variable.eclipse_remains<cast_time
@@ -99,48 +79,40 @@ actions.aoe+=/force_of_nature,if=!hero_tree.keeper_of_the_grove
 actions.aoe+=/starfire,if=talent.lunar_calling|buff.eclipse_lunar.up&spell_targets.starfire>3-(talent.umbral_intensity|talent.soul_of_the_forest)
 actions.aoe+=/wrath
 
-# 11.2 Keeper pre_cd list to align cooldowns and trinkets
 actions.kotg_pre_cd=potion,if=buff.ca_inc.up
 actions.kotg_pre_cd+=/use_items,if=buff.ca_inc.up|fight_remains<15
-actions.kotg_pre_cd+=/fury_of_elune,if=!buff.ca_inc.up&variable.kotg_ca_condition|cooldown.convoke_the_spirits.remains>cooldown.fury_of_elune.duration
+actions.kotg_pre_cd+=/fury_of_elune,if=!buff.ca_inc.up&(variable.kotg_single_ca_condition|variable.kotg_double_ca_condition)|cooldown.convoke_the_spirits.remains>cooldown.fury_of_elune.duration
 
-# Make Warrior of Elune work if talented (don't talent this)
 actions.kotg_st=warrior_of_elune,if=variable.eclipse_remains<=7
-# Wait line to prevent not being able to spend dryads favor before CA runs out
-actions.kotg_st+=/wait,if=!talent.incarnation_chosen_of_elune&buff.dryad.up&buff.ca_inc.remains<(cooldown.ca_inc.remains>?2*gcd.max),sec=buff.dryad.remains
-# Enter Eclipse if variable.enter_lunar is true or false
-actions.kotg_st+=/wrath,if=variable.enter_lunar&eclipse.in_eclipse&variable.eclipse_remains<cast_time|(variable.kotg_ca_condition|variable.kotg_inc_condition)&buff.parting_skies.up&(variable.eclipse_remains<cast_time|eclipse.in_none)
-actions.kotg_st+=/starfire,if=!variable.enter_lunar&eclipse.in_eclipse&variable.eclipse_remains<cast_time&!buff.dryads_favor.up&(!variable.kotg_ca_condition|!variable.kotg_inc_condition)
-# Use dots if less than 3 seconds remaining or if you're about to use CDs
-actions.kotg_st+=/moonfire,target_if=(remains<3&(!talent.treants_of_the_moon|cooldown.force_of_nature.remains>3&!buff.harmony_of_the_grove.up))|!dot.moonfire.ticking
-actions.kotg_st+=/sunfire,target_if=remains<3|remains<(12>?buff.ca_inc.duration)&variable.kotg_ca_condition&!buff.ca_inc.up
-# Run kotg_pre_cd list for cooldwns
+actions.kotg_st+=/wait,if=!talent.incarnation_chosen_of_elune&buff.dryad.up&(buff.ca_inc.remains<(cooldown.ca_inc.remains>?gcd.max*2)|buff.dryad.remains<gcd.max&fight_remains>buff.dryad.remains&fight_remains<buff.dryad.remains+gcd.max|buff.dryad.remains<gcd.max&fight_remains>buff.dryad.remains+gcd.max&fight_remains<buff.dryad.remains+gcd.max*2),sec=buff.dryad.remains
+actions.kotg_st+=/wrath,if=variable.enter_lunar&eclipse.in_eclipse&variable.eclipse_remains<cast_time|(variable.kotg_single_ca_condition|variable.kotg_double_ca_condition|variable.kotg_inc_condition)&buff.parting_skies.up&(variable.eclipse_remains<cast_time|eclipse.in_none)
+actions.kotg_st+=/starfire,if=!variable.enter_lunar&eclipse.in_eclipse&variable.eclipse_remains<cast_time&!buff.dryads_favor.up&!(variable.kotg_single_ca_condition|variable.kotg_double_ca_condition|variable.kotg_second_ca_condition|variable.kotg_inc_condition)
+actions.kotg_st+=/moonfire,target_if=(remains<(3>?fight_remains)&(!talent.treants_of_the_moon|cooldown.force_of_nature.remains>3&!buff.harmony_of_the_grove.up|variable.kotg_single_ca_condition))|!dot.moonfire.ticking
+actions.kotg_st+=/sunfire,target_if=remains<(3>?fight_remains)|variable.kotg_single_ca_condition&remains<(buff.dryad.duration+2>?fight_remains)&(astral_power>=action.starsurge.cost*2-action.sunfire.energize_amount|fight_remains<buff.ca_inc.duration+gcd.max*2)|variable.kotg_double_ca_condition&!buff.harmony_of_the_grove.up&remains<(buff.harmony_of_the_grove.duration>?fight_remains)&(astral_power>=action.starsurge.cost*2-action.sunfire.energize_amount-action.force_of_nature.energize_amount*cooldown.force_of_nature.ready|fight_remains<buff.dryad.duration+2+4+gcd.max*5)&!buff.ca_inc.up
 actions.kotg_st+=/call_action_list,name=kotg_pre_cd
-# Cooldowns
-actions.kotg_st+=/celestial_alignment,if=variable.kotg_ca_condition
+actions.kotg_st+=/force_of_nature,if=variable.kotg_double_ca_condition&astral_power>=action.starsurge.cost*2-action.force_of_nature.energize_amount&!(buff.harmony_of_the_grove.duration<cooldown.ca_inc.full_recharge_time+gcd.max*2)
+actions.kotg_st+=/celestial_alignment,if=variable.kotg_single_ca_condition&(astral_power>=action.starsurge.cost*2|fight_remains<buff.ca_inc.duration+gcd.max)
+actions.kotg_st+=/celestial_alignment,if=variable.kotg_double_ca_condition&(astral_power>=action.starsurge.cost*2|fight_remains<buff.dryad.duration+2+4+gcd.max*3)
+actions.kotg_st+=/force_of_nature,if=(buff.dryads_favor.up|cooldown.ca_inc.remains<gcd.max&fight_remains<buff.dryad.duration+2+gcd.max*2)&buff.ca_inc.up
+actions.kotg_st+=/celestial_alignment,if=variable.kotg_second_ca_condition
 actions.kotg_st+=/incarnation,if=variable.kotg_inc_condition
-# Starsurge with 4pc buff and CA/Incarn up
 actions.kotg_st+=/starsurge,if=buff.dryads_favor.up&buff.ca_inc.up
-# Enter Lunar from out of Eclipse
 actions.kotg_st+=/wrath,if=variable.enter_lunar&(eclipse.in_none|variable.eclipse_remains<cast_time)
 actions.kotg_st+=/starfire,if=!variable.enter_lunar&(eclipse.in_none|variable.eclipse_remains<cast_time)
-# Use Stellar Flare if you're about to use CDs and the duration is less than the duration of your CDs
 actions.kotg_st+=/stellar_flare,if=remains<=buff.ca_inc.duration&variable.pool_for_cd|remains<=buff.ca_inc.up&!buff.dryads_favor.up
-# Wrath to pool AP before using CDs
+actions.kotg_st+=/force_of_nature,if=buff.dryad.up&buff.harmony_of_the_grove.duration>(buff.dryad.remains+2>?cooldown.ca_inc.remains+gcd.max*2+0.5)
+actions.kotg_st+=/force_of_nature,if=!buff.ca_inc.up&variable.boat_stacks>=8&fight_remains>=cooldown.convoke_the_spirits.duration+cooldown.convoke_the_spirits.remains+4+gcd.max&!((cooldown.force_of_nature.duration>cooldown.convoke_the_spirits.remains&fight_remains<(cooldown.convoke_the_spirits.remains+cooldown.convoke_the_spirits.duration-(cooldown.force_of_nature.duration+gcd.max*5)*talent.control_of_the_dream<?105)+cooldown.force_of_nature.duration+4+gcd.max*6)|(variable.on_use_trinket=1&fight_remains>trinket.1.cooldown.duration+trinket.1.cooldown.remains+4+buff.dryad.duration+2+gcd.max&cooldown.force_of_nature.duration>trinket.1.cooldown.remains&fight_remains<cooldown.force_of_nature.duration+trinket.1.cooldown.duration+4+buff.dryad.duration+2+gcd.max)|(variable.on_use_trinket=2&fight_remains>trinket.2.cooldown.duration+trinket.2.cooldown.remains+4+buff.dryad.duration+2+gcd.max&cooldown.force_of_nature.duration>trinket.2.cooldown.remains&fight_remains<cooldown.force_of_nature.duration+trinket.2.cooldown.duration+4+buff.dryad.duration+2+gcd.max))&!((cooldown.convoke_the_spirits.remains<?(variable.on_use_trinket=1)*trinket.1.cooldown.remains<?(variable.on_use_trinket=2)*trinket.2.cooldown.remains<?(variable.on_use_trinket=3)*(trinket.1.cooldown.remains>?trinket.2.cooldown.remains))<cooldown.force_of_nature.duration-(60-talent.early_spring*15)*0.5)
+actions.kotg_st+=/force_of_nature,if=!buff.ca_inc.up&variable.boat_stacks>=8&fight_remains<cooldown.convoke_the_spirits.duration+cooldown.convoke_the_spirits.remains+4+gcd.max&!(fight_remains>cooldown.ca_inc.remains+buff.harmony_of_the_grove.duration*0.6+gcd.max&fight_remains<cooldown.force_of_nature.duration+buff.harmony_of_the_grove.duration*0.6+gcd.max*2)&!(fight_remains>cooldown.ca_inc.full_recharge_time+buff.dryad.duration+2+gcd.max&fight_remains<cooldown.force_of_nature.duration+buff.dryad.duration+2+gcd.max*2)&!(fight_remains<cooldown.force_of_nature.duration+gcd.max*2)
+actions.kotg_st+=/force_of_nature,if=fight_remains<buff.harmony_of_the_grove.duration+gcd.max
+actions.kotg_st+=/starsurge,if=buff.dryad.remains>buff.dryad.duration-gcd.max-0.3
 actions.kotg_st+=/wrath,if=variable.pool_for_cd
-# Hard force 2 Starsurge casts at start of Dryad
-actions.kotg_st+=/starsurge,if=buff.dryad.remains>8&buff.dryad.up
-# Use Treants if Dryad is up and the duration is less than Treants duration + 2 globals
-actions.kotg_st+=/force_of_nature,if=buff.dryad.up&buff.harmony_of_the_grove.duration>buff.dryad.remains+2|!buff.ca_inc.up&(cooldown.force_of_nature.duration<5+(cooldown.convoke_the_spirits.remains+(15*talent.control_of_the_dream)<?trinket.1.cooldown.remains+4*gcd.max)&!(fight_remains<cooldown.force_of_nature.duration+0.5*buff.harmony_of_the_grove.duration&fight_remains>(cooldown.ca_inc.remains+buff.ca_inc.duration>?(trinket.1.cooldown.remains+trinket.1.proc.any_dps.duration-20*trinket.1.is.arazs_ritual_forge|trinket.2.cooldown.remains+trinket.2.proc.any_dps.duration-20*trinket.2.is.arazs_ritual_forge)))|fight_remains<cooldown.convoke_the_spirits.duration+cooldown.convoke_the_spirits.remains+2&fight_remains>(cooldown.force_of_nature.duration+buff.harmony_of_the_grove.duration+5<?cooldown.ca_inc.full_recharge_time+5))|fight_remains<buff.harmony_of_the_grove.duration+gcd.max+1
-# Proceed with rotation
 actions.kotg_st+=/fury_of_elune,if=5+variable.passive_asp<astral_power.deficit&(cooldown.convoke_the_spirits.remains>buff.fury_of_elune.duration|!talent.convoke_the_spirits)|fight_remains<8+gcd.max
 actions.kotg_st+=/starfall,if=buff.starweavers_warp.up
 actions.kotg_st+=/starsurge,if=talent.starlord&buff.starlord.stack<3&!variable.pool_in_ca&!(variable.convoke_condition&cooldown.convoke_the_spirits.ready)
-actions.kotg_st+=/sunfire,target_if=refreshable
-actions.kotg_st+=/moonfire,target_if=refreshable&(!talent.treants_of_the_moon|cooldown.force_of_nature.remains>3&!buff.harmony_of_the_grove.up)
-# Convoke when Convoke variable is true and Harmony of the Grove is up
-actions.kotg_st+=/starsurge,if=cooldown.convoke_the_spirits.remains<gcd.max*2&variable.convoke_condition&astral_power>action.starsurge.cost&buff.dryad.remains>4+gcd.max&buff.dryad.up&fight_remains>5
-actions.kotg_st+=/convoke_the_spirits,if=variable.convoke_condition&buff.harmony_of_the_grove.up
+actions.kotg_st+=/sunfire,target_if=refreshable&remains<fight_remains
+actions.kotg_st+=/moonfire,target_if=refreshable&(!talent.treants_of_the_moon|cooldown.force_of_nature.remains>3&!buff.harmony_of_the_grove.up)&remains<fight_remains
+actions.kotg_st+=/starsurge,if=cooldown.convoke_the_spirits.remains<gcd.max*2&variable.convoke_condition&!(cooldown.ca_inc.remains<buff.dryad.remains&(buff.dryad.remains<4+gcd.max|fight_remains>cooldown.ca_inc.remains+buff.dryad.duration+2&fight_remains<4+buff.dryad.duration+2+gcd.max))&!(buff.harmony_of_the_grove.remains<4+gcd.max)&!(cooldown.ca_inc.remains<buff.harmony_of_the_grove.remains-gcd.max&buff.harmony_of_the_grove.remains<4+gcd.max*2)&!(fight_remains<4+gcd.max)&!(buff.ca_inc.remains<4+gcd.max)
+actions.kotg_st+=/convoke_the_spirits,if=variable.convoke_condition&!(cooldown.ca_inc.remains<buff.dryad.remains&(buff.dryad.remains<4|fight_remains>cooldown.ca_inc.remains+buff.dryad.duration+2&fight_remains<4+buff.dryad.duration+2))
 actions.kotg_st+=/stellar_flare,target_if=refreshable&(target.time_to_die-remains-target>7+spell_targets)&!buff.ca_inc.up
 actions.kotg_st+=/starsurge,if=(buff.starlord.remains>4&variable.boat_stacks>=7|fight_remains<4)&!variable.pool_in_ca
 actions.kotg_st+=/new_moon,if=astral_power.deficit>variable.passive_asp+energize_amount&((buff.harmony_of_the_grove.up&!buff.ca_inc.up|buff.ca_inc.up&!cooldown.ca_inc.ready)|cooldown.new_moon.full_recharge_time<cooldown.convoke_the_spirits.remains)|fight_remains<20
@@ -151,7 +123,6 @@ actions.kotg_st+=/starsurge,if=(astral_power.deficit<variable.passive_asp+action
 actions.kotg_st+=/wild_mushroom,if=!prev_gcd.1.wild_mushroom&dot.fungal_growth.remains<2
 actions.kotg_st+=/wrath
 
-# PRE_CD
 actions.pre_cd=use_item,name=spymasters_web,if=variable.cd_condition&(buff.spymasters_report.stack>29|fight_remains<cooldown.ca_inc.duration)
 actions.pre_cd+=/do_treacherous_transmitter_task,if=variable.cd_condition|buff.harmony_of_the_grove.up&(buff.spymasters_report.stack>29|!trinket.1.is.spymasters_web|!trinket.2.is.spymasters_web)
 actions.pre_cd+=/berserking,if=variable.cd_condition
@@ -160,7 +131,6 @@ actions.pre_cd+=/use_item,slot=trinket1,if=!trinket.1.is.spymasters_web&!trinket
 actions.pre_cd+=/use_item,slot=trinket2,if=!trinket.2.is.spymasters_web&!trinket.2.is.imperfect_ascendancy_serum&!trinket.2.is.treacherous_transmitter&!trinket.2.is.soulletting_ruby&variable.on_use_trinket=2&variable.cd_condition
 actions.pre_cd+=/use_item,name=bestinslots,if=hero_tree.keeper_of_the_grove&buff.harmony_of_the_grove.up|hero_tree.elunes_chosen&(cooldown.ca_inc.full_recharge_time>20|buff.ca_inc.up)
 
-# ST
 actions.st=warrior_of_elune,if=talent.lunar_calling|!talent.lunar_calling&variable.eclipse_remains<=7
 actions.st+=/wrath,if=variable.enter_lunar&eclipse.in_eclipse&variable.eclipse_remains<cast_time&!variable.cd_condition
 actions.st+=/starfire,if=!variable.enter_lunar&eclipse.in_eclipse&variable.eclipse_remains<cast_time&!variable.cd_condition
Feral Druid — 5340e2f to e441c90 (5 commits)
@@ -14,75 +14,94 @@ actions.precombat+=/cat_form,if=!buff.cat_form.up
 actions.precombat+=/heart_of_the_wild
 actions.precombat+=/use_item,name=imperfect_ascendancy_serum
 actions.precombat+=/use_item,name=treacherous_transmitter
+# optional variable that sends regrowth and renewal casts. Turned off by default
+actions.precombat+=/variable,name=regrowth,op=reset
+# optional variable that forgoes shredding in AoE. Turned off by default
+actions.precombat+=/variable,name=easy_swipe,op=reset
 actions.precombat+=/prowl,if=!buff.prowl.up
 
 # Executed every time the actor is available.
-actions=prowl,if=buff.bs_inc.down&!buff.prowl.up
+actions=prowl,if=buff.bs_inc.down&!buff.prowl.up&!buff.shadowmeld.up
 actions+=/cat_form,if=!buff.cat_form.up&!talent.fluid_form
-# Line up <a href='https://www.wowhead.com/spell=10060/power-infusion'>Power Infusion</a> with Berserk.
+# Line up <a href='https://www.wowhead.com/spell=10060/power-infusion'>Power Infusion</a> with <a href='https://www.wowhead.com/spell=106951/berserk'>Berserk</a>.
 actions+=/invoke_external_buff,name=power_infusion,if=buff.bs_inc.up|!talent.berserk_heart_of_the_lion
-actions+=/call_action_list,name=variable
-actions+=/auto_attack,if=!buff.prowl.up|!buff.shadowmeld.up
+actions+=/auto_attack,if=!buff.prowl.up&!buff.shadowmeld.up
+# rake on pull, also rake at the start of a dungeon pull to get into combat with killing strikes
+actions+=/rake,if=time<1&buff.prowl.up|talent.killing_strikes&(buff.prowl.up|buff.shadowmeld.up)&combo_points=5
 actions+=/tigers_fury,target_if=max:time_to_die,if=(hero_tree.wildstalker&(!talent.bloodtalons|buff.bloodtalons.up)&dot.rip.refreshable&combo_points>=3&talent.rip_and_tear|combo_points=5)&(fight_remains<=15|cooldown.bs_inc.remains>20&target.time_to_die>5|cooldown.bs_inc.ready&target.time_to_die>12|target.time_to_die=fight_remains)
-actions+=/rake,target_if=max:refreshable+(persistent_multiplier>dot.rake.pmultiplier),if=buff.shadowmeld.up|buff.prowl.up
 actions+=/natures_vigil,if=spell_targets.swipe_cat>0&variable.regrowth
 actions+=/renewal,if=spell_targets.swipe_cat>0&variable.regrowth
+# TODO: maybe nerf this since the sim seems to be netting more uptime than real-life players
 actions+=/adaptive_swarm,target_if=dot.adaptive_swarm_damage.stack<3&(!dot.adaptive_swarm_damage.ticking|dot.adaptive_swarm_damage.remains<2),if=!action.adaptive_swarm_damage.in_flight&(spell_targets=1|!talent.unbridled_swarm)&(dot.rip.ticking|hero_tree.druid_of_the_claw)
+# TODO: simplify the targeting logic. Realistically its just being sent at a target with 2 or fewer stacks. The current line is too much overhead.
 actions+=/adaptive_swarm,target_if=max:(1+dot.adaptive_swarm_damage.stack)*dot.adaptive_swarm_damage.stack<3*time_to_die,if=buff.cat_form.up&dot.adaptive_swarm_damage.stack<3&talent.unbridled_swarm.enabled&spell_targets.swipe_cat>1&dot.rip.ticking
-actions+=/ferocious_bite,if=buff.apex_predators_craving.up&!(variable.need_bt&active_bt_triggers=2)&!buff.bs_inc.up
+# variable that tells us when we want to prioritize proccing bt, currently thats at 0 or 1 stack of bloodtalons
+actions+=/variable,name=need_bt,value=talent.bloodtalons&buff.bloodtalons.stack<=1
+# is this cringe? yes it is. Complain on the forums
+actions+=/cancel_buff,name=apex_predators_craving,if=buff.bs_inc.up&talent.saber_jaws
+actions+=/ferocious_bite,if=buff.apex_predators_craving.up&!(variable.need_bt&active_bt_triggers=2)&(!buff.bs_inc.up|buff.ravage.up)
 actions+=/call_action_list,name=cooldown,if=dot.rip.ticking
+# limit how often we check what rips new pandemic'd duration would be.
+actions+=/call_action_list,name=rip_variable,if=talent.rip_and_tear&spell_targets=1&hero_tree.wildstalker&buff.tigers_fury.up&!buff.bs_inc.up&(buff.bloodtalons.up|!talent.bloodtalons)
 # with rip and tear, as wildstalker, we do 3cp rips
 actions+=/rip,if=talent.rip_and_tear&spell_targets=1&hero_tree.wildstalker&buff.tigers_fury.up&!buff.bs_inc.up&(buff.bloodtalons.up|!talent.bloodtalons)&(combo_points>=3&refreshable&cooldown.tigers_fury.remains>25|buff.tigers_fury.remains<5&variable.rip_duration>cooldown.tigers_fury.remains&cooldown.tigers_fury.remains>=dot.rip.remains)
-actions+=/call_action_list,name=builder,if=(buff.bs_inc.up&!buff.ravage.up&!buff.coiled_to_spring.up&hero_tree.druid_of_the_claw&talent.coiled_to_spring&spell_targets<=2)|buff.bloodtalons.stack=0&active_bt_triggers=2
-actions+=/wait,sec=!cooldown.tigers_fury.remains,if=combo_points=5&cooldown.tigers_fury.remains<3&spell_targets=1
+actions+=/variable,name=stealth_bonus,value=buff.sudden_ambush.up|buff.prowl.up|buff.shadowmeld.up
+actions+=/call_action_list,name=builder,if=(buff.bs_inc.up&!buff.ravage.up&!buff.coiled_to_spring.up&hero_tree.druid_of_the_claw&talent.coiled_to_spring&spell_targets<=2)|spell_targets=1&buff.bloodtalons.stack=0&active_bt_triggers=2
+actions+=/call_action_list,name=aoe_builder,if=spell_targets>=2&buff.bloodtalons.stack=0&active_bt_triggers=2
+actions+=/wait,sec=cooldown.tigers_fury.remains,if=combo_points=5&cooldown.tigers_fury.remains<3&spell_targets=1
 actions+=/call_action_list,name=finisher,if=combo_points=5
 actions+=/call_action_list,name=builder,if=spell_targets.swipe_cat=1&combo_points<5
 actions+=/call_action_list,name=aoe_builder,if=spell_targets.swipe_cat>=2&combo_points<5
 # if we cant do anything else, then sure, tigers fury early
-actions+=/tigers_fury
+actions+=/tigers_fury,if=(!cooldown.bs_inc.remains|cooldown.bs_inc.remains>20)&(fight_remains<=15|cooldown.bs_inc.remains>20&target.time_to_die>5|cooldown.bs_inc.ready&target.time_to_die>12|target.time_to_die=fight_remains)
 actions+=/regrowth,if=buff.predatory_swiftness.up&variable.regrowth
 
 # maintain thrash highest prio
-actions.aoe_builder=thrash_cat,target_if=max:time_to_die,if=refreshable&!talent.thrashing_claws&!(variable.need_bt&buff.bt_thrash.up)&remains<time_to_die
-# avoid capping brs charges. Also send brutal slashes/ws swipe in aoe, even if we need to proc bloodtalons, during berserk.
-actions.aoe_builder+=/brutal_slash,target_if=min:time_to_die,if=(cooldown.brutal_slash.full_recharge_time<4|time_to_die<4|raid_event.adds.remains<4|(buff.bs_inc.up&spell_targets>=3-hero_tree.druid_of_the_claw))&!(variable.need_bt&buff.bt_swipe.up&(buff.bs_inc.down|spell_targets<3-hero_tree.druid_of_the_claw))
-actions.aoe_builder+=/swipe_cat,target_if=min:time_to_die,if=talent.wild_slashes&(time_to_die<4|raid_event.adds.remains<4|buff.bs_inc.up&spell_targets>=3-hero_tree.druid_of_the_claw)&!(variable.need_bt&buff.bt_swipe.up&(buff.bs_inc.down|spell_targets<3-hero_tree.druid_of_the_claw))
+actions.aoe_builder=thrash_cat,target_if=max:time_to_die,if=refreshable&!talent.thrashing_claws&remains<time_to_die
+# During berserk, in aoe, we ignore bloodtalons in order to cast more brutal slashes/wild slashes swipes
+actions.aoe_builder+=/brutal_slash,target_if=min:time_to_die,if=(buff.bloodtalons.stack>0|!active_bt_triggers=2)&buff.bs_inc.up&spell_targets.brutal_slash>=3-hero_tree.druid_of_the_claw|!(variable.need_bt&buff.bt_swipe.up)&(cooldown.brutal_slash.full_recharge_time<4|time_to_die<4|raid_event.adds.remains<4)
+# TODO: recheck this line
+actions.aoe_builder+=/swipe_cat,target_if=min:time_to_die,if=talent.wild_slashes&((buff.bloodtalons.stack>0|!active_bt_triggers=2)&buff.bs_inc.up&spell_targets.swipe_cat>=3-hero_tree.druid_of_the_claw|!(variable.need_bt&buff.bt_swipe.up)&(time_to_die<4|raid_event.adds.remains<4))
 # with wild slashes we swipe at 5+ targets over raking/moonfire
-actions.aoe_builder+=/swipe_cat,if=time_to_die<4|(talent.wild_slashes&spell_targets.swipe_cat>4&!(variable.need_bt&buff.bt_swipe.up))
-actions.aoe_builder+=/prowl,target_if=dot.rake.refreshable|dot.rake.pmultiplier<1.4,if=!(variable.need_bt&buff.bt_rake.up)&action.rake.ready&gcd.remains=0&!buff.sudden_ambush.up&!variable.cc_capped
-actions.aoe_builder+=/shadowmeld,target_if=dot.rake.refreshable|dot.rake.pmultiplier<1.4,if=!(variable.need_bt&buff.bt_rake.up)&action.rake.ready&!buff.sudden_ambush.up&!buff.prowl.up&!variable.cc_capped
+actions.aoe_builder+=/swipe_cat,if=talent.wild_slashes&spell_targets.swipe_cat>=5&!(variable.need_bt&buff.bt_swipe.up)
+# TODO: update/check new meld/prowl logic for aoe
+actions.aoe_builder+=/prowl,target_if=dot.rake.refreshable|dot.rake.pmultiplier<1.4,if=!(variable.need_bt&buff.bt_rake.up)&action.rake.ready&gcd.remains=0&!buff.sudden_ambush.up&!buff.clearcasting.at_max_stacks
+# we use prowl here just to trigger killing strikes combat reset
+actions.aoe_builder+=/prowl,if=buff.bs_inc.remains<1&!buff.shadowmeld.up&(fight_style.dungeonroute|fight_style.dungeonslice)
+# in dungeon sims, in non-boss combat, we want to save shadowmeld until we can use it to trigger a killing strikes reset
+actions.aoe_builder+=/shadowmeld,target_if=dot.rake.refreshable|dot.rake.pmultiplier<1.4,if=(!(variable.need_bt&buff.bt_rake.up)&action.rake.ready&!variable.stealth_bonus&!buff.clearcasting.at_max_stacks)&(!fight_style.dungeonroute&!fight_style.dungeonslice|!buff.killing_strikes_combat.up&!buff.incarnation_avatar_of_ashamane.up)
 # dcr rake > moonfire
-actions.aoe_builder+=/rake,target_if=refreshable,if=talent.doubleclawed_rake&!(variable.need_bt&buff.bt_rake.up)&!variable.cc_capped
+actions.aoe_builder+=/rake,target_if=refreshable,if=talent.doubleclawed_rake&!(variable.need_bt&buff.bt_rake.up)&!buff.clearcasting.at_max_stacks
 # at 3t with wild slashes, swipe is better than moonfiring/st rake
-actions.aoe_builder+=/swipe_cat,if=talent.wild_slashes&spell_targets.swipe_cat>2&!(variable.need_bt&buff.bt_swipe.up)
-# if wildstalker make sure you have at least one rake up
+actions.aoe_builder+=/swipe_cat,if=talent.wild_slashes&spell_targets.swipe_cat>=3&!(variable.need_bt&buff.bt_swipe.up)
+# if wildstalker make sure you have at least one rake up TODO: check if this should be higher priority, or rake count should be higher
 actions.aoe_builder+=/rake,target_if=max:dot.rake.ticking,if=!dot.rake.ticking&hero_tree.wildstalker
-# li moonfire is better than non-dcr rake in aoe if we already have 1 rake
-actions.aoe_builder+=/moonfire_cat,target_if=refreshable,if=!(variable.need_bt&buff.bt_moonfire.up)&!variable.cc_capped
-actions.aoe_builder+=/rake,target_if=refreshable,if=!(variable.need_bt&buff.bt_rake.up)&!variable.cc_capped
+# li moonfire is better than non-dcr rake in aoe if we already have 1 rake TODO: see if this is still true with real vines implementation
+actions.aoe_builder+=/moonfire_cat,target_if=refreshable,if=!(variable.need_bt&buff.bt_moonfire.up)&!buff.clearcasting.at_max_stacks
 # fillers
 actions.aoe_builder+=/brutal_slash,if=!(variable.need_bt&buff.bt_swipe.up)
 actions.aoe_builder+=/swipe_cat,if=!(variable.need_bt&buff.bt_swipe.up)
-actions.aoe_builder+=/shred,if=!buff.sudden_ambush.up&!variable.easy_swipe&!(variable.need_bt&buff.bt_shred.up)
-actions.aoe_builder+=/thrash_cat,if=!talent.thrashing_claws&!(variable.need_bt&buff.bt_thrash.up)
+actions.aoe_builder+=/rake,target_if=refreshable,if=!(variable.need_bt&buff.bt_rake.up)
+actions.aoe_builder+=/thrash_cat,if=!(variable.need_bt&buff.bt_thrash.up)&spell_targets>=3
+actions.aoe_builder+=/shred,if=!(variable.need_bt&buff.bt_shred.up)
 # fallback bt actions
-actions.aoe_builder+=/rake,target_if=max:ticks_gained_on_refresh,if=talent.doubleclawed_rake&buff.sudden_ambush.up&variable.need_bt&buff.bt_rake.down
+actions.aoe_builder+=/thrash_cat,if=!(variable.need_bt&buff.bt_thrash.up)
 actions.aoe_builder+=/moonfire_cat,target_if=max:ticks_gained_on_refresh,if=variable.need_bt&buff.bt_moonfire.down
-actions.aoe_builder+=/rake,target_if=max:ticks_gained_on_refresh,if=buff.sudden_ambush.up&variable.need_bt&buff.bt_rake.down
 actions.aoe_builder+=/shred,if=variable.need_bt&buff.bt_shred.down&!variable.easy_swipe
-actions.aoe_builder+=/rake,target_if=dot.rake.pmultiplier<1.6,if=variable.need_bt&buff.bt_rake.down
-actions.aoe_builder+=/thrash_cat,if=variable.need_bt&buff.bt_thrash.down
+actions.aoe_builder+=/rake,target_if=pmultiplier<1.6,if=variable.need_bt&buff.bt_rake.down
 
-actions.builder=prowl,if=gcd.remains=0&energy>=35&!buff.sudden_ambush.up&(dot.rake.refreshable|dot.rake.pmultiplier<1.4)&!(variable.need_bt&buff.bt_rake.up)&buff.tigers_fury.up&!buff.shadowmeld.up
-actions.builder+=/shadowmeld,if=gcd.remains=0&energy>=35&!buff.sudden_ambush.up&(dot.rake.refreshable|dot.rake.pmultiplier<1.4)&!(variable.need_bt&buff.bt_rake.up)&buff.tigers_fury.up&!buff.prowl.up
-# upgrade to stealth rakes, otherwise refresh in pandemic. Delay rake as long as possible if it would downgrade
-actions.builder+=/rake,if=((refreshable&persistent_multiplier>=dot.rake.pmultiplier|dot.rake.remains<3.5)|buff.sudden_ambush.up&persistent_multiplier>dot.rake.pmultiplier)&!(variable.need_bt&buff.bt_rake.up)&(hero_tree.wildstalker|!buff.bs_inc.up)
-# bt check is due to the overcap line, comes up with convoke/apex bites
-actions.builder+=/shred,if=buff.sudden_ambush.up&buff.bs_inc.up&!(variable.need_bt&buff.bt_shred.up&active_bt_triggers=2)
+actions.builder=prowl,if=!variable.stealth_bonus&(prev_gcd.1.ferocious_bite|prev_gcd.1.rip|prev_gcd.1.primal_wrath)
+actions.builder+=/shadowmeld,if=!variable.stealth_bonus&(prev_gcd.1.ferocious_bite|prev_gcd.1.rip|prev_gcd.1.primal_wrath)&buff.bs_inc.up
+# freely upgrade rakes unless you're dotc inside berserk-- in which case only upgrade to stealth rakes
+actions.builder+=/rake,if=(refreshable&persistent_multiplier>=pmultiplier|remains<2|persistent_multiplier>pmultiplier)&!(variable.need_bt&buff.bt_rake.up)&(hero_tree.wildstalker|!buff.bs_inc.up|variable.stealth_bonus)
+actions.builder+=/shred,if=variable.stealth_bonus&buff.bs_inc.up
 actions.builder+=/brutal_slash,if=cooldown.brutal_slash.full_recharge_time<4&!(variable.need_bt&buff.bt_swipe.up)
-actions.builder+=/moonfire_cat,if=refreshable
+# clip li moonfire to upgrade its snapshot
+actions.builder+=/moonfire_cat,if=refreshable|persistent_multiplier>pmultiplier
 actions.builder+=/thrash_cat,if=refreshable&!talent.thrashing_claws&!buff.bs_inc.up
 actions.builder+=/shred,if=buff.clearcasting.react&!(variable.need_bt&buff.bt_shred.up)
+# this returns true if we have a dot nearing pandemic range
+actions.builder+=/variable,name=dot_refresh_soon,value=(!talent.thrashing_claws&(dot.thrash_cat.remains-dot.thrash_cat.duration*0.3<=2))|(talent.lunar_inspiration&(dot.moonfire_cat.remains-dot.moonfire_cat.duration*0.3<=2))|((dot.rake.pmultiplier<1.6|buff.sudden_ambush.up)&(dot.rake.remains-dot.rake.duration*0.3<=2))
 # pool energy if we need to refresh dot in the next 1.5s
 actions.builder+=/pool_resource,if=variable.dot_refresh_soon&energy.deficit>70&!variable.need_bt&!buff.bs_inc.up&cooldown.tigers_fury.remains>3
 actions.builder+=/brutal_slash,if=!(variable.need_bt&buff.bt_swipe.up)
@@ -91,21 +110,54 @@ actions.builder+=/rake,if=refreshable
 actions.builder+=/thrash_cat,if=refreshable&!talent.thrashing_claws
 actions.builder+=/swipe_cat,if=variable.need_bt&buff.bt_swipe.down
 # clip rake for bt if it wont downgrade its snapshot
-actions.builder+=/rake,if=variable.need_bt&buff.bt_rake.down&persistent_multiplier>=dot.rake.pmultiplier
+actions.builder+=/rake,if=variable.need_bt&buff.bt_rake.down&persistent_multiplier>=pmultiplier
 actions.builder+=/moonfire_cat,if=variable.need_bt&buff.bt_moonfire.down
 actions.builder+=/thrash_cat,if=variable.need_bt&buff.bt_thrash.down
 
+# TLDR, maximize number of cooldown overlaps whilst minimizing number of casts lost.
+actions.cd_variable=variable,name=convokeCountRemaining,value=floor(((fight_remains-variable.convoke_cd)%cooldown.convoke_the_spirits.duration)+(fight_remains>cooldown.convoke_the_spirits.remains))
+actions.cd_variable+=/variable,name=zerkCountRemaining,value=floor(((fight_remains-variable.bs_inc_cd)%cooldown.bs_inc.duration)+(fight_remains>cooldown.bs_inc.remains))
+actions.cd_variable+=/variable,name=potCountRemaining,value=floor(((fight_remains-variable.pot_cd)%cooldown.potion.duration)+(fight_remains>cooldown.potion.remains))
+actions.cd_variable+=/variable,name=slot1CountRemaining,value=floor(((fight_remains-variable.trinket1_cd_remains-10)%variable.trinket1_cd_duration)+(fight_remains>variable.trinket1_cd_remains))
+actions.cd_variable+=/variable,name=slot2CountRemaining,value=floor(((fight_remains-variable.trinket2_cd_remains-10)%variable.trinket2_cd_duration)+(fight_remains>variable.trinket2_cd_remains))
+# hold berserk if there is 1 convoke or 1 potion remaining in the fight but they aren't available yet
+actions.cd_variable+=/variable,name=firstHoldBerserkCondition,value=variable.zerkCountRemaining=1&(variable.convokeCountRemaining=1&cooldown.convoke_the_spirits.remains>10|variable.potCountRemaining=1&cooldown.potion.remains)
+# hold berserk if there are as many zerk casts as convoke casts remaining and holding zerk for convoke does not lose you a cast
+actions.cd_variable+=/variable,name=secondHoldBerserkCondition,value=cooldown.convoke_the_spirits.remains>20&variable.convokeCountRemaining=variable.zerkCountRemaining&variable.zerkCountRemaining=floor(((fight_remains-variable.convoke_cd)%cooldown.bs_inc.duration)+(fight_remains>cooldown.convoke_the_spirits.remains))
+actions.cd_variable+=/variable,name=holdBerserk,value=variable.firstHoldBerserkCondition|variable.secondHoldBerserkCondition
+# send 90s cd trinkets right away, if we are playing 3 minute berserk, and won't be holding the next berserk. (the case where we hold convoke is already handled)
+actions.cd_variable+=/variable,name=first_send_90s_trinket_condition,value=variable.zerkCountRemaining>1|(variable.convokeCountRemaining!=2&(variable.potCountRemaining!=1|variable.potCountRemaining=1&variable.bs_inc_cd<variable.pot_cd))
+actions.cd_variable+=/variable,name=second_send_90s_trinket_condition,value=1+variable.convokeCountRemaining!=variable.zerkCountRemaining|variable.zerkCountRemaining=floor((((fight_remains-cooldown.bs_inc.remains)-105)%cooldown.bs_inc.duration)+(fight_remains-cooldown.bs_inc.remains>105))
+actions.cd_variable+=/variable,name=send_90s_trinket_condition,value=variable.first_send_90s_trinket_condition&variable.second_send_90s_trinket_condition&!talent.berserk_heart_of_the_lion
+# hold the last convoke if there is another berserk cast remaining and Berserk isn't already up
+actions.cd_variable+=/variable,name=holdConvoke,value=variable.convokeCountRemaining=1&variable.zerkCountRemaining=1&!buff.bs_inc.up
+# hold potion for berserk if doing so does not lose you a cast
+actions.cd_variable+=/variable,name=holdPot,value=variable.potCountRemaining=floor(((fight_remains-variable.bs_inc_cd)%cooldown.potion.duration)+(fight_remains>cooldown.bs_inc.remains))
+actions.cd_variable+=/variable,name=bs_inc_cd,value=cooldown.bs_inc.remains+10
+actions.cd_variable+=/variable,name=convoke_cd,value=cooldown.convoke_the_spirits.remains+10
+actions.cd_variable+=/variable,name=pot_cd,value=cooldown.potion.remains+25
+actions.cd_variable+=/variable,name=highestCDremaining,op=setif,condition=talent.convoke_the_spirits,value=cooldown.convoke_the_spirits.remains<?cooldown.bs_inc.remains<?cooldown.potion.remains,value_else=cooldown.bs_inc.remains<?cooldown.potion.remains
+actions.cd_variable+=/variable,name=lowestCDremaining,op=setif,condition=talent.convoke_the_spirits,value=cooldown.convoke_the_spirits.remains>?cooldown.bs_inc.remains>?cooldown.potion.remains,value_else=cooldown.bs_inc.remains>?cooldown.potion.remains
+actions.cd_variable+=/variable,name=secondLowestCDremaining,op=setif,condition=cooldown.convoke_the_spirits.remains>cooldown.bs_inc.remains,value=cooldown.convoke_the_spirits.remains>?cooldown.potion.remains,value_else=cooldown.bs_inc.remains>?cooldown.potion.remains
+# unyielding netherprism technically has a 20s cooldown, but we want other items to view it as having the same cd as berserk
+actions.cd_variable+=/variable,name=trinket1_cd_remains,op=setif,condition=trinket.1.is.unyielding_netherprism,value=cooldown.bs_inc.remains,value_else=trinket.1.cooldown.remains
+actions.cd_variable+=/variable,name=trinket2_cd_remains,op=setif,condition=trinket.2.is.unyielding_netherprism,value=cooldown.bs_inc.remains,value_else=trinket.2.cooldown.remains
+actions.cd_variable+=/variable,name=trinket1_cd_duration,op=setif,condition=trinket.1.is.unyielding_netherprism,value=cooldown.bs_inc.duration,value_else=trinket.1.cooldown.duration
+actions.cd_variable+=/variable,name=trinket2_cd_duration,op=setif,condition=trinket.2.is.unyielding_netherprism,value=cooldown.bs_inc.duration,value_else=trinket.2.cooldown.duration
+
+# this line is here to reduce the amount of variable calls in the APL
+actions.cooldown=call_action_list,name=cd_variable,if=!cooldown.bs_inc.remains|!cooldown.convoke_the_spirits.remains|!cooldown.potion.remains|!trinket.1.cooldown.remains|!trinket.2.cooldown.remains|!cooldown.bestinslots.remains
 # non-stat on use trinkets get used on cooldown, so long as it wont interfere with a stat on-use trinket
-actions.cooldown=use_item,slot=trinket1,if=trinket.1.has_use_damage&(variable.trinket2_cd_remains>20&(!trinket.1.is.junkmaestros_mega_magnet|cooldown.bestinslots.remains>20|!equipped.bestinslots)|!trinket.2.has_use_buff&(cooldown.bestinslots.remains>20|!equipped.bestinslots)|cooldown.tigers_fury.remains<25&cooldown.tigers_fury.remains>20)|fight_remains<5
-actions.cooldown+=/use_item,slot=trinket2,if=trinket.2.has_use_damage&(variable.trinket1_cd_remains>20&(!trinket.2.is.junkmaestros_mega_magnet|cooldown.bestinslots.remains>20|!equipped.bestinslots)|!trinket.1.has_use_buff&(cooldown.bestinslots.remains>20|!equipped.bestinslots)|cooldown.tigers_fury.remains<25&cooldown.tigers_fury.remains>20)|fight_remains<5
+actions.cooldown+=/use_item,slot=trinket1,if=trinket.1.has_use_damage&(variable.trinket2_cd_remains>20&(!trinket.1.is.junkmaestros_mega_magnet|cooldown.bestinslots.remains>20|!equipped.bestinslots)|!trinket.2.has_use_buff&(cooldown.bestinslots.remains>20|!equipped.bestinslots)|cooldown.tigers_fury.remains<25&cooldown.tigers_fury.remains>20)
+actions.cooldown+=/use_item,slot=trinket2,if=trinket.2.has_use_damage&(variable.trinket1_cd_remains>20&(!trinket.2.is.junkmaestros_mega_magnet|cooldown.bestinslots.remains>20|!equipped.bestinslots)|!trinket.1.has_use_buff&(cooldown.bestinslots.remains>20|!equipped.bestinslots)|cooldown.tigers_fury.remains<25&cooldown.tigers_fury.remains>20)
 actions.cooldown+=/berserking,if=buff.bs_inc.up
 # potion during berserk, fallback pot if the fight is going to end within its duration. Expedite use if you would lose a pot use by holding it.
 actions.cooldown+=/potion,if=buff.bs_inc.up|fight_remains<32|buff.tigers_fury.up&!variable.holdPot
 # non trinket gear-on-uses have variable rules on whether or not they trigger the trinket shared CD. For the cases they do we will need specific APL entries. For now just use on cooldown.
 actions.cooldown+=/use_items
 # stat on-use trinkets, essentially this compares the number of trinket uses to the number of other cooldown uses remaining in the fight to determine whether or not to send the trinket.
-actions.cooldown+=/use_item,slot=trinket1,use_off_gcd=1,if=(time>10|buff.bs_inc.up)&trinket.1.has_use_buff&(cooldown.tigers_fury.remains>=25|(trinket.1.is.treacherous_transmitter|trinket.1.is.imperfect_ascendancy_serum|trinket.1.is.cursed_stone_idol)&cooldown.tigers_fury.remains<2)&(buff.potion.up|variable.slot1CountRemaining!=variable.potCountRemaining)&(cooldown.bs_inc.remains<5&!variable.holdBerserk|cooldown.convoke_the_spirits.remains<10&!variable.holdConvoke|variable.trinket1_cd_duration=90&variable.send_90s_trinket_condition&(!trinket.2.has_use_buff|variable.trinket2_cd_remains>cooldown.bs_inc.remains)|variable.lowestCDremaining>variable.trinket1_cd_duration|variable.zerkCountRemaining=1&variable.convokeCountRemaining=1&variable.potCountRemaining=1&(variable.highestCDremaining+3)>variable.trinket1_cd_duration|variable.zerkCountRemaining=variable.convokeCountRemaining&variable.zerkCountRemaining!=variable.potCountRemaining&(cooldown.bs_inc.remains<?cooldown.convoke_the_spirits.remains)>variable.trinket1_cd_duration|variable.slot1CountRemaining=variable.potCountRemaining-1&buff.potion.up|trinket.2.has_use_buff&(variable.secondLowestCDremaining>variable.trinket1_cd_duration&variable.lowestCDremaining>variable.trinket2_cd_remains|variable.zerkCountRemaining=1&variable.convokeCountRemaining=1&variable.potCountRemaining=1&variable.highestCDremaining>variable.trinket2_cd_remains|variable.zerkCountRemaining=variable.convokeCountRemaining&variable.zerkCountRemaining!=variable.potCountRemaining&(cooldown.convoke_the_spirits.remains<?cooldown.bs_inc.remains)>variable.trinket2_cd_remains|variable.convokeCountRemaining=0&variable.zerkCountRemaining=0&variable.potCountRemaining=0))
-actions.cooldown+=/use_item,slot=trinket2,use_off_gcd=1,if=(time>10|buff.bs_inc.up)&trinket.2.has_use_buff&(!trinket.1.has_use_buff|variable.trinket1_cd_remains>20)&(cooldown.tigers_fury.remains>=25|(trinket.2.is.treacherous_transmitter|trinket.2.is.imperfect_ascendancy_serum|trinket.2.is.cursed_stone_idol)&cooldown.tigers_fury.remains<2)&(buff.potion.up|variable.slot2CountRemaining!=variable.potCountRemaining)&(cooldown.bs_inc.remains<5&!variable.holdBerserk|cooldown.convoke_the_spirits.remains<10&!variable.holdConvoke|variable.trinket2_cd_duration=90&variable.send_90s_trinket_condition&(!trinket.1.has_use_buff|variable.trinket1_cd_remains>cooldown.bs_inc.remains)|variable.lowestCDremaining>variable.trinket2_cd_duration|variable.zerkCountRemaining=1&variable.convokeCountRemaining=1&variable.potCountRemaining=1&(variable.highestCDremaining+3)>variable.trinket2_cd_duration|variable.zerkCountRemaining=variable.convokeCountRemaining&variable.zerkCountRemaining!=variable.potCountRemaining&(cooldown.bs_inc.remains<?cooldown.convoke_the_spirits.remains)>variable.trinket2_cd_duration|variable.slot1CountRemaining=variable.potCountRemaining-1&buff.potion.up|trinket.1.has_use_buff&(variable.secondLowestCDremaining>variable.trinket2_cd_duration&variable.lowestCDremaining>variable.trinket1_cd_remains|variable.zerkCountRemaining=1&variable.convokeCountRemaining=1&variable.potCountRemaining=1&variable.highestCDremaining>variable.trinket1_cd_remains|variable.zerkCountRemaining=variable.convokeCountRemaining&variable.zerkCountRemaining!=variable.potCountRemaining&(cooldown.convoke_the_spirits.remains<?cooldown.bs_inc.remains)>variable.trinket1_cd_remains|variable.convokeCountRemaining=0&variable.zerkCountRemaining=0&variable.potCountRemaining=0))
+actions.cooldown+=/use_item,slot=trinket1,use_off_gcd=1,if=(time>10|buff.bs_inc.up)&trinket.1.has_use_buff&(cooldown.tigers_fury.remains>=25|(trinket.1.is.treacherous_transmitter|trinket.1.is.imperfect_ascendancy_serum|trinket.1.is.cursed_stone_idol)&cooldown.tigers_fury.remains<2)&(buff.potion.up|variable.slot1CountRemaining!=variable.potCountRemaining)&((cooldown.bs_inc.remains<5|buff.bs_inc.remains>=14)&!variable.holdBerserk|cooldown.convoke_the_spirits.remains<10&!variable.holdConvoke&talent.convoke_the_spirits|variable.trinket1_cd_duration=90&variable.send_90s_trinket_condition&(!trinket.2.has_use_buff|variable.trinket2_cd_remains>cooldown.bs_inc.remains)|variable.lowestCDremaining>variable.trinket1_cd_duration|variable.zerkCountRemaining=1&(!talent.convoke_the_spirits|variable.convokeCountRemaining=1)&variable.potCountRemaining=1&(variable.highestCDremaining+3)>variable.trinket1_cd_duration|variable.zerkCountRemaining=variable.convokeCountRemaining&talent.convoke_the_spirits&variable.zerkCountRemaining!=variable.potCountRemaining&(cooldown.bs_inc.remains<?cooldown.convoke_the_spirits.remains)>variable.trinket1_cd_duration|variable.slot1CountRemaining=variable.potCountRemaining-1&buff.potion.up|trinket.2.has_use_buff&(variable.secondLowestCDremaining>variable.trinket1_cd_duration&variable.lowestCDremaining>variable.trinket2_cd_remains|variable.zerkCountRemaining=1&(!talent.convoke_the_spirits|variable.convokeCountRemaining=1)&variable.potCountRemaining=1&variable.highestCDremaining>variable.trinket2_cd_remains|variable.zerkCountRemaining=variable.convokeCountRemaining&talent.convoke_the_spirits&variable.zerkCountRemaining!=variable.potCountRemaining&(cooldown.convoke_the_spirits.remains<?cooldown.bs_inc.remains)>variable.trinket2_cd_remains|variable.convokeCountRemaining=0&variable.zerkCountRemaining=0&variable.potCountRemaining=0))
+actions.cooldown+=/use_item,slot=trinket2,use_off_gcd=1,if=(time>10|buff.bs_inc.up)&trinket.2.has_use_buff&(!trinket.1.has_use_buff|variable.trinket1_cd_remains>20)&(cooldown.tigers_fury.remains>=25|(trinket.2.is.treacherous_transmitter|trinket.2.is.imperfect_ascendancy_serum|trinket.2.is.cursed_stone_idol)&cooldown.tigers_fury.remains<2)&(buff.potion.up|variable.slot2CountRemaining!=variable.potCountRemaining)&((cooldown.bs_inc.remains<5|buff.bs_inc.remains>=14)&!variable.holdBerserk|cooldown.convoke_the_spirits.remains<10&!variable.holdConvoke&talent.convoke_the_spirits|variable.trinket2_cd_duration=90&variable.send_90s_trinket_condition&(!trinket.1.has_use_buff|variable.trinket1_cd_remains>cooldown.bs_inc.remains)|variable.lowestCDremaining>variable.trinket2_cd_duration|variable.zerkCountRemaining=1&(!talent.convoke_the_spirits|variable.convokeCountRemaining=1)&variable.potCountRemaining=1&(variable.highestCDremaining+3)>variable.trinket2_cd_duration|variable.zerkCountRemaining=variable.convokeCountRemaining&talent.convoke_the_spirits&variable.zerkCountRemaining!=variable.potCountRemaining&(cooldown.bs_inc.remains<?cooldown.convoke_the_spirits.remains)>variable.trinket2_cd_duration|variable.slot1CountRemaining=variable.potCountRemaining-1&buff.potion.up|trinket.1.has_use_buff&(variable.secondLowestCDremaining>variable.trinket2_cd_duration&variable.lowestCDremaining>variable.trinket1_cd_remains|variable.zerkCountRemaining=1&(!talent.convoke_the_spirits|variable.convokeCountRemaining=1)&variable.potCountRemaining=1&variable.highestCDremaining>variable.trinket1_cd_remains|variable.zerkCountRemaining=variable.convokeCountRemaining&talent.convoke_the_spirits&variable.zerkCountRemaining!=variable.potCountRemaining&(cooldown.convoke_the_spirits.remains<?cooldown.bs_inc.remains)>variable.trinket1_cd_remains|variable.convokeCountRemaining=0&variable.zerkCountRemaining=0&variable.potCountRemaining=0))
 # fallback use if fight is ending soon
 actions.cooldown+=/use_item,slot=trinket1,if=fight_remains<=(21<?trinket.1.proc.any_dps.duration)
 actions.cooldown+=/use_item,slot=trinket2,if=fight_remains<=(21<?trinket.2.proc.any_dps.duration)
@@ -119,59 +171,21 @@ actions.cooldown+=/feral_frenzy,if=combo_points<=1+buff.bs_inc.up
 # always line up convoke with berserk if you can
 actions.cooldown+=/convoke_the_spirits,if=fight_remains<5|buff.bs_inc.up&buff.bs_inc.remains<5-talent.ashamanes_guidance|buff.tigers_fury.up&!variable.holdConvoke&(combo_points<=4|buff.bs_inc.up&combo_points<=3)
 
-# maintain/upgrade pws, if we have 6.5+s left on pw, we will instead bite if we have rampant ferocity talented. Without rampant, we will bite a vined target with 6 or fewer targets. If we have Ravage, we use specifically Ravage at 7 or fewer targets.
-actions.finisher=primal_wrath,target_if=max:dot.bloodseeker_vines.ticking,if=spell_targets.primal_wrath>1&((dot.primal_wrath.remains<6.5&!buff.bs_inc.up|dot.primal_wrath.refreshable)|(!talent.rampant_ferocity.enabled&(spell_targets.primal_wrath>1&!dot.bloodseeker_vines.ticking&!buff.ravage.up|spell_targets.primal_wrath>6+talent.ravage)))
-# rip if single target or pw isnt up. Rip with bloodtalons if talented. If tigers fury will be up before rip falls off, then delay refresh
+# primal wrath in pandemic during berserk, or with 6.5s left outside berserk
+actions.finisher=primal_wrath,target_if=min:dot.primal_wrath.ticking,if=spell_targets.primal_wrath>1&(dot.primal_wrath.remains<6.5&!buff.bs_inc.up|dot.primal_wrath.refreshable)
+# rip instead in single target
 actions.finisher+=/rip,target_if=refreshable,if=(!talent.primal_wrath|spell_targets=1)&(buff.bloodtalons.up|!talent.bloodtalons)&(buff.tigers_fury.up|dot.rip.remains<cooldown.tigers_fury.remains)&(remains<fight_remains|remains<4&buff.ravage.up)
-# only bite with ravage in aoe with berserk
+# only bite with ravage in aoe during berserk
 actions.finisher+=/call_action_list,name=aoe_builder,if=hero_tree.druid_of_the_claw&buff.bs_inc.up&!buff.ravage.up&spell_targets>=2
-# actions.finisher+=/call_action_list,name=builder,if=buff.ravage.up&buff.preparing_to_strike.remains<2&buff.preparing_to_strike.up&buff.bs_inc.up
-actions.finisher+=/wait,sec=!buff.sabertooth.up,if=buff.sabertooth.up&energy.deficit>40
+# bite > clip pw if pw isnt talented / its single target / sub-7 targets + vine up / sub 8 targets + ravage up / rampant talented
 actions.finisher+=/pool_resource,for_next=1
-actions.finisher+=/ferocious_bite,max_energy=1,target_if=max:dot.bloodseeker_vines.ticking,if=!buff.bs_inc.up
+# low energy bite during berserk/wildstalker aoe
+actions.finisher+=/ferocious_bite,target_if=max:dot.bloodseeker_vines.ticking,if=(hero_tree.wildstalker&spell_targets>1|buff.bs_inc.up)&(spell_targets=1|!talent.primal_wrath|talent.rampant_ferocity|buff.ravage.up|dot.bloodseeker_vines.ticking&spell_targets<7)
 actions.finisher+=/pool_resource,for_next=1
-actions.finisher+=/ferocious_bite,target_if=max:dot.bloodseeker_vines.ticking
+actions.finisher+=/ferocious_bite,max_energy=1,if=(!talent.primal_wrath|spell_targets=1|talent.rampant_ferocity|buff.ravage.up)
+# primal wrath fallback (2+ targets, no vine or 7+ targets, wildstalker, no rampant)
+actions.finisher+=/primal_wrath,if=spell_targets.primal_wrath>1
 
-# covers the vast majority of cases. Damage on-uses would be sent on cooldown, unless you have a stat on use and berserk/convoke is up in 20sec.
-actions.variable=variable,name=convokeCountRemaining,value=floor(((fight_remains-variable.convoke_cd)%cooldown.convoke_the_spirits.duration)+(fight_remains>cooldown.convoke_the_spirits.remains))
-actions.variable+=/variable,name=zerkCountRemaining,value=floor(((fight_remains-variable.bs_inc_cd)%cooldown.bs_inc.duration)+(fight_remains>cooldown.bs_inc.remains))
-actions.variable+=/variable,name=potCountRemaining,value=floor(((fight_remains-variable.pot_cd)%cooldown.potion.duration)+(fight_remains>cooldown.potion.remains))
-actions.variable+=/variable,name=slot1CountRemaining,value=floor(((fight_remains-variable.trinket1_cd_remains-10)%variable.trinket1_cd_duration)+(fight_remains>variable.trinket1_cd_remains))
-actions.variable+=/variable,name=slot2CountRemaining,value=floor(((fight_remains-variable.trinket2_cd_remains-10)%variable.trinket2_cd_duration)+(fight_remains>variable.trinket2_cd_remains))
-# hold berserk if there is 1 convoke or 1 potion remaining in the fight but they aren't available yet
-actions.variable+=/variable,name=firstHoldBerserkCondition,value=variable.zerkCountRemaining=1&(variable.convokeCountRemaining=1&cooldown.convoke_the_spirits.remains>10|variable.potCountRemaining=1&cooldown.potion.remains)
-# hold berserk if there are as many zerk casts as convoke casts remaining and holding zerk for convoke does not lose you a cast
-actions.variable+=/variable,name=secondHoldBerserkCondition,value=cooldown.convoke_the_spirits.remains>20&variable.convokeCountRemaining=variable.zerkCountRemaining&variable.zerkCountRemaining=floor(((fight_remains-variable.convoke_cd)%cooldown.bs_inc.duration)+(fight_remains>cooldown.convoke_the_spirits.remains))
-actions.variable+=/variable,name=holdBerserk,value=variable.firstHoldBerserkCondition|variable.secondHoldBerserkCondition
-# send 90s cd trinkets right away, if we are playing 3 minute berserk, and won't be holding the next berserk. (the case where we hold convoke is already handled)
-actions.variable+=/variable,name=first_send_90s_trinket_condition,value=variable.zerkCountRemaining>1|(variable.convokeCountRemaining!=2&(variable.potCountRemaining!=1|variable.potCountRemaining=1&variable.bs_inc_cd<variable.pot_cd))
-actions.variable+=/variable,name=second_send_90s_trinket_condition,value=1+variable.convokeCountRemaining!=variable.zerkCountRemaining|variable.zerkCountRemaining=floor((((fight_remains-cooldown.bs_inc.remains)-105)%cooldown.bs_inc.duration)+(fight_remains-cooldown.bs_inc.remains>105))
-actions.variable+=/variable,name=send_90s_trinket_condition,value=variable.first_send_90s_trinket_condition&variable.second_send_90s_trinket_condition&!talent.berserk_heart_of_the_lion
-# hold the last convoke if there is another berserk cast remaining and Berserk isn't already up
-actions.variable+=/variable,name=holdConvoke,value=variable.convokeCountRemaining=1&variable.zerkCountRemaining=1&!buff.bs_inc.up
-# hold potion for berserk if doing so does not lose you a cast
-actions.variable+=/variable,name=holdPot,value=variable.potCountRemaining=floor(((fight_remains-variable.bs_inc_cd)%cooldown.potion.duration)+(fight_remains>cooldown.bs_inc.remains))
-actions.variable+=/variable,name=bs_inc_cd,value=cooldown.bs_inc.remains+10
-actions.variable+=/variable,name=convoke_cd,value=cooldown.convoke_the_spirits.remains+10
-actions.variable+=/variable,name=pot_cd,value=cooldown.potion.remains+25
-actions.variable+=/variable,name=highestCDremaining,value=cooldown.convoke_the_spirits.remains<?cooldown.bs_inc.remains<?cooldown.potion.remains
-actions.variable+=/variable,name=lowestCDremaining,value=cooldown.convoke_the_spirits.remains>?cooldown.bs_inc.remains>?cooldown.potion.remains
-actions.variable+=/variable,name=secondLowestCDremaining,op=setif,condition=cooldown.convoke_the_spirits.remains>cooldown.bs_inc.remains,value=cooldown.convoke_the_spirits.remains>?cooldown.potion.remains,value_else=cooldown.bs_inc.remains>?cooldown.potion.remains
 # what rips new duration would be if applied in current state
-actions.variable+=/variable,name=rip_duration,value=((4+(4*combo_points))*(1-(0.2*talent.circle_of_life_and_death))*(1+(0.25*talent.veinripper)))+(variable.rip_max_pandemic_duration>?dot.rip.remains)
-actions.variable+=/variable,name=rip_max_pandemic_duration,value=((4+(4*combo_points))*(1-(0.2*talent.circle_of_life_and_death))*(1+(0.25*talent.veinripper)))*0.3
-# this returns true if we have a dot nearing pandemic range
-actions.variable+=/variable,name=dot_refresh_soon,value=(!talent.thrashing_claws&(dot.thrash_cat.remains-dot.thrash_cat.duration*0.3<=2))|(talent.lunar_inspiration&(dot.moonfire_cat.remains-dot.moonfire_cat.duration*0.3<=2))|((dot.rake.pmultiplier<1.6|buff.sudden_ambush.up)&(dot.rake.remains-dot.rake.duration*0.3<=2))
-# try to proc bt if we have 1 or 0 stacks of bloodtalons
-actions.variable+=/variable,name=need_bt,value=talent.bloodtalons&buff.bloodtalons.stack<=1
-# capped on clearcasting stacks
-actions.variable+=/variable,name=cc_capped,value=buff.clearcasting.stack=(1+talent.moment_of_clarity)
-# optional variable that sends regrowth and renewal casts. Turned off by default
-actions.variable+=/variable,name=regrowth,op=reset
-# optional variable that forgoes shredding in AoE. Turned off by default
-actions.variable+=/variable,name=easy_swipe,op=reset
-# unyielding netherprism technically has a 20s cooldown, but we want other items to view it as a 2minute trinket
-actions.variable+=/variable,name=trinket1_cd_remains,op=setif,condition=trinket.1.is.unyielding_netherprism,value=120-(10*(1+buff.latent_energy.stack)),value_else=trinket.1.cooldown.remains
-actions.variable+=/variable,name=trinket2_cd_remains,op=setif,condition=trinket.2.is.unyielding_netherprism,value=120-(10*(1+buff.latent_energy.stack)),value_else=trinket.2.cooldown.remains
-actions.variable+=/variable,name=trinket1_cd_duration,op=setif,condition=trinket.1.is.unyielding_netherprism,value=120,value_else=trinket.1.cooldown.duration
-actions.variable+=/variable,name=trinket2_cd_duration,op=setif,condition=trinket.2.is.unyielding_netherprism,value=120,value_else=trinket.2.cooldown.duration
+actions.rip_variable=variable,name=rip_duration,value=((4+(4*combo_points))*(1-(0.2*talent.circle_of_life_and_death))*(1+(0.25*talent.veinripper)))+(variable.rip_max_pandemic_duration>?dot.rip.remains)
+actions.rip_variable+=/variable,name=rip_max_pandemic_duration,value=((4+(4*combo_points))*(1-(0.2*talent.circle_of_life_and_death))*(1+(0.25*talent.veinripper)))*0.3
Guardian Druid — e9cc3d7 to fdd9ea0 (1 commit)
@@ -25,7 +25,6 @@ actions+=/use_item,name=bestinslots,if=buff.incarnation_guardian_of_ursoc.up|buf
 actions+=/use_item,name=tome_of_lights_devotion,if=buff.inner_resilience.up
 actions+=/use_items
 actions+=/potion,if=(buff.berserk_bear.up|buff.incarnation_guardian_of_ursoc.up)
-actions+=/prowl
 actions+=/run_action_list,name=bear
 
 actions.bear=maul,if=buff.ravage.up&active_enemies>1
Demonology Warlock — 73eaae9 to 9c1eb60 (1 commit)
@@ -34,7 +34,7 @@ actions+=/invoke_external_buff,name=power_infusion,if=variable.imp_despawn&varia
 actions+=/hand_of_guldan,if=soul_shard>=3&cooldown.summon_demonic_tyrant.remains_expected<10&pet.dreadstalker.active
 actions+=/summon_demonic_tyrant,if=(variable.imp_despawn&pet.vilefiend.active&pet.dreadstalker.active&(variable.imp_despawn<time+gcd.max+cast_time|buff.wild_imps.stack>=9-2*prev_gcd.1.hand_of_guldan))|(buff.grimoire_felguard.remains>cast_time&buff.grimoire_felguard.remains<action.hand_of_guldan.cast_time+cast_time+gcd.max)|(buff.dreadstalkers.remains>cast_time&((buff.dreadstalkers.remains<action.hand_of_guldan.cast_time+cast_time+gcd.max)|(variable.hog_after_ds&(time>10|buff.wild_imps.stack>=9-2*prev_gcd.1.hand_of_guldan))))
 actions+=/grimoire_felguard,if=cooldown.summon_demonic_tyrant.remains<=15&cooldown.call_dreadstalkers.remains<10
-actions+=/summon_vilefiend,if=cooldown.summon_demonic_tyrant.remains>=25+cast_time|cooldown.summon_demonic_tyrant.remains<=13&cooldown.call_dreadstalkers.remains<10
+actions+=/summon_vilefiend,if=cooldown.summon_demonic_tyrant.remains>=25+cast_time&(!pet.vilefiend.active&talent.the_houndmasters_gambit|!talent.the_houndmasters_gambit)|cooldown.summon_demonic_tyrant.remains<=13&cooldown.call_dreadstalkers.remains<10
 actions+=/call_dreadstalkers,if=cooldown.summon_demonic_tyrant.remains>=10|cooldown.summon_demonic_tyrant.remains<=10
 actions+=/call_dreadstalkers,if=buff.grimoire_felguard.up&buff.grimoire_felguard.remains<12+gcd.max+cast_time
 actions+=/call_dreadstalkers,if=buff.vilefiend.up&buff.vilefiend.remains<12+gcd.max+cast_time