Release 1.2.13

- Various fixes for Assassin's Mark
- Added support for Toxic Delivery
- Improved startup time by caching the mod parser
This commit is contained in:
Openarl
2016-11-22 16:00:55 +10:00
parent 7ba2bb07e1
commit 2ffb31be9f
8 changed files with 93 additions and 20 deletions

View File

@@ -55,6 +55,9 @@ local varList = {
{ var = "conditionEnemyPoisoned", type = "check", label = "Is the enemy Poisoned?", apply = function(val, modList, enemyModList)
modList:NewMod("Misc", "LIST", { type = "Condition", var = "EnemyPoisoned" }, "Config", { type = "Condition", var = "Effective" })
end },
{ var = "conditionEnemyMaimed", type = "check", label = "Is the enemy Maimed?", apply = function(val, modList, enemyModList)
modList:NewMod("Misc", "LIST", { type = "Condition", var = "EnemyMaimed" }, "Config", { type = "Condition", var = "Effective" })
end },
{ var = "conditionEnemyBurning", type = "check", label = "Is the enemy Burning?", apply = function(val, modList, enemyModList)
modList:NewMod("Misc", "LIST", { type = "Condition", var = "EnemyBurning" }, "Config", { type = "Condition", var = "Effective" })
end },

View File

@@ -208,7 +208,7 @@ gems["Assassin's Mark"] = {
skillTypes = { [2] = true, [11] = true, [12] = true, [17] = true, [18] = true, [19] = true, [26] = true, [32] = true, [36] = true, },
baseMods = {
skill("castTime", 0.5),
--"base_self_critical_strike_multiplier_-%" = -20
mod("SelfCritMultiplier", "INC", 20, 0, 0, { type = "GlobalEffect", effectType = "Curse" }), --"base_self_critical_strike_multiplier_-%" = -20
--"base_deal_no_damage" = ?
skill("debuff", true),
},

View File

@@ -157,8 +157,8 @@ return {
extra = "{2:output:CritChance}% x{2:output:CritMultiplier}",
flag = "hit",
{ label = "Inc. Crit Chance", { format = "{0:mod:1}%", { modName = "CritChance", modType = "INC", cfg = "skill" }, }, },
{ label = "Crit Chance", { format = "{2:output:CritChance}%", { breakdown = "CritChance" }, { modName = "CritChance", cfg = "skill" }, }, },
{ label = "Crit Multiplier", { format = "x {2:output:CritMultiplier}", { modName = "CritMultiplier", cfg = "skill"}, }, },
{ label = "Crit Chance", { format = "{2:output:CritChance}%", { breakdown = "CritChance" }, { label = "Player modifiers", modName = "CritChance", cfg = "skill" }, { label = "Enemy modifiers", modName = "SelfExtraCritChance", enemy = true }, }, },
{ label = "Crit Multiplier", { format = "x {2:output:CritMultiplier}", { breakdown = "CritMultiplier" }, { label = "Player modifiers", modName = "CritMultiplier", cfg = "skill"}, { label = "Enemy modifiers", modName = "SelfCritMultiplier", enemy = true }, }, },
{ label = "Crit Effect Mod", { format = "x {3:output:CritEffect}", { breakdown = "CritEffect" }, }, },
} },
{ 1, "HitChance", 1, "Accuracy", data.colorCodes.OFFENCE, {

View File

@@ -1793,14 +1793,51 @@ local function performCalcs(env)
if baseCrit > 0 then
output.CritChance = m_max(output.CritChance, 5)
end
if breakdown then
simpleBreakdown(baseCrit, skillCfg, "CritChance")
if breakdown and output.CritChance ~= baseCrit then
local base = modDB:Sum("BASE", cfg, "CritChance")
local inc = modDB:Sum("INC", cfg, "CritChance")
local more = modDB:Sum("MORE", cfg, "CritChance")
local enemyExtra = enemyDB:Sum("BASE", nil, "SelfExtraCritChance")
breakdown.CritChance = { }
if base ~= 0 then
t_insert(breakdown.CritChance, s_format("(%g + %g) ^8(base)", baseCrit, base))
else
t_insert(breakdown.CritChance, s_format("%g ^8(base)", baseCrit + base))
end
if inc ~= 0 then
t_insert(breakdown.CritChance, s_format("x %.2f", 1 + inc/100).." ^8(increased/reduced)")
end
if more ~= 1 then
t_insert(breakdown.CritChance, s_format("x %.2f", more).." ^8(more/less)")
end
if env.mode_effective and enemyExtra ~= 0 then
t_insert(breakdown.CritChance, s_format("+ %g ^8(extra chance for enemy to be crit)", enemyExtra))
end
t_insert(breakdown.CritChance, s_format("= %g", output.CritChance))
end
end
if modDB:Sum("FLAG", skillCfg, "NoCritMultiplier") then
output.CritMultiplier = 1
else
output.CritMultiplier = 1.5 + modDB:Sum("BASE", skillCfg, "CritMultiplier") / 100
local extraDamage = 0.5 + modDB:Sum("BASE", skillCfg, "CritMultiplier") / 100
if env.mode_effective then
extraDamage = round(extraDamage * (1 + enemyDB:Sum("INC", nil, "SelfCritMultiplier") / 100), 2)
end
output.CritMultiplier = 1 + m_max(0, extraDamage)
if breakdown and output.CritMultiplier ~= 1.5 then
breakdown.CritMultiplier = {
"50% ^8(base)",
}
local base = modDB:Sum("BASE", skillCfg, "CritMultiplier")
if base ~= 0 then
t_insert(breakdown.CritMultiplier, s_format("+ %d%% ^8(additional extra damage)", base))
end
local enemyInc = 1 + enemyDB:Sum("INC", nil, "SelfCritMultiplier") / 100
if env.mode_effective and enemyInc ~= 1 then
t_insert(breakdown.CritMultiplier, s_format("x %.2f ^8(increased/reduced extra crit damage taken by enemy)", enemyInc))
end
t_insert(breakdown.CritMultiplier, s_format("= %d%% ^8(extra crit damage)", extraDamage * 100))
end
end
output.CritEffect = 1 - output.CritChance / 100 + output.CritChance / 100 * output.CritMultiplier
if breakdown and output.CritEffect ~= 1 then
@@ -2066,7 +2103,8 @@ local function performCalcs(env)
keywordFlags = bor(skillCfg.keywordFlags, KeywordFlag.Poison)
}
env.mainSkill.poisonCfg = dotCfg
local baseVal = (output.PhysicalAverage + output.ChaosAverage) * output.CritEffect * 0.08
local poisonCritEffect = 1 - output.CritChance / 100 + output.CritChance / 100 * output.CritMultiplier * modDB:Sum("MORE", skillCfg, "PoisonDamageOnCrit")
local baseVal = (output.PhysicalAverage + output.ChaosAverage) * poisonCritEffect * 0.08
local effMult = 1
if env.mode_effective then
local resist = output["EnemyChaosResist"]
@@ -2089,12 +2127,17 @@ local function performCalcs(env)
output.PoisonDuration = durationBase * calcMod(modDB, dotCfg, "Duration") * debuffDurationMult
output.PoisonDamage = output.PoisonDPS * output.PoisonDuration
if breakdown then
breakdown.PoisonDPS = {
"Base damage:",
s_format("%.1f ^8(average physical + chaos non-crit damage)", output.PhysicalAverage + output.ChaosAverage)
}
breakdown.PoisonDPS = { }
if poisonCritEffect ~= output.CritEffect then
t_insert(breakdown.PoisonDPS, "Crit effect modifier for poison base damage:")
t_insert(breakdown.PoisonDPS, s_format("(1 - %g) ^8(portion of damage from non-crits)", output.CritChance/100))
t_insert(breakdown.PoisonDPS, s_format("+ (%g x %g x %g) ^8(portion of damage from crits)", output.CritChance/100, output.CritMultiplier, modDB:Sum("MORE", skillCfg, "PoisonDamageOnCrit")))
t_insert(breakdown.PoisonDPS, s_format("= %.3f", poisonCritEffect))
end
t_insert(breakdown.PoisonDPS, "Base damage:")
t_insert(breakdown.PoisonDPS, s_format("%.1f ^8(average physical + chaos non-crit damage)", output.PhysicalAverage + output.ChaosAverage))
if output.CritEffect ~= 1 then
t_insert(breakdown.PoisonDPS, s_format("x %.3f ^8(crit effect modifier)", output.CritEffect))
t_insert(breakdown.PoisonDPS, s_format("x %.3f ^8(crit effect modifier)", poisonCritEffect))
end
t_insert(breakdown.PoisonDPS, "x 0.08 ^8(poison deals 8% per second)")
t_insert(breakdown.PoisonDPS, s_format("= %.1f", baseVal, 1))

View File

@@ -418,6 +418,8 @@ local specialModList = {
["skills from your helmet penetrate (%d+)%% elemental resistances"] = function(num) return { mod("ElementalPenetration", "BASE", num, { type = "SocketedIn", slotName = "Helmet" }) } end,
["skills from your gloves have (%d+)%% increased area of effect"] = function(num) return { mod("AreaRadius", "INC", num, { type = "SocketedIn", slotName = "Gloves" }) } end,
["(%d+)%% less totem damage per totem"] = function(num) return { mod("Damage", "MORE", -num, nil, 0, KeywordFlag.Totem, { type = "PerStat", stat = "ActiveTotemLimit", div = 1 }) } end,
["poison you inflict with critical strikes deals (%d+)%% more damage"] = function(num) return { mod("PoisonDamageOnCrit", "MORE", 100) } end,
["bleeding you inflict on maimed enemies deals (%d+)%% more damage"] = function(num) return { mod("Damage", "MORE", num, nil, 0, KeywordFlag.Bleed, { type = "Condition", var = "EnemyMaimed"}) } end,
-- Special node types
["(%d+)%% of block chance applied to spells"] = function(num) return { mod("BlockChanceConv", "BASE", num) } end,
["(%d+)%% additional block chance with staves"] = function(num) return { mod("BlockChance", "BASE", num, { type = "Condition", var = "UsingStaff" }) } end,
@@ -517,12 +519,16 @@ end
local convTypes = {
["as extra lightning damage"] = "GainAsLightning",
["added as lightning damage"] = "GainAsLightning",
["gained as extra lightning damage"] = "GainAsLightning",
["as extra cold damage"] = "GainAsCold",
["added as cold damage"] = "GainAsCold",
["gained as extra cold damage"] = "GainAsCold",
["as extra fire damage"] = "GainAsFire",
["added as fire damage"] = "GainAsFire",
["gained as extra fire damage"] = "GainAsFire",
["as extra chaos damage"] = "GainAsChaos",
["added as chaos damage"] = "GainAsChaos",
["gained as extra chaos damage"] = "GainAsChaos",
["converted to lightning damage"] = "ConvertToLightning",
["converted to cold damage"] = "ConvertToCold",
["converted to fire damage"] = "ConvertToFire",
@@ -668,7 +674,7 @@ local function scan(line, patternList, plain)
return bestMatch[1], bestMatch[2], bestMatch[3]
end
return function(line)
local function parseMod(line)
-- Check if this is a special modifier
local specialMod, specialLine, cap = scan(line, specialModList)
if specialMod and #specialLine == 0 then
@@ -812,4 +818,12 @@ return function(line)
}
end
return modList, line:match("%S") and line
end
local cache = { }
return function(line)
if not cache[line] then
cache[line] = { parseMod(line) }
end
return unpack(copyTable(cache[line]))
end

View File

@@ -49,6 +49,13 @@ Head over to the [Releases](https://github.com/Openarl/PathOfBuilding/releases)
![ss3](https://cloud.githubusercontent.com/assets/19189971/18089780/f0ff234a-6f04-11e6-8c88-6193fe59a5c4.png)
## Changelog
### 1.2.13 - 2016/11/22
* The breakdown for crit chance now includes the "additional chance to receive a Critical Strike" from Assassin's Mark
* Added support for the "increased extra damage from Critical Strikes" modifier on Assassin's Mark
* Added support for Toxic Delivery
* The extra chaos and bleed damage modifiers require their respective conditions to be enabled in the Configuration tab
* Improved the program's startup time
### 1.2.12 - 2016/11/22
* Hovering over the character level input will now show the experience penalties for relevant area levels
* Fixed the "not Killed Recently" condition on "Rite of Ruin"

View File

@@ -1,3 +1,9 @@
VERSION[1.2.13][2016/11/22]
* The breakdown for crit chance now includes the "additional chance to receive a Critical Strike" from Assassin's Mark
* Added support for the "increased extra damage from Critical Strikes" modifier on Assassin's Mark
* Added support for Toxic Delivery
* The extra chaos and bleed damage modifiers require their respective conditions to be enabled in the Configuration tab
* Improved the program's startup time
VERSION[1.2.12][2016/11/22]
* Hovering over the character level input will now show the experience penalties for relevant area levels
* Fixed the "not Killed Recently" condition on "Rite of Ruin"

View File

@@ -1,20 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<PoBVersion>
<Version number="1.2.12"/>
<Version number="1.2.13"/>
<Source part="program" url="https://raw.githubusercontent.com/Openarl/PathOfBuilding/{branch}/"/>
<Source part="tree" url="https://raw.githubusercontent.com/Openarl/PathOfBuilding/{branch}/tree.zip"/>
<Source url="https://raw.githubusercontent.com/Openarl/PathOfBuilding/{branch}/runtime-win32.zip" part="runtime" platform="win32"/>
<File sha1="6bb074e0d3a4043f0e5dcbd25c33f8e5e1f5cfe0" name="Launch.lua" part="program"/>
<File sha1="93e19c2a160eb49993d50d9e2b47ea79962373d9" name="UpdateCheck.lua" part="program"/>
<File sha1="4f17937f2b37784e169a3792b235f2a0a3961e61" name="UpdateApply.lua" part="program"/>
<File sha1="b62b25c6debf66c86f512c66b66cb1a3cafca48d" name="changelog.txt" part="program"/>
<File sha1="3178fb4458626589de428273cf0a0cf5e537b85e" name="changelog.txt" part="program"/>
<File sha1="8f552be8544dbfb32882cb9dbba1907ce9a67522" name="Classes/BuildListControl.lua" part="program"/>
<File sha1="331c2ab54695ed4f0b48dd00b516857678766719" name="Classes/ButtonControl.lua" part="program"/>
<File sha1="8df790619a3284b8ed78075f59dd34d5b00d28a3" name="Classes/CalcBreakdownControl.lua" part="program"/>
<File sha1="23171916fa590c5344b17e67bd8d378574922388" name="Classes/CalcSectionControl.lua" part="program"/>
<File sha1="57ac3bdfbe1fe07539326e983a6df92a60c2cb78" name="Classes/CalcsTab.lua" part="program"/>
<File sha1="690f0d9d9ba0cd8092eb660d5d83bb0b9ad9f37d" name="Classes/CheckBoxControl.lua" part="program"/>
<File sha1="ae14f6606ca9fdf12caac22900495c73f076ed70" name="Classes/ConfigTab.lua" part="program"/>
<File sha1="8fbe44e08da3460d730351b2f6648b35faffad29" name="Classes/ConfigTab.lua" part="program"/>
<File sha1="bbb08f183746d6ec023e2bd08fb7a89d365381da" name="Classes/Control.lua" part="program"/>
<File sha1="ae55fe1093e727872bc01cc94fa987395f944313" name="Classes/ControlHost.lua" part="program"/>
<File sha1="8305ea8d306a13160c369c474d19b05024a1f5ef" name="Classes/DropDownControl.lua" part="program"/>
@@ -43,20 +43,20 @@
<File sha1="4b7675c8b4fe71cade7dd3d70793df1ed8022d01" name="Classes/UndoHandler.lua" part="program"/>
<File sha1="46ef0a6131752cbe6c2192be766885914d889c3e" name="Modules/Build.lua" part="program"/>
<File sha1="c03a7796aea3e9aa832fbb92c1f674ef5af690ca" name="Modules/BuildList.lua" part="program"/>
<File sha1="5c6159092e0b743db78e80a0f39241cb816c237d" name="Modules/Calcs.lua" part="program"/>
<File sha1="99148774ffc1c326f3a50e7d8b3f7a68fe1ede57" name="Modules/CalcSections.lua" part="program"/>
<File sha1="53943ed726c993649d173b819e5aa7d764661047" name="Modules/Calcs.lua" part="program"/>
<File sha1="c0715b212c732d9120997984de8205ef83a3f8c4" name="Modules/CalcSections.lua" part="program"/>
<File sha1="f207df4010cb3c7bc6cce98be2529a3b8a708b8f" name="Modules/Common.lua" part="program"/>
<File sha1="bad785f71247b99ff76d9a359f725968aa71da5f" name="Modules/Data.lua" part="program"/>
<File sha1="5ddfa4a5904cefbf2755c231797175c8ae24ac49" name="Modules/ItemTools.lua" part="program"/>
<File sha1="e881a33fb01053d69d58af5a112e5fb03bc29188" name="Modules/Main.lua" part="program"/>
<File sha1="a535c1032e56636e84d8e8df7912679b92d7dd09" name="Modules/ModParser.lua" part="program"/>
<File sha1="bbb8a0a7764713427f1f5e4f11059c72b4b8f45d" name="Modules/ModParser.lua" part="program"/>
<File sha1="5f93a9d8f58e0d5990a1f84e1ab1d53fbd35fb56" name="Modules/ModTools.lua" part="program"/>
<File sha1="e7ee7e5b6388facb7bf568517ecc401590757df7" name="Assets/ring.png" part="program"/>
<File sha1="9a320bfe629b1cf3f14fc77fbbf2508d0a5b2841" name="Assets/small_ring.png" part="program"/>
<File sha1="698c46ec242133014f6904d276b27106580ea392" name="Data/New.lua" part="program"/>
<File sha1="4bda866bb45169b51bd193039a87d7bcc6cbacaa" name="Data/Rares.lua" part="program"/>
<File sha1="9ce87f1a96439c4318688da3b971261614dec76b" name="Data/Gems/act_dex.lua" part="program"/>
<File sha1="4f869301558956c9102ea00b3d9576e96b3cc8cb" name="Data/Gems/act_int.lua" part="program"/>
<File sha1="6d9fb5ee2f7c3b0eb11332f69ff6942f587da82b" name="Data/Gems/act_int.lua" part="program"/>
<File sha1="7c8ddce1da8d4e954729524c03cd68d26e468a9a" name="Data/Gems/act_str.lua" part="program"/>
<File sha1="f6d7bc0e523b7d97fd3f2a8d2f09476716757ce1" name="Data/Gems/other.lua" part="program"/>
<File sha1="b2f6b177821de87288760644f2ecdbde07a9c4c9" name="Data/Gems/sup_dex.lua" part="program"/>