fix: resolve TS compilation errors and all 7 circular dependencies
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m25s
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m25s
TypeScript fixes: - gameStore.ts: replace result.ok with result.success (Result<void> uses success not ok) - gameStore.ts: fix undefined newProgress variable → ctx.prestige.pactRitualProgress + HOURS_PER_TICK - prestigeStore.ts: replace result.ok with result.success Circular dependency fixes: - Extract GameCoordinatorState to stores/gameStore.types.ts to break gameStore↔tick-pipeline/gameActions/gameLoopActions cycle - Remove getDodgeChance re-export from floor-utils.ts to break floor-utils↔room-utils↔enemy-utils cycle - Replace direct combatStore import in discipline-slice.ts with callback pattern to break discipline-slice↔combatStore↔combat-actions↔discipline-effects cycle Verification: tsc --noEmit clean, madge --circular clean (0 circular deps)
This commit is contained in:
@@ -21,7 +21,7 @@ import { enchanterSpecialDisciplines } from '../data/disciplines/enchanter-speci
|
||||
import { fabricatorDisciplines } from '../data/disciplines/fabricator';
|
||||
import { invokerDisciplines } from '../data/disciplines/invoker';
|
||||
import { MAX_CONCURRENT_DISCIPLINES } from '../types/disciplines';
|
||||
import { useCombatStore } from './combatStore';
|
||||
|
||||
|
||||
const ALL_DISCIPLINES = [
|
||||
...baseDisciplines,
|
||||
@@ -43,6 +43,7 @@ export interface DisciplineStoreState {
|
||||
concurrentLimit: number;
|
||||
totalXP: number;
|
||||
processedPerks: string[];
|
||||
practicingCallbacks: { onStartPracticing: () => void; onStopPracticing: () => void } | null;
|
||||
}
|
||||
|
||||
export interface DisciplineStoreActions {
|
||||
@@ -53,6 +54,7 @@ export interface DisciplineStoreActions {
|
||||
elements: Record<string, ElementState>;
|
||||
unlockedEffects: string[];
|
||||
};
|
||||
setPracticingCallbacks(callbacks: { onStartPracticing: () => void; onStopPracticing: () => void }): void;
|
||||
}
|
||||
|
||||
export type DisciplineStore = DisciplineStoreState & DisciplineStoreActions;
|
||||
@@ -65,6 +67,7 @@ export const useDisciplineStore = create<DisciplineStore>()(
|
||||
concurrentLimit: MAX_CONCURRENT_DISCIPLINES,
|
||||
totalXP: 0,
|
||||
processedPerks: [],
|
||||
practicingCallbacks: null,
|
||||
|
||||
activate(id, gameState) {
|
||||
set((s) => {
|
||||
@@ -114,7 +117,7 @@ export const useDisciplineStore = create<DisciplineStore>()(
|
||||
|
||||
const discState = existing || { id, xp: 0, paused: false };
|
||||
// Set currentAction to 'practicing' (only overrides 'meditate')
|
||||
useCombatStore.getState().startPracticing();
|
||||
get().practicingCallbacks?.onStartPracticing?.();
|
||||
return {
|
||||
disciplines: { ...s.disciplines, [id]: { ...discState, paused: false } },
|
||||
activeIds: [...s.activeIds, id],
|
||||
@@ -127,7 +130,7 @@ export const useDisciplineStore = create<DisciplineStore>()(
|
||||
const newActiveIds = s.activeIds.filter((aid) => aid !== id);
|
||||
// If no more active disciplines, restore currentAction to 'meditate'
|
||||
if (newActiveIds.length === 0) {
|
||||
useCombatStore.getState().stopPracticing();
|
||||
get().practicingCallbacks?.onStopPracticing?.();
|
||||
}
|
||||
return {
|
||||
activeIds: newActiveIds,
|
||||
@@ -138,6 +141,10 @@ export const useDisciplineStore = create<DisciplineStore>()(
|
||||
});
|
||||
},
|
||||
|
||||
setPracticingCallbacks(callbacks) {
|
||||
set({ practicingCallbacks: callbacks });
|
||||
},
|
||||
|
||||
processTick(mana) {
|
||||
const s = get();
|
||||
let rawMana = mana.rawMana;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { computeMaxMana, computeClickMana } from '../utils';
|
||||
import type { GameCoordinatorState } from './gameStore';
|
||||
import type { GameCoordinatorState } from './gameStore.types';
|
||||
import { useUIStore } from './uiStore';
|
||||
import { usePrestigeStore } from './prestigeStore';
|
||||
import { useManaStore } from './manaStore';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { calcInsight, getFloorMaxHP } from '../utils';
|
||||
import type { GameCoordinatorState } from './gameStore';
|
||||
import type { GameCoordinatorState } from './gameStore.types';
|
||||
import { makeInitialSpells } from './combatStore';
|
||||
import { SPELLS_DEF } from '../constants';
|
||||
import { useUIStore } from './uiStore';
|
||||
|
||||
@@ -31,14 +31,7 @@ import { createSafeStorage } from '../utils/safe-persist';
|
||||
import { createStartNewLoop } from './gameLoopActions';
|
||||
import { buildTickContext, applyTickWrites } from './tick-pipeline';
|
||||
import type { TickContext, TickWrites } from './tick-pipeline';
|
||||
|
||||
export interface GameCoordinatorState {
|
||||
day: number;
|
||||
hour: number;
|
||||
incursionStrength: number;
|
||||
containmentWards: number;
|
||||
initialized: boolean;
|
||||
}
|
||||
import type { GameCoordinatorState } from './gameStore.types';
|
||||
|
||||
export interface GameCoordinatorStore extends GameCoordinatorState {
|
||||
tick: () => void;
|
||||
@@ -63,6 +56,11 @@ export const useGameStore = create<GameCoordinatorStore>()(
|
||||
...initialState,
|
||||
|
||||
initGame: () => {
|
||||
// Wire discipline store ↔ combat store callbacks (breaks circular dependency)
|
||||
useDisciplineStore.getState().setPracticingCallbacks({
|
||||
onStartPracticing: () => useCombatStore.getState().startPracticing(),
|
||||
onStopPracticing: () => useCombatStore.getState().stopPracticing(),
|
||||
});
|
||||
set({ initialized: true });
|
||||
},
|
||||
|
||||
@@ -234,7 +232,7 @@ export const useGameStore = create<GameCoordinatorStore>()(
|
||||
const manaStore = useManaStore.getState();
|
||||
for (const manaType of guardian.unlocksMana || []) {
|
||||
const result = manaStore.unlockElement(manaType, 0);
|
||||
if (result.ok) {
|
||||
if (result.success) {
|
||||
addLog(`✨ ${manaType.charAt(0).toUpperCase() + manaType.slice(1)} mana unlocked!`);
|
||||
}
|
||||
}
|
||||
@@ -249,7 +247,7 @@ export const useGameStore = create<GameCoordinatorStore>()(
|
||||
} else {
|
||||
writes.prestige = {
|
||||
...(writes.prestige || {}),
|
||||
pactRitualProgress: newProgress,
|
||||
pactRitualProgress: ctx.prestige.pactRitualProgress + HOURS_PER_TICK,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
// ─── Game Coordinator Types ────────────────────────────────────────────────────
|
||||
// Shared data-only types extracted from gameStore.ts to break circular dependencies.
|
||||
// This file must NOT import from any other store file.
|
||||
|
||||
export interface GameCoordinatorState {
|
||||
day: number;
|
||||
hour: number;
|
||||
incursionStrength: number;
|
||||
containmentWards: number;
|
||||
initialized: boolean;
|
||||
}
|
||||
@@ -25,7 +25,8 @@ export type { DisciplineStoreState, DisciplineStoreActions, DisciplineStore } fr
|
||||
|
||||
export { useGameStore } from './gameStore';
|
||||
export { useGameLoop } from './gameHooks';
|
||||
export type { GameCoordinatorState, GameCoordinatorStore } from './gameStore';
|
||||
export type { GameCoordinatorState } from './gameStore.types';
|
||||
export type { GameCoordinatorStore } from './gameStore';
|
||||
|
||||
// Re-export utilities from utils.ts and computed-stats
|
||||
export {
|
||||
|
||||
@@ -156,7 +156,7 @@ export const usePrestigeStore = create<PrestigeStore>()(
|
||||
const manaStore = useManaStore.getState();
|
||||
for (const manaType of guardian.unlocksMana || []) {
|
||||
const result = manaStore.unlockElement(manaType, 0);
|
||||
if (result.ok) {
|
||||
if (result.success) {
|
||||
addLog(`✨ ${manaType.charAt(0).toUpperCase() + manaType.slice(1)} mana unlocked!`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import type { CombatState } from './combat-state.types';
|
||||
import type { CraftingState } from './craftingStore.types';
|
||||
import type { AttunementStoreState } from './attunementStore';
|
||||
import type { DisciplineStoreState } from './discipline-slice';
|
||||
import type { GameCoordinatorState } from './gameStore';
|
||||
import type { GameCoordinatorState } from './gameStore.types';
|
||||
|
||||
// ─── Read-only snapshot of all store states at tick start ──────────────────────
|
||||
export interface TickContext {
|
||||
|
||||
Reference in New Issue
Block a user