Skip to content

Commit bca7116

Browse files
LocalIdentityLocalIdentity
andauthored
Fix Curse rounding on enemies (#2289)
It appears that curses round to the nearest value instead of rounding down like other mods Co-authored-by: LocalIdentity <localidentity2@gmail.com>
1 parent 30c1ba5 commit bca7116

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)