You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
16 KiB
151 lines
16 KiB
## Subtlety Rogue
|
|
## May 1, 2022
|
|
|
|
## Changes:
|
|
## - Move variable.use_priority_rotation up so it is set before we use it.
|
|
## - Combine multiple call_action_list entries to reduce potential rework.
|
|
## - Make Fleshcraft interrupt in combat if we just did it for volatile_solvent.
|
|
|
|
## 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,if=refreshable
|
|
actions.precombat+=/shadow_blades,if=runeforge.mark_of_the_master_assassin
|
|
|
|
## Main Rotation
|
|
actions=kick
|
|
# 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>=6
|
|
actions+=/variable,name=snd_condition,value=buff.slice_and_dice.up|spell_targets.shuriken_storm>=6
|
|
# Check to see if the next CP (in the event of a ShT proc) is Animacharged
|
|
actions+=/variable,name=is_next_cp_animacharged,if=covenant.kyrian,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=covenant.kyrian&effective_combo_points>combo_points&combo_points.deficit>2&time_to_sht_plus.4<0.5&!variable.is_next_cp_animacharged,value=combo_points
|
|
# Only change rotation if we have priority_rotation set and multiple targets up.
|
|
actions+=/variable,name=use_priority_rotation,value=priority_rotation&spell_targets.shuriken_storm>=2
|
|
# Check CDs at first
|
|
actions+=/call_action_list,name=cds
|
|
# Apply Slice and Dice at 2+ CP during the first 10 seconds, after that 4+ CP if it expires within the next GCD or is not up
|
|
actions+=/slice_and_dice,if=spell_targets.shuriken_storm<6&fight_remains>6&buff.slice_and_dice.remains<gcd.max&combo_points>=4-(time<10)*2
|
|
# Run fully switches to the Stealthed Rotation (by doing so, it forces pooling if nothing is available).
|
|
actions+=/run_action_list,name=stealthed,if=stealthed.all
|
|
# Priority Rotation? Let's give a crap about energy for the stealth CDs (builder still respect it). Yup, it can be that simple.
|
|
actions+=/call_action_list,name=stealth_cds,if=variable.use_priority_rotation
|
|
# 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 max, 4+ without DS or with SoD crit buff, 5+ with DS (outside stealth); with DS also finish at 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|buff.symbols_of_death_autocrit.up&variable.effective_combo_points>=4|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+=/shuriken_storm,if=spell_targets>=2&(!covenant.necrolord|cooldown.serrated_bone_spike.max_charges-charges_fractional>=0.25|spell_targets.shuriken_storm>4)&(buff.perforated_veins.stack<=4|spell_targets.shuriken_storm>4&!variable.use_priority_rotation)
|
|
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
|
|
# Backstab immediately unless the next CP is Animacharged and we won't cap energy waiting for it.
|
|
actions.build+=/backstab,if=!covenant.kyrian|!(variable.is_next_cp_animacharged&(time_to_sht.3.plus<0.5|time_to_sht.4.plus<1)&energy<60)
|
|
|
|
# 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&(spell_targets.shuriken_storm<=1&cooldown.symbols_of_death.up&!talent.shadow_focus.enabled|buff.symbols_of_death.up)&combo_points>=5&target.time_to_die>10
|
|
actions.cds+=/vanish,if=(runeforge.mark_of_the_master_assassin&combo_points.deficit<=1-talent.deeper_strategem.enabled|runeforge.deathly_shadows&combo_points<1)&buff.symbols_of_death.up&buff.shadow_dance.up&master_assassin_remains=0&buff.deathly_shadows.down
|
|
# 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&(!runeforge.obedience|debuff.flagellation.up|spell_targets.shuriken_storm>=(1+4*(!talent.nightstalker.enabled&!talent.dark_shadow.enabled)))&combo_points<=2&!buff.premeditation.up&(!covenant.venthyr|!cooldown.flagellation.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&(!stealthed.all|buff.perforated_veins.stack<4|spell_targets.shuriken_storm>4&!variable.use_priority_rotation)&(!talent.shuriken_tornado.enabled|talent.shadow_focus.enabled|spell_targets.shuriken_storm>=2|cooldown.shuriken_tornado.remains>2)&(!covenant.venthyr|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<combo_points.deficit|!stealthed.all&combo_points.deficit>=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&(buff.symbols_of_death.up|boss&fight_remains<=20|!buff.shadow_blades.up&set_bonus.tier28_2pc)
|
|
actions.cds+=/echoing_reprimand,if=(!talent.shadow_focus.enabled|!stealthed.all|spell_targets.shuriken_storm>=4)&variable.snd_condition&combo_points.deficit>=2&(variable.use_priority_rotation|spell_targets.shuriken_storm<=4|runeforge.resounding_clarity)
|
|
# With SF, if not already done, use Tornado with SoD up.
|
|
actions.cds+=/shuriken_tornado,if=(talent.shadow_focus.enabled|spell_targets.shuriken_storm>=2)&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+=/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|boss&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=cache_of_acquired_treasures,if=(covenant.venthyr&buff.acquired_axe.up|!covenant.venthyr&buff.acquired_wand.up)&(spell_targets.shuriken_storm=1&raid_event.adds.in>60|boss&fight_remains<25|variable.use_priority_rotation)|buff.acquired_axe.up&spell_targets.shuriken_storm>1
|
|
actions.cds+=/use_item,name=scars_of_fraternal_strife,if=!buff.scars_of_fraternal_strife_4.up|boss&fight_remains<30
|
|
# 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-covenant.necrolord)&!covenant.kyrian
|
|
actions.finish+=/slice_and_dice,if=!variable.premed_snd_condition&spell_targets.shuriken_storm<6&!buff.shadow_dance.up&buff.slice_and_dice.remains<fight_remains&refreshable
|
|
actions.finish+=/slice_and_dice,if=variable.premed_snd_condition&cooldown.shadow_dance.charges_fractional<1.75&buff.slice_and_dice.remains<cooldown.symbols_of_death.remains&(cooldown.shadow_dance.ready&buff.symbols_of_death.remains-buff.shadow_dance.remains<1.2)
|
|
# Helper Variable for Rupture. Skip during Master Assassin or during Dance with Dark and no Nightstalker.
|
|
actions.finish+=/variable,name=skip_rupture,value=master_assassin_remains>0|!talent.nightstalker.enabled&talent.dark_shadow.enabled&buff.shadow_dance.up|spell_targets.shuriken_storm>=(4-stealthed.all*talent.shadow_focus.enabled)
|
|
# Keep up Rupture if it is about to run out.
|
|
actions.finish+=/rupture,if=!stealthed.all&(!variable.skip_rupture|variable.use_priority_rotation)&target.time_to_die-remains>6&refreshable
|
|
actions.finish+=/secret_technique
|
|
# Multidotting targets that will live for the duration of Rupture, refresh during pandemic.
|
|
actions.finish+=/rupture,cycle_targets=1,if=!variable.skip_rupture&!variable.use_priority_rotation&spell_targets.shuriken_storm>=2&target.time_to_die>=(5+(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&remains<cooldown.symbols_of_death.remains+10&cooldown.symbols_of_death.remains<=5&target.time_to_die-remains>cooldown.symbols_of_death.remains+5
|
|
actions.finish+=/black_powder,if=!variable.use_priority_rotation&spell_targets>=3
|
|
actions.finish+=/eviscerate
|
|
|
|
## Stealth Cooldowns
|
|
# Helper Variable
|
|
actions.stealth_cds=variable,name=shd_threshold,value=cooldown.shadow_dance.charges_fractional>=(1.75-0.75*(covenant.kyrian&set_bonus.tier28_2pc&cooldown.symbols_of_death.remains>=8))
|
|
actions.stealth_cds+=/variable,name=shd_threshold,if=runeforge.the_rotten,value=cooldown.shadow_dance.charges_fractional>=1.75|cooldown.symbols_of_death.remains>=16
|
|
# 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|!talent.nightstalker.enabled&talent.dark_shadow.enabled)&combo_points.deficit>1&!runeforge.mark_of_the_master_assassin
|
|
# 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>1
|
|
# CP thresholds for entering Shadow Dance
|
|
actions.stealth_cds+=/variable,name=shd_combo_points,value=combo_points.deficit>=2+buff.shadow_blades.up
|
|
actions.stealth_cds+=/variable,name=shd_combo_points,value=combo_points.deficit>=3,if=covenant.kyrian
|
|
actions.stealth_cds+=/variable,name=shd_combo_points,value=combo_points.deficit<=1,if=variable.use_priority_rotation&spell_targets.shuriken_storm>=4
|
|
actions.stealth_cds+=/variable,name=shd_combo_points,value=combo_points.deficit<=1,if=spell_targets.shuriken_storm=4
|
|
# Dance during Symbols or above threshold.
|
|
actions.stealth_cds+=/shadow_dance,if=(runeforge.the_rotten&cooldown.symbols_of_death.remains<=8|variable.shd_combo_points&(buff.symbols_of_death.remains>=1.2|variable.shd_threshold)|buff.chaos_bane.up|spell_targets.shuriken_storm>=4&cooldown.symbols_of_death.remains>10)&(buff.perforated_veins.stack<4|spell_targets.shuriken_storm>3)
|
|
# Burn Dances charges if you play Dark Shadows/Alacrity or before the fight ends if SoD won't be ready in time.
|
|
actions.stealth_cds+=/shadow_dance,if=variable.shd_combo_points&boss&fight_remains<cooldown.symbols_of_death.remains|!talent.enveloping_shadows.enabled
|
|
|
|
## Stealthed Rotation
|
|
# If Stealth/vanish are up, use Shadowstrike to benefit from the passive bonus and Find Weakness, even if we are at max CP (unless using Master Assassin)
|
|
actions.stealthed=shadowstrike,if=(buff.stealth.up|buff.vanish.up)&(spell_targets.shuriken_storm<4|variable.use_priority_rotation)&master_assassin_remains=0
|
|
# Finish at 3+ CP without DS / 4+ with DS with Shuriken Tornado buff up to avoid some CP waste situations.
|
|
# Also safe to finish at 4+ CP with exactly 4 targets. (Same as outside stealth.)
|
|
# Finish at 4+ CP without DS, 5+ with DS, and 6 with DS after Vanish
|
|
actions.stealthed+=/call_action_list,name=finish,if=variable.effective_combo_points>=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.deeper_stratagem.enabled&buff.vanish.up)
|
|
actions.stealthed+=/shadowstrike,if=stealthed.sepsis&spell_targets.shuriken_storm<4
|
|
# Backstab during Shadow Dance when on high PV stacks and Shadow Blades is up.
|
|
actions.stealthed+=/backstab,if=conduit.perforated_veins.rank>=8&buff.perforated_veins.stack>=5&buff.shadow_dance.remains>=3&buff.shadow_blades.up&(spell_targets.shuriken_storm<=3|variable.use_priority_rotation)&(buff.shadow_blades.remains<=buff.shadow_dance.remains+2|!covenant.venthyr)
|
|
actions.stealthed+=/shiv,if=talent.nightstalker.enabled&runeforge.tiny_toxic_blade&spell_targets.shuriken_storm<5
|
|
# Up to 3 targets (no prio) keep up Find Weakness by cycling Shadowstrike.
|
|
actions.stealthed+=/shadowstrike,cycle_targets=1,if=!variable.use_priority_rotation&debuff.find_weakness.remains<1&spell_targets.shuriken_storm<=3&target.time_to_die-remains>6
|
|
# For priority rotation, use Shadowstrike over Storm with WM against up to 4 targets or if FW is running off (on any amount of targets)
|
|
actions.stealthed+=/shadowstrike,if=variable.use_priority_rotation&(debuff.find_weakness.remains<1|talent.weaponmaster.enabled&spell_targets.shuriken_storm<=4)
|
|
actions.stealthed+=/shuriken_storm,if=spell_targets>=3+(buff.the_rotten.up|runeforge.akaaris_soul_fragment|set_bonus.tier28_2pc&talent.shadow_focus.enabled)&(buff.symbols_of_death_autocrit.up|!buff.premeditation.up|spell_targets>=5)
|
|
# 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<cooldown.symbols_of_death.remains
|
|
actions.stealthed+=/gloomblade,if=buff.perforated_veins.stack>=5&conduit.perforated_veins.rank>=13
|
|
actions.stealthed+=/shadowstrike
|
|
actions.stealthed+=/cheap_shot,if=!target.is_boss&combo_points.deficit>=1&buff.shot_in_the_dark.up&energy.time_to_40>gcd.max
|