← ClaudeAtlas

impactlisted

타격감·게임필 — 히트스톱·화면 흔들림·파티클 예산과 소리/이펙트 동기를 수치로 판정한다. 트리거 "타격감", "임팩트", "히트스톱", "화면 흔들림", "파티클", "연출", "game feel".
snwlee/Nereus · ★ 2 · AI & Automation · score 75
Install: claude install-skill snwlee/Nereus
# impact nereus:common 규칙을 따른다. 담당 에이전트: game-ux. **엔진과 무관하다** — 히트스톱·셰이크·파티클 예산은 어느 엔진에서도 같은 축이다. ## 0. gameux 와의 경계 | | 담당 | |---|---| | UI·HUD·포커스 경로·안전영역·입력 장치 | `nereus-game:gameux` | | 입력 지연·입력 버퍼 같은 **입력 타이밍** | `gameux` (여기서도 버퍼 하한을 게이트로 본다) | | 히트스톱·셰이크·파티클·타격 연출·소리 동기 | 여기 | 합치지 않는 이유: `gameux` 의 축은 **읽히는가**이고 impact 의 축은 **느껴지는가**다. 한 체크리스트에 섞으면 둘 다 흐려진다. ## 1. 왜 수치인가 "타격감이 좋다/나쁘다"는 판정이 아니다. 판정이 아니면 회귀 테스트도 게이트도 성립하지 않는다. 그래서 전부 수치로 받는다. 그리고 두 가지는 개별 값이 아니라 **합**으로 본다. - **히트스톱은 누적으로 본다.** 한 번 80ms 는 문제가 아니다. 초당 여러 번 걸려 누적 정지 시간이 길어지면 게임이 "끊긴다"고 느껴진다. 개별 값만 보면 이 상태를 놓친다. - **셰이크는 동시 진폭의 합으로 본다.** 각각 0.4 인 셰이크 셋이 겹치면 1.2 다. 트리거가 겹칠 수 있다면 겹친 상태가 실제 상태다. ## 2. 계획을 JSON 으로 적는다 ```json { "maxParticles": 300, "inputBufferMs": 120, "cues": [ { "name": "hit", "visual": true, "sound": "swing", "haptic": true, "hitstopMs": 60, "hitsPerSecond": 1.5, "shake": { "amplitude": 0.4, "concurrent": true }, "reducedMotion": "셰이크 대신 1프레임 화이트 플래시" } ] } ``` - `sound` 는 **사운드 계획의 큐 이름**이다. 아래 교차 검증이 이것을 본다. - `shake.concurrent` 가 `true` 면 다른 셰이크와 동시에 활성될 수 있다는 뜻이고, 진폭 합에 들어간다. - `reducedMotion` 은 셰이크를 쓰면 **필수**다. 문장으로 "끌 수 있게 한다"고 적는 것은 게이트가 아니다. ## 3. 소리 교차 검증이 이 스킬의 핵심이다 ```bash echo '{"genre":"battle-pvp","plan":{...},"soundCues":["swing","land"]}' \ | node "${CLAUDE_PLUGIN_ROOT}/lib/impact-budget.mjs" ``` `soundCues` 는 `nereus-game:sound` 계획의 `cues[].name` 목록이다. **도메인별 초록의 합은 게임의 초록이 아니다.** 사운드 검사는 "