diff --git a/src/Classes/CompareBuySimilar.lua b/src/Classes/CompareBuySimilar.lua index 3559161c67..e3ee86796b 100644 --- a/src/Classes/CompareBuySimilar.lua +++ b/src/Classes/CompareBuySimilar.lua @@ -134,7 +134,7 @@ local function buildURL(item, slotName, controls, modEntries, defenceEntries, is filter.value = { min = entry.value, max = entry.value } elseif entry.value then local minVal = tonumber(controls[prefix .. "Min"].buf) - + local maxVal = tonumber(controls[prefix .. "Max"].buf) local value = {} if minVal then @@ -434,7 +434,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/ImportTab.lua b/src/Classes/ImportTab.lua index 0dcb9c59d9..128d6e135e 100644 --- a/src/Classes/ImportTab.lua +++ b/src/Classes/ImportTab.lua @@ -48,7 +48,7 @@ local ImportTabClass = newClass("ImportTab", "ControlHost", "Control", function( self.controls.logoutApiButton.shown = function() return (self.charImportMode == "SELECTCHAR" or self.charImportMode == "GETACCOUNTNAME") and main.api.authToken ~= nil end - + self.controls.characterImportAnchor = new("Control", {"TOPLEFT",self.controls.sectionCharImport,"TOPLEFT"}, {6, 40, 200, 16}) self.controls.sectionCharImport.height = function() return self.charImportMode == "AUTHENTICATION" and 60 or 200 end @@ -441,7 +441,7 @@ function ImportTabClass:DownloadCharacterList() return "Standard" end end - + self.charImportMode = "DOWNLOADCHARLIST" self.charImportStatus = "Retrieving character list..." local realm = realmList[self.controls.accountRealm.selIndex] @@ -953,10 +953,10 @@ function ImportTabClass:ImportItemsAndSkills(charData) local funcGetGemInstance = function(skillData) local typeLine = sanitiseText(skillData.typeLine) .. (skillData.support and " Support" or "") local gemId = self.build.data.gemForBaseName[typeLine:lower()] - + if typeLine:match("^Spectre:") then gemId = "Metadata/Items/Gems/SkillGemSummonSpectre" - end + end if typeLine:match("^Companion:") then gemId = "Metadata/Items/Gems/SkillGemSummonBeast" end @@ -1060,7 +1060,7 @@ function ImportTabClass:ImportItemsAndSkills(charData) end for _, skillData in pairs(charData.skills) do local gemInstance = funcGetGemInstance(skillData) - + if gemInstance then local group = { label = "", enabled = true, gemList = { } } t_insert(group.gemList, gemInstance ) diff --git a/src/Classes/Item.lua b/src/Classes/Item.lua index 423f4769a3..ad3e906bcd 100644 --- a/src/Classes/Item.lua +++ b/src/Classes/Item.lua @@ -581,7 +581,7 @@ function ItemClass:ParseRaw(raw, rarity, highQuality) end 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 == "Runic Ward" then if specName == "Evasion Rating" then specName = "Evasion" if self.baseName == "Two-Toned Boots (Armour/Energy Shield)" then @@ -596,6 +596,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) @@ -1345,7 +1347,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/Classes/ItemsTab.lua b/src/Classes/ItemsTab.lua index d3ffb571c6..081601d866 100644 --- a/src/Classes/ItemsTab.lua +++ b/src/Classes/ItemsTab.lua @@ -3384,16 +3384,16 @@ function ItemsTabClass:AddItemTooltip(tooltip, item, slot, dbMode, maxWidth) tooltip:AddLine(fontSizeBig, s_format("^x7F7F7FChance to Block: %s%d%%", main:StatColor(armourData.BlockChance, base.armour.BlockChance), armourData.BlockChance), "FONTIN SC") end if armour > 0 then - tooltip:AddLine(fontSizeBig, s_format("^x7F7F7FArmour: %s%d", main:StatColor(armour, base.armour.ArmourBase), armour), "FONTIN SC") + tooltip:AddLine(fontSizeBig, s_format("^x7F7F7FArmour: %s%d", main:StatColor(armour, base.armour.Armour), armour), "FONTIN SC") end if evasion > 0 then - tooltip:AddLine(fontSizeBig, s_format("^x7F7F7FEvasion Rating: %s%d", main:StatColor(evasion, base.armour.EvasionBase), evasion), "FONTIN SC") + tooltip:AddLine(fontSizeBig, s_format("^x7F7F7FEvasion Rating: %s%d", main:StatColor(evasion, base.armour.Evasion), evasion), "FONTIN SC") end if energyShield > 0 then - tooltip:AddLine(fontSizeBig, s_format("^x7F7F7FEnergy Shield: %s%d", main:StatColor(energyShield, base.armour.EnergyShieldBase), energyShield), "FONTIN SC") + tooltip:AddLine(fontSizeBig, s_format("^x7F7F7FEnergy Shield: %s%d", main:StatColor(energyShield, base.armour.EnergyShield), energyShield), "FONTIN SC") end if ward > 0 then - tooltip:AddLine(fontSizeBig, s_format("^x7F7F7FRunic Ward: %s%d", main:StatColor(ward, base.armour.WardBase), ward), "FONTIN SC") + tooltip:AddLine(fontSizeBig, s_format("^x7F7F7FRunic Ward: %s%d", main:StatColor(ward, base.armour.Ward), ward), "FONTIN SC") end elseif base.flask then -- Flask-specific info diff --git a/src/Data/Global.lua b/src/Data/Global.lua index d877132bd6..b518ab9c4c 100644 --- a/src/Data/Global.lua +++ b/src/Data/Global.lua @@ -66,7 +66,8 @@ colorCodes = { SCOURGE = "^xFF6E25", CRUCIBLE = "^xFFA500", GEMDESCRIPTION = "^xBAAD85", - SPLITPERSONALITY = "^xFFD62A" + SPLITPERSONALITY = "^xFFD62A", + SPIRIT = "^xF5D076" } colorCodes.STRENGTH = colorCodes.MARAUDER colorCodes.DEXTERITY = colorCodes.RANGER @@ -74,7 +75,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 0dfbedaa30..34f0747fbd 100644 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -191,8 +191,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} @@ -748,6 +747,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}},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} @@ -803,8 +803,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% 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} c["+40% to Fire Resistance"]={{[1]={flags=0,keywordFlags=0,name="FireResist",type="BASE",value=40}},nil} @@ -860,8 +859,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% Surpassing chance to fire an additional Arrow"]={{[1]={flags=0,keywordFlags=2048,name="SurpassingProjectileChance",type="BASE",value=50}},nil} c["+50% to Cold Resistance"]={{[1]={flags=0,keywordFlags=0,name="ColdResist",type="BASE",value=50}},nil} c["+50% to Fire Resistance"]={{[1]={flags=0,keywordFlags=0,name="FireResist",type="BASE",value=50}},nil} @@ -922,6 +920,7 @@ c["+75 to Spirit"]={{[1]={flags=0,keywordFlags=0,name="Spirit",type="BASE",value c["+75 to all Attributes"]={{[1]={flags=0,keywordFlags=0,name="Str",type="BASE",value=75},[2]={flags=0,keywordFlags=0,name="Dex",type="BASE",value=75},[3]={flags=0,keywordFlags=0,name="Int",type="BASE",value=75},[4]={flags=0,keywordFlags=0,name="All",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}},nil} c["+75% to Cold Resistance"]={{[1]={flags=0,keywordFlags=0,name="ColdResist",type="BASE",value=75}},nil} c["+75% to Lightning Resistance"]={{[1]={flags=0,keywordFlags=0,name="LightningResist",type="BASE",value=75}},nil} c["+77 to maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=77}},nil} @@ -1113,8 +1112,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} @@ -1198,7 +1197,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 Grenade Area of Effect"]={{[1]={[1]={includeTransfigured=true,skillName="Grenade",type="SkillName"},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} c["10% increased Ignite Duration on Enemies"]={{[1]={flags=0,keywordFlags=0,name="EnemyIgniteDuration",type="INC",value=10}},nil} @@ -1337,8 +1336,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 Attack Damage while Surrounded"]={{[1]={[1]={type="Condition",var="Surrounded"},flags=1,keywordFlags=0,name="Damage",type="INC",value=100}},nil} c["100% increased Attack Speed"]={{[1]={flags=1,keywordFlags=0,name="Speed",type="INC",value=100}},nil} @@ -1471,7 +1470,7 @@ c["12% increased Energy Shield Recharge Rate"]={{[1]={flags=0,keywordFlags=0,nam c["12% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=12}},nil} 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 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 Grenade Damage"]={{[1]={[1]={includeTransfigured=true,skillName="Grenade",type="SkillName"},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} c["12% increased Immobilisation buildup"]={{[1]={flags=0,keywordFlags=0,name="EnemyImmobilisationBuildup",type="INC",value=12}},nil} @@ -1509,7 +1508,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} @@ -1595,7 +1594,7 @@ c["15% increased Area of Effect while you have a Totem"]={{[1]={[1]={type="Condi c["15% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=15}},nil} 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} @@ -1730,7 +1729,7 @@ c["15% increased effect of Fully Broken Armour"]={{[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 maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="MORE",value=-15}},nil} c["15% less maximum Mana"]={{[1]={flags=0,keywordFlags=0,name="Mana",type="MORE",value=-15}},nil} c["15% more Damage against Enemies affected by Blood Boils"]={{[1]={flags=0,keywordFlags=0,name="Damage",type="MORE",value=15}}," against Enemies affected by Blood Boils "} @@ -1773,7 +1772,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 Critical Hit Chance"]={{[1]={flags=0,keywordFlags=0,name="CritChance",type="INC",value=150}},nil} c["150% increased Effect of Jewel Socket Passive Skills"]={{[1]={flags=0,keywordFlags=0,name="LocalEffect",type="INC",value=150}}," of Jewel Socket Passive Skills "} @@ -1840,7 +1839,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 Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=175}},nil} c["175% increased Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EvasionAndEnergyShield",type="INC",value=175}},nil} c["175% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=175}},nil} @@ -1964,9 +1963,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} @@ -2131,7 +2130,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 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} c["20% less Damage taken if you have not been Hit Recently"]={{[1]={[1]={neg=true,type="Condition",var="BeenHitRecently"},flags=0,keywordFlags=0,name="DamageTaken",type="MORE",value=-20}},nil} @@ -2192,7 +2191,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 Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=200}},nil} c["200% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=200}},nil} @@ -2211,7 +2210,7 @@ c["22% increased Attack Speed"]={{[1]={flags=1,keywordFlags=0,name="Speed",type= c["22% increased Critical Damage Bonus for Attack Damage"]={{[1]={flags=1,keywordFlags=0,name="CritMultiplier",type="INC",value=22}},nil} c["22% increased Critical Hit Chance for Attacks"]={{[1]={flags=1,keywordFlags=0,name="CritChance",type="INC",value=22}},nil} c["22.5 Life Regeneration per second"]={{[1]={flags=0,keywordFlags=0,name="LifeRegen",type="BASE",value=22.5}},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["23% increased Attack Speed"]={{[1]={flags=1,keywordFlags=0,name="Speed",type="INC",value=23}},nil} @@ -2282,7 +2281,7 @@ c["25% increased Armour Break Duration"]={{[1]={flags=0,keywordFlags=0,name="Arm c["25% increased Armour Break Duration 25% increased Attack Area Damage"]={{[1]={flags=512,keywordFlags=0,name="Armour",type="INC",value=25}}," Break Duration 25% increased Attack Damage "} 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 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} c["25% 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=25}},nil} @@ -2418,7 +2417,7 @@ c["25% of Maximum Life Converted to Energy Shield"]={{[1]={flags=0,keywordFlags= 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 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 Cast Speed"]={{[1]={flags=16,keywordFlags=0,name="Speed",type="INC",value=-25}},nil} c["25% reduced Curse Duration"]={{[1]={flags=0,keywordFlags=2,name="Duration",type="INC",value=-25}},nil} @@ -2446,7 +2445,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 Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=250}},nil} c["250% increased Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EvasionAndEnergyShield",type="INC",value=250}},nil} @@ -2555,7 +2554,7 @@ 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 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 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 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} c["30% increased Attack Damage if you've Cast a Spell Recently"]={{[1]={[1]={type="Condition",var="CastSpellRecently"},flags=1,keywordFlags=0,name="Damage",type="INC",value=30}},nil} @@ -2709,7 +2708,7 @@ c["30% reduced Energy Shield Recharge Rate"]={{[1]={flags=0,keywordFlags=0,name= c["30% reduced Evasion Rating if you have been Hit Recently"]={{[1]={[1]={type="Condition",var="BeenHitRecently"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=-30}},nil} c["30% reduced Evasion Rating if you haven't been Hit Recently"]={{[1]={[1]={neg=true,type="Condition",var="BeenHitRecently"},flags=0,keywordFlags=0,name="Evasion",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} @@ -2729,7 +2728,7 @@ c["300% increased Amount Recovered"]={{[1]={flags=0,keywordFlags=0,name="FlaskRe c["300% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=300}},nil} 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, 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} @@ -2785,7 +2784,7 @@ c["35% reduced Flask Effect Duration"]={{[1]={flags=0,keywordFlags=0,name="Flask c["35% reduced Presence Area of Effect"]={{[1]={flags=0,keywordFlags=0,name="PresenceArea",type="INC",value=-35}},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 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} @@ -2805,7 +2804,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} @@ -2984,7 +2983,7 @@ c["40% reduced Shock duration on you"]={{[1]={flags=0,keywordFlags=0,name="SelfS 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% increased Cast Speed"]={{[1]={flags=16,keywordFlags=0,name="Speed",type="INC",value=41}},nil} c["43% increased Melee Damage against Heavy Stunned enemies"]={{[1]={[1]={actor="enemy",type="ActorCondition",var="HeavyStunned"},flags=256,keywordFlags=0,name="Damage",type="INC",value=43}},nil} @@ -3029,7 +3028,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} @@ -3123,7 +3122,7 @@ c["50% increased Armour and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name=" c["50% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="ArmourAndEvasion",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} @@ -3351,7 +3350,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} @@ -3459,7 +3458,7 @@ c["8% increased Area of Effect for Attacks"]={{[1]={flags=1,keywordFlags=0,name= 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} @@ -3554,7 +3553,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} @@ -6117,8 +6116,8 @@ c["Lose 2% of maximum Life on Kill"]={{[1]={[1]={percent=2,stat="Life",type="Per c["Lose 3% of maximum Life and Energy Shield when you use a Chaos Skill"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=-3}}," and Energy Shield when you use a Chaos Skill "} 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="UsingFlask"},flags=0,keywordFlags=0,name="LifeDegenPercent",type="BASE",value=5}}," while you have no "} +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 Mana Recovery from Flasks can Overflow maximum Mana "} 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} diff --git a/src/Data/SkillStatMap.lua b/src/Data/SkillStatMap.lua index edbc8862ee..80d009e3be 100644 --- a/src/Data/SkillStatMap.lua +++ b/src/Data/SkillStatMap.lua @@ -1753,6 +1753,10 @@ return { ["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 108f0a5eab..a0d09a6241 100644 --- a/src/Data/Skills/other.lua +++ b/src/Data/Skills/other.lua @@ -12410,6 +12410,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 = { @@ -14668,6 +14681,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 = { @@ -15308,6 +15330,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/bases.lua b/src/Export/Scripts/bases.lua index ccf804458c..86b5ddefa2 100644 --- a/src/Export/Scripts/bases.lua +++ b/src/Export/Scripts/bases.lua @@ -364,7 +364,7 @@ directiveTable.base = function(state, args, out) end end out:write('},\n}\n') - + if not hidden then bases[state.type] = bases[state.type] or {} local subtype = state.subType and #state.subType and state.subType or "" diff --git a/src/Export/Skills/other.txt b/src/Export/Skills/other.txt index 238fb0f104..032e0a209e 100644 --- a/src/Export/Skills/other.txt +++ b/src/Export/Skills/other.txt @@ -827,6 +827,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 @@ -997,6 +1011,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 @@ -1047,6 +1071,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 84f03259ea..e32491b853 100644 --- a/src/Modules/Build.lua +++ b/src/Modules/Build.lua @@ -2164,7 +2164,7 @@ function buildMode:AddDisplayStatList(statList, actor) 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 538efd46ca..eb1662cd5f 100644 --- a/src/Modules/BuildDisplayStats.lua +++ b/src/Modules/BuildDisplayStats.lua @@ -88,6 +88,8 @@ 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 = "WardPerSecondCost", label = "Ward Cost per second", 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 }, @@ -117,6 +119,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 }, + { 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 }, + { stat = "SpiritUnreservedPercent", label = "Unreserved Spirit", fmt = "d%%", color = colorCodes.SPIRIT, condFunc = function(v,o) return v < 100 end }, + { }, { stat = "Life", label = "Total Life", fmt = "d", color = colorCodes.LIFE, compPercent = true }, { 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 }, @@ -136,10 +142,6 @@ local displayStats = { { stat = "ManaLeechGainRate", label = "Mana Leech/On Hit Rate", fmt = ".1f", color = colorCodes.MANA, compPercent = true }, { 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 }, - { 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 }, - { stat = "SpiritUnreservedPercent", label = "Unreserved Spirit", fmt = "d%%", color = colorCodes.SPIRIT, condFunc = function(v,o) return v < 100 end }, - { }, { stat = "EnergyShield", label = "Energy Shield", fmt = "d", color = colorCodes.ES, compPercent = true }, { 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%%" }, @@ -148,6 +150,10 @@ local displayStats = { { stat = "EnergyShieldLeechGainRate", label = "ES Leech/On Hit Rate", color = colorCodes.ES, fmt = ".1f", compPercent = true }, { 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 }, { }, @@ -155,6 +161,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 }, diff --git a/src/Modules/CalcActiveSkill.lua b/src/Modules/CalcActiveSkill.lua index 90af8a6c68..3cd40cb427 100644 --- a/src/Modules/CalcActiveSkill.lua +++ b/src/Modules/CalcActiveSkill.lua @@ -667,7 +667,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 a96b386bdd..e4e2423270 100644 --- a/src/Modules/CalcDefence.lua +++ b/src/Modules/CalcDefence.lua @@ -510,7 +510,6 @@ 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 energyShield = poolTbl.EnergyShield or output.EnergyShieldRecoveryCap local mana = poolTbl.Mana or output.ManaUnreserved or 0 @@ -569,12 +568,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 @@ -651,10 +644,22 @@ 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 then + local tempDamage = m_min(damageRemainder * (1 - (modDB:Sum("BASE", nil, "WardBypass") or 0) / 100), 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 @@ -667,7 +672,7 @@ function calcs.reducePoolsByDamage(poolTable, damageTable, actor) AlliesTakenBeforeYou = alliesTakenBeforeYou, Aegis = aegis, Guard = guard, - Ward = restoreWard, + Ward = ward, EnergyShield = energyShield, Mana = mana, Life = life, @@ -726,9 +731,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 @@ -742,6 +744,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 @@ -1308,6 +1313,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" }, modsTotal = { "WardTotal" }, defence = true }, } for _, source in ipairs(resourceList) do output[source.name] = (output[source.name] or 0) @@ -1412,7 +1418,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 @@ -1649,7 +1655,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 @@ -1694,6 +1700,10 @@ function calcs.defence(env, actor) modDB:NewMod("OverflowEnergyShieldRecovery", "BASE", output.LifeRegenRecovery - recoveryRate, "Zealot's Oath") output[resource.."RegenRecovery"] = 0 end + if resource == "Mana" and modDB:Flag(nil, "RuneOfEquinox") and output[resource.."RegenRecovery"] > 0 then + ConPrintf("YES") + modDB:NewMod("WardRegen", "BASE", output[resource.."RegenRecovery"], "Rune of Equinox") + end if output[resource.."RegenRecovery"] > 0 then modDB:NewMod("Condition:CanGain"..resource, "FLAG", true, resourceName.."Regen") end @@ -1861,18 +1871,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) @@ -1923,6 +1921,9 @@ function calcs.defence(env, actor) output.ManaOnBlock = modDB:Sum("BASE", nil, "ManaOnBlock") + output.WardOnBlock = modDB:Sum("BASE", nil, "WardOnBlock") + output.WardOnSuppress = modDB:Sum("BASE", nil, "WardOnSuppress") + output.EnergyShieldOnBlock = modDB:Sum("BASE", nil, "EnergyShieldOnBlock") output.EnergyShieldOnSpellBlock = modDB:Sum("BASE", nil, "EnergyShieldOnSpellBlock") output.EnergyShieldOnSuppress = modDB:Sum("BASE", nil, "EnergyShieldOnSuppress") @@ -2973,6 +2974,16 @@ function calcs.buildDefenceEstimations(env, actor) output[damageType.."TotalHitPool"] = output[damageType.."TotalHitPool"] + output.EnergyShieldRecoveryCap / chaosESMultiplier end end + local ward = output.Ward or 0 + if ward > 0 then + local wardBypass = (modDB:Sum("BASE", nil, "WardBypass") or 0) / 100 + if wardBypass > 0 then + local poolProtected = ward / (1 - wardBypass) * wardBypass + output[damageType.."TotalPool"] = m_max(output[damageType.."TotalPool"] - poolProtected, 0) + m_min(output[damageType.."TotalPool"], poolProtected) / wardBypass + else + output[damageType.."TotalPool"] = output[damageType.."TotalPool"] + ward + end + end if breakdown then breakdown[damageType.."TotalPool"] = { s_format("Life: %d", output.LifeRecoverable) @@ -2986,6 +2997,9 @@ function calcs.buildDefenceEstimations(env, actor) elseif esBypass < 1 then t_insert(breakdown[damageType.."TotalPool"], s_format("Non-bypassed Energy Shield: %d", output[damageType.."TotalPool"] - 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 end @@ -3073,7 +3087,7 @@ function calcs.buildDefenceEstimations(env, actor) local damageTotal = 0 local maxDamage = data.misc.ehpCalcMaxDamage local maxIterations = data.misc.ehpCalcMaxIterationsToCalc - while poolTable.Life > 0 and DamageIn["iterations"] < maxIterations do + while (poolTable.Life > 0 or poolTable.Ward > 0) and DamageIn["iterations"] < maxIterations do DamageIn["iterations"] = DamageIn["iterations"] + 1 local Damage = { } damageTotal = 0 @@ -3089,17 +3103,19 @@ 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) -- If still living and the amount of damage exceeds maximum threshold we survived infinite number of hits. - if poolTable.Life > 0 and damageTotal >= maxDamage then + if (poolTable.Life > 0 or poolTable.Ward > 0) and damageTotal >= maxDamage then return m_huge end - if DamageIn.GainWhenHit and poolTable.Life > 0 then + if DamageIn.GainWhenHit and (poolTable.Life > 0 or poolTable.Ward > 0) then 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 @@ -3118,6 +3134,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"] @@ -3184,6 +3201,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 @@ -3201,10 +3219,12 @@ function calcs.buildDefenceEstimations(env, actor) end DamageIn.EnergyShieldWhenHit = (DamageIn.EnergyShieldWhenHit or 0) + output.EnergyShieldOnSuppress * suppressChance DamageIn.LifeWhenHit = (DamageIn.LifeWhenHit or 0) + output.LifeOnSuppress * suppressChance + DamageIn.WardWhenHit = (DamageIn.WardWhenHit or 0) + output.WardOnSuppress * suppressChance suppressionEffect = 1 - suppressChance * output.SpellSuppressionEffect / 100 else DamageIn.EnergyShieldWhenHit = (DamageIn.EnergyShieldWhenHit or 0) + output.EnergyShieldOnSuppress * ( damageCategoryConfig == "Average" and 0.5 or 1 ) DamageIn.LifeWhenHit = (DamageIn.LifeWhenHit or 0) + output.LifeOnSuppress * ( damageCategoryConfig == "Average" and 0.5 or 1 ) + DamageIn.WardWhenHit = (DamageIn.WardWhenHit or 0) + output.WardOnSuppress * ( damageCategoryConfig == "Average" and 0.5 or 1 ) end local effectiveDeflectMulti = output.DeflectChance < 100 and 1 - output.DeflectChance * output.DeflectEffect / 10000 or 1 -- extra avoid chance @@ -3215,13 +3235,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) @@ -3620,7 +3641,7 @@ function calcs.buildDefenceEstimations(env, actor) local hitTaken = 0 local effectiveAppliedArmour = output[damageConvertedType.."EffectiveAppliedArmour"] local damageConvertedMulti = convertPercent / 100 - local totalHitPool = output[damageConvertedType.."TotalHitPool"] + local totalHitPool = output[damageConvertedType.."TotalHitPool"] - 1 local totalTakenMulti = output[damageConvertedType.."AfterReductionTakenHitMulti"] * (1 - output["VaalArcticArmourMitigation"]) if damageConvertedMulti <= 0 then local takenWithoutIncoming = m_max(takenFlat, 0) * totalTakenMulti @@ -3847,8 +3868,10 @@ 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 totalWardDegen = 0 local totalEnergyShieldDegen = 0 if breakdown then breakdown.NetLifeRegen = { @@ -3875,12 +3898,21 @@ function calcs.buildDefenceEstimations(env, actor) { label = "Degen", key = "degen" }, }, } + breakdown.NetWardRegen = { + label = "Total Runic Ward Degen", + rowList = { }, + colList = { + { label = "Type", key = "type" }, + { label = "Degen", key = "degen" }, + }, + } end for _, damageType in ipairs(dmgTypeList) do if output[damageType.."BuildDegen"] then local energyShieldDegen = 0 local lifeDegen = 0 local manaDegen = 0 + local wardDegen = 0 local takenFromMana = output[damageType.."MindOverMatter"] + output["sharedMindOverMatter"] if output.EnergyShieldRegenRecovery > 0 then if modDB:Flag(nil, "EnergyShieldProtectsMana") then @@ -3897,6 +3929,7 @@ function calcs.buildDefenceEstimations(env, actor) end totalLifeDegen = totalLifeDegen + lifeDegen totalManaDegen = totalManaDegen + manaDegen + totalWardDegen = totalWardDegen + wardDegen totalEnergyShieldDegen = totalEnergyShieldDegen + energyShieldDegen if breakdown then t_insert(breakdown.NetLifeRegen.rowList, { @@ -3907,6 +3940,10 @@ function calcs.buildDefenceEstimations(env, actor) type = s_format("%s", damageType), degen = s_format("%.2f", manaDegen), }) + t_insert(breakdown.NetWardRegen.rowList, { + type = s_format("%s", damageType), + degen = s_format("%.2f", wardDegen), + }) t_insert(breakdown.NetEnergyShieldRegen.rowList, { type = s_format("%s", damageType), degen = s_format("%.2f", energyShieldDegen), @@ -3916,8 +3953,9 @@ function calcs.buildDefenceEstimations(env, actor) end output.NetLifeRegen = output.NetLifeRegen - totalLifeDegen output.NetManaRegen = output.NetManaRegen - totalManaDegen + output.NetWardRegen = output.NetWardRegen - totalWardDegen 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)) @@ -3925,6 +3963,9 @@ 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)) + t_insert(breakdown.NetWardRegen, s_format("%.1f ^8(total runic ward regen)", output.WardRegenRecovery)) + t_insert(breakdown.NetWardRegen, s_format("- %.1f ^8(total runic ward degen)", totalWardDegen)) + t_insert(breakdown.NetWardRegen, s_format("= %.1f", output.RunicNetWardRegen)) 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)) @@ -3932,6 +3973,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 @@ -4087,9 +4129,11 @@ 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 + local totalWardDegen = 0 local totalEnergyShieldDegen = 0 if breakdown then breakdown.ComprehensiveNetLifeRegen = { @@ -4108,6 +4152,14 @@ function calcs.buildDefenceEstimations(env, actor) { label = "Degen", key = "degen" }, }, } + breakdown.ComprehensiveNetWardRegen = { + label = "Total Runic Ward Degen", + rowList = { }, + colList = { + { label = "Type", key = "type" }, + { label = "Degen", key = "degen" }, + }, + } breakdown.ComprehensiveNetEnergyShieldRegen = { label = "Total Energy Shield Degen", rowList = { }, @@ -4139,6 +4191,7 @@ function calcs.buildDefenceEstimations(env, actor) end totalLifeDegen = totalLifeDegen + lifeDegen totalManaDegen = totalManaDegen + manaDegen + totalWardDegen = totalWardDegen + wardDegen totalEnergyShieldDegen = totalEnergyShieldDegen + energyShieldDegen if breakdown then t_insert(breakdown.ComprehensiveNetLifeRegen.rowList, { @@ -4149,6 +4202,10 @@ function calcs.buildDefenceEstimations(env, actor) type = s_format("%s", damageType), degen = s_format("%.2f", manaDegen), }) + t_insert(breakdown.ComprehensiveNetWardRegen.rowList, { + type = s_format("%s", damageType), + degen = s_format("%.2f", wardDegen), + }) t_insert(breakdown.ComprehensiveNetEnergyShieldRegen.rowList, { type = s_format("%s", damageType), degen = s_format("%.2f", energyShieldDegen), @@ -4158,6 +4215,7 @@ function calcs.buildDefenceEstimations(env, actor) end output.ComprehensiveNetLifeRegen = output.ComprehensiveNetLifeRegen + (output.LifeRecoupRecoveryAvg or 0) - totalLifeDegen - (output.LifeLossLostAvg or 0) output.ComprehensiveNetManaRegen = output.ComprehensiveNetManaRegen + (output.ManaRecoupRecoveryAvg or 0) - totalManaDegen + output.ComprehensiveNetWardRegen = output.ComprehensiveNetWardRegen + (output.WardRecoupRecoveryAvg or 0) - totalWardDegen output.ComprehensiveNetEnergyShieldRegen = output.ComprehensiveNetEnergyShieldRegen + (output.EnergyShieldRecoupRecoveryAvg or 0) - totalEnergyShieldDegen output.ComprehensiveTotalNetRegen = output.ComprehensiveNetLifeRegen + output.ComprehensiveNetManaRegen + output.ComprehensiveNetEnergyShieldRegen if breakdown then @@ -4265,10 +4323,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 "")) @@ -4288,6 +4342,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 a750c61c45..33aebb0bb9 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -111,7 +111,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 @@ -149,7 +149,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 @@ -290,7 +290,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) @@ -390,7 +390,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 @@ -553,7 +553,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 @@ -967,7 +967,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") @@ -1125,7 +1125,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") @@ -1655,7 +1655,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), @@ -1669,9 +1669,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 @@ -1710,14 +1710,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, { @@ -2035,17 +2035,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 = "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 = "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 = "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 }, @@ -2059,6 +2062,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 @@ -2102,6 +2107,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" 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 @@ -2569,7 +2586,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")) @@ -2579,7 +2596,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 @@ -2648,7 +2665,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 }) @@ -2831,12 +2848,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 @@ -3165,7 +3182,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 @@ -3395,7 +3412,7 @@ function calcs.offence(env, actor, activeSkill) end end end - + output.FistOfWarDamageEffect = 1 output.AncestralCallDamageEffect = 1 output.AncestralEmpowermentDamageEffect = 1 @@ -3874,7 +3891,7 @@ function calcs.offence(env, actor, activeSkill) end output.DoubleDamageEffect = output.DoubleDamageChance / 100 output.ScaledDamageEffect = output.ScaledDamageEffect * (1 + output.DoubleDamageEffect + output.TripleDamageEffect) - + skillData.dpsMultiplier = ( skillData.dpsMultiplier or 1 ) * calcLib.mod(skillModList, skillCfg, "DPS") local hitRate = output.HitChance / 100 * (globalOutput.HitSpeed or globalOutput.Speed) * skillData.dpsMultiplier @@ -4227,7 +4244,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) @@ -4608,7 +4625,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") @@ -4846,7 +4863,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 @@ -4874,7 +4891,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 @@ -4914,7 +4931,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 @@ -5359,7 +5376,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 @@ -5372,14 +5389,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 @@ -5393,7 +5410,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 @@ -5415,7 +5432,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)) @@ -5697,7 +5714,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 @@ -5938,7 +5955,7 @@ function calcs.offence(env, actor, activeSkill) end end end - + if skillModList:Flag(nil, "DotCanStack") then skillFlags.DotCanStack = true local speed = output.Speed @@ -6051,7 +6068,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("")) @@ -6185,7 +6202,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/CalcSections.lua b/src/Modules/CalcSections.lua index 4872f633a9..473a0a47e7 100644 --- a/src/Modules/CalcSections.lua +++ b/src/Modules/CalcSections.lua @@ -62,46 +62,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" }, }, @@ -127,7 +127,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" }, @@ -152,31 +152,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", @@ -199,7 +199,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" }, @@ -224,32 +224,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" }, }, @@ -271,7 +271,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" }, @@ -296,61 +296,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" }, }, }, } } @@ -366,21 +366,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" }, }, @@ -394,14 +394,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" }, }, @@ -485,7 +485,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" }, @@ -551,58 +551,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" }, }, }, @@ -665,6 +665,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 = "Ward Cost", color = colorCodes.WARD, haveOutput = "WardHasCost", { format = "{0:output:WardCost}", { breakdown = "WardCost" }, { modName = { "WardCost", "Cost", "WardCostNoMult" }, cfg = "skill" }, }, }, + { label = "Ward per second", color = colorCodes.WARD, haveOutput = "WardPerSecondHasCost", { format = "{2:output:WardPerSecondCost}", { breakdown = "WardPerSecondCost" }, { modName = { "WardCost", "Cost", "WardCostNoMult" }, cfg = "skill" }, }, }, + { label = "Ward % per second", color = colorCodes.WARD, haveOutput = "WardPercentPerSecondHasCost", { format = "{2:output:WardPercentPerSecondCost}", { breakdown = "WardPercentPerSecondCost" }, { 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"} }, }, @@ -679,8 +682,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}", @@ -688,7 +691,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" }, @@ -714,9 +717,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" }, @@ -747,7 +750,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" }, @@ -795,8 +798,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" }, }, }, @@ -810,7 +813,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", @@ -826,7 +829,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" }, }, }, @@ -846,9 +849,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}", @@ -856,12 +859,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" }, }, }, @@ -871,9 +874,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"}, }, }, @@ -882,44 +885,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" }, }, }, }, @@ -929,7 +932,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" }, @@ -945,24 +948,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}%", @@ -986,7 +989,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" }, @@ -1024,9 +1027,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}", @@ -1039,18 +1042,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" }, @@ -1071,12 +1074,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" }, }, }, @@ -1087,22 +1090,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" }, @@ -1125,21 +1128,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 }, @@ -1156,127 +1159,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"}, }, }, } } } }, @@ -1299,7 +1302,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 }, @@ -1443,22 +1446,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 }, }, }, @@ -1466,32 +1469,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 }, }, }, @@ -1499,7 +1502,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 }, }, }, @@ -1555,51 +1558,51 @@ return { { label = "Reserved", { format = "{0:output:LifeReserved} ({0:output:LifeReservedPercent}%)", { breakdown = "LifeReserved" }, }, }, { 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" }, @@ -1618,12 +1621,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" }, @@ -1652,21 +1655,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" }, @@ -1709,6 +1712,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}", @@ -1769,7 +1788,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 }, @@ -1809,14 +1828,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 = "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 = { @@ -1957,13 +1977,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" } }, }, }, @@ -2019,8 +2039,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", @@ -2029,8 +2049,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", @@ -2040,32 +2060,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", @@ -2081,7 +2101,7 @@ return { } }, }, { format = "{2:output:LightningTakenDamage}", - { breakdown = "LightningTakenDamage" }, + { breakdown = "LightningTakenDamage" }, { label = "Lightning Taken as", modName = { "LightningDamageTakenAsPhysical", "LightningDamageFromHitsTakenAsPhysical", "LightningDamageTakenAsCold", "LightningDamageFromHitsTakenAsCold", @@ -2097,7 +2117,7 @@ return { } }, }, { format = "{2:output:ColdTakenDamage}", - { breakdown = "ColdTakenDamage" }, + { breakdown = "ColdTakenDamage" }, { label = "Cold Taken as", modName = { "ColdDamageTakenAsPhysical", "ColdDamageFromHitsTakenAsPhysical", "ColdDamageTakenAsLightning", "ColdDamageFromHitsTakenAsLightning", @@ -2112,8 +2132,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", @@ -2129,7 +2149,7 @@ return { } }, }, { format = "{2:output:ChaosTakenDamage}", - { breakdown = "ChaosTakenDamage" }, + { breakdown = "ChaosTakenDamage" }, { label = "Chaos Taken as", modName = { "ChaosDamageTakenAsPhysical", "ChaosDamageFromHitsTakenAsPhysical", "ChaosDamageTakenAsLightning", "ChaosDamageFromHitsTakenAsLightning", @@ -2149,97 +2169,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", @@ -2263,7 +2283,7 @@ return { }, }, { label = "Mind over Matter %", haveOutput = "AnySpecificMindOverMatter", - { format = "{0:output:sharedMindOverMatter}%", + { format = "{0:output:sharedMindOverMatter}%", { breakdown = "sharedMindOverMatter" }, { modName = "DamageTakenFromManaBeforeLife" }, }, @@ -2380,19 +2400,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 = { @@ -2405,20 +2425,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 = { @@ -2429,7 +2449,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" } }, @@ -2449,7 +2469,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" } }, @@ -2469,24 +2489,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" }, }, @@ -2501,8 +2521,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", @@ -2519,7 +2539,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", @@ -2536,7 +2556,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", @@ -2552,14 +2572,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 = { @@ -2570,7 +2590,7 @@ return { } }, }, { format = "x {2:output:ChaosTakenDotMult}", - { breakdown = "ChaosTakenDotMult" }, + { breakdown = "ChaosTakenDotMult" }, { modName = { "DamageTaken", "DamageTakenOverTime", "ChaosDamageTaken", "ChaosDamageTakenOverTime", "SelfIgnoreChaosResistance" } }, { label = "Chaos Taken as", modName = { "ChaosDamageTakenAsPhysical", @@ -2588,62 +2608,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" }, }, }, @@ -2663,23 +2683,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 62d1f816c7..b725a37416 100644 --- a/src/Modules/CalcSetup.lua +++ b/src/Modules/CalcSetup.lua @@ -616,6 +616,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 12f8169c40..b6805eaf67 100644 --- a/src/Modules/Calcs.lua +++ b/src/Modules/Calcs.lua @@ -99,7 +99,7 @@ local function getCalculator(build, fullInit, modFunc) -- Call function to make modifications to the environment modFunc(env, ...) - + -- Run calculation pass calcs.perform(env) fullDPS = calcs.calcFullDPS(build, "CALCULATOR", {}, { cachedPlayerDB = cachedPlayerDB, cachedEnemyDB = cachedEnemyDB, cachedMinionDB = cachedMinionDB, env = nil}) @@ -108,7 +108,7 @@ local function getCalculator(build, fullInit, modFunc) env.player.output.FullDotDPS = fullDPS.TotalDotDPS return env.player.output - end, baseOutput + end, baseOutput end -- Get fast calculator for adding tree node modifiers @@ -137,7 +137,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}) @@ -417,7 +417,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) @@ -447,7 +447,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") @@ -512,7 +512,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 @@ -522,7 +522,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 ffabe09e16..b398e163af 100644 --- a/src/Modules/ConfigOptions.lua +++ b/src/Modules/ConfigOptions.lua @@ -158,6 +158,13 @@ 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 = "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 +192,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") @@ -1574,7 +1581,7 @@ Huge sets the radius to 11. { var = "conditionHaveArborix", type = "check", label = "Do you have Iron Reflexes?", ifFlag = "Condition:HaveArborix", tooltip = "This option is specific to Arborix.",apply = function(val, modList, enemyModList) modList:NewMod("Condition:HaveIronReflexes", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) modList:NewMod("Keystone", "LIST", "Iron Reflexes", "Config") - end }, + end }, { var = "conditionHaveAugyre", type = "list", label = "Augyre rotating buff:", ifFlag = "Condition:HaveAugyre", list = {{val="EleOverload",label="Elemental Overload"},{val="ResTechnique",label="Resolute Technique"}}, tooltip = "This option is specific to Augyre.", apply = function(val, modList, enemyModList) if val == "EleOverload" then modList:NewMod("Condition:HaveElementalOverload", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) @@ -1583,7 +1590,7 @@ Huge sets the radius to 11. modList:NewMod("Condition:HaveResoluteTechnique", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) modList:NewMod("Keystone", "LIST", "Resolute Technique", "Config") end - end }, + end }, { var = "conditionHaveVulconus", type = "check", label = "Do you have Avatar Of Fire?", ifFlag = "Condition:HaveVulconus", tooltip = "This option is specific to Vulconus.", apply = function(val, modList, enemyModList) modList:NewMod("Condition:HaveAvatarOfFire", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) modList:NewMod("Keystone", "LIST", "Avatar of Fire", "Config") @@ -2183,7 +2190,7 @@ Huge sets the radius to 11. build.configTab.varControls['enemyColdDamage']:SetPlaceholder(defaultDamage, true) build.configTab.varControls['enemyFireDamage']:SetPlaceholder(defaultDamage, true) build.configTab.varControls['enemyChaosDamage']:SetPlaceholder(defaultDamage, true) - + local rollRangeMult = m_min(m_max(build.configTab.input['enemyDamageRollRange'] or build.configTab.varControls['enemyDamageRollRange'].placeholder, 0), 100) for damageType, damageMult in pairs(bossData.DamageMultipliers) do if isUber and bossData.UberDamageMultiplier then @@ -2198,7 +2205,7 @@ Huge sets the radius to 11. build.configTab.varControls['enemyLightningPen']:SetPlaceholder(defaultPen, true) build.configTab.varControls['enemyColdPen']:SetPlaceholder(defaultPen, true) build.configTab.varControls['enemyFirePen']:SetPlaceholder(defaultPen, true) - + if bossData.DamagePenetrations then for penType, pen in pairs(bossData.DamagePenetrations) do if isUber and bossData.UberDamagePenetrations and bossData.UberDamagePenetrations[penType] then @@ -2208,13 +2215,13 @@ Huge sets the radius to 11. end end end - + if bossData.DamageType then build.configTab.varControls['enemyDamageType']:SelByValue(bossData.DamageType, "val") build.configTab.input['enemyDamageType'] = bossData.DamageType end build.configTab.varControls['enemyDamageType'].enabled = false - + if isUber and bossData.UberSpeed then build.configTab.varControls['enemySpeed']:SetPlaceholder(bossData.UberSpeed, true) elseif bossData.speed then @@ -2223,7 +2230,7 @@ Huge sets the radius to 11. if bossData.critChance then build.configTab.varControls['enemyCritChance']:SetPlaceholder(bossData.critChance, true) end - + modList:NewMod("BossSkillActive", "FLAG", true, "Config") -- boss specific mods @@ -2275,7 +2282,7 @@ Huge sets the radius to 11. { var = "enemyFireDamage", type = "countAllowZero", label = "Enemy Skill ^xB97123Fire Damage:"}, { var = "enemyFirePen", type = "countAllowZero", label = "Enemy Skill ^xB97123Fire Pen:"}, { var = "enemyChaosDamage", type = "countAllowZero", label = "Enemy Skill ^xD02090Chaos Damage:"}, - + -- Section: Custom mods { section = "Custom Modifiers", col = 1 }, { var = "customMods", type = "text", label = "", doNotHighlight = true, resizable = true, diff --git a/src/Modules/Data.lua b/src/Modules/Data.lua index 8fc98820d9..883bd9a9f5 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 @@ -139,7 +139,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" }, @@ -195,7 +195,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, @@ -428,6 +427,9 @@ data.highPrecisionMods = { ["EnergyShieldRegenPercent"] = { ["BASE"] = 2, }, + ["WardRegenPercent"] = { + ["BASE"] = 2, + }, ["LifeRegen"] = { ["BASE"] = 1, }, @@ -437,6 +439,9 @@ data.highPrecisionMods = { ["EnergyShieldRegen"] = { ["BASE"] = 1, }, + ["WardRegen"] = { + ["BASE"] = 1, + }, ["RageRegen"] = { ["BASE"] = 1, }, @@ -772,10 +777,10 @@ data.itemTagSpecialExclusionPattern = { } -- Load bosses -do +do data.bosses = { } LoadModule("Data/Bosses", data.bosses) - + local count, uberCount = 0, 0 local armourTotal, evasionTotal = 0, 0 local uberArmourTotal, uberEvasionTotal = 0, 0 @@ -972,7 +977,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 a9e86a5a8b..f749c0976a 100644 --- a/src/Modules/Main.lua +++ b/src/Modules/Main.lua @@ -116,7 +116,7 @@ function main:Init() self.showAnimations = true self.showAllItemAffixes = true 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 @@ -468,7 +468,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 @@ -887,7 +887,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 @@ -896,7 +896,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 @@ -1047,7 +1047,7 @@ function main:OpenOptionsPopup(savedState) controls.showAnimations = new("CheckBoxControl", { "TOPLEFT", controls.sectionAnchor, "TOPLEFT" }, { currentX + defaultLabelPlacementX, currentY, 20 }, "^7Show Animations:", function(state) self.showAnimations = state end) - + nextRow() controls.showAllItemAffixes = new("CheckBoxControl", { "TOPLEFT", controls.sectionAnchor, "TOPLEFT" }, { currentX + defaultLabelPlacementX, currentY, 20 }, "^7Show all item affixes sliders:", function(state) self.showAllItemAffixes = state @@ -1055,7 +1055,7 @@ function main:OpenOptionsPopup(savedState) controls.showAllItemAffixes.tooltipText = "Display all item affix slots as a stacked list instead of hiding them in dropdowns" nextRow() - + local leftColumnMaxY = currentY -- store left column height -- Check for two column layout @@ -1138,21 +1138,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", { "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", { "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", { "TOPLEFT", controls.sectionAnchor, "TOPLEFT" }, { currentX + defaultLabelPlacementX, currentY, 20 }, "^7Disable Dev AutoSave:", function(state) @@ -1234,14 +1234,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", {"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 @@ -1550,7 +1550,7 @@ end function main:StatColor(stat, base, limit) if limit and stat > limit then return colorCodes.NEGATIVE - elseif base and stat ~= base then + elseif stat ~= base then return colorCodes.MAGIC else return "^7" @@ -1664,7 +1664,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 3dd2c16b06..a7362a7e1c 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", @@ -242,7 +244,8 @@ local modNameList = { ["evasion"] = "Evasion", ["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 +253,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", @@ -1596,6 +1599,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, @@ -1777,6 +1782,8 @@ 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" } }, + ["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" } }, @@ -2388,6 +2395,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("RuneOfEquinox") }, ["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") }, @@ -2525,7 +2533,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 { @@ -5034,6 +5042,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, @@ -6216,13 +6225,13 @@ end -- NOTE: conditional mods with "Immune to ..." cannot be handled for PoE2 as they no longer start with "You are..." or similar prefixes that trigger a "FLAG" mod specialModList["immune to (.-) w?h?i[lf]e? (.*)"] = = function(_, debuff, cond) -- NOTE: this only handles cases for which unconditional immunity mods exist to avoid false positives that don't actually get calculated - + -- look for static or dynamically phrased base immunity mod local searchPrefix1 = "immun[ei]t?y? to " .. ailment and string.lower(debuff) local searchPrefix2 = "immune to " .. ailment and string.lower(debuff) local lowerAilment = ailment and string.lower(ailment) or "" local validDebuff = (specialModList[searchPrefix1 .. lowerAilment] or specialModList[searchPrefix2 .. lowerAilment]) and true or false - + -- look if condition exists -- todo make more dynamic local tagKey = (validDebuff and cond) and "while " .. string.lower(cond) @@ -6273,6 +6282,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", @@ -6309,6 +6319,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" }, @@ -6764,7 +6775,7 @@ local function parseMod(line, order) effect = getEffectFromStatus(effectLine) effect = combineToUpper(effect) end - + if type(effect) == "table" then modName = { effect[1] .. "Immune", effect[2] .. "Immune" } modType = { type(modValue) == "table" and modValue.type or "FLAG", type(modValue) == "table" and modValue.type or "FLAG" }