diff --git a/src/Data/Skills/sup_int.lua b/src/Data/Skills/sup_int.lua index 6a19a4178e..41459f7d2b 100644 --- a/src/Data/Skills/sup_int.lua +++ b/src/Data/Skills/sup_int.lua @@ -3813,8 +3813,23 @@ skills["SupportExpandPlayer"] = { label = "Expand", incrementalEffectiveness = 0.054999999701977, statDescriptionScope = "gem_stat_descriptions", + statMap = { + ["support_expand_max_seals"] = { + mod("SealCount", "BASE", nil), + }, + ["skill_area_of_effect_+%_per_expand_seal"] = { + mod("SealRepeatPenalty", "MORE", nil), + }, + ["expand_support_seal_gain_frequency_as_%_of_total_cast_time"] = { + mod("SealGainFrequency", "BASE", nil), + }, + }, baseFlags = { }, + baseMods = { + flag("HasSeals"), + flag("AreaSeal"), + }, constantStats = { { "support_expand_max_seals", 3 }, { "support_expand_charge_gain_interval_ms", 0 }, @@ -7593,6 +7608,7 @@ skills["SupportUnleashPlayer"] = { }, baseMods = { flag("HasSeals"), + flag("DamageSeal"), }, constantStats = { { "support_spell_rapid_fire_repeat_use_damage_+%_final", -50 }, @@ -8076,6 +8092,7 @@ skills["SupportZarokhsRevoltPlayer"] = { }, baseMods = { flag("HasSeals"), + flag("DamageSeal"), }, constantStats = { { "support_spell_rapid_fire_repeat_use_damage_+%_final", -20 }, diff --git a/src/Export/Skills/sup_int.txt b/src/Export/Skills/sup_int.txt index 20a550af88..36c3ec254e 100644 --- a/src/Export/Skills/sup_int.txt +++ b/src/Export/Skills/sup_int.txt @@ -664,6 +664,19 @@ statMap = { #skill SupportExpandPlayer #set SupportExpandPlayer +statMap = { + ["support_expand_max_seals"] = { + mod("SealCount", "BASE", nil), + }, + ["skill_area_of_effect_+%_per_expand_seal"] = { + mod("SealRepeatPenalty", "MORE", nil), + }, + ["expand_support_seal_gain_frequency_as_%_of_total_cast_time"] = { + mod("SealGainFrequency", "BASE", nil), + }, +}, +#baseMod flag("HasSeals") +#baseMod flag("AreaSeal") #mods #skillEnd @@ -1444,6 +1457,7 @@ statMap = { #skill SupportUnleashPlayer #set SupportUnleashPlayer #baseMod flag("HasSeals") +#baseMod flag("DamageSeal") #mods #skillEnd @@ -1526,6 +1540,7 @@ statMap = { #skill SupportZarokhsRevoltPlayer #set SupportZarokhsRevoltPlayer #baseMod flag("HasSeals") +#baseMod flag("DamageSeal") #mods #skillEnd diff --git a/src/Modules/CalcOffence.lua b/src/Modules/CalcOffence.lua index ba05f20257..e81769bbc7 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -401,6 +401,13 @@ function calcs.offence(env, actor, activeSkill) -- Calculate armour break output.ArmourBreakPerHit = calcLib.val(skillModList, "ArmourBreakPerHit", skillCfg) + local function getSkillNameFromFlag(skillModList, flag) + local sourceMod = skillModList:Tabulate("FLAG", nil, flag) + local sourceName = sourceMod[1] and sourceMod[1].mod and sourceMod[1].mod.source -- e.g. Skill:SupportExpandPlayer + local dataSkill = env.data.skills[(sourceName:gsub("Skill:", ""))] + return dataSkill and dataSkill.name + end + local function calcAreaOfEffect(skillModList, skillCfg, skillData, skillFlags, output, breakdown) local incArea, moreArea = calcLib.mods(skillModList, skillCfg, "AreaOfEffect", "AreaOfEffectPrimary") output.AreaOfEffectMod = round(round(incArea * moreArea, 10), 2) @@ -1114,24 +1121,37 @@ function calcs.offence(env, actor, activeSkill) modDB:NewMod("DPS", "MORE", detonateTwice, "Grenade Activate Twice") end - if skillModList:Flag(nil, "HasSeals") and activeSkill.skillTypes[SkillType.Unleashable] and not skillModList:Flag(nil, "NoRepeatBonuses") then - -- Applies DPS multiplier based on seals count + if skillModList:Flag(nil, "HasSeals") and not skillModList:Flag(nil, "NoRepeatBonuses") then + -- Applies seal bonuses based on seal count local totalCastSpeed = 1 / activeSkill.activeEffect.grantedEffect.castTime * calcLib.mod(skillModList, skillCfg, "Speed") output.SealCooldown = activeSkill.activeEffect.grantedEffect.castTime * skillModList:Sum("BASE", skillCfg, "SealGainFrequency") / calcLib.mod(skillModList, skillCfg, "SealGainFrequency") / 100 output.SealMax = skillModList:Sum("BASE", skillCfg, "SealCount") - output.AverageBurstHits = output.SealMax output.TimeMaxSeals = output.SealCooldown * output.SealMax - if not skillData.hitTimeOverride then + if skillModList:Flag(nil, "DamageSeal") then + output.AverageBurstHits = output.SealMax + end + if skillModList:Flag(nil, "DamageSeal") and not skillData.hitTimeOverride then + local skillName = getSkillNameFromFlag(skillModList, "DamageSeal") or "Support" if skillModList:Flag(nil, "UseMaxUnleash") then for i, value in ipairs(skillModList:Tabulate("INC", { }, "MaxSealCrit")) do local mod = value.mod skillModList:NewMod("CritChance", "INC", mod.value, mod.source, mod.flags, mod.keywordFlags, unpack(mod)) end - env.player.mainSkill.skillModList:NewMod("DPS", "MORE", (output.SealMax * calcLib.mod(skillModList, skillCfg, "SealRepeatPenalty")) * 100, "Unleash") + env.player.mainSkill.skillModList:NewMod("DPS", "MORE", (output.SealMax * calcLib.mod(skillModList, skillCfg, "SealRepeatPenalty")) * 100, skillName) + env.player.mainSkill.skillData.hitTimeOverride = m_max(output.TimeMaxSeals, totalCastSpeed * 1.1) + else + env.player.mainSkill.skillModList:NewMod("DPS", "MORE", round(1 / output.SealCooldown / (totalCastSpeed * 1.1) * calcLib.mod(skillModList, skillCfg, "SealRepeatPenalty") * 100, 2), skillName) + end + end + if skillModList:Flag(nil, "AreaSeal") then + local skillName = getSkillNameFromFlag(skillModList, "AreaSeal") or "Support" + local sealArea = (calcLib.mod(skillModList, skillCfg, "SealRepeatPenalty") - 1) * 100 + if skillModList:Flag(nil, "UseMaxUnleash") then + env.player.mainSkill.skillModList:NewMod("AreaOfEffect", "INC", output.SealMax * sealArea, skillName) env.player.mainSkill.skillData.hitTimeOverride = m_max(output.TimeMaxSeals, totalCastSpeed * 1.1) else - env.player.mainSkill.skillModList:NewMod("DPS", "MORE", round(1 / output.SealCooldown / (totalCastSpeed * 1.1) * calcLib.mod(skillModList, skillCfg, "SealRepeatPenalty") * 100, 2), "Unleash") + env.player.mainSkill.skillModList:NewMod("AreaOfEffect", "INC", round(1 / output.SealCooldown / totalCastSpeed * sealArea, 2), skillName) end end @@ -4119,7 +4139,7 @@ function calcs.offence(env, actor, activeSkill) end output.AverageDamage = output.AverageHit * output.HitChance / 100 globalOutput.AverageBurstHits = output.AverageBurstHits or 1 - local repeatPenalty = skillModList:Flag(nil, "HasSeals") and activeSkill.skillTypes[SkillType.Unleashable] and not skillModList:Flag(nil, "NoRepeatBonuses") and calcLib.mod(skillModList, skillCfg, "SealRepeatPenalty") or 1 + local repeatPenalty = skillModList:Flag(nil, "HasSeals") and skillModList:Flag(nil, "DamageSeal") and not skillModList:Flag(nil, "NoRepeatBonuses") and calcLib.mod(skillModList, skillCfg, "SealRepeatPenalty") or 1 globalOutput.AverageBurstDamage = output.AverageDamage + output.AverageDamage * (globalOutput.AverageBurstHits - 1) * repeatPenalty or 0 globalOutput.ShowBurst = globalOutput.AverageBurstHits > 1 output.TotalDPS = output.AverageDamage * (globalOutput.HitSpeed or globalOutput.Speed) * skillData.dpsMultiplier * quantityMultiplier @@ -5693,7 +5713,7 @@ function calcs.offence(env, actor, activeSkill) elseif skillFlags.totem then useSpeed = (output.Cooldown and output.Cooldown > 0 and (output.TotemPlacementSpeed > 0 and output.TotemPlacementSpeed or 1 / output.Cooldown) or output.TotemPlacementSpeed) / repeats timeType = "totem placement" - elseif skillModList:Flag(nil, "HasSeals") and skillModList:Flag(nil, "UseMaxUnleash") then + elseif skillModList:Flag(nil, "HasSeals") and skillModList:Flag(nil, "DamageSeal") and skillModList:Flag(nil, "UseMaxUnleash") then useSpeed = env.player.mainSkill.skillData.hitTimeOverride / repeats timeType = "full unleash" elseif output.EffectiveReloadTime then -- Crossbows: Account for mana cost only happening on reload (once all bolts are fired) diff --git a/src/Modules/CalcTriggers.lua b/src/Modules/CalcTriggers.lua index 35fab416f8..d861968b9e 100644 --- a/src/Modules/CalcTriggers.lua +++ b/src/Modules/CalcTriggers.lua @@ -439,7 +439,7 @@ local function defaultTriggerHandler(env, config) actor.mainSkill.skillData.ignoresTickRate = actor.mainSkill.skillData.ignoresTickRate or (actor.mainSkill.skillData.storedUses and actor.mainSkill.skillData.storedUses > 1) --Account for source unleash - if source and GlobalCache.cachedData[env.mode][uuid] and source.skillModList:Flag(nil, "HasSeals") and source.skillTypes[SkillType.Unleashable] then + if source and GlobalCache.cachedData[env.mode][uuid] and source.skillModList:Flag(nil, "HasSeals") and source.skillModList:Flag(nil, "DamageSeal") then local unleashDpsMult = GlobalCache.cachedData[env.mode][uuid].ActiveSkill.skillData.dpsMultiplier or 1 trigRate = trigRate * unleashDpsMult actor.mainSkill.skillFlags.HasSeals = true diff --git a/src/Modules/ConfigOptions.lua b/src/Modules/ConfigOptions.lua index 7562821662..6464e516dc 100644 --- a/src/Modules/ConfigOptions.lua +++ b/src/Modules/ConfigOptions.lua @@ -824,7 +824,7 @@ Huge sets the radius to 11. { var = "overrideGhostShrouds", type = "count", label = "# of Ghost Shrouds (if not maximum):", ifOption = "useGhostShrouds", apply = function(val, modList, enemyModList) modList:NewMod("GhostShrouds", "OVERRIDE", val, "Config", { type = "Condition", var = "Combat" }) end }, - { var = "waitForMaxSeals", type = "check", label = "Do you wait for Max Unleash Seals?", ifFlag = "HasSeals", apply = function(val, modList, enemyModList) + { var = "waitForMaxSeals", type = "check", label = "Do you wait for Max Seals?", ifFlag = "HasSeals", apply = function(val, modList, enemyModList) modList:NewMod("UseMaxUnleash", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) end }, { var = "repeatMode", type = "list", label = "Repeat Mode:", ifCond = "alwaysFinalRepeat", list = {