Skip to content

Commit 1533dab

Browse files
author
LocalIdentity
committed
Merge branch 'dev' into fix_bifurcated
2 parents 7efe171 + 4d0dd16 commit 1533dab

4 files changed

Lines changed: 87 additions & 12 deletions

File tree

spec/System/TestAttacks_spec.lua

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,70 @@ describe("TestAttacks", function()
167167
assert.are.equals(1.1, build.calcsTab.mainOutput.MainHand.AverageHit)
168168
end)
169169

170+
it("matches in-game tooltip DPS for low-level spear skills", function()
171+
build.spec:SelectClass(build.spec.tree.classNameMap.Huntress)
172+
build.characterLevel = 11
173+
build.characterLevelAutoMode = false
174+
build.controls.characterLevel:SetText(11)
175+
build.configTab.input.customMods = [[
176+
10% increased Attack Damage
177+
+10000 to Accuracy Rating
178+
nearby enemies have 100% less armour
179+
nearby enemies have 100% less evasion
180+
]]
181+
build.configTab:BuildModList()
182+
build.itemsTab:CreateDisplayItemFromRaw([[
183+
Apocalypse Edge
184+
Ironhead Spear
185+
Item Level: 7
186+
Quality: 0
187+
LevelReq: 5
188+
Implicits: 1
189+
Grants Skill: Spear Throw
190+
Adds 2 to 4 Physical Damage
191+
]])
192+
build.itemsTab:AddDisplayItem()
193+
194+
local skills = {
195+
{ gemId = "Metadata/Items/Gems/SkillGemPlayerDefaultSpear", level = 4, dps = 32.8 },
196+
{ gemId = "Metadata/Items/Gems/SkillGemWhirlingSlash", level = 1, dps = 11.8 },
197+
{ gemId = "Metadata/Items/Gems/SkillGemPlayerDefaultSpearThrow", level = 4, dps = 28.8 },
198+
{ gemId = "Metadata/Items/Gems/SkillGemTwister", level = 2, dps = 17.5 },
199+
}
200+
for _, skill in ipairs(skills) do
201+
local group = {
202+
enabled = true,
203+
gemList = { {
204+
gemId = skill.gemId,
205+
level = skill.level,
206+
quality = 0,
207+
enabled = true,
208+
count = 1,
209+
enableGlobal1 = true,
210+
enableGlobal2 = true,
211+
} },
212+
}
213+
table.insert(build.skillsTab.socketGroupList, group)
214+
build.skillsTab:ProcessSocketGroup(group)
215+
skill.groupIndex = #build.skillsTab.socketGroupList
216+
end
217+
218+
for _, skill in ipairs(skills) do
219+
local group = build.skillsTab.socketGroupList[skill.groupIndex]
220+
build.mainSocketGroup = skill.groupIndex
221+
build.calcsTab.input.skill_number = skill.groupIndex
222+
group.mainActiveSkill = 1
223+
group.mainActiveSkillCalcs = 1
224+
build.buildFlag = true
225+
build.modFlag = true
226+
runCallback("OnFrame")
227+
build.calcsTab:BuildOutput()
228+
runCallback("OnFrame")
229+
230+
assert.are.equals(skill.dps, round(build.calcsTab.mainOutput.TotalDPS, 1))
231+
end
232+
end)
233+
170234
it("correctly calculates Garukhan's Resolve bifurcated critical hit damage", function()
171235
local function setup(socketGroup)
172236
newBuild()
@@ -210,7 +274,6 @@ describe("TestAttacks", function()
210274
assert.is_true(math.abs(10001 - garukhanOutput.AverageHit) < 0.01)
211275
end)
212276

213-
214277
it("correctly adds damage with oracle forced outcome", function()
215278
-- Setup: Add weapon with no crit chance, and strip enemy defenses
216279
build.itemsTab:CreateDisplayItemFromRaw([[

spec/System/TestSkills_spec.lua

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -354,15 +354,27 @@ describe("TestSkills", function()
354354
assert.True(baseLeapSlamHit < build.calcsTab.mainOutput.AverageDamage)
355355
end)
356356

357-
it("applies minion offensive multiplier to all attack damage", function()
357+
it("applies generated minion offensive multiplier to attack damage", function()
358358
build.skillsTab:PasteSocketGroup("Wolf Pack 20/0 1")
359359
runCallback("OnFrame")
360360

361361
local minion = build.calcsTab.mainEnv.minion
362-
local expectedPhysicalMax = round(build.calcsTab.mainEnv.data.monsterAllyDamageTable[minion.level] * (1 + minion.minionData.damageSpread))
362+
local expectedPhysicalMax = floor(floor(build.calcsTab.mainEnv.data.monsterAllyDamageTable[minion.level]) * minion.minionData.damage * (1 + minion.minionData.damageSpread))
363363

364364
assert.are.equals(expectedPhysicalMax, minion.weaponData1.PhysicalMax)
365-
assert.are.near(-30, minion.mainSkill.skillModList:Sum("MORE", minion.mainSkill.skillCfg, "Damage"), 0.0001)
365+
assert.are.near(-30, minion.mainSkill.skillModList:Sum("MORE", minion.mainSkill.skillCfg, "AddedDamage"), 0.0001)
366+
assert.are.equals(0, minion.mainSkill.skillModList:Sum("MORE", minion.mainSkill.skillCfg, "Damage"))
367+
end)
368+
369+
it("does not apply minion offensive multiplier to spectre or companion added damage", function()
370+
for _, skill in ipairs({ "Spectre: Lightless Abomination 20/0 1", "Companion: Lightless Abomination 20/0 1" }) do
371+
newBuild()
372+
build.skillsTab:PasteSocketGroup(skill)
373+
runCallback("OnFrame")
374+
375+
local minion = build.calcsTab.mainEnv.minion
376+
assert.are.equals(0, minion.mainSkill.skillModList:Sum("MORE", minion.mainSkill.skillCfg, "AddedDamage"))
377+
end
366378
end)
367379

368380
it("Inspiring Ally only mirrors companion damage, not generic minion damage", function()

src/Modules/CalcActiveSkill.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,7 @@ function calcs.buildActiveSkillModList(env, activeSkill)
660660
skillModList:NewMod("Damage", "MORE", -100 * activeSkill.actor.minionData.damageFixup, "Damage Fixup", ModFlag.Attack)
661661
skillModList:NewMod("Speed", "MORE", 100 * activeSkill.actor.minionData.damageFixup, "Damage Fixup", ModFlag.Attack)
662662
elseif activeSkill.actor.minionData.damage ~= 1 then
663-
skillModList:NewMod("Damage", "MORE", (activeSkill.actor.minionData.damage - 1) * 100, activeSkill.actor.minionData.name .." Damage Multiplier", ModFlag.Attack)
663+
skillModList:NewMod("AddedDamage", "MORE", (activeSkill.actor.minionData.damage - 1) * 100, activeSkill.actor.minionData.name .." Damage Multiplier", ModFlag.Attack, { type = "SkillName", skillNameList = { "Spectre", "Companion" }, partialMatch = true, summonSkill = true, neg = true })
664664
end
665665
end
666666
if skillModList:Flag(activeSkill.skillCfg, "DisableSkill") and not skillModList:Flag(activeSkill.skillCfg, "EnableSkill") then
@@ -905,7 +905,7 @@ function calcs.buildActiveSkillModList(env, activeSkill)
905905
local attackTime = minion.minionData.attackTime
906906
local damageTable = (monsterDamage or minion.minionData.hostile) and env.data.monsterDamageTable or env.data.monsterAllyDamageTable
907907
minion.hiddenDamageFixup = monsterDamage and (round(env.data.monsterAllyDamageTable[minion.level] / damageTable[minion.level] * data.misc.SpectreBeastDamageFixup, 2) - 1) or 0
908-
local damage = damageTable[minion.level]
908+
local damage = floor(damageTable[minion.level]) * minion.minionData.damage
909909
if not minion.minionData.baseDamageIgnoresAttackSpeed then -- minions with this flag do not factor attack time into their base damage
910910
damage = damage * attackTime
911911
end
@@ -934,8 +934,8 @@ function calcs.buildActiveSkillModList(env, activeSkill)
934934
type = minion.minionData.weaponType1 or "None",
935935
AttackRate = 1 / attackTime,
936936
CritChance = minion.minionData.critChance,
937-
PhysicalMin = round(damage * (1 - minion.minionData.damageSpread)),
938-
PhysicalMax = round(damage * (1 + minion.minionData.damageSpread)),
937+
PhysicalMin = floor(damage * (1 - minion.minionData.damageSpread)),
938+
PhysicalMax = floor(damage * (1 + minion.minionData.damageSpread)),
939939
range = minion.minionData.attackRange,
940940
}
941941
end

src/Modules/CalcOffence.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ local function calcGainedDamage(activeSkill, output, cfg, damageType)
9292

9393
local gainedMin, gainedMax = 0, 0
9494
for _, otherType in ipairs(dmgTypeList) do
95-
local baseMin = m_floor(output[otherType.."MinBase"] * activeSkill.conversionTable[otherType].mult)
96-
local baseMax = m_floor(output[otherType.."MaxBase"] * activeSkill.conversionTable[otherType].mult)
95+
local baseMin = output[otherType.."MinBase"] * activeSkill.conversionTable[otherType].mult
96+
local baseMax = output[otherType.."MaxBase"] * activeSkill.conversionTable[otherType].mult
9797
local gainMult = gainTable[otherType][damageType]
9898
if gainMult and gainMult > 0 then
9999
-- Damage is being converted/gained from the other damage type
@@ -3957,8 +3957,8 @@ function calcs.offence(env, actor, activeSkill)
39573957
local baseMax = output[damageTypeMax.."Base"]
39583958
local summedMin = baseMin * convMult + convertedMin + gainedMin
39593959
local summedMax = baseMax * convMult + convertedMax + gainedMax
3960-
output[damageType.."SummedMinBase"] = round(summedMin)
3961-
output[damageType.."SummedMaxBase"] = round(summedMax)
3960+
output[damageType.."SummedMinBase"] = summedMin
3961+
output[damageType.."SummedMaxBase"] = summedMax
39623962
if breakdown then
39633963
if (baseMin ~= 0 or baseMax ~= 0) then
39643964
if convMult ~= 1 then

0 commit comments

Comments
 (0)