From 7962a4fdaa87786a38935deb258dd507e0f422e9 Mon Sep 17 00:00:00 2001 From: n8n-gitea Date: Wed, 27 May 2026 11:13:08 +0200 Subject: [PATCH] fix: discipline reset on mana depletion and re-activation after stop - #143: processTick now removes drained disciplines from activeIds and calls onStopPracticing so currentAction resets to 'meditate' - #144: Removed paused guard from canProceedDiscipline so stopped disciplines can be re-activated - Updated test to match new expected behavior for paused disciplines --- docs/circular-deps.txt | 2 +- docs/dependency-graph.json | 7 ++++++- src/lib/game/__tests__/discipline-math.test.ts | 4 ++-- src/lib/game/stores/discipline-slice.ts | 9 +++++++++ src/lib/game/utils/discipline-math.ts | 1 - 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/docs/circular-deps.txt b/docs/circular-deps.txt index 2a00704..752b3b4 100644 --- a/docs/circular-deps.txt +++ b/docs/circular-deps.txt @@ -1,4 +1,4 @@ # Circular Dependencies -Generated: 2026-05-27T08:45:44.894Z +Generated: 2026-05-27T09:06:29.331Z No circular dependencies found. ✅ diff --git a/docs/dependency-graph.json b/docs/dependency-graph.json index 6c2b6b4..710422a 100644 --- a/docs/dependency-graph.json +++ b/docs/dependency-graph.json @@ -1,6 +1,6 @@ { "_meta": { - "generated": "2026-05-27T08:45:43.143Z", + "generated": "2026-05-27T09:06:27.471Z", "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." }, @@ -151,6 +151,10 @@ "types.ts", "utils/result.ts" ], + "crafting-fabricator.ts": [ + "data/fabricator-recipes.ts", + "types.ts" + ], "crafting-loot.ts": [ "data/crafting-recipes.ts", "types.ts" @@ -464,6 +468,7 @@ "crafting-actions/preparation-actions.ts", "crafting-design.ts", "crafting-equipment.ts", + "crafting-fabricator.ts", "crafting-utils.ts", "stores/combatStore.ts", "stores/crafting-initial-state.ts", diff --git a/src/lib/game/__tests__/discipline-math.test.ts b/src/lib/game/__tests__/discipline-math.test.ts index a57aa6b..95a8574 100644 --- a/src/lib/game/__tests__/discipline-math.test.ts +++ b/src/lib/game/__tests__/discipline-math.test.ts @@ -230,12 +230,12 @@ describe('canProceedDiscipline', () => { expect(result).toBe(true); }); - it('should return false when discipline is paused', () => { + it('should return true when discipline is paused (paused state is handled by activate, not canProceedDiscipline)', () => { const state: DisciplineState = { id: 'raw-mastery', xp: 0, paused: true }; const result = canProceedDiscipline(rawMastery, state, { rawMana: 1000, }); - expect(result).toBe(false); + expect(result).toBe(true); }); it('should return true when raw mana is sufficient', () => { diff --git a/src/lib/game/stores/discipline-slice.ts b/src/lib/game/stores/discipline-slice.ts index 3b5e6d8..b4c8318 100644 --- a/src/lib/game/stores/discipline-slice.ts +++ b/src/lib/game/stores/discipline-slice.ts @@ -154,6 +154,7 @@ export const useDisciplineStore = create()( const newUnlockedEffects: string[] = []; const newProcessedPerks = [...s.processedPerks]; + const drainedIds: string[] = []; for (const id of s.activeIds) { const disc = newDisciplines[id]; if (!disc) continue; @@ -168,6 +169,7 @@ export const useDisciplineStore = create()( if (!available || available < drain) { newDisciplines[id] = { ...disc, paused: true }; + drainedIds.push(id); continue; } @@ -206,8 +208,15 @@ export const useDisciplineStore = create()( MAX_CONCURRENT_DISCIPLINES + 3 ); + // Remove mana-drained disciplines from activeIds so onStopPracticing fires + const newActiveIds = s.activeIds.filter((aid) => !drainedIds.includes(aid)); + if (newActiveIds.length === 0 && s.activeIds.length > 0) { + get().practicingCallbacks?.onStopPracticing?.(); + } + set({ disciplines: newDisciplines, + activeIds: newActiveIds, totalXP: newXP, concurrentLimit: Math.max(s.concurrentLimit, newLimit), processedPerks: newProcessedPerks, diff --git a/src/lib/game/utils/discipline-math.ts b/src/lib/game/utils/discipline-math.ts index 84171e1..ec38d97 100644 --- a/src/lib/game/utils/discipline-math.ts +++ b/src/lib/game/utils/discipline-math.ts @@ -68,7 +68,6 @@ export function canProceedDiscipline( gameState?: { elements?: Record; rawMana?: number } ): boolean { if (!disciplineState) return true; - if (disciplineState.paused) return false; // If no game state provided, allow activation (optimistic) if (!gameState) return true;