Skip to content

Commit 445ade0

Browse files
vaisestLocalIdentity
andauthored
Support flicker strike -related mod lines, and various support gems (#1947)
* Add support for % more critical hit chance on skills * Add support for flicker strike burst calc * Add flicker dps display, 285% more AS, and heightened charges * Support hit and run skill speed * Support uul-netol armour break by enabling config field * Fix blazing critical * Add support for mark effect % supports * Support elemental conflux * Add test and support one with the storm * Satisfy cspell * Add heightened charges scalar to charged staff and falling thunder * Only show elemental conflux config when it exists * Fix formatting * Simplify handling of + removeable power charge mod Now just adds to the RemovablePowerCharge multiplier * Fix more formatting * Refine logic for One with the Storm * Add default index to list --------- Co-authored-by: LocalIdentity <localidentity2@gmail.com>
1 parent f469b23 commit 445ade0

12 files changed

Lines changed: 178 additions & 12 deletions

File tree

spec/System/TestSkills_spec.lua

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,74 @@ describe("TestSkills", function()
391391
assert.are.equals(3, arcSkill.skillModList:Sum("BASE", arcSkill.skillCfg, "GemSupportLevel"))
392392
end)
393393

394+
it("Test Elemental Conflux element selection", function()
395+
build.skillsTab:PasteSocketGroup("Arc 20/0 1")
396+
build.skillsTab:PasteSocketGroup("Elemental Conflux 20/0 1")
397+
build.configTab.input.elementalConfluxElement = 2 -- Lightning
398+
build.configTab:BuildModList()
399+
runCallback("OnFrame")
400+
local lightningDPS = build.calcsTab.mainOutput.TotalDPS
401+
402+
-- Cold element should not boost a lightning skill
403+
build.configTab.input.elementalConfluxElement = 3 -- Cold
404+
build.configTab:BuildModList()
405+
runCallback("OnFrame")
406+
local coldSelectedDPS = build.calcsTab.mainOutput.TotalDPS
407+
408+
assert.True(lightningDPS > coldSelectedDPS)
409+
410+
-- Average should give an intermediate boost (1/3 per element)
411+
build.configTab.input.elementalConfluxElement = 1 -- Average
412+
build.configTab:BuildModList()
413+
runCallback("OnFrame")
414+
local avgDPS = build.calcsTab.mainOutput.TotalDPS
415+
416+
assert.True(avgDPS > coldSelectedDPS)
417+
assert.True(avgDPS < lightningDPS)
418+
end)
419+
420+
it("Test flicker strike scales with power charges", function()
421+
build.skillsTab:PasteSocketGroup("Flicker Strike 20/0 1")
422+
build.itemsTab:CreateDisplayItemFromRaw([[
423+
New Item
424+
Sinister Quarterstaff
425+
Quality: 0
426+
]])
427+
build.itemsTab:AddDisplayItem()
428+
429+
runCallback("OnFrame")
430+
431+
local avgNoCharges = build.calcsTab.mainOutput.AverageDamage
432+
local avgBurstNoCharges = build.calcsTab.mainOutput.AverageBurstDamage
433+
434+
-- Burst isn't calculated with no charges
435+
assert.truthy(avgNoCharges)
436+
assert.True(avgBurstNoCharges == avgNoCharges)
437+
438+
build.configTab.input.usePowerCharges = true
439+
build.configTab.input.overridePowerCharges = 2
440+
build.configTab:BuildModList()
441+
442+
runCallback("OnFrame")
443+
-- Burst should be higher due to having multiple strikes, while average
444+
-- is only slightly higher due to power charges
445+
local avgCharges = build.calcsTab.mainOutput.AverageDamage
446+
local avgBurstCharges = build.calcsTab.mainOutput.AverageBurstDamage
447+
448+
assert.True(avgNoCharges == avgCharges)
449+
assert.True(avgCharges < avgBurstCharges)
450+
-- Strikes 2 times per charge
451+
assert.True(avgNoCharges * 4 <= avgBurstCharges)
452+
assert.True(avgBurstCharges <= avgNoCharges * 6)
453+
454+
455+
-- One with the Storm strikes 2 additional times
456+
build.configTab.input.customMods = "quarterstaff skills that consume power charges count as consuming an additional power charge"
457+
build.configTab:BuildModList()
458+
runCallback("OnFrame")
459+
assert.True(avgNoCharges * 6 <= build.calcsTab.mainOutput.AverageBurstDamage)
460+
end)
461+
394462
it("Test Barrage only repeats Barrageable skills", function()
395463
build.itemsTab:CreateDisplayItemFromRaw([[
396464
New Item

src/Data/ModCache.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5872,7 +5872,7 @@ c["Projectiles have 50% chance for an additional Projectile when Forking 25% inc
58725872
c["Projectiles have 6% chance to Chain an additional time from terrain"]={{[1]={flags=1024,keywordFlags=0,name="TerrainChainChance",type="BASE",value=6}},nil}
58735873
c["Projectiles have 64% increased Critical Hit chance for each time they have Pierced"]={{[1]={flags=1024,keywordFlags=0,name="CritChance",type="INC",value=64}}," for each time they have Pierced "}
58745874
c["Projectiles have 75% chance for an additional Projectile when Forking"]={{[1]={flags=1024,keywordFlags=0,name="ProjectileCount",type="BASE",value=75}}," for an additional when Forking "}
5875-
c["Quarterstaff Skills that consume Power Charges count as consuming an additional Power Charge"]={nil,"Quarterstaff Skills that consume Power Charges count as consuming an additional Power Charge "}
5875+
c["Quarterstaff Skills that consume Power Charges count as consuming an additional Power Charge"]={{[1]={[1]={skillType=160,type="SkillType"},flags=0,keywordFlags=0,name="Multiplier:ExtraConsumablePowerCharges",type="BASE",value=1}},nil}
58765876
c["Recoup 5% of damage taken by your Totems as Life"]={nil,"Recoup 5% of damage taken by your Totems as Life "}
58775877
c["Recoup 5% of damage taken by your Totems as Life Each Totem applies 2% increased Damage taken to Enemies in their Presence"]={nil,"Recoup 5% of damage taken by your Totems as Life Each Totem applies 2% increased Damage taken to Enemies in their Presence "}
58785878
c["Recoup Effects instead occur over 4 seconds"]={{[1]={flags=0,keywordFlags=0,name="4SecondRecoup",type="FLAG",value=true}},nil}

src/Data/SkillStatMap.lua

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,9 @@ return {
655655
["critical_strike_chance_+%"] = {
656656
mod("CritChance", "INC", nil),
657657
},
658+
["active_skill_critical_strike_chance_+%_final"] = {
659+
mod("CritChance", "MORE", nil)
660+
},
658661
["spell_critical_strike_chance_+%"] = {
659662
mod("CritChance", "INC", nil, ModFlag.Spell),
660663
},
@@ -2593,6 +2596,9 @@ return {
25932596
["mark_skills_curse_effect_+%"] = {
25942597
mod("CurseEffect", "INC", nil, 0, 0, { type = "SkillType", skillType = SkillType.Mark }),
25952598
},
2599+
["mark_effect_+%"] = {
2600+
mod("CurseEffect", "INC", nil, 0, 0, { type = "SkillType", skillType = SkillType.Mark }),
2601+
},
25962602
["curse_area_of_effect_+%"] = {
25972603
mod("AreaOfEffect", "INC", nil, 0, KeywordFlag.Curse),
25982604
},
@@ -2786,6 +2792,9 @@ return {
27862792
["armour_break_physical_damage_%_dealt_as_armour_break"] = {
27872793
flag("Condition:CanArmourBreak", { type = "GlobalEffect", effectType = "Buff", effectName = "ArmourBreak" }),
27882794
},
2795+
["chaos_damage_%_dealt_as_armour_break"] = {
2796+
flag("Condition:CanArmourBreak", { type = "GlobalEffect", effectType = "Buff", effectName = "ArmourBreak" }),
2797+
},
27892798
--
27902799
-- Spectre or Minion-specific stats
27912800
--

src/Data/Skills/act_int.lua

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3217,13 +3217,13 @@ skills["ChargedStaffPlayer"] = {
32173217
statDescriptionScope = "charged_staff",
32183218
statMap = {
32193219
["charged_staff_attack_minimum_added_lightning_damage_per_stack"] = {
3220-
mod("LightningMin", "BASE", nil, 0, 0, { type = "Multiplier", var = "RemovablePowerCharge" }, { type = "GlobalEffect", effectType = "Buff", effectName = "Charged Staff", effectCond = "UsePowerCharges" }),
3220+
mod("LightningMin", "BASE", nil, 0, 0, { type = "Multiplier", var = "RemovablePowerCharge", scalar = "ConsumedPowerChargeEffect" }, { type = "GlobalEffect", effectType = "Buff", effectName = "Charged Staff", effectCond = "UsePowerCharges" }),
32213221
},
32223222
["charged_staff_attack_maximum_added_lightning_damage_per_stack"] = {
3223-
mod("LightningMax", "BASE", nil, 0, 0, { type = "Multiplier", var = "RemovablePowerCharge" }, { type = "GlobalEffect", effectType = "Buff", effectName = "Charged Staff", effectCond = "UsePowerCharges" }),
3223+
mod("LightningMax", "BASE", nil, 0, 0, { type = "Multiplier", var = "RemovablePowerCharge", scalar = "ConsumedPowerChargeEffect" }, { type = "GlobalEffect", effectType = "Buff", effectName = "Charged Staff", effectCond = "UsePowerCharges" }),
32243224
},
32253225
["charged_staff_buff_duration_per_stack_ms"] = {
3226-
mod("ChargedStaffBuffDuration", "BASE", nil, 0, 0, { type = "Multiplier", var = "RemovablePowerCharge" }, { type = "GlobalEffect", effectType = "Buff", effectName = "Charged Staff", effectCond = "UsePowerCharges" }),
3226+
mod("ChargedStaffBuffDuration", "BASE", nil, 0, 0, { type = "Multiplier", var = "RemovablePowerCharge", scalar = "ConsumedPowerChargeEffect" }, { type = "GlobalEffect", effectType = "Buff", effectName = "Charged Staff", effectCond = "UsePowerCharges" }),
32273227
},
32283228
},
32293229
baseFlags = {
@@ -5395,6 +5395,13 @@ skills["ElementalConfluxPlayer"] = {
53955395
label = "Elemental Conflux",
53965396
incrementalEffectiveness = 0.054999999701977,
53975397
statDescriptionScope = "elemental_conflux",
5398+
statMap = {
5399+
["skill_elemental_conflux_active_element_damage_+%_final"] = {
5400+
mod("LightningDamage", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Elemental Conflux" }, { type = "Multiplier", var = "ElementalConfluxLightningEffect", invert = true }),
5401+
mod("ColdDamage", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Elemental Conflux" }, { type = "Multiplier", var = "ElementalConfluxColdEffect", invert = true }),
5402+
mod("FireDamage", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Elemental Conflux" }, { type = "Multiplier", var = "ElementalConfluxFireEffect", invert = true }),
5403+
},
5404+
},
53985405
baseFlags = {
53995406
duration = true,
54005407
},
@@ -6907,7 +6914,7 @@ skills["FallingThunderPlayer"] = {
69076914
statDescriptionScope = "falling_thunder",
69086915
statMap = {
69096916
["lightning_strike_damage_+%_final_per_power_charge"] = {
6910-
mod("Damage", "MORE", nil, ModFlag.Projectile, 0, { type = "Multiplier", var = "RemovablePowerCharge" }),
6917+
mod("Damage", "MORE", nil, ModFlag.Projectile, 0, { type = "Multiplier", var = "RemovablePowerCharge", scalar = "ConsumedPowerChargeEffect" }),
69116918
},
69126919
["lightning_strike_damage_+%_final_when_charged"] = {
69136920
mod("Damage", "MORE", nil, ModFlag.Projectile, 0, { type = "MultiplierThreshold", var = "RemovablePowerCharge", threshold = 1 }),
@@ -8464,17 +8471,35 @@ skills["FlickerStrikePlayer"] = {
84648471
[39] = { PvPDamageMultiplier = -30, attackSpeedMultiplier = -50, baseMultiplier = 13.44, levelRequirement = 90, cost = { Mana = 312, }, },
84658472
[40] = { PvPDamageMultiplier = -30, attackSpeedMultiplier = -50, baseMultiplier = 14.48, levelRequirement = 90, cost = { Mana = 332, }, },
84668473
},
8474+
preDamageFunc = function(activeSkill, output, breakdown)
8475+
local strikesPerCharge = activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "AdditionalFlickersPerPowerCharge")
8476+
activeSkill.skillData.averageBurstHits = 1 + strikesPerCharge
8477+
end,
84678478
statSets = {
84688479
[1] = {
84698480
label = "Flicker Strike",
84708481
baseEffectiveness = 0,
84718482
incrementalEffectiveness = 0.092720001935959,
84728483
statDescriptionScope = "skill_stat_descriptions",
8484+
statMap = {
8485+
["flicker_strike_additional_flickers_from_power_charges"] = {
8486+
mod("AdditionalFlickersPerPowerCharge", "BASE", nil, 0, 0, { type = "Multiplier", var = "RemovablePowerCharge", scalar = "ConsumedPowerChargeEffect" }),
8487+
},
8488+
["cannot_gain_power_charges_during_skill"] = {
8489+
-- Display Only
8490+
},
8491+
["base_skill_show_average_damage_instead_of_dps"] = {
8492+
-- Override
8493+
},
8494+
},
84738495
baseFlags = {
84748496
attack = true,
84758497
melee = true,
84768498
area = true,
84778499
},
8500+
baseMods = {
8501+
mod("Speed", "MORE", 285, ModFlag.Attack),
8502+
},
84788503
constantStats = {
84798504
{ "flicker_strike_additional_flickers_from_power_charges", 2 },
84808505
},

src/Data/Skills/sup_dex.lua

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2513,6 +2513,11 @@ skills["SupportHitAndRunPlayer"] = {
25132513
label = "Hit and Run",
25142514
incrementalEffectiveness = 0.054999999701977,
25152515
statDescriptionScope = "gem_stat_descriptions",
2516+
statMap = {
2517+
["support_mobile_assault_skill_speed_+%_final"] = {
2518+
mod("Speed", "MORE", nil),
2519+
},
2520+
},
25162521
baseFlags = {
25172522
},
25182523
constantStats = {

src/Data/Skills/sup_int.lua

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,10 @@ skills["SupportBlazingCriticalPlayer"] = {
916916
statDescriptionScope = "gem_stat_descriptions",
917917
statMap = {
918918
["support_blazing_crits_gain_%_fire_damage_with_attacks_on_critical_hit"] = {
919-
mod("DamageAsFire", "BASE", ModFlag.Attack, 0, 0, { type = "Condition", var = "CriticalStrike" }),
919+
mod("DamageGainAsFire", "BASE", nil, ModFlag.Attack, 0, { type = "Condition", var = "CritRecently" }),
920+
},
921+
["support_blazing_crits_base_duration_ms"] = {
922+
-- Display only
920923
},
921924
},
922925
baseFlags = {

src/Export/Skills/act_int.txt

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -234,13 +234,13 @@ statMap = {
234234
#set ChargedStaffPlayer
235235
statMap = {
236236
["charged_staff_attack_minimum_added_lightning_damage_per_stack"] = {
237-
mod("LightningMin", "BASE", nil, 0, 0, { type = "Multiplier", var = "RemovablePowerCharge" }, { type = "GlobalEffect", effectType = "Buff", effectName = "Charged Staff", effectCond = "UsePowerCharges" }),
237+
mod("LightningMin", "BASE", nil, 0, 0, { type = "Multiplier", var = "RemovablePowerCharge", scalar = "ConsumedPowerChargeEffect" }, { type = "GlobalEffect", effectType = "Buff", effectName = "Charged Staff", effectCond = "UsePowerCharges" }),
238238
},
239239
["charged_staff_attack_maximum_added_lightning_damage_per_stack"] = {
240-
mod("LightningMax", "BASE", nil, 0, 0, { type = "Multiplier", var = "RemovablePowerCharge" }, { type = "GlobalEffect", effectType = "Buff", effectName = "Charged Staff", effectCond = "UsePowerCharges" }),
240+
mod("LightningMax", "BASE", nil, 0, 0, { type = "Multiplier", var = "RemovablePowerCharge", scalar = "ConsumedPowerChargeEffect" }, { type = "GlobalEffect", effectType = "Buff", effectName = "Charged Staff", effectCond = "UsePowerCharges" }),
241241
},
242242
["charged_staff_buff_duration_per_stack_ms"] = {
243-
mod("ChargedStaffBuffDuration", "BASE", nil, 0, 0, { type = "Multiplier", var = "RemovablePowerCharge" }, { type = "GlobalEffect", effectType = "Buff", effectName = "Charged Staff", effectCond = "UsePowerCharges" }),
243+
mod("ChargedStaffBuffDuration", "BASE", nil, 0, 0, { type = "Multiplier", var = "RemovablePowerCharge", scalar = "ConsumedPowerChargeEffect" }, { type = "GlobalEffect", effectType = "Buff", effectName = "Charged Staff", effectCond = "UsePowerCharges" }),
244244
},
245245
},
246246
#flags attack area duration
@@ -382,6 +382,13 @@ statMap = {
382382
#skill ElementalConfluxPlayer
383383
#set ElementalConfluxPlayer
384384
#flags duration
385+
statMap = {
386+
["skill_elemental_conflux_active_element_damage_+%_final"] = {
387+
mod("LightningDamage", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Elemental Conflux" }, { type = "Multiplier", var = "ElementalConfluxLightningEffect", invert = true }),
388+
mod("ColdDamage", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Elemental Conflux" }, { type = "Multiplier", var = "ElementalConfluxColdEffect", invert = true }),
389+
mod("FireDamage", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Elemental Conflux" }, { type = "Multiplier", var = "ElementalConfluxFireEffect", invert = true }),
390+
},
391+
},
385392
#mods
386393
#skillEnd
387394

@@ -470,7 +477,7 @@ statMap = {
470477
#flags attack projectile
471478
statMap = {
472479
["lightning_strike_damage_+%_final_per_power_charge"] = {
473-
mod("Damage", "MORE", nil, ModFlag.Projectile, 0, { type = "Multiplier", var = "RemovablePowerCharge" }),
480+
mod("Damage", "MORE", nil, ModFlag.Projectile, 0, { type = "Multiplier", var = "RemovablePowerCharge", scalar = "ConsumedPowerChargeEffect" }),
474481
},
475482
["lightning_strike_damage_+%_final_when_charged"] = {
476483
mod("Damage", "MORE", nil, ModFlag.Projectile, 0, { type = "MultiplierThreshold", var = "RemovablePowerCharge", threshold = 1 }),
@@ -602,8 +609,24 @@ statMap = {
602609
#skillEnd
603610

604611
#skill FlickerStrikePlayer
612+
preDamageFunc = function(activeSkill, output, breakdown)
613+
local strikesPerCharge = activeSkill.skillModList:Sum("BASE", activeSkill.skillCfg, "AdditionalFlickersPerPowerCharge")
614+
activeSkill.skillData.averageBurstHits = 1 + strikesPerCharge
615+
end,
605616
#set FlickerStrikePlayer
606617
#flags attack melee area
618+
statMap = {
619+
["flicker_strike_additional_flickers_from_power_charges"] = {
620+
mod("AdditionalFlickersPerPowerCharge", "BASE", nil, 0, 0, { type = "Multiplier", var = "RemovablePowerCharge", scalar = "ConsumedPowerChargeEffect" }),
621+
},
622+
["cannot_gain_power_charges_during_skill"] = {
623+
-- Display Only
624+
},
625+
["base_skill_show_average_damage_instead_of_dps"] = {
626+
-- Override
627+
},
628+
},
629+
#baseMod mod("Speed", "MORE", 285, ModFlag.Attack)
607630
#mods
608631
#skillEnd
609632

src/Export/Skills/sup_dex.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,11 @@ statMap = {
561561

562562
#skill SupportHitAndRunPlayer
563563
#set SupportHitAndRunPlayer
564+
statMap = {
565+
["support_mobile_assault_skill_speed_+%_final"] = {
566+
mod("Speed", "MORE", nil),
567+
},
568+
},
564569
#mods
565570
#skillEnd
566571

src/Export/Skills/sup_int.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,10 @@ statMap = {
167167
#set SupportBlazingCriticalPlayer
168168
statMap = {
169169
["support_blazing_crits_gain_%_fire_damage_with_attacks_on_critical_hit"] = {
170-
mod("DamageAsFire", "BASE", ModFlag.Attack, 0, 0, { type = "Condition", var = "CriticalStrike" }),
170+
mod("DamageGainAsFire", "BASE", nil, ModFlag.Attack, 0, { type = "Condition", var = "CritRecently" }),
171+
},
172+
["support_blazing_crits_base_duration_ms"] = {
173+
-- Display only
171174
},
172175
},
173176
#mods

src/Modules/CalcPerform.lua

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -828,7 +828,9 @@ local function doActorCharges(env, actor)
828828
else
829829
output.PowerCharges = m_max(output.PowerCharges, m_min(output.PowerChargesMax, output.PowerChargesMin))
830830
end
831-
output.RemovablePowerCharges = m_max(output.PowerCharges - output.PowerChargesMin, 0)
831+
local removablePowerCharges = m_max(output.PowerCharges - output.PowerChargesMin, 0)
832+
local extraConsumablePowerCharges = removablePowerCharges > 0 and modDB:Sum("BASE", actor.mainSkill.skillCfg, "Multiplier:ExtraConsumablePowerCharges") or 0
833+
output.RemovablePowerCharges = removablePowerCharges + extraConsumablePowerCharges
832834
if modDB:Flag(nil, "Condition:UseFrenzyCharges") then
833835
output.FrenzyCharges = modDB:Override(nil, "FrenzyCharges") or output.FrenzyChargesMax
834836
end

0 commit comments

Comments
 (0)