跳到主要内容

OUR GROUP
색상반전 아이콘

反转颜色

화면 확대 아이콘

放大

화면 축소 아이콘

缩小

100

모든 절망을 제로(0)로

선택이 이끄는 카오스 루프 RPG 카오스 제로 나이트메어

심연을 품은 세계, 그리고 기억에 새겨지는 어둠의 서사.

'어느 날, 예고도 없이 들이닥친 우주적 재앙'
검은 안개로 행성을 뒤덮으며 환경과 생태의
급격한 변화를 야기하는 재앙 '카오스'

모든 이야기의 시작, 혹은 마지막

극한의 스트레스
붕괴하는 요원들

끝없이 다가오는
위기를 돌파하며

한층 더 리얼한
다크판타지를 느껴보세요.

무한한 선택으로
매번 새로워지는 플레이!

매번 달라지는 변수 속에서
나만의 전략을 설계하고

더 깊고, 더 치밀한 전투를
직접 경험해보세요!

한눈에 시선을 사로잡는
애니메이션 연출

그리고 마음 깊이
스며드는 캐릭터

우리의 운명이 만나는
곳에서​ 뜨거운 전투와
눈부신 일상까지

그 모든 여정을 함께하세요.

나이트메어호에 승선하신 것을 환영합니다. 퍼스트!

GO TO WEBSITE

INDEX

Soundtrack - Star Light Island

