Data analysis skills are great for tackling projects like Kaggle competitions, but number crunching can be very useful when applied to leisure activities like sports and gaming. Diablo III is an action adventure hack-and-slash game from Blizzard Entertainment, where your goal is essentially to do as much damage as possible as quickly as possible to defeat monsters. Diablo is interesting from a data analysis perspective because your character's statistics (and luck in finding good items) are generally far more important than your actual mechanical skill at playing the game. If your character has enough damage and toughness, you can literally stand in one spot and press one key to kill the strongest monsters in the game. Consequently, success in the game can be enhanced by analyzing skills and effects to figure out what types of character setups are capable of dealing high damage. In this post I'll analyze the Demon Hunter class's humble level 1 primary skill, hungering arrow, and why this seemingly low damage primary skill might challenge some of the best builds when season 6 starts tomorrow.
Hungering arrow is a primary skill (costs no resource to use) that deals 155% weapon damage and has a 35% chance to pierce the target seek out a new target, which can be the same as the first target. Hungering arrow is unique in that it deals damage probibilistically according to a geometric distribution. Instead of hitting a target once for a fixed amount of damage, it can hit many times if you get lucky and it pierces several times in a row. To compare the skill to others, we need to know the average damage we can expect to do with a single shot. I'll start by using R to generate random geometric data and find an approximate average damage value and then find the average directly using the distribution's probability mass function.
Note that the geometric distribution defines the number of tries it take to achieve a "success" given some success probability p. The probability of continuing on to the next time step is equal to 1-p. In our case, the continuation probability is the chance that the arrow pierces the target (the term "success" is misleading in our case because piercing is a good thing and stopping i.e. a "success" is a bad thing.).
In [207]:
# Generate some data
base_damage <- span=""> 155
pierce_chance <- span=""> 0.35
stop_chance <- span=""> 1-pierce_chance
sample_data <- span=""> rgeom(n=100000, p=stop_chance)
table(sample_data) # Inspect the data
->->->->
Out[207]:
The table shows that roughly 65% of the shots fail to pierce the target. Those shots deal the base skill damage of 155%. A few shots, however, hit the target many times. A shot that pierces once deals 155% twice for a total of 310%. A lucky shot with 4 pierces deals a cool 155 * 5 = 775%. It might be rare, but it adds up, so let's check the average damage of the sample data.
In [208]:
summary((sample_data + 1) * base_damage)
Out[208]:
The summary output shows the average damage of a single shot of hungering arrow is approximately 238%. Let's calculate the number more precisely:
In [209]:
prob_mass <- span=""> dgeom(c(0:100), prob=stop_chance)
number_of_hits <- span=""> c(1:101)
sum((prob_mass) * (number_of_hits * base_damage))
->->
Out[209]:
The 35% chance to pierce boosts total damage by 83.46% weapon damage. Considering some of the more powerful skills in Diablo III deal well over 1000% weapon damage, 238.46% is not impressive, but we can boost hungering arrow's damage with several additional effects. First, there's a quiver in the game called The Ninth Cirri Satchel that boosts hungering arrow's pierce chance by up to 25 percentage points. Let's add this item into the mix and rerun our analysis:
In [210]:
pierce_chance <- span=""> 0.35 + 0.25 # Added The Ninth Cirri Satchel
stop_chance <- span=""> 1-pierce_chance
sample_data <- span=""> rgeom(n=100000, p=stop_chance)
table(sample_data) # Inspect the data
->->->
Out[210]:
In [211]:
summary((sample_data + 1) * base_damage)
Out[211]:
In [212]:
prob_mass <- span=""> dgeom(c(0:100), prob=stop_chance)
number_of_hits <- span=""> c(1:101)
sum((prob_mass) * (number_of_hits * base_damage))
->->
Out[212]:
With the quiver added, hungering arrow deals 387.5% weapon damage on average.
Now let's consider runes. Runes are special skill upgrades that you can equip to boost or modify a given skill. Hungering arrow has a couple of rune upgrades that increase its direct damage to the target: puncturing arrow, which increases the base pierce chance to 50%, and devouring arrow, which causes it to deal an extra 70% weapon damage after a successful pierce, which adds up with each successive pierce. Let's investigate the average damage of these two runes, assuming we still have a 25% pierce from the quiver.
In [213]:
# Hungering Arrow with puncturing arrow and The Ninth Cirri Satchel
pierce_chance <- span=""> 0.35 + 0.25 + 0.15 # Added puncturing arrow pierce bonus
stop_chance <- span=""> 1-pierce_chance
sample_data <- span=""> rgeom(n=100000, p=stop_chance)
table(sample_data) # Inspect the data
->->->
Out[213]:
In [214]:
summary((sample_data + 1) * base_damage)
Out[214]:
In [215]:
prob_mass <- span=""> dgeom(c(0:150), prob=stop_chance)
number_of_hits <- span=""> c(1:151)
sum((prob_mass) * (number_of_hits * base_damage))
->->
Out[215]:
The puncturing arrow rune with The Ninth Cirri Satchel deals 620% weapon damage on average.
Calculating the damage of devouring arrow is a little more complicated. Every time a pierce occurs with devouring arrow the damage of the arrow increases by 70%. So the first hit does 155% as normal, but after one pierce it does 225%, after two pierces it deals 295% and so on. We have to account for all the additional 70% bonuses we scored for any given shot, both after the final pierce and all the pierces that came before it. For instance, on a 4 pierce shot with 5 total hits we have a total of 0 + 1 + 2 + 3 + 4 = 10 * 70% for 700% in total bonus damage. We can define a function to calculate this value:
In [216]:
bonus_damage <- span=""> function(number_of_hits) {
return ( (((number_of_hits)*(number_of_hits-1))/2) * 70 )
}
bonus_damage(1)
bonus_damage(2)
bonus_damage(3)
bonus_damage(4)
bonus_damage(5)
->
Out[216]:
Out[216]:
Out[216]:
Out[216]:
Out[216]:
In [217]:
# Hungering Arrow with devouring arrow and The Ninth Cirri Satchel
pierce_chance <- span=""> 0.35 + 0.25
stop_chance <- span=""> 1-pierce_chance
sample_data <- span=""> rgeom(n=100000, p=stop_chance)
summary( (sample_data + 1) * base_damage +
sapply(sample_data+1, FUN=bonus_damage))
->->->
Out[217]:
In [218]:
prob_mass <- span=""> dgeom(c(0:150), prob=stop_chance)
number_of_hits <- span=""> c(1:151)
sum((prob_mass) * ((number_of_hits * base_damage) +
sapply(number_of_hits, FUN=bonus_damage)))
->->
Out[218]:
The result shows that the devouring arrow rune is slightly better than puncturing arrow, with 650% weapon damage per shot on average. Now comes the fun part. There is a crossbow called Buriza-Do-Kyanon with a special property that causes your projectiles to pierce two times with 100% probability. That's two pierces for free before we have to worry about stopping. Recalculating the damage with Buriza equipped is simple: just add 2 two hits to each attack:
In [219]:
# Hungering arrow with puncturing arrow, Buriza and The Ninth Cirri Satchel
pierce_chance <- span=""> 0.35 + 0.25 + 0.15
stop_chance <- span=""> 1-pierce_chance
prob_mass <- span=""> dgeom(c(0:150), prob=stop_chance)
number_of_hits <- span=""> c(1:151)
sum((prob_mass) * ((number_of_hits + 2) * base_damage))
->->->->
Out[219]:
In [220]:
# Hungering arrow with devouring arrow, Buriza and The Ninth Cirri Satchel
pierce_chance <- span=""> 0.35 + 0.25
stop_chance <- span=""> 1-pierce_chance
prob_mass <- span=""> dgeom(c(0:150), prob=stop_chance)
number_of_hits <- span=""> c(1:151)
sum( (prob_mass) * (((number_of_hits + 2) * base_damage)
+ sapply(number_of_hits+2, FUN=bonus_damage)) )
->->->->
Out[220]:
Wow! 1380% weapon damage for a basic skill is impressive. Just 2 items and the right rune increases Hungering arrow's damage by 1380/238.46 = 5.78 times and it deals 1380/238.46 = 8.9 times the stated base damage of 155%.
Despite it's respectable single target damage potential hungering arrow hasn't been a main damage dealer in top builds because most main damage dealing skills either hit many targets at once or do more damage. Even a 200% damage skill does more total damage than hungering arrow when you're hitting dense packs of 10 or more monsters. Patch 2.4.1 for season 6 made some big changes that could make hungering arrow a sleeper skill for high end damage dealing. Several items that buff primary skill damage ( Depth Diggers and Simplicity's Strength ) and demon hunter damage ( Wolf Companion and Steady Aim) have been moved from the general additive "bonuses to skills" category and made into their own individual multiplicative bonuses. Adding Depth Diggers, a rank 80 Simplicity's Strength gem and Hunter's Wrath boosts hungering arrow's damage to 1380 x 2 x 1.65 x 1.6 = 7286.4 and it gains 30% faster attack speed. What's more, the damage bonus of the Unhallowed Essence item set, the best set for using hungering arrow, was doubled in the patch.
A quick build with relatively modest experience requirements shows hungering arrow is capable of 40,665,295,317 damage per second against non-elite enemies without various temporary buffs added. But that number is based on the 155% base damage figure and as we calculated, piercing with devouring arrow increases damage by 8.9 times, so that's roughly 360 billion DPS. I don't know of many builds approaching that number. What's more, when certain temporary buffs like wolf companion, convention of the elements and occulus ring align, short bursts of 3 trillion DPS or more are possible.
Hungering arrow struggles when fighting large groups of enemies and there have been reports of the Buriza pierce effect failing to work on every shot. The skill itself can also have some trouble properly tracking enemies. Despite its flaws, hungering arrow is looking like a single target powerhouse for season 6. Supplementing it with bolas which benefit from primary skill bonuses and Buriza could provide some much needed area of effect punch. I expect to see hungering arrow and bola builds pushing much further this season than they have in the past.
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.