@@ -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
0 commit comments