@@ -566,10 +566,13 @@ function calcs.reducePoolsByDamage(poolTable, damageTable, actor)
566566 resourcesLostToTypeDamage [damageType ].sharedGuard = tempDamage >= 1 and tempDamage or nil
567567 end
568568 if ward > 0 then
569- local tempDamage = m_min (damageRemainder * (1 - (modDB :Sum (" BASE" , nil , " WardBypass" ) or 0 ) / 100 ), ward )
570- ward = ward - tempDamage
571- damageRemainder = damageRemainder - tempDamage
572- resourcesLostToTypeDamage [damageType ].ward = tempDamage >= 1 and tempDamage or nil
569+ local wardBypassFraction = (modDB :Sum (" BASE" , nil , " WardBypass" ) or 0 ) / 100
570+ local runeWardDrainMult = 1 + (output .RuneWardDamageTaken or 0 ) / 100
571+ -- Player is shielded for absorbedByPlayer; ward pool loses absorbedByPlayer * drainMult
572+ local absorbedByPlayer = m_min (damageRemainder * (1 - wardBypassFraction ), ward / runeWardDrainMult )
573+ ward = ward - absorbedByPlayer * runeWardDrainMult
574+ damageRemainder = damageRemainder - absorbedByPlayer
575+ resourcesLostToTypeDamage [damageType ].ward = absorbedByPlayer >= 1 and absorbedByPlayer or nil
573576 end
574577 damageRemaindersBeforeES [damageType ] = damageRemainder > 0 and damageRemainder or nil
575578 end
@@ -3144,6 +3147,7 @@ function calcs.buildDefenceEstimations(env, actor)
31443147 poolTable .Life = m_min (poolTable .Life + DamageIn .LifeWhenHit * (gainMult - 1 ), gainMult * (output .LifeRecoverable or 0 ))
31453148 poolTable .Mana = m_min (poolTable .Mana + DamageIn .ManaWhenHit * (gainMult - 1 ), gainMult * (output .ManaUnreserved or 0 ))
31463149 poolTable .EnergyShield = m_min (poolTable .EnergyShield + DamageIn .EnergyShieldWhenHit * (gainMult - 1 ), gainMult * output .EnergyShieldRecoveryCap )
3150+ poolTable .Ward = m_min ((poolTable .Ward or 0 ) + (DamageIn .WardWhenHit or 0 ) * (gainMult - 1 ), gainMult * (output .Ward or 0 ))
31473151 end
31483152 poolTable = calcs .reducePoolsByDamage (poolTable , Damage , actor )
31493153
@@ -3155,6 +3159,7 @@ function calcs.buildDefenceEstimations(env, actor)
31553159 poolTable .Life = m_min (poolTable .Life + DamageIn .LifeWhenHit , output .LifeRecoverable or 0 )
31563160 poolTable .Mana = m_min (poolTable .Mana + DamageIn .ManaWhenHit , output .ManaUnreserved or 0 )
31573161 poolTable .EnergyShield = m_min (poolTable .EnergyShield + DamageIn .EnergyShieldWhenHit , output .EnergyShieldRecoveryCap )
3162+ poolTable .Ward = m_min ((poolTable .Ward or 0 ) + (DamageIn .WardWhenHit or 0 ), output .Ward or 0 )
31583163 end
31593164 iterationMultiplier = 1
31603165 -- to speed it up, run recursively but accelerated
@@ -3173,6 +3178,7 @@ function calcs.buildDefenceEstimations(env, actor)
31733178 Damage .LifeWhenHit = DamageIn .LifeWhenHit
31743179 Damage .ManaWhenHit = DamageIn .ManaWhenHit
31753180 Damage .EnergyShieldWhenHit = DamageIn .EnergyShieldWhenHit
3181+ Damage .WardWhenHit = DamageIn .WardWhenHit
31763182 end
31773183 Damage [" cycles" ] = DamageIn [" cycles" ] * speedUp
31783184 Damage [" iterations" ] = DamageIn [" iterations" ]
@@ -3239,6 +3245,7 @@ function calcs.buildDefenceEstimations(env, actor)
32393245 DamageIn .LifeWhenHit = output .LifeOnBlock * BlockChance
32403246 DamageIn .ManaWhenHit = output .ManaOnBlock * BlockChance
32413247 DamageIn .EnergyShieldWhenHit = output .EnergyShieldOnBlock * BlockChance
3248+ DamageIn .WardWhenHit = (output .WardRecoverOnBlock or 0 ) * BlockChance
32423249 if damageCategoryConfig == " Spell" or damageCategoryConfig == " SpellProjectile" then
32433250 DamageIn .EnergyShieldWhenHit = DamageIn .EnergyShieldWhenHit + output .EnergyShieldOnSpellBlock * BlockChance
32443251 elseif damageCategoryConfig == " Average" then
@@ -3270,13 +3277,15 @@ function calcs.buildDefenceEstimations(env, actor)
32703277 end
32713278 -- gain when hit (currently just gain on block/suppress)
32723279 if not env .configInput .DisableEHPGainOnBlock then
3273- if (DamageIn .LifeWhenHit or 0 ) ~= 0 or (DamageIn .ManaWhenHit or 0 ) ~= 0 or DamageIn .EnergyShieldWhenHit ~= 0 then
3280+ if (DamageIn .LifeWhenHit or 0 ) ~= 0 or (DamageIn .ManaWhenHit or 0 ) ~= 0
3281+ or (DamageIn .EnergyShieldWhenHit or 0 ) ~= 0 or (DamageIn .WardWhenHit or 0 ) ~= 0 then
32743282 DamageIn .GainWhenHit = true
32753283 end
32763284 else
32773285 DamageIn .LifeWhenHit = 0
32783286 DamageIn .ManaWhenHit = 0
32793287 DamageIn .EnergyShieldWhenHit = 0
3288+ DamageIn .WardWhenHit = 0
32803289 end
32813290 for _ , damageType in ipairs (dmgTypeList ) do
32823291 -- Emperor's Vigilance (this needs to fail with divine flesh as it can't override it, hence the check for high bypass)
@@ -3972,7 +3981,7 @@ function calcs.buildDefenceEstimations(env, actor)
39723981 output .NetLifeRegen = output .NetLifeRegen - totalLifeDegen
39733982 output .NetManaRegen = output .NetManaRegen - totalManaDegen
39743983 output .NetEnergyShieldRegen = output .NetEnergyShieldRegen - totalEnergyShieldDegen
3975- output .TotalNetRegen = output .NetLifeRegen + output .NetManaRegen + output .NetEnergyShieldRegen
3984+ output .TotalNetRegen = output .NetLifeRegen + output .NetManaRegen + output .NetEnergyShieldRegen + ( output . WardRegen or 0 )
39763985 if breakdown then
39773986 t_insert (breakdown .NetLifeRegen , s_format (" %.1f ^8(total life regen)" , output .LifeRegenRecovery ))
39783987 t_insert (breakdown .NetLifeRegen , s_format (" - %.1f ^8(total life degen)" , totalLifeDegen ))
@@ -3987,6 +3996,7 @@ function calcs.buildDefenceEstimations(env, actor)
39873996 s_format (" Net Life Regen: %.1f" , output .NetLifeRegen ),
39883997 s_format (" + Net Mana Regen: %.1f" , output .NetManaRegen ),
39893998 s_format (" + Net Energy Shield Regen: %.1f" , output .NetEnergyShieldRegen ),
3999+ output .WardRegen and output .WardRegen > 0 and s_format (" + Ward Regen: %.1f" , output .WardRegen ) or nil ,
39904000 s_format (" = Total Net Regen: %.1f" , output .TotalNetRegen )
39914001 }
39924002 end
@@ -4214,7 +4224,7 @@ function calcs.buildDefenceEstimations(env, actor)
42144224 output .ComprehensiveNetLifeRegen = output .ComprehensiveNetLifeRegen + (output .LifeRecoupRecoveryAvg or 0 ) - totalLifeDegen - (output .LifeLossLostAvg or 0 )
42154225 output .ComprehensiveNetManaRegen = output .ComprehensiveNetManaRegen + (output .ManaRecoupRecoveryAvg or 0 ) - totalManaDegen
42164226 output .ComprehensiveNetEnergyShieldRegen = output .ComprehensiveNetEnergyShieldRegen + (output .EnergyShieldRecoupRecoveryAvg or 0 ) - totalEnergyShieldDegen
4217- output .ComprehensiveTotalNetRegen = output .ComprehensiveNetLifeRegen + output .ComprehensiveNetManaRegen + output .ComprehensiveNetEnergyShieldRegen
4227+ output .ComprehensiveTotalNetRegen = output .ComprehensiveNetLifeRegen + output .ComprehensiveNetManaRegen + output .ComprehensiveNetEnergyShieldRegen + ( output . WardRegen or 0 )
42184228 if breakdown then
42194229 t_insert (breakdown .ComprehensiveNetLifeRegen , s_format (" %.1f ^8(total life regen)" , output .LifeRegenRecovery ))
42204230 if (output .LifeRecoupRecoveryAvg or 0 ) ~= 0 then
@@ -4241,6 +4251,7 @@ function calcs.buildDefenceEstimations(env, actor)
42414251 s_format (" Net Life Regen: %.1f" , output .ComprehensiveNetLifeRegen ),
42424252 s_format (" + Net Mana Regen: %.1f" , output .ComprehensiveNetManaRegen ),
42434253 s_format (" + Net Energy Shield Regen: %.1f" , output .ComprehensiveNetEnergyShieldRegen ),
4254+ output .WardRegen and output .WardRegen > 0 and s_format (" + Ward Regen: %.1f" , output .WardRegen ) or nil ,
42444255 s_format (" = Total Net Regen: %.1f" , output .ComprehensiveTotalNetRegen )
42454256 }
42464257 end
0 commit comments