impactlisted
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` 목록이다.
**도메인별 초록의 합은 게임의 초록이 아니다.** 사운드 검사는 "