From e30962f82fa86b7c8bb14c48afaf34f8d602b63e Mon Sep 17 00:00:00 2001 From: n8n-gitea Date: Wed, 10 Jun 2026 12:55:26 +0200 Subject: [PATCH] fix: add Critical Chance display to Stats tab Combat Stats section --- docs/circular-deps.txt | 2 +- docs/dependency-graph.json | 6 +++-- src/components/game/tabs/StatsTab.tsx | 2 ++ .../game/tabs/StatsTab/CombatStatsSection.tsx | 10 +++++++-- src/lib/game/hooks/useGameDerived.ts | 22 +++++++++++++++++++ 5 files changed, 37 insertions(+), 5 deletions(-) diff --git a/docs/circular-deps.txt b/docs/circular-deps.txt index 9f7f735..c8c72f6 100644 --- a/docs/circular-deps.txt +++ b/docs/circular-deps.txt @@ -1,5 +1,5 @@ # Circular Dependencies -Generated: 2026-06-10T09:41:41.471Z +Generated: 2026-06-10T10:48:36.554Z Found: 3 circular chain(s) — these MUST be fixed before modifying involved files. 1. 1) stores/golem-combat-actions.ts > stores/golem-combat-helpers.ts diff --git a/docs/dependency-graph.json b/docs/dependency-graph.json index 1539071..8dc8c85 100644 --- a/docs/dependency-graph.json +++ b/docs/dependency-graph.json @@ -1,6 +1,6 @@ { "_meta": { - "generated": "2026-06-10T09:41:39.446Z", + "generated": "2026-06-10T10:48:33.838Z", "description": "Import dependency graph for src/lib/game. Keys are files, values are arrays of files they import.", "usage": "To find what a file affects, search for its path in the VALUES. To find what a file depends on, look at its KEY entry." }, @@ -556,8 +556,10 @@ "utils/index.ts" ], "stores/combat-damage.ts": [ + "data/enchantment-effects.ts", "stores/combat-state.types.ts", - "types.ts" + "types.ts", + "utils/index.ts" ], "stores/combat-descent-actions.ts": [ "data/guardian-encounters.ts", diff --git a/src/components/game/tabs/StatsTab.tsx b/src/components/game/tabs/StatsTab.tsx index 5186527..cd6a192 100644 --- a/src/components/game/tabs/StatsTab.tsx +++ b/src/components/game/tabs/StatsTab.tsx @@ -37,6 +37,8 @@ export function StatsTab() { @@ -38,9 +40,13 @@ export function CombatStatsSection({ activeSpellDef, pactMultiplier }: CombatSta
+
+ Critical Chance: + {fmtDec(critChance * 100, 1)}% +
Critical Multiplier: - 1.5x + {fmtDec(critDamage, 2)}x
diff --git a/src/lib/game/hooks/useGameDerived.ts b/src/lib/game/hooks/useGameDerived.ts index 7e8157a..5d53bc3 100644 --- a/src/lib/game/hooks/useGameDerived.ts +++ b/src/lib/game/hooks/useGameDerived.ts @@ -17,7 +17,9 @@ import { getFloorElement, calcDamage, getElementalBonus, + getBoonBonuses, } from '../utils'; +import { computeEquipmentEffects } from '../effects'; import { computePactMultiplier, computePactInsightMultiplier } from '../utils/pact-utils'; import { ELEMENTS, SPELLS_DEF, getStudySpeedMultiplier, getStudyCostMultiplier, HOURS_PER_TICK, TICK_MS } from '../constants'; @@ -120,6 +122,8 @@ export function useCombatStats() { const currentFloor = useCombatStore((s) => s.currentFloor); const activeSpell = useCombatStore((s) => s.activeSpell); const { upgradeEffects } = useManaStats(); + const equipmentInstances = useGameStore((s) => s.crafting.equipmentInstances); + const equippedInstances = useGameStore((s) => s.crafting.equippedInstances); const floorElem = useMemo( () => getFloorElement(currentFloor), @@ -209,6 +213,22 @@ export function useCombatStats() { }; }, [activeSpellDef, signedPacts, activeSpell, floorElem, isGuardianFloor, pactMultiplier]); + // Crit chance: sum equipment bonus (decimal) + pact boon bonus (percentage points) + upgrade bonus (decimal) + const critChance = useMemo(() => { + const equipEffects = computeEquipmentEffects(equipmentInstances, equippedInstances); + const equipCritBonus = equipEffects.bonuses.critChance || 0; + const boons = getBoonBonuses(signedPacts); + const boonCritChance = boons.critChance / 100; // Convert percentage points to decimal + const upgradeCritBonus = upgradeEffects.critChanceBonus || 0; + return equipCritBonus + boonCritChance + upgradeCritBonus; + }, [equipmentInstances, equippedInstances, signedPacts, upgradeEffects.critChanceBonus]); + + // Crit damage: base multiplier (1.5) + pact boon bonus (percentage points) + const critDamage = useMemo(() => { + const boons = getBoonBonuses(signedPacts); + return (upgradeEffects.critDamageMultiplier || 1.5) + boons.critDamage / 100; + }, [signedPacts, upgradeEffects.critDamageMultiplier]); + return { floorElem, floorElemDef, @@ -219,6 +239,8 @@ export function useCombatStats() { pactInsightMultiplier, dps, damageBreakdown, + critChance, + critDamage, }; }