Skip to content

Commit b46bbaf

Browse files
LocalIdentityLocalIdentity
andauthored
Add support for average Lightning Tendrils DPS (#8930)
* Add support for average Lightning Tendrils DPS Lightning Tendrils has a mechanic where it critically strikes every 3rd / 5th use but we were did not have a averaged calc for this There is now a new skill part for the averaged DPS I also applied DPS multipliers to the other 2 skill parts to show accurate DPS for just those parts when they hit as people may use the stronger pulse one to see DPS for Ignite * Fix formula for average damage on Eccentricity Averaging the crit chance and damage was not correct to get an accurate DPS value --------- Co-authored-by: LocalIdentity <localidentity2@gmail.com>
1 parent fd48671 commit b46bbaf

File tree

3 files changed

+77
-13
lines changed

3 files changed

+77
-13
lines changed

src/Data/Skills/act_int.lua

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12073,6 +12073,9 @@ skills["LightningTendrils"] = {
1207312073
statDescriptionScope = "skill_stat_descriptions",
1207412074
castTime = 0.23,
1207512075
parts = {
12076+
{
12077+
name = "Average DPS",
12078+
},
1207612079
{
1207712080
name = "Normal pulse",
1207812081
},
@@ -12082,17 +12085,24 @@ skills["LightningTendrils"] = {
1208212085
},
1208312086
statMap = {
1208412087
["lightning_tendrils_channelled_larger_pulse_damage_+%_final"] = {
12085-
mod("Damage", "MORE", nil, 0, bit.bor(KeywordFlag.Hit, KeywordFlag.Ailment), { type = "SkillPart", skillPart = 2 }),
12088+
mod("Damage", "MORE", nil, 0, bit.bor(KeywordFlag.Hit, KeywordFlag.Ailment), { type = "SkillPart", skillPart = 3 }),
1208612089
},
1208712090
["lightning_tendrils_channelled_larger_pulse_always_crit"] = {
12088-
mod("CritChance", "OVERRIDE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
12091+
mod("CritChance", "OVERRIDE", nil, 0, 0, { type = "SkillPart", skillPart = 3 }),
1208912092
base = 100
1209012093
},
12094+
["lightning_tendrils_channelled_larger_pulse_interval"] = {
12095+
flag("Every3UseCrit", { type = "SkillPart", skillPart = 1 }),
12096+
},
1209112097
},
1209212098
baseFlags = {
1209312099
spell = true,
1209412100
area = true,
1209512101
},
12102+
baseMods = {
12103+
mod("DPS", "MORE", -2/3 * 100, 0, 0, { type = "SkillPart", skillPart = 2 }),
12104+
mod("DPS", "MORE", -1/3 * 100, 0, 0, { type = "SkillPart", skillPart = 3 }),
12105+
},
1209612106
qualityStats = {
1209712107
Default = {
1209812108
{ "base_critical_strike_multiplier_+", 2 },
@@ -12167,7 +12177,20 @@ skills["LightningTendrilsAltX"] = {
1216712177
skillTypes = { [SkillType.Spell] = true, [SkillType.Damage] = true, [SkillType.Area] = true, [SkillType.Totemable] = true, [SkillType.Lightning] = true, [SkillType.Channel] = true, [SkillType.AreaSpell] = true, },
1216812178
statDescriptionScope = "skill_stat_descriptions",
1216912179
castTime = 0.23,
12180+
postCritFunc = function(activeSkill, output, breakdown)
12181+
-- Formula to find a effective damage multiplier to take into account the 500% more damage on every 5th hit
12182+
if activeSkill.skillPart == 1 then
12183+
local critChance = output.PreEffectiveCritChance / 100
12184+
local effectiveCritChance = output.CritChance / 100
12185+
local critMulti = output.CritMultiplier
12186+
local averageMore = 100 * ((4 * (1 + critChance * (critMulti - 1)) + 6 * critMulti) / (5 * ((1 - effectiveCritChance) + critMulti * effectiveCritChance)) - 1)
12187+
activeSkill.skillModList:NewMod("Damage", "MORE", averageMore, "Average Pulse Damage", nil, bit.bor(KeywordFlag.Hit, KeywordFlag.Ailment), { type = "SkillPart", skillPart = 1 })
12188+
end
12189+
end,
1217012190
parts = {
12191+
{
12192+
name = "Average DPS",
12193+
},
1217112194
{
1217212195
name = "Normal pulse",
1217312196
},
@@ -12177,21 +12200,28 @@ skills["LightningTendrilsAltX"] = {
1217712200
},
1217812201
statMap = {
1217912202
["lightning_tendrils_channelled_larger_pulse_damage_+%_final"] = {
12180-
mod("Damage", "MORE", nil, 0, bit.bor(KeywordFlag.Hit, KeywordFlag.Ailment), { type = "SkillPart", skillPart = 2 }),
12203+
mod("Damage", "MORE", nil, 0, bit.bor(KeywordFlag.Hit, KeywordFlag.Ailment), { type = "SkillPart", skillPart = 3 }),
1218112204
},
1218212205
["lightning_tendrils_channelled_larger_pulse_area_of_effect_+%_final"] = {
12183-
mod("AreaOfEffect", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
12206+
mod("AreaOfEffect", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 3 }),
1218412207
},
1218512208
["lightning_tendrils_channelled_larger_pulse_always_crit"] = {
12186-
mod("CritChance", "OVERRIDE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
12209+
mod("CritChance", "OVERRIDE", nil, 0, 0, { type = "SkillPart", skillPart = 3 }),
1218712210
base = 100
1218812211
},
12212+
["lightning_tendrils_channelled_larger_pulse_interval"] = {
12213+
flag("Every5UseCrit", { type = "SkillPart", skillPart = 1 }),
12214+
},
1218912215
},
1219012216
baseFlags = {
1219112217
spell = true,
1219212218
area = true,
1219312219
channelling = true,
1219412220
},
12221+
baseMods = {
12222+
mod("DPS", "MORE", -1/5 * 100, 0, 0, { type = "SkillPart", skillPart = 2 }),
12223+
mod("DPS", "MORE", -4/5 * 100, 0, 0, { type = "SkillPart", skillPart = 3 }),
12224+
},
1219512225
qualityStats = {
1219612226
Default = {
1219712227
{ "base_critical_strike_multiplier_+", 2 },

src/Export/Skills/act_int.txt

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2768,6 +2768,9 @@ local skills, mod, flag, skill = ...
27682768
#skill LightningTendrils
27692769
#flags spell area
27702770
parts = {
2771+
{
2772+
name = "Average DPS",
2773+
},
27712774
{
27722775
name = "Normal pulse",
27732776
},
@@ -2777,18 +2780,36 @@ local skills, mod, flag, skill = ...
27772780
},
27782781
statMap = {
27792782
["lightning_tendrils_channelled_larger_pulse_damage_+%_final"] = {
2780-
mod("Damage", "MORE", nil, 0, bit.bor(KeywordFlag.Hit, KeywordFlag.Ailment), { type = "SkillPart", skillPart = 2 }),
2783+
mod("Damage", "MORE", nil, 0, bit.bor(KeywordFlag.Hit, KeywordFlag.Ailment), { type = "SkillPart", skillPart = 3 }),
27812784
},
27822785
["lightning_tendrils_channelled_larger_pulse_always_crit"] = {
2783-
mod("CritChance", "OVERRIDE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
2786+
mod("CritChance", "OVERRIDE", nil, 0, 0, { type = "SkillPart", skillPart = 3 }),
27842787
base = 100
27852788
},
2789+
["lightning_tendrils_channelled_larger_pulse_interval"] = {
2790+
flag("Every3UseCrit", { type = "SkillPart", skillPart = 1 }),
2791+
},
27862792
},
2793+
#baseMod mod("DPS", "MORE", -2/3 * 100, 0, 0, { type = "SkillPart", skillPart = 2 })
2794+
#baseMod mod("DPS", "MORE", -1/3 * 100, 0, 0, { type = "SkillPart", skillPart = 3 })
27872795
#mods
27882796

27892797
#skill LightningTendrilsAltX
27902798
#flags spell area channelling
2799+
postCritFunc = function(activeSkill, output, breakdown)
2800+
-- Formula to find a effective damage multiplier to take into account the 500% more damage on every 5th hit
2801+
if activeSkill.skillPart == 1 then
2802+
local critChance = output.PreEffectiveCritChance / 100
2803+
local effectiveCritChance = output.CritChance / 100
2804+
local critMulti = output.CritMultiplier
2805+
local averageMore = 100 * ((4 * (1 + critChance * (critMulti - 1)) + 6 * critMulti) / (5 * ((1 - effectiveCritChance) + critMulti * effectiveCritChance)) - 1)
2806+
activeSkill.skillModList:NewMod("Damage", "MORE", averageMore, "Average Pulse Damage", nil, bit.bor(KeywordFlag.Hit, KeywordFlag.Ailment), { type = "SkillPart", skillPart = 1 })
2807+
end
2808+
end,
27912809
parts = {
2810+
{
2811+
name = "Average DPS",
2812+
},
27922813
{
27932814
name = "Normal pulse",
27942815
},
@@ -2798,16 +2819,21 @@ local skills, mod, flag, skill = ...
27982819
},
27992820
statMap = {
28002821
["lightning_tendrils_channelled_larger_pulse_damage_+%_final"] = {
2801-
mod("Damage", "MORE", nil, 0, bit.bor(KeywordFlag.Hit, KeywordFlag.Ailment), { type = "SkillPart", skillPart = 2 }),
2822+
mod("Damage", "MORE", nil, 0, bit.bor(KeywordFlag.Hit, KeywordFlag.Ailment), { type = "SkillPart", skillPart = 3 }),
28022823
},
28032824
["lightning_tendrils_channelled_larger_pulse_area_of_effect_+%_final"] = {
2804-
mod("AreaOfEffect", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
2825+
mod("AreaOfEffect", "MORE", nil, 0, 0, { type = "SkillPart", skillPart = 3 }),
28052826
},
28062827
["lightning_tendrils_channelled_larger_pulse_always_crit"] = {
2807-
mod("CritChance", "OVERRIDE", nil, 0, 0, { type = "SkillPart", skillPart = 2 }),
2828+
mod("CritChance", "OVERRIDE", nil, 0, 0, { type = "SkillPart", skillPart = 3 }),
28082829
base = 100
28092830
},
2831+
["lightning_tendrils_channelled_larger_pulse_interval"] = {
2832+
flag("Every5UseCrit", { type = "SkillPart", skillPart = 1 }),
2833+
},
28102834
},
2835+
#baseMod mod("DPS", "MORE", -1/5 * 100, 0, 0, { type = "SkillPart", skillPart = 2 })
2836+
#baseMod mod("DPS", "MORE", -4/5 * 100, 0, 0, { type = "SkillPart", skillPart = 3 })
28112837
#mods
28122838

28132839
#skill LightningTendrilsAltY

src/Modules/CalcOffence.lua

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2847,11 +2847,14 @@ function calcs.offence(env, actor, activeSkill)
28472847
output.CritChance = (1 - (1 - output.CritChance / 100) ^ (critRolls + 1)) * 100
28482848
end
28492849
local preHitCheckCritChance = output.CritChance
2850-
local pre3rdUseCritChance= output.CritChance
2850+
local preSkillUseCritChance= output.CritChance
28512851
if env.mode_effective then
28522852
if skillModList:Flag(skillCfg, "Every3UseCrit") then
28532853
output.CritChance = (2 * output.CritChance + 100) / 3
28542854
end
2855+
if skillModList:Flag(skillCfg, "Every5UseCrit") then
2856+
output.CritChance = (4 * output.CritChance + 100) / 5
2857+
end
28552858
preHitCheckCritChance = output.CritChance
28562859
output.CritChance = output.CritChance * output.AccuracyHitChance / 100
28572860
end
@@ -2874,13 +2877,16 @@ function calcs.offence(env, actor, activeSkill)
28742877
local overCap = preCapCritChance - 100
28752878
t_insert(breakdown.CritChance, s_format("Crit is overcapped by %.2f%% (%d%% increased Critical Strike Chance)", overCap, overCap / more / (baseCrit + base) * 100))
28762879
end
2877-
if env.mode_effective and (critRolls ~= 0 or skillModList:Flag(skillCfg, "Every3UseCrit")) then
2880+
if env.mode_effective and (critRolls ~= 0 or skillModList:Flag(skillCfg, "Every3UseCrit") or skillModList:Flag(skillCfg, "Every5UseCrit")) then
28782881
if critRolls ~= 0 then
28792882
t_insert(breakdown.CritChance, "Crit Chance is Lucky:")
28802883
t_insert(breakdown.CritChance, s_format("1 - (1 - %.4f)^ %d", preLuckyCritChance / 100, critRolls + 1))
28812884
end
28822885
if skillModList:Flag(skillCfg, "Every3UseCrit") then
2883-
t_insert(breakdown.CritChance, s_format("+ %.2f%% ^8(crit every 3rd use)", (2 * pre3rdUseCritChance + 100) / 3 - pre3rdUseCritChance))
2886+
t_insert(breakdown.CritChance, s_format("+ %.2f%% ^8(crit every 3rd use)", (2 * preSkillUseCritChance + 100) / 3 - preSkillUseCritChance))
2887+
end
2888+
if skillModList:Flag(skillCfg, "Every5UseCrit") then
2889+
t_insert(breakdown.CritChance, s_format("+ %.2f%% ^8(crit every 5th use)", (4 * preSkillUseCritChance + 100) / 5 - preSkillUseCritChance))
28842890
end
28852891
t_insert(breakdown.CritChance, s_format("= %.2f%%", preHitCheckCritChance))
28862892
end
@@ -2968,6 +2974,8 @@ function calcs.offence(env, actor, activeSkill)
29682974

29692975
--Calculate reservation DPS
29702976
globalOutput.ReservationDpsMultiplier = 100 / (100 - enemyDB:Sum("BASE", nil, "LifeReservationPercent"))
2977+
2978+
runSkillFunc("postCritFunc")
29712979

29722980
-- Calculate base hit damage
29732981
for _, damageType in ipairs(dmgTypeList) do

0 commit comments

Comments
 (0)