Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Data/2_6/ModCache.lua

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Data/3_0/ModCache.lua

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions Modules/Build.lua
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,9 @@ function buildMode:Init(dbFileName, buildName, buildXML, targetVersion)
{ stat = "TotalDPS", label = "Total DPS", fmt = ".1f", compPercent = true, flag = "notAverage" },
{ stat = "TotalDot", label = "DoT DPS", fmt = ".1f", compPercent = true },
{ stat = "BleedDPS", label = "Bleed DPS", fmt = ".1f", compPercent = true },
{ stat = "BleedDamage", label = "Total Damage per Bleed", fmt = ".1f", compPercent = true},
{ stat = "WithBleedDPS", label = "Total DPS inc. Bleed", fmt = ".1f", compPercent = true},
{ stat = "WithBleedAverageDamage", label = "Average Dmg. inc. Bleed", fmt = ".1f", compPercent = true},
{ stat = "IgniteDPS", label = "Ignite DPS", fmt = ".1f", compPercent = true },
{ stat = "IgniteDamage", label = "Total Damage per Ignite", fmt = ".1f", compPercent = true },
{ stat = "WithIgniteDPS", label = "Total DPS inc. Ignite", fmt = ".1f", compPercent = true },
Expand Down
60 changes: 59 additions & 1 deletion Modules/CalcOffence-3_0.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1194,6 +1194,7 @@ function calcs.offence(env, actor)
end

