diff --git a/spec/System/TestCustomModControl_spec.lua b/spec/System/TestCustomModControl_spec.lua index a4fdc15a4f..d4aa661ea9 100644 --- a/spec/System/TestCustomModControl_spec.lua +++ b/spec/System/TestCustomModControl_spec.lua @@ -151,6 +151,29 @@ describe("Custom modifier controls", function() end end) + it("distinguishes missing and empty runic ward conditions", function() + local missingMods, missingExtra = modLib.parseMod("10% increased Attack Speed while missing Runic Ward") + local missingCondition + for _, tag in ipairs(missingMods[1]) do + if tag.type == "Condition" then + missingCondition = tag + end + end + assert.is_nil(missingExtra) + assert.are.equals("MissingRunicWard", missingCondition.var) + assert.is_nil(missingCondition.neg) + + local noWardMods, noWardExtra = modLib.parseMod("Lose 5% Life per second while you have no Runic Ward during Effect") + local noWardCondition + for _, tag in ipairs(noWardMods[1]) do + if tag.type == "Condition" and tag.var == "NoRunicWard" then + noWardCondition = tag + end + end + assert.is_nil(noWardExtra) + assert.is_not_nil(noWardCondition) + end) + it("uses the expanded browser dimensions", function() local popup = openModBrowser() local listWidth, listHeight = popup.controls.listControl:GetSize() diff --git a/spec/System/TestDefence_spec.lua b/spec/System/TestDefence_spec.lua index 13d1a44326..bb82497d39 100644 --- a/spec/System/TestDefence_spec.lua +++ b/spec/System/TestDefence_spec.lua @@ -49,6 +49,148 @@ describe("TestDefence", function() assert.are.equals(manaWithoutTotalEnergyShield + 100, player.output.Mana) end) + it("applies energy shield modifiers to runic ward when redirected", function() + build.configTab.input.customMods = [[ + +100 to maximum Runic Ward + 100% increased maximum Runic Ward + 100% increased maximum Energy Shield + Increases and Reductions to maximum Energy Shield instead apply to Ward + ]] + build.configTab:BuildModList() + runCallback("OnFrame") + + assert.are.equals(300, build.calcsTab.mainOutput.Ward) + end) + + it("does not apply energy shield more modifiers to redirected runic ward", function() + build.configTab.input.customMods = [[ + +100 to maximum Runic Ward + 100% more maximum Energy Shield + Increases and Reductions to maximum Energy Shield instead apply to Ward + ]] + build.configTab:BuildModList() + runCallback("OnFrame") + + assert.are.equals(100, build.calcsTab.mainOutput.Ward) + end) + + it("applies mana regeneration to runic ward before mana degeneration", function() + build.configTab.input.customMods = "+100 to maximum Runic Ward\nLose 5% of maximum Mana per Second" + build.configTab:BuildModList() + build.itemsTab:CreateDisplayItemFromRaw([[ + Test Wand + Runic Fork + Sockets: S + Rune: Warding Rune of Equinox + Implicits: 3 + {enchant}{rune}40% less Mana Regeneration Rate + {enchant}{rune}Mana Recovery from Regeneration is also applied to Runic Ward + {enchant}{rune}Bonded: 20% increased Runic Ward Regeneration Rate if you've dealt a Critical Hit Recently + ]]) + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + + local output = build.calcsTab.mainOutput + assert.is_true(output.ManaDegen > 0) + assert.are.near(output.ManaRegen, output.WardRecovery, 0.1) + assert.are.near(output.ManaRegen - output.ManaDegen, output.ManaRegenRecovery, 0.1) + end) + + it("applies life flask recovery to runic ward through Warding Rune of Nourishment", function() + build.skillsTab:PasteSocketGroup("Ball Lightning 1/0 1") + build.itemsTab:CreateDisplayItemFromRaw([[ + Test Gloves + Runeforged Stocky Mitts + Sockets: S + Rune: Warding Rune of Nourishment + Implicits: 2 + {enchant}{rune}15% Life Recovery from Flasks also applies to Runic Ward + {enchant}{rune}Bonded: 15% increased Life Recovery from Flasks + ]]) + build.itemsTab:AddDisplayItem() + build.itemsTab:CreateDisplayItemFromRaw([[ + Test Flask + Ultimate Life Flask + Life Flask Effects are not removed when Unreserved Life is Filled + ]]) + build.itemsTab:AddDisplayItem() + build.itemsTab:EquipItemInSet(build.itemsTab.items[2], build.itemsTab.activeItemSetId) + build.itemsTab.slots["Flask 1"].active = true + runCallback("OnFrame") + + local output = build.calcsTab.calcsOutput + assert.are.equals(15, build.calcsTab.calcsEnv.player.modDB:Sum("BASE", nil, "LifeFlaskRecoveryAppliesToWard")) + assert.is_true(output.LifeRecovery > 0) + assert.is_true(output.WardRecovery > 0) + assert.are.near(output.LifeRecovery * 0.15, output.WardRecovery, 0.01) + end) + + it("includes runic ward in comprehensive net recovery", function() + build.configTab.input.customMods = "+100 to maximum Runic Ward" + build.configTab.input.enemyDamageType = "DamageOverTime" + build.configTab.input.enemyFireDamage = 100 + build.configTab:BuildModList() + runCallback("OnFrame") + + local output = build.calcsTab.calcsOutput + assert.are.equals(output.ComprehensiveNetLifeRegen + output.ComprehensiveNetManaRegen + output.ComprehensiveNetWardRegen + output.ComprehensiveNetEnergyShieldRegen, output.ComprehensiveTotalNetRegen) + end) + + it("does not count fully bypassed runic ward as a hit pool", function() + build.configTab.input.customMods = "All damage taken bypasses Runic Ward" + build.configTab:BuildModList() + runCallback("OnFrame") + local withoutWard = build.calcsTab.calcsOutput.FireTotalHitPool + + build.configTab.input.customMods = "+100 to maximum Runic Ward\nAll damage taken bypasses Runic Ward" + build.configTab:BuildModList() + runCallback("OnFrame") + + local output = build.calcsTab.calcsOutput + assert.are.equals(withoutWard, output.FireTotalHitPool) + assert.is_true(output.NumberOfDamagingHits < data.misc.ehpCalcMaxIterationsToCalc) + end) + + it("adds non-bypassed runic ward to damage over time pool", function() + build.configTab.input.customMods = "" + build.configTab.input.enemyDamageType = "DamageOverTime" + build.configTab.input.enemyFireDamage = 100 + build.configTab:BuildModList() + runCallback("OnFrame") + local withoutWard = build.calcsTab.calcsOutput.FireTotalPool + + build.configTab.input.customMods = "+100 to maximum Runic Ward" + build.configTab:BuildModList() + runCallback("OnFrame") + + assert.are.equals(withoutWard + 100, build.calcsTab.calcsOutput.FireTotalPool) + + build.configTab.input.customMods = "+100 to maximum Runic Ward\nAll damage taken bypasses Runic Ward" + build.configTab:BuildModList() + runCallback("OnFrame") + + assert.are.equals(withoutWard, build.calcsTab.calcsOutput.FireTotalPool) + end) + + it("includes remaining runic ward in hit pool tracking", function() + build.configTab.input.customMods = "+100 to maximum Runic Ward" + build.configTab:BuildModList() + runCallback("OnFrame") + + local output = build.calcsTab.calcsOutput + local poolsRemaining = build.calcsTab.calcs.reducePoolsByDamage(nil, { Physical = 1 }, build.calcsTab.calcsEnv.player) + + assert.are.near(output.PhysicalTotalHitPool - 1, poolsRemaining.hitPoolRemaining, 0.01) + + build.configTab.input.customMods = "+100 to maximum Runic Ward\nAll damage taken bypasses Runic Ward" + build.configTab:BuildModList() + runCallback("OnFrame") + + output = build.calcsTab.calcsOutput + poolsRemaining = build.calcsTab.calcs.reducePoolsByDamage(nil, { Physical = 1 }, build.calcsTab.calcsEnv.player) + assert.are.near(output.PhysicalTotalHitPool - 1, poolsRemaining.hitPoolRemaining, 0.01) + end) + it("no armour max hits", function() build.configTab.input.enemyIsBoss = "None" build.configTab.input.customMods = "" diff --git a/spec/System/TestImportTab_spec.lua b/spec/System/TestImportTab_spec.lua index 60f69545c0..d994e9b09c 100644 --- a/spec/System/TestImportTab_spec.lua +++ b/spec/System/TestImportTab_spec.lua @@ -94,6 +94,21 @@ describe("ImportTab", function() assert.True(importedSpec.nodes[templarStartPassive.id].alloc) assert.True(importedSpec.nodes[templarStartPassive.id].connectedToStart) end) + + it("imports the Runic Ward item property", function() + build.importTab:ImportItem({ + id = "runic-ward-test", + frameType = 0, + name = "", + typeLine = "Runeforged Sentinel Greathelm", + inventoryId = "Helm", + ilvl = 52, + properties = { { name = "[Ward|Runic Ward]", values = { { "180", 0 } } } }, + }) + + local item = build.itemsTab.items[build.itemsTab.slots["Helmet"].selItemId] + assert.is_truthy(item.raw:match("Runic Ward: 180")) + end) end) describe("ImportTab BuildPlanner export option", function() diff --git a/spec/System/TestItemMods_spec.lua b/spec/System/TestItemMods_spec.lua index 87d6767d77..18c1975a11 100644 --- a/spec/System/TestItemMods_spec.lua +++ b/spec/System/TestItemMods_spec.lua @@ -14,6 +14,12 @@ describe("TetsItemMods", function() assert.is_nil(mod.weightMultiplierKey) end) + it("does not colour a stat as modified without a base value", function() + assert.are.equals("^7", main:StatColor(10, nil, 90)) + assert.are.equals(colorCodes.MAGIC, main:StatColor(10, 5, 90)) + assert.are.equals(colorCodes.NEGATIVE, main:StatColor(100, nil, 90)) + end) + it("shows duplicate selected variants in item tooltips when enabled", function() local item = new("Item"):Item([[ Rarity: Unique diff --git a/spec/System/TestItemParse_spec.lua b/spec/System/TestItemParse_spec.lua index 335a8e3df0..0e1cd841bd 100644 --- a/spec/System/TestItemParse_spec.lua +++ b/spec/System/TestItemParse_spec.lua @@ -26,6 +26,13 @@ describe("TestItemParse", function() -- assert.are.equals(180, item.armourData.Ward) --end) + it("Ward defence", function() + local item = new("Item"):Item(raw("Ward: 180", "Runic Crown")) + assert.are.equals(180, item.armourData.Ward) + item = new("Item"):Item(raw("Runic Ward: 180", "Runic Crown")) + assert.are.equals(180, item.armourData.Ward) + end) + it("Title", function() local item = new("Item"):Item([[ Rarity: Rare diff --git a/spec/System/TestSkills_spec.lua b/spec/System/TestSkills_spec.lua index a3f75fb8ef..4c07b0a3c8 100644 --- a/spec/System/TestSkills_spec.lua +++ b/spec/System/TestSkills_spec.lua @@ -63,6 +63,47 @@ describe("TestSkills", function() assertGemSupportLevel("Apocalypse", 3, 4) end) + it("applies Leylines Runic Ward degeneration", function() + build.skillsTab:PasteSocketGroup("Leylines 1/0 1") + build.configTab.input.onLeyline = true + build.configTab:BuildModList() + runCallback("OnFrame") + + local output = build.calcsTab.mainOutput + assert.are.near(206 / 60, output.WardDegen, 0.01) + assert.are.near(output.WardRegen - output.WardDegen, output.WardRegenRecovery, 0.01) + end) + + it("calculates Scouring Flame runic ward cost and efficiency", function() + build.skillsTab:PasteSocketGroup("Ball Lightning 1/0 1\nScouring Flame 1/0 1") + runCallback("OnFrame") + assert.are.equals(2, build.calcsTab.mainOutput.WardCost) + + build.configTab.input.customMods = "100% increased Runic Ward Cost Efficiency" + build.configTab:BuildModList() + runCallback("OnFrame") + assert.are.equals(1, build.calcsTab.mainOutput.WardCost) + end) + + it("calculates runic infusion support costs from maximum runic ward", function() + for _, support in ipairs({ "Runic Infusion", "Olroth's Hubris" }) do + newBuild() + build.configTab.input.customMods = "+100 to maximum Runic Ward" + build.configTab:BuildModList() + build.itemsTab:CreateDisplayItemFromRaw("New Item\nMarauding Mace") + build.itemsTab:AddDisplayItem() + build.skillsTab:PasteSocketGroup("Leap Slam 1/0 1\n" .. support .. " 1/0 1") + runCallback("OnFrame") + assert.are.equals(20, build.calcsTab.mainOutput.WardCost) + end + end) + + it("calculates Runic Reprieve's ongoing runic ward cost", function() + build.skillsTab:PasteSocketGroup("Runic Reprieve 1/0 1") + runCallback("OnFrame") + assert.are.equals(3, build.calcsTab.mainOutput.WardPerSecondCost) + end) + it("applies Advanced Thaumaturgy quality stats only when enabled", function() local advancedThaumaturgy = build.spec.nodes[14429] assert.is_not_nil(advancedThaumaturgy) diff --git a/src/Classes/CompareBuySimilar.lua b/src/Classes/CompareBuySimilar.lua index 048e3b2b8a..6c7fe47c9c 100644 --- a/src/Classes/CompareBuySimilar.lua +++ b/src/Classes/CompareBuySimilar.lua @@ -317,7 +317,7 @@ function M.openPopup(item, slotName, primaryBuild) { key = "Armour", label = "Armour", tradeKey = "ar" }, { key = "Evasion", label = "Evasion", tradeKey = "ev" }, { key = "EnergyShield", label = "Energy Shield", tradeKey = "es" }, - { key = "Ward", label = "Ward", tradeKey = "ward" }, + { key = "Ward", label = "Runic Ward", tradeKey = "ward" }, } for _, def in ipairs(defences) do local val = item.armourData[def.key] @@ -497,7 +497,7 @@ function M.openPopup(item, slotName, primaryBuild) end displayTexts[index] = displayText end - + local displayText = table.concat(displayTexts, "\n") -- labels anchor based on the first row instead of the middle row, so adjust upwards diff --git a/src/Classes/CompareTab.lua b/src/Classes/CompareTab.lua index b9de34ec03..6499d6530c 100644 --- a/src/Classes/CompareTab.lua +++ b/src/Classes/CompareTab.lua @@ -3554,7 +3554,7 @@ function CompareTabClass:DrawItemExpanded(item, x, startY, colWidth, otherModMap drawY = drawY + lineHeight end if ward > 0 then - DrawString(x, drawY, "LEFT", fontSize, "VAR", s_format("^x7F7F7FWard: " .. colorCodes.MAGIC .. "%d", ward)) + DrawString(x, drawY, "LEFT", fontSize, "VAR", s_format("^x7F7F7FRunic Ward: " .. colorCodes.MAGIC .. "%d", ward)) drawY = drawY + lineHeight end if armourData.BlockChance and armourData.BlockChance > 0 then diff --git a/src/Classes/ImportTab.lua b/src/Classes/ImportTab.lua index 7232a24866..67bba842be 100644 --- a/src/Classes/ImportTab.lua +++ b/src/Classes/ImportTab.lua @@ -1419,29 +1419,31 @@ function ImportTabClass:ImportItem(itemData, slotName) end if itemData.properties then for _, property in pairs(itemData.properties) do - if escapeGGGString(property.name) == "Quality" then + local propertyName = escapeGGGString(property.name) + if propertyName == "Quality" then item.quality = tonumber(property.values[1][1]:match("%d+")) - elseif property.name == "Radius" then + elseif propertyName == "Radius" then item.jewelRadiusLabel = property.values[1][1] - elseif property.name == "Limited to" then + elseif propertyName == "Limited to" then item.limit = tonumber(property.values[1][1]) - elseif property.name == "Evasion Rating" then + elseif propertyName == "Evasion Rating" then if item.baseName == "Two-Toned Boots (Armour/Energy Shield)" then -- Another hack for Two-Toned Boots item.baseName = "Two-Toned Boots (Armour/Evasion)" item.base = self.build.data.itemBases[item.baseName] end - elseif property.name == "Energy Shield" then + elseif propertyName == "Energy Shield" then if item.baseName == "Two-Toned Boots (Armour/Evasion)" then -- Yet another hack for Two-Toned Boots item.baseName = "Two-Toned Boots (Evasion/Energy Shield)" item.base = self.build.data.itemBases[item.baseName] end end - if property.name == "Energy Shield" or property.name == "Ward" or property.name == "Armour" or property.name == "Evasion Rating" then + if propertyName == "Energy Shield" or propertyName == "Runic Ward" or propertyName == "Armour" or propertyName == "Evasion Rating" then item.armourData = item.armourData or { } + local defenceType = propertyName:gsub("Runic Ward", "Ward"):gsub(" Rating", ""):gsub(" ", "") for _, value in ipairs(property.values) do - item.armourData[property.name:gsub(" Rating", ""):gsub(" ", "")] = (item.armourData[property.name:gsub(" Rating", ""):gsub(" ", "")] or 0) + tonumber(value[1]) + item.armourData[defenceType] = (item.armourData[defenceType] or 0) + tonumber(value[1]) end end end diff --git a/src/Classes/Item.lua b/src/Classes/Item.lua index 76bee2cfd8..75a2c9deb4 100644 --- a/src/Classes/Item.lua +++ b/src/Classes/Item.lua @@ -832,7 +832,7 @@ function ItemClass:ParseRaw(raw, rarity, highQuality) -- Parsed before item lines so tagged bases and modifiers see the final selection. elseif specName == "Talisman Tier" then self.talismanTier = specToNumber(specVal) - elseif specName == "Armour" or specName == "Evasion Rating" or specName == "Evasion" or specName == "Energy Shield" or specName == "Ward" then + elseif specName == "Armour" or specName == "Evasion Rating" or specName == "Evasion" or specName == "Energy Shield" or specName == "Ward" or specName == "Runic Ward" then if specName == "Evasion Rating" then specName = "Evasion" if self.baseName == "Two-Toned Boots (Armour/Energy Shield)" then @@ -847,6 +847,8 @@ function ItemClass:ParseRaw(raw, rarity, highQuality) self.baseName = "Two-Toned Boots (Evasion/Energy Shield)" self.base = data.itemBases[self.baseName] end + elseif specName == "Runic Ward" then + specName = "Ward" end self.armourData = self.armourData or { } self.armourData[specName] = specToNumber(specVal) @@ -1841,7 +1843,7 @@ function ItemClass:BuildRaw() if self.armourData then for _, type in ipairs({ "Armour", "Evasion", "EnergyShield", "Ward" }) do if self.armourData[type] and self.armourData[type] > 0 then - t_insert(rawLines, type:gsub("EnergyShield", "Energy Shield") .. ": " .. self.armourData[type]) + t_insert(rawLines, type:gsub("EnergyShield", "Energy Shield"):gsub("Ward", "Runic Ward") .. ": " .. self.armourData[type]) end end end diff --git a/src/Data/Costs.lua b/src/Data/Costs.lua index b1f2502ba4..f884b666a8 100644 --- a/src/Data/Costs.lua +++ b/src/Data/Costs.lua @@ -29,7 +29,7 @@ return { [5] = { Resource = "Ward", Stat = "base_ward_cost", - ResourceString = "{0} Ward", + ResourceString = "{0} Runic Ward", Divisor = 1, }, [6] = { @@ -47,7 +47,7 @@ return { [8] = { Resource = "WardPercent", Stat = "base_ward_cost_%", - ResourceString = "{0}% Ward", + ResourceString = "{0}% Runic Ward", Divisor = 1, }, [9] = { @@ -107,7 +107,7 @@ return { [18] = { Resource = "WardPerMinute", Stat = "base_ward_cost_per_minute", - ResourceString = "{0} Ward per second", + ResourceString = "{0} Runic Ward per second", Divisor = 60, }, [19] = { diff --git a/src/Data/Global.lua b/src/Data/Global.lua index da43f115aa..3d410f8d5e 100644 --- a/src/Data/Global.lua +++ b/src/Data/Global.lua @@ -71,6 +71,7 @@ colorCodes = { VESTIGIAL = "^xCBA5F1", INTANGIBILITY = "^x9BF4BD", MEMORY = "^xBFE2FA", + SPIRIT = "^xF5D076", } colorCodes.STRENGTH = colorCodes.MARAUDER colorCodes.DEXTERITY = colorCodes.RANGER @@ -78,7 +79,6 @@ colorCodes.INTELLIGENCE = colorCodes.WITCH colorCodes.LIFE = colorCodes.MARAUDER colorCodes.MANA = colorCodes.WITCH -colorCodes.SPIRIT = colorCodes.RARE colorCodes.ES = colorCodes.SOURCE colorCodes.WARD = colorCodes.RARE colorCodes.ARMOUR = colorCodes.NORMAL diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index 3f0561dff2..2c8b6a753a 100644 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -265,8 +265,7 @@ c["+100 to all Attributes"]={{[1]={flags=0,keywordFlags=0,name="Str",type="BASE" c["+100 to maximum Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="BASE",value=100}},nil} c["+100 to maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=100}},nil} c["+100 to maximum Mana"]={{[1]={flags=0,keywordFlags=0,name="Mana",type="BASE",value=100}},nil} -c["+100 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=100}}," maximum Runic "} -c["+100 to maximum Runic Ward 150% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=100}}," maximum Runic 150% increased Armour "} +c["+100 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=100}},nil} c["+100% of Armour also applies to Elemental Damage"]={{[1]={flags=0,keywordFlags=0,name="ArmourAppliesToFireDamageTaken",type="BASE",value=100},[2]={flags=0,keywordFlags=0,name="ArmourAppliesToColdDamageTaken",type="BASE",value=100},[3]={flags=0,keywordFlags=0,name="ArmourAppliesToLightningDamageTaken",type="BASE",value=100}},nil} c["+100% of Armour also applies to Lightning Damage"]={{[1]={flags=0,keywordFlags=0,name="ArmourAppliesToLightningDamageTaken",type="BASE",value=100}},nil} c["+100% of Armour applies to Elemental Damage"]={{[1]={flags=0,keywordFlags=0,name="ArmourAppliesToFireDamageTaken",type="BASE",value=100},[2]={flags=0,keywordFlags=0,name="ArmourAppliesToColdDamageTaken",type="BASE",value=100},[3]={flags=0,keywordFlags=0,name="ArmourAppliesToLightningDamageTaken",type="BASE",value=100}},nil} @@ -318,7 +317,7 @@ c["+125 to Stun Threshold"]={{[1]={flags=0,keywordFlags=0,name="StunThreshold",t c["+125 to maximum Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="BASE",value=125}},nil} c["+125 to maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=125}},nil} c["+125 to maximum Mana"]={{[1]={flags=0,keywordFlags=0,name="Mana",type="BASE",value=125}},nil} -c["+125 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=125}}," maximum Runic "} +c["+125 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=125}},nil} c["+125% of Armour also applies to Elemental Damage"]={{[1]={flags=0,keywordFlags=0,name="ArmourAppliesToFireDamageTaken",type="BASE",value=125},[2]={flags=0,keywordFlags=0,name="ArmourAppliesToColdDamageTaken",type="BASE",value=125},[3]={flags=0,keywordFlags=0,name="ArmourAppliesToLightningDamageTaken",type="BASE",value=125}},nil} c["+125% to Melee Critical Damage Bonus"]={{[1]={flags=256,keywordFlags=0,name="CritMultiplier",type="BASE",value=125}},nil} c["+13 to Dexterity"]={{[1]={flags=0,keywordFlags=0,name="Dex",type="BASE",value=13}},nil} @@ -940,7 +939,7 @@ c["+300 to Accuracy Rating"]={{[1]={flags=0,keywordFlags=0,name="Accuracy",type= c["+300 to Ailment Threshold"]={{[1]={flags=0,keywordFlags=0,name="AilmentThreshold",type="BASE",value=300}},nil} c["+300 to Stun Threshold"]={{[1]={flags=0,keywordFlags=0,name="StunThreshold",type="BASE",value=300}},nil} c["+300 to maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=300}},nil} -c["+300 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=300}}," maximum Runic "} +c["+300 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=300}},nil} c["+308 to maximum Mana"]={{[1]={flags=0,keywordFlags=0,name="Mana",type="BASE",value=308}},nil} c["+31% to Chaos Resistance"]={{[1]={flags=0,keywordFlags=0,name="ChaosResist",type="BASE",value=31}},nil} c["+33% to Chaos Resistance"]={{[1]={flags=0,keywordFlags=0,name="ChaosResist",type="BASE",value=33}},nil} @@ -953,7 +952,7 @@ c["+35 to Spirit"]={{[1]={flags=0,keywordFlags=0,name="Spirit",type="BASE",value c["+35 to Strength"]={{[1]={flags=0,keywordFlags=0,name="Str",type="BASE",value=35}},nil} c["+35 to maximum Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="BASE",value=35}},nil} c["+35 to maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=35}},nil} -c["+35 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=35}}," maximum Runic "} +c["+35 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=35}},nil} c["+35% to Cold Resistance"]={{[1]={flags=0,keywordFlags=0,name="ColdResist",type="BASE",value=35}},nil} c["+35% to Fire Resistance"]={{[1]={flags=0,keywordFlags=0,name="FireResist",type="BASE",value=35}},nil} c["+35% to Lightning Resistance"]={{[1]={flags=0,keywordFlags=0,name="LightningResist",type="BASE",value=35}},nil} @@ -1023,8 +1022,7 @@ c["+40 to maximum Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShie c["+40 to maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=40}},nil} c["+40 to maximum Life per Socket filled"]={{[1]={[1]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="Life",type="BASE",value=40}},nil} c["+40 to maximum Mana"]={{[1]={flags=0,keywordFlags=0,name="Mana",type="BASE",value=40}},nil} -c["+40 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=40}}," maximum Runic "} -c["+40 to maximum Runic Ward 50% increased Critical Hit Chance"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=40}}," maximum Runic 50% increased Critical Hit Chance "} +c["+40 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=40}},nil} c["+40% of Armour also applies to Elemental Damage"]={{[1]={flags=0,keywordFlags=0,name="ArmourAppliesToFireDamageTaken",type="BASE",value=40},[2]={flags=0,keywordFlags=0,name="ArmourAppliesToColdDamageTaken",type="BASE",value=40},[3]={flags=0,keywordFlags=0,name="ArmourAppliesToLightningDamageTaken",type="BASE",value=40}},nil} c["+40% to Cold Resistance"]={{[1]={flags=0,keywordFlags=0,name="ColdResist",type="BASE",value=40}},nil} c["+40% to Critical Damage Bonus"]={{[1]={flags=0,keywordFlags=0,name="CritMultiplier",type="BASE",value=40}},nil} @@ -1097,8 +1095,7 @@ c["+50 to Stun Threshold"]={{[1]={flags=0,keywordFlags=0,name="StunThreshold",ty c["+50 to maximum Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="BASE",value=50}},nil} c["+50 to maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=50}},nil} c["+50 to maximum Mana"]={{[1]={flags=0,keywordFlags=0,name="Mana",type="BASE",value=50}},nil} -c["+50 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=50}}," maximum Runic "} -c["+50 to maximum Runic Ward 300% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=50}}," maximum Runic 300% increased Physical Damage "} +c["+50 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=50}},nil} c["+50% Global Critical Damage Bonus while you have no Frenzy Charges"]={{[1]={[1]={type="Global"},[2]={stat="FrenzyCharges",threshold=0,type="StatThreshold",upper=true},flags=0,keywordFlags=0,name="CritMultiplier",type="BASE",value=50}},nil} c["+50% Surpassing chance to fire an additional Arrow"]={{[1]={flags=0,keywordFlags=2048,name="SurpassingProjectileChance",type="BASE",value=50}},nil} c["+50% chance to be Shocked"]={{}," to be Shocked "} @@ -1175,7 +1172,7 @@ c["+70 to Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="BA c["+70 to Stun Threshold"]={{[1]={flags=0,keywordFlags=0,name="StunThreshold",type="BASE",value=70}},nil} c["+70 to maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=70}},nil} c["+70 to maximum Mana"]={{[1]={flags=0,keywordFlags=0,name="Mana",type="BASE",value=70}},nil} -c["+70 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=70}}," maximum Runic "} +c["+70 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=70}},nil} c["+70% to Critical Damage Bonus"]={{[1]={flags=0,keywordFlags=0,name="CritMultiplier",type="BASE",value=70}},nil} c["+75 to Accuracy Rating"]={{[1]={flags=0,keywordFlags=0,name="Accuracy",type="BASE",value=75}},nil} c["+75 to Spirit"]={{[1]={flags=0,keywordFlags=0,name="Spirit",type="BASE",value=75}},nil} @@ -1183,7 +1180,7 @@ c["+75 to all Attributes"]={{[1]={flags=0,keywordFlags=0,name="Str",type="BASE", c["+75 to maximum Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="BASE",value=75}},nil} c["+75 to maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=75}},nil} c["+75 to maximum Mana"]={{[1]={flags=0,keywordFlags=0,name="Mana",type="BASE",value=75}},nil} -c["+75 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=75}}," maximum Runic "} +c["+75 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=75}},nil} c["+75% to Cold Resistance"]={{[1]={flags=0,keywordFlags=0,name="ColdResist",type="BASE",value=75}},nil} c["+75% to Fire Resistance"]={{[1]={flags=0,keywordFlags=0,name="FireResist",type="BASE",value=75}},nil} c["+75% to Lightning Resistance"]={{[1]={flags=0,keywordFlags=0,name="LightningResist",type="BASE",value=75}},nil} @@ -1230,10 +1227,10 @@ c["+85 to Spirit"]={{[1]={flags=0,keywordFlags=0,name="Spirit",type="BASE",value c["+85 to maximum Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="BASE",value=85}},nil} c["+85 to maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=85}},nil} c["+85 to maximum Mana"]={{[1]={flags=0,keywordFlags=0,name="Mana",type="BASE",value=85}},nil} -c["+85 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=85}}," maximum Runic "} +c["+85 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=85}},nil} c["+86 to maximum Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="BASE",value=86}},nil} c["+87 to Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="BASE",value=87}},nil} -c["+875 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=875}}," maximum Runic "} +c["+875 to maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="BASE",value=875}},nil} c["+88 to Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="BASE",value=88}},nil} c["+88% to Cold Resistance when Socketed with a Green Gem"]={{[1]={[1]={keyword="dexterity",slotName="{SlotName}",sockets={[1]=1},type="SocketedIn"},flags=0,keywordFlags=0,name="SocketProperty",type="LIST",value={value={flags=0,keywordFlags=0,name="ColdResist",type="BASE",value=88}}}},nil} c["+88% to Fire Resistance when Socketed with a Red Gem"]={{[1]={[1]={keyword="strength",slotName="{SlotName}",sockets={[1]=1},type="SocketedIn"},flags=0,keywordFlags=0,name="SocketProperty",type="LIST",value={value={flags=0,keywordFlags=0,name="FireResist",type="BASE",value=88}}}},nil} @@ -1527,8 +1524,8 @@ c["10% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC" c["10% increased Armour and Evasion Rating per Summoned Totem in your Presence"]={{[1]={[1]={stat="TotemsSummoned",type="PerStat"},flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=10}},nil} c["10% increased Armour if you've consumed an Endurance Charge Recently"]={{[1]={[1]={limit=1,type="Multiplier",var="RemovableEnduranceCharge"},flags=0,keywordFlags=0,name="Armour",type="INC",value=10}},nil} c["10% increased Armour while Shapeshifted"]={{[1]={[1]={type="Condition",var="Shapeshifted"},flags=0,keywordFlags=0,name="Armour",type="INC",value=10}},nil} -c["10% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=10}},nil} -c["10% increased Armour, Evasion and Energy Shield while your Companion is in your Presence"]={{[1]={[1]={type="Condition",var="CompanionInPresence"},flags=0,keywordFlags=0,name="Defences",type="INC",value=10}},nil} +c["10% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=10},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=10},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=10}},nil} +c["10% increased Armour, Evasion and Energy Shield while your Companion is in your Presence"]={{[1]={[1]={type="Condition",var="CompanionInPresence"},flags=0,keywordFlags=0,name="Armour",type="INC",value=10},[2]={[1]={type="Condition",var="CompanionInPresence"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=10},[3]={[1]={type="Condition",var="CompanionInPresence"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=10}},nil} c["10% increased Attack Area Damage"]={{[1]={flags=513,keywordFlags=0,name="Damage",type="INC",value=10}},nil} c["10% increased Attack Damage"]={{[1]={flags=1,keywordFlags=0,name="Damage",type="INC",value=10}},nil} c["10% increased Attack Damage per Summoned Totem in your Presence"]={{[1]={[1]={stat="TotemsSummoned",type="PerStat"},flags=1,keywordFlags=0,name="Damage",type="INC",value=10}},nil} @@ -1623,7 +1620,7 @@ c["10% increased Flask Effect Duration"]={{[1]={flags=0,keywordFlags=0,name="Fla c["10% increased Flask and Charm Charges gained"]={{[1]={flags=0,keywordFlags=0,name="CharmChargesGained",type="INC",value=10},[2]={flags=0,keywordFlags=0,name="FlaskChargesGained",type="INC",value=10}},nil} c["10% increased Freeze Buildup"]={{[1]={flags=0,keywordFlags=0,name="EnemyFreezeBuildup",type="INC",value=10}},nil} c["10% increased Freeze Threshold"]={{[1]={flags=0,keywordFlags=0,name="FreezeThreshold",type="INC",value=10}},nil} -c["10% increased Global Armour, Evasion and Energy Shield per Socket filled"]={{[1]={[1]={type="Global"},[2]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="Defences",type="INC",value=10}},nil} +c["10% increased Global Armour, Evasion and Energy Shield per Socket filled"]={{[1]={[1]={type="Global"},[2]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="Armour",type="INC",value=10},[2]={[1]={type="Global"},[2]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=10},[3]={[1]={type="Global"},[2]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=10}},nil} c["10% increased Global Physical Damage"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=10}},nil} c["10% increased Grenade Area of Effect"]={{[1]={[1]={skillType=159,type="SkillType"},flags=0,keywordFlags=0,name="AreaOfEffect",type="INC",value=10}},nil} c["10% increased Hazard Area of Effect"]={{[1]={[1]={skillType=203,type="SkillType"},flags=0,keywordFlags=0,name="AreaOfEffect",type="INC",value=10}},nil} @@ -1793,8 +1790,8 @@ c["100% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC c["100% increased Armour Break Duration"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=100}}," Break Duration "} c["100% increased Armour and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEnergyShield",type="INC",value=100}},nil} c["100% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=100}},nil} -c["100% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=100}},nil} -c["100% increased Armour, Evasion and Energy Shield from Equipped Shield"]={{[1]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="Defences",type="INC",value=100}},nil} +c["100% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=100},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=100},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=100}},nil} +c["100% increased Armour, Evasion and Energy Shield from Equipped Shield"]={{[1]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="Armour",type="INC",value=100},[2]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=100},[3]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=100}},nil} c["100% increased Arrow Speed"]={{[1]={flags=0,keywordFlags=2048,name="ProjectileSpeed",type="INC",value=100}},nil} c["100% increased Aspect of the Avian Buff Effect"]={{[1]={[1]={skillName="Aspect of the Avian",type="SkillName"},flags=0,keywordFlags=0,name="BuffEffect",type="INC",value=100}},nil} c["100% increased Attack Damage"]={{[1]={flags=1,keywordFlags=0,name="Damage",type="INC",value=100}},nil} @@ -1914,7 +1911,7 @@ c["11% increased Damage with Spears"]={{[1]={flags=268435460,keywordFlags=0,name c["11% increased Damage with Swords"]={{[1]={flags=4194308,keywordFlags=0,name="Damage",type="INC",value=11}},nil} c["11% increased Damage with Unarmed Attacks"]={{[1]={flags=16777220,keywordFlags=0,name="Damage",type="INC",value=11}},nil} c["11% increased Elemental Ailment Threshold"]={{[1]={flags=0,keywordFlags=0,name="AilmentThreshold",type="INC",value=11}},nil} -c["11% increased Global Armour, Evasion and Energy Shield per Socket filled"]={{[1]={[1]={type="Global"},[2]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="Defences",type="INC",value=11}},nil} +c["11% increased Global Armour, Evasion and Energy Shield per Socket filled"]={{[1]={[1]={type="Global"},[2]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="Armour",type="INC",value=11},[2]={[1]={type="Global"},[2]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=11},[3]={[1]={type="Global"},[2]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=11}},nil} c["11% increased Life Cost of Skills"]={{[1]={flags=0,keywordFlags=0,name="LifeCost",type="INC",value=11}},nil} c["11% increased Melee Damage"]={{[1]={flags=256,keywordFlags=0,name="Damage",type="INC",value=11}},nil} c["11% increased Projectile Damage"]={{[1]={flags=1024,keywordFlags=0,name="Damage",type="INC",value=11}},nil} @@ -2001,7 +1998,7 @@ c["12% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",t c["12% increased Fire Damage"]={{[1]={flags=0,keywordFlags=0,name="FireDamage",type="INC",value=12}},nil} c["12% increased Freeze Buildup"]={{[1]={flags=0,keywordFlags=0,name="EnemyFreezeBuildup",type="INC",value=12}},nil} c["12% increased Frenzy Charge Duration"]={{[1]={flags=0,keywordFlags=0,name="FrenzyChargesDuration",type="INC",value=12}},nil} -c["12% increased Global Armour, Evasion and Energy Shield per Socket filled"]={{[1]={[1]={type="Global"},[2]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="Defences",type="INC",value=12}},nil} +c["12% increased Global Armour, Evasion and Energy Shield per Socket filled"]={{[1]={[1]={type="Global"},[2]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="Armour",type="INC",value=12},[2]={[1]={type="Global"},[2]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=12},[3]={[1]={type="Global"},[2]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=12}},nil} c["12% increased Global Attack Speed per Green Socket"]={{[1]={[1]={type="Global"},flags=1,keywordFlags=0,name="Speed",type="INC",value=12}}," per Green Socket "} c["12% increased Grenade Damage"]={{[1]={[1]={skillType=159,type="SkillType"},flags=0,keywordFlags=0,name="Damage",type="INC",value=12}},nil} c["12% increased Ignite Magnitude"]={{[1]={flags=0,keywordFlags=8388608,name="AilmentMagnitude",type="INC",value=12}},nil} @@ -2051,7 +2048,7 @@ c["12.5 Life Regeneration per second"]={{[1]={flags=0,keywordFlags=0,name="LifeR c["120% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=120}},nil} c["120% increased Armour and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEnergyShield",type="INC",value=120}},nil} c["120% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=120}},nil} -c["120% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=120}},nil} +c["120% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=120},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=120},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=120}},nil} c["120% increased Cold Damage"]={{[1]={flags=0,keywordFlags=0,name="ColdDamage",type="INC",value=120}},nil} c["120% increased Damage with Hits against Enemies that are on Low Life"]={{[1]={[1]={actor="enemy",type="ActorCondition",var="LowLife"},flags=0,keywordFlags=262144,name="Damage",type="INC",value=120}},nil} c["120% increased Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=120}},nil} @@ -2247,7 +2244,7 @@ c["15% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC" c["15% increased Armour Break Duration"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=15}}," Break Duration "} c["15% increased Armour and Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=15}},nil} c["15% increased Armour while stationary"]={{[1]={[1]={type="Condition",var="Stationary"},flags=0,keywordFlags=0,name="Armour",type="INC",value=15}},nil} -c["15% increased Armour, Evasion and Energy Shield from Equipped Shield"]={{[1]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="Defences",type="INC",value=15}},nil} +c["15% increased Armour, Evasion and Energy Shield from Equipped Shield"]={{[1]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="Armour",type="INC",value=15},[2]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=15},[3]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=15}},nil} c["15% increased Attack Area Damage"]={{[1]={flags=513,keywordFlags=0,name="Damage",type="INC",value=15}},nil} c["15% increased Attack Critical Hit Chance while Dual Wielding"]={{[1]={[1]={type="Condition",var="DualWielding"},flags=1,keywordFlags=0,name="CritChance",type="INC",value=15}},nil} c["15% increased Attack Damage"]={{[1]={flags=1,keywordFlags=0,name="Damage",type="INC",value=15}},nil} @@ -2450,7 +2447,7 @@ c["15% increased effect of Socketed Soul Cores"]={{[1]={flags=0,keywordFlags=0,n c["15% increased maximum Energy Shield"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=15}},nil} c["15% increased maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="INC",value=15}},nil} c["15% increased maximum Mana"]={{[1]={flags=0,keywordFlags=0,name="Mana",type="INC",value=15}},nil} -c["15% less Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="MORE",value=-15}},nil} +c["15% less Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="MORE",value=-15},[2]={flags=0,keywordFlags=0,name="Evasion",type="MORE",value=-15},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="MORE",value=-15}},nil} c["15% less Damage"]={{[1]={flags=0,keywordFlags=0,name="Damage",type="MORE",value=-15}},nil} c["15% less Movement Speed"]={{[1]={flags=0,keywordFlags=0,name="MovementSpeed",type="MORE",value=-15}},nil} c["15% less Spirit"]={{[1]={flags=0,keywordFlags=0,name="Spirit",type="MORE",value=-15}},nil} @@ -2505,7 +2502,7 @@ c["150% increased Amount Recovered"]={{[1]={flags=0,keywordFlags=0,name="FlaskRe c["150% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=150}},nil} c["150% increased Armour and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEnergyShield",type="INC",value=150}},nil} c["150% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=150}},nil} -c["150% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=150}},nil} +c["150% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=150},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=150},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=150}},nil} c["150% increased Charges per use"]={{[1]={flags=0,keywordFlags=0,name="FlaskChargesUsed",type="INC",value=150}},nil} c["150% increased Chill Duration on Enemies"]={{[1]={flags=0,keywordFlags=0,name="EnemyChillDuration",type="INC",value=150}},nil} c["150% increased Cold Damage while your Off Hand is empty"]={{[1]={[1]={type="Condition",var="OffHandAttack"},[2]={skillType=1,type="SkillType"},flags=0,keywordFlags=0,name="ColdDamage",type="INC",value=150}}," while your is empty "} @@ -2600,7 +2597,7 @@ c["172% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="Physical c["175% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=175}},nil} c["175% increased Armour and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEnergyShield",type="INC",value=175}},nil} c["175% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=175}},nil} -c["175% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=175}},nil} +c["175% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=175},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=175},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=175}},nil} c["175% increased Critical Hit Chance with arrows that Fork"]={{[1]={[1]={stat="ForkRemaining",threshold=1,type="StatThreshold"},[2]={stat="PierceCount",threshold=0,type="StatThreshold",upper=true},flags=0,keywordFlags=2048,name="CritChance",type="INC",value=175}},nil} c["175% increased Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=175}},nil} c["175% increased Energy Shield Recharge Rate during any Flask Effect"]={{[1]={[1]={type="Condition",var="UsingFlask"},flags=0,keywordFlags=0,name="EnergyShieldRecharge",type="INC",value=175}},nil} @@ -2616,7 +2613,7 @@ c["18% chance when you Reload a Crossbow to be immediate"]={{[1]={flags=0,keywor c["18% increased Area of Effect for Attacks"]={{[1]={flags=1,keywordFlags=0,name="AreaOfEffect",type="INC",value=18}},nil} c["18% increased Area of Effect if you've Killed Recently"]={{[1]={[1]={type="Condition",var="KilledRecently"},flags=0,keywordFlags=0,name="AreaOfEffect",type="INC",value=18}},nil} c["18% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=18}},nil} -c["18% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=18}},nil} +c["18% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=18},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=18},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=18}},nil} c["18% increased Attack Speed"]={{[1]={flags=1,keywordFlags=0,name="Speed",type="INC",value=18}},nil} c["18% increased Block chance"]={{[1]={flags=0,keywordFlags=0,name="BlockChance",type="INC",value=18}},nil} c["18% increased Burning Damage"]={{[1]={flags=0,keywordFlags=134217728,name="FireDamage",type="INC",value=18}},nil} @@ -2648,7 +2645,7 @@ c["18% increased Stun Buildup with Melee Damage"]={{[1]={flags=256,keywordFlags= c["18% increased Vaal Skill Effect Duration"]={{[1]={flags=0,keywordFlags=512,name="Duration",type="INC",value=18}},nil} c["18% increased Warcry Cooldown Recovery Rate"]={{[1]={flags=0,keywordFlags=4,name="CooldownRecovery",type="INC",value=18}},nil} c["18% increased maximum Energy Shield"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=18}},nil} -c["18% increased maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="INC",value=18}}," maximum Runic "} +c["18% increased maximum Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="INC",value=18}},nil} c["18% more Global Evasion Rating and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="MORE",value=18},[2]={flags=0,keywordFlags=0,name="EnergyShield",type="MORE",value=18}},nil} c["18% more damage taken while Cursed"]={{[1]={[1]={type="Condition",var="Cursed"},flags=0,keywordFlags=0,name="DamageTaken",type="MORE",value=18}},nil} c["18% of Damage taken Recouped as Life"]={{[1]={flags=0,keywordFlags=0,name="LifeRecoup",type="BASE",value=18}},nil} @@ -2736,7 +2733,7 @@ c["20 Life Regeneration per second"]={{[1]={flags=0,keywordFlags=0,name="LifeReg c["20 Life gained on Kill per Frenzy Charge"]={{[1]={[1]={type="Condition",var="KilledRecently"},[2]={type="Multiplier",var="FrenzyCharge"},flags=0,keywordFlags=0,name="Life",type="BASE",value=20}}," gained "} c["20 to 30 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=20},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=30}},nil} c["20% Chance to build an additional Combo on Hit"]={{}," to build an additional Combo "} -c["20% Life Recovery from Flasks also applies to Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="FlaskLifeRecovery",type="BASE",value=20}},"% also applies to Runic Ward "} +c["20% Life Recovery from Flasks also applies to Runic Ward"]={{[1]={flags=0,keywordFlags=0,name="LifeFlaskRecoveryAppliesToWard",type="BASE",value=20}},nil} c["20% chance for Attack Hits to apply Incision"]={{[1]={flags=0,keywordFlags=0,name="Condition:CanInflictIncision",type="FLAG",value=true}},nil} c["20% chance for Bleeding to be Aggravated when Inflicted against Enemies on Jagged Ground"]={{}," to be Aggravated when Inflicted against Enemies on Jagged Ground "} c["20% chance for Bleeding to be Aggravated when Inflicted against Enemies on Jagged Ground 40% increased Jagged Ground Duration"]={{[1]={flags=0,keywordFlags=4194304,name="Duration",type="BASE",value=20}}," to be Aggravated when Inflicted against Enemies on Jagged Ground 40% increased Jagged Ground "} @@ -2812,9 +2809,9 @@ c["20% increased Armour if you have been Hit Recently"]={{[1]={[1]={type="Condit c["20% increased Armour if you haven't been Hit Recently"]={{[1]={[1]={neg=true,type="Condition",var="BeenHitRecently"},flags=0,keywordFlags=0,name="Armour",type="INC",value=20}},nil} c["20% increased Armour if you've consumed an Endurance Charge Recently"]={{[1]={[1]={limit=1,type="Multiplier",var="RemovableEnduranceCharge"},flags=0,keywordFlags=0,name="Armour",type="INC",value=20}},nil} c["20% increased Armour while Surrounded"]={{[1]={[1]={type="Condition",var="Surrounded"},flags=0,keywordFlags=0,name="Armour",type="INC",value=20}},nil} -c["20% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=20}},nil} -c["20% increased Armour, Evasion and Energy Shield from Equipped Shield"]={{[1]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="Defences",type="INC",value=20}},nil} -c["20% increased Armour, Evasion and Energy Shield while your Companion is in your Presence"]={{[1]={[1]={type="Condition",var="CompanionInPresence"},flags=0,keywordFlags=0,name="Defences",type="INC",value=20}},nil} +c["20% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=20},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=20},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=20}},nil} +c["20% increased Armour, Evasion and Energy Shield from Equipped Shield"]={{[1]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="Armour",type="INC",value=20},[2]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=20},[3]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=20}},nil} +c["20% increased Armour, Evasion and Energy Shield while your Companion is in your Presence"]={{[1]={[1]={type="Condition",var="CompanionInPresence"},flags=0,keywordFlags=0,name="Armour",type="INC",value=20},[2]={[1]={type="Condition",var="CompanionInPresence"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=20},[3]={[1]={type="Condition",var="CompanionInPresence"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=20}},nil} c["20% increased Attack Damage"]={{[1]={flags=1,keywordFlags=0,name="Damage",type="INC",value=20}},nil} c["20% increased Attack Damage if you have been Heavy Stunned Recently"]={{[1]={[1]={type="Condition",var="StunnedRecently"},flags=1,keywordFlags=0,name="Damage",type="INC",value=20}},nil} c["20% increased Attack Damage while Surrounded"]={{[1]={[1]={type="Condition",var="Surrounded"},flags=1,keywordFlags=0,name="Damage",type="INC",value=20}},nil} @@ -2902,7 +2899,7 @@ c["20% increased Freeze Buildup with Empowered Attacks"]={{[1]={flags=0,keywordF c["20% increased Freeze Buildup with Quarterstaves"]={{[1]={flags=2097156,keywordFlags=0,name="EnemyFreezeBuildup",type="INC",value=20}},nil} c["20% increased Freeze Duration on Enemies"]={{[1]={flags=0,keywordFlags=0,name="EnemyFreezeDuration",type="INC",value=20}},nil} c["20% increased Frenzy Charge Duration"]={{[1]={flags=0,keywordFlags=0,name="FrenzyChargesDuration",type="INC",value=20}},nil} -c["20% increased Global Armour, Evasion and Energy Shield"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="Defences",type="INC",value=20}},nil} +c["20% increased Global Armour, Evasion and Energy Shield"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="Armour",type="INC",value=20},[2]={[1]={type="Global"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=20},[3]={[1]={type="Global"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=20}},nil} c["20% increased Global Physical Damage"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=20}},nil} c["20% increased Glory generation"]={{}," Glory generation "} c["20% increased Glory generation for Banner Skills"]={{}," Glory generation for Banner Skills "} @@ -3012,7 +3009,7 @@ c["20% increased maximum Energy Shield if you've consumed a Power Charge Recentl c["20% increased maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="INC",value=20}},nil} c["20% increased maximum Mana"]={{[1]={flags=0,keywordFlags=0,name="Mana",type="INC",value=20}},nil} c["20% increased speed of Recoup Effects"]={{[1]={flags=0,keywordFlags=0,name="LocalEffect",type="INC",value=20}}," speed of Recoup s "} -c["20% less Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="MORE",value=-20}},nil} +c["20% less Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="MORE",value=-20},[2]={flags=0,keywordFlags=0,name="Evasion",type="MORE",value=-20},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="MORE",value=-20}},nil} c["20% less Attack Speed"]={{[1]={flags=1,keywordFlags=0,name="Speed",type="MORE",value=-20}},nil} c["20% less Attributes"]={{[1]={flags=0,keywordFlags=0,name="Str",type="MORE",value=-20},[2]={flags=0,keywordFlags=0,name="Dex",type="MORE",value=-20},[3]={flags=0,keywordFlags=0,name="Int",type="MORE",value=-20},[4]={flags=0,keywordFlags=0,name="All",type="MORE",value=-20}},nil} c["20% less Damage"]={{[1]={flags=0,keywordFlags=0,name="Damage",type="MORE",value=-20}},nil} @@ -3089,7 +3086,7 @@ c["200% faster start of inherent Rage loss"]={{}," start of inherent Rage loss " c["200% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=200}},nil} c["200% increased Armour and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEnergyShield",type="INC",value=200}},nil} c["200% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=200}},nil} -c["200% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=200}},nil} +c["200% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=200},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=200},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=200}},nil} c["200% increased Critical Hit Chance"]={{[1]={flags=0,keywordFlags=0,name="CritChance",type="INC",value=200}},nil} c["200% increased Damage with Claws while on Low Life"]={{[1]={[1]={type="Condition",var="LowLife"},flags=262148,keywordFlags=0,name="Damage",type="INC",value=200}},nil} c["200% increased Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=200}},nil} @@ -3122,7 +3119,7 @@ c["22.5 Life Regeneration per second"]={{[1]={flags=0,keywordFlags=0,name="LifeR c["221% increased Chaos Damage"]={{[1]={flags=0,keywordFlags=0,name="ChaosDamage",type="INC",value=221}},nil} c["221% increased Elemental Damage"]={{[1]={flags=0,keywordFlags=0,name="ElementalDamage",type="INC",value=221}},nil} c["221% increased Spell Physical Damage"]={{[1]={flags=2,keywordFlags=0,name="PhysicalDamage",type="INC",value=221}},nil} -c["225% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=225}},nil} +c["225% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=225},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=225},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=225}},nil} c["225% increased Duration"]={{[1]={flags=0,keywordFlags=0,name="Duration",type="INC",value=225}},nil} c["225% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=225}},nil} c["225% increased Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EvasionAndEnergyShield",type="INC",value=225}},nil} @@ -3160,7 +3157,7 @@ c["23% more Global Evasion Rating and Energy Shield"]={{[1]={flags=0,keywordFlag c["23% of Damage taken during effect Recouped as Life"]={{[1]={[1]={type="Condition",var="UsingFlask"},flags=0,keywordFlags=0,name="DamageTaken",type="BASE",value=23}}," Recouped as Life "} c["23% reduced Duration"]={{[1]={flags=0,keywordFlags=0,name="Duration",type="INC",value=-23}},nil} c["23% reduced Light Radius"]={{[1]={flags=0,keywordFlags=0,name="LightRadius",type="INC",value=-23}},nil} -c["24% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=24}},nil} +c["24% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=24},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=24},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=24}},nil} c["24% increased Attack Damage"]={{[1]={flags=1,keywordFlags=0,name="Damage",type="INC",value=24}},nil} c["24% increased Damage with Hits against Enemies affected by Elemental Ailments"]={{[1]={[1]={actor="enemy",type="ActorCondition",varList={[1]="Frozen",[2]="Chilled",[3]="Shocked",[4]="Ignited",[5]="Scorched",[6]="Brittle",[7]="Sapped"}},flags=0,keywordFlags=262144,name="Damage",type="INC",value=24}},nil} c["24% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=24}},nil} @@ -3236,7 +3233,7 @@ c["25% increased Armour Break Duration 25% increased Attack Area Damage"]={{[1]= c["25% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=25}},nil} c["25% increased Armour and Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=25}},nil} c["25% increased Armour if you've Hit an Enemy with a Melee Attack Recently"]={{[1]={[1]={type="Condition",var="HitMeleeRecently"},flags=0,keywordFlags=0,name="Armour",type="INC",value=25}},nil} -c["25% increased Armour, Evasion and Energy Shield from Equipped Shield"]={{[1]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="Defences",type="INC",value=25}},nil} +c["25% increased Armour, Evasion and Energy Shield from Equipped Shield"]={{[1]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="Armour",type="INC",value=25},[2]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=25},[3]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=25}},nil} c["25% increased Arrow Speed"]={{[1]={flags=0,keywordFlags=2048,name="ProjectileSpeed",type="INC",value=25}},nil} c["25% increased Attack Area Damage"]={{[1]={flags=513,keywordFlags=0,name="Damage",type="INC",value=25}},nil} c["25% increased Attack Damage"]={{[1]={flags=1,keywordFlags=0,name="Damage",type="INC",value=25}},nil} @@ -3432,7 +3429,7 @@ c["25% of Physical Damage from Hits taken as Chaos Damage"]={{[1]={flags=0,keywo c["25% of Spell Mana Cost Converted to Life Cost"]={{[1]={[1]={skillType=2,type="SkillType"},flags=0,keywordFlags=0,name="HybridManaAndLifeCost_Life",type="BASE",value=25}},nil} c["25% reduced Armour Break taken"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=-25}}," Break taken "} c["25% reduced Armour Break taken Defend with 120% of Armour while not on Low Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=-25}}," Break taken Defend with 120% of Armour while not on Low Energy Shield "} -c["25% reduced Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=-25}},nil} +c["25% reduced Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=-25},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=-25},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=-25}},nil} c["25% reduced Attack and Cast Speed"]={{[1]={flags=0,keywordFlags=0,name="Speed",type="INC",value=-25}},nil} c["25% reduced Attribute Requirements"]={{[1]={flags=0,keywordFlags=0,name="StrRequirement",type="INC",value=-25},[2]={flags=0,keywordFlags=0,name="DexRequirement",type="INC",value=-25},[3]={flags=0,keywordFlags=0,name="IntRequirement",type="INC",value=-25}},nil} c["25% reduced Bleeding Duration"]={{[1]={flags=0,keywordFlags=0,name="EnemyBleedDuration",type="INC",value=-25}},nil} @@ -3478,7 +3475,7 @@ c["250% increased Amount Recovered"]={{[1]={flags=0,keywordFlags=0,name="FlaskRe c["250% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=250}},nil} c["250% increased Armour and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEnergyShield",type="INC",value=250}},nil} c["250% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=250}},nil} -c["250% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=250}},nil} +c["250% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=250},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=250},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=250}},nil} c["250% increased Duration"]={{[1]={flags=0,keywordFlags=0,name="Duration",type="INC",value=250}},nil} c["250% increased Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=250}},nil} c["250% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=250}},nil} @@ -3524,7 +3521,7 @@ c["3% chance to gain Volatility on Kill"]={nil,"Volatility "} c["3% faster Curse Activation per 20 Tribute"]={{[1]={[1]={actor="parent",div=20,stat="Tribute",type="PerStat"},flags=0,keywordFlags=0,name="CurseActivation",type="INC",value=3}},nil} c["3% faster start of Energy Shield Recharge"]={{[1]={flags=0,keywordFlags=0,name="EnergyShieldRechargeFaster",type="INC",value=3}},nil} c["3% increased Area of Effect"]={{[1]={flags=0,keywordFlags=0,name="AreaOfEffect",type="INC",value=3}},nil} -c["3% increased Armour, Evasion and Energy Shield from Equipped Shield per 10 Devotion"]={{[1]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},[3]={actor="parent",div=10,stat="Devotion",type="PerStat"},flags=0,keywordFlags=0,name="Defences",type="INC",value=3}},nil} +c["3% increased Armour, Evasion and Energy Shield from Equipped Shield per 10 Devotion"]={{[1]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},[3]={actor="parent",div=10,stat="Devotion",type="PerStat"},flags=0,keywordFlags=0,name="Armour",type="INC",value=3},[2]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},[3]={actor="parent",div=10,stat="Devotion",type="PerStat"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=3},[3]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},[3]={actor="parent",div=10,stat="Devotion",type="PerStat"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=3}},nil} c["3% increased Attack Speed"]={{[1]={flags=1,keywordFlags=0,name="Speed",type="INC",value=3}},nil} c["3% increased Attack Speed if you've dealt a Critical Hit Recently"]={{[1]={[1]={type="Condition",var="CritRecently"},flags=1,keywordFlags=0,name="Speed",type="INC",value=3}},nil} c["3% increased Attack Speed per 20 Dexterity"]={{[1]={[1]={div=20,stat="Dex",type="PerStat"},flags=1,keywordFlags=0,name="Speed",type="INC",value=3}},nil} @@ -3643,8 +3640,8 @@ c["30% increased Armour and Evasion Rating while Leeching"]={{[1]={[1]={type="Co c["30% increased Armour while Bleeding"]={{[1]={[1]={type="Condition",var="Bleeding"},flags=0,keywordFlags=0,name="Armour",type="INC",value=30}},nil} c["30% increased Armour while Surrounded"]={{[1]={[1]={type="Condition",var="Surrounded"},flags=0,keywordFlags=0,name="Armour",type="INC",value=30}},nil} c["30% increased Armour while stationary"]={{[1]={[1]={type="Condition",var="Stationary"},flags=0,keywordFlags=0,name="Armour",type="INC",value=30}},nil} -c["30% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=30}},nil} -c["30% increased Armour, Evasion and Energy Shield while wielding a Quarterstaff"]={{[1]={[1]={type="Condition",var="UsingStaff"},flags=0,keywordFlags=0,name="Defences",type="INC",value=30}},nil} +c["30% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=30},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=30},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=30}},nil} +c["30% increased Armour, Evasion and Energy Shield while wielding a Quarterstaff"]={{[1]={[1]={type="Condition",var="UsingStaff"},flags=0,keywordFlags=0,name="Armour",type="INC",value=30},[2]={[1]={type="Condition",var="UsingStaff"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=30},[3]={[1]={type="Condition",var="UsingStaff"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=30}},nil} c["30% increased Attack Damage against Bleeding Enemies"]={{[1]={[1]={actor="enemy",type="ActorCondition",var="Bleeding"},flags=1,keywordFlags=0,name="Damage",type="INC",value=30}},nil} c["30% increased Attack Damage against Rare or Unique Enemies"]={{[1]={[1]={actor="enemy",type="ActorCondition",var="RareOrUnique"},flags=1,keywordFlags=0,name="Damage",type="INC",value=30}},nil} c["30% increased Attack Damage if you have Shapeshifted to an Animal form Recently"]={{[1]={[1]={type="Condition",var="ShapeshiftToAnimal"},flags=1,keywordFlags=0,name="Damage",type="INC",value=30}},nil} @@ -3764,7 +3761,7 @@ c["30% increased Rarity of Items Dropped by Enemies killed with a Critical Hit Y c["30% increased Rarity of Items Dropped by Slain Shocked Enemies"]={{[1]={[1]={actor="enemy",type="ActorCondition",var="Shocked"},flags=0,keywordFlags=0,name="LootRarity",type="INC",value=30}},nil} c["30% increased Rarity of Items found"]={{[1]={flags=0,keywordFlags=0,name="LootRarity",type="INC",value=30}},nil} c["30% increased Reservation Efficiency of Skills which create Undead Minions"]={{[1]={[1]={skillType=127,type="SkillType"},flags=0,keywordFlags=0,name="ReservationEfficiency",type="INC",value=30}},nil} -c["30% increased Runic Ward Regeneration Rate"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="INC",value=30}}," Runic Regeneration Rate "} +c["30% increased Runic Ward Regeneration Rate"]={{[1]={flags=0,keywordFlags=0,name="WardRegen",type="INC",value=30}},nil} c["30% increased Shock Chance against Electrocuted Enemies"]={{[1]={[1]={actor="enemy",type="ActorCondition",var="Electrocuted"},flags=0,keywordFlags=0,name="EnemyShockChance",type="INC",value=30}},nil} c["30% increased Skill Effect Duration"]={{[1]={flags=0,keywordFlags=0,name="Duration",type="INC",value=30}},nil} c["30% increased Skill Speed"]={{[1]={flags=0,keywordFlags=0,name="Speed",type="INC",value=30},[2]={flags=0,keywordFlags=0,name="WarcrySpeed",type="INC",value=30},[3]={flags=0,keywordFlags=0,name="TotemPlacementSpeed",type="INC",value=30}},nil} @@ -3837,7 +3834,7 @@ c["30% reduced Evasion Rating if you haven't been Hit Recently"]={{[1]={[1]={neg c["30% reduced Flask Charges gained"]={{[1]={flags=0,keywordFlags=0,name="FlaskChargesGained",type="INC",value=-30}},nil} c["30% reduced Flask Effect Duration"]={{[1]={flags=0,keywordFlags=0,name="FlaskDuration",type="INC",value=-30}},nil} c["30% reduced Flask Life Recovery rate"]={{[1]={flags=0,keywordFlags=0,name="FlaskLifeRecoveryRate",type="INC",value=-30}},nil} -c["30% reduced Global Armour, Evasion and Energy Shield"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="Defences",type="INC",value=-30}},nil} +c["30% reduced Global Armour, Evasion and Energy Shield"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="Armour",type="INC",value=-30},[2]={[1]={type="Global"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=-30},[3]={[1]={type="Global"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=-30}},nil} c["30% reduced Life Recovery rate"]={{[1]={flags=0,keywordFlags=0,name="LifeRecoveryRate",type="INC",value=-30}},nil} c["30% reduced Life Regeneration rate"]={{[1]={flags=0,keywordFlags=0,name="LifeRegen",type="INC",value=-30}},nil} c["30% reduced Magnitude of Ignite on you"]={{[1]={flags=0,keywordFlags=0,name="SelfIgniteEffect",type="INC",value=-30}},nil} @@ -3861,11 +3858,11 @@ c["300% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC c["300% increased Armour and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEnergyShield",type="INC",value=300}},nil} c["300% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=300}},nil} c["300% increased Armour while Chilled or Frozen"]={{[1]={[1]={type="Condition",var="Chilled"},flags=0,keywordFlags=0,name="Armour",type="INC",value=300}}," or Frozen "} -c["300% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=300}},nil} +c["300% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=300},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=300},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=300}},nil} c["300% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=300}},nil} c["300% increased Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EvasionAndEnergyShield",type="INC",value=300}},nil} c["300% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=300}},nil} -c["305% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=305}},nil} +c["305% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=305},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=305},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=305}},nil} c["31 to 49 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=31},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=49}},nil} c["31% increased Cast Speed while on Full Mana"]={{[1]={[1]={type="Condition",var="FullMana"},flags=16,keywordFlags=0,name="Speed",type="INC",value=31}},nil} c["31% increased Chaos Damage"]={{[1]={flags=0,keywordFlags=0,name="ChaosDamage",type="INC",value=31}},nil} @@ -3920,7 +3917,7 @@ c["35% increased Accuracy Rating"]={{[1]={flags=0,keywordFlags=0,name="Accuracy" c["35% increased Accuracy Rating against Enemies affected by Abyssal Wasting"]={{[1]={flags=0,keywordFlags=0,name="AbyssalWastingAlsoGrants",type="LIST",value={mod={flags=0,keywordFlags=0,name="Accuracy",type="INC",value=35},unscalable=true}}},nil} c["35% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=35}},nil} c["35% increased Armour while Bleeding"]={{[1]={[1]={type="Condition",var="Bleeding"},flags=0,keywordFlags=0,name="Armour",type="INC",value=35}},nil} -c["35% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=35}},nil} +c["35% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=35},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=35},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=35}},nil} c["35% increased Attack Damage while you have an Ally in your Presence"]={{[1]={[1]={threshold=1,type="MultiplierThreshold",var="NearbyAlly"},flags=1,keywordFlags=0,name="Damage",type="INC",value=35}},nil} c["35% increased Attack Speed"]={{[1]={flags=1,keywordFlags=0,name="Speed",type="INC",value=35}},nil} c["35% increased Attack Speed with Swords"]={{[1]={flags=4194309,keywordFlags=0,name="Speed",type="INC",value=35}},nil} @@ -3963,7 +3960,7 @@ c["35% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalD c["35% increased Projectile Speed with this Weapon"]={{[1]={[1]={type="Condition",var="{Hand}Attack"},[2]={neg=true,skillType=166,type="SkillType"},flags=8192,keywordFlags=0,name="ProjectileSpeed",type="INC",value=35}},nil} c["35% increased Rarity of Items Dropped by Slain Maimed Enemies"]={{[1]={flags=0,keywordFlags=0,name="LootRarity",type="INC",value=35}}," by Slain Maimed Enemies "} c["35% increased Rarity of Items found"]={{[1]={flags=0,keywordFlags=0,name="LootRarity",type="INC",value=35}},nil} -c["35% increased Runic Ward Regeneration Rate"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="INC",value=35}}," Runic Regeneration Rate "} +c["35% increased Runic Ward Regeneration Rate"]={{[1]={flags=0,keywordFlags=0,name="WardRegen",type="INC",value=35}},nil} c["35% increased Spell Area Damage"]={{[1]={flags=514,keywordFlags=0,name="Damage",type="INC",value=35}},nil} c["35% increased Spell Damage if you have consumed an Elemental Infusion Recently"]={{[1]={[1]={type="Condition",var="InfusionConsumedRecently"},flags=2,keywordFlags=0,name="Damage",type="INC",value=35}},nil} c["35% increased Stun Buildup"]={{[1]={flags=0,keywordFlags=0,name="EnemyHeavyStunBuildup",type="INC",value=35}},nil} @@ -3988,9 +3985,9 @@ c["35% reduced Presence Area of Effect"]={{[1]={flags=0,keywordFlags=0,name="Pre c["350 Physical Damage taken on Minion Death"]={{[1]={flags=0,keywordFlags=0,name="HeartboundLoopSelfDamage",type="LIST",value={baseDamage=350,damageType="physical"}}},nil} c["350% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=350}},nil} c["350% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=350}},nil} -c["350% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=350}},nil} +c["350% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=350},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=350},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=350}},nil} c["350% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=350}},nil} -c["36% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=36}},nil} +c["36% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=36},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=36},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=36}},nil} c["36% increased maximum Energy Shield"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=36}},nil} c["37% increased Chaos Damage"]={{[1]={flags=0,keywordFlags=0,name="ChaosDamage",type="INC",value=37}},nil} c["375% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=375}},nil} @@ -4009,7 +4006,7 @@ c["38% increased Life Recovery from Flasks"]={{[1]={flags=0,keywordFlags=0,name= c["38% increased Life Recovery rate"]={{[1]={flags=0,keywordFlags=0,name="LifeRecoveryRate",type="INC",value=38}},nil} c["38% increased Magnitude of Shock you inflict"]={{[1]={flags=0,keywordFlags=0,name="EnemyShockMagnitude",type="INC",value=38}},nil} c["38% increased Presence Area of Effect"]={{[1]={flags=0,keywordFlags=0,name="PresenceArea",type="INC",value=38}},nil} -c["38% increased Runic Ward Regeneration Rate"]={{[1]={flags=0,keywordFlags=0,name="Ward",type="INC",value=38}}," Runic Regeneration Rate "} +c["38% increased Runic Ward Regeneration Rate"]={{[1]={flags=0,keywordFlags=0,name="WardRegen",type="INC",value=38}},nil} c["38% of Spell Mana Cost Converted to Life Cost"]={{[1]={[1]={skillType=2,type="SkillType"},flags=0,keywordFlags=0,name="HybridManaAndLifeCost_Life",type="BASE",value=38}},nil} c["38% reduced Recovery rate"]={{[1]={flags=0,keywordFlags=0,name="FlaskRecoveryRate",type="INC",value=-38}},nil} c["38% reduced effect of Shock on you"]={{[1]={flags=0,keywordFlags=0,name="SelfShockEffect",type="INC",value=-38}},nil} @@ -4029,7 +4026,7 @@ c["4% increased Area of Effect"]={{[1]={flags=0,keywordFlags=0,name="AreaOfEffec c["4% increased Area of Effect for Attacks"]={{[1]={flags=1,keywordFlags=0,name="AreaOfEffect",type="INC",value=4}},nil} c["4% increased Area of Effect for Attacks per Enemy you've Ignited in the last 8 seconds, up to 40%"]={{[1]={flags=1,keywordFlags=0,name="AreaOfEffect",type="INC",value=4}}," per Enemy you've Ignited in the last 8 seconds, up to 40% "} c["4% increased Area of Effect of Ancestrally Boosted Attacks"]={{[1]={flags=1,keywordFlags=0,name="AncestralBoostAreaOfEffect",type="INC",value=4}},nil} -c["4% increased Armour, Evasion and Energy Shield while Channelling"]={{[1]={[1]={type="Condition",var="Channelling"},flags=0,keywordFlags=0,name="Defences",type="INC",value=4}},nil} +c["4% increased Armour, Evasion and Energy Shield while Channelling"]={{[1]={[1]={type="Condition",var="Channelling"},flags=0,keywordFlags=0,name="Armour",type="INC",value=4},[2]={[1]={type="Condition",var="Channelling"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=4},[3]={[1]={type="Condition",var="Channelling"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=4}},nil} c["4% increased Attack Damage per 75 Item Armour and Evasion on Equipped Shield"]={{[1]={[1]={div=75,statList={[1]="ArmourOnWeapon 2",[2]="EvasionOnWeapon 2"},type="PerStat"},[2]={type="Condition",var="UsingShield"},flags=1,keywordFlags=0,name="Damage",type="INC",value=4}},nil} c["4% increased Attack Speed"]={{[1]={flags=1,keywordFlags=0,name="Speed",type="INC",value=4}},nil} c["4% increased Attack Speed while a Rare or Unique Enemy is in your Presence"]={{[1]={[1]={actor="enemy",type="ActorCondition",varList={[1]="NearbyRareOrUniqueEnemy",[2]="RareOrUnique"}},flags=1,keywordFlags=0,name="Speed",type="INC",value=4}},nil} @@ -4266,7 +4263,7 @@ c["40% reduced effect of Curses on you"]={{[1]={flags=0,keywordFlags=0,name="Cur c["40% reduced effect of Shock on you"]={{[1]={flags=0,keywordFlags=0,name="SelfShockEffect",type="INC",value=-40}},nil} c["400% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=400}},nil} c["400% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=400}},nil} -c["400% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=400}},nil} +c["400% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=400},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=400},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=400}},nil} c["400% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=400}},nil} c["41 Life gained when you Block"]={{[1]={flags=0,keywordFlags=0,name="LifeOnBlock",type="BASE",value=41}},nil} c["41% increased Cast Speed"]={{[1]={flags=16,keywordFlags=0,name="Speed",type="INC",value=41}},nil} @@ -4360,7 +4357,7 @@ c["5% faster start of Energy Shield Recharge"]={{[1]={flags=0,keywordFlags=0,nam c["5% increased Accuracy Rating"]={{[1]={flags=0,keywordFlags=0,name="Accuracy",type="INC",value=5}},nil} c["5% increased Area Damage"]={{[1]={flags=512,keywordFlags=0,name="Damage",type="INC",value=5}},nil} c["5% increased Area of Effect"]={{[1]={flags=0,keywordFlags=0,name="AreaOfEffect",type="INC",value=5}},nil} -c["5% increased Armour, Evasion and Energy Shield from Equipped Shield per 25 Tribute"]={{[1]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},[3]={actor="parent",div=25,stat="Tribute",type="PerStat"},flags=0,keywordFlags=0,name="Defences",type="INC",value=5}},nil} +c["5% increased Armour, Evasion and Energy Shield from Equipped Shield per 25 Tribute"]={{[1]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},[3]={actor="parent",div=25,stat="Tribute",type="PerStat"},flags=0,keywordFlags=0,name="Armour",type="INC",value=5},[2]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},[3]={actor="parent",div=25,stat="Tribute",type="PerStat"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=5},[3]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},[3]={actor="parent",div=25,stat="Tribute",type="PerStat"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=5}},nil} c["5% increased Attack Critical Hit Chance per 10 Tribute"]={{[1]={[1]={actor="parent",div=10,stat="Tribute",type="PerStat"},flags=1,keywordFlags=0,name="CritChance",type="INC",value=5}},nil} c["5% increased Attack Damage"]={{[1]={flags=1,keywordFlags=0,name="Damage",type="INC",value=5}},nil} c["5% increased Attack Damage for each Minion in your Presence, up to a maximum of 80%"]={{[1]={[1]={limit=80,limitTotal=true,type="Multiplier",var="MinionPresenceCount"},flags=1,keywordFlags=0,name="Damage",type="INC",value=5}},nil} @@ -4392,7 +4389,7 @@ c["5% increased Dexterity"]={{[1]={flags=0,keywordFlags=0,name="Dex",type="INC", c["5% increased Duration of Damaging Ailments on Enemies"]={{[1]={flags=0,keywordFlags=0,name="EnemyIgniteDuration",type="INC",value=5},[2]={flags=0,keywordFlags=0,name="EnemyBleedDuration",type="INC",value=5},[3]={flags=0,keywordFlags=0,name="EnemyPoisonDuration",type="INC",value=5}},nil} c["5% increased Experience gain"]={{}," Experience gain "} c["5% increased Flask Effect Duration"]={{[1]={flags=0,keywordFlags=0,name="FlaskDuration",type="INC",value=5}},nil} -c["5% increased Global Armour, Evasion and Energy Shield"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="Defences",type="INC",value=5}},nil} +c["5% increased Global Armour, Evasion and Energy Shield"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="Armour",type="INC",value=5},[2]={[1]={type="Global"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=5},[3]={[1]={type="Global"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=5}},nil} c["5% increased Intelligence"]={{[1]={flags=0,keywordFlags=0,name="Int",type="INC",value=5}},nil} c["5% increased Life Regeneration rate"]={{[1]={flags=0,keywordFlags=0,name="LifeRegen",type="INC",value=5}},nil} c["5% increased Life and Mana Regeneration Rate for each Minion in your Presence, up to a maximum of 40%"]={{[1]={[1]={limit=40,limitTotal=true,type="Multiplier",var="MinionPresenceCount"},flags=0,keywordFlags=0,name="LifeRegen",type="INC",value=5},[2]={[1]={limit=40,limitTotal=true,type="Multiplier",var="MinionPresenceCount"},flags=0,keywordFlags=0,name="ManaRegen",type="INC",value=5}},nil} @@ -4497,7 +4494,7 @@ c["50% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="Armour c["50% increased Armour from Equipped Body Armour"]={{[1]={[1]={slotName="Body Armour",type="SlotName"},flags=0,keywordFlags=0,name="Armour",type="INC",value=50}},nil} c["50% increased Armour while Bleeding"]={{[1]={[1]={type="Condition",var="Bleeding"},flags=0,keywordFlags=0,name="Armour",type="INC",value=50}},nil} c["50% increased Armour while Ignited"]={{[1]={[1]={type="Condition",var="Ignited"},flags=0,keywordFlags=0,name="Armour",type="INC",value=50}},nil} -c["50% increased Armour, Evasion and Energy Shield from Equipped Shield"]={{[1]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="Defences",type="INC",value=50}},nil} +c["50% increased Armour, Evasion and Energy Shield from Equipped Shield"]={{[1]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="Armour",type="INC",value=50},[2]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=50},[3]={[1]={slotName="Weapon 2",type="SlotName"},[2]={type="Condition",var="UsingShield"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=50}},nil} c["50% increased Attack Damage"]={{[1]={flags=1,keywordFlags=0,name="Damage",type="INC",value=50}},nil} c["50% increased Attack Damage while moving"]={{[1]={[1]={type="Condition",var="Moving"},flags=1,keywordFlags=0,name="Damage",type="INC",value=50}},nil} c["50% increased Attack Speed"]={{[1]={flags=1,keywordFlags=0,name="Speed",type="INC",value=50}},nil} @@ -4827,7 +4824,7 @@ c["60% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC" c["60% increased Armour and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEnergyShield",type="INC",value=60}},nil} c["60% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=60}},nil} c["60% increased Armour from Equipped Body Armour"]={{[1]={[1]={slotName="Body Armour",type="SlotName"},flags=0,keywordFlags=0,name="Armour",type="INC",value=60}},nil} -c["60% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=60}},nil} +c["60% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=60},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=60},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=60}},nil} c["60% increased Attack Damage while on Low Life"]={{[1]={[1]={type="Condition",var="LowLife"},flags=1,keywordFlags=0,name="Damage",type="INC",value=60}},nil} c["60% increased Block chance"]={{[1]={flags=0,keywordFlags=0,name="BlockChance",type="INC",value=60}},nil} c["60% increased Critical Damage Bonus"]={{[1]={flags=0,keywordFlags=0,name="CritMultiplier",type="INC",value=60}},nil} @@ -4876,7 +4873,7 @@ c["60% reduced Poison Duration on you"]={{[1]={flags=0,keywordFlags=0,name="Self c["60% reduced Reload Speed"]={{[1]={flags=1,keywordFlags=0,name="ReloadSpeed",type="INC",value=-60}},nil} c["60% reduced effect of Curses on you"]={{[1]={flags=0,keywordFlags=0,name="CurseEffectOnSelf",type="INC",value=-60}},nil} c["600% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=600}},nil} -c["62% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=62}},nil} +c["62% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=62},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=62},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=62}},nil} c["63% chance to Pierce an Enemy"]={{[1]={flags=0,keywordFlags=0,name="PierceChance",type="BASE",value=63}},nil} c["63% increased Amount Recovered"]={{[1]={flags=0,keywordFlags=0,name="FlaskRecovery",type="INC",value=63}},nil} c["63% increased Critical Hit Chance for Spells"]={{[1]={flags=2,keywordFlags=0,name="CritChance",type="INC",value=63}},nil} @@ -4975,7 +4972,7 @@ c["73% increased Mana Recovered"]={{[1]={flags=0,keywordFlags=0,name="FlaskRecov c["74% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=74}},nil} c["74% increased Armour and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEnergyShield",type="INC",value=74}},nil} c["74% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=74}},nil} -c["74% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=74}},nil} +c["74% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=74},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=74},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=74}},nil} c["74% increased Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=74}},nil} c["74% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=74}},nil} c["74% increased Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EvasionAndEnergyShield",type="INC",value=74}},nil} @@ -5001,10 +4998,10 @@ c["75% increased Spell Damage"]={{[1]={flags=2,keywordFlags=0,name="Damage",type c["75% increased Spirit"]={{[1]={flags=0,keywordFlags=0,name="Spirit",type="INC",value=75}},nil} c["75% increased Thorns damage if you've Blocked Recently"]={{[1]={[1]={type="Condition",var="BlockedRecently"},flags=32,keywordFlags=0,name="Damage",type="INC",value=75}},nil} c["75% increased chance to Shock"]={{[1]={flags=0,keywordFlags=0,name="EnemyShockChance",type="INC",value=75}},nil} -end)();(function() c["75% increased effect of Socketed Augment Items"]={{[1]={flags=0,keywordFlags=0,name="SocketedAugmentItemEffect",type="INC",value=75}},nil} c["75% more Stun Buildup with Lightning Damage"]={{[1]={[1]={type="Condition",var="LightningHasDamage"},flags=0,keywordFlags=0,name="EnemyHeavyStunBuildup",type="MORE",value=75}},nil} c["75% of Damage Converted to Fire Damage"]={{[1]={flags=0,keywordFlags=0,name="DamageConvertToFire",type="BASE",value=75}},nil} +end)();(function() c["75% of Volatility Physical Damage Taken as Cold Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamageTakenAsCold",type="BASE",value=75}}," Volatility "} c["75% reduced Amount Recovered"]={{[1]={flags=0,keywordFlags=0,name="FlaskRecovery",type="INC",value=-75}},nil} c["75% reduced Charges per use"]={{[1]={flags=0,keywordFlags=0,name="FlaskChargesUsed",type="INC",value=-75}},nil} @@ -5044,7 +5041,7 @@ c["8% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC", c["8% increased Armour and Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=8}},nil} c["8% increased Armour and Evasion Rating while Leeching"]={{[1]={[1]={type="Condition",var="Leeching"},flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=8}},nil} c["8% increased Armour per Endurance Charge"]={{[1]={[1]={type="Multiplier",var="EnduranceCharge"},flags=0,keywordFlags=0,name="Armour",type="INC",value=8}},nil} -c["8% increased Armour, Evasion and Energy Shield while Channelling"]={{[1]={[1]={type="Condition",var="Channelling"},flags=0,keywordFlags=0,name="Defences",type="INC",value=8}},nil} +c["8% increased Armour, Evasion and Energy Shield while Channelling"]={{[1]={[1]={type="Condition",var="Channelling"},flags=0,keywordFlags=0,name="Armour",type="INC",value=8},[2]={[1]={type="Condition",var="Channelling"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=8},[3]={[1]={type="Condition",var="Channelling"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=8}},nil} c["8% increased Attack Area Damage"]={{[1]={flags=513,keywordFlags=0,name="Damage",type="INC",value=8}},nil} c["8% increased Attack Cold Damage"]={{[1]={flags=1,keywordFlags=0,name="ColdDamage",type="INC",value=8}},nil} c["8% increased Attack Damage"]={{[1]={flags=1,keywordFlags=0,name="Damage",type="INC",value=8}},nil} @@ -5166,7 +5163,7 @@ c["80% increased Armour and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name=" c["80% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=80}},nil} c["80% increased Armour and Evasion Rating when on Low Life"]={{[1]={[1]={type="Condition",var="LowLife"},flags=0,keywordFlags=0,name="ArmourAndEvasion",type="INC",value=80}},nil} c["80% increased Armour from Equipped Body Armour"]={{[1]={[1]={slotName="Body Armour",type="SlotName"},flags=0,keywordFlags=0,name="Armour",type="INC",value=80}},nil} -c["80% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=80}},nil} +c["80% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=80},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=80},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=80}},nil} c["80% increased Block chance"]={{[1]={flags=0,keywordFlags=0,name="BlockChance",type="INC",value=80}},nil} c["80% increased Cold Damage with Attack Skills"]={{[1]={flags=0,keywordFlags=65536,name="ColdDamage",type="INC",value=80}},nil} c["80% increased Critical Damage Bonus with Crossbows"]={{[1]={flags=67108868,keywordFlags=0,name="CritMultiplier",type="INC",value=80}},nil} @@ -5217,7 +5214,7 @@ c["85% increased Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShiel c["85% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=85}},nil} c["85% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=85}},nil} c["85% increased Rarity of Items found"]={{[1]={flags=0,keywordFlags=0,name="LootRarity",type="INC",value=85}},nil} -c["86% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=86}},nil} +c["86% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=86},[2]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=86},[3]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=86}},nil} c["86% increased Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=86}},nil} c["86% more Recovery if used while on Low Life"]={{[1]={[1]={type="Condition",var="LowLife"},flags=0,keywordFlags=0,name="FlaskLifeRecoveryLowLife",type="MORE",value=86}},nil} c["86% more Recovery if used while on Low Mana"]={{[1]={[1]={type="Condition",var="LowMana"},flags=0,keywordFlags=0,name="FlaskLifeRecoveryLowLife",type="MORE",value=86}}," if used "} @@ -8522,8 +8519,7 @@ c["Lose 3% of maximum Life and Energy Shield when you use a Chaos Skill"]={{[1]= c["Lose 3.75% of maximum Life per second"]={{[1]={flags=0,keywordFlags=0,name="LifeDegenPercent",type="BASE",value=3.75}},nil} c["Lose 5 Life when you use a Skill"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=-5}}," when you use a Skill "} c["Lose 5 Life when you use a Skill 5 to 10 Physical Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=-5}}," when you use a Skill 5 to 10 Physical Thorns damage "} -c["Lose 5% Life per second while you have no Runic Ward during Effect"]={{[1]={[1]={type="Condition",var="UsingFlask"},flags=0,keywordFlags=0,name="LifeDegenPercent",type="BASE",value=5}}," while you have no Runic "} -c["Lose 5% Life per second while you have no Runic Ward during Effect Mana Recovery from Flasks can Overflow maximum Mana during Effect"]={{[1]={[1]={type="Condition",var="UsingFlask"},[2]={type="Condition",var="UsingFlask"},flags=0,keywordFlags=0,name="LifeDegenPercent",type="BASE",value=5}}," while you have no Runic Mana Recovery from Flasks can Overflow maximum Mana "} +c["Lose 5% Life per second while you have no Runic Ward during Effect"]={{[1]={[1]={type="Condition",var="NoRunicWard"},[2]={type="Condition",var="UsingFlask"},flags=0,keywordFlags=0,name="LifeDegenPercent",type="BASE",value=5}},nil} c["Lose 5% of Energy Shield per second"]={{[1]={flags=0,keywordFlags=0,name="EnergyShieldDegenPercent",type="BASE",value=5}},nil} c["Lose 5% of maximum Life per second"]={{[1]={flags=0,keywordFlags=0,name="LifeDegenPercent",type="BASE",value=5}},nil} c["Lose 5% of maximum Mana per Second"]={{[1]={flags=0,keywordFlags=0,name="ManaDegenPercent",type="BASE",value=5}},nil} @@ -8790,7 +8786,7 @@ c["Nearby Allies have +7% to Critical Damage Bonus per 100 Dexterity you have"]= c["Nearby Allies have 1% Chance to Block Attack Damage per 100 Strength you have"]={{[1]={[1]={div=100,stat="Str",type="PerStat"},flags=0,keywordFlags=0,name="ExtraAura",type="LIST",value={mod={flags=0,keywordFlags=0,name="BlockChance",type="BASE",value=1},onlyAllies=true}}},nil} c["Nearby Allies have 3% increased Cast Speed per 100 Intelligence you have"]={{[1]={[1]={div=100,stat="Int",type="PerStat"},flags=0,keywordFlags=0,name="ExtraAura",type="LIST",value={mod={flags=16,keywordFlags=0,name="Speed",type="INC",value=3},onlyAllies=true}}},nil} c["Nearby Allies have 30% increased Item Rarity"]={{}," Item Rarity "} -c["Nearby Allies have 5% increased Armour, Evasion and Energy Shield per 100 Strength you have"]={{[1]={[1]={div=100,stat="Str",type="PerStat"},flags=0,keywordFlags=0,name="ExtraAura",type="LIST",value={mod={flags=0,keywordFlags=0,name="Defences",type="INC",value=5},onlyAllies=true}}}," you have "} +c["Nearby Allies have 5% increased Armour, Evasion and Energy Shield per 100 Strength you have"]={{[1]={[1]={div=100,stat="Str",type="PerStat"},flags=0,keywordFlags=0,name="ExtraAura",type="LIST",value={mod={flags=0,keywordFlags=0,name="Armour",type="INC",value=5},onlyAllies=true}},[2]={[1]={div=100,stat="Str",type="PerStat"},flags=0,keywordFlags=0,name="ExtraAura",type="LIST",value={mod={flags=0,keywordFlags=0,name="Evasion",type="INC",value=5},onlyAllies=true}},[3]={[1]={div=100,stat="Str",type="PerStat"},flags=0,keywordFlags=0,name="ExtraAura",type="LIST",value={mod={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=5},onlyAllies=true}}}," you have "} c["Nearby Allies have Culling Strike"]={{[1]={flags=0,keywordFlags=0,name="ExtraAura",type="LIST",value={mod={flags=0,keywordFlags=0,name="CanCull",type="FLAG",value=true},onlyAllies=true}}},nil} c["Nearby Allies' Action Speed cannot be modified to below base value"]={{[1]={flags=0,keywordFlags=0,name="ExtraAura",type="LIST",value={mod={[1]={effectType="Global",type="GlobalEffect",unscalable=true},flags=0,keywordFlags=0,name="MinimumActionSpeed",type="MAX",value=100},onlyAllies=true}}},nil} c["Nearby Enemies are Blinded"]={{[1]={flags=0,keywordFlags=0,name="EnemyModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="Condition:Blinded",type="FLAG",value=true}}}},nil} @@ -9096,7 +9092,7 @@ c["Recover 2% of maximum Mana on Kill"]={{[1]={[1]={percent=2,stat="Mana",type=" c["Recover 2% of maximum Mana when you consume a Power Charge"]={nil,"Recover 2% of maximum Mana when you consume a Power Charge "} c["Recover 20 Life when you Block"]={{[1]={flags=0,keywordFlags=0,name="LifeOnBlock",type="BASE",value=20}},nil} c["Recover 20 Mana when Used"]={nil,"Recover 20 Mana when Used "} -c["Recover 20 Runic Ward when you Block"]={nil,"Recover 20 Runic Ward when you Block "} +c["Recover 20 Runic Ward when you Block"]={{[1]={flags=0,keywordFlags=0,name="WardOnBlock",type="BASE",value=20}},nil} c["Recover 20% of Missing Life before being Hit by an Enemy"]={nil,"Recover 20% of Missing Life before being Hit by an Enemy "} c["Recover 20% of Missing Life before being Hit by an Enemy Recover 30% of Missing Life before being Hit by an Enemy"]={nil,"Recover 20% of Missing Life before being Hit by an Enemy Recover 30% of Missing Life before being Hit by an Enemy "} c["Recover 20% of maximum Life on Rampage"]={nil,"Recover 20% of maximum Life on Rampage "} @@ -9256,7 +9252,7 @@ c["Regenerate 3% of maximum Life over 1 second when Stunned +1 to Stun Threshold c["Regenerate 3% of maximum Life per second"]={{[1]={flags=0,keywordFlags=0,name="LifeRegenPercent",type="BASE",value=3}},nil} c["Regenerate 3% of maximum Life per second while Ignited"]={{[1]={[1]={type="Condition",var="Ignited"},flags=0,keywordFlags=0,name="LifeRegenPercent",type="BASE",value=3}},nil} c["Regenerate 3% of maximum Life per second while on Low Life"]={{[1]={[1]={type="Condition",var="LowLife"},flags=0,keywordFlags=0,name="LifeRegenPercent",type="BASE",value=3}},nil} -c["Regenerate 3.8% of maximum Runic Ward per second during Effect"]={{}," "} +c["Regenerate 3.8% of maximum Runic Ward per second during Effect"]={{[1]={[1]={type="Condition",var="UsingFlask"},flags=0,keywordFlags=0,name="WardRegenPercent",type="BASE",value=3.8}},nil} c["Regenerate 35 Mana per second if all Equipped Items are Corrupted"]={{[1]={[1]={threshold=0,type="MultiplierThreshold",upper=true,var="NonCorruptedItem"},flags=0,keywordFlags=0,name="ManaRegen",type="BASE",value=35}},nil} c["Regenerate 4% of maximum Life per second"]={{[1]={flags=0,keywordFlags=0,name="LifeRegenPercent",type="BASE",value=4}},nil} c["Regenerate 400 Energy Shield per second if all Equipped items are Corrupted"]={{[1]={[1]={threshold=0,type="MultiplierThreshold",upper=true,var="NonCorruptedItem"},flags=0,keywordFlags=0,name="EnergyShieldRegen",type="BASE",value=400}},nil} @@ -9361,7 +9357,7 @@ c["Skills Cost Divinity instead of Mana or Life"]={nil,"Skills Cost Divinity ins c["Skills Fire 3 additional Projectiles for 4 seconds after you consume a total of 12 Steel Shards"]={{[1]={[1]={type="Condition",var="Consumed12SteelShardsRecently"},flags=0,keywordFlags=0,name="ProjectileCount",type="BASE",value=3}},nil} c["Skills Gain 10% of Mana Cost as Extra Life Cost"]={{[1]={flags=0,keywordFlags=0,name="BaseManaCostAsLifeCost",type="BASE",value=10}},nil} c["Skills Gain 100% of Mana Cost as Extra Life Cost"]={{[1]={flags=0,keywordFlags=0,name="BaseManaCostAsLifeCost",type="BASE",value=100}},nil} -c["Skills Gain 5% of damage as Extra Lightning damage per 50 Runic Ward Cost"]={{[1]={flags=0,keywordFlags=0,name="DamageGainAsLightning",type="BASE",value=5}}," per 50 Runic Ward Cost "} +c["Skills Gain 5% of damage as Extra Lightning damage per 50 Runic Ward Cost"]={{[1]={[1]={div=50,stat="WardCost",type="PerStat"},flags=0,keywordFlags=0,name="DamageGainAsLightning",type="BASE",value=5}},nil} c["Skills Gain 50% of Mana Cost as Extra Life Cost"]={{[1]={flags=0,keywordFlags=0,name="BaseManaCostAsLifeCost",type="BASE",value=50}},nil} c["Skills can build and retain Combo regardless of Weapon Set"]={nil,"Skills can build and retain Combo regardless of Weapon Set "} c["Skills can build and retain Combo regardless of Weapon Set Gain Combo from all Attack Hits"]={nil,"Skills can build and retain Combo regardless of Weapon Set Gain Combo from all Attack Hits "} @@ -10003,11 +9999,11 @@ c["additional Elemental Infusion of the same type"]={nil,"additional Elemental I c["additional Rune-only sockets:"]={nil,"additional Rune-only sockets: "} c["additional Rune-only sockets: 1 Helmet socket"]={nil,"additional Rune-only sockets: 1 Helmet socket "} c["additional Rune-only sockets: 1 Helmet socket 2 Body Armour sockets"]={nil,"additional Rune-only sockets: 1 Helmet socket 2 Body Armour sockets "} -end)();(function() c["additional Rune-only sockets: 1 Helmet socket 2 Body Armour sockets 1 Gloves socket"]={nil,"additional Rune-only sockets: 1 Helmet socket 2 Body Armour sockets 1 Gloves socket "} c["additional Rune-only sockets: 1 Helmet socket 2 Body Armour sockets 1 Gloves socket 1 Boots socket"]={nil,"additional Rune-only sockets: 1 Helmet socket 2 Body Armour sockets 1 Gloves socket 1 Boots socket "} c["as being boosted by Chilled Ground"]={nil,"as being boosted by Chilled Ground "} c["as being boosted by Ignited Ground"]={nil,"as being boosted by Ignited Ground "} +end)();(function() c["as being boosted by Ignited, Shocked, and Chilled Ground"]={nil,"as being boosted by Ignited, Shocked, and Chilled Ground "} c["as being boosted by Shocked Ground"]={nil,"as being boosted by Shocked Ground "} c["being Shapeshifted for at least 8 seconds"]={nil,"being Shapeshifted for at least 8 seconds "} diff --git a/src/Data/SkillStatMap.lua b/src/Data/SkillStatMap.lua index 2ccf887b9a..e1f4826422 100644 --- a/src/Data/SkillStatMap.lua +++ b/src/Data/SkillStatMap.lua @@ -1788,6 +1788,10 @@ return function(mod, flag, skill) ["gain_energy_shield_cost_equal_to_intelligence"] = { mod("ESCostNoMult", "BASE", nil, 0, 0, { type = "PercentStat", stat = "Int", percent = 100 }), }, +["base_skill_ward_cost_as_%_of_life_and_mana_cost"] = { + mod("WardCostAsPercentOfManaCost", "BASE", nil), + mod("WardCostAsPercentOfLifeCost", "BASE", nil), +}, -- Projectiles ["skill_can_fire_arrows"] = { skillFlag = "arrow", diff --git a/src/Data/Skills/other.lua b/src/Data/Skills/other.lua index 5d51283bef..ca404092af 100644 --- a/src/Data/Skills/other.lua +++ b/src/Data/Skills/other.lua @@ -10119,6 +10119,15 @@ skills["LeylinesPlayer"] = { baseEffectiveness = 106, incrementalEffectiveness = 0.27000001072884, statDescriptionScope = "leylines", + statMap = { + ["skill_leylines_ward_degeneration_per_minute"] = { + mod("WardDegen", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff" }, { type = "Condition", var = "OnLeyline" }), + div = 60, + }, + ["skill_leylines_spell_damage_+%_final"] = { + mod("Damage", "MORE", nil, ModFlag.Spell, 0, { type = "GlobalEffect", effectType = "Buff" }, { type = "Condition", var = "OnLeyline" }), + }, + }, baseFlags = { }, constantStats = { @@ -12590,6 +12599,19 @@ skills["SupportOlrothsHubrisPlayer"] = { label = "Olroth's Hubris", incrementalEffectiveness = 0.054999999701977, statDescriptionScope = "gem_stat_descriptions", + statMap = { + ["base_ward_cost_+_%_of_maximum_ward"] = { + mod("WardCostBase", "BASE", nil, 0, 0, { type = "PercentStat", stat = "Ward", percent = 1 }), + }, + ["added_physical_damage_%_ward_cost"] = { + mod("PhysicalMin", "BASE", nil, 0, 0, { type = "PercentStat", stat = "WardCost", percent = 1 }), + mod("PhysicalMax", "BASE", nil, 0, 0, { type = "PercentStat", stat = "WardCost", percent = 1 }), + }, + ["added_cold_damage_%_ward_cost"] = { + mod("ColdMin", "BASE", nil, 0, 0, { type = "PercentStat", stat = "WardCost", percent = 1 }), + mod("ColdMax", "BASE", nil, 0, 0, { type = "PercentStat", stat = "WardCost", percent = 1 }), + }, + }, baseFlags = { }, constantStats = { @@ -14889,6 +14911,15 @@ skills["SupportRunicInfusionPlayer"] = { label = "Runic Infusion", incrementalEffectiveness = 0.054999999701977, statDescriptionScope = "gem_stat_descriptions", + statMap = { + ["base_ward_cost_+_%_of_maximum_ward"] = { + mod("WardCostBase", "BASE", nil, 0, 0, { type = "PercentStat", stat = "Ward", percent = 1 }), + }, + ["added_physical_damage_%_ward_cost"] = { + mod("PhysicalMin", "BASE", nil, 0, 0, { type = "PercentStat", stat = "WardCost", percent = 1 }), + mod("PhysicalMax", "BASE", nil, 0, 0, { type = "PercentStat", stat = "WardCost", percent = 1 }), + }, + }, baseFlags = { }, constantStats = { @@ -15540,6 +15571,11 @@ skills["SupportScouringFlamePlayer"] = { label = "Scouring Flame", incrementalEffectiveness = 0.054999999701977, statDescriptionScope = "gem_stat_descriptions", + statMap = { + ["support_scouring_flame_ignite_effect_+%_final"] = { + mod("AilmentMagnitude", "MORE", nil, 0, KeywordFlag.Ignite), + }, + }, baseFlags = { }, constantStats = { diff --git a/src/Export/Scripts/costs.lua b/src/Export/Scripts/costs.lua index a0f926ac50..8be9e6f789 100644 --- a/src/Export/Scripts/costs.lua +++ b/src/Export/Scripts/costs.lua @@ -10,10 +10,14 @@ out:write('return {\n') local costSize = 0 for c in dat("CostTypes"):Rows() do costSize = costSize + 1 + local resourceString = tostring(c.ResourceString) + if tostring(c.Resource):match("^Ward") then + resourceString = resourceString:gsub("Ward", "Runic Ward") + end out:write('\t[', c._rowIndex, '] = {\n') out:write('\t\tResource = "', tostring(c.Resource), '",\n') out:write('\t\tStat = ', c.Stat and ('"'..tostring(c.Stat.Id)..'"') or tostring(c.Stat), ',\n') - out:write('\t\tResourceString = "', tostring(c.ResourceString), '",\n') + out:write('\t\tResourceString = "', resourceString, '",\n') out:write('\t\tDivisor = ', c.Divisor, ',\n') out:write('\t},\n') end diff --git a/src/Export/Skills/other.txt b/src/Export/Skills/other.txt index d3b725d0bd..a603a94e0e 100644 --- a/src/Export/Skills/other.txt +++ b/src/Export/Skills/other.txt @@ -646,7 +646,15 @@ statMap = { #skill LeylinesPlayer #set LeylinesPlayer -#flags +statMap = { + ["skill_leylines_ward_degeneration_per_minute"] = { + mod("WardDegen", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff" }, { type = "Condition", var = "OnLeyline" }), + div = 60, + }, + ["skill_leylines_spell_damage_+%_final"] = { + mod("Damage", "MORE", nil, ModFlag.Spell, 0, { type = "GlobalEffect", effectType = "Buff" }, { type = "Condition", var = "OnLeyline" }), + }, +}, #mods #skillEnd @@ -828,6 +836,20 @@ statMap = { #skill SupportOlrothsHubrisPlayer #set SupportOlrothsHubrisPlayer +#flags +statMap = { + ["base_ward_cost_+_%_of_maximum_ward"] = { + mod("WardCostBase", "BASE", nil, 0, 0, { type = "PercentStat", stat = "Ward", percent = 1 }), + }, + ["added_physical_damage_%_ward_cost"] = { + mod("PhysicalMin", "BASE", nil, 0, 0, { type = "PercentStat", stat = "WardCost", percent = 1 }), + mod("PhysicalMax", "BASE", nil, 0, 0, { type = "PercentStat", stat = "WardCost", percent = 1 }), + }, + ["added_cold_damage_%_ward_cost"] = { + mod("ColdMin", "BASE", nil, 0, 0, { type = "PercentStat", stat = "WardCost", percent = 1 }), + mod("ColdMax", "BASE", nil, 0, 0, { type = "PercentStat", stat = "WardCost", percent = 1 }), + }, +}, #mods #skillEnd @@ -998,6 +1020,16 @@ statMap = { #skill SupportRunicInfusionPlayer #set SupportRunicInfusionPlayer +#flags +statMap = { + ["base_ward_cost_+_%_of_maximum_ward"] = { + mod("WardCostBase", "BASE", nil, 0, 0, { type = "PercentStat", stat = "Ward", percent = 1 }), + }, + ["added_physical_damage_%_ward_cost"] = { + mod("PhysicalMin", "BASE", nil, 0, 0, { type = "PercentStat", stat = "WardCost", percent = 1 }), + mod("PhysicalMax", "BASE", nil, 0, 0, { type = "PercentStat", stat = "WardCost", percent = 1 }), + }, +}, #mods #skillEnd @@ -1048,6 +1080,12 @@ statMap = { #skill SupportScouringFlamePlayer #set SupportScouringFlamePlayer +#flags +statMap = { + ["support_scouring_flame_ignite_effect_+%_final"] = { + mod("AilmentMagnitude", "MORE", nil, 0, KeywordFlag.Ignite), + }, +}, #mods #skillEnd diff --git a/src/Modules/Build.lua b/src/Modules/Build.lua index 52137ddeea..dabe81dc5c 100644 --- a/src/Modules/Build.lua +++ b/src/Modules/Build.lua @@ -2479,7 +2479,7 @@ function buildMode:AddDisplayStatList(statList, actor, actorName) end end end - for pool, warningFlag in pairs({["Life"] = "LifeCostWarningList", ["Mana"] = "ManaCostWarningList", ["Rage"] = "RageCostWarningList", ["Energy Shield"] = "ESCostWarningList"}) do + for pool, warningFlag in pairs({["Life"] = "LifeCostWarningList", ["Mana"] = "ManaCostWarningList", ["Runic Ward"] = "WardCostWarningList", ["Rage"] = "RageCostWarningList", ["Energy Shield"] = "ESCostWarningList"}) do if actor.output[warningFlag] then local line = "You do not have enough "..(actor.output.EnergyShieldProtectsMana and pool == "Mana" and "Energy Shield and Mana" or pool).." to use: " for _, skill in ipairs(actor.output[warningFlag]) do diff --git a/src/Modules/BuildDisplayStats.lua b/src/Modules/BuildDisplayStats.lua index 2ddafb8d74..1547d24501 100644 --- a/src/Modules/BuildDisplayStats.lua +++ b/src/Modules/BuildDisplayStats.lua @@ -121,6 +121,9 @@ local displayStats = { { stat = "ESCost", label = "Energy Shield Cost", fmt = "d", color = colorCodes.ES, pool = "EnergyShield", compPercent = true, lowerIsBetter = true, condFunc = function(v,o) return o.ESHasCost end }, { stat = "ESPerSecondCost", label = "ES Cost per second", fmt = ".2f", color = colorCodes.ES, pool = "EnergyShield", compPercent = true, lowerIsBetter = true, condFunc = function(v,o) return o.ESPerSecondHasCost end }, { stat = "ESPercentPerSecondCost", label = "ES Cost per second", fmt = ".2f%%", color = colorCodes.ES, compPercent = true, lowerIsBetter = true, condFunc = function(v,o) return o.ESPercentPerSecondHasCost end }, + { stat = "WardCost", label = "Runic Ward Cost", fmt = "d", color = colorCodes.WARD, pool = "Ward", compPercent = true, lowerIsBetter = true, condFunc = function(v,o) return o.WardHasCost end }, + { stat = "WardPercentCost", label = "Runic Ward Cost", fmt = "d%%", color = colorCodes.WARD, compPercent = true, lowerIsBetter = true, condFunc = function(v,o) return o.WardPercentHasCost end }, + { stat = "WardPerSecondCost", label = "Runic Ward Cost / s", fmt = ".2f", color = colorCodes.WARD, pool = "Ward", compPercent = true, lowerIsBetter = true, condFunc = function(v,o) return o.WardPerSecondHasCost end }, { stat = "RageCost", label = "Rage Cost", fmt = "d", color = colorCodes.RAGE, pool = "Rage", compPercent = true, lowerIsBetter = true, condFunc = function(v,o) return o.RageHasCost end }, { stat = "RagePerSecondCost", label = "Rage Cost per second", fmt = ".2f", color = colorCodes.RAGE, pool = "Rage", compPercent = true, lowerIsBetter = true, condFunc = function(v,o) return o.RagePerSecondHasCost end }, { stat = "SoulCost", label = "Soul Cost", fmt = "d", color = colorCodes.RAGE, pool = "Soul", compPercent = true, lowerIsBetter = true, condFunc = function(v,o) return o.SoulHasCost end }, @@ -150,6 +153,10 @@ local displayStats = { { stat = "Darkness", label = "Total Darkness", fmt = "d", color = colorCodes.CHAOS}, { stat = "ReservedDarkness", label = "Reserved Darkness", fmt ="d", color = colorCodes.CHAOS}, { }, + { stat = "Spirit", label = "Total Spirit", fmt = "d", color = colorCodes.SPIRIT, compPercent = true, ignoredSections = defenseIgnoredSections, modNames = { "Spirit" } }, + { stat = "SpiritUnreserved", label = "Unreserved Spirit", fmt = "d", color = colorCodes.SPIRIT, condFunc = function(v, o) return v < o.Spirit end, compPercent = true, warnFunc = function(v) return v < 0 and "Your unreserved Spirit is negative" end, breakdown = "SpiritReserved" }, + { stat = "SpiritUnreservedPercent", label = "Unreserved Spirit", fmt = "d%%", color = colorCodes.SPIRIT, condFunc = function(v,o) return v < 100 end, breakdown = "SpiritReserved" }, + { }, { stat = "Life", label = "Total Life", fmt = "d", color = colorCodes.LIFE, compPercent = true, modNames = { "Life" }, ignoredSections = { "Base from Gear", "Inc. from Tree" } }, { stat = "Spec:LifeInc", label = "%Inc Life", fmt = "d%%", color = colorCodes.LIFE, condFunc = function(v,o) return v > 0 and o.Life > 1 end }, { stat = "LifeUnreserved", label = "Unreserved Life", fmt = "d", color = colorCodes.LIFE, condFunc = function(v,o) return v < o.Life end, compPercent = true, warnFunc = function(v) return v <= 0 and "Your unreserved Life is below 1" end, breakdown = "LifeReserved", modNames = { "" } }, @@ -169,10 +176,6 @@ local displayStats = { { stat = "ManaLeechGainRate", label = "Mana Leech/On Hit Rate", fmt = ".1f", color = colorCodes.MANA, compPercent = true, breakdown = "ManaLeech" }, { stat = "ManaLeechGainPerHit", label = "Mana Leech/Gain per Hit", fmt = ".1f", color = colorCodes.MANA, compPercent = true }, { }, - { stat = "Spirit", label = "Total Spirit", fmt = "d", color = colorCodes.SPIRIT, compPercent = true, ignoredSections = defenseIgnoredSections, modNames = { "Spirit" } }, - { stat = "SpiritUnreserved", label = "Unreserved Spirit", fmt = "d", color = colorCodes.SPIRIT, condFunc = function(v, o) return v < o.Spirit end, compPercent = true, warnFunc = function(v) return v < 0 and "Your unreserved Spirit is negative" end, breakdown = "SpiritReserved" }, - { stat = "SpiritUnreservedPercent", label = "Unreserved Spirit", fmt = "d%%", color = colorCodes.SPIRIT, condFunc = function(v,o) return v < 100 end, breakdown = "SpiritReserved" }, - { }, { stat = "EnergyShield", label = "Energy Shield", fmt = "d", color = colorCodes.ES, compPercent = true, modNames = { "EnergyShield", "Defences" }, ignoredSections = defenseIgnoredSections }, { stat = "EnergyShieldRecoveryCap", label = "Recoverable ES", color = colorCodes.ES, fmt = "d", condFunc = function(v,o) return o.CappingES end }, { stat = "Spec:EnergyShieldInc", label = "%Inc ES from Tree", color = colorCodes.ES, fmt = "d%%" }, @@ -181,6 +184,10 @@ local displayStats = { { stat = "EnergyShieldLeechGainRate", label = "ES Leech/On Hit Rate", color = colorCodes.ES, fmt = ".1f", compPercent = true, breakdown = "EnergyShieldLeech" }, { stat = "EnergyShieldLeechGainPerHit", label = "ES Leech/Gain per Hit", color = colorCodes.ES, fmt = ".1f", compPercent = true }, { }, + { stat = "Ward", label = "Runic Ward", fmt = "d", color = colorCodes.WARD, compPercent = true }, + { stat = "WardRegenRecovery", label = "Runic Ward Regen", fmt = ".1f", color = colorCodes.WARD, condFunc = function(v,o) return o.WardRecovery <= 0 and o.WardRegenRecovery ~= 0 end }, + { stat = "WardRegenRecovery", label = "Runic Ward Recovery", fmt = ".1f", color = colorCodes.WARD, condFunc = function(v,o) return o.WardRecovery > 0 and o.WardRegenRecovery ~= 0 end }, + { }, { stat = "Rage", label = "Rage", fmt = "d", color = colorCodes.RAGE, compPercent = true }, { stat = "RageRegenRecovery", label = "Rage Regen", fmt = ".1f", color = colorCodes.RAGE, compPercent = true }, { }, @@ -188,6 +195,7 @@ local displayStats = { { stat = "TotalNetRegen", label = "Total Net Recovery", fmt = "+.1f" }, { stat = "NetLifeRegen", label = "Net Life Recovery", fmt = "+.1f", color = colorCodes.LIFE }, { stat = "NetManaRegen", label = "Net Mana Recovery", fmt = "+.1f", color = colorCodes.MANA }, + { stat = "NetWardRegen", label = "Net Runic Ward Recovery", fmt = "+.1f", color = colorCodes.WARD }, { stat = "NetEnergyShieldRegen", label = "Net ES Recovery", fmt = "+.1f", color = colorCodes.ES }, { }, { stat = "Evasion", label = "Evasion rating", fmt = "d", color = colorCodes.EVASION, compPercent = true, modNames = { "Evasion", "ArmourAndEvasion", "Defences" }, ignoredSections = defenseIgnoredSections }, diff --git a/src/Modules/CalcActiveSkill.lua b/src/Modules/CalcActiveSkill.lua index cd118f5dcd..d432524c38 100644 --- a/src/Modules/CalcActiveSkill.lua +++ b/src/Modules/CalcActiveSkill.lua @@ -701,7 +701,7 @@ function calcs.buildActiveSkillModList(env, activeSkill) end -- The damage fixup stat applies x% less base Attack Damage and x% more base Attack Speed as confirmed by Openarl Jan 4th 2024 - -- Implemented in this manner as the stat exists on the minion not the skills + -- Implemented in this manner as the stat exists on the minion not the skills if activeSkill.actor and activeSkill.actor.minionData then if activeSkill.actor.minionData.damageFixup then skillModList:NewMod("Damage", "MORE", -100 * activeSkill.actor.minionData.damageFixup, "Damage Fixup", ModFlag.Attack) diff --git a/src/Modules/CalcDefence.lua b/src/Modules/CalcDefence.lua index a958d433a6..995cc322bd 100644 --- a/src/Modules/CalcDefence.lua +++ b/src/Modules/CalcDefence.lua @@ -521,7 +521,7 @@ function calcs.reducePoolsByDamage(poolTable, damageTable, actor) end local ward = poolTbl.Ward or output.Ward or 0 - local restoreWard = modDB:Flag(nil, "WardNotBreak") and ward or 0 + local wardApplies = modDB:Sum("BASE", nil, "WardBypass") == 0 local energyShield = poolTbl.EnergyShield or output.EnergyShieldRecoveryCap local mana = poolTbl.Mana or output.ManaUnreserved or 0 @@ -580,12 +580,6 @@ function calcs.reducePoolsByDamage(poolTable, damageTable, actor) damageRemainder = damageRemainder - tempDamage resourcesLostToTypeDamage[damageType].sharedGuard = tempDamage >= 1 and tempDamage or nil end - if ward > 0 then - local tempDamage = m_min(damageRemainder * (1 - (modDB:Sum("BASE", nil, "WardBypass") or 0) / 100), ward) - ward = ward - tempDamage - damageRemainder = damageRemainder - tempDamage - resourcesLostToTypeDamage[damageType].ward = tempDamage >= 1 and tempDamage or nil - end damageRemaindersBeforeES[damageType] = damageRemainder > 0 and damageRemainder or nil end end @@ -662,23 +656,35 @@ function calcs.reducePoolsByDamage(poolTable, damageTable, actor) end end if life > 0 then - local tempDamage = m_min(damageRemainder, life) + local tempDamage = m_min(damageRemainder, life - 1) life = life - tempDamage damageRemainder = damageRemainder - tempDamage resourcesLostToTypeDamage[damageType].life = (resourcesLostToTypeDamage[damageType].life or 0) + (tempDamage > 0 and tempDamage or 0) + if ward > 0 and wardApplies then + local tempDamage = m_min(damageRemainder, ward) + ward = ward - tempDamage + damageRemainder = damageRemainder - tempDamage + resourcesLostToTypeDamage[damageType].runicWard = tempDamage >= 1 and tempDamage or nil + end + if damageRemainder > 0 then + local tempDamage = m_min(damageRemainder, life) + life = life - tempDamage + damageRemainder = damageRemainder - tempDamage + resourcesLostToTypeDamage[damageType].life = (resourcesLostToTypeDamage[damageType].life or 0) + (tempDamage > 0 and tempDamage or 0) + end end overkillDamage = overkillDamage + damageRemainder resourcesLostToTypeDamage[damageType].overkill = damageRemainder >= 1 and damageRemainder or nil end end local hitPoolRemaining = calcLifeHitPoolWithLossPrevention(life, output.Life, output.preventedLifeLoss, lifeLossBelowHalfPrevented) + - (MoMPoolRemaining ~= m_huge and MoMPoolRemaining or 0) + (esPoolRemaining ~= m_huge and esPoolRemaining or 0) + (MoMPoolRemaining ~= m_huge and MoMPoolRemaining or 0) + (esPoolRemaining ~= m_huge and esPoolRemaining or 0) + (wardApplies and ward or 0) return { AlliesTakenBeforeYou = alliesTakenBeforeYou, Aegis = aegis, Guard = guard, - Ward = restoreWard, + Ward = ward, EnergyShield = energyShield, Mana = mana, Life = life, @@ -740,9 +746,6 @@ local function incomingDamageBreakdown(breakdownTable, poolsRemaining, output) if output.sharedGuardAbsorb and output.sharedGuardAbsorb > 0 then t_insert(breakdownTable, s_format("\t%d "..colorCodes.SCOURGE.."Shared Guard charge ^7(%d remaining)", output.sharedGuardAbsorb - poolsRemaining.Guard.shared, poolsRemaining.Guard.shared)) end - if output.Ward and output.Ward > 0 then - t_insert(breakdownTable, s_format("\t%d "..colorCodes.WARD.."Ward", output.Ward)) - end if output.EnergyShieldRecoveryCap ~= poolsRemaining.EnergyShield and output.EnergyShieldRecoveryCap and output.EnergyShieldRecoveryCap > 0 then t_insert(breakdownTable, s_format("\t%d "..colorCodes.ES.."Energy Shield ^7(%d remaining)", output.EnergyShieldRecoveryCap - poolsRemaining.EnergyShield, poolsRemaining.EnergyShield)) end @@ -756,6 +759,9 @@ local function incomingDamageBreakdown(breakdownTable, poolsRemaining, output) t_insert(breakdownTable, s_format("\t%d "..colorCodes.LIFE.."Life ^7Loss Prevented", poolsRemaining.LifeLossLostOverTime + poolsRemaining.LifeBelowHalfLossLostOverTime)) end t_insert(breakdownTable, s_format("\t%d "..colorCodes.LIFE.."Life ^7(%d remaining)", output.LifeRecoverable - poolsRemaining.Life, poolsRemaining.Life)) + if output.Ward and output.Ward > 0 then + t_insert(breakdownTable, s_format("\t%d "..colorCodes.WARD.."Runic Ward ^7(%d remaining)", output.Ward - poolsRemaining.Ward, poolsRemaining.Ward)) + end if poolsRemaining.OverkillDamage >= 1 then t_insert(breakdownTable, s_format("\t%d "..colorCodes.NEGATIVE.."Overkill damage", poolsRemaining.OverkillDamage)) end @@ -1166,7 +1172,6 @@ function calcs.defence(env, actor) do -- Pre-calculate Life/Mana/Spirit for mods such as Beidat's hand calcs.doActorLifeManaSpirit(actor, true) - local ward = 0 local energyShield = 0 local armour = 0 local evasion = 0 @@ -1189,7 +1194,6 @@ function calcs.defence(env, actor) if modDB:Flag(nil, "EnergyShieldToWard") then local inc = modDB:Sum("INC", slotCfg, "Ward", "Defences", "EnergyShield") local more = modDB:More(slotCfg, "Ward", "Defences") - ward = ward + wardBase * (1 + inc / 100) * more gearWard = gearWard + wardBase if breakdown then t_insert(breakdown["Ward"].slots, { @@ -1202,7 +1206,6 @@ function calcs.defence(env, actor) }) end else - ward = ward + wardBase * calcLib.mod(modDB, slotCfg, "Ward", "Defences") gearWard = gearWard + wardBase if breakdown then breakdown.slot(slot, nil, slotCfg, wardBase, nil, "Ward", "Defences") @@ -1277,7 +1280,6 @@ function calcs.defence(env, actor) if modDB:Flag(nil, "EnergyShieldToWard") then local inc = modDB:Sum("INC", nil, "Ward", "Defences", "EnergyShield") local more = modDB:More(nil, "Ward", "Defences") - ward = ward + wardBase * (1 + inc / 100) * more if breakdown then t_insert(breakdown["Ward"].slots, { base = wardBase, @@ -1289,7 +1291,6 @@ function calcs.defence(env, actor) }) end else - ward = ward + wardBase * calcLib.mod(modDB, nil, "Ward", "Defences") if breakdown then breakdown.slot("Global", nil, nil, wardBase, nil, "Ward", "Defences") end @@ -1329,6 +1330,7 @@ function calcs.defence(env, actor) { name = "EnergyShield", basePerSlot = {}, globalBase = 0, conversionRate = { }, mods = { "EnergyShield", "Defences" }, modsTotal = { "EnergyShieldTotal" }, defence = true }, { name = "Life", basePerSlot = {}, globalBase = 0, conversionRate = { }, mods = { "Life" }, modsTotal = { "LifeTotal" }, }, { name = "Mana", basePerSlot = {}, globalBase = 0, conversionRate = { }, mods = { "Mana" }, modsTotal = { "ManaTotal" }, }, + { name = "Ward", basePerSlot = {}, globalBase = 0, conversionRate = { }, mods = { "Ward", "Defences" }, modsInc = modDB:Flag(nil, "EnergyShieldToWard") and { "EnergyShield" }, modsTotal = { "WardTotal" }, defence = true }, } for _, source in ipairs(resourceList) do output[source.name] = (output[source.name] or 0) @@ -1348,6 +1350,9 @@ function calcs.defence(env, actor) for _, slot in pairs({"Helmet","Gloves","Boots","Body Armour","Weapon 2","Weapon 3"}) do local item = actor.itemList[slot] source.basePerSlot[slot] = item and item.armourData and item:GetArmourDataValue(source.name, actor.level) or 0 + if source.name == "Ward" and slot == "Body Armour" and modDB:Flag(nil, "DoubleBodyArmourDefence") then + source.basePerSlot[slot] = source.basePerSlot[slot] * 2 + end end source.totalBase = modDB:Sum("BASE", nil, unpack(source.modsTotal)) end @@ -1409,9 +1414,13 @@ function calcs.defence(env, actor) for _, res in ipairs(resourceList) do if res.defence then for _, slot in pairs({"Helmet","Gloves","Boots","Body Armour","Weapon 2","Weapon 3"}) do - output[res.name] = output[res.name] + res.basePerSlot[slot] * calcLib.mod(modDB, { slotName = slot }, unpack(res.mods)) + local inc, more = calcLib.mods(modDB, { slotName = slot }, unpack(res.mods)) + inc = inc + (res.modsInc and modDB:Sum("INC", { slotName = slot }, unpack(res.modsInc)) / 100 or 0) + output[res.name] = output[res.name] + res.basePerSlot[slot] * inc * more end - output[res.name] = output[res.name] + res.globalBase * calcLib.mod(modDB, nil, unpack(res.mods)) + res.totalBase + local inc, more = calcLib.mods(modDB, nil, unpack(res.mods)) + inc = inc + (res.modsInc and modDB:Sum("INC", nil, unpack(res.modsInc)) / 100 or 0) + output[res.name] = output[res.name] + res.globalBase * inc * more + res.totalBase else modDB:NewMod("Extra"..res.name, "BASE", res.globalBase, "Conversion") modDB:NewMod(res.name.."Total", "BASE", res.totalBase, "Conversion") @@ -1433,7 +1442,7 @@ function calcs.defence(env, actor) output.SpellEvasion = m_max(round(output.Evasion * calcLib.mod(modDB, nil, "SpellEvasion")), 0) output.SpellProjectileEvasion = m_max(round(output.Evasion * calcLib.mod(modDB, nil, "SpellProjectileEvasion")), 0) output.LowestOfArmourAndEvasion = m_min(output.Armour, output.Evasion) - output.Ward = m_max(m_floor(ward), 0) + output.Ward = m_max(round(output.Ward), 0) output["Gear:Ward"] = gearWard output["Gear:EnergyShield"] = gearEnergyShield output["Gear:Armour"] = gearArmour @@ -1670,7 +1679,7 @@ function calcs.defence(env, actor) end -- Regeneration - local resources = {"Mana", "Life", "Energy Shield", "Rage"} + local resources = {"Mana", "Life", "Energy Shield", "Rage", "Ward"} for i, resourceName in ipairs(resources) do local resource = resourceName:gsub(" ", "") local pool = output[resource] or 0 @@ -1882,18 +1891,6 @@ function calcs.defence(env, actor) end end - -- Ward recharge - output.WardRechargeDelay = data.misc.WardRechargeDelay / (1 + modDB:Sum("INC", nil, "WardRechargeFaster") / 100) - if breakdown then - if output.WardRechargeDelay ~= data.misc.WardRechargeDelay then - breakdown.WardRechargeDelay = { - s_format("%.2fs ^8(base)", data.misc.WardRechargeDelay), - s_format("/ %.2f ^8(faster start)", 1 + modDB:Sum("INC", nil, "WardRechargeFaster") / 100), - s_format("= %.2fs", output.WardRechargeDelay) - } - end - end - -- Damage Reduction output.DamageReductionMax = modDB:Max(nil, "DamageReductionMax") or data.misc.DamageReductionCap modDB:NewMod("ArmourAppliesToPhysicalDamageTaken", "BASE", 100) @@ -1944,6 +1941,8 @@ function calcs.defence(env, actor) output.ManaOnBlock = modDB:Sum("BASE", nil, "ManaOnBlock") + output.WardOnBlock = modDB:Sum("BASE", nil, "WardOnBlock") + output.EnergyShieldOnBlock = modDB:Sum("BASE", nil, "EnergyShieldOnBlock") output.EnergyShieldOnSpellBlock = modDB:Sum("BASE", nil, "EnergyShieldOnSpellBlock") output.EnergyShieldOnSuppress = modDB:Sum("BASE", nil, "EnergyShieldOnSuppress") @@ -3013,6 +3012,7 @@ function calcs.buildDefenceEstimations(env, actor) end --total pool + local ward = modDB:Sum("BASE", nil, "WardBypass") == 0 and output.Ward or 0 for _, damageType in ipairs(dmgTypeList) do output[damageType.."TotalPool"] = output[damageType.."ManaEffectiveLife"] output[damageType.."TotalHitPool"] = output[damageType.."MoMHitPool"] @@ -3031,6 +3031,8 @@ function calcs.buildDefenceEstimations(env, actor) output[damageType.."TotalHitPool"] = output[damageType.."TotalHitPool"] + output.EnergyShieldRecoveryCap / chaosESMultiplier end end + local poolBeforeWard = output[damageType.."TotalPool"] + output[damageType.."TotalPool"] = poolBeforeWard + ward if breakdown then breakdown[damageType.."TotalPool"] = { s_format("Life: %d", output.LifeRecoverable) @@ -3040,9 +3042,12 @@ function calcs.buildDefenceEstimations(env, actor) end if modDB:Flag(nil, "EternalLife") then t_insert(breakdown[damageType.."TotalPool"], s_format("Energy Shield: %d%s", output.EnergyShieldRecoveryCap / chaosESMultiplier, damageType == "Chaos" and "^8 (ES takes double damage from chaos)" and not modDB:Flag(nil, "ChaosNotDoubleESDamage") or "")) - t_insert(breakdown[damageType.."TotalPool"], s_format("Life change prevented by Eternal Life: %d", output[damageType.."TotalPool"] - output[damageType.."ManaEffectiveLife"] - output.EnergyShieldRecoveryCap / chaosESMultiplier)) + t_insert(breakdown[damageType.."TotalPool"], s_format("Life change prevented by Eternal Life: %d", poolBeforeWard - output[damageType.."ManaEffectiveLife"] - output.EnergyShieldRecoveryCap / chaosESMultiplier)) elseif esBypass < 1 then - t_insert(breakdown[damageType.."TotalPool"], s_format("Non-bypassed Energy Shield: %d", output[damageType.."TotalPool"] - output[damageType.."ManaEffectiveLife"])) + t_insert(breakdown[damageType.."TotalPool"], s_format("Non-bypassed Energy Shield: %d", poolBeforeWard - output[damageType.."ManaEffectiveLife"])) + end + if ward > 0 then + t_insert(breakdown[damageType.."TotalPool"], s_format("Runic Ward: %d", ward)) end t_insert(breakdown[damageType.."TotalPool"], s_format("Total Pool: %d", output[damageType.."TotalPool"])) end @@ -3060,15 +3065,13 @@ function calcs.buildDefenceEstimations(env, actor) end if numHits == 0 then return m_huge - elseif modDB:Flag(nil, "WardNotBreak") and output.Ward > 0 and numHits < output.Ward then - return m_huge else numHits = 0 end local ward = output.Ward or 0 - -- don't apply non-perma ward for speed up calcs as it won't zero it correctly per hit - if (not modDB:Flag(nil, "WardNotBreak")) and DamageIn["cycles"] > 1 then + -- Don't apply Runic Ward when batching hits, as it only protects the first hit. + if DamageIn["cycles"] > 1 then ward = 0 end local aegis = { } @@ -3123,8 +3126,6 @@ function calcs.buildDefenceEstimations(env, actor) DamageIn["TrackRecoupable"] = false DamageIn["TrackLifeLossOverTime"] = false end - DamageIn["WardBypass"] = DamageIn["WardBypass"] or modDB:Sum("BASE", nil, "WardBypass") or 0 - local VaalArcticArmourHitsLeft = output.VaalArcticArmourLife if DamageIn["cycles"] > 1 then VaalArcticArmourHitsLeft = 0 @@ -3150,6 +3151,7 @@ function calcs.buildDefenceEstimations(env, actor) poolTable.Life = m_min(poolTable.Life + DamageIn.LifeWhenHit * (gainMult - 1), gainMult * (output.LifeRecoverable or 0)) poolTable.Mana = m_min(poolTable.Mana + DamageIn.ManaWhenHit * (gainMult - 1), gainMult * (output.ManaUnreserved or 0)) poolTable.EnergyShield = m_min(poolTable.EnergyShield + DamageIn.EnergyShieldWhenHit * (gainMult - 1), gainMult * output.EnergyShieldRecoveryCap) + poolTable.Ward = m_min(poolTable.Ward + DamageIn.WardWhenHit * (gainMult - 1), gainMult * (output.Ward or 0)) end poolTable = calcs.reducePoolsByDamage(poolTable, Damage, actor) @@ -3161,6 +3163,7 @@ function calcs.buildDefenceEstimations(env, actor) poolTable.Life = m_min(poolTable.Life + DamageIn.LifeWhenHit, output.LifeRecoverable or 0) poolTable.Mana = m_min(poolTable.Mana + DamageIn.ManaWhenHit, output.ManaUnreserved or 0) poolTable.EnergyShield = m_min(poolTable.EnergyShield + DamageIn.EnergyShieldWhenHit, output.EnergyShieldRecoveryCap) + poolTable.Ward = m_min(poolTable.Ward + (DamageIn.WardWhenHit or 0), output.Ward or 0) end iterationMultiplier = 1 -- to speed it up, run recursively but accelerated @@ -3179,6 +3182,7 @@ function calcs.buildDefenceEstimations(env, actor) Damage.LifeWhenHit = DamageIn.LifeWhenHit Damage.ManaWhenHit = DamageIn.ManaWhenHit Damage.EnergyShieldWhenHit = DamageIn.EnergyShieldWhenHit + Damage.WardWhenHit = DamageIn.WardWhenHit end Damage["cycles"] = DamageIn["cycles"] * speedUp Damage["iterations"] = DamageIn["iterations"] @@ -3245,6 +3249,7 @@ function calcs.buildDefenceEstimations(env, actor) DamageIn.LifeWhenHit = output.LifeOnBlock * BlockChance DamageIn.ManaWhenHit = output.ManaOnBlock * BlockChance DamageIn.EnergyShieldWhenHit = output.EnergyShieldOnBlock * BlockChance + DamageIn.WardWhenHit = output.WardOnBlock * BlockChance if damageCategoryConfig == "Spell" or damageCategoryConfig == "SpellProjectile" then DamageIn.EnergyShieldWhenHit = DamageIn.EnergyShieldWhenHit + output.EnergyShieldOnSpellBlock * BlockChance elseif damageCategoryConfig == "Average" then @@ -3276,13 +3281,14 @@ function calcs.buildDefenceEstimations(env, actor) end -- gain when hit (currently just gain on block/suppress) if not env.configInput.DisableEHPGainOnBlock then - if (DamageIn.LifeWhenHit or 0) ~= 0 or (DamageIn.ManaWhenHit or 0) ~= 0 or DamageIn.EnergyShieldWhenHit ~= 0 then + if (DamageIn.LifeWhenHit or 0) ~= 0 or (DamageIn.ManaWhenHit or 0) ~= 0 or DamageIn.EnergyShieldWhenHit ~= 0 or DamageIn.WardWhenHit ~= 0 then DamageIn.GainWhenHit = true end else DamageIn.LifeWhenHit = 0 DamageIn.ManaWhenHit = 0 DamageIn.EnergyShieldWhenHit = 0 + DamageIn.WardWhenHit = 0 end for _, damageType in ipairs(dmgTypeList) do -- Emperor's Vigilance (this needs to fail with divine flesh as it can't override it, hence the check for high bypass) @@ -3618,14 +3624,8 @@ function calcs.buildDefenceEstimations(env, actor) -- fix total pools, as they aren't used anymore for _, damageType in ipairs(dmgTypeList) do -- ward - local wardBypass = modDB:Sum("BASE", nil, "WardBypass") or 0 - if wardBypass > 0 then - local poolProtected = output.Ward / (1 - wardBypass / 100) * (wardBypass / 100) - local sourcePool = output[damageType.."TotalHitPool"] - sourcePool = m_max(sourcePool - poolProtected, 0) + m_min(sourcePool, poolProtected) / (wardBypass / 100) - output[damageType.."TotalHitPool"] = sourcePool - else - output[damageType.."TotalHitPool"] = output[damageType.."TotalHitPool"] + output.Ward or 0 + if modDB:Sum("BASE", nil, "WardBypass") == 0 then + output[damageType.."TotalHitPool"] = output[damageType.."TotalHitPool"] + output.Ward end -- aegis output[damageType.."TotalHitPool"] = output[damageType.."TotalHitPool"] + m_max(m_max(output[damageType.."Aegis"], output["sharedAegis"]), isElemental[damageType] and output[damageType.."AegisDisplay"] or 0) @@ -3917,6 +3917,7 @@ function calcs.buildDefenceEstimations(env, actor) output.NetLifeRegen = output.LifeRegenRecovery output.NetManaRegen = output.ManaRegenRecovery output.NetEnergyShieldRegen = output.EnergyShieldRegenRecovery + output.NetWardRegen = output.WardRegenRecovery local totalLifeDegen = 0 local totalManaDegen = 0 local totalEnergyShieldDegen = 0 @@ -3987,7 +3988,7 @@ function calcs.buildDefenceEstimations(env, actor) output.NetLifeRegen = output.NetLifeRegen - totalLifeDegen output.NetManaRegen = output.NetManaRegen - totalManaDegen output.NetEnergyShieldRegen = output.NetEnergyShieldRegen - totalEnergyShieldDegen - output.TotalNetRegen = output.NetLifeRegen + output.NetManaRegen + output.NetEnergyShieldRegen + output.TotalNetRegen = output.NetLifeRegen + output.NetManaRegen + output.NetEnergyShieldRegen + output.NetWardRegen if breakdown then t_insert(breakdown.NetLifeRegen, s_format("%.1f ^8(total life regen)", output.LifeRegenRecovery)) t_insert(breakdown.NetLifeRegen, s_format("- %.1f ^8(total life degen)", totalLifeDegen)) @@ -3995,6 +3996,7 @@ function calcs.buildDefenceEstimations(env, actor) t_insert(breakdown.NetManaRegen, s_format("%.1f ^8(total mana regen)", output.ManaRegenRecovery)) t_insert(breakdown.NetManaRegen, s_format("- %.1f ^8(total mana degen)", totalManaDegen)) t_insert(breakdown.NetManaRegen, s_format("= %.1f", output.NetManaRegen)) + breakdown.NetWardRegen = { s_format("%.1f ^8(total runic ward regen)", output.WardRegenRecovery) } t_insert(breakdown.NetEnergyShieldRegen, s_format("%.1f ^8(total energy shield regen)", output.EnergyShieldRegenRecovery)) t_insert(breakdown.NetEnergyShieldRegen, s_format("- %.1f ^8(total energy shield degen)", totalEnergyShieldDegen)) t_insert(breakdown.NetEnergyShieldRegen, s_format("= %.1f", output.NetEnergyShieldRegen)) @@ -4002,6 +4004,7 @@ function calcs.buildDefenceEstimations(env, actor) s_format("Net Life Regen: %.1f", output.NetLifeRegen), s_format("+ Net Mana Regen: %.1f", output.NetManaRegen), s_format("+ Net Energy Shield Regen: %.1f", output.NetEnergyShieldRegen), + s_format("+ Net Runic Ward Regen: %.1f", output.NetWardRegen), s_format("= Total Net Regen: %.1f", output.TotalNetRegen) } end @@ -4157,6 +4160,7 @@ function calcs.buildDefenceEstimations(env, actor) else output.ComprehensiveNetLifeRegen = output.LifeRegenRecovery output.ComprehensiveNetManaRegen = output.ManaRegenRecovery + output.ComprehensiveNetWardRegen = output.WardRegenRecovery output.ComprehensiveNetEnergyShieldRegen = output.EnergyShieldRegenRecovery local totalLifeDegen = 0 local totalManaDegen = 0 @@ -4229,7 +4233,7 @@ function calcs.buildDefenceEstimations(env, actor) output.ComprehensiveNetLifeRegen = output.ComprehensiveNetLifeRegen + (output.LifeRecoupRecoveryAvg or 0) - totalLifeDegen - (output.LifeLossLostAvg or 0) output.ComprehensiveNetManaRegen = output.ComprehensiveNetManaRegen + (output.ManaRecoupRecoveryAvg or 0) - totalManaDegen output.ComprehensiveNetEnergyShieldRegen = output.ComprehensiveNetEnergyShieldRegen + (output.EnergyShieldRecoupRecoveryAvg or 0) - totalEnergyShieldDegen - output.ComprehensiveTotalNetRegen = output.ComprehensiveNetLifeRegen + output.ComprehensiveNetManaRegen + output.ComprehensiveNetEnergyShieldRegen + output.ComprehensiveTotalNetRegen = output.ComprehensiveNetLifeRegen + output.ComprehensiveNetManaRegen + output.ComprehensiveNetWardRegen + output.ComprehensiveNetEnergyShieldRegen if breakdown then t_insert(breakdown.ComprehensiveNetLifeRegen, s_format("%.1f ^8(total life regen)", output.LifeRegenRecovery)) if (output.LifeRecoupRecoveryAvg or 0) ~= 0 then @@ -4246,6 +4250,7 @@ function calcs.buildDefenceEstimations(env, actor) end t_insert(breakdown.ComprehensiveNetManaRegen, s_format("- %.1f ^8(total mana degen)", totalManaDegen)) t_insert(breakdown.ComprehensiveNetManaRegen, s_format("= %.1f", output.ComprehensiveNetManaRegen)) + breakdown.ComprehensiveNetWardRegen = { s_format("%.1f ^8(total runic ward regen)", output.WardRegenRecovery) } t_insert(breakdown.ComprehensiveNetEnergyShieldRegen, s_format("%.1f ^8(total energy shield regen)", output.EnergyShieldRegenRecovery)) if (output.EnergyShieldRecoupRecoveryAvg or 0) ~= 0 then t_insert(breakdown.ComprehensiveNetEnergyShieldRegen, s_format("+ %.1f ^8(average energy shield recoup)", (output.EnergyShieldRecoupRecoveryAvg or 0))) @@ -4255,6 +4260,7 @@ function calcs.buildDefenceEstimations(env, actor) breakdown.ComprehensiveTotalNetRegen = { s_format("Net Life Regen: %.1f", output.ComprehensiveNetLifeRegen), s_format("+ Net Mana Regen: %.1f", output.ComprehensiveNetManaRegen), + s_format("+ Net Runic Ward Regen: %.1f", output.ComprehensiveNetWardRegen), s_format("+ Net Energy Shield Regen: %.1f", output.ComprehensiveNetEnergyShieldRegen), s_format("= Total Net Regen: %.1f", output.ComprehensiveTotalNetRegen) } @@ -4335,10 +4341,6 @@ function calcs.buildDefenceEstimations(env, actor) resourcesLostSum = resourcesLostSum + resourcesLost.sharedGuard t_insert(breakdownTable, s_format("\t%d "..colorCodes.SCOURGE.."Shared Guard charge", resourcesLost.sharedGuard)) end - if resourcesLost.ward then - resourcesLostSum = resourcesLostSum + resourcesLost.ward - t_insert(breakdownTable, s_format("\t%d "..colorCodes.WARD.."Ward", resourcesLost.ward)) - end if resourcesLost.energyShield then resourcesLostSum = resourcesLostSum + resourcesLost.energyShield t_insert(breakdownTable, s_format("\t%d "..colorCodes.ES.."Energy Shield%s", resourcesLost.energyShield, damageType == "Chaos" and "^8 (ES takes double damage from chaos)" and not modDB:Flag(nil, "ChaosNotDoubleESDamage") or "")) @@ -4358,6 +4360,10 @@ function calcs.buildDefenceEstimations(env, actor) resourcesLostSum = resourcesLostSum + resourcesLost.life t_insert(breakdownTable, s_format("\t%d "..colorCodes.LIFE.."Life", resourcesLost.life)) end + if resourcesLost.runicWard then + resourcesLostSum = resourcesLostSum + resourcesLost.runicWard + t_insert(breakdownTable, s_format("\t%d "..colorCodes.WARD.."Runic Ward", resourcesLost.runicWard)) + end if resourcesLost.overkill then resourcesLostSum = resourcesLostSum + resourcesLost.overkill t_insert(breakdownTable, s_format("\t%d "..colorCodes.NEGATIVE.."Overkill damage", resourcesLost.overkill)) diff --git a/src/Modules/CalcOffence.lua b/src/Modules/CalcOffence.lua index 1561b2d24e..d2bd0e5337 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -108,7 +108,7 @@ local function calcDamage(activeSkill, output, cfg, breakdown, damageType, typeF local skillModList = activeSkill.skillModList typeFlags = bor(typeFlags, dmgTypeFlags.flags[damageType]) - + local conversionTable = activeSkill.conversionTable local addMin, addMax = 0, 0 @@ -146,7 +146,7 @@ local function calcDamage(activeSkill, output, cfg, breakdown, damageType, typeF convDst = convDst and conversionTable[damageType][convDst] > 0 and s_format("%d%% to %s", conversionTable[damageType][convDst] * 100, convDst), }) end - + return round(summedMin * inc * more * moreMinDamage + addMin), round(summedMax * inc * more * moreMaxDamage + addMax) end @@ -304,7 +304,7 @@ local function calcCrossbowReloadTime(weaponData, boltSkill) return baseReloadTime / reloadTimeMulti end -- Calculate stats from parent Ammo skill that are not available on children, such as mana cost and reload speed ----@param actor table +---@param actor table ---@param activeSkill table ---@return table @Table containing cost, boltCount, reloadTime local function calcCrossbowAmmoStats(actor, activeSkill) @@ -409,7 +409,7 @@ function calcs.offence(env, actor, activeSkill) local skillFlags if env.mode == "CALCS" then skillFlags = activeSkill.activeEffect.statSetCalcs.skillFlags - else + else skillFlags = activeSkill.activeEffect.statSet.skillFlags end local skillCfg = activeSkill.skillCfg @@ -576,7 +576,7 @@ function calcs.offence(env, actor, activeSkill) func(activeSkill, output, breakdown) end end - + local function modHasSkillType(mod, skillType) for _, tag in ipairs(mod) do if tag.type == "SkillType" then @@ -991,7 +991,7 @@ function calcs.offence(env, actor, activeSkill) else local additionalProjectiles = (skillModList:Sum("BASE", skillCfg, "ProjectileCount") + 2 * skillModList:Sum("BASE", skillCfg, "TwoAdditionalProjectilesChance") / 100 + skillModList:Sum("BASE", skillCfg, "SurpassingProjectileChance") / 100 - 1) * skillModList:More(skillCfg, "ProjectileCount") if additionalProjectiles > 0 then - local barrageAttackTimePenalty = skillModList:Sum("BASE", skillCfg, "BarrageAttackTimePenalty") + local barrageAttackTimePenalty = skillModList:Sum("BASE", skillCfg, "BarrageAttackTimePenalty") if barrageAttackTimePenalty == 0 then barrageAttackTimePenalty = 100 end -- If not otherwise specified on the skill, each additional projectile adds 100% of attack time skillModList:ReplaceMod("SkillAttackTime", "MORE", barrageAttackTimePenalty * additionalProjectiles, activeSkill.activeEffect.grantedEffect.name .. s_format(": %d%% attack time per add. projectile", barrageAttackTimePenalty) ) skillModList:NewMod("DPS", "MORE", skillModList:Sum("BASE", skillCfg, "ProjectileCount") + 2 * skillModList:Sum("BASE", skillCfg, "TwoAdditionalProjectilesChance") / 100 + skillModList:Sum("BASE", skillCfg, "SurpassingProjectileChance") / 100, "Barrage Repeats") @@ -1149,7 +1149,7 @@ function calcs.offence(env, actor, activeSkill) skillData.boltCount = ammoStats.boltCount skillData.reloadTime = ammoStats.reloadTime end - + if activeSkill.skillTypes[SkillType.Grenade] then local detonateTwice = m_min(skillModList:Sum("BASE", skillCfg, "GrenadeActivateTwice"), 100) modDB:NewMod("DPS", "MORE", detonateTwice, "Grenade Activate Twice") @@ -1684,7 +1684,7 @@ function calcs.offence(env, actor, activeSkill) output.Cooldown = cooldown output.EffectiveCooldown = cooldown - + if breakdown then breakdown.Cooldown = { s_format("%.2fs ^8(base)", skillData.cooldown or 0 + addedCooldown), @@ -1698,9 +1698,9 @@ function calcs.offence(env, actor, activeSkill) unpack(breakdown.Cooldown), } t_insert(breakdown.EffectiveCooldown, s_format("* %.2f ^8(effect of %d%% chance to not consume cooldown)", effectiveCooldownMultiplier, noCooldownChance * 100)) - t_insert(breakdown.EffectiveCooldown, s_format("= %.3fs", output.EffectiveCooldown)) + t_insert(breakdown.EffectiveCooldown, s_format("= %.3fs", output.EffectiveCooldown)) end - + if rounded then t_insert(breakdown.Cooldown, s_format("rounded up to nearest server tick")) end @@ -1739,14 +1739,14 @@ function calcs.offence(env, actor, activeSkill) output.MineLayingSpeed = m_min(output.MineLayingSpeed, data.misc.ServerTickRate) output.MineLayingTime = 1 / output.MineLayingSpeed - + -- Trap mine interaction where the Character throws mines, mine throws traps if skillFlags.trap then skillData.timeOverride = output.MineLayingTime / output.MineThrowCount / output.TrapThrowCount else skillData.timeOverride = output.MineLayingTime / output.MineThrowCount end - + if breakdown then breakdown.MineLayingTime = { } breakdown.multiChain(breakdown.MineLayingTime, { @@ -2064,17 +2064,20 @@ function calcs.offence(env, actor, activeSkill) -- Calculate costs (may be slightly off due to rounding differences) local costs = { - order = { "Mana","Life","ES","Soul","Rage","ManaPercent","LifePercent","ManaPerMinute","LifePerMinute","ManaPercentPerMinute","LifePercentPerMinute","ESPerMinute","ESPercentPerMinute" }, - + order = { "Mana","Life","ES","Ward","Soul","Rage","ManaPercent","LifePercent","WardPercent","ManaPerMinute","LifePerMinute","WardPerMinute","ManaPercentPerMinute","LifePercentPerMinute","ESPerMinute","ESPercentPerMinute" }, + ["Mana"] = { type = "Mana", upfront = true, percent = false, text = "mana", baseCost = 0, baseCostRaw = 0, totalCost = 0, baseCostNoMult = 0, finalBaseCost = 0 }, ["Life"] = { type = "Life", upfront = true, percent = false, text = "life", baseCost = 0, totalCost = 0, baseCostNoMult = 0, finalBaseCost = 0 }, ["ES"] = { type = "ES", upfront = true, percent = false, text = "ES", baseCost = 0, totalCost = 0, baseCostNoMult = 0, finalBaseCost = 0 }, + ["Ward"] = { type = "Ward", upfront = true, percent = false, text = "runic ward", baseCost = 0, totalCost = 0, baseCostNoMult = 0, finalBaseCost = 0 }, ["Soul"] = { type = "Soul", upfront = true, percent = false, unaffectedByGenericCostMults = true, text = "soul", baseCost = 0, totalCost = 0, baseCostNoMult = 0, finalBaseCost = 0 }, ["Rage"] = { type = "Rage", upfront = true, percent = false, text = "rage", baseCost = 0, totalCost = 0, baseCostNoMult = 0, finalBaseCost = 0 }, ["ManaPercent"] = { type = "Mana", upfront = true, percent = true, text = "mana", baseCost = 0, totalCost = 0, baseCostNoMult = 0, finalBaseCost = 0 }, ["LifePercent"] = { type = "Life", upfront = true, percent = true, text = "life", baseCost = 0, totalCost = 0, baseCostNoMult = 0, finalBaseCost = 0 }, + ["WardPercent"] = { type = "Ward", upfront = true, percent = true, text = "runic ward", baseCost = 0, totalCost = 0, baseCostNoMult = 0, finalBaseCost = 0 }, ["ManaPerMinute"] = { type = "Mana", upfront = false, percent = false, text = "mana/s", baseCost = 0, totalCost = 0, baseCostNoMult = 0, finalBaseCost = 0 }, ["LifePerMinute"] = { type = "Life", upfront = false, percent = false, text = "life/s", baseCost = 0, totalCost = 0, baseCostNoMult = 0, finalBaseCost = 0 }, + ["WardPerMinute"] = { type = "Ward", upfront = false, percent = false, text = "runic ward/s", baseCost = 0, totalCost = 0, baseCostNoMult = 0, finalBaseCost = 0 }, ["ManaPercentPerMinute"] = { type = "Mana", upfront = false, percent = true, text = "mana/s", baseCost = 0, totalCost = 0, baseCostNoMult = 0, finalBaseCost = 0 }, ["LifePercentPerMinute"] = { type = "Life", upfront = false, percent = true, text = "life/s", baseCost = 0, totalCost = 0, baseCostNoMult = 0, finalBaseCost = 0 }, ["ESPerMinute"] = { type = "ES", upfront = false, percent = false, text = "ES/s", baseCost = 0, totalCost = 0, baseCostNoMult = 0, finalBaseCost = 0 }, @@ -2088,6 +2091,8 @@ function calcs.offence(env, actor, activeSkill) local additionalLifeCost = skillModList:Sum("BASE", skillCfg, "BaseManaCostAsLifeCost") / 100 -- Extra cost (e.g. Petrified Blood) calculations local additionalESCost = skillModList:Sum("BASE", skillCfg, "ManaCostAsEnergyShieldCost") / 100 -- Extra cost (e.g. Replica Covenant) calculations local hybridLifeCost = m_min(skillModList:Sum("BASE", skillCfg, "HybridManaAndLifeCost_Life"), 100) / 100 -- Blood Magic, Lifetap and tree mods capped at 100 + local wardCostPctOfLife = skillModList:Sum("BASE", skillCfg, "WardCostAsPercentOfLifeCost") / 100 -- Extra cost (e.g. Scouring Flame) calculations + local wardCostPctOfMana = skillModList:Sum("BASE", skillCfg, "WardCostAsPercentOfManaCost") / 100 for _, resource in ipairs(costs.order) do local val = costs[resource] local skillCost = skillModList:Override(skillCfg, "Base"..resource.."CostOverride") or activeSkill.activeEffect.grantedEffectLevel.cost and activeSkill.activeEffect.grantedEffectLevel.cost[resource] or nil @@ -2140,6 +2145,18 @@ function calcs.offence(env, actor, activeSkill) val.baseCost = costs[manaType].baseCost val.finalBaseCost = round(finalBaseCostRaw + round(costs[manaType].finalBaseCost * additionalESCost)) end + elseif val.type == "Ward" and resource == "Ward" then + local wardCostFromOtherCosts = 0 + if wardCostPctOfMana ~= 0 then + wardCostFromOtherCosts = wardCostFromOtherCosts + round(costs["Mana"].finalBaseCost * wardCostPctOfMana) + end + if wardCostPctOfLife ~= 0 then + wardCostFromOtherCosts = wardCostFromOtherCosts + round(costs["Life"].finalBaseCost * wardCostPctOfLife) + end + if wardCostFromOtherCosts > 0 then + val.baseCost = val.baseCost + wardCostFromOtherCosts + val.finalBaseCost = val.finalBaseCost + wardCostFromOtherCosts + end elseif val.type == "Rage" then if skillModList:Flag(skillCfg, "CostRageInsteadOfSouls") then -- Hateforge val.baseCost = costs.Soul.baseCost @@ -2629,7 +2646,7 @@ function calcs.offence(env, actor, activeSkill) local incVsEnemy = skillModList:Sum("INC", cfg, "Accuracy", "AccuracyVsEnemy") local more = skillModList:More("MORE", cfg, "Accuracy") local moreVsEnemy = skillModList:More("MORE", cfg, "Accuracy", "AccuracyVsEnemy") - + local enemyDistance = env.modDB:Sum("BASE", nil, "Multiplier:enemyDistance") / 10 or 25 local enemyDistanceCapped = m_max(m_min(enemyDistance * 10, data.misc.AccuracyFalloffEnd), data.misc.AccuracyFalloffStart) local modValue = m_floor(data.misc.MaxAccuracyRangePenalty * calcLib.mod(skillModList, cfg, "AccuracyPenalty")) @@ -2639,7 +2656,7 @@ function calcs.offence(env, actor, activeSkill) for _, distance in ipairs(distances) do accuracyPenalties["accuracyPenalty" .. distance .. "m"] = 1 - ((distance * 10 - data.misc.AccuracyFalloffStart) / (data.misc.AccuracyFalloffEnd - data.misc.AccuracyFalloffStart)) * modValue / 100 -- Fix end - + output.Accuracy = m_max(0, m_floor(base * (1 + inc / 100) * more)) local accuracyVsEnemy = m_max(0, m_floor(baseVsEnemy * (1 + incVsEnemy / 100) * moreVsEnemy)) local accuracyVsEnemyBase = accuracyVsEnemy @@ -2708,7 +2725,7 @@ function calcs.offence(env, actor, activeSkill) chance = {" ", " ", ""} } for _, distance in ipairs(distances) do -- put distance values in order, incl. config value - if distance < hitChances[#hitChances].distance then + if distance < hitChances[#hitChances].distance then t_insert(hitChances, #hitChances, { distance = distance }) elseif distance > hitChances[#hitChances].distance then t_insert(hitChances, { distance = distance }) @@ -2891,12 +2908,12 @@ function calcs.offence(env, actor, activeSkill) skillModList:NewMod("Multiplier:TraumaStacks", "BASE", skillModList:Sum("BASE", skillCfg, "Multiplier:SustainableTraumaStacks"), "Maximum Sustainable Trauma Stacks") end local inc = skillModList:Sum("INC", cfg, "Speed") - + if skillFlags.warcry then output.Speed = 1 / output.WarcryCastTime else output.Speed = 1 / (baseTime / round((1 + inc/100) * more, 2) + skillModList:Sum("BASE", cfg, "TotalAttackTime") + skillModList:Sum("BASE", cfg, "TotalCastTime")) - + end output.CastRate = output.Speed if skillFlags.selfCast then @@ -3254,7 +3271,7 @@ function calcs.offence(env, actor, activeSkill) } end end - + --Calculate damage (exerts, crits, ruthless, DPS, etc) for _, pass in ipairs(passList) do globalOutput, globalBreakdown = output, breakdown @@ -3489,7 +3506,7 @@ function calcs.offence(env, actor, activeSkill) end end end - + output.FistOfWarDamageEffect = 1 output.AncestralCallDamageEffect = 1 output.AncestralEmpowermentDamageEffect = 1 @@ -3970,8 +3987,6 @@ function calcs.offence(env, actor, activeSkill) end output.DoubleDamageEffect = output.DoubleDamageChance / 100 output.ScaledDamageEffect = output.ScaledDamageEffect * (1 + output.DoubleDamageEffect + output.TripleDamageEffect) - - output.DpsMultiplier = ( skillData.dpsMultiplier or 1 ) * calcLib.mod(skillModList, skillCfg, "DPS") @@ -4331,7 +4346,7 @@ function calcs.offence(env, actor, activeSkill) if convertModName and convertFlag then local tempCfg = copyTable(cfg, true) tempCfg.overrideCond = { ["No" .. resource .. "LeechFromPhysicalDamage"] = false } -- Need to force Condition to `false`, to calculate original phys leech values - local physLeechMods = skillModList:Tabulate("BASE", tempCfg , "PhysicalDamage" .. resource .. "Leech") + local physLeechMods = skillModList:Tabulate("BASE", tempCfg , "PhysicalDamage" .. resource .. "Leech") for _, entry in ipairs(physLeechMods) do -- Add new leech mods for that damage type with the same conditions, source, etc. local newMod = copyTable(entry.mod) @@ -4713,7 +4728,7 @@ function calcs.offence(env, actor, activeSkill) for _, damageType in ipairs(dmgTypeList) do combineStat(damageType.."StoredCombinedAvg", "DPS") end - -- Crossbows: + -- Crossbows: if activeSkill.skillTypes[SkillType.CrossbowSkill] and not activeSkill.skillTypes[SkillType.Grenade] then -- Combine stats related to reload and bolt functionality combineStat("FiringRate", "AVERAGE") @@ -4988,7 +5003,7 @@ function calcs.offence(env, actor, activeSkill) end return sourceHitDmg, sourceCritDmg end - + ---Calculates damage to be used in damaging ailment calculations ---@param ailment string ---@param defaultDamageTypes table @@ -5016,7 +5031,7 @@ function calcs.offence(env, actor, activeSkill) end return hitMin, hitMax, critMin, critMax end - + ---Calculates damage to be used in poise related ailment calculations ---@param ailment string ---@param defaultDamageTypes table @@ -5056,7 +5071,7 @@ function calcs.offence(env, actor, activeSkill) end return hitMin, hitMax, hitAvg, critMin, critMax, critAvg, poseDamageAvg end - + ---Calculate the inflict chance and base damage of a secondary effect (bleed/poison/ignite/shock/freeze) ---@param ailment string ---@param sourceCritChance number @@ -5501,7 +5516,7 @@ function calcs.offence(env, actor, activeSkill) skillFlags["inflict"..flatAilment] = true end end - + local unmitigatedColdDamage = calcAverageUnmitigatedSourceDamage("Chill", data.defaultAilmentDamageTypes["Chill"]["ScalesFrom"]) local chillMinimumThreshold = enemyThreshold / data.gameConstants.ChillEffectMultiplier output['chillMinimumThreshold'] = chillMinimumThreshold @@ -5514,14 +5529,14 @@ function calcs.offence(env, actor, activeSkill) output["ChillChanceOnCrit"] = 0 skillFlags["inflictChill"] = false end - + output["FreezeChanceOnHit"] = 0 output["FreezeChanceOnCrit"] = 0 skillFlags["inflictFreeze"] = false skillFlags["inflictElectrocute"] = false - + -- Calculate poise-related debuffs - for _, ailment in ipairs({"Freeze", "Electrocute", "HeavyStun", "Pin"}) do + for _, ailment in ipairs({"Freeze", "Electrocute", "HeavyStun", "Pin"}) do local enemyPoiseThreshold = m_floor(data.monsterPoiseThresholdTable[env.enemyLevel] * calcLib.mod(enemyDB, nil, "PoiseThreshold", ailment.."Threshold", ailment == "HeavyStun" and "EnemyStunThreshold", (ailment == "Freeze" or ailment == "Electrocute") and "EnemyAilmentThreshold")) local hitMin, hitMax, hitAvg, critMin, critMax, critAvg, poiseAvg = calcMinMaxPoiseSourceDamage(ailment, data.buildupTypes[ailment].ScalesFrom) -- TODO: average for now, can do more complicated calculation later @@ -5535,7 +5550,7 @@ function calcs.offence(env, actor, activeSkill) local maxCrit = critMax * poiseBuildup local critPoiseBuildup = critAvg * poiseBuildup local totalAvgPoiseBuildup = poiseAvg * poiseBuildup - + if skillFlags.hit and not skillModList:Flag(cfg, "Cannot"..ailment) then globalOutput[ailment .. "BuildupAvg"] = totalAvgPoiseBuildup else @@ -5557,7 +5572,7 @@ function calcs.offence(env, actor, activeSkill) t_insert(globalBreakdown[ailment .. "Buildup"], s_format("Crit Min: %.1f%%", minCrit)) t_insert(globalBreakdown[ailment .. "Buildup"], s_format("Crit Max: %.1f%%", maxCrit)) t_insert(globalBreakdown[ailment .. "Buildup"], s_format("Crit Avg: %.1f%%", critPoiseBuildup)) - + t_insert(globalBreakdown[ailment .. "Buildup"], s_format("")) t_insert(globalBreakdown[ailment .. "Buildup"], s_format("Average "..ailment.." buildup")) t_insert(globalBreakdown[ailment .. "Buildup"], s_format("= %.1f%%", totalAvgPoiseBuildup)) @@ -5839,7 +5854,7 @@ function calcs.offence(env, actor, activeSkill) end end end - + -- Calculate impale chance and modifiers if canDeal.Physical and (output.ImpaleChance + output.ImpaleChanceOnCrit) > 0 then skillFlags.impale = true @@ -6080,7 +6095,7 @@ function calcs.offence(env, actor, activeSkill) end end end - + if skillModList:Flag(nil, "DotCanStack") then skillFlags.DotCanStack = true local speed = output.Speed @@ -6193,7 +6208,7 @@ function calcs.offence(env, actor, activeSkill) end if dmgType and dmgVal then -- !!!! WARNING !!!! -- - -- applyDmgTakenConversion does NOT consider the "And protect me from Harm" yet + -- applyDmgTakenConversion does NOT consider the "And protect me from Harm" yet local dmgBreakdown, totalDmgTaken = calcs.applyDmgTakenConversion(activeSkill, output, breakdown, dmgType, dmgVal) t_insert(dmgBreakdown, 1, s_format("Heartbound Loop base damage: %d", dmgVal)) t_insert(dmgBreakdown, 2, s_format("")) @@ -6327,7 +6342,7 @@ function calcs.offence(env, actor, activeSkill) output.ParryRangeProj = (skillData.parryRangeProj or 0) * calcLib.mod(skillModList, skillCfg, "ParryRangeProj") if breakdown then if output.ParryRangeNonProj > 0 then - breakdown.ParryRangeNonProj = { + breakdown.ParryRangeNonProj = { s_format("Max Parry distance vs. non-projectiles:"), s_format(""), s_format("%.1f m ^8(base parry range for non-projectiles)", skillData.parryRangeNonProj), diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index 6ecc3620ab..48abc63072 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -1628,6 +1628,10 @@ function calcs.perform(env, skipEHP) if (modDB:Flag(nil, type.."FlaskAppliesToLife")) then t_insert(out, modLib.createMod("LifeRecovery", "BASE", flaskTotal / flaskDur, name)) end + local wardRecoveryPercent = type == "Life" and modDB:Sum("BASE", nil, "LifeFlaskRecoveryAppliesToWard") or 0 + if wardRecoveryPercent > 0 then + t_insert(out, modLib.createMod("WardRecovery", "BASE", flaskTotal / flaskDur * wardRecoveryPercent / 100, name)) + end return out end diff --git a/src/Modules/CalcSections.lua b/src/Modules/CalcSections.lua index ff14c34453..e5604958c8 100644 --- a/src/Modules/CalcSections.lua +++ b/src/Modules/CalcSections.lua @@ -109,46 +109,46 @@ return { }, { label = "Added Min", { }, - { format = "{0:mod:1,2}", + { format = "{0:mod:1,2}", { label = "Player modifiers", modName = "PhysicalMin", modType = "BASE", cfg = "skill" }, { label = "Enemy modifiers", modName = "SelfPhysicalMin", modType = "BASE", enemy = true, cfg = "skill" }, }, - { format = "{0:mod:1,2}", + { format = "{0:mod:1,2}", { label = "Player modifiers", modName = "LightningMin", modType = "BASE", cfg = "skill" }, { label = "Enemy modifiers", modName = "SelfLightningMin", modType = "BASE", enemy = true, cfg = "skill" }, }, - { format = "{0:mod:1,2}", + { format = "{0:mod:1,2}", { label = "Player modifiers", modName = "ColdMin", modType = "BASE", cfg = "skill" }, { label = "Enemy modifiers", modName = "SelfColdMin", modType = "BASE", enemy = true, cfg = "skill" }, }, - { format = "{0:mod:1,2}", + { format = "{0:mod:1,2}", { label = "Player modifiers", modName = "FireMin", modType = "BASE", cfg = "skill" }, { label = "Enemy modifiers", modName = "SelfFireMin", modType = "BASE", enemy = true, cfg = "skill" }, }, - { format = "{0:mod:1,2}", + { format = "{0:mod:1,2}", { label = "Player modifiers", modName = "ChaosMin", modType = "BASE", cfg = "skill" }, { label = "Enemy modifiers", modName = "SelfChaosMin", modType = "BASE", enemy = true, cfg = "skill" }, }, }, { label = "Added Max", { }, - { format = "{0:mod:1,2}", + { format = "{0:mod:1,2}", { label = "Player modifiers", modName = "PhysicalMax", modType = "BASE", cfg = "skill" }, { label = "Enemy modifiers", modName = "SelfPhysicalMax", modType = "BASE", enemy = true, cfg = "skill" }, }, - { format = "{0:mod:1,2}", + { format = "{0:mod:1,2}", { label = "Player modifiers", modName = "LightningMax", modType = "BASE", cfg = "skill" }, { label = "Enemy modifiers", modName = "SelfLightningMax", modType = "BASE", enemy = true, cfg = "skill" }, }, - { format = "{0:mod:1,2}", + { format = "{0:mod:1,2}", { label = "Player modifiers", modName = "ColdMax", modType = "BASE", cfg = "skill" }, { label = "Enemy modifiers", modName = "SelfColdMax", modType = "BASE", enemy = true, cfg = "skill" }, }, - { format = "{0:mod:1,2}", + { format = "{0:mod:1,2}", { label = "Player modifiers", modName = "FireMax", modType = "BASE", cfg = "skill" }, { label = "Enemy modifiers", modName = "SelfFireMax", modType = "BASE", enemy = true, cfg = "skill" }, }, - { format = "{0:mod:1,2}", + { format = "{0:mod:1,2}", { label = "Player modifiers", modName = "ChaosMax", modType = "BASE", cfg = "skill" }, { label = "Enemy modifiers", modName = "SelfChaosMax", modType = "BASE", enemy = true, cfg = "skill" }, }, @@ -174,7 +174,7 @@ return { { }, { format = "x {3:output:PhysicalEffMult}", { breakdown = "PhysicalEffMult" }, - { label = "Enemy modifiers", modName = physicalHitTaken, enemy = true, cfg = "skill" }, + { label = "Enemy modifiers", modName = physicalHitTaken, enemy = true, cfg = "skill" }, }, { format = "x {3:output:LightningEffMult}", { breakdown = "LightningEffMult" }, @@ -199,31 +199,31 @@ return { }, { label = "Skill Hit Damage", textSize = 12, notFlag = "attack", { format = "{0:output:TotalMin} to {0:output:TotalMax}", }, - { format = "{0:output:PhysicalMin} to {0:output:PhysicalMax}", - { breakdown = "Physical" }, - { label = "Conversions", cfg = "skill", modName = physicalConvert }, + { format = "{0:output:PhysicalMin} to {0:output:PhysicalMax}", + { breakdown = "Physical" }, + { label = "Conversions", cfg = "skill", modName = physicalConvert }, }, - { format = "{0:output:LightningMin} to {0:output:LightningMax}", - { breakdown = "Lightning" }, - { label = "Conversions", cfg = "skill", modName = lightningConvert }, + { format = "{0:output:LightningMin} to {0:output:LightningMax}", + { breakdown = "Lightning" }, + { label = "Conversions", cfg = "skill", modName = lightningConvert }, }, - { format = "{0:output:ColdMin} to {0:output:ColdMax}", - { breakdown = "Cold" }, - { label = "Conversions", cfg = "skill", modName = coldConvert }, + { format = "{0:output:ColdMin} to {0:output:ColdMax}", + { breakdown = "Cold" }, + { label = "Conversions", cfg = "skill", modName = coldConvert }, }, - { format = "{0:output:FireMin} to {0:output:FireMax}", - { breakdown = "Fire" }, - { label = "Conversions", cfg = "skill", modName = fireConvert }, + { format = "{0:output:FireMin} to {0:output:FireMax}", + { breakdown = "Fire" }, + { label = "Conversions", cfg = "skill", modName = fireConvert }, }, - { format = "{0:output:ChaosMin} to {0:output:ChaosMax}", - { breakdown = "Chaos" }, - { label = "Conversions", cfg = "skill", modName = chaosConvert }, + { format = "{0:output:ChaosMin} to {0:output:ChaosMax}", + { breakdown = "Chaos" }, + { label = "Conversions", cfg = "skill", modName = chaosConvert }, }, }, { label = "Skill Average Hit", notFlag = "attack", { format = "{1:output:AverageHit}", { breakdown = "AverageHit" }, }, }, - { label = "Skill PvP Average Hit", flag = "notAttackPvP", { format = "{1:output:PvpAverageHit}", { breakdown = "PvpAverageHit" }, - { label = "Tvalue Override (ms)", modName = "MultiplierPvpTvalueOverride" }, - { label = "PvP Multiplier", cfg = "skill", modName = "PvpDamageMultiplier" }, + { label = "Skill PvP Average Hit", flag = "notAttackPvP", { format = "{1:output:PvpAverageHit}", { breakdown = "PvpAverageHit" }, + { label = "Tvalue Override (ms)", modName = "MultiplierPvpTvalueOverride" }, + { label = "PvP Multiplier", cfg = "skill", modName = "PvpDamageMultiplier" }, }, }, -- Main Hand Hit Damage { label = "MH Total Increased", bgCol = colorCodes.MAINHANDBG, flag = "weapon1Attack", @@ -246,7 +246,7 @@ return { { }, { format = "x {3:output:MainHand.PhysicalEffMult}", { breakdown = "MainHand.PhysicalEffMult" }, - { label = "Enemy modifiers", modName = physicalHitTaken, enemy = true, cfg = "weapon1" }, + { label = "Enemy modifiers", modName = physicalHitTaken, enemy = true, cfg = "weapon1" }, }, { format = "x {3:output:MainHand.LightningEffMult}", { breakdown = "MainHand.LightningEffMult" }, @@ -271,32 +271,32 @@ return { }, { label = "MH Hit Damage", bgCol = colorCodes.MAINHANDBG, textSize = 12, flag = "weapon1Attack", { format = "{0:output:MainHand.TotalMin} to {0:output:MainHand.TotalMax}", }, - { format = "{0:output:MainHand.PhysicalMin} to {0:output:MainHand.PhysicalMax}", - { breakdown = "MainHand.Physical" }, + { format = "{0:output:MainHand.PhysicalMin} to {0:output:MainHand.PhysicalMax}", + { breakdown = "MainHand.Physical" }, { label = "Conversions", cfg = "weapon1", modName = physicalConvert }, }, - { format = "{0:output:MainHand.LightningMin} to {0:output:MainHand.LightningMax}", - { breakdown = "MainHand.Lightning" }, - { label = "Conversions", cfg = "weapon1", modName = lightningConvert }, + { format = "{0:output:MainHand.LightningMin} to {0:output:MainHand.LightningMax}", + { breakdown = "MainHand.Lightning" }, + { label = "Conversions", cfg = "weapon1", modName = lightningConvert }, }, - { format = "{0:output:MainHand.ColdMin} to {0:output:MainHand.ColdMax}", - { breakdown = "MainHand.Cold" }, - { label = "Conversions", cfg = "weapon1", modName = coldConvert }, + { format = "{0:output:MainHand.ColdMin} to {0:output:MainHand.ColdMax}", + { breakdown = "MainHand.Cold" }, + { label = "Conversions", cfg = "weapon1", modName = coldConvert }, }, - { format = "{0:output:MainHand.FireMin} to {0:output:MainHand.FireMax}", - { breakdown = "MainHand.Fire" }, - { label = "Conversions", cfg = "weapon1", modName = fireConvert }, + { format = "{0:output:MainHand.FireMin} to {0:output:MainHand.FireMax}", + { breakdown = "MainHand.Fire" }, + { label = "Conversions", cfg = "weapon1", modName = fireConvert }, }, - { format = "{0:output:MainHand.ChaosMin} to {0:output:MainHand.ChaosMax}", - { breakdown = "MainHand.Chaos" }, + { format = "{0:output:MainHand.ChaosMin} to {0:output:MainHand.ChaosMax}", + { breakdown = "MainHand.Chaos" }, { label = "Conversions", cfg = "weapon1", modName = chaosConvert }, }, }, { label = "MH Average Hit", bgCol = colorCodes.MAINHANDBG, flag = "weapon1Attack", { format = "{1:output:MainHand.AverageHit}", { breakdown = "MainHand.AverageHit" }, }, }, - { label = "MH PvP Average Hit", bgCol = colorCodes.MAINHANDBG, flag = "weapon1AttackPvP", { format = "{1:output:MainHand.PvpAverageHit}", { breakdown = "MainHand.PvpAverageHit" }, - { label = "Tvalue Override (ms)", modName = "MultiplierPvpTvalueOverride" }, - { label = "PvP Multiplier", cfg = "skill", modName = "PvpDamageMultiplier" }, - }, }, + { label = "MH PvP Average Hit", bgCol = colorCodes.MAINHANDBG, flag = "weapon1AttackPvP", { format = "{1:output:MainHand.PvpAverageHit}", { breakdown = "MainHand.PvpAverageHit" }, + { label = "Tvalue Override (ms)", modName = "MultiplierPvpTvalueOverride" }, + { label = "PvP Multiplier", cfg = "skill", modName = "PvpDamageMultiplier" }, + }, }, -- Off Hand Hit Damage { label = "OH Total Increased", bgCol = colorCodes.OFFHANDBG, flag = "weapon2Attack", { format = "{0:mod:1}%", { modName = "Damage", modType = "INC", cfg = "weapon2" }, }, @@ -318,7 +318,7 @@ return { { }, { format = "x {3:output:OffHand.PhysicalEffMult}", { breakdown = "OffHand.PhysicalEffMult" }, - { label = "Enemy modifiers", modName = physicalHitTaken, enemy = true, cfg = "weapon2" }, + { label = "Enemy modifiers", modName = physicalHitTaken, enemy = true, cfg = "weapon2" }, }, { format = "x {3:output:OffHand.LightningEffMult}", { breakdown = "OffHand.LightningEffMult" }, @@ -343,61 +343,61 @@ return { }, { label = "OH Hit Damage", bgCol = colorCodes.OFFHANDBG, textSize = 12, flag = "weapon2Attack", { format = "{0:output:OffHand.TotalMin} to {0:output:OffHand.TotalMax}", }, - { format = "{0:output:OffHand.PhysicalMin} to {0:output:OffHand.PhysicalMax}", - { breakdown = "OffHand.Physical" }, + { format = "{0:output:OffHand.PhysicalMin} to {0:output:OffHand.PhysicalMax}", + { breakdown = "OffHand.Physical" }, { label = "Conversions", cfg = "weapon2", modName = physicalConvert }, }, - { format = "{0:output:OffHand.LightningMin} to {0:output:OffHand.LightningMax}", - { breakdown = "OffHand.Lightning" }, - { label = "Conversions", cfg = "weapon2", modName = lightningConvert }, + { format = "{0:output:OffHand.LightningMin} to {0:output:OffHand.LightningMax}", + { breakdown = "OffHand.Lightning" }, + { label = "Conversions", cfg = "weapon2", modName = lightningConvert }, }, - { format = "{0:output:OffHand.ColdMin} to {0:output:OffHand.ColdMax}", - { breakdown = "OffHand.Cold" }, - { label = "Conversions", cfg = "weapon2", modName = coldConvert }, + { format = "{0:output:OffHand.ColdMin} to {0:output:OffHand.ColdMax}", + { breakdown = "OffHand.Cold" }, + { label = "Conversions", cfg = "weapon2", modName = coldConvert }, }, - { format = "{0:output:OffHand.FireMin} to {0:output:OffHand.FireMax}", - { breakdown = "OffHand.Fire" }, - { label = "Conversions", cfg = "weapon2", modName = fireConvert }, + { format = "{0:output:OffHand.FireMin} to {0:output:OffHand.FireMax}", + { breakdown = "OffHand.Fire" }, + { label = "Conversions", cfg = "weapon2", modName = fireConvert }, }, - { format = "{0:output:OffHand.ChaosMin} to {0:output:OffHand.ChaosMax}", + { format = "{0:output:OffHand.ChaosMin} to {0:output:OffHand.ChaosMax}", { breakdown = "OffHand.Chaos" }, - { label = "Conversions", cfg = "weapon2", modName = chaosConvert }, + { label = "Conversions", cfg = "weapon2", modName = chaosConvert }, }, }, { label = "OH Average Hit", bgCol = colorCodes.OFFHANDBG, flag = "weapon2Attack", { format = "{1:output:OffHand.AverageHit}", { breakdown = "OffHand.AverageHit" }, }, }, - { label = "OH PvP Average Hit", bgCol = colorCodes.OFFHANDBG, flag = "weapon2AttackPvP", { format = "{1:output:OffHand.PvpAverageHit}", { breakdown = "OffHand.PvpAverageHit" }, - { label = "Tvalue Override (ms)", modName = "MultiplierPvpTvalueOverride" }, - { label = "PvP Multiplier", cfg = "skill", modName = "PvpDamageMultiplier" }, + { label = "OH PvP Average Hit", bgCol = colorCodes.OFFHANDBG, flag = "weapon2AttackPvP", { format = "{1:output:OffHand.PvpAverageHit}", { breakdown = "OffHand.PvpAverageHit" }, + { label = "Tvalue Override (ms)", modName = "MultiplierPvpTvalueOverride" }, + { label = "PvP Multiplier", cfg = "skill", modName = "PvpDamageMultiplier" }, }, }, - { label = "Average Damage", flag = "attack", { format = "{1:output:AverageDamage}", + { label = "Average Damage", flag = "attack", { format = "{1:output:AverageDamage}", { breakdown = "MainHand.AverageDamage" }, { breakdown = "OffHand.AverageDamage" }, { breakdown = "AverageDamage" }, }, }, { label = "Chance to Hit", haveOutput = "enemyHasSpellBlock", { format = "{0:output:HitChance}%", - { breakdown = "HitChance" }, + { breakdown = "HitChance" }, { label = "Enemy Block", modName = { "BlockChance" }, enemy = true }, { label = "Block Chance Reduction", cfg = "skill", modName = { "reduceEnemyBlock" } }, }, }, - { label = "Average Damage", haveOutput = "enemyHasSpellBlock", { format = "{1:output:AverageDamage}", + { label = "Average Damage", haveOutput = "enemyHasSpellBlock", { format = "{1:output:AverageDamage}", { breakdown = "AverageDamage" }, }, }, { label = "Chance to Explode", haveOutput = "ExplodeChance", { format = "{0:output:ExplodeChance}%" }, }, { label = "Average Damage", haveOutput = "ExplodeChance", { format = "{1:output:AverageDamage}", { breakdown = "AverageDamage" }, }, }, - { label = "PvP Average Dmg", flag = "attackPvP", { format = "{1:output:PvpAverageDamage}", + { label = "PvP Average Dmg", flag = "attackPvP", { format = "{1:output:PvpAverageDamage}", { breakdown = "MainHand.PvpAverageDamage" }, { breakdown = "OffHand.PvpAverageDamage" }, { breakdown = "PvpAverageDamage" }, - { label = "Tvalue Override (ms)", modName = "MultiplierPvpTvalueOverride" }, - { label = "PvP Multiplier", cfg = "skill", modName = "PvpDamageMultiplier" }, + { label = "Tvalue Override (ms)", modName = "MultiplierPvpTvalueOverride" }, + { label = "PvP Multiplier", cfg = "skill", modName = "PvpDamageMultiplier" }, }, }, { label = "Skill DPS", flag = "notAverage", notFlag = "triggered", { format = "{1:output:TotalDPS}", { breakdown = "TotalDPS" }, { label = "DPS Multiplier", modName = "DPS", cfg = "skill" }, }, }, - { label = "Skill PvP DPS", flag = "notAveragePvP", { format = "{1:output:PvpTotalDPS}", { breakdown = "PvpTotalDPS" }, - { label = "Tvalue Override (ms)", modName = "MultiplierPvpTvalueOverride" }, - { label = "PvP Multiplier", cfg = "skill", modName = "PvpDamageMultiplier" }, - { label = "DPS Multiplier", modName = "DPS" }, + { label = "Skill PvP DPS", flag = "notAveragePvP", { format = "{1:output:PvpTotalDPS}", { breakdown = "PvpTotalDPS" }, + { label = "Tvalue Override (ms)", modName = "MultiplierPvpTvalueOverride" }, + { label = "PvP Multiplier", cfg = "skill", modName = "PvpDamageMultiplier" }, + { label = "DPS Multiplier", modName = "DPS" }, }, }, { label = "Skill DPS", flag = "triggered", { format = "{1:output:TotalDPS}", { breakdown = "TotalDPS" }, { label = "DPS Multiplier", modName = "DPS", cfg = "skill" }, }, }, } } @@ -413,21 +413,21 @@ return { { format = "# of Empowered" }, { format = "Max 1-Hit Impact"}, }, - { label = "Seismic Cry", haveOutput = "SeismicUpTimeRatio", + { label = "Seismic Cry", haveOutput = "SeismicUpTimeRatio", { format = "{2:output:SeismicHitEffect}", { breakdown = "SeismicHitEffect"}, }, { format = "{2:output:SeismicAvgDmg}", { breakdown = "SeismicAvgDmg"}, }, { format = "{0:output:SeismicUpTimeRatio}%", { breakdown = "SeismicUpTimeRatio" }, }, { format = "{0:output:SeismicExertsCount}" }, { format = "{2:output:SeismicMaxHitEffect}" }, }, - { label = "Intimidating Cry", haveOutput = "IntimidatingUpTimeRatio", + { label = "Intimidating Cry", haveOutput = "IntimidatingUpTimeRatio", { format = "{2:output:IntimidatingHitEffect}", { breakdown = "IntimidatingHitEffect"}, }, { format = "{2:output:IntimidatingAvgDmg}", { breakdown = "IntimidatingAvgDmg"}, }, { format = "{0:output:IntimidatingUpTimeRatio}%", { breakdown = "IntimidatingUpTimeRatio" }, }, { format = "{0:output:IntimidatingExertsCount}" }, { format = "{2:output:IntimidatingMaxHitEffect}" }, }, - { label = "Rallying Cry", haveOutput = "RallyingUpTimeRatio", + { label = "Rallying Cry", haveOutput = "RallyingUpTimeRatio", { format = "{2:output:RallyingHitEffect}", { breakdown = "RallyingHitEffect"}, }, { format = "{2:output:RallyingAvgDmg}", { breakdown = "RallyingAvgDmg"}, }, { format = "{0:output:RallyingUpTimeRatio}%", { breakdown = "RallyingUpTimeRatio" }, }, @@ -441,14 +441,14 @@ return { { format = "{2:output:InfernalEmpoweredCount}" , { breakdown = "InfernalEmpoweringWarcryCount" },}, { format = "" }, }, - { label = "Battlemage's Cry", haveOutput = "BattlemageUpTimeRatio", + { label = "Battlemage's Cry", haveOutput = "BattlemageUpTimeRatio", { format = "" }, { format = "" }, { format = "{0:output:BattlemageUpTimeRatio}%", { breakdown = "BattlemageUpTimeRatio" }, }, { format = "{0:output:BattleCryExertsCount}" }, { format = "" }, }, - { label = "Ancestral Cry", haveOutput = "AncestralUpTimeRatio", + { label = "Ancestral Cry", haveOutput = "AncestralUpTimeRatio", { format = "" }, { format = "" }, { format = "{0:output:AncestralUpTimeRatio}%", { breakdown = "AncestralUpTimeRatio" }, }, @@ -532,7 +532,7 @@ return { { }, { format = "x {3:output:PhysicalDotEffMult}", { breakdown = "PhysicalDotEffMult" }, - { label = "Enemy modifiers", modName = { "DamageTaken", "DamageTakenOverTime", "PhysicalDamageTaken", "PhysicalDamageTakenOverTime", "PhysicalDamageReduction" }, enemy = true }, + { label = "Enemy modifiers", modName = { "DamageTaken", "DamageTakenOverTime", "PhysicalDamageTaken", "PhysicalDamageTakenOverTime", "PhysicalDamageReduction" }, enemy = true }, }, { format = "x {3:output:LightningDotEffMult}", { breakdown = "LightningDotEffMult" }, @@ -598,58 +598,58 @@ return { extra = "{2:output:CritChance}% x{2:output:CritMultiplier}", flag = "hit", -- Skill - { label = "Inc. Crit Chance", notFlag = "attack", { format = "{0:mod:1,2}%", - { label = "Player modifiers", modName = "CritChance", modType = "INC", cfg = "skill" }, - { label = "Enemy modifiers", modName = "SelfCritChance", modType = "INC", enemy = true }, - }, }, - { label = "Crit Chance", notFlag = "attack", { format = "{2:output:CritChance}%", - { breakdown = "CritChance" }, - { label = "Player modifiers", modName = {"CritChance", "SpellSkillsCannotDealCriticalStrikesExceptOnFinalRepeat", "SpellSkillsAlwaysDealCriticalStrikesOnFinalRepeat", "InevitableCriticalHits"}, cfg = "skill" }, - { label = "Enemy modifiers", modName = "SelfCritChance", enemy = true }, - }, }, - { label = "Crit Multiplier", notFlag = "attack", { format = "x {2:output:CritMultiplier}", - { breakdown = "CritMultiplier" }, - { label = "Player modifiers", modName = "CritMultiplier", cfg = "skill" }, - { label = "Enemy modifiers", modName = "SelfCritMultiplier", enemy = true }, + { label = "Inc. Crit Chance", notFlag = "attack", { format = "{0:mod:1,2}%", + { label = "Player modifiers", modName = "CritChance", modType = "INC", cfg = "skill" }, + { label = "Enemy modifiers", modName = "SelfCritChance", modType = "INC", enemy = true }, + }, }, + { label = "Crit Chance", notFlag = "attack", { format = "{2:output:CritChance}%", + { breakdown = "CritChance" }, + { label = "Player modifiers", modName = {"CritChance", "SpellSkillsCannotDealCriticalStrikesExceptOnFinalRepeat", "SpellSkillsAlwaysDealCriticalStrikesOnFinalRepeat", "InevitableCriticalHits"}, cfg = "skill" }, + { label = "Enemy modifiers", modName = "SelfCritChance", enemy = true }, + }, }, + { label = "Crit Multiplier", notFlag = "attack", { 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", notFlag = "attack", { format = "x {3:output:CritEffect}", { breakdown = "CritEffect" }, }, }, -- Main Hand - { label = "MH Inc. Crit Chance", bgCol = colorCodes.MAINHANDBG, flag = "weapon1Attack", { format = "{0:mod:1,2}%", - { label = "Player modifiers", modName = "CritChance", modType = "INC", cfg = "weapon1" }, - { label = "Enemy modifiers", modName = "SelfCritChance", modType = "INC", enemy = true }, + { label = "MH Inc. Crit Chance", bgCol = colorCodes.MAINHANDBG, flag = "weapon1Attack", { format = "{0:mod:1,2}%", + { label = "Player modifiers", modName = "CritChance", modType = "INC", cfg = "weapon1" }, + { label = "Enemy modifiers", modName = "SelfCritChance", modType = "INC", enemy = true }, }, }, - { label = "MH Crit Chance", bgCol = colorCodes.MAINHANDBG, flag = "weapon1Attack", { format = "{2:output:MainHand.CritChance}%", - { breakdown = "MainHand.CritChance" }, - { label = "Player modifiers", modName = { "CritChance", "WeaponBaseCritChance", "MainHandCritIsEqualToParent", "MainHandCritIsEqualToPartyMember", "AttackCritIsEqualToParentMainHand", "InevitableCriticalHits" }, cfg = "weapon1" }, - { label = "Enemy modifiers", modName = "SelfCritChance", enemy = true }, + { label = "MH Crit Chance", bgCol = colorCodes.MAINHANDBG, flag = "weapon1Attack", { format = "{2:output:MainHand.CritChance}%", + { breakdown = "MainHand.CritChance" }, + { label = "Player modifiers", modName = { "CritChance", "WeaponBaseCritChance", "MainHandCritIsEqualToParent", "MainHandCritIsEqualToPartyMember", "AttackCritIsEqualToParentMainHand", "InevitableCriticalHits" }, cfg = "weapon1" }, + { label = "Enemy modifiers", modName = "SelfCritChance", enemy = true }, }, }, - { label = "MH Crit Bifurcates", bgCol = colorCodes.MAINHANDBG, haveOutput = "MainHand.CritBifurcates", flag = "weapon1Attack", { format = "x {2:output:MainHand.CritBifurcates}", - { breakdown = "MainHand.CritBifurcates" }, + { label = "MH Crit Bifurcates", bgCol = colorCodes.MAINHANDBG, haveOutput = "MainHand.CritBifurcates", flag = "weapon1Attack", { format = "x {2:output:MainHand.CritBifurcates}", + { breakdown = "MainHand.CritBifurcates" }, { label = "Player modifiers", modName = "BifurcateCrit", cfg = "weapon1" }, }, }, - { label = "MH Crit Multiplier", bgCol = colorCodes.MAINHANDBG, flag = "weapon1Attack", { format = "x {2:output:MainHand.CritMultiplier}", - { breakdown = "MainHand.CritMultiplier" }, - { label = "Player modifiers", modName = "CritMultiplier", cfg = "weapon1" }, + { label = "MH Crit Multiplier", bgCol = colorCodes.MAINHANDBG, flag = "weapon1Attack", { format = "x {2:output:MainHand.CritMultiplier}", + { breakdown = "MainHand.CritMultiplier" }, + { label = "Player modifiers", modName = "CritMultiplier", cfg = "weapon1" }, { label = "Enemy modifiers", modName = "SelfCritMultiplier", enemy = true }, }, }, { label = "MH Crit Effect Mod", bgCol = colorCodes.MAINHANDBG, flag = "weapon1Attack", { format = "x {3:output:MainHand.CritEffect}", { breakdown = "MainHand.CritEffect" }, }, }, -- Off Hand - { label = "OH Inc. Crit Chance", bgCol = colorCodes.OFFHANDBG, flag = "weapon2Attack", { format = "{0:mod:1,2}%", - { label = "Player modifiers", modName = "CritChance", modType = "INC", cfg = "weapon2" }, - { label = "Enemy modifiers", modName = "SelfCritChance", modType = "INC", enemy = true }, + { label = "OH Inc. Crit Chance", bgCol = colorCodes.OFFHANDBG, flag = "weapon2Attack", { format = "{0:mod:1,2}%", + { label = "Player modifiers", modName = "CritChance", modType = "INC", cfg = "weapon2" }, + { label = "Enemy modifiers", modName = "SelfCritChance", modType = "INC", enemy = true }, }, }, - { label = "OH Crit Chance", bgCol = colorCodes.OFFHANDBG, flag = "weapon2Attack", { format = "{2:output:OffHand.CritChance}%", - { breakdown = "OffHand.CritChance" }, + { label = "OH Crit Chance", bgCol = colorCodes.OFFHANDBG, flag = "weapon2Attack", { format = "{2:output:OffHand.CritChance}%", + { breakdown = "OffHand.CritChance" }, { label = "Player modifiers", modName = { "CritChance", "WeaponBaseCritChance", "AttackCritIsEqualToParentMainHand", "InevitableCriticalHits" }, cfg = "weapon2" }, - { label = "Enemy modifiers", modName = "SelfCritChance", enemy = true }, + { label = "Enemy modifiers", modName = "SelfCritChance", enemy = true }, }, }, - { label = "OH Crit Bifurcates", bgCol = colorCodes.OFFHANDBG, haveOutput = "OffHand.CritBifurcates", flag = "weapon2Attack", { format = "x {2:output:OffHand.CritBifurcates}", - { breakdown = "OffHand.CritBifurcates" }, + { label = "OH Crit Bifurcates", bgCol = colorCodes.OFFHANDBG, haveOutput = "OffHand.CritBifurcates", flag = "weapon2Attack", { format = "x {2:output:OffHand.CritBifurcates}", + { breakdown = "OffHand.CritBifurcates" }, { label = "Player modifiers", modName = "BifurcateCrit", cfg = "weapon2" }, }, }, - { label = "OH Crit Multiplier", bgCol = colorCodes.OFFHANDBG, flag = "weapon2Attack", { format = "x {2:output:OffHand.CritMultiplier}", - { breakdown = "OffHand.CritMultiplier" }, - { label = "Player modifiers", modName = "CritMultiplier", cfg = "weapon2" }, + { label = "OH Crit Multiplier", bgCol = colorCodes.OFFHANDBG, flag = "weapon2Attack", { format = "x {2:output:OffHand.CritMultiplier}", + { breakdown = "OffHand.CritMultiplier" }, + { label = "Player modifiers", modName = "CritMultiplier", cfg = "weapon2" }, { label = "Enemy modifiers", modName = "SelfCritMultiplier", enemy = true }, }, }, { label = "OH Crit Effect Mod", bgCol = colorCodes.OFFHANDBG, flag = "weapon2Attack", { format = "x {3:output:OffHand.CritEffect}", { breakdown = "OffHand.CritEffect" }, }, }, @@ -712,6 +712,9 @@ return { { label = "ES Cost", color = colorCodes.ES, haveOutput = "ESHasCost", { format = "{0:output:ESCost}", { breakdown = "ESCost" }, { modName = { "ESCost", "Cost", "ESCostNoMult" }, cfg = "skill" }, }, }, { label = "ES per second", color = colorCodes.ES, haveOutput = "ESPerSecondHasCost", { format = "{2:output:ESPerSecondCost}", { breakdown = "ESPerSecondCost" }, { modName = { "ESCost", "Cost", "ESCostNoMult" }, cfg = "skill" }, }, }, { label = "ES % per second", color = colorCodes.ES, haveOutput = "ESPercentPerSecondHasCost", { format = "{2:output:ESPercentPerSecondCost}", { breakdown = "ESPercentPerSecondCost" }, { modName = { "ESCost", "Cost", "ESCostNoMult" }, cfg = "skill" }, }, }, + { label = "Runic Ward Cost", color = colorCodes.WARD, haveOutput = "WardHasCost", { format = "{0:output:WardCost}", { breakdown = "WardCost" }, { modName = { "WardCost", "Cost", "WardCostNoMult" }, cfg = "skill" }, }, }, + { label = "Runic Ward % Cost", color = colorCodes.WARD, haveOutput = "WardPercentHasCost", { format = "{0:output:WardPercentCost}", { breakdown = "WardPercentCost" }, { modName = { "WardCost", "Cost", "WardCostNoMult" }, cfg = "skill" }, }, }, + { label = "Runic Ward / s", color = colorCodes.WARD, haveOutput = "WardPerSecondHasCost", { format = "{2:output:WardPerSecondCost}", { breakdown = "WardPerSecondCost" }, { modName = { "WardCost", "Cost", "WardCostNoMult" }, cfg = "skill" }, }, }, { label = "Rage Cost", color = colorCodes.RAGE, haveOutput = "RageHasCost", { format = "{0:output:RageCost}", { breakdown = "RageCost" }, { modName = { "RageCost", "Cost", "RageNoMult" }, cfg = "skill" }, }, }, { label = "Rage per second", color = colorCodes.RAGE, haveOutput = "RagePerSecondHasCost", { format = "{2:output:RagePerSecondCost}", { breakdown = "RagePerSecondCost" }, { modName = { "RageCost", "Cost", "RageNoMult" }, cfg = "skill" }, }, }, { label = "Armour Break / hit", haveOutput = "ArmourBreakPerHit", { format = "{0:output:ArmourBreakPerHit}", { modName = "ArmourBreakPerHit", modType = "BASE"} }, }, @@ -726,8 +729,8 @@ return { { modName = { "QuantityMultiplier" }, cfg = "skill" }, }, }, { label = "Skill Cooldown", haveOutput = "Cooldown", { format = "{3:output:EffectiveCooldown}s", - { breakdown = "Cooldown" }, - { breakdown = "EffectiveCooldown" }, + { breakdown = "Cooldown" }, + { breakdown = "EffectiveCooldown" }, { modName = {"CooldownRecovery", "CooldownRecoveryFromTemporalis", "CooldownChanceNotConsume"}, cfg = "skill" }, }, }, { label = "Stored Uses", haveOutput = "StoredUses", { format = "{output:StoredUses}", @@ -735,7 +738,7 @@ return { { modName = "AdditionalCooldownUses", cfg = "skill" }, }, }, { label = "Duration Mod", flag = "duration", { format = "x {4:output:DurationMod}", - { breakdown = "DurationMod" }, + { breakdown = "DurationMod" }, { breakdown = "SecondaryDurationMod" }, { breakdown = "TertiaryDurationMod" }, { modName = { "Duration", "PrimaryDuration", "SecondaryDuration", "TertiaryDuration", "DamagingAilmentDuration" }, cfg = "skill" }, @@ -761,9 +764,9 @@ return { { label = "Fork Count", haveOutput = "ForkCountMax", { format = "{output:ForkCountString}", { modName = { "CannotFork", "ForkCountMax" }, cfg = "skill" }, }, }, { label = "Max Chain Count", haveOutput = "ChainMax", { format = "{output:ChainMaxString}", { modName = { "CannotChain", "ChainCountMax", "ChainChance", "NoAdditionalChains" }, cfg = "skill" }, }, }, { label = "Terrain Chain", haveOutput = "TerrainChain", { format = "{output:TerrainChain}%", { modName = { "TerrainChainChance", "NoAdditionalChains" }, cfg = "skill" }, }, }, - { label = "Split Count", haveOutput = "SplitCountString", { format = "{output:SplitCountString}", + { label = "Split Count", haveOutput = "SplitCountString", { format = "{output:SplitCountString}", { label = "Player modifiers", modName = { "CannotSplit", "SplitCount", "AdditionalProjectilesAddSplitsInstead", "AdditionalChainsAddSplitsInstead" }, cfg = "skill" }, - { label = "Enemy modifiers", modName = { "SelfSplitCount" }, enemy = true, cfg = "skill" }, + { label = "Enemy modifiers", modName = { "SelfSplitCount" }, enemy = true, cfg = "skill" }, }, }, { label = "Proj. Speed Mod", flag = "projectile", { format = "x {2:output:ProjectileSpeedMod}", { breakdown = "ProjectileSpeedMod" }, @@ -794,7 +797,7 @@ return { { breakdown = "CurseEffectMod" }, { modName = "CurseEffect", cfg = "skill" }, }, }, - { label = "Curse Delay", haveOutput = "CurseDelayBase", { format = "{3:output:CurseDelay}s", + { label = "Curse Delay", haveOutput = "CurseDelayBase", { format = "{3:output:CurseDelay}s", { breakdown = "CurseDelay" }, { modName = { "CurseDelay" }, cfg = "skill" }, { modName = { "CurseActivation" }, cfg = "skill" }, @@ -842,8 +845,8 @@ return { { label = "Mana Leech/Flame", haveOutput = "BreachFlameManaLeech", { format = "{0:output:BreachFlameManaLeech}%", { breakdown = "BreachFlameManaLeech" }, }, }, - { label = "Area of Effect Mod", haveOutput = "AreaOfEffectMod", { format = "x {2:output:AreaOfEffectMod}", - { breakdown = "AreaOfEffectMod" }, + { label = "Area of Effect Mod", haveOutput = "AreaOfEffectMod", { format = "x {2:output:AreaOfEffectMod}", + { breakdown = "AreaOfEffectMod" }, { modName = "AreaOfEffect", cfg = "skill" }, }, }, { label = "Radius", haveOutput = "AreaOfEffectRadius", { format = "{1:output:AreaOfEffectRadiusMetres}m", { breakdown = "AreaOfEffectRadius" }, }, }, @@ -857,7 +860,7 @@ return { }, }, { label = "Weapon Range", haveOutput = "WeaponRange", { format = "{1:output:WeaponRangeMetre}m", { breakdown = "WeaponRange" }, }, }, { label = "Strike Targets", haveOutput = "StrikeTargets", { format = "{1:output:StrikeTargets}", - { breakdown = "StrikeTargets" }, + { breakdown = "StrikeTargets" }, { modName = "AdditionalStrikeTarget", cfg = "skill" } }, }, { label = "Attachment Range", flag = "brand", { format = "{1:output:BrandAttachmentRangeMetre}m", @@ -873,7 +876,7 @@ return { }, }, { label = "Wave Pulse Rate", haveOutput = "WavePulseRate", { format = "{2:output:WavePulseRate}/s", { breakdown = "WavePulseRate" }, { modName = { "TrapThrowingSpeed", "SeismicPulseFrequency" }, cfg = "skill" }, }, }, { label = "Pulses Per Trap", haveOutput = "PulsesPerTrap", { format = "{0:output:PulsesPerTrap}", { breakdown = "PulsesPerTrap" }, }, }, - { label = "Small Explosions", haveOutput = "SmallExplosionsPerTrap", { format = "{0:output:SmallExplosionsPerTrap}", + { label = "Small Explosions", haveOutput = "SmallExplosionsPerTrap", { format = "{0:output:SmallExplosionsPerTrap}", { label = "Small Explosions", modName = "SmallExplosions", cfg = "skill" }, }, }, { label = "Normal Hits/Cast", haveOutput = "NormalHitsPerCast", { format = "{3:output:NormalHitsPerCast}", { breakdown = "NormalHitsPerCast" }, }, }, @@ -893,9 +896,9 @@ return { { label = "Area of Effect modifiers", modName = "TrapTriggerAreaOfEffect", cfg = "skill" }, }, }, -- Seal (Unleash) - { label = "Seal Gain Rate", haveOutput = "SealMax", { format = "{2:output:SealCooldown}s", + { label = "Seal Gain Rate", haveOutput = "SealMax", { format = "{2:output:SealCooldown}s", { breakdown = "SealGainTime" }, - { modName = "SealGainFrequency", cfg = "skill" }, + { modName = "SealGainFrequency", cfg = "skill" }, }, }, -- Parry { label = "Parry Effect Mod", haveOutput = "ParryDebuffMagnitudeMod", { format = "x {2:output:ParryDebuffMagnitudeMod}", @@ -903,12 +906,12 @@ return { { label = "Parry Magnitude", modName = "ParryDebuffMagnitude", cfg = "skill" }, { label = "Debuff Effect", modName = "DebuffEffect", cfg = "skill" }, }, }, - { label = "Parry Duration", haveOutput = "ParryDebuffDuration", { format = "{2:output:ParryDebuffDuration}s", + { label = "Parry Duration", haveOutput = "ParryDebuffDuration", { format = "{2:output:ParryDebuffDuration}s", { breakdown = "ParryDebuffDuration" }, { label = "Player modifiers", modName = "ParryDebuffDuration", cfg = "skill" }, - { label = "Enemy modifiers", modName = "BuffExpireFaster", enemy = true }, + { label = "Enemy modifiers", modName = "BuffExpireFaster", enemy = true }, }, }, - { label = "Parry Range", haveOutput = "ParryRangeNonProj", { format = "{1:output:ParryRangeNonProj}m", + { label = "Parry Range", haveOutput = "ParryRangeNonProj", { format = "{1:output:ParryRangeNonProj}m", { breakdown = "ParryRangeNonProj" }, { label = "Range modifiers", modName = "ParryRangeNonProj", cfg = "skill" }, }, }, @@ -918,9 +921,9 @@ return { }, }, -- Mines { label = "Active Mine Limit", flag = "mine", { format = "{0:output:ActiveMineLimit}", { modName = "ActiveMineLimit", cfg = "skill" }, }, }, - { label = "Mine Throw Rate", flag = "mine", { format = "{2:output:MineLayingSpeed}", + { label = "Mine Throw Rate", flag = "mine", { format = "{2:output:MineLayingSpeed}", { breakdown = "MineLayingTime" }, - { modName = "MineLayingSpeed", cfg = "skill" }, + { modName = "MineLayingSpeed", cfg = "skill" }, }, }, { label = "Mine Throw Time", flag = "mine", { format = "{2:output:MineLayingTime}s", { breakdown = "MineThrowingTime" }, }, }, { label = "Avg. Mines per Throw", flag = "mine", { format = "{2:output:MineThrowCount}", { modName = "MineThrowCount", cfg = "skill"}, }, }, @@ -929,44 +932,44 @@ return { { label = "Area of Effect modifiers", modName = "MineDetonationAreaOfEffect", cfg = "skill" }, }, }, { label = "Mine Aura Radius", haveOutput = "MineAuraRadius", { format = "{1:output:MineAuraRadiusMetre}m", { breakdown = "MineAuraRadius" }, }, }, - { label = "Totem Place Time", flag = "totem", notFlag = "triggered", { format = "{2:output:TotemPlacementTime}s", + { label = "Totem Place Time", flag = "totem", notFlag = "triggered", { format = "{2:output:TotemPlacementTime}s", { breakdown = "TotemPlacementTime" }, - { modName = "TotemPlacementSpeed", cfg = "skill" }, + { modName = "TotemPlacementSpeed", cfg = "skill" }, }, }, - { label = "Active Totem Limit", flag = "totem", notFlag = "triggered", { format = "{0:output:ActiveTotemLimit}", + { label = "Active Totem Limit", flag = "totem", notFlag = "triggered", { format = "{0:output:ActiveTotemLimit}", { breakdown = "ActiveTotemLimit" }, - { modName = { "ActiveTotemLimit", "ActiveBallistaLimit" }, cfg = "skill" }, + { modName = { "ActiveTotemLimit", "ActiveBallistaLimit" }, cfg = "skill" }, }, }, { label = "Totem Dur. Mod", flagList = {"duration", "totem"}, { format = "x {4:output:TotemDurationMod}", - { breakdown = "TotemDurationMod" }, - { modName = { "Duration", "PrimaryDuration", "TotemDuration" }, cfg = "skill" }, + { breakdown = "TotemDurationMod" }, + { modName = { "Duration", "PrimaryDuration", "TotemDuration" }, cfg = "skill" }, }, }, { label = "Totem Duration", flagList = {"duration", "totem"}, { format = "{3:output:TotemDuration}s", { breakdown = "TotemDuration" }, }, }, - { label = "Totem Life Mod", flag = "totem", notFlag = "triggered", { format = "x {2:output:TotemLifeMod}", + { label = "Totem Life Mod", flag = "totem", notFlag = "triggered", { format = "x {2:output:TotemLifeMod}", { breakdown = "TotemLifeMod" }, { modName = "TotemLife", cfg = "skill" }, }, }, { label = "Totem Life", flag = "totem", notFlag = "triggered", { format = "{0:output:TotemLife}", { breakdown = "TotemLife" }, }, }, - { label = "Totem ES", haveOutput = "TotemEnergyShield", { format = "{0:output:TotemEnergyShield}", + { label = "Totem ES", haveOutput = "TotemEnergyShield", { format = "{0:output:TotemEnergyShield}", { breakdown = "TotemEnergyShield" }, { modName = "TotemEnergyShield", cfg = "skill" }, }, }, - { label = "Totem Block Chance", haveOutput = "TotemBlockChance", { format = "{0:output:TotemBlockChance}%", + { label = "Totem Block Chance", haveOutput = "TotemBlockChance", { format = "{0:output:TotemBlockChance}%", { breakdown = "TotemBlockChance" }, { modName = "TotemBlockChance", cfg = "skill" }, }, }, - { label = "Totem Armour", haveOutput = "TotemArmour", { format = "{0:output:TotemArmour}", + { label = "Totem Armour", haveOutput = "TotemArmour", { format = "{0:output:TotemArmour}", { breakdown = "TotemArmour" }, { modName = "TotemArmour", cfg = "skill" }, }, }, { label = "Active Brand Limit", flag = "brand", { format = "{0:output:ActiveBrandLimit}", { modName = "ActiveBrandLimit", cfg = "skill" }, }, }, { label = "Totem Fire Res", flag = "totem", notFlag = "triggered",{ format = "{0:output:TotemFireResist}% (+{0:output:TotemFireResistOverCap}%)", - { breakdown = "TotemFireResist" }, + { breakdown = "TotemFireResist" }, { modName = { "TotemFireResistMax", "TotemElementalResistMax", "TotemFireResist", "TotemElementalResist" }, }, }, }, - { label = "Totem Cold Res", flag = "totem", notFlag = "triggered", { format = "{0:output:TotemColdResist}% (+{0:output:TotemColdResistOverCap}%)", + { label = "Totem Cold Res", flag = "totem", notFlag = "triggered", { format = "{0:output:TotemColdResist}% (+{0:output:TotemColdResistOverCap}%)", { breakdown = "TotemColdResist" }, { modName = { "TotemColdResistMax", "TotemElementalResistMax", "TotemColdResist", "TotemElementalResist" }, }, }, }, @@ -976,7 +979,7 @@ return { }, }, { label = "Totem Chaos Res", flag = "totem", notFlag = "triggered", { format = "{0:output:TotemChaosResist}% (+{0:output:TotemChaosResistOverCap}%)", { breakdown = "TotemChaosResist" }, - { modName = { "TotemChaosResistMax", "TotemChaosResist" }, }, + { modName = { "TotemChaosResistMax", "TotemChaosResist" }, }, }, }, { label = "Corpse Level", haveOutput = "CorpseLevel", { format = "{0:output:CorpseLevel}", { breakdown = "CorpseLevel" }, @@ -992,24 +995,24 @@ return { { 1, "HitChance", 1, colorCodes.OFFENCE, {{ defaultCollapsed = false, label = "Accuracy", data = { extra = "{0:output:HitChance}%", flag = "attack", - { label = "MH Accuracy", bgCol = colorCodes.MAINHANDBG, flag = "weapon1Attack", { format = "{0:output:MainHand.Accuracy}", - { breakdown = "MainHand.Accuracy" }, - { modName = "Accuracy", cfg = "weapon1" }, + { label = "MH Accuracy", bgCol = colorCodes.MAINHANDBG, flag = "weapon1Attack", { format = "{0:output:MainHand.Accuracy}", + { breakdown = "MainHand.Accuracy" }, + { modName = "Accuracy", cfg = "weapon1" }, }, }, { label = "MH Chance to Hit", bgCol = colorCodes.MAINHANDBG, flag = "weapon1Attack", { format = "{0:output:MainHand.AccuracyHitChance}%", - { breakdown = "MainHand.AccuracyHitChance" }, + { breakdown = "MainHand.AccuracyHitChance" }, { label = "Enemy Evasion modifiers", modName = { "Evasion", "CannotEvade" }, enemy = true }, { label = "Player modifiers", modName = { "HitChance", "CannotBeEvaded", "IgnoreBlindHitChance" } }, }, }, { label = "MH Chance to Hit", haveOutput = "MainHand.enemyBlockChance", bgCol = colorCodes.MAINHANDBG, flag = "weapon1Attack", { format = "{0:output:MainHand.HitChance}%", - { breakdown = "MainHand.HitChance" }, + { breakdown = "MainHand.HitChance" }, { label = "Enemy Evasion modifiers", modName = { "Evasion", "CannotEvade" }, enemy = true }, { label = "Enemy Block", modName = { "BlockChance" }, enemy = true }, { label = "Block Chance Reduction", cfg = "skill", modName = { "reduceEnemyBlock" } }, { label = "Player modifiers", modName = { "HitChance", "CannotBeEvaded", "IgnoreBlindHitChance" } }, }, }, { label = "OH Accuracy", bgCol = colorCodes.OFFHANDBG, flag = "weapon2Attack", { format = "{0:output:OffHand.Accuracy}", - { breakdown = "OffHand.Accuracy" }, + { breakdown = "OffHand.Accuracy" }, { modName = "Accuracy", cfg = "weapon2" }, }, }, { label = "OH Chance to Hit", bgCol = colorCodes.OFFHANDBG, flag = "weapon2Attack", { format = "{0:output:OffHand.AccuracyHitChance}%", @@ -1033,7 +1036,7 @@ return { { label = "Max Bleed Stacks", { format = "{0:output:BleedStacksMax}", { modName = "BleedStacksMax" } }, }, { label = "Stack Potential", { format = "{2:output:BleedStackPotentialPercent}%", { breakdown = "BleedStackPotential" } }}, { label = "Average Bleed Roll", { format = "{2:output:BleedRollAverage}%", { breakdown = "BleedRollAverage" } }}, - { label = "Chance to Bleed", { format = "{0:output:BleedChance}%", + { label = "Chance to Bleed", { format = "{0:output:BleedChance}%", { breakdown = "MainHand.BleedChance" }, { breakdown = "OffHand.BleedChance" }, { breakdown = "BleedChance" }, @@ -1071,9 +1074,9 @@ return { { breakdown = "MainHand.BleedDPS" }, { breakdown = "OffHand.BleedDPS" }, }, }, - { label = "Bleed Duration", { format = "{2:output:BleedDuration}s", - { breakdown = "BleedDuration" }, - { label = "Player modifiers", modName = { "EnemyBleedDuration", "EnemyAilmentDuration", "DamagingAilmentDuration", "BleedFaster" }, cfg = "bleed" }, + { label = "Bleed Duration", { format = "{2:output:BleedDuration}s", + { breakdown = "BleedDuration" }, + { label = "Player modifiers", modName = { "EnemyBleedDuration", "EnemyAilmentDuration", "DamagingAilmentDuration", "BleedFaster" }, cfg = "bleed" }, { label = "Enemy modifiers", modName = { "SelfBleedDuration", "SelfAilmentDuration", "SelfBleedFaster", "BleedExpireRate" }, enemy = true }, }, }, { label = "Dmg. of all Bleeds", { format = "{1:output:BleedDamage}", @@ -1086,18 +1089,18 @@ return { { 1, "Poison", 1, colorCodes.OFFENCE, {{ defaultCollapsed = false, label = "Poison", data = { extra = "{0:output:PoisonChance}% {1:output:PoisonDPS} {2:output:PoisonDuration}s", flag = "poison", - { label = "Max Poison Stacks", { format = "{1:output:PoisonStacksMax}", + { label = "Max Poison Stacks", { format = "{1:output:PoisonStacksMax}", { modName = "PoisonStacks" }, { label = "Main Hand", flag = "weapon1Attack", modName = "PoisonStacks", cfg = "weapon1" }, { label = "Off Hand", flag = "weapon2Attack", modName = "PoisonStacks", cfg = "weapon2" }, }, }, { label = "Stack Potential", { format = "{2:output:PoisonStackPotentialPercent}%", { breakdown = "PoisonStackPotential" } }}, { label = "Average Poison Roll", { format = "{2:output:PoisonRollAverage}%", { breakdown = "PoisonRollAverage" } }}, - { label = "Chance to Poison", { format = "{0:output:PoisonChance}%", - { breakdown = "MainHand.PoisonChance" }, - { breakdown = "OffHand.PoisonChance" }, - { breakdown = "PoisonChance" }, - { notFlag = "attack", modName = "PoisonChance", modType = "BASE", cfg = "skill" }, + { label = "Chance to Poison", { format = "{0:output:PoisonChance}%", + { breakdown = "MainHand.PoisonChance" }, + { breakdown = "OffHand.PoisonChance" }, + { breakdown = "PoisonChance" }, + { notFlag = "attack", modName = "PoisonChance", modType = "BASE", cfg = "skill" }, { label = "Main Hand", flag = "weapon1Attack", modName = "PoisonChance", cfg = "weapon1" }, { label = "Off Hand", flag = "weapon2Attack", modName = "PoisonChance", cfg = "weapon2" }, { label = "Ailment modifiers", modName = "AilmentChance", cfg = "skill" }, @@ -1118,12 +1121,12 @@ return { { label = "Source Chaos", textSize = 12, notFlag = "attack", haveOutput = "PoisonChaosMax", { format = "{0:output:PoisonChaosMin} to {0:output:PoisonChaosMax}", { breakdown = "PoisonChaos" }, }, }, { label = "MH Source Chaos", bgCol = colorCodes.MAINHANDBG, textSize = 12, flag = "weapon1Attack", haveOutput = "MainHand.PoisonChaosMax", { format = "{0:output:MainHand.PoisonChaosMin} to {0:output:MainHand.PoisonChaosMax}", { breakdown = "MainHand.PoisonChaos" }, }, }, { label = "OH Source Chaos", bgCol = colorCodes.OFFHANDBG, textSize = 12, flag = "weapon2Attack", haveOutput = "OffHand.PoisonChaosMax", { format = "{0:output:OffHand.PoisonChaosMin} to {0:output:OffHand.PoisonChaosMax}", { breakdown = "OffHand.PoisonChaos" }, }, }, - { label = "Effective DPS Mod", flag = "effective", { format = "x {3:output:PoisonEffMult}", - { breakdown = "PoisonEffMult" }, + { label = "Effective DPS Mod", flag = "effective", { format = "x {3:output:PoisonEffMult}", + { breakdown = "PoisonEffMult" }, { label = "Enemy modifiers", modName = { "ChaosResist", "DamageTaken", "DamageTakenOverTime", "ChaosDamageTaken", "ChaosDamageTakenOverTime" }, enemy = true }, }, }, - { label = "Poison DPS", { format = "{1:output:PoisonDPS}", - { breakdown = "PoisonDPS" }, + { label = "Poison DPS", { format = "{1:output:PoisonDPS}", + { breakdown = "PoisonDPS" }, { breakdown = "MainHand.PoisonDPS" }, { breakdown = "OffHand.PoisonDPS" }, }, }, @@ -1134,22 +1137,22 @@ return { { label = "Player modifiers", skillData = "poisonDurationIsSkillDuration", modName = { "EnemyPoisonDuration", "EnemyAilmentDuration", "DamagingAilmentDuration", "PoisonFaster", "Duration" }, cfg = "poison" }, { label = "Enemy modifiers", modName = { "SelfPoisonDuration", "SelfAilmentDuration", "SelfPoisonFaster" }, enemy = true }, }, }, - { label = "Dmg. of all Poisons", { format = "{1:output:PoisonDamage}", - { breakdown = "MainHand.PoisonDamage" }, - { breakdown = "OffHand.PoisonDamage" }, - { breakdown = "PoisonDamage" }, + { label = "Dmg. of all Poisons", { format = "{1:output:PoisonDamage}", + { breakdown = "MainHand.PoisonDamage" }, + { breakdown = "OffHand.PoisonDamage" }, + { breakdown = "PoisonDamage" }, }, }, } } } }, -{ 1, "Ignite", 1, colorCodes.OFFENCE, {{ defaultCollapsed = false, label = "Ignite", data = { +{ 1, "Ignite", 1, colorCodes.OFFENCE, {{ defaultCollapsed = false, label = "Ignite", data = { extra = "{0:output:IgniteChancePerHit}% {1:output:IgniteDPS} {2:output:IgniteDuration}s", flag = "ignite", { label = "Enemy Ail. Thresh.", { format = "{0:output:EnemyAilmentThreshold}", { modName = "EnemyAilmentThreshold" }, }, }, { label = "Max Ignite Stacks", { format = "{1:output:IgniteStacksMax}", { modName = "IgniteStacks" }, }, }, { label = "Stack Potential", { format = "{2:output:IgniteStackPotentialPercent}%", { breakdown = "IgniteStackPotential" } }}, { label = "Average Ignite Roll", { format = "{2:output:IgniteRollAverage}%", { breakdown = "IgniteRollAverage" } }}, - { label = "Chance to Ignite", { format = "{0:output:IgniteChancePerHit}%", - { breakdown = "MainHand.IgniteChance" }, + { label = "Chance to Ignite", { format = "{0:output:IgniteChancePerHit}%", + { breakdown = "MainHand.IgniteChance" }, { breakdown = "OffHand.IgniteChance" }, { breakdown = "IgniteChance" }, { label = "Player modifiers", modName = "EnemyIgniteChance", cfg = "skill" }, @@ -1172,21 +1175,21 @@ return { { label = "Source Chaos", textSize = 12, notFlag = "attack", haveOutput = "IgniteChaosMax", { format = "{0:output:IgniteChaosMin} to {0:output:IgniteChaosMax}", { breakdown = "IgniteChaos" }, }, }, { label = "MH Source Chaos", bgCol = colorCodes.MAINHANDBG, textSize = 12, flag = "weapon1Attack", haveOutput = "MainHand.IgniteChaosMax", { format = "{0:output:MainHand.IgniteChaosMin} to {0:output:MainHand.IgniteChaosMax}", { breakdown = "MainHand.IgniteChaos" }, }, }, { label = "OH Source Chaos", bgCol = colorCodes.OFFHANDBG, textSize = 12, flag = "weapon2Attack", haveOutput = "OffHand.IgniteChaosMax", { format = "{0:output:OffHand.IgniteChaosMin} to {0:output:OffHand.IgniteChaosMax}", { breakdown = "OffHand.IgniteChaos" }, }, }, - { label = "Effective DPS Mod", flag = "effective", notSkillData = "IgniteToChaos", { format = "x {3:output:IgniteEffMult}", - { breakdown = "IgniteEffMult" }, + { label = "Effective DPS Mod", flag = "effective", notSkillData = "IgniteToChaos", { format = "x {3:output:IgniteEffMult}", + { breakdown = "IgniteEffMult" }, { label = "Enemy modifiers", modName = { "FireResist", "ElementalResist", "DamageTaken", "DamageTakenOverTime", "FireDamageTaken", "FireDamageTakenOverTime", "ElementalDamageTaken" }, enemy = true }, }, }, - { label = "Effective DPS Mod", flag = "effective", skillData = "IgniteToChaos", { format = "x {3:output:IgniteEffMult}", - { breakdown = "IgniteEffMult" }, + { label = "Effective DPS Mod", flag = "effective", skillData = "IgniteToChaos", { format = "x {3:output:IgniteEffMult}", + { breakdown = "IgniteEffMult" }, { label = "Enemy modifiers", modName = { "ChaosResist", "DamageTaken", "DamageTakenOverTime", "ChaosDamageTaken", "ChaosDamageTakenOverTime" }, enemy = true }, }, }, - { label = "Ignite DPS", { format = "{1:output:IgniteDPS}", - { breakdown = "IgniteDPS" }, + { label = "Ignite DPS", { format = "{1:output:IgniteDPS}", + { breakdown = "IgniteDPS" }, { breakdown = "MainHand.IgniteDPS" }, { breakdown = "OffHand.IgniteDPS" }, }, }, { label = "Burning Ground", haveOutput = "BurningGroundFromIgnite", { format = "{0:output:BurningGroundDPS}", { breakdown = "BurningGroundDPS" } } }, - { label = "Ignite Duration", { format = "{2:output:IgniteDuration}s", + { label = "Ignite Duration", { format = "{2:output:IgniteDuration}s", { breakdown = "IgniteDuration" }, { label = "Player modifiers", modName = { "EnemyIgniteDuration", "EnemyAilmentDuration", "EnemyElementalAilmentDuration", "DamagingAilmentDuration", "IgniteFaster", "IgniteSlower" }, cfg = "skill" }, { label = "Enemy modifiers", modName = {"SelfIgniteDuration", "SelfAilmentDuration", "SelfElementalAilmentDuration", "SelfIgniteFaster"}, enemy = true }, @@ -1203,127 +1206,127 @@ return { 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 = "Effective DPS Mod", flag = "effective", { format = "x {3:output:DecayEffMult}", + { breakdown = "DecayEffMult" }, { label = "Enemy modifiers", modName = { "ChaosResist", "DamageTaken", "DamageTakenOverTime", "ChaosDamageTaken", "ChaosDamageTakenOverTime" }, enemy = true }, }, }, - { label = "Decay DPS", { format = "{1:output:DecayDPS}", - { breakdown = "DecayDPS" }, + { label = "Decay DPS", { format = "{1:output:DecayDPS}", + { breakdown = "DecayDPS" }, }, }, - { label = "Decay Duration", { format = "{2:output:DecayDuration}s", + { label = "Decay Duration", { format = "{2:output:DecayDuration}s", { breakdown = "DecayDuration" }, }, }, } } } }, { 1, "LeechGain", 1, colorCodes.OFFENCE, {{ defaultCollapsed = false, label = "Leech & Gain on Hit", data = { - { label = "Life Leech Cap", flag = "leechLife", { format = "{1:output:MaxLifeLeechRate}", + { label = "Life Leech Cap", flag = "leechLife", { format = "{1:output:MaxLifeLeechRate}", { breakdown = "MaxLifeLeechRate" }, { modName = "MaxLifeLeechRate" }, }, }, - { label = "Life Leech Rate", flag = "leechLife", notFlag = "showAverage", { format = "{1:output:LifeLeechRate}", - { breakdown = "LifeLeech" }, - { label = "Player modifiers", notFlagList = { "totem", "attack" }, modName = { "DamageLeech", "DamageLifeLeech", "PhysicalDamageLifeLeech", "LightningDamageLifeLeech", "ColdDamageLifeLeech", "FireDamageLifeLeech", "ChaosDamageLifeLeech", "ElementalDamageLifeLeech" }, modType = "BASE", cfg = "skill" }, - { label = "Main Hand", notFlag = "totem", flag = "weapon1Attack", modName = { "DamageLeech", "DamageLifeLeech", "PhysicalDamageLifeLeech", "LightningDamageLifeLeech", "ColdDamageLifeLeech", "FireDamageLifeLeech", "ChaosDamageLifeLeech", "ElementalDamageLifeLeech" }, modType = "BASE", cfg = "weapon1" }, - { label = "Off Hand", notFlag = "totem", flag = "weapon2Attack", modName = { "DamageLeech", "DamageLifeLeech", "PhysicalDamageLifeLeech", "LightningDamageLifeLeech", "ColdDamageLifeLeech", "FireDamageLifeLeech", "ChaosDamageLifeLeech", "ElementalDamageLifeLeech" }, modType = "BASE", cfg = "weapon2" }, + { label = "Life Leech Rate", flag = "leechLife", notFlag = "showAverage", { format = "{1:output:LifeLeechRate}", + { breakdown = "LifeLeech" }, + { label = "Player modifiers", notFlagList = { "totem", "attack" }, modName = { "DamageLeech", "DamageLifeLeech", "PhysicalDamageLifeLeech", "LightningDamageLifeLeech", "ColdDamageLifeLeech", "FireDamageLifeLeech", "ChaosDamageLifeLeech", "ElementalDamageLifeLeech" }, modType = "BASE", cfg = "skill" }, + { label = "Main Hand", notFlag = "totem", flag = "weapon1Attack", modName = { "DamageLeech", "DamageLifeLeech", "PhysicalDamageLifeLeech", "LightningDamageLifeLeech", "ColdDamageLifeLeech", "FireDamageLifeLeech", "ChaosDamageLifeLeech", "ElementalDamageLifeLeech" }, modType = "BASE", cfg = "weapon1" }, + { label = "Off Hand", notFlag = "totem", flag = "weapon2Attack", modName = { "DamageLeech", "DamageLifeLeech", "PhysicalDamageLifeLeech", "LightningDamageLifeLeech", "ColdDamageLifeLeech", "FireDamageLifeLeech", "ChaosDamageLifeLeech", "ElementalDamageLifeLeech" }, modType = "BASE", cfg = "weapon2" }, { label = "Totem modifiers", flag = "totem", modName = { "DamageLifeLeechToPlayer" }, modType = "BASE", cfg = "skill" }, { label = "Enemy modifiers", modName = { "SelfDamageLifeLeech" }, modType = "BASE", enemy = true }, - { label = "Leech Conversion", modName = { "LifeLeechBasedOnPhysicalDamage", "LifeLeechBasedOnColdDamage", "LifeLeechBasedOnFireDamage", "LifeLeechBasedOnLightningDamage", "LifeLeechBasedOnElementalDamage", "LifeLeechBasedOnChaosDamage", "Condition:NoLifeLeechFromPhysicalDamage", "Condition:NoLifeLeechFromColdDamage", "Condition:NoLifeLeechFromFireDamage", "Condition:NoLifeLeechFromLightningDamage", "Condition:NoLifeLeechFromElementalDamage", "Condition:NoLifeLeechFromChaosDamage" }, cfg = "skill" }, + { label = "Leech Conversion", modName = { "LifeLeechBasedOnPhysicalDamage", "LifeLeechBasedOnColdDamage", "LifeLeechBasedOnFireDamage", "LifeLeechBasedOnLightningDamage", "LifeLeechBasedOnElementalDamage", "LifeLeechBasedOnChaosDamage", "Condition:NoLifeLeechFromPhysicalDamage", "Condition:NoLifeLeechFromColdDamage", "Condition:NoLifeLeechFromFireDamage", "Condition:NoLifeLeechFromLightningDamage", "Condition:NoLifeLeechFromElementalDamage", "Condition:NoLifeLeechFromChaosDamage" }, cfg = "skill" }, }, }, - { label = "Life Leech per Hit", flagList = { "leechLife", "showAverage" }, { format = "{1:output:LifeLeechPerHit}", + { label = "Life Leech per Hit", flagList = { "leechLife", "showAverage" }, { format = "{1:output:LifeLeechPerHit}", { breakdown = "LifeLeech" }, - { label = "Player modifiers", notFlagList = { "totem", "attack" }, modName = { "DamageLeech", "DamageLifeLeech", "PhysicalDamageLifeLeech", "LightningDamageLifeLeech", "ColdDamageLifeLeech", "FireDamageLifeLeech", "ChaosDamageLifeLeech", "ElementalDamageLifeLeech" }, modType = "BASE", cfg = "skill" }, - { label = "Main Hand", notFlag = "totem", flag = "weapon1Attack", modName = { "DamageLeech", "DamageLifeLeech", "PhysicalDamageLifeLeech", "LightningDamageLifeLeech", "ColdDamageLifeLeech", "FireDamageLifeLeech", "ChaosDamageLifeLeech", "ElementalDamageLifeLeech" }, modType = "BASE", cfg = "weapon1" }, - { label = "Off Hand", notFlag = "totem", flag = "weapon2Attack", modName = { "DamageLeech", "DamageLifeLeech", "PhysicalDamageLifeLeech", "LightningDamageLifeLeech", "ColdDamageLifeLeech", "FireDamageLifeLeech", "ChaosDamageLifeLeech", "ElementalDamageLifeLeech" }, modType = "BASE", cfg = "weapon2" }, + { label = "Player modifiers", notFlagList = { "totem", "attack" }, modName = { "DamageLeech", "DamageLifeLeech", "PhysicalDamageLifeLeech", "LightningDamageLifeLeech", "ColdDamageLifeLeech", "FireDamageLifeLeech", "ChaosDamageLifeLeech", "ElementalDamageLifeLeech" }, modType = "BASE", cfg = "skill" }, + { label = "Main Hand", notFlag = "totem", flag = "weapon1Attack", modName = { "DamageLeech", "DamageLifeLeech", "PhysicalDamageLifeLeech", "LightningDamageLifeLeech", "ColdDamageLifeLeech", "FireDamageLifeLeech", "ChaosDamageLifeLeech", "ElementalDamageLifeLeech" }, modType = "BASE", cfg = "weapon1" }, + { label = "Off Hand", notFlag = "totem", flag = "weapon2Attack", modName = { "DamageLeech", "DamageLifeLeech", "PhysicalDamageLifeLeech", "LightningDamageLifeLeech", "ColdDamageLifeLeech", "FireDamageLifeLeech", "ChaosDamageLifeLeech", "ElementalDamageLifeLeech" }, modType = "BASE", cfg = "weapon2" }, { label = "Totem modifiers", flag = "totem", modName = { "DamageLifeLeechToPlayer" }, modType = "BASE", cfg = "skill" }, { label = "Enemy modifiers", modName = { "SelfDamageLifeLeech" }, modType = "BASE", enemy = true }, - { label = "Leech Conversion", modName = { "LifeLeechBasedOnPhysicalDamage", "LifeLeechBasedOnColdDamage", "LifeLeechBasedOnFireDamage", "LifeLeechBasedOnLightningDamage", "LifeLeechBasedOnElementalDamage", "LifeLeechBasedOnChaosDamage", "Condition:NoLifeLeechFromPhysicalDamage", "Condition:NoLifeLeechFromColdDamage", "Condition:NoLifeLeechFromFireDamage", "Condition:NoLifeLeechFromLightningDamage", "Condition:NoLifeLeechFromElementalDamage", "Condition:NoLifeLeechFromChaosDamage" }, cfg = "skill" }, + { label = "Leech Conversion", modName = { "LifeLeechBasedOnPhysicalDamage", "LifeLeechBasedOnColdDamage", "LifeLeechBasedOnFireDamage", "LifeLeechBasedOnLightningDamage", "LifeLeechBasedOnElementalDamage", "LifeLeechBasedOnChaosDamage", "Condition:NoLifeLeechFromPhysicalDamage", "Condition:NoLifeLeechFromColdDamage", "Condition:NoLifeLeechFromFireDamage", "Condition:NoLifeLeechFromLightningDamage", "Condition:NoLifeLeechFromElementalDamage", "Condition:NoLifeLeechFromChaosDamage" }, cfg = "skill" }, }, }, - { label = "Life Gain Rate", notFlag = "showAverage", haveOutput = "LifeOnHitRate", { format = "{1:output:LifeOnHitRate}", - { label = "Player modifiers", notFlag = "attack", modName = "LifeOnHit", modType = "BASE", cfg = "skill" }, - { label = "Main Hand", flag = "weapon1Attack", modName = "LifeOnHit", modType = "BASE", cfg = "weapon1" }, - { label = "Off Hand", flag = "weapon2Attack", modName = "LifeOnHit", modType = "BASE", cfg = "weapon2" }, + { label = "Life Gain Rate", notFlag = "showAverage", haveOutput = "LifeOnHitRate", { format = "{1:output:LifeOnHitRate}", + { label = "Player modifiers", notFlag = "attack", modName = "LifeOnHit", modType = "BASE", cfg = "skill" }, + { label = "Main Hand", flag = "weapon1Attack", modName = "LifeOnHit", modType = "BASE", cfg = "weapon1" }, + { label = "Off Hand", flag = "weapon2Attack", modName = "LifeOnHit", modType = "BASE", cfg = "weapon2" }, { label = "Enemy modifiers", modName = { "SelfLifeOnHit" }, modType = "BASE", cfg = "skill", enemy = true }, }, }, - { label = "Life Gain per Hit", flag = "showAverage", haveOutput = "LifeOnHit", { format = "{1:output:LifeOnHit}", - { label = "Player modifiers", notFlag = "attack", modName = "LifeOnHit", modType = "BASE", cfg = "skill" }, - { label = "Main Hand", flag = "weapon1Attack", modName = "LifeOnHit", modType = "BASE", cfg = "weapon1" }, - { label = "Off Hand", flag = "weapon2Attack", modName = "LifeOnHit", modType = "BASE", cfg = "weapon2" }, + { label = "Life Gain per Hit", flag = "showAverage", haveOutput = "LifeOnHit", { format = "{1:output:LifeOnHit}", + { label = "Player modifiers", notFlag = "attack", modName = "LifeOnHit", modType = "BASE", cfg = "skill" }, + { label = "Main Hand", flag = "weapon1Attack", modName = "LifeOnHit", modType = "BASE", cfg = "weapon1" }, + { label = "Off Hand", flag = "weapon2Attack", modName = "LifeOnHit", modType = "BASE", cfg = "weapon2" }, { label = "Enemy modifiers", modName = { "SelfLifeOnHit" }, modType = "BASE", cfg = "skill", enemy = true }, }, }, - { label = "Life Gain on Kill", haveOutput = "LifeOnKill", { format = "{1:output:LifeOnKill}", - {modName = "LifeOnKill"}, + { label = "Life Gain on Kill", haveOutput = "LifeOnKill", { format = "{1:output:LifeOnKill}", + {modName = "LifeOnKill"}, }, }, - { label = "ES Leech Cap", flag = "leechES", { format = "{1:output:MaxEnergyShieldLeechRate}", + { label = "ES Leech Cap", flag = "leechES", { format = "{1:output:MaxEnergyShieldLeechRate}", { breakdown = "MaxEnergyShieldLeechRate" }, { modName = "MaxEnergyShieldLeechRate" }, }, }, - { label = "ES Leech Rate", flag = "leechES", notFlag = "showAverage", { format = "{1:output:EnergyShieldLeechRate}", + { label = "ES Leech Rate", flag = "leechES", notFlag = "showAverage", { format = "{1:output:EnergyShieldLeechRate}", { breakdown = "EnergyShieldLeech" }, - { label = "Player modifiers", notFlagList = { "totem", "attack" }, modName = { "DamageEnergyShieldLeech", "PhysicalDamageEnergyShieldLeech", "LightningDamageEnergyShieldLeech", "ColdDamageEnergyShieldLeech", "FireDamageEnergyShieldLeech", "ChaosDamageEnergyShieldLeech", "ElementalDamageEnergyShieldLeech" }, modType = "BASE", cfg = "skill" }, - { label = "Main Hand", notFlag = "totem", flag = "weapon1Attack", modName = { "DamageEnergyShieldLeech", "PhysicalDamageEnergyShieldLeech", "LightningDamageEnergyShieldLeech", "ColdDamageEnergyShieldLeech", "FireDamageEnergyShieldLeech", "ChaosDamageEnergyShieldLeech", "ElementalDamageEnergyShieldLeech" }, modType = "BASE", cfg = "weapon1" }, - { label = "Off Hand", notFlag = "totem", flag = "weapon2Attack", modName = { "DamageEnergyShieldLeech", "PhysicalDamageEnergyShieldLeech", "LightningDamageEnergyShieldLeech", "ColdDamageEnergyShieldLeech", "FireDamageEnergyShieldLeech", "ChaosDamageEnergyShieldLeech", "ElementalDamageEnergyShieldLeech" }, modType = "BASE", cfg = "weapon2" }, + { label = "Player modifiers", notFlagList = { "totem", "attack" }, modName = { "DamageEnergyShieldLeech", "PhysicalDamageEnergyShieldLeech", "LightningDamageEnergyShieldLeech", "ColdDamageEnergyShieldLeech", "FireDamageEnergyShieldLeech", "ChaosDamageEnergyShieldLeech", "ElementalDamageEnergyShieldLeech" }, modType = "BASE", cfg = "skill" }, + { label = "Main Hand", notFlag = "totem", flag = "weapon1Attack", modName = { "DamageEnergyShieldLeech", "PhysicalDamageEnergyShieldLeech", "LightningDamageEnergyShieldLeech", "ColdDamageEnergyShieldLeech", "FireDamageEnergyShieldLeech", "ChaosDamageEnergyShieldLeech", "ElementalDamageEnergyShieldLeech" }, modType = "BASE", cfg = "weapon1" }, + { label = "Off Hand", notFlag = "totem", flag = "weapon2Attack", modName = { "DamageEnergyShieldLeech", "PhysicalDamageEnergyShieldLeech", "LightningDamageEnergyShieldLeech", "ColdDamageEnergyShieldLeech", "FireDamageEnergyShieldLeech", "ChaosDamageEnergyShieldLeech", "ElementalDamageEnergyShieldLeech" }, modType = "BASE", cfg = "weapon2" }, { label = "Totem modifiers", flag = "totem", modName = { "DamageEnergyShieldLeechToPlayer" }, modType = "BASE", cfg = "skill" }, { label = "Enemy modifiers", modName = { "SelfDamageEnergyShieldLeech" }, modType = "BASE", enemy = true }, - { label = "Leech Conversion", modName = { "EnergyShieldLeechBasedOnPhysicalDamage", "EnergyShieldLeechBasedOnColdDamage", "EnergyShieldLeechBasedOnFireDamage", "EnergyShieldLeechBasedOnLightningDamage", "EnergyShieldLeechBasedOnElementalDamage", "EnergyShieldLeechBasedOnChaosDamage", "Condition:NoEnergyShieldLeechFromPhysicalDamage", "Condition:NoEnergyShieldLeechFromColdDamage", "Condition:NoEnergyShieldLeechFromFireDamage", "Condition:NoEnergyShieldLeechFromLightningDamage", "Condition:NoEnergyShieldLeechFromElementalDamage", "Condition:NoEnergyShieldLeechFromChaosDamage" }, cfg = "skill" }, + { label = "Leech Conversion", modName = { "EnergyShieldLeechBasedOnPhysicalDamage", "EnergyShieldLeechBasedOnColdDamage", "EnergyShieldLeechBasedOnFireDamage", "EnergyShieldLeechBasedOnLightningDamage", "EnergyShieldLeechBasedOnElementalDamage", "EnergyShieldLeechBasedOnChaosDamage", "Condition:NoEnergyShieldLeechFromPhysicalDamage", "Condition:NoEnergyShieldLeechFromColdDamage", "Condition:NoEnergyShieldLeechFromFireDamage", "Condition:NoEnergyShieldLeechFromLightningDamage", "Condition:NoEnergyShieldLeechFromElementalDamage", "Condition:NoEnergyShieldLeechFromChaosDamage" }, cfg = "skill" }, }, }, { label = "ES Leech per Hit", flagList = { "leechES", "showAverage" }, { format = "{1:output:EnergyShieldLeechPerHit}", { breakdown = "EnergyShieldLeech" }, - { label = "Player modifiers", notFlagList = { "totem", "attack" }, modName = { "DamageEnergyShieldLeech", "PhysicalDamageEnergyShieldLeech", "LightningDamageEnergyShieldLeech", "ColdDamageEnergyShieldLeech", "FireDamageEnergyShieldLeech", "ChaosDamageEnergyShieldLeech", "ElementalDamageEnergyShieldLeech" }, modType = "BASE", cfg = "skill" }, - { label = "Main Hand", notFlag = "totem", flag = "weapon1Attack", modName = { "DamageEnergyShieldLeech", "PhysicalDamageEnergyShieldLeech", "LightningDamageEnergyShieldLeech", "ColdDamageEnergyShieldLeech", "FireDamageEnergyShieldLeech", "ChaosDamageEnergyShieldLeech", "ElementalDamageEnergyShieldLeech" }, modType = "BASE", cfg = "weapon1" }, - { label = "Off Hand", notFlag = "totem", flag = "weapon2Attack", modName = { "DamageEnergyShieldLeech", "PhysicalDamageEnergyShieldLeech", "LightningDamageEnergyShieldLeech", "ColdDamageEnergyShieldLeech", "FireDamageEnergyShieldLeech", "ChaosDamageEnergyShieldLeech", "ElementalDamageEnergyShieldLeech" }, modType = "BASE", cfg = "weapon2" }, + { label = "Player modifiers", notFlagList = { "totem", "attack" }, modName = { "DamageEnergyShieldLeech", "PhysicalDamageEnergyShieldLeech", "LightningDamageEnergyShieldLeech", "ColdDamageEnergyShieldLeech", "FireDamageEnergyShieldLeech", "ChaosDamageEnergyShieldLeech", "ElementalDamageEnergyShieldLeech" }, modType = "BASE", cfg = "skill" }, + { label = "Main Hand", notFlag = "totem", flag = "weapon1Attack", modName = { "DamageEnergyShieldLeech", "PhysicalDamageEnergyShieldLeech", "LightningDamageEnergyShieldLeech", "ColdDamageEnergyShieldLeech", "FireDamageEnergyShieldLeech", "ChaosDamageEnergyShieldLeech", "ElementalDamageEnergyShieldLeech" }, modType = "BASE", cfg = "weapon1" }, + { label = "Off Hand", notFlag = "totem", flag = "weapon2Attack", modName = { "DamageEnergyShieldLeech", "PhysicalDamageEnergyShieldLeech", "LightningDamageEnergyShieldLeech", "ColdDamageEnergyShieldLeech", "FireDamageEnergyShieldLeech", "ChaosDamageEnergyShieldLeech", "ElementalDamageEnergyShieldLeech" }, modType = "BASE", cfg = "weapon2" }, { label = "Totem modifiers", flag = "totem", modName = { "DamageEnergyShieldLeechToPlayer" }, modType = "BASE", cfg = "skill" }, { label = "Enemy modifiers", modName = { "SelfDamageEnergyShieldLeech" }, modType = "BASE", enemy = true }, - { label = "Leech Conversion", modName = { "EnergyShieldLeechBasedOnPhysicalDamage", "EnergyShieldLeechBasedOnColdDamage", "EnergyShieldLeechBasedOnFireDamage", "EnergyShieldLeechBasedOnLightningDamage", "EnergyShieldLeechBasedOnElementalDamage", "EnergyShieldLeechBasedOnChaosDamage", "Condition:NoEnergyShieldLeechFromPhysicalDamage", "Condition:NoEnergyShieldLeechFromColdDamage", "Condition:NoEnergyShieldLeechFromFireDamage", "Condition:NoEnergyShieldLeechFromLightningDamage", "Condition:NoEnergyShieldLeechFromElementalDamage", "Condition:NoEnergyShieldLeechFromChaosDamage" }, cfg = "skill" }, + { label = "Leech Conversion", modName = { "EnergyShieldLeechBasedOnPhysicalDamage", "EnergyShieldLeechBasedOnColdDamage", "EnergyShieldLeechBasedOnFireDamage", "EnergyShieldLeechBasedOnLightningDamage", "EnergyShieldLeechBasedOnElementalDamage", "EnergyShieldLeechBasedOnChaosDamage", "Condition:NoEnergyShieldLeechFromPhysicalDamage", "Condition:NoEnergyShieldLeechFromColdDamage", "Condition:NoEnergyShieldLeechFromFireDamage", "Condition:NoEnergyShieldLeechFromLightningDamage", "Condition:NoEnergyShieldLeechFromElementalDamage", "Condition:NoEnergyShieldLeechFromChaosDamage" }, cfg = "skill" }, }, }, - { label = "ES Gain Rate", notFlag = "showAverage", haveOutput = "EnergyShieldOnHitRate", { format = "{1:output:EnergyShieldOnHitRate}", - { label = "Player modifiers", notFlag = "attack", modName = "EnergyShieldOnHit", modType = "BASE", cfg = "skill" }, - { label = "Main Hand", flag = "weapon1Attack", modName = "EnergyShieldOnHit", modType = "BASE", cfg = "weapon1" }, - { label = "Off Hand", flag = "weapon2Attack", modName = "EnergyShieldOnHit", modType = "BASE", cfg = "weapon2" }, + { label = "ES Gain Rate", notFlag = "showAverage", haveOutput = "EnergyShieldOnHitRate", { format = "{1:output:EnergyShieldOnHitRate}", + { label = "Player modifiers", notFlag = "attack", modName = "EnergyShieldOnHit", modType = "BASE", cfg = "skill" }, + { label = "Main Hand", flag = "weapon1Attack", modName = "EnergyShieldOnHit", modType = "BASE", cfg = "weapon1" }, + { label = "Off Hand", flag = "weapon2Attack", modName = "EnergyShieldOnHit", modType = "BASE", cfg = "weapon2" }, { label = "Enemy modifiers", modName = { "SelfEnergyShieldOnHit" }, modType = "BASE", enemy = true }, }, }, - { label = "ES Gain per Hit", flag = "showAverage", haveOutput = "EnergyShieldOnHit", { format = "{1:output:EnergyShieldOnHit}", - { label = "Player modifiers", notFlag = "attack", modName = "EnergyShieldOnHit", modType = "BASE", cfg = "skill" }, - { label = "Main Hand", flag = "weapon1Attack", modName = "EnergyShieldOnHit", modType = "BASE", cfg = "weapon1" }, - { label = "Off Hand", flag = "weapon2Attack", modName = "EnergyShieldOnHit", modType = "BASE", cfg = "weapon2" }, + { label = "ES Gain per Hit", flag = "showAverage", haveOutput = "EnergyShieldOnHit", { format = "{1:output:EnergyShieldOnHit}", + { label = "Player modifiers", notFlag = "attack", modName = "EnergyShieldOnHit", modType = "BASE", cfg = "skill" }, + { label = "Main Hand", flag = "weapon1Attack", modName = "EnergyShieldOnHit", modType = "BASE", cfg = "weapon1" }, + { label = "Off Hand", flag = "weapon2Attack", modName = "EnergyShieldOnHit", modType = "BASE", cfg = "weapon2" }, { label = "Enemy modifiers", modName = { "SelfEnergyShieldOnHit" }, modType = "BASE", cfg = "skill", enemy = true }, }, }, - { label = "ES Gain on Kill", haveOutput = "EnergyShieldOnKill", { format = "{1:output:EnergyShieldOnKill}", - {modName = "EnergyShieldOnKill"}, + { label = "ES Gain on Kill", haveOutput = "EnergyShieldOnKill", { format = "{1:output:EnergyShieldOnKill}", + {modName = "EnergyShieldOnKill"}, }, }, - { label = "Mana Leech Cap", flag = "leechMana", { format = "{1:output:MaxManaLeechRate}", + { label = "Mana Leech Cap", flag = "leechMana", { format = "{1:output:MaxManaLeechRate}", { breakdown = "MaxManaLeechRate" }, { modName = "MaxManaLeechRate" }, }, }, - { label = "Mana Leech Rate", flag = "leechMana", notFlag = "showAverage", { format = "{1:output:ManaLeechRate}", - { breakdown = "ManaLeech" }, - { label = "Player modifiers", notFlag = "attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "skill" }, - { label = "Main Hand", flag = "weapon1Attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "weapon1" }, - { label = "Off Hand", flag = "weapon2Attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "weapon2" }, + { label = "Mana Leech Rate", flag = "leechMana", notFlag = "showAverage", { format = "{1:output:ManaLeechRate}", + { breakdown = "ManaLeech" }, + { label = "Player modifiers", notFlag = "attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "skill" }, + { label = "Main Hand", flag = "weapon1Attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "weapon1" }, + { label = "Off Hand", flag = "weapon2Attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "weapon2" }, { label = "Enemy modifiers", modName = { "SelfDamageManaLeech" }, modType = "BASE", cfg = "skill", enemy = true }, - { label = "Leech Conversion", modName = { "ManaLeechBasedOnPhysicalDamage", "ManaLeechBasedOnColdDamage", "ManaLeechBasedOnFireDamage", "ManaLeechBasedOnLightningDamage", "ManaLeechBasedOnElementalDamage", "ManaLeechBasedOnChaosDamage", "Condition:NoManaLeechFromPhysicalDamage", "Condition:NoManaLeechFromColdDamage", "Condition:NoManaLeechFromFireDamage", "Condition:NoManaLeechFromLightningDamage", "Condition:NoManaLeechFromElementalDamage", "Condition:NoManaLeechFromChaosDamage" }, cfg = "skill" }, + { label = "Leech Conversion", modName = { "ManaLeechBasedOnPhysicalDamage", "ManaLeechBasedOnColdDamage", "ManaLeechBasedOnFireDamage", "ManaLeechBasedOnLightningDamage", "ManaLeechBasedOnElementalDamage", "ManaLeechBasedOnChaosDamage", "Condition:NoManaLeechFromPhysicalDamage", "Condition:NoManaLeechFromColdDamage", "Condition:NoManaLeechFromFireDamage", "Condition:NoManaLeechFromLightningDamage", "Condition:NoManaLeechFromElementalDamage", "Condition:NoManaLeechFromChaosDamage" }, cfg = "skill" }, }, }, - { label = "Mana Leech per Hit", flagList = { "leechMana", "showAverage" }, { format = "{1:output:ManaLeechPerHit}", - { breakdown = "ManaLeech" }, - { label = "Player modifiers", notFlag = "attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "skill" }, - { label = "Main Hand", flag = "weapon1Attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "weapon1" }, - { label = "Off Hand", flag = "weapon2Attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "weapon2" }, + { label = "Mana Leech per Hit", flagList = { "leechMana", "showAverage" }, { format = "{1:output:ManaLeechPerHit}", + { breakdown = "ManaLeech" }, + { label = "Player modifiers", notFlag = "attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "skill" }, + { label = "Main Hand", flag = "weapon1Attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "weapon1" }, + { label = "Off Hand", flag = "weapon2Attack", modName = { "DamageLeech", "DamageManaLeech", "PhysicalDamageManaLeech", "LightningDamageManaLeech", "ColdDamageManaLeech", "FireDamageManaLeech", "ChaosDamageManaLeech", "ElementalDamageManaLeech" }, modType = "BASE", cfg = "weapon2" }, { label = "Enemy modifiers", modName = { "SelfDamageManaLeech" }, modType = "BASE", enemy = true }, - { label = "Leech Conversion", modName = { "ManaLeechBasedOnPhysicalDamage", "ManaLeechBasedOnColdDamage", "ManaLeechBasedOnFireDamage", "ManaLeechBasedOnLightningDamage", "ManaLeechBasedOnElementalDamage", "ManaLeechBasedOnChaosDamage", "Condition:NoManaLeechFromPhysicalDamage", "Condition:NoManaLeechFromColdDamage", "Condition:NoManaLeechFromFireDamage", "Condition:NoManaLeechFromLightningDamage", "Condition:NoManaLeechFromElementalDamage", "Condition:NoManaLeechFromChaosDamage" }, cfg = "skill" }, + { label = "Leech Conversion", modName = { "ManaLeechBasedOnPhysicalDamage", "ManaLeechBasedOnColdDamage", "ManaLeechBasedOnFireDamage", "ManaLeechBasedOnLightningDamage", "ManaLeechBasedOnElementalDamage", "ManaLeechBasedOnChaosDamage", "Condition:NoManaLeechFromPhysicalDamage", "Condition:NoManaLeechFromColdDamage", "Condition:NoManaLeechFromFireDamage", "Condition:NoManaLeechFromLightningDamage", "Condition:NoManaLeechFromElementalDamage", "Condition:NoManaLeechFromChaosDamage" }, cfg = "skill" }, }, }, - { label = "Mana Gain Rate", notFlag = "showAverage", haveOutput = "ManaOnHitRate", { format = "{1:output:ManaOnHitRate}", - { label = "Player modifiers", notFlag = "attack", modName = "ManaOnHit", modType = "BASE", cfg = "skill" }, - { label = "Main Hand", flag = "weapon1Attack", modName = "ManaOnHit", modType = "BASE", cfg = "weapon1" }, - { label = "Off Hand", flag = "weapon2Attack", modName = "ManaOnHit", modType = "BASE", cfg = "weapon2" }, + { label = "Mana Gain Rate", notFlag = "showAverage", haveOutput = "ManaOnHitRate", { format = "{1:output:ManaOnHitRate}", + { label = "Player modifiers", notFlag = "attack", modName = "ManaOnHit", modType = "BASE", cfg = "skill" }, + { label = "Main Hand", flag = "weapon1Attack", modName = "ManaOnHit", modType = "BASE", cfg = "weapon1" }, + { label = "Off Hand", flag = "weapon2Attack", modName = "ManaOnHit", modType = "BASE", cfg = "weapon2" }, { label = "Enemy modifiers", modName = { "SelfManaOnHit" }, modType = "BASE", cfg = "skill", enemy = true }, }, }, { label = "Mana Gain per Hit", flag = "showAverage", haveOutput = "ManaOnHit", { format = "{1:output:ManaOnHit}", - { label = "Player modifiers", notFlag = "attack", modName = "ManaOnHit", modType = "BASE", cfg = "skill" }, - { label = "Main Hand", flag = "weapon1Attack", modName = "ManaOnHit", modType = "BASE", cfg = "weapon1" }, - { label = "Off Hand", flag = "weapon2Attack", modName = "ManaOnHit", modType = "BASE", cfg = "weapon2" }, + { label = "Player modifiers", notFlag = "attack", modName = "ManaOnHit", modType = "BASE", cfg = "skill" }, + { label = "Main Hand", flag = "weapon1Attack", modName = "ManaOnHit", modType = "BASE", cfg = "weapon1" }, + { label = "Off Hand", flag = "weapon2Attack", modName = "ManaOnHit", modType = "BASE", cfg = "weapon2" }, { label = "Enemy modifiers", modName = { "SelfManaOnHit" }, modType = "BASE", cfg = "skill", enemy = true }, }, }, - { label = "Mana Gain on Kill", haveOutput = "ManaOnKill", { format = "{1:output:ManaOnKill}", - {modName = "ManaOnKill"}, + { label = "Mana Gain on Kill", haveOutput = "ManaOnKill", { format = "{1:output:ManaOnKill}", + {modName = "ManaOnKill"}, }, }, } } } }, @@ -1346,7 +1349,7 @@ return { }, }, { label = "Scorch Duration", bgCol = colorCodes.SCORCHBG, flag = "scorch", { format = "{2:output:ScorchDuration}s", { breakdown = "MainHand.ScorchDuration" }, - { breakdown = "OffHand.ScorchDuration" }, + { breakdown = "OffHand.ScorchDuration" }, { breakdown = "ScorchDuration" }, { label = "Player modifiers", modName = { "EnemyScorchDuration", "EnemyAilmentDuration", "EnemyElementalAilmentDuration" }, cfg = "skill" }, { label = "Enemy modifiers", modName = { "SelfScorchDuration", "SelfAilmentDuration", "SelfElementalAilmentDuration", "BuffExpireFaster" }, enemy = true }, @@ -1490,22 +1493,22 @@ return { { label = "Guaranteed Saps", modName = "SapOverride", modType = "BASE" }, }, }, { label = "Freeze Buildup", haveOutput = "FreezeBuildupAvg", { format = "{1:output:FreezeBuildupAvg}%", - { breakdown = "FreezeBuildup" }, + { breakdown = "FreezeBuildup" }, { label = "Player modifiers", modName = { "EnemyFreezeBuildup", "EnemyImmobilisationBuildup" }, cfg = "skill" }, { label = "Enemy modifiers", modName = { "PoiseThreshold", "EnemyFreezeThreshold", "FreezeBuildup", "ImmobilisationBuildup", "EnemyAilmentThreshold" }, enemy = true }, }, }, { label = "Electrocute Buildup", haveOutput = "ElectrocuteBuildupAvg", { format = "{1:output:ElectrocuteBuildupAvg}%", - { breakdown = "ElectrocuteBuildup" }, + { breakdown = "ElectrocuteBuildup" }, { label = "Player modifiers", modName = { "EnemyElectrocuteBuildup", "EnemyImmobilisationBuildup" }, cfg = "skill" }, { label = "Enemy modifiers", modName = { "PoiseThreshold", "EnemyElectrocuteThreshold", "ElectrocuteBuildup", "ImmobilisationBuildup", "EnemyAilmentThreshold" }, enemy = true }, }, }, { label = "Stun Buildup", haveOutput = "HeavyStunBuildupAvg", { format = "{1:output:HeavyStunBuildupAvg}%", - { breakdown = "HeavyStunBuildup" }, + { breakdown = "HeavyStunBuildup" }, { label = "Player modifiers", modName = { "EnemyHeavyStunBuildup", "EnemyImmobilisationBuildup", "PhysicalHeavyStunBuildup" }, cfg = "skill" }, { label = "Enemy modifiers", modName = { "PoiseThreshold", "EnemyHeavyStunThreshold", "EnemyStunThreshold", "HeavyStunBuildup", "ImmobilisationBuildup", "StunBuildup" }, enemy = true }, }, }, { label = "Pin Buildup", haveOutput = "PinBuildupAvg", { format = "{1:output:PinBuildupAvg}%", - { breakdown = "PinBuildup" }, + { breakdown = "PinBuildup" }, { label = "Player modifiers", modName = { "EnemyPinBuildup", "EnemyImmobilisationBuildup" }, cfg = "skill" }, { label = "Enemy modifiers", modName = { "PoiseThreshold", "EnemyPinThreshold", "PinBuildup", "ImmobilisationBuildup" }, enemy = true }, }, }, @@ -1513,32 +1516,32 @@ return { } }, { 1, "MiscEffects", 1, colorCodes.OFFENCE, {{ defaultCollapsed = false, label = "Other Effects", data = { { label = "Stun Threshold", flag = "hit", notFlag = "attack", { format = "x {2:output:EnemyStunThresholdMod}", { modName = "EnemyStunThreshold", cfg = "skill" }, }, }, - { label = "Stun Duration", flag = "hit", notFlag = "attack", { format = "{2:output:EnemyStunDuration}s", - { breakdown = "EnemyStunDuration" }, + { label = "Stun Duration", flag = "hit", notFlag = "attack", { format = "{2:output:EnemyStunDuration}s", + { breakdown = "EnemyStunDuration" }, { label = "Player modifiers", modName = { "EnemyStunDuration", "EnemyStunDurationOnCrit", "DoubleEnemyStunDurationChance" }, cfg = "skill" }, { label = "Enemy modifiers", modName = { "StunRecovery", "SelfDoubleStunDurationChance" }, enemy = true }, }, }, { label = "MH Stun Threshold", bgCol = colorCodes.MAINHANDBG, flagList = {"hit","weapon1Attack"}, { format = "x {2:output:MainHand.EnemyStunThresholdMod}", { modName = "EnemyStunThreshold", cfg = "weapon1" }, }, }, - { label = "MH Stun Duration", bgCol = colorCodes.MAINHANDBG, flagList = {"hit","weapon1Attack"}, { format = "{2:output:MainHand.EnemyStunDuration}s", - { breakdown = "MainHand.EnemyStunDuration" }, + { label = "MH Stun Duration", bgCol = colorCodes.MAINHANDBG, flagList = {"hit","weapon1Attack"}, { format = "{2:output:MainHand.EnemyStunDuration}s", + { breakdown = "MainHand.EnemyStunDuration" }, { label = "Player modifiers", modName = { "EnemyStunDuration", "EnemyStunDurationOnCrit", "DoubleEnemyStunDurationChance" }, cfg = "weapon1" }, { label = "Enemy modifiers", modName = { "StunRecovery", "SelfDoubleStunDurationChance" }, enemy = true }, }, }, { label = "OH Stun Threshold", bgCol = colorCodes.OFFHANDBG, flagList = {"hit","weapon2Attack"}, { format = "x {2:output:OffHand.EnemyStunThresholdMod}", { modName = "EnemyStunThreshold", cfg = "weapon2" }, }, }, - { label = "OH Stun Duration", bgCol = colorCodes.OFFHANDBG, flagList = {"hit","weapon2Attack"}, { format = "{2:output:OffHand.EnemyStunDuration}s", - { breakdown = "OffHand.EnemyStunDuration" }, + { label = "OH Stun Duration", bgCol = colorCodes.OFFHANDBG, flagList = {"hit","weapon2Attack"}, { format = "{2:output:OffHand.EnemyStunDuration}s", + { breakdown = "OffHand.EnemyStunDuration" }, { label = "Player modifiers", modName = { "EnemyStunDuration", "EnemyStunDurationOnCrit", "DoubleEnemyStunDurationChance" }, cfg = "weapon2" }, { label = "Enemy modifiers", modName = { "StunRecovery", "SelfDoubleStunDurationChance" }, enemy = true }, }, }, - { label = "Knockback Chance", haveOutput = "KnockbackChance", { format = "{0:output:KnockbackChance}%", - { label = "Player modifiers", modName = "EnemyKnockbackChance", cfg = "skill" }, + { label = "Knockback Chance", haveOutput = "KnockbackChance", { format = "{0:output:KnockbackChance}%", + { label = "Player modifiers", modName = "EnemyKnockbackChance", cfg = "skill" }, { label = "Enemy modifiers", modName = "SelfKnockbackChance", enemy = true }, }, }, - { label = "Knockback Dist.", haveOutput = "KnockbackChance", { format = "{0:output:KnockbackDistance}", + { label = "Knockback Dist.", haveOutput = "KnockbackChance", { format = "{0:output:KnockbackDistance}", { breakdown = "KnockbackDistance" }, - { modName = "EnemyKnockbackDistance", cfg = "skill" }, + { modName = "EnemyKnockbackDistance", cfg = "skill" }, }, }, - { label = "MH K.B. Chance", bgCol = colorCodes.MAINHANDBG, haveOutput = "MainHand.KnockbackChance", { format = "{0:output:MainHand.KnockbackChance}%", + { label = "MH K.B. Chance", bgCol = colorCodes.MAINHANDBG, haveOutput = "MainHand.KnockbackChance", { format = "{0:output:MainHand.KnockbackChance}%", { label = "Player modifiers", modName = "EnemyKnockbackChance", cfg = "weapon1" }, { label = "Enemy modifiers", modName = "SelfKnockbackChance", enemy = true }, }, }, @@ -1546,7 +1549,7 @@ return { { breakdown = "MainHand.KnockbackDistance" }, { modName = "EnemyKnockbackDistance", cfg = "weapon1" }, }, }, - { label = "OH K.B. Chance", bgCol = colorCodes.OFFHANDBG, haveOutput = "OffHand.KnockbackChance", { format = "{0:output:OffHand.KnockbackChance}%", + { label = "OH K.B. Chance", bgCol = colorCodes.OFFHANDBG, haveOutput = "OffHand.KnockbackChance", { format = "{0:output:OffHand.KnockbackChance}%", { label = "Player modifiers", modName = "EnemyKnockbackChance", cfg = "weapon2" }, { label = "Enemy modifiers", modName = "SelfKnockbackChance", enemy = true }, }, }, @@ -1602,51 +1605,51 @@ return { { label = "Reserved", { format = "{0:output:LifeReserved} ({0:output:LifeReservedPercent}%)", { breakdown = "LifeReserved" }, { modName = "ExtraLifeReserved" }, }, }, { label = "Unreserved", { format = "{0:output:LifeUnreserved} ({0:output:LifeUnreservedPercent}%)" }, }, { label = "Total Recoverable", haveOutput = "CappingLife", { format = "{0:output:LifeRecoverable}", { breakdown = "LifeUnreserved" }, }, }, - { label = "Recharge Rate", haveOutput = "EnergyShieldRechargeAppliesToLife", { format = "{1:output:LifeRecharge}", + { label = "Recharge Rate", haveOutput = "EnergyShieldRechargeAppliesToLife", { format = "{1:output:LifeRecharge}", { breakdown = "LifeRecharge" }, { modName = { "EnergyShieldRecharge", "LifeRecoveryRate", "EnergyShieldRechargeAppliesToLife" }, }, }, }, - { label = "Recharge Delay", haveOutput = "EnergyShieldRechargeAppliesToLife", { format = "{2:output:EnergyShieldRechargeDelay}s", + { label = "Recharge Delay", haveOutput = "EnergyShieldRechargeAppliesToLife", { format = "{2:output:EnergyShieldRechargeDelay}s", { breakdown = "EnergyShieldRechargeDelay" }, { modName = "EnergyShieldRechargeFaster" }, }, }, { label = "Recovery", { format = "{1:output:LifeRegenRecovery} ({1:output:LifeRegenPercent}%)", - { breakdown = "LifeRegenRecovery" }, + { breakdown = "LifeRegenRecovery" }, { label = "Sources", modName = { "LifeRegen", "LifeRegenPercent", "LifeDegen", "LifeDegenPercent", "LifeRecovery" }, modType = "BASE" }, { label = "Increased Life Recovery", modName = { "LifeRegen", "LifeRecoveryRate" }, modType = "INC" }, { label = "More Life Recovery", modName = { "LifeRegen", "LifeRecoveryRate" }, modType = "MORE" }, }, }, - { label = "Recoup", haveOutput = "LifeRecoup", { format = "{1:output:LifeRecoup}%", { breakdown = "LifeRecoup" }, + { label = "Recoup", haveOutput = "LifeRecoup", { format = "{1:output:LifeRecoup}%", { breakdown = "LifeRecoup" }, { label = "Sources", modName = "LifeRecoup" }, { label = "Recovery modifiers", modName = "LifeRecoveryRate" }, { label = "FasterRecoup", modName = { "3SecondRecoup", "3SecondLifeRecoup" } }, }, }, - { label = "Phys Recoup", haveOutput = "PhysicalLifeRecoup", { format = "{1:output:PhysicalLifeRecoup}%", { breakdown = "PhysicalLifeRecoup" }, + { label = "Phys Recoup", haveOutput = "PhysicalLifeRecoup", { format = "{1:output:PhysicalLifeRecoup}%", { breakdown = "PhysicalLifeRecoup" }, { label = "Sources", modName = "PhysicalLifeRecoup" }, { label = "Recovery modifiers", modName = "LifeRecoveryRate" }, { label = "FasterRecoup", modName = { "3SecondRecoup", "3SecondLifeRecoup" } }, }, }, - { label = "Light Recoup", haveOutput = "LightningLifeRecoup", { format = "{1:output:LightningLifeRecoup}%", { breakdown = "LightningLifeRecoup" }, + { label = "Light Recoup", haveOutput = "LightningLifeRecoup", { format = "{1:output:LightningLifeRecoup}%", { breakdown = "LightningLifeRecoup" }, { label = "Sources", modName = "LightningLifeRecoup" }, { label = "Recovery modifiers", modName = "LifeRecoveryRate" }, { label = "FasterRecoup", modName = { "3SecondRecoup", "3SecondLifeRecoup" } }, }, }, - { label = "Cold Recoup", haveOutput = "ColdLifeRecoup", { format = "{1:output:ColdLifeRecoup}%", { breakdown = "ColdLifeRecoup" }, + { label = "Cold Recoup", haveOutput = "ColdLifeRecoup", { format = "{1:output:ColdLifeRecoup}%", { breakdown = "ColdLifeRecoup" }, { label = "Sources", modName = "ColdLifeRecoup" }, { label = "Recovery modifiers", modName = "LifeRecoveryRate" }, { label = "FasterRecoup", modName = { "3SecondRecoup", "3SecondLifeRecoup" } }, }, }, - { label = "Fire Recoup", haveOutput = "FireLifeRecoup", { format = "{1:output:FireLifeRecoup}%", { breakdown = "FireLifeRecoup" }, + { label = "Fire Recoup", haveOutput = "FireLifeRecoup", { format = "{1:output:FireLifeRecoup}%", { breakdown = "FireLifeRecoup" }, { label = "Sources", modName = "FireLifeRecoup" }, { label = "Recovery modifiers", modName = "LifeRecoveryRate" }, { label = "FasterRecoup", modName = { "3SecondRecoup", "3SecondLifeRecoup" } }, }, }, - { label = "Chaos Recoup", haveOutput = "ChaosLifeRecoup", { format = "{1:output:ChaosLifeRecoup}%", { breakdown = "ChaosLifeRecoup" }, + { label = "Chaos Recoup", haveOutput = "ChaosLifeRecoup", { format = "{1:output:ChaosLifeRecoup}%", { breakdown = "ChaosLifeRecoup" }, { label = "Sources", modName = "ChaosLifeRecoup" }, { label = "Recovery modifiers", modName = "LifeRecoveryRate" }, { label = "FasterRecoup", modName = { "3SecondRecoup", "3SecondLifeRecoup" } }, }, }, - { label = "Dmg. Mit. Regen", haveOutput = "PhysicalDamageMitigatedLifePseudoRecoup", { format = "{1:output:PhysicalDamageMitigatedLifePseudoRecoup}%", { breakdown = "PhysicalDamageMitigatedLifePseudoRecoup" }, + { label = "Dmg. Mit. Regen", haveOutput = "PhysicalDamageMitigatedLifePseudoRecoup", { format = "{1:output:PhysicalDamageMitigatedLifePseudoRecoup}%", { breakdown = "PhysicalDamageMitigatedLifePseudoRecoup" }, { label = "Sources", modName = "PhysicalDamageMitigatedLifePseudoRecoup" }, { label = "Increased Life Regeneration Rate", modName = { "LifeRegen" }, modType = "INC" }, { label = "More Life Regeneration Rate", modName = { "LifeRegen" }, modType = "MORE" }, @@ -1665,12 +1668,12 @@ return { { label = "Reserved", { format = "{0:output:ManaReserved} ({0:output:ManaReservedPercent}%)", { breakdown = "ManaReserved" }, }, }, { label = "Unreserved", { format = "{0:output:ManaUnreserved} ({0:output:ManaUnreservedPercent}%)" }, }, { label = "Recovery", { format = "{1:output:ManaRegenRecovery} ({1:output:ManaRegenPercent}%)", - { breakdown = "ManaRegenRecovery" }, + { breakdown = "ManaRegenRecovery" }, { label = "Sources", modName = { "ManaRegen", "ManaRegenPercent", "ManaDegen", "ManaDegenPercent", "ManaRecovery" }, modType = "BASE" }, { label = "Increased Mana Recovery", modName = { "ManaRegen", "ManaRecoveryRate" }, modType = "INC" }, { label = "More Mana Recovery", modName = { "ManaRegen", "ManaRecoveryRate" }, modType = "MORE" }, }, }, - { label = "Recoup", haveOutput = "ManaRecoup", { format = "{1:output:ManaRecoup}%", { breakdown = "ManaRecoup" }, + { label = "Recoup", haveOutput = "ManaRecoup", { format = "{1:output:ManaRecoup}%", { breakdown = "ManaRecoup" }, { label = "Sources", modName = "ManaRecoup" }, { label = "Recovery modifiers", modName = "ManaRecoveryRate" }, { label = "FasterRecoup", modName = "3SecondRecoup" }, @@ -1699,21 +1702,21 @@ return { { label = "Total More", { format = "{0:mod:1}%", { modName = { "EnergyShield", "Defences" }, modType = "MORE" }, }, }, { label = "Total", { format = "{0:output:EnergyShield}", { breakdown = "EnergyShield" }, }, }, { label = "Total Recoverable", haveOutput = "CappingES", { format = "{0:output:EnergyShieldRecoveryCap}", { breakdown = "EnergyShield" }, }, }, - { label = "Recharge Rate", haveOutput = "EnergyShieldRechargeAppliesToEnergyShield", { format = "{1:output:EnergyShieldRecharge}", + { label = "Recharge Rate", haveOutput = "EnergyShieldRechargeAppliesToEnergyShield", { format = "{1:output:EnergyShieldRecharge}", { breakdown = "EnergyShieldRecharge" }, { modName = { "EnergyShieldRecharge", "EnergyShieldRecoveryRate", "NoEnergyShieldRecharge", "CannotGainEnergyShield" }, }, }, }, - { label = "Recharge Delay", haveOutput = "EnergyShieldRechargeAppliesToEnergyShield", { format = "{2:output:EnergyShieldRechargeDelay}s", + { label = "Recharge Delay", haveOutput = "EnergyShieldRechargeAppliesToEnergyShield", { format = "{2:output:EnergyShieldRechargeDelay}s", { breakdown = "EnergyShieldRechargeDelay" }, { modName = "EnergyShieldRechargeFaster" }, }, }, { label = "Recovery", { format = "{1:output:EnergyShieldRegenRecovery} ({1:output:EnergyShieldRegenPercent}%)", - { breakdown = "EnergyShieldRegenRecovery" }, + { breakdown = "EnergyShieldRegenRecovery" }, { label = "Sources", modName = { "EnergyShieldRegen", "EnergyShieldRegenPercent", "EnergyShieldDegen", "EnergyShieldDegenPercent", "EnergyShieldRecovery" }, modType = "BASE" }, { label = "Increased Energy Shield Recovery", modName = { "EnergyShieldRegen", "EnergyShieldRecoveryRate" }, modType = "INC" }, { label = "More Energy Shield Recovery", modName = { "EnergyShieldRegen", "EnergyShieldRecoveryRate" }, modType = "MORE" }, }, }, - { label = "Recoup", haveOutput = "EnergyShieldRecoup", { format = "{1:output:EnergyShieldRecoup}%", { breakdown = "EnergyShieldRecoup" }, + { label = "Recoup", haveOutput = "EnergyShieldRecoup", { format = "{1:output:EnergyShieldRecoup}%", { breakdown = "EnergyShieldRecoup" }, { label = "Sources", modName = "EnergyShieldRecoup" }, { label = "Recovery modifiers", modName = "EnergyShieldRecoveryRate" }, { label = "FasterRecoup", modName = "3SecondRecoup" }, @@ -1756,6 +1759,22 @@ return { }, }, } } } }, +{ 1, "Ward", 2, colorCodes.WARD, {{ defaultCollapsed = false, label = "Runic Ward", data = { + extra = "{0:output:Ward}", + { label = "Base from Armours", { format = "{0:output:Gear:Ward}", { breakdown = "Ward", gearOnly = true }, }, }, + { label = "Global Base", { format = "{0:mod:1}", { modName = "Ward", modType = "BASE" }, }, }, + { label = "Inc. from Tree", { format = "{0:mod:1}%", { modName = "Ward", modType = "INC", modSource = "Tree" }, }, }, + { label = "Total Increased", { format = "{0:mod:1}%", { modName = { "Ward", "Defences" }, modType = "INC" }, }, }, + { label = "Total More", { format = "{0:mod:1}%", { modName = { "Ward", "Defences" }, modType = "MORE" }, }, }, + { label = "Total", { format = "{0:output:Ward}", { breakdown = "Ward" }, }, }, + { label = "Recovery", { format = "{1:output:WardRegenRecovery} ({1:output:WardRegenPercent}%)", + { breakdown = "WardRegenRecovery" }, + { label = "Sources", modName = { "WardRegen", "WardRegenPercent", "WardDegen", "WardDegenPercent", "WardRecovery" }, modType = "BASE" }, + { label = "Increased Runic Ward Recovery", modName = { "WardRegen", "WardRecoveryRate" }, modType = "INC" }, + { label = "More Runic Ward Recovery", modName = { "WardRegen", "WardRecoveryRate" }, modType = "MORE" }, + }, }, +} } +} }, -- secondary defenses { 1, "Resist", 3, colorCodes.DEFENCE, {{ defaultCollapsed = false, label = "Resists", data = { extra = colorCodes.FIRE.."{0:output:FireResist}+{0:output:FireResistOverCap}^7/"..colorCodes.COLD.."{0:output:ColdResist}+{0:output:ColdResistOverCap}^7/"..colorCodes.LIGHTNING.."{0:output:LightningResist}+{0:output:LightningResistOverCap}", @@ -1816,7 +1835,7 @@ return { { label = "Total Increased", { format = "{0:mod:1}%", { modName = { "Evasion", "ArmourAndEvasion", "Defences" }, modType = "INC" }, }, }, { label = "Total More", { format = "{0:mod:1}%", { modName = { "Evasion", "ArmourAndEvasion", "Defences" }, modType = "MORE" }, }, }, { label = "Total", { format = "{0:output:Evasion}", { breakdown = "Evasion" }, }, }, - { label = "Evade Chance", haveOutput = "noSplitEvade", { format = "{0:output:EvadeChance}%", + { label = "Evade Chance", haveOutput = "noSplitEvade", { format = "{0:output:EvadeChance}%", { breakdown = "EvadeChance" }, { label = "Player modifiers", modName = { "CannotEvade", "EvadeChance", "MeleeEvadeChance", "ProjectileEvadeChance", "SpellEvadeChance", "SpellProjectileEvadeChance" } }, { label = "Enemy modifiers", modName = { "Accuracy", "HitChance" }, enemy = true }, @@ -1856,14 +1875,15 @@ return { extra = "{0:output:EffectiveBlockChance}%", { label = "Block Chance", { format = "{0:output:BlockChance}% (+{0:output:BlockChanceOverCap}%)", { breakdown = "BlockChance" }, - { modName = { "BlockChance", "ReplaceShieldBlock", "BlockChanceMax" } }, + { modName = { "BlockChance", "ReplaceShieldBlock", "BlockChanceMax" } }, }, }, - { label = "Taken From Block", haveOutput = "ShowBlockEffect", { format = "{0:output:DamageTakenOnBlock}%", - { breakdown = "BlockEffect" }, + { label = "Taken From Block", haveOutput = "ShowBlockEffect", { format = "{0:output:DamageTakenOnBlock}%", + { breakdown = "BlockEffect" }, { modName = { "BlockEffect" }, }, }, }, { label = "Life on Block", haveOutput = "LifeOnBlock", { format = "{0:output:LifeOnBlock}", { modName = "LifeOnBlock" }, }, }, { label = "Mana on Block", haveOutput = "ManaOnBlock", { format = "{0:output:ManaOnBlock}", { modName = "ManaOnBlock" }, }, }, + { label = "Runic Ward on Block", haveOutput = "WardOnBlock", { format = "{0:output:WardOnBlock}", { modName = "WardOnBlock" }, }, }, { label = "ES on Block", haveOutput = "EnergyShieldOnBlock", { format = "{0:output:EnergyShieldOnBlock}", { modName = "EnergyShieldOnBlock" }, }, }, { label = "ES on Spell Block", haveOutput = "EnergyShieldOnSpellBlock", { format = "{0:output:EnergyShieldOnSpellBlock}", { modName = "EnergyShieldOnSpellBlock" }, }, }, } }, { defaultCollapsed = false, label = "Dodge", data = { @@ -2004,13 +2024,13 @@ return { { label = "Stun Threshold", { format = "{0:output:StunThreshold}", { breakdown = "StunThreshold" }, { modName = { "StunThreshold", "StunThresholdManaPercent", "StunThresholdEnergyShieldPercent" } }, }, }, { label = "Stun Chance", { format = "{0:output:SelfStunChance}%", { breakdown = "SelfStunChance" }, }, }, { label = "Interrupt Avoid Ch.", haveOutput = "InterruptStunAvoidChance", { format = "{0:output:InterruptStunAvoidChance}%", { modName = "AvoidInterruptStun" }, }, }, - { label = "Stun Duration", { format = "{2:output:StunDuration}s", + { label = "Stun Duration", { format = "{2:output:StunDuration}s", { breakdown = "StunDuration" }, { modName = { "StunDuration", "StunRecovery" } }, }, }, - { label = "Block Stun Duration", { format = "{2:output:BlockDuration}s", + { label = "Block Stun Duration", { format = "{2:output:BlockDuration}s", { breakdown = "BlockDuration" }, - { modName = { "StunDuration", "StunRecovery", "BlockRecovery" }, }, + { modName = { "StunDuration", "StunRecovery", "BlockRecovery" }, }, }, }, } }, { defaultCollapsed = true, label = "Other Avoidance", data = { { label = "Blind Avoid Ch.", haveOutput = "BlindAvoidChance", { format = "{0:output:BlindAvoidChance}%", { modName = { "AvoidBlind", "BlindImmune" } }, }, }, @@ -2066,8 +2086,8 @@ return { { format = colorCodes.CHAOS.."Chaos:" }, }, { label = "Enemy Damage", - { format = "{2:output:totalEnemyDamage}", - { breakdown = "totalEnemyDamage" }, + { format = "{2:output:totalEnemyDamage}", + { breakdown = "totalEnemyDamage" }, { label = "Enemy modifiers", modName = {"Damage", "CritChance", "CritMultiplier"}, enemy = true }, { label = "Enemy Conversion modifiers", modName = { "PhysicalDamageGainAsLightning", "PhysicalDamageSkillConvertToLightning", "PhysicalDamageConvertToLightning", @@ -2076,8 +2096,8 @@ return { "PhysicalDamageGainAsChaos", "PhysicalDamageSkillConvertToChaos", "PhysicalDamageConvertToChaos" }, enemy = true }, }, - { format = "{2:output:PhysicalEnemyDamage}", - { breakdown = "PhysicalEnemyDamage" }, + { format = "{2:output:PhysicalEnemyDamage}", + { breakdown = "PhysicalEnemyDamage" }, { label = "Enemy modifiers", modName = {"Damage", "PhysicalDamage", "CritChance", "CritMultiplier"}, enemy = true }, { label = "Enemy Conversion modifiers", modName = { "PhysicalDamageGainAsLightning", "PhysicalDamageSkillConvertToLightning", "PhysicalDamageConvertToLightning", @@ -2087,32 +2107,32 @@ return { }, enemy = true }, }, { format = "{2:output:LightningEnemyDamage}", - { breakdown = "LightningEnemyDamage" }, + { breakdown = "LightningEnemyDamage" }, { label = "Enemy modifiers", modName = {"Damage", "LightningDamage", "ElementalDamage", "CritChance", "CritMultiplier"}, enemy = true }, { label = "Enemy Conversion modifiers", modName = {"PhysicalDamageGainAsLightning", "PhysicalDamageSkillConvertToLightning", "PhysicalDamageConvertToLightning"}, enemy = true }, }, { format = "{2:output:ColdEnemyDamage}", - { breakdown = "ColdEnemyDamage" }, + { breakdown = "ColdEnemyDamage" }, { label = "Enemy modifiers", modName = {"Damage", "ColdDamage", "ElementalDamage", "CritChance", "CritMultiplier"}, enemy = true }, { label = "Enemy Conversion modifiers", modName = {"PhysicalDamageGainAsCold", "PhysicalDamageSkillConvertToCold", "PhysicalDamageConvertToCold"}, enemy = true }, }, - { format = "{2:output:FireEnemyDamage}", - { breakdown = "FireEnemyDamage" }, + { format = "{2:output:FireEnemyDamage}", + { breakdown = "FireEnemyDamage" }, { label = "Enemy modifiers", modName = {"Damage", "FireDamage", "ElementalDamage", "CritChance", "CritMultiplier"}, enemy = true }, { label = "Enemy Conversion modifiers", modName = {"PhysicalDamageGainAsFire", "PhysicalDamageSkillConvertToFire", "PhysicalDamageConvertToFire"}, enemy = true }, }, { format = "{2:output:ChaosEnemyDamage}", - { breakdown = "ChaosEnemyDamage" }, + { breakdown = "ChaosEnemyDamage" }, { label = "Enemy modifiers", modName = {"Damage", "ChaosDamage", "CritChance", "CritMultiplier"}, enemy = true }, { label = "Enemy Conversion modifiers", modName = {"PhysicalDamageGainAsChaos", "PhysicalDamageSkillConvertToChaos", "PhysicalDamageConvertToChaos"}, enemy = true }, }, }, { label = "Taken As", - { format = "{2:output:totalTakenDamage}", - { breakdown = "totalTakenDamage" }, + { format = "{2:output:totalTakenDamage}", + { breakdown = "totalTakenDamage" }, }, - { format = "{2:output:PhysicalTakenDamage}", - { breakdown = "PhysicalTakenDamage" }, + { format = "{2:output:PhysicalTakenDamage}", + { breakdown = "PhysicalTakenDamage" }, { label = "Physical Taken as", modName = { "PhysicalDamageTakenAsLightning", "PhysicalDamageFromHitsTakenAsLightning", "PhysicalDamageTakenAsCold", "PhysicalDamageFromHitsTakenAsCold", @@ -2128,7 +2148,7 @@ return { } }, }, { format = "{2:output:LightningTakenDamage}", - { breakdown = "LightningTakenDamage" }, + { breakdown = "LightningTakenDamage" }, { label = "Lightning Taken as", modName = { "LightningDamageTakenAsPhysical", "LightningDamageFromHitsTakenAsPhysical", "LightningDamageTakenAsCold", "LightningDamageFromHitsTakenAsCold", @@ -2144,7 +2164,7 @@ return { } }, }, { format = "{2:output:ColdTakenDamage}", - { breakdown = "ColdTakenDamage" }, + { breakdown = "ColdTakenDamage" }, { label = "Cold Taken as", modName = { "ColdDamageTakenAsPhysical", "ColdDamageFromHitsTakenAsPhysical", "ColdDamageTakenAsLightning", "ColdDamageFromHitsTakenAsLightning", @@ -2159,8 +2179,8 @@ return { "ChaosDamageTakenAsCold", "ChaosDamageFromHitsTakenAsCold" } }, }, - { format = "{2:output:FireTakenDamage}", - { breakdown = "FireTakenDamage" }, + { format = "{2:output:FireTakenDamage}", + { breakdown = "FireTakenDamage" }, { label = "Fire Taken as", modName = { "FireDamageTakenAsPhysical", "FireDamageFromHitsTakenAsPhysical", "FireDamageTakenAsLightning", "FireDamageFromHitsTakenAsLightning", @@ -2176,7 +2196,7 @@ return { } }, }, { format = "{2:output:ChaosTakenDamage}", - { breakdown = "ChaosTakenDamage" }, + { breakdown = "ChaosTakenDamage" }, { label = "Chaos Taken as", modName = { "ChaosDamageTakenAsPhysical", "ChaosDamageFromHitsTakenAsPhysical", "ChaosDamageTakenAsLightning", "ChaosDamageFromHitsTakenAsLightning", @@ -2196,97 +2216,97 @@ return { colWidth = 95, { label = "Hit taken Mult.", { format = "" }, - { format = "x {3:output:PhysicalTakenHitMult}", - { breakdown = "PhysicalTakenHitMult" }, - { modName = { "DamageTaken", "DamageTakenWhenHit", "AttackDamageTaken", "SpellDamageTaken", "PhysicalDamageTaken", "PhysicalDamageTakenWhenHit", "PhysicalDamageTakenAsFire", "PhysicalDamageTakenAsCold", "PhysicalDamageTakenAsLightning", "PhysicalDamageTakenAsChaos" } } + { format = "x {3:output:PhysicalTakenHitMult}", + { breakdown = "PhysicalTakenHitMult" }, + { modName = { "DamageTaken", "DamageTakenWhenHit", "AttackDamageTaken", "SpellDamageTaken", "PhysicalDamageTaken", "PhysicalDamageTakenWhenHit", "PhysicalDamageTakenAsFire", "PhysicalDamageTakenAsCold", "PhysicalDamageTakenAsLightning", "PhysicalDamageTakenAsChaos" } } }, { format = "x {3:output:LightningTakenHitMult}", - { breakdown = "LightningTakenHitMult" }, + { breakdown = "LightningTakenHitMult" }, { modName = { "DamageTaken", "DamageTakenWhenHit", "AttackDamageTaken", "SpellDamageTaken", "LightningDamageTaken", "LightningDamageTakenWhenHit", "ElementalDamageTaken", "ElementalDamageTakenWhenHit", "LightningDamageTakenAsPhysical", "LightningDamageTakenAsFire", "LightningDamageTakenAsCold", "LightningDamageTakenAsChaos", "ElementalDamageTakenAsPhysical", "ElementalDamageTakenAsChaos", "SelfIgnoreLightningResistance" } } }, { format = "x {3:output:ColdTakenHitMult}", - { breakdown = "ColdTakenHitMult" }, + { breakdown = "ColdTakenHitMult" }, { modName = { "DamageTaken", "DamageTakenWhenHit", "AttackDamageTaken", "SpellDamageTaken", "ColdDamageTaken", "ColdDamageTakenWhenHit", "ElementalDamageTaken", "ElementalDamageTakenWhenHit", "ColdDamageTakenAsPhysical", "ColdDamageTakenAsFire", "ColdDamageTakenAsLightning", "ColdDamageTakenAsChaos", "ElementalDamageTakenAsPhysical", "ElementalDamageTakenAsChaos", "SelfIgnoreColdResistance" } } }, - { format = "x {3:output:FireTakenHitMult}", - { breakdown = "FireTakenHitMult" }, - { modName = { "DamageTaken", "DamageTakenWhenHit", "AttackDamageTaken", "SpellDamageTaken", "FireDamageTaken", "FireDamageTakenWhenHit", "ElementalDamageTaken", "ElementalDamageTakenWhenHit", "FireDamageTakenAsPhysical", "FireDamageTakenAsCold", "FireDamageTakenAsLightning", "FireDamageTakenAsChaos", "ElementalDamageTakenAsPhysical", "ElementalDamageTakenAsChaos", "SelfIgnoreFireResistance" } } + { format = "x {3:output:FireTakenHitMult}", + { breakdown = "FireTakenHitMult" }, + { modName = { "DamageTaken", "DamageTakenWhenHit", "AttackDamageTaken", "SpellDamageTaken", "FireDamageTaken", "FireDamageTakenWhenHit", "ElementalDamageTaken", "ElementalDamageTakenWhenHit", "FireDamageTakenAsPhysical", "FireDamageTakenAsCold", "FireDamageTakenAsLightning", "FireDamageTakenAsChaos", "ElementalDamageTakenAsPhysical", "ElementalDamageTakenAsChaos", "SelfIgnoreFireResistance" } } }, { format = "x {3:output:ChaosTakenHitMult}", - { breakdown = "ChaosTakenHitMult" }, + { breakdown = "ChaosTakenHitMult" }, { modName = { "DamageTaken", "DamageTakenWhenHit", "AttackDamageTaken", "SpellDamageTaken", "ChaosDamageTaken", "ChaosDamageTakenWhenHit", "ChaosDamageTakenAsPhysical", "ChaosDamageTakenAsFire", "ChaosDamageTakenAsCold", "ChaosDamageTakenAsLightning", "SelfIgnoreChaosResistance" } } }, }, { label = "Reflect taken", haveOutput = "AnyTakenReflect", { format = "" }, - { format = "x {2:output:PhysicalTakenReflectMult}", - { breakdown = "PhysicalTakenReflectMult" }, - { modName = { "DamageTaken", "DamageTakenWhenHit", "PhysicalDamageTaken", "PhysicalDamageTakenWhenHit", "PhysicalReflectedDamageTaken", "PhysicalDamageTakenAsFire", "PhysicalDamageTakenAsCold", "PhysicalDamageTakenAsLightning", "PhysicalDamageTakenAsChaos" } } + { format = "x {2:output:PhysicalTakenReflectMult}", + { breakdown = "PhysicalTakenReflectMult" }, + { modName = { "DamageTaken", "DamageTakenWhenHit", "PhysicalDamageTaken", "PhysicalDamageTakenWhenHit", "PhysicalReflectedDamageTaken", "PhysicalDamageTakenAsFire", "PhysicalDamageTakenAsCold", "PhysicalDamageTakenAsLightning", "PhysicalDamageTakenAsChaos" } } }, { format = "x {2:output:LightningTakenReflectMult}", - { breakdown = "LightningTakenReflectMult" }, + { breakdown = "LightningTakenReflectMult" }, { modName = { "DamageTaken", "DamageTakenWhenHit", "LightningDamageTaken", "LightningDamageTakenWhenHit", "LightningReflectedDamageTaken", "ElementalDamageTaken", "ElementalDamageTakenWhenHit", "ElementalReflectedDamageTaken", "LightningDamageTakenAsPhysical", "LightningDamageTakenAsFire", "LightningDamageTakenAsCold", "LightningDamageTakenAsChaos", "ElementalDamageTakenAsPhysical", "ElementalDamageTakenAsChaos" } } }, { format = "x {2:output:ColdTakenReflectMult}", - { breakdown = "ColdTakenReflectMult" }, + { breakdown = "ColdTakenReflectMult" }, { modName = { "DamageTaken", "DamageTakenWhenHit", "ColdDamageTaken", "ColdDamageTakenWhenHit", "ColdReflectedDamageTaken", "ElementalDamageTaken", "ElementalDamageTakenWhenHit", "ElementalReflectedDamageTaken", "ColdDamageTakenAsPhysical", "ColdDamageTakenAsFire", "ColdDamageTakenAsLightning", "ColdDamageTakenAsChaos", "ElementalDamageTakenAsPhysical", "ElementalDamageTakenAsChaos" } } }, - { format = "x {2:output:FireTakenReflectMult}", - { breakdown = "FireTakenReflectMult" }, - { modName = { "DamageTaken", "DamageTakenWhenHit", "FireDamageTaken", "FireDamageTakenWhenHit", "FireReflectedDamageTaken", "ElementalDamageTaken", "ElementalDamageTakenWhenHit", "ElementalReflectedDamageTaken", "ElementalDamageTakenOverTime", "FireDamageTakenAsPhysical", "FireDamageTakenAsCold", "FireDamageTakenAsLightning", "FireDamageTakenAsChaos", "ElementalDamageTakenAsPhysical", "ElementalDamageTakenAsChaos" } } + { format = "x {2:output:FireTakenReflectMult}", + { breakdown = "FireTakenReflectMult" }, + { modName = { "DamageTaken", "DamageTakenWhenHit", "FireDamageTaken", "FireDamageTakenWhenHit", "FireReflectedDamageTaken", "ElementalDamageTaken", "ElementalDamageTakenWhenHit", "ElementalReflectedDamageTaken", "ElementalDamageTakenOverTime", "FireDamageTakenAsPhysical", "FireDamageTakenAsCold", "FireDamageTakenAsLightning", "FireDamageTakenAsChaos", "ElementalDamageTakenAsPhysical", "ElementalDamageTakenAsChaos" } } }, { format = "x {2:output:ChaosTakenReflectMult}", - { breakdown = "ChaosTakenReflectMult" }, + { breakdown = "ChaosTakenReflectMult" }, { modName = { "DamageTaken", "DamageTakenWhenHit", "ChaosDamageTaken", "ChaosDamageTakenWhenHit", "ChaosDamageTakenAsPhysical", "ChaosDamageTakenAsFire", "ChaosDamageTakenAsCold", "ChaosDamageTakenAsLightning" } } }, }, { label = "Hit taken", - { format = "{2:output:totalTakenHit}", - { breakdown = "totalTakenHit" }, + { format = "{2:output:totalTakenHit}", + { breakdown = "totalTakenHit" }, }, - { format = "{2:output:PhysicalTakenHit}", - { breakdown = "PhysicalTakenHit" }, + { format = "{2:output:PhysicalTakenHit}", + { breakdown = "PhysicalTakenHit" }, }, { format = "{2:output:LightningTakenHit}", - { breakdown = "LightningTakenHit" }, + { breakdown = "LightningTakenHit" }, }, { format = "{2:output:ColdTakenHit}", - { breakdown = "ColdTakenHit" }, + { breakdown = "ColdTakenHit" }, }, - { format = "{2:output:FireTakenHit}", - { breakdown = "FireTakenHit" }, + { format = "{2:output:FireTakenHit}", + { breakdown = "FireTakenHit" }, }, { format = "{2:output:ChaosTakenHit}", - { breakdown = "ChaosTakenHit" }, + { breakdown = "ChaosTakenHit" }, }, }, { label = "PvP Hit taken", haveOutput = "PvPTotalTakenHit", - { format = "{2:output:PvPTotalTakenHit}", - { breakdown = "PvPTotalTakenHit" }, - { label = "Enemy PvP Multiplier", modName = "MultiplierPvpDamage", enemy = true }, + { format = "{2:output:PvPTotalTakenHit}", + { breakdown = "PvPTotalTakenHit" }, + { label = "Enemy PvP Multiplier", modName = "MultiplierPvpDamage", enemy = true }, }, }, { label = "ES Bypass %", haveOutput = "AnyBypass", { format = " "}, - { format = "{0:output:PhysicalEnergyShieldBypass}%", + { format = "{0:output:PhysicalEnergyShieldBypass}%", { breakdown = "PhysicalEnergyShieldBypass" }, - { modName = {"PhysicalEnergyShieldBypass", "BlockedDamageDoesntBypassES", "UnblockedDamageDoesBypassES"} }, + { modName = {"PhysicalEnergyShieldBypass", "BlockedDamageDoesntBypassES", "UnblockedDamageDoesBypassES"} }, }, { format = "{0:output:LightningEnergyShieldBypass}%", - { breakdown = "LightningEnergyShieldBypass" }, - { modName = {"LightningEnergyShieldBypass", "BlockedDamageDoesntBypassES", "UnblockedDamageDoesBypassES"} }, + { breakdown = "LightningEnergyShieldBypass" }, + { modName = {"LightningEnergyShieldBypass", "BlockedDamageDoesntBypassES", "UnblockedDamageDoesBypassES"} }, }, { format = "{0:output:ColdEnergyShieldBypass}%", { breakdown = "ColdEnergyShieldBypass" }, - { modName = {"ColdEnergyShieldBypass", "BlockedDamageDoesntBypassES", "UnblockedDamageDoesBypassES"} }, + { modName = {"ColdEnergyShieldBypass", "BlockedDamageDoesntBypassES", "UnblockedDamageDoesBypassES"} }, }, - { format = "{0:output:FireEnergyShieldBypass}%", - { breakdown = "FireEnergyShieldBypass" }, - { modName = {"FireEnergyShieldBypass", "BlockedDamageDoesntBypassES", "UnblockedDamageDoesBypassES"} }, + { format = "{0:output:FireEnergyShieldBypass}%", + { breakdown = "FireEnergyShieldBypass" }, + { modName = {"FireEnergyShieldBypass", "BlockedDamageDoesntBypassES", "UnblockedDamageDoesBypassES"} }, }, { format = "{0:output:ChaosEnergyShieldBypass}%", - { breakdown = "ChaosEnergyShieldBypass" }, - { modName = {"ChaosEnergyShieldBypass", "ChaosNotBypassEnergyShield", "BlockedDamageDoesntBypassES", "UnblockedDamageDoesBypassES"} }, + { breakdown = "ChaosEnergyShieldBypass" }, + { modName = {"ChaosEnergyShieldBypass", "ChaosNotBypassEnergyShield", "BlockedDamageDoesntBypassES", "UnblockedDamageDoesBypassES"} }, }, }, { haveOutput = "ehpSectionAnySpecificTypes", @@ -2310,7 +2330,7 @@ return { }, }, { label = "Mind over Matter %", haveOutput = "AnySpecificMindOverMatter", - { format = "{0:output:sharedMindOverMatter}%", + { format = "{0:output:sharedMindOverMatter}%", { breakdown = "sharedMindOverMatter" }, { modName = "DamageTakenFromManaBeforeLife" }, }, @@ -2433,19 +2453,19 @@ return { } }, }, { defaultCollapsed = false, label = "Effective \"Health\" Pool", data = { extra = "{0:output:TotalEHP}", - { label = "Unmitigated %", { format = "{0:output:ConfiguredDamageChance}%", - { breakdown = "ConfiguredDamageChance" }, + { label = "Unmitigated %", { format = "{0:output:ConfiguredDamageChance}%", + { breakdown = "ConfiguredDamageChance" }, { label = "Enemy modifiers", modName = { "CannotBeSuppressed", "CannotBeBlocked", "reduceEnemyBlock" }, enemy = true }, }, }, { label = "Mitigated hits", { format = "{2:output:NumberOfMitigatedDamagingHits}", }, }, - { label = "Enemy miss chance", { format = "{0:output:ConfiguredNotHitChance}%", - { breakdown = "ConfiguredNotHitChance" }, + { label = "Enemy miss chance", { format = "{0:output:ConfiguredNotHitChance}%", + { breakdown = "ConfiguredNotHitChance" }, { label = "Enemy modifiers", modName = { "CannotBeEvaded", "CannotBeDodged", "reduceEnemyDodge" }, enemy = true }, }, }, { label = "Hits before death", { format = "{2:output:TotalNumberOfHits}", { breakdown = "TotalNumberOfHits" }}, }, { label = "Effective Hit Pool",{ format = "{0:output:TotalEHP}", { breakdown = "TotalEHP" }, },}, - { label = "Time before death",{ format = "{2:output:EHPSurvivalTime}s", - { breakdown = "EHPSurvivalTime" }, + { label = "Time before death",{ format = "{2:output:EHPSurvivalTime}s", + { breakdown = "EHPSurvivalTime" }, { label = "Enemy modifiers", modName = { "TemporalChainsActionSpeed", "ActionSpeed", "Speed", "MinimumActionSpeed" }, enemy = true }, },} }, }, { defaultCollapsed = false, label = "Maximum Hit Taken", data = { @@ -2458,20 +2478,20 @@ return { { format = colorCodes.CHAOS.."Chaos:" }, }, { label = "Maximum Hit Taken", - { format = "{0:output:PhysicalMaximumHitTaken}", - { breakdown = "PhysicalMaximumHitTaken" }, + { format = "{0:output:PhysicalMaximumHitTaken}", + { breakdown = "PhysicalMaximumHitTaken" }, }, { format = "{0:output:LightningMaximumHitTaken}", - { breakdown = "LightningMaximumHitTaken" }, + { breakdown = "LightningMaximumHitTaken" }, }, { format = "{0:output:ColdMaximumHitTaken}", - { breakdown = "ColdMaximumHitTaken" }, + { breakdown = "ColdMaximumHitTaken" }, }, - { format = "{0:output:FireMaximumHitTaken}", - { breakdown = "FireMaximumHitTaken" }, + { format = "{0:output:FireMaximumHitTaken}", + { breakdown = "FireMaximumHitTaken" }, }, { format = "{0:output:ChaosMaximumHitTaken}", - { breakdown = "ChaosMaximumHitTaken" }, + { breakdown = "ChaosMaximumHitTaken" }, }, } } }, { defaultCollapsed = true, label = "Recoup and Hit Taken Over Time", data = { @@ -2482,7 +2502,7 @@ return { { format = colorCodes.MANA.."Mana:" }, { format = colorCodes.ES.."Energy Shield:" }, }, - { label = "Recoup Max.", haveOutput = "anyRecoup", + { label = "Recoup Max.", haveOutput = "anyRecoup", { format = "{0:output:LifeRecoupRecoveryMax}", { breakdown = "LifeRecoupRecoveryMax" }, { label = "Sources", modName = { "LifeRecoup", "PhysicalLifeRecoup", "LightningLifeRecoup", "ColdLifeRecoup", "FireLifeRecoup", "ChaosLifeRecoup", "PhysicalDamageMitigatedLifePseudoRecoup" } }, @@ -2502,7 +2522,7 @@ return { { label = "Faster Recoup", modName = "3SecondRecoup" }, }, }, - { label = "Recoup Avg.", haveOutput = "anyRecoup", + { label = "Recoup Avg.", haveOutput = "anyRecoup", { format = "{0:output:LifeRecoupRecoveryAvg}", { breakdown = "LifeRecoupRecoveryAvg" }, { label = "Sources", modName = { "LifeRecoup", "PhysicalLifeRecoup", "LightningLifeRecoup", "ColdLifeRecoup", "FireLifeRecoup", "ChaosLifeRecoup", "PhysicalDamageMitigatedLifePseudoRecoup" } }, @@ -2522,24 +2542,24 @@ return { { label = "Faster Recoup", modName = "3SecondRecoup" }, }, }, - { label = "Hit Over Time Max.", haveOutput = "preventedLifeLossTotal", + { label = "Hit Over Time Max.", haveOutput = "preventedLifeLossTotal", { format = "{0:output:LifeLossLostMax}", { breakdown = "LifeLossLostMax" }, { modName = { "LifeLossPrevented", "LifeLossBelowHalfPrevented", "LifeLossLost", "LifeLossBelowHalfLost" } }, }, }, - { label = "Hit Over Time Avg.", haveOutput = "preventedLifeLossTotal", + { label = "Hit Over Time Avg.", haveOutput = "preventedLifeLossTotal", { format = "{0:output:LifeLossLostAvg}", { breakdown = "LifeLossLostAvg" }, { modName = { "LifeLossPrevented", "LifeLossBelowHalfPrevented", "LifeLossLost", "LifeLossBelowHalfLost" } }, }, }, - { label = "Net Max.", haveOutput = "showNetRecoup", + { label = "Net Max.", haveOutput = "showNetRecoup", { format = "{0:output:netLifeRecoupAndLossLostOverTimeMax}", { breakdown = "netLifeRecoupAndLossLostOverTimeMax" }, }, }, - { label = "Net Avg.", haveOutput = "showNetRecoup", + { label = "Net Avg.", haveOutput = "showNetRecoup", { format = "{0:output:netLifeRecoupAndLossLostOverTimeAvg}", { breakdown = "netLifeRecoupAndLossLostOverTimeAvg" }, }, @@ -2554,8 +2574,8 @@ return { { format = colorCodes.CHAOS.."Chaos:" }, }, { label = "DoT taken", - { format = "x {2:output:PhysicalTakenDotMult}", - { breakdown = "PhysicalTakenDotMult" }, + { format = "x {2:output:PhysicalTakenDotMult}", + { breakdown = "PhysicalTakenDotMult" }, { modName = { "DamageTaken", "DamageTakenOverTime", "PhysicalDamageTaken", "PhysicalDamageTakenOverTime" } }, { label = "Physical Taken as", modName = { "PhysicalDamageTakenAsLightning", @@ -2572,7 +2592,7 @@ return { } }, }, { format = "x {2:output:LightningTakenDotMult}", - { breakdown = "LightningTakenDotMult" }, + { breakdown = "LightningTakenDotMult" }, { modName = { "DamageTaken", "DamageTakenOverTime", "LightningDamageTaken", "LightningDamageTakenOverTime", "ElementalDamageTaken", "ElementalDamageTakenOverTime", "SelfIgnoreLightningResistance" } }, { label = "Lightning Taken as", modName = { "LightningDamageTakenAsPhysical", @@ -2589,7 +2609,7 @@ return { } }, }, { format = "x {2:output:ColdTakenDotMult}", - { breakdown = "ColdTakenDotMult" }, + { breakdown = "ColdTakenDotMult" }, { modName = { "DamageTaken", "DamageTakenOverTime", "ColdDamageTaken", "ColdDamageTakenOverTime", "ElementalDamageTaken", "ElementalDamageTakenOverTime", "SelfIgnoreColdResistance" } }, { label = "Cold Taken as", modName = { "ColdDamageTakenAsPhysical", @@ -2605,14 +2625,14 @@ return { "ChaosDamageTakenAsCold" } }, }, - { format = "x {2:output:FireTakenDotMult}", - { breakdown = "FireTakenDotMult" }, + { format = "x {2:output:FireTakenDotMult}", + { breakdown = "FireTakenDotMult" }, { modName = { "DamageTaken", "DamageTakenOverTime", "FireDamageTaken", "FireDamageTakenOverTime", "ElementalDamageTaken", "ElementalDamageTakenOverTime", "SelfIgnoreFireResistance" } }, { label = "Fire Taken as", modName = { "FireDamageTakenAsPhysical", "FireDamageTakenAsLightning", "FireDamageTakenAsCold", - "ElementalDamageTakenAsPhysical", "ElementalDamageTakenAsChaos", + "ElementalDamageTakenAsPhysical", "ElementalDamageTakenAsChaos", "FireDamageTakenAsChaos" } }, { label = "Taken as Fire", modName = { @@ -2623,7 +2643,7 @@ return { } }, }, { format = "x {2:output:ChaosTakenDotMult}", - { breakdown = "ChaosTakenDotMult" }, + { breakdown = "ChaosTakenDotMult" }, { modName = { "DamageTaken", "DamageTakenOverTime", "ChaosDamageTaken", "ChaosDamageTakenOverTime", "SelfIgnoreChaosResistance" } }, { label = "Chaos Taken as", modName = { "ChaosDamageTakenAsPhysical", @@ -2641,62 +2661,62 @@ return { }, }, { label = "Total Pool", - { format = "{0:output:PhysicalTotalPool}", - { breakdown = "PhysicalTotalPool" }, + { format = "{0:output:PhysicalTotalPool}", + { breakdown = "PhysicalTotalPool" }, }, { format = "{0:output:LightningTotalPool}", - { breakdown = "LightningTotalPool" }, + { breakdown = "LightningTotalPool" }, }, { format = "{0:output:ColdTotalPool}", { breakdown = "ColdTotalPool" }, }, - { format = "{0:output:FireTotalPool}", - { breakdown = "FireTotalPool" }, + { format = "{0:output:FireTotalPool}", + { breakdown = "FireTotalPool" }, }, { format = "{0:output:ChaosTotalPool}", - { breakdown = "ChaosTotalPool" }, + { breakdown = "ChaosTotalPool" }, }, - }, + }, { label = "Effective DoT Pool", - { format = "{0:output:PhysicalDotEHP}", - { breakdown = "PhysicalDotEHP" }, + { format = "{0:output:PhysicalDotEHP}", + { breakdown = "PhysicalDotEHP" }, }, { format = "{0:output:LightningDotEHP}", - { breakdown = "LightningDotEHP" }, + { breakdown = "LightningDotEHP" }, }, { format = "{0:output:ColdDotEHP}", - { breakdown = "ColdDotEHP" }, + { breakdown = "ColdDotEHP" }, }, - { format = "{0:output:FireDotEHP}", - { breakdown = "FireDotEHP" }, + { format = "{0:output:FireDotEHP}", + { breakdown = "FireDotEHP" }, }, { format = "{0:output:ChaosDotEHP}", - { breakdown = "ChaosDotEHP" }, + { breakdown = "ChaosDotEHP" }, }, }, { label = "Degens", haveOutput = "TotalBuildDegen", - { format = "{0:output:PhysicalBuildDegen}", - { breakdown = "PhysicalBuildDegen" }, + { format = "{0:output:PhysicalBuildDegen}", + { breakdown = "PhysicalBuildDegen" }, { modName = "PhysicalDegen", } }, { format = "{0:output:LightningBuildDegen}", - { breakdown = "LightningBuildDegen" }, + { breakdown = "LightningBuildDegen" }, { modName = "LightningDegen", } }, { format = "{0:output:ColdBuildDegen}", - { breakdown = "ColdBuildDegen" }, + { breakdown = "ColdBuildDegen" }, { modName = "ColdDegen", } }, - { format = "{0:output:FireBuildDegen}", - { breakdown = "FireBuildDegen" }, + { format = "{0:output:FireBuildDegen}", + { breakdown = "FireBuildDegen" }, { modName = "FireDegen", } }, { format = "{0:output:ChaosBuildDegen}", - { breakdown = "ChaosBuildDegen" }, + { breakdown = "ChaosBuildDegen" }, { modName = "ChaosDegen", } }, }, - { label = "Total Degen", haveOutput = "TotalBuildDegen", { format = "{1:output:TotalBuildDegen}", + { label = "Total Degen", haveOutput = "TotalBuildDegen", { format = "{1:output:TotalBuildDegen}", { breakdown = "TotalBuildDegen" }, { label = "Sources", modName = { "PhysicalDegen", "FireDegen", "ColdDegen", "LightningDegen", "ChaosDegen" }, modType = "BASE" }, }, }, @@ -2716,23 +2736,23 @@ return { { format = colorCodes.CHAOS.."Chaos:" }, }, { label = "Degens", haveOutput = "TotalDegen", - { format = "{0:output:PhysicalEnemyDegen}", - { breakdown = "PhysicalEnemyDegen" }, + { format = "{0:output:PhysicalEnemyDegen}", + { breakdown = "PhysicalEnemyDegen" }, }, { format = "{0:output:LightningEnemyDegen}", - { breakdown = "LightningEnemyDegen" }, + { breakdown = "LightningEnemyDegen" }, }, { format = "{0:output:ColdEnemyDegen}", - { breakdown = "ColdEnemyDegen" }, + { breakdown = "ColdEnemyDegen" }, }, - { format = "{0:output:FireEnemyDegen}", - { breakdown = "FireEnemyDegen" }, + { format = "{0:output:FireEnemyDegen}", + { breakdown = "FireEnemyDegen" }, }, { format = "{0:output:ChaosEnemyDegen}", - { breakdown = "ChaosEnemyDegen" }, + { breakdown = "ChaosEnemyDegen" }, }, }, - { label = "Total Degen", haveOutput = "TotalDegen", { format = "{1:output:TotalDegen}", + { label = "Total Degen", haveOutput = "TotalDegen", { format = "{1:output:TotalDegen}", { breakdown = "TotalDegen" }, }, }, { label = "Total Net Recovery", haveOutput = "ComprehensiveTotalNetRegen", { format = "{1:output:ComprehensiveTotalNetRegen}", diff --git a/src/Modules/CalcSetup.lua b/src/Modules/CalcSetup.lua index e8bc7a491a..724b4e8ea5 100644 --- a/src/Modules/CalcSetup.lua +++ b/src/Modules/CalcSetup.lua @@ -762,6 +762,7 @@ function calcs.initEnv(build, mode, override, specEnv) modDB:NewMod("Life", "BASE", data.characterConstants["life_per_level"], "Base", { type = "Multiplier", var = "Level", base = 16 }) modDB:NewMod("Mana", "BASE", data.characterConstants["mana_per_level"], "Base", { type = "Multiplier", var = "Level", base = 30 }) modDB:NewMod("ManaRegen", "BASE", env.data.misc.ManaRegenBase, "Base", { type = "PerStat", stat = "Mana", div = 1 }, { type = "Condition", var = "NoInherentManaRegen", neg = true }) + modDB:NewMod("WardRegenPercent", "BASE", data.gameConstants["BaseWardRegenerationPercentPerMinute"]/60, "Base" ) modDB:NewMod("Spirit", "BASE", 0, "Base") modDB:NewMod("Devotion", "BASE", 0, "Base") modDB:NewMod("Tribute", "BASE", 0, "Base") diff --git a/src/Modules/Calcs.lua b/src/Modules/Calcs.lua index 69378e3f51..9408586536 100644 --- a/src/Modules/Calcs.lua +++ b/src/Modules/Calcs.lua @@ -131,7 +131,7 @@ function calcs.getMiscCalculator(build) env.override = override calcs.perform(env) if (useFullDPS ~= false or build.viewMode == "TREE") and usedFullDPS then - -- prevent upcoming calculation from using Cached Data and thus forcing it to re-calculate new FullDPS roll-up + -- prevent upcoming calculation from using Cached Data and thus forcing it to re-calculate new FullDPS roll-up -- without this, FullDPS increase/decrease when for node/item/gem comparison would be all 0 as it would be comparing -- A with A (due to cache reuse) instead of A with B local fullDPS = calcs.calcFullDPS(build, "CALCULATOR", override, { cachedPlayerDB = cachedPlayerDB, cachedEnemyDB = cachedEnemyDB, cachedMinionDB = cachedMinionDB, env = nil}) @@ -495,7 +495,7 @@ function calcs.buildOutput(build, mode) end if GlobalCache.cachedData[mode][uuid] and (not skill.triggeredBy or skill.triggeredBy.grantedEffect.id ~= "SupportBlasphemyPlayer") then output.EnergyShieldProtectsMana = env.modDB:Flag(nil, "EnergyShieldProtectsMana") - for pool, costResource in pairs({["LifeUnreserved"] = "LifeCost", ["ManaUnreserved"] = "ManaCost", ["Rage"] = "RageCost", ["EnergyShield"] = "ESCost"}) do + for pool, costResource in pairs({["LifeUnreserved"] = "LifeCost", ["ManaUnreserved"] = "ManaCost", ["Rage"] = "RageCost", ["Ward"] = "WardCost", ["EnergyShield"] = "ESCost"}) do local cachedCost = GlobalCache.cachedData[mode][uuid].Env.player.output[costResource] if cachedCost then local totalPool = (output.EnergyShieldProtectsMana and costResource == "ManaCost" and output["EnergyShield"] or 0) + (output[pool] or 0) @@ -525,7 +525,7 @@ function calcs.buildOutput(build, mode) end end end - + output.ExtraPoints = env.modDB:Sum("BASE", nil, "ExtraPoints") output.WeaponSetPassivePoints = env.modDB:Sum("BASE", nil, "WeaponSetPassivePoints") output.PassivePointsToWeaponSetPoints = env.modDB:Sum("BASE", nil, "PassivePointsToWeaponSetPoints") @@ -590,7 +590,7 @@ function calcs.buildOutput(build, mode) end local function addModTags(actor, mod) addTo(env.modsUsed, mod.name, mod) - + -- Imply enemy conditionals based on damage type -- Needed to preemptively show config options for elemental ailments for dmgType, conditions in pairs({["[fi][ig][rn][ei]t?e?"] = {"Ignited", "Burning"}, ["[cf][or][le][de]z?e?"] = {"Frozen"}}) do @@ -600,7 +600,7 @@ function calcs.buildOutput(build, mode) end end end - + for _, tag in ipairs(mod) do addTo(env.tagTypesUsed, tag.type, mod) if tag.type == "IgnoreCond" then diff --git a/src/Modules/ConfigOptions.lua b/src/Modules/ConfigOptions.lua index 69729e373d..9033f6a152 100644 --- a/src/Modules/ConfigOptions.lua +++ b/src/Modules/ConfigOptions.lua @@ -158,6 +158,18 @@ local configSettings = { modList:NewMod("Condition:UseCurrentEnergyShield", "FLAG", true, "Config") modList:NewMod("Multiplier:CurrentEnergyShield", "BASE", val, "Config") end }, + { var = "conditionLowRunicWard", type = "check", label = "Are you on low ^xFFFF77Runic Ward?", ifCond = "LowRunicWard", tooltip = "You are on Low ^xFFFF77Runic Ward^7 if you have 35% of your maximum ^xFFFF77Runic Ward^7 or less.", apply = function(val, modList, enemyModList) + modList:NewMod("Condition:LowRunicWard", "FLAG", true, "Config") + modList:NewMod("Condition:MissingRunicWard", "FLAG", true, "Config") + end }, + { var = "conditionMissingRunicWard", type = "check", label = "Are you missing ^xFFFF77Runic Ward?", ifCond = "MissingRunicWard", apply = function(val, modList, enemyModList) + modList:NewMod("Condition:MissingRunicWard", "FLAG", true, "Config") + end }, + { var = "conditionNoRunicWard", type = "check", label = "Do you have no ^xFFFF77Runic Ward?", ifCond = "NoRunicWard", apply = function(val, modList, enemyModList) + modList:NewMod("Condition:NoRunicWard", "FLAG", true, "Config") + modList:NewMod("Condition:LowRunicWard", "FLAG", true, "Config") + modList:NewMod("Condition:MissingRunicWard", "FLAG", true, "Config") + end }, { var = "minionsConditionFullLife", type = "check", label = "Are your Minions always on Full ^xE05030Life?", ifMinionCond = "FullLife", apply = function(val, modList, enemyModList) modList:NewMod("MinionModifier", "LIST", { mod = modLib.createMod("Condition:FullLife", "FLAG", true, "Config") }, "Config") end }, @@ -185,7 +197,7 @@ local configSettings = { end end }, { var = "EHPUnluckyWorstOf", type = "list", label = "EHP calc unlucky:", tooltip = "Sets the EHP calc to pretend its unlucky and reduce the effects of random events such as\n\tBlock/Spell Block Chance\n\tDodge/Spell Dodge Chance\n\tSpell Suppression Chance\n\tAvoidance Chance", list = {{val=1,label="Average"},{val=2,label="Unlucky"},{val=4,label="Very Unlucky"}} }, - { var = "DisableEHPGainOnBlock", type = "check", label = "Disable EHP gain on block/suppress:", ifMod = {"LifeOnBlock", "ManaOnBlock", "EnergyShieldOnBlock", "EnergyShieldOnSpellBlock", "LifeOnSuppress", "EnergyShieldOnSuppress"}, tooltip = "Sets the EHP calc to not apply gain on block and suppress effects"}, + { var = "DisableEHPGainOnBlock", type = "check", label = "Disable EHP gain on block/suppress:", ifMod = {"LifeOnBlock", "ManaOnBlock", "WardOnBlock", "EnergyShieldOnBlock", "EnergyShieldOnSpellBlock", "LifeOnSuppress", "EnergyShieldOnSuppress"}, tooltip = "Sets the EHP calc to not apply gain on block and suppress effects"}, { var = "armourCalculationMode", type = "list", label = "Armour calculation mode:", ifCond = { "ArmourMax", "ArmourAvg" }, tooltip = "Controls how Defending with Double Armour is calculated:\n\tMinimum: never Defend with Double Armour\n\tAverage: Damage Reduction from Defending with Double Armour is proportional to chance\n\tMaximum: always Defend with Double Armour\nThis setting has no effect if you have 100% chance to Defend with Double Armour.", list = {{val="MIN",label="Minimum"},{val="AVERAGE",label="Average"},{val="MAX",label="Maximum"}}, apply = function(val, modList, enemyModList) if val == "MAX" then modList:NewMod("Condition:ArmourMax", "FLAG", true, "Config") @@ -462,6 +474,10 @@ local configSettings = { { var = "purpleFlameStacks", type = "count", label = "Purple Flames collected:", tooltip = "Number of Purple Flames of Chayula collected (max 10).", ifSkill = "Into the Breach", defaultState = 10, apply = function(val, modList, enemyModList) modList:NewMod("Multiplier:PurpleFlamesCount", "BASE", m_min(val, 10), "Config") end }, + { label = "Leylines:", ifSkill = "Leylines" }, + { var = "onLeyline", type = "check", label = "Are you on a Leyline?", ifSkill = "Leylines", apply = function(val, modList, enemyModList) + modList:NewMod("Condition:OnLeyline", "FLAG", true, "Config") + end }, { label = "Link Skills:", ifSkill = { "Destructive Link", "Flame Link", "Intuitive Link", "Protective Link", "Soul Link", "Vampiric Link" } }, { var = "multiplierLinkedTargets", type = "count", label = "# of linked Targets:", ifSkill = { "Destructive Link", "Flame Link", "Intuitive Link", "Protective Link", "Soul Link", "Vampiric Link" }, apply = function(val, modList, enemyModList) modList:NewMod("Multiplier:LinkedTargets", "BASE", val, "Config") diff --git a/src/Modules/Data.lua b/src/Modules/Data.lua index f976033ba2..fd79321eb5 100644 --- a/src/Modules/Data.lua +++ b/src/Modules/Data.lua @@ -74,14 +74,14 @@ local function processMod(grantedEffect, mod, statName) if type(mod.value) == "table" and mod.value.mod then mod.value.mod.source = "Skill:"..grantedEffect.id end - + for _, tag in ipairs(mod) do if tag.type == "GlobalEffect" then grantedEffect.hasGlobalEffect = true break end end - + local notMinionStat = false for _, statStet in ipairs(grantedEffect.statSets) do if statStet.notMinionStat and statName and (grantedEffect.support or grantedEffect.skillTypes and grantedEffect.skillTypes[SkillType.Buff]) then @@ -153,7 +153,7 @@ data.powerStatList = { { stat="Mana", label="Mana" }, { stat="ManaRegen", label="Mana regen" }, { stat="ManaLeechRate", label="Mana leech" }, - { stat="Ward", label="Ward" }, + { stat="Ward", label="Runic Ward" }, { stat="Spirit", label="Spirit" }, { stat="Str", label="Strength" }, { stat="Dex", label="Dexterity" }, @@ -263,7 +263,6 @@ data.misc = { -- magic numbers ManaRegenBase = data.characterConstants["character_inherent_mana_regeneration_rate_per_minute_%"] / 60 / 100, EnergyShieldRechargeBase = data.characterConstants["energy_shield_recharge_rate_per_minute_%"] / 60 / 100, EnergyShieldRechargeDelay = 4, - WardRechargeDelay = 2, Transfiguration = 0.3, EnemyMaxResist = data.monsterConstants["base_maximum_all_resistances_%"], LeechRateBase = 0.02, @@ -496,6 +495,9 @@ data.highPrecisionMods = { ["EnergyShieldRegenPercent"] = { ["BASE"] = 2, }, + ["WardRegenPercent"] = { + ["BASE"] = 2, + }, ["LifeRegen"] = { ["BASE"] = 1, }, @@ -505,6 +507,9 @@ data.highPrecisionMods = { ["EnergyShieldRegen"] = { ["BASE"] = 1, }, + ["WardRegen"] = { + ["BASE"] = 1, + }, ["RageRegen"] = { ["BASE"] = 1, }, @@ -844,10 +849,10 @@ data.itemTagSpecialExclusionPattern = { } -- Load bosses -do +do ---@class BossData data.bosses = LoadModule("Data/Bosses") - + local count, uberCount = 0, 0 local armourTotal, evasionTotal = 0, 0 local uberArmourTotal, uberEvasionTotal = 0, 0 @@ -1053,7 +1058,7 @@ for gemId, gem in pairs(data.gems) do data.gemGrantedEffectIdForVaalGemId[gem.secondaryGrantedEffectId] = gemId for otherGemId, otherGem in pairs(data.gems) do if otherGem.grantedEffectId == gem.secondaryGrantedEffectId then - data.gemVaalGemIdForBaseGemId[gemId] = otherGemId + data.gemVaalGemIdForBaseGemId[gemId] = otherGemId break end end diff --git a/src/Modules/Main.lua b/src/Modules/Main.lua index d4cbb8e2cc..4b664c4868 100644 --- a/src/Modules/Main.lua +++ b/src/Modules/Main.lua @@ -117,7 +117,7 @@ function main:Init() self.showAllItemAffixes = true self.disableScrollControlInteraction = false self.errorReadingSettings = false - + if not SetDPIScaleOverridePercent then SetDPIScaleOverridePercent = function(scale) end end if launch.devMode and IsKeyDown("CTRL") or os.getenv("REGENERATE_MOD_CACHE") == "1" then @@ -500,7 +500,7 @@ function main:OnFrame() SetDrawColor(0, 0, 0) DrawImage(nil, par + 500, 200, 2, 750) DrawImage(nil, 500, par + 200, 759, 2)]] - + if self.inputEvents and not itemLib.wiki.triggered then for _, event in ipairs(self.inputEvents) do if event.type == "KeyUp" and event.key == "F1" then @@ -924,7 +924,7 @@ function main:OpenOptionsPopup(savedState) -- NOTE: Height needs to be adjusted if more menu options are added local oneColumnHeightReq = 850 -- Min height required to not split menu into two columns local columnWidth = 600 - + local startingY = 20 local currentY = startingY local currentX = 0 -- initialized at `0`, only used for two-column layouts @@ -933,7 +933,7 @@ function main:OpenOptionsPopup(savedState) local useTwoColumns = self.screenH < oneColumnHeightReq and self.screenW >= columnWidth * 2 local useScrollBar = self.screenH < oneColumnHeightReq and not useTwoColumns local scrollBarWidth = useScrollBar and 18 or 0 - + local popupWidth = useTwoColumns and columnWidth * 2 or columnWidth -- Scrollbar anchor @@ -1084,7 +1084,7 @@ function main:OpenOptionsPopup(savedState) controls.showAnimations = new("CheckBoxControl"):CheckBoxControl({ "TOPLEFT", controls.sectionAnchor, "TOPLEFT" }, { currentX + defaultLabelPlacementX, currentY, 20 }, "^7Show Animations:", function(state) self.showAnimations = state end) - + nextRow() controls.showAllItemAffixes = new("CheckBoxControl"):CheckBoxControl({ "TOPLEFT", controls.sectionAnchor, "TOPLEFT" }, { currentX + defaultLabelPlacementX, currentY, 20 }, "^7Show all item affixes sliders:", function(state) self.showAllItemAffixes = state @@ -1098,7 +1098,7 @@ function main:OpenOptionsPopup(savedState) controls.disableScrollControlInteraction.tooltipText = "Disable changing the values in controls such as dropdowns or numeric inputs when using the scroll wheel." nextRow() - + local leftColumnMaxY = currentY -- store left column height -- Check for two column layout @@ -1181,21 +1181,21 @@ function main:OpenOptionsPopup(savedState) end) controls.migrateAugments.tooltipText = "Apply augments and anoints from current gear when comparing new gear, given they are possible to add to the new item." controls.migrateAugments.state = self.migrateAugments - + nextRow() controls.notSupportedModTooltips = new("CheckBoxControl"):CheckBoxControl({ "TOPLEFT", controls.sectionAnchor, "TOPLEFT" }, { currentX + defaultLabelPlacementX, currentY, 20 }, "^7Show tooltip for unsupported mods :", function(state) self.notSupportedModTooltips = state end) controls.notSupportedModTooltips.tooltipText = "Show ^8(Not supported in PoB yet) ^7next to unsupported mods\nRequires PoB to restart for it to take effect" controls.notSupportedModTooltips.state = self.notSupportedModTooltips - + nextRow() controls.invertSliderScrollDirection = new("CheckBoxControl"):CheckBoxControl({ "TOPLEFT", controls.sectionAnchor, "TOPLEFT" }, { currentX + defaultLabelPlacementX, currentY, 20 }, "^7Invert slider scroll direction:", function(state) self.invertSliderScrollDirection = state end) controls.invertSliderScrollDirection.tooltipText = "Default scroll direction is:\nScroll Up = Move right\nScroll Down = Move left" controls.invertSliderScrollDirection.state = self.invertSliderScrollDirection - + if launch.devMode then nextRow() controls.disableDevAutoSave = new("CheckBoxControl"):CheckBoxControl({ "TOPLEFT", controls.sectionAnchor, "TOPLEFT" }, { currentX + defaultLabelPlacementX, currentY, 20 }, "^7Disable Dev AutoSave:", function(state) @@ -1279,14 +1279,14 @@ function main:OpenOptionsPopup(savedState) SetDPIScaleOverridePercent(self.dpiScaleOverridePercent) main:ClosePopup() end) - + local popupHeight = useScrollBar and (self.screenH - 20) or currentY + 30 - + if useScrollBar then controls.scrollBar = new("ScrollBarControl"):ScrollBarControl({ "TOPRIGHT", nil, "TOPRIGHT" }, { -2, 25, scrollBarWidth, popupHeight - 65 }, 50, "VERTICAL", true) controls.scrollBar:SetContentDimension(currentY, popupHeight - 65) end - + local function scrollBarFunc() if useScrollBar then controls.sectionAnchor.y = -controls.scrollBar.offset @@ -1709,7 +1709,7 @@ function main:OpenConfirmPopup(title, msg, confirmLabel, onConfirm, extraLabel, numMsgLines = numMsgLines + 1 end local confirmWidth = m_max(80, DrawStringWidth(16, "VAR", confirmLabel) + 10) - + if extraLabel and onExtra then -- Three button layout: Continue (left), Connect Path (center), Cancel (right) local extraWidth = m_max(80, DrawStringWidth(16, "VAR", extraLabel) + 10) diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index de693ce29b..880dcdb41f 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -170,7 +170,7 @@ local modNameList = { ["all attributes"] = { "Str", "Dex", "Int", "All" }, ["devotion"] = "Devotion", ["tribute"] = "Tribute", - -- Life/Mana/Spirit/Darkness + -- Life/Mana/Spirit/Runic Ward/Darkness ["maximum darkness"] = "Darkness", ["spirit"] = "Spirit", ["maximum spirit"] = "Spirit", @@ -183,6 +183,7 @@ local modNameList = { ["maximum mana"] = "Mana", ["mana regeneration"] = "ManaRegen", ["mana regeneration rate"] = "ManaRegen", + ["runic ward regeneration rate"] = "WardRegen", ["mana cost"] = "ManaCost", ["mana cost of"] = "ManaCost", ["mana cost of skills"] = "ManaCost", @@ -208,6 +209,7 @@ local modNameList = { ["life cost efficiency of skills"] = "LifeCostEfficiency", ["spirit cost efficiency"] = "SpiritCostEfficiency", ["spirit cost efficiency of skills"] = "SpiritCostEfficiency", + ["runic ward cost efficiency"] = "WardCostEfficiency", ["energy shield cost efficiency"] = "ESCostEfficiency", ["energy shield cost efficiency of skills"] = "ESCostEfficiency", ["es cost efficiency"] = "ESCostEfficiency", @@ -243,6 +245,8 @@ local modNameList = { ["evasion rating"] = "Evasion", ["energy shield"] = "EnergyShield", ["ward"] = "Ward", + ["runic ward"] = "Ward", + ["maximum runic ward"] = "Ward", ["armour and evasion"] = "ArmourAndEvasion", ["armour and evasion rating"] = "ArmourAndEvasion", ["evasion rating and armour"] = "ArmourAndEvasion", @@ -250,7 +254,7 @@ local modNameList = { ["evasion rating and energy shield"] = "EvasionAndEnergyShield", ["global evasion rating and energy shield"] = { "Evasion", "EnergyShield" }, ["evasion and energy shield"] = "EvasionAndEnergyShield", - ["armour, evasion and energy shield"] = "Defences", + ["armour, evasion and energy shield"] = { "Armour", "Evasion", "EnergyShield" }, ["defences"] = "Defences", ["to evade"] = "EvadeChance", ["chance to evade"] = "EvadeChance", @@ -1600,6 +1604,8 @@ local modTagList = { ["per (%d+) of maximum life or maximum mana, whichever is lower"] = function(num) return { tag = { type = "PerStat", stat = "LowestOfMaximumLifeAndMaximumMana", div = num } } end, ["per (%d+) player maximum life"] = function(num) return { tag = { type = "PerStat", stat = "Life", div = num, actor = "parent" } } end, ["per (%d+) life cost"] = function(num) return { tag = { type = "PerStat", stat = "LifeCost", div = num}} end, + ["per (%d+) runic ward cost"] = function(num) return { tag = { type = "PerStat", stat = "WardCost", div = num}} end, + ["per (%d+) maximum runic ward"] = function(num) return { tag = { type = "PerStat", stat = "Ward", div = num } } end, ["per (%d+) maximum mana"] = function(num) return { tag = { type = "PerStat", stat = "Mana", div = num } } end, ["per (%d+) maximum mana, up to (%d+)%%"] = function(num, _, limit) return { tag = { type = "PerStat", stat = "Mana", div = num, limit = tonumber(limit), limitTotal = true } } end, ["per (%d+) maximum mana, up to a maximum of (%d+)%%"] = function(num, _, limit) return { tag = { type = "PerStat", stat = "Mana", div = num, limit = tonumber(limit), limitTotal = true } } end, @@ -1781,6 +1787,10 @@ local modTagList = { ["if used while y?o?u?%s?a?r?e?%s?on low life"] = { tag = { type = "Condition", var = "LowLife" } }, ["wh[ie][ln]e? y?o?u?%s?a?r?e?%s?on low life"] = { tag = { type = "Condition", var = "LowLife" } }, ["on reaching low life"] = { tag = { type = "Condition", var = "LowLife" } }, + ["while you are missing runic ward"] = { tag = { type = "Condition", var = "MissingRunicWard" } }, + ["while missing runic ward"] = { tag = { type = "Condition", var = "MissingRunicWard" } }, + ["while you have no runic ward"] = { tag = { type = "Condition", var = "NoRunicWard" } }, + ["wh[ie][ln]e? y?o?u?%s?a?r?e?%s?on low runic ward"] = { tag = { type = "Condition", var = "LowRunicWard" } }, ["wh[ie][ln]e? y?o?u?%s?a?r?e?%s?not on low life"] = { tag = { type = "Condition", var = "LowLife", neg = true } }, ["wh[ie][ln]e? y?o?u?%s?a?r?e?%s?on low mana"] = { tag = { type = "Condition", var = "LowMana" } }, ["if y?o?u?%s?a?r?e?%s?on low mana"] = { tag = { type = "Condition", var = "LowMana" } }, @@ -2281,6 +2291,9 @@ local specialModList = { ["enemies you kill during effect have a (%d+)%% chance to explode, dealing a (.+) of their maximum life as damage of a random element"] = function(chance, _, amount) -- Oriath's End return explodeFunc(chance, amount, "randomElement", { type = "Condition", var = "UsingFlask" }) end, + ["lose (%d+)%% life per second while you have no runic ward during effect"] = function(num) + return { mod("LifeDegenPercent", "BASE", num, { type = "Condition", var = "NoRunicWard" }, { type = "Condition", var = "UsingFlask" }) } + end, ["enemies you kill while affected by glorious madness have a (%d+)%% chance to explode, dealing a (.+) of their life as (.+) damage"] = function(chance, _, amount, type) -- Beacon of Madness return explodeFunc(chance, amount, type, { type = "Condition", var = "AffectedByGloriousMadness" }) end, @@ -2400,6 +2413,7 @@ local specialModList = { ["leech life (%d+)%% slower"] = function(num) return {mod("LifeLeechRate", "INC", -num)} end, ["leech life (%d+)%% faster"] = function(num) return {mod("LifeLeechRate", "INC", num)} end, ["life regeneration is applied to energy shield instead"] = { flag("ZealotsOath") }, + ["mana recovery from regeneration is also applied to runic ward"] = { flag("ManaRegenerationRecoversWard") }, ["excess life recovery from regeneration is applied to energy shield"] = { flag("ZealotsOath", { type = "Condition", var = "FullLife" }) }, ["life regeneration has no effect"] = { flag("NoLifeRegen") }, ["life recharges instead of energy shield"] = { flag("EnergyShieldRechargeAppliesToLife") }, @@ -2537,7 +2551,7 @@ local specialModList = { ["auras from your skills have (%d+)%% increased effect on you"] = function(num) return { mod("SkillAuraEffectOnSelf", "INC", num) } end, ["increases and reductions to mana regeneration rate instead apply to rage regeneration rate"] = { flag("ManaRegenToRageRegen") }, ["increases and reductions to maximum energy shield instead apply to ward"] = { flag("EnergyShieldToWard") }, - ["(%d+)%% of damage taken bypasses ward"] = function(num) return { mod("WardBypass", "BASE", num) } end, + ["all damage taken bypasses runic ward"] = { mod("WardBypass", "BASE", 100) }, ["maximum energy shield is (%d+)"] = function(num) return { mod("EnergyShield", "OVERRIDE", num ) } end, ["cannot have energy shield"] = { flag("CannotHaveES") }, ["regenerate ([%d%.]+) life per second per maximum energy shield"] = function(num) return { @@ -2581,6 +2595,7 @@ local specialModList = { }, ["life recovery from flasks also applies to energy shield"] = { flag("LifeFlaskAppliesToEnergyShield") }, ["life recovery from flasks applies to energy shield instead"] = { flag("LifeFlaskAppliesToEnergyShield"), flag("LifeFlaskDoesNotApply") }, + ["(%d+)%% life recovery from flasks also applies to runic ward"] = function(num) return { mod("LifeFlaskRecoveryAppliesToWard", "BASE", num) } end, ["non%-instant mana recovery from flasks is also recovered as life"] = { flag("ManaFlaskAppliesToLife") }, ["life leech effects recover energy shield instead while on full life"] = { flag("ImmortalAmbition", { type = "Condition", var = "FullLife" }, { type = "Condition", var = "LeechingLife" }) }, ["shepherd of souls"] = { mod("Damage", "MORE", -30, { type = "SkillType", skillType = SkillType.Vaal, neg = true }) }, @@ -5103,6 +5118,7 @@ local specialModList = { ["damage t?a?k?e?n? from blocked hits cannot bypass energy shield"] = { flag("BlockedDamageDoesntBypassES", { type = "Condition", var = "EVBypass", neg = true }) }, ["damage t?a?k?e?n? from unblocked hits always bypasses energy shield"] = { flag("UnblockedDamageDoesBypassES", { type = "Condition", var = "EVBypass", neg = true }) }, ["recover (%d+) life when you block"] = function(num) return { mod("LifeOnBlock", "BASE", num) } end, + ["recover (%d+) runic ward when you block"] = function(num) return { mod("WardOnBlock", "BASE", num) } end, ["recover (%d+) energy shield when you block spell damage"] = function(num) return { mod("EnergyShieldOnSpellBlock", "BASE", num) } end, ["recover (%d+) energy shield when you suppress spell damage"] = function(num) return { mod("EnergyShieldOnSuppress", "BASE", num) } end, ["recover (%d+) life when you suppress spell damage"] = function(num) return { mod("LifeOnSuppress", "BASE", num) } end, @@ -5383,7 +5399,6 @@ local specialModList = { } end, ["phasing while on low life"] = { flag("Condition:Phasing", { type = "Condition", var = "LowLife" }) }, ["cannot be ignited while on low life"] = { flag("IgniteImmune", { type = "Condition", var = "LowLife" }), }, - ["ward does not break during f?l?a?s?k? ?effect"] = { flag("WardNotBreak", { type = "Condition", var = "UsingFlask" }) }, ["stun threshold is based on energy shield instead of life"] = { flag("StunThresholdBasedOnEnergyShieldInsteadOfLife"), mod("StunThresholdEnergyShieldPercent", "BASE", 100), @@ -6362,6 +6377,7 @@ local suffixTypes = { ["converted to chaos damage"] = "ConvertToChaos", ["added as energy shield"] = "GainAsEnergyShield", ["as extra maximum energy shield"] = "GainAsEnergyShield", + ["as extra maximum runic ward"] = "GainAsWard", ["converted to energy shield"] = "ConvertToEnergyShield", ["as armour"] = "GainAsArmour", ["as extra armour"] = "GainAsArmour", @@ -6398,6 +6414,7 @@ local resourceTypes = { ["life"] = "Life", ["mana"] = "Mana", ["energy shield"] = "EnergyShield", + ["runic ward"] = "Ward", ["life and mana"] = { "Life", "Mana" }, ["life and energy shield"] = { "Life", "EnergyShield" }, ["life, mana and energy shield"] = { "Life", "Mana", "EnergyShield" },