Installs into .claude/skills of the current project.
Sponsors
SSkills DirectorySkills Directory
Is that skill safe to install?
SSkills DirectorySkills Directory
Know which skills are safe — weekly.
Are you the author of Impact?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/snwlee-impact)
---
name: impact
description: 타격감·게임필 — 히트스톱·화면 흔들림·파티클 예산과 소리/이펙트 동기를 수치로 판정한다. 트리거 "타격감", "임팩트", "히트스톱", "화면 흔들림", "파티클", "연출", "game feel".
---
# 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` 목록이다.
**도메인별 초록의 합은 게임의 초록이 아니다.** 사운드 검사는 "선언된 큐가 예산 안"이라 하고
임팩트 검사는 "이펙트가 예산 안"이라 하는데, 둘이 서로를 안 보면 **소리 없이 터지는 이펙트**를
아무도 못 잡는다. 이펙트만 있고 소리가 없는 타격은 절반만 만든 연출이다.
`soundCues` 를 주지 않으면 그 항목만 `unmeasured` 에 `sound-cross-check` 로 남고
예산 항목은 그대로 판정한다 — 사운드 계획이 아직 없다고 임팩트 검사가 통째로 꺼지지 않는다.
## 4. 위반 코드
| 코드 | 뜻 |
|---|---|
| `no-baseline` | 장르 프로파일에 `impact` 기준이 없다 (다른 검사를 하지 않는다) |
| `hitstop-budget` | 초당 누적 정지 시간이 예산을 넘는다 |
| `shake-amplitude` | 동시 활성 셰이크 진폭의 합이 상한을 넘는다 |
| `particle-budget` | 파티클 동시 수가 상한을 넘는다 |
| `input-buffer` | 입력 버퍼가 장르 하한 미만이다 |
| `single-channel` | 그 큐가 시각·청각·촉각 중 한 층만 갖는다 |
| `no-reduced-motion` | 셰이크를 쓰는데 모션 감소 대체 선언이 없다 |
| `sound-missing` | 참조한 사운드 큐가 없거나 `sound` 선언 자체가 없다 |
기준은 장르 프로파일의 `impact` 키에서 온다 — 스킬 안에 수치를 박지 않는다.
오비는 점프 입력이 애니메이션 중에 들어오므로 버퍼가 가장 길고, PvP 는 타격이 잦아 정지 예산이 크다.
## 5. 피드백은 두 층 이상이다
한 층만 쓰면 그 감각을 못 쓰는 환경에서 피드백이 통째로 사라진다.
소리를 끈 플레이어, 진동이 없는 기기, 화면을 못 보는 순간이 전부 그렇다.
`gameux` 의 "색만으로 상태를 구분하지 않는다"와 같은 원리다.
## 하지 말 것
- 히트스톱을 개별 길이만 보고 정하지 않는다. 누적이 실제로 느껴지는 값이다.
- 셰이크를 강하게 잡고 "설정에서 끄면 된다"로 넘기지 않는다. 기본값이 대부분의 경험이다.
- 이펙트를 먼저 만들고 소리를 나중에 붙이지 않는다. 교차 검증이 막는다.