'use client'; import { Button } from '@/components/ui/button'; import { Progress } from '@/components/ui/progress'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Separator } from '@/components/ui/separator'; import { Trash2 } from 'lucide-react'; import { EQUIPMENT_TYPES } from '@/lib/game/data/equipment'; import type { EquipmentInstance, AppliedEnchantment, LootInventory, EquipmentCraftingProgress, EquipmentSlot } from '@/lib/game/types'; import { fmt, type GameStore } from '@/lib/game/store'; // Slot display names const SLOT_NAMES: Record = { mainHand: 'Main Hand', offHand: 'Off Hand', head: 'Head', body: 'Body', hands: 'Hands', feet: 'Feet', accessory1: 'Accessory 1', accessory2: 'Accessory 2', }; export interface EnchantmentPreparerProps { store: GameStore; selectedEquipmentInstance: string | null; setSelectedEquipmentInstance: (id: string | null) => void; } export function EnchantmentPreparer({ store, selectedEquipmentInstance, setSelectedEquipmentInstance, }: EnchantmentPreparerProps) { const equippedInstances = store.equippedInstances; const equipmentInstances = store.equipmentInstances; const preparationProgress = store.preparationProgress; const rawMana = store.rawMana; const skills = store.skills; const startPreparing = store.startPreparing; const cancelPreparation = store.cancelPreparation; // Get equipped items as array const equippedItems = Object.entries(equippedInstances) .filter(([, instanceId]) => instanceId && equipmentInstances[instanceId]) .map(([slot, instanceId]) => ({ slot: slot as EquipmentSlot, instance: equipmentInstances[instanceId!], })); return (
{/* Equipment Selection */} Select Equipment to Prepare {preparationProgress ? (
Preparing: {equipmentInstances[preparationProgress.equipmentInstanceId]?.name}
{preparationProgress.progress.toFixed(1)}h / {preparationProgress.required.toFixed(1)}h Mana paid: {fmt(preparationProgress.manaCostPaid)}
) : (
{equippedItems.map(({ slot, instance }) => { const hasEnchantments = instance.enchantments.length > 0; const isReady = instance.tags?.includes('Ready for Enchantment'); return (
setSelectedEquipmentInstance(instance.instanceId)} >
{instance.name}
{SLOT_NAMES[slot]}
{hasEnchantments && (
⚠️ {instance.enchantments.length} enchantments - Preparation will remove them
)} {isReady && (
✅ Ready for Enchantment
)}
{instance.usedCapacity}/{instance.totalCapacity} cap
{instance.enchantments.length} enchants
); })} {equippedItems.length === 0 && (
No equipped items
)}
)}
{/* Preparation Details */} Preparation Details {!selectedEquipmentInstance ? (
Select equipment to prepare
) : preparationProgress ? (
Preparation in progress...
) : ( (() => { const instance = equipmentInstances[selectedEquipmentInstance]; if (!instance) return null; const hasEnchantments = instance.enchantments.length > 0; const isReady = instance.tags?.includes('Ready for Enchantment'); const prepTime = 2 + Math.floor(instance.totalCapacity / 50); const manaCost = instance.totalCapacity * 10; // Calculate disenchant recovery const recoveryRate = 0.1; // Base recovery rate (disenchanting skill removed) const totalRecoverable = instance.enchantments.reduce( (sum, e) => sum + Math.floor(e.actualCost * recoveryRate), 0 ); return (
{instance.name}
{/* Show warning if item has enchantments */} {hasEnchantments && !isReady && (
⚠️ Equipment has enchantments
Preparation will remove all existing enchantments and recover some mana.
Recoverable Mana: {fmt(totalRecoverable)}
)} {/* Show ready status */} {isReady && (
✅ Ready for Enchantment
This item has been prepared and is ready for enchantment application.
)}
Capacity: {instance.usedCapacity}/{instance.totalCapacity}
Prep Time: {prepTime}h
Mana Cost: {fmt(manaCost)}
); })() )}
); } EnchantmentPreparer.displayName = "EnchantmentPreparer";