# KeyRota: 고급 로테이션(KRC) 문서

출처: https://keyrota.app/documentation/ko/advanced (업데이트: 2026. 10. 18.). JSON Schema: https://keyrota.app/documentation/keyrota-rotation.schema.json. AI 에이전트용 색인: https://keyrota.app/documentation/llms.txt.

---

<!-- https://keyrota.app/documentation/ko/advanced -->

## 고급 로테이션(KRC)

> [!TIP] 로테이션은 AI 에이전트로 만드는 것을 권장합니다
> 직접 하나하나 설정하는 것보다 훨씬 빠르고 편리합니다. AI 에이전트의 성능이 좋을수록 첫 시도부터 요구 사항에 더 가까운 로테이션이 나옵니다. Anthropic과 OpenAI의 최신 모델을 추론 수준 “Extra (xhigh)”로 사용하는 것을 권장합니다. 방법은 [AI 에이전트로 만들기](https://keyrota.app/documentation/ko/ai)를 참고하세요.

고급 로테이션은 어떤 기술을 언제 누를지 직접 정한 규칙 목록입니다. KeyRota는 전투 중에 규칙을 확인하고 조건에 맞는 첫 번째 버튼을 누릅니다. 이러한 로테이션의 형식과 엔진을 **KRC**(KeyRota Customization)라고 합니다.

### 기본 또는 고급

| | Blizzard(기본) | 고급(KRC) |
|---|---|---|
| 버튼을 고르는 주체 | 게임: Blizzard의 추천 | 내 규칙 |
| 설정 | 필요 없음 | 슬롯, 오라, 규칙: 빌더에서 또는 파일로 |
| 전문화 | 모든 딜러(근접 및 원거리 DPS)와 탱커 전문화 | 로테이션을 작성한 전문화 |
| Burst와 대상 모드 | 사용하지 않음 | “Burst” 버튼과 “대상” 버튼. 의미는 규칙이 정합니다 |
| 이럴 때 선택 | 어떤 캐릭터로든 바로 시작하고 싶을 때 | 정확한 우선순위가 필요할 때: DoT, 자원 모으기, 버스트 구간에 맞춘 재사용 대기시간 기술, 다중 대상용 나만의 로직 |

앱의 “로테이션” 블록에서는 Blizzard 프로필이 맨 위에 있고, 직접 만든 로테이션은 그 아래 “내 로테이션” 그룹에 있습니다. 로테이션이 중지된 상태라면 언제든 전환할 수 있습니다.

### 로테이션의 구성 요소

| 구성 요소 | 설명 | 개수 |
|---|---|---|
| **슬롯** | 로테이션의 버튼입니다. 로테이션의 슬롯 N은 Better Assistant 프로필의 슬롯 N입니다. | 최대 12개 |
| **오라** | 주문 ID로 지정하는 내 강화 효과와 대상에게 건 내 약화 효과입니다. 로테이션의 오라 N은 Better Assistant 목록의 오라 N입니다. | 최대 12개 |
| **자원** | 플레이어와 대상의 생명력, 그리고 전문화 자원(기력, 연계 점수, 분노, 마나 등)입니다. 모든 값은 백분율입니다. | 전문화마다 다름 |
| **전투** | 주변 적 수와 대상과의 거리입니다. | 2개 |
| **스위치** | 빠른 설정 패널의 버튼입니다: 대상 모드(규칙에서는 `aoe`와 `st` 두 가지 플래그), Burst, 치유 / 방어, 지면 지정, 이동. | 6개 |
| **규칙** | 어떤 슬롯을 어떤 조건에서 누를지 정합니다. 규칙의 순서가 곧 우선순위입니다. | 제한 없음 |

규칙은 조건 그룹으로 이루어집니다. 그룹 중 **하나라도** 충족되면 규칙이 충족되고(OR), 그룹은 **모든** 조건이 충족되어야 충족됩니다(AND). 그룹이 없는 규칙은 항상 충족됩니다.

*KRC 텍스트:*

```text
use Envenom when  # 독살
	Combo_Points >= 70 and Envenom_Buff.down  # 연계 점수 5 이상, 효과 없음
	or
	Combo_Points >= 70 and Energy >= 70  # 연계 점수 5 이상, 기력 충분
```

*JSON:*

```json
{
  "use": "Envenom",
  "name": "독살",
  "when": [
    {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "연계 점수 5 이상, 효과 없음"},
    {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "연계 점수 5 이상, 기력 충분"}
  ]
}
```


이 규칙은 이렇게 읽습니다. “연계 점수가 5 이상이고 독살 효과가 없으면, **또는** 연계 점수가 5 이상이고 기력이 70% 이상이면 독살을 누른다.” 연계 점수 5가 왜 `70`인지는 [자원](https://keyrota.app/documentation/ko/conditions#resources)에서 설명합니다.

### KeyRota가 버튼을 고르는 방식

1. 규칙은 목록 순서대로 **위에서 아래로** 확인합니다.
2. 규칙마다 그룹을 확인합니다. 충족된 그룹이 없으면 KeyRota는 다음 규칙으로 넘어갑니다.
3. 규칙이 충족되었더라도 지금 그 주문을 **사용할 수 없으면**(재사용 대기 중, 자원 부족, 대상이 너무 멂, 대상 없음, 배우지 않은 주문) 역시 다음 규칙으로 넘어갑니다. 슬롯 자체가 준비되었는지는 조건으로 확인할 필요가 없습니다.
4. 충족되었고 주문을 사용할 수 있는 첫 번째 규칙이 **선택**됩니다. 전역 재사용 대기시간(GCD)은 선택을 바꾸지 않습니다. GCD가 끝나기를 기다리는 규칙은 계속 선택된 상태로 남고, 그 아래 규칙이 앞지르지 않습니다.
5. 맞는 규칙이 없을 때: “기본 아이콘 무시”가 켜져 있으면 KeyRota는 기다리고, 꺼져 있으면 게임 추천을 누릅니다.

기다리는 것은 정상입니다. 예를 들어 기력을 모으는 로테이션은 위쪽 규칙에 필요한 기력이 찰 때까지 0.5–1초 동안 아무것도 누르지 않는 경우가 많습니다.

### 알 수 없는 값은 규칙을 허용하지 않습니다

KeyRota가 값을 모를 때가 있습니다. 오라를 읽지 못했거나(Better Assistant 프로필에 해당 ID가 없음), 대상이 없거나(대상의 생명력과 거리를 알 수 없음), 적 수를 세지 못한 경우입니다. 알 수 없는 값을 읽는 조건은 **거짓**입니다. `X.up`과 `X.down`, `TargetHP >= 50`과 `TargetHP < 50` 모두 마찬가지입니다. 알 수 없는 값은 규칙을 막을 수만 있고 허용할 수는 없습니다. 엉뚱한 기술을 누르는 것보다 한 번 건너뛰는 편이 낫기 때문입니다.

> [!TIP]
> 규칙이 한 번도 실행되지 않는다면 먼저 그 규칙이 읽는 모든 오라가 올바른 ID로 Better Assistant 프로필에 들어 있는지 확인하세요. 자세한 내용은 [FAQ 및 문제 해결](https://keyrota.app/documentation/ko/faq#never-fires)을 참고하세요.

### 버튼을 누르는 시점

- **일반 주문**(GCD를 사용하는 주문)은 GCD가 끝나기 직전, 주문 대기열 구간에 누릅니다. 게임은 GCD가 끝나는 즉시 그 주문을 시전합니다.
- **슬롯 플래그**는 이 동작을 바꿉니다: “수동 전용 (M)”, “정신 집중 (C)”, “GCD 무관 (O)”, “주문 대기열 구간 (Q)”. 각 플래그의 기능과 조합 방법은 [슬롯 플래그](https://keyrota.app/documentation/ko/rotation-json#flags)를 참고하세요.
- **정신 집중.** 정신 집중이 이어지는 동안 KeyRota는 정신 집중을 끊지 않도록 아무것도 누르지 않습니다. **시전** 중에는 주문 대기열 구간만 남을 때까지 기다립니다.
- **직접 누르는 키.** 기술 키를 직접 누르면 KeyRota는 한발 물러나며 사용자와 경쟁하지 않습니다.

### 빠른 시작

KeyRota를 아직 설치하지 않았다면 [처음 시작하기](https://keyrota.app/documentation/ko/start)부터 진행하세요.

1. KeyRota에서 “로테이션 — 새로 만들기 — 빌더에서…”를 엽니다.
2. “일반” 페이지에서 전문화를 고르고 로테이션 이름을 정합니다.
3. “슬롯” 페이지에서 버튼과 주문 ID를 추가하고, “오라” 페이지에서 규칙이 읽을 강화 효과와 약화 효과를 추가합니다.
4. “규칙” 페이지에서 우선순위 순서대로 규칙을 추가합니다.
5. “일반” 페이지에서 “슬롯과 오라로 만들기”를 클릭한 다음 “복사”를 클릭합니다. 게임에서: `/ba` — **Profile** 탭 — 문자열 붙여넣기 — **Apply**.
6. 슬롯의 주문을 행동 단축바에 올리고 키를 지정합니다(`#showtooltip` 매크로도 됩니다).
7. “저장”을 클릭하고 목록에서 프로필을 선택한 다음 F1 키(macOS에서는 ⌃⇧Space)를 눌러 로테이션을 시작합니다.

모든 버튼에 대한 설명과 단계별 예시는 [로테이션 빌더](https://keyrota.app/documentation/ko/editor)에 있습니다.

### 이 섹션의 내용

- [로테이션 빌더](https://keyrota.app/documentation/ko/editor) — 창의 모든 페이지와 버튼, 그리고 단계별로 만들어 보는 로테이션.
- [로테이션 JSON](https://keyrota.app/documentation/ko/rotation-json) — 형식의 모든 필드, 슬롯 플래그, 이름, 제한, 오류, KRC 텍스트.
- [조건](https://keyrota.app/documentation/ko/conditions) — 모든 조건 종류, 연산자, 백분율, 알 수 없는 값.
- [패턴 예시](https://keyrota.app/documentation/ko/patterns) — DoT, 자원 모으기, 생성기와 소모 기술, 광역, Burst, 방어 기술 등의 템플릿.
- [AI 에이전트로 만들기](https://keyrota.app/documentation/ko/ai) — 프롬프트 템플릿, 로그 분석, 결과 확인.
- [FAQ 및 문제 해결](https://keyrota.app/documentation/ko/faq) — 규칙이 실행되지 않거나, 너무 이르거나 늦게 누르거나, 정신 집중을 끊는 이유.

---

<!-- https://keyrota.app/documentation/ko/editor -->

## 로테이션 빌더

로테이션 빌더는 고급 로테이션을 직접 타이핑하지 않고 조립하는 KeyRota 창입니다. 플래그가 있는 슬롯, 오라, 규칙을 다루며, KRC 텍스트와 JSON을 바로 옆에서 함께 볼 수 있습니다. 이 문서는 Windows와 macOS에 공통이며, 스크린숏은 Windows에서 찍었습니다. 스크린숏에는 [예시](https://keyrota.app/documentation/ko/patterns#example-files)의 암살 레이드 로테이션이 나옵니다.

### 빌더 열기

- **내 로테이션.** 메인 창의 “로테이션” 블록에서 프로필을 선택하고 “설정”을 클릭합니다.
- **새 로테이션.** “새로 만들기 — 빌더에서…”를 선택합니다. 전문화는 게임이나 현재 프로필에서 가져옵니다. 로테이션은 처음 저장할 때 프로필이 됩니다.
- **파일 또는 클립보드에서.** “새로 만들기 — 파일에서…”는 KRC 텍스트(`.txt`), 로테이션 JSON, KeyRota 프로필 파일을 받습니다. “새로 만들기 — 클립보드에서”는 같은 내용을 클립보드에서 가져옵니다. 새 프로필은 “설정”을 클릭해 빌더에서 엽니다.

![빌더의 새 로테이션: “일반” 페이지, 아직 슬롯과 규칙이 없음](https://keyrota.app/documentation/img/ko/editor-new.png)

**Blizzard 프로필**에서는 빌더에 이름과 입력 지연만 표시됩니다. 주 버튼은 게임이 고르기 때문입니다. “내 로테이션 만들기”를 클릭하면 고급 로테이션이 담긴 새 프로필이 만들어지고, Blizzard 프로필은 목록에 그대로 남습니다.

![빌더의 Blizzard 프로필: 프로필 이름, 입력 지연, “내 로테이션 만들기”](https://keyrota.app/documentation/img/ko/editor-blizzard.png)

#### 창 구성

- **왼쪽**에는 페이지 목록이 있습니다: “일반”, “슬롯”, “오라”, “규칙”(규칙 수 표시), “텍스트 및 JSON”. 그 위에 “내 로테이션”과 선택한 전문화가 표시됩니다.
- **오른쪽**에는 선택한 페이지가 표시됩니다.
- **아래쪽**은 상태 표시줄입니다. 로테이션이 정상인지(“로테이션 정상: 규칙 15개, 슬롯 11개, 오라 10개”), 저장하지 않은 변경 사항이 있는지 알려 주고, 오류가 있으면 오류 위치와 “보기” 버튼을 표시합니다. 오른쪽에는 “닫기”와 “저장”이 있습니다.

“저장”(Windows에서는 Ctrl+S도 가능)을 누르기 전에는 아무것도 적용되지 않습니다.

### 일반

![“일반” 페이지: 프로필, 전문화, 로테이션 이름, 기본 아이콘 무시, 입력 지연](https://keyrota.app/documentation/img/ko/editor-general.png)

| 컨트롤 | 기능 |
|---|---|
| **프로필 이름** | 메인 창의 로테이션 목록에 표시되는 프로필 이름입니다. |
| **전문화** | 로테이션의 자원(기력, 연계 점수, 분노 등)과 Better Assistant 프로필의 직업 및 전문화를 정합니다. 전문화를 바꾸면 자원도 바뀝니다. 단, 규칙이 이전 전문화의 자원을 읽고 있으면 바뀌지 않습니다(생명력은 해당하지 않음). |
| **로테이션 이름** | KRC 텍스트의 첫 줄(`rotation "…"`)이며 KeyRota 기록에 표시됩니다. 큰따옴표는 쓸 수 없습니다. 버전을 적어 두기 좋은 곳입니다: “암살 v1.3”. |
| **기본 아이콘 무시** | 켬: KeyRota는 규칙에 따라서만 누르고, 맞는 규칙이 없으면 기다립니다. 끔: 맞는 규칙이 없으면 게임 추천을 누릅니다. 내 로테이션에서는 보통 켜 둡니다. 기다리는 것(예: 기력 모으기)은 정상이기 때문입니다. |
| **입력 지연** | 사람처럼 매번 누르기 전에 잠시 멈춥니다: “없음”, “고정”(간격 0–1000ms), “무작위”(범위 0–1000ms). “차단과 방어에도 적용”을 켜면 차단과 방어 기술에도 같은 지연이 적용됩니다. |

![“일반” 페이지 아래쪽: Better Assistant 블록, 적 수 측정 반경, 전투 중인 적만, 설명](https://keyrota.app/documentation/img/ko/editor-general-ba.png)

| 컨트롤 | 기능 |
|---|---|
| **프로필: …** | Better Assistant 프로필 문자열의 요약입니다: 전문화, 주문 수, 오라 수. |
| **슬롯과 오라로 만들기** | 슬롯의 주문 ID, 각 슬롯의 “Better Assistant 표시 조건”, 순서대로 놓인 오라, 전문화, 반경, “전투 중인 적만” 설정으로 Better Assistant 프로필 문자열을 만듭니다. 같은 전문화의 프로필이 이미 붙여넣어져 있으면 그 프로필의 나머지 설정은 유지됩니다. |
| **클립보드에서** | 완성된 프로필 문자열을 붙여넣습니다. 프로필의 전문화가 로테이션의 전문화와 같아야 합니다. |
| **복사** | 게임에 붙여넣을 문자열을 복사합니다. |
| **적 수 측정 반경(미터)** | 1–100, 기본값 8. “주변 적 수” 조건(`enemies`)에 쓰입니다. |
| **전투 중인 적만** | 기본값은 켬입니다. 아직 전투에 들어오지 않은 적은 세지 않습니다. |
| **설명** | 로테이션 메모입니다. KRC 텍스트에서는 `#`으로 시작하는 줄이 됩니다. 로테이션 동작에는 영향을 주지 않습니다. |

버튼 아래에는 경고가 표시됩니다. 규칙에서 쓰는 슬롯 중 주문 ID가 없는 슬롯(Better Assistant 프로필에 들어가지 않음)과, 이미 붙여넣은 프로필에서 로테이션과 맞지 않는 부분을 알려 줍니다.

> [!IMPORTANT]
> Better Assistant 프로필의 오라는 첫 번째부터 빈칸 없이 이어져야 합니다. 오라 3에 ID가 없는데 오라 4에 ID가 있으면 프로필이 만들어지지 않습니다: “오라 3에 주문 번호가 없습니다”. ID를 채우거나 오라 번호를 다시 매기세요.

#### 게임에 Better Assistant 프로필 넣기

로테이션의 슬롯 N은 Better Assistant의 슬롯 N이고, 오라 N은 Better Assistant 목록의 오라 N입니다. 프로필 문자열은 슬롯과 오라를 올바른 순서로 Better Assistant에 넣습니다.

1. “일반” 페이지에서 “슬롯과 오라로 만들기”를 클릭한 다음 “복사”를 클릭합니다.
2. 게임에서 `/ba`를 입력하고 **Profile** 탭을 열어 문자열을 붙여넣은 뒤 **Apply**를 클릭하고 확인합니다.
3. 슬롯이나 오라를 바꿀 때마다(ID, 순서, 대상 있을 때 / 전투 중) 프로필을 다시 만들어 붙여넣습니다.

### 슬롯

![“슬롯” 페이지: 왼쪽에 12칸, 오른쪽에 선택한 슬롯 10 소멸(ID 1856)](https://keyrota.app/documentation/img/ko/editor-slots.png)

왼쪽에는 12칸이 있습니다. 각 칸에는 번호, 이름, 주문 ID, 플래그(“GCD 무관, 대기열”)가 표시되고, 어떤 규칙에서도 쓰지 않는 슬롯에는 “사용 안 함”이 표시됩니다. 빈 칸에는 “비어 있음”이 표시되며, 빈 칸을 선택하면 “슬롯 추가” 버튼이 나타납니다.

| 컨트롤 | 기능 |
|---|---|
| **이름** | 게임 속 주문 이름입니다. 규칙 목록과 기록에 표시됩니다. |
| **주문 ID** | Wowhead 링크의 숫자입니다. `wowhead.com/spell=1856/vanish`라면 `1856`입니다. Better Assistant는 이 번호로 주문을 이 슬롯에 넣습니다. |
| **Better Assistant 표시 조건** | “대상 있을 때” 또는 “전투 중”. 슬롯은 Better Assistant가 표시할 때만 준비된 것으로 봅니다. “전투 중”은 대상 없이도 작동해야 하는 치유와 방어 기술용입니다. |
| **누르는 방식** | 플래그 스위치 4개입니다. 아래 표를 참고하세요. |
| **텍스트 이름** | 규칙과 KRC 텍스트에서 쓰는 슬롯 이름입니다. 문자, 숫자, `_`만 쓸 수 있고 공백은 쓸 수 없습니다. |
| **주석** | 텍스트에서 선언 줄 끝에 붙는 주석입니다. |
| **사용하는 규칙** | 이 슬롯을 누르거나 읽는 규칙입니다. “슬롯 제거”는 어떤 규칙에서도 쓰지 않는 슬롯에서만 사용할 수 있습니다. |

KeyRota가 슬롯을 누르려면 그 주문이 게임의 행동 단축바에 있고 키가 지정되어 있어야 합니다. KeyRota는 행동 단축바에서 키를 가져옵니다. `#showtooltip 이름` 형식의 매크로도 됩니다. 키가 없는 슬롯은 절대 누르지 않습니다.

#### 누르는 방식: 플래그

![소멸 슬롯의 “누르는 방식” 스위치: “GCD 무관 (O)”와 “주문 대기열 구간 (Q)”가 켜져 있음](https://keyrota.app/documentation/img/ko/editor-slot-flags.png)

| 스위치 | 기능 | 사용 시점 |
|---|---|---|
| 플래그 없음 | 일반 주문처럼 누릅니다: 전역 재사용 대기시간이 끝날 무렵, 주문 대기열 구간에. | GCD를 쓰는 거의 모든 주문. |
| **수동 전용 (M)** | KeyRota는 이 슬롯을 절대 직접 누르지 않고 이 슬롯의 규칙을 건너뜁니다. 이 슬롯의 키를 직접 누르면 로테이션이 일시 정지됩니다. | 직접만 누르고 싶은 기술. |
| **정신 집중 (C)** | 이 주문의 정신 집중이 이어지는 동안 KeyRota는 아무것도 누르지 않으며 정신 집중을 끊지 않습니다. | 광기의 학살자 같은 정신 집중 주문. |
| **GCD 무관 (O)** | 전역 재사용 대기시간을 기다리지 않습니다. GCD 도중에도 바로 누릅니다. | 도박의 연속 같은 GCD 무관 주문. |
| **주문 대기열 구간 (Q)** | “GCD 무관”과 함께만 사용합니다. GCD가 끝나기 직전, 주문 대기열 구간에 누릅니다. | 둘째 줄이 GCD를 쓰는 매크로(아드레날린 촉진 + 광기의 학살자)와 직전 공격의 결과가 필요한 버튼(왕의 파멸 후 소멸). |

모든 플래그 조합과 JSON 표기는 [슬롯 플래그](https://keyrota.app/documentation/ko/rotation-json#flags)에 있습니다.

### 오라

![“오라” 페이지: 오라 1 “대상의 목조르기 [703]”, ID 703, 텍스트 이름 Garrote_DoT, 사용하는 규칙 3, 4, 5, 7, 8, 10](https://keyrota.app/documentation/img/ko/editor-auras.png)

오라는 규칙이 읽는 내 강화 효과와 대상에게 건 내 약화 효과입니다. 로테이션의 오라 N은 Better Assistant 목록의 오라 N입니다.

| 컨트롤 | 기능 |
|---|---|
| **이름** | 오라 이름이며 규칙에 표시됩니다. ID를 대괄호에 넣어 두면 편리합니다: “대상의 목조르기 [703]”. |
| **주문 ID** | Wowhead의 오라 번호입니다. Better Assistant는 내 강화 효과와 대상에게 건 내 약화 효과에서 이 오라를 찾습니다. |
| **텍스트 이름**, **주석** | 슬롯과 같습니다. |
| **사용하는 규칙** | 이 오라를 읽는 규칙입니다. “오라 제거”는 어떤 규칙에서도 쓰지 않는 오라에서만 사용할 수 있습니다. |

> [!NOTE]
> 오라의 ID와 그 오라를 거는 주문의 ID는 다를 수 있습니다. 소멸 주문은 `1856`이고 소멸로 받는 강화 효과는 `11327`입니다. 은신은 `1784`이고, 기만 특성이 있을 때의 은신은 `115191`입니다. Wowhead에서 강화 효과나 약화 효과 자체의 ID를 확인하세요.

**내** 오라만 보입니다. 내가 나에게 건 강화 효과와 내가 대상에게 건 약화 효과입니다. 다른 플레이어가 건 강화 효과나 대상에 걸린 다른 플레이어의 약화 효과는 규칙에서 보이지 않습니다.

### 규칙

![“규칙” 페이지: 왼쪽에 규칙 15개, 오른쪽에 규칙 4 죽음표식과 조건 그룹](https://keyrota.app/documentation/img/ko/editor-rules.png)

규칙은 위에서 아래로 확인합니다. KeyRota는 충족되었고 주문을 사용할 수 있는 첫 번째 규칙을 누릅니다. 사용할 수 없으면(재사용 대기시간, 자원, 사거리) 다음 규칙을 봅니다.

**목록 위의 도구 모음:**

| 버튼 | 기능 |
|---|---|
| **+** | 선택한 규칙 아래에 새 규칙을 만듭니다. 새 규칙은 첫 번째 슬롯을 누르며 아직 조건이 없습니다. |
| **복제** | 규칙의 복사본을 바로 아래에 만듭니다. |
| **휴지통** | 규칙을 삭제합니다. |
| **위로**, **아래로** | 규칙을 위로(먼저 확인) 또는 아래로(나중에 확인) 옮깁니다. |

목록의 각 규칙에는 번호(우선순위), 슬롯, 이름, 그룹 수가 표시됩니다. 오류가 있는 규칙에는 빨간 표시가 붙습니다.

**선택한 규칙:**

| 컨트롤 | 기능 |
|---|---|
| **누를 버튼** | 규칙이 충족되면 누를 슬롯입니다. |
| **이름** | 규칙이 실행되면 기록에 표시됩니다. |
| **설명** | KRC 텍스트에서 규칙 위에 붙는 메모입니다. |
| **누를 시점** | 조건 그룹입니다. 그룹 중 하나라도 충족되면 규칙이 충족되고(OR), 그룹은 모든 조건이 충족되어야 충족됩니다(AND). |

![파열 규칙의 조건 그룹: “또는”으로 나뉜 그룹 1과 그룹 2](https://keyrota.app/documentation/img/ko/editor-rule-groups.png)

각 그룹에는 “그룹 N”, “그룹 주석” 입력란, “그룹 복제”와 “그룹 삭제” 버튼이 있습니다. 조건 행은 **확인할 대상**, **속성**, **비교**, **숫자**로 이루어지며, X 표시를 클릭하면 조건이 제거됩니다. “+ 조건”은 그룹에 조건을 추가하고, “+ 그룹 (또는)”은 새 그룹을 추가합니다. 한 그룹에는 조건을 최대 16개, 한 규칙에는 그룹을 최대 16개까지 넣을 수 있으며, 한도에 이르면 버튼이 비활성화됩니다. 그룹이 없는 규칙에는 “조건 없음: 주문을 사용할 수 있으면 언제나 규칙이 실행됩니다.”가 표시됩니다.

| 확인할 대상 | 속성 | KRC 텍스트 |
|---|---|---|
| **오라**(로테이션의 각 오라) | 있음, 없음, 남은 시간(%), 중첩 | `Garrote_DoT.up`, `.down`, `.duration <= 30`, `.stacks >= 3` |
| **슬롯**(각 슬롯) | 준비됨, 재사용 대기 중, 재사용 대기시간(%), 충전 횟수, 강조됨, 강조 안 됨 | `Kingsbane.ready`, `.oncd`, `.cd <= 3`, `.charges >= 2`, `.glow`, `.noglow` |
| **자원** | 플레이어와 대상의 생명력, 전문화 자원, % | `PlayerHP <= 40`, `Energy >= 70` |
| **전투**: 주변 적 수 | 숫자 | `enemies >= 3` |
| **전투**: 대상과의 거리 | 미터 | `target.distance <= 8` |
| **빠른 설정 패널** | 켜짐, 꺼짐 | `aoe == 1`, `st == 1`, `cd == 1`, `defensives == 1`, `ground_spells == 1`, `movement == 1` |

비교 연산자는 `<`, `≤`, `=`, `≥`, `>`이고, 숫자는 0–100입니다. 새 조건은 첫 번째 오라의 “있음”으로 시작합니다. 확인할 대상을 바꾸면 속성과 숫자가 기본값으로 돌아갑니다(자원은 `≥ 50`, 적 수는 `≥ 2`, 거리는 `≤ 8`). 모든 조건의 자세한 설명은 [조건](https://keyrota.app/documentation/ko/conditions)에 있습니다.

### 오류와 상태 표시줄

![규칙 9의 오류: 조건이 없는 그룹 1이 빨간 테두리로 표시되고, 상태 표시줄에 “규칙 9, 그룹 1: 그룹에 조건이 없습니다”와 “보기”가 표시됨](https://keyrota.app/documentation/img/ko/editor-problem.png)

- **초록색**: “로테이션 정상: …” — 오류가 없으며 저장할 수 있습니다.
- **빨간색**은 오류 위치를 알려 줍니다: “규칙 9, 그룹 1: 그룹에 조건이 없습니다”. “보기”를 클릭하면 그 위치가 열립니다. 목록에서 해당 규칙에 표시가 붙고, 그룹은 빨간 테두리로 강조됩니다.
- 오류가 있는 로테이션은 저장되지 않습니다: “오류가 있는 로테이션은 저장되지 않습니다. 아래에 표시된 부분을 고치세요”.
- 로테이션이 실행 중일 때는 저장할 수 없습니다: “저장하려면 로테이션을 중지하세요”.

### 텍스트 및 JSON

![KRC 텍스트 모드의 “텍스트 및 JSON” 페이지: 설명과 buff1–buff7 선언이 있는 로테이션 텍스트의 시작 부분](https://keyrota.app/documentation/img/ko/editor-text.png)

![JSON 모드의 “텍스트 및 JSON” 페이지: format, version, title, specID, ignoreMainIcon, enemies, notes가 있는 로테이션 JSON의 시작 부분](https://keyrota.app/documentation/img/ko/editor-json.png)

| 컨트롤 | 기능 |
|---|---|
| **KRC 텍스트 / JSON** | 보기를 전환합니다. |
| **복사** | 텍스트 또는 JSON 전체를 복사합니다. |
| **붙여넣기** | 로테이션을 클립보드의 내용으로 바꿉니다: KRC 텍스트, 로테이션 JSON, KeyRota 프로필. |
| **열기…** | `.txt` 또는 `.json` 파일에서 로테이션을 불러옵니다. |
| **저장…** | 현재 보기를 파일로 저장합니다: 텍스트는 `.txt`, JSON은 `.json`. |

입력란에서 수정한 내용은 오류가 없으면 바로 적용됩니다. 오류가 있으면 입력란 아래에 표시되고, 다른 페이지는 마지막으로 정상이었던 버전을 유지합니다.

**텍스트에 담기는 것과 JSON에만 담기는 것.** KRC 텍스트에는 주문 ID, 슬롯 플래그, “대상 있을 때 / 전투 중”, 전문화, “기본 아이콘 무시”, 적 수 측정 설정이 없습니다. 텍스트를 수정하면 이 값들은 번호가 같은 슬롯과 오라에 그대로 남습니다. JSON에는 모든 것이 담깁니다. 로테이션의 새 버전을 붙여넣거나 열 때 새 버전에 이 값들이 없으면, 번호가 같은 슬롯과 오라는 기존 ID, 표시 조건, 플래그를 유지합니다.

### 저장하고 닫기

- “저장”(Windows에서는 Ctrl+S도 가능)은 로테이션을 프로필에 기록하며, 버튼에 잠시 “저장됨”이 표시됩니다. 새 로테이션은 프로필이 되고 목록에서 선택됩니다.
- 저장하지 않은 변경 사항이 있는 상태에서 창을 닫으면 “변경 사항을 저장할까요?”라고 묻습니다: “저장”, “저장 안 함”, “취소”. KeyRota를 닫을 때도 마찬가지입니다.
- 메인 창의 “내보내기”는 프로필을 로테이션과 함께 JSON으로 저장합니다. “가져오기”는 KeyRota 프로필과 로테이션 JSON만 담긴 파일을 모두 받습니다.

### 예시: 처음부터 만드는 로테이션

작은 암살 로테이션을 만들어 보겠습니다. DoT 2개(목조르기, 파열), 생성기(절단), 소모 기술(독살), 방어 기술(생명력 40% 이하에서 진홍색 약병), Burst 버튼에 묶은 재사용 대기시간 기술(죽음표식)로 구성합니다.

**1. 새 프로필.** 로테이션 — 새로 만들기 — 빌더에서….

**2. 일반.** 프로필 이름: “암살: 예시”. 전문화: 암살(자원은 `PlayerHP`, `TargetHP`, `Energy`, `Combo_Points`가 됩니다). 로테이션 이름: “암살: 예시 v1”. 기본 아이콘 무시: 켬.

**3. 슬롯.** 표의 행마다 왼쪽에서 칸을 선택하고 “슬롯 추가”를 클릭한 다음 “이름”, “주문 ID”, “텍스트 이름”을 입력합니다. 진홍색 약병은 “전투 중”을 선택합니다. 플래그는 필요 없습니다.

| 슬롯 | 이름 | ID | 텍스트 이름 | Better Assistant 표시 조건 |
|---|---|---|---|---|
| 1 | 목조르기 | 703 | `Garrote` | 대상 있을 때 |
| 2 | 파열 | 1943 | `Rupture` | 대상 있을 때 |
| 3 | 독살 | 32645 | `Envenom` | 대상 있을 때 |
| 4 | 절단 | 1329 | `Mutilate` | 대상 있을 때 |
| 5 | 죽음표식 | 360194 | `Deathmark` | 대상 있을 때 |
| 6 | 진홍색 약병 | 185311 | `Crimson_Vial` | 전투 중 |

**4. 오라.** “오라” 페이지에서도 똑같이 합니다:

| 오라 | 이름 | ID | 텍스트 이름 |
|---|---|---|---|
| 1 | 대상의 목조르기 [703] | 703 | `Garrote_DoT` |
| 2 | 대상의 파열 [1943] | 1943 | `Rupture_DoT` |
| 3 | 독살 [32645] | 32645 | `Envenom_Buff` |
| 4 | 대상의 죽음표식 [360194] | 360194 | `Deathmark_DoT` |

**5. 규칙.** “규칙” 페이지에서 “+”를 클릭하고 “누를 버튼”에서 슬롯을 고른 다음 “이름”을 입력합니다. “+ 그룹 (또는)”은 기본 조건이 들어 있는 그룹을 추가하므로, 확인할 대상, 속성, 비교, 숫자를 바꾸세요. “+ 조건”은 같은 그룹에 다음 조건을 추가합니다. 규칙은 다음 순서로 만듭니다:

| # | 누를 버튼 | 그룹(OR), 그룹 안의 조건(AND) |
|---|---|---|
| 1 | 진홍색 약병 | 치유 / 방어 켜짐, 플레이어 생명력 ≤ 40 |
| 2 | 죽음표식 | Burst 켜짐, 대상의 목조르기 있음, 대상의 파열 있음, 독살 있음 |
| 3 | 목조르기 | (1) 대상의 목조르기 없음; (2) 대상의 목조르기 있음, 남은 시간 ≤ 30% |
| 4 | 파열 | (1) 연계 점수 ≥ 70, 대상의 파열 없음; (2) 연계 점수 ≥ 70, 대상의 파열 있음, 남은 시간 ≤ 30% |
| 5 | 독살 | (1) 연계 점수 ≥ 70, 독살 없음; (2) 연계 점수 ≥ 70, 독살 있음, 남은 시간 ≤ 20%; (3) 연계 점수 ≥ 70, 기력 ≥ 70; (4) 연계 점수 ≥ 70, 대상의 죽음표식 있음 |
| 6 | 절단 | 연계 점수 < 70 |

이렇게 하는 이유는 다음과 같습니다.
- **방어 기술을 맨 앞에**: 생명력이 낮을 때는 피해보다 진홍색 약병이 더 중요합니다. 빠른 설정 패널에서 “치유 / 방어”가 켜져 있을 때만 실행됩니다.
- **Burst에 묶은 죽음표식**: `cd == 1`은 주문의 재사용 대기시간이 아니라 Burst 버튼(Windows에서는 F3, macOS에서는 ⌃⇧B)입니다. Burst를 끄면 죽음표식은 기다립니다.
- **판데믹 구간을 고려한 DoT**: 없는 오라는 남은 시간이 0이므로 갱신에는 그룹이 두 개 필요합니다: “DoT 없음”과 “DoT가 있고 남은 시간 ≤ 30%”.
- **연계 점수 5 = 70**: 연계 점수 최대 7점 중 5점은 71%입니다. 기준값 `70`은 값을 어떻게 반올림하든 맞습니다. 표는 [자원](https://keyrota.app/documentation/ko/conditions#resources)에 있습니다.
- **절단은 맨 마지막**, 그리고 연계 점수 5 미만일 때만: 독살이 조건을 기다리는 동안 기력을 낭비하지 않기 위해서입니다.

**6. 확인.** 상태 표시줄에 “로테이션 정상: 규칙 6개, 슬롯 6개, 오라 4개”가 표시되어야 합니다. “텍스트 및 JSON”을 열면 아래와 같은 내용이 보입니다.

**7. Better Assistant 프로필.** 일반 — “슬롯과 오라로 만들기” — “복사”. 게임에서 `/ba` — Profile — 붙여넣기 — Apply.

**8. 키.** 주문 6개를 행동 단축바에 올리고 키를 지정합니다.

**9. 실행.** “저장”을 클릭하고 창을 닫은 다음 “암살: 예시” 프로필을 선택해 로테이션을 시작합니다(Windows에서는 F1, macOS에서는 ⌃⇧Space). 진홍색 약병을 쓰려면 빠른 설정 패널에서 “치유 / 방어”를 켭니다. Burst 버튼으로 죽음표식을 켜고 끕니다.

*KRC 텍스트:*

```text
rotation "암살: 예시 v1"

# KeyRota 문서의 예시: 출혈 2개, 생성기, 기력을 모으는 소모 기술,
# 낮은 생명력에서의 방어, Burst 버튼에 묶은 죽음표식.
# 연계 점수(최대 7)의 백분율: 5점 = 71%, 기준 70 = 5 이상.

buff1	Garrote_DoT = "대상의 목조르기 [703]"
buff2	Rupture_DoT = "대상의 파열 [1943]"
buff3	Envenom_Buff = "독살 [32645]"
buff4	Deathmark_DoT = "대상의 죽음표식 [360194]"
slot1	Garrote = "목조르기"
slot2	Rupture = "파열"
slot3	Envenom = "독살"
slot4	Mutilate = "절단"
slot5	Deathmark = "죽음표식"
slot6	Crimson_Vial = "진홍색 약병"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

# --- 방어: ‘치유 / 방어’를 켰을 때만 ---
use Crimson_Vial when  # 진홍색 약병
	defensives == 1 and PlayerHP <= 40  # 생명력 40% 이하

# --- 재사용 대기시간 기술: Burst를 켰을 때만 ---
use Deathmark when  # 죽음표식
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up and Envenom_Buff.up  # Burst 켬, 출혈과 독살 유지 중

# --- 출혈 ---
use Garrote when  # 목조르기
	Garrote_DoT.down  # 출혈 없음
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30  # 판데믹 구간: 30% 이하 남음

use Rupture when  # 파열
	Combo_Points >= 70 and Rupture_DoT.down  # 연계 점수 5 이상, 출혈 없음
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # 연계 점수 5 이상, 판데믹 구간

# --- 소모: 연계 점수 5 이상, 기력 모으기 ---
use Envenom when  # 독살
	Combo_Points >= 70 and Envenom_Buff.down  # 효과 없음
	or
	Combo_Points >= 70 and Envenom_Buff.up and Envenom_Buff.duration <= 20  # 효과 종료 직전
	or
	Combo_Points >= 70 and Energy >= 70  # 기력 넘치지 않게
	or
	Combo_Points >= 70 and Deathmark_DoT.up  # 대상에 죽음표식

# --- 생성기: 연계 점수 5 미만 ---
use Mutilate when  # 절단
	Combo_Points < 70  # 연계 점수 5 미만
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "암살: 예시 v1",
  "specID": 259,
  "ignoreMainIcon": true,
  "enemies": {"range": 8, "combatOnly": true},
  "notes": [
    "KeyRota 문서의 예시: 출혈 2개, 생성기, 기력을 모으는 소모 기술,",
    "낮은 생명력에서의 방어, Burst 버튼에 묶은 죽음표식.",
    "연계 점수(최대 7)의 백분율: 5점 = 71%, 기준 70 = 5 이상."
  ],
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "대상의 목조르기 [703]", "spell": 703},
    {"n": 2, "alias": "Rupture_DoT", "label": "대상의 파열 [1943]", "spell": 1943},
    {"n": 3, "alias": "Envenom_Buff", "label": "독살 [32645]", "spell": 32645},
    {"n": 4, "alias": "Deathmark_DoT", "label": "대상의 죽음표식 [360194]", "spell": 360194}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "목조르기", "spell": 703, "show": "target"},
    {"n": 2, "alias": "Rupture", "label": "파열", "spell": 1943, "show": "target"},
    {"n": 3, "alias": "Envenom", "label": "독살", "spell": 32645, "show": "target"},
    {"n": 4, "alias": "Mutilate", "label": "절단", "spell": 1329, "show": "target"},
    {"n": 5, "alias": "Deathmark", "label": "죽음표식", "spell": 360194, "show": "target"},
    {"n": 6, "alias": "Crimson_Vial", "label": "진홍색 약병", "spell": 185311, "show": "combat"}
  ],
  "rules": [
    {
      "use": "Crimson_Vial",
      "name": "진홍색 약병",
      "note": ["--- 방어: ‘치유 / 방어’를 켰을 때만 ---"],
      "when": [{"all": ["defensives == 1", "PlayerHP <= 40"], "comment": "생명력 40% 이하"}]
    },
    {
      "use": "Deathmark",
      "name": "죽음표식",
      "note": ["--- 재사용 대기시간 기술: Burst를 켰을 때만 ---"],
      "when": [
        {
          "all": ["cd == 1", "Garrote_DoT.up", "Rupture_DoT.up", "Envenom_Buff.up"],
          "comment": "Burst 켬, 출혈과 독살 유지 중"
        }
      ]
    },
    {
      "use": "Garrote",
      "name": "목조르기",
      "note": ["--- 출혈 ---"],
      "when": [
        {"all": ["Garrote_DoT.down"], "comment": "출혈 없음"},
        {"all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"], "comment": "판데믹 구간: 30% 이하 남음"}
      ]
    },
    {
      "use": "Rupture",
      "name": "파열",
      "when": [
        {"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "연계 점수 5 이상, 출혈 없음"},
        {
          "all": ["Combo_Points >= 70", "Rupture_DoT.up", "Rupture_DoT.duration <= 30"],
          "comment": "연계 점수 5 이상, 판데믹 구간"
        }
      ]
    },
    {
      "use": "Envenom",
      "name": "독살",
      "note": ["--- 소모: 연계 점수 5 이상, 기력 모으기 ---"],
      "when": [
        {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "효과 없음"},
        {
          "all": ["Combo_Points >= 70", "Envenom_Buff.up", "Envenom_Buff.duration <= 20"],
          "comment": "효과 종료 직전"
        },
        {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "기력 넘치지 않게"},
        {"all": ["Combo_Points >= 70", "Deathmark_DoT.up"], "comment": "대상에 죽음표식"}
      ]
    },
    {
      "use": "Mutilate",
      "name": "절단",
      "note": ["--- 생성기: 연계 점수 5 미만 ---"],
      "when": [{"all": ["Combo_Points < 70"], "comment": "연계 점수 5 미만"}]
    }
  ]
}
```


이 예시 내려받기: [JSON](https://keyrota.app/documentation/examples/starter-assassination.ko.json), [KRC 텍스트](https://keyrota.app/documentation/examples/starter-assassination.ko.txt). “텍스트 및 JSON” 페이지의 “열기…” 또는 “새로 만들기 — 파일에서…”로 엽니다.

---

<!-- https://keyrota.app/documentation/ko/rotation-json -->

## 로테이션 JSON

JSON은 고급 로테이션을 빠짐없이 기술합니다. KRC 텍스트에 있는 모든 내용에 더해 주문 ID, 슬롯 플래그, 프로필 설정까지 담습니다. 빌더의 “텍스트 및 JSON” 페이지에서 볼 수 있고, KeyRota에서는 파일로 불러올 수 있습니다(“새로 만들기 — 파일에서…”, “가져오기”). 형식 이름은 `keyrota-rotation`, 버전은 1입니다. 검사용 [JSON Schema](#schema)도 있습니다.

### 예시 파일

실제로 쓸 수 있는 가장 짧은 로테이션입니다. 연계 점수가 5 이상이고 대상에 파열이 없으면 파열을, 그 밖에는 절단을 누릅니다.

*minimal.json:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "암살: 최소 예시",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [{"n": 1, "alias": "Rupture_DoT", "label": "대상의 파열 [1943]", "spell": 1943}],
  "slots": [
    {"n": 2, "alias": "Rupture", "label": "파열", "spell": 1943},
    {"n": 4, "alias": "Mutilate", "label": "절단", "spell": 1329}
  ],
  "rules": [
    {
      "use": "Rupture",
      "name": "파열",
      "when": [{"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "연계 점수 5 이상, 출혈 없음"}]
    },
    {"use": "Mutilate", "name": "절단"}
  ]
}
```


파일에서 생략한 항목은 모두 기본값을 씁니다. 슬롯은 “대상 있을 때” 표시되고 플래그가 없으며, 적 수 측정 반경은 8미터이고 전투 중인 적만 셉니다. `when`이 없는 규칙은 항상 충족됩니다.

### 최상위 필드

| 필드 | 형식 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
| `format` | 문자열 | 예 | — | 항상 `"keyrota-rotation"`. |
| `version` | 정수 | 예 | — | 항상 `1`. 더 높은 버전은 거부됩니다: “KeyRota를 업데이트하세요”. |
| `title` | 문자열 | 아니요 | `""` | 로테이션 이름: 텍스트의 첫 줄이자 기록에 표시되는 이름. 큰따옴표는 쓸 수 없습니다. |
| `specID` | 정수 0–100000 | 아니요 | `0` | WoW 전문화, `0` = 모든 전문화. Better Assistant 프로필에 필요합니다. |
| `ignoreMainIcon` | true / false | 아니요 | `true` | 켬: 규칙에 따라서만 누릅니다. 끔: 맞는 규칙이 없으면 게임 추천을 누릅니다. |
| `enemies` | 객체 | 아니요 | `{"range": 8, "combatOnly": true}` | `enemies` 조건에 쓰는 적 수 측정 설정. |
| `notes` | 문자열 또는 문자열 목록 | 아니요 | `[]` | 설명: 텍스트 맨 위의 `#` 줄. |
| `resources` | 문자열과 `null`의 목록 | 아니요 | `[]` | `resource1…N`의 이름(순서대로). |
| `auras` | 목록 | 아니요 | `[]` | 오라 `buff1…12`. |
| `slots` | 목록 | 아니요 | `[]` | 슬롯 `slot1…12`. |
| `rules` | 목록 | 아니요 | `[]` | 우선순위 순서의 규칙. |
| `footer` | 문자열 또는 문자열 목록 | 아니요 | `[]` | 마지막 규칙 뒤의 주석. |

그 밖의 필드는 모두 오류(“불필요한 필드”)입니다. 오타를 그냥 넘기지 않습니다. 그러므로 파일에 `"$schema"`를 넣지 말고, 스키마는 편집기나 검사기에서 연결하세요.

거의 모든 곳에서 값 대신 `null`을 쓸 수 있으며, 필드를 생략한 것과 같은 의미입니다.

### format과 version

`"format": "keyrota-rotation"`과 `"version": 1`은 필수입니다. `version`이 1보다 크면 KeyRota가 거부합니다: “버전 2은(는) 이 KeyRota가 지원하는 버전보다 새롭습니다. KeyRota를 업데이트하세요”. `version`이 없으면: “버전 1이어야 합니다”.

### title

큰따옴표 `"`가 없는 문자열입니다. 줄 바꿈은 공백으로 바뀝니다. KRC 텍스트에서는 `rotation "…"`입니다. 버전을 적어 두기 좋은 곳입니다: `"암살 v1.3"`.

### specID

게임의 전문화 ID입니다. 로테이션의 자원(빌더에서 만들 때)과 Better Assistant 프로필의 직업 및 전문화를 정합니다. `0`은 모든 전문화를 뜻합니다. 이때 로테이션은 작동하지만 Better Assistant 프로필은 만들어지지 않습니다(“전문화를 선택하세요. Better Assistant 프로필에 필요합니다”).

| 직업 | 전문화 | specID | 전문화 자원(`resource3`…) |
|---|---|---|---|
| 전사 | 무기 | 71 | `Rage` |
| 전사 | 분노 | 72 | `Rage` |
| 전사 | 방어 | 73 | `Rage` |
| 성기사 | 신성 | 65 | `Mana`, `Holy_Power` |
| 성기사 | 보호 | 66 | `Mana`, `Holy_Power` |
| 성기사 | 징벌 | 70 | `Mana`, `Holy_Power` |
| 사냥꾼 | 야수 | 253 | `Focus` |
| 사냥꾼 | 사격 | 254 | `Focus` |
| 사냥꾼 | 생존 | 255 | `Focus` |
| 도적 | 암살 | 259 | `Energy`, `Combo_Points` |
| 도적 | 무법 | 260 | `Energy`, `Combo_Points` |
| 도적 | 잠행 | 261 | `Energy`, `Combo_Points` |
| 사제 | 수양 | 256 | `Mana`, `Insanity` |
| 사제 | 신성 | 257 | `Mana`, `Insanity` |
| 사제 | 암흑 | 258 | `Mana`, `Insanity` |
| 죽음의 기사 | 혈기 | 250 | `Runes`, `Runic_Power` |
| 죽음의 기사 | 냉기 | 251 | `Runes`, `Runic_Power` |
| 죽음의 기사 | 부정 | 252 | `Runes`, `Runic_Power` |
| 주술사 | 정기 | 262 | `Mana`, `Maelstrom` |
| 주술사 | 고양 | 263 | `Mana`, `Maelstrom` |
| 주술사 | 복원 | 264 | `Mana`, `Maelstrom` |
| 마법사 | 비전 | 62 | `Mana`, `Arcane_Charges` |
| 마법사 | 화염 | 63 | `Mana`, `Arcane_Charges` |
| 마법사 | 냉기 | 64 | `Mana`, `Arcane_Charges` |
| 흑마법사 | 고통 | 265 | `Mana`, `Soul_Shards` |
| 흑마법사 | 악마 | 266 | `Mana`, `Soul_Shards` |
| 흑마법사 | 파괴 | 267 | `Mana`, `Soul_Shards` |
| 수도사 | 양조 | 268 | `Energy`, `Stagger` |
| 수도사 | 운무 | 270 | `Mana` |
| 수도사 | 풍운 | 269 | `Energy`, `Chi` |
| 드루이드 | 조화 | 102 | `Mana`, `Astral_Power` |
| 드루이드 | 야성 | 103 | `Energy`, `Combo_Points` |
| 드루이드 | 수호 | 104 | `Rage` |
| 드루이드 | 회복 | 105 | `Mana`, `Astral_Power` |
| 악마사냥꾼 | 파멸 | 577 | `Fury` |
| 악마사냥꾼 | 복수 | 581 | `Fury` |
| 악마사냥꾼 | 포식 | 1480 | `Fury` |
| 기원사 | 황폐 | 1467 | `Mana`, `Essence` |
| 기원사 | 보존 | 1468 | `Mana`, `Essence` |
| 기원사 | 증강 | 1473 | `Mana`, `Essence` |

### ignoreMainIcon

`true`(기본값): KeyRota는 규칙에 따라서만 누르고, 맞는 규칙이 없으면 기다립니다. `false`: 맞는 규칙이 없으면 Blizzard 프로필처럼 게임 추천을 누릅니다. 게임 추천은 모든 규칙을 확인한 뒤의 마지막 수단이며, 규칙을 앞지르지 않습니다.

### enemies

```json
"enemies": {"range": 8, "combatOnly": true}
```


| 필드 | 형식 | 기본값 | 설명 |
|---|---|---|---|
| `range` | 정수 1–100 | `8` | 적 수 측정 반경(미터). |
| `combatOnly` | true / false | `true` | 이미 전투 중인 적만 셉니다. |

`enemies` 조건은 이 측정값을 읽습니다([주변 적 수](https://keyrota.app/documentation/ko/conditions#enemies) 참고). 빌더에서는 “일반” 페이지의 “적 수 측정 반경(미터)”과 “전투 중인 적만”에 해당합니다. 이 값은 Better Assistant 프로필에도 들어갑니다.

### notes와 footer

로테이션 설명(`notes`)과 마지막 규칙 뒤의 주석(`footer`)입니다. 문자열 목록이나, `\n`이 들어간 문자열 하나로 씁니다. 빈 문자열 `""`은 텍스트에서 빈 줄이 됩니다. 맨 앞과 맨 뒤의 빈 줄은 제거됩니다.

```json
"notes": ["가이드와 상위 로그 기반, 패치 12.1", "", "v1.1: 대상 4명 이상에서 독살을 더 일찍 사용"]
```


KRC 텍스트에서는 선언 앞의 `# …` 줄입니다. 로테이션 동작에는 영향을 주지 않습니다.

### resources

자원 이름을 순서대로 적습니다. 첫 번째 항목이 `resource1`, 두 번째가 `resource2`, 이런 식입니다. **자원의 종류는 번호가 정하며**, 이름은 조건에서 쓰는 표기일 뿐입니다:

- `resource1`은 플레이어의 생명력, `resource2`는 대상의 생명력입니다.
- `resource3`부터는 [specID 표](#spec-id)의 순서대로 전문화 자원입니다. 도적이라면 `resource3`이 기력, `resource4`가 연계 점수입니다.

```json
"resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"]
```


표에 있는 표준 이름을 쓰세요. 빌더가 이를 알기 쉬운 말(“플레이어 생명력”, “기력”)로 보여 주고, 다른 사람과 AI 에이전트도 조건을 바로 이해합니다. `null`은 번호를 건너뜁니다: `["PlayerHP", null, "Energy"]`는 `resource1`과 `resource3`만 선언합니다. 선언하지 않은 자원은 읽을 수 없습니다: “resource2 선언되지 않음”.

모든 자원은 최대치에 대한 **백분율**(0–100)입니다. 연계 점수, 기력, 룬을 백분율로 바꾸는 방법은 “조건” 문서의 [자원](https://keyrota.app/documentation/ko/conditions#resources)을 참고하세요.

### auras

오라는 내 강화 효과와 대상에게 건 내 약화 효과입니다. 로테이션의 오라 `n`은 Better Assistant 목록의 오라 `n`입니다.

| 필드 | 형식 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
| `n` | 정수 1–12 | 예 | — | 오라 번호(`buffN`). 번호마다 한 번만 쓸 수 있습니다. |
| `alias` | 문자열 | 아니요 | `label`에서 생성 | 조건에서 쓰는 이름. [이름](#aliases)을 참고하세요. |
| `label` | 문자열 | 아니요 | `""` | 표시 이름. 큰따옴표 `"`는 쓸 수 없습니다. ID를 대괄호에 넣어 두면 편리합니다: `"대상의 목조르기 [703]"`. |
| `spell` | 정수 0–100000000 | 아니요 | `0` | Wowhead의 오라 ID. `0` = 지정 안 함: 이 오라는 Better Assistant 프로필에 들어가지 않으며 알 수 없는 값이 됩니다. |
| `note` | 문자열 | 아니요 | `""` | 선언 줄 끝의 주석. |

```json
"auras": [
  {"n": 1, "alias": "Garrote_DoT", "label": "대상의 목조르기 [703]", "spell": 703},
  {"n": 2, "alias": "Rupture_DoT", "label": "대상의 파열 [1943]", "spell": 1943}
]
```


목록의 순서는 상관없고 `n`이 중요합니다. 번호는 중간에 비어도 되지만, Better Assistant 프로필을 만들려면 ID가 있는 오라가 첫 번째부터 빈칸 없이 이어져야 합니다.

### slots

슬롯은 로테이션의 버튼입니다. 로테이션의 슬롯 `n`은 Better Assistant의 슬롯 `n`입니다.

| 필드 | 형식 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
| `n` | 정수 1–12 | 예 | — | 슬롯 번호(`slotN`). |
| `alias` | 문자열 | 아니요 | `label`에서 생성 | 규칙과 조건에서 쓰는 이름. |
| `label` | 문자열 | 아니요 | `""` | 주문 이름. 큰따옴표 `"`는 쓸 수 없습니다. |
| `spell` | 정수 0–100000000 | 아니요 | `0` | Wowhead의 주문 ID. Better Assistant는 이 ID로 주문을 슬롯에 넣습니다. |
| `note` | 문자열 | 아니요 | `""` | 선언 줄 끝의 주석. |
| `show` | `"target"` / `"combat"` | 아니요 | `"target"` | Better Assistant가 슬롯을 표시하는 시점. |
| `manual` | true / false | 아니요 | `false` | 플래그 **M**. |
| `channel` | true / false | 아니요 | `false` | 플래그 **C**. |
| `offGcd` | true / false | 아니요 | `false` | 플래그 **O**. |
| `queue` | true / false | 아니요 | `false` | 플래그 **Q**. `offGcd`와 함께만 쓸 수 있습니다. |

#### show

- `"target"`: 대상이 있을 때 슬롯을 표시합니다. 거의 모든 공격 기술에 해당합니다.
- `"combat"`: 대상이 없어도 전투 중이면 슬롯을 표시합니다. 치유와 방어 기술용입니다. 진홍색 약병은 대상이 없을 때도 작동해야 합니다.

슬롯은 Better Assistant가 표시할 때만 준비된 것으로 봅니다. `"target"` 슬롯은 대상이 없으면 준비되지 않으며, 그 규칙은 건너뜁니다.

### 슬롯 플래그

플래그는 규칙이 선택된 슬롯을 **어떻게** 누를지 정합니다. 빌더에서는 “누르는 방식” 스위치입니다.

| 플래그 | JSON | 누르는 방식 | 예시 |
|---|---|---|---|
| 없음 | 모두 `false` | GCD가 끝날 무렵 주문 대기열 구간에 누릅니다. GCD가 끝나는 즉시 주문이 나갑니다. | 절단, 독살 |
| **M** | `"manual": true` | 누르지 않습니다. 슬롯의 규칙은 건너뜁니다. 이 슬롯의 키를 직접 누르면 로테이션이 일시 정지됩니다. | 직접 누르는 기술 |
| **C** | `"channel": true` | 일반 주문처럼 누르고, 정신 집중이 이어지는 동안에는 아무것도 누르지 않습니다. 누른 뒤 정신 집중이 시작될 때까지는 이 슬롯을 다시 누르지 않습니다. | 광기의 학살자 (51690) |
| **O** | `"offGcd": true` | GCD 도중이라도 바로 누릅니다. | 도박의 연속 (381989) |
| **O + Q** | `"offGcd": true, "queue": true` | GCD와 무관하지만 GCD가 끝날 무렵의 주문 대기열 구간에서만 누릅니다. | 아드레날린 촉진 + 광기의 학살자 매크로 (13750), 왕의 파멸 후 소멸 (1856) |
| **C + O** | `"channel": true, "offGcd": true` | GCD와 무관하게 시작하는 정신 집중: 바로 누르고, 정신 집중이 끝날 때까지 아무것도 누르지 않습니다. | 드묾 |
| **C + O + Q** | 세 가지 모두 | 위와 같되 주문 대기열 구간에서 누릅니다. | 드묾 |
| O 없는 **Q** | `"queue": true` | 오류: “queue는 offGcd와 함께만 사용할 수 있습니다”. | — |
| **M** + 다른 플래그 | `"manual": true, …` | M이 우선합니다. 슬롯을 누르지 않으며 다른 플래그는 의미가 없습니다. | — |

**O**만이 아니라 **O + Q**를 쓰는 이유: O만 있는 버튼은 직전 공격이 적중하기 전, GCD 도중에 바로 눌립니다. O만 켠 상태로 왕의 파멸 뒤에 소멸을 쓰면 왕의 파멸로 얻는 연계 점수가 들어오기 전에 눌리고, 소멸 규칙(`Combo_Points < 65`)은 이전 값을 확인하게 됩니다. Q를 켜면 버튼이 GCD가 끝날 때까지 기다립니다.

엄격한 우선순위: 목록에서 아래에 있는 GCD 무관 규칙은 GCD를 기다리는 위쪽 규칙을 **앞지르지 않습니다**.

```json
"slots": [
  {"n": 1, "alias": "Adrenaline_Rush", "label": "아드레날린 촉진 (광기의 학살자 매크로)", "spell": 13750, "offGcd": true, "queue": true},
  {"n": 4, "alias": "Keep_It_Rolling", "label": "도박의 연속", "spell": 381989, "offGcd": true},
  {"n": 8, "alias": "Killing_Spree", "label": "광기의 학살자", "spell": 51690, "channel": true},
  {"n": 11, "alias": "Crimson_Vial", "label": "진홍색 약병", "spell": 185311, "show": "combat"}
]
```


### rules

우선순위 순서의 규칙입니다. 목록의 첫 번째 규칙을 가장 먼저 확인합니다.

| 필드 | 형식 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
| `use` | 문자열 | 예 | — | 누를 슬롯: 슬롯의 `alias` 또는 `slotN`. |
| `name` | 문자열 | 아니요 | `""` | 동작 이름이며 기록에 표시됩니다. 텍스트에서는 `use` 줄의 주석입니다. |
| `note` | 문자열 또는 문자열 목록 | 아니요 | `[]` | 규칙 위의 메모(`use` 앞의 `#` 줄). |
| `when` | 그룹 목록 | 아니요 | `[]` | OR 그룹. 비어 있거나 없으면 조건 없는 규칙이 되어, 주문을 사용할 수 있으면 언제나 누릅니다. |

#### when: 그룹과 조건

| 필드 | 형식 | 필수 | 설명 |
|---|---|---|---|
| `all` | 비어 있지 않은 문자열 목록 | 예 | 그룹의 조건. 모두 충족되어야 합니다(AND). |
| `comment` | 문자열 | 아니요 | 그룹의 주석(텍스트에서는 그 줄의 끝). |

```json
{
  "use": "Garrote",
  "name": "목조르기",
  "note": ["판데믹 구간에서 갱신"],
  "when": [
    {"all": ["Garrote_DoT.down"], "comment": "출혈 없음"},
    {"all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"], "comment": "30% 이하 남음"}
  ]
}
```


한 슬롯을 여러 규칙에서 쓸 수 있습니다. 예를 들어 은신 중 목조르기는 목록 위쪽에, 평소의 목조르기 유지는 아래쪽에 둘 수 있습니다.

#### JSON의 조건

각 조건은 KRC 문법으로 쓴 문자열입니다: `Garrote_DoT.down`, `Rupture_DoT.duration <= 25`, `Kingsbane.cd <= 3`, `Combo_Points >= 70`, `enemies >= 2`, `target.distance <= 8`, `cd == 1`. 전체 목록은 [조건](https://keyrota.app/documentation/ko/conditions)에 있습니다.

- 이름(`Garrote_DoT`)이나 번호(`buff1`, `slot3`, `resource4`)로 참조합니다.
- 문자열 안의 ` and `는 조건을 둘로 나눕니다. `"Combo_Points >= 70 and Energy >= 70"`은 조건 2개이며, 둘 다 16개 제한에 포함됩니다.
- 문자열에 `#`과 줄 바꿈을 쓸 수 없습니다.
- 조건은 KeyRota 자체 엔진이 읽으므로 JSON과 텍스트의 의미는 항상 같습니다.

### 이름

이름(`alias`)은 조건과 `use`에서 오라, 슬롯, 자원을 가리키는 이름입니다.

- 첫 글자는 문자(한글 등 모든 문자 체계) 또는 `_`이고, 그다음에는 문자, 숫자 `0–9`, `_`를 씁니다. 공백, 하이픈, 마침표는 쓸 수 없습니다: `Fan-of-Knives`가 아니라 `Fan_of_Knives`.
- 이름은 모든 오라, 슬롯, 자원을 통틀어 고유해야 합니다.
- 예약어: `use`, `when`, `and`, `or`, `rotation`, `gcd`, `enemies`, `target`, `aoe`, `st`, `cd`, `defensives`, `ground_spells`, `movement`, 그리고 `buffN`, `slotN`, `resourceN` 형태의 이름.
- 키워드는 소문자로만 씁니다: `use`, `or`, `.up`. `Use`, `OR`, `.UP`은 오류입니다.

**label에서 만드는 이름.** `alias`가 없으면 KeyRota가 `label`에서 이름을 만듭니다. 대괄호와 그 안의 내용은 버리고, 문자와 숫자는 남기며, 나머지는 모두 `_`로 바꿉니다. 예를 들어 `"대상의 목조르기 [703]"`은 `대상의_목조르기`가 됩니다. 이름이 비거나 쓸 수 없으면 `Aura_N` 또는 `Slot_N`이 되고, 이미 있는 이름이면 `_2`, `_3`이 붙습니다. 규칙이 목록에 없는 `buffN`이나 `slotN`을 참조하면 `Aura_N`, `Slot_N`으로 자동 선언됩니다.

### 필수 필드와 기본값

| 위치 | 필수 | 기본값 |
|---|---|---|
| 파일 | `format`, `version` | `title` `""`, `specID` `0`, `ignoreMainIcon` `true`, `enemies` `{"range": 8, "combatOnly": true}`, 빈 목록 |
| 오라 | `n` | `alias`는 `label`에서 생성, `label` `""`, `spell` `0` |
| 슬롯 | `n` | `show` `"target"`, 모든 플래그 `false`, `spell` `0` |
| 규칙 | `use` | `name` `""`, `note` `[]`, `when` `[]`(조건 없음) |
| 그룹 | `all`(비어 있지 않음) | `comment` `""` |

### 제한

| 항목 | 제한 |
|---|---|
| 오라 | 12개(`n` 1–12) |
| 슬롯 | 12개(`n` 1–12) |
| 규칙당 OR 그룹 | 16개 |
| 그룹당 AND 조건 | 16개 |
| 규칙 | 제한 없음 |
| 조건의 숫자 | 정수 0–100 |
| `enemies.range` | 1–100 |
| `spell` | 0–100000000 |
| `specID` | 0–100000 |
| 자원 | 최대 99개 |

조건 16개짜리 그룹 16개까지는 정상이고, 17개부터는 오류입니다.

### 오류

오류가 있는 로테이션은 전혀 불러오지 않습니다. 일부만 실행하는 일은 없습니다. 오류는 항상 위치를 알려 줍니다. JSON에서는 경로로 표시됩니다: `rules[3].when[1]: 알 수 없는 이름 Foo`(0부터 셈). 빌더에서는 “규칙 4, 그룹 2: 알 수 없는 이름 Foo”(1부터 셈)로, KRC 텍스트에서는 줄 번호로 표시됩니다.

**JSON 구조:**

| 메시지 | 원인 |
|---|---|
| `불필요한 필드 “offgcd”` | 오타가 있거나 알 수 없는 필드입니다(대소문자 구분: `offGcd`). |
| `필드 “format” 누락` | 필수 필드가 없습니다. |
| `format: “keyrota-rotation”이 필요합니다` | `format`의 값이 다릅니다. |
| `version: 버전 1이어야 합니다` | `version`이 없거나 1보다 작습니다. |
| `slots[0]: 번호 n(1–12)이 없습니다` | 슬롯이나 오라에 `n`이 없습니다. |
| `slots[2].n: 숫자가 1..12 범위를 벗어남` | `n`이 범위를 벗어났습니다. |
| `slots[3]: 번호 4은(는) 이미 사용 중입니다` | 슬롯 두 개(또는 오라 두 개)의 `n`이 같습니다. |
| `slots[1].show: “target” 또는 “combat”이 필요합니다` | `show`의 값이 다릅니다. |
| `slots[0]: queue는 offGcd와 함께만 사용할 수 있습니다` | `offGcd: true` 없이 `queue: true`를 썼습니다. |
| `rules[2].use: 슬롯 “Garotte”이(가) 없습니다` | `use`가 없는 슬롯을 가리킵니다. |
| `rules[0].when[1].all: 비어 있지 않은 조건 목록이 필요합니다` | 빈 그룹이거나 `all`이 없습니다. |
| `rules[0].when[0].all[2]: 조건이 비어 있거나 # 또는 줄 바꿈이 들어 있습니다` | 조건 문자열이 비어 있거나 `#`이 들어 있습니다. |
| `….spell: 정수가 필요합니다` | 형식이 틀렸습니다: 숫자 대신 문자열, 숫자 대신 `true` 등. |

**조건과 선언 해석**(KRC 텍스트와 같음):

| 코드 | 메시지 예 | 원인 |
|---|---|---|
| `unknown_ref` | `알 수 없는 이름 Foo` | 그런 이름의 오라, 슬롯, 자원이 없습니다. |
| `unknown_ref` | `resource5 선언되지 않음` | 자원이 `resources`에 선언되지 않았습니다. |
| `wrong_kind` | `Garrote — 종류: slot, 필요한 종류: buff` | 슬롯에 오라 속성을 썼거나(`Garrote.up`) 그 반대입니다. |
| `bad_condition` | `조건을 해석할 수 없음: "Energy => 50"` | 조건이나 연산자에 오타가 있습니다. |
| `bad_condition` | `"Garrote.distance <= 8": distance는 target에만 있습니다` | 거리는 대상에만 있습니다. |
| `value_range` | `값 120 (0..100 범위 밖)` | 100보다 큰 숫자입니다. 음수와 소수는 없습니다. |
| `toggle_value` | `"cd >= 1": 스위치는 == 0 또는 == 1만 가능합니다` | 스위치는 `==`로 0 또는 1과만 비교합니다. |
| `bad_alias` | `허용되지 않는 이름 Fan-of-Knives` | 이름에 쓸 수 없는 문자가 있습니다. |
| `reserved_alias` | `이름 cd (예약됨)` | 예약된 이름입니다. |
| `duplicate_alias` | `이름 Garrote (이미 선언됨)` | 오라, 슬롯, 자원 두 개의 이름이 같습니다. |
| `index_range` | `buff13: 번호가 1..12 범위를 벗어남` | 12보다 큰 번호를 참조했습니다. |
| `too_many_groups` | `OR 그룹이 16개를 초과합니다` | 규칙에 그룹이 16개보다 많습니다. |
| `too_many_conditions` | `17 개의 조건이 한 그룹에 있습니다 (최대 16개)` | 그룹에 조건이 16개보다 많습니다. |

빌더에는 이 밖에도 “그룹에 조건이 없습니다”(빈 그룹), “슬롯을 선택하지 않았습니다”, “이름에 따옴표를 쓸 수 없습니다”가 있습니다.

### KRC 텍스트

KRC 텍스트는 같은 로테이션을 줄 단위로 적은 것입니다. “텍스트 및 JSON” 페이지에서 볼 수 있고, `.txt` 파일로 보관할 수 있습니다. 텍스트와 JSON은 의미 손실 없이 서로 변환됩니다.

*KRC 텍스트:*

```text
rotation "암살: 최소 예시"

buff1	Rupture_DoT = "대상의 파열 [1943]"
slot2	Rupture = "파열"
slot4	Mutilate = "절단"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Rupture when  # 파열
	Combo_Points >= 70 and Rupture_DoT.down  # 연계 점수 5 이상, 출혈 없음

use Mutilate when  # 절단
```


#### 줄

- 큰따옴표 밖의 `#`은 줄 끝까지 이어지는 주석을 시작합니다. `"label"` 안의 `#`은 일반 문자입니다.
- 빈 줄과 주석만 있는 줄은 건너뜁니다. 설명과 구분선은 이렇게 씁니다.
- 그 밖의 줄은 선언, `use`, `or`, 조건 줄 중 하나여야 합니다. 그렇지 않으면 `stray_line` 오류가 납니다: “규칙 밖의 줄: "…" (설명은 #으로 시작하세요)”.
- 각 부분 사이에는 공백과 탭을 몇 개든 쓸 수 있습니다. 표준 형식은 `buffN`/`slotN` 뒤와 조건 줄 맨 앞에 탭을 씁니다.

#### 선언

첫 번째 `use` 전에만 씁니다:

```text
rotation "이름"                    # 선택 사항, 최대 한 번
buff1	Garrote_DoT = "대상의 목조르기 [703]"   # 오라 1
slot1	Garrote = "목조르기"                     # 슬롯 1
resource1	PlayerHP                           # 자원 1
```


`buffN`과 `slotN`은 1–12, `resourceN`은 1–99입니다. 따옴표 안의 레이블은 비워 둘 수 있습니다: `slot5	Filler = ""`. 첫 번째 `use` 뒤에 선언을 쓰면 `late_declaration` 오류입니다.

#### 규칙

```text
use Rupture when  # 파열
	Combo_Points >= 70 and Rupture_DoT.down  # 출혈 없음
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # 판데믹 구간
```


- `use Slot when`이 규칙을 엽니다. 이 줄의 주석이 동작 이름입니다.
- 조건 줄 하나가 그룹 하나입니다(`and`로 연결한 조건). 그룹은 `or` 한 단어만 있는 줄로 구분합니다.
- 조건 줄이 없는 규칙은 조건이 없습니다.
- `or` 없이 조건 줄이 두 개 연달아 있으면 `split_group` 오류, `or`가 맨 앞이나 맨 끝에 있거나 두 번 연달아 있으면 `empty_group` 오류입니다.

#### 텍스트와 JSON의 대응

| 텍스트 | JSON |
|---|---|
| `rotation "…"` | `title` |
| 첫 번째 `use` 앞의 `# …` 줄 | `notes` |
| `buffN` / `slotN` 줄 끝의 주석 | 오라 / 슬롯의 `note` |
| `use` 바로 앞(그리고 규칙의 그룹 사이)의 `# …` 줄 | 규칙의 `note` |
| `use` 줄의 주석 | 규칙의 `name` |
| 조건 줄 끝의 주석 | 그룹의 `comment` |
| 마지막 규칙 뒤의 `# …` 줄 | `footer` |
| —(텍스트에는 없음) | `specID`, `ignoreMainIcon`, `enemies`, `spell`, `show`, 플래그 |

주석 블록의 맨 앞과 맨 뒤에 있는 빈 줄은 제거되고, 중간의 빈 줄은 `""`로 남습니다.

### 가져오기와 저장

- KeyRota는 로테이션을 프로필 안에 보관합니다. 메인 창의 “내보내기”는 KeyRota 프로필(JSON)을 로테이션과 함께 저장하고, “가져오기”는 KeyRota 프로필과 로테이션 JSON만 담긴 파일을 받습니다.
- “새로 만들기 — 파일에서…”는 KRC 텍스트가 담긴 `.txt`, 로테이션 JSON, KeyRota 프로필을 받습니다. “새로 만들기 — 클립보드에서”는 같은 내용을 클립보드에서 가져옵니다.
- 빌더에서는 “텍스트 및 JSON — 붙여넣기” 또는 “열기…”가 로테이션을 교체합니다. 새 버전에 이 값들이 없으면 번호가 같은 슬롯과 오라는 기존 ID, “대상 있을 때 / 전투 중”, 플래그를 유지합니다.
- 텍스트 로테이션(JSON 없음)은 슬롯의 ID와 표시 조건을 KeyRota 프로필에 이미 저장된 Better Assistant 프로필에서 가져오고, 오라의 ID는 레이블 속 `[703]` 같은 표기에서도 가져옵니다.

### JSON으로 만드는 Better Assistant 프로필

빌더의 “슬롯과 오라로 만들기”는 로테이션 JSON으로 Better Assistant 프로필 문자열을 만듭니다:

- **슬롯 12개**: 슬롯 N은 `slots[n = N].spell`이며 `show`에 따라 표시됩니다. ID가 없는 슬롯은 비워 둡니다.
- **오라**는 첫 번째부터 순서대로: `auras[n = 1].spell`, `auras[n = 2].spell`… 중간에 ID가 없는 오라가 있으면 오류입니다.
- **직업과 전문화**는 `specID`에서 가져옵니다.
- **적 수 측정**은 `enemies.range`와 `enemies.combatOnly`에서 가져옵니다.
- KeyRota 프로필에 같은 전문화의 Better Assistant 프로필이 이미 있으면, 그 프로필의 나머지 설정과 일치하는 슬롯 및 오라는 유지됩니다.

게임에서: `/ba` — Profile — 붙여넣기 — Apply.

### JSON Schema

형식의 스키마: [keyrota-rotation.schema.json](https://keyrota.app/documentation/keyrota-rotation.schema.json)(draft 2020-12). 필드, 형식, 범위, `offGcd` 없는 `queue`, 조건 문자열의 형태를 검사합니다. `n`과 이름이 고유한지, 조건 속 이름이 실제로 선언되었는지, 문자열을 ` and `로 나눈 뒤의 16개 제한은 검사하지 않습니다. 이 부분은 KeyRota가 불러올 때 검사합니다.

파일을 검사하려면:

```text
npx ajv-cli validate --spec=draft2020 -s keyrota-rotation.schema.json -d my-rotation.json
```


로테이션 파일에 `"$schema"` 필드를 넣지 마세요. KeyRota가 불필요한 필드로 처리합니다.

---

<!-- https://keyrota.app/documentation/ko/conditions -->

## 조건

조건은 한 가지를 확인합니다. 예: “대상에 목조르기가 걸려 있다”, “기력이 70% 이상이다”, “Burst가 켜져 있다”. 조건이 모여 그룹(AND)이 되고, 그룹이 모여 규칙(OR)이 됩니다. 빌더에서는 목록에서 조건을 고르고, KRC 텍스트와 JSON에서는 문자열로 씁니다. 이 문서의 예시는 문자열로 보여 줍니다.

### 문법

| 종류 | 형태 | 예시 |
|---|---|---|
| 오라: 있음 / 없음 | `Aura.up`, `Aura.down` | `Garrote_DoT.down` |
| 오라: 남은 시간, 중첩 | `Aura.duration op N`, `Aura.stacks op N` | `Rupture_DoT.duration <= 30` |
| 슬롯: 준비됨 / 준비 안 됨 | `Slot.ready`, `Slot.oncd` | `Kingsbane.ready` |
| 슬롯: 재사용 대기시간, 충전 | `Slot.cd op N`, `Slot.charges op N` | `Deathmark.cd <= 3` |
| 슬롯: 강조 | `Slot.glow`, `Slot.noglow` | `Ambush.glow` |
| 자원 | `Resource op N` | `Combo_Points >= 70` |
| 주변 적 수 | `enemies op N` | `enemies >= 3` |
| 대상과의 거리 | `target.distance op N` | `target.distance <= 8` |
| 스위치 | `aoe`, `st`, `cd`, `defensives`, `ground_spells`, `movement` `== 0` 또는 `== 1` | `cd == 1` |

**연산자:** `<`, `<=`, `==`, `=`(`==`와 같음), `>=`, `>`. “같지 않음” 연산자는 없습니다.

**숫자** `N`은 0–100의 정수입니다. 음수, 소수, 100보다 큰 수는 쓸 수 없습니다: `값 120 (0..100 범위 밖)`.

**공백**: 연산자 앞뒤의 공백은 선택 사항입니다. `Energy>=70`과 `Energy >= 70`은 같습니다. 이름 안이나 이름과 속성 사이에는 공백을 넣을 수 없습니다: `Garrote_DoT .up`이 아니라 `Garrote_DoT.up`.

**참조**는 이름(`Garrote_DoT`)이나 번호(`buff1`, `slot3`, `resource4`)로 합니다. 키워드는 소문자로 씁니다.

### 오라

오라는 오라 목록에 ID와 함께 선언한 내 강화 효과 또는 대상에게 건 내 약화 효과입니다. 다른 플레이어의 강화 효과와 약화 효과는 보이지 않습니다.

#### .up과 .down

`Envenom_Buff.up`: 오라가 있습니다. `Envenom_Buff.down`: 오라가 없습니다. 오라를 알 수 없으면(읽지 못하면) 둘 다 거짓입니다.

```text
use Garrote when  # 목조르기: 없으면 걸기
	Garrote_DoT.down
```


#### .duration: 남은 시간(백분율)

`Rupture_DoT.duration <= 30`: 오라의 **전체** 지속시간 중 30% 이하가 남았습니다. 전체 지속시간은 이번에 걸린 오라의 지속시간입니다. 연계 점수 5로 건 파열은 24초, 7로 건 파열은 32초 지속되므로 30%는 각각 7.2초와 9.6초입니다.

> [!IMPORTANT]
> 없는 오라는 남은 시간이 **0**입니다. 따라서 `Rupture_DoT.duration <= 30`은 파열이 아예 없을 때도 충족됩니다. 걸려 있는 오라만 갱신하려면 `Rupture_DoT.up and Rupture_DoT.duration <= 30`이라고 쓰고, “오라가 없음”은 `Rupture_DoT.down`이 들어간 별도의 그룹으로 처리하세요.

WoW의 판데믹 구간은 지속시간의 30%입니다. 이 구간 안에서 갱신하면 손실이 없습니다. 그래서 흔히 기준값으로 `<= 30`을 씁니다.

*KRC 텍스트:*

```text
use Rupture when  # 파열
	Combo_Points >= 70 and Rupture_DoT.down  # 출혈 없음
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # 판데믹 구간
```

*JSON:*

```json
{
  "use": "Rupture",
  "name": "파열",
  "when": [
    {"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "출혈 없음"},
    {"all": ["Combo_Points >= 70", "Rupture_DoT.up", "Rupture_DoT.duration <= 30"], "comment": "판데믹 구간"}
  ]
}
```


초를 백분율로 바꾸려면: `백분율 = 초 / 전체 지속시간 × 100`. 목조르기는 18초 지속되므로 “14초 남음”은 `<= 78`, “5.4초 남음”은 `<= 30`입니다.

**지속시간이 없는 오라**(은신 등)는 남은 시간이 항상 **1**로 읽힙니다. 이런 오라에는 `.up`과 `.down`만 쓰세요.

#### .stacks: 중첩 수

`Opportunity.stacks >= 6`: 오라가 6중첩 이상입니다. 없는 오라는 중첩이 0입니다.

> [!NOTE]
> 중첩 수는 2부터 셉니다. 1중첩인 오라는 중첩 표시가 없는 오라처럼 **0**으로 읽힙니다. 오라가 있는지 확인하려면 `.up`을 쓰고, `.stacks`는 2 이상의 기준값에 쓰세요.

```text
use Pistol_Shot when  # 기회 6중첩에서 권총 사격
	Opportunity.stacks >= 6 and Combo_Points < 80
```


### 슬롯

슬롯 조건은 **다른** 버튼의 상태를 읽습니다. 예를 들면 “죽음표식이 아직 준비되지 않았을 때만 독살을 누른다” 같은 경우입니다. 규칙 자체의 슬롯은 자동으로 확인됩니다. 그 주문을 사용할 수 없으면 KeyRota는 그냥 다음 규칙으로 넘어갑니다.

#### .ready와 .oncd

`Kingsbane.ready`: 전역 재사용 대기시간을 제외하면 슬롯의 주문을 사용할 수 있습니다. 다음을 모두 만족해야 합니다:

- 주문을 배웠습니다(특성을 찍었습니다).
- 자원이 충분합니다.
- 대상이 필요한 주문이라면 대상이 사거리 안에 있습니다.
- 재사용 대기시간이 0.2초 미만이거나 충전이 남아 있습니다.
- Better Assistant가 슬롯을 표시합니다(“대상 있을 때”: 대상이 있음, “전투 중”: 전투 중임).

`Kingsbane.oncd`: 재사용 대기시간뿐 아니라 위의 어떤 이유로든 슬롯이 **준비되지 않았습니다**. 상태를 알 수 없으면 둘 다 거짓입니다.

```text
use Preparation when  # 아드레날린 촉진, 미간 적중, 광기의 학살자가 모두 재사용 대기 중일 때 마음가짐
	Adrenaline_Rush.oncd and Between_the_Eyes.oncd and Killing_Spree.oncd
```


#### .cd: 남은 재사용 대기시간(백분율)

`Deathmark.cd <= 3`: 전체 재사용 대기시간 중 3% 이하가 남았습니다. `0`은 준비됨, `100`은 방금 사용함입니다. 전역 재사용 대기시간은 포함하지 않습니다. 충전형 주문의 `.cd`는 **다음** 충전의 재충전 시간이므로 `cd > 0`이어도 주문이 준비되어 있을 수 있습니다.

| 재사용 대기시간 | 1% = | 예시 |
|---|---|---|
| 30초 | 0.3초 | `X.cd <= 10`: 3초 이하 남음 |
| 1분 | 0.6초 | `Kingsbane.cd <= 3`: 1.8초 이하 남음 |
| 2분 | 1.2초 | `Deathmark.cd <= 3`: 3.6초 이하 남음, `Deathmark.cd >= 44`: 아직 52초 이상 남음 |
| 3분 | 1.8초 | `X.cd >= 50`: 아직 90초 이상 남음 |

대표적인 용도는 “큰 재사용 대기시간 기술을 위해 아껴 두기”입니다. 죽음표식이 곧 돌아온다면 왕의 파멸을 쓰지 않고, 죽음표식이 한참 남았다면 씁니다.

```text
use Kingsbane when  # 왕의 파멸
	cd == 1 and Deathmark_DoT.up  # 죽음표식 중
	or
	cd == 1 and Deathmark.cd >= 44  # 죽음표식까지 52초 이상
```


#### .charges

`Barbed_Shot.charges >= 2`: 주문의 충전이 2회 이상입니다. 충전이 없는 주문은 0입니다. 충전이 가득 차서 낭비되지 않게 하는 대표적인 패턴은 다음과 같습니다:

```text
use Barbed_Shot when  # 날카로운 사격
	Barbed_Shot.charges >= 2  # 충전 2회 모두: 재충전 낭비 방지
	or
	Barbed_Shot.charges == 1 and Barbed_Shot.cd <= 20  # 두 번째 충전이 거의 됨
```


#### .glow와 .noglow: 버튼 강조

`Ambush.glow`: 게임이 이 주문의 버튼을 강조하고 있습니다(발동 효과가 생기면 행동 단축바에서 보이는 것과 같은 빛). `Ambush.noglow`: 강조하지 않습니다. `.glow`는 게임에서 이 주문의 버튼이 실제로 빛날 때만 쓰세요. 확실하지 않다면 발동 효과로 생기는 강화 효과를 대신 확인하세요: `Blindside.up`.

### 자원

`Energy >= 70`: 최대 기력의 70% 이상입니다. **모든 자원은 0–100의 백분율**입니다: 생명력, 기력, 마나, 분노, 룬, 연계 점수.

| 자원 | 번호 | 예시 |
|---|---|---|
| 플레이어 생명력 | `resource1` (`PlayerHP`) | `PlayerHP <= 40`: 생명력 40% 이하 |
| 대상 생명력 | `resource2` (`TargetHP`) | `TargetHP >= 50`: 대상의 생명력이 아직 절반 이상. 대상이 없으면 알 수 없음 |
| 전문화 자원 | `resource3`부터 | `Energy >= 70`, `Combo_Points >= 70`, `Rage >= 40` |

**백분율로 바꾸기:** `백분율 = 값 / 최대치 × 100`. 최대 기력이 250이면 기력 175는 70%입니다. 최대 기력을 비롯한 자원의 최대치는 특성에 따라 바뀌므로, 백분율로 정한 기준값이 실제 수치보다 여러 캐릭터에 더 잘 맞습니다.

**연계 점수.** 최대 연계 점수가 7이면 1점은 약 14.3%입니다. 값은 정수로 바뀌는데, 반올림 방식에 따라 2점은 28 또는 29, 3점은 42 또는 43, 6점은 85 또는 86으로 읽힙니다. 그러므로 기준값은 **단계 사이의 중간**에 두세요. 그러면 어떻게 반올림하든 맞습니다.

| 연계 점수 | % | “N 이상” | “N 이하” |
|---|---|---|---|
| 0 | 0 | — | `< 7` |
| 1 | 14 | `>= 7` | `< 20` |
| 2 | 28–29 | `>= 20` | `< 35` |
| 3 | 42–43 | `>= 35` | `< 50` |
| 4 | 57 | `>= 50` | `< 65` |
| 5 | 71 | `>= 65` (`>= 70`) | `< 80` |
| 6 | 85–86 | `>= 80` | `< 95` |
| 7 | 100 | `>= 95` | — |

최대치가 다르면 “N 이상”은 `(N − 0.5) / 최대치 × 100`입니다. 최대 연계 점수가 5라면 “4 이상”은 `>= 70`, “5 이상”은 `>= 90`입니다.

### 주변 적 수

`enemies >= 3`: 측정 반경 안에 적이 3명 이상입니다. 반경과 “전투 중인 적만”은 “일반” 페이지에서 설정합니다(JSON에서는 `enemies.range`와 `enemies.combatOnly`). 적 수를 알 수 없으면 조건은 거짓입니다.

- 적을 세려면 게임에서 적 이름표가 켜져 있어야 하고(기본 키 V), 중요도가 낮은 적의 이름표도 숨기지 않아야 합니다.
- 반경은 기술에 맞춰 고르세요. 칼날 부채는 8미터 안을 공격하므로 “칼날 부채 또는 절단”에는 8이 정확한 반경입니다.
- 단일 대상에는 `enemies == 1`보다 `enemies <= 1`이 안전합니다. 적이 세어지지 않아도 규칙이 계속 작동하기 때문입니다.

### 대상과의 거리

`target.distance <= 8`: 대상이 8미터 이내에 있습니다. 대상이 없으면 거리를 알 수 없으므로 조건은 거짓입니다. 거리는 근삿값입니다. 거리가 기준을 확실히 만족할 때만 조건이 충족되고, 경계에 걸친 경우에는 거짓입니다.

```text
use Pistol_Shot when  # 대상이 근접 거리 밖, 20미터 이내
	target.distance >= 10 and target.distance <= 20
```


### 패널 스위치

스위치는 게임 위에 표시되는 빠른 설정 패널의 버튼과 그 단축키입니다. 스위치의 의미는 로테이션이 정합니다.

| 조건 | 패널 버튼 | 키: Windows, macOS | 일반적인 의미 |
|---|---|---|---|
| `aoe == 1` | 대상: 광역 | F2, ⌃⇧T, 순환 | 다중 대상 모드 강제 |
| `st == 1` | 대상: 단일 | F2, ⌃⇧T, 순환 | 단일 대상 강제 |
| `aoe == 0 and st == 0` | 대상: 자동 | F2, ⌃⇧T, 순환 | 규칙이 판단(보통 `enemies`로) |
| `cd == 1` | Burst | F3, ⌃⇧B | 주요 재사용 대기시간 기술: 지금 쓸지, 아껴 둘지 |
| `defensives == 1` | 치유 / 방어 | — | 치유 및 방어 기술 |
| `ground_spells == 1` | 지면 지정 | — | 지면에 위치를 지정하는 주문 |
| `movement == 1` | 이동 | — | 이동 중 행동 |

- `== 0` 또는 `== 1`로만 비교합니다.
- **`cd == 1`은 주문의 재사용 대기시간이 아니라 Burst 버튼입니다.** 슬롯의 재사용 대기시간은 `Slot.cd`입니다.
- `aoe`와 `st`가 동시에 1이 되는 일은 없습니다. 대상 모드 키를 누르면 자동, 단일, 광역 순으로 바뀝니다.
- 기본값은 Burst 켬, 대상 모드 자동, 나머지 버튼 끔입니다. KeyRota는 버튼 상태를 기억합니다.
- 패널 버튼은 로테이션이 그 스위치를 읽을 때만 활성화됩니다. Blizzard 프로필에서는 모두 흐리게 표시됩니다.
- 스위치는 알 수 없는 값이 되는 일이 없습니다.

### 조건 평가 방식

| 조건 | 값이 있음 | 오라가 없음 | 알 수 없음 |
|---|---|---|---|
| `X.up` | 참 | 거짓 | **거짓** |
| `X.down` | 거짓 | 참 | **거짓** |
| `X.duration op N`, `X.stacks op N` | 비교 | **0**과 비교 | **거짓** |
| `X.ready` / `X.oncd` | 준비 상태에 따라 | — | **거짓**(둘 다) |
| `X.glow` / `X.noglow` | 강조 여부에 따라 | — | **거짓**(둘 다) |
| `X.cd`, `X.charges`, 자원, `enemies`, `target.distance` | 비교 | — | **거짓** |
| 스위치 | 비교 | — | 해당 없음 |

그룹은 모든 조건이 참일 때 참입니다. 규칙은 그룹 중 하나라도 참이거나, 그룹이 아예 없을 때 충족됩니다.

### “아님”, 괄호, 그룹 안의 OR

KRC에는 `not`, `!=`, 괄호가 없습니다. 모두 그룹으로 표현합니다:

- **“아님”**은 짝이 되는 조건으로 씁니다: `.up`의 반대는 `.down`, `.ready`의 반대는 `.oncd`, `.glow`의 반대는 `.noglow`입니다. 숫자는 반대 연산자로 씁니다: `>= 70`의 반대는 `< 70`입니다.
- **(A or B) and C**는 그룹 두 개입니다: `A and C`, `B and C`.
- **A and not (B and C)**는 그룹 두 개입니다: `A and not-B`, `A and not-C`.
- **모든 그룹에 필요한 같은 조건**(정신 집중 보호 등)은 그룹마다 반복합니다.

```text
use Fan_of_Knives when  # 칼날 부채: (광역 모드 OR 자동 모드에서 적 2명 이상) AND 연계 점수 5 미만
	aoe == 1 and Combo_Points < 70
	or
	st == 0 and enemies >= 2 and Combo_Points < 70
```


### 요약표

| 조건 | 의미 |
|---|---|
| `X.up` / `X.down` | 오라 있음 / 없음 |
| `X.duration <= 30` | 30% 이하 남음(없는 오라는 0) |
| `X.up and X.duration <= 30` | 걸려 있고 갱신할 때가 됨 |
| `X.stacks >= 2` | 2중첩 이상(1중첩은 0으로 읽힘) |
| `X.ready` / `X.oncd` | 슬롯 준비됨 / 어떤 이유로든 준비 안 됨 |
| `X.cd <= 3` | 재사용 대기시간 3% 이하 남음 |
| `X.charges >= 2` | 충전 2회 이상 |
| `X.glow` / `X.noglow` | 버튼 강조됨 / 강조 안 됨 |
| `PlayerHP <= 40` | 내 생명력 40% 이하 |
| `TargetHP >= 50` | 대상 생명력 50% 이상(대상이 없으면 거짓) |
| `Combo_Points >= 70` | 연계 점수 7점 중 5점 이상 |
| `Energy >= 70` | 기력 70% 이상 |
| `enemies >= 3` | 반경 안에 적 3명 이상 |
| `target.distance <= 8` | 대상이 8미터 이내(대상이 없으면 거짓) |
| `aoe == 1` / `st == 1` | 광역 / 단일 모드 |
| `aoe == 0 and st == 0` | 자동 모드 |
| `cd == 1` | Burst 켬 |
| `defensives == 1` | 치유 / 방어 켬 |
| `ground_spells == 1` | 지면 지정 켬 |
| `movement == 1` | 이동 켬 |

---

<!-- https://keyrota.app/documentation/ko/patterns -->

## 패턴 예시

각 패턴은 작지만 완전한 로테이션입니다. 왼쪽은 KRC 텍스트, 오른쪽은 같은 내용의 JSON입니다. 빌더에 붙여넣으면(“텍스트 및 JSON — 붙여넣기”) “슬롯”과 “규칙” 페이지에서 어떻게 보이는지 확인할 수 있습니다. 주문 ID는 Wowhead의 실제 ID입니다. 마지막에는 [완성된 로테이션](#example-files)이 있습니다.

### 판데믹 구간에서 갱신하는 DoT

DoT가 없으면 걸고, 30% 이하가 남으면 갱신합니다. 이 구간 안에서 갱신하면 손실이 없습니다. 없는 오라는 남은 시간이 0이므로 갱신은 `.up`이 들어간 별도의 그룹으로 만듭니다.

*KRC 텍스트:*

```text
rotation "패턴: 판데믹 구간을 고려한 DoT"

buff1	Garrote_DoT = "대상의 목조르기 [703]"
slot1	Garrote = "목조르기"
slot4	Mutilate = "절단"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Garrote when  # 목조르기
	Garrote_DoT.down  # 출혈 없음
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30  # 판데믹 구간

use Mutilate when  # 절단
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "패턴: 판데믹 구간을 고려한 DoT",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "대상의 목조르기 [703]", "spell": 703}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "목조르기", "spell": 703},
    {"n": 4, "alias": "Mutilate", "label": "절단", "spell": 1329}
  ],
  "rules": [
    {"use": "Garrote", "name": "목조르기", "when": [
      {"all": ["Garrote_DoT.down"], "comment": "출혈 없음"},
      {"all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"], "comment": "판데믹 구간"}
    ]},
    {"use": "Mutilate", "name": "절단"}
  ]
}
```


- 대상이 3명 이상일 때 곧 죽을 대상에게 새 DoT를 걸지 않으려면 “출혈 없음” 그룹에 `TargetHP >= 50`을 추가하고, 대상 1–2명용으로 `Garrote_DoT.down and enemies <= 2` 그룹을 따로 만드세요.
- 지속시간이 달라지는 긴 DoT(파열: 4초 + 연계 점수당 4초)도 같은 방식입니다. 백분율은 그때 걸린 오라의 지속시간을 기준으로 합니다.

### 연계 점수에 따른 생성기와 소모 기술

연계 점수 7점 중 5점 이상이면 소모하고, 그보다 적으면 쌓습니다. 기준값은 단계 사이의 중간에 둡니다. [연계 점수 표](https://keyrota.app/documentation/ko/conditions#resources)를 참고하세요.

*KRC 텍스트:*

```text
rotation "패턴: 생성기와 소모 기술"

slot3	Envenom = "독살"
slot4	Mutilate = "절단"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Envenom when  # 독살
	Combo_Points >= 70  # 연계 점수 5 이상

use Mutilate when  # 절단
	Combo_Points < 70  # 연계 점수 5 미만
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "패턴: 생성기와 소모 기술",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 3, "alias": "Envenom", "label": "독살", "spell": 32645},
    {"n": 4, "alias": "Mutilate", "label": "절단", "spell": 1329}
  ],
  "rules": [
    {"use": "Envenom", "name": "독살", "when": [
      {"all": ["Combo_Points >= 70"], "comment": "연계 점수 5 이상"}
    ]},
    {"use": "Mutilate", "name": "절단", "when": [
      {"all": ["Combo_Points < 70"], "comment": "연계 점수 5 미만"}
    ]}
  ]
}
```


`Combo_Points < 70` 조건이 있는 생성기는 연계 점수를 넘치게 하지 않습니다. 연계 점수가 5 이상이면 소모 기술이 아직 준비되지 않았더라도(기력 부족) 생성기는 실행되지 않고, KeyRota는 기다립니다.

### 자원 모으기

바로 소모하지 않고 강화 효과를 유지하면서 기력을 모읍니다. 독살은 효과가 끝나 갈 때, 죽음표식 중일 때, 기력이 많을 때 씁니다. 그 밖의 시간에는 연계 점수 5 이상에서 맞는 규칙이 없으므로 KeyRota는 기력이 더 찰 때까지 기다립니다. 이것이 자원 모으기입니다.

*KRC 텍스트:*

```text
rotation "패턴: 기력 모으기"

buff3	Envenom_Buff = "독살 [32645]"
buff4	Deathmark_DoT = "대상의 죽음표식 [360194]"
slot3	Envenom = "독살"
slot4	Mutilate = "절단"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Envenom when  # 독살
	Combo_Points >= 70 and Envenom_Buff.down  # 효과 없음
	or
	Combo_Points >= 70 and Envenom_Buff.duration <= 20  # 효과 종료 직전
	or
	Combo_Points >= 70 and Deathmark_DoT.up  # 죽음표식 중
	or
	Combo_Points >= 70 and Energy >= 70  # 기력 넘치지 않게

use Mutilate when  # 절단
	Combo_Points < 70
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "패턴: 기력 모으기",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 3, "alias": "Envenom_Buff", "label": "독살 [32645]", "spell": 32645},
    {"n": 4, "alias": "Deathmark_DoT", "label": "대상의 죽음표식 [360194]", "spell": 360194}
  ],
  "slots": [
    {"n": 3, "alias": "Envenom", "label": "독살", "spell": 32645},
    {"n": 4, "alias": "Mutilate", "label": "절단", "spell": 1329}
  ],
  "rules": [
    {"use": "Envenom", "name": "독살", "when": [
      {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "효과 없음"},
      {"all": ["Combo_Points >= 70", "Envenom_Buff.duration <= 20"], "comment": "효과 종료 직전"},
      {"all": ["Combo_Points >= 70", "Deathmark_DoT.up"], "comment": "죽음표식 중"},
      {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "기력 넘치지 않게"}
    ]},
    {"use": "Mutilate", "name": "절단", "when": [
      {"all": ["Combo_Points < 70"]}
    ]}
  ]
}
```


- `Energy >= 70` 기준값은 기력이 가득 차서 넘치는 것을 막습니다.
- `Envenom_Buff.duration <= 20` 그룹은 효과가 없을 때도(남은 시간 0) 충족됩니다. `.down` 그룹은 알아보기 쉽도록 넣은 것입니다.
- 모으는 정도를 조절하려면 기력 기준값만 바꾸세요. 낮추면 더 일찍 소모하고, 높이면 더 오래 모읍니다.

### 단일 대상과 다중 대상

대상 모드는 플레이어가 대상 모드 키로 정합니다(자동, 단일, 광역 순으로 바뀜). 자동 모드에서는 규칙이 적 수로 판단합니다. 광역 규칙마다 “광역 모드”와 “자동 모드, 적 2명 이상” 그룹을 두고, 단일 대상 규칙에는 “단일 모드”와 “자동 모드, 적 1명 이하” 그룹을 둡니다.

*KRC 텍스트:*

```text
rotation "패턴: 단일 대상과 다중 대상"

slot3	Envenom = "독살"
slot4	Mutilate = "절단"
slot6	Fan_of_Knives = "칼날 부채"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Envenom when  # 독살
	Combo_Points >= 70

use Fan_of_Knives when  # 칼날 부채: 대상 2명 이상
	aoe == 1 and Combo_Points < 70  # 광역 모드
	or
	st == 0 and enemies >= 2 and Combo_Points < 70  # 자동 모드, 적 2명 이상

use Mutilate when  # 절단: 단일 대상
	st == 1 and Combo_Points < 70  # 단일 모드
	or
	aoe == 0 and enemies <= 1 and Combo_Points < 70  # 자동 모드, 적 1명
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "패턴: 단일 대상과 다중 대상",
  "specID": 259,
  "enemies": {"range": 8, "combatOnly": true},
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 3, "alias": "Envenom", "label": "독살", "spell": 32645},
    {"n": 4, "alias": "Mutilate", "label": "절단", "spell": 1329},
    {"n": 6, "alias": "Fan_of_Knives", "label": "칼날 부채", "spell": 51723}
  ],
  "rules": [
    {"use": "Envenom", "name": "독살", "when": [
      {"all": ["Combo_Points >= 70"]}
    ]},
    {"use": "Fan_of_Knives", "name": "칼날 부채: 대상 2명 이상", "when": [
      {"all": ["aoe == 1", "Combo_Points < 70"], "comment": "광역 모드"},
      {"all": ["st == 0", "enemies >= 2", "Combo_Points < 70"], "comment": "자동 모드, 적 2명 이상"}
    ]},
    {"use": "Mutilate", "name": "절단: 단일 대상", "when": [
      {"all": ["st == 1", "Combo_Points < 70"], "comment": "단일 모드"},
      {"all": ["aoe == 0", "enemies <= 1", "Combo_Points < 70"], "comment": "자동 모드, 적 1명"}
    ]}
  ]
}
```


- `st == 0 and enemies >= 2`는 “단일 모드가 아님”을 뜻합니다. 광역 모드에서는 어차피 첫 번째 그룹으로 규칙이 실행됩니다.
- `enemies == 1`보다 `enemies <= 1`이 안전합니다. 대상이 하나일 때 적이 세어지지 않을 수도 있기 때문입니다.
- 측정 반경(`enemies.range`)은 광역 기술에 맞추세요. 칼날 부채는 8미터 안을 공격합니다.

### Burst에 묶은 재사용 대기시간 기술과 “그 기술 중에만”

`cd == 1`은 Burst 버튼입니다. 주요 재사용 대기시간 기술은 Burst가 켜져 있을 때만 누르고, Burst를 꺼서 아껴 둘 수 있습니다. 예를 들어 보스가 면역이 되는 단계 전에 끕니다. 재사용 대기시간 기술의 효과를 키우는 기술은 그 기술이 유지되는 동안에만 누릅니다. 여기서는 소멸은 대상에 죽음표식이 있을 때만, 왕의 파멸은 죽음표식 중이거나 죽음표식이 한참 남았을 때 누릅니다.

*KRC 텍스트:*

```text
rotation "패턴: Burst"

buff1	Garrote_DoT = "대상의 목조르기 [703]"
buff2	Rupture_DoT = "대상의 파열 [1943]"
buff4	Deathmark_DoT = "대상의 죽음표식 [360194]"
buff10	Vanish_Buff = "소멸 [11327]"
slot1	Garrote = "목조르기"
slot4	Mutilate = "절단"
slot8	Deathmark = "죽음표식"
slot9	Kingsbane = "왕의 파멸"
slot10	Vanish = "소멸"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Garrote when  # 은신 중 목조르기
	Vanish_Buff.up

use Deathmark when  # 죽음표식
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up  # Burst 켬, 출혈 유지 중

use Kingsbane when  # 왕의 파멸
	cd == 1 and Deathmark_DoT.up and Combo_Points < 50  # 죽음표식 중, 연계 점수 0–3
	or
	cd == 1 and Deathmark.cd >= 44 and Combo_Points < 50  # 죽음표식까지 52초 이상

use Vanish when  # 소멸
	Deathmark_DoT.up and Combo_Points < 65  # 죽음표식 중, 연계 점수 0–4

use Mutilate when  # 절단
	Combo_Points < 70
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "패턴: Burst",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "대상의 목조르기 [703]", "spell": 703},
    {"n": 2, "alias": "Rupture_DoT", "label": "대상의 파열 [1943]", "spell": 1943},
    {"n": 4, "alias": "Deathmark_DoT", "label": "대상의 죽음표식 [360194]", "spell": 360194},
    {"n": 10, "alias": "Vanish_Buff", "label": "소멸 [11327]", "spell": 11327}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "목조르기", "spell": 703},
    {"n": 4, "alias": "Mutilate", "label": "절단", "spell": 1329},
    {"n": 8, "alias": "Deathmark", "label": "죽음표식", "spell": 360194},
    {"n": 9, "alias": "Kingsbane", "label": "왕의 파멸", "spell": 385627},
    {"n": 10, "alias": "Vanish", "label": "소멸", "spell": 1856, "offGcd": true, "queue": true}
  ],
  "rules": [
    {"use": "Garrote", "name": "은신 중 목조르기", "when": [
      {"all": ["Vanish_Buff.up"]}
    ]},
    {"use": "Deathmark", "name": "죽음표식", "when": [
      {"all": ["cd == 1", "Garrote_DoT.up", "Rupture_DoT.up"], "comment": "Burst 켬, 출혈 유지 중"}
    ]},
    {"use": "Kingsbane", "name": "왕의 파멸", "when": [
      {"all": ["cd == 1", "Deathmark_DoT.up", "Combo_Points < 50"], "comment": "죽음표식 중, 연계 점수 0–3"},
      {"all": ["cd == 1", "Deathmark.cd >= 44", "Combo_Points < 50"], "comment": "죽음표식까지 52초 이상"}
    ]},
    {"use": "Vanish", "name": "소멸", "when": [
      {"all": ["Deathmark_DoT.up", "Combo_Points < 65"], "comment": "죽음표식 중, 연계 점수 0–4"}
    ]},
    {"use": "Mutilate", "name": "절단", "when": [
      {"all": ["Combo_Points < 70"]}
    ]}
  ]
}
```


- 소멸은 GCD 무관이지만 “주문 대기열 구간”도 켜져 있습니다(**O + Q**). 그렇지 않으면 왕의 파멸 직후 GCD 도중에, 왕의 파멸로 얻는 연계 점수가 들어오기 전에 눌려서 이전 연계 점수를 확인하게 됩니다.
- Burst를 끄면 죽음표식과 왕의 파멸은 기다리고, 소멸은 죽음표식을 기다립니다.
- 왕의 파멸은 연계 점수 0–3에서 씁니다. 왕의 파멸 후 연계 점수가 5점 더 들어오므로 낭비가 없습니다.

### 정신 집중 보호

게임은 일부 정신 집중을 마지막 타격보다 조금 일찍 끝내며, 이때 다음 입력이 정신 집중을 끊습니다. 정신 집중 자체의 오라로 이를 막습니다. 오라가 8% 넘게 남아 있는 동안에는 어떤 규칙도 충족되지 않게 하는 것입니다. 이 조건은 모든 규칙의 **모든** 그룹에 들어갑니다. 정신 집중 슬롯의 플래그 **C**는 시작할 때 두 번 눌리지 않게 합니다.

*KRC 텍스트:*

```text
rotation "패턴: 정신 집중 보호"

buff10	Killing_Spree_Buff = "광기의 학살자, 정신 집중 [51690]"
slot8	Killing_Spree = "광기의 학살자"
slot9	Dispatch = "속결"
slot11	Sinister_Strike = "사악한 일격"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Killing_Spree when  # 광기의 학살자
	Combo_Points >= 80 and Killing_Spree_Buff.duration <= 8

use Dispatch when  # 속결
	Combo_Points >= 80 and Killing_Spree_Buff.duration <= 8

use Sinister_Strike when  # 사악한 일격
	Combo_Points < 80 and Killing_Spree_Buff.duration <= 8
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "패턴: 정신 집중 보호",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 10, "alias": "Killing_Spree_Buff", "label": "광기의 학살자, 정신 집중 [51690]", "spell": 51690}
  ],
  "slots": [
    {"n": 8, "alias": "Killing_Spree", "label": "광기의 학살자", "spell": 51690, "channel": true},
    {"n": 9, "alias": "Dispatch", "label": "속결", "spell": 2098},
    {"n": 11, "alias": "Sinister_Strike", "label": "사악한 일격", "spell": 193315}
  ],
  "rules": [
    {"use": "Killing_Spree", "name": "광기의 학살자", "when": [
      {"all": ["Combo_Points >= 80", "Killing_Spree_Buff.duration <= 8"]}
    ]},
    {"use": "Dispatch", "name": "속결", "when": [
      {"all": ["Combo_Points >= 80", "Killing_Spree_Buff.duration <= 8"]}
    ]},
    {"use": "Sinister_Strike", "name": "사악한 일격", "when": [
      {"all": ["Combo_Points < 80", "Killing_Spree_Buff.duration <= 8"]}
    ]}
  ]
}
```


- `.down`이 아니라 `<= 8`을 쓰는 이유: 정신 집중이 없으면 오라의 남은 시간이 0이므로 조건이 충족됩니다. 정신 집중 중에는 마지막 8%만 기다리며, 정신 집중이 끝난 뒤 불필요하게 몇 분의 1초를 더 기다리지 않습니다.
- 오라를 읽지 못하면 모든 규칙에서 조건이 거짓이 되어 KeyRota는 아무것도 누르지 않습니다. 정신 집중을 끊는 것보다 한 번 건너뛰는 편이 낫습니다. 그러므로 정신 집중 오라는 반드시 Better Assistant 프로필에 넣어야 합니다.

### 주문 대기열 구간에서 누르는 GCD 무관 매크로

“GCD 무관”에는 두 가지가 있습니다:
- **O**: GCD 도중이라도 버튼을 바로 누릅니다. 도박의 연속(뼈주사위 연장)은 이렇게 시간 손실 없이 씁니다.
- **O + Q**: 버튼 자체는 GCD와 무관하지만 매크로나 그 결과가 GCD에 좌우됩니다. 둘째 줄에 광기의 학살자(GCD 사용)가 있는 아드레날린 촉진 매크로는 GCD가 끝날 무렵 주문 대기열 구간에 누르며, 광기의 학살자는 아드레날린 촉진 직후 바로 나갑니다.

*게임 속 매크로 (슬롯 1):*

```text
#showtooltip 아드레날린 촉진
/cast 아드레날린 촉진
/cast 광기의 학살자
```


*KRC 텍스트:*

```text
rotation "패턴: GCD 무관"

buff2	Triple_Threat = "뼈주사위, 3단계 [1214935]"
buff3	Jackpot = "뼈주사위, 4단계 [1214937]"
buff6	Adrenaline_Rush_Buff = "아드레날린 촉진 [13750]"
slot1	Adrenaline_Rush = "아드레날린 촉진 + 광기의 학살자 (매크로)"
slot4	Keep_It_Rolling = "도박의 연속"
slot11	Sinister_Strike = "사악한 일격"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Adrenaline_Rush when  # 아드레날린 촉진 (+ 매크로로 광기의 학살자)
	Adrenaline_Rush_Buff.down and Combo_Points >= 7 and Combo_Points < 80  # 연계 점수 1–5: 0이면 매크로의 광기의 학살자가 시전되지 않음

use Keep_It_Rolling when  # 도박의 연속
	Triple_Threat.up
	or
	Jackpot.up

use Sinister_Strike when  # 사악한 일격
	Combo_Points < 80
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "패턴: GCD 무관",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 2, "alias": "Triple_Threat", "label": "뼈주사위, 3단계 [1214935]", "spell": 1214935},
    {"n": 3, "alias": "Jackpot", "label": "뼈주사위, 4단계 [1214937]", "spell": 1214937},
    {"n": 6, "alias": "Adrenaline_Rush_Buff", "label": "아드레날린 촉진 [13750]", "spell": 13750}
  ],
  "slots": [
    {"n": 1, "alias": "Adrenaline_Rush", "label": "아드레날린 촉진 + 광기의 학살자 (매크로)", "spell": 13750, "offGcd": true, "queue": true},
    {"n": 4, "alias": "Keep_It_Rolling", "label": "도박의 연속", "spell": 381989, "offGcd": true},
    {"n": 11, "alias": "Sinister_Strike", "label": "사악한 일격", "spell": 193315}
  ],
  "rules": [
    {"use": "Adrenaline_Rush", "name": "아드레날린 촉진 (+ 매크로로 광기의 학살자)", "when": [
      {"all": ["Adrenaline_Rush_Buff.down", "Combo_Points >= 7", "Combo_Points < 80"], "comment": "연계 점수 1–5: 0이면 매크로의 광기의 학살자가 시전되지 않음"}
    ]},
    {"use": "Keep_It_Rolling", "name": "도박의 연속", "when": [
      {"all": ["Triple_Threat.up"]},
      {"all": ["Jackpot.up"]}
    ]},
    {"use": "Sinister_Strike", "name": "사악한 일격", "when": [
      {"all": ["Combo_Points < 80"]}
    ]}
  ]
}
```


매크로 슬롯의 ID는 매크로의 주 주문 ID(아드레날린 촉진, 13750)입니다. Better Assistant는 이 ID로 매크로의 주문을 슬롯에 넣고, KeyRota는 행동 단축바에 있는 매크로 버튼에서 키를 가져옵니다.

### 생명력에 따른 방어 기술

생명력이 기준 아래로 떨어지면 치유나 방어 기술을 쓰되, 패널에서 “치유 / 방어”가 켜져 있을 때만 씁니다. 대상 없이도 작동하도록 슬롯은 **전투 중**에 표시합니다(“전투 중”, `"show": "combat"`). 생명력이 낮을 때는 피해보다 생존이 중요하므로 이 규칙을 맨 앞에 둡니다.

*KRC 텍스트:*

```text
rotation "패턴: 생명력에 따른 방어 기술"

slot4	Mutilate = "절단"
slot11	Crimson_Vial = "진홍색 약병"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Crimson_Vial when  # 진홍색 약병
	defensives == 1 and PlayerHP <= 40  # 생명력 40% 이하

use Mutilate when  # 절단
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "패턴: 생명력에 따른 방어 기술",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 4, "alias": "Mutilate", "label": "절단", "spell": 1329},
    {"n": 11, "alias": "Crimson_Vial", "label": "진홍색 약병", "spell": 185311, "show": "combat"}
  ],
  "rules": [
    {"use": "Crimson_Vial", "name": "진홍색 약병", "when": [
      {"all": ["defensives == 1", "PlayerHP <= 40"], "comment": "생명력 40% 이하"}
    ]},
    {"use": "Mutilate", "name": "절단"}
  ]
}
```


“치유 / 방어”는 기본적으로 꺼져 있습니다. 방어 기술을 자동으로 쓰려면 빠른 설정 패널에서 켜세요.

### 발동 효과: 강화 효과 또는 강조로 확인

발동 효과는 그로 인해 생기는 강화 효과로 확인하세요. 암살 레이드 로테이션에서는 사각 지대 강화 효과(`Blindside.up`)가 있어야 매복 규칙이 실행됩니다. 발동 효과가 생겼을 때 게임이 버튼을 강조한다면 규칙에서 강조(`Ambush.glow`)를 읽을 수도 있지만, 행동 단축바에서 그 강조가 실제로 보일 때만 그렇게 하세요.

*KRC 텍스트:*

```text
rotation "패턴: 발동 효과"

buff7	Blindside = "사각 지대 [121153]"
slot4	Mutilate = "절단"
slot5	Ambush = "매복"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Ambush when  # 매복 (사각 지대)
	Blindside.up and Combo_Points < 70

use Mutilate when  # 절단
	Combo_Points < 70
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "패턴: 발동 효과",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 7, "alias": "Blindside", "label": "사각 지대 [121153]", "spell": 121153}
  ],
  "slots": [
    {"n": 4, "alias": "Mutilate", "label": "절단", "spell": 1329},
    {"n": 5, "alias": "Ambush", "label": "매복", "spell": 8676}
  ],
  "rules": [
    {"use": "Ambush", "name": "매복 (사각 지대)", "when": [
      {"all": ["Blindside.up", "Combo_Points < 70"]}
    ]},
    {"use": "Mutilate", "name": "절단", "when": [
      {"all": ["Combo_Points < 70"]}
    ]}
  ]
}
```


### 충전

충전형 주문은 충전이 2회일 때나 두 번째 충전이 거의 찼을 때 눌러서 재충전이 쉬지 않게 합니다. 예: 사냥꾼의 날카로운 사격(충전 2회).

*KRC 텍스트:*

```text
rotation "패턴: 충전"

slot1	Barbed_Shot = "날카로운 사격"
slot2	Kill_Command = "살상 명령"
resource1	PlayerHP
resource2	TargetHP
resource3	Focus

use Barbed_Shot when  # 날카로운 사격
	Barbed_Shot.charges >= 2  # 충전 2회 모두
	or
	Barbed_Shot.charges == 1 and Barbed_Shot.cd <= 20  # 두 번째 충전이 거의 됨

use Kill_Command when  # 살상 명령
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "패턴: 충전",
  "specID": 253,
  "resources": ["PlayerHP", "TargetHP", "Focus"],
  "slots": [
    {"n": 1, "alias": "Barbed_Shot", "label": "날카로운 사격", "spell": 217200},
    {"n": 2, "alias": "Kill_Command", "label": "살상 명령", "spell": 34026}
  ],
  "rules": [
    {"use": "Barbed_Shot", "name": "날카로운 사격", "when": [
      {"all": ["Barbed_Shot.charges >= 2"], "comment": "충전 2회 모두"},
      {"all": ["Barbed_Shot.charges == 1", "Barbed_Shot.cd <= 20"], "comment": "두 번째 충전이 거의 됨"}
    ]},
    {"use": "Kill_Command", "name": "살상 명령"}
  ]
}
```


충전형 주문의 `.cd`는 다음 충전의 재충전 시간입니다. `Barbed_Shot.cd <= 20`은 재충전 시간이 20% 이하 남았다는 뜻입니다.

### 대상과의 거리

대상이 근접 거리 밖에 있지만 원거리 기술의 사거리 안에 있다면, 가만히 있지 말고 그 기술을 누릅니다. 대상이 없으면 거리를 알 수 없으므로 규칙은 실행되지 않습니다.

*KRC 텍스트:*

```text
rotation "패턴: 거리"

slot10	Pistol_Shot = "권총 사격"
slot11	Sinister_Strike = "사악한 일격"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Pistol_Shot when  # 권총 사격: 대상이 멂
	target.distance >= 10 and target.distance <= 20 and Combo_Points < 80

use Sinister_Strike when  # 사악한 일격
	Combo_Points < 80
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "패턴: 거리",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 10, "alias": "Pistol_Shot", "label": "권총 사격", "spell": 185763},
    {"n": 11, "alias": "Sinister_Strike", "label": "사악한 일격", "spell": 193315}
  ],
  "rules": [
    {"use": "Pistol_Shot", "name": "권총 사격: 대상이 멂", "when": [
      {"all": ["target.distance >= 10", "target.distance <= 20", "Combo_Points < 80"]}
    ]},
    {"use": "Sinister_Strike", "name": "사악한 일격", "when": [
      {"all": ["Combo_Points < 80"]}
    ]}
  ]
}
```


근접 규칙은 거리를 확인할 필요가 없습니다. 대상이 너무 멀면 주문을 사용할 수 없으므로 KeyRota가 알아서 다음 규칙으로 넘어갑니다.

### 이동

패널의 “이동” 버튼은 로테이션에 보내는 신호입니다: “이제 움직여야 한다”. 무엇을 할지는 로테이션이 정합니다. 예를 들어 원거리 기술로 바꿀 수 있습니다.

*KRC 텍스트:*

```text
rotation "패턴: 이동"

slot10	Pistol_Shot = "권총 사격"
slot11	Sinister_Strike = "사악한 일격"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Pistol_Shot when  # 이동 중 권총 사격
	movement == 1 and Combo_Points < 80

use Sinister_Strike when  # 사악한 일격
	movement == 0 and Combo_Points < 80
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "패턴: 이동",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 10, "alias": "Pistol_Shot", "label": "권총 사격", "spell": 185763},
    {"n": 11, "alias": "Sinister_Strike", "label": "사악한 일격", "spell": 193315}
  ],
  "rules": [
    {"use": "Pistol_Shot", "name": "이동 중 권총 사격", "when": [
      {"all": ["movement == 1", "Combo_Points < 80"]}
    ]},
    {"use": "Sinister_Strike", "name": "사악한 일격", "when": [
      {"all": ["movement == 0", "Combo_Points < 80"]}
    ]}
  ]
}
```


### 지면 지정 주문

“지면 지정” 버튼은 바닥에 위치를 지정하는 주문을 허용합니다. KeyRota는 키만 누르므로 위치는 매크로로 정합니다: `[@player]`는 발밑, `[@cursor]`는 커서 아래입니다.

*게임 속 매크로:*

```text
#showtooltip 죽음과 부패
/cast [@player] 죽음과 부패
```


*KRC 텍스트:*

```text
rotation "패턴: 지면 지정 주문"

slot1	Death_and_Decay = "죽음과 부패 (매크로 @player)"
resource1	PlayerHP
resource2	TargetHP
resource3	Runes
resource4	Runic_Power

use Death_and_Decay when  # 죽음과 부패
	ground_spells == 1 and enemies >= 2  # 지면 지정 켬, 적 2명 이상
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "패턴: 지면 지정 주문",
  "specID": 250,
  "resources": ["PlayerHP", "TargetHP", "Runes", "Runic_Power"],
  "slots": [
    {"n": 1, "alias": "Death_and_Decay", "label": "죽음과 부패 (매크로 @player)", "spell": 43265}
  ],
  "rules": [
    {"use": "Death_and_Decay", "name": "죽음과 부패", "when": [
      {"all": ["ground_spells == 1", "enemies >= 2"], "comment": "지면 지정 켬, 적 2명 이상"}
    ]}
  ]
}
```


### 완성된 입문용 로테이션

[빌더 예시](https://keyrota.app/documentation/ko/editor#walkthrough)의 로테이션입니다. DoT 2개, 생성기, 자원을 모으는 소모 기술, 방어 기술, Burst에 묶은 죽음표식으로 구성됩니다.

*KRC 텍스트:*

```text
rotation "암살: 예시 v1"

# KeyRota 문서의 예시: 출혈 2개, 생성기, 기력을 모으는 소모 기술,
# 낮은 생명력에서의 방어, Burst 버튼에 묶은 죽음표식.
# 연계 점수(최대 7)의 백분율: 5점 = 71%, 기준 70 = 5 이상.

buff1	Garrote_DoT = "대상의 목조르기 [703]"
buff2	Rupture_DoT = "대상의 파열 [1943]"
buff3	Envenom_Buff = "독살 [32645]"
buff4	Deathmark_DoT = "대상의 죽음표식 [360194]"
slot1	Garrote = "목조르기"
slot2	Rupture = "파열"
slot3	Envenom = "독살"
slot4	Mutilate = "절단"
slot5	Deathmark = "죽음표식"
slot6	Crimson_Vial = "진홍색 약병"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

# --- 방어: ‘치유 / 방어’를 켰을 때만 ---
use Crimson_Vial when  # 진홍색 약병
	defensives == 1 and PlayerHP <= 40  # 생명력 40% 이하

# --- 재사용 대기시간 기술: Burst를 켰을 때만 ---
use Deathmark when  # 죽음표식
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up and Envenom_Buff.up  # Burst 켬, 출혈과 독살 유지 중

# --- 출혈 ---
use Garrote when  # 목조르기
	Garrote_DoT.down  # 출혈 없음
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30  # 판데믹 구간: 30% 이하 남음

use Rupture when  # 파열
	Combo_Points >= 70 and Rupture_DoT.down  # 연계 점수 5 이상, 출혈 없음
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # 연계 점수 5 이상, 판데믹 구간

# --- 소모: 연계 점수 5 이상, 기력 모으기 ---
use Envenom when  # 독살
	Combo_Points >= 70 and Envenom_Buff.down  # 효과 없음
	or
	Combo_Points >= 70 and Envenom_Buff.up and Envenom_Buff.duration <= 20  # 효과 종료 직전
	or
	Combo_Points >= 70 and Energy >= 70  # 기력 넘치지 않게
	or
	Combo_Points >= 70 and Deathmark_DoT.up  # 대상에 죽음표식

# --- 생성기: 연계 점수 5 미만 ---
use Mutilate when  # 절단
	Combo_Points < 70  # 연계 점수 5 미만
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "암살: 예시 v1",
  "specID": 259,
  "ignoreMainIcon": true,
  "enemies": {"range": 8, "combatOnly": true},
  "notes": [
    "KeyRota 문서의 예시: 출혈 2개, 생성기, 기력을 모으는 소모 기술,",
    "낮은 생명력에서의 방어, Burst 버튼에 묶은 죽음표식.",
    "연계 점수(최대 7)의 백분율: 5점 = 71%, 기준 70 = 5 이상."
  ],
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "대상의 목조르기 [703]", "spell": 703},
    {"n": 2, "alias": "Rupture_DoT", "label": "대상의 파열 [1943]", "spell": 1943},
    {"n": 3, "alias": "Envenom_Buff", "label": "독살 [32645]", "spell": 32645},
    {"n": 4, "alias": "Deathmark_DoT", "label": "대상의 죽음표식 [360194]", "spell": 360194}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "목조르기", "spell": 703, "show": "target"},
    {"n": 2, "alias": "Rupture", "label": "파열", "spell": 1943, "show": "target"},
    {"n": 3, "alias": "Envenom", "label": "독살", "spell": 32645, "show": "target"},
    {"n": 4, "alias": "Mutilate", "label": "절단", "spell": 1329, "show": "target"},
    {"n": 5, "alias": "Deathmark", "label": "죽음표식", "spell": 360194, "show": "target"},
    {"n": 6, "alias": "Crimson_Vial", "label": "진홍색 약병", "spell": 185311, "show": "combat"}
  ],
  "rules": [
    {
      "use": "Crimson_Vial",
      "name": "진홍색 약병",
      "note": ["--- 방어: ‘치유 / 방어’를 켰을 때만 ---"],
      "when": [{"all": ["defensives == 1", "PlayerHP <= 40"], "comment": "생명력 40% 이하"}]
    },
    {
      "use": "Deathmark",
      "name": "죽음표식",
      "note": ["--- 재사용 대기시간 기술: Burst를 켰을 때만 ---"],
      "when": [
        {
          "all": ["cd == 1", "Garrote_DoT.up", "Rupture_DoT.up", "Envenom_Buff.up"],
          "comment": "Burst 켬, 출혈과 독살 유지 중"
        }
      ]
    },
    {
      "use": "Garrote",
      "name": "목조르기",
      "note": ["--- 출혈 ---"],
      "when": [
        {"all": ["Garrote_DoT.down"], "comment": "출혈 없음"},
        {"all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"], "comment": "판데믹 구간: 30% 이하 남음"}
      ]
    },
    {
      "use": "Rupture",
      "name": "파열",
      "when": [
        {"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "연계 점수 5 이상, 출혈 없음"},
        {
          "all": ["Combo_Points >= 70", "Rupture_DoT.up", "Rupture_DoT.duration <= 30"],
          "comment": "연계 점수 5 이상, 판데믹 구간"
        }
      ]
    },
    {
      "use": "Envenom",
      "name": "독살",
      "note": ["--- 소모: 연계 점수 5 이상, 기력 모으기 ---"],
      "when": [
        {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "효과 없음"},
        {
          "all": ["Combo_Points >= 70", "Envenom_Buff.up", "Envenom_Buff.duration <= 20"],
          "comment": "효과 종료 직전"
        },
        {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "기력 넘치지 않게"},
        {"all": ["Combo_Points >= 70", "Deathmark_DoT.up"], "comment": "대상에 죽음표식"}
      ]
    },
    {
      "use": "Mutilate",
      "name": "절단",
      "note": ["--- 생성기: 연계 점수 5 미만 ---"],
      "when": [{"all": ["Combo_Points < 70"], "comment": "연계 점수 5 미만"}]
    }
  ]
}
```


### 완성된 레이드 로테이션

실제 암살 레이드 로테이션(Fatebound)입니다. 규칙 15개, Burst, 죽음표식 중 소멸, 혈폭풍으로 DoT 복사, 광역과 단일 대상, 기력 모으기를 담고 있습니다.

**KRC 텍스트: 암살, 레이드**
*KRC 텍스트:*

```text
rotation "암살, 레이드 v2.8: Burst 버튼, Method 12.1, SimulationCraft, 상위 로그"

# 암살, 레이드. 기준: Method 가이드(패치 12.1), SimulationCraft 행동 목록, Warcraft Logs 상위 플레이어.
# 기본 아이콘 무시: 켬. 죽음표식, 왕의 파멸: Burst를 켰을 때만. 소멸: 대상에 죽음표식 효과가 있을 때만.
# 연계 점수(최대 7)의 백분율: 3 = 43%, 4 = 57%, 5 = 71%, 6 = 86%, 7 = 100%.

# v2.4: 왕의 파멸: 연계 점수 0–3일 때만(집념의 일격 효과로 이후 5점 추가). 소멸: 0–4일 때(은신 중 목조르기가 3점 추가).
# v2.5: 혈폭풍: 두 출혈 중 하나만 새로 걸렸을 때만. 그전에는 여러 번 연속으로 눌렸음.
# v2.6: Burst를 켜고 죽음표식 준비 완료 또는 대상에 적용 중일 때: 목조르기와 파열은 대상의 생명력과 관계없이 사용.
# v2.7, v2.8: 출혈이 없는 새 대상, Burst 켬, 죽음표식 준비됨, 주변 적 2명 이상: 먼저 혈폭풍으로 출혈 복사(연계 점수 무관), 그다음 죽음표식.

buff1	Garrote_DoT = "대상의 목조르기 [703]"
buff2	Rupture_DoT = "대상의 파열 [1943]"
buff3	Envenom_Buff = "독살 [32645]"
buff4	Deathmark_DoT = "대상의 죽음표식 [360194]"
buff5	Improved_Garrote = "목조르기 연마 [392401]"
buff6	Darkest_Night = "어둡고 어두운 밤 [457280]"
buff7	Blindside = "사각 지대 [121153]"
buff8	Stealth_Buff = "은신 [1784]"
buff9	Stealth_Sub = "은신 (기만) [115191]"
buff10	Vanish_Buff = "소멸 [11327]"
slot1	Garrote = "목조르기"
slot2	Rupture = "파열"
slot3	Envenom = "독살"
slot4	Mutilate = "절단"
slot5	Ambush = "매복"
slot6	Fan_of_Knives = "칼날 부채"
slot7	Crimson_Tempest = "혈폭풍"
slot8	Deathmark = "죽음표식"
slot9	Kingsbane = "왕의 파멸"
slot10	Vanish = "소멸"
slot11	Crimson_Vial = "진홍색 약병"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

# --- 방어: ‘치유 / 방어’를 켰을 때만 ---
use Crimson_Vial when  # 진홍색 약병
	defensives == 1 and PlayerHP <= 40  # 생명력 40% 이하

# === 은신 ===
use Garrote when  # 은신 중 목조르기
	Stealth_Buff.up  # 은신 중
	or
	Stealth_Sub.up  # 은신 중(기만)
	or
	Vanish_Buff.up  # 소멸 직후

use Garrote when  # 목조르기: 목조르기 연마 구간
	Improved_Garrote.up and Garrote_DoT.down  # 구간 열림, 대상에 목조르기 없음
	or
	Improved_Garrote.up and Garrote_DoT.duration <= 78  # SimulationCraft: 18초 중 14초 남았을 때 갱신

# === 재사용 대기시간 기술 (Burst 버튼) ===
use Deathmark when  # 죽음표식
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up and Kingsbane.cd <= 3 and Envenom_Buff.duration >= 35 and Stealth_Buff.down and Stealth_Sub.down  # Burst 켬, 출혈 유지, 왕의 파멸 준비됨, 독살 2초 이상 남음

use Kingsbane when  # 왕의 파멸
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up and Envenom_Buff.up and Deathmark_DoT.up and Combo_Points < 50 and Stealth_Buff.down and Stealth_Sub.down  # Burst 켬, 대상에 죽음표식, 연계 점수 0–3
	or
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up and Envenom_Buff.up and Deathmark.cd >= 44 and Combo_Points < 50 and Stealth_Buff.down and Stealth_Sub.down  # Burst 켬, 죽음표식까지 52초 이상, 연계 점수 0–3

use Vanish when  # 소멸
	Deathmark_DoT.up and Improved_Garrote.down and Combo_Points < 65 and Stealth_Buff.down and Stealth_Sub.down  # 대상에 죽음표식, 연계 점수 0–4(은신 중 목조르기가 3점 추가)

# === 출혈 ===
use Crimson_Tempest when  # 혈폭풍: 죽음표식용 새 대상에 출혈 복사
	cd == 1 and Deathmark.cd <= 3 and Garrote_DoT.down and Rupture_DoT.down and Envenom_Buff.up and enemies >= 2  # 연계 점수 무관

# 죽기 직전인 추가 몹에는 새 출혈을 걸지 않음(SimulationCraft의 ‘대상이 12초 이상 생존’과 같음): 대상 1–2명과 ‘단일’ 모드에서는 항상,
# 대상 3명 이상에서는 생명력 50% 이상인 대상, 또는 Burst 켬과 죽음표식 준비됨, 또는 대상에 이미 죽음표식 효과가 있을 때만.
use Garrote when  # 목조르기: 유지
	Garrote_DoT.down and Combo_Points < 95 and enemies <= 2
	or
	Garrote_DoT.down and Combo_Points < 95 and st == 1
	or
	Garrote_DoT.down and Combo_Points < 95 and TargetHP >= 50  # 대상 3명 이상: 오래 살 대상만
	or
	Garrote_DoT.down and Combo_Points < 95 and cd == 1 and Deathmark.cd <= 3  # Burst 켬, 죽음표식 준비됨: 생명력 무관
	or
	Garrote_DoT.down and Combo_Points < 95 and Deathmark_DoT.up  # 대상에 죽음표식 (복사된 출혈)
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30 and Combo_Points < 95  # 판데믹 구간(이미 적용 중)

use Rupture when  # 파열
	Combo_Points >= 70 and Rupture_DoT.down and enemies <= 2
	or
	Combo_Points >= 70 and Rupture_DoT.down and st == 1
	or
	Combo_Points >= 70 and Rupture_DoT.down and TargetHP >= 50  # 대상 3명 이상: 오래 살 대상만
	or
	Combo_Points >= 70 and Rupture_DoT.down and cd == 1 and Deathmark.cd <= 3  # Burst 켬, 죽음표식 준비됨
	or
	Combo_Points >= 70 and Rupture_DoT.down and Deathmark_DoT.up  # 대상에 죽음표식
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 25 and Darkest_Night.down  # 갱신. 어둡고 어두운 밤의 연계 점수 7점은 여기에 쓰지 않음

# === 생성기: 연계 점수 5까지, 어둡고 어두운 밤 중에는 7까지 ===

# 혈폭풍: 새 파열 직후 한 번(대상 4명 이상이면 새 목조르기 직후에도), 그 밖에는 칼날 부채.
# 둘 중 하나만 새것(94% 이상)이어야 함: 혈폭풍 직후에는 둘 다 새것이므로 다음 것은 기다림.
use Crimson_Tempest when  # 혈폭풍: 새 파열 또는 목조르기 직후 출혈 확산
	aoe == 1 and Darkest_Night.down and Combo_Points < 70 and Garrote_DoT.up and Rupture_DoT.up and Rupture_DoT.duration >= 94 and Garrote_DoT.duration < 94
	or
	aoe == 1 and Darkest_Night.down and Combo_Points < 70 and Garrote_DoT.up and Rupture_DoT.up and Garrote_DoT.duration >= 94 and Rupture_DoT.duration < 94
	or
	aoe == 1 and Darkest_Night.up and Combo_Points < 95 and Garrote_DoT.up and Rupture_DoT.up and Rupture_DoT.duration >= 94 and Garrote_DoT.duration < 94
	or
	aoe == 1 and Darkest_Night.up and Combo_Points < 95 and Garrote_DoT.up and Rupture_DoT.up and Garrote_DoT.duration >= 94 and Rupture_DoT.duration < 94
	or
	st == 0 and enemies >= 4 and Darkest_Night.down and Combo_Points < 70 and Garrote_DoT.up and Rupture_DoT.up and Rupture_DoT.duration >= 94 and Garrote_DoT.duration < 94
	or
	st == 0 and enemies >= 4 and Darkest_Night.down and Combo_Points < 70 and Garrote_DoT.up and Rupture_DoT.up and Garrote_DoT.duration >= 94 and Rupture_DoT.duration < 94
	or
	st == 0 and enemies >= 4 and Darkest_Night.up and Combo_Points < 95 and Garrote_DoT.up and Rupture_DoT.up and Rupture_DoT.duration >= 94 and Garrote_DoT.duration < 94
	or
	st == 0 and enemies >= 4 and Darkest_Night.up and Combo_Points < 95 and Garrote_DoT.up and Rupture_DoT.up and Garrote_DoT.duration >= 94 and Rupture_DoT.duration < 94
	or
	st == 0 and enemies >= 2 and enemies <= 3 and Darkest_Night.down and Combo_Points < 70 and Garrote_DoT.up and Rupture_DoT.up and Rupture_DoT.duration >= 94 and Garrote_DoT.duration < 94  # 대상 2–3명: 새 파열 직후에만
	or
	st == 0 and enemies >= 2 and enemies <= 3 and Darkest_Night.up and Combo_Points < 95 and Garrote_DoT.up and Rupture_DoT.up and Rupture_DoT.duration >= 94 and Garrote_DoT.duration < 94  # 대상 2–3명: 새 파열 직후에만

use Fan_of_Knives when  # 칼날 부채: 단일 대상, 어둡고 어두운 밤, 연계 점수 1 부족
	st == 1 and Darkest_Night.up and Combo_Points >= 80 and Combo_Points < 95
	or
	aoe == 0 and enemies <= 1 and Darkest_Night.up and Combo_Points >= 80 and Combo_Points < 95

use Fan_of_Knives when  # 칼날 부채: 대상 2명 이상
	aoe == 1 and Darkest_Night.down and Combo_Points < 70
	or
	aoe == 1 and Darkest_Night.up and Combo_Points < 95
	or
	st == 0 and enemies >= 2 and Darkest_Night.down and Combo_Points < 70
	or
	st == 0 and enemies >= 2 and Darkest_Night.up and Combo_Points < 95

use Ambush when  # 매복 (사각 지대)
	Blindside.up and st == 1 and Darkest_Night.down and Combo_Points < 70
	or
	Blindside.up and st == 1 and Darkest_Night.up and Combo_Points < 95
	or
	Blindside.up and aoe == 0 and enemies <= 1 and Darkest_Night.down and Combo_Points < 70
	or
	Blindside.up and aoe == 0 and enemies <= 1 and Darkest_Night.up and Combo_Points < 95

use Mutilate when  # 절단
	st == 1 and Darkest_Night.down and Combo_Points < 70
	or
	st == 1 and Darkest_Night.up and Combo_Points < 95
	or
	aoe == 0 and enemies <= 1 and Darkest_Night.down and Combo_Points < 70
	or
	aoe == 0 and enemies <= 1 and Darkest_Night.up and Combo_Points < 95

# === 소모: 연계 점수 5 이상(어둡고 어두운 밤 중에는 7) ===
# SimulationCraft: 바로 누르지 말고 독살 효과를 계속 유지: 효과 마지막 1초, 대상에 죽음표식 효과가 있는 동안, 기력이 가득 차기 전, 대상 4명 이상이면 더 일찍.
use Envenom when  # 독살
	Darkest_Night.down and Combo_Points >= 70 and Envenom_Buff.down
	or
	Darkest_Night.down and Combo_Points >= 70 and Envenom_Buff.duration <= 20  # 약 1초 남음
	or
	Darkest_Night.down and Combo_Points >= 70 and Deathmark_DoT.up
	or
	Darkest_Night.down and Combo_Points >= 70 and Energy >= 70  # 기력 넘치지 않게
	or
	Darkest_Night.down and Combo_Points >= 70 and Energy >= 30 and enemies >= 4
	or
	Darkest_Night.up and Combo_Points >= 95 and Envenom_Buff.down
	or
	Darkest_Night.up and Combo_Points >= 95 and Envenom_Buff.duration <= 20
	or
	Darkest_Night.up and Combo_Points >= 95 and Deathmark_DoT.up
	or
	Darkest_Night.up and Combo_Points >= 95 and Energy >= 70
	or
	Darkest_Night.up and Combo_Points >= 95 and Energy >= 30 and enemies >= 4
```


JSON은 아래 파일에 있습니다. 두 번째 로테이션은 무법(Trickster) 로테이션으로, 아드레날린 촉진 매크로(**O + Q**), 도박의 연속(**O**), 광기의 학살자(**C**), 모든 규칙의 정신 집중 보호를 담고 있습니다.

### 예시 파일

| 예시 | 파일 |
|---|---|
| 빌더 예시의 입문용 암살 로테이션 | [JSON](https://keyrota.app/documentation/examples/starter-assassination.ko.json), [KRC 텍스트](https://keyrota.app/documentation/examples/starter-assassination.ko.txt) |
| 암살, 레이드: 규칙 15개 | [JSON](https://keyrota.app/documentation/examples/assassination-raid.ko.json), [KRC 텍스트](https://keyrota.app/documentation/examples/assassination-raid.ko.txt) |
| 무법, 레이드와 쐐기: 규칙 13개, 플래그 O, OQ, C | [JSON](https://keyrota.app/documentation/examples/outlaw-raid.ko.json), [KRC 텍스트](https://keyrota.app/documentation/examples/outlaw-raid.ko.txt) |
| 실제로 쓸 수 있는 가장 짧은 로테이션 | [JSON](https://keyrota.app/documentation/examples/minimal.ko.json), [KRC 텍스트](https://keyrota.app/documentation/examples/minimal.ko.txt) |
| 문법 예시: 모든 조건과 플래그(ID 없음, 전투용 아님) | [JSON](https://keyrota.app/documentation/examples/syntax-every-condition.ko.json), [KRC 텍스트](https://keyrota.app/documentation/examples/syntax-every-condition.ko.txt) |

모든 예시는 사이트의 모든 언어로 제공됩니다. 레이블, 규칙, 주석은 번역되어 있고 조건, 주문 ID, 플래그는 같습니다. 언어는 파일 이름에 표시됩니다: `.en`, `.ru`, `.de`, `.fr`, `.es`, `.it`, `.pt`, `.ko`, `.zh`, `.zh-TW`.

파일을 열려면 메인 창의 “새로 만들기 — 파일에서…” 또는 빌더 “텍스트 및 JSON” 페이지의 “열기…”를 사용하세요.

---

<!-- https://keyrota.app/documentation/ko/ai -->

## AI 에이전트로 로테이션 만들기

> [!TIP] 이 페이지 링크만 있으면 됩니다
> AI 에이전트에게 이 페이지 링크만 주어도 됩니다. 에이전트가 스스로 모든 내용을 파악하고, 필요하면 빠진 정보를 물어봅니다.

웹과 파일에 접근할 수 있는 AI 에이전트는 KRC 로테이션을 대신 만들어 줄 수 있습니다. 내 전문화 최상위 플레이어의 로그, 가이드, SimulationCraft 행동 목록을 살펴보고, 내 특성 및 로그와 비교해 바로 쓸 수 있는 JSON을 줍니다. 이 문서에서는 에이전트에게 무엇을 줘야 하는지, 바로 쓸 수 있는 프롬프트, 결과를 확인하는 방법을 설명합니다.

### 준비물

**에이전트**: 웹사이트(Warcraft Logs, Raider.IO, Wowhead, GitHub)를 열고 파일을 읽을 수 있어야 합니다. 웹에 접근할 수 없다면 문서와 로그 일부를 파일로 주세요.

**에이전트용 문서**(링크는 프롬프트에 이미 들어 있습니다):

| 링크 | 내용 |
|---|---|
| [llms.txt](https://keyrota.app/documentation/llms.txt) | AI 에이전트용 문서 색인: 모든 언어, 파일, 예시 |
| [krc-guide.ko.md](https://keyrota.app/documentation/krc-guide.ko.md) | 전체 문서를 한국어로 담은 Markdown 파일 하나. 영어판은 [krc-guide.en.md](https://keyrota.app/documentation/krc-guide.en.md) |
| [keyrota-rotation.schema.json](https://keyrota.app/documentation/keyrota-rotation.schema.json) | 답변을 검사할 JSON Schema |
| [암살, 레이드](https://keyrota.app/documentation/examples/assassination-raid.ko.json), [무법, 레이드와 쐐기](https://keyrota.app/documentation/examples/outlaw-raid.ko.json) | 참고용 실제 레이드 로테이션 |

**내 데이터**(프롬프트의 자리 표시자):

| 자리 표시자 | 넣을 내용 | 예시 |
|---|---|---|
| `{CLASS}` | 직업 | 도적 |
| `{SPEC}` | 전문화 | 암살 |
| `{HERO_TALENTS}` | 영웅 특성 | Fatebound |
| `{TALENT_STRING}` | 게임에서 내보낸 특성 문자열(특성 창, “공유”) | `CMQAAAAA…` |
| `{CONTENT}` | 레이드 또는 쐐기 | 레이드 |
| `{RAID_OR_DUNGEONS}` | 레이드 또는 던전 목록 | The Venomous Abyss |
| `{DIFFICULTY}` | 난이도 또는 쐐기돌 단계 | 영웅 |
| `{BOSSES}` | 로테이션을 쓸 보스 | 전체 |
| `{ITEM_LEVEL}` | 아이템 레벨 | 328 |
| `{MY_LOGS}` | Warcraft Logs의 내 캐릭터 또는 보고서 링크 | `https://www.warcraftlogs.com/character/eu/<realm>/<name>` |
| `{COMBAT_LOG_FILE}` | 첨부할 전투 기록 파일 | `WoWCombatLog-101726_214449.txt` |
| `{PREFERENCES}` | 원하는 점 | “재사용 대기시간 기술은 Burst 버튼으로만, 방어 기술은 쓰지 않음” |

### 프롬프트

에이전트가 직접 데이터를 모아 내 데이터와 비교하고, 규칙마다 근거를 설명합니다. 중괄호 부분을 채우고, 전투 기록이 있으면 첨부하세요.

*프롬프트:*

```text
당신은 World of Warcraft 전문가이자 KeyRota 로테이션 작성자입니다. KeyRota 고급 로테이션을 만들어 주세요: keyrota-rotation 형식, 버전 1의 JSON입니다.

내 캐릭터
- 직업과 전문화: {CLASS}, {SPEC}. 영웅 특성: {HERO_TALENTS}.
- 게임의 특성 문자열: {TALENT_STRING}
- 콘텐츠: {CONTENT}: {RAID_OR_DUNGEONS}. 난이도 또는 쐐기돌 단계: {DIFFICULTY}. 보스: {BOSSES}.
- 아이템 레벨: {ITEM_LEVEL}.
- 내 Warcraft Logs: {MY_LOGS}
- 전투 기록(첨부): {COMBAT_LOG_FILE}
- 원하는 점: {PREFERENCES}

1단계. KEYROTA 형식 익히기
- https://keyrota.app/documentation/llms.txt 및 https://keyrota.app/documentation/krc-guide.en.md: 슬롯(최대 12개), 오라(최대 12개, 내 강화 효과와 대상에게 건 내 약화 효과만), 백분율로 나타내는 자원, 모든 조건, 슬롯 플래그, 패널 스위치 aoe, st, cd, defensives, ground_spells, movement, 위에서 아래로 확인하는 규칙, AND 조건으로 이루어진 OR 그룹, 그룹 16개와 조건 16개 제한, 알 수 없는 값은 조건을 거짓으로 만든다는 점.
- JSON Schema: https://keyrota.app/documentation/keyrota-rotation.schema.json
- 참고 예시: https://keyrota.app/documentation/examples/assassination-raid.en.json 및 https://keyrota.app/documentation/examples/outlaw-raid.en.json

2단계. 데이터 수집
1. Warcraft Logs: 보스별({CONTENT}, {DIFFICULTY}) {SPEC} {CLASS} 피해량 순위. 쐐기라면 던전별, 쐐기돌 단계별 순위. 영웅 특성이 {HERO_TALENTS}인 최상위 로그 5-10개를 고르세요.
2. 그들의 특성을 내 문자열과 비교하세요. 우선순위를 바꾸는 차이를 적고, 내가 그 특성을 찍어야 하는지 알려 주세요.
3. 최상위 로그에서 다음을 모으세요: 오프닝과 시전 순서; 중요한 강화 효과와 약화 효과의 유지율; 시전 시점의 자원(마무리 일격 때의 연계 점수 또는 그에 해당하는 자원, 소모 전의 기력 또는 그에 해당하는 자원, 최대치를 넘겨 낭비한 자원); 주요 재사용 대기시간 기술을 언제, 무엇과 함께 쓰는지와 전투 단계에 어떻게 맞추는지; 방어 기술을 언제, 생명력이 얼마일 때 쓰는지; 대상이 몇 명일 때 광역으로 바꾸는지; 분당 시전 수와 시전하지 않은 시간.
4. 쐐기: Raider.IO(메타, 상위 기록, 던전별 특성).
5. 가이드(Wowhead, Method, 직업 Discord)와 현재 확장팩 브랜치에 있는 {SPEC}용 SimulationCraft 행동 목록(APL): 이를 기본 우선순위로 삼고 로그와 비교해 검증하세요.
6. 내 로그와 전투 기록: 유지율, 소모 기술 사용 시점의 자원, 재사용 대기시간 기술, 속도가 최상위 플레이어와 어디서 다른지.

3단계. 로테이션 작성
- "format": "keyrota-rotation", "version": 1, 내 전문화의 specID, 문서의 전문화 표에 따른 resources(resource1 PlayerHP, resource2 TargetHP, 그다음 전문화 자원), "ignoreMainIcon": true.
- 슬롯: Wowhead의 실제 주문 ID(spell 필드). 치유와 방어 기술은 "show": "combat". 플래그: GCD 무관 주문에는 offGcd, 둘째 줄이 GCD를 쓰는 매크로와 직전 공격의 결과가 필요한 버튼에는 offGcd와 queue, 정신 집중 주문에는 channel, 내가 직접 누를 기술에는 manual. 매크로 슬롯이라면 매크로 텍스트(#showtooltip과 /cast)도 적어 주세요.
- 오라: 오라를 거는 주문이 아니라 강화 효과와 약화 효과 자체의 ID. 내 오라만.
- 규칙은 우선순위 순서로. 방어 기술은 맨 앞에, defensives == 1일 때만. 주요 재사용 대기시간 기술은 cd == 1일 때만(주문의 재사용 대기시간이 아니라 Burst 버튼). 재사용 대기시간 기술의 효과를 키우는 기술은 그 기술이 유지되는 동안에만. 단일 대상과 광역: 광역 규칙에는 aoe == 1 그룹과 st == 0 and enemies >= N 그룹, 단일 대상 규칙에는 st == 1 그룹과 aoe == 0 and enemies <= 1 그룹. DoT: X.down 그룹과 X.up and X.duration <= 30 그룹. 자원은 백분율, 기준값은 단계 사이의 중간(연계 점수 7점 기준: "5 이상"은 Combo_Points >= 70, "3 이하"는 Combo_Points < 50). 다음 버튼이 정신 집중을 끊는다면 모든 규칙의 모든 그룹에 정신 집중 오라의 X.duration <= 8을 추가하세요.
- KRC에는 not, != 와 괄호가 없습니다: up/down, ready/oncd, glow/noglow 짝, 반대 연산자, 여러 그룹을 쓰세요.
- 레이블(label), 규칙 이름, 주석은 한국어로 쓰고, 조건에서 쓰는 이름(alias)은 라틴 문자로 쓰세요.
- 모든 규칙에 이름(name)을, 모든 그룹에 짧은 주석(comment)을 달아 주세요: 무엇을, 왜.
- 마지막으로 확인하세요: JSON이 스키마를 통과하는지, 조건의 모든 이름이 선언되어 있는지, 그룹당 조건 16개와 규칙당 그룹 16개를 넘지 않는지, ID가 현재 패치의 Wowhead에 있는지.

답변
1. 로테이션 JSON 전체를 한 블록으로.
2. 매크로 슬롯의 매크로 텍스트.
3. 표: 규칙, 하는 일, 근거(어떤 로그, 가이드, APL 줄).
4. 게임에서 켤 것: 빠른 설정 패널 버튼, 적 수 측정 반경, 행동 단축바에 올릴 것.
5. 테스트 계획: 훈련용 허수아비, 그다음 최상위 로그와 비교한 전투 기록. 비교할 수치.
```


### 채워 넣은 프롬프트 예시

같은 프롬프트를 영웅 난이도 레이드의 암살 도적에 맞게 모두 채운 예시입니다:

*프롬프트: 암살, 영웅 난이도 레이드:*

```text
당신은 World of Warcraft 전문가이자 KeyRota 로테이션 작성자입니다. KeyRota 고급 로테이션을 만들어 주세요: keyrota-rotation 형식, 버전 1의 JSON입니다.

내 캐릭터
- 직업과 전문화: 도적, 암살. 영웅 특성: Fatebound.
- 게임의 특성 문자열: CMQAAAAAAAAAAAAAAAAAAAAAAYmlZmFDGAAAAAYWGsNDAAAAAILzMzMzMjxyMzMbzsMzMPgZMzYMMzYMAGYBmxoxsBYbAbGAMzMGD
- 콘텐츠: 레이드: The Venomous Abyss. 난이도: 영웅. 보스: 전체. Ula'tek(심장에 피해를 주는 구간)은 특히 주의해서 봐 주세요.
- 아이템 레벨: 328.
- 내 Warcraft Logs: https://www.warcraftlogs.com/character/eu/<realm>/<name>
- 전투 기록(첨부): WoWCombatLog-101726_214449.txt, 훈련용 허수아비 5분, 단일 대상.
- 원하는 점: 죽음표식과 왕의 파멸은 Burst 버튼으로만, 소멸은 죽음표식 중에만, 진홍색 약병은 생명력 40% 이하에서, 기력 모으기는 SimulationCraft처럼.

1단계. KEYROTA 형식 익히기
- https://keyrota.app/documentation/llms.txt 및 https://keyrota.app/documentation/krc-guide.en.md: 슬롯(최대 12개), 오라(최대 12개, 내 강화 효과와 대상에게 건 내 약화 효과만), 백분율로 나타내는 자원, 모든 조건, 슬롯 플래그, 패널 스위치 aoe, st, cd, defensives, ground_spells, movement, 위에서 아래로 확인하는 규칙, AND 조건으로 이루어진 OR 그룹, 그룹 16개와 조건 16개 제한, 알 수 없는 값은 조건을 거짓으로 만든다는 점.
- JSON Schema: https://keyrota.app/documentation/keyrota-rotation.schema.json
- 참고 예시: https://keyrota.app/documentation/examples/assassination-raid.en.json 및 https://keyrota.app/documentation/examples/outlaw-raid.en.json

2단계. 데이터 수집
1. Warcraft Logs: 보스별(레이드 The Venomous Abyss, 영웅 난이도) 암살 도적 피해량 순위. 영웅 특성이 Fatebound인 최상위 로그 5-10개를 고르세요.
2. 그들의 특성을 내 문자열과 비교하세요. 우선순위를 바꾸는 차이를 적고, 내가 그 특성을 찍어야 하는지 알려 주세요.
3. 최상위 로그에서 다음을 모으세요: 오프닝과 시전 순서; 목조르기, 파열, 독살 효과의 유지율; 독살, 파열, 왕의 파멸, 소멸 때의 연계 점수, 독살 전의 기력, 최대치를 넘겨 낭비한 기력과 연계 점수; 죽음표식과 왕의 파멸을 언제, 무엇과 함께 쓰는지와 전투 단계에 어떻게 맞추는지(특히 Ula'tek의 심장); 진홍색 약병과 그 밖의 방어 기술을 언제, 생명력이 얼마일 때 쓰는지; 대상이 몇 명일 때 칼날 부채와 혈폭풍으로 바꾸는지; 분당 시전 수와 시전하지 않은 시간.
4. 가이드(Wowhead, Method, 도적 Discord)와 현재 확장팩 브랜치에 있는 암살용 SimulationCraft 행동 목록(APL): 이를 기본 우선순위로 삼고 로그와 비교해 검증하세요.
5. 내 로그와 전투 기록: 유지율, 소모 기술 사용 시점의 연계 점수, 재사용 대기시간 기술, 속도가 최상위 플레이어와 어디서 다른지.

3단계. 로테이션 작성
- "format": "keyrota-rotation", "version": 1, "specID": 259, "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"], "ignoreMainIcon": true.
- 슬롯: Wowhead의 실제 주문 ID(spell 필드). 진홍색 약병은 "show": "combat". 플래그: GCD 무관 주문에는 offGcd, 소멸에는 offGcd와 queue(직전 공격으로 얻은 연계 점수가 필요함), 정신 집중 주문이 있다면 channel, 내가 직접 누를 기술에는 manual. 매크로 슬롯이라면 매크로 텍스트(#showtooltip과 /cast)도 적어 주세요.
- 오라: 오라를 거는 주문이 아니라 강화 효과와 약화 효과 자체의 ID(예를 들어 소멸의 강화 효과는 소멸 주문과 ID가 다릅니다). 내 오라만.
- 규칙은 우선순위 순서로. 진홍색 약병은 맨 앞에, defensives == 1이고 생명력이 40% 이하일 때만. 죽음표식과 왕의 파멸은 cd == 1일 때만(주문의 재사용 대기시간이 아니라 Burst 버튼). 소멸은 대상에 죽음표식이 있을 때만. 단일 대상과 광역: 칼날 부채에는 aoe == 1 그룹과 st == 0 and enemies >= 2 그룹, 절단에는 st == 1 그룹과 aoe == 0 and enemies <= 1 그룹. 목조르기와 파열: X.down 그룹과 X.up and X.duration <= 30 그룹. 연계 점수는 7점 기준의 백분율, 기준값은 단계 사이의 중간: "5 이상"은 Combo_Points >= 70, "3 이하"는 Combo_Points < 50. 기력 모으기: 연계 점수 5 이상에서 효과가 끝나 갈 때, 죽음표식 중일 때, Energy >= 70일 때 독살.
- KRC에는 not, != 와 괄호가 없습니다: up/down, ready/oncd, glow/noglow 짝, 반대 연산자, 여러 그룹을 쓰세요.
- 레이블(label), 규칙 이름, 주석은 한국어로 쓰고, 조건에서 쓰는 이름(alias)은 라틴 문자로 쓰세요.
- 모든 규칙에 이름(name)을, 모든 그룹에 짧은 주석(comment)을 달아 주세요: 무엇을, 왜.
- 마지막으로 확인하세요: JSON이 스키마를 통과하는지, 조건의 모든 이름이 선언되어 있는지, 그룹당 조건 16개와 규칙당 그룹 16개를 넘지 않는지, ID가 현재 패치의 Wowhead에 있는지.

답변
1. 로테이션 JSON 전체를 한 블록으로.
2. 매크로 슬롯의 매크로 텍스트.
3. 표: 규칙, 하는 일, 근거(어떤 로그, 가이드, APL 줄).
4. 게임에서 켤 것: 빠른 설정 패널 버튼, 적 수 측정 반경, 행동 단축바에 올릴 것.
5. 테스트 계획: 훈련용 허수아비, 그다음 최상위 로그와 비교한 전투 기록. 비교할 수치.
```


### 로그 분석 방법

에이전트와 사용자를 위한 도움말입니다. 데이터를 어디서 얻고 무엇을 비교할지 정리했습니다.

**Warcraft Logs**
- 순위: `https://www.warcraftlogs.com/zone/rankings/<zone id>?boss=<boss id>&class=<Class>&spec=<Spec>&difficulty=<3|4|5>&metric=dps`(3은 일반, 4는 영웅, 5는 신화). 쐐기 순위는 쐐기돌 단계별로 나뉩니다.
- 플레이어 보고서에서: Casts 탭(시전 순서와 시점), Buffs 및 Debuffs(유지율), Resources(자원과 최대치 초과), Damage Done(기술별, 대상별 피해), Deaths.
- 로그의 특성: 플레이어 요약에 특성 내보내기 문자열이 있습니다. Wowhead 특성 계산기에서 열어 보세요.
- DPS가 아니라 행동을 비교하세요: DoT와 강화 효과의 유지율, 소모 기술 사용 시점의 자원, 분당 시전 수, 시전하지 않은 시간, 전투 단계에 맞춘 주요 재사용 대기시간 기술의 사용 시점.

**Raider.IO**(쐐기)
- 던전의 상위 기록: `https://raider.io/api/v1/mythic-plus/runs?season=<season>&region=world&dungeon=<slug>&page=0`, 시즌과 던전 목록: `https://raider.io/api/v1/mythic-plus/static-data?expansion_id=<id>`.
- 메타는 매주 바뀝니다. 예전 결론이 아니라 최신 데이터를 쓰세요.

**SimulationCraft**
- 전문화의 행동 목록(APL)은 GitHub의 `simulationcraft/simc` 저장소, 현재 확장팩 브랜치의 `ActionPriorityLists` 폴더에 있습니다.
- APL을 KRC로 옮기는 방법:

| SimulationCraft APL | KRC |
|---|---|
| `actions` 줄, 위에서 아래로 | 규칙, 위에서 아래로 |
| `buff.X.up` | `X.up` |
| `dot.X.remains`, `buff.X.remains` | 백분율로 나타낸 `X.duration` |
| `cooldown.X.remains` | 백분율로 나타낸 `X.cd` |
| `combo_points`, `energy` | 백분율로 나타낸 자원 |
| `active_enemies` | `enemies` |
| `target.time_to_die`, 정확한 초 단위 값 | 없음. 가장 가까운 대안을 씁니다. 예: “대상이 12초 이상 생존”은 대상 3명 이상에서 `TargetHP >= 50` |

**전투 기록**
- 고급 전투 기록을 켜면 모든 `SPELL_CAST_SUCCESS`에 시전자의 자원(종류, 현재 값, 최대치)이 들어갑니다. 기력은 종류 3입니다.
- `SPELL_AURA_APPLIED`, `SPELL_AURA_REFRESH`, `SPELL_AURA_REMOVED`: 오라 유지율과 갱신, `SPELL_ENERGIZE`: 자원 획득, `SPELL_CAST_FAILED`: 게임이 거부한 입력.
- 셀 것: 분당 시전 수, GCD 사이의 간격, DoT 유지율, 마무리 일격 때의 연계 점수, 최대치를 넘긴 기력, 주요 재사용 대기시간 기술의 사용 시점.

### 전투 기록 남기기

1. 게임 설정의 “네트워크” 항목에서 고급 전투 기록(Advanced Combat Logging)을 켭니다. 이 설정이 꺼져 있으면 기록에 자원과 위치가 남지 않습니다.
2. 전투 시작 전에 채팅 창에 `/combatlog`를 입력하면 기록이 시작됩니다. 전투가 끝나면 `/combatlog`를 다시 입력해 기록을 멈춥니다.
3. 파일은 게임 폴더에 있습니다: `World of Warcraft\_retail_\Logs\WoWCombatLog-MMDDYY_HHMMSS.txt`. 게임은 파일을 늦게 기록하므로 기록을 멈춘 뒤 1분 정도 기다리세요.
4. Warcraft Logs 업로더는 업로드한 뒤 파일을 비울 수 있으니 먼저 복사해 두세요.

첫 테스트는 훈련용 허수아비로 하세요. 단일 대상으로 2–3분, 그다음 광역 확인을 위해 허수아비 여러 개로 합니다.

### 테스트와 개선

1. 로테이션을 불러오고(아래 참고), Better Assistant 프로필을 만들어 붙여넣은 뒤, 슬롯 주문을 행동 단축바에 올리고 키를 지정합니다.
2. 허수아비로 테스트합니다. 메인 창의 “기록”에서 무엇을 눌렀는지 볼 수 있습니다. KeyRota 기록 파일(“기록” 옆의 폴더 버튼)에는 GCD마다 선택된 규칙과 그 위의 규칙을 건너뛴 이유(조건, 준비 안 됨, 알 수 없음, 수동)가 남습니다.
3. 에이전트에게 로테이션 JSON, 새로 남긴 전투 기록, 필요하면 KeyRota 기록까지 주고 최상위 로그와 비교해 달라고 하세요: 유지율, 소모 기술 사용 시점의 자원, 재사용 대기시간 기술, 유휴 시간.
4. 한 번에 규칙 하나씩만 바꾸고, 로테이션 이름에 버전을 적으세요(“v1.3”). 이전 버전은 보관해 두세요: 메인 창의 “내보내기” 또는 “텍스트 및 JSON — 저장…”.
5. 레이드나 쐐기가 끝나면 다시 Warcraft Logs와 비교합니다.

### 결과 불러오기

- **파일로:** 답변의 JSON을 `.json` 파일로 저장한 다음 “로테이션 — 새로 만들기 — 파일에서…”를 선택합니다.
- **클립보드에서:** JSON을 복사한 다음 “새로 만들기 — 클립보드에서”를 선택합니다.
- **열려 있는 로테이션에:** 빌더 — “텍스트 및 JSON” — JSON — “붙여넣기”. 새 JSON에 이 값들이 없으면 번호가 같은 슬롯은 기존 ID, 플래그, 표시 조건을 유지합니다.

빌더의 상태 표시줄에 “로테이션 정상”이 표시되어야 합니다. 오류가 있으면 오류 위치가 표시되니 그 문구를 그대로 에이전트에게 전달하세요. 그다음 일반 — “슬롯과 오라로 만들기” — “복사”를 클릭하고, 게임에서 `/ba` — Profile — 붙여넣기 — Apply를 실행합니다. 답변에 있는 매크로를 게임에서 만들어 행동 단축바에 올리세요.

---

<!-- https://keyrota.app/documentation/ko/faq -->

## 자주 묻는 질문 및 문제 해결

### 규칙이 전혀 실행되지 않음

다음 순서로 확인하세요:

1. **위쪽 규칙이 항상 먼저입니다.** 규칙은 위에서 아래로 확인합니다. 위쪽 규칙이 충족되고 그 주문을 사용할 수 있으면 내 규칙에는 차례가 오지 않습니다. 내 규칙을 위로 옮기거나 위쪽 규칙의 조건을 좁히세요.
2. **알 수 없는 값.** 알 수 없는 값에 대한 조건은 `.down`이라도 거짓입니다. 오라가 Better Assistant 프로필에 없거나 ID가 틀리면 그 오라는 알 수 없는 값이 됩니다. 프로필을 다시 만들어(“슬롯과 오라로 만들기”) 게임에 붙여넣으세요.
3. **주문이 아니라 오라의 ID.** 강화 효과의 ID는 그 효과를 거는 주문의 ID와 다를 수 있습니다. 소멸은 `1856`이고 그 강화 효과는 `11327`입니다. 또한 규칙은 내 오라만 볼 수 있으며, 다른 플레이어가 건 강화 효과는 보지 못합니다.
4. **슬롯이 준비되지 않음.** 자원 부족, 대상이 너무 멂, 재사용 대기 중, 특성을 찍지 않음 등입니다. 이런 규칙은 오류 없이 건너뜁니다.
5. **Better Assistant가 슬롯을 표시하지 않음.** “대상 있을 때” 슬롯은 대상이 없으면 준비되지 않습니다. 치유와 방어 기술에는 “전투 중”을 쓰세요.
6. **키가 없음.** 슬롯의 주문이 행동 단축바에 있고 키가 지정되어 있어야 합니다(또는 `#showtooltip` 매크로).
7. **스위치가 꺼져 있음.** “치유 / 방어”는 기본적으로 꺼져 있습니다. Burst 키(Windows에서는 F3, macOS에서는 ⌃⇧B)로 Burst를 꺼 두었을 수도 있고, 대상 모드가 아직 “단일”이나 “광역”일 수도 있습니다.
8. **백분율.** 연계 점수 5는 `5`가 아니라 `70`입니다. [자원](https://keyrota.app/documentation/ko/conditions#resources)을 참고하세요.
9. **중첩.** 1중첩은 0으로 읽힙니다. `X.stacks >= 1`로는 1중첩과 오라 없음을 구분할 수 없으니 `.up`을 쓰세요.
10. **지속시간이 없는 오라.** 은신 등은 남은 시간이 항상 1로 읽히므로 `.duration`이 작동하지 않습니다.

KeyRota 기록 파일에는 어떤 규칙이 선택되었는지와 그 위의 규칙을 왜 건너뛰었는지가 남습니다. 메인 창에서 “기록” 옆의 폴더 버튼을 클릭하세요.

### 너무 이르거나 늦게 누름

| 증상 | 원인 | 해결 방법 |
|---|---|---|
| GCD 무관 주문이 GCD가 끝나기를 기다림 | O 플래그가 없음 | “GCD 무관 (O)”를 켜세요. |
| GCD 무관 버튼이 직전 공격의 결과가 반영되기 전에 눌림 | O 플래그는 GCD 도중에 바로 누름 | “주문 대기열 구간 (Q)”를 추가하세요: O + Q. |
| 둘째 줄이 GCD를 쓰는 매크로가 끝까지 실행되지 않음 | 매크로가 GCD 도중에 눌림 | O + Q: 매크로를 GCD가 끝날 무렵 누릅니다. |
| 아래쪽 GCD 무관 규칙이 위쪽 규칙을 앞지르지 않음 | 의도된 동작: 엄격한 우선순위 | 규칙을 위로 옮기세요. |
| 소모 기술을 쓴 뒤 로테이션이 “멈춰 있음” | 자원 모으기: 충족되는 규칙이 없음 | 정상입니다. 더 일찍 소모하려면 기력 기준값을 낮추세요. |
| 내가 버튼을 누르는 동안 로테이션이 아무것도 누르지 않음 | 내가 기술을 누르면 KeyRota가 물러남 | 정상입니다. |

### 정신 집중이 끊김

- 슬롯에 “정신 집중 (C)”를 켜세요. 정신 집중 중에는 KeyRota가 아무것도 누르지 않으며, 시작할 때 슬롯을 두 번 누르지 않습니다.
- 게임은 일부 정신 집중을 마지막 타격보다 조금 일찍 끝내며, 정신 집중이 끝난 직후의 입력이 이를 끊습니다. 정신 집중 오라를 로테이션의 오라에 추가하고, `Channel_aura.duration <= 8` 조건을 **모든 규칙의 모든 그룹**에 넣으세요. 예시: [정신 집중 보호](https://keyrota.app/documentation/ko/patterns#channel).

### 광역으로 바뀌지 않음

1. 대상 모드가 “자동”인가요? 대상 모드는 Windows에서는 F2, macOS에서는 ⌃⇧T로 자동, 단일, 광역 순으로 바뀝니다. “단일” 모드에서는 `st == 0`이 들어간 규칙이 실행되지 않습니다.
2. 게임에서 적 이름표가 켜져 있고(V), 중요도가 낮은 적의 이름표도 숨기지 않았나요?
3. “일반” 페이지의 측정 반경이 광역 기술의 반경 이상인가요?
4. “전투 중인 적만”: 아직 전투에 들어오지 않은 적은 세지 않습니다. 적이 한 무리씩 차례로 들어오면 실제보다 적게 셀 수 있습니다.
5. 규칙의 기준값이 `enemies >= 2`인가요, `>= 3`인가요?
6. 반경을 바꾼 뒤에는 Better Assistant 프로필을 다시 만들어 붙여넣으세요.

### Burst가 실행되지 않거나 엉뚱한 때 실행됨

- `cd == 1`은 주문의 재사용 대기시간이 아니라 **Burst 버튼**입니다(Windows에서는 F3, macOS에서는 ⌃⇧B, 패널의 “Burst” 버튼). 주문의 재사용 대기시간은 `Slot.cd`입니다.
- Burst는 기본적으로 켜져 있습니다. 재사용 대기시간 기술을 쓰면 안 되는 순간(면역, 단계 전환) 전에 끄고, 쓸 때가 되면 다시 켜세요.
- 주요 재사용 대기시간 기술이 오라(대상의 DoT 등)에 좌우된다면 그 오라를 기다립니다. KeyRota 기록에서 규칙의 어떤 조건이 충족되지 않는지 확인하세요.
- 그 기술이 유지되는 동안에만 써야 하는 기술은 Burst 버튼이 아니라 그 기술의 오라(`Deathmark_DoT.up`)로 확인하세요.

### 백분율 계산 방법

- **자원과 생명력:** `값 / 최대치 × 100`. 기력 250 중 175는 `70`입니다.
- **연계 점수 7점 기준:** 기준값을 단계 사이의 중간에 두세요. “5 이상”은 `>= 70`, “3 이하”는 `< 50`입니다. [표](https://keyrota.app/documentation/ko/conditions#resources)를 참고하세요.
- **오라 남은 시간:** 그때 걸린 오라의 지속시간에 대한 백분율입니다. 30%가 판데믹 구간입니다.
- **재사용 대기시간:** GCD를 뺀 전체 재사용 대기시간에 대한 백분율입니다. 재사용 대기시간이 2분이면 1%는 1.2초입니다.

### “오류가 있는 로테이션은 저장되지 않습니다”

빌더는 오류가 있는 로테이션을 저장하지 않습니다. KeyRota는 로테이션의 일부만 실행하는 일이 없습니다. 상태 표시줄이 오류 위치를 알려 줍니다. 예: “규칙 9, 그룹 1: 그룹에 조건이 없습니다”. “보기”를 클릭하면 해당 규칙이 열립니다. 흔한 원인은 다음과 같습니다:

| 메시지 | 해결 방법 |
|---|---|
| 그룹에 조건이 없습니다 | 조건을 추가하거나 빈 그룹을 삭제하세요. |
| 슬롯을 선택하지 않았습니다 | “누를 버튼”에서 슬롯을 고르세요. |
| Q 플래그는 O와 함께만 사용할 수 있습니다 | “GCD 무관 (O)”를 켜거나 Q를 끄세요. |
| 알 수 없는 이름 … | 조건의 이름이 어떤 오라, 슬롯, 자원과도 맞지 않습니다. “텍스트 이름”을 확인하세요. |
| … — 종류: slot, 필요한 종류: buff | 슬롯에 오라 속성(`.up`, `.duration`)을 썼거나, 오라에 슬롯 속성(`.ready`, `.cd`)을 썼습니다. |
| 이름에 따옴표를 쓸 수 없습니다 | 로테이션, 슬롯, 오라 이름에서 `"`를 지우세요. |

모든 메시지는 [오류](https://keyrota.app/documentation/ko/rotation-json#errors)에 있습니다.

### `.oncd`와 `.cd > 0`의 차이

`X.oncd`: **어떤** 이유로든 슬롯이 준비되지 않았습니다. 재사용 대기시간, 자원 부족, 대상이 너무 멂, 슬롯이 표시되지 않음 등입니다. `X.cd > 0`: 재사용 대기시간이 돌고 있습니다. 충전형 주문은 슬롯이 준비되어 있어도 `.cd > 0`일 수 있습니다. 충전이 남아 있고 다음 충전이 재충전 중인 경우입니다.

### “아님”과 괄호를 쓰는 방법

KRC에는 `not`, `!=`, 괄호가 없습니다. “아님”은 짝이 되는 조건(`up`/`down`, `ready`/`oncd`, `glow`/`noglow`)이나 반대 연산자로 씁니다(“`>= 70`이 아님” 대신 `< 70`). “(A or B) and C”는 그룹 두 개입니다: `A and C`, `B and C`. 자세한 내용은 [“아님”, 괄호, OR](https://keyrota.app/documentation/ko/conditions#logic)을 참고하세요.

### 슬롯이나 오라가 12개보다 많이 필요하다면?

쓸 수 없습니다. 로테이션에는 Better Assistant 프로필과 마찬가지로 슬롯과 오라를 각각 최대 12개까지 넣을 수 있습니다. 매크로를 쓰면 자리를 아낄 수 있고(버튼 하나에 주문 여러 개), 한 슬롯을 여러 규칙에서 쓸 수 있습니다. 규칙 수에는 제한이 없습니다.

### 내게 없는 특성이 들어 있는 로테이션

특성을 찍지 않았으면 주문을 배우지 않은 상태이므로 슬롯이 준비되지 않고, 그 규칙은 그냥 건너뜁니다. 로테이션 하나를 여러 특성 구성에서 쓸 수 있습니다. 없는 주문의 규칙은 실행되지 않을 뿐입니다.

### 로테이션 옮기기와 공유

- 메인 창의 “내보내기”는 프로필을 로테이션과 함께 저장합니다. 다른 컴퓨터에서는 “가져오기”로 불러옵니다.
- 빌더의 “텍스트 및 JSON — 저장…”은 로테이션을 `.json` 또는 `.txt`로 저장합니다. 열 때는 “새로 만들기 — 파일에서…”를 사용하세요.
- Better Assistant 프로필은 로테이션의 슬롯과 오라로 다시 만들 수 있으므로 따로 전달할 필요가 없습니다.

### KeyRota가 가끔 아무것도 누르지 않는 이유

“기본 아이콘 무시”가 켜져 있으면 맞는 규칙이 없을 때 KeyRota는 기다립니다. 기력을 모으는 로테이션에서는 정상입니다. 연계 점수가 5 이상이면 소모 기술은 조건을 기다리고 생성기는 실행되지 않습니다. 기다리는 모습이 이상해 보이면 KeyRota 기록에서 어떤 규칙을 왜 건너뛰었는지 확인하세요.
