MHWI Status Damage Model
This document is still a work-in-progress.
Introduction
The mathematical description of how status effects such as blast is well-described in How Status Works: Definitive Status Guide MHW/Iceborne (link). However, I will attempt to summarize it here, in addition to clarifying some features of this game mechanic not mentioned in the video.
This document will focus on modelling the damage done by the following status effects:
- Poison
- Blast
Status Application
Status effects can be applied to monsters in a variety of ways, such as attacking while using a weapon with a poison/paralysis/sleep/blast value.
When a status is applied to a monster, that status is “built-up”. Only when this internal status application counter reaches certain thresholds does the status effect trigger (or proc).
All monsters have unique tables regarding status effect application. Buildup usually involves four particular values:
- Base Tolerance (or simply base): The threshold before the first proc.
- Tolerance Buildup (or simply buildup): Every time we hit the threshold, we increase the new threshold by this value.
- Tolerance Cap (or simply cap): The maximum threshold.
- Decay: The internal status application counter decays at a constant rate over time.
To illustrate how these values work, let’s consider Dodogama’s sleep values:
- Base:
- Buildup:
- Cap:
- Decay:
Additionally, let’s specifically consider the following quest values:
- Base Multiplier:
- Buildup/Cap Multiplier:
Thus, our effective sleep values for that particular quest are:
- Base:
- Buildup:
- Cap:
- Decay:
Our first threshold is , so we must apply sleep in order to get the first sleep proc.
After the first sleep proc, our new threshold is , so we must apply sleep for the second proc.
After the second sleep proc, our new threshold is , so we must apply sleep for the third proc.
This follows an arithmetic progression up until the cap, where it is clipped:
IMPORTANT: This is a draft. I actually don’t know how the rounding works, or other variables that status decay depends on, but my blast model is a continuous model, and blast doesn’t decay, so it doesn’t affect the remainder of this document.
Poison
(This section will be written later!)
Blast
Blast is a status effect that does not decay (i.e. decay is blast per second).
A blast proc deals fixed damage, regardless of monster ( in Low Rank, in High Rank, and in Master Rank). The damage is dealt instantly, and the status can immediately continue being built-up.
Model Design Goals
Raw damage and elemental damage have been shown to be easily and effectively compared by determining a representative raw and elemental damage per hit. Such methods are totally independent of time and player skill as each and every hit has the same average raw and elemental damage.
The goal of each damage model is to find similar numbers for status damage, estimating the effective average damage done by a status effect, per weapon hit.
Unfortunately, status effects are not as easy to model in the same way since the rate of status procs decreases as more status is applied on the monster. Status damage can also depend on player competence due to status buildup being disabled while a monster is suffering from a status effect.
The Simplified Poison Damage Model
The model is described and discussed in How Poison Works: Poison Guide & Math MHW Iceborne. This section will effectively be a repeat of that video.
Input Variables
We require three input variables:
- (average raw damage of an attack)
- (total damage per poison proc)
- (expected number of procs per hunt)
- (monster total health)
While and are very easy to finding depending on the quest, must be found through experimentation.
This model is used due to the relatively low number of procs per hunt that can usually be determined.
Do note that this model assumes that poison status applied is already factored into by the player, therefore all poison weapons will behave the same under this model.
Model Derivation
Let be the total raw damage done during the quest. is the total poison damage, so:
Let be the total number of hits required to kill the monster. Then:
Let be the effective poison damage per hit. This can be easily found:
Thus, we have found our damage model.
The Continuous Blast Damage Model
Input Variables
Our model is based on the idea that a single specified attack always deals a predictable amount of average damage and blast application each time the attack is performed.
For example, if a greatsword draw attack dealt raw damage and status buildup on average, we can expect that using the attack -times would deal raw damage and status buildup on average.
These variables shall be:
- (average raw damage of an attack)
- (average status application of an attack)
Conceptually, we can try counting how many of the specified attack (such as the greatsword draw attack) we have to deal before we slay the monster, so we consider monster health to be another variable:
- (monster total health)
If we ignore blast damage and assume all our damage comes from raw, it is trivial to see that we’d require uses of the specified attack in order to kill the monster. However, it gets tricky when we factor in blast.
The variables related to blast are:
- (blast base)
- (blast buildup)
- (blast cap)
- (blast damage per proc)
Blast does not decay and blast procs do not cause status-application downtime (like how you cannot apply poison status if a monster is actively suffering from poison). This means that blast damage prediction can be completely independent of time, and dependent only on parameters relating to the sequence of attacks performed on the monster.
Our model will attempt to find the average blast damage per attack.
Pre-Cap Model Derivation
The following two equations are given for arithmetic progressions:
where is the first element of the sequence, is the element, , and is the sum of the first elements.
Equivalently, is the threshold for the blast proc, and is the total blast that must be applied to reach the blast proc.
Eliminating :
Solving for number of procs :
Since :
Let and denote the total raw and blast damage (respectively), given blast procs.
Since is blast damage per proc, total blast damage is simply:
Thus, we can calculate as:
Since we know that we apply status for every raw damage, it is trivial to calculate using:
Thus, we can introduce into our equation. Additionally, we no longer care about counting blast procs, so we can simplify the notation of total raw and blast damage to and :
In order to slay the monster, total raw and blast damage must add to equal the total health pool :
Substituting into :
Thus, we now have an expression for total blast damage, given the monster’s total health pool.
Now, we want to find out the average amount of blast damage dealt per attack, given the attack’s raw damage.
Let denote the average blast damage per attack, before hitting the blast cap.
It is trivial to use the ratio between and :
Thus, we get an expression for in terms of , , and :
Since we can use (6) to calculate in terms of model input values, we now have an expression for calculating average blast damage per attack, given only our model input values.
For this model, it is useful to think of average blast damage per attack as a function of , so we shall rewrite as a function such that:
is only valid up until reaches the blast cap.
Blast Cap Derivation
The blast cap can be expressed as:
So to find where the pre-cap portion of the model stops, we must find the range of in which (7) is true.
We start by substituting (1) into (2) via. :
Substituting (4) into (8) via. :
Since :
We can now introduce and using (5), and substitute it into the blast cap condition (7):
Substituting (6) into (9) via. :
Let be the left side of (10):
Isolating in (10):
Thus, we have our range for in which the pre-cap part of the model (derived in Pre-Cap Model Derivation) is valid.
We shall define to be the exact value of where we hit the blast cap:
Post-Cap Model Derivation
At this point, the status buildup threshold remains constant at .
Since we have a constant threshold, then if we ignore pre-cap damage, any status buildup dealt will be linearly proportional to the damage it deals.
We will start by forming a relation between some number of hits , average status per hit , and a blast threshold :
Thus, hits is required to cause a blast proc.
Let be the effective average blast damage dealt per hit, but only valid to damage dealt after damage has been dealt to the monster:
Note that does not depend on monster health.
We know that each hit after reaching blast cap deals an average of damage, and we must distribute this damage in the remaining health of the monster.
This allows us to construct an expression involving the actual effective average blast damage dealt per hit , which includes damage dealt before damage was dealt to the monster. This expression is simply a weighted average:
Rewriting as a function such that:
Summary
Our model takes the following input variables:
- (average raw damage of an attack)
- (average status application of an attack)
- (monster total health)
- (blast base)
- (blast buildup)
- (blast cap)
- (blast damage per proc)
The effective average blast damage per hit can be calculated as a function of monster health such that:
Functions and are defined as:
is the maximum amount of health before reaching the blast cap:
is the total blast damage dealt when we’ve dealt a total of damage to the monster:
Anonymous helper variables:
Do we ever hit blast cap?
TODO: This section will be written later!The Discrete-Procs Blast Damage Model
TODO: Do we actually care to do a discrete-procs model? The continuous model is probably good enough for most purposes.Motivation
In reality, blast damage is done on the monster only every now and then (though in a predictable manner).
For example, the continuous model might calculate the total number of blast procs as the non-integer number of , leading to a total blast damage calculation of .
If one wishes to model the DPS fluctuations that are associated with this effect, then this total number of blast procs must be floored. In this case, the continuous model calculation of must be floored down to , leading to a total blast calculation of .
TODO
TODO: Start figuring out the math?Model Extensions
I left out certain interpretations of the models in order to keep discussion as simple as possible. Now that the model has been introduced, we shall expand on these additional interpretations.
Combos
It turns out that if you can predict the average amount of raw damage and status application of a single attack, you can also do it for a given sequence of attacks.
Thus, and can instead be interpreted as values for a given sequence attacks rather than just a single attack.
Target Health
doesn’t actually have to be the monster’s total health pool if we don’t intend on slaying it. For example, we can instead make the damage required in order to capture the monster.
Multiplayer might also be considered here since multiple players share the full health pool of the monster. For example, if we assume four perfectly equal players, then we might want to divide the full 4-player health pool by .