Sunday, March 9, 2014

[WoW] Right in the Heals

Rather than digging into Enhancement Shaman talents like I had planned, Blizzard dropped us a Dev Watercooler on healing in Warlords of Draenor, and wow was there a lot of information in there. The backlash was also pretty epic. But why?

The things Blizzard announced break down as follows:
  • Doubling of health pools and monster damage, but not doubling healer throughput
  • Toning down absorbs
  • Making “smart” heals dumber
  • Reducing the efficiency of AoE heals, either by potency or by cost
  • Removing the “auto-attack” heals
  • Increasing base mana regen and reducing scaling
  • Adding cast times to the majority of instant heals

That is a lot of changes, and how they interact to create a bigger picture--along with other information Blizzard has already announced--isn’t necessarily obvious. My opinion on most of these changes is largely based on PvE.

Doubling Health Pools and Monster Damage, but Not Healer Throughput


Ignoring the changes with respect to PvP, doubling monster health and player health isn’t really that interesting by itself. Do remember that this is after the squish, so if someone had 15,000 health after the squish, they’ll have 30,000 after the squish and this change.

However, when taken in concert with not doubling healer throughput, it means that we’ll take more heals to get a bar from say, 30% to full. And that’s a good thing: the developers can have more play with incidental damage and don’t need to spike the tank to death. I have logs from our initial attempts at Iron Juggernaut where our tank went from 750k health to dead in 3 seconds. As primary tank healer, when I have lag spikes the tank often dies. We had similar issues on some bosses like Horridon in ToT.

Could we play better? Absolutely. Could the tank have more stamina? Yes please. We were still learning the encounter, but it was supremely frustrating to watch a tank go down in two globals. That’s bordering on Wrath of the Lich King where as a Holy Paladin I would do literally nothing but spam Holy Light on the main tank and hope to whatever deity of the Internet you want to pray to that I wouldn't lag spike while they were main tanking.

A single Divine Light crit hits for 300k+ from my Holy Paladin right now, without Avenging Wrath. Once you include the 25% shield for my Mastery, it comes to 375k of effective healing. Basically, I can do about a third of a tank’s health in one spell. That means to challenge me for spike damage, the tank needs to take more than 33% of his health per cast. That still ignores the tank’s active mitigation, the other healers, and any HoTs (or shields) I may have already rolling on him, so it really ends up being hit for a lot more. Not fun.

Compare that to the first couple tiers of Cataclysm, where it took about four or five boss swings before the tank would be dead. It turns the game from a reflex game to a longer-term thinking game, assuming you cannot ignore mana. It allows tanks (and other players) to sit somewhere between 0% and 100% for longer than a GCD, allowing once again for triage.

Toning Down Absorbs


Similar to above, absorbs are incredibly powerful. Tanks (mostly) die from spike damage, and absorbs smooth that damage out. Absorbs are basically healing damage before it occurs. If you’re Disc, today you still need to be smart about who you’re applying shields to, whereas Paladins just leave them everywhere they touch. But shields are the antithesis of triage healing. They prevent things like HoTs, and direct heals to an extent, from being effective, because the damage never really occurs. Toning down absorbs works in tandem with the previous point to ensure that folks can sit between 0% and 100% for longer than a GCD.

I almost wonder if they should retool Holy Paladin mastery. As much as I love having absorbs, I think they could change our Mastery to something else and still be okay. Perhaps change it to be like Cleave? That’d have issues where it’d be less useful on fights with lots of single target damage, but super powerful on a fight like Thok. Eh, I don’t know. But changing Holy Paladin Mastery would be a good step to reining in Absorbs.

Making “Smart” Heals Dumber


This one is rather interesting, for a couple reasons. The idea is rather than taking player health into account and healing the x targets with the least current health, a smart heal will just choose x targets who are injured any amount.

If you have a Healing Stream Totem and three players, one missing 1,000 health, another missing 5,000 health, and a third missing 15,000 health, today it would always target the one missing 15,000 health. In WoD, it would randomly pick one of those three targets.

