## Pre-Combat actions.precombat+=/apply_poison actions.precombat+=/bottled_flayedwing_toxin actions.precombat+=/fleshcraft,if=soulbind.pustule_eruption|soulbind.volatile_solvent actions.precombat+=/stealth actions.precombat+=/marked_for_death,precombat_seconds=15 actions.precombat+=/slice_and_dice,precombat_seconds=1 ## Main Rotation actions+=/kick # Restealth if possible (no vulnerable enemies in combat) actions+=/stealth # Used to determine whether cooldowns wait for SnD based on targets. actions+=/variable,name=snd_condition,value=buff.slice_and_dice.up|spell_targets.shuriken_storm>=cp_max_spend # Check to see if the next CP (in the event of a ShT proc) is Animacharged actions+=/variable,name=is_next_cp_animacharged,if=action.echoing_reprimand.known,value=combo_points=1&buff.echoing_reprimand_2.up|combo_points=2&buff.echoing_reprimand_3.up|combo_points=3&buff.echoing_reprimand_4.up|combo_points=4&buff.echoing_reprimand_5.up # Account for ShT reaction time by ignoring low-CP animacharged matches in the 0.5s preceeding a potential ShT proc actions+=/variable,name=effective_combo_points,value=effective_combo_points actions+=/variable,name=effective_combo_points,if=action.echoing_reprimand.known&effective_combo_points>combo_points&combo_points.deficit>2&time_to_sht_plus.4<0.5&!variable.is_next_cp_animacharged,value=combo_points # Check CDs at first actions+=/call_action_list,name=cds # Apply Slice and Dice at 4+ CP if it expires within the next GCD or is not up actions+=/slice_and_dice,if=spell_targets.shuriken_storm6&combo_points>=4 # Only change rotation if we have priority_rotation set. actions+=/variable,name=priority_rotation,value=settings.priority_rotation # Run fully switches to the Stealthed Rotation (by doing so, it forces pooling if nothing is available). actions+=/run_action_list,name=stealthed,strict=1,if=stealthed.all # Used to define when to use stealth CDs or builders actions+=/variable,name=stealth_threshold,value=25+talent.vigor.enabled*20+talent.master_of_shadows.enabled*20+talent.shadow_focus.enabled*25+talent.alacrity.enabled*20+25*(spell_targets.shuriken_storm>=4) # Consider using a Stealth CD when reaching the energy threshold actions+=/call_action_list,name=stealth_cds,if=energy.deficit<=variable.stealth_threshold # Finish at maximum or close to maximum combo point value or 4+ against 4 targets (outside stealth), actions+=/call_action_list,name=finish,if=variable.effective_combo_points>=cp_max_spend|combo_points.deficit<=1|fight_remains<=1&variable.effective_combo_points>=3|spell_targets.shuriken_storm>=4&variable.effective_combo_points>=4 # Use a builder when reaching the energy threshold actions+=/call_action_list,name=build,if=energy.deficit<=variable.stealth_threshold # Lowest priority in all of the APL because it causes a GCD actions+=/arcane_torrent,if=energy.deficit>=15+energy.regen actions+=/arcane_pulse actions+=/lights_judgment actions+=/bag_of_tricks ## Builders actions.build=shiv,if=!talent.nightstalker.enabled&runeforge.tiny_toxic_blade&spell_targets.shuriken_storm<5 actions.build+=/serrated_bone_spike,cycle_targets=1,if=buff.perforated_veins.stack<=2&(cooldown.serrated_bone_spike.max_charges-charges_fractional<=0.25|soulbind.lead_by_example.enabled&!buff.lead_by_example.up|soulbind.kevins_oozeling.enabled&!debuff.kevins_wrath.up) actions.build+=/shuriken_storm,if=spell_targets>=2+(buff.lingering_shadow.up|buff.perforated_veins.up) # Build immediately unless the next CP is Animacharged and we won't cap energy waiting for it. actions.build+=/variable,name=anima_helper,value=!talent.echoing_reprimand.enabled|!(variable.is_next_cp_animacharged&(time_to_sht.3.plus<0.5|time_to_sht.4.plus<1)&energy<60) actions.build+=/serrated_bone_spike,if=buff.perforated_veins.stack<=2&(cooldown.serrated_bone_spike.max_charges-charges_fractional<=0.25|soulbind.lead_by_example.enabled&!buff.lead_by_example.up|soulbind.kevins_oozeling.enabled&!debuff.kevins_wrath.up) actions.build+=/gloomblade,if=variable.anima_helper actions.build+=/backstab,if=variable.anima_helper ## Cooldowns # Use Dance off-gcd before the first Shuriken Storm from Tornado comes in. actions.cds=shadow_dance,use_off_gcd=1,if=!buff.shadow_dance.up&buff.shuriken_tornado.up&buff.shuriken_tornado.remains<=3.5 # (Unless already up because we took Shadow Focus) use Symbols off-gcd before the first Shuriken Storm from Tornado comes in. actions.cds+=/symbols_of_death,use_off_gcd=1,if=buff.shuriken_tornado.up&buff.shuriken_tornado.remains<=3.5 actions.cds+=/flagellation,cycle_targets=1,if=variable.snd_condition&!stealthed.mantle&(cooldown.shadow_dance.up)&combo_points>=5&target.time_to_die>10 # Pool for Tornado pre-SoD with ShD ready when not running SF. actions.cds+=/pool_resource,for_next=1,if=talent.shuriken_tornado.enabled&!talent.shadow_focus.enabled # Use Tornado pre SoD when we have the energy whether from pooling without SF or just generally. actions.cds+=/shuriken_tornado,if=spell_targets.shuriken_storm<=1&energy>=60&variable.snd_condition&cooldown.symbols_of_death.up&cooldown.shadow_dance.charges>=1&(!talent.flagellation.enabled&!cooldown.flagellation.up|buff.flagellation_buff.up|spell_targets.shuriken_storm>=5)&combo_points<=2&!buff.premeditation.up actions.cds+=/serrated_bone_spike,cycle_targets=1,if=variable.snd_condition&!dot.serrated_bone_spike_dot.ticking&target.time_to_die>=21&(combo_points.deficit>=(cp_gain>?4))&!buff.shuriken_tornado.up&(!buff.premeditation.up|spell_targets.shuriken_storm>4)|boss&fight_remains<=5&spell_targets.shuriken_storm<3 actions.cds+=/sepsis,if=variable.snd_condition&combo_points.deficit>=1&target.time_to_die>=16 # Use Symbols on cooldown (after first SnD) unless we are going to pop Tornado and do not have Shadow Focus. actions.cds+=/symbols_of_death,if=variable.snd_condition&(!talent.flagellation|cooldown.flagellation.remains>10|cooldown.flagellation.up&combo_points>=5) # If adds are up, snipe the one with lowest TTD. Use when dying faster than CP deficit or not stealthed without any CP. actions.cds+=/marked_for_death,line_cd=1.5,cycle_targets=1,if=raid_event.adds.up&(target.time_to_die=cp_max_spend) # If no adds will die within the next 30s, use MfD on boss without any CP. actions.cds+=/marked_for_death,if=raid_event.adds.in>30-raid_event.adds.duration&combo_points.deficit>=cp_max_spend actions.cds+=/shadow_blades,if=variable.snd_condition&combo_points.deficit>=2 actions.cds+=/echoing_reprimand,if=variable.snd_condition&combo_points.deficit>=3&(variable.priority_rotation|spell_targets.shuriken_storm<=4|talent.resounding_clarity)&(buff.shadow_dance.up|!talent.danse_macabre) # With SF, if not already done, use Tornado with SoD up. actions.cds+=/shuriken_tornado,if=variable.snd_condition&buff.symbols_of_death.up&combo_points<=2&(!buff.premeditation.up|spell_targets.shuriken_storm>4) actions.cds+=/shadow_dance,if=!buff.shadow_dance.up&fight_remains<=8+talent.subterfuge.enabled actions.cds+=/thistle_tea,if=cooldown.symbols_of_death.remains>=3&!buff.thistle_tea.up&(energy.deficit>=100|cooldown.thistle_tea.charges_fractional>=2.75&energy.deficit>=40)|buff.shadow_dance.up&!buff.thistle_tea.up&spell_targets.shuriken_storm>=2 actions.cds+=/fleshcraft,if=(soulbind.pustule_eruption|soulbind.volatile_solvent)&energy.deficit>=30&!stealthed.all&buff.symbols_of_death.down,interrupt_immediate=1,interrupt_global=1,interrupt_if=soulbind.volatile_solvent actions.cds+=/potion,if=buff.bloodlust.react|fight_remains<30|buff.symbols_of_death.up&(buff.shadow_blades.up|cooldown.shadow_blades.remains<=10) actions.cds+=/blood_fury,if=buff.symbols_of_death.up actions.cds+=/berserking,if=buff.symbols_of_death.up actions.cds+=/fireblood,if=buff.symbols_of_death.up actions.cds+=/ancestral_call,if=buff.symbols_of_death.up actions.cds+=/use_item,name=wraps_of_electrostatic_potential actions.cds+=/use_item,name=ring_of_collapsing_futures,if=buff.temptation.down|boss&fight_remains<30 actions.cds+=/use_item,name=cache_of_acquired_treasures,if=(action.flagellation.known&buff.acquired_axe.up|!action.flagellation.known&buff.acquired_wand.up)&(spell_targets.shuriken_storm=1&raid_event.adds.in>60|boss&fight_remains<25|variable.priority_rotation)|buff.acquired_axe.up&spell_targets.shuriken_storm>1 actions.cds+=/use_item,name=bloodstained_handkerchief,cycle_targets=1,if=!dot.cruel_garrote.ticking actions.cds+=/use_item,name=scars_of_fraternal_strife,if=!buff.scars_of_fraternal_strife_4.up|boss&fight_remains<35 # Default fallback for usable items: Use with Symbols of Death. actions.cds+=/use_items,if=buff.symbols_of_death.up|boss&fight_remains<20 ## Finishers # While using Premeditation, avoid casting Slice and Dice when Shadow Dance is soon to be used, except for Kyrian actions.finish=variable,name=premed_snd_condition,value=talent.premeditation.enabled&spell_targets.shuriken_storm<5 actions.finish+=/slice_and_dice,if=!variable.premed_snd_condition&spell_targets.shuriken_storm<6&!buff.shadow_dance.up&buff.slice_and_dice.remains6&refreshable actions.finish+=/secret_technique,if=cooldown.shadow_dance.remains>40|buff.shadow_dance.up # Multidotting targets that will live for the duration of Rupture, refresh during pandemic. actions.finish+=/rupture,cycle_targets=1,if=!variable.skip_rupture&!variable.priority_rotation&spell_targets.shuriken_storm>=2&target.time_to_die>=(2*combo_points)&refreshable # Refresh Rupture early if it will expire during Symbols. Do that refresh if SoD gets ready in the next 5s. actions.finish+=/rupture,if=!variable.skip_rupture&remainscooldown.symbols_of_death.remains+5 actions.finish+=/black_powder,if=!variable.priority_rotation&spell_targets>=(3-talent.dark_brew.enabled) actions.finish+=/eviscerate ## Stealth Cooldowns # Helper Variable actions.stealth_cds=variable,name=shd_threshold,value=cooldown.shadow_dance.charges_fractional>=0.75+talent.shadow_dance # Vanish if we are capping on Dance charges. Early before first dance if we have no Nightstalker but Dark Shadow in order to get Rupture up (no Master Assassin). actions.stealth_cds+=/vanish,if=!variable.shd_threshold&combo_points.deficit>1 # Pool for Shadowmeld + Shadowstrike unless we are about to cap on Dance charges. Only when Find Weakness is about to run out. actions.stealth_cds+=/pool_resource,for_next=1,extra_amount=40,if=race.night_elf actions.stealth_cds+=/shadowmeld,if=energy>=40&energy.deficit>=10&!variable.shd_threshold&combo_points.deficit>4 # CP thresholds for entering Shadow Dance # Default to start dance with 0 or 1 combo point actions.stealth_cds+=/variable,name=shd_combo_points,value=combo_points<=1 # Use stealth cooldowns with at least 2 combo points missing on 3 targets actions.stealth_cds+=/variable,name=shd_combo_points,value=combo_points.deficit>=2,if=spell_targets.shuriken_storm=3 # Use stealth cooldowns with high combo points when playing shuriken tornado or with high target counts actions.stealth_cds+=/variable,name=shd_combo_points,value=combo_points.deficit<=1,if=spell_targets.shuriken_storm>(4-2*talent.shuriken_tornado.enabled)|variable.priority_rotation&spell_targets.shuriken_storm>=4 # Use stealth cooldowns on any combo point on 4 targets actions.stealth_cds+=/variable,name=shd_combo_points,value=1,if=spell_targets.shuriken_storm=4 # Dance during Symbols or above threshold. actions.stealth_cds+=/shadow_dance,if=(variable.shd_combo_points&(buff.symbols_of_death.remains>=(2.2-talent.flagellation.enabled)|variable.shd_threshold)|buff.flagellation.up|buff.flagellation_persist.remains>=6|spell_targets.shuriken_storm>=4&cooldown.symbols_of_death.remains>10)&!buff.the_rotten.up # Burn Dances charges if before the fight ends if SoD won't be ready in time. actions.stealth_cds+=/shadow_dance,if=variable.shd_combo_points&fight_remains=cp_max_spend|buff.shuriken_tornado.up&combo_points.deficit<=2|spell_targets.shuriken_storm>=4&variable.effective_combo_points>=4|combo_points.deficit<=1+(talent.seal_fate|talent.deeper_stratagem|talent.secret_stratagem) # Use Gloomblade or Backstab when close to hitting max PV stacks actions.stealthed+=/gloomblade,if=buff.perforated_veins.stack>=5&spell_targets.shuriken_storm<3 actions.stealthed+=/backstab,if=buff.perforated_veins.stack>=5&spell_targets.shuriken_storm<3 actions.stealthed+=/shadowstrike,if=stealthed.sepsis&spell_targets.shuriken_storm<4 # For priority rotation, use Shadowstrike over Storm at up to 4 targets or if FW is running off (on any amount of targets) actions.stealthed+=/shadowstrike,if=variable.priority_rotation&(debuff.find_weakness.remains<1|spell_targets.shuriken_storm<=4) actions.stealthed+=/shuriken_storm,if=spell_targets>=3+buff.the_rotten.up&(!buff.premeditation.up|spell_targets>=7) # Shadowstrike to refresh Find Weakness and to ensure we can carry over a full FW into the next SoD if possible. actions.stealthed+=/shadowstrike,if=debuff.find_weakness.remains<=1|cooldown.symbols_of_death.remains<18&debuff.find_weakness.remains