From b5996d5b6eb81d4195348c6a9f884d49d5e076a7 Mon Sep 17 00:00:00 2001 From: n8n-gitea Date: Thu, 28 May 2026 09:47:45 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20resolve=20circular=20dependency=20in=20d?= =?UTF-8?q?iscipline-slice=20=E2=86=92=20discipline-effects?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaced computeDisciplineEffects() import in discipline-slice.ts with inline XP bonus calculation using calculateStatBonus from discipline-math. This avoids the circular chain: discipline-effects → discipline-slice → discipline-effects. --- docs/circular-deps.txt | 11 +++++++++-- docs/dependency-graph.json | 5 ++--- src/lib/game/stores/discipline-slice.ts | 25 +++++++++++++++++++++++-- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/docs/circular-deps.txt b/docs/circular-deps.txt index 1816160..4576b75 100644 --- a/docs/circular-deps.txt +++ b/docs/circular-deps.txt @@ -1,4 +1,11 @@ # Circular Dependencies -Generated: 2026-05-27T19:08:46.353Z +Generated: 2026-05-28T07:32:48.513Z +Found: 1 circular chain(s) — these MUST be fixed before modifying involved files. -No circular dependencies found. ✅ +1. 1) effects/discipline-effects.ts > stores/discipline-slice.ts + +## How to fix +1. Identify which import in the chain can be extracted to a shared types/utils file. +2. Move the shared type or function there. +3. Both files import from the new shared module instead of each other. +4. Run: bunx madge --circular src/lib/game (should return clean) \ No newline at end of file diff --git a/docs/dependency-graph.json b/docs/dependency-graph.json index ed0a817..4234758 100644 --- a/docs/dependency-graph.json +++ b/docs/dependency-graph.json @@ -1,6 +1,6 @@ { "_meta": { - "generated": "2026-05-27T19:08:44.608Z", + "generated": "2026-05-28T07:32:46.775Z", "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." }, @@ -326,7 +326,6 @@ "data/equipment/feet.ts", "data/equipment/hands.ts", "data/equipment/head.ts", - "data/equipment/shields.ts", "data/equipment/swords.ts" ], "data/equipment/feet.ts": [ @@ -347,7 +346,6 @@ "data/equipment/feet.ts", "data/equipment/hands.ts", "data/equipment/head.ts", - "data/equipment/shields.ts", "data/equipment/swords.ts", "data/equipment/types.ts", "data/equipment/utils.ts" @@ -530,6 +528,7 @@ "data/disciplines/enchanter.ts", "data/disciplines/fabricator.ts", "data/disciplines/invoker.ts", + "effects/discipline-effects.ts", "types.ts", "types/disciplines.ts", "utils/discipline-math.ts", diff --git a/src/lib/game/stores/discipline-slice.ts b/src/lib/game/stores/discipline-slice.ts index 83c9dcb..2d5d220 100644 --- a/src/lib/game/stores/discipline-slice.ts +++ b/src/lib/game/stores/discipline-slice.ts @@ -6,11 +6,11 @@ import type { DisciplineState } from '../types/disciplines'; import type { ElementState } from '../types'; import { calculateManaDrain, + calculateStatBonus, canProceedDiscipline, checkDisciplinePrerequisites, getUnlockedPerks } from '../utils/discipline-math'; -import { computeDisciplineEffects } from '../effects/discipline-effects'; import { baseDisciplines } from '../data/disciplines/base'; import { elementalAttunementDisciplines } from '../data/disciplines/elemental'; import { elementalRegenDisciplines } from '../data/disciplines/elemental-regen'; @@ -184,7 +184,28 @@ export const useDisciplineStore = create()( } const oldXP = disc.xp; - const xpBonus = computeDisciplineEffects().bonuses.disciplineXpBonus || 0; + // Compute discipline XP bonus directly to avoid circular import + let xpBonus = 0; + for (const [did, dState] of Object.entries(newDisciplines)) { + if (!dState || dState.xp <= 0) continue; + const dDef = DISCIPLINE_MAP[did]; + if (!dDef) continue; + // Only disciplines with disciplineXpBonus stat contribute + if (dDef.statBonus.stat === 'disciplineXpBonus') { + xpBonus += calculateStatBonus( + dDef.statBonus.baseValue, + dState.xp, + dDef.scalingFactor + ); + } + // Perk bonuses for disciplineXpBonus + const perks = getUnlockedPerks(dDef, dState.xp); + for (const perk of perks) { + if (perk.bonus && perk.bonus.stat === 'disciplineXpBonus') { + xpBonus += perk.bonus.amount; + } + } + } const xpGain = 1 + xpBonus; newDisciplines[id] = { ...disc, xp: disc.xp + xpGain }; newXP += xpGain;