Maths of Pandaria - Affliction Warlock: Rotation
by, 29-10-2012 at 11:15 PM (8758 Views)
This is both an exercise in learning more about other spellcasters for myself & producing something useful for players. Iím going to alternate between Mage & Warlock specs.
In order to avoid completely re-inventing the wheel, Iím going to start off looking at the rotation used in SimCraft, running through what each step does and why itís there.
First up is Dark Soul, a 20 second 30% haste buff. Usual haste buff stacking behavior is to avoid stacking multiple buffs, but because haste effects are not recalculated for DoTs, itís better to stack haste effects than not stack them.Code:actions+=/dark_soul actions+=/service_pet,if=talent.grimoire_of_service.enabled actions+=/grimoire_of_sacrifice,if=talent.grimoire_of_sacrifice.enabled actions+=/summon_pet,if=talent.grimoire_of_sacrifice.enabled&buff.grimoire_of_sacrifice.down actions+=/run_action_list,name=aoe,if=active_enemies>3 actions+=/summon_doomguard
The next three lines deal with two of the level 75 talents, Grimoire of Sacrifice (50% bonus to Drain Soul, Fel Flame, Haunt & Malefic Grasp) & Grimoire of Service. If Service is selected, it will summon the second demon. If Sacrifice is enabled, it will sacrifice the pet, and summon one if the Sacrifice buff is down.
The last two lines deal with switching to the AoE rotation if there are more than three targets, and summoning your Doomguard.
Soul Swap is used when Soulburn is up (which is controlled by an action further down the list) to apply [spell=131737]Agony, Corruption & Unstable Affliction in one action.Code:actions+=/soul_swap,if=buff.soulburn.up actions+=/haunt,if=!in_flight_to_target&remains<tick_time+travel_time+cast_time&shard_react&miss_react
Haunt is cast if the spell isnít already travelling to the target or if the remaining tick time is less than the total of one tick + cast time + shard generation reaction time + miss reaction time. This is so that if Haunt isnít on the target, or is going to expire shortly it will be recast. It also handles the fact that it might miss & need to be recast, and reacting to going from 0 to 1 soul shards.
These two entries handle multi-target behaviour: Soul Swap copying dots to additional targets via Glyph of Soul Swap and casting multiple Haunt if your soul shard count is greater than one. Note: this section is not optimised, as multi-target actions have not been refined.Code:actions+=/soul_swap,cycle_targets=1,if=active_enemies>1&time<10&glyph.soul_swap.enabled actions+=/haunt,cycle_targets=1,if=!in_flight_to_target&remains<tick_time+travel_time+cast_time&soul_shard>1&miss_react
For Soulburn, it is only cast once while the Dark Soul buff is up, otherwise will cast it if any of the affected dots are at less than half of the ticks for a single DoT (this is due to [spell=131973]Pandemic[/url]) which can be viewed as half of the duration, and the target is under 20% health.Code:actions+=/soulburn,line_cd=20,if=buff.dark_soul.up&shard_react actions+=/soulburn,if=(dot.unstable_affliction.ticks_remain<action.unstable_affliction.add_ticks%2|dot.corruption.ticks_remain<action.corruption.add_ticks%2|dot.agony.ticks_remain<action.agony.add_ticks%2)&target.health.pct<=20&shard_react
Agony, Corruption & Unstable Affliction are handled here. Each will be recast if the tick count remaining is less than half of the ticks/duration for a single cast remaining, as per the Soulburn section earlier, with various time-to-die checks, plus handling cycling through multiple targets & missing.Code:actions+=/agony,cycle_targets=1,if=ticks_remain<add_ticks%2&target.time_to_die>=8&miss_react actions+=/corruption,cycle_targets=1,if=ticks_remain<add_ticks%2&target.time_to_die>=6&miss_react actions+=/unstable_affliction,cycle_targets=1,if=ticks_remain<add_ticks%2+1&target.time_to_die>=5&miss_react
This section handles the filler actions. Drain Soul & Malefic Grasp are used below/above 20% target health. Both spells are recast with 1 tick remaining to take advantage of the channel/dot recasting behavior where the next tick occurs before starting the new spell. Drain Soul has an interrupt flag on it so the 12 second channel is interrupted if something higher in the action list can be used. A Life Tap use under 35% mana is between the two of them, so that youíre pushed above 35% mana before using Malefic Grasp.Code:actions+=/drain_soul,interrupt=1,chain=1,if=target.health.pct<=20 actions+=/life_tap,if=mana.pct<35 actions+=/malefic_grasp,chain=1
The last section involved movement actions. If youíre moving and your mana is below both 80% and the targets health %, use Life Tap. Otherwise, use Fel Flame if moving, or Life Tap if you canít do anything else.Code:actions+=/life_tap,moving=1,if=mana.pct<80&mana.pct<target.health.pct actions+=/fel_flame,moving=1 actions+=/life_tap
So everything looks fairly straight forward, and I understand the rotation a bit better now. So lets put that into a list, shall we?
Cooldowns should all be used as they come up, and pet should be summoned when they arenít out except for Grimoire of Sacrifice users who only need to summon pets when their buff isnít up.
- IF Soulburn is up, use Soul Swap
- IF you have one or more Soul Shards THEN
- IF Haunt is not active on the target, will expire before a new cast hits, or is not travelling to the target, cast Haunt
- IF Dark Soul is up AND you have Soul Shard(s) available THEN cast Soulburn once per Dark Soul use.
- IF Agony OR Corruption OR Unstable Affliction has less than half of the duration remaining AND you have Soul Shards available AND the target is under 20% health THEN cast Soulburn
- IF Agony has less than half the duration remaining, cast Agony
- IF Corruption has less than half the duration remaining, cast Corruption
- IF Unstable Affliction has less than half the duration remaining, cast Unstable Affliction
- IF target health is less than 20% AND no higher priority actions can be carried out THEN cast Drain Soul
- IF Mana is less than 35% THEN cast Life Tap
- IF Moving
- IF Mana is less than 80% AND Mana percentage is less than targets health percentage THEN cast Life Tap
- Cast Fel Flame
- Cast Malefic Grasp
- Cast Life Tap
The rotational structure is similar to the one I built for Elemental: Handle cooldowns first then run through the remaining spells in order of damage/execute time. The only one that stands out as different from this is Haunt, which could be because of the bonus damage effect. However, it makes more sense for this to be applied after all the DoTs are up, but before other casts like Drain Soul. Iíll do some experimentation with Haunts position and update this when Iíve confirmed the change (or not, as the case may be).
The next task will be running simulations to generate stat weights & plots.
Total Trackbacks 0