/* ========================================================= Game 페이지 키보드 포커스 흐름 패치 (ES5 즉시실행) ... ========================================================= */ (function () { // 페이지가 게임 상세가 아니면 종료 function $(sel, root) { return (root || document).querySelector(sel); } function $all(sel, root) { return (root || document).querySelectorAll(sel); } function ensureTabbable(el) { if (!el) return el; var n = el.nodeName.toLowerCase(); var native = (n === "a" && el.hasAttribute("href")) || n === "button" || n === "input" || n === "select" || n === "textarea"; if (!native && !el.hasAttribute("tabindex")) el.setAttribute("tabindex", "0"); return el; } function isGamePage() { return !!$(".game_nav_wrapper"); } if (!isGamePage()) return; // 공통 이동 function goSkip() { var s = getNodes().skipLink; if (s) { ensureTabbable(s); try { s.focus(); } catch (_) {} } } // 본문 루트 후보(gnb 스크립트가 포커스를 주는 대상과 동일 계열) function getContentRoot() { return ( document.querySelector("[data-scroll-container]") || document.querySelector(".locomotive") || document.querySelector(".locomotive_inner") || document.querySelector("#main") || document.querySelector("#content") || document.querySelector("main") || null ); } // 노드 캐시 function getNodes() { return { skipLink: $(".skip-nav a"), content: getContentRoot(), sound: $("#sound"), // game_sound 토글 대상 website: $(".website_anchor"), navName: $(".game_nav_name"), navList: $(".game_nav_list"), navWrapper: $(".game_nav"), navItems: $all(".game_nav_list .nav_list_item a"), infoWrap: $(".game_section_info"), infoLinks: $all(".game_section_info a[href]"), gameSound: $("#game_sound"), }; } function getNavFocusables() { var n = getNodes(); if (!n.navList) return []; return n.navList.querySelectorAll( 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])' ); } // nav 리스트 열고/닫기(높이 기반, game.js 호버 동작을 키보드로 재현) function openNavList() { var n = getNodes(); if (!n.navList) return; var prev = n.navList.style.height; n.navList.style.height = "auto"; var h = n.navList.getBoundingClientRect().height; n.navList.style.height = prev || "0px"; n.navList.style.height = h + "px"; } function closeNavList() { var n = getNodes(); if (n.navList) n.navList.style.height = "0px"; } // 1) 본문 루트에 포커스가 들어오면 → #sound로 강제 이관 (레이스 완전 차단) var redirectedOnceFlag = false; function moveFocusToSoundChain() { var n = getNodes(); var first = n.sound || n.website || n.navName; if (!first) return false; ensureTabbable(first); first.focus(); return document.activeElement === first; } document.addEventListener( "focusin", function (e) { var n = getNodes(); if (!n.content) return; if (e.target === n.content && !redirectedOnceFlag) { redirectedOnceFlag = true; setTimeout(function () { moveFocusToSoundChain(); setTimeout(function () { redirectedOnceFlag = false; }, 600); }, 0); } }, true ); var __soundClickGuard = false; function triggerSoundToggle() { var n = getNodes(); if (!n.sound || __soundClickGuard) return; __soundClickGuard = true; // game.js의 위임 클릭을 1회만 발생 if (typeof n.sound.click === "function") n.sound.click(); else if (window.jQuery) window.jQuery(n.sound).trigger("click"); // 아주 짧게 가드 유지 후 해제 (같은 키 입력으로 생길 수 있는 추가 click 무시) setTimeout(function () { __soundClickGuard = false; }, 50); } // 2) #sound → website_anchor → nav_name(열기) → nav_items 순회 function bindLinearFlow() { var n = getNodes(); if (n.gameSound) { ensureTabbable(n.gameSound); n.gameSound.addEventListener("keydown", function (e) { var isEnter = e.key === "Enter" || e.keyCode === 13; var isSpace = e.key === " " || e.key === "Spacebar" || e.keyCode === 32; if (isEnter || isSpace) { e.preventDefault(); e.stopPropagation(); triggerSoundToggle(); } }); } // sound (#sound) 에서 Enter/Space → 토글, Tab → website_anchor (없으면 nav_name) // (둘 다 없으면 info 첫 링크 → 없으면 skip-nav) if (n.sound) { ensureTabbable(n.sound); n.sound.addEventListener("keydown", function (e) { var isEnter = e.key === "Enter" || e.keyCode === 13; var isSpace = e.key === " " || e.key === "Spacebar" || e.keyCode === 32; if (isEnter || isSpace) { e.preventDefault(); e.stopPropagation(); triggerSoundToggle(); return; } if (e.key === "Tab" && !e.shiftKey) { var to = getNodes().website || getNodes().navName; if (to) { e.preventDefault(); ensureTabbable(to); to.focus(); } else { var info = getNodes().infoLinks; if (info && info.length) { e.preventDefault(); closeNavList(); ensureTabbable(info[0]); info[0].focus(); } else { // game_info 자체가 없으면 즉시 skip-nav e.preventDefault(); goSkip(); } } } }); } // website_anchor ↔ sound / nav_name if (n.website) { ensureTabbable(n.website); n.website.addEventListener("keydown", function (e) { if (e.key === "Tab" && !e.shiftKey) { var to = getNodes().navName; if (to) { e.preventDefault(); openNavList(); ensureTabbable(to); to.focus(); } } else if (e.key === "Tab" && e.shiftKey) { var back = getNodes().sound; if (back) { e.preventDefault(); ensureTabbable(back); back.focus(); } } }); } // nav_name 포커스 시 목록 열기, Tab → 첫 nav item if (n.navName) { ensureTabbable(n.navName); n.navName.addEventListener("focus", function () { openNavList(); }); n.navName.addEventListener("keydown", function (e) { if (e.key === "Enter" || e.keyCode === 13) openNavList(); if (e.key === "Tab" && !e.shiftKey) { var items = getNodes().navItems; if (items && items.length) { e.preventDefault(); ensureTabbable(items[0]); items[0].focus(); } } else if (e.key === "Tab" && e.shiftKey) { var back = getNodes().website || getNodes().sound; if (back) { e.preventDefault(); closeNavList(); ensureTabbable(back); back.focus(); } } }); } // nav items: 첫 아이템 Shift+Tab ← nav_name, 마지막 → info 첫 링크 (없으면 skip-nav) var items = n.navItems; if (items && items.length) { var first = items[0]; var last = items[items.length - 1]; first.addEventListener("keydown", function (e) { if (e.key === "Tab" && e.shiftKey) { e.preventDefault(); var back = getNodes().navName || getNodes().website || getNodes().sound; if (back) { ensureTabbable(back); back.focus(); } } }); last.addEventListener("keydown", function (e) { if (e.key === "Tab" && !e.shiftKey) { var info = getNodes().infoLinks; if (info && info.length) { e.preventDefault(); closeNavList(); ensureTabbable(info[0]); info[0].focus(); } else { // nav 마지막인데 game_info 없으면 skip-nav e.preventDefault(); closeNavList(); goSkip(); } } }); } // 추가 보강: 네비 내부 '마지막 포커스'에서 Tab 시 강제 탈출 if (n.navList) { n.navList.addEventListener("keydown", function (e) { if (e.key === "Tab" && !e.shiftKey) { var navFocusables = getNavFocusables(); if ( navFocusables.length && document.activeElement === navFocusables[navFocusables.length - 1] ) { var infoFirst = getNodes().infoLinks && getNodes().infoLinks[0]; if (infoFirst) { e.preventDefault(); closeNavList(); infoFirst.focus(); } else { e.preventDefault(); closeNavList(); goSkip(); } } } }); } } // 3) game_info a들 순회 후 → skip-nav 복귀 function bindInfoFlow() { var n = getNodes(); var links = n.infoLinks; // game_info에 링크가 없으면 바로 skip-nav로 if (!links || !links.length) { goSkip(); return; } // 첫 링크 Shift+Tab → nav_items 마지막 links[0].addEventListener("keydown", function (e) { if (e.key === "Tab" && e.shiftKey) { var items = getNodes().navItems; if (items && items.length) { e.preventDefault(); ensureTabbable(items[items.length - 1]); items[items.length - 1].focus(); } } }); // 마지막 링크 Tab → skip-nav links[links.length - 1].addEventListener("keydown", function (e) { if (e.key === "Tab" && !e.shiftKey) { e.preventDefault(); goSkip(); } }); } // DOM 변경 대비: 네비/정보 영역에 변경이 생기면 재바인딩 var _navObserver, _infoObserver; function observeAndRebind() { var n = getNodes(); if (n.navList && !_navObserver) { _navObserver = new MutationObserver(function () { bindLinearFlow(); }); _navObserver.observe(n.navList, { childList: true, subtree: true, attributes: false, }); } if (n.infoWrap && !_infoObserver) { _infoObserver = new MutationObserver(function () { bindInfoFlow(); }); _infoObserver.observe(n.infoWrap, { childList: true, subtree: true, attributes: false, }); } } // 4) DOM 준비 후 바인딩 function ready(fn) { if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", fn); else setTimeout(fn, 0); } ready(function () { closeNavList(); bindLinearFlow(); bindInfoFlow(); observeAndRebind(); }); })(); -->