Friday, April 24, 2009

[Druid]More wacky SD shenanigans, like uptime

Astrylian was kind enough to look over the recent blog post on SD that I made, and point out some problems with it that I'd like to correct or clarify.

First off, on using 'uptime'. This is potentially really misleading. By uptime I simply meant the amount of physical hits that were blocked by Savage Defense compared to the total amount of physical hits that landed (ie, not avoided). However, this is not the same as the uptime value in WWS. And while they coorespond somewhat, they're not particularly relevant to each other nor should you really care - because the ideal is that you don't have 100% uptime as tracked by WWS.

That sounds weird, but it's true. Why? Because as soon as you get hit you lose your SD uptime, and unless you've got some very weird bosses you'll never refresh it right after that. Thus, in order for SD to function, it must go down for some short amount of time. If for some reason you had 100% uptime, that would likely mean that you never actually got hit. Which is awesome, I suppose, but not particularly useful when trying to figure out how well SD did.

So what should you do? Well, look for the total number of hits and then the total number of absorbs. That will tell you the absorption rate. I highlight this term because it is what I'm going to use from now on to make sure you understand what I mean. The absorption rate is simply how many attacks were absorbed by SD vs how many attacks hit you in total. It is not uptime (how long the proc was around) or block rate.

Next up, how bugs in SD look. Here's an example from my Ignis log:

0:02'41.594 Felhoof Maul hits Ignis the Furnace Master for 4788 Physical. (Critical) #354766
0:02'41.594 Skylopez Holy Light heals Felhoof for 12145. (12145 Overheal) #354770
0:02'41.610 Ignis the Furnace Master's Lacerate is refreshed. #354778
0:02'41.610 Felhoof Lacerate hits Ignis the Furnace Master for 223 Physical. (Critical) #354779

(At this point I should have gained SD and refreshed SD ).

0:02'41.969 Ignis the Furnace Master melee swing hits Felhoof for 21349 Physical. #354791

(nothing was absorbed)

0:02'42.016 Felhoof gains Savage Defense. #354805

