# KeyRota: продвинутые ротации (KRC), документация

Источник: https://keyrota.app/documentation/ru/advanced (Обновлено 18.10.2026). JSON Schema: https://keyrota.app/documentation/keyrota-rotation.schema.json. Указатель для ИИ-агентов: https://keyrota.app/documentation/llms.txt.

---

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

## Продвинутые ротации (KRC)

> [!TIP] Рекомендуем собирать ротацию с ИИ-агентом
> Это гораздо быстрее и удобнее, чем настраивать её вручную. Чем продвинутее ИИ-агент, тем точнее ротация с первого раза совпадёт с вашими требованиями. Рекомендуем последние вышедшие модели Anthropic и OpenAI с уровнем рассуждений «Extra (xhigh)». Как это сделать, описано в разделе [Ротация с ИИ-агентом](https://keyrota.app/documentation/ru/ai).

Продвинутая ротация — ваш собственный список правил: какую способность нажать и когда. KeyRota проверяет правила в бою и нажимает первую подходящую кнопку. Формат и движок таких ротаций называются **KRC** (KeyRota Customization).

### Базовая или продвинутая

| | Blizzard (базовая) | Продвинутая (KRC) |
|---|---|---|
| Кто выбирает кнопку | Игра: подсказка Blizzard | Ваши правила |
| Настройка | Не нужна | Слоты, ауры и правила: в конструкторе или файлом |
| Специализации | Любая для нанесения урона (РДД, ДД) и танковая | Та, для которой написана ротация |
| Burst и режим целей | Не используются | Кнопки «Burst» и «Цели», правила решают сами |
| Когда выбирать | Быстро начать на любом персонаже | Нужен точный приоритет: доты, накопление ресурса, кулдауны в окно бурста, своя логика для нескольких целей |

В блоке «Ротация» приложения профиль Blizzard стоит первым, ваши ротации — ниже, в группе «Свои ротации». Переключиться можно в любой момент, когда ротация остановлена.

### Из чего состоит ротация

| Часть | Что это | Сколько |
|---|---|---|
| **Слоты** | Кнопки ротации. Слот N ротации — это слот N в профиле Better Assistant. | до 12 |
| **Ауры** | Ваши бафы и ваши дебафы на цели, по ID заклинания. Аура N ротации — это аура N в списке Better Assistant. | до 12 |
| **Ресурсы** | Здоровье игрока и цели, ресурсы специализации: энергия, комбо-очки, ярость, мана и другие. Все значения — в процентах. | по специализации |
| **Бой** | Число врагов рядом и дистанция до цели. | 2 |
| **Переключатели** | Кнопки панели быстрых настроек: режим целей (две кнопки в правилах: `aoe` и `st`), Burst, «Хил / защита», «Наземные», «Движение». | 6 |
| **Правила** | Какой слот нажать и при каких условиях. Порядок правил — это приоритет. | без ограничений |

Правило состоит из групп условий. Правило выполнено, если выполнена **хотя бы одна** его группа (ИЛИ), а группа выполнена, если выполнены **все** её условия (И). Правило без групп выполнено всегда.

*Текст 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/ru/conditions#resources).

### Как KeyRota выбирает кнопку

1. Правила просматриваются **сверху вниз**, в порядке списка.
2. Для каждого правила проверяются его группы. Если ни одна не выполнена, KeyRota переходит к следующему правилу.
3. Если правило выполнено, но его заклинание сейчас **нельзя применить** (кулдаун, не хватает ресурса, цель далеко, нет цели, заклинание не изучено), KeyRota тоже переходит к следующему правилу. Проверять готовость самого слота условием не нужно.
4. Первое правило, которое выполнено и чьё заклинание можно применить, становится **выбранным**. Глобальный кулдаун (GCD) выбор не меняет: правило, которое ждёт конца GCD, остаётся выбранным, и правила ниже его не обгоняют.
5. Если не подошло ни одно правило: при включённой настройке «Игнорировать основную иконку» KeyRota ждёт, при выключенной — нажимает подсказку игры.

Ожидание — нормальное состояние. Например, ротация с накоплением энергии часто ничего не жмёт полсекунды-секунду, пока энергии не хватит на правило выше.

### Неизвестное значение никогда не разрешает правило

Иногда KeyRota не знает значения: аура не читается (нет её ID в профиле Better Assistant), нет цели (здоровье цели и дистанция до неё неизвестны), враги не подсчитаны. Условие, которое читает неизвестное значение, **ложно** — и `X.up`, и `X.down`, и `TargetHP >= 50`, и `TargetHP < 50`. Неизвестное значение может только запретить правило, но не разрешить его: лучше пропустить нажатие, чем нажать не то.

> [!TIP]
> Если правило никогда не срабатывает, первым делом проверьте, что все ауры, которые оно читает, есть в профиле Better Assistant с правильными ID. Подробнее — в разделе [Вопросы и неполадки](https://keyrota.app/documentation/ru/faq#never-fires).

### Когда нажимается кнопка

- **Обычное заклинание** (на GCD) нажимается в окне очереди заклинаний в самом конце GCD: игра запускает его сразу, как только GCD закончится.
- **Флаги слота** меняют это: «Только вручную (M)», «Канал (C)», «Вне GCD (O)», «В окне очереди (Q)». Что делает каждый и как их сочетать — в разделе [Флаги слота](https://keyrota.app/documentation/ru/rotation-json#flags).
- **Канал.** Пока идёт канал, KeyRota ничего не нажимает, чтобы его не сбить. **Каст** — KeyRota ждёт, пока до его конца не останется окно очереди.
- **Ваши нажатия.** Когда вы сами жмёте клавишу способности, KeyRota уступает и не спорит с вами.

### Быстрый старт

Если KeyRota ещё не установлена, начните с [первых шагов](https://keyrota.app/documentation/ru/start).

1. В KeyRota откройте «Ротация» — «Новый» — «В конструкторе…».
2. На странице «Общее» выберите специализацию и дайте ротации название.
3. На странице «Слоты» добавьте кнопки и ID их заклинаний, на странице «Ауры» — бафы и дебафы, которые будут читать правила.
4. На странице «Правила» добавьте правила в порядке приоритета.
5. На странице «Общее» нажмите «Собрать из слотов и аур» и «Скопировать». В игре: `/ba` — вкладка Profile — вставить строку — Apply.
6. Поставьте заклинания слотов на панели действий и назначьте им клавиши (подойдёт и макрос с `#showtooltip`).
7. Нажмите «Сохранить», выберите профиль в списке и запустите ротацию клавишей F1 (на macOS — ⌃⇧Пробел).

Подробно, с каждой кнопкой и примером, — в разделе [Конструктор ротации](https://keyrota.app/documentation/ru/editor).

### В этом разделе

- [Конструктор ротации](https://keyrota.app/documentation/ru/editor) — все страницы и кнопки окна и пример ротации по шагам.
- [Ротация в JSON](https://keyrota.app/documentation/ru/rotation-json) — каждое поле формата, флаги слотов, имена, лимиты, ошибки и текст KRC.
- [Условия](https://keyrota.app/documentation/ru/conditions) — все виды условий, операторы, проценты и неизвестные значения.
- [Примеры готовых приёмов](https://keyrota.app/documentation/ru/patterns) — доты, накопление, генератор и трата, АоЕ, Burst, защита и другие шаблоны.
- [Ротация с ИИ-агентом](https://keyrota.app/documentation/ru/ai) — шаблон промпта, анализ логов и проверка результата.
- [Вопросы и неполадки](https://keyrota.app/documentation/ru/faq) — почему правило не срабатывает, жмёт рано или поздно, рвёт канал.

---

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

## Конструктор ротации

Конструктор — окно KeyRota, в котором продвинутая ротация собирается без набора текста: слоты с флагами, ауры, правила, а рядом текст KRC и JSON. Документация одна для Windows и macOS, снимки окна сделаны в Windows. На снимках — рейдовая ротация Ликвидации из [примеров](https://keyrota.app/documentation/ru/patterns#example-files).

### Как открыть

- **Своя ротация.** Выберите профиль в блоке «Ротация» главного окна и нажмите «Настроить».
- **Новая ротация.** «Новый» — «В конструкторе…». Специализация подставляется из игры или из текущего профиля. Ротация станет профилем при первом сохранении.
- **Из файла или буфера.** «Новый» — «Из файла…» принимает текст KRC (`.txt`), ротацию в JSON и файл профиля KeyRota; «Новый» — «Из буфера обмена» — то же самое из буфера. Потом профиль можно открыть в конструкторе кнопкой «Настроить».

![Новая ротация в конструкторе: страница «Общее», пустые слоты и правила](https://keyrota.app/documentation/img/ru/editor-new.png)

У **профиля Blizzard** конструктор показывает только название и задержку нажатий: главную кнопку выбирает игра. Кнопка «Собрать свою ротацию» создаёт новый профиль с продвинутой ротацией, профиль Blizzard остаётся в списке.

![Профиль Blizzard в конструкторе: название, задержка нажатий и кнопка «Собрать свою ротацию»](https://keyrota.app/documentation/img/ru/editor-blizzard.png)

#### Устройство окна

- **Слева** — страницы: «Общее», «Слоты», «Ауры», «Правила» (рядом число правил), «Текст и JSON». Над ними — «Своя ротация» и выбранная специализация.
- **Справа** — выбранная страница.
- **Внизу** — строка состояния: собирается ли ротация («Ротация собирается: 15 правил, 11 слотов, 10 аур»), есть ли несохранённые изменения, а при ошибке — где она и кнопка «Показать». Справа — «Закрыть» и «Сохранить».

Ничего не применяется до «Сохранить» (в Windows также Ctrl+S).

### Общее

![Страница «Общее»: профиль, специализация, название ротации, «Игнорировать основную иконку», задержка нажатий](https://keyrota.app/documentation/img/ru/editor-general.png)

| Элемент | Что делает |
|---|---|
| **Название профиля** | Как профиль называется в списке ротаций главного окна. |
| **Специализация** | Задаёт ресурсы ротации (энергия, комбо-очки, ярость…) и класс и специализацию профиля Better Assistant. При смене специализации список ресурсов меняется, если правила не читают ресурсы прежней специализации (здоровье не в счёт). |
| **Название ротации** | Первая строка текста KRC (`rotation "…"`), видна в журнале KeyRota. Кавычки в названии нельзя. Удобно хранить в нём версию: «Ликвидация v1.3». |
| **Игнорировать основную иконку** | Вкл.: KeyRota жмёт только по правилам; если ни одно правило не подошло, ждёт. Выкл.: тогда она жмёт подсказку игры. Для своих ротаций обычно включено: ожидание (например, накопление энергии) — нормальное состояние. |
| **Задержка нажатий** | Пауза перед каждым нажатием, как у человека: «Нет», «Фикс.» (интервал 0–1000 мс) или «Случайно» (от и до, 0–1000 мс). «Также для киков и защиты» применяет ту же паузу к ним. |

![Страница «Общее» ниже: блок Better Assistant, радиус счётчика врагов, «Только враги в бою» и описание](https://keyrota.app/documentation/img/ru/editor-general-ba.png)

| Элемент | Что делает |
|---|---|
| **Профиль: …** | Сводка строки профиля Better Assistant: специализация, сколько заклинаний и аур. |
| **Собрать из слотов и аур** | Строит строку профиля Better Assistant из ID заклинаний слотов, настройки «Better Assistant показывает» у каждого слота, аур по порядку, специализации, радиуса и «Только враги в бою». Если уже вставлен профиль той же специализации, его остальные настройки сохраняются. |
| **Из буфера обмена** | Вставить готовую строку профиля. Специализация строки должна совпадать со специализацией ротации. |
| **Скопировать** | Скопировать строку, чтобы вставить её в игре. |
| **Радиус счётчика врагов, ярдов** | 1–100, по умолчанию 8. Этот радиус использует условие «Врагов рядом» (`enemies`). |
| **Только враги в бою** | По умолчанию включено: враги, которые ещё не в бою, не считаются. |
| **Описание** | Заметки к ротации: в тексте KRC это строки с `#` в начале. На работу ротации не влияют. |

Под кнопками появляются предупреждения: у каких слотов из правил нет ID заклинания (их не будет в профиле Better Assistant) и что в уже вставленном профиле не совпадает с ротацией.

> [!IMPORTANT]
> Ауры в профиле Better Assistant идут подряд, начиная с первой. Если у ауры 3 нет ID, а у ауры 4 есть, профиль не соберётся: «У ауры 3 нет номера заклинания». Заполните ID или перенумеруйте ауры.

#### Профиль Better Assistant в игре

Слот N ротации — это слот N в Better Assistant, аура N — аура N в его списке. Строка профиля переносит туда ваши слоты и ауры в нужном порядке.

1. На странице «Общее» нажмите «Собрать из слотов и аур», затем «Скопировать».
2. В игре введите `/ba`, откройте вкладку **Profile**, вставьте строку и нажмите **Apply**, затем подтвердите.
3. После любой правки слотов или аур (ID, порядок, «С целью / В бою») соберите и вставьте профиль заново.

### Слоты

![Страница «Слоты»: список из 12 мест слева, справа выбранный слот 10 «Исчезновение» с ID 1856](https://keyrota.app/documentation/img/ru/editor-slots.png)

Слева — 12 мест: номер, название, ID заклинания, флаги («вне GCD, в очереди») и пометка «не используется», если слот не встречается в правилах. Пустое место показывает «Пусто», при выборе — кнопку «Добавить слот».

| Элемент | Что делает |
|---|---|
| **Название** | Как заклинание называется в игре. Видно в списке правил и в журнале. |
| **ID заклинания** | Номер из ссылки Wowhead: в `wowhead.com/spell=1856/vanish` это `1856`. По нему Better Assistant ставит заклинание в этот слот. |
| **Better Assistant показывает** | «С целью» или «В бою». Слот готов, только когда Better Assistant его показывает. «В бою» нужно лечению и защите, которые должны срабатывать и без цели. |
| **Как нажимать** | Четыре переключателя-флага, см. таблицу ниже. |
| **Имя в тексте** | Имя слота в правилах и в тексте KRC: буквы, цифры и `_`, без пробелов. |
| **Комментарий** | Комментарий в конце строки объявления в тексте. |
| **Используется в правилах** | Номера правил, где слот нажимается или читается. «Убрать слот» доступно, только если слот нигде не используется. |

Чтобы KeyRota могла нажать слот, его заклинание должно стоять на панели действий в игре с назначенной клавишей: KeyRota берёт клавишу с панелей. Подойдёт и макрос с `#showtooltip Название`. Слот без клавиши не нажимается.

#### Как нажимать: флаги

![Переключатели «Как нажимать» у слота «Исчезновение»: включены «Вне GCD (O)» и «В окне очереди (Q)»](https://keyrota.app/documentation/img/ru/editor-slot-flags.png)

| Переключатель | Что делает | Когда включать |
|---|---|---|
| без флагов | Слот жмётся как обычное заклинание: в конце глобального кулдауна, в окне очереди. | Почти все заклинания на GCD. |
| **Только вручную (M)** | KeyRota никогда не жмёт этот слот сама и пропускает его правила. Ваше нажатие его клавиши ставит ротацию на паузу. | Способности, которые вы хотите жать только сами. |
| **Канал (C)** | Пока идёт канал этого заклинания, KeyRota ничего не жмёт и не сбивает его. | Заклинания с каналом, например Череда убийств. |
| **Вне GCD (O)** | Не ждёт глобального кулдауна: жмётся сразу, даже посреди GCD. | Заклинания вне GCD, например Призовая игра. |
| **В окне очереди (Q)** | Только вместе с «Вне GCD»: жать в самом конце GCD, в окне очереди заклинаний. | Макросы, где вторая строка на GCD (Выброс адреналина + Череда убийств), и кнопки, которым нужен результат прошлого удара (Исчезновение после Погибели королей). |

Все сочетания флагов и их запись в JSON — в разделе [Флаги слота](https://keyrota.app/documentation/ru/rotation-json#flags).

### Ауры

![Страница «Ауры»: аура 1 «Гаррота на цели [703]», ID 703, имя в тексте Garrote_DoT, используется в правилах 3, 4, 5, 7, 8, 10](https://keyrota.app/documentation/img/ru/editor-auras.png)

Ауры — ваши бафы и ваши дебафы на цели, которые читают правила. Аура N ротации — это аура N в списке Better Assistant.

| Элемент | Что делает |
|---|---|
| **Название** | Как аура называется; видно в правилах. Удобно писать ID в скобках: «Гаррота на цели [703]». |
| **ID заклинания** | Номер ауры на Wowhead. Better Assistant ищет её среди ваших бафов и ваших дебафов на цели. |
| **Имя в тексте**, **Комментарий** | Как у слотов. |
| **Используется в правилах** | Где аура читается. «Убрать ауру» — только для неиспользуемой. |

> [!NOTE]
> ID ауры и ID заклинания, которое её вешает, могут отличаться. Заклинание Исчезновение — `1856`, а баф после него — `11327`; Незаметность — `1784`, а Незаметность с талантом Увёртка — `115191`. Проверяйте ID самого бафа или дебафа на Wowhead.

Видны только **ваши** ауры: бафы, которые вы наложили на себя, и дебафы, которые вы наложили на цель. Бафы от других игроков и чужие дебафы на цели правила не видят.

### Правила

![Страница «Правила»: список из 15 правил слева, справа правило 4 «Знак смерти» с группой условий](https://keyrota.app/documentation/img/ru/editor-rules.png)

Правила проверяются сверху вниз: KeyRota жмёт первое, которое выполнено и чьё заклинание можно применить. Если заклинание применить нельзя (кулдаун, ресурс, дальность), она смотрит следующее правило.

**Панель над списком:**

| Кнопка | Что делает |
|---|---|
| **+** | Новое правило под выбранным. Оно жмёт первый слот и пока без условий. |
| **Копия** | Копия правила под ним. |
| **Корзина** | Удалить правило. |
| **Вверх**, **Вниз** | Поднять (раньше проверяется) или опустить (позже проверяется). |

В списке у каждого правила — номер (приоритет), слот, название и число групп; правило с ошибкой отмечено красным значком.

**Выбранное правило:**

| Элемент | Что делает |
|---|---|
| **Нажимать** | Какой слот нажать, когда правило выполнено. |
| **Название** | Видно в журнале, когда правило сработало. |
| **Описание** | Заметки над правилом в тексте KRC. |
| **Когда нажимать** | Группы условий: правило выполнено, если выполнена хотя бы одна группа (ИЛИ); группа — если выполнены все её условия (И). |

![Группы условий правила «Рваная рана»: группа 1 и группа 2, разделённые «ИЛИ»](https://keyrota.app/documentation/img/ru/editor-rule-groups.png)

У каждой группы — «Группа N», поле «Комментарий группы», кнопки «Копия группы» и «Удалить группу». Строка условия: **что проверять**, **свойство**, **сравнение** и **число**; крестик убирает условие. «+ Условие» добавляет условие в группу, «+ Группа (ИЛИ)» — новую группу. В одной группе до 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/ru/conditions).

### Ошибки и строка состояния

![Ошибка в правиле 9: группа 1 без условий выделена красным, внизу «Правило 9, группа 1: в группе нет условий» и «Показать»](https://keyrota.app/documentation/img/ru/editor-problem.png)

- **Зелёная строка** «Ротация собирается: …» — ротация без ошибок и её можно сохранить.
- **Красная строка** называет место ошибки: «Правило 9, группа 1: в группе нет условий». «Показать» открывает это место. Правило с ошибкой отмечено в списке, группа с ошибкой обведена красным.
- Ротация с ошибкой не сохраняется: «Ротация с ошибкой не сохраняется: исправь отмеченное внизу».
- Пока ротация запущена, сохранить нельзя: «Останови ротацию, чтобы сохранить».

### Текст и JSON

![Страница «Текст и JSON», режим «Текст KRC»: начало текста ротации с описанием и объявлениями buff1–buff7](https://keyrota.app/documentation/img/ru/editor-text.png)

![Страница «Текст и JSON», режим «JSON»: начало JSON ротации с полями format, version, title, specID, ignoreMainIcon, enemies, notes](https://keyrota.app/documentation/img/ru/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 ротации.

### Пример: ротация с нуля

Соберём небольшую ротацию Ликвидации: два дота (Гаррота и Рваная рана), генератор (Расправа), трата (Отравление), защита (Алый фиал при здоровье 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. Правила.** На странице «Правила» нажмите «+», в «Нажимать» выберите слот, впишите «Название». «+ Группа (ИЛИ)» добавляет группу с условием по умолчанию: смените «что проверять», свойство, сравнение и число. «+ Условие» добавляет следующее условие в ту же группу. Правила — в таком порядке:

| № | Нажимать | Группы (ИЛИ), условия в группе (И) |
|---|---|---|
| 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 (F3 в Windows, ⌃⇧B на macOS), а не кулдаун заклинания. Выключили Burst — Знак ждёт.
- **Доты с пандемией**: отсутствующая аура имеет остаток 0, поэтому обновление пишется двумя группами: «нет дота» и «дот есть и осталось ≤ 30 %».
- **5 комбо-очков = 70**: из 7 комбо-очков 5 — это 71 %; порог `70` верен при любом округлении. Таблица — в разделе [Ресурсы](https://keyrota.app/documentation/ru/conditions#resources).
- **Расправа последней** и только до 5 комбо-очков, чтобы не тратить энергию впустую, пока Отравление ждёт своего условия.

**6. Проверка.** Внизу должно быть «Ротация собирается: 6 правил, 6 слотов, 4 ауры». Откройте «Текст и JSON» — там будет то же, что ниже.

**7. Профиль Better Assistant.** «Общее» — «Собрать из слотов и аур» — «Скопировать»; в игре `/ba` — Profile — вставить — Apply.

**8. Клавиши.** Поставьте шесть заклинаний на панели действий и назначьте им клавиши.

**9. Запуск.** «Сохранить», закройте окно, выберите профиль «Ликвидация: пример» и запустите ротацию (F1 в Windows, ⌃⇧Пробел на macOS). На панели быстрых настроек включите «Хил / защита», если нужен Алый фиал; кнопка Burst включает и выключает Знак смерти.

*Текст KRC:*

```text
rotation "Ликвидация: пример v1"

# Пример из документации KeyRota: два кровотечения, генератор, трата с накоплением энергии,
# защита при низком здоровье и Знак смерти по кнопке 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: два кровотечения, генератор, трата с накоплением энергии,",
    "защита при низком здоровье и Знак смерти по кнопке 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.ru.json), [текст KRC](https://keyrota.app/documentation/examples/starter-assassination.ru.txt). Откройте его кнопкой «Открыть…» на странице «Текст и JSON» или через «Новый» — «Из файла…».

---

<!-- https://keyrota.app/documentation/ru/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: обнови её». Без `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/ru/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"]
```


Используйте стандартные имена из таблицы: конструктор показывает их по-человечески («Здоровье игрока», «Энергия»), а другие люди и ИИ-агенты сразу понимают условия. `null` пропускает номер: `["PlayerHP", null, "Energy"]` объявляет только `resource1` и `resource3`. Ресурс, который не объявлен, читать нельзя: «resource2 не объявлен».

Все ресурсы — в **процентах** от максимума, 0–100. Как перевести комбо-очки, энергию и руны в проценты — в разделе [Условия — Ресурсы](https://keyrota.app/documentation/ru/conditions#resources).

### auras

Ауры — ваши бафы и ваши дебафы на цели. Аура `n` ротации — это аура `n` в списке Better Assistant.

| Поле | Тип | Обязательно | По умолчанию | Что это |
|---|---|---|---|---|
| `n` | целое 1–12 | да | — | Номер ауры (`buffN`). Каждый номер — один раз. |
| `alias` | строка | нет | из `label` | Имя в условиях. См. [Имена](#aliases). |
| `label` | строка | нет | `""` | Название. Без кавычек `"`. Удобно с ID в скобках: `"Гаррота на цели [703]"`. |
| `spell` | целое 0–100000000 | нет | `0` | ID ауры на 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 | нет | `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.

```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`. Полный список — в разделе [Условия](https://keyrota.app/documentation/ru/conditions).

- Ссылаться можно по имени (`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 переводятся друг в друга без потери смысла.

*Текст 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  # Расправа
```


#### Строки

- `#` вне двойных кавычек начинает комментарий до конца строки. Внутри `"названия"` `#` — обычный символ.
- Пустые строки и строки только с комментарием пропускаются: так пишут описание и разделители.
- Любая другая строка — объявление, `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 Слот 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](https://keyrota.app/documentation/keyrota-rotation.schema.json) (draft 2020-12). Она проверяет поля, типы, диапазоны, флаг `queue` без `offGcd` и вид строк условий. Не проверяет: уникальность `n` и имён, существование имён в условиях, лимит 16 после деления строк по ` and ` — это делает KeyRota при загрузке.

Проверить файл:

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


В файл ротации поле `"$schema"` не добавляйте: KeyRota примет его за лишнее поле.

---

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

## Условия

Условие — одна проверка: «Гаррота на цели есть», «энергии не меньше 70 %», «Burst включён». Условия собираются в группы (И), группы — в правило (ИЛИ). В конструкторе условие выбирается списками, в тексте KRC и JSON оно пишется строкой — она и показана в примерах.

### Синтаксис

| Вид | Форма | Пример |
|---|---|---|
| Аура: есть / нет | `Аура.up`, `Аура.down` | `Garrote_DoT.down` |
| Аура: остаток, стаки | `Аура.duration оп N`, `Аура.stacks оп N` | `Rupture_DoT.duration <= 30` |
| Слот: готов / не готов | `Слот.ready`, `Слот.oncd` | `Kingsbane.ready` |
| Слот: кулдаун, заряды | `Слот.cd оп N`, `Слот.charges оп N` | `Deathmark.cd <= 3` |
| Слот: подсветка | `Слот.glow`, `Слот.noglow` | `Ambush.glow` |
| Ресурс | `Ресурс оп N` | `Combo_Points >= 70` |
| Враги рядом | `enemies оп N` | `enemies >= 3` |
| Дистанция до цели | `target.distance оп 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]
> Счётчик стопок начинается с двух: аура с одной стопкой читается как **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  # оба заряда: не терять перезарядку
	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 комбо-очков одно очко — около 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, а не кулдаун заклинания.** Кулдаун слота — это `Слот.cd`.
- `aoe` и `st` одновременно не бывают равны 1. F2 переключает по кругу: Авто, Одна, Много.
- По умолчанию Burst включён, режим целей — Авто, остальные кнопки выключены. KeyRota запоминает их состояние.
- Кнопка на панели активна, только если ротация читает этот переключатель; у профиля Blizzard все кнопки приглушены.
- Переключатели никогда не бывают неизвестными.

### Как вычисляются условия

| Условие | Значение есть | Ауры нет | Неизвестно |
|---|---|---|---|
| `X.up` | истина | ложь | **ложь** |
| `X.down` | ложь | истина | **ложь** |
| `X.duration оп N`, `X.stacks оп N` | сравнение | сравнение с **0** | **ложь** |
| `X.ready` / `X.oncd` | по готовности | — | **ложь** (оба) |
| `X.glow` / `X.noglow` | по подсветке | — | **ложь** (оба) |
| `X.cd`, `X.charges`, ресурс, `enemies`, `target.distance` | сравнение | — | **ложь** |
| переключатель | сравнение | — | не бывает |

Группа истинна, если истинны все её условия. Правило выполнено, если истинна хотя бы одна группа или групп нет совсем.

### «Не», скобки и ИЛИ внутри группы

В KRC нет `not`, `!=` и скобок. Всё выражается группами:

- **«Не»** — парным условием: вместо «не `.up`» пишут `.down`, вместо «не `.ready`» — `.oncd`, вместо «не `.glow`» — `.noglow`; для чисел — обратный оператор: вместо «не `>= 70`» пишут `< 70`.
- **(A или B) и C** — две группы: `A and C`, `B and C`.
- **A и не (B и C)** — две группы: `A and не-B`, `A and не-C`.
- **Одно и то же условие во всех группах** (как защита канала) повторяется в каждой группе.

```text
use Fan_of_Knives when  # Веер клинков: (режим «Много» ИЛИ Авто и 2+ врага) И до 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` | 5+ комбо-очков из 7 |
| `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/ru/patterns -->

## Примеры готовых приёмов

Каждый приём — маленькая, но целая ротация: слева текст KRC, справа тот же JSON. Её можно вставить в конструктор («Текст и JSON» — «Вставить») и посмотреть, как она выглядит на страницах «Слоты» и «Правила». ID заклинаний — настоящие, с Wowhead. В конце — [готовые ротации целиком](#example-files).

### Дот с обновлением в пандемию

Повесить дот, если его нет, и обновить, когда осталось 30 % и меньше: при обновлении в этом окне остаток не теряется. Отсутствующая аура имеет остаток 0, поэтому обновление — отдельная группа с `.up`.

*Текст KRC:*

```text
rotation "Приём: дот с пандемией"

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": "Приём: дот с пандемией",
  "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+ целях: добавьте `TargetHP >= 50` в группу «дота нет» и отдельную группу `Garrote_DoT.down and enemies <= 2` для одной-двух целей.
- Длинный дот с переменной длительностью (Рваная рана: 4 с + 4 с за комбо-очко) — тот же приём, проценты считаются от длительности именно этого наложения.

### Генератор и трата по комбо-очкам

Тратить на 5+ комбо-очках из 7, копить ниже. Пороги — посередине между ступенями, см. [таблицу комбо-очков](https://keyrota.app/documentation/ru/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+ врага»; правило одной цели — «режим Одна» и «режим Авто и не больше одного врага».

*Текст 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  # режим «Авто», один враг
```

*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": "режим «Авто», один враг"}
    ]}
  ]
}
```


- `st == 0 and enemies >= 2` — это «не режим Одна»: в режиме «Много» правило и так сработает первой группой.
- `enemies <= 1` надёжнее, чем `enemies == 1`: на одной цели враг может не попасть в счётчик.
- Радиус счётчика (`enemies.range`) берите по радиусу АоЕ-способности: у Веера клинков 8 ярдов.

### Кулдауны под Burst и «только под кулдауном»

`cd == 1` — кнопка 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"]}
    ]}
  ]
}
```


- Почему `<= 8`, а не `.down`: без канала остаток ауры 0, и условие выполнено; во время канала оно ждёт его последних 8 %, а не лишние доли секунды после конца.
- Если аура не читается, условие ложно во всех правилах, и 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 ставит его в слот, а клавишу 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  # HP 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": "HP 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 заряда).

*Текст KRC:*

```text
rotation "Приём: заряды"

slot1	Barbed_Shot = "Разрывающий выстрел"
slot2	Kill_Command = "Команда «Взять!»"
resource1	PlayerHP
resource2	TargetHP
resource3	Focus

use Barbed_Shot when  # Разрывающий выстрел
	Barbed_Shot.charges >= 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": "оба заряда"},
      {"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/ru/editor#walkthrough): два дота, генератор, трата с накоплением, защита и Знак смерти под Burst.

*Текст KRC:*

```text
rotation "Ликвидация: пример v1"

# Пример из документации KeyRota: два кровотечения, генератор, трата с накоплением энергии,
# защита при низком здоровье и Знак смерти по кнопке 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: два кровотечения, генератор, трата с накоплением энергии,",
    "защита при низком здоровье и Знак смерти по кнопке 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, Исчезновение под Знаком смерти, копирование дотов Кровавым вихрем, АоЕ и одна цель, накопление энергии.

**Текст 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: обновить, когда осталось 14 с из 18

# === Кулдауны (кнопка 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: не жать сразу, а держать баф «Отравление» непрерывным: в последнюю секунду бафа, пока на цели Знак смерти, перед переполнением энергии, на 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.ru.json), [текст KRC](https://keyrota.app/documentation/examples/starter-assassination.ru.txt) |
| Ликвидация, рейд: 15 правил | [JSON](https://keyrota.app/documentation/examples/assassination-raid.ru.json), [текст KRC](https://keyrota.app/documentation/examples/assassination-raid.ru.txt) |
| Головорез, рейд и M+: 13 правил, флаги O, OQ, C | [JSON](https://keyrota.app/documentation/examples/outlaw-raid.ru.json), [текст KRC](https://keyrota.app/documentation/examples/outlaw-raid.ru.txt) |
| Самая короткая полезная ротация | [JSON](https://keyrota.app/documentation/examples/minimal.ru.json), [текст KRC](https://keyrota.app/documentation/examples/minimal.ru.txt) |
| Проверка синтаксиса: все виды условий и флагов (ID не заданы, не для боя) | [JSON](https://keyrota.app/documentation/examples/syntax-every-condition.ru.json), [текст KRC](https://keyrota.app/documentation/examples/syntax-every-condition.ru.txt) |

Каждый пример есть на всех языках сайта: названия, правила и комментарии переведены, а условия, ID заклинаний и флаги одни и те же. Язык указан в имени файла: `.ru`, `.en`, `.de`, `.fr`, `.es`, `.it`, `.pt`, `.ko`, `.zh`, `.zh-TW`.

Открыть файл: «Новый» — «Из файла…» в главном окне или «Открыть…» на странице «Текст и JSON» конструктора.

---

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

## Ротация с ИИ-агентом

> [!TIP] Достаточно ссылки на эту страницу
> Можно просто дать ИИ-агенту ссылку на эту страницу: он сам во всём разберётся и, если понадобится, спросит у вас недостающие данные.

ИИ-агент с доступом к интернету и файлам может собрать ротацию KRC за вас: изучить логи лучших игроков вашей специализации, гайды и список действий SimulationCraft, сравнить с вашими талантами и логами и выдать готовый JSON. Здесь — что ему дать, готовый промпт и как проверить результат.

### Что понадобится

**Агент**, который умеет открывать сайты (Warcraft Logs, Raider.IO, Wowhead, GitHub) и читать файлы. Если доступа к вебу нет, дайте ему документацию и выдержки из логов файлами.

**Документация для агента** (ссылки уже есть в промпте):

| Ссылка | Что внутри |
|---|---|
| [llms.txt](https://keyrota.app/documentation/llms.txt) | Указатель документации для ИИ-агентов: все языки, файлы и примеры |
| [krc-guide.ru.md](https://keyrota.app/documentation/krc-guide.ru.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.ru.json), [Головорез, рейд и M+](https://keyrota.app/documentation/examples/outlaw-raid.ru.json) | Настоящие рейдовые ротации как образец |

**Ваши данные** — заполнители в промпте:

| Заполнитель | Что подставить | Пример |
|---|---|---|
| `{CLASS}` | Класс | Разбойник |
| `{SPEC}` | Специализация | Ликвидация |
| `{HERO_TALENTS}` | Героические таланты | Fatebound |
| `{TALENT_STRING}` | Строка экспорта талантов из игры (окно талантов, «Поделиться») | `CMQAAAAA…` |
| `{CONTENT}` | Рейд или Mythic+ | рейд |
| `{RAID_OR_DUNGEONS}` | Рейд или список подземелий | The Venomous Abyss |
| `{DIFFICULTY}` | Сложность или уровень ключа | героическая |
| `{BOSSES}` | Боссы, для которых нужна ротация | все |
| `{ITEM_LEVEL}` | Уровень предметов | 328 |
| `{MY_LOGS}` | Ссылка на ваш персонаж или отчёт в Warcraft Logs | `https://www.warcraftlogs.com/character/eu/<сервер>/<имя>` |
| `{COMBAT_LOG_FILE}` | Файл журнала боя, который вы приложите | `WoWCombatLog-101726_214449.txt` |
| `{PREFERENCES}` | Пожелания | «кулдауны только по кнопке Burst, защиту не жать» |

### Промпт

Агент сам соберёт данные, сравнит их с вашими и объяснит каждое правило. Заполните фигурные скобки и приложите журнал боя, если он есть.

*Промпт:*

```text
Ты эксперт по World of Warcraft и автор ротаций для KeyRota. Собери для меня продвинутую ротацию KeyRota: JSON формата keyrota-rotation версии 1.

МОЙ ПЕРСОНАЖ
- Класс и специализация: {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, правила сверху вниз, группы ИЛИ из условий И, лимиты 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: рейтинги {SPEC} {CLASS} по урону для каждого босса ({CONTENT}, {DIFFICULTY}); для Mythic+ — по каждому подземелью и уровню ключа. Возьми 5-10 лучших логов с героическими талантами {HERO_TALENTS}.
2. Сравни их таланты с моей строкой. Отметь отличия, которые меняют приоритет, и предложи, нужно ли мне их взять.
3. По логам топов собери: опенер и порядок кастов; аптайм важных бафов и дебафов; ресурсы в момент кастов (комбо-очки или аналог у финишеров, энергия или аналог перед тратой, потери ресурса от переполнения); когда и вместе с чем жмут большие кулдауны, как их подгоняют к фазам; когда и при каком здоровье жмут защиту; с какого числа целей переходят на АоЕ; нажатия в минуту и время без нажатий.
4. Для Mythic+: Raider.IO (мета, топовые прохождения, таланты по подземельям).
5. Гайды (Wowhead, Method, Discord класса) и список действий (APL) SimulationCraft для {SPEC} в ветке текущего дополнения: возьми его как основу приоритета и проверь по логам.
6. Мои логи и журнал боя: где мои аптаймы, ресурсы у трат, кулдауны и темп отличаются от топов.

ШАГ 3. СОСТАВЬ РОТАЦИЮ
- "format": "keyrota-rotation", "version": 1, specID моей специализации, resources по таблице специализаций из документации (resource1 PlayerHP, resource2 TargetHP, дальше ресурсы специализации), "ignoreMainIcon": true.
- Слоты: настоящие ID заклинаний с Wowhead (поле spell). "show": "combat" для лечения и защиты. Флаги: offGcd для заклинаний вне GCD; offGcd и queue для макросов, у которых вторая строка на GCD, и для кнопок, которым нужен результат прошлого удара; channel для каналов; manual для того, что я жму сам. Для слота-макроса напиши текст макроса (#showtooltip и /cast).
- Ауры: ID самих бафов и дебафов, а не заклинаний, которые их вешают. Только мои ауры.
- Правила по приоритету. Защита — первой и только при defensives == 1. Большие кулдауны — только при cd == 1 (это кнопка Burst, а не кулдаун заклинания); то, что усиливает окно кулдауна, — только под ним. Одна цель и АоЕ: группа aoe == 1 и группа st == 0 and enemies >= N для АоЕ; группа st == 1 и группа aoe == 0 and enemies <= 1 для одной цели. Доты: группа 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: JSON формата keyrota-rotation версии 1.

МОЙ ПЕРСОНАЖ
- Класс и специализация: Разбойник, Ликвидация. Героические таланты: Fatebound.
- Строка талантов из игры: CMQAAAAAAAAAAAAAAAAAAAAAAYmlZmFDGAAAAAYWGsNDAAAAAILzMzMzMjxyMzMbzsMzMPgZMzYMMzYMAGYBmxoxsBYbAbGAMzMGD
- Контент: рейд: The Venomous Abyss. Сложность: героическая. Боссы: все, отдельно отметь Ula'tek (окна урона по Сердцу).
- Уровень предметов: 328.
- Мои логи Warcraft Logs: https://www.warcraftlogs.com/character/eu/<сервер>/<имя>
- Журнал боя (приложен): 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, правила сверху вниз, группы ИЛИ из условий И, лимиты 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, героическая сложность). Возьми 5-10 лучших логов с героическими талантами Fatebound.
2. Сравни их таланты с моей строкой. Отметь отличия, которые меняют приоритет, и предложи, нужно ли мне их взять.
3. По логам топов собери: опенер и порядок кастов; аптайм Гарроты, Рваной раны и бафа Отравления; комбо-очки у Отравления, Рваной раны, Погибели королей и Исчезновения, энергию перед Отравлением, потери энергии и комбо-очков от переполнения; когда и вместе с чем жмут Знак смерти и Погибель королей, как их подгоняют к фазам (особенно к Сердцу у Ula'tek); когда и при каком здоровье жмут Алый фиал и другую защиту; с какого числа целей переходят на Веер клинков и Кровавый вихрь; нажатия в минуту и время без нажатий.
4. Гайды (Wowhead, Method, Discord разбойников) и список действий (APL) SimulationCraft для Ликвидации в ветке текущего дополнения: возьми его как основу приоритета и проверь по логам.
5. Мои логи и журнал боя: где мои аптаймы, комбо-очки у трат, кулдауны и темп отличаются от топов.

ШАГ 3. СОСТАВЬ РОТАЦИЮ
- "format": "keyrota-rotation", "version": 1, "specID": 259, "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"], "ignoreMainIcon": true.
- Слоты: настоящие ID заклинаний с Wowhead (поле spell). "show": "combat" для Алого фиала. Флаги: offGcd для заклинаний вне GCD; offGcd и queue для Исчезновения (ему нужны комбо-очки прошлого удара); channel для каналов, если они будут; manual для того, что я жму сам. Для слота-макроса напиши текст макроса (#showtooltip и /cast).
- Ауры: 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/<id зоны>?boss=<id босса>&class=<Класс>&spec=<Специализация>&difficulty=<3|4|5>&metric=dps` (3 — обычная, 4 — героическая, 5 — эпохальная сложность). У Mythic+ рейтинги разбиты по уровню ключа.
- В отчёте игрока: вкладки «Casts» (порядок и время кастов), «Buffs» и «Debuffs» (аптайм), «Resources» (ресурсы, переполнение), «Damage Done» (урон по способностям и целям), «Deaths».
- Таланты из лога: в сводке игрока есть строка экспорта талантов; открыть её можно в калькуляторе талантов Wowhead.
- Сравнивайте не ДПС, а поведение: аптайм дотов и бафов, ресурсы у трат, число нажатий в минуту, время без нажатий, время больших кулдаунов относительно фаз боя.

**Raider.IO** (Mythic+)
- Топовые прохождения подземелья: `https://raider.io/api/v1/mythic-plus/runs?season=<сезон>&region=world&dungeon=<slug>&page=0`; список сезонов и подземелий — `https://raider.io/api/v1/mythic-plus/static-data?expansion_id=<id>`.
- Мета меняется каждую неделю: берите свежие данные, а не старые выводы.

**SimulationCraft**
- Список действий (APL) специализации — в репозитории `simulationcraft/simc` на GitHub, ветка текущего дополнения, папка `ActionPriorityLists`.
- Как перевести APL в KRC:

| APL SimulationCraft | 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 с» — `TargetHP >= 50` на 3+ целях |

**Журнал боя**
- С расширенным журналом у каждого `SPELL_CAST_SUCCESS` есть ресурсы заклинателя (тип, текущее значение, максимум); энергия — тип 3.
- `SPELL_AURA_APPLIED`, `SPELL_AURA_REFRESH`, `SPELL_AURA_REMOVED` — аптайм и обновления аур; `SPELL_ENERGIZE` — пополнение ресурсов; `SPELL_CAST_FAILED` — нажатия, которые игра отклонила.
- Считайте: нажатия в минуту, промежутки между GCD, аптайм дотов, комбо-очки у финишеров, переполнение энергии, время больших кулдаунов.

### Журнал боя: как записать

1. В настройках игры, раздел «Сеть», включите расширенный журнал боя (Advanced Combat Logging). Без него в журнале нет ресурсов и координат.
2. Перед пулом введите в чат `/combatlog` — запись начнётся. После боя введите `/combatlog` ещё раз — запись остановится.
3. Файл — в папке игры: `World of Warcraft\_retail_\Logs\WoWCombatLog-ММДДГГ_ЧЧММСС.txt`. Игра дописывает его с задержкой: после остановки записи подождите минуту.
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» — «Вставить». ID, флаги и видимость у слотов с теми же номерами сохранятся, если в новом JSON их нет.

Внизу конструктора должно быть «Ротация собирается». Если есть ошибка, она названа местом: передайте её агенту дословно. Затем «Общее» — «Собрать из слотов и аур» — «Скопировать», в игре `/ba` — Profile — вставить — Apply. Макросы из ответа создайте в игре и поставьте на панель.

---

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

## Вопросы и неполадки

### Правило никогда не срабатывает

Проверьте по порядку:

1. **Правило выше всегда выигрывает.** Правила проверяются сверху вниз: если правило выше выполнено и его заклинание можно применить, до вашего очередь не дойдёт. Поднимите правило или сузьте условия того, что выше.
2. **Неизвестное значение.** Условие на неизвестное значение ложно, даже `.down`. Аура неизвестна, если её нет в профиле Better Assistant или у неё неверный ID. Соберите профиль заново («Собрать из слотов и аур») и вставьте его в игре.
3. **ID ауры, а не заклинания.** Баф может иметь другой ID, чем заклинание, которое его вешает: Исчезновение — `1856`, его баф — `11327`. И правила видят только ваши ауры, а не бафы от других игроков.
4. **Слот не готов.** Не хватает ресурса, цель далеко, кулдаун, талант не взят. Такое правило пропускается без ошибки.
5. **Better Assistant не показывает слот.** Слот «С целью» без цели не готов. Лечению и защите ставьте «В бою».
6. **Нет клавиши.** Заклинание слота должно стоять на панели действий с назначенной клавишей (или макрос с `#showtooltip`).
7. **Переключатель выключен.** «Хил / защита» по умолчанию выключено, Burst мог быть выключен клавишей Burst (F3 в Windows, ⌃⇧B на macOS), режим целей мог остаться «Одна» или «Много».
8. **Проценты.** 5 комбо-очков — это `70`, а не `5`. См. [Ресурсы](https://keyrota.app/documentation/ru/conditions#resources).
9. **Стопки.** Одна стопка читается как 0: `X.stacks >= 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 ничего не жмёт и не нажимает слот повторно на старте.
- Некоторые каналы игра заканчивает чуть раньше последнего удара, и нажатие сразу после конца канала его обрезает. Добавьте ауру канала в ауры ротации и условие `Аура_канала.duration <= 8` во **все группы всех правил**. Пример — [Защита канала](https://keyrota.app/documentation/ru/patterns#channel).

### Не переходит на АоЕ

1. Режим целей — «Авто» (F2 в Windows, ⌃⇧T на macOS, по кругу: Авто, Одна, Много)? В режиме «Одна» правила с `st == 0` молчат.
2. Индикаторы здоровья противников в игре включены (V), незначительные враги не скрыты?
3. Радиус счётчика на странице «Общее» не меньше радиуса вашей АоЕ-способности?
4. «Только враги в бою»: враги, которые ещё не вступили в бой, не считаются. Для паков, которые подтягиваются по одному, это может давать меньшее число.
5. Порог в правиле: `enemies >= 2` или `>= 3`?
6. После правки радиуса соберите и вставьте профиль Better Assistant заново.

### Burst не жмётся или жмётся не вовремя

- `cd == 1` — это **кнопка Burst** (F3 в Windows, ⌃⇧B на macOS, кнопка «Burst» на панели), а не кулдаун заклинания. Кулдаун заклинания — `Слот.cd`.
- По умолчанию Burst включён. Выключите его перед моментом, когда кулдаун тратить нельзя (неуязвимость, смена фазы), и включите, когда пора.
- Если большой кулдаун зависит от аур (доты на цели), он ждёт их. Посмотрите в журнале KeyRota, какое условие правила не выполнено.
- То, что должно идти только под кулдауном, проверяйте по его ауре: `Deathmark_DoT.up`, а не по кнопке Burst.

### Как считать проценты

- **Ресурсы и здоровье:** `значение / максимум × 100`. 175 энергии из 250 — `70`.
- **Комбо-очки из 7:** порог посередине между ступенями: «не меньше 5» — `>= 70`, «не больше 3» — `< 50`. [Таблица](https://keyrota.app/documentation/ru/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/ru/rotation-json#errors).

### Чем `.oncd` отличается от `.cd > 0`

`X.oncd` — слот не готов по **любой** причине: кулдаун, нет ресурса, цель далеко, слот не показан. `X.cd > 0` — идёт кулдаун. У заклинания с зарядами `.cd > 0` возможен и при готовом слоте: заряд есть, следующий перезаряжается.

### Как написать «не» и скобки

В KRC нет `not`, `!=` и скобок. «Не» — парные условия (`up`/`down`, `ready`/`oncd`, `glow`/`noglow`) и обратные операторы (вместо «не `>= 70`» пишут `< 70`). «(A или B) и C» — две группы: `A and C`, `B and C`. Подробнее — [«Не», скобки и ИЛИ](https://keyrota.app/documentation/ru/conditions#logic).

### Можно ли больше 12 слотов или аур

Нет: в ротации до 12 слотов и до 12 аур, как в профиле Better Assistant. Экономить помогают макросы (одна кнопка — несколько заклинаний) и то, что один слот может стоять в нескольких правилах. Число правил не ограничено.

### Ротация с талантом, которого нет

Если талант не взят, заклинание не изучено, слот не готов, и его правила просто пропускаются. Одна ротация может работать с разными наборами талантов: правила для отсутствующих заклинаний молчат.

### Как перенести ротацию или поделиться ей

- «Экспорт» в главном окне сохраняет профиль вместе с ротацией, «Импорт» загружает его на другом компьютере.
- В конструкторе «Текст и JSON» — «Сохранить…» сохраняет ротацию в `.json` или `.txt`; открыть — «Новый» — «Из файла…».
- Профиль Better Assistant собирается заново из слотов и аур ротации: передавать его отдельно не нужно.

### Почему иногда KeyRota ничего не жмёт

Если включено «Игнорировать основную иконку» и ни одно правило не подошло, KeyRota ждёт. В ротациях с накоплением энергии это нормально: на 5+ комбо-очках трата ждёт своего условия, а генератор молчит. Если ожидание лишнее, посмотрите в журнале KeyRota, какие правила пропущены и почему.
