Dont Nerf Sapphiron
We recently completed testing Naxxramas on the PTR. A big thank you goes out to everyone who helped us find bugs or exploits we could fix before release. We often get questions about how we decide what counts as a bug, and what’s worth changing, so I thought you might enjoy a deep dive into our investigation of Sapphiron’s Frost Aura.
- TLDR for anyone who only wants to know the conclusion: We’re changing the spell to tick every 2 seconds consistently.
When Sapphiron is engaged, the entire raid is affected by a Frost Aura which reads: “Deals Frost Damage every second”, but many players reported that it should be every 2 seconds. Our first thought was, “that was the Wrath of the Lich King version,” but we know that in a game as complicated as WoW, there can be surprising and unexpected interactions, and a lot has changed over the last 15 years. When a current behavior doesn’t match players’ or developers’ memories, it always makes us a little suspicious. Sometimes it turns out our memories are wrong, but we’ve also seen it lead to the uncovering of an unexpected interaction, so, it’s usually worth a look, and that was certainly the case here.
We looked at many old videos, and though some were from the wrong expansion, we were able to find videos that showed the original fight. The videos actually had evidence of both tick rates within the same fight. The frost aura seemed to mostly tick every 2 seconds, but occasionally tick once per second for a bit, before returning to ticking every 2 seconds. We also checked in our reference server, and the behavior was the same as we saw in the videos: mostly 2 second ticks, but occasionally a brief streak of 1 second ticks, before returning to 2 second ticks.
Perhaps the most useful clue was this post from WoW game designer Daelo in 2009, in which he describes fixing Sapphiron’s Frost Aura so that it does “the damage that was seen previous to the 3.0.8 patch”:
"We just hotfixed Sapphiron's Frost Aura so it should do the damage that was seen previous to the 3.0.8 patch regardless of the size of the raid or your server's performance. This should be 1200 every 2 seconds in Normal, and 1600 every 2 seconds in Heroic. You'll notice that the Frost Aura debuff you have no longer has a duration that refreshes. The tooltip also incorrectly lists the damage as occurring every second. The tooltip error will be fixed the next time we make a client patch available."
This certainly suggests that it was doing damage every 2 seconds prior to the 3.0.8 patch, but this was a hotfix to the Wrath of the Lich King version of Naxxramas. We’ve already found other differences between the original and Wrath of the Lich King versions of Naxxramas, so while this post was helpful, it wasn’t enough to satisfy us on its own. It contained an important clue about the debuff duration refreshing, which led us to suspect the DoT refresh might be clipping the damage tick. In WoW Classic, when you refresh a DoT, it resets the timer on the periodic damage, and can cause you to miss ticks, and since the Frost Aura has a 5 second duration that gets reset throughout the fight. It was a good bet that the damage timer was getting reset then too. Of course, we already reproduced that behavior in WoW Classic, so that still didn’t explain the discrepancy between the two.
At that point, we dug further into the game code and found the difference in the way Sapphiron re-applies the Aura. In both reference and WoW Classic, the aura re-application was done as part of an Action Trigger which fires every 2 seconds. However, in the original code, action triggers share a timer with periodic spell ticks, and action triggers were always processed first. In modern code, they run on independent timers, so a long-running action script won’t delay a spell tick.
This meant that when Sapphiron re-applied the Frost Aura in reference, it was guaranteed to clip the damage tick that was about to happen, leading to every other tick getting skipped. In modern code, the damage tick and the reapplication are both scheduled to occur at the same time, but are controlled by two separate timers, so either one might happen first. It just so happens that in this encounter, the reapplication generally happens after the DoT tick on the same second, so that players got the full damage on every tick, instead of every other tick.
But this mystery isn’t solved yet. What about those occasional one second ticks we saw in the original videos and in the reference server. They were rare, but if the reference code is guaranteed to do the refresh before the damage tick, how were they ever ticking at once a second? It turns out that the Frost Aura application didn’t always succeed, and if it failed, the existing DoT happily ticked away doing damage once per second until the next refresh attempt 2 seconds later, like this:
|0||Aura #1 Applied||0|
|1||Aura #1 ticks||600|
|2||Aura #2 Applied (clips Aura #1)||0|
|3||Aura #2 ticks||600|
|4||Aura #3 fails (Aura #2 ticks)||600|
|5||Aura #2 ticks||600|
|6||Aura #4 Applied (clips Aura #2)||0|
|7||Aura #4 ticks||600|
Since Sapphiron is 3 levels higher than the player, the spell can only miss 1% of the time, but that’s what explained the occasionally 1 second ticks we saw in the videos, and with our reference.
We also reached out to the original designer, who still works at Blizzard, on a different game team. After we described our findings, he agreed that the intended behavior was for the damage to be every second, and the fact that the reapplication of the aura was clipping a tick of the DoT was a bug that wasn’t noticed or fixed until Wrath of the Lich King.
So where do we go from here? We often must carefully consider a conflict between original intent and original behavior. There’s no one right answer in all cases, but for this case, the original behavior is the correct decision, and we plan to fix this in much the same way Daelo did in Wrath of the Lich King. In modern code, we have a way to reliably apply an aura that deals damage every 2 seconds as long as the boss is alive, and we’ll re-write this ability to use that method, just as Daelo did in Wrath of the Lich King.
While the behavior that led to it originally occurring every 2 seconds instead of every 1 second was a bug, it was consistent enough as to be indistinguishable from a text bug in the Aura description. Choosing to go with the original intent would result in almost twice as much damage as players experienced in 2006, so in the end that makes this decision pretty clear.
I hope you enjoyed that trip through our development process. See you in Azeroth!
Nov 12, 2020
I wanted to drop in and give one more update. Astute readers of my earlier post may have noticed that the original implementation had a 1% to do an extra tick of damage, and while that’s pretty minor on average, taking an extra tick of 600 damage can create a dangerous streak that can make the fight significantly harder, especially if you don’t have much frost resistance.
I’m really happy to share with you that after I made my post, our newest team member added an effect that exactly reproduces the 1% chance to have an extra tick of frost damage, so you’ll have something even more true to the original difficulty.
Watch out for those damage streaks! It’s cold in there!