Cogspark Works · Rotation
Protection Paladin
The priority list SimulationCraft plays this spec with · engine build 20261019-1860cd1-w8a2c73d · game data 12.1.5.70448
§1How to read this
A rotation in SimulationCraft is a priority list, not a sequence. Every time the character can act, the sim starts at the top of The main loop and does the first line whose conditions hold. Lower lines only happen when nothing above them fits.
- The page shows the list as a decision tree: set what you know about the fight and your talents, and it lights the lists the sim checks, in order.
- Cast lines use the ability. Hover, focus or tap an icon or a name for its tooltip.
- Go through another list: its lines are checked in order; when none of them fits, the sim comes back and carries on with the next line here.
- Switch to another list: the rest of this list is skipped and the choice is made from that list alone.
- Helpers are values the list works out on the spot, such as “are we holding a cooldown”. Setting one takes no time and the list carries on. The tree works out the ones your situation settles.
The list is written to perform well in the sim, not to be the only right way to play. Every line keeps its original simc text under the simc toggle at its right, and the list author’s note where there is one.
§2Decision tree
Set what you know. The tree lights the lists the sim checks, top to bottom; in each list it presses the first ability whose conditions hold and that is ready. Readiness (cooldowns, resources) isn’t in the list, so a lit ability is the first one allowed, not a promise it is cast.
- The main loop
- Trinkets
Before the pull, done once before the fight starts (17 steps)
Before the pull17 lines
- Cast Rite of Sanctification
simc
rite_of_sanctification - Cast Rite of Adjuration
simc
rite_of_adjuration - Record your stats before the pull (sim bookkeeping)
simc
snapshot_stats - Cast Devotion Aura
simc
devotion_aura - Set trinket 1 buffs to true when the following holds, otherwise falsetrinket 1 has an on-use effect that grants a stat buff
simc
variable,name=trinket_1_buffs,value=trinket.1.has_use_buff - Set trinket 2 buffs to true when the following holds, otherwise falsetrinket 2 has an on-use effect that grants a stat buff
simc
variable,name=trinket_2_buffs,value=trinket.2.has_use_buff - Set trinket 1 duration to 0 when the following holds, otherwise to trinket 1's stat buff's durationnever
simc
variable,name=trinket_1_duration,op=setif,value=0,value_else=trinket.1.proc.any_dps.duration,condition=0 - Set trinket 2 duration to 0 when the following holds, otherwise to trinket 2's stat buff's durationnever
simc
variable,name=trinket_2_duration,op=setif,value=0,value_else=trinket.2.proc.any_dps.duration,condition=0 - Set trinket 1 high value to 3 when the following holds, otherwise to 1trinket 1 is Voracious Heart of Ulatek
simc
variable,name=trinket_1_high_value,op=setif,value=3,value_else=1,condition=trinket.1.is.voracious_heart_of_ulatek - Set trinket 2 high value to 3 when the following holds, otherwise to 1trinket 2 is Voracious Heart of Ulatek
simc
variable,name=trinket_2_high_value,op=setif,value=3,value_else=1,condition=trinket.2.is.voracious_heart_of_ulatek - Set trinket 1 sync to 1 when the following holds, otherwise to 0.5all of these:
- trinket 1 buffs is true
- the remainder of trinket 1's cooldown divided by Avenging Wrath's cooldown is 0
simc
variable,name=trinket_1_sync,op=setif,value=1,value_else=0.5,condition=variable.trinket_1_buffs&trinket.1.cooldown.duration%%cooldown.avenging_wrath.duration=0 - Set trinket 2 sync to 1 when the following holds, otherwise to 0.5all of these:
- trinket 2 buffs is true
- the remainder of trinket 2's cooldown divided by Avenging Wrath's cooldown is 0
simc
variable,name=trinket_2_sync,op=setif,value=1,value_else=0.5,condition=variable.trinket_2_buffs&trinket.2.cooldown.duration%%cooldown.avenging_wrath.duration=0 - Set trinket priority to 2 when the following holds, otherwise to 1any of these:
- all of these:
- trinket 1 buffs is false
- trinket 2 buffs is true
- any of these:
- trinket 2 has a cooldown
- trinket 1 has no cooldown
- all of these:
- trinket 2 buffs is true
- trinket 2's cooldown divided by trinket 2 duration times (1.5 plus (1 if trinket 2 can grant Strength, else 0)) times trinket 2 sync times trinket 2 high value times (1 plus ((trinket 2's item level minus trinket 1's item level) divided by 100)) is more than trinket 1's cooldown divided by trinket 1 duration times (1.5 plus (1 if trinket 1 can grant Strength, else 0)) times trinket 1 sync times trinket 1 high value times (1 plus ((trinket 1's item level minus trinket 2's item level) divided by 100))
simc
variable,name=trinket_priority,op=setif,value=2,value_else=1,condition=!variable.trinket_1_buffs&variable.trinket_2_buffs&(trinket.2.has_cooldown|!trinket.1.has_cooldown)|variable.trinket_2_buffs&((trinket.2.cooldown.duration%variable.trinket_2_duration)*(1.5+trinket.2.has_buff.strength)*(variable.trinket_2_sync)*(variable.trinket_2_high_value)*(1+((trinket.2.ilvl-trinket.1.ilvl)%100)))>((trinket.1.cooldown.duration%variable.trinket_1_duration)*(1.5+trinket.1.has_buff.strength)*(variable.trinket_1_sync)*(variable.trinket_1_high_value)*(1+((trinket.1.ilvl-trinket.2.ilvl)%100))) - all of these:
- Set damage trinket priority to 2 when the following holds, otherwise to 1all of these:
- trinket 1 buffs is false
- trinket 2 buffs is false
- trinket 2's item level is at least trinket 1's item level
simc
variable,name=damage_trinket_priority,op=setif,value=2,value_else=1,condition=!variable.trinket_1_buffs&!variable.trinket_2_buffs&trinket.2.ilvl>=trinket.1.ilvl - Drink a potion if your potion is Liquid Luster
simc
potion,pre_pot_time=8,if=potion.liquid_luster - Cast Consecration
simc
consecration - Cast Holy Armaments if
next_armamentisholy_bulwarksimc
holy_armaments,if=next_armament=holy_bulwark
The main loop24 lines
- Start auto-attacking
simc
auto_attack go through Trinkets, then carry on below if nothing there fits
simc
call_action_list,name=trinketsTrinkets5 lines
- Set cds active to true when the following holds, otherwise falseall of these:Trinkets
- Avenging Wrath is active
- Avenging Wrath has more than 5 s left
simc
variable,name=cds_active,value=buff.avenging_wrath.up&buff.avenging_wrath.remains>5 - Use your trinket 1 if trinket 1 buffs is true and (trinket priority is 1 or trinket 2 buffs is false or trinket 2 has no cooldown or (trinket 2 buffs is true and trinket 2 is on cooldown)) and ((trinket 1's on-use cast time is more than 0 s and trinket 1's on-use cast time is more than the cooldown left on Avenging Wrath) or (trinket 1's on-use cast time is 0 s and cds active is true))
simc
use_item,slot=trinket1,if=variable.trinket_1_buffs&(variable.trinket_priority=1|!variable.trinket_2_buffs|!trinket.2.has_cooldown|variable.trinket_2_buffs&trinket.2.cooldown.remains)&(trinket.1.cast_time>0&trinket.1.cast_time>cooldown.avenging_wrath.remains|trinket.1.cast_time=0&variable.cds_active) - Use your trinket 2 if trinket 2 buffs is true and (trinket priority is 2 or trinket 1 buffs is false or trinket 1 has no cooldown or (trinket 1 buffs is true and trinket 1 is on cooldown)) and ((trinket 2's on-use cast time is more than 0 s and trinket 2's on-use cast time is more than the cooldown left on Avenging Wrath) or (trinket 2's on-use cast time is 0 s and cds active is true))
simc
use_item,slot=trinket2,if=variable.trinket_2_buffs&(variable.trinket_priority=2|!variable.trinket_1_buffs|!trinket.1.has_cooldown|variable.trinket_1_buffs&trinket.1.cooldown.remains)&(trinket.2.cast_time>0&trinket.2.cast_time>cooldown.avenging_wrath.remains|trinket.2.cast_time=0&variable.cds_active) - Use your trinket 1 if trinket 1 buffs is false and (trinket 2 has no cooldown or trinket 2 is on cooldown or trinket 2 buffs is false) and (damage trinket priority is 1 or trinket 2 is on cooldown)
simc
use_item,slot=trinket1,if=!variable.trinket_1_buffs&(!trinket.2.has_cooldown|trinket.2.cooldown.remains|!variable.trinket_2_buffs)&(variable.damage_trinket_priority=1|trinket.2.cooldown.remains) - Use your trinket 2 if trinket 2 buffs is false and (trinket 1 has no cooldown or trinket 1 is on cooldown or trinket 1 buffs is false) and (damage trinket priority is 2 or trinket 1 is on cooldown)
simc
use_item,slot=trinket2,if=!variable.trinket_2_buffs&(!trinket.1.has_cooldown|trinket.1.cooldown.remains|!variable.trinket_1_buffs)&(variable.damage_trinket_priority=2|trinket.1.cooldown.remains)
- Drink a potion if your potion is Liquid Luster and Avenging Wrath comes off cooldown within 8 s
simc
potion,if=potion.liquid_luster&cooldown.avenging_wrath.remains<8 - Drink a potion if your potion isn't Liquid Luster and (Avenging Wrath is active or Avenging Wrath is off cooldown)
simc
potion,if=!potion.liquid_luster&(buff.avenging_wrath.up|cooldown.avenging_wrath.up) - Cast Ardent Defender if you have Eye for an Eye talented
simc
ardent_defender,if=talent.eye_for_an_eye - Set wants to hammer to true when the following holds, otherwise falseall of these:Used without waiting for the global cooldown
- Hammer Of Light Ready is active
- Judgment is active on the target
- any of these:
- Undisputed Ruling has at most 1.8 s left, or isn't active
- Hammer Of Light Ready has less than 5 s left, or isn't active
simc
variable,use_off_gcd=1,name=wants_to_hammer,value=buff.hammer_of_light_ready.up&debuff.judgment.up&(buff.undisputed_ruling.remains<=1.8|buff.hammer_of_light_ready.remains<5) - Cast Holy Armaments if Avenging Wrath comes off cooldown within one global cooldown or
time_to_dieis less than 30 or Holy Armaments has exactly 2 chargessimc
holy_armaments,if=cooldown.avenging_wrath.remains<=gcd|time_to_die<30|charges=2 - Cast Fireblood if Avenging Wrath is active
simc
fireblood,if=buff.avenging_wrath.up - Cast Avenging Wrath
simc
avenging_wrath - Cast Divine Toll if Avenging Wrath is active or you don't have tier 3 of your apex talent talented
simc
divine_toll,if=buff.avenging_wrath.up|!apex.3 - Cast Hammer of Light if wants to hammer is true
simc
hammer_of_light,if=variable.wants_to_hammer - Cast Shield of the Righteous if ((you don't have Instrument of the Divine talented and Divine Guidance has fewer than 5 stacks) or you have exactly 5 Holy Power or (Valor isn't active and Divine Purpose isn't active)) and (wants to hammer is false or your last spell on the global cooldown was Divine Toll)
simc
shield_of_the_righteous,if=(!talent.instrument_of_the_divine&buff.divine_guidance.stack<5|holy_power=5|!buff.valor.up&!buff.divine_purpose.up)&(!variable.wants_to_hammer|prev_gcd.1.divine_toll) - Cast Hammer of Wrath if Hammer of Wrath is fully recharged within one global cooldown or (Hammer Of Light Ready is active and Judgment isn't active on the target)
simc
hammer_of_wrath,if=full_recharge_time<=gcd|buff.hammer_of_light_ready.up&!debuff.judgment.up - Cast Judgment if Judgment is fully recharged within one global cooldown or (Hammer Of Light Ready is active and Judgment isn't active on the target)
simc
judgment,if=full_recharge_time<=gcd|buff.hammer_of_light_ready.up&!debuff.judgment.up - Cast Avenger's Shield if Vanguard is active or (Avenging Wrath is active and you have tier 3 of your apex talent talented)
simc
avengers_shield,if=buff.vanguard.up|(buff.avenging_wrath.up&apex.3) - Cast Consecration if Divine Guidance has 5 or more stacks or not
consecration.upsimc
consecration,if=buff.divine_guidance.stack>=5|!consecration.up - Cast Hammer of Wrath
simc
hammer_of_wrath - Cast Judgment
simc
judgment - Cast Avenger's Shield
simc
avengers_shield - Cast Blessed Hammer
simc
blessed_hammer - Cast Hammer of the Righteous
simc
hammer_of_the_righteous - Cast Arcane Torrent
simc
arcane_torrent - Cast Word of Glory if Shining Light Free is active and Divine Purpose isn't active
simc
word_of_glory,if=buff.shining_light_free.up&!buff.divine_purpose.up - Cast Consecration
simc
consecration
Read from ActionPriorityLists/default/paladin_protection.simc in simulationcraft/simc at 1860cd1d5763, the commit this engine build runs.
Blizzard’s own suggestion system (the one-button rotation), as simc carries it. It is simpler than SimulationCraft’s list and is not what Cogspark simulates.
§2Decision tree
Set what you know. The tree lights the lists the sim checks, top to bottom; in each list it presses the first ability whose conditions hold and that is ready. Readiness (cooldowns, resources) isn’t in the list, so a lit ability is the first one allowed, not a promise it is cast.
- The main loop
- Cooldowns
- Assisted Combat
Before the pull, done once before the fight starts (1 steps)
Before the pull1 line
- Record your stats before the pull (sim bookkeeping)
simc
snapshot_stats
The main loop3 lines
- Start auto-attacking
simc
auto_attack go through Cooldowns, then carry on below if nothing there fits
simc
call_action_list,name=cooldownsCooldowns6 lines
- Use your trinketsSome cooldowns are not used by the Assisted Combat system. This simple default cooldown usage has been provided by simc.
simc
use_items - Drink a potion
simc
potion - Cast Blood Fury
simc
blood_fury - Cast Berserking
simc
berserking - Cast Fireblood
simc
fireblood - Cast Ancestral Call
simc
ancestral_call
go through Assisted Combat, then carry on below if nothing there fits
simc
call_action_list,name=assisted_combatAssisted Combat17 lines
- Cast Avenging WrathThis is the default action priority list from the game's Assisted Combat system. This is for Blizzard automation and is not included in the game's Assisted Combat system.
simc
avenging_wrath - Cast SentinelThis is for Blizzard automation and is not included in the game's Assisted Combat system.
simc
sentinel - Cast Divine Toll
simc
divine_toll - Cast Shield of the Righteous if Shield of the Righteous isn't active and Hammer Of Light Ready isn't activeDo not use SotR if Hammer of Light is ready, the One Button Rotation doesn't, either.
simc
shield_of_the_righteous,if=buff.shield_of_the_righteous.down&!buff.hammer_of_light_ready.up - Cast Shield of the Righteous if your health is at or above 40% and Hammer Of Light Ready isn't activeDo not use SotR if Hammer of Light is ready, the One Button Rotation doesn't, either.
simc
shield_of_the_righteous,if=health.pct>=40&!buff.hammer_of_light_ready.up - Cast Avenger's Shield
simc
avengers_shield - Cast Hammer of Wrath
simc
hammer_of_wrath - Cast Judgment
simc
judgment - Cast Consecration if not
consecration.up(Overridden from 'buff.consecration.down')simc
consecration,if=!consecration.up - Cast Crusader Strike if your distance to the target is at most 5
simc
crusader_strike,if=target.distance<=5 - Cast Hammer of the Righteous if your distance to the target is at most 5
simc
hammer_of_the_righteous,if=target.distance<=5 - Cast Blessed Hammer if your distance to the target is at most 5
simc
blessed_hammer,if=target.distance<=5 - Cast Templar Slash if your distance to the target is at most 5
simc
templar_slash,if=target.distance<=5 - Cast Templar Strike if your distance to the target is at most 5
simc
templar_strike,if=target.distance<=5
Read from ActionPriorityLists/assisted_combat/paladin_protection.simc in simulationcraft/simc at 1860cd1d5763, the commit this engine build runs.