Skip to content

Commit dc96c35

Browse files
Edvinas-SmitaLocalIdentity
andauthored
Implement Seismic / Lightning Spire Trap DPS (#5212)
* Implement Seismic Trap DPS Added the basic seismic trap mechanics and also added some average shotgunning against configurable enemy size. * Expand seismic trap logic quite a bit and copy pasted most of its logic to lightning spire trap and a bit to flamethrower trap * Seismic breakdown improvements Expanded, reworded and shuffled information to make it more readable (hopefully) + some small fixes * Widen skill part dropdown control * Fix other speed mods applying to seismic/spire * Fix wave speed errors and breakdown * Fix formatting and skill list for one box Co-authored-by: LocalIdentity <localidentity2@gmail.com>
1 parent 3d9da5f commit dc96c35

File tree

8 files changed

+658
-13
lines changed

8 files changed

+658
-13
lines changed

src/Classes/CalcsTab.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ local CalcsTabClass = newClass("CalcsTab", "UndoHandler", "ControlHost", "Contro
5656
end)
5757
}, },
5858
{ label = "Skill Part", playerFlag = "multiPart", { controlName = "mainSkillPart",
59-
control = new("DropDownControl", nil, 0, 0, 150, 16, nil, function(index, value)
59+
control = new("DropDownControl", nil, 0, 0, 250, 16, nil, function(index, value)
6060
local mainSocketGroup = self.build.skillsTab.socketGroupList[self.input.skill_number]
6161
local srcInstance = mainSocketGroup.displaySkillListCalcs[mainSocketGroup.mainActiveSkillCalcs].activeEffect.srcInstance
6262
srcInstance.skillPartCalcs = index

src/Data/Skills/act_dex.lua

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3860,6 +3860,23 @@ skills["FlamethrowerTrap"] = {
38603860
skillTypes = { [SkillType.Spell] = true, [SkillType.Duration] = true, [SkillType.Damage] = true, [SkillType.Mineable] = true, [SkillType.Area] = true, [SkillType.Trapped] = true, [SkillType.Fire] = true, [SkillType.AreaSpell] = true, [SkillType.Cooldown] = true, },
38613861
statDescriptionScope = "skill_stat_descriptions",
38623862
castTime = 1,
3863+
preDamageFunc = function(activeSkill, output, breakdown)
3864+
-- many unknown stats. can't calculate DPS
3865+
local t_insert = table.insert
3866+
local s_format = string.format
3867+
3868+
local duration = output.Duration
3869+
local cooldown = output.TrapCooldown
3870+
local averageActiveTraps = duration / cooldown
3871+
output.AverageActiveTraps = averageActiveTraps
3872+
if breakdown then
3873+
breakdown.AverageActiveTraps = { }
3874+
t_insert(breakdown.AverageActiveTraps, "Average active traps, not considering stored cooldown uses:")
3875+
t_insert(breakdown.AverageActiveTraps, s_format("%.2f^8 (skill duration)", duration))
3876+
t_insert(breakdown.AverageActiveTraps, s_format("/ %.2f^8 (cooldown)", cooldown))
3877+
t_insert(breakdown.AverageActiveTraps, s_format("= %.2f traps", averageActiveTraps))
3878+
end
3879+
end,
38633880
statMap = {
38643881
["flamethrower_trap_damage_+%_final_vs_burning_enemies"] = {
38653882
mod("Damage", "MORE", nil, 0, 0, { type = "ActorCondition", actor = "enemy", var = "Burning" }),
@@ -7408,6 +7425,148 @@ skills["PhysCascadeTrap"] = {
74087425
skillTypes = { [SkillType.Spell] = true, [SkillType.Duration] = true, [SkillType.Damage] = true, [SkillType.Mineable] = true, [SkillType.Area] = true, [SkillType.Trapped] = true, [SkillType.AreaSpell] = true, [SkillType.Physical] = true, [SkillType.Cooldown] = true, },
74097426
statDescriptionScope = "skill_stat_descriptions",
74107427
castTime = 1,
7428+
parts = {
7429+
{
7430+
name = "One wave hitting",
7431+
},
7432+
{
7433+
name = "Average waves hitting configured size enemy",
7434+
},
7435+
{
7436+
name = "All waves hitting",
7437+
},
7438+
{
7439+
name = "Average active traps, one wave",
7440+
},
7441+
{
7442+
name = "Average active traps, average waves",
7443+
},
7444+
{
7445+
name = "Average active traps, all waves",
7446+
},
7447+
},
7448+
preDamageFunc = function(activeSkill, output, breakdown)
7449+
local skillCfg = activeSkill.skillCfg
7450+
local skillData = activeSkill.skillData
7451+
local skillPart = activeSkill.skillPart
7452+
local skillModList = activeSkill.skillModList
7453+
local t_insert = table.insert
7454+
local s_format = string.format
7455+
7456+
local baseInterval = skillData.repeatInterval
7457+
local incFrequency = (1 + skillModList:Sum("INC", skillCfg, "TrapThrowingSpeed", "SeismicPulseFrequency") / 100)
7458+
local moreFrequency = skillModList:More(skillCfg, "TrapThrowingSpeed", "SeismicPulseFrequency")
7459+
local wavePulseRate = incFrequency * moreFrequency / baseInterval
7460+
skillData.hitTimeOverride = 1 / wavePulseRate
7461+
output.WavePulseRate = wavePulseRate
7462+
local moreDuration = skillModList:More(skillCfg, "Duration")
7463+
local duration = output.Duration
7464+
local pulses = math.floor(duration * wavePulseRate)
7465+
output.PulsesPerTrap = pulses
7466+
local effectiveDuration = pulses / wavePulseRate
7467+
local cooldown = output.TrapCooldown
7468+
local averageActiveTraps = effectiveDuration / cooldown
7469+
output.AverageActiveTraps = averageActiveTraps
7470+
local function hitChance(enemyRadius, areaDamageRadius, areaSpreadRadius) -- not to be confused with attack hit chance
7471+
local damagingAreaRadius = areaDamageRadius + enemyRadius - 1 -- radius where area damage can land to hit the enemy;
7472+
-- -1 because of two assumptions: PoE coordinates are integers and damage is not registered if the two areas only share a point or vertex. If either is not correct, then -1 is not needed.
7473+
return math.min(damagingAreaRadius * damagingAreaRadius / (areaSpreadRadius * areaSpreadRadius), 1)
7474+
end
7475+
local enemyRadius = skillModList:Sum("BASE", skillCfg, "EnemyRadius")
7476+
local waveRadius = output.AreaOfEffectRadiusSecondary
7477+
local fullRadius = output.AreaOfEffectRadius
7478+
local overlapChance = hitChance(enemyRadius, waveRadius, fullRadius)
7479+
output.OverlapChance = overlapChance * 100
7480+
if breakdown then
7481+
breakdown.OverlapChance = { }
7482+
t_insert(breakdown.OverlapChance, "Chance for individual wave to land within range to damage enemy:")
7483+
t_insert(breakdown.OverlapChance, "^8= (area where wave can spawn to damage enemy) / (total area)")
7484+
t_insert(breakdown.OverlapChance, "^8= (^7secondary radius^8 + ^7enemy radius^8 - 1) ^ 2 / ^7radius^8 ^ 2")
7485+
t_insert(breakdown.OverlapChance, s_format("^8= (^7%d^8 + ^7%d^8 - 1) ^ 2 / ^7%d^8 ^ 2", waveRadius, enemyRadius, fullRadius))
7486+
t_insert(breakdown.OverlapChance, s_format("^8= ^7%.3f^8%%", overlapChance * 100))
7487+
breakdown.WavePulseRate = { }
7488+
t_insert(breakdown.WavePulseRate, "Pulse rate:")
7489+
t_insert(breakdown.WavePulseRate, s_format("%.2f ^8(base pulse rate)", 1 / baseInterval))
7490+
t_insert(breakdown.WavePulseRate, s_format("* %.2f ^8(increased/reduced pulse frequency)", incFrequency))
7491+
t_insert(breakdown.WavePulseRate, s_format("* %.2f ^8(more/less pulse frequency)", moreFrequency))
7492+
t_insert(breakdown.WavePulseRate, s_format("= %.2f^8/s", wavePulseRate))
7493+
breakdown.PulsesPerTrap = { }
7494+
t_insert(breakdown.PulsesPerTrap, "Pulses per trap:")
7495+
t_insert(breakdown.PulsesPerTrap, s_format("%.3f ^8(skill duration)", duration))
7496+
t_insert(breakdown.PulsesPerTrap, s_format("* %.2f ^8(pulse rate)", wavePulseRate))
7497+
t_insert(breakdown.PulsesPerTrap, s_format("= %.2f ^8pulses", duration * wavePulseRate))
7498+
t_insert(breakdown.PulsesPerTrap, "^8rounded down")
7499+
t_insert(breakdown.PulsesPerTrap, s_format("= %d ^8pulses", pulses))
7500+
t_insert(breakdown.PulsesPerTrap, s_format("^8Next breakpoint: %d%% increased Trap Throwing Speed / %d%% increased Duration", math.ceil(100 * (incFrequency * (pulses + 1) / (duration * wavePulseRate) - incFrequency)), math.ceil(100 * ((pulses + 1) / wavePulseRate / skillData.duration / moreDuration - output.DurationMod / moreDuration ))))
7501+
t_insert(breakdown.PulsesPerTrap, s_format("^8Previous breakpoint: %d%% reduced Trap Throwing Speed / %d%% reduced Duration", -math.ceil(100 * (incFrequency * pulses / (duration * wavePulseRate) - incFrequency) - 1), -math.ceil(100 * (pulses / wavePulseRate / skillData.duration - output.DurationMod - 0.01) * moreDuration)))
7502+
breakdown.AverageActiveTraps = { }
7503+
t_insert(breakdown.AverageActiveTraps, "Average active traps, not considering stored cooldown uses:")
7504+
t_insert(breakdown.AverageActiveTraps, s_format("%.2f^8 / ^7%.2f^8 (pulses / pulse rate = effective skill duration)", pulses, wavePulseRate))
7505+
t_insert(breakdown.AverageActiveTraps, s_format("/ %.2f ^8(cooldown)", cooldown))
7506+
t_insert(breakdown.AverageActiveTraps, s_format("= %.2f traps", averageActiveTraps))
7507+
end
7508+
local maxWaves = skillModList:Sum("BASE", skillCfg, "MaximumWaves")
7509+
local dpsMultiplier = 1
7510+
if skillPart == 2 then
7511+
dpsMultiplier = maxWaves * overlapChance
7512+
if breakdown then
7513+
breakdown.SkillDPSMultiplier = {}
7514+
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
7515+
t_insert(breakdown.SkillDPSMultiplier, "^8= ^7maximum waves^8 * ^7overlap chance^8")
7516+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%d^8 * ^7%.2f^8", maxWaves, overlapChance))
7517+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%.3f", dpsMultiplier))
7518+
end
7519+
elseif skillPart == 3 then
7520+
dpsMultiplier = maxWaves
7521+
if breakdown then
7522+
breakdown.SkillDPSMultiplier = {}
7523+
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
7524+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%d (maximum waves)", dpsMultiplier))
7525+
end
7526+
elseif skillPart == 4 then
7527+
dpsMultiplier = averageActiveTraps
7528+
if breakdown then
7529+
breakdown.SkillDPSMultiplier = {}
7530+
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
7531+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%.2f (average active traps)", dpsMultiplier))
7532+
end
7533+
elseif skillPart == 5 then
7534+
dpsMultiplier = averageActiveTraps * maxWaves * overlapChance
7535+
if breakdown then
7536+
breakdown.SkillDPSMultiplier = {}
7537+
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
7538+
t_insert(breakdown.SkillDPSMultiplier, "^8= ^7average active traps^8 * ^7maximum waves^8 * ^7overlap chance^8")
7539+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%.2f^8 * ^7%d^8 * ^7%.2f", averageActiveTraps, maxWaves, overlapChance))
7540+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%.3f", dpsMultiplier))
7541+
end
7542+
elseif skillPart == 6 then
7543+
dpsMultiplier = averageActiveTraps * maxWaves
7544+
if breakdown then
7545+
breakdown.SkillDPSMultiplier = {}
7546+
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
7547+
t_insert(breakdown.SkillDPSMultiplier, "^8= ^7average active traps^8 * ^7maximum waves")
7548+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%.2f^8 * ^7%d", averageActiveTraps, maxWaves))
7549+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%.3f", dpsMultiplier))
7550+
end
7551+
end
7552+
if dpsMultiplier ~= 1 then
7553+
skillData.dpsMultiplier = (skillData.dpsMultiplier or 1) * dpsMultiplier
7554+
output.SkillDPSMultiplier = (output.SkillDPSMultiplier or 1) * dpsMultiplier
7555+
end
7556+
end,
7557+
statMap = {
7558+
["base_skill_show_average_damage_instead_of_dps"] = {},
7559+
["phys_cascade_trap_base_interval_duration_ms"] = {
7560+
skill("repeatInterval", nil),
7561+
div = 1000,
7562+
},
7563+
["phys_cascade_trap_number_of_cascades"] = {
7564+
mod("MaximumWaves", "BASE", nil),
7565+
},
7566+
["seismic_trap_frequency_+%"] = {
7567+
mod("SeismicPulseFrequency", "INC", nil),
7568+
},
7569+
},
74117570
baseFlags = {
74127571
spell = true,
74137572
area = true,

src/Data/Skills/act_int.lua

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6422,6 +6422,151 @@ skills["LightningTowerTrap"] = {
64226422
skillTypes = { [SkillType.Spell] = true, [SkillType.Duration] = true, [SkillType.Damage] = true, [SkillType.Mineable] = true, [SkillType.Area] = true, [SkillType.Trapped] = true, [SkillType.Lightning] = true, [SkillType.AreaSpell] = true, [SkillType.Cooldown] = true, },
64236423
statDescriptionScope = "skill_stat_descriptions",
64246424
castTime = 1,
6425+
parts = {
6426+
{
6427+
name = "One wave hitting",
6428+
},
6429+
{
6430+
name = "Average waves hitting configured size enemy",
6431+
},
6432+
{
6433+
name = "All waves hitting",
6434+
},
6435+
{
6436+
name = "Average active traps, one wave",
6437+
},
6438+
{
6439+
name = "Average active traps, average waves",
6440+
},
6441+
{
6442+
name = "Average active traps, all waves",
6443+
},
6444+
},
6445+
preDamageFunc = function(activeSkill, output, breakdown)
6446+
local skillCfg = activeSkill.skillCfg
6447+
local skillData = activeSkill.skillData
6448+
local skillPart = activeSkill.skillPart
6449+
local skillModList = activeSkill.skillModList
6450+
local t_insert = table.insert
6451+
local s_format = string.format
6452+
6453+
-- seemingly the only mechanical difference with seismic trap - this one does not scale it's total radius with AoE modifiers
6454+
output.AreaOfEffectRadius = skillData.radius
6455+
if breakdown then
6456+
breakdown.AreaOfEffectRadius = {"Targeting area of this skill is not affected by Area of Effect modifiers."}
6457+
end
6458+
6459+
local baseInterval = skillData.repeatInterval
6460+
local incFrequency = (1 + skillModList:Sum("INC", skillCfg, "TrapThrowingSpeed") / 100)
6461+
local moreFrequency = skillModList:More(skillCfg, "TrapThrowingSpeed")
6462+
local wavePulseRate = incFrequency * moreFrequency / baseInterval
6463+
skillData.hitTimeOverride = 1 / wavePulseRate
6464+
output.WavePulseRate = wavePulseRate
6465+
local moreDuration = skillModList:More(skillCfg, "Duration")
6466+
local duration = output.Duration
6467+
local pulses = math.floor(duration * wavePulseRate)
6468+
output.PulsesPerTrap = pulses
6469+
local effectiveDuration = pulses / wavePulseRate
6470+
local cooldown = output.TrapCooldown
6471+
local averageActiveTraps = effectiveDuration / cooldown
6472+
output.AverageActiveTraps = averageActiveTraps
6473+
local function hitChance(enemyRadius, areaDamageRadius, areaSpreadRadius) -- not to be confused with attack hit chance
6474+
local damagingAreaRadius = areaDamageRadius + enemyRadius - 1 -- radius where area damage can land to hit the enemy;
6475+
-- -1 because of two assumptions: PoE coordinates are integers and damage is not registered if the two areas only share a point or vertex. If either is not correct, then -1 is not needed.
6476+
return math.min(damagingAreaRadius * damagingAreaRadius / (areaSpreadRadius * areaSpreadRadius), 1)
6477+
end
6478+
local enemyRadius = skillModList:Sum("BASE", skillCfg, "EnemyRadius")
6479+
local waveRadius = output.AreaOfEffectRadiusSecondary
6480+
local fullRadius = output.AreaOfEffectRadius
6481+
local overlapChance = hitChance(enemyRadius, waveRadius, fullRadius)
6482+
output.OverlapChance = overlapChance * 100
6483+
if breakdown then
6484+
breakdown.OverlapChance = { }
6485+
t_insert(breakdown.OverlapChance, "Chance for individual wave to land within range to damage enemy:")
6486+
t_insert(breakdown.OverlapChance, "^8= (area where wave can spawn to damage enemy) / (total area)")
6487+
t_insert(breakdown.OverlapChance, "^8= (^7secondary radius^8 + ^7enemy radius^8 - 1) ^ 2 / ^7radius^8 ^ 2")
6488+
t_insert(breakdown.OverlapChance, s_format("^8= (^7%d^8 + ^7%d^8 - 1) ^ 2 / ^7%d^8 ^ 2", waveRadius, enemyRadius, fullRadius))
6489+
t_insert(breakdown.OverlapChance, s_format("^8= ^7%.3f^8%%", overlapChance * 100))
6490+
breakdown.WavePulseRate = { }
6491+
t_insert(breakdown.WavePulseRate, "Pulse rate:")
6492+
t_insert(breakdown.WavePulseRate, s_format("%.2f ^8(base pulse rate)", 1 / baseInterval))
6493+
t_insert(breakdown.WavePulseRate, s_format("* %.2f ^8(increased/reduced pulse frequency)", incFrequency))
6494+
t_insert(breakdown.WavePulseRate, s_format("* %.2f ^8(more/less pulse frequency)", moreFrequency))
6495+
t_insert(breakdown.WavePulseRate, s_format("= %.2f^8/s", wavePulseRate))
6496+
breakdown.PulsesPerTrap = { }
6497+
t_insert(breakdown.PulsesPerTrap, "Pulses per trap:")
6498+
t_insert(breakdown.PulsesPerTrap, s_format("%.3f ^8(skill duration)", duration))
6499+
t_insert(breakdown.PulsesPerTrap, s_format("* %.2f ^8(pulse rate)", wavePulseRate))
6500+
t_insert(breakdown.PulsesPerTrap, s_format("= %.2f ^8pulses", duration * wavePulseRate))
6501+
t_insert(breakdown.PulsesPerTrap, "^8rounded down")
6502+
t_insert(breakdown.PulsesPerTrap, s_format("= %d ^8pulses", pulses))
6503+
t_insert(breakdown.PulsesPerTrap, s_format("^8Next breakpoint: %d%% increased Trap Throwing Speed / %d%% increased Duration", math.ceil(100 * (incFrequency * (pulses + 1) / (duration * wavePulseRate) - incFrequency)), math.ceil(100 * ((pulses + 1) / wavePulseRate / skillData.duration / moreDuration - output.DurationMod / moreDuration ))))
6504+
t_insert(breakdown.PulsesPerTrap, s_format("^8Previous breakpoint: %d%% reduced Trap Throwing Speed / %d%% reduced Duration", -math.ceil(100 * (incFrequency * pulses / (duration * wavePulseRate) - incFrequency) - 1), -math.ceil(100 * (pulses / wavePulseRate / skillData.duration - output.DurationMod - 0.01) * moreDuration)))
6505+
breakdown.AverageActiveTraps = { }
6506+
t_insert(breakdown.AverageActiveTraps, "Average active traps, not considering stored cooldown uses:")
6507+
t_insert(breakdown.AverageActiveTraps, s_format("%.2f^8 / ^7%.2f^8 (pulses / pulse rate = effective skill duration)", pulses, wavePulseRate))
6508+
t_insert(breakdown.AverageActiveTraps, s_format("/ %.2f ^8(cooldown)", cooldown))
6509+
t_insert(breakdown.AverageActiveTraps, s_format("= %.2f traps", averageActiveTraps))
6510+
end
6511+
local maxWaves = skillModList:Sum("BASE", skillCfg, "MaximumWaves")
6512+
local dpsMultiplier = 1
6513+
if skillPart == 2 then
6514+
dpsMultiplier = maxWaves * overlapChance
6515+
if breakdown then
6516+
breakdown.SkillDPSMultiplier = {}
6517+
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
6518+
t_insert(breakdown.SkillDPSMultiplier, "^8= ^7maximum waves^8 * ^7overlap chance^8")
6519+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%d^8 * ^7%.2f^8", maxWaves, overlapChance))
6520+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%.3f", dpsMultiplier))
6521+
end
6522+
elseif skillPart == 3 then
6523+
dpsMultiplier = maxWaves
6524+
if breakdown then
6525+
breakdown.SkillDPSMultiplier = {}
6526+
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
6527+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%d (maximum waves)", dpsMultiplier))
6528+
end
6529+
elseif skillPart == 4 then
6530+
dpsMultiplier = averageActiveTraps
6531+
if breakdown then
6532+
breakdown.SkillDPSMultiplier = {}
6533+
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
6534+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%.2f (average active traps)", dpsMultiplier))
6535+
end
6536+
elseif skillPart == 5 then
6537+
dpsMultiplier = averageActiveTraps * maxWaves * overlapChance
6538+
if breakdown then
6539+
breakdown.SkillDPSMultiplier = {}
6540+
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
6541+
t_insert(breakdown.SkillDPSMultiplier, "^8= ^7average active traps^8 * ^7maximum waves^8 * ^7overlap chance^8")
6542+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%.2f^8 * ^7%d^8 * ^7%.2f", averageActiveTraps, maxWaves, overlapChance))
6543+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%.3f", dpsMultiplier))
6544+
end
6545+
elseif skillPart == 6 then
6546+
dpsMultiplier = averageActiveTraps * maxWaves
6547+
if breakdown then
6548+
breakdown.SkillDPSMultiplier = {}
6549+
t_insert(breakdown.SkillDPSMultiplier, "DPS multiplier")
6550+
t_insert(breakdown.SkillDPSMultiplier, "^8= ^7average active traps^8 * ^7maximum waves")
6551+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%.2f^8 * ^7%d", averageActiveTraps, maxWaves))
6552+
t_insert(breakdown.SkillDPSMultiplier, s_format("^8= ^7%.3f", dpsMultiplier))
6553+
end
6554+
end
6555+
if dpsMultiplier ~= 1 then
6556+
skillData.dpsMultiplier = (skillData.dpsMultiplier or 1) * dpsMultiplier
6557+
output.SkillDPSMultiplier = (output.SkillDPSMultiplier or 1) * dpsMultiplier
6558+
end
6559+
end,
6560+
statMap = {
6561+
["base_skill_show_average_damage_instead_of_dps"] = {},
6562+
["lightning_tower_trap_base_interval_duration_ms"] = {
6563+
skill("repeatInterval", nil),
6564+
div = 1000,
6565+
},
6566+
["lightning_tower_trap_number_of_beams"] = {
6567+
mod("MaximumWaves", "BASE", nil),
6568+
},
6569+
},
64256570
baseFlags = {
64266571
spell = true,
64276572
trap = true,
@@ -6430,6 +6575,9 @@ skills["LightningTowerTrap"] = {
64306575
},
64316576
baseMods = {
64326577
skill("radius", 24),
6578+
skill("radiusLabel", "Targeting Area:"),
6579+
skill("radiusSecondary", 10),
6580+
skill("radiusSecondaryLabel", "Impact Area:"),
64336581
},
64346582
qualityStats = {
64356583
Default = {

0 commit comments

Comments
 (0)