April 15, 2021 May 2, 2021
Damage, Resist, and Pierce
Wizard101 Spring Update 2021
The current Spring 2021 Wizard101 test realm brought about many changes, one being to the damage, resist, and pierce stats. I would recommend reading the update notes here. Additionally, feel free to check out this article that explains the general idea behind the spell audit that continued this update (though the mathematical formula used there is not quite what the Devs use, it is useful as an explicit approximation).
For those only interested in the damage and resist calculator, that can be found here. This calculator take in an attacker’s damage and pierce and a defender’s resist, outputting outgoing, incoming, and total damage multipliers for PvE and PvP.
This article will give an in-depth mathematical explanation of the new damage, resist, and pierce system. As mentioned in the test realm update notes linked above, I communicated with Ratbeard to help design the function used and give feedback regarding the qualitative sensibility of specific values. Of note is that while both the Devs and I have confidence in the structure of the function, the specific numbers (such as limits) used in both PvP and PvE are not set in stone. These are dashboard-changeable values that will likely change during this test realm and beyond, similarly to the values associated with the current critical dashboard.
About This Article
The information here will be geared towards those who would like to gain a deeper understanding of the damage/resist dashboard, the dashboard’s changeable values, and the specific function used to decide damage multipliers. While my explanation will be intended for those who have a reasonable foundation in mathematics (advanced high school or college), I will add simpler, more intuitive explanations for those who would benefit from it. Examples of using the function to calculate damage multipliers are included near the end of this article.
I will not address in this article why the previous system needed to be changed; perhaps I or another staff member will write an article about that. Additionally, while I will occasionally note why certain specific decisions were made, the primary goal of this article is not to give an in-depth explanation regarding the thought process behind creating the system. This article is about the “what” rather than the “why” of the system; for questions about the “why,” I encourage you to ask either me (@charlied134 on Twitter, or in the comments here) or the developers (@wizard101devs on Twitter).
I see this article as an important step forward in terms of general understanding of Wizard101’s mechanics. Never before has there been an article such as this explaining the inner workings of one of the game’s mechanics with information coming directly from the source. While Final Bastion and Duelist101 have been known to provide these sorts of analyses (such as a legendary analysis of Wizard101’s first critical system by Mmailliw), the information in these articles came from laborious in-game experimentation rather than design information coming directly from those who created the system. From my understanding, the primary reason the Devs do not release this sort of in-depth explanation themselves is because the majority of the game’s player base would have no interest in reading about it, therefore making it an inefficient use of their time. I hope to be able to continue this sort of explanation of Wizard101’s mechanics to ensure that precise information is available.
A note
The design of the new damage/resist/pierce system took an incredible amount of effort. My own involvement in this dates back over half a year, with the developers likely spending even more time than that agonizing over this. Many different details were considered when creating the system currently in test realm, and many other systems were developed and abandoned. I personally worked with at least three different potential systems including the version in test realm. I’m sure the developers worked through others. Additionally, many issues arose, not all of which could be addressed easily or at all. I say this to make the following point: if you see a “simple” or “obvious” change that could be made to this system as a seemingly unconditional improvement, it is likely that there is a specific reason (mathematical or otherwise) that it was not implemented. The most helpful feedback will understand this and allow it to inform discussion. As mentioned above, please direct feedback or questions to me or the developers.
The Premise of the New
Damage and Resist System
Before discussing pierce, I will first go over how damage and resist work assuming no pierce is present. Note that the systems used to calculate damage and resist are identical (though the dashboard values differ); from here on, I will refer to this single “system” used for both damage and resist. The premise of the new system is to allow damage and resist to function exactly as they did before (i.e., 1 stat gives an additional 1% boost) until a wizard reaches a stat number specified by the developer dashboard. Note that this is not an obvious conceptual starting point for a damage multiplier system, but it was created as such primarily because it is intuitive for new players to see 1 stat as a 1% boost or reduction in damage.
After reaching that specific stat value, damage and resist begin to be calculated by a limit function that causes any further increase in stat to have diminishing returns (for every additional point of damage you have, your spells get less than 1% of an additional multiplicative benefit). If you are unfamiliar with limit functions and are uninterested in researching them, know that the idea is that as the stat approaches infinity, the amount of damage boost (for damage) or reduction (for resist) that occurs approaches a finite value rather than growing indefinitely (as was the case in the previous system).
Mathematically, the key points of the system are as follows:
- The new system is a piecewise function that begins as a linear function and eventually becomes a limit function with a horizontal asymptote
- The input of this function is the damage/resist stat and the output is boost/reduction to outgoing/incoming base damage multiplier in decimal form
- Note that both outgoing and incoming base damage multipliers are 1.0, representing that spells deal the amount of damage written on their cards in the absence of stats
- The function’s output is added to this base outgoing multiplier (for damage) or subtracted from the base incoming multiplier (for resist)
- Example: if the damage function outputs 0.6, the outgoing damage multiplier would be 1.0+0.6=1.6
- Similarly, if the resist function outputs 0.6, the incoming damage multiplier would be 1.0-0.6=0.4
- The incoming multiplier is automatically set to 0.0 if the function drops it below 0.0 (i.e., you will never heal from an incoming attack)
- The input of this function is the damage/resist stat and the output is boost/reduction to outgoing/incoming base damage multiplier in decimal form
- The function’s form is the same for damage and resist, though the specific numbers differ
- The function is continuous where relevant (positive values of the input stat)
- As such, there is at least one intersection point between the linear and limit functions (by various fixed-point theorems); in relevant cases we have ensured that there is always exactly one intersection point (which the developers and I tend to refer to simply as the “intersect” or “intersection”)
- The function approaches a limit.
So What’s the Limit Function?
When you zoom out, the function is a fairly straightforward inverse exponential function of the following form:
Here, L is the limit as controlled by the dashboard (readers with knowledge of calculus can verify L is the function’s limit as x tends to infinity), while k and n change the shape of the graph. Specifically, increasing “k” will make the graph steeper (by “squishing” the graph towards the y-axis) while increasing “n” will make the graph flatter (by shifting the graph to the left). The function’s input x is the damage/resist stat being used to calculate the outgoing/incoming damage multiplier. Though I label the function’s output as “multiplier” as a shorthand, the output could be better described as multiplier boost (as described above). As a visual, here’s what the function looks like:
This is a very generalized function that can take essentially any desired shape depending on the values of L, k, and n. While this is incredibly useful for future modification through a dashboard, it is not very friendly when trying to implement a specific intersect as is desired for the damage/resist system. (One can verify finding values of k and n such that the intersect of a linear function of the form “multiplier=x/100” with the limit function is not straightforward). To address this, there are further formulas for k and n given in terms of dashboard-adjustable values k_0 and n_0 such that the sum of k_0 and n_0 is the intersection. These formulas are a bit of a headache to look at and will thus not be included here. Those with a sufficiently advanced background in mathematics may be able to derive them formally.
The importance of k_0 and n_0
The relevance of k_0 and n_0 is that their sum is the intersect of the piecewise function. Additionally, k and n are increasing functions of k_0 and n_0. This means that they share the property of controlling the shape of the curve; increasing k_0 increases steepness, while increasing n_0 increases flatness. Essentially, what the aforementioned formulas for k and n do is automatically generate “nice” values for k and n that correspond to the values that create a specific intersect and shape (i.e., ratio of k to n).
Typically, what we found while experimenting was that setting k_0 to its maximum reasonable value and n_0 to its minimum reasonable value for a given desired intersect produces a shape most useful for our purposes because it most naturally connects with the linear piece. Forcing the piecewise function to be continuously differentiable is possible, but not incredibly useful for our purposes because the input of the function is typically only natural numbers rather than a continuous interval.
While the dashboard presumably allows k_0 and n_0 to take any value, there are bounds on these values that create “reasonable” functions for our purposes. This is simply because the intersect could theoretically be either below 0 or above L, both of which are not useful for our purposes. Additionally, the specific formulation of n in terms of n_0 forces a conditional lower bound on it. Again, those interested may be able to derive these bounds.
What About Pierce?
Perhaps anti-climactically, pierce currently functions as it did before. This may change in the future (I have personally discussed and suggested several different ways pierce could function in the new system). As of now, the implementation of the new system will allow the developers to see how pierce operates in a new context.
To clarify, pierce will still affect auras first, with any leftover pierce affecting shields and finally directly affecting opposing resist. Against resist, pierce simply subtracts the attacker’s pierce stat from the defender’s resist stat before the defender’s resist stat is passed to the piecewise function; if 30 pierce attacks directly into 90 resist, a resist stat value of 60 will be passed into the piecewise function to determine the final damage modification. This is a simple solution that may work, though I have my doubts. The developers will be keeping an eye on it.
The Damage, Resist,
and Pierce Dashboard
Here, I will explain what specific values were set (to my knowledge) at the start of this Spring 2021 test realm, as well as identify the parameters within the dashboard that the developers may reference in future dev diary patch notes (as they have done in the past with certain parameters within the critical dashboard). Note that I do not have access to the dashboard and only list parameters that to my knowledge would be sensible/necessary to manipulate. See the list of likely parameters below:
- PvE/PvP multipliers for damage, resist, and pierce stat: these are values that simply multiply all players’ damage, resist, or pierce stat by the set value before passing them into their respective functions. Expect these values to nearly always remain at 1.0, with possible exceptions including boss cheats or future PvP tournament formats.
- PvE/PvP damage limit: these are the values of L discussed above in PvE and PvP respectively, setting the limit approached by infinite damage stat growth.
- PvE/PvP resist limit: similarly, these would be the limit L for resist in PvE and PvP.
- PvE/PvP damage k_0, n_0: these are the values k_0 and n_0 that determine the intersect and shape of the damage function in PvE and PvP respectively. Expect these to change as the developers test different values for the intersect (especially in PvP).
- PvE/PvP resist k_0, n_0: similarly, these are the k_0 and n_0 values for resist in PvE and PvP.
Though the [test realm update notes] likely explain this, here is my knowledge (or educated approximation) of what these values were initially set to (note that many of them are likely to change or have already changed depending on when you read this article):
- Multipliers: 1.0 for all three stats
- Limits:
- PvE damage: 2.0
- PvP damage: 2.0
- PvE resist: 1.25
- PvP resist: 0.7
- k_0, n_0:
- PvE damage k_0: 190
- PvE damage n_0: -40
- Therefore, the intersect is 150
- PvP damage k_0: 140
- PvP damage n_0: -40
- Therefore, the intersect is 100
- PvE resist k_0: 120
- PvE resist n_0: -20
- Therefore, the intersect is 100
- Note that the intersection at 100 implies that there is absolutely no functional change for resist in PvE – it’s as if there was no change at all to resist in PvE
- This may change in the future due to a pierce change or dashboard adjustments
- PvP resist k_0: 65
- PvP resist n_0: -15
- Therefore, the intersect is 50
The numbers to keep in mind here are the limits and intersects. The limits represent the theoretical maximum amount of damage boost or reduction to any spell. These limits are represented as decimals to be added to (for damage) or subtracted from (for resist) 1.0 to obtain the outgoing (damage) or incoming (resist) damage multiplier. For example, a 1.5 damage limit represents a 2.5 outgoing multiplier limit (corresponding to what was previously 150% damage); similarly, a 0.7 resist limit represents a 0.3 incoming damage multiplier limit (corresponding to what was previously 70% resist).
The intersect represents the point at which diminishing returns take effect for damage and resist gain. At these stat values, 1 stat no longer corresponds to 1% boost, instead corresponding to a smaller value depending on how high your total stat value is. For example, a resist intersect of 50 means every resist stat point above 50 will not give you a full 1% incoming damage reduction.
Practical Examples
Here is the calculator referenced below (also referenced at the beginning of this article). This calculator will allow a user to input damage, resist, and pierce stats, while outputting outgoing, incoming, and total damage multipliers for both PvE and PvP. In the future, other calculators might be made to help compare stats such as damage and critical or resist and block.
- PvE
- Attacker: 180 damage, 25 pierce
- Defender: 90 resist
First, you need to calculate the value of the outgoing damage multiplier. To do this, the attacker’s 180 damage becomes the input of the damage function. Because the intersect of this function is 150, the attacker’s 180 damage will be affected by the limit function. Putting this into the function gives 1.688, meaning your 180 damage stat will give you an outgoing damage multiplier of 2.688 (as the calculator shows).
To calculate the incoming damage multiplier, you first deduct the attacker’s pierce from the opponent’s resist to gage functional resist. 25 pierce against 90 resist implies 65 functional resist stat. This is below the PvE intersection of 100, so the 65 resist stat will function as 65% resist did previously. This implies an incoming damage multiplier reduction of 0.65 and therefore an incoming damage multiplier of 0.35.
The total multiplier, then, is the product of the incoming and outgoing multipliers, which in this case is 0.9408.
- PvP
- Attacker: 130 damage, 35 pierce
- Defender: 90 resist
Note that 130 is above the intersect of 100. Putting this into the function spits out 1.227, meaning your 130 damage stat will give give you an outgoing damage multiplier boost of 1.227; therefore, your outgoing damage multiplier will be 2.227 as the calculator shows.
Note that the functional resist of 55 is above the intersect of 50. Putting this through the function gives 0.537; therefore, your incoming damage multiplier will be 0.463 as shown by the calculator.
The total multiplier, then, is the product of the incoming and outgoing multipliers, in this case 1.031.
- PvE or PvP
- Attacker: 85 damage, 15 pierce
- Defender: 40 resist
Since all of the values involved are below the relevant intercepts for both PvE and PvP, the damage modification from these stats under the new system is no different than how they acted under the old system. Namely, the outgoing multiplier will be 1.85 while the incoming multiplier will be 0.75, for a total damage multiplier of 1.3875.
This example is simply to illustrate that as of now, only extreme stat values are affected by the new system.
Takeaways
So what does this mean? There are some different takeaways for PvE and PvP. Take a look at the lists below:
- Only damage stats above 150 will be affected
- This means the change will only affect the damage of glass cannon builds (balanced builds should be unaffected)
- You might want to reconsider that quint damage mighty pet in terms of “optimal” damage output – critical talents may give a better EV than the low damage talents
- Resist is unaffected in PvE
- Immunity is achievable and no more difficult to obtain than before
- Additionally, any resist you have over 100 will continue to act as a buffer that counters opposing pierce
- Damage will be affected for most schools relatively equally
- Builds that are at or below 100 damage will be unaffected
- Therefore, bladestacking and other more defensive strategies will be less affected by this
- Damage reduction for builds in the 120-140 range will likely end up at 5-15%
- Builds that are at or below 100 damage will be unaffected
- Resist will only be affected if resist is above 50 after deducting the attacker’s pierce
- This is a very small change; taking 35 as average pierce, a defender would need above 85 resist to see any loss of effectiveness in their resist
- This implies that only ultra-defensive ward builds will be affected at all, with only absurd (100+) levels of resist seeing significant change
- Additionally, open attacks using Shadow Shrike will essentially see no change in damage output compared to the previous system (pending any changes to how the spell works)
- Only expect to see any notable change in matches where the defender has set extremely hard for the attacker
- Shielded attacks, however, are more likely to go up in damage because the shields absorb an attacker’s pierce, leaving resist to be cut down by the limit function (though this is at best a consolation prize)
- I have recommended that the PvP resist intersection be lowered simply because in the short term, resist is not taking a nerf in PvP
- The Devs are starting with a conservative number likely to align more with the status quo (i.e., the previous system); we will have to see where it ends up based on data, experience, and feedback
- Additionally, a pierce rework down the road will likely make this “problem” obsolete
- This is a very small change; taking 35 as average pierce, a defender would need above 85 resist to see any loss of effectiveness in their resist
Overall, the new system does not have an extreme effect on current balanced stats. Resist in particular is completely unaffected in PvE and nearly unaffected in PvP as well. Damage takes a more noticeable hit, but only the most extreme cases will see serious stat reduction. To reiterate, expect the numbers to change during this test realm and beyond, be it for balancing reasons or simply to keep up with an increasing level cap and more powerful gear. Though functional resist is essentially unaffected because pierce has not been changed, the infrastructure is in place to handle resist.