fix: resolve 7 circular dependency chains in src/lib/game
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 57s
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 57s
- equipment/utils.ts: import directly from individual equipment modules instead of index.ts - golems/utils.ts: import directly from individual golem modules instead of index.ts - combatStore.ts: extract CombatState to combat-state.types.ts, remove debugSetTime (was only user of gameStore import) - combat-actions.ts: import CombatState from combat-state.types.ts instead of combatStore - stores/index.ts: re-export CombatState from combat-state.types.ts - GameStateDebug.tsx: replace debugSetTime calls with direct useGameStore.setState() Verification: bunx madge --circular src/lib/game → No circular dependency found!
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
// Extracted combat logic from combatStore.ts
|
||||
|
||||
import { SPELLS_DEF, GUARDIANS, HOURS_PER_TICK } from '../constants';
|
||||
import type { CombatState } from './combatStore';
|
||||
import type { CombatState } from './combat-state.types';
|
||||
import type { SpellState } from '../types';
|
||||
import { getFloorMaxHP, getFloorElement, calcDamage, canAffordSpellCost, deductSpellCost } from '../utils';
|
||||
import { usePrestigeStore } from './prestigeStore';
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
// ─── Combat State Types ────────────────────────────────────────────────────────
|
||||
// Shared types for combat store and combat actions to avoid circular dependency
|
||||
|
||||
import type { GameAction, SpellState, FloorState, GolemancyState, ActivityLogEntry, AchievementState, EquipmentSpellState, ActivityEventType } from '../types';
|
||||
|
||||
export interface CombatState {
|
||||
// Floor state
|
||||
currentFloor: number;
|
||||
floorHP: number;
|
||||
floorMaxHP: number;
|
||||
maxFloorReached: number;
|
||||
|
||||
// Action state
|
||||
activeSpell: string;
|
||||
currentAction: GameAction;
|
||||
castProgress: number;
|
||||
|
||||
// Spire mode
|
||||
spireMode: boolean;
|
||||
|
||||
// Room system for special floors
|
||||
currentRoom: FloorState;
|
||||
|
||||
// Spire climbing state
|
||||
clearedFloors: Record<number, boolean>;
|
||||
climbDirection: 'up' | 'down' | null;
|
||||
isDescending: boolean;
|
||||
|
||||
// Golemancy (summoned golems)
|
||||
golemancy: GolemancyState;
|
||||
|
||||
// Equipment spell states for multi-casting
|
||||
equipmentSpellStates: EquipmentSpellState[];
|
||||
|
||||
// Combat special effect tracking
|
||||
comboHitCount: number;
|
||||
floorHitCount: number;
|
||||
|
||||
// Spells
|
||||
spells: Record<string, SpellState>;
|
||||
|
||||
// Activity Log (for Spire Mode UI)
|
||||
activityLog: ActivityLogEntry[];
|
||||
|
||||
// Achievements
|
||||
achievements: AchievementState;
|
||||
|
||||
// Stats tracking
|
||||
totalSpellsCast: number;
|
||||
totalDamageDealt: number;
|
||||
totalCraftsCompleted: number;
|
||||
|
||||
// Actions
|
||||
setCurrentFloor: (floor: number) => void;
|
||||
advanceFloor: () => void;
|
||||
setFloorHP: (hp: number) => void;
|
||||
setMaxFloorReached: (floor: number) => void;
|
||||
|
||||
setAction: (action: GameAction) => void;
|
||||
setSpell: (spellId: string) => void;
|
||||
setCastProgress: (progress: number) => void;
|
||||
|
||||
// Room state
|
||||
setCurrentRoom: (room: FloorState) => void;
|
||||
|
||||
// Spire climbing
|
||||
setClimbDirection: (direction: 'up' | 'down' | null) => void;
|
||||
setClearedFloor: (floor: number, cleared: boolean) => void;
|
||||
setIsDescending: (descending: boolean) => void;
|
||||
climbDownFloor: () => void;
|
||||
exitSpireMode: () => void;
|
||||
startClimbUp: () => void;
|
||||
startClimbDown: () => void;
|
||||
|
||||
// Golemancy
|
||||
toggleGolem: (golemId: string) => void;
|
||||
setEnabledGolems: (golemIds: string[]) => void;
|
||||
|
||||
// Spells
|
||||
learnSpell: (spellId: string) => void;
|
||||
setSpellState: (spellId: string, state: Partial<SpellState>) => void;
|
||||
|
||||
// Activity Log
|
||||
addActivityLog: (eventType: ActivityEventType, message: string, details?: ActivityLogEntry['details']) => void;
|
||||
|
||||
// Stats
|
||||
incrementSpellsCast: () => void;
|
||||
addDamageDealt: (damage: number) => void;
|
||||
incrementCraftsCompleted: () => void;
|
||||
|
||||
// Spire mode
|
||||
enterSpireMode: () => void;
|
||||
|
||||
// Combat tick
|
||||
processCombatTick: (
|
||||
rawMana: number,
|
||||
elements: Record<string, { current: number; max: number; unlocked: boolean }>,
|
||||
maxMana: number,
|
||||
attackSpeedMult: number,
|
||||
onFloorCleared: (floor: number, wasGuardian: boolean) => void,
|
||||
onDamageDealt: (damage: number) => { rawMana: number; elements: Record<string, { current: number; max: number; unlocked: boolean }> },
|
||||
) => { rawMana: number; elements: Record<string, { current: number; max: number; unlocked: boolean }>; logMessages: string[]; totalManaGathered: number };
|
||||
|
||||
// Reset
|
||||
resetCombat: (startFloor: number, spellsToKeep?: string[]) => void;
|
||||
|
||||
// Debug helpers
|
||||
debugSetFloor: (floor: number) => void;
|
||||
resetFloorHP: () => void;
|
||||
debugSetTime: (day: number, hour: number) => void;
|
||||
}
|
||||
@@ -10,113 +10,7 @@ import { useGameStore } from './gameStore';
|
||||
import { generateFloorState } from '../utils/room-utils';
|
||||
import { addActivityLogEntry } from '../utils/activity-log';
|
||||
import { processCombatTick, makeInitialSpells } from './combat-actions';
|
||||
|
||||
export interface CombatState {
|
||||
// Floor state
|
||||
currentFloor: number;
|
||||
floorHP: number;
|
||||
floorMaxHP: number;
|
||||
maxFloorReached: number;
|
||||
|
||||
// Action state
|
||||
activeSpell: string;
|
||||
currentAction: GameAction;
|
||||
castProgress: number;
|
||||
|
||||
// Spire mode
|
||||
spireMode: boolean;
|
||||
|
||||
// Room system for special floors
|
||||
currentRoom: FloorState;
|
||||
|
||||
// Spire climbing state
|
||||
clearedFloors: Record<number, boolean>;
|
||||
climbDirection: 'up' | 'down' | null;
|
||||
isDescending: boolean;
|
||||
|
||||
// Golemancy (summoned golems)
|
||||
golemancy: GolemancyState;
|
||||
|
||||
// Equipment spell states for multi-casting
|
||||
equipmentSpellStates: EquipmentSpellState[];
|
||||
|
||||
// Combat special effect tracking
|
||||
comboHitCount: number;
|
||||
floorHitCount: number;
|
||||
|
||||
// Spells
|
||||
spells: Record<string, SpellState>;
|
||||
|
||||
// Activity Log (for Spire Mode UI)
|
||||
activityLog: ActivityLogEntry[];
|
||||
|
||||
// Achievements
|
||||
achievements: AchievementState;
|
||||
|
||||
// Stats tracking
|
||||
totalSpellsCast: number;
|
||||
totalDamageDealt: number;
|
||||
totalCraftsCompleted: number;
|
||||
|
||||
// Actions
|
||||
setCurrentFloor: (floor: number) => void;
|
||||
advanceFloor: () => void;
|
||||
setFloorHP: (hp: number) => void;
|
||||
setMaxFloorReached: (floor: number) => void;
|
||||
|
||||
setAction: (action: GameAction) => void;
|
||||
setSpell: (spellId: string) => void;
|
||||
setCastProgress: (progress: number) => void;
|
||||
|
||||
// Room state
|
||||
setCurrentRoom: (room: FloorState) => void;
|
||||
|
||||
// Spire climbing
|
||||
setClimbDirection: (direction: 'up' | 'down' | null) => void;
|
||||
setClearedFloor: (floor: number, cleared: boolean) => void;
|
||||
setIsDescending: (descending: boolean) => void;
|
||||
climbDownFloor: () => void;
|
||||
exitSpireMode: () => void;
|
||||
startClimbUp: () => void;
|
||||
startClimbDown: () => void;
|
||||
|
||||
// Golemancy
|
||||
toggleGolem: (golemId: string) => void;
|
||||
setEnabledGolems: (golemIds: string[]) => void;
|
||||
|
||||
// Spells
|
||||
learnSpell: (spellId: string) => void;
|
||||
setSpellState: (spellId: string, state: Partial<SpellState>) => void;
|
||||
|
||||
// Activity Log
|
||||
addActivityLog: (eventType: ActivityEventType, message: string, details?: ActivityLogEntry['details']) => void;
|
||||
|
||||
// Stats
|
||||
incrementSpellsCast: () => void;
|
||||
addDamageDealt: (damage: number) => void;
|
||||
incrementCraftsCompleted: () => void;
|
||||
|
||||
// Spire mode
|
||||
enterSpireMode: () => void;
|
||||
|
||||
// Combat tick
|
||||
processCombatTick: (
|
||||
rawMana: number,
|
||||
elements: Record<string, { current: number; max: number; unlocked: boolean }>,
|
||||
maxMana: number,
|
||||
attackSpeedMult: number,
|
||||
onFloorCleared: (floor: number, wasGuardian: boolean) => void,
|
||||
onDamageDealt: (damage: number) => { rawMana: number; elements: Record<string, { current: number; max: number; unlocked: boolean }> },
|
||||
) => { rawMana: number; elements: Record<string, { current: number; max: number; unlocked: boolean }>; logMessages: string[]; totalManaGathered: number };
|
||||
|
||||
// Reset
|
||||
resetCombat: (startFloor: number, spellsToKeep?: string[]) => void;
|
||||
|
||||
// Debug helpers
|
||||
debugSetFloor: (floor: number) => void;
|
||||
resetFloorHP: () => void;
|
||||
debugSetTime: (day: number, hour: number) => void;
|
||||
}
|
||||
import type { CombatState } from './combat-state.types';
|
||||
|
||||
export const useCombatStore = create<CombatState>()(
|
||||
persist(
|
||||
|
||||
@@ -12,7 +12,7 @@ export { useManaStore, makeInitialElements } from './manaStore';
|
||||
export type { ManaState } from './manaStore';
|
||||
|
||||
export { useCombatStore, makeInitialSpells } from './combatStore';
|
||||
export type { CombatState } from './combatStore';
|
||||
export type { CombatState } from './combat-state.types';
|
||||
|
||||
export { useCraftingStore } from './craftingStore';
|
||||
export type { CraftingState, CraftingActions } from './craftingStore';
|
||||
|
||||
Reference in New Issue
Block a user