Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Data/ModCache.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand Down
65 changes: 37 additions & 28 deletions src/Modules/CalcDefence.lua
Original file line number Diff line number Diff line change
Expand Up @@ -471,41 +471,14 @@ 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
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

-- Resistances
output["PhysicalResist"] = 0

Expand Down Expand Up @@ -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)
Expand Down
35 changes: 23 additions & 12 deletions src/Modules/CalcPerform.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -494,8 +504,6 @@ local function doActorAttribsConditions(env, actor)
end
end
end

doActorLifeMana(actor)
end

-- Calculate life/mana reservation
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions src/Modules/ModParser.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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" },
Expand Down Expand Up @@ -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 }) },
Expand Down