diff --git a/docs/circular-deps.txt b/docs/circular-deps.txt index bef01ce..6f04272 100644 --- a/docs/circular-deps.txt +++ b/docs/circular-deps.txt @@ -1,8 +1,8 @@ # Circular Dependencies -Generated: 2026-05-25T18:18:45.184Z +Generated: 2026-05-25T18:44:15.053Z Found: 6 circular chain(s) — these MUST be fixed before modifying involved files. -1. Processed 135 files (1.6s) (2 warnings) +1. Processed 135 files (1.7s) (2 warnings) 2. 1) utils/floor-utils.ts > utils/room-utils.ts > utils/enemy-utils.ts 3. 2) utils/floor-utils.ts > utils/room-utils.ts 4. 3) stores/gameStore.ts > stores/gameActions.ts diff --git a/docs/dependency-graph.json b/docs/dependency-graph.json index ba6af3b..5a8bc97 100644 --- a/docs/dependency-graph.json +++ b/docs/dependency-graph.json @@ -1,6 +1,6 @@ { "_meta": { - "generated": "2026-05-25T18:18:43.369Z", + "generated": "2026-05-25T18:44:13.132Z", "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." }, diff --git a/scorecard.png b/scorecard.png index afa39e9..e9377de 100644 Binary files a/scorecard.png and b/scorecard.png differ diff --git a/src/app/components/GrimoireTab.tsx b/src/app/components/GrimoireTab.tsx index c309390..2565439 100644 --- a/src/app/components/GrimoireTab.tsx +++ b/src/app/components/GrimoireTab.tsx @@ -9,7 +9,7 @@ import type { SpellDef } from '@/lib/game/types'; export function GrimoireTab() { const [grimoireSpells, setGrimoireSpells] = useState<[string, SpellDef][]>([]); - const [loaded, setLoaded] = useState(false); + const [loaded, _setLoaded] = useState(false); useEffect(() => { if (typeof window !== 'undefined' && SPELLS_DEF) { diff --git a/src/components/game/crafting/EnchantmentApplier.tsx b/src/components/game/crafting/EnchantmentApplier.tsx index 4d38af3..fd9388a 100644 --- a/src/components/game/crafting/EnchantmentApplier.tsx +++ b/src/components/game/crafting/EnchantmentApplier.tsx @@ -109,7 +109,7 @@ export function EnchantmentApplier({
- {equippedItems.map(({ slot, instance }) => ( + {equippedItems.map(({ slot: _slot, instance }) => (
{ const selected = selectedEffects.find(e => e.effectId === effect.id); - const cost = calculateEffectCapacityCost(effect.id, (selected?.stacks || 0) + 1, efficiencyBonus); + const _cost = calculateEffectCapacityCost(effect.id, (selected?.stacks || 0) + 1, efficiencyBonus); return (
= ({ definition, runtime, callbacks }) => { const { id, name, description, manaType, baseCost, perkThresholds, perkValues, perkTypes, - statBonus, statBonusLabel, baseValue, drainBase, difficultyFactor, scalingFactor, + statBonusLabel, baseValue, drainBase, difficultyFactor, scalingFactor, } = definition; const { xp, paused: isPaused, concurrentLimit, isLocked, missingPrereqs } = runtime; const { onToggle } = callbacks; diff --git a/src/components/game/tabs/PrestigeTab.test.ts b/src/components/game/tabs/PrestigeTab.test.ts index cd6483e..5d03c99 100644 --- a/src/components/game/tabs/PrestigeTab.test.ts +++ b/src/components/game/tabs/PrestigeTab.test.ts @@ -35,7 +35,7 @@ describe('Prestige upgrade definitions', () => { it('all upgrades have required fields', async () => { const { PRESTIGE_DEF } = await import('@/lib/game/constants/prestige'); - for (const [id, def] of Object.entries(PRESTIGE_DEF)) { + for (const [, def] of Object.entries(PRESTIGE_DEF)) { expect(def.name).toBeTruthy(); expect(def.desc).toBeTruthy(); expect(def.max).toBeGreaterThan(0); diff --git a/src/components/game/tabs/SpireCombatPage/RoomDisplay.tsx b/src/components/game/tabs/SpireCombatPage/RoomDisplay.tsx index 60128c8..104af78 100644 --- a/src/components/game/tabs/SpireCombatPage/RoomDisplay.tsx +++ b/src/components/game/tabs/SpireCombatPage/RoomDisplay.tsx @@ -71,7 +71,7 @@ function EnemyRow({ enemy }: { enemy: EnemyState }) { ); } -export function RoomDisplay({ floorState, floor }: RoomDisplayProps) { +export function RoomDisplay({ floorState, _floor }: RoomDisplayProps) { // Guard against null/undefined/stale floorState if (!floorState || !floorState.roomType) { return ( diff --git a/src/components/game/tabs/SpireCombatPage/SpireCombatPage.tsx b/src/components/game/tabs/SpireCombatPage/SpireCombatPage.tsx index 4a187d3..b66dd58 100644 --- a/src/components/game/tabs/SpireCombatPage/SpireCombatPage.tsx +++ b/src/components/game/tabs/SpireCombatPage/SpireCombatPage.tsx @@ -55,7 +55,6 @@ export function SpireCombatPage() { floorHP, floorMaxHP, castProgress, - clearedFloors, isDescending, currentRoom, activityLog, @@ -73,7 +72,6 @@ export function SpireCombatPage() { floorHP: s.floorHP, floorMaxHP: s.floorMaxHP, castProgress: s.castProgress, - clearedFloors: s.clearedFloors, isDescending: s.isDescending, currentRoom: s.currentRoom, activityLog: s.activityLog, diff --git a/src/components/game/tabs/SpireSummaryTab.tsx b/src/components/game/tabs/SpireSummaryTab.tsx index 666a330..fec86a4 100644 --- a/src/components/game/tabs/SpireSummaryTab.tsx +++ b/src/components/game/tabs/SpireSummaryTab.tsx @@ -314,12 +314,10 @@ export function SpireSummaryTab() { const [mounted, setMounted] = useState(false); const { - currentFloor, maxFloorReached, clearedFloors, enterSpireMode, } = useCombatStore(useShallow((s) => ({ - currentFloor: s.currentFloor, maxFloorReached: s.maxFloorReached, clearedFloors: s.clearedFloors, enterSpireMode: s.enterSpireMode, diff --git a/src/lib/game/__tests__/computed-stats.test.ts b/src/lib/game/__tests__/computed-stats.test.ts index fab825d..42675ec 100644 --- a/src/lib/game/__tests__/computed-stats.test.ts +++ b/src/lib/game/__tests__/computed-stats.test.ts @@ -83,10 +83,10 @@ describe('getFloorElement', () => { it('should cycle through elements based on floor number', () => { // Check that floors have different elements - const elem1 = getFloorElement(1); - const elem7 = getFloorElement(7); + const _elem1 = getFloorElement(1); + const _elem7 = getFloorElement(7); // Since it cycles every 5 floors, floor 1 and 7 might have same element - const elem2 = getFloorElement(2); + const _elem2 = getFloorElement(2); // Floor 1 and 2 should have different elements (if cycle allows) }); }); diff --git a/src/lib/game/__tests__/pact-utils.test.ts b/src/lib/game/__tests__/pact-utils.test.ts index fc76c53..350bd95 100644 --- a/src/lib/game/__tests__/pact-utils.test.ts +++ b/src/lib/game/__tests__/pact-utils.test.ts @@ -115,9 +115,9 @@ describe('computePactMultiplier', () => { }); it('should handle three pacts with penalty', () => { - const floor10 = getGuardianForFloor(10)!; - const floor20 = getGuardianForFloor(20)!; - const floor30 = getGuardianForFloor(30)!; + const _floor10 = getGuardianForFloor(10)!; + const _floor20 = getGuardianForFloor(20)!; + const _floor30 = getGuardianForFloor(30)!; // 3 pacts: numAdditional = 2, basePenalty = 1.0, effectivePenalty = 1.0 // result = baseMult * (1 - 1.0) = 0 @@ -225,9 +225,9 @@ describe('computePactInsightMultiplier', () => { }); it('should handle three pacts with full penalty', () => { - const floor10 = getGuardianForFloor(10)!; - const floor20 = getGuardianForFloor(20)!; - const floor30 = getGuardianForFloor(30)!; + const _floor10 = getGuardianForFloor(10)!; + const _floor20 = getGuardianForFloor(20)!; + const _floor30 = getGuardianForFloor(30)!; const result = computePactInsightMultiplier({ signedPacts: [10, 20, 30], diff --git a/src/lib/game/crafting-actions/crafting-equipment-actions.ts b/src/lib/game/crafting-actions/crafting-equipment-actions.ts index 99c95ec..c43fd0b 100644 --- a/src/lib/game/crafting-actions/crafting-equipment-actions.ts +++ b/src/lib/game/crafting-actions/crafting-equipment-actions.ts @@ -43,7 +43,7 @@ export function startCraftingEquipment( } export function cancelEquipmentCrafting( - get: () => CraftingState, + _get: () => CraftingState, set: (fn: (state: CraftingState) => Partial) => void ) { set((state) => { @@ -65,7 +65,7 @@ export function cancelEquipmentCrafting( export function deleteMaterial( materialId: string, amount: number, - get: () => CraftingState, + _get: () => CraftingState, set: (fn: (state: CraftingState) => Partial) => void ) { set((state) => { diff --git a/src/lib/game/crafting-equipment.ts b/src/lib/game/crafting-equipment.ts index 9e892ce..00a16b7 100644 --- a/src/lib/game/crafting-equipment.ts +++ b/src/lib/game/crafting-equipment.ts @@ -59,7 +59,7 @@ export interface CraftingInitResult { export function initializeEquipmentCrafting( blueprintId: string, materials: Record, - currentMana: number + _currentMana: number ): CraftingInitResult { const recipe = CRAFTING_RECIPES[blueprintId]; @@ -149,7 +149,7 @@ export interface CraftingCancelResult { logMessage: string; } -export function cancelEquipmentCrafting(blueprintId: string, manaSpent: number): CraftingCancelResult { +export function cancelEquipmentCrafting(_blueprintId: string, manaSpent: number): CraftingCancelResult { const recipe = CRAFTING_RECIPES[blueprintId]; if (!recipe) { return { diff --git a/src/lib/game/crafting-prep.ts b/src/lib/game/crafting-prep.ts index 46f0db6..cb447ee 100644 --- a/src/lib/game/crafting-prep.ts +++ b/src/lib/game/crafting-prep.ts @@ -87,7 +87,7 @@ export function calculatePreparationTick( // Apply preparation completion to equipment instance export function completePreparation( instance: EquipmentInstance, - manaSpent: number + _manaSpent: number ): { updatedInstance: EquipmentInstance; manaRecovered: number; diff --git a/src/lib/game/data/attunements.ts b/src/lib/game/data/attunements.ts index cb8f27d..206777d 100755 --- a/src/lib/game/data/attunements.ts +++ b/src/lib/game/data/attunements.ts @@ -83,7 +83,7 @@ export function getAttunementBySlot(slot: AttunementSlot): AttunementDef | undef // Helper function to get all unlocked attunements for a player export function getUnlockedAttunements(attunements: Record): AttunementDef[] { return Object.entries(attunements) - .filter(([id, state]) => state.active) + .filter(([, state]) => state.active) .map(([id]) => ATTUNEMENTS_DEF[id]) .filter(Boolean); } diff --git a/src/lib/game/effects/dynamic-compute.ts b/src/lib/game/effects/dynamic-compute.ts index 82e8445..cf73b22 100644 --- a/src/lib/game/effects/dynamic-compute.ts +++ b/src/lib/game/effects/dynamic-compute.ts @@ -100,7 +100,7 @@ export function computeDynamicClickMana( export function computeDynamicDamage( effects: ComputedEffects, baseDamage: number, - floorHPPct: number, + _floorHPPct: number, currentMana: number, maxMana: number ): number { diff --git a/src/lib/game/stores/attunementStore.ts b/src/lib/game/stores/attunementStore.ts index d6f4fd6..8253eff 100644 --- a/src/lib/game/stores/attunementStore.ts +++ b/src/lib/game/stores/attunementStore.ts @@ -27,7 +27,7 @@ const initialState = { export const useAttunementStore = create()( persist( - (set, get) => ({ + (set, _get) => ({ ...initialState, addAttunementXP: (attunementId: string, amount: number) => { diff --git a/src/lib/game/stores/combat-actions.ts b/src/lib/game/stores/combat-actions.ts index 83cad4d..c196c7d 100644 --- a/src/lib/game/stores/combat-actions.ts +++ b/src/lib/game/stores/combat-actions.ts @@ -49,7 +49,7 @@ export function processCombatTick( set: (state: Partial) => void, rawMana: number, elements: Record, - maxMana: number, + _maxMana: number, attackSpeedMult: number, onFloorCleared: (floor: number, wasGuardian: boolean) => void, onDamageDealt: (damage: number) => { diff --git a/src/lib/game/stores/manaStore.ts b/src/lib/game/stores/manaStore.ts index 3787e62..4911b34 100755 --- a/src/lib/game/stores/manaStore.ts +++ b/src/lib/game/stores/manaStore.ts @@ -277,9 +277,9 @@ export const useManaStore = create()( resetMana: ( prestigeUpgrades: Record, - skills: Record = {}, - skillUpgrades: Record = {}, - skillTiers: Record = {} + _skills: Record = {}, + _skillUpgrades: Record = {}, + _skillTiers: Record = {} ) => { const elementMax = 10 + (prestigeUpgrades.elemMax || 0) * 5; const startingMana = 10 + (prestigeUpgrades.manaStart || 0) * 10; diff --git a/src/lib/game/utils/safe-persist.ts b/src/lib/game/utils/safe-persist.ts index fe4dad5..7747bbb 100644 --- a/src/lib/game/utils/safe-persist.ts +++ b/src/lib/game/utils/safe-persist.ts @@ -18,7 +18,6 @@ export function createSafeStorage(): any { if (str === null) return null; return str; } catch (error) { - console.warn(`[persist] Failed to read "${name}" from localStorage:`, error); try { localStorage.removeItem(name); } catch { @@ -31,18 +30,12 @@ export function createSafeStorage(): any { try { localStorage.setItem(name, JSON.stringify(value)); } catch (error) { - if (error instanceof DOMException && error.name === 'QuotaExceededError') { - console.warn(`[persist] localStorage quota exceeded for "${name}". State will not persist this tick.`); - } else { - console.warn(`[persist] Failed to write "${name}" to localStorage:`, error); - } } }, removeItem: (name: string): void => { try { localStorage.removeItem(name); } catch (error) { - console.warn(`[persist] Failed to remove "${name}" from localStorage:`, error); } }, };