diff --git a/docs/circular-deps.txt b/docs/circular-deps.txt index 788af98..354ba39 100644 --- a/docs/circular-deps.txt +++ b/docs/circular-deps.txt @@ -1,8 +1,8 @@ # Circular Dependencies -Generated: 2026-05-18T15:51:10.807Z +Generated: 2026-05-18T17:38:26.640Z Found: 1 circular chain(s) — these MUST be fixed before modifying involved files. -1. Processed 123 files (1.2s) (29 warnings) +1. Processed 123 files (1.3s) (29 warnings) ## How to fix 1. Identify which import in the chain can be extracted to a shared types/utils file. diff --git a/docs/dependency-graph.json b/docs/dependency-graph.json index 862da18..5f18cc8 100644 --- a/docs/dependency-graph.json +++ b/docs/dependency-graph.json @@ -1,6 +1,6 @@ { "_meta": { - "generated": "2026-05-18T15:51:09.351Z", + "generated": "2026-05-18T17:38:25.120Z", "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/src/components/game/ConfirmDialog.tsx b/src/components/game/ConfirmDialog.tsx index a5f058f..1d3bc55 100644 --- a/src/components/game/ConfirmDialog.tsx +++ b/src/components/game/ConfirmDialog.tsx @@ -87,6 +87,7 @@ export function ConfirmDialog({ destructive = false, }: ConfirmDialogProps) { const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); const Icon = VARIANT_ICONS[variant]; const titleColor = VARIANT_TITLE_COLORS[variant]; @@ -94,9 +95,12 @@ export function ConfirmDialog({ const handleConfirm = async () => { setIsLoading(true); + setError(null); try { await onConfirm(); onOpenChange(false); + } catch (e) { + setError(e instanceof Error ? e.message : 'Action failed'); } finally { setIsLoading(false); } @@ -118,6 +122,11 @@ export function ConfirmDialog({ {description} + {error && ( +
+ {error} +
+ )} { const max = getMaxMana() || 100; - const current = rawMana; - for (let i = 0; i < Math.floor(max - current); i++) { - gatherMana(); - } + useManaStore.setState((s) => ({ rawMana: Math.max(s.rawMana, max) })); }} > Fill Mana diff --git a/src/lib/game/constants/index.ts b/src/lib/game/constants/index.ts index 86d9408..6037fd4 100644 --- a/src/lib/game/constants/index.ts +++ b/src/lib/game/constants/index.ts @@ -20,7 +20,7 @@ export { SPELLS_DEF } from './spells'; export { PRESTIGE_DEF } from './prestige'; // Room constants -export type { RoomType } from './rooms'; +export type { RoomType } from '../types/game'; export { PUZZLE_ROOM_INTERVAL, SWARM_ROOM_CHANCE, SPEED_ROOM_CHANCE, PUZZLE_ROOM_CHANCE } from './rooms'; export { PUZZLE_ROOMS, SWARM_CONFIG, SPEED_ROOM_CONFIG, FLOOR_ARMOR_CONFIG } from './rooms'; diff --git a/src/lib/game/constants/rooms.ts b/src/lib/game/constants/rooms.ts index a7265b0..1389953 100644 --- a/src/lib/game/constants/rooms.ts +++ b/src/lib/game/constants/rooms.ts @@ -1,6 +1,6 @@ // ─── Room Types ──────────────────────────────────────────────────────────────── // Room types for spire floors -export type RoomType = 'combat' | 'puzzle' | 'swarm' | 'speed' | 'guardian'; +export type { RoomType } from '../types/game'; // Room generation rules: // - Guardian floors (10, 20, 30, etc.) are ALWAYS guardian type diff --git a/src/lib/game/constants/spells-modules/basic-elemental-spells.ts b/src/lib/game/constants/spells-modules/basic-elemental-spells.ts index 661dbc0..189bdb0 100644 --- a/src/lib/game/constants/spells-modules/basic-elemental-spells.ts +++ b/src/lib/game/constants/spells-modules/basic-elemental-spells.ts @@ -145,7 +145,7 @@ export const BASIC_ELEMENTAL_SPELLS: Record = { castSpeed: 2, unlock: 150, studyTime: 3, - desc: "Drain life force from your enemy.", + desc: "Siphon vital energy from your enemy." }, rotTouch: { name: "Rot Touch", diff --git a/src/lib/game/data/achievements.ts b/src/lib/game/data/achievements.ts index 743670d..3a1b9e7 100755 --- a/src/lib/game/data/achievements.ts +++ b/src/lib/game/data/achievements.ts @@ -101,7 +101,7 @@ export const ACHIEVEMENTS: Record = { name: 'Pact Master', desc: 'Sign all guardian pacts', category: 'progression', - requirement: { type: 'pact', value: 12 }, + requirement: { type: 'pact', value: 9 }, reward: { insight: 500, damageBonus: 0.2, title: 'Pact Master' }, }, diff --git a/src/lib/game/data/attunements.ts b/src/lib/game/data/attunements.ts index 744040d..cb8f27d 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 || ATTUNEMENTS_DEF[id]?.unlocked) + .filter(([id, state]) => state.active) .map(([id]) => ATTUNEMENTS_DEF[id]) .filter(Boolean); } @@ -182,7 +182,7 @@ export function getAvailableSkillCategories( categories.add('mana'); categories.add('study'); categories.add('research'); - categories.add('ascension'); + // categories.add('ascension'); // removed: banned mechanic // Add categories from active attunements Object.entries(attunements) diff --git a/src/lib/game/data/enchantments/spell-effects/index.ts b/src/lib/game/data/enchantments/spell-effects/index.ts index f60fdbf..bfe5c42 100644 --- a/src/lib/game/data/enchantments/spell-effects/index.ts +++ b/src/lib/game/data/enchantments/spell-effects/index.ts @@ -2,7 +2,8 @@ // Re-exports all spell effects from modular files // Re-export types -export type { EnchantmentEffectDef, ALL_CASTER } from './types'; +export type { EnchantmentEffectDef } from '../../enchantment-types'; +export { ALL_CASTER } from './types'; // Import all spell effect groups import { BASIC_SPELL_EFFECTS } from './basic-spells'; diff --git a/src/lib/game/data/enchantments/spell-effects/types.ts b/src/lib/game/data/enchantments/spell-effects/types.ts index b623445..bef28ff 100644 --- a/src/lib/game/data/enchantments/spell-effects/types.ts +++ b/src/lib/game/data/enchantments/spell-effects/types.ts @@ -1,20 +1,8 @@ // ─── Spell Enchantment Effects Types ───────────────── +import type { EquipmentCategory } from '../../equipment'; -export interface EnchantmentEffectDef { - id: string; - name: string; - description: string; - category: string; - baseCapacityCost: number; - maxStacks: number; - allowedEquipmentCategories: string[]; - effect: { - type: string; - spellId?: string; - stat?: string; - value?: number; - }; -} +// Re-export canonical type from enchantment-types +export type { EnchantmentEffectDef } from '../../enchantment-types'; // Helper to define allowed equipment categories for each effect type -export const ALL_CASTER: string[] = ['caster'] +export const ALL_CASTER: EquipmentCategory[] = ['caster']; diff --git a/src/lib/game/data/equipment/types.ts b/src/lib/game/data/equipment/types.ts index b01c0ce..c454437 100644 --- a/src/lib/game/data/equipment/types.ts +++ b/src/lib/game/data/equipment/types.ts @@ -1,6 +1,6 @@ // ─── Equipment Types ───────────────────────────────────────────────── -export type EquipmentSlot = 'mainHand' | 'offHand' | 'head' | 'body' | 'hands' | 'feet' | 'accessory1' | 'accessory2'; +export type { EquipmentSlot } from '../../types/equipmentSlot'; export type EquipmentCategory = 'caster' | 'shield' | 'catalyst' | 'sword' | 'head' | 'body' | 'hands' | 'feet' | 'accessory'; // All equipment slots in order diff --git a/src/lib/game/data/equipment/utils.ts b/src/lib/game/data/equipment/utils.ts index e11431a..1f5de5a 100644 --- a/src/lib/game/data/equipment/utils.ts +++ b/src/lib/game/data/equipment/utils.ts @@ -1,27 +1,7 @@ // ─── Equipment Helper Functions ───────────────────────── import type { EquipmentType, EquipmentSlot, EquipmentCategory } from './types'; -import { ACCESSORIES_EQUIPMENT } from './accessories'; -import { BODY_EQUIPMENT } from './body'; -import { CASTER_EQUIPMENT } from './casters'; -import { CATALYST_EQUIPMENT } from './catalysts'; -import { FEET_EQUIPMENT } from './feet'; -import { HANDS_EQUIPMENT } from './hands'; -import { HEAD_EQUIPMENT } from './head'; -import { SHIELD_EQUIPMENT } from './shields'; -import { SWORD_EQUIPMENT } from './swords'; - -const EQUIPMENT_TYPES: Record = { - ...ACCESSORIES_EQUIPMENT, - ...BODY_EQUIPMENT, - ...CASTER_EQUIPMENT, - ...CATALYST_EQUIPMENT, - ...FEET_EQUIPMENT, - ...HANDS_EQUIPMENT, - ...HEAD_EQUIPMENT, - ...SHIELD_EQUIPMENT, - ...SWORD_EQUIPMENT, -}; +import { EQUIPMENT_TYPES } from './index'; export function getEquipmentType(id: string): EquipmentType | undefined { return EQUIPMENT_TYPES[id]; diff --git a/src/lib/game/data/golems/utils.ts b/src/lib/game/data/golems/utils.ts index 7a62a2d..1cfb18c 100644 --- a/src/lib/game/data/golems/utils.ts +++ b/src/lib/game/data/golems/utils.ts @@ -1,15 +1,7 @@ // ─── Golem Helper Functions ───────────────────────── import type { GolemDef, GolemManaCost } from './types'; -import { BASE_GOLEMS } from './base-golems'; -import { ELEMENTAL_GOLEMS } from './elemental-golems'; -import { HYBRID_GOLEMS } from './hybrid-golems'; - -const GOLEMS_DEF = { - ...BASE_GOLEMS, - ...ELEMENTAL_GOLEMS, - ...HYBRID_GOLEMS, -}; +import { GOLEMS_DEF } from './index'; // Get golem slots based on Fabricator attunement level // Level 2 = 1, Level 4 = 2, Level 6 = 3, Level 8 = 4, Level 10 = 5 diff --git a/src/lib/game/data/loot-drops.ts b/src/lib/game/data/loot-drops.ts index 288b815..af9ea17 100755 --- a/src/lib/game/data/loot-drops.ts +++ b/src/lib/game/data/loot-drops.ts @@ -102,9 +102,9 @@ export const LOOT_DROPS: Record = { dropChance: 0.08, amount: { min: 3, max: 10 }, }, - lifeEssenceDrop: { - id: 'lifeEssenceDrop', - name: 'Life Essence', + vitalityEssenceDrop: { + id: 'vitalityEssenceDrop', + name: 'Vitality Essence', rarity: 'epic', type: 'essence', minFloor: 40, @@ -187,7 +187,7 @@ export const LOOT_DROPS: Record = { }; // Rarity colors for UI -export const RARITY_COLORS: Record = { +export const LOOT_RARITY_COLORS: Record = { common: { color: '#9CA3AF', glow: '#9CA3AF40' }, uncommon: { color: '#22C55E', glow: '#22C55E40' }, rare: { color: '#3B82F6', glow: '#3B82F640' }, diff --git a/src/lib/game/stores/prestigeStore.ts b/src/lib/game/stores/prestigeStore.ts index 372f59a..8b74e51 100755 --- a/src/lib/game/stores/prestigeStore.ts +++ b/src/lib/game/stores/prestigeStore.ts @@ -36,7 +36,7 @@ export interface PrestigeState { pactRitualProgress: number; // Actions - doPrestige: (id: string) => void; + doPrestige: (id: string) => boolean; addMemory: (memory: Memory) => void; removeMemory: (skillId: string) => void; clearMemories: () => void; diff --git a/src/lib/game/types/equipment.ts b/src/lib/game/types/equipment.ts index 7c9beab..6bdcd7b 100644 --- a/src/lib/game/types/equipment.ts +++ b/src/lib/game/types/equipment.ts @@ -1,10 +1,11 @@ // ─── Equipment Types ─────────────────────────────────────────────────────── +import type { EquipmentSlot } from './equipmentSlot'; // Legacy EquipmentDef for backward compatibility export interface EquipmentDef { id: string; name: string; - slot: 'mainHand' | 'offHand' | 'head' | 'body' | 'hands' | 'accessory'; + slot: EquipmentSlot; rarity: 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary' | 'mythic'; stats: Record; durability: number; diff --git a/src/lib/game/types/equipmentSlot.ts b/src/lib/game/types/equipmentSlot.ts index 9f4292a..f8a6c3b 100644 --- a/src/lib/game/types/equipmentSlot.ts +++ b/src/lib/game/types/equipmentSlot.ts @@ -1,12 +1,11 @@ // EquipmentSlot type definition +// Canonical type — includes all valid equipment slots export type EquipmentSlot = - | "mainHand" - | "offHand" - | "head" - | "body" - | "hands" - | "accessory" - | "accessory1" - | "accessory2"; - -// Export barrel from index + | 'mainHand' + | 'offHand' + | 'head' + | 'body' + | 'hands' + | 'feet' + | 'accessory1' + | 'accessory2'; diff --git a/src/lib/game/types/index.ts b/src/lib/game/types/index.ts index 9858350..e9da396 100644 --- a/src/lib/game/types/index.ts +++ b/src/lib/game/types/index.ts @@ -25,8 +25,10 @@ export type { EquipmentSpellState, BlueprintDef, LootInventory, - EquipmentSlot -} from './equipmentSlot'; +} from './equipment'; + +// Equipment slot type (canonical) +export type { EquipmentSlot } from './equipmentSlot'; // Game state types export type {