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
42 changes: 6 additions & 36 deletions src/Modules/CalcOffence.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2318,6 +2318,7 @@ function calcs.offence(env, actor, activeSkill)

-- Exerted Attack members
local exertedDoubleDamage = env.modDB:Sum("BASE", cfg, "ExertDoubleDamageChance")
local exertingWarcryCount = env.modDB:Sum("BASE", nil, "ExertingWarcryCount")
globalOutput.OffensiveWarcryEffect = 1
globalOutput.MaxOffensiveWarcryEffect = 1
globalOutput.TheoreticalOffensiveWarcryEffect = 1
Expand All @@ -2333,11 +2334,6 @@ function calcs.offence(env, actor, activeSkill)
if value.activeEffect.grantedEffect.name == "Ancestral Cry" and activeSkill.skillTypes[SkillType.MeleeSingleTarget] and not globalOutput.AncestralCryCalculated then
globalOutput.AncestralCryDuration = calcSkillDuration(value.skillModList, value.skillCfg, value.skillData, env, enemyDB)
globalOutput.AncestralCryCooldown = calcSkillCooldown(value.skillModList, value.skillCfg, value.skillData)
output.GlobalWarcryCooldown = env.modDB:Sum("BASE", nil, "GlobalWarcryCooldown")
output.GlobalWarcryCount = env.modDB:Sum("BASE", nil, "GlobalWarcryCount")
if modDB:Flag(nil, "WarcryShareCooldown") then
globalOutput.AncestralCryCooldown = globalOutput.AncestralCryCooldown + (output.GlobalWarcryCooldown - globalOutput.AncestralCryCooldown) / output.GlobalWarcryCount
end
globalOutput.AncestralCryCastTime = calcWarcryCastTime(value.skillModList, value.skillCfg, value.skillData, actor)
globalOutput.AncestralExertsCount = env.modDB:Sum("BASE", nil, "NumAncestralExerts") or 0
local baseUptimeRatio = m_min((globalOutput.AncestralExertsCount / output.Speed) / (globalOutput.AncestralCryCooldown + globalOutput.AncestralCryCastTime), 1) * 100
Expand All @@ -2360,11 +2356,6 @@ function calcs.offence(env, actor, activeSkill)
elseif value.activeEffect.grantedEffect.name == "Infernal Cry" and not globalOutput.InfernalCryCalculated then
globalOutput.InfernalCryDuration = calcSkillDuration(value.skillModList, value.skillCfg, value.skillData, env, enemyDB)
globalOutput.InfernalCryCooldown = calcSkillCooldown(value.skillModList, value.skillCfg, value.skillData)
output.GlobalWarcryCooldown = env.modDB:Sum("BASE", nil, "GlobalWarcryCooldown")
output.GlobalWarcryCount = env.modDB:Sum("BASE", nil, "GlobalWarcryCount")
if modDB:Flag(nil, "WarcryShareCooldown") then
globalOutput.InfernalCryCooldown = globalOutput.InfernalCryCooldown + (output.GlobalWarcryCooldown - globalOutput.InfernalCryCooldown) / output.GlobalWarcryCount
end
globalOutput.InfernalCryCastTime = calcWarcryCastTime(value.skillModList, value.skillCfg, value.skillData, actor)
if activeSkill.skillTypes[SkillType.Melee] then
globalOutput.InfernalExertsCount = env.modDB:Sum("BASE", nil, "NumInfernalExerts") or 0
Expand All @@ -2390,11 +2381,6 @@ function calcs.offence(env, actor, activeSkill)
globalOutput.CreateWarcryOffensiveCalcSection = true
globalOutput.IntimidatingCryDuration = calcSkillDuration(value.skillModList, value.skillCfg, value.skillData, env, enemyDB)
globalOutput.IntimidatingCryCooldown = calcSkillCooldown(value.skillModList, value.skillCfg, value.skillData)
output.GlobalWarcryCooldown = env.modDB:Sum("BASE", nil, "GlobalWarcryCooldown")
output.GlobalWarcryCount = env.modDB:Sum("BASE", nil, "GlobalWarcryCount")
if modDB:Flag(nil, "WarcryShareCooldown") then
globalOutput.IntimidatingCryCooldown = globalOutput.IntimidatingCryCooldown + (output.GlobalWarcryCooldown - globalOutput.IntimidatingCryCooldown) / output.GlobalWarcryCount
end
globalOutput.IntimidatingCryCastTime = calcWarcryCastTime(value.skillModList, value.skillCfg, value.skillData, actor)
globalOutput.IntimidatingExertsCount = env.modDB:Sum("BASE", nil, "NumIntimidatingExerts") or 0
local baseUptimeRatio = m_min((globalOutput.IntimidatingExertsCount / output.Speed) / (globalOutput.IntimidatingCryCooldown + globalOutput.IntimidatingCryCastTime), 1) * 100
Expand Down Expand Up @@ -2440,11 +2426,6 @@ function calcs.offence(env, actor, activeSkill)
globalOutput.CreateWarcryOffensiveCalcSection = true
globalOutput.RallyingCryDuration = calcSkillDuration(value.skillModList, value.skillCfg, value.skillData, env, enemyDB)
globalOutput.RallyingCryCooldown = calcSkillCooldown(value.skillModList, value.skillCfg, value.skillData)
output.GlobalWarcryCooldown = env.modDB:Sum("BASE", nil, "GlobalWarcryCooldown")
output.GlobalWarcryCount = env.modDB:Sum("BASE", nil, "GlobalWarcryCount")
if modDB:Flag(nil, "WarcryShareCooldown") then
globalOutput.RallyingCryCooldown = globalOutput.RallyingCryCooldown + (output.GlobalWarcryCooldown - globalOutput.RallyingCryCooldown) / output.GlobalWarcryCount
end
globalOutput.RallyingCryCastTime = calcWarcryCastTime(value.skillModList, value.skillCfg, value.skillData, actor)
globalOutput.RallyingExertsCount = env.modDB:Sum("BASE", nil, "NumRallyingExerts") or 0
local baseUptimeRatio = m_min((globalOutput.RallyingExertsCount / output.Speed) / (globalOutput.RallyingCryCooldown + globalOutput.RallyingCryCastTime), 1) * 100
Expand Down Expand Up @@ -2491,11 +2472,6 @@ function calcs.offence(env, actor, activeSkill)
globalOutput.CreateWarcryOffensiveCalcSection = true
globalOutput.SeismicCryDuration = calcSkillDuration(value.skillModList, value.skillCfg, value.skillData, env, enemyDB)
globalOutput.SeismicCryCooldown = calcSkillCooldown(value.skillModList, value.skillCfg, value.skillData)
output.GlobalWarcryCooldown = env.modDB:Sum("BASE", nil, "GlobalWarcryCooldown")
output.GlobalWarcryCount = env.modDB:Sum("BASE", nil, "GlobalWarcryCount")
if modDB:Flag(nil, "WarcryShareCooldown") then
globalOutput.SeismicCryCooldown = globalOutput.SeismicCryCooldown + (output.GlobalWarcryCooldown - globalOutput.SeismicCryCooldown) / output.GlobalWarcryCount
end
globalOutput.SeismicCryCastTime = calcWarcryCastTime(value.skillModList, value.skillCfg, value.skillData, actor)
globalOutput.SeismicExertsCount = env.modDB:Sum("BASE", nil, "NumSeismicExerts") or 0
local baseUptimeRatio = m_min((globalOutput.SeismicExertsCount / output.Speed) / (globalOutput.SeismicCryCooldown + globalOutput.SeismicCryCastTime), 1) * 100
Expand Down Expand Up @@ -2525,11 +2501,6 @@ function calcs.offence(env, actor, activeSkill)
elseif value.activeEffect.grantedEffect.name == "Battlemage's Cry" and not globalOutput.BattleMageCryCalculated then
globalOutput.BattleMageCryDuration = calcSkillDuration(value.skillModList, value.skillCfg, value.skillData, env, enemyDB)
globalOutput.BattleMageCryCooldown = calcSkillCooldown(value.skillModList, value.skillCfg, value.skillData)
output.GlobalWarcryCooldown = env.modDB:Sum("BASE", nil, "GlobalWarcryCooldown")
output.GlobalWarcryCount = env.modDB:Sum("BASE", nil, "GlobalWarcryCount")
if modDB:Flag(nil, "WarcryShareCooldown") then
globalOutput.BattleMageCryCooldown = globalOutput.BattleMageCryCooldown + (output.GlobalWarcryCooldown - globalOutput.BattleMageCryCooldown) / output.GlobalWarcryCount
end
globalOutput.BattleMageCryCastTime = calcWarcryCastTime(value.skillModList, value.skillCfg, value.skillData, actor)
if activeSkill.skillTypes[SkillType.Melee] then
globalOutput.BattleCryExertsCount = env.modDB:Sum("BASE", nil, "NumBattlemageExerts") or 0
Expand Down Expand Up @@ -2570,7 +2541,6 @@ function calcs.offence(env, actor, activeSkill)
for _, cryTimeRatio in ipairs(warcryList) do
globalOutput.ExertedAttackUptimeRatio = m_max(globalOutput.ExertedAttackUptimeRatio or 0, globalOutput[cryTimeRatio] or 0)
end
local warcryCount = env.modDB:Sum("BASE", nil, "GlobalWarcryCount")
if globalBreakdown then
globalBreakdown.ExertedAttackUptimeRatio = { }
t_insert(globalBreakdown.ExertedAttackUptimeRatio, s_format("Maximum of:"))
Expand All @@ -2585,19 +2555,19 @@ function calcs.offence(env, actor, activeSkill)
local incExertedAttacks = skillModList:Sum("INC", cfg, "ExertIncrease")
local moreExertedAttacks = skillModList:Sum("MORE", cfg, "ExertIncrease")
local moreExertedAttackDamage = skillModList:Sum("MORE", cfg, "ExertAttackIncrease")
local autoExertionExertedDamage = skillModList:Sum("MORE", cfg, "OverexertionExertAverageIncrease")
local overexertionExertedDamage = skillModList:Sum("MORE", cfg, "OverexertionExertAverageIncrease")
local echoesOfCreationExertedDamage = skillModList:Sum("MORE", cfg, "EchoesExertAverageIncrease")
if activeSkill.skillModList:Flag(nil, "Condition:WarcryMaxHit") then
skillModList:NewMod("Damage", "INC", incExertedAttacks, "Exerted Attacks")
skillModList:NewMod("Damage", "MORE", moreExertedAttacks, "Exerted Attacks")
skillModList:NewMod("Damage", "MORE", moreExertedAttackDamage, "Exerted Attack Damage", ModFlag.Attack)
skillModList:NewMod("Damage", "MORE", autoExertionExertedDamage * warcryCount, "Max Autoexertion Support")
skillModList:NewMod("Damage", "MORE", echoesOfCreationExertedDamage * warcryCount, "Max Echoes of Creation")
skillModList:NewMod("Damage", "MORE", overexertionExertedDamage * exertingWarcryCount, "Max Autoexertion Support")
skillModList:NewMod("Damage", "MORE", echoesOfCreationExertedDamage * exertingWarcryCount, "Max Echoes of Creation")
else
skillModList:NewMod("Damage", "INC", incExertedAttacks * globalOutput.ExertedAttackUptimeRatio / 100, "Uptime Scaled Exerted Attacks")
skillModList:NewMod("Damage", "MORE", moreExertedAttacks * globalOutput.ExertedAttackUptimeRatio / 100, "Uptime Scaled Exerted Attacks")
skillModList:NewMod("Damage", "MORE", moreExertedAttackDamage * globalOutput.ExertedAttackUptimeRatio / 100, "Uptime Scaled Exerted Attack Damage", ModFlag.Attack)
skillModList:NewMod("Damage", "MORE", autoExertionExertedDamage * globalOutput.GlobalWarcryUptimeRatio / 100, "Uptime Scaled Autoexertion Support")
skillModList:NewMod("Damage", "MORE", overexertionExertedDamage * globalOutput.GlobalWarcryUptimeRatio / 100, "Uptime Scaled Autoexertion Support")
skillModList:NewMod("Damage", "MORE", echoesOfCreationExertedDamage * globalOutput.GlobalWarcryUptimeRatio / 100, "Uptime Scaled Echoes of Creation")
end
globalOutput.ExertedAttackAvgDmg = calcLib.mod(skillModList, skillCfg, "ExertIncrease")
Expand Down Expand Up @@ -5358,7 +5328,7 @@ function calcs.offence(env, actor, activeSkill)
end
local averageWarcryCount = output.GlobalWarcryUptimeRatio / 100
if activeSkill.skillModList:Flag(nil, "Condition:WarcryMaxHit") then
averageWarcryCount = env.modDB:Sum("BASE", nil, "GlobalWarcryCount")
averageWarcryCount = env.modDB:Sum("BASE", nil, "ExertingWarcryCount")
end
if averageWarcryCount and dmgType and dmgMult then
local dmgBreakdown, totalDmgTaken = calcs.applyDmgTakenConversion(activeSkill, output, breakdown, dmgType, (output.Life or 0) * dmgMult/100 * averageWarcryCount)
Expand Down
22 changes: 2 additions & 20 deletions src/Modules/CalcPerform.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1125,23 +1125,6 @@ function calcs.perform(env, skipEHP)
hasGuaranteedBonechill = true
end
end
if activeSkill.skillFlags.warcry and not modDB:Flag(nil, "AlreadyGlobalWarcryCooldown") then
local cooldown = calcSkillCooldown(activeSkill.skillModList, activeSkill.skillCfg, activeSkill.skillData)
local warcryList = { }
local numWarcries, sumWarcryCooldown = 0
for _, activeSkill in ipairs(env.player.activeSkillList) do
if activeSkill.skillTypes[SkillType.Warcry] then
warcryList[activeSkill.skillCfg.skillName] = true
end
end
for _, warcry in pairs(warcryList) do
numWarcries = numWarcries + 1
sumWarcryCooldown = (sumWarcryCooldown or 0) + cooldown
end
env.player.modDB:NewMod("GlobalWarcryCooldown", "BASE", sumWarcryCooldown)
env.player.modDB:NewMod("GlobalWarcryCount", "BASE", numWarcries)
modDB:NewMod("AlreadyGlobalWarcryCooldown", "FLAG", true, "Config") -- Prevents effect from applying multiple times
end
if activeSkill.minion and activeSkill.minion.minionData and activeSkill.minion.minionData.limit then
local limit = activeSkill.skillModList:Sum("BASE", nil, activeSkill.minion.minionData.limit)
output[activeSkill.minion.minionData.limit] = m_max(limit, output[activeSkill.minion.minionData.limit] or 0)
Expand Down Expand Up @@ -1885,13 +1868,12 @@ function calcs.perform(env, skipEHP)
local extraExertions = modStore:Sum("BASE", nil, "ExtraExertedAttacks") or 0
local exertMultiplier = modStore:More(nil, "ExtraExertedAttacks")
env.player.modDB:NewMod("Num"..warcryName.."Exerts", "BASE", m_floor((baseExerts + extraExertions) * exertMultiplier))
env.player.modDB:NewMod("ExertingWarcryCount", "BASE", 1)
end
local full_duration = calcSkillDuration(modStore, skillCfg, activeSkill.skillData, env, enemyDB)
local cooldownOverride = modStore:Override(skillCfg, "CooldownRecovery")
local actual_cooldown = cooldownOverride or (activeSkill.skillData.cooldown + modStore:Sum("BASE", skillCfg, "CooldownRecovery")) / calcLib.mod(modStore, skillCfg, "CooldownRecovery")
local globalCooldown = modDB:Sum("BASE", nil, "GlobalWarcryCooldown")
local globalCount = modDB:Sum("BASE", nil, "GlobalWarcryCount")
local uptime = modDB:Flag(nil, "Condition:WarcryMaxHit") and 1 or modDB:Flag(nil, "WarcryShareCooldown") and m_min(full_duration / (actual_cooldown + (globalCooldown - actual_cooldown) / globalCount), 1) or m_min(full_duration / actual_cooldown, 1)
local uptime = modDB:Flag(nil, "Condition:WarcryMaxHit") and 1 or m_min(full_duration / actual_cooldown, 1)
if not activeSkill.skillModList:Flag(nil, "CannotShareWarcryBuffs") then
if not modDB:Flag(nil, "CannotGainWarcryBuffs") then
if not buff.applyNotPlayer then
Expand Down
1 change: 0 additions & 1 deletion src/Modules/ModParser.lua
Original file line number Diff line number Diff line change
Expand Up @@ -3595,7 +3595,6 @@ local specialModList = {
mod("Multiplier:WarcryNearbyEnemies", "BASE", num),
} end,
["enemies taunted by your warcries take (%d+)%% increased damage"] = function(num) return { mod("EnemyModifier", "LIST", { mod = mod("DamageTaken", "INC", num, { type = "Condition", var = "Taunted" }) }, { type = "Condition", var = "UsedWarcryRecently" }) } end,
["warcries share their cooldown"] = { flag("WarcryShareCooldown") },
["warcries have minimum of (%d+) power"] = { flag("CryWolfMinimumPower") },
["warcries have infinite power"] = { flag("WarcryInfinitePower") },
["your warcries do not grant buffs or charges to you"] = { flag("CannotGainWarcryBuffs") },
Expand Down