Ротация в JSON
Обновлено 18.10.2026
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: обнови её». Без 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"]
Используйте стандартные имена из таблицы: конструктор показывает их по-человечески («Здоровье игрока», «Энергия»), а другие люди и ИИ-агенты сразу понимают условия. null пропускает номер: ["PlayerHP", null, "Energy"] объявляет только resource1 и resource3. Ресурс, который не объявлен, читать нельзя: «resource2 не объявлен».
Все ресурсы — в процентах от максимума, 0–100. Как перевести комбо-очки, энергию и руны в проценты — в разделе Условия — Ресурсы.
auras#
Ауры — ваши бафы и ваши дебафы на цели. Аура n ротации — это аура n в списке Better Assistant.
| Поле | Тип | Обязательно | По умолчанию | Что это |
|---|---|---|---|---|
n | целое 1–12 | да | — | Номер ауры (buffN). Каждый номер — один раз. |
alias | строка | нет | из label | Имя в условиях. См. Имена. |
label | строка | нет | "" | Название. Без кавычек ". Удобно с ID в скобках: "Гаррота на цели [703]". |
spell | целое 0–100000000 | нет | 0 | ID ауры на Wowhead. 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 ротации — это слот n в Better Assistant.
| Поле | Тип | Обязательно | По умолчанию | Что это |
|---|---|---|---|---|
n | целое 1–12 | да | — | Номер слота (slotN). |
alias | строка | нет | из label | Имя в правилах и условиях. |
label | строка | нет | "" | Название заклинания. Без кавычек ". |
spell | целое 0–100000000 | нет | 0 | ID заклинания на Wowhead. По нему Better Assistant ставит его в слот. |
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 | все три | То же, но в окне очереди. | Редкий случай |
| Q без O | "queue": true | Ошибка: «queue — только вместе с offGcd». | — |
| M + другие | "manual": true, … | M главнее: слот не нажимается, остальные флаги не важны. | — |
Почему O + Q, а не просто O: кнопка с одним 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 | список групп | нет | [] | Группы ИЛИ. Пусто или нет — правило без условий: жать, когда заклинание можно применить. |
when: группы и условия#
| Поле | Тип | Обязательно | Что это |
|---|---|---|---|
all | непустой список строк | да | Условия группы, все должны выполниться (И). |
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"— это два условия, и оба считаются в лимит 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— ошибки.
Имя из названия. Если 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) |
| Группы ИЛИ в правиле | 16 |
| Условия И в группе | 16 |
| Правила | без ограничений |
| Число в условии | целое 0–100 |
enemies.range | 1–100 |
spell | 0–100000000 |
specID | 0–100000 |
| Ресурсы | до 99 |
Ровно 16 групп по 16 условий — можно, 17 — ошибка.
Ошибки#
Ротация с ошибкой не загружается целиком: частичного исполнения нет. Ошибка всегда называет место. В JSON — путь: rules[3].when[1]: неизвестное имя Foo (номера с нуля). В конструкторе — «Правило 4, группа 2: неизвестное имя Foo» (номера с единицы). В тексте 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 | queue: true без offGcd: 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 | больше 16 групп OR | В правиле больше 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 # Расправа
Строки#
#вне двойных кавычек начинает комментарий до конца строки. Внутри"названия"#— обычный символ.- Пустые строки и строки только с комментарием пропускаются: так пишут описание и разделители.
- Любая другая строка — объявление,
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 Слот 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 ротации.
- «Новый» — «Из файла…» принимает
.txtс текстом KRC, JSON ротации и профиль KeyRota; «Новый» — «Из буфера обмена» — то же из буфера. - В конструкторе: «Текст и JSON» — «Вставить» или «Открыть…» заменяют ротацию; слоты и ауры с теми же номерами сохраняют ID, «С целью / В бою» и флаги, если в новой версии их нет.
- Текстовая ротация (без JSON) берёт ID и видимость слотов из профиля Better Assistant, уже сохранённого в профиле KeyRota, а ID аур — и из меток
[703]в их названиях.
Профиль Better Assistant из JSON#
«Собрать из слотов и аур» в конструкторе строит строку профиля Better Assistant из JSON ротации:
- 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). Она проверяет поля, типы, диапазоны, флаг queue без offGcd и вид строк условий. Не проверяет: уникальность n и имён, существование имён в условиях, лимит 16 после деления строк по and — это делает KeyRota при загрузке.
Проверить файл:
npx ajv-cli validate --spec=draft2020 -s keyrota-rotation.schema.json -d my-rotation.json
В файл ротации поле "$schema" не добавляйте: KeyRota примет его за лишнее поле.