From 57a483834a84c128575b3de8d5dd86f80d7c0197 Mon Sep 17 00:00:00 2001 From: LocalIdentity <31035929+LocalIdentity@users.noreply.github.com> Date: Thu, 13 Aug 2026 12:21:59 +1000 Subject: [PATCH] Fix precision of Critical Strike Chance value The game stores crit chance values down to 0.01% but PoB was saving them to 0.001% which technically would be incorrect when using lucky or other extra crit roll chance mods --- spec/System/TestBifurcatedCrit_spec.lua | 10 +++++++++- src/Modules/CalcOffence.lua | 3 ++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/spec/System/TestBifurcatedCrit_spec.lua b/spec/System/TestBifurcatedCrit_spec.lua index 3a7593d49b1..4cea45abf15 100644 --- a/spec/System/TestBifurcatedCrit_spec.lua +++ b/spec/System/TestBifurcatedCrit_spec.lua @@ -1,5 +1,5 @@ describe("Bifurcated critical strikes", function() - local function setupBifurcate(socketGroup, bifurcate, lucky, extremeLuck, useDefaultCritMultiplier) + local function setupBifurcate(socketGroup, bifurcate, lucky, extremeLuck, useDefaultCritMultiplier, extraMods) newBuild() build.itemsTab:CreateDisplayItemFromRaw([[ New Item @@ -15,6 +15,7 @@ describe("Bifurcated critical strikes", function() runCallback("OnFrame") build.configTab.input.customMods = "+44% to critical hit chance\n" + .. (extraMods or "") .. (bifurcate and "spell critical strike chance bifurcates\n" or "") .. (lucky and "your critical strike chance is lucky\n" or "") .. (extremeLuck and "your lucky or unlucky effects use the best or worst from three rolls instead of two\n" or "") @@ -25,6 +26,13 @@ describe("Bifurcated critical strikes", function() return build.calcsTab.mainOutput end + it("uses quantised raw chance for each roll", function() + local luckyOutput = setupBifurcate("Spark 1/0 1", false, true, false, false, + "+0.01% to critical hit chance\n1% increased critical strike chance\n") + assert.are.equals(50.51, luckyOutput.PreEffectiveCritChance) + assert.are.near((1 - (1 - 0.5051) ^ 2) * 100, luckyOutput.CritChance, 10 ^ -9) + end) + it("calculates bifurcated critical hit damage", function() local normalOutput = setupBifurcate("Spark 1/0 1") assert.are.equals(50, normalOutput.CritChance) diff --git a/src/Modules/CalcOffence.lua b/src/Modules/CalcOffence.lua index 3fd3f028e3a..883316a72d3 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -3017,7 +3017,8 @@ function calcs.offence(env, actor, activeSkill) inc = skillModList:Sum("INC", cfg, "CritChance") + (env.mode_effective and enemyDB:Sum("INC", nil, "SelfCritChance") or 0) more = skillModList:More(cfg, "CritChance") end - output.CritChance = (baseCrit + base) * (1 + inc / 100) * more + -- The game uses an integer permyriad chance for each critical strike roll. + output.CritChance = round((baseCrit + base) * (1 + inc / 100) * more * 100) / 100 local preCapCritChance = output.CritChance output.CritChance = m_min(output.CritChance, skillModList:Override(nil, "CritChanceCap") or skillModList:Sum("BASE", cfg, "CritChanceCap")) if (baseCrit + base) > 0 then