/** 上上下下左右左右 B A B A */ export const KONAMI_SEQUENCE = [ "ArrowUp", "ArrowUp", "ArrowDown", "ArrowDown", "ArrowLeft", "ArrowRight", "ArrowLeft", "ArrowRight", "b", "a", "b", "a", ] as const; function normalizeKey(key: string): string { return key.length === 1 ? key.toLowerCase() : key; } export function subscribeKonamiCode(onMatch: () => void): () => void { let position = 0; const onKeyDown = (event: KeyboardEvent) => { const key = normalizeKey(event.key); const expected = KONAMI_SEQUENCE[position]; if (key === expected) { position += 1; if (position >= KONAMI_SEQUENCE.length) { position = 0; onMatch(); } return; } position = key === KONAMI_SEQUENCE[0] ? 1 : 0; }; window.addEventListener("keydown", onKeyDown); return () => window.removeEventListener("keydown", onKeyDown); }