'use client'; import { useState, useEffect, useMemo } from 'react'; import { useInventoryStore } from '@/store/useInventoryStore'; import styles from '../../styles/Characters.module.css'; type Character = { idx: number; name: string; iconFilePath: string; }; const getIconUrl = (iconFilePath: string) => { const fileName = iconFilePath.split('/').pop()?.split('.')[0]; return `/icons/character-icons/${fileName}.png`; }; type RoleFilter = 'all' | 'survivors' | 'killers'; const isKiller = (idx: number) => idx >= 268435456; export default function CharactersPage() { const store = useInventoryStore(); const [characters, setCharacters] = useState([]); const [search, setSearch] = useState(''); const [role, setRole] = useState('all'); useEffect(() => { fetch('/data/characters.json') .then(r => r.json()) .then(setCharacters) .catch(() => []); }, []); const filtered = useMemo(() => { return characters.filter(c => { if (role === 'survivors' && isKiller(c.idx)) return false; if (role === 'killers' && !isKiller(c.idx)) return false; if (search.trim() && !c.name.toLowerCase().includes(search.toLowerCase())) return false; return true; }); }, [characters, search, role]); const handleToggle = (idx: number) => { store.toggleItem(idx.toString(), 'characters'); }; const handleUnlockAll = () => { const ids = filtered.map(c => c.idx.toString()); const outside = store.unlockedCharacters.filter( id => !filtered.some(c => c.idx.toString() === id) ); store.unlockAllInCategory('characters', [...outside, ...ids]); }; const handleLockAll = () => { const ids = filtered.map(c => c.idx.toString()); const newUnlocked = store.unlockedCharacters.filter(id => !ids.includes(id)); store.unlockAllInCategory('characters', newUnlocked); }; const handleClear = () => { store.clearCategory('characters'); }; const unlockedCount = store.unlockedCharacters.length; return (

Characters

{unlockedCount} of {characters.length} unlocked

setSearch(e.target.value)} />
{(['all', 'survivors', 'killers'] as RoleFilter[]).map(r => ( ))}
{filtered.length} shown
{filtered.length === 0 ? (
No characters match
) : (
{filtered.map(char => { const unlocked = store.unlockedCharacters.includes(char.idx.toString()); const killer = isKiller(char.idx); return (
handleToggle(char.idx)} > {char.name} {char.name} {killer ? 'Killer' : 'Survivor'}
); })}
)}
) }