Skip to content
Merged
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
6 changes: 3 additions & 3 deletions src/Data/SkillStatMap.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1355,13 +1355,13 @@ return {
skill("setOffHandAttackTime", nil),
},
["off_hand_minimum_added_physical_damage_per_15_shield_armour_and_evasion_rating"] = {
mod("PhysicalMin", "BASE", nil, 0, 0, { type = "Condition", var = "OffHandAttack" }, { type = "PerStat", statList = { "ArmourOnWeapon 2", "EvasionOnWeapon 2" }, div = 15, }),
mod("PhysicalMin", "BASE", nil, 0, 0, { type = "Condition", var = "OffHandAttack" }, { type = "Condition", var = "ShieldThrowCrushNoArmourEvasion", neg = true }, { type = "PerStat", statList = { "ArmourOnWeapon 2", "EvasionOnWeapon 2" }, div = 15, }),
},
["off_hand_maximum_added_physical_damage_per_15_shield_armour_and_evasion_rating"] = {
mod("PhysicalMax", "BASE", nil, 0, 0, { type = "Condition", var = "OffHandAttack" }, { type = "PerStat", statList = { "ArmourOnWeapon 2", "EvasionOnWeapon 2" }, div = 15, }),
mod("PhysicalMax", "BASE", nil, 0, 0, { type = "Condition", var = "OffHandAttack" }, { type = "Condition", var = "ShieldThrowCrushNoArmourEvasion", neg = true }, { type = "PerStat", statList = { "ArmourOnWeapon 2", "EvasionOnWeapon 2" }, div = 15, }),
},
["additional_critical_strike_chance_per_10_shield_maximum_energy_shield_permyriad"] = {
mod("CritChance", "BASE", nil, 0, 0, { type = "PerStat", stat = "EnergyShieldOnWeapon 2", div = 10, }),
mod("CritChance", "BASE", nil, 0, 0, { type = "PerStat", stat = "EnergyShieldOnWeapon 2", div = 10, }),
div = 100,
},
-- Impale
Expand Down
4 changes: 4 additions & 0 deletions src/Data/Skills/act_int.lua
Original file line number Diff line number Diff line change
Expand Up @@ -11749,6 +11749,10 @@ skills["Purge"] = {
skillTypes = { [SkillType.Spell] = true, [SkillType.Area] = true, [SkillType.Damage] = true, [SkillType.Duration] = true, [SkillType.Trappable] = true, [SkillType.Totemable] = true, [SkillType.Mineable] = true, [SkillType.Triggerable] = true, [SkillType.Fire] = true, [SkillType.Lightning] = true, [SkillType.CanRapidFire] = true, [SkillType.Multicastable] = true, [SkillType.AreaSpell] = true, [SkillType.Physical] = true, },
statDescriptionScope = "debuff_skill_stat_descriptions",
castTime = 0.7,
preDamageFunc = function(activeSkill, output)
local duration = math.floor(math.ceil(activeSkill.skillData.duration * data.misc.ServerTickRate) / data.misc.ServerTickRate * output.DurationMod * 10)
activeSkill.skillModList:NewMod("DotMultiplier", "BASE", activeSkill.skillModList:Sum("INC", activeSkill.skillCfg, "WaveOfConvictionDurationDotMulti") * duration / 100, "Skill:Purge", 0, { type = "Multiplier", var = "WoCDurationExpired"})
end,
statMap = {
["purge_expose_resist_%_matching_highest_element_damage"] = {
mod("FireExposure", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Debuff", effectName = "Fire Exposure", effectCond = "WaveOfConvictionFireExposureActive" }),
Expand Down
15 changes: 14 additions & 1 deletion src/Data/Skills/act_str.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3198,14 +3198,22 @@ skills["Exsanguinate"] = {
skillTypes = { [SkillType.Spell] = true, [SkillType.Damage] = true, [SkillType.Trappable] = true, [SkillType.Totemable] = true, [SkillType.Mineable] = true, [SkillType.Chains] = true, [SkillType.Multicastable] = true, [SkillType.Triggerable] = true, [SkillType.Physical] = true, [SkillType.CanRapidFire] = true, [SkillType.DamageOverTime] = true, [SkillType.Duration] = true, },
statDescriptionScope = "debuff_skill_stat_descriptions",
castTime = 0.8,
statMap = {
["base_physical_damage_to_deal_per_minute"] = {
skill("PhysicalDot", nil, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage", neg = true }),
skill("FireDot", nil, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage"}),
div = 60,
},
},
baseFlags = {
spell = true,
duration = true,
},
baseMods = {
skill("debuff", true),
mod("Multiplier:ExsanguinateMaxStages", "BASE", 3),
mod("PhysicalDamage", "MORE", 100, 0, KeywordFlag.PhysicalDot, { type = "Multiplier", var = "ExsanguinateStageAfterFirst"}),
mod("PhysicalDamage", "MORE", 100, 0, KeywordFlag.PhysicalDot, { type = "Multiplier", var = "ExsanguinateStageAfterFirst"}, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage", neg = true }),
mod("FireDamage", "MORE", 100, 0, KeywordFlag.FireDot, { type = "Multiplier", var = "ExsanguinateStageAfterFirst"}, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage" }),
},
qualityStats = {
Default = {
Expand Down Expand Up @@ -7597,6 +7605,11 @@ skills["Bloodreap"] = {
["blood_scythe_cost_+%_final_per_charge"] = {
mod("LifeCost", "MORE", nil, 0, 0, { type = "Multiplier", var = "BloodCharge" }),
},
["base_physical_damage_to_deal_per_minute"] = {
skill("PhysicalDot", nil, { type = "Condition", var = "ReapDebuffIsFireDamage", neg = true }),
skill("FireDot", nil, { type = "Condition", var = "ReapDebuffIsFireDamage"}),
div = 60,
},
},
baseFlags = {
spell = true,
Expand Down
4 changes: 4 additions & 0 deletions src/Export/Skills/act_int.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2459,6 +2459,10 @@ local skills, mod, flag, skill = ...

#skill Purge
#flags spell area duration
preDamageFunc = function(activeSkill, output)
local duration = math.floor(math.ceil(activeSkill.skillData.duration * data.misc.ServerTickRate) / data.misc.ServerTickRate * output.DurationMod * 10)
activeSkill.skillModList:NewMod("DotMultiplier", "BASE", activeSkill.skillModList:Sum("INC", activeSkill.skillCfg, "WaveOfConvictionDurationDotMulti") * duration / 100, "Skill:Purge", 0, { type = "Multiplier", var = "WoCDurationExpired"})
end,
statMap = {
["purge_expose_resist_%_matching_highest_element_damage"] = {
mod("FireExposure", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Debuff", effectName = "Fire Exposure", effectCond = "WaveOfConvictionFireExposureActive" }),
Expand Down
15 changes: 14 additions & 1 deletion src/Export/Skills/act_str.txt
Original file line number Diff line number Diff line change
Expand Up @@ -611,9 +611,17 @@ local skills, mod, flag, skill = ...

#skill Exsanguinate
#flags spell duration
statMap = {
["base_physical_damage_to_deal_per_minute"] = {
skill("PhysicalDot", nil, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage", neg = true }),
skill("FireDot", nil, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage"}),
div = 60,
},
},
#baseMod skill("debuff", true)
#baseMod mod("Multiplier:ExsanguinateMaxStages", "BASE", 3)
#baseMod mod("PhysicalDamage", "MORE", 100, 0, KeywordFlag.PhysicalDot, { type = "Multiplier", var = "ExsanguinateStageAfterFirst"})
#baseMod mod("PhysicalDamage", "MORE", 100, 0, KeywordFlag.PhysicalDot, { type = "Multiplier", var = "ExsanguinateStageAfterFirst"}, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage", neg = true })
#baseMod mod("FireDamage", "MORE", 100, 0, KeywordFlag.FireDot, { type = "Multiplier", var = "ExsanguinateStageAfterFirst"}, { type = "Condition", var = "ExsanguinateDebuffIsFireDamage" })
#mods

#skill FlameLink
Expand Down Expand Up @@ -1395,6 +1403,11 @@ end,
["blood_scythe_cost_+%_final_per_charge"] = {
mod("LifeCost", "MORE", nil, 0, 0, { type = "Multiplier", var = "BloodCharge" }),
},
["base_physical_damage_to_deal_per_minute"] = {
skill("PhysicalDot", nil, { type = "Condition", var = "ReapDebuffIsFireDamage", neg = true }),
skill("FireDot", nil, { type = "Condition", var = "ReapDebuffIsFireDamage"}),
div = 60,
},
},
#baseMod skill("radius", 25)
#baseMod skill("debuff", true)
Expand Down
6 changes: 3 additions & 3 deletions src/Modules/CalcOffence.lua
Original file line number Diff line number Diff line change
Expand Up @@ -520,7 +520,7 @@ function calcs.offence(env, actor, activeSkill)
skillModList:NewMod(damageType.."Max", "BASE", (actor.weaponData1[damageType.."Max"] or 0) * multiplier, "Battlemage", ModFlag.Spell)
end
end
if skillModList:Flag(nil, "MinionDamageAppliesToPlayer") then
if skillModList:Flag(nil, "MinionDamageAppliesToPlayer") or skillModList:Flag(skillCfg, "MinionDamageAppliesToPlayer") then
-- Minion Damage conversion from Spiritual Aid and The Scourge
local multiplier = (skillModList:Max(skillCfg, "ImprovedMinionDamageAppliesToPlayer") or 100) / 100
for _, value in ipairs(skillModList:List(skillCfg, "MinionModifier")) do
Expand Down Expand Up @@ -863,7 +863,7 @@ function calcs.offence(env, actor, activeSkill)
-- Calculate skill type stats
if skillFlags.minion then
if activeSkill.minion and activeSkill.minion.minionData.limit then
output.ActiveMinionLimit = m_floor(calcLib.val(skillModList, activeSkill.minion.minionData.limit, skillCfg))
output.ActiveMinionLimit = m_floor(env.modDB:Override(nil, activeSkill.minion.minionData.limit) or calcLib.val(skillModList, activeSkill.minion.minionData.limit, skillCfg))
end
end
if skillFlags.chaining then
Expand Down Expand Up @@ -1339,7 +1339,7 @@ function calcs.offence(env, actor, activeSkill)
end
durationBase = (skillData.soulPreventionDuration or 0)
if durationBase > 0 then
local durationMod = calcLib.mod(skillModList, skillCfg, "Duration", "SkillAndDamagingAilmentDuration", skillData.skillEffectAppliesToSoulGainPrevention and "SoulGainPreventionDuration" or nil, skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
local durationMod = calcLib.mod(skillModList, skillCfg, "SoulGainPreventionDuration", skillData.skillEffectAppliesToSoulGainPrevention and "Duration" or "SkillAndDamagingAilmentDuration" or nil, skillData.mineDurationAppliesToSkill and "MineDuration" or nil)
durationMod = m_max(durationMod, 0)
output.SoulGainPreventionDuration = durationBase * durationMod
output.SoulGainPreventionDuration = m_max(m_ceil(output.SoulGainPreventionDuration * data.misc.ServerTickRate), 1) / data.misc.ServerTickRate
Expand Down
23 changes: 18 additions & 5 deletions src/Modules/CalcPerform.lua
Original file line number Diff line number Diff line change
Expand Up @@ -588,6 +588,24 @@ local function doActorAttribsConditions(env, actor)
if modDB:Sum("BASE", nil, "EnemySapChance") > 0 or modDB:Flag(nil, "CritAlwaysAltAilments") and not modDB:Flag(env.player.mainSkill.skillCfg, "NeverCrit") then
condList["CanInflictSap"] = true
end
-- Shrine Buffs: Must be done before life pool calculated for massive shrine
local shrineEffectMod = 1 + modDB:Sum("INC", nil, "BuffEffectOnSelf", "ShrineBuffEffect") / 100
if modDB:Flag(nil, "LesserMassiveShrine") then
modDB:NewMod("Life", "INC", m_floor(20 * shrineEffectMod), "Lesser Massive Shrine")
modDB:NewMod("AreaOfEffect", "INC", m_floor(20 * shrineEffectMod), "Lesser Massive Shrine")
end
if modDB:Flag(nil, "LesserBrutalShrine") then
modDB:NewMod("Damage", "INC", m_floor(20 * shrineEffectMod), "Lesser Brutal Shrine")
modDB:NewMod("EnemyStunDuration", "INC", m_floor(20 * shrineEffectMod), "Lesser Brutal Shrine")
modDB:NewMod("EnemyKnockbackChance", "INC", 100, "Lesser Brutal Shrine")
end
if modDB:Flag(nil, "DiamondShrine") then
modDB:NewMod("CritChance", "OVERRIDE", 100, "Diamond Shrine")
end
if modDB:Flag(nil, "MassiveShrine") then
modDB:NewMod("Life", "INC", m_floor(40 * shrineEffectMod), "Massive Shrine")
modDB:NewMod("AreaOfEffect", "INC", m_floor(40 * shrineEffectMod), "Massive Shrine")
end
end
if env.mode_effective then
if env.player.mainSkill.skillModList:Sum("BASE", env.player.mainSkill.skillCfg, "FireExposureChance") > 0 or modDB:Sum("BASE", nil, "FireExposureChance") > 0 then
Expand Down Expand Up @@ -733,11 +751,6 @@ local function doActorAttribsConditions(env, actor)
end
end

-- Check shrine buffs, must be done before life pool calculated for massive shrine
for _, value in ipairs(modDB:List(nil, "ShrineBuff")) do
modDB:ScaleAddList({ value.mod }, calcLib.mod(modDB, nil, "BuffEffectOnSelf", "ShrineBuffEffect"))
end

doActorLifeMana(actor)
end

Expand Down
4 changes: 4 additions & 0 deletions src/Modules/CalcSetup.lua
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ function calcs.initModDB(env, modDB)
modDB:NewMod("UnholyMight", "FLAG", true, "Base", { type = "Condition", var = "UnholyMight" })
modDB:NewMod("Tailwind", "FLAG", true, "Base", { type = "Condition", var = "Tailwind" })
modDB:NewMod("Adrenaline", "FLAG", true, "Base", { type = "Condition", var = "Adrenaline" })
modDB:NewMod("LesserMassiveShrine", "FLAG", true, "Base", { type = "Condition", var = "LesserMassiveShrine" })
modDB:NewMod("LesserBrutalShrine", "FLAG", true, "Base", { type = "Condition", var = "LesserBrutalShrine" })
modDB:NewMod("DiamondShrine", "FLAG", true, "Base", { type = "Condition", var = "DiamondShrine" })
modDB:NewMod("MassiveShrine", "FLAG", true, "Base", { type = "Condition", var = "MassiveShrine" })
modDB:NewMod("AlchemistsGenius", "FLAG", true, "Base", { type = "Condition", var = "AlchemistsGenius" })
modDB:NewMod("LuckyHits", "FLAG", true, "Base", { type = "Condition", var = "LuckyHits" })
modDB:NewMod("Convergence", "FLAG", true, "Base", { type = "Condition", var = "Convergence" })
Expand Down
20 changes: 20 additions & 0 deletions src/Modules/Calcs.lua
Original file line number Diff line number Diff line change
Expand Up @@ -543,6 +543,8 @@ function calcs.buildOutput(build, mode)
end
elseif tag.type == "ActorCondition" and tag.actor == "enemy" then
addVarTag(env.enemyConditionsUsed, tag, mod)
elseif tag.type == "ActorCondition" and tag.actor == "parent" then
addVarTag(env.conditionsUsed, tag, mod)
elseif tag.type == "Multiplier" or tag.type == "MultiplierThreshold" then
if not tag.actor then
if actor == env.player then
Expand Down Expand Up @@ -682,6 +684,18 @@ function calcs.buildOutput(build, mode)
if env.modDB:Flag(nil, "HerEmbrace") then
t_insert(combatList, "Her Embrace")
end
if env.modDB:Flag(nil, "LesserMassiveShrine") then
t_insert(combatList, "Lesser Massive Shrine")
end
if env.modDB:Flag(nil, "LesserBrutalShrine") then
t_insert(combatList, "Lesser Brutal Shrine")
end
if env.modDB:Flag(nil, "DiamondShrine") then
t_insert(combatList, "Diamond Shrine")
end
if env.modDB:Flag(nil, "MassiveShrine") then
t_insert(combatList, "Massive Shrine")
end
for name in pairs(env.buffs) do
t_insert(buffList, name)
end
Expand Down Expand Up @@ -762,6 +776,12 @@ function calcs.buildOutput(build, mode)
if env.minion.modDB:Flag(nil, "Tailwind") then
t_insert(combatList, "Tailwind")
end
if env.minion.modDB:Flag(nil, "DiamondShrine") then
t_insert(combatList, "Diamond Shrine")
end
if env.minion.modDB:Flag(nil, "MassiveShrine") then
t_insert(combatList, "Massive Shrine")
end
for name in pairs(env.minionBuffs) do
t_insert(buffList, name)
end
Expand Down
Loading