Перейти к содержимому

Ротация в JSON

Обновлено 18.10.2026

JSON — полное описание продвинутой ротации: всё, что есть в тексте KRC, плюс ID заклинаний, флаги слотов и настройки профиля. Конструктор показывает его на странице «Текст и JSON», KeyRota принимает его файлом («Новый» — «Из файла…», «Импорт»). Формат называется keyrota-rotation, версия 1. Для проверки есть JSON Schema.

Пример файла#

Самая короткая полезная ротация: Рваная рана на 5+ комбо-очках, если её нет на цели, иначе Расправа.

minimal.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.
ignoreMainIcontrue / 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…)
ВоинОружие71Rage
ВоинНеистовство72Rage
ВоинЗащита73Rage
ПаладинСвет65Mana, Holy_Power
ПаладинЗащита66Mana, Holy_Power
ПаладинВоздаяние70Mana, Holy_Power
ОхотникПовелитель зверей253Focus
ОхотникСтрельба254Focus
ОхотникВыживание255Focus
РазбойникЛиквидация259Energy, Combo_Points
РазбойникГоловорез260Energy, Combo_Points
РазбойникСкрытность261Energy, Combo_Points
ЖрецПослушание256Mana, Insanity
ЖрецСвет257Mana, Insanity
ЖрецТьма258Mana, Insanity
Рыцарь смертиКровь250Runes, Runic_Power
Рыцарь смертиЛед251Runes, Runic_Power
Рыцарь смертиНечестивость252Runes, Runic_Power
ШаманСтихии262Mana, Maelstrom
ШаманСовершенствование263Mana, Maelstrom
ШаманИсцеление264Mana, Maelstrom
МагТайная магия62Mana, Arcane_Charges
МагОгонь63Mana, Arcane_Charges
МагЛед64Mana, Arcane_Charges
ЧернокнижникКолдовство265Mana, Soul_Shards
ЧернокнижникДемонология266Mana, Soul_Shards
ЧернокнижникРазрушение267Mana, Soul_Shards
МонахХмелевар268Energy, Stagger
МонахТкач туманов270Mana
МонахТанцующий с ветром269Energy, Chi
ДруидБаланс102Mana, Astral_Power
ДруидСила зверя103Energy, Combo_Points
ДруидСтраж104Rage
ДруидИсцеление105Mana, Astral_Power
Охотник на демоновИстребление577Fury
Охотник на демоновМесть581Fury
Охотник на демоновПожиратель1480Fury
ПробудительОпустошитель1467Mana, Essence
ПробудительХранитель1468Mana, Essence
ПробудительНасыщатель1473Mana, Essence

ignoreMainIcon#

true (по умолчанию): KeyRota жмёт только по правилам; если ни одно не подошло — ждёт. false: тогда она нажимает подсказку игры, как профиль Blizzard. Подсказка — последний вариант после всех правил, она никогда не обгоняет правило.

enemies#

JSON
"enemies": {"range": 8, "combatOnly": true}
ПолеТипПо умолчаниюЧто это
rangeцелое 1–1008Радиус счётчика врагов, ярдов.
combatOnlytrue / falsetrueСчитать только врагов, которые уже в бою.

Этот счётчик читает условие enemies (раздел Враги рядом). В конструкторе — «Радиус счётчика врагов, ярдов» и «Только враги в бою» на странице «Общее». Значения попадают и в профиль Better Assistant.

notes и footer#

Описание ротации (notes) и комментарии после последнего правила (footer). Список строк или одна строка с \n. Пустая строка "" — пустая строка в тексте. Пустые строки по краям отбрасываются.

JSON
"notes": ["Основа: гайд и топ-логи, патч 12.1", "", "v1.1: Отравление раньше при 4+ целях"]

В тексте KRC это строки # … перед объявлениями. На работу ротации не влияют.

resources#

Имена ресурсов по порядку: первый элемент — resource1, второй — resource2 и так далее. Номер определяет, что это за ресурс, имя — только то, как вы пишете его в условиях:

  • resource1 — здоровье игрока, resource2 — здоровье цели;
  • resource3 и дальше — ресурсы специализации в порядке из таблицы specID: у разбойника resource3 — энергия, resource4 — комбо-очки.
JSON
"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нет0ID ауры на Wowhead. 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 ротации — это слот n в Better Assistant.

ПолеТипОбязательноПо умолчаниюЧто это
nцелое 1–12да—Номер слота (slotN).
aliasстроканетиз labelИмя в правилах и условиях.
labelстроканет""Название заклинания. Без кавычек ".
spellцелое 0–100000000нет0ID заклинания на Wowhead. По нему Better Assistant ставит его в слот.
noteстроканет""Комментарий в конце строки объявления.
show"target" / "combat"нет"target"Когда Better Assistant показывает слот.
manualtrue / falseнетfalseФлаг M.
channeltrue / falseнетfalseФлаг C.
offGcdtrue / falseнетfalseФлаг O.
queuetrue / 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.

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список группнет[]Группы ИЛИ. Пусто или нет — правило без условий: жать, когда заклинание можно применить.

when: группы и условия#

ПолеТипОбязательноЧто это
allнепустой список строкдаУсловия группы, все должны выполниться (И).
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. Полный список — в разделе Условия.

  • Ссылаться можно по имени (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, versiontitle "", specID 0, ignoreMainIcon true, enemies {"range": 8, "combatOnly": true}, остальные списки пустые
Аураnalias из label, label "", spell 0
Слотnshow "target", все флаги false, spell 0
Правилоusename "", note [], when [] (без условий)
Группаall (непустой)comment ""

Лимиты#

ЧтоПредел
Ауры12 (n 1–12)
Слоты12 (n 1–12)
Группы ИЛИ в правиле16
Условия И в группе16
Правилабез ограничений
Число в условиицелое 0–100
enemies.range1–100
spell0–100000000
specID0–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..12n вне диапазона.
slots[3]: номер 4 уже занятДва слота (или две ауры) с одним n.
slots[1].show: ожидалось «target» или «combat»Другое значение show.
slots[0]: queue — только вместе с offGcdqueue: 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_refresource5 не объявленРесурс не объявлен в resources.
wrong_kindGarrote — это 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_rangebuff13: номер вне 1..12Ссылка на номер больше 12.
too_many_groupsбольше 16 групп ORВ правиле больше 16 групп.
too_many_conditions17 условий в группе (максимум 16)В группе больше 16 условий.

В конструкторе есть ещё «в группе нет условий» (пустая группа), «не выбран слот» и «в названии нельзя кавычки».

Текст KRC#

Текст KRC — та же ротация строками. Его показывает страница «Текст и JSON», и его можно хранить файлом .txt. Текст и JSON переводятся друг в друга без потери смысла.

Текст KRC
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:

Текст KRC
rotation "Название"                 # необязательно, не больше одного раза
buff1	Garrote_DoT = "Гаррота на цели [703]"   # аура 1
slot1	Garrote = "Гаррота"                     # слот 1
resource1	PlayerHP                           # ресурс 1

buffN и slotN — 1–12, resourceN — 1–99. Название в кавычках может быть пустым: slot5 Filler = "". Объявление после первого use — ошибка late_declaration.

Правила#

Текст KRC
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
Строки # … до первого usenotes
Комментарий в конце строки buffN / slotNnote ауры / слота
Строки # … прямо перед use (и между группами правила)note правила
Комментарий на строке usename правила
Комментарий в конце строки условий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 примет его за лишнее поле.