diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index 06e0e46d92..33f3514d7d 100755 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -9554,6 +9554,7 @@ c["Mana Flasks gain 2 Charges every 3 seconds"]={{[1]={flags=0,keywordFlags=0,na c["Mana Flasks gain 2 charges every 3 seconds"]={{[1]={flags=0,keywordFlags=0,name="ManaFlaskChargesGenerated",type="BASE",value=0.66666666666667}},nil} c["Mana Flasks gain 3 charges every 3 seconds"]={{[1]={flags=0,keywordFlags=0,name="ManaFlaskChargesGenerated",type="BASE",value=1}},nil} c["Mana Flasks used while on Low Mana apply Recovery Instantly"]={{[1]={[1]={type="Condition",var="LowMana"},flags=0,keywordFlags=0,name="ManaFlaskInstantRecovery",type="BASE",value=100}},nil} +c["Mana is increased by 50% of Overcapped Lightning Resistance"]={{[1]={flags=0,keywordFlags=0,name="ManaIncreasedByHalfOvercappedLightningRes",type="FLAG",value=true}},nil} c["Mana Recovery from Regeneration is not applied"]={{[1]={flags=0,keywordFlags=0,name="UnaffectedByManaRegen",type="FLAG",value=true}},nil} c["Mana Reservation of Herald Skills is always 45%"]={{[1]={[1]={skillType=62,type="SkillType"},flags=0,keywordFlags=0,name="SkillData",type="LIST",value={key="ManaReservationPercentForced",value=45}}},nil} c["Manifested Dancing Dervish dies when Rampage ends"]={{},nil} diff --git a/src/Modules/CalcDefence.lua b/src/Modules/CalcDefence.lua index bed0ba0f0f..8e387c0cc5 100644 --- a/src/Modules/CalcDefence.lua +++ b/src/Modules/CalcDefence.lua @@ -471,8 +471,7 @@ local function incomingDamageBreakdown(breakdownTable, poolsRemaining, output) return breakdownTable end --- Performs all ingame and related defensive calculations -function calcs.defence(env, actor) +function calcs.resistances(actor) local modDB = actor.modDB local enemyDB = actor.enemy.modDB local output = actor.output @@ -480,32 +479,6 @@ function calcs.defence(env, actor) local condList = modDB.conditions - -- Action Speed - output.ActionSpeedMod = calcs.actionSpeedMod(actor) - - -- Armour defence types for conditionals - for _, slot in pairs({"Helmet","Gloves","Boots","Body Armour","Weapon 2","Weapon 3"}) do - local armourData = actor.itemList[slot] and actor.itemList[slot].armourData - if armourData then - wardBase = not modDB:Flag(nil, "GainNoWardFrom" .. slot) and armourData.Ward or 0 - if wardBase > 0 then - output["WardOn"..slot] = wardBase - end - energyShieldBase = not modDB:Flag(nil, "GainNoEnergyShieldFrom" .. slot) and armourData.EnergyShield or 0 - if energyShieldBase > 0 then - output["EnergyShieldOn"..slot] = energyShieldBase - end - armourBase = not modDB:Flag(nil, "GainNoArmourFrom" .. slot) and armourData.Armour or 0 - if armourBase > 0 then - output["ArmourOn"..slot] = armourBase - end - evasionBase = not modDB:Flag(nil, "GainNoEvasionFrom" .. slot) and armourData.Evasion or 0 - if evasionBase > 0 then - output["EvasionOn"..slot] = evasionBase - end - end - end - -- Resistances output["PhysicalResist"] = 0 @@ -628,6 +601,42 @@ function calcs.defence(env, actor) } end end +end + +-- Performs all ingame and related defensive calculations +function calcs.defence(env, actor) + local modDB = actor.modDB + local enemyDB = actor.enemy.modDB + local output = actor.output + local breakdown = actor.breakdown + + local condList = modDB.conditions + + -- Action Speed + output.ActionSpeedMod = calcs.actionSpeedMod(actor) + + -- Armour defence types for conditionals + for _, slot in pairs({"Helmet","Gloves","Boots","Body Armour","Weapon 2","Weapon 3"}) do + local armourData = actor.itemList[slot] and actor.itemList[slot].armourData + if armourData then + wardBase = not modDB:Flag(nil, "GainNoWardFrom" .. slot) and armourData.Ward or 0 + if wardBase > 0 then + output["WardOn"..slot] = wardBase + end + energyShieldBase = not modDB:Flag(nil, "GainNoEnergyShieldFrom" .. slot) and armourData.EnergyShield or 0 + if energyShieldBase > 0 then + output["EnergyShieldOn"..slot] = energyShieldBase + end + armourBase = not modDB:Flag(nil, "GainNoArmourFrom" .. slot) and armourData.Armour or 0 + if armourBase > 0 then + output["ArmourOn"..slot] = armourBase + end + evasionBase = not modDB:Flag(nil, "GainNoEvasionFrom" .. slot) and armourData.Evasion or 0 + if evasionBase > 0 then + output["EvasionOn"..slot] = evasionBase + end + end + end if actor == env.minion then doActorLifeMana(env.minion) diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index 0449608b3f..f6e70cb11e 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -105,11 +105,21 @@ function doActorLifeMana(actor) end end local manaConv = modDB:Sum("BASE", nil, "ManaConvertToArmour") + + if modDB:Flag(nil, "ManaIncreasedByHalfOvercappedLightningRes") then + for i, value in ipairs(modDB:Tabulate("FLAG", nil, "ManaIncreasedByHalfOvercappedLightningRes")) do + local mod = value.mod + modDB:NewMod("Mana", "INC", output.LightningResistOverCap/2, mod.source) + break + end + end + output.Mana = round(calcLib.val(modDB, "Mana") * (1 - manaConv / 100)) - local base = modDB:Sum("BASE", nil, "Mana") - local inc = modDB:Sum("INC", nil, "Mana") - local more = modDB:More(nil, "Mana") + if breakdown then + local base = modDB:Sum("BASE", nil, "Mana") + local inc = modDB:Sum("INC", nil, "Mana") + local more = modDB:More(nil, "Mana") if inc ~= 0 or more ~= 1 or manaConv ~= 0 then breakdown.Mana = { } breakdown.Mana[1] = s_format("%g ^8(base)", base) @@ -494,8 +504,6 @@ local function doActorAttribsConditions(env, actor) end end end - - doActorLifeMana(actor) end -- Calculate life/mana reservation @@ -1026,12 +1034,13 @@ end -- 3. Initialises the main skill's minion, if present -- 4. Merges flask effects -- 5. Sets conditions and calculates attributes (doActorAttribsConditions) --- 6. Calculates life and mana (doActorLifeMana) --- 6. Calculates reservations --- 7. Sets life/mana reservation (doActorLifeManaReservation) --- 8. Processes buffs and debuffs --- 9. Processes charges and misc buffs (doActorCharges, doActorMisc) --- 10. Calculates defence and offence stats (calcs.defence, calcs.offence) +-- 6. Calculates resistances (calcs.resistances) +-- 7. Calculates life and mana (doActorLifeMana) +-- 8. Calculates reservations +-- 9. Sets life/mana reservation (doActorLifeManaReservation) +-- 10. Processes buffs and debuffs +-- 11. Processes charges and misc buffs (doActorCharges, doActorMisc) +-- 12. Calculates defence and offence stats (calcs.defence, calcs.offence) function calcs.perform(env, skipEHP) local modDB = env.modDB local enemyDB = env.enemyDB @@ -1645,8 +1654,9 @@ function calcs.perform(env, skipEHP) modLib.mergeKeystones(env, env.modDB) end - -- Calculate attributes and life/mana pools + -- Calculate attributes, resistances, and life/mana pools doActorAttribsConditions(env, env.player) + calcs.resistances(env.player) doActorLifeMana(env.player) if env.minion then for _, value in ipairs(env.player.mainSkill.skillModList:List(env.player.mainSkill.skillCfg, "MinionModifier")) do @@ -3251,6 +3261,7 @@ function calcs.perform(env, skipEHP) end if env.minion then + calcs.resistances(env.minion) calcs.defence(env, env.minion) if not skipEHP then -- main.build.calcsTab.input.showMinion and -- should be disabled unless "calcsTab.input.showMinion" is true calcs.buildDefenceEstimations(env, env.minion) diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index a3334f825e..ed0a536a60 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -243,6 +243,7 @@ local modNameList = { ["elemental resistances"] = "ElementalResist", ["all elemental resistances"] = "ElementalResist", ["all resistances"] = { "ElementalResist", "ChaosResist" }, + ["elemental and chaos resistances"] = { "ElementalResist", "ChaosResist" }, ["all maximum elemental resistances"] = "ElementalResistMax", ["all maximum resistances"] = { "ElementalResistMax", "ChaosResistMax" }, ["all elemental resistances and maximum elemental resistances"] = { "ElementalResist", "ElementalResistMax" }, @@ -3255,6 +3256,7 @@ local specialModList = { ["critical strike chance is increased by uncapped lightning resistance"] = { flag("CritChanceIncreasedByUncappedLightningRes") }, ["critical strike chance is increased by lightning resistance"] = { flag("CritChanceIncreasedByLightningRes") }, ["critical strike chance is increased by overcapped lightning resistance"] = { flag("CritChanceIncreasedByOvercappedLightningRes") }, + ["mana is increased by 50% of overcapped lightning resistance"] = { flag("ManaIncreasedByHalfOvercappedLightningRes") }, ["barrage and frenzy have (%d+)%% increased critical strike chance per endurance charge"] = function(num) return { mod("CritChance", "INC", num, { type = "Multiplier", var = "EnduranceCharge" }, { type = "SkillName", skillNameList = { "Barrage", "Frenzy" }, includeTransfigured = true }) } end, ["non%-critical strikes deal (%d+)%% damage"] = function(num) return { mod("Damage", "MORE", -100 + num, nil, ModFlag.Hit, { type = "Condition", var = "CriticalStrike", neg = true }) } end, ["non%-critical strikes deal no damage"] = { mod("Damage", "MORE", -100, nil, ModFlag.Hit, { type = "Condition", var = "CriticalStrike", neg = true }) },