Skip to content
Merged
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
5 changes: 4 additions & 1 deletion src/Data/Skills/act_int.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3882,6 +3882,9 @@ skills["FlameWhip"] = {
["active_skill_base_area_length_+"] = {
mod("AreaOfEffect", "BASE", nil),
},
["flame_surge_ignite_damage_as_burning_ground_damage_%"] = {
mod("IgniteDpsAsBurningGround", "MAX", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", unscalable = true }),
},
},
baseFlags = {
spell = true,
Expand Down Expand Up @@ -12030,4 +12033,4 @@ skills["DestructiveLink"] = {
[39] = { 63, 11400, levelRequirement = 99, statInterpolation = { 1, 1, }, cost = { ManaPerMinute = 2830, }, },
[40] = { 64, 11450, levelRequirement = 100, statInterpolation = { 1, 1, }, cost = { ManaPerMinute = 2850, }, },
},
}
}
3 changes: 3 additions & 0 deletions src/Export/Skills/act_int.txt
Original file line number Diff line number Diff line change
Expand Up @@ -854,6 +854,9 @@ local skills, mod, flag, skill = ...
["active_skill_base_area_length_+"] = {
mod("AreaOfEffect", "BASE", nil),
},
["flame_surge_ignite_damage_as_burning_ground_damage_%"] = {
mod("IgniteDpsAsBurningGround", "MAX", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", unscalable = true }),
},
},
#baseMod skill("radius", 30)
#mods
Expand Down
4 changes: 3 additions & 1 deletion src/Modules/Build.lua
Original file line number Diff line number Diff line change
Expand Up @@ -294,9 +294,11 @@ function buildMode:Init(dbFileName, buildName, buildXML, convertBuild)
{ stat = "WithBleedDPS", label = "Total DPS inc. Bleed", fmt = ".1f", compPercent = true, flag = "notAverage", condFunc = function(v,o) return v ~= o.TotalDPS and (o.TotalDot or 0) == 0 and (o.PoisonDPS or 0) == 0 and (o.ImpaleDPS or 0) == 0 and (o.IgniteDPS or 0) == 0 end },
{ stat = "IgniteDPS", label = "Ignite DPS", fmt = ".1f", compPercent = true, warnFunc = function(v) return v >= data.misc.DotDpsCap and "Ignite DPS exceeds in game limit" end },
{ stat = "IgniteDamage", label = "Total Damage per Ignite", fmt = ".1f", compPercent = true, flag = "showAverage" },
{ stat = "BurningGroundDPS", label = "Burning Ground DPS", fmt = ".1f", compPercent = true, warnFunc = function(v,o) return v + o.IgniteDPS >= data.misc.DotDpsCap and "Ignite + Burning Ground DPS exceeds in game limit" end },
{ stat = "WithIgniteDPS", label = "Total DPS inc. Ignite", fmt = ".1f", compPercent = true, flag = "notAverage", condFunc = function(v,o) return v ~= o.TotalDPS and (o.TotalDot or 0) == 0 and (o.PoisonDPS or 0) == 0 and (o.ImpaleDPS or 0) == 0 and (o.BleedDPS or 0) == 0 end },
{ stat = "WithIgniteAverageDamage", label = "Average Dmg. inc. Ignite", fmt = ".1f", compPercent = true },
{ stat = "PoisonDPS", label = "Poison DPS", fmt = ".1f", compPercent = true, warnFunc = function(v) return v >= data.misc.DotDpsCap and "Poison DPS exceeds in game limit" end },
{ stat = "CausticGroundDPS", label = "Caustic Ground DPS", fmt = ".1f", compPercent = true, warnFunc = function(v,o) return v + o.PoisonDPS >= data.misc.DotDpsCap and "Poison + Caustic Ground DPS exceeds in game limit" end },
{ stat = "PoisonDamage", label = "Total Damage per Poison", fmt = ".1f", compPercent = true },
{ stat = "WithPoisonDPS", label = "Total DPS inc. Poison", fmt = ".1f", compPercent = true, flag = "poison", flag = "notAverage", condFunc = function(v,o) return v ~= o.TotalDPS and (o.TotalDot or 0) == 0 and (o.IgniteDPS or 0) == 0 and (o.ImpaleDPS or 0) == 0 and (o.BleedDPS or 0) == 0 end },
{ stat = "DecayDPS", label = "Decay DPS", fmt = ".1f", compPercent = true },
Expand Down Expand Up @@ -1346,7 +1348,7 @@ function buildMode:AddDisplayStatList(statList, actor)
end
end
if statData.warnFunc and statVal and ((statData.condFunc and statData.condFunc(statVal, actor.output)) or not statData.condFunc) then
local v = statData.warnFunc(statVal)
local v = statData.warnFunc(statVal, actor.output)
if v then
InsertIfNew(self.controls.warnings.lines, v)
end
Expand Down
23 changes: 23 additions & 0 deletions src/Modules/CalcOffence.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3266,6 +3266,15 @@ function calcs.offence(env, actor, activeSkill)
local PoisonDPSUncapped = baseVal * effectMod * rateMod * effMult
local PoisonDPSCapped = m_min(PoisonDPSUncapped, data.misc.DotDpsCap)
output.PoisonDPS = PoisonDPSCapped
local groundMult = m_max(skillModList:Max(nil, "PoisonDpsAsCausticGround") or 0, enemyDB:Max(nil, "PoisonDpsAsCausticGround") or 0)
if groundMult > 0 then
local CausticGroundDPSUncapped = baseVal * effectMod * rateMod * effMult * groundMult / 100
local CausticGroundDPSCapped = m_min(CausticGroundDPSUncapped, data.misc.DotDpsCap)
if PoisonDPSCapped + CausticGroundDPSCapped > data.misc.DotDpsCap then
CausticGroundDPSCapped = data.misc.DotDpsCap - CausticGroundDPSCapped
end
globalOutput.CausticGroundDPS = CausticGroundDPSCapped
end
local durationBase
if skillData.poisonDurationIsSkillDuration then
durationBase = skillData.duration
Expand Down Expand Up @@ -3521,6 +3530,20 @@ function calcs.offence(env, actor, activeSkill)
local IgniteDPSUncapped = baseVal * effectMod * rateMod * igniteStacks * effMult
local IgniteDPSCapped = m_min(IgniteDPSUncapped, data.misc.DotDpsCap)
output.IgniteDPS = IgniteDPSCapped
local groundMult = m_max(skillModList:Max(nil, "IgniteDpsAsBurningGround") or 0, enemyDB:Max(nil, "IgniteDpsAsBurningGround") or 0)
if groundMult > 0 then
-- Always use fire eff multi
local resist = m_min(enemyDB:Sum("BASE", nil, "FireResist", "ElementalResist") * calcLib.mod(enemyDB, nil, "FireResist", "ElementalResist"), data.misc.EnemyMaxResist)
local takenInc = enemyDB:Sum("INC", dotCfg, "DamageTaken", "DamageTakenOverTime", "FireDamageTaken", "FireDamageTakenOverTime", "ElementalDamageTaken")
local takenMore = enemyDB:More(dotCfg, "DamageTaken", "DamageTakenOverTime", "FireDamageTaken", "FireDamageTakenOverTime", "ElementalDamageTaken")
local fireEffMult = (1 - resist / 100) * (1 + takenInc / 100) * takenMore
local BurningGroundDPSUncapped = baseVal * effectMod * rateMod * fireEffMult * groundMult / 100
local BurningGroundDPSCapped = m_min(BurningGroundDPSUncapped, data.misc.DotDpsCap)
if IgniteDPSCapped + BurningGroundDPSCapped > data.misc.DotDpsCap then
BurningGroundDPSCapped = data.misc.DotDpsCap - IgniteDPSCapped
end
globalOutput.BurningGroundDPS = BurningGroundDPSCapped
end
globalOutput.IgniteDamage = output.IgniteDPS * globalOutput.IgniteDuration
if skillFlags.igniteCanStack then
output.IgniteDamage = output.IgniteDPS * globalOutput.IgniteDuration
Expand Down
2 changes: 2 additions & 0 deletions src/Modules/CalcSections.lua
Original file line number Diff line number Diff line change
Expand Up @@ -813,6 +813,7 @@ return {
{ breakdown = "MainHand.PoisonDPS" },
{ breakdown = "OffHand.PoisonDPS" },
}, },
{ label = "Caustic Ground DPS", haveOutput = "CausticGroundDPS", { format = "{0:output:CausticGroundDPS}", { breakdown = "CausticGroundDPS" } } },
{ label = "Poison Duration", { format = "{2:output:PoisonDuration}s",
{ breakdown = "PoisonDuration" },
{ label = "Player modifiers", modName = { "EnemyPoisonDuration", "SkillAndDamagingAilmentDuration", "PoisonFaster" }, cfg = "poison" },
Expand Down Expand Up @@ -876,6 +877,7 @@ return {
{ breakdown = "OffHand.IgniteDPS" },
{ modName = { "IgniteBurnRate" }, cfg = "skill" },
}, },
{ label = "Burning Ground DPS", haveOutput = "BurningGroundDPS", { format = "{0:output:BurningGroundDPS}", { breakdown = "BurningGroundDPS" } } },
{ label = "Ignite Duration", { format = "{2:output:IgniteDuration}s",
{ breakdown = "IgniteDuration" },
{ label = "Player modifiers", modName = { "EnemyIgniteDuration", "SkillAndDamagingAilmentDuration", "IgniteBurnFaster", "IgniteBurnSlower" }, cfg = "skill" },
Expand Down
32 changes: 31 additions & 1 deletion src/Modules/Calcs.lua
Original file line number Diff line number Diff line change
Expand Up @@ -181,9 +181,24 @@ function calcs.calcFullDPS(build, mode, override, specEnv)
local fullEnv, cachedPlayerDB, cachedEnemyDB, cachedMinionDB = calcs.initEnv(build, mode, override, specEnv)
local usedEnv = nil

local fullDPS = { combinedDPS = 0, TotalDotDPS = 0, skills = { }, poisonDPS = 0, impaleDPS = 0, igniteDPS = 0, bleedDPS = 0, decayDPS = 0, dotDPS = 0, cullingMulti = 0 }
local fullDPS = {
combinedDPS = 0,
TotalDotDPS = 0,
skills = { },
poisonDPS = 0,
impaleDPS = 0,
igniteDPS = 0,
bleedDPS = 0,
decayDPS = 0,
burningGroundDPS = 0,
causticGroundDPS = 0,
dotDPS = 0,
cullingMulti = 0
}

local bleedSource = ""
local igniteSource = ""
local poisonSource = ""
GlobalCache.numActiveSkillInFullDPS = 0
for _, activeSkill in ipairs(fullEnv.player.activeSkillList) do
if activeSkill.socketGroup and activeSkill.socketGroup.includeInFullDPS and not isExcludedFromFullDps(activeSkill) then
Expand Down Expand Up @@ -278,9 +293,16 @@ function calcs.calcFullDPS(build, mode, override, specEnv)
end
if usedEnv.player.output.IgniteDPS and usedEnv.player.output.IgniteDPS > fullDPS.igniteDPS then
fullDPS.igniteDPS = usedEnv.player.output.IgniteDPS
if usedEnv.player.output.BurningGroundDPS then
fullDPS.burningGroundDPS = usedEnv.player.output.BurningGroundDPS
end
igniteSource = activeSkill.activeEffect.grantedEffect.name
end
if usedEnv.player.output.PoisonDPS and usedEnv.player.output.PoisonDPS > 0 then
if usedEnv.player.output.CausticGroundDPS and usedEnv.player.output.PoisonDPS > fullDPS.poisonDPS then
fullDPS.causticGroundDPS = usedEnv.player.output.CausticGroundDPS
poisonSource = activeSkill.activeEffect.grantedEffect.name
end
fullDPS.poisonDPS = fullDPS.poisonDPS + usedEnv.player.output.PoisonDPS * (usedEnv.player.output.TotalPoisonStacks or 1) * activeSkillCount
end
if usedEnv.player.output.ImpaleDPS and usedEnv.player.output.ImpaleDPS > 0 then
Expand Down Expand Up @@ -318,11 +340,19 @@ function calcs.calcFullDPS(build, mode, override, specEnv)
if fullDPS.igniteDPS > 0 then
t_insert(fullDPS.skills, { name = "Best Ignite DPS", dps = fullDPS.igniteDPS, count = 1, source = igniteSource })
fullDPS.TotalDotDPS = fullDPS.TotalDotDPS + fullDPS.igniteDPS
if fullDPS.burningGroundDPS > 0 then
t_insert(fullDPS.skills, { name = "Best Burning Ground DPS", dps = fullDPS.burningGroundDPS, count = 1, source = igniteSource })
fullDPS.TotalDotDPS = fullDPS.TotalDotDPS + fullDPS.burningGroundDPS
end
end
if fullDPS.poisonDPS > 0 then
fullDPS.poisonDPS = m_min(fullDPS.poisonDPS, data.misc.DotDpsCap)
t_insert(fullDPS.skills, { name = "Full Poison DPS", dps = fullDPS.poisonDPS, count = 1 })
fullDPS.TotalDotDPS = fullDPS.TotalDotDPS + fullDPS.poisonDPS
if fullDPS.causticGroundDPS > 0 then
t_insert(fullDPS.skills, { name = "Best Caustic Ground DPS", dps = fullDPS.causticGroundDPS, count = 1, source = poisonSource })
fullDPS.TotalDotDPS = fullDPS.TotalDotDPS + fullDPS.causticGroundDPS
end
end
if fullDPS.impaleDPS > 0 then
t_insert(fullDPS.skills, { name = "Full Impale DPS", dps = fullDPS.impaleDPS, count = 1 })
Expand Down