Skip to content

Commit debbbae

Browse files
author
LocalIdentity
committed
Fix Curse rounding on enemies
It appears that curses round to the nearest value instead of rounding down like other mods
1 parent b1aa8ad commit debbbae

3 files changed

Lines changed: 24 additions & 10 deletions

File tree

spec/System/TestSkills_spec.lua

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,17 @@ describe("TestSkills", function()
9494
assert.True(build.calcsTab.mainOutput.SpiritReservedPercent > oneCurseReservation)
9595
end)
9696

97+
it("rounds Blasphemy curse magnitudes to the nearest integer", function()
98+
build.configTab.input.customMods = "79% increased Curse Magnitudes"
99+
build.configTab.input.enemyIsBoss = "None"
100+
build.configTab:BuildModList()
101+
build.skillsTab:PasteSocketGroup("Blasphemy 10/0 1\nDespair 12/0 1\n")
102+
103+
runCallback("OnFrame")
104+
105+
assert.are.equals(-42, build.calcsTab.mainEnv.enemyDB:Sum("BASE", nil, "ChaosResist"))
106+
end)
107+
97108
it("applies active skill reservation multiplier to linked buff spirit reservation", function()
98109
build.skillsTab:PasteSocketGroup("Purity of Fire 20/0 1\nVitality II 1/0 1\n")
99110
runCallback("OnFrame")

src/Classes/ModStore.lua

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ local function getActor(self, actorType)
4242
end
4343
end
4444

45-
function ModStoreClass:ScaleAddMod(mod, scale)
45+
-- roundToNearest is reserved for effects that the game rounds instead of truncates.
46+
function ModStoreClass:ScaleAddMod(mod, scale, roundToNearest)
4647
local unscalable = false
4748
for _, effects in ipairs(mod) do
4849
if effects.unscalable then
@@ -71,6 +72,8 @@ function ModStoreClass:ScaleAddMod(mod, scale)
7172
if precision then
7273
local power = 10 ^ precision
7374
subMod.value = m_floor(subMod.value * scale * power) / power
75+
elseif roundToNearest then
76+
subMod.value = roundSymmetric(subMod.value * scale)
7477
else
7578
subMod.value = m_modf(round(subMod.value * scale, 2))
7679
end
@@ -85,12 +88,12 @@ function ModStoreClass:CopyList(modList)
8588
end
8689
end
8790

88-
function ModStoreClass:ScaleAddList(modList, scale)
91+
function ModStoreClass:ScaleAddList(modList, scale, roundToNearest)
8992
if scale == 1 then
9093
self:AddList(modList)
9194
else
9295
for i = 1, #modList do
93-
self:ScaleAddMod(modList[i], scale)
96+
self:ScaleAddMod(modList[i], scale, roundToNearest)
9497
end
9598
end
9699
end

src/Modules/CalcPerform.lua

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2414,23 +2414,23 @@ function calcs.perform(env, skipEHP)
24142414
end
24152415
if buff.type == "Curse" then
24162416
curse.modList = new("ModList")
2417-
curse.modList:ScaleAddList(buff.modList, mult)
2417+
curse.modList:ScaleAddList(buff.modList, mult, true)
24182418
if partyTabEnableExportBuffs then
24192419
buffExports["Curse"][buff.name] = { isMark = curse.isMark, effectMult = curse.isMark and mult or (1 + inc / 100) * moreMark, modList = buff.modList }
24202420
end
24212421
else
24222422
-- Curse applies a buff; scale by curse effect, then buff effect
24232423
local temp = new("ModList")
2424-
temp:ScaleAddList(buff.modList, mult)
2424+
temp:ScaleAddList(buff.modList, mult, true)
24252425
curse.buffModList = new("ModList")
24262426
local buffInc = modDB:Sum("INC", skillCfg, "BuffEffectOnSelf")
24272427
local buffMore = modDB:More(skillCfg, "BuffEffectOnSelf")
2428-
curse.buffModList:ScaleAddList(temp, (1 + buffInc / 100) * buffMore)
2428+
curse.buffModList:ScaleAddList(temp, (1 + buffInc / 100) * buffMore, true)
24292429
if env.minion then
24302430
curse.minionBuffModList = new("ModList")
24312431
local buffInc = env.minion.modDB:Sum("INC", nil, "BuffEffectOnSelf")
24322432
local buffMore = env.minion.modDB:More(nil, "BuffEffectOnSelf")
2433-
curse.minionBuffModList:ScaleAddList(temp, (1 + buffInc / 100) * buffMore)
2433+
curse.minionBuffModList:ScaleAddList(temp, (1 + buffInc / 100) * buffMore, true)
24342434
end
24352435
end
24362436
t_insert(curses, curse)
@@ -2894,7 +2894,7 @@ function calcs.perform(env, skipEHP)
28942894
local cfg = { skillName = grantedEffect.name }
28952895
local inc = modDB:Sum("INC", cfg, "CurseEffectOnSelf") + gemModList:Sum("INC", nil, "CurseEffectAgainstPlayer")
28962896
local more = modDB:More(cfg, "CurseEffectOnSelf") * gemModList:More(nil, "CurseEffectAgainstPlayer")
2897-
modDB:ScaleAddList(curseModList, m_max((1 + inc / 100) * more, 0))
2897+
modDB:ScaleAddList(curseModList, m_max((1 + inc / 100) * more, 0), true)
28982898
end
28992899
elseif not enemyDB:Flag(nil, "Hexproof") or modDB:Flag(nil, "CursesIgnoreHexproof") then
29002900
local curse = {
@@ -2903,7 +2903,7 @@ function calcs.perform(env, skipEHP)
29032903
priority = determineCursePriority(grantedEffect.name),
29042904
}
29052905
curse.modList = new("ModList")
2906-
curse.modList:ScaleAddList(curseModList, (1 + enemyDB:Sum("INC", nil, "CurseEffectOnSelf") / 100) * enemyDB:More(nil, "CurseEffectOnSelf"))
2906+
curse.modList:ScaleAddList(curseModList, (1 + enemyDB:Sum("INC", nil, "CurseEffectOnSelf") / 100) * enemyDB:More(nil, "CurseEffectOnSelf"), true)
29072907
t_insert(dest, curse)
29082908
end
29092909
end
@@ -2928,7 +2928,7 @@ function calcs.perform(env, skipEHP)
29282928
else
29292929
mult = mult * enemyDB:More(nil, "CurseEffectOnSelf")
29302930
end
2931-
newCurse.modList:ScaleAddList(curse.modList, mult)
2931+
newCurse.modList:ScaleAddList(curse.modList, mult, true)
29322932
t_insert(allyCurses, newCurse)
29332933
end
29342934

0 commit comments

Comments
 (0)