The upside, according to Blizzard, is that we will supplement AoE with targeted heals to fill in the gaps. Basically, we cannot rely only on smart heals. Sometimes they’ll pick the right target, sometimes they’ll be useless. For a spell like Holy Radiance or Wild Growth, picking six targets means that you’re pretty likely to at least hit a few people who need the health now, especially if your targets are all at less than 100% health more often. You could still get screwed by bad RNG if Blizzard isn’t careful, though. It’s conceivable that three healers each use an AoE heal, and the one person who’s still at 25% health after the first tick because none of the heals touched him gets nailed and killed the next GCD.

The other upside here is a technical one. Smart heals today cause lag in raids, especially large raids where they may have to compare the health of all twenty-five raiders piled up together. By building a list of injured ones and choosing random ones rather than building a sorted list, they can reduce and/or avoid concurrency problems (especially if they decide to play loose with creating the list and not locking player health values while making the evaluation), and thus reduce the lag in large raids.

It’s an interesting question whether the technical reason prompted this and the healer philosophy was a happy side effect, or the other way around. Doesn’t really matter one way or the other, but as a developer myself I know that quite often technical limitations/optimizations must take precedence over user experience.

(Edit: See Rohan's and my conversation below. Basically, while I believe having no smart heals means less computational complexity, the bottleneck was and likely still is the number of healing events rather than the complexity of the healing events)

Reducing the Efficiency of AoE Heals, either by Potency or Cost


Hand-in-hand with the previous point, making people choose between single-target or multi-target heals is better than just always spamming your multi-target heals. Right now Holy Paladins basically use Holy Radiance in lieu of single-target heals because it’s not really much less efficient than Divine Light directly on the tank for Holy Power, thanks in part to Beacon of Light’s transfer. This isn’t ideal, because it means we’re making fewer decisions.

Rather, by either reducing the relative power of AoE heals, or making them cost more per point healed, they don’t automatically become our default heal. If they’re just as efficient as our single-target heals, why ever use the single-target? Dragon Soul and Siege of Orgrimmar both devolved into AoE spam-fests for the most part.

Removing the “Auto-Attack” Heals


Holy Light, Heal, Healing Wave, Nourish, etc. All gone. Honestly, they’re pretty well only used in earnest in the very first tier of play, and in the later tiers they’re basically used when we have nothing better to do. Heck, our mana regen currently is such that we can cast them for free. Boring.

In today’s healing climate, they give us a little buffer because if the tank takes a big hit, at least you had a heal already in progress. If players can sit at less than 100% health for an extended period of time, then having a low-cost, low-power heal doesn’t make much sense. Either cast the expensive, fast heal; the slow, big heal; or sit tight and let HoTs do their work.

Hooray, we get a button off our bars!

Increasing Base Mana Regen and Reducing Scaling


Remember Cataclysm? It sucked. Everything was really, really hard to start with. We were constantly running on fumes. Random heroics were a mess because the content was hard and we had to be really judicious with our mana with a bunch of folks who weren't prepared for the difficulty.

Increasing base mana regen allows folks with less gear to actually have some regen to deal with spending mistakes. The healing model in Cataclysm was fun (and largely mirrors the one announced for WoD), but that fun was completely trashed by the fact that the very little content we had at max level had a single difficulty: really hard. Between easier content to start with and the base mana regen increase, it should allow us to ease into the beginning of the expansion rather than struggle.

Remember the end of Cataclysm? The end of Mists? Between spirit and legendaries, everyone has so much mana regen that we can spam our biggest heals with impunity. Go check out Hamlet of EJ’s post on the Mana Economy. It’s extremely eye-opening as to just how crazy mana has gotten, taking into account spirit, cooldowns, trinkets, and the legendary metagem, you’re looking at nearly ~1.9 million effective mana over the course of a 6 minute fight.

With a reduction in mana regen scaling, it means the end of the expansion will look more like the beginning did. We’ll have a bit more mana to play with for more AoE heals, and more emergency throughput heals, but if Blizzard gets it right, we won’t be able to spam AoEs with impunity.

Adding Cast Times to the Majority of Instant Heals


This is the one I’m least convinced of as helping the healing model. Paladins and Shaman in particular already struggle with fights that require high amounts of movement (Tortos can go DIAF, thank you very much), while Druids and Monks can heal while performing backflips. This one seems primarily motivated by PvP (similarily with DPS also having their mobility reduced).

However, this should not reduce our total throughput. Before, you’d hit your instant heal, and have your 1.5 second GCD (reduced by haste). After, you’d hit your 1.5 second cast heal, and the GCD activates at the time the cast it started, so with haste they should end about the same time. Basically, we should be approximately GCD-limited still, rather than cast-limited. Rather, it’s just really annoying that we’re losing most of our instant heals. Well, except for Shaman. They only had Riptide to begin with.

Conclusion


If you were to take the above and compare it to the raiding environment today, you would rightly be severely concerned: this would be a huge nerf. However, keep in mind Blizzard will retune at least Siege of Orgrimmar to take these changes into account (and provide some good testing for the new model to boot), and further raids and dungeons will be designed with these changes in mind. As Lissana of Restokin said, "At some point, it’s like asking if a lime is a nerfed lemon just because its smaller."

Also keep in mind the other thing Blizzard announced: the new progression model. We’ll have normal mode 5-mans for all dungeons at level 100, with both LFR and Heroic 5-mans being valid methods of progression. Heroic 5-mans random queues will also be skill gated behind a Silver in the new Proving Grounds equivalent, so you won’t get thrown into a random group with a bunch of people who are incapable of playing at the skill level required--ignoring the fact that some may just not want to play at that level, but removing trolls from LFD is a different discussion with a different solution. As Ashunera of Wind Lashed said, "Cataclysm healing sucked because it was hard. This has very little to do with the healing style they aimed for."

For the most part, I think the changes are well-thought out and will bring fun back to healing. With enough content that isn’t just plain hard, I think we’ll have a model that gives us more leeway for planning and smart playing at high levels of difficulty, while allowing folks to continue playing without too many changes at the lower levels of difficulty. I’ll leave us with the following from Watcher:
#Expansion, #GoodDesign, #Healing, #WarlordsOfDraenor, #WoW

12 comments:

  1. I'm optimistic about it but I'll want to see some of it in practice first. I recall back around Cata that they had the same lofty ideals, but when put into practice it lead to the dreaded difficulty people remember. I think they've probably learned their lesson.

    The only concern I Have, relative to Cata, was that it often made healing feel like you were bailing four boats at once. I did not feel very in-control of my healing because it often seemed that no choice I could make would lead to a "positive" outcome. What I am hoping happens in WoD is that instead of snapping to my biggest heal I get a moment to ponder which heal to use given my knowledge of the fight, my class, and my stats.

    So I'm crossing my fingers too, but I really hope they don't completely gut the self-heals some classes had. As a destro warlock, for example, I liked the ability to sacrifice some of my DPS to try and help out the healer in the pinch.

    ReplyDelete
    Replies
    1. My opinion is that the cause and effect is the other way around: content was tuned way too high, making the Cata model punishing rather than freeing. In either case, based on comments from Celestion and Watcher, I think they're well aware of that particular lesson.

      The bailing of four boats is an apt metaphor. Pretty sure that's how I saw it in Cata, too, at least at first. It takes time to adjust to the new mindset, so I'm willing to bet it'll feel like that at least for raiding. Hopefully the normal dungeons at least it'll only be a couple boats rather than all of them :)

      As to class self-heals, for hybrid-healers and tanks at least, they're out of control. What little exists for pures could probably be left alone, but for Shaman, Paladins, Druids, Monks, Priests, etc. the amount of off-healing they can pull is pretty nuts. I can manage about 40k HPS on my Enhancement Shaman sacrificing most of my Maelstrom Weapon procs on some fights. That's like half a healer.

      Delete
  2. The only two fights I've tanked lately are H DS and H Naz, which are probably the most insta-death tank fights I've ever tanked going back to Wrath. I envy you and your tank on IJ getting 3 seconds to react to what's happening. :)

    On H DS, pretty much every ability that hits me, hits me for 51% of my health pool (somewhere between 40-60% but 51% is a useful average). When one hits me, no biggie, I barely notice and I can probably heal myself up. When 2 or 3 hit in succession, though, I'm dead, even if I'm at full health, if I'm not shielded &/or actively using a cooldown. Normally it gets dealt with but it's too easy to do one thing less than perfectly (either by me or the healer) and ending up eating floor as a result.

    As for H Naz... Execute. Be full health + shielded + use a CD and I'll live. Any two of those? May live but in dire straits. Only one? Outside chance of staying vertical. 2 of those rely on healers who are also busy doing other things, they aren't just worried about me every 15 seconds.

    Yes, it's probably fair to say that heroic fights should be legitimate tests that require some solid execution but when I read about the incoming changes, I immediately flashed to how much more reasonable those fights could be under that paradigm. Not easier, necessarily, but they should involve less annoying randomness. I'd like to see some of the emphasis moved from instant reaction times and perfect execution requirements to a more controlled "alright, here's the situation, it's ugly but let's deal with it."

    ReplyDelete
    Replies
    1. To be fair, I was talking Iron Juggernaut 10N. I imagine it's worse than 3 seconds on heroic :P Dark Shaman on 10N is also a pain. Once a tank is up to 3 stacks of the frost strike debuff, each shot takes about as much damage as you're mentioning, though to be fair I don't think we need as many things lined up for it. Also granted, the warrior tank is squishy as hell compared to the bear tank in our raid, so part of it is probably gearing/skill disparity of our tanks. It would be nice, though, if being bad at Active Mitigation meant you died in 3 hits rather than 4, instead of 2 hits. 50% more time to react would make a world of difference.

      But yes, perhaps I'm getting old, but I'd rather have tests requiring thought instead of requiring laser precise reactions.

      Delete
  3. Considering the fact that I haven't played since Wrath, my knowledge of the evolution of healing or its current state is supremely limited.

    That said, these sound like good, well-reasoned changes. I was a little alarmed to see several comments in opposition to them, since they seem like welcome solutions to me.

    Healing should never give you the feeling of absolute control - that's boring. At the same time, if there isn't enough time to react in a reasonable amount of time, then you lose all possibility of control. It's a tough balance to strike and Blizzard will probably need all the help they can get, but it is a balance WORTH striking.

    ReplyDelete
    Replies
    1. If you missed the fiasco that was Cataclysm, I can understand why you'd be puzzled by the playerbase's reaction.

      The developers implemented a lot of these changes in Cataclysm, successfully, too. Triage healing was alive and well for most of that expansion. However, everything was tuned way too tight. Even in heroic 5-mans (which were the only real non-raiding progression at the time), people really struggled with the content because of the difficulty. Honestly, I think Blizzard could have left healing alone and otherwise changed everything else, and folks would have struggled anyways. I really don't believe that the healing model at the time had anything to do with it.

      However, because the end result of difficult content is healers going OOM and people dying, that made it very easy to just blame the new healing model, and so that is what folks complained about.

      People overreacting to health dips and blowing their expensive heals rather than treating it like triage and allowing folks to sit at less than 100% health. DPS standing in the avoidable bad too much, making healers go OOM. Folks not performing enough CC so tanks would get burst down all the time. And so on.

      The game had changed, but most people didn't look any deeper than the empty healer mana pools and thus blamed everything on that. The changes exacerbated the difficulty, certainly, but they weren't the *cause* of the difficulty. Blizzard making the content too difficult was the cause of the difficulty.

      So as folks freak out about these changes, it sounds pretty similar to what was aimed for in Cataclysm, and hence why folks are panicking. Taken in a vacuum, I agree, this would be alarming. But these changes aren't going to occur in a vacuum. Having the lower difficulty content available will ensure that this model is viable for *all* skill levels, and not just the expert players.

      Delete
  4. This is the second place I've seen the idea that "smart" heals cause more lag than "random" heals. I am not certain that this is true.

    Pretend you're a dev implementing a spell that heals X targets.

    For the "smart" case:

    1. Get a list of all healable targets.
    2. Sort the list by health.
    3. Check the first target to see if it is in range.
    4. If it is in range, add it to the list.
    5. Move to next target.
    6. Repeat from Step 3 until you have X targets or you hit the end of the list.

    For the "random" case:

    1. Get a list of all healable targets.
    2. Shuffle the list.
    3. Check the first target to see if it is in range.
    4. If it is in range, add it to the list.
    5. Move to next target.
    6. Repeat from Step 3 until you have X targets or you hit the end of the list.

    The only difference is that you sort instead of shuffle in Step 2.

    And you can optimize smart heals a bit by keeping the health list pre-sorted for the duration of the encounter. This is similar to how mobs maintain threat lists, only sorting by health instead of threat. Whenever someone's health changes, just bubble-sort them to their correct position. WoW has a list for threat for every mob in the encounter, so a single additional list for health should not be that big a change.

    The technical problem with smart heals is not that they are more computationally expensive than random heals. The problem was that smart heals often had many healing events per spell, which is why Blizzard changed them to have fewer events, but stronger ones (instead of ticking every second, tick every 3 seconds for three times as much). But that issue remains even for the random heals.

    ReplyDelete
    Replies
    1. Hmm, I went back and re-read the diagnosis thread for the problem (http://us.battle.net/wow/en/forum/topic/9679038602), and I think you're correct insofar as the number of events was definitely the bottleneck, which does remain for random heals, so I think my paragraph is definitely going too far as to say hooray, problem solved.

      However, I still postulate by not checking anything other than "are they injured?", it's still less computationally expensive than maintaining a sorted list. In this particular case, rather than having a sorted list at all, you really have two pools of people: injured, or not injured. The algorithm would look like such:

      1. Enumerate list of all healable targets
      2. For Each Target
      A) IF in range
      B) AND health < maximum
      C) Add to list of possible targets
      3. Choose 1 target at random from list and apply heal
      4. Remove target from list
      5. Repeat from step 3 until you have X targets or you hit the end of the list

      There's no sort or shuffle involved here, and in fact, by having *no* smart heals, you never have to keep the sorted list at all. Fewer CPU cycles burned on maintaining the sorted list, as well as not having the data overhead at all.

      Delete
    2. Modified the blog post to point out the real bottleneck. Appreciate the pointer :D

      Delete
    3. Hmm. You're right on the random part. After some quick research, I see you can use a modified Fisher-Yates shuffle to quickly select N random targets from a list, making that section pretty fast.

      But to be honest, the algorithms are so similar that we are basically talking about choosing X random people from N targets, or taking the first X sorted targets from an unsorted list. Given that N is pretty small, almost certainly less than 50, this part is going to be pretty fast regardless.

      But I still think that maintaining the sorted list can't be that expensive, given that they maintain similar lists for threat for every enemy.

      Delete
    4. No, but at the same time if we're talking about a server being bottlenecked by processing n events per second (which isn't a great metric because each event is not the same in terms of processing required, but better than no metric) then it makes sense that anywhere computational complexity could be reduced is still a win. It may not be that much more expensive, but it's still more expensive. Micro-optimization can be very much alive when you're talking optimizing for the sheer amount of data processing that is a MMO server.

      As an aside, thinking about the interconnectedness of the data on the service is fascinating. If I perform an action (say, heal x health), I get y threat on every enemy, so my position on the threat list changes. So the only times the threat list needs to be locked for potential multithread access is my personal threat data for the change, and whenever the threat order needs reprocessing (the next attack for the monster?)--assuming Blizzard doesn't just process the entire instance on a single thread with a queue of requests to process, and just treat monsters as having their own requests like players... which honestly makes more sense in hindsight of writing that paragraph, and you don't need to worry about locking data for cross-thread access, which would get ugly very fast with that many actors.

      Just thinking out loud because it's fun.

      Delete
    5. Heh, regarding your last paragraph, check out the LMAX Disruptor. It's a very neat general implementation of that idea, with minimal locking.

      Delete