diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index c402e70842..2189799f13 100755 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -8539,7 +8539,7 @@ c["Exposure you inflict applies an extra -6% to the affected Resistance"]={{[1]= c["Exposure you inflict applies at least -18% to the affected Resistance"]={{[1]={flags=0,keywordFlags=0,name="ExposureMin",type="OVERRIDE",value=-18}},nil} c["Extra gore"]={{},nil} c["Far Shot"]={{[1]={flags=0,keywordFlags=0,name="FarShot",type="FLAG",value=true}},nil} -c["Final Repeat of Attack Skills deals 60% more Damage"]={{[1]={flags=1,keywordFlags=0,name="RepeatFinalDamage",type="MORE",value=60}},nil} +c["Final Repeat of Attack Skills deals 60% more Damage"]={{[1]={flags=0,keywordFlags=65536,name="RepeatFinalDamage",type="MORE",value=60}},nil} c["Final Repeat of Spells has 40% increased Area of Effect"]={{[1]={[1]={neg=true,type="Condition",var="CastOnFrostbolt"},[2]={type="Condition",varList={[1]="averageRepeat",[2]="alwaysFinalRepeat"}},flags=2,keywordFlags=0,name="RepeatFinalAreaOfEffect",type="INC",value=40}},nil} c["Fire Exposure you inflict applies an extra -5% to Fire Resistance"]={{[1]={flags=0,keywordFlags=0,name="ExtraFireExposure",type="BASE",value=-5}},nil} c["Fire Resistance is 75%"]={{[1]={flags=0,keywordFlags=0,name="FireResist",type="OVERRIDE",value=75}},nil} @@ -10213,7 +10213,7 @@ c["Non-Damaging Elemental Ailments you inflict spread to nearby enemies within 2 c["Non-Damaging Elemental Ailments you inflict spread to nearby enemies within 2 metres Non-Damaging Elemental Ailments you inflict have 100% more Effect"]={nil,"Non-Damaging Elemental Ailments you inflict spread to nearby enemies within 2 metres Non-Damaging Elemental Ailments you inflict have 100% more Effect "} c["Non-Exerted Attacks deal no Damage"]={nil,"Non-Exerted Attacks deal no Damage "} c["Non-Instant Warcries ignore their Cooldown when Used"]={{[1]={[1]={neg=true,skillType=74,type="SkillType"},flags=0,keywordFlags=4,name="CooldownRecovery",type="OVERRIDE",value=0}},nil} -c["Non-Travel Attack Skills Repeat an additional Time"]={{[1]={[1]={type="Condition",varList={[1]="averageRepeat",[2]="alwaysFinalRepeat"}},flags=1,keywordFlags=0,name="RepeatCount",type="BASE",value=1}},nil} +c["Non-Travel Attack Skills Repeat an additional Time"]={{[1]={[1]={neg=true,skillType=90,type="SkillType"},[2]={type="Condition",varList={[1]="averageRepeat",[2]="alwaysFinalRepeat"}},flags=0,keywordFlags=65536,name="RepeatCount",type="BASE",value=1}},nil} c["Non-Unique Jewels cause Small and Notable Passive Skills in a Large Radius to"]={nil,"Non-Unique Jewels cause Small and Notable Passive Skills in a Large Radius to "} c["Non-Unique Utility Flasks you Use apply to Linked Targets"]={{[1]={flags=0,keywordFlags=0,name="ExtraLinkEffect",type="LIST",value={mod={[1]={effectType="Global",type="GlobalEffect",unscalable=true},flags=0,keywordFlags=0,name="ParentNonUniqueFlasksAppliedToYou",type="FLAG",value=true}}}},nil} c["Non-Vaal Strike Skills target 1 additional nearby Enemy"]={{[1]={[1]={skillType=25,type="SkillType"},[2]={neg=true,skillType=42,type="SkillType"},flags=0,keywordFlags=0,name="AdditionalStrikeTarget",type="BASE",value=1}},nil} diff --git a/src/Data/SkillStatMap.lua b/src/Data/SkillStatMap.lua index 33a8b2ffb1..decd9d44f0 100644 --- a/src/Data/SkillStatMap.lua +++ b/src/Data/SkillStatMap.lua @@ -295,6 +295,9 @@ return { ["skill_repeat_count"] = { mod("RepeatCount", "BASE", nil, 0, 0, { type = "SkillType", skillType = SkillType.Multicastable }), }, +["disable_skill_repeats"] = { + flag("CannotRepeat"), +}, ["display_skill_minions_level_is_corpse_level"] = { skill("minionLevelIsEnemyLevel", true), }, diff --git a/src/Modules/CalcOffence.lua b/src/Modules/CalcOffence.lua index d0b33ec6b5..08ee962aac 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -759,7 +759,17 @@ function calcs.offence(env, actor, activeSkill) -- Applies DPS multiplier based on projectile count skillData.dpsMultiplier = skillModList:Sum("BASE", skillCfg, "ProjectileCount") end - output.Repeats = 1 + (skillModList:Sum("BASE", skillCfg, "RepeatCount") or 0) + + local function repeatSkillTypesCheck(activeSkillTypes) + local excludeSkillTypes = { SkillType.Instant, SkillType.Channel, SkillType.Triggered, SkillType.Retaliation, SkillType.NonRepeatable } + for _, type in ipairs(excludeSkillTypes) do + if activeSkillTypes[type] then + return false + end + end + return not skillModList:Flag(nil, "CannotRepeat") and ((activeSkillTypes[SkillType.Attack] or activeSkillTypes[SkillType.Spell])) + end + output.Repeats = 1 + (repeatSkillTypesCheck(activeSkill.skillTypes) and skillModList:Sum("BASE", skillCfg, "RepeatCount") or 0) if output.Repeats > 1 then output.RepeatCount = output.Repeats -- handle all the multipliers from Repeats @@ -842,6 +852,9 @@ function calcs.offence(env, actor, activeSkill) skillModList:NewMod("Damage", "MORE", (100 * output.Repeats + DamageFinalMoreValueTotal) / (1 + DamageFinalMoreValueTotal / 100) - 100, value.mod.source, value.mod.flags, value.mod.keywordFlags, unpack(value.mod)) end end + if skillFlags.trap or skillFlags.mine then + skillModList:NewMod("DPS", "MORE", (output.Repeats - 1) * 100, "Repeat Count") + end end end if skillModList:Flag(nil, "WeaponPhysAppliesToSpells") then @@ -5618,7 +5631,7 @@ function calcs.offence(env, actor, activeSkill) if skillFlags.trap or skillFlags.mine then local preSpeed = output.TrapThrowingSpeed or output.MineLayingSpeed local cooldown = output.TrapCooldown or output.Cooldown - useSpeed = (cooldown and cooldown > 0 and 1 / cooldown or preSpeed) / repeats + useSpeed = (cooldown and cooldown > 0 and 1 / cooldown or preSpeed) timeType = skillFlags.trap and "trap throwing" or "mine laying" 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 diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index 12de5a66c5..be92d7516a 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -2399,9 +2399,6 @@ local specialModList = { -- Exerted Attacks ["exerted attacks deal (%d+)%% increased damage"] = function(num) return { mod("ExertIncrease", "INC", num, nil, ModFlag.Attack, 0) } end, ["exerted attacks have (%d+)%% chance to deal double damage"] = function(num) return { mod("ExertDoubleDamageChance", "BASE", num, nil, ModFlag.Attack, 0) } end, - -- Duelist (Fatal flourish) - ["final repeat of attack skills deals (%d+)%% more damage"] = function(num) return { mod("RepeatFinalDamage", "MORE", num, nil, ModFlag.Attack, 0) } end, - ["non%-travel attack skills repeat an additional time"] = { mod("RepeatCount", "BASE", 1, nil, ModFlag.Attack, 0, { type = "Condition", varList = {"averageRepeat", "alwaysFinalRepeat"} }) }, -- Ascendant ["grants (%d+) passive skill points?"] = function(num) return { mod("ExtraPoints", "BASE", num) } end, ["can allocate passives from the %a+'s starting point"] = { }, @@ -5498,6 +5495,8 @@ local specialModList = { ["attacks you use yourself repeat an additional time"] = { mod("RepeatCount", "BASE", 1, nil, ModFlag.Attack, 0, { type = "SkillType", neg = true, skillTypeList = { SkillType.SummonsTotem, SkillType.RemoteMined, SkillType.Trapped, SkillType.Triggered } }, { type = "Condition", neg = true, var = "usedByMirage" }, { type = "Condition", varList = { "averageRepeat", "alwaysFinalRepeat" } }), }, + ["final repeat of attack skills deals (%d+)%% more damage"] = function(num) return { mod("RepeatFinalDamage", "MORE", num, nil, 0, KeywordFlag.Attack) } end, + ["non%-travel attack skills repeat an additional time"] = { mod("RepeatCount", "BASE", 1, nil, 0, KeywordFlag.Attack, { type = "SkillType", skillType = SkillType.Travel, neg = true }, { type = "Condition", varList = { "averageRepeat", "alwaysFinalRepeat" } }) }, ["viper strike and pestilent strike deal (%d+)%% increased attack damage per frenzy charge"] = function(num) return { mod("Damage", "INC", num, nil, ModFlag.Attack, { type = "Multiplier", var = "FrenzyCharge" }, { type = "SkillName", skillNameList = { "Viper Strike", "Pestilent Strike" }, includeTransfigured = true }) } end, ["shield charge and chain hook have (%d+)%% increased attack speed per (%d+) rampage kills"] = function(inc, _, num) return { mod("Speed", "INC", inc, nil, ModFlag.Attack, { type = "Multiplier", var = "Rampage", div = num, limit = 1000 / num, limitTotal = true }, { type = "SkillName", skillNameList = { "Shield Charge", "Chain Hook" }, includeTransfigured = true }) } end, ["tectonic slam and infernal blow deal (%d+)%% increased attack damage per (%d+) armour"] = function(inc, _, num) return { mod("Damage", "INC", inc, nil, ModFlag.Attack, { type = "PerStat", stat = "Armour", div = num }, { type = "SkillName", skillNameList = { "Tectonic Slam", "Infernal Blow" }, includeTransfigured = true }) } end,