From 95eb1253ffd16acda280da634042e8dac5a0f924 Mon Sep 17 00:00:00 2001 From: Openarl Date: Tue, 28 Mar 2017 01:21:21 +1000 Subject: [PATCH] Release 1.3.22 - Sidebar now shows Crit Chance and Effective Crit Chance - Added "Are you Leeching?" option - Changed Essence Drain to Average Damage - Added support for Raider's Phasing while at maximum Frenzy Charges - Overhauled jewel conversion code; this fixes the issue with Nightmare jewels and the Sanctuary cluster --- Classes/ConfigTab.lua | 3 ++ Classes/ImportTab.lua | 2 +- Classes/ItemSlotControl.lua | 2 +- Data/Gems/act_dex.lua | 1 + Data/Gems/act_int.lua | 1 + Data/Uniques/bow.lua | 3 +- Data/Uniques/jewel.lua | 2 +- Data/Uniques/shield.lua | 8 +++- Modules/Build.lua | 3 +- Modules/Calcs.lua | 48 ++++++++++++---------- Modules/Main.lua | 2 +- Modules/ModParser.lua | 81 +++++++++++++++---------------------- README.md | 16 ++++++++ changelog.txt | 15 +++++++ manifest.xml | 28 ++++++------- 15 files changed, 123 insertions(+), 92 deletions(-) diff --git a/Classes/ConfigTab.lua b/Classes/ConfigTab.lua index a0fb4db1..bf917db7 100644 --- a/Classes/ConfigTab.lua +++ b/Classes/ConfigTab.lua @@ -37,6 +37,9 @@ local varList = { { var = "buffFortify", type = "check", label = "Do you have Fortify?", ifCond = "Fortify", apply = function(val, modList, enemyModList) modList:NewMod("Misc", "LIST", { type = "Condition", var = "Fortify" }, "Config", { type = "Condition", var = "Combat" }) end }, + { var = "conditionLeeching", type = "check", label = "Are you Leeching?", ifCond = "Leeching", apply = function(val, modList, enemyModList) + modList:NewMod("Misc", "LIST", { type = "Condition", var = "Leeching" }, "Config", { type = "Condition", var = "Combat" }) + end }, { var = "conditionUsingFlask", type = "check", label = "Do you have a Flask active?", ifCond = "UsingFlask", tooltip = "This is automatically enabled if you have a flask active,\nbut you can use this option to force it if necessary.", apply = function(val, modList, enemyModList) modList:NewMod("Misc", "LIST", { type = "Condition", var = "UsingFlask" }, "Config", { type = "Condition", var = "Combat" }) end }, diff --git a/Classes/ImportTab.lua b/Classes/ImportTab.lua index 04d88ac6..a7585f3e 100644 --- a/Classes/ImportTab.lua +++ b/Classes/ImportTab.lua @@ -592,7 +592,7 @@ function ImportTabClass:ImportSocketedSkills(item, socketedItems, slotName) -- Check if this socket group matches an existing one local repGroup for index, socketGroup in pairs(self.build.skillsTab.socketGroupList) do - if #socketGroup.gemList == #itemSocketGroup.gemList then + if #socketGroup.gemList == #itemSocketGroup.gemList and (not socketGroup.slot or socketGroup.slot == slotName) then local match = true for gemIndex, gem in pairs(socketGroup.gemList) do if gem.nameSpec:lower() ~= itemSocketGroup.gemList[gemIndex].nameSpec:lower() then diff --git a/Classes/ItemSlotControl.lua b/Classes/ItemSlotControl.lua index 44cd8308..8d35ab45 100644 --- a/Classes/ItemSlotControl.lua +++ b/Classes/ItemSlotControl.lua @@ -84,7 +84,7 @@ function ItemSlotClass:Draw(viewPort) self:DrawControls(viewPort) local highlight = false for _, control in pairs({self.itemsTab.controls.itemList, self.itemsTab.controls.uniqueDB, self.itemsTab.controls.rareDB}) do - if control:IsShown() and control.selDragging and control.selDragActive and self.itemsTab:IsItemValidForSlot(control.selItem, self.slotName) then + if control:IsShown() and control.selDragging and control.selDragActive and control.selItem and self.itemsTab:IsItemValidForSlot(control.selItem, self.slotName) then highlight = true SetDrawColor(0, 1, 0, 0.25) DrawImage(nil, x, y, width, height) diff --git a/Data/Gems/act_dex.lua b/Data/Gems/act_dex.lua index ef443578..cdb2b8e4 100644 --- a/Data/Gems/act_dex.lua +++ b/Data/Gems/act_dex.lua @@ -1512,6 +1512,7 @@ gems["Explosive Arrow"] = { --"active_skill_attack_damage_+%_final" = 0 --"skill_can_fire_arrows" = 1 --"base_is_projectile" = 1 + skill("showAverage", true, { type = "SkillPart", skillPart = 1 }), }, qualityMods = { mod("EnemyIgniteChance", "BASE", 1), --"base_chance_to_ignite_%" = 1 diff --git a/Data/Gems/act_int.lua b/Data/Gems/act_int.lua index 43de78ee..c7cb24cf 100644 --- a/Data/Gems/act_int.lua +++ b/Data/Gems/act_int.lua @@ -1183,6 +1183,7 @@ gems["Essence Drain"] = { skill("dotIsSpell", true), --"spell_damage_modifiers_apply_to_damage_over_time" = ? --"base_is_projectile" = ? skill("debuff", true), + skill("showAverage", true), }, qualityMods = { mod("ChaosDamage", "INC", 1), --"chaos_damage_+%" = 1 diff --git a/Data/Uniques/bow.lua b/Data/Uniques/bow.lua index b1889d72..b9f2559d 100644 --- a/Data/Uniques/bow.lua +++ b/Data/Uniques/bow.lua @@ -263,7 +263,8 @@ Implicits: 2 Adds (32-40) to (48-60) Cold Damage Adds 1 to (80-100) Lightning Damage (10-15)% increased Attack Speed -(60-80)% increased Critical Strike Chance +{variant:1}(80-100)% increased Critical Strike Chance +{variant:2,3}(60-80)% increased Critical Strike Chance {variant:1}25% increased Quantity of Items Dropped by Slain Frozen enemies {variant:2,3}15% increased Quantity of Items Dropped by Slain Frozen Enemies {variant:1}50% increased Rarity of Items Dropped by Slain Shocked enemies diff --git a/Data/Uniques/jewel.lua b/Data/Uniques/jewel.lua index a543ce36..5bf0243a 100644 --- a/Data/Uniques/jewel.lua +++ b/Data/Uniques/jewel.lua @@ -436,7 +436,7 @@ Crimson Jewel Limited to: 2 Radius: Medium (4-12)% increased Physical Damage -With at least 40 Strength in Radius, Heavy Strike has a 10% chance to deal Double Damage. +With at least 40 Strength in Radius, Heavy Strike has a 20% chance to deal Double Damage. ]],[[ Winter's Bounty Cobalt Jewel diff --git a/Data/Uniques/shield.lua b/Data/Uniques/shield.lua index 34de38e5..e4bde740 100644 --- a/Data/Uniques/shield.lua +++ b/Data/Uniques/shield.lua @@ -408,13 +408,17 @@ Gain (5-10)% of Physical Damage as Extra Chaos Damage ]],[[ The Oak Plank Kite Shield +Variant: Pre 2.6.0 +Variant: Current Requires Level 40 +4% to all Elemental Resistances (80-120)% increased Armour and Energy Shield +(100-150) to maximum Life 50% reduced Freeze Duration on You -1% of Life Regenerated per Second -5% of Life Regenerated per Second while on Low Life +{variant:1}1% of Life Regenerated per Second +{variant:2}3% of Life Regenerated per Second +{variant:1}5% of Life Regenerated per Second while on Low Life +{variant:2}3% of Life Regenerated per Second while on Low Life ]],[[ Prism Guardian Archon Kite Shield diff --git a/Modules/Build.lua b/Modules/Build.lua index 729393c8..364750fd 100644 --- a/Modules/Build.lua +++ b/Modules/Build.lua @@ -241,7 +241,8 @@ function buildMode:Init(dbFileName, buildName) { stat = "Speed", label = "Attack Rate", fmt = ".2f", compPercent = true, flag = "attack" }, { stat = "Speed", label = "Cast Rate", fmt = ".2f", compPercent = true, flag = "spell" }, { stat = "HitSpeed", label = "Hit Rate", fmt = ".2f" }, - { stat = "CritChance", label = "Crit Chance", fmt = ".2f%%" }, + { stat = "PreEffectiveCritChance", label = "Crit Chance", fmt = ".2f%%" }, + { stat = "CritChance", label = "Effective Crit Chance", fmt = ".2f%%", condFunc = function(v,o) return v ~= o.PreEffectiveCritChance end }, { stat = "CritMultiplier", label = "Crit Multiplier", fmt = "d%%", pc = true, condFunc = function(v,o) return o.CritChance > 0 end }, { stat = "HitChance", label = "Hit Chance", fmt = ".0f%%", flag = "attack" }, { stat = "TotalDPS", label = "Total DPS", fmt = ".1f", compPercent = true, flag = "notAverage" }, diff --git a/Modules/Calcs.lua b/Modules/Calcs.lua index 8f739c12..02cd37f9 100644 --- a/Modules/Calcs.lua +++ b/Modules/Calcs.lua @@ -1353,28 +1353,6 @@ local function performCalcs(env) end end - -- Process misc modifiers - for _, value in ipairs(modDB:Sum("LIST", nil, "Misc")) do - if value.type == "Condition" then - condList[value.var] = true - elseif value.type == "EnemyCondition" then - enemyDB.conditions[value.var] = true - elseif value.type == "Multiplier" then - modDB.multipliers[value.var] = (modDB.multipliers[value.var] or 0) + value.value - end - end - -- Process enemy modifiers last in case they depend on conditions that were set by misc modifiers - for _, value in ipairs(modDB:Sum("LIST", nil, "Misc")) do - if value.type == "EnemyModifier" then - enemyDB:AddMod(value.mod) - end - end - - -- Process conditions that can depend on other conditions - if condList["EnemyIgnited"] then - condList["EnemyBurning"] = true - end - -- Calculate current and maximum charges output.PowerChargesMax = modDB:Sum("BASE", nil, "PowerChargesMax") output.FrenzyChargesMax = modDB:Sum("BASE", nil, "FrenzyChargesMax") @@ -1416,6 +1394,28 @@ local function performCalcs(env) condList["AtMaxEnduranceCharges"] = true end + -- Process misc modifiers + for _, value in ipairs(modDB:Sum("LIST", nil, "Misc")) do + if value.type == "Condition" then + condList[value.var] = true + elseif value.type == "EnemyCondition" then + enemyDB.conditions[value.var] = true + elseif value.type == "Multiplier" then + modDB.multipliers[value.var] = (modDB.multipliers[value.var] or 0) + value.value + end + end + -- Process enemy modifiers last in case they depend on conditions that were set by misc modifiers + for _, value in ipairs(modDB:Sum("LIST", nil, "Misc")) do + if value.type == "EnemyModifier" then + enemyDB:AddMod(value.mod) + end + end + + -- Process conditions that can depend on other conditions + if condList["EnemyIgnited"] then + condList["EnemyBurning"] = true + end + -- Add misc buffs if env.mode_combat then if condList["Onslaught"] then @@ -2242,12 +2242,14 @@ local function performCalcs(env) -- Calculate crit chance, crit multiplier, and their combined effect if modDB:Sum("FLAG", nil, "NeverCrit") then + output.PreEffectiveCritChance = 0 output.CritChance = 0 output.CritMultiplier = 0 output.CritEffect = 1 else local baseCrit = source.critChance or 0 if baseCrit == 100 then + output.PreEffectiveCritChance = 100 output.CritChance = 100 else local base = modDB:Sum("BASE", cfg, "CritChance") @@ -2262,6 +2264,7 @@ local function performCalcs(env) if (baseCrit + base) > 0 then output.CritChance = m_max(output.CritChance, 5) end + output.PreEffectiveCritChance = output.CritChance local preLuckyCritChance = output.CritChance if env.mode_effective and modDB:Sum("FLAG", cfg, "CritChanceLucky") then output.CritChance = (1 - (1 - output.CritChance / 100) ^ 2) * 100 @@ -2504,6 +2507,7 @@ local function performCalcs(env) if isAttack then -- Combine crit stats, average damage and DPS + combineStat("PreEffectiveCritChance", "AVERAGE") combineStat("CritChance", "AVERAGE") combineStat("CritMultiplier", "AVERAGE") combineStat("AverageDamage", "DPS") diff --git a/Modules/Main.lua b/Modules/Main.lua index c2b2a0e4..5b18af6f 100644 --- a/Modules/Main.lua +++ b/Modules/Main.lua @@ -128,11 +128,11 @@ function main:Init() self:OpenPopup(800, 250, "Update Available", { common.New("TextListControl", nil, 0, 20, 780, 190, nil, changeList), common.New("ButtonControl", nil, -45, 220, 80, 20, "Update", function() + main:ClosePopup() local ret = self:CallMode("CanExit", "UPDATE") if ret == nil or ret == true then launch:ApplyUpdate(launch.updateAvailable) end - main:ClosePopup() end), common.New("ButtonControl", nil, 45, 220, 80, 20, "Cancel", function() main:ClosePopup() diff --git a/Modules/ModParser.lua b/Modules/ModParser.lua index 1d5f47d2..b12cd27c 100644 --- a/Modules/ModParser.lua +++ b/Modules/ModParser.lua @@ -388,6 +388,9 @@ local modTagList = { ["when in off hand"] = { tag = { type = "SlotNumber", num = 2 } }, ["in main hand"] = { tag = { type = "InSlot", num = 1 } }, ["in off hand"] = { tag = { type = "InSlot", num = 2 } }, + ["with main hand"] = { tag = { type = "Condition", var = "MainHandAttack" } }, + ["with off hand"] = { tag = { type = "Condition", var = "OffHandAttack" } }, + ["with this weapon"] = { tag = { type = "Condition", var = "XHandAttack" } }, -- The X is replaced when the item modifiers are generated -- Equipment conditions ["while holding a shield"] = { tag = { type = "Condition", var = "UsingShield" } }, ["with shields"] = { tag = { type = "Condition", var = "UsingShield" } }, @@ -402,9 +405,6 @@ local modTagList = { ["if you wear no corrupted items"] = { tag = { type = "Condition", var = "NotUsingCorruptedItem" } }, ["if no worn items are corrupted"] = { tag = { type = "Condition", var = "NotUsingCorruptedItem" } }, ["if all worn items are corrupted"] = { tag = { type = "Condition", var = "UsingAllCorruptedItems" } }, - ["with main hand"] = { tag = { type = "Condition", var = "MainHandAttack" } }, - ["with off hand"] = { tag = { type = "Condition", var = "OffHandAttack" } }, - ["with this weapon"] = { tag = { type = "Condition", var = "XHandAttack" } }, -- The X is replaced when the item modifiers are generated -- Player status conditions ["when on low life"] = { tag = { type = "Condition", var = "LowLife" } }, ["while on low life"] = { tag = { type = "Condition", var = "LowLife" } }, @@ -425,6 +425,7 @@ local modTagList = { ["during onslaught"] = { tag = { type = "Condition", var = "Onslaught" } }, ["while you have onslaught"] = { tag = { type = "Condition", var = "Onslaught" } }, ["while phasing"] = { tag = { type = "Condition", var = "Phasing" } }, + ["while leeching"] = { tag = { type = "Condition", var = "Leeching" } }, ["while using a flask"] = { tag = { type = "Condition", var = "UsingFlask" } }, ["during effect"] = { tag = { type = "Condition", var = "UsingFlask" } }, ["during flask effect"] = { tag = { type = "Condition", var = "UsingFlask" } }, @@ -587,6 +588,7 @@ local specialModList = { ["you and nearby allies have (%d+)%% increased attack, cast and movement speed if you've used a warcry recently"] = function(num) return { mod("Speed", "INC", num, { type = "Condition", var = "UsedWarcryRecently" }), mod("MovementSpeed", "INC", num, { type = "Condition", var = "UsedWarcryRecently" }) } end, ["warcries cost no mana"] = { mod("ManaCost", "MORE", -100, nil, 0, KeywordFlag.Warcry) }, ["enemies you taunt take (%d+)%% increased damage"] = function(num) return { mod("Misc", "LIST", { type = "EnemyModifier", mod = mod("DamageTaken", "INC", num) }, { type = "Condition", var = "EnemyTaunted" }) } end, + ["you have phasing while at maximum frenzy charges"] = { mod("Misc", "LIST", { type = "Condition", var = "Phasing" }, { type = "Condition", var = "AtMaxFrenzyCharges" }) }, -- Special node types ["(%d+)%% of block chance applied to spells"] = function(num) return { mod("BlockChanceConv", "BASE", num) } end, ["(%d+)%% of block chance applied to spells when on low life"] = function(num) return { mod("BlockChanceConv", "BASE", num, { type = "Condition", var = "LowLife" }) } end, @@ -805,39 +807,22 @@ for skillName, data in pairs(data.gems) do skillNameList[" "..skillName:lower().." "] = { tag = { type = "SkillName", skillName = skillName } } end end - -local function getSimpleConv(src, dst, type, factor) +local function getSimpleConv(srcList, dst, type, remove, factor) return function(nodeMods, out, data) if nodeMods then - for _, mod in ipairs(nodeMods) do - if mod.name == src and mod.type == type then - out:NewMod(src, type, -mod.value, "Tree:Jewel", mod.flags, mod.keywordFlags, unpack(mod.tagList)) - out:NewMod(dst, type, mod.value * factor, "Tree:Jewel", mod.flags, mod.keywordFlags, unpack(mod.tagList)) - end - end - end - end -end -local function getMatchConv(others, dst, type) - return function(nodeMods, out, data) - if nodeMods then - for _, mod in ipairs(nodeMods) do - for _, other in pairs(others) do - if mod.name:match(other) and mod.type == type then - out:NewMod(mod.name, type, -mod.value, "Tree:Jewel", mod.flags, mod.keywordFlags, unpack(mod.tagList)) - out:NewMod(mod.name:gsub(other, dst), type, mod.value, "Tree:Jewel", mod.flags, mod.keywordFlags, unpack(mod.tagList)) + for _, src in pairs(srcList) do + for _, mod in ipairs(nodeMods) do + if mod.name == src and mod.type == type then + if remove then + out:NewMod(src, type, -mod.value, "Tree:Jewel", mod.flags, mod.keywordFlags, unpack(mod.tagList)) + end + if factor then + out:NewMod(dst, type, math.floor(mod.value * factor + 0.5), "Tree:Jewel", mod.flags, mod.keywordFlags, unpack(mod.tagList)) + else + out:NewMod(dst, type, mod.value, "Tree:Jewel", mod.flags, mod.keywordFlags, unpack(mod.tagList)) + end end - end - end - end - end -end -local function getSimpleGain(src, dst, type, factor) - return function(nodeMods, out, data) - if nodeMods then - local val = nodeMods:Sum(type, nil, unpack(src)) - if val ~= 0 then - out:NewMod(dst, type, math.floor(val * factor + 0.5), "Tree:Jewel") + end end end end @@ -862,18 +847,21 @@ end -- List of radius jewel functions local jewelFuncs = { -- Conversion jewels - ["Strength from Passives in Radius is Transformed to Dexterity"] = getSimpleConv("Str", "Dex", "BASE", 1), - ["Dexterity from Passives in Radius is Transformed to Strength"] = getSimpleConv("Dex", "Str", "BASE", 1), - ["Strength from Passives in Radius is Transformed to Intelligence"] = getSimpleConv("Str", "Int", "BASE", 1), - ["Intelligence from Passives in Radius is Transformed to Strength"] = getSimpleConv("Int", "Str", "BASE", 1), - ["Dexterity from Passives in Radius is Transformed to Intelligence"] = getSimpleConv("Dex", "Int", "BASE", 1), - ["Intelligence from Passives in Radius is Transformed to Dexterity"] = getSimpleConv("Int", "Dex", "BASE", 1), - ["Increases and Reductions to Life in Radius are Transformed to apply to Energy Shield"] = getSimpleConv("Life", "EnergyShield", "INC", 1), - ["Increases and Reductions to Energy Shield in Radius are Transformed to apply to Armour at 200% of their value"] = getSimpleConv("EnergyShield", "Armour", "INC", 2), - ["Increases and Reductions to Life in Radius are Transformed to apply to Mana at 200% of their value"] = getSimpleConv("Life", "Mana", "INC", 2), - ["Increases and Reductions to Physical Damage in Radius are Transformed to apply to Cold Damage"] = getMatchConv({"PhysicalDamage"}, "ColdDamage", "INC"), - ["Increases and Reductions to Cold Damage in Radius are Transformed to apply to Physical Damage"] = getMatchConv({"ColdDamage"}, "PhysicalDamage", "INC"), - ["Increases and Reductions to other Damage Types in Radius are Transformed to apply to Fire Damage"] = getMatchConv({"PhysicalDamage","ColdDamage","LightningDamage","ChaosDamage"}, "FireDamage", "INC"), + ["Strength from Passives in Radius is Transformed to Dexterity"] = getSimpleConv({"Str"}, "Dex", "BASE", true), + ["Dexterity from Passives in Radius is Transformed to Strength"] = getSimpleConv({"Dex"}, "Str", "BASE", true), + ["Strength from Passives in Radius is Transformed to Intelligence"] = getSimpleConv({"Str"}, "Int", "BASE", true), + ["Intelligence from Passives in Radius is Transformed to Strength"] = getSimpleConv({"Int"}, "Str", "BASE", true), + ["Dexterity from Passives in Radius is Transformed to Intelligence"] = getSimpleConv({"Dex"}, "Int", "BASE", true), + ["Intelligence from Passives in Radius is Transformed to Dexterity"] = getSimpleConv({"Int"}, "Dex", "BASE", true), + ["Increases and Reductions to Life in Radius are Transformed to apply to Energy Shield"] = getSimpleConv({"Life"}, "EnergyShield", "INC", true), + ["Increases and Reductions to Energy Shield in Radius are Transformed to apply to Armour at 200% of their value"] = getSimpleConv({"EnergyShield"}, "Armour", "INC", true, 2), + ["Increases and Reductions to Life in Radius are Transformed to apply to Mana at 200% of their value"] = getSimpleConv({"Life"}, "Mana", "INC", true, 2), + ["Increases and Reductions to Physical Damage in Radius are Transformed to apply to Cold Damage"] = getSimpleConv({"PhysicalDamage"}, "ColdDamage", "INC", true), + ["Increases and Reductions to Cold Damage in Radius are Transformed to apply to Physical Damage"] = getSimpleConv({"ColdDamage"}, "PhysicalDamage", "INC", true), + ["Increases and Reductions to other Damage Types in Radius are Transformed to apply to Fire Damage"] = getSimpleConv({"PhysicalDamage","ColdDamage","LightningDamage","ChaosDamage"}, "FireDamage", "INC", true), + ["Passives granting Lightning Resistance or all Elemental Resistances in Radius also grant Chance to Block Spells at 35% of its value"] = getSimpleConv({"LightningResist","ElementalResist"}, "SpellBlockChance", "BASE", false, 0.35), + ["Passives granting Cold Resistance or all Elemental Resistances in Radius also grant Chance to Dodge Attacks at 35% of its value"] = getSimpleConv({"ColdResist","ElementalResist"}, "AttackDodgeChance", "BASE", false, 0.35), + ["Passives granting Fire Resistance or all Elemental Resistances in Radius also grant Chance to Block at 35% of its value"] = getSimpleConv({"FireResist","ElementalResist"}, "BlockChance", "BASE", false, 0.35), ["Melee and Melee Weapon Type modifiers in Radius are Transformed to Bow Modifiers"] = function(nodeMods, out, data) if nodeMods then local mask1 = bor(ModFlag.Axe, ModFlag.Claw, ModFlag.Dagger, ModFlag.Mace, ModFlag.Staff, ModFlag.Sword, ModFlag.Melee) @@ -920,9 +908,6 @@ local jewelFuncs = { out:NewMod("DexIntToMeleeBonus", "BASE", data.Dex + data.Int, "Tree:Jewel") end end, - ["Passives granting Lightning Resistance or all Elemental Resistances in Radius also grant Chance to Block Spells at 35% of its value"] = getSimpleGain({"LightningResist","ElementalResist"}, "SpellBlockChance", "BASE", 0.35), - ["Passives granting Cold Resistance or all Elemental Resistances in Radius also grant Chance to Dodge Attacks at 35% of its value"] = getSimpleGain({"ColdResist","ElementalResist"}, "AttackDodgeChance", "BASE", 0.35), - ["Passives granting Fire Resistance or all Elemental Resistances in Radius also grant Chance to Block at 35% of its value"] = getSimpleGain({"FireResist","ElementalResist"}, "BlockChance", "BASE", 0.35), -- Threshold jewels ["With at least 40 Dexterity in Radius, Frost Blades Melee Damage Penetrates 15% Cold Resistance"] = getThreshold("Dex", "ColdPenetration", "BASE", 15, ModFlag.Melee, { type = "SkillName", skillName = "Frost Blades" }), ["With at least 40 Dexterity in Radius, Frost Blades has 25% increased Projectile Speed"] = getThreshold("Dex", "ProjectileSpeed", "INC", 25, { type = "SkillName", skillName = "Frost Blades" }), diff --git a/README.md b/README.md index 0ce0775e..4d1c9501 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,22 @@ 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.3.22 - 2017/03/28 + * The sidebar can now displays two Crit Chance values: + 1. Crit Chance: + * This is the skill's "real" crit chance, as displayed in the in-game tooltip + * If your crit chance is capped, this value will always be 95%, unlike your effective crit chance (which can be lower) + 2. Effective Crit Chance: + * This is the value previously shown as "Crit Chance" + * This estimates your true crit chance, factoring in accuracy and "Crit Chance is Lucky" + * Added an option to the Configuration tab for "Are you Leeching?" + * Essence Drain now uses "Average Damage" mode + * Phasing is now enabled automatically if you have Quartz Infusion and maximum frenzy charges + * The Red/Green/Blue Nightmare jewels now correctly apply to the condition resistance stats in the Sanctuary cluster + * Corrected the crit chance modifier on Pre-2.0.0 Windripper + * Updated "The Oak" to mirror the changes to Springleaf in 2.6 + * The program should now correctly prompt to save the current build before updating + ### 1.3.21 - 2017/03/20 With this update, the handling of buffs and debuffs has been improved: * Having multiple copies of the same flask or buff/debuff skill active is now handled correctly diff --git a/changelog.txt b/changelog.txt index e61dc9ff..74d72031 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,18 @@ +VERSION[1.3.22][2017/03/28] + * The sidebar can now displays two Crit Chance values: + 1. Crit Chance: + * This is the skill's "real" crit chance, as displayed in the in-game tooltip + * If your crit chance is capped, this value will always be 95%, unlike your effective crit chance (which can be lower) + 2. Effective Crit Chance: + * This is the value previously shown as "Crit Chance" + * This estimates your true crit chance, factoring in accuracy and "Crit Chance is Lucky" + * Added an option to the Configuration tab for "Are you Leeching?" + * Essence Drain now uses "Average Damage" mode + * Phasing is now enabled automatically if you have Quartz Infusion and maximum frenzy charges + * The Red/Green/Blue Nightmare jewels now correctly apply to the condition resistance stats in the Sanctuary cluster + * Corrected the crit chance modifier on Pre-2.0.0 Windripper + * Updated "The Oak" to mirror the changes to Springleaf in 2.6 + * The program should now correctly prompt to save the current build before updating VERSION[1.3.21][2017/03/20] With this update, the handling of buffs and debuffs has been improved: * Having multiple copies of the same flask or buff/debuff skill active is now handled correctly diff --git a/manifest.xml b/manifest.xml index 46829ff0..fb77c47a 100644 --- a/manifest.xml +++ b/manifest.xml @@ -1,29 +1,29 @@ - + - + - + - + - + @@ -42,15 +42,15 @@ - + - + - - + + @@ -58,8 +58,8 @@ - - + + @@ -89,17 +89,17 @@ - + - + - +