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.

184 lines
18 KiB

## Death Knight Frost
## November 13, 2021
## Changes
## - Removed last-second usage of Chains of Ice as it doesn't play well in practice.
## - Don't channel Fleshcraft during Breath of Sindragosa.
# Evaluates a trinkets cooldown, divided by pillar of frost or breath of sindragosa's cooldown. If it's value has no remainder return 1, else return 0.5.
actions.precombat+=/variable,name=trinket_1_sync,op=setif,value=1,value_else=0.5,condition=trinket.1.has_use_buff&(!talent.breath_of_sindragosa&(trinket.1.cooldown.duration%%cooldown.pillar_of_frost.duration=0)|talent.breath_of_sindragosa&(cooldown.breath_of_sindragosa.duration%%trinket.1.cooldown.duration=0)|talent.icecap)
actions.precombat+=/variable,name=trinket_2_sync,op=setif,value=1,value_else=0.5,condition=trinket.2.has_use_buff&(!talent.breath_of_sindragosa&(trinket.2.cooldown.duration%%cooldown.pillar_of_frost.duration=0)|talent.breath_of_sindragosa&(cooldown.breath_of_sindragosa.duration%%trinket.2.cooldown.duration=0)|talent.icecap)
# Estimates a trinkets value by comparing the cooldown of the trinket, divided by the duration of the buff it provides. Has a strength modifier to give a higher priority to strength trinkets, as well as a modifier for if a trinket will or will not sync with cooldowns.
actions.precombat+=/variable,name=trinket_priority,op=setif,value=2,value_else=1,condition=!trinket.1.has_use_buff&trinket.2.has_use_buff|trinket.2.has_use_buff&((trinket.2.cooldown.duration%trinket.2.buff_duration)*(1.5+trinket.2.has_buff.strength)*(variable.trinket_2_sync))>((trinket.1.cooldown.duration%trinket.1.buff_duration)*(1.5+trinket.1.has_buff.strength)*(variable.trinket_1_sync))
actions.precombat+=/variable,name=rw_buffs,value=talent.gathering_storm|conduit.everfrost|runeforge.biting_cold
actions.precombat+=/fleshcraft
## Executed every time the actor is available.
actions=mind_freeze
# Prevent specified trinkets being used with automatic lines
actions+=/variable,name=specified_trinket,value=(equipped.inscrutable_quantum_device&cooldown.inscrutable_quantum_device.ready)
actions+=/variable,name=st_planning,value=active_enemies=1&(raid_event.adds.in>15|!raid_event.adds.exists)
actions+=/variable,name=adds_remain,value=active_enemies>=2&(!raid_event.adds.exists|raid_event.adds.exists&(raid_event.adds.remains>5|fight_remains>10))
actions+=/variable,name=rotfc_rime,value=buff.rime.up&(!runeforge.rage_of_the_frozen_champion|runeforge.rage_of_the_frozen_champion&runic_power.deficit>8)
actions+=/variable,name=frost_strike_conduits,value=conduit.eradicating_blow&buff.eradicating_blow.stack=2|conduit.unleashed_frenzy&buff.unleashed_frenzy.remains<(gcd*2)
actions+=/variable,name=deaths_due_active,value=death_and_decay.ticking&covenant.night_fae
# Apply Frost Fever, maintain Icy Talons and keep Remorseless Winter rolling
actions+=/remorseless_winter,if=conduit.everfrost&talent.gathering_storm&!talent.obliteration&cooldown.pillar_of_frost.remains
actions+=/howling_blast,cycle_targets=1,if=dot.frost_fever.refreshable&(talent.icecap|!buff.breath_of_sindragosa.up&talent.breath_of_sindragosa|talent.obliteration&cooldown.pillar_of_frost.remains&!buff.killing_machine.up)
actions+=/glacial_advance,if=buff.icy_talons.remains<=gcd&talent.icy_talons&spell_targets.glacial_advance>=2&(talent.icecap|talent.breath_of_sindragosa&cooldown.breath_of_sindragosa.remains>15|talent.obliteration&!buff.pillar_of_frost.up)
actions+=/frost_strike,if=buff.icy_talons.remains<=gcd&talent.icy_talons&(talent.icecap|talent.breath_of_sindragosa&!buff.breath_of_sindragosa.up&cooldown.breath_of_sindragosa.remains>10|talent.obliteration&!buff.pillar_of_frost.up)
# Choose Action list to run
actions+=/call_action_list,name=covenants
actions+=/call_action_list,name=racials
actions+=/call_action_list,name=trinkets
actions+=/call_action_list,name=cooldowns
actions+=/call_action_list,name=cold_heart,strict=1,if=talent.cold_heart&(!buff.killing_machine.up|talent.breath_of_sindragosa)&(debuff.razorice.stack=5|!death_knight.runeforge.razorice)
actions+=/run_action_list,name=bos_ticking,strict=1,if=buff.breath_of_sindragosa.up
actions+=/run_action_list,name=bos_pooling,if=talent.breath_of_sindragosa&(cooldown.breath_of_sindragosa.remains<10)&(raid_event.adds.in>25|!raid_event.adds.exists|cooldown.pillar_of_frost.remains<10&raid_event.adds.exists&raid_event.adds.in<10)
actions+=/run_action_list,name=obliteration,strict=1,if=buff.pillar_of_frost.up&talent.obliteration
actions+=/run_action_list,name=obliteration_pooling,if=talent.obliteration&cooldown.pillar_of_frost.remains<10&(variable.st_planning|raid_event.adds.exists&raid_event.adds.in<10|!raid_event.adds.exists)
actions+=/run_action_list,name=aoe,strict=1,if=active_enemies>=2
actions+=/call_action_list,name=standard
# AoE Rotation
actions.aoe=remorseless_winter
actions.aoe+=/glacial_advance,if=talent.frostscythe
actions.aoe+=/frostscythe,if=buff.killing_machine.react&!variable.deaths_due_active
actions.aoe+=/howling_blast,if=variable.rotfc_rime&talent.avalanche
actions.aoe+=/glacial_advance,if=!buff.rime.up&active_enemies<=3|active_enemies>3
# Formulaic approach to create a pseudo priority target list for applying razorice in aoe
actions.aoe+=/frost_strike,cycle_targets=1,if=cooldown.remorseless_winter.remains<=2*gcd&talent.gathering_storm
actions.aoe+=/howling_blast,if=variable.rotfc_rime
actions.aoe+=/frostscythe,if=buff.gathering_storm.up&active_enemies>2&!variable.deaths_due_active
actions.aoe+=/obliterate,if=variable.deaths_due_active&buff.deaths_due.stack<4|buff.gathering_storm.up
actions.aoe+=/frost_strike,cycle_targets=1,if=runic_power.deficit<(15+talent.runic_attenuation*5)
actions.aoe+=/frostscythe,if=!variable.deaths_due_active
actions.aoe+=/obliterate,cycle_targets=1,if=runic_power.deficit>(25+talent.runic_attenuation*5)
actions.aoe+=/glacial_advance
actions.aoe+=/frostscythe
actions.aoe+=/frost_strike,cycle_targets=1
actions.aoe+=/horn_of_winter
actions.aoe+=/arcane_torrent
# Breath of Sindragosa pooling rotation : starts 10s before BoS is available
actions.bos_pooling=remorseless_winter,if=active_enemies>=2|variable.rw_buffs
actions.bos_pooling+=/obliterate,cycle_targets=1,if=buff.killing_machine.react&cooldown.pillar_of_frost.remains>3
actions.bos_pooling+=/howling_blast,if=variable.rotfc_rime
actions.bos_pooling+=/frostscythe,if=buff.killing_machine.react&runic_power.deficit>(15+talent.runic_attenuation*5)&spell_targets.frostscythe>2&!variable.deaths_due_active
actions.bos_pooling+=/frostscythe,if=runic_power.deficit>=(35+talent.runic_attenuation*5)&spell_targets.frostscythe>2&!variable.deaths_due_active
## 'target_if=max:(debuff.razorice.stack+1)%(debuff.razorice.remains+1)*death_knight.runeforge.razorice' Repeats a lot, this is intended to target the highest priority enemy with an ability that will apply razorice if runeforged. That being an enemy with 0 stacks, or an enemy that the debuff will soon expire on.
actions.bos_pooling+=/obliterate,cycle_targets=1,if=runic_power.deficit>=25
actions.bos_pooling+=/glacial_advance,if=runic_power.deficit<20&spell_targets.glacial_advance>=2&cooldown.pillar_of_frost.remains>5
actions.bos_pooling+=/frost_strike,cycle_targets=1,if=runic_power.deficit<20&cooldown.pillar_of_frost.remains>5
actions.bos_pooling+=/glacial_advance,if=cooldown.pillar_of_frost.remains>rune.time_to_4&runic_power.deficit<40&spell_targets.glacial_advance>=2
actions.bos_pooling+=/frost_strike,cycle_targets=1,if=cooldown.pillar_of_frost.remains>rune.time_to_4&runic_power.deficit<40
# Breath of Sindragosa Active Rotation
actions.bos_ticking=obliterate,cycle_targets=1,if=runic_power.deficit>=(45+talent.runic_attenuation*5)
actions.bos_ticking+=/remorseless_winter,if=variable.rw_buffs|active_enemies>=2|runic_power<32
actions.bos_ticking+=/death_and_decay,if=runic_power<32
actions.bos_ticking+=/howling_blast,if=variable.rotfc_rime&(runic_power.deficit<55|rune.time_to_3<=gcd|runeforge.rage_of_the_frozen_champion|spell_targets.howling_blast>=2|buff.rime.remains<3)|runic_power<32
actions.bos_ticking+=/frostscythe,if=buff.killing_machine.up&spell_targets.frostscythe>2&!variable.deaths_due_active
actions.bos_ticking+=/obliterate,cycle_targets=1,if=buff.killing_machine.react
actions.bos_ticking+=/horn_of_winter,if=runic_power.deficit>=40&rune.time_to_3>gcd
actions.bos_ticking+=/frostscythe,if=spell_targets.frostscythe>2&!variable.deaths_due_active
actions.bos_ticking+=/obliterate,cycle_targets=1,if=runic_power.deficit>25|rune.time_to_3<gcd
actions.bos_ticking+=/howling_blast,if=variable.rotfc_rime
actions.bos_ticking+=/arcane_torrent,if=runic_power.deficit>50
## Cold Heart Conditions
## actions.cold_heart=chains_of_ice,if=fight_remains<gcd&(rune<2|!buff.killing_machine.up&(!main_hand.2h&buff.cold_heart.stack>=4+runeforge.koltiras_favor|main_hand.2h&buff.cold_heart.stack>8+runeforge.koltiras_favor)|buff.killing_machine.up&(!main_hand.2h&buff.cold_heart.stack>8+runeforge.koltiras_favor|main_hand.2h&buff.cold_heart.stack>10+runeforge.koltiras_favor))
# Use during Pillar with Icecap/Breath
actions.cold_heart+=/chains_of_ice,if=!talent.obliteration&buff.pillar_of_frost.up&buff.cold_heart.stack>=10&(buff.pillar_of_frost.remains<gcd*(1+cooldown.frostwyrms_fury.ready)|buff.unholy_strength.remains<gcd|buff.chaos_bane.remains<gcd)
# Outside of Pillar useage with Icecap/Breath
actions.cold_heart+=/chains_of_ice,if=!talent.obliteration&death_knight.runeforge.fallen_crusader&!buff.pillar_of_frost.up&cooldown.pillar_of_frost.remains>15&(buff.cold_heart.stack>=10&(buff.unholy_strength.up|buff.chaos_bane.up)|buff.cold_heart.stack>=13)
actions.cold_heart+=/chains_of_ice,if=!talent.obliteration&!death_knight.runeforge.fallen_crusader&buff.cold_heart.stack>=10&!buff.pillar_of_frost.up&cooldown.pillar_of_frost.remains>20
# Prevent Cold Heart overcapping during pillar
actions.cold_heart+=/chains_of_ice,if=talent.obliteration&!buff.pillar_of_frost.up&(buff.cold_heart.stack>=14&(buff.unholy_strength.up|buff.chaos_bane.up)|buff.cold_heart.stack>=19|cooldown.pillar_of_frost.remains<3&buff.cold_heart.stack>=14)
# Potion
actions.cooldowns=potion,if=buff.pillar_of_frost.up
# Cooldowns
actions.cooldowns+=/empower_rune_weapon,if=talent.obliteration&rune<6&(variable.st_planning|variable.adds_remain)&(cooldown.pillar_of_frost.remains<5&(cooldown.fleshcraft.remains>5&soulbind.pustule_eruption|!soulbind.pustule_eruption)|buff.pillar_of_frost.up)|boss&fight_remains<20
actions.cooldowns+=/empower_rune_weapon,if=talent.breath_of_sindragosa&runic_power.deficit>30&rune.time_to_5>gcd&(buff.breath_of_sindragosa.up|fight_remains<20)
actions.cooldowns+=/empower_rune_weapon,if=talent.icecap
actions.cooldowns+=/pillar_of_frost,if=talent.breath_of_sindragosa&(variable.st_planning|variable.adds_remain)&(cooldown.breath_of_sindragosa.remains|cooldown.breath_of_sindragosa.ready&runic_power.deficit<50)
actions.cooldowns+=/pillar_of_frost,if=talent.icecap&!buff.pillar_of_frost.up
actions.cooldowns+=/pillar_of_frost,if=talent.obliteration&runic_power>=25&(variable.st_planning|variable.adds_remain)&(talent.gathering_storm.enabled&buff.remorseless_winter.up|!talent.gathering_storm.enabled)
actions.cooldowns+=/breath_of_sindragosa,if=buff.pillar_of_frost.up
actions.cooldowns+=/frostwyrms_fury,if=active_enemies=1&buff.pillar_of_frost.remains<gcd&buff.pillar_of_frost.up&!talent.obliteration&(!raid_event.adds.exists|raid_event.adds.in>30)|fight_remains<3
actions.cooldowns+=/frostwyrms_fury,if=active_enemies>=2&(buff.pillar_of_frost.up|raid_event.adds.exists&raid_event.adds.in>cooldown.pillar_of_frost.remains+7)&(buff.pillar_of_frost.remains<gcd|raid_event.adds.exists&raid_event.adds.remains<gcd)
actions.cooldowns+=/frostwyrms_fury,if=talent.obliteration&buff.pillar_of_frost.up&((buff.pillar_of_frost.remains<gcd|buff.unholy_strength.up&buff.unholy_strength.remains<gcd)&(debuff.razorice.stack=5|!death_knight.runeforge.razorice))
actions.cooldowns+=/hypothermic_presence,if=talent.breath_of_sindragosa&runic_power.deficit>40&rune<=3&(buff.breath_of_sindragosa.up|cooldown.breath_of_sindragosa.remains>40)|!talent.breath_of_sindragosa&runic_power.deficit>=25
actions.cooldowns+=/raise_dead,if=cooldown.pillar_of_frost.remains<=5
actions.cooldowns+=/sacrificial_pact,if=active_enemies>=2&(fight_remains<3|!buff.breath_of_sindragosa.up&(pet.ghoul.remains<gcd|raid_event.adds.exists&raid_event.adds.remains<3&raid_event.adds.in>pet.ghoul.remains))
actions.cooldowns+=/death_and_decay,if=active_enemies>5|runeforge.phearomones
# Covenant Abilities
actions.covenants=deaths_due,if=variable.st_planning|variable.adds_remain
actions.covenants+=/swarming_mist,if=runic_power.deficit>13&cooldown.pillar_of_frost.remains<3&!talent.breath_of_sindragosa&variable.st_planning
actions.covenants+=/swarming_mist,if=!talent.breath_of_sindragosa&variable.adds_remain
actions.covenants+=/swarming_mist,if=talent.breath_of_sindragosa&(buff.breath_of_sindragosa.up&(variable.st_planning&runic_power.deficit>40|variable.adds_remain&runic_power.deficit>60|variable.adds_remain&raid_event.adds.remains<9&raid_event.adds.exists)|!buff.breath_of_sindragosa.up&cooldown.breath_of_sindragosa.remains)
actions.covenants+=/abomination_limb,if=cooldown.pillar_of_frost.remains<3&variable.st_planning&(talent.breath_of_sindragosa&runic_power.deficit<60&cooldown.breath_of_sindragosa.remains<2|!talent.breath_of_sindragosa)
actions.covenants+=/abomination_limb,if=variable.adds_remain
actions.covenants+=/shackle_the_unworthy,if=variable.st_planning&(cooldown.pillar_of_frost.remains<3|talent.icecap)
actions.covenants+=/shackle_the_unworthy,if=variable.adds_remain
actions.covenants+=/fleshcraft,if=!buff.pillar_of_frost.up&!buff.breath_of_sindragosa.up&(soulbind.pustule_eruption|soulbind.volatile_solvent),interrupt_immediate=1,interrupt_global=1,interrupt_if=soulbind.volatile_solvent
# Obliteration rotation
actions.obliteration=remorseless_winter,if=active_enemies>=3&variable.rw_buffs
actions.obliteration+=/howling_blast,if=!buff.killing_machine.up&rune>=3&(buff.rime.remains<3&buff.rime.up|active_dot.frost_fever<active_enemies)
actions.obliteration+=/glacial_advance,if=!buff.killing_machine.up&spell_targets.glacial_advance>=2|!buff.killing_machine.up&(debuff.razorice.stack<5|debuff.razorice.remains<gcd*4)
actions.obliteration+=/frostscythe,if=buff.killing_machine.react&spell_targets.frostscythe>2&!variable.deaths_due_active
actions.obliteration+=/obliterate,cycle_targets=1,if=buff.killing_machine.react
actions.obliteration+=/frost_strike,if=active_enemies=1&variable.frost_strike_conduits
actions.obliteration+=/howling_blast,if=variable.rotfc_rime&spell_targets.howling_blast>=2
actions.obliteration+=/glacial_advance,if=spell_targets.glacial_advance>=2
actions.obliteration+=/frost_strike,cycle_targets=1,if=!talent.avalanche&!buff.killing_machine.up|talent.avalanche&!variable.rotfc_rime|variable.rotfc_rime&rune.time_to_2>=gcd
actions.obliteration+=/howling_blast,if=variable.rotfc_rime
actions.obliteration+=/obliterate,cycle_targets=1
# Pooling For Obliteration: Starts 10 seconds before Pillar of Frost comes off CD
actions.obliteration_pooling=remorseless_winter,if=variable.rw_buffs|active_enemies>=2
actions.obliteration_pooling+=/glacial_advance,if=spell_targets.glacial_advance>=2&talent.frostscythe
actions.obliteration_pooling+=/frostscythe,if=buff.killing_machine.react&active_enemies>2&!variable.deaths_due_active
actions.obliteration_pooling+=/obliterate,cycle_targets=1,if=buff.killing_machine.react
actions.obliteration_pooling+=/frost_strike,if=active_enemies=1&variable.frost_strike_conduits
actions.obliteration_pooling+=/obliterate,cycle_targets=1,if=buff.killing_machine.react
actions.obliteration_pooling+=/howling_blast,if=variable.rotfc_rime
actions.obliteration_pooling+=/glacial_advance,if=spell_targets.glacial_advance>=2&runic_power.deficit<60
actions.obliteration_pooling+=/frost_strike,cycle_targets=1,if=runic_power.deficit<70
actions.obliteration_pooling+=/obliterate,cycle_targets=1,if=rune>=3
actions.obliteration_pooling+=/frostscythe,if=active_enemies>=4&!variable.deaths_due_active
# Racial Abilities
actions.racials=blood_fury,if=buff.pillar_of_frost.up
actions.racials+=/berserking,if=buff.pillar_of_frost.up
actions.racials+=/arcane_pulse,if=(!buff.pillar_of_frost.up&active_enemies>=2)|!buff.pillar_of_frost.up&(rune.deficit>=5&runic_power.deficit>=60)
actions.racials+=/lights_judgment,if=buff.pillar_of_frost.up
actions.racials+=/ancestral_call,if=buff.pillar_of_frost.up&buff.empower_rune_weapon.up
actions.racials+=/fireblood,if=buff.pillar_of_frost.remains<=8&buff.pillar_of_frost.up&buff.empower_rune_weapon.up
actions.racials+=/bag_of_tricks,if=buff.pillar_of_frost.up&active_enemies=1&(buff.pillar_of_frost.remains<5&talent.cold_heart.enabled|!talent.cold_heart.enabled&buff.pillar_of_frost.remains<3)
# Standard single-target rotation
actions.standard=remorseless_winter,if=variable.rw_buffs
actions.standard+=/obliterate,if=buff.killing_machine.react
actions.standard+=/howling_blast,if=variable.rotfc_rime&buff.rime.remains<3
actions.standard+=/frost_strike,if=variable.frost_strike_conduits
actions.standard+=/glacial_advance,if=!death_knight.runeforge.razorice&(debuff.razorice.stack<5|debuff.razorice.remains<gcd*4)
actions.standard+=/frost_strike,if=cooldown.remorseless_winter.remains<=2*gcd&talent.gathering_storm
actions.standard+=/howling_blast,if=variable.rotfc_rime
actions.standard+=/frost_strike,if=runic_power.deficit<(15+talent.runic_attenuation*5)
actions.standard+=/obliterate,if=!buff.frozen_pulse.up&talent.frozen_pulse|variable.deaths_due_active&buff.deaths_due.stack<4|talent.gathering_storm&buff.remorseless_winter.up|runic_power.deficit>(25+talent.runic_attenuation*5)
actions.standard+=/frost_strike
actions.standard+=/horn_of_winter
actions.standard+=/arcane_torrent
# Trinkets
actions.trinkets=inscrutable_quantum_device,if=buff.pillar_of_frost.up|target.time_to_pct_20<5|boss&fight_remains<21
# The trinket with the highest estimated value, will be used first and paired with Pillar of Frost.
actions.trinkets+=/trinket1,if=!variable.specified_trinket&buff.pillar_of_frost.up&(!talent.icecap|talent.icecap&buff.pillar_of_frost.remains>=10)&(!trinket.2.has_cooldown|trinket.2.cooldown.remains|variable.trinket_priority=1)|trinket.1.buff_duration>=fight_remains
actions.trinkets+=/trinket2,if=!variable.specified_trinket&buff.pillar_of_frost.up&(!talent.icecap|talent.icecap&buff.pillar_of_frost.remains>=10)&(!trinket.1.has_cooldown|trinket.1.cooldown.remains|variable.trinket_priority=2)|trinket.2.buff_duration>=fight_remains
# If only one on use trinket provides a buff, use the other on cooldown. Or if neither trinket provides a buff, use both on cooldown.
actions.trinkets+=/trinket1,if=!trinket.1.has_use_buff&(trinket.2.cooldown.remains|!trinket.2.has_use_buff)|cooldown.pillar_of_frost.remains>20
actions.trinkets+=/trinket2,if=!trinket.2.has_use_buff&(trinket.1.cooldown.remains|!trinket.1.has_use_buff)|cooldown.pillar_of_frost.remains>20