Skip to content

Commit bf562e7

Browse files
committed
add support for the four pacts sans trigger work
add tests
1 parent 4cae31d commit bf562e7

7 files changed

Lines changed: 633 additions & 1 deletion

File tree

spec/System/TestSkills_spec.lua

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
describe("TestAttacks", function()
1+
describe("TestSkills", function()
22
before_each(function()
33
newBuild()
44
end)
@@ -249,4 +249,73 @@ describe("TestAttacks", function()
249249
assert.are.equals(0, nonDurationSkill.skillModList:Sum("BASE", nonDurationSkill.skillCfg, "BaseFlagTest"))
250250
assert.are.equals(1, nonDurationSkill.skillModList:Sum("BASE", nonDurationSkill.skillCfg, "NegatedBaseFlagTest"))
251251
end)
252+
253+
it("Test Empowered Spells - Pact of Beidat", function()
254+
build.skillsTab:PasteSocketGroup("Fireball 20/0 1")
255+
runCallback("OnFrame")
256+
local baseDPS = build.calcsTab.calcsOutput.TotalDPS
257+
258+
build.skillsTab:PasteSocketGroup("Pact of Beidat 1/0 1")
259+
runCallback("OnFrame")
260+
assert.True(build.calcsTab.calcsOutput.BeidatUpTimeRatio > 0)
261+
assert.True(build.calcsTab.calcsOutput.TotalDPS > baseDPS)
262+
263+
newBuild()
264+
build.skillsTab:PasteSocketGroup("Vaal Arc 20/0 1\nPact of Beidat 1/0 1")
265+
runCallback("OnFrame")
266+
assert.True(build.calcsTab.calcsOutput.BeidatUpTimeRatio == nil)
267+
end)
268+
269+
it("Test Empowered Spells - Pact of Ghorr", function()
270+
build.skillsTab:PasteSocketGroup("Creeping Frost 20/0 1")
271+
runCallback("OnFrame")
272+
local baseDPS = build.calcsTab.calcsOutput.TotalDotDPS
273+
274+
build.skillsTab:PasteSocketGroup("Pact of Ghorr 1/0 1")
275+
runCallback("OnFrame")
276+
assert.True(build.calcsTab.calcsOutput.GhorrUpTimeRatio > 0)
277+
assert.True(build.calcsTab.calcsOutput.TotalDotDPS > baseDPS)
278+
279+
newBuild()
280+
build.skillsTab:PasteSocketGroup("Vaal Arc 20/0 1\n Pact of Ghorr 1/0 1")
281+
runCallback("OnFrame")
282+
assert.True(build.calcsTab.calcsOutput.GhorrUpTimeRatio == nil)
283+
end)
284+
285+
it("Test Empowered Spells - Pact of K'Tash", function()
286+
build.skillsTab:PasteSocketGroup("Vaal Arc 20/0 1")
287+
runCallback("OnFrame")
288+
local baseDPS = build.calcsTab.calcsOutput.TotalDPS
289+
290+
build.skillsTab:PasteSocketGroup("Pact of K'Tash 1/0 1")
291+
runCallback("OnFrame")
292+
assert.True(build.calcsTab.calcsOutput.KtashUpTimeRatio > 0)
293+
assert.True(build.calcsTab.calcsOutput.TotalDPS > baseDPS)
294+
295+
newBuild()
296+
build.skillsTab:PasteSocketGroup("Fireball 20/0 1\nPact of K'Tash 1/0 1")
297+
runCallback("OnFrame")
298+
assert.True(build.calcsTab.calcsOutput.KtashUpTimeRatio == nil)
299+
end)
300+
301+
it("Test Empowered Spells - Pact of Lycia", function()
302+
build.skillsTab:PasteSocketGroup("Lightning Tendrils 20/0 1")
303+
runCallback("OnFrame")
304+
local baseDPS = build.calcsTab.calcsOutput.TotalDPS
305+
306+
build.skillsTab:PasteSocketGroup("Pact of Lycia 1/0 1")
307+
runCallback("OnFrame")
308+
assert.True(build.calcsTab.calcsOutput.LyciaUpTimeRatio > 0)
309+
assert.True(build.calcsTab.calcsOutput.TotalDPS > baseDPS)
310+
311+
newBuild()
312+
build.skillsTab:PasteSocketGroup("Fireball 20/0 1\nPact of Lycia 1/0 1")
313+
runCallback("OnFrame")
314+
assert.True(build.calcsTab.calcsOutput.LyciaUpTimeRatio == nil)
315+
316+
newBuild()
317+
build.skillsTab:PasteSocketGroup("Vaal Arc 20/0 1\nPact of Lycia 1/0 1")
318+
runCallback("OnFrame")
319+
assert.True(build.calcsTab.calcsOutput.LyciaUpTimeRatio == nil)
320+
end)
252321
end)

src/Data/SkillStatMap.lua

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2365,4 +2365,7 @@ return {
23652365
["is_totem"] = {
23662366
-- Display only
23672367
},
2368+
["pact_empower_limitation_specifier_for_stat_description"] = {
2369+
-- display only
2370+
},
23682371
}

src/Data/Skills/other.lua

Lines changed: 318 additions & 0 deletions
Large diffs are not rendered by default.

src/Export/Skills/other.txt

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,57 @@ local skills, mod, flag, skill = ...
745745
#baseMod skill("debuff", true)
746746
#mods
747747

748+
#skill PactOfBeidat
749+
#flags spell pact
750+
statMap = {
751+
["skill_empowers_next_x_spells_cast"] = {
752+
mod("BeidatEmpoweredSpells", "BASE", nil),
753+
},
754+
["pact_skill_damage_+%_final_with_hits_and_ailments_to_grant"] = {
755+
mod("BeidatPactDamage", "BASE", nil),
756+
},
757+
},
758+
#mods
759+
760+
#skill PactOfGhorr
761+
#flags spell pact duration
762+
statMap = {
763+
["skill_empowers_next_x_spells_cast"] = {
764+
mod("GhorrEmpoweredSpells", "BASE", nil),
765+
},
766+
["pact_skill_grant_damage_over_time_+%_final_to_spells"] = {
767+
mod("GhorrPactDamage", "BASE", nil),
768+
},
769+
},
770+
#mods
771+
772+
#skill PactOfKtash
773+
#flags spell pact
774+
statMap = {
775+
["skill_empowers_next_x_spells_cast"] = {
776+
mod("KtashEmpoweredSpells", "BASE", nil),
777+
},
778+
["pact_skill_grant_damage_+%_final_to_exerted_skills"] = {
779+
mod("KtashPactDamage", "BASE", nil),
780+
},
781+
["active_skill_osm_vaal_skill_soul_gain_prevention_+%_final_to_grant"] = {
782+
mod("KtashPactSoulGainPrevention", "BASE", nil),
783+
},
784+
},
785+
#mods
786+
787+
#skill PactOfLycia
788+
#flags spell pact
789+
statMap = {
790+
["skill_empowers_next_x_spells_cast"] = {
791+
mod("LyciaEmpoweredSpells", "BASE", nil),
792+
},
793+
["pact_skill_grant_damage_+%_final_to_exerted_skills"] = {
794+
mod("LyciaPactDamage", "BASE", nil),
795+
},
796+
},
797+
#mods
798+
748799
#skill Ravenous
749800
#flags spell
750801
fromTree = true,

src/Modules/CalcOffence.lua

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2783,6 +2783,137 @@ function calcs.offence(env, actor, activeSkill)
27832783
globalOutput.ExertedAttackUptimeRatioCalculated = true
27842784
end
27852785
end
2786+
2787+
-- Pacts // Empowered Spells
2788+
if activeSkill.skillTypes[SkillType.Spell] and not activeSkill.skillTypes[SkillType.Instant] and not activeSkill.skillTypes[SkillType.Brand] then
2789+
for index, value in ipairs(actor.activeSkillList) do
2790+
if not activeSkill.skillTypes[SkillType.Vaal] then
2791+
if value.activeEffect.grantedEffect.name == "Pact of Beidat" and not globalOutput.PactofBeidatCalculated and not value.skillFlags.disable
2792+
and (skillFlags.projectile or skillFlags.area or skillFlags.chaining) and not activeSkill.skillTypes[SkillType.Channel] then
2793+
globalOutput.CreatePactOffensiveCalcSection = true
2794+
globalOutput.PactOfBeidatDuration = calcSkillDuration(value.skillModList, value.skillCfg, value.skillData, env, enemyDB)
2795+
globalOutput.PactOfBeidatCooldown = calcSkillCooldown(value.skillModList, value.skillCfg, value.skillData)
2796+
globalOutput.PactOfBeidatCastTime = modDB:Sum("BASE", nil, "BeidatBaseCastTime")
2797+
globalOutput.BeidatEmpoweredCount = skillModList:Sum("BASE", nil, "BeidatEmpoweredSpells")
2798+
local baseUptimeRatio = m_min((globalOutput.BeidatEmpoweredCount / globalOutput.Speed) / (globalOutput.PactOfBeidatCooldown + globalOutput.PactOfBeidatCastTime), 1) * 100
2799+
local storedUses = value.skillData.storedUses + value.skillModList:Sum("BASE", value.skillCfg, "AdditionalCooldownUses")
2800+
globalOutput.BeidatUpTimeRatio = m_min(100, baseUptimeRatio * storedUses)
2801+
if globalBreakdown then
2802+
globalBreakdown.BeidatUpTimeRatio = { }
2803+
t_insert(globalBreakdown.BeidatUpTimeRatio, s_format("(%d ^8(number of Empowered)", globalOutput.BeidatEmpoweredCount))
2804+
t_insert(globalBreakdown.BeidatUpTimeRatio, s_format("/ %.2f) ^8(casts per second)", globalOutput.Speed))
2805+
if globalOutput.PactOfBeidatCastTime > 0 then
2806+
t_insert(globalBreakdown.BeidatUpTimeRatio, s_format("/ (%.2f ^8(pact cooldown)", globalOutput.PactOfBeidatCooldown))
2807+
t_insert(globalBreakdown.BeidatUpTimeRatio, s_format("+ %.2f) ^8(pact casttime)", globalOutput.PactOfBeidatCastTime))
2808+
else
2809+
t_insert(globalBreakdown.BeidatUpTimeRatio, s_format("/ %.2f ^8(average pact cooldown)", globalOutput.PactOfBeidatCooldown))
2810+
end
2811+
t_insert(globalBreakdown.BeidatUpTimeRatio, s_format("* %d ^8(stored uses)", storedUses))
2812+
t_insert(globalBreakdown.BeidatUpTimeRatio, s_format("= %d%%", globalOutput.BeidatUpTimeRatio))
2813+
end
2814+
local beidatDamage = modDB:Sum("BASE", nil, "BeidatPactDamage")
2815+
if beidatDamage > 0 then
2816+
local beidatUptime = skillModList:Flag(nil, "Condition:PactMaxHit") and 100 or globalOutput.BeidatUpTimeRatio
2817+
skillModList:NewMod("Damage", "MORE", beidatDamage * beidatUptime / 100, "Uptime Scaled Pact of Beidat", ModFlag.Spell, bor(KeywordFlag.Hit, KeywordFlag.Ailment))
2818+
end
2819+
globalOutput.PactofBeidatCalculated = true
2820+
end
2821+
if value.activeEffect.grantedEffect.name == "Pact of Ghorr" and not globalOutput.PactofGhorrCalculated and not value.skillFlags.disable
2822+
and activeSkill.skillTypes[SkillType.DamageOverTime] then
2823+
globalOutput.CreatePactOffensiveCalcSection = true
2824+
globalOutput.PactOfGhorrDuration = calcSkillDuration(value.skillModList, value.skillCfg, value.skillData, env, enemyDB)
2825+
globalOutput.PactOfGhorrCooldown = calcSkillCooldown(value.skillModList, value.skillCfg, value.skillData)
2826+
globalOutput.PactOfGhorrCastTime = modDB:Sum("BASE", nil, "GhorrBaseCastTime")
2827+
globalOutput.GhorrEmpoweredCount = skillModList:Sum("BASE", nil, "GhorrEmpoweredSpells")
2828+
local baseUptimeRatio = m_min((globalOutput.GhorrEmpoweredCount / globalOutput.Speed) / (globalOutput.PactOfGhorrCooldown + globalOutput.PactOfGhorrCastTime), 1) * 100
2829+
local storedUses = value.skillData.storedUses + value.skillModList:Sum("BASE", value.skillCfg, "AdditionalCooldownUses")
2830+
globalOutput.GhorrUpTimeRatio = m_min(100, baseUptimeRatio * storedUses)
2831+
if globalBreakdown then
2832+
globalBreakdown.GhorrUpTimeRatio = { }
2833+
t_insert(globalBreakdown.GhorrUpTimeRatio, s_format("(%d ^8(number of Empowered)", globalOutput.GhorrEmpoweredCount))
2834+
t_insert(globalBreakdown.GhorrUpTimeRatio, s_format("/ %.2f) ^8(casts per second)", globalOutput.Speed))
2835+
if globalOutput.PactOfGhorrCastTime > 0 then
2836+
t_insert(globalBreakdown.GhorrUpTimeRatio, s_format("/ (%.2f ^8(pact cooldown)", globalOutput.PactOfGhorrCooldown))
2837+
t_insert(globalBreakdown.GhorrUpTimeRatio, s_format("+ %.2f) ^8(pact casttime)", globalOutput.PactOfGhorrCastTime))
2838+
else
2839+
t_insert(globalBreakdown.GhorrUpTimeRatio, s_format("/ %.2f ^8(average pact cooldown)", globalOutput.PactOfGhorrCooldown))
2840+
end
2841+
t_insert(globalBreakdown.GhorrUpTimeRatio, s_format("* %d ^8(stored uses)", storedUses))
2842+
t_insert(globalBreakdown.GhorrUpTimeRatio, s_format("= %d%%", globalOutput.GhorrUpTimeRatio))
2843+
end
2844+
local GhorrDamage = modDB:Sum("BASE", nil, "GhorrPactDamage")
2845+
if GhorrDamage > 0 then
2846+
local GhorrUptime = skillModList:Flag(nil, "Condition:PactMaxHit") and 100 or globalOutput.GhorrUpTimeRatio
2847+
skillModList:NewMod("Damage", "MORE", GhorrDamage * GhorrUptime / 100, "Uptime Scaled Pact of Ghorr", ModFlag.Dot)
2848+
end
2849+
globalOutput.PactofGhorrCalculated = true
2850+
end
2851+
if value.activeEffect.grantedEffect.name == "Pact of Lycia" and not globalOutput.PactofLyciaCalculated and not value.skillFlags.disable
2852+
and activeSkill.skillTypes[SkillType.Channel] then
2853+
globalOutput.CreatePactOffensiveCalcSection = true
2854+
globalOutput.PactOfLyciaDuration = calcSkillDuration(value.skillModList, value.skillCfg, value.skillData, env, enemyDB)
2855+
globalOutput.PactOfLyciaCooldown = calcSkillCooldown(value.skillModList, value.skillCfg, value.skillData)
2856+
globalOutput.PactOfLyciaCastTime = modDB:Sum("BASE", nil, "LyciaBaseCastTime")
2857+
globalOutput.LyciaEmpoweredCount = skillModList:Sum("BASE", nil, "LyciaEmpoweredSpells")
2858+
local baseUptimeRatio = m_min((globalOutput.LyciaEmpoweredCount / globalOutput.Speed) / (globalOutput.PactOfLyciaCooldown + globalOutput.PactOfLyciaCastTime), 1) * 100
2859+
local storedUses = value.skillData.storedUses + value.skillModList:Sum("BASE", value.skillCfg, "AdditionalCooldownUses")
2860+
globalOutput.LyciaUpTimeRatio = m_min(100, baseUptimeRatio * storedUses)
2861+
if globalBreakdown then
2862+
globalBreakdown.LyciaUpTimeRatio = { }
2863+
t_insert(globalBreakdown.LyciaUpTimeRatio, s_format("(%d ^8(number of Empowered)", globalOutput.LyciaEmpoweredCount))
2864+
t_insert(globalBreakdown.LyciaUpTimeRatio, s_format("/ %.2f) ^8(casts per second)", globalOutput.Speed))
2865+
if globalOutput.PactOfLyciaCastTime > 0 then
2866+
t_insert(globalBreakdown.LyciaUpTimeRatio, s_format("/ (%.2f ^8(pact cooldown)", globalOutput.PactOfLyciaCooldown))
2867+
t_insert(globalBreakdown.LyciaUpTimeRatio, s_format("+ %.2f) ^8(pact casttime)", globalOutput.PactOfLyciaCastTime))
2868+
else
2869+
t_insert(globalBreakdown.LyciaUpTimeRatio, s_format("/ %.2f ^8(average pact cooldown)", globalOutput.PactOfLyciaCooldown))
2870+
end
2871+
t_insert(globalBreakdown.LyciaUpTimeRatio, s_format("* %d ^8(stored uses)", storedUses))
2872+
t_insert(globalBreakdown.LyciaUpTimeRatio, s_format("= %d%%", globalOutput.LyciaUpTimeRatio))
2873+
end
2874+
local LyciaDamage = modDB:Sum("BASE", nil, "LyciaPactDamage")
2875+
if LyciaDamage > 0 then
2876+
local LyciaUptime = skillModList:Flag(nil, "Condition:PactMaxHit") and 100 or globalOutput.LyciaUpTimeRatio
2877+
skillModList:NewMod("Damage", "MORE", LyciaDamage * LyciaUptime / 100, "Uptime Scaled Pact of Lycia", ModFlag.Spell)
2878+
end
2879+
globalOutput.PactofLyciaCalculated = true
2880+
end
2881+
else
2882+
if value.activeEffect.grantedEffect.name == "Pact of K'Tash" and not globalOutput.PactofKtashCalculated and not value.skillFlags.disable then
2883+
globalOutput.CreatePactOffensiveCalcSection = true
2884+
globalOutput.PactOfKtashDuration = calcSkillDuration(value.skillModList, value.skillCfg, value.skillData, env, enemyDB)
2885+
globalOutput.PactOfKtashCooldown = calcSkillCooldown(value.skillModList, value.skillCfg, value.skillData)
2886+
globalOutput.PactOfKtashCastTime = modDB:Sum("BASE", nil, "KtashBaseCastTime")
2887+
globalOutput.KtashEmpoweredCount = skillModList:Sum("BASE", nil, "KtashEmpoweredSpells")
2888+
local baseUptimeRatio = m_min((globalOutput.KtashEmpoweredCount / globalOutput.Speed) / (globalOutput.PactOfKtashCooldown + globalOutput.PactOfKtashCastTime), 1) * 100
2889+
local storedUses = value.skillData.storedUses + value.skillModList:Sum("BASE", value.skillCfg, "AdditionalCooldownUses")
2890+
globalOutput.KtashUpTimeRatio = m_min(100, baseUptimeRatio * storedUses)
2891+
if globalBreakdown then
2892+
globalBreakdown.KtashUpTimeRatio = { }
2893+
t_insert(globalBreakdown.KtashUpTimeRatio, s_format("(%d ^8(number of Empowered)", globalOutput.KtashEmpoweredCount))
2894+
t_insert(globalBreakdown.KtashUpTimeRatio, s_format("/ %.2f) ^8(casts per second)", globalOutput.Speed))
2895+
if globalOutput.PactOfKtashCastTime > 0 then
2896+
t_insert(globalBreakdown.KtashUpTimeRatio, s_format("/ (%.2f ^8(pact cooldown)", globalOutput.PactOfKtashCooldown))
2897+
t_insert(globalBreakdown.KtashUpTimeRatio, s_format("+ %.2f) ^8(pact casttime)", globalOutput.PactOfKtashCastTime))
2898+
else
2899+
t_insert(globalBreakdown.KtashUpTimeRatio, s_format("/ %.2f ^8(average pact cooldown)", globalOutput.PactOfKtashCooldown))
2900+
end
2901+
t_insert(globalBreakdown.KtashUpTimeRatio, s_format("* %d ^8(stored uses)", storedUses))
2902+
t_insert(globalBreakdown.KtashUpTimeRatio, s_format("= %d%%", globalOutput.KtashUpTimeRatio))
2903+
end
2904+
local KtashDamage = modDB:Sum("BASE", nil, "KtashPactDamage")
2905+
local KtashSoulGainPrevention = modDB:Sum("BASE", nil, "KtashPactSoulGainPrevention")
2906+
if KtashDamage > 0 then
2907+
local KtashUptime = skillModList:Flag(nil, "Condition:PactMaxHit") and 100 or globalOutput.KtashUpTimeRatio
2908+
skillModList:NewMod("Damage", "MORE", KtashDamage * KtashUptime / 100, "Uptime Scaled Pact of Ktash", ModFlag.Spell)
2909+
-- happens too late, duration is calculated earlier
2910+
-- skillModList:NewMod("SoulGainPreventionDuration", "MORE", KtashSoulGainPrevention * KtashUptime / 100, "Uptime Scaled Pact of Ktash")
2911+
end
2912+
globalOutput.PactofKtashCalculated = true
2913+
end
2914+
end
2915+
end
2916+
end
27862917
end
27872918

27882919
output.RuthlessBlowHitEffect = 1

src/Modules/CalcPerform.lua

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1430,6 +1430,26 @@ function calcs.perform(env, skipEHP)
14301430
modDB:NewMod("SeismicActive", "FLAG", true) -- Prevents effect from applying multiple times
14311431
end
14321432
end
1433+
local function calcCastTime(baseSpeed, skillModList, skillCfg, actor)
1434+
local castTime = baseSpeed / (calcLib.mod(skillModList, skillCfg, "Speed") * calcs.actionSpeedMod(actor))
1435+
castTime = m_min(castTime, data.misc.ServerTickRate)
1436+
return castTime
1437+
end
1438+
if env.mode_buffs and activeSkill.skillFlags.pact then
1439+
for _, pactName in ipairs({ "Beidat", "Ghorr", "Ktash", "Lycia" }) do
1440+
if (activeSkill.activeEffect.grantedEffect.name == (("Pact of "..pactName)) or
1441+
activeSkill.activeEffect.grantedEffect.name == "Pact of K'Tash" and pactName == "Ktash")
1442+
and not modDB:Flag(nil, pactName.."Active") then
1443+
env.player.modDB:NewMod(pactName.."PactDamage", "BASE", activeSkill.skillModList:Sum("BASE", env.player.mainSkill.skillCfg, pactName.."PactDamage"))
1444+
env.player.modDB:NewMod(pactName.."EmpoweredSpells", "BASE", activeSkill.skillModList:Sum("BASE", env.player.mainSkill.skillCfg, pactName.."EmpoweredSpells"))
1445+
env.player.modDB:NewMod(pactName.."BaseCastTime", "BASE", calcCastTime(activeSkill.activeEffect.grantedEffect.castTime, activeSkill.skillModList, activeSkill.skillCfg, env.player))
1446+
if pactName == "Ktash" then
1447+
env.player.modDB:NewMod("KtashPactSoulGainPrevention", "BASE", activeSkill.skillModList:Sum("BASE", env.player.mainSkill.skillCfg, "KtashPactSoulGainPrevention"))
1448+
end
1449+
modDB:NewMod(pactName.."Active", "FLAG", true) -- Prevents effect from applying multiple times
1450+
end
1451+
end
1452+
end
14331453
if activeSkill.skillData.triggeredOnDeath and not activeSkill.skillFlags.minion then
14341454
activeSkill.skillData.triggered = true
14351455
for _, value in ipairs(activeSkill.skillModList:Tabulate("INC", env.player.mainSkill.skillCfg, "TriggeredDamage")) do

src/Modules/CalcSections.lua

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,46 @@ return {
416416
},
417417
} }
418418
} },
419+
{ 3, "Pacts", 1, colorCodes.OFFENCE, { { defaultCollapsed = false, label = "Empowered Spells", data = {
420+
colWidth = 114,
421+
{
422+
haveOutput = "CreatePactOffensiveCalcSection",
423+
{ format = "Effective Impact" },
424+
{ format = "Avg Dmg Effect" },
425+
{ format = "Uptime" },
426+
{ format = "# of Empowered" },
427+
{ format = "Max 1-Hit Impact" },
428+
},
429+
{ label = "Pact of Beidat", haveOutput = "BeidatUpTimeRatio",
430+
{ format = "" },
431+
{ format = "" },
432+
{ format = "{0:output:BeidatUpTimeRatio}%", { breakdown = "BeidatUpTimeRatio" }, },
433+
{ format = "{0:output:BeidatEmpoweredCount}" },
434+
{ format = "" },
435+
},
436+
{ label = "Pact of Ghorr", haveOutput = "GhorrUpTimeRatio",
437+
{ format = "" },
438+
{ format = "" },
439+
{ format = "{0:output:GhorrUpTimeRatio}%", { breakdown = "GhorrUpTimeRatio" }, },
440+
{ format = "{0:output:GhorrEmpoweredCount}" },
441+
{ format = "" },
442+
},
443+
{ label = "Pact of K'Tash", haveOutput = "KtashUpTimeRatio",
444+
{ format = "" },
445+
{ format = "" },
446+
{ format = "{0:output:KtashUpTimeRatio}%", { breakdown = "KtashUpTimeRatio" }, },
447+
{ format = "{0:output:KtashEmpoweredCount}" },
448+
{ format = "" },
449+
},
450+
{ label = "Pact of Lycia", haveOutput = "LyciaUpTimeRatio",
451+
{ format = "" },
452+
{ format = "" },
453+
{ format = "{0:output:LyciaUpTimeRatio}%", { breakdown = "LyciaUpTimeRatio" }, },
454+
{ format = "{0:output:LyciaEmpoweredCount}" },
455+
{ format = "" },
456+
},
457+
} }
458+
} },
419459
{ 3, "Dot", 1, colorCodes.OFFENCE, {{ defaultCollapsed = false, label = "Skill Damage over Time", data = {
420460
extra = "{1:output:TotalDotCalcSection} total DoT",
421461
flag = "dot",

0 commit comments

Comments
 (0)