로테이션 JSON
업데이트: 2026. 10. 18.
JSON은 고급 로테이션을 빠짐없이 기술합니다. KRC 텍스트에 있는 모든 내용에 더해 주문 ID, 슬롯 플래그, 프로필 설정까지 담습니다. 빌더의 “텍스트 및 JSON” 페이지에서 볼 수 있고, KeyRota에서는 파일로 불러올 수 있습니다(“새로 만들기 — 파일에서…”, “가져오기”). 형식 이름은 keyrota-rotation, 버전은 1입니다. 검사용 JSON Schema도 있습니다.
예시 파일#
실제로 쓸 수 있는 가장 짧은 로테이션입니다. 연계 점수가 5 이상이고 대상에 파열이 없으면 파열을, 그 밖에는 절단을 누릅니다.
{
"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#
"enemies": {"range": 8, "combatOnly": true}
| 필드 | 형식 | 기본값 | 설명 |
|---|---|---|---|
range | 정수 1–100 | 8 | 적 수 측정 반경(미터). |
combatOnly | true / false | true | 이미 전투 중인 적만 셉니다. |
enemies 조건은 이 측정값을 읽습니다(주변 적 수 참고). 빌더에서는 “일반” 페이지의 “적 수 측정 반경(미터)”과 “전투 중인 적만”에 해당합니다. 이 값은 Better Assistant 프로필에도 들어갑니다.
notes와 footer#
로테이션 설명(notes)과 마지막 규칙 뒤의 주석(footer)입니다. 문자열 목록이나, \n이 들어간 문자열 하나로 씁니다. 빈 문자열 ""은 텍스트에서 빈 줄이 됩니다. 맨 앞과 맨 뒤의 빈 줄은 제거됩니다.
"notes": ["가이드와 상위 로그 기반, 패치 12.1", "", "v1.1: 대상 4명 이상에서 독살을 더 일찍 사용"]
KRC 텍스트에서는 선언 앞의 # … 줄입니다. 로테이션 동작에는 영향을 주지 않습니다.
resources#
자원 이름을 순서대로 적습니다. 첫 번째 항목이 resource1, 두 번째가 resource2, 이런 식입니다. 자원의 종류는 번호가 정하며, 이름은 조건에서 쓰는 표기일 뿐입니다:
resource1은 플레이어의 생명력,resource2는 대상의 생명력입니다.resource3부터는 specID 표의 순서대로 전문화 자원입니다. 도적이라면resource3이 기력,resource4가 연계 점수입니다.
"resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"]
표에 있는 표준 이름을 쓰세요. 빌더가 이를 알기 쉬운 말(“플레이어 생명력”, “기력”)로 보여 주고, 다른 사람과 AI 에이전트도 조건을 바로 이해합니다. null은 번호를 건너뜁니다: ["PlayerHP", null, "Energy"]는 resource1과 resource3만 선언합니다. 선언하지 않은 자원은 읽을 수 없습니다: “resource2 선언되지 않음”.
모든 자원은 최대치에 대한 백분율(0–100)입니다. 연계 점수, 기력, 룬을 백분율로 바꾸는 방법은 “조건” 문서의 자원을 참고하세요.
auras#
오라는 내 강화 효과와 대상에게 건 내 약화 효과입니다. 로테이션의 오라 n은 Better Assistant 목록의 오라 n입니다.
| 필드 | 형식 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
n | 정수 1–12 | 예 | — | 오라 번호(buffN). 번호마다 한 번만 쓸 수 있습니다. |
alias | 문자열 | 아니요 | label에서 생성 | 조건에서 쓰는 이름. 이름을 참고하세요. |
label | 문자열 | 아니요 | "" | 표시 이름. 큰따옴표 "는 쓸 수 없습니다. ID를 대괄호에 넣어 두면 편리합니다: "대상의 목조르기 [703]". |
spell | 정수 0–100000000 | 아니요 | 0 | Wowhead의 오라 ID. 0 = 지정 안 함: 이 오라는 Better Assistant 프로필에 들어가지 않으며 알 수 없는 값이 됩니다. |
note | 문자열 | 아니요 | "" | 선언 줄 끝의 주석. |
"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를 기다리는 위쪽 규칙을 앞지르지 않습니다.
"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 | 문자열 | 아니요 | 그룹의 주석(텍스트에서는 그 줄의 끝). |
{
"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. 전체 목록은 조건에 있습니다.
- 이름(
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은 의미 손실 없이 서로 변환됩니다.
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 전에만 씁니다:
rotation "이름" # 선택 사항, 최대 한 번
buff1 Garrote_DoT = "대상의 목조르기 [703]" # 오라 1
slot1 Garrote = "목조르기" # 슬롯 1
resource1 PlayerHP # 자원 1
buffN과 slotN은 1–12, resourceN은 1–99입니다. 따옴표 안의 레이블은 비워 둘 수 있습니다: slot5 Filler = "". 첫 번째 use 뒤에 선언을 쓰면 late_declaration 오류입니다.
규칙#
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(draft 2020-12). 필드, 형식, 범위, offGcd 없는 queue, 조건 문자열의 형태를 검사합니다. n과 이름이 고유한지, 조건 속 이름이 실제로 선언되었는지, 문자열을 and 로 나눈 뒤의 16개 제한은 검사하지 않습니다. 이 부분은 KeyRota가 불러올 때 검사합니다.
파일을 검사하려면:
npx ajv-cli validate --spec=draft2020 -s keyrota-rotation.schema.json -d my-rotation.json
로테이션 파일에 "$schema" 필드를 넣지 마세요. KeyRota가 불필요한 필드로 처리합니다.