From cb6cd33df6aee55c2efe4bae9ee3f0ad9f9ccf92 Mon Sep 17 00:00:00 2001 From: synderis Date: Wed, 3 Sep 2025 23:36:21 -0400 Subject: [PATCH 1/2] added proper clamping for tbow --- src/lib/PlayerVsNPCCalc.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/lib/PlayerVsNPCCalc.ts b/src/lib/PlayerVsNPCCalc.ts index adcedf971..9dddde549 100644 --- a/src/lib/PlayerVsNPCCalc.ts +++ b/src/lib/PlayerVsNPCCalc.ts @@ -2154,14 +2154,17 @@ export default class PlayerVsNPCCalc extends BaseCalc { } private static tbowScaling = (current: number, magic: number, accuracyMode: boolean): number => { - const factor = accuracyMode ? 10 : 14; - const base = accuracyMode ? 140 : 250; - - const t2 = Math.trunc((3 * magic - factor) / 100); - const t3 = Math.trunc((Math.trunc(3 * magic / 10) - (10 * factor)) ** 2 / 100); - - const bonus = base + t2 - t3; - return Math.trunc(current * bonus / 100); + const factor = accuracyMode ? 10.0 : 14.0; + const base = accuracyMode ? 140.0 : 250.0; + const clamp = accuracyMode ? 1.4 : 2.5; + const denom = accuracyMode ? 1.0 : 10.0; + + // Floating point t2 and t3, matching the Rust formula + const t2 = ((10.0 * 3.0 * magic) / denom - factor) / 100.0; + const t3 = (((3.0 * magic) / 10.0 - 10.0 * factor) ** 2) / 100.0; + let tbowMult = (base + t2 - t3) / 100.0; + tbowMult = Math.max(1.0, Math.min(clamp, tbowMult)); + return Math.floor(current * tbowMult); }; getSpecCost(): number | undefined { From c6459a32dd5a138bcd8889d3474d276067ca13be Mon Sep 17 00:00:00 2001 From: synderis Date: Wed, 3 Sep 2025 23:58:31 -0400 Subject: [PATCH 2/2] realized i could just add the clamp after the fact --- src/lib/PlayerVsNPCCalc.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/lib/PlayerVsNPCCalc.ts b/src/lib/PlayerVsNPCCalc.ts index 9dddde549..bddfb2e61 100644 --- a/src/lib/PlayerVsNPCCalc.ts +++ b/src/lib/PlayerVsNPCCalc.ts @@ -2154,17 +2154,14 @@ export default class PlayerVsNPCCalc extends BaseCalc { } private static tbowScaling = (current: number, magic: number, accuracyMode: boolean): number => { - const factor = accuracyMode ? 10.0 : 14.0; - const base = accuracyMode ? 140.0 : 250.0; - const clamp = accuracyMode ? 1.4 : 2.5; - const denom = accuracyMode ? 1.0 : 10.0; - - // Floating point t2 and t3, matching the Rust formula - const t2 = ((10.0 * 3.0 * magic) / denom - factor) / 100.0; - const t3 = (((3.0 * magic) / 10.0 - 10.0 * factor) ** 2) / 100.0; - let tbowMult = (base + t2 - t3) / 100.0; - tbowMult = Math.max(1.0, Math.min(clamp, tbowMult)); - return Math.floor(current * tbowMult); + const factor = accuracyMode ? 10 : 14; + const base = accuracyMode ? 140 : 250; + const clamp = accuracyMode ? 140 : 250; + + const t2 = Math.trunc((3 * magic - factor) / 100); + const t3 = Math.trunc((Math.trunc(3 * magic / 10) - (10 * factor)) ** 2 / 100); + const bonus = Math.max(0, Math.min(clamp, base + t2 - t3)); + return Math.trunc(current * bonus / 100); }; getSpecCost(): number | undefined {