narrativelisted
Install: claude install-skill snwlee/Nereus
# narrative
nereus:common 규칙을 따른다. 담당 에이전트: narrative-writer.
**엔진과 무관하다** — Yarn Spinner 는 엔진 불가지론이고 런타임이 따로 있다.
## 1. 대사는 텍스트 파일이다
대사를 코드나 에디터 데이터에 묻으면 diff 가 안 되고 리뷰도 테스트도 안 된다.
`.yarn` 파일로 두면 **평범한 코드처럼** 다룰 수 있다 — 이게 이 스킬의 유일한 전제다.
```yarn
title: Intro
---
상인: 처음 보는 얼굴이군.
-> 물건을 보여줘
<<jump Shop>>
-> 아무것도 아니야
<<jump Leave>>
===
```
- 노드 하나 = 한 장면. 노드가 100줄을 넘으면 쪼갠다.
- 파일은 챕터·지역 단위로 나눈다. 한 파일에 전부 넣지 않는다.
## 2. 분기 설계
분기는 **되돌아오는 곳을 먼저 정하고** 만든다. 합류점 없는 분기는 분기 수만큼 콘텐츠를 곱한다.
| 분기 종류 | 쓸 때 | 비용 |
|---|---|---|
| 즉시 합류 | 말투·톤 선택 | 낮음. 자주 써도 된다 |
| 지연 합류 | 한 장면 뒤 다시 만남 | 중간. 상태 플래그 하나 |
| 진짜 분기 | 엔딩·진영 | 높음. 개수를 먼저 정하고 늘리지 않는다 |
플래그를 남발하면 조합 폭발이 난다. 플래그 하나를 추가할 때마다 **검증할 경우의 수가 두 배**가 된다는 것을 전제로 센다.
## 3. 게임 상태와의 결합을 최소화한다
대사가 게임 상태를 직접 바꾸면 대사 수정이 게임 로직 수정이 된다.
대사는 **신호만 내보내고**, 상태 변경은 게임 쪽이 받아서 한다.
- 좋음: 대사가 `퀘스트_수락` 이벤트를 낸다 → 게임이 받아 처리
- 나쁨: 대사 안에서 인벤토리를 직접 조작
## 4. 현지화 대비
- 문자열을 코드에 박지 않는다. 처음부터 `.yarn` 과 문자열 테이블에 둔다.
- 문장을 조각으로 이어 붙이지 않는다("당신은 " + N + "개를 얻었다"). 어순이 다른 언어에서 깨진다.
자리표시자를 가진 온전한 문장 하나로 둔다.
- 길이 여유를 UI 에 미리 둔다. 같은 문장이 언어에 따라 1.5배까지 길어진다.
## 5. 검증
- 모든 노드에 도달 가능한가. 고아 노드는 쓴 사람만 모른다
- 모든 분기가 합류하거나 명시적 종료에 닿는가
- 참조하는 플래그·변수가 실제로 정의돼 있는가
- 화자 이름이 일관된가
이 넷은 기계로 검사할 수 있다. `.yarn` 이 텍스트이기 때문에 가능한 것이다.
## 하지 말 것
- 대사를 엔진 에디터 안에만 두지 않는다.
- 합류점 없는 분기를 늘리지 않는다.
- 문장을 조각내어 이어 붙이지 않는다.