'use client'; import { useState, useMemo } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Save, Trash2, Star, ChevronUp } from 'lucide-react'; import { useGameContext } from '../GameContext'; import { SKILLS_DEF } from '@/lib/game/constants'; import { getTierMultiplier, getBaseSkillId } from '@/lib/game/skill-evolution'; import type { Memory } from '@/lib/game/types'; interface MemorySlotPickerProps { onConfirm?: () => void; } export function MemorySlotPicker({ onConfirm }: MemorySlotPickerProps) { const { store } = useGameContext(); const [selectedSkills, setSelectedSkills] = useState(store.memories || []); // Get all skills that have progress and can be saved const saveableSkills = useMemo(() => { const skills: { skillId: string; level: number; tier: number; upgrades: string[]; name: string }[] = []; for (const [skillId, level] of Object.entries(store.skills)) { if (level && level > 0) { const baseSkillId = getBaseSkillId(skillId); const tier = store.skillTiers?.[baseSkillId] || 1; const tieredSkillId = tier > 1 ? `${baseSkillId}_t${tier}` : baseSkillId; const upgrades = store.skillUpgrades?.[tieredSkillId] || []; const skillDef = SKILLS_DEF[baseSkillId]; // Only include if it's a base skill (not a tiered variant in the skills object) if (skillId === baseSkillId || skillId.includes('_t')) { // Get the actual skill ID and level const actualLevel = store.skills[tieredSkillId] || store.skills[baseSkillId] || 0; if (actualLevel > 0) { skills.push({ skillId: baseSkillId, level: actualLevel, tier, upgrades, name: skillDef?.name || baseSkillId, }); } } } } // Remove duplicates and keep highest tier/level const uniqueSkills = new Map(); for (const skill of skills) { const existing = uniqueSkills.get(skill.skillId); if (!existing || skill.tier > existing.tier || (skill.tier === existing.tier && skill.level > existing.level)) { uniqueSkills.set(skill.skillId, skill); } } return Array.from(uniqueSkills.values()).sort((a, b) => { // Sort by tier then level then name if (a.tier !== b.tier) return b.tier - a.tier; if (a.level !== b.level) return b.level - a.level; return a.name.localeCompare(b.name); }); }, [store.skills, store.skillTiers, store.skillUpgrades]); const isSkillSelected = (skillId: string) => selectedSkills.some(m => m.skillId === skillId); const canAddMore = selectedSkills.length < store.memorySlots; const toggleSkill = (skillId: string) => { const existingIndex = selectedSkills.findIndex(m => m.skillId === skillId); if (existingIndex >= 0) { // Remove it setSelectedSkills(selectedSkills.filter((_, i) => i !== existingIndex)); } else if (canAddMore) { // Add it const skill = saveableSkills.find(s => s.skillId === skillId); if (skill) { setSelectedSkills([...selectedSkills, { skillId: skill.skillId, level: skill.level, tier: skill.tier, upgrades: skill.upgrades, }]); } } }; const handleConfirm = () => { // Clear and re-add selected memories store.clearMemories(); for (const memory of selectedSkills) { store.addMemory(memory); } onConfirm?.(); }; return ( Memory Slots ({selectedSkills.length}/{store.memorySlots})

Select skills to preserve in your memory. Saved skills will retain their level, tier, and upgrades in the next loop.

{/* Selected Skills */} {selectedSkills.length > 0 && (
Saved to Memory:
{selectedSkills.map((memory) => { const skillDef = SKILLS_DEF[memory.skillId]; return ( toggleSkill(memory.skillId)} > {skillDef?.name || memory.skillId} {' '}Lv.{memory.level} {memory.tier > 1 && ` T${memory.tier}`} {memory.upgrades.length > 0 && ` (${memory.upgrades.length}⭐)`} ); })}
)} {/* Available Skills */}
Skills to Save:
{saveableSkills.length === 0 ? (
No skills with progress to save
) : ( saveableSkills.map((skill) => { const isSelected = isSkillSelected(skill.skillId); const tierMult = getTierMultiplier(skill.tier > 1 ? `${skill.skillId}_t${skill.tier}` : skill.skillId); return (
toggleSkill(skill.skillId)} >
{skill.name} {skill.tier > 1 && ( Tier {skill.tier} ({tierMult}x) )}
Lv.{skill.level} {skill.upgrades.length > 0 && ( {skill.upgrades.length} )}
{skill.upgrades.length > 0 && (
Upgrades: {skill.upgrades.length} selected
)}
); }) )}
{/* Confirm Button */}
); }