Release 1.3.3
- Added support for Intuitive Leap - Added support for Decay - Added support for Fire Burst - Subscript system can now handle multiple scripts
This commit is contained in:
@@ -255,6 +255,7 @@ function buildMode:Init(dbFileName, buildName)
|
||||
{ stat = "PoisonDamage", label = "Total Damage per Poison", fmt = ".1f", compPercent = true },
|
||||
{ stat = "WithPoisonDPS", label = "Total DPS inc. Poison", fmt = ".1f", compPercent = true },
|
||||
{ stat = "WithPoisonAverageDamage", label = "Average Dmg. inc. Poison", fmt = ".1f", compPercent = true },
|
||||
{ stat = "DecayDPS", label = "Decay DPS", fmt = ".1f", compPercent = true },
|
||||
{ stat = "ManaCost", label = "Mana Cost", fmt = "d", compPercent = true, lowerIsBetter = true, condFunc = function() return true end },
|
||||
{ },
|
||||
{ stat = "Str", label = "Strength", fmt = "d" },
|
||||
|
||||
@@ -481,6 +481,23 @@ return {
|
||||
{ breakdown = "IgniteDamage" },
|
||||
}, },
|
||||
} },
|
||||
{ 1, "Decay", 1, "Decay", data.colorCodes.OFFENCE, {
|
||||
extra = "{1:output:DecayDPS} {2:output:DecayDuration}s",
|
||||
flag = "decay",
|
||||
{ label = "Total Increased", { format = "{0:mod:1}%", { modName = { "Damage", "ChaosDamage" }, modType = "INC", cfg = "decay" }, }, },
|
||||
{ label = "Total More", { format = "{0:mod:1}%", { modName = { "Damage", "ChaosDamage" }, modType = "MORE", cfg = "decay" }, }, },
|
||||
{ label = "Effective DPS Mod", flag = "effective", { format = "x {3:output:DecayEffMult}",
|
||||
{ breakdown = "DecayEffMult" },
|
||||
{ label = "Enemy modifiers", modName = { "ChaosResist", "DamageTaken", "DotTaken", "ChaosDamageTaken" }, enemy = true },
|
||||
}, },
|
||||
{ label = "Decay DPS", { format = "{1:output:DecayDPS}",
|
||||
{ breakdown = "DecayDPS" },
|
||||
}, },
|
||||
{ label = "Decay Duration", { format = "{2:output:DecayDuration}s",
|
||||
{ breakdown = "DecayDuration" },
|
||||
{ modName = "Duration", cfg = "decay" },
|
||||
}, },
|
||||
} },
|
||||
{ 1, "MiscEffects", 1, "Other Effects", data.colorCodes.OFFENCE, {
|
||||
{ label = "Chance to Shock", flag = "shock", { format = "{0:output:ShockChance}%",
|
||||
{ breakdown = "MainHand.ShockChance" },
|
||||
|
||||
@@ -450,8 +450,7 @@ local function buildNodeModList(env, nodeList, finishJewels)
|
||||
|
||||
-- Run radius jewels
|
||||
for _, rad in pairs(env.radiusJewelList) do
|
||||
local vX, vY = node.x - rad.x, node.y - rad.y
|
||||
if vX * vX + vY * vY <= rad.rSq then
|
||||
if rad.nodes[node.id] then
|
||||
rad.func(node.modList, modList, rad.data)
|
||||
end
|
||||
end
|
||||
@@ -724,7 +723,7 @@ local function initEnv(build, mode, override)
|
||||
item = nil
|
||||
elseif item and item.jewelRadiusIndex then
|
||||
-- Jewel has a radius, add it to the list
|
||||
local funcList = item.jewelFuncList or { function(nodeMods, out, data)
|
||||
local funcList = item.jewelData.funcList or { function(nodeMods, out, data)
|
||||
-- Default function just tallies all stats in radius
|
||||
if nodeMods then
|
||||
for _, stat in pairs({"Str","Dex","Int"}) do
|
||||
@@ -733,12 +732,9 @@ local function initEnv(build, mode, override)
|
||||
end
|
||||
end }
|
||||
for _, func in ipairs(funcList) do
|
||||
local radiusInfo = data.jewelRadius[item.jewelRadiusIndex]
|
||||
local node = build.spec.nodes[slot.nodeId]
|
||||
t_insert(env.radiusJewelList, {
|
||||
rSq = radiusInfo.rad * radiusInfo.rad,
|
||||
x = node.x,
|
||||
y = node.y,
|
||||
nodes = node.nodesInRadius[item.jewelRadiusIndex],
|
||||
func = func,
|
||||
item = item,
|
||||
nodeId = slot.nodeId,
|
||||
@@ -1730,7 +1726,11 @@ local function performCalcs(env)
|
||||
-- Update skill data
|
||||
for _, value in ipairs(modDB:Sum("LIST", skillCfg, "Misc")) do
|
||||
if value.type == "SkillData" then
|
||||
skillData[value.key] = value.value
|
||||
if value.merge == "MAX" then
|
||||
skillData[value.key] = m_max(value.value, skillData[value.key] or 0)
|
||||
else
|
||||
skillData[value.key] = value.value
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -2830,6 +2830,49 @@ local function performCalcs(env)
|
||||
combineStat("FreezeDurationMod", "AVERAGE")
|
||||
end
|
||||
|
||||
if skillFlags.hit and skillData.decay then
|
||||
-- Calculate DPS for Essence of Delirium's Decay effect
|
||||
skillFlags.decay = true
|
||||
env.mainSkill.decayCfg = {
|
||||
slotName = skillCfg.slotName,
|
||||
flags = bor(band(skillCfg.flags, ModFlag.SourceMask), ModFlag.Dot, skillData.dotIsSpell and ModFlag.Spell or 0),
|
||||
keywordFlags = skillCfg.keywordFlags,
|
||||
}
|
||||
local dotCfg = env.mainSkill.decayCfg
|
||||
local effMult = 1
|
||||
if env.mode_effective then
|
||||
local resist = m_min(enemyDB:Sum("BASE", nil, "ChaosResist"), 75)
|
||||
local taken = enemyDB:Sum("INC", nil, "DamageTaken", "ChaosDamageTaken", "DotTaken")
|
||||
effMult = (1 - resist / 100) * (1 + taken / 100)
|
||||
output["DecayEffMult"] = effMult
|
||||
if breakdown and effMult ~= 1 then
|
||||
breakdown.DecayEffMult = effMultBreakdown("Chaos", resist, 0, taken, effMult)
|
||||
end
|
||||
end
|
||||
local inc = modDB:Sum("INC", dotCfg, "Damage", "ChaosDamage")
|
||||
local more = round(modDB:Sum("MORE", dotCfg, "Damage", "ChaosDamage"), 2)
|
||||
output.DecayDPS = skillData.decay * (1 + inc/100) * more * effMult
|
||||
local durationMod = calcMod(modDB, dotCfg, "Duration")
|
||||
output.DecayDuration = 10 * durationMod * debuffDurationMult
|
||||
if breakdown then
|
||||
breakdown.DecayDPS = { }
|
||||
t_insert(breakdown.DecayDPS, "Decay DPS:")
|
||||
dotBreakdown(breakdown.DecayDPS, skillData.decay, inc, more, nil, effMult, output.DecayDPS)
|
||||
if output.DecayDuration ~= 2 then
|
||||
breakdown.DecayDuration = {
|
||||
s_format("%.2fs ^8(base duration)", 10)
|
||||
}
|
||||
if durationMod ~= 1 then
|
||||
t_insert(breakdown.DecayDuration, s_format("x %.2f ^8(duration modifier)", durationMod))
|
||||
end
|
||||
if debuffDurationMult ~= 1 then
|
||||
t_insert(breakdown.DecayDuration, s_format("/ %.2f ^8(debuff expires slower/faster)", 1 / debuffDurationMult))
|
||||
end
|
||||
t_insert(breakdown.DecayDuration, s_format("= %.2fs", output.DecayDuration))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Calculate combined DPS estimate, including DoTs
|
||||
local baseDPS = output[(env.mode_average and "AverageDamage") or "TotalDPS"] + output.TotalDot
|
||||
output.CombinedDPS = baseDPS
|
||||
@@ -2858,6 +2901,9 @@ local function performCalcs(env)
|
||||
if skillFlags.bleed then
|
||||
output.CombinedDPS = output.CombinedDPS + output.BleedDPS
|
||||
end
|
||||
if skillFlags.decay then
|
||||
output.CombinedDPS = output.CombinedDPS + output.DecayDPS
|
||||
end
|
||||
end
|
||||
|
||||
-- Print various tables to the console
|
||||
|
||||
@@ -544,11 +544,13 @@ function itemLib.buildItemModListForSlotNum(item, baseList, slotNum)
|
||||
end
|
||||
end
|
||||
elseif item.type == "Jewel" then
|
||||
item.jewelFuncList = nil
|
||||
local jewelData = item.jewelData
|
||||
for _, value in ipairs(modList:Sum("LIST", nil, "Misc")) do
|
||||
if value.type == "JewelFunc" then
|
||||
item.jewelFuncList = item.jewelFuncList or { }
|
||||
t_insert(item.jewelFuncList, value.func)
|
||||
jewelData.funcList = jewelData.funcList or { }
|
||||
t_insert(jewelData.funcList, value.func)
|
||||
elseif value.type == "JewelData" then
|
||||
jewelData[value.key] = value.value
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -593,6 +595,8 @@ function itemLib.buildItemModList(item)
|
||||
item.armourData = { }
|
||||
elseif item.base.flask then
|
||||
item.flaskData = { }
|
||||
elseif item.type == "Jewel" then
|
||||
item.jewelData = { }
|
||||
end
|
||||
if item.base.weapon or item.type == "Ring" then
|
||||
item.slotModList = { }
|
||||
|
||||
@@ -147,10 +147,10 @@ function main:Init()
|
||||
return not launch.devMode and (not launch.updateAvailable or launch.updateAvailable == "none")
|
||||
end
|
||||
self.controls.checkUpdate.label = function()
|
||||
return launch.subScriptType == "UPDATE" and launch.updateProgress or "Check for Update"
|
||||
return launch.updateCheckRunning and launch.updateProgress or "Check for Update"
|
||||
end
|
||||
self.controls.checkUpdate.enabled = function()
|
||||
return not IsSubScriptRunning()
|
||||
return not launch.updateCheckRunning
|
||||
end
|
||||
self.controls.versionLabel = common.New("LabelControl", {"BOTTOMLEFT",self.anchorUpdate,"BOTTOMLEFT"}, 124, 0, 0, 14, "")
|
||||
self.controls.versionLabel.label = function()
|
||||
|
||||
@@ -571,6 +571,7 @@ local specialModList = {
|
||||
["casts level (%d+) (.+) when equipped"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }, { type = "SocketedIn" }) } end,
|
||||
["cast level (%d+) (.+) when you deal a critical strike"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }, { type = "SocketedIn" }) } end,
|
||||
["%d+%% chance to attack with level (%d+) (.+) on melee hit"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }, { type = "SocketedIn" }) } end,
|
||||
["%d+%% chance to cast level (%d+) (.+) on hit"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }, { type = "SocketedIn" }) } end,
|
||||
["attack with level (%d+) (.+) when you kill a bleeding enemy"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }, { type = "SocketedIn" }) } end,
|
||||
["curse enemies with (%D+) on %a+"] = function(_, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = 1, noSupports = true }, { type = "SocketedIn" }) } end,
|
||||
["curse enemies with level (%d+) (.+) on %a+"] = function(num, _, skill) return { mod("ExtraSkill", "LIST", { name = gemNameLookup[skill] or "Unknown", level = num, noSupports = true }, { type = "SocketedIn" }) } end,
|
||||
@@ -637,6 +638,8 @@ local specialModList = {
|
||||
["gain unholy might during flask effect"] = { mod("Misc", "LIST", { type = "Condition", var = "UnholyMight" }, { type = "Condition", var = "UsingFlask" }) },
|
||||
["zealot's oath during flask effect"] = { mod("ZealotsOath", "FLAG", true, { type = "Condition", var = "UsingFlask" }) },
|
||||
["grants level (%d+) (.+) curse aura during flask effect"] = function(num, _, skill) return { mod("ExtraCurse", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }, { type = "Condition", var = "UsingFlask" }) } end,
|
||||
["passives in radius can be allocated without being connected to your tree"] = { mod("Misc", "LIST", { type = "JewelData", key = "intuitiveLeap", value = true }) },
|
||||
["your hits inflict decay, dealing (%d+) chaos damage per second for 10 seconds"] = function(num) return { mod("Misc", "LIST", { type = "SkillData", key = "decay", value = num, merge = "MAX" }) } end,
|
||||
}
|
||||
local keystoneList = {
|
||||
-- List of keystones that can be found on uniques
|
||||
|
||||
Reference in New Issue
Block a user