(And now I have the proc up - which should be just an annoying latency thing, right? It'll work for the next time)

0:02'42.016 Felhoof gains 2329 health from Felhoof Improved Leader of the Pack. (2329 Overheal) #354806

(this needs to be talked about more)

0:02'42.016 Felhoof's Savage Defense is refreshed. #354809

(This would be presumably from the second crit that I received)

0:02'42.125 Felhoof Savage Defense was removed from Felhoof. #354814

(And this would be it going away without actually being hit.)

0:02'42.375 Felhoof gains 5 Rage from Primal Fury. #354832
0:02'42.375 Felhoof gains 5 Rage from Primal Fury. #354838

(Finally, I get the primal rage from my two crits)

Here's my theory on how it works. My guess is that the server sees that you've done a crit, and there's some threaded process that sees this and runs off and runs all behaviors when you do a crit (like gain rage, do iLotP, etc), which kicks off other processes potentially. Meanwhile, the mob is still hitting you. So then you get hit, and you don't have SD up - so it's a full amount of damage.

And then we get into the bad part. The process that figures out how SD works comes in, sees that you got a crit at time X, and then gives you an SD proc. It then looks to see whether it should remove the SD proc (or something else does), and the way it does it is by looking to see whether you received an attack since the crit that produced the SD occurred (at time X). In the above, it did (even though nothing was absorbed). So it removes the SD proc.


Now, what really bothers me is the next line:

0:02'42.016 Felhoof gains 2329 health from Felhoof Improved Leader of the Pack. (2329 Overheal) #354806

There are no heals that I receive between being hit here. How can this be an overheal - it comes directly after the actual attack I receive? The only answer is that the healing is calculated when the crit occurred too, as well as the amount overhealed - but the actual log message is after the fact. Which either means that the log can't be reasonably trusted...or that iLotP has similar behavioral problems to SD in terms of looking in the past to determine what the behavior should have been. In iLotP's case, it's actually doing the right thing - I should be overhealed here, because I crit before I take damage. But in SD's case, it should not do this kind of behavior. I see why they did it this way - it's the same thing as iLotP and primal fury, so why not do the same process? But because the actual proc determines whether or not something is absorbed, it can't reasonably do this.

The way to fix this isn't that hard, I believe, provided that this is possible: instead of checking whether an attack happened since you got a crit, you need to check and see whether an attack happened and was absorbed since the last time you got a crit. If it wasn't, don't remove the SD proc yet. This requires that whatever is dealing with SD can determine whether or not attacks were absorbed. If that's not possible, this isn't likely to be easily fixed. The other possibility is to have the SD proc object remove itself, which I would think is more easily done. In other words, the object model would look like:
crit-> create SD proc.
on attack: if SD proc exists, damage = SDProc.OnHit(damage)
SDProc.OnHit: newdamage = damage - (AP/4).
return newdamage.

While it wouldn't remove the latency, at least the behavior would be correct.

On comparing SD to armor and BoSanc - Astrylian rightly pointed out that it's a bit misleading to look at how much damage SD would absorb pre-armor, since that's mechanically not how it works, especially if you're comparing it to something like BoSanc. For instance, I was on average absorbing for 1462 damage per SD. On Ignis, that's 6.3% mitigation after the 23k post-armor attack and worth double what BoSanc says it'd do, right? Basically. It's not quite that good, but it's close compared to BoSanc. And BoSanc is good, so SD is doubly as good. And that's very true!

But how good is it compared to armor? Well, with my armor value as it stood I had 32301 armor for the fight, which gives 66.007% mitigation. That means pre-armor that attack would've done 66760 total damage. If I add 100 AP, I'd prevent another 25 damage of that post-armor attack, going from 1462 to 1487 (and that's the best case, assuming 100% absorption rate). But if I add 100 armor, I reduce the incoming damage by 47.

So in this case, armor is almost doubly as effective as AP on a per-point basis. don't get 100 armor worth of itemization for the same cost as 100 AP. Armor is way, way cheaper most of the time. For example, you can get 44 AP on gloves or 240 armor on gloves. You can also get 20 agi to gloves, which should after buffs be worth about 44 Armor - which means that 20 agi is more mitigation (in this case) than 44 AP is just from the armor - it doesn't count the extra avoidance or threat or even SD uptime.

Does this mean you should totally ignore AP? Probably not. It's just not worth that much. It takes a lot of AP to come close to what agility provides, but it does mean that you should favor higher AP over higher haste/armor pen/crit/hit/expertise. Okay, haste and armor pen you can see, sort of - but why crit/hit/expertise? Because those only determine the uptime of the procs, and that is (as demonstrated above) unpredictable at best. It may actually be that more crit ends up causing the above issue more; as you get more crits before an attack, you might overwrite an SD proc and cause it to disappear. Hard to say, but at least AP will always mitigate something. Still, AP doesn't come close to armor, stamina or agility.


Xarnen said...

Very nice research, I hope more comes of it. Concerning hit rating, I am finding myself struggling to keep that up as I acquire upgrades in Naxx and Uld. I'm horde so no Dranei buffs to help that out. I haven't acquired all of the key drops, and without sacrificing too much armor and stamina, how much hit rating is "enough"? Keeping threat is rarely an issue for me and I generally slap on some dps/+hit gear to tank trash. But for bosses?

Thanks and keep up the good work, I've found your blogs to be very insightful and useful for helping gear and play my bear.


JohnD said...

Seems like a nice piece of work. Two things I dont understand though: are you advising that we make gear choices based upon a bugged implementation of SD, or we make gear choices based on the way it was designed to work, with the expectation that it will be working that way soon?

Secondly, is the wow combat log the ultimate source of "what happened", or could all kinds of things be happening in reality that are not reflected in this combat log? I dont understand the intricies of the wow system in this regard (I dont write software for blizzard!) but we are assuming the combat log on my client pc is the ultimate source. Could it just be inaccurate in the finer points? GC didnt seem to think this issue was a big deal. But these logs make it seem like a big deal. That's why I'm questioning their validity.

For the previous comment: somehow I'm picking up a lot of hit rating now on my *bear* set. I'm at 290 atm, which is a massive change from being at ~50 just 10 days ago. I'm not wearing dps gear - except the twisted visage, which arguably fine for a lot of normal-mode boss tanking.

Pzychotix said...

There's a lot of discrepancies in the logs. Sometimes you'll see things that definitely happened out of order. When I was looking at a Razorscale parse, I saw SD drop, and yet also absorb an attack after it dropped.

Think of the logs as the order the messages arrived, but not necessarily the exact order each thing happened.

Rumi said...

To fix SD issue with latency what about having SD stack max 3 times and having every hit consume 1 stack ?

Bialar said...

on our raid last night in ulduar i had 2444 SD procs on a 3hr 23min run thats almost having SD up all the time, I have not gone into the depth of my combat log, so cant say if they all are wasted with the bug. but atleast I think its a nice deal.

Peter said...

My sense - after a lot of raiding (11/14 woot!) and a bit of casual perusal of the logs - was that the amount of protection NOT provided due to a buggy implementation is tiny compared to our overall mitgation. So i actually have to say I can live with the bug - I'm sure Blizzard have more important things to fix. Well, I could cry & whine, but when I see how much I've been deprived of, I have to ask myself why I *actually* care.

Side note: druids are rocking the house down in ulduar. I've MTed every boss in there so far: MT meaning taking the role where tank survivability is the biggest worry. Still perceived to be a lot less squishier than other tanks. Our DK still needs external CDs to survive Mirmiron's plasmas. I dont perceive the class as head & shoulders above warriors & druids in the CD department, measured against the actual encounters we're working on.

Bovinity said...

Yeah, it's hard to say if it's a bug, latency, or problems with the combat log not being the gospel.

Healers see this stuff happen all the time. We see a lot of:

Mean Boss hits Bob for 24155
Nice Healer heals Bob for 25202 (1415 Overhealed)
Leafy Tree heals Bob for 12615 (12615 Overhealed)
Mean Boss hits Bob for 21525
Bob Dies.

Everyone sees it with interrupts, as well.

Mean Boss begins casting Big Fireball
Quick Rogue uses Kick
Quick Rogue's kick interrupts Big Fireball
Big Fireball hits Bob The Tank for 732252
Bob dies.

Is it really a problem with Savage Defense not working right, or is it latency/server lag/combat log quirks?