View RSS Feed

Blogenstein

Maths of Pandaria - Affliction Warlock: Rotation

Rating: 3 votes, 5.00 average.
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.

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
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.

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.

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
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.

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.

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
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+=/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
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+=/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
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+=/drain_soul,interrupt=1,chain=1,if=target.health.pct<=20
actions+=/life_tap,if=mana.pct<35
actions+=/malefic_grasp,chain=1
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+=/life_tap,moving=1,if=mana.pct<80&mana.pct<target.health.pct
actions+=/fel_flame,moving=1
actions+=/life_tap
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.

So everything looks fairly straight forward, and I understand the rotation a bit better now. So lets put that into a list, shall we?
  1. IF Soulburn is up, use Soul Swap
  2. IF you have one or more Soul Shards THEN
    1. IF Haunt is not active on the target, will expire before a new cast hits, or is not travelling to the target, cast Haunt
  3. IF Dark Soul is up AND you have Soul Shard(s) available THEN cast Soulburn once per Dark Soul use.
  4. 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
  5. IF Agony has less than half the duration remaining, cast Agony
  6. IF Corruption has less than half the duration remaining, cast Corruption
  7. IF Unstable Affliction has less than half the duration remaining, cast Unstable Affliction
  8. IF target health is less than 20% AND no higher priority actions can be carried out THEN cast Drain Soul
  9. IF Mana is less than 35% THEN cast Life Tap
  10. IF Moving
    1. IF Mana is less than 80% AND Mana percentage is less than targets health percentage THEN cast Life Tap
    2. Cast Fel Flame
  11. Cast Malefic Grasp
  12. Cast Life Tap
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.

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.

Submit "Maths of Pandaria - Affliction Warlock: Rotation" to Google

Comments

  1. CaseyTheRetard's Avatar
    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.
    Since all sources of haste are multiplicative, it's best to stack multiple buffs when it's possible to do so without interference from the 1-second minimum GCD. IIRC, Elemental is the only spec that casts a significant number of single-GCD abilities (Lava Burst) that don't scale with haste somehow regardless of cast time (i.e., dots get additional ticks). The fact that changes to haste don't affect currently ticking dots has nothing to do with it.

    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.
    shard_react and miss_react aren't being added in the expression: they don't affect WHEN haunt is cast, they qualify IF haunt can be cast.

    Code:
    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
    ...otherwise will cast it if any of the affected dots are at less than 2 ticks remaining and the target is above 20% health.
    I assume the "above 20%" here is a typo, and you probably understand it should be below 20%. Significantly, that line does not say "less than 2 ticks remaining" it says "ticks remaining are less than half the number of ticks from a fresh dot application" which is the condition for the level 90 passive Pandemic. The same comment applies to your discussion of the Agony/Corruption/UA actions.

    Nitpicks aside, this really is an excellent description of what a Simulationcraft action list is doing and why.
  2. Binkenstein's Avatar
    Quote Originally Posted by CaseyTheRetard
    Since all sources of haste are multiplicative, it's best to stack multiple buffs when it's possible to do so without interference from the 1-second minimum GCD. IIRC, Elemental is the only spec that casts a significant number of single-GCD abilities (Lava Burst) that don't scale with haste somehow regardless of cast time (i.e., dots get additional ticks). The fact that changes to haste don't affect currently ticking dots has nothing to do with it.


    shard_react and miss_react aren't being added in the expression: they don't affect WHEN haunt is cast, they qualify IF haunt can be cast.


    I assume the "above 20%" here is a typo, and you probably understand it should be below 20%. Significantly, that line does not say "less than 2 ticks remaining" it says "ticks remaining are less than half the number of ticks from a fresh dot application" which is the condition for the level 90 passive Pandemic. The same comment applies to your discussion of the Agony/Corruption/UA actions.

    Nitpicks aside, this really is an excellent description of what a Simulationcraft action list is doing and why.
    Fixed the typo, getting an explanation of the add_ticks function.

    However, there are many classes that have regular GCD based spells. Frost Mages have Ice Lance, Fire has instant Pyroblasts (and there are the mage bombs). Also, if you stack two 30% haste buffs and the raid wide 5%, you're only ~12% away from being at 100% haste, which hits a lot more spells (Frostbolt, Wrath, Arcane Blast, etc). Perhaps I should state "haste percentage buffs" as rating buffs are never going to be high enough to cause this sort of stacking issue.
  3. CaseyTheRetard's Avatar
    However, there are many classes that have regular GCD based spells. Frost Mages have Ice Lance, Fire has instant Pyroblasts (and there are the mage bombs). Also, if you stack two 30% haste buffs and the raid wide 5%, you're only ~12% away from being at 100% haste, which hits a lot more spells (Frostbolt, Wrath, Arcane Blast, etc). Perhaps I should state "haste percentage buffs" as rating buffs are never going to be high enough to cause this sort of stacking issue.
    Mea culpa, I should have said "That I can think of right now" instead of "IIRC" - or simply made the claim for the dot specs (Shadow/Affliction/Balance) about which I was thinking. Affliction in particular is very safe with its 4-second and 12-second channeled fillers.

    "add_ticks" is the number of additional ticks by which the dot would be extended if it was reapplied with the current level of haste and no clipping occurred, approximately base_tick_number * (1 + haste) but with the complicated rounding the game engine does for tick intervals.
    Updated 31-10-2012 at 08:56 PM by CaseyTheRetard (I English good.)
  4. jejanim's Avatar
    The priority list you just created by interpreting those code lines tells me to use haunt whenever I have soul shards (let's ignore the 1 SB:SS cast during DS).

    This leads me to the point where DS is off cd and I have no shards available.


    I'm currently running more or less the same priority with one difference. At the start of the fight I pop DS and SB:SS the target with haunt. So two shards are gone. Let's assume not a single nightfall proc happens between the time I bring my corruption to the target and the time all my dots that are affected by the haste buff from DS are refreshed (e.g. normal condition dots). I will end up with zero shards.

    If those buffed dots are gone, I stop using Haunt until I have a nightfall proc that lets my shard counter reach four. This means I'm always carrying around three shards to be ready for DS (one shard (SB:SS) to buff all my dots simultaneously, one shard for haunt and another one for a subsequent one or even another SB:SS to maintain a higher uptime of haste-buffed dots)) and burning the fourth just to prevent shard overflow.

    What do you think?
  5. Binkenstein's Avatar
    Quote Originally Posted by jejanim
    The priority list you just created by interpreting those code lines tells me to use haunt whenever I have soul shards (let's ignore the 1 SB:SS cast during DS).

    This leads me to the point where DS is off cd and I have no shards available.


    I'm currently running more or less the same priority with one difference. At the start of the fight I pop DS and SB:SS the target with haunt. So two shards are gone. Let's assume not a single nightfall proc happens between the time I bring my corruption to the target and the time all my dots that are affected by the haste buff from DS are refreshed (e.g. normal condition dots). I will end up with zero shards.

    If those buffed dots are gone, I stop using Haunt until I have a nightfall proc that lets my shard counter reach four. This means I'm always carrying around three shards to be ready for DS (one shard (SB:SS) to buff all my dots simultaneously, one shard for haunt and another one for a subsequent one or even another SB:SS to maintain a higher uptime of haste-buffed dots)) and burning the fourth just to prevent shard overflow.

    What do you think?
    I don't know. Throw it into the SimCraft rotation and see if it's a DPS increase?
Leave Comment Leave Comment

Trackbacks

Total Trackbacks 0
Trackback URL:
Powered byvBSocial.com and MMORPG