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:
Openarl
2017-02-19 20:50:29 +10:00
parent 4e8cd1990e
commit fae06652d6
21 changed files with 366 additions and 160 deletions

View File

@@ -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" },

View File

@@ -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" },

View File

@@ -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

View File

@@ -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 = { }

View File

@@ -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()

View File

@@ -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