skillFlags.bleed = false
skillFlags.bleedCanStack = modDB:Sum("FLAG", skillcfg, "BleedCanStack")
skillFlags.poison = false
skillFlags.ignite = false
skillFlags.igniteCanStack = modDB:Sum("FLAG", skillCfg, "IgniteCanStack")
Expand Down Expand Up @@ -1407,6 +1408,21 @@ function calcs.offence(env, actor)
end
local durationMod = calcLib.mod(modDB, dotCfg, "EnemyBleedDuration", "SkillAndDamagingAilmentDuration", skillData.bleedIsSkillEffect and "Duration" or nil) * calcLib.mod(enemyDB, nil, "SelfBleedDuration")
globalOutput.BleedDuration = durationBase * durationMod * debuffDurationMult
if skillFlags.bleedCanStack then
output.BleedDamage = output.BleedDPS * globalOutput.BleedDuration
if skillData.showAverage then
output.TotalBleedAverageDamage = output.HitChance / 100 * output.BleedChance / 100 * output.BleedDamage
else
output.TotalBleedStacks = output.HitChance / 100 * output.BleedChance / 100 * globalOutput.BleedDuration * (globalOutput.HitSpeed or globalOutput.Speed) * (skillData.dpsMultiplier or 1)
if output.TotalBleedStacks > 8 then
output.TotalBleedStacks = 8
end
if skillData.doubleHitsWhenDualWielding then --Workaround for Cleave and Dual Strike
output.TotalBleedStacks = output.TotalBleedStacks / 2
end
output.TotalBleedDPS = output.BleedDPS * output.TotalBleedStacks
end
end
if breakdown then
t_insert(breakdown.BleedDPS, s_format("x %.2f ^8(bleed deals %d%% per second)", basePercent/100, basePercent))
if effectMod ~= 1 then
Expand All @@ -1423,6 +1439,29 @@ function calcs.offence(env, actor)
{ "%.3f ^8(effective DPS modifier)", effMult },
total = s_format("= %.1f ^8per second", output.BleedDPS),
})
if skillFlags.bleedCanStack then
breakdown.BleedDamage = { }
if isAttack then
t_insert(breakdown.BleedDamage, pass.label..":")
end
t_insert(breakdown.BleedDamage, s_format("%.1f ^8(damage per second)", output.BleedDPS))
t_insert(breakdown.BleedDamage, s_format("x %.2fs ^8(bleed duration)", globalOutput.BleedDuration))
t_insert(breakdown.BleedDamage, s_format("= %.1f ^8damage per bleed stack", output.BleedDamage))
if not skillData.showAverage then
breakdown.TotalBleedStacks = { }
if isAttack then
t_insert(breakdown.TotalBleedStacks, pass.label..":")
end
breakdown.multiChain(breakdown.TotalBleedStacks, {
base = s_format("%.2fs ^8(bleed duration)", globalOutput.BleedDuration),
{ "%.2f ^8(bleed chance)", output.BleedChance / 100 },
{ "%.2f ^8(hit chance)", output.HitChance / 100 },
{ "%.2f ^8(hits per second)", globalOutput.HitSpeed or globalOutput.Speed },
{ "%g ^8(dps multiplier for this skill)", skillData.dpsMultiplier or 1 },
total = s_format("= %.1f", output.TotalBleedStacks),
})
end
end
if globalOutput.BleedDuration ~= durationBase then
globalBreakdown.BleedDuration = {
s_format("%.2fs ^8(base duration)", durationBase)
Expand Down Expand Up @@ -1847,6 +1886,15 @@ function calcs.offence(env, actor)
if isAttack then
combineStat("BleedChance", "AVERAGE")
combineStat("BleedDPS", "CHANCE", "BleedChance")
if skillFlags.bleedCanStack then
combineStat("BleedDamage", "CHANCE", "BleedChance")
if skillData.showAverage then
combineStat("TotalBleedAverageDamage", "DPS")
else
combineStat("TotalBleedStacks", "DPS")
combineStat("TotalBleedDPS", "DPS")
end
end
combineStat("PoisonChance", "AVERAGE")
combineStat("PoisonDPS", "CHANCE", "PoisonChance")
combineStat("PoisonDamage", "CHANCE", "PoisonChance")
Expand Down Expand Up @@ -1943,7 +1991,17 @@ function calcs.offence(env, actor)
end
end
if skillFlags.bleed then
output.CombinedDPS = output.CombinedDPS + output.BleedDPS
if skillFlags.bleedCanStack then
if skillData.showAverage then
output.CombinedDPS = output.CombinedDPS + output.TotalBleedAverageDamage
output.WithBleedAverageDamage = baseDPS + output.TotalBleedAverageDamage
else
output.CombinedDPS = output.CombinedDPS + output.TotalBleedDPS
output.WithBleedDPS = baseDPS + output.TotalBleedDPS
end
else
output.CombinedDPS = output.CombinedDPS + output.BleedDPS
end
end
if skillFlags.decay then
output.CombinedDPS = output.CombinedDPS + output.DecayDPS
Expand Down
10 changes: 10 additions & 0 deletions Modules/CalcSections-3_0.lua
Original file line number Diff line number Diff line change
Expand Up @@ -453,6 +453,16 @@ return {
{ label = "Player modifiers", modName = { "EnemyBleedDuration", "SkillAndDamagingAilmentDuration" }, cfg = "bleed" },
{ label = "Enemy modifiers", modName = "SelfBleedDuration", enemy = true },
}, },
{ label = "Dmg. per Bleed", flag = "bleedCanStack", { format = "{1:output:BleedDamage}",
{ breakdown = "MainHand.BleedDamage" },
{ breakdown = "OffHand.BleedDamage" },
{ breakdown = "BleedDamage" },
}, },
{ flagList = { "notAverage", "bleedCanStack" }, label = "Max Bleed Stacks", { format = "{1:output:TotalBleedStacks}",
{ breakdown = "MainHand.TotalBleedStacks" },
{ breakdown = "OffHand.TotalBleedStacks" },
{ breakdown = "TotalBleedStacks" },
}, },
} },
{ 1, "Poison", 1, "Poison", colorCodes.OFFENCE, {
extra = "{0:output:PoisonChance}% {1:output:PoisonDPS} {2:output:PoisonDuration}s",
Expand Down
1 change: 1 addition & 0 deletions Modules/ModParser-3_0.lua
Original file line number Diff line number Diff line change
Expand Up @@ -723,6 +723,7 @@ local specialModList = {
["energy shield protects mana instead of life"] = { flag("EnergyShieldProtectsMana") },
["modifiers to critical strike multiplier also apply to damage multiplier for ailments from critical strikes at (%d+)%% of their value"] = function(num) return { mod("CritMultiplierAppliesToDegen", "BASE", num) } end,
["your bleeding does not deal extra damage while the enemy is moving"] = { flag("Condition:NoExtraBleedDamageToMovingEnemy") },
["you can inflict bleeding on an enemy up to 8 times"] = { flag("BleedCanStack") },
-- Ascendancy notables
["can allocate passives from the %a+'s starting point"] = { },
["movement skills cost no mana"] = { mod("ManaCost", "MORE", -100, nil, 0, KeywordFlag.Movement) },
Expand Down