# KeyRota: rotações avançadas (KRC), documentação

Fonte: https://keyrota.app/documentation/pt/advanced (Atualizado em 18/10/2026). JSON Schema: https://keyrota.app/documentation/keyrota-rotation.schema.json. Índice para agentes de IA: https://keyrota.app/documentation/llms.txt.

---

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

## Rotações avançadas (KRC)

> [!TIP] Recomendamos criar rotações com um agente de IA
> É muito mais rápido e prático do que configurar uma rotação manualmente. Quanto mais avançado o agente de IA, mais a rotação atende aos seus requisitos já na primeira tentativa. Recomendamos os modelos mais recentes da Anthropic e da OpenAI com o nível de raciocínio “Extra (xhigh)”. Veja como fazer em [Criar com um agente de IA](https://keyrota.app/documentation/pt/ai).

Uma rotação avançada é a sua própria lista de regras: qual habilidade pressionar e quando. A KeyRota verifica as regras em combate e pressiona o primeiro botão adequado. O formato e o mecanismo dessas rotações se chamam **KRC** (KeyRota Customization).

### Básica ou avançada

| | Blizzard (básica) | Avançada (KRC) |
|---|---|---|
| Quem escolhe o botão | O jogo: a sugestão da Blizzard | As suas regras |
| Configuração | Nenhuma | Slots, auras e regras: no construtor ou a partir de um arquivo |
| Especializações | Qualquer especialização de dano (DPS corpo a corpo e à distância) e de tanque | Aquela para a qual a rotação foi escrita |
| Burst e modo de alvos | Não são usados | Os botões Burst e Alvos; as regras decidem o que eles significam |
| Quando escolher | Para começar rápido com qualquer personagem | Quando você precisa de uma prioridade exata: DoTs, acúmulo de recursos, recargas em uma janela de burst, sua própria lógica para vários alvos |

No bloco Rotação do aplicativo, o perfil da Blizzard vem primeiro, e as suas rotações ficam abaixo dele, em Suas rotações. Você pode trocar a qualquer momento enquanto a rotação estiver parada.

### Do que uma rotação é feita

| Parte | O que é | Quantidade |
|---|---|---|
| **Slots** | Os botões da rotação. O slot N da rotação é o slot N do perfil do Better Assistant. | até 12 |
| **Auras** | Os seus bônus e as suas penalidades no alvo, pelo ID do feitiço. A aura N da rotação é a aura N da lista do Better Assistant. | até 12 |
| **Recursos** | A vida do jogador e do alvo e os recursos da especialização: energia, pontos de combo, raiva, mana e outros. Todos os valores são porcentagens. | depende da especialização |
| **Combate** | O número de inimigos por perto e a distância até o alvo. | 2 |
| **Alternadores** | Os botões do painel de configurações rápidas: modo de alvos (duas flags nas regras: `aoe` e `st`), Burst, Cura / defesa, No chão, Movimento. | 6 |
| **Regras** | Qual slot pressionar e em quais condições. A ordem das regras é a prioridade. | sem limite |

Uma regra é formada por grupos de condições. A regra é atendida quando **pelo menos um** dos seus grupos é atendido (OU), e um grupo é atendido quando **todas** as suas condições são atendidas (E). Uma regra sem grupos é sempre atendida.

*Texto KRC:*

```text
use Envenom when  # Envenenar
	Combo_Points >= 70 and Envenom_Buff.down  # 5+ pontos de combo, sem o bônus
	or
	Combo_Points >= 70 and Energy >= 70  # 5+ pontos de combo, energia de sobra
```

*JSON:*

```json
{
  "use": "Envenom",
  "name": "Envenenar",
  "when": [
    {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "5+ pontos de combo, sem o bônus"},
    {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "5+ pontos de combo, energia de sobra"}
  ]
}
```


Lê-se assim: “Pressionar Envenenar se houver 5 ou mais pontos de combo e não houver o bônus de Envenenar, **ou** se houver 5 ou mais pontos de combo e pelo menos 70% de energia”. O motivo de 5 pontos de combo serem `70` está explicado em [Recursos](https://keyrota.app/documentation/pt/conditions#resources).

### Como a KeyRota escolhe um botão

1. As regras são verificadas **de cima para baixo**, na ordem da lista.
2. Para cada regra, os grupos dela são verificados. Se nenhum for atendido, a KeyRota passa para a próxima regra.
3. Se a regra for atendida, mas o feitiço dela **não puder ser usado** agora (recarga, recurso insuficiente, alvo longe demais, sem alvo, feitiço não aprendido), a KeyRota também passa para a próxima regra. Você não precisa de uma condição para verificar se o próprio slot está pronto.
4. A primeira regra atendida cujo feitiço pode ser usado é a **escolhida**. A recarga global (GCD) não muda a escolha: uma regra que espera o fim do GCD continua escolhida, e as regras abaixo dela não passam na frente.
5. Se nenhuma regra servir: com Ignorar o ícone principal ligado, a KeyRota espera; desligado, ela pressiona a sugestão do jogo.

Esperar é normal. Uma rotação que acumula energia, por exemplo, muitas vezes não pressiona nada por meio segundo ou um segundo, até ter energia suficiente para uma regra acima.

### Um valor desconhecido nunca permite uma regra

Às vezes, a KeyRota não conhece um valor: uma aura não é lida (o ID dela não está no perfil do Better Assistant), não há alvo (a vida e a distância do alvo são desconhecidas) ou os inimigos não foram contados. Uma condição que lê um valor desconhecido é **falsa**: tanto `X.up` quanto `X.down`, tanto `TargetHP >= 50` quanto `TargetHP < 50`. Um valor desconhecido só pode impedir uma regra, nunca permiti-la: é melhor pular um pressionamento do que pressionar a coisa errada.

> [!TIP]
> Se uma regra nunca é acionada, primeiro verifique se todas as auras que ela lê estão no perfil do Better Assistant com o ID correto. Mais detalhes em [Perguntas frequentes e solução de problemas](https://keyrota.app/documentation/pt/faq#never-fires).

### Quando um botão é pressionado

- **Um feitiço comum** (que usa o GCD) é pressionado na janela da fila de feitiços, bem no fim do GCD: o jogo o lança assim que o GCD termina.
- **As flags do slot** mudam isso: Só manual (M), Canalização (C), Fora do GCD (O), Na janela da fila (Q). O que cada uma faz e como combiná-las está em [Flags do slot](https://keyrota.app/documentation/pt/rotation-json#flags).
- **Canalizações.** Enquanto uma canalização está em andamento, a KeyRota não pressiona nada, para não interrompê-la. Durante um **lançamento**, a KeyRota espera até restar apenas a janela da fila.
- **Os seus próprios pressionamentos.** Quando você mesmo pressiona a tecla de uma habilidade, a KeyRota cede a vez e não disputa com você.

### Início rápido

Se a KeyRota ainda não estiver instalada, comece pelos [primeiros passos](https://keyrota.app/documentation/pt/start).

1. Na KeyRota, abra Rotação — Novo — No construtor….
2. Na página Geral, escolha a especialização e dê um nome à rotação.
3. Na página Slots, adicione os botões e os IDs dos feitiços deles; na página Auras, os bônus e as penalidades que as regras vão ler.
4. Na página Regras, adicione as regras em ordem de prioridade.
5. Na página Geral, clique em “Montar com slots e auras” e depois em “Copiar”. No jogo: `/ba` — a aba Profile — cole o texto — Apply.
6. Coloque os feitiços dos slots nas barras de ações e atribua teclas a eles (uma macro com `#showtooltip` também serve).
7. Clique em Salvar, escolha o perfil na lista e inicie a rotação com F1 (no macOS, ⌃⇧Espaço).

Cada botão, com um exemplo completo, está em [Construtor de rotação](https://keyrota.app/documentation/pt/editor).

### Nesta seção

- [Construtor de rotação](https://keyrota.app/documentation/pt/editor) — cada página e cada botão da janela e uma rotação montada passo a passo.
- [JSON da rotação](https://keyrota.app/documentation/pt/rotation-json) — cada campo do formato, flags dos slots, nomes, limites, erros e o texto KRC.
- [Condições](https://keyrota.app/documentation/pt/conditions) — todos os tipos de condição, operadores, porcentagens e valores desconhecidos.
- [Exemplos de padrões](https://keyrota.app/documentation/pt/patterns) — DoTs, acúmulo, gerador e finalizador, AoE, Burst, defesas e outros modelos.
- [Criar com um agente de IA](https://keyrota.app/documentation/pt/ai) — um modelo de prompt, análise de logs e verificação do resultado.
- [Perguntas frequentes e solução de problemas](https://keyrota.app/documentation/pt/faq) — por que uma regra não é acionada, pressiona cedo ou tarde demais, interrompe uma canalização.

---

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

## Construtor de rotação

O construtor de rotação é a janela da KeyRota em que você monta uma rotação avançada sem precisar digitá-la: slots com flags, auras e regras, com o texto KRC e o JSON ao lado. A documentação é a mesma para Windows e macOS; as capturas de tela foram feitas no Windows. Elas mostram a rotação de raide de Assassinato dos [exemplos](https://keyrota.app/documentation/pt/patterns#example-files).

### Como abrir

- **A sua rotação.** Selecione o perfil no bloco Rotação da janela principal e clique em Configurar.
- **Uma rotação nova.** Novo — No construtor…. A especialização vem do jogo ou do perfil atual. A rotação vira um perfil quando você a salva pela primeira vez.
- **De um arquivo ou da área de transferência.** Novo — De um arquivo… aceita texto KRC (`.txt`), JSON de rotação e um arquivo de perfil da KeyRota; Novo — Da área de transferência aceita o mesmo a partir da área de transferência. Abra o novo perfil no construtor com Configurar.

![Uma rotação nova no construtor: a página Geral, ainda sem slots nem regras](https://keyrota.app/documentation/img/pt/editor-new.png)

Para um **perfil da Blizzard**, o construtor mostra apenas o nome e o atraso das teclas: quem escolhe o botão principal é o jogo. “Criar uma rotação própria” cria um novo perfil com uma rotação avançada; o perfil da Blizzard continua na lista.

![Um perfil da Blizzard no construtor: o nome do perfil, o atraso das teclas e “Criar uma rotação própria”](https://keyrota.app/documentation/img/pt/editor-blizzard.png)

#### A janela

- **À esquerda**, as páginas: Geral, Slots, Auras, Regras (com o número de regras), Texto e JSON. Acima delas, Rotação própria e a especialização escolhida.
- **À direita**, a página selecionada.
- **Embaixo**, a barra de status: se a rotação é válida (“Rotação válida: 15 regras, 11 slots, 10 auras”), se há alterações não salvas e, em caso de erro, onde ele está e um botão Mostrar. À direita, Fechar e Salvar.

Nada é aplicado até você clicar em Salvar (no Windows, também Ctrl+S).

### Geral

![A página Geral: perfil, especialização, nome da rotação, Ignorar o ícone principal, atraso das teclas](https://keyrota.app/documentation/img/pt/editor-general.png)

| Controle | O que faz |
|---|---|
| **Nome do perfil** | O nome do perfil na lista de rotações da janela principal. |
| **Especialização** | Define os recursos da rotação (energia, pontos de combo, raiva…) e a classe e a especialização do perfil do Better Assistant. Trocar a especialização substitui os recursos, a menos que as regras leiam recursos da especialização anterior (a vida não conta). |
| **Nome da rotação** | A primeira linha do texto KRC (`rotation "…"`), exibida no log da KeyRota. Sem aspas duplas. Um bom lugar para a versão: “Assassinato v1.3”. |
| **Ignorar o ícone principal** | Ligado: a KeyRota pressiona apenas pelas regras; se nenhuma regra for atendida, ela espera. Desligado: nesse caso, ela pressiona a sugestão do jogo. Em rotações próprias costuma ficar ligado: esperar (por exemplo, para acumular energia) é normal. |
| **Atraso das teclas** | Uma pausa antes de cada pressionamento, como a de uma pessoa: Nenhum, Fixo (um intervalo de 0 a 1000 ms) ou Aleatório (uma faixa de 0 a 1000 ms). “Também para interrupções e defesa” aplica a mesma pausa a esses pressionamentos. |

![A página Geral mais abaixo: o bloco Better Assistant, o raio do contador de inimigos, Só inimigos em combate e a descrição](https://keyrota.app/documentation/img/pt/editor-general-ba.png)

| Controle | O que faz |
|---|---|
| **Perfil: …** | Um resumo do texto do perfil do Better Assistant: especialização, número de feitiços e de auras. |
| **Montar com slots e auras** | Monta o texto do perfil do Better Assistant a partir dos IDs de feitiço dos slots, da opção Visível no Better Assistant de cada slot, das auras em ordem, da especialização, do raio e de Só inimigos em combate. Se um perfil da mesma especialização já tiver sido colado, as demais configurações dele são mantidas. |
| **Da área de transferência** | Cola um texto de perfil pronto. A especialização dele precisa ser a mesma da rotação. |
| **Copiar** | Copia o texto para você colá-lo no jogo. |
| **Raio do contador de inimigos, metros** | De 1 a 100; 8 por padrão. Usado pela condição Inimigos por perto (`enemies`). |
| **Só inimigos em combate** | Ligado por padrão: inimigos que ainda não estão em combate não são contados. |
| **Descrição** | Notas sobre a rotação: as linhas que começam com `#` no texto KRC. Não afetam o funcionamento da rotação. |

Os avisos aparecem abaixo dos botões: quais slots usados nas regras não têm ID de feitiço (eles não entram no perfil do Better Assistant) e o que, em um perfil já colado, não corresponde à rotação.

> [!IMPORTANT]
> As auras no perfil do Better Assistant ficam em sequência, a partir da primeira. Se a aura 3 não tiver ID e a aura 4 tiver, o perfil não será montado: “A aura 3 não tem número de feitiço”. Preencha o ID ou renumere as auras.

#### O perfil do Better Assistant no jogo

O slot N da rotação é o slot N do Better Assistant, e a aura N é a aura N da lista dele. O texto do perfil coloca os seus slots e as suas auras lá, na ordem certa.

1. Na página Geral, clique em “Montar com slots e auras” e depois em “Copiar”.
2. No jogo, digite `/ba`, abra a aba **Profile**, cole o texto, clique em **Apply** e confirme.
3. Depois de qualquer alteração nos slots ou nas auras (IDs, ordem, Com alvo / Em combate), monte e cole o perfil novamente.

### Slots

![A página Slots: as 12 posições à esquerda; à direita, o slot 10 selecionado, Sumir, com o ID 1856](https://keyrota.app/documentation/img/pt/editor-slots.png)

À esquerda ficam as 12 posições: número, nome, ID do feitiço, flags (“fora do GCD, na fila”) e “não usado” quando o slot não está em nenhuma regra. Uma posição vazia mostra “Vazio”; selecione-a para que apareça o botão “Adicionar slot”.

| Controle | O que faz |
|---|---|
| **Nome** | O nome do feitiço no jogo. Aparece na lista de regras e no log. |
| **ID do feitiço** | O número no link do Wowhead: em `wowhead.com/spell=1856/vanish`, é `1856`. O Better Assistant o usa para colocar o feitiço neste slot. |
| **Visível no Better Assistant** | Com alvo ou Em combate. O slot só fica pronto quando o Better Assistant o mostra. Em combate é para cura e defesas que precisam funcionar sem alvo. |
| **Como pressionar** | Quatro chaves de flags; veja a tabela abaixo. |
| **Nome no texto** | O nome do slot nas regras e no texto KRC: letras, dígitos e `_`, sem espaços. |
| **Comentário** | Um comentário no fim da linha de declaração no texto. |
| **Aparece nas regras** | As regras que pressionam ou leem o slot. Remover slot só fica disponível quando o slot não é usado. |

Para que a KeyRota pressione um slot, o feitiço dele precisa estar em uma barra de ações no jogo, com uma tecla atribuída: a KeyRota pega a tecla nas suas barras. Uma macro com `#showtooltip Nome` também serve. Um slot sem tecla nunca é pressionado.

#### Como pressionar: flags

![As chaves de Como pressionar do slot Sumir: Fora do GCD (O) e Na janela da fila (Q) ligadas](https://keyrota.app/documentation/img/pt/editor-slot-flags.png)

| Chave | O que faz | Quando usar |
|---|---|---|
| sem flags | O slot é pressionado como um feitiço comum: no fim da recarga global, na janela da fila. | Quase todos os feitiços que usam o GCD. |
| **Só manual (M)** | A KeyRota nunca pressiona este slot sozinha e pula as regras dele. Quando você mesmo pressiona a tecla dele, a rotação é pausada. | Habilidades que você quer pressionar somente por conta própria. |
| **Canalização (C)** | Enquanto este feitiço é canalizado, a KeyRota não pressiona nada e não o interrompe. | Feitiços canalizados, como Matança. |
| **Fora do GCD (O)** | Não espera a recarga global: é pressionado na hora, mesmo no meio do GCD. | Feitiços fora do GCD, como Sorte Grande. |
| **Na janela da fila (Q)** | Só junto com Fora do GCD: pressiona bem no fim do GCD, na janela da fila de feitiços. | Macros cuja segunda linha usa o GCD (Adrenalina + Matança) e botões que precisam do resultado do golpe anterior (Sumir depois de Ruína dos Reis). |

Todas as combinações de flags e o JSON de cada uma estão em [Flags do slot](https://keyrota.app/documentation/pt/rotation-json#flags).

### Auras

![A página Auras: a aura 1 “Garrote no alvo [703]”, ID 703, nome no texto Garrote_DoT, aparece nas regras 3, 4, 5, 7, 8 e 10](https://keyrota.app/documentation/img/pt/editor-auras.png)

As auras são os seus bônus e as suas penalidades no alvo que as regras leem. A aura N da rotação é a aura N da lista do Better Assistant.

| Controle | O que faz |
|---|---|
| **Nome** | O nome da aura; aparece nas regras. É prático incluir o ID entre colchetes: “Garrote no alvo [703]”. |
| **ID do feitiço** | O número da aura no Wowhead. O Better Assistant a procura entre os seus bônus e as suas penalidades no alvo. |
| **Nome no texto**, **Comentário** | Como nos slots. |
| **Aparece nas regras** | Onde a aura é lida. Remover aura só funciona com uma aura não usada. |

> [!NOTE]
> O ID de uma aura e o ID do feitiço que a aplica podem ser diferentes. O feitiço Sumir é `1856`, e o bônus que ele concede é `11327`; Furtividade é `1784`, e Furtividade com o talento Subterfúgio é `115191`. Confira no Wowhead o ID do próprio bônus ou da própria penalidade.

Apenas as **suas** auras são visíveis: os bônus que você aplica em si mesmo e as penalidades que você aplica no alvo. As regras não veem bônus de outros jogadores nem penalidades de outros jogadores no alvo.

### Regras

![A página Regras: 15 regras à esquerda; à direita, a regra 4, Marca da Morte, com o seu grupo de condições](https://keyrota.app/documentation/img/pt/editor-rules.png)

As regras são verificadas de cima para baixo: a KeyRota pressiona a primeira que for atendida e cujo feitiço puder ser lançado; se não puder (recarga, recurso, alcance), passa para a próxima.

**A barra de ferramentas acima da lista:**

| Botão | O que faz |
|---|---|
| **+** | Uma nova regra abaixo da selecionada. Ela pressiona o primeiro slot e ainda não tem condições. |
| **Duplicar** | Uma cópia da regra, logo abaixo dela. |
| **Lixeira** | Exclui a regra. |
| **Subir**, **Descer** | Move a regra para cima (verificada antes) ou para baixo (verificada depois). |

Cada regra na lista mostra o seu número (a prioridade), o slot, o nome e o número de grupos; uma regra com erro tem uma marca vermelha.

**A regra selecionada:**

| Controle | O que faz |
|---|---|
| **Pressionar** | Qual slot pressionar quando a regra for atendida. |
| **Nome** | Aparece no log quando a regra é acionada. |
| **Descrição** | Notas acima da regra no texto KRC. |
| **Quando pressionar** | Grupos de condições: a regra é atendida quando pelo menos um grupo é atendido (OU); um grupo, quando todas as suas condições são atendidas (E). |

![Os grupos de condições da regra Ruptura: o grupo 1 e o grupo 2 separados por OU](https://keyrota.app/documentation/img/pt/editor-rule-groups.png)

Cada grupo tem o título Grupo N, uma caixa Comentário do grupo e os botões Duplicar grupo e Excluir grupo. Uma linha de condição tem **o que verificar**, a **propriedade**, a **comparação** e o **número**; o X remove a condição. “+ Condição” adiciona uma condição ao grupo, e “+ Grupo (OU)”, um novo grupo. Um grupo comporta até 16 condições, e uma regra, até 16 grupos: ao atingir o limite, os botões ficam desativados. Uma regra sem grupos mostra “Sem condições: a regra é acionada sempre que o feitiço puder ser lançado”.

| O que verificar | Propriedades | No texto KRC |
|---|---|---|
| **Auras** (cada aura da rotação) | presente, ausente, “restante, %”, acúmulos | `Garrote_DoT.up`, `.down`, `.duration <= 30`, `.stacks >= 3` |
| **Slots** (cada slot) | pronto, em recarga, “recarga, %”, cargas, destacado, não destacado | `Kingsbane.ready`, `.oncd`, `.cd <= 3`, `.charges >= 2`, `.glow`, `.noglow` |
| **Recursos** | vida do jogador e do alvo, recursos da especialização, em % | `PlayerHP <= 40`, `Energy >= 70` |
| **Combate**: Inimigos por perto | um número | `enemies >= 3` |
| **Combate**: Distância até o alvo | metros | `target.distance <= 8` |
| **Painel de configurações rápidas** | ativo, inativo | `aoe == 1`, `st == 1`, `cd == 1`, `defensives == 1`, `ground_spells == 1`, `movement == 1` |

Comparações: `<`, `≤`, `=`, `≥`, `>`; o número vai de 0 a 100. Uma condição nova começa como “presente” para a primeira aura; quando você muda o que verificar, a propriedade e o número voltam ao padrão (`≥ 50` para um recurso, `≥ 2` para inimigos, `≤ 8` para a distância). Todas as condições em detalhes: [Condições](https://keyrota.app/documentation/pt/conditions).

### Erros e a barra de status

![Um erro na regra 9: o grupo 1, sem condições, tem contorno vermelho; a barra de status mostra “Regra 9, grupo 1: o grupo não tem condições” e Mostrar](https://keyrota.app/documentation/img/pt/editor-problem.png)

- **Verde**: “Rotação válida: …”, ou seja, não há erros e a rotação pode ser salva.
- **Vermelho** indica o local: “Regra 9, grupo 1: o grupo não tem condições”. Mostrar abre esse local. A regra fica marcada na lista, e o grupo, com contorno vermelho.
- Uma rotação com erro não é salva: “Uma rotação com erro não é salva: corrija o que está indicado abaixo”.
- Enquanto a rotação está em execução, não é possível salvar: “Pare a rotação para salvar”.

### Texto e JSON

![A página Texto e JSON no modo Texto KRC: o início do texto da rotação, com a descrição e as declarações buff1 a buff7](https://keyrota.app/documentation/img/pt/editor-text.png)

![A página Texto e JSON no modo JSON: o início do JSON da rotação, com format, version, title, specID, ignoreMainIcon, enemies e notes](https://keyrota.app/documentation/img/pt/editor-json.png)

| Controle | O que faz |
|---|---|
| **Texto KRC / JSON** | Alterna a visualização. |
| **Copiar** | Copia o texto ou o JSON inteiro. |
| **Colar** | Substitui a rotação pelo conteúdo da área de transferência: texto KRC, JSON de rotação ou um perfil da KeyRota. |
| **Abrir…** | Carrega uma rotação de um arquivo `.txt` ou `.json`. |
| **Salvar…** | Salva a visualização atual em um arquivo: o texto como `.txt`, o JSON como `.json`. |

Uma edição na caixa é aplicada na hora se não tiver erros; um erro aparece abaixo da caixa, e as outras páginas mantêm a última versão válida.

**O que o texto guarda e o que só o JSON guarda.** O texto KRC não tem IDs de feitiços, flags dos slots, Com alvo / Em combate, especialização, Ignorar o ícone principal nem as configurações do contador de inimigos. Quando você edita o texto, esses dados continuam com os slots e as auras de mesmos números. O JSON guarda tudo. Quando você cola ou abre uma nova versão da rotação, os slots e as auras de mesmos números mantêm os seus IDs, a visibilidade e as flags se a nova versão não os tiver.

### Salvar e fechar

- Salvar (no Windows, também Ctrl+S) grava a rotação no perfil; por um instante, o botão mostra Salvo. Uma rotação nova vira um perfil e fica selecionada na lista.
- Ao fechar com alterações não salvas, aparece a pergunta “Salvar as alterações?”: Salvar, Não salvar ou Cancelar. O mesmo acontece ao fechar a KeyRota.
- Exportar, na janela principal, salva o perfil com a rotação como JSON; Importar aceita tanto um perfil da KeyRota quanto apenas o JSON de uma rotação.

### Exemplo: uma rotação do zero

Vamos montar uma pequena rotação de Assassinato: dois DoTs (Garrote e Ruptura), um gerador (Mutilar), um finalizador (Envenenar), uma defesa (Frasco Rubro com 40% de vida ou menos) e uma recarga no botão Burst (Marca da Morte).

**1. Novo perfil.** Rotação — Novo — No construtor….

**2. Geral.** Nome do perfil: “Assassinato: exemplo”. Especialização: Assassinato (os recursos passam a ser `PlayerHP`, `TargetHP`, `Energy`, `Combo_Points`). Nome da rotação: “Assassinato: exemplo v1”. Ignorar o ícone principal: ligado.

**3. Slots.** Para cada linha da tabela: selecione a posição à esquerda, clique em “Adicionar slot” e preencha Nome, ID do feitiço e Nome no texto; para o Frasco Rubro, escolha Em combate. Nenhuma flag é necessária.

| Slot | Nome | ID | Nome no texto | Visível no Better Assistant |
|---|---|---|---|---|
| 1 | Garrote | 703 | `Garrote` | Com alvo |
| 2 | Ruptura | 1943 | `Rupture` | Com alvo |
| 3 | Envenenar | 32645 | `Envenom` | Com alvo |
| 4 | Mutilar | 1329 | `Mutilate` | Com alvo |
| 5 | Marca da Morte | 360194 | `Deathmark` | Com alvo |
| 6 | Frasco Rubro | 185311 | `Crimson_Vial` | Em combate |

**4. Auras.** O mesmo na página Auras:

| Aura | Nome | ID | Nome no texto |
|---|---|---|---|
| 1 | Garrote no alvo [703] | 703 | `Garrote_DoT` |
| 2 | Ruptura no alvo [1943] | 1943 | `Rupture_DoT` |
| 3 | Envenenar [32645] | 32645 | `Envenom_Buff` |
| 4 | Marca da Morte no alvo [360194] | 360194 | `Deathmark_DoT` |

**5. Regras.** Na página Regras, clique em “+”, escolha o slot em Pressionar e digite o Nome. “+ Grupo (OU)” adiciona um grupo com uma condição padrão: mude o que verificar, a propriedade, a comparação e o número. “+ Condição” adiciona a próxima condição ao mesmo grupo. As regras, nesta ordem:

| # | Pressionar | Grupos (OU), condições em um grupo (E) |
|---|---|---|
| 1 | Frasco Rubro | Cura / defesa ativo, Vida do jogador ≤ 40 |
| 2 | Marca da Morte | Burst ativo, Garrote no alvo presente, Ruptura no alvo presente, Envenenar presente |
| 3 | Garrote | (1) Garrote no alvo ausente; (2) Garrote no alvo presente, restante ≤ 30% |
| 4 | Ruptura | (1) Pontos de Combo ≥ 70, Ruptura no alvo ausente; (2) Pontos de Combo ≥ 70, Ruptura no alvo presente, restante ≤ 30% |
| 5 | Envenenar | (1) Pontos de Combo ≥ 70, Envenenar ausente; (2) Pontos de Combo ≥ 70, Envenenar presente, restante ≤ 20%; (3) Pontos de Combo ≥ 70, Energia ≥ 70; (4) Pontos de Combo ≥ 70, Marca da Morte no alvo presente |
| 6 | Mutilar | Pontos de Combo < 70 |

Por quê:
- **A defesa primeiro**: com pouca vida, o Frasco Rubro importa mais do que o dano. A regra só é acionada quando Cura / defesa está ligado no painel de configurações rápidas.
- **Marca da Morte no Burst**: `cd == 1` é o botão Burst (F3 no Windows, ⌃⇧B no macOS), não a recarga do feitiço. Desligue o Burst, e a Marca da Morte espera.
- **DoTs com a janela de pandemia**: uma aura ausente tem 0 restante, por isso a renovação exige dois grupos: “sem DoT” e “DoT presente com ≤ 30% restante”.
- **5 pontos de combo = 70**: de 7 pontos de combo, 5 são 71%; o limite `70` funciona com qualquer arredondamento. A tabela está em [Recursos](https://keyrota.app/documentation/pt/conditions#resources).
- **Mutilar por último** e só com menos de 5 pontos de combo, para que nenhuma energia seja desperdiçada enquanto Envenenar espera as suas condições.

**6. Verifique.** A barra de status deve mostrar “Rotação válida: 6 regras, 6 slots, 4 auras”. Abra Texto e JSON para ver o mesmo que aparece abaixo.

**7. O perfil do Better Assistant.** Geral — “Montar com slots e auras” — “Copiar”; no jogo, `/ba` — Profile — colar — Apply.

**8. Teclas.** Coloque os seis feitiços nas barras de ações e atribua teclas a eles.

**9. Execute.** Salve, feche a janela, escolha o perfil “Assassinato: exemplo” e inicie a rotação (F1 no Windows, ⌃⇧Espaço no macOS). No painel de configurações rápidas, ligue Cura / defesa se quiser usar o Frasco Rubro; o botão Burst liga e desliga a Marca da Morte.

*Texto KRC:*

```text
rotation "Assassinato: exemplo v1"

# Exemplo da documentação do KeyRota: dois sangramentos, um gerador, um finalizador com acúmulo de energia,
# uma defesa com pouca vida e Marca da Morte no botão Burst.
# Pontos de combo em porcentagem de 7: 5 pontos = 71%, limite 70 = 5+.

buff1	Garrote_DoT = "Garrote no alvo [703]"
buff2	Rupture_DoT = "Ruptura no alvo [1943]"
buff3	Envenom_Buff = "Envenenar [32645]"
buff4	Deathmark_DoT = "Marca da Morte no alvo [360194]"
slot1	Garrote = "Garrote"
slot2	Rupture = "Ruptura"
slot3	Envenom = "Envenenar"
slot4	Mutilate = "Mutilar"
slot5	Deathmark = "Marca da Morte"
slot6	Crimson_Vial = "Frasco Rubro"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

# --- Defesa: só com “Cura / defesa” ligado ---
use Crimson_Vial when  # Frasco Rubro
	defensives == 1 and PlayerHP <= 40  # vida em 40% ou menos

# --- Recarga: só com o Burst ligado ---
use Deathmark when  # Marca da Morte
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up and Envenom_Buff.up  # Burst ligado, sangramentos e Envenenar ativos

# --- Sangramentos ---
use Garrote when  # Garrote
	Garrote_DoT.down  # sem sangramento
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30  # janela de pandemia: resta 30% ou menos

use Rupture when  # Ruptura
	Combo_Points >= 70 and Rupture_DoT.down  # 5+ pontos de combo, sem sangramento
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # 5+ pontos de combo, janela de pandemia

# --- Gasto: 5+ pontos de combo, acumulando energia ---
use Envenom when  # Envenenar
	Combo_Points >= 70 and Envenom_Buff.down  # sem bônus
	or
	Combo_Points >= 70 and Envenom_Buff.up and Envenom_Buff.duration <= 20  # o bônus está acabando
	or
	Combo_Points >= 70 and Energy >= 70  # não desperdiçar energia no máximo
	or
	Combo_Points >= 70 and Deathmark_DoT.up  # Marca da Morte no alvo

# --- Gerador: menos de 5 pontos de combo ---
use Mutilate when  # Mutilar
	Combo_Points < 70  # menos de 5 pontos de combo
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Assassinato: exemplo v1",
  "specID": 259,
  "ignoreMainIcon": true,
  "enemies": {"range": 8, "combatOnly": true},
  "notes": [
    "Exemplo da documentação do KeyRota: dois sangramentos, um gerador, um finalizador com acúmulo de energia,",
    "uma defesa com pouca vida e Marca da Morte no botão Burst.",
    "Pontos de combo em porcentagem de 7: 5 pontos = 71%, limite 70 = 5+."
  ],
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "Garrote no alvo [703]", "spell": 703},
    {"n": 2, "alias": "Rupture_DoT", "label": "Ruptura no alvo [1943]", "spell": 1943},
    {"n": 3, "alias": "Envenom_Buff", "label": "Envenenar [32645]", "spell": 32645},
    {"n": 4, "alias": "Deathmark_DoT", "label": "Marca da Morte no alvo [360194]", "spell": 360194}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "Garrote", "spell": 703, "show": "target"},
    {"n": 2, "alias": "Rupture", "label": "Ruptura", "spell": 1943, "show": "target"},
    {"n": 3, "alias": "Envenom", "label": "Envenenar", "spell": 32645, "show": "target"},
    {"n": 4, "alias": "Mutilate", "label": "Mutilar", "spell": 1329, "show": "target"},
    {"n": 5, "alias": "Deathmark", "label": "Marca da Morte", "spell": 360194, "show": "target"},
    {"n": 6, "alias": "Crimson_Vial", "label": "Frasco Rubro", "spell": 185311, "show": "combat"}
  ],
  "rules": [
    {
      "use": "Crimson_Vial",
      "name": "Frasco Rubro",
      "note": ["--- Defesa: só com “Cura / defesa” ligado ---"],
      "when": [{"all": ["defensives == 1", "PlayerHP <= 40"], "comment": "vida em 40% ou menos"}]
    },
    {
      "use": "Deathmark",
      "name": "Marca da Morte",
      "note": ["--- Recarga: só com o Burst ligado ---"],
      "when": [
        {
          "all": ["cd == 1", "Garrote_DoT.up", "Rupture_DoT.up", "Envenom_Buff.up"],
          "comment": "Burst ligado, sangramentos e Envenenar ativos"
        }
      ]
    },
    {
      "use": "Garrote",
      "name": "Garrote",
      "note": ["--- Sangramentos ---"],
      "when": [
        {"all": ["Garrote_DoT.down"], "comment": "sem sangramento"},
        {
          "all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"],
          "comment": "janela de pandemia: resta 30% ou menos"
        }
      ]
    },
    {
      "use": "Rupture",
      "name": "Ruptura",
      "when": [
        {"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "5+ pontos de combo, sem sangramento"},
        {
          "all": ["Combo_Points >= 70", "Rupture_DoT.up", "Rupture_DoT.duration <= 30"],
          "comment": "5+ pontos de combo, janela de pandemia"
        }
      ]
    },
    {
      "use": "Envenom",
      "name": "Envenenar",
      "note": ["--- Gasto: 5+ pontos de combo, acumulando energia ---"],
      "when": [
        {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "sem bônus"},
        {
          "all": ["Combo_Points >= 70", "Envenom_Buff.up", "Envenom_Buff.duration <= 20"],
          "comment": "o bônus está acabando"
        },
        {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "não desperdiçar energia no máximo"},
        {"all": ["Combo_Points >= 70", "Deathmark_DoT.up"], "comment": "Marca da Morte no alvo"}
      ]
    },
    {
      "use": "Mutilate",
      "name": "Mutilar",
      "note": ["--- Gerador: menos de 5 pontos de combo ---"],
      "when": [{"all": ["Combo_Points < 70"], "comment": "menos de 5 pontos de combo"}]
    }
  ]
}
```


Baixe este exemplo: [JSON](https://keyrota.app/documentation/examples/starter-assassination.pt.json), [texto KRC](https://keyrota.app/documentation/examples/starter-assassination.pt.txt). Abra-o com Abrir… na página Texto e JSON ou com Novo — De um arquivo….

---

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

## JSON da rotação

O JSON é a descrição completa de uma rotação avançada: tudo o que o texto KRC tem, mais os IDs de feitiços, as flags dos slots e as configurações do perfil. O construtor o mostra na página Texto e JSON, e a KeyRota o aceita como arquivo (Novo — De um arquivo…, Importar). O formato se chama `keyrota-rotation`, versão 1. Há um [JSON Schema](#schema) para validá-lo.

### Arquivo de exemplo

A menor rotação útil: Ruptura com 5 ou mais pontos de combo quando ela não estiver no alvo; caso contrário, Mutilar.

*minimal.json:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Assassinato: mínimo",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [{"n": 1, "alias": "Rupture_DoT", "label": "Ruptura no alvo [1943]", "spell": 1943}],
  "slots": [
    {"n": 2, "alias": "Rupture", "label": "Ruptura", "spell": 1943},
    {"n": 4, "alias": "Mutilate", "label": "Mutilar", "spell": 1329}
  ],
  "rules": [
    {
      "use": "Rupture",
      "name": "Ruptura",
      "when": [{"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "5+ pontos de combo, sem sangramento"}]
    },
    {"use": "Mutilate", "name": "Mutilar"}
  ]
}
```


Tudo o que o arquivo omite assume o valor padrão: os slots ficam visíveis Com alvo e não têm flags, o contador de inimigos é de 8 metros e conta só inimigos em combate. Uma regra sem `when` é sempre atendida.

### Campos de nível superior

| Campo | Tipo | Obrigatório | Padrão | O que é |
|---|---|---|---|---|
| `format` | string | sim | — | Sempre `"keyrota-rotation"`. |
| `version` | inteiro | sim | — | Sempre `1`. Uma versão mais nova é recusada: “atualize a KeyRota”. |
| `title` | string | não | `""` | O nome da rotação: a primeira linha do texto, o nome no log. Sem aspas duplas. |
| `specID` | inteiro de 0 a 100000 | não | `0` | A especialização do WoW; `0` = qualquer uma. Necessário para o perfil do Better Assistant. |
| `ignoreMainIcon` | true / false | não | `true` | Ligado: pressiona apenas pelas regras. Desligado: quando nenhuma regra é atendida, pressiona a sugestão do jogo. |
| `enemies` | objeto | não | `{"range": 8, "combatOnly": true}` | O contador de inimigos da condição `enemies`. |
| `notes` | string ou lista de strings | não | `[]` | A descrição: linhas com `#` no início do texto. |
| `resources` | lista de strings e `null` | não | `[]` | Os nomes de `resource1…N`, em ordem. |
| `auras` | lista | não | `[]` | As auras `buff1…12`. |
| `slots` | lista | não | `[]` | Os slots `slot1…12`. |
| `rules` | lista | não | `[]` | As regras, em ordem de prioridade. |
| `footer` | string ou lista de strings | não | `[]` | Comentários depois da última regra. |

Qualquer outro campo é um erro, “campo extra”: erros de digitação não passam despercebidos. Por isso, não adicione `"$schema"` ao arquivo; associe o schema no seu editor ou validador.

Em quase todo lugar, `null` pode ocupar o lugar de um valor; significa o mesmo que omitir o campo.

### format e version

`"format": "keyrota-rotation"` e `"version": 1` são obrigatórios. Se `version` for maior que 1, a KeyRota recusa o arquivo: “a versão 2 é mais nova do que esta KeyRota entende: atualize-a”. Sem `version`: “é preciso a versão 1”.

### title

Uma string sem aspas duplas `"`. As quebras de linha viram espaços. No texto KRC, é `rotation "…"`. Um bom lugar para a versão: `"Assassinato v1.3"`.

### specID

O ID da especialização no jogo. Ele define os recursos da rotação (quando ela é criada no construtor) e a classe e a especialização no perfil do Better Assistant. `0` significa qualquer especialização: a rotação funciona, mas o perfil do Better Assistant não é montado (“Escolha uma especialização: o perfil do Better Assistant precisa dela”).

| Classe | Especialização | specID | Recursos da especialização (`resource3`…) |
|---|---|---|---|
| Guerreiro | Armas | 71 | `Rage` |
| Guerreiro | Fúria | 72 | `Rage` |
| Guerreiro | Proteção | 73 | `Rage` |
| Paladino | Sagrado | 65 | `Mana`, `Holy_Power` |
| Paladino | Proteção | 66 | `Mana`, `Holy_Power` |
| Paladino | Retribuição | 70 | `Mana`, `Holy_Power` |
| Caçador | Domínio das Feras | 253 | `Focus` |
| Caçador | Precisão | 254 | `Focus` |
| Caçador | Sobrevivência | 255 | `Focus` |
| Ladino | Assassinato | 259 | `Energy`, `Combo_Points` |
| Ladino | Fora da Lei | 260 | `Energy`, `Combo_Points` |
| Ladino | Subterfúgio | 261 | `Energy`, `Combo_Points` |
| Sacerdote | Disciplina | 256 | `Mana`, `Insanity` |
| Sacerdote | Sagrado | 257 | `Mana`, `Insanity` |
| Sacerdote | Sombra | 258 | `Mana`, `Insanity` |
| Cavaleiro da Morte | Sangue | 250 | `Runes`, `Runic_Power` |
| Cavaleiro da Morte | Gélido | 251 | `Runes`, `Runic_Power` |
| Cavaleiro da Morte | Profano | 252 | `Runes`, `Runic_Power` |
| Xamã | Elemental | 262 | `Mana`, `Maelstrom` |
| Xamã | Aperfeiçoamento | 263 | `Mana`, `Maelstrom` |
| Xamã | Restauração | 264 | `Mana`, `Maelstrom` |
| Mago | Arcano | 62 | `Mana`, `Arcane_Charges` |
| Mago | Fogo | 63 | `Mana`, `Arcane_Charges` |
| Mago | Gélido | 64 | `Mana`, `Arcane_Charges` |
| Bruxo | Suplício | 265 | `Mana`, `Soul_Shards` |
| Bruxo | Demonologia | 266 | `Mana`, `Soul_Shards` |
| Bruxo | Destruição | 267 | `Mana`, `Soul_Shards` |
| Monge | Mestre Cervejeiro | 268 | `Energy`, `Stagger` |
| Monge | Tecelão da Névoa | 270 | `Mana` |
| Monge | Andarilho do Vento | 269 | `Energy`, `Chi` |
| Druida | Equilíbrio | 102 | `Mana`, `Astral_Power` |
| Druida | Feral | 103 | `Energy`, `Combo_Points` |
| Druida | Guardião | 104 | `Rage` |
| Druida | Restauração | 105 | `Mana`, `Astral_Power` |
| Caçador de Demônios | Devastação | 577 | `Fury` |
| Caçador de Demônios | Vingança | 581 | `Fury` |
| Caçador de Demônios | Devorador | 1480 | `Fury` |
| Conjurante | Devastação | 1467 | `Mana`, `Essence` |
| Conjurante | Preservação | 1468 | `Mana`, `Essence` |
| Conjurante | Aprimoramento | 1473 | `Mana`, `Essence` |

### ignoreMainIcon

`true` (padrão): a KeyRota pressiona apenas pelas regras; quando nenhuma é atendida, ela espera. `false`: nesse caso, ela pressiona a sugestão do jogo, como o perfil da Blizzard. A sugestão é o último recurso, depois de todas as regras; ela nunca passa na frente de uma regra.

### enemies

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


| Campo | Tipo | Padrão | O que é |
|---|---|---|---|
| `range` | inteiro de 1 a 100 | `8` | O raio do contador de inimigos, em metros. |
| `combatOnly` | true / false | `true` | Contar só os inimigos que já estão em combate. |

A condição `enemies` lê esse contador (veja [Inimigos por perto](https://keyrota.app/documentation/pt/conditions#enemies)). No construtor, são as opções “Raio do contador de inimigos, metros” e “Só inimigos em combate” da página Geral. Os valores também vão para o perfil do Better Assistant.

### notes e footer

A descrição da rotação (`notes`) e os comentários depois da última regra (`footer`). Uma lista de strings ou uma única string com `\n`. Uma string vazia `""` é uma linha em branco no texto. As linhas em branco nas bordas são descartadas.

```json
"notes": ["Baseado em um guia e nos melhores logs, patch 12.1", "", "v1.1: Envenenar mais cedo com 4+ alvos"]
```


No texto KRC, são linhas `# …` antes das declarações. Não afetam o funcionamento da rotação.

### resources

Os nomes dos recursos, em ordem: o primeiro item é `resource1`, o segundo é `resource2` e assim por diante. **O número define qual é o recurso**; o nome é apenas como você o escreve nas condições:

- `resource1` é a vida do jogador, e `resource2`, a vida do alvo;
- de `resource3` em diante vêm os recursos da especialização, na ordem da [tabela de specID](#spec-id): para um ladino, `resource3` é a energia, e `resource4`, os pontos de combo.

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


Use os nomes padrão da tabela: o construtor os mostra em palavras comuns (“Vida do jogador”, “Energia”), e outras pessoas e agentes de IA entendem as condições na hora. `null` pula um número: `["PlayerHP", null, "Energy"]` declara apenas `resource1` e `resource3`. Um recurso não declarado não pode ser lido: “resource2 não declarado”.

Todos os recursos são **porcentagens** do máximo, de 0 a 100. Como converter pontos de combo, energia e runas em porcentagem: [Recursos](https://keyrota.app/documentation/pt/conditions#resources), em Condições.

### auras

As auras são os seus bônus e as suas penalidades no alvo. A aura `n` da rotação é a aura `n` da lista do Better Assistant.

| Campo | Tipo | Obrigatório | Padrão | O que é |
|---|---|---|---|---|
| `n` | inteiro de 1 a 12 | sim | — | O número da aura (`buffN`). Cada número aparece uma vez. |
| `alias` | string | não | a partir de `label` | O nome nas condições. Veja [Nomes](#aliases). |
| `label` | string | não | `""` | O nome exibido. Sem aspas duplas `"`. É prático incluir o ID entre colchetes: `"Garrote no alvo [703]"`. |
| `spell` | inteiro de 0 a 100000000 | não | `0` | O ID da aura no Wowhead. `0` = não definido: a aura não entra no perfil do Better Assistant e fica desconhecida. |
| `note` | string | não | `""` | Um comentário no fim da linha de declaração. |

```json
"auras": [
  {"n": 1, "alias": "Garrote_DoT", "label": "Garrote no alvo [703]", "spell": 703},
  {"n": 2, "alias": "Rupture_DoT", "label": "Ruptura no alvo [1943]", "spell": 1943}
]
```


A ordem na lista não importa; o que importa é `n`. Pode haver lacunas na numeração, mas, para o perfil do Better Assistant, as auras com ID precisam estar em sequência a partir da primeira.

### slots

Os slots são os botões da rotação. O slot `n` da rotação é o slot `n` do Better Assistant.

| Campo | Tipo | Obrigatório | Padrão | O que é |
|---|---|---|---|---|
| `n` | inteiro de 1 a 12 | sim | — | O número do slot (`slotN`). |
| `alias` | string | não | a partir de `label` | O nome nas regras e nas condições. |
| `label` | string | não | `""` | O nome do feitiço. Sem aspas duplas `"`. |
| `spell` | inteiro de 0 a 100000000 | não | `0` | O ID do feitiço no Wowhead. O Better Assistant o usa para colocar o feitiço no slot. |
| `note` | string | não | `""` | Um comentário no fim da linha de declaração. |
| `show` | `"target"` / `"combat"` | não | `"target"` | Quando o Better Assistant mostra o slot. |
| `manual` | true / false | não | `false` | Flag **M**. |
| `channel` | true / false | não | `false` | Flag **C**. |
| `offGcd` | true / false | não | `false` | Flag **O**. |
| `queue` | true / false | não | `false` | Flag **Q**, só com `offGcd`. |

#### show

- `"target"`: o slot é mostrado quando você tem um alvo. Vale para quase todos os ataques.
- `"combat"`: o slot é mostrado em combate, mesmo sem alvo. Para cura e defesas: o Frasco Rubro precisa funcionar quando não há alvo.

Um slot só fica pronto quando o Better Assistant o mostra. Um slot `"target"` sem alvo não está pronto, e as regras dele são puladas.

### Flags do slot

As flags dizem **como** pressionar um slot depois que a regra dele é escolhida. No construtor, são as chaves de Como pressionar.

| Flags | No JSON | Como é pressionado | Exemplo |
|---|---|---|---|
| nenhuma | todas `false` | Na janela da fila, no fim do GCD: o feitiço é lançado assim que o GCD termina. | Mutilar, Envenenar |
| **M** | `"manual": true` | Nunca. As regras do slot são puladas. Quando você mesmo pressiona a tecla dele, a rotação é pausada. | Uma habilidade que você pressiona por conta própria |
| **C** | `"channel": true` | Como um feitiço comum; enquanto a canalização dura, nada é pressionado. Depois do pressionamento, o slot não é pressionado de novo até a canalização começar. | Matança (51690) |
| **O** | `"offGcd": true` | Na hora, mesmo no meio do GCD. | Sorte Grande (381989) |
| **O + Q** | `"offGcd": true, "queue": true` | Fora do GCD, mas só na janela da fila, no fim do GCD. | A macro Adrenalina + Matança (13750); Sumir (1856) depois de Ruína dos Reis |
| **C + O** | `"channel": true, "offGcd": true` | Uma canalização que começa fora do GCD: na hora e depois nada até a canalização terminar. | Raro |
| **C + O + Q** | as três | O mesmo, na janela da fila. | Raro |
| **Q** sem O | `"queue": true` | Erro: “queue: apenas junto com offGcd”. | — |
| **M** + outras | `"manual": true, …` | M prevalece: o slot não é pressionado, e as outras flags não importam. | — |

Por que **O + Q**, e não só **O**: um botão só com O é pressionado na hora, no meio do GCD, antes de o golpe anterior acertar. Sumir depois de Ruína dos Reis só com O seria pressionado antes de chegarem os pontos de combo de Ruína dos Reis, e a regra de Sumir (`Combo_Points < 65`) verificaria o valor antigo. Com Q, o botão espera o fim do GCD.

Prioridade estrita: uma regra fora do GCD mais abaixo na lista **não passa na frente** de uma regra mais acima que está esperando o GCD.

```json
"slots": [
  {"n": 1, "alias": "Adrenaline_Rush", "label": "Adrenalina (macro com Matança)", "spell": 13750, "offGcd": true, "queue": true},
  {"n": 4, "alias": "Keep_It_Rolling", "label": "Sorte Grande", "spell": 381989, "offGcd": true},
  {"n": 8, "alias": "Killing_Spree", "label": "Matança", "spell": 51690, "channel": true},
  {"n": 11, "alias": "Crimson_Vial", "label": "Frasco Rubro", "spell": 185311, "show": "combat"}
]
```


### rules

As regras, em ordem de prioridade: a primeira da lista é verificada primeiro.

| Campo | Tipo | Obrigatório | Padrão | O que é |
|---|---|---|---|---|
| `use` | string | sim | — | O slot a pressionar: o `alias` dele ou `slotN`. |
| `name` | string | não | `""` | O nome da ação, exibido no log. No texto, é o comentário da linha `use`. |
| `note` | string ou lista de strings | não | `[]` | Notas acima da regra (linhas com `#` antes de `use`). |
| `when` | lista de grupos | não | `[]` | Os grupos OU. Vazio ou ausente: uma regra sem condições, pressionada sempre que o feitiço puder ser usado. |

#### when: grupos e condições

| Campo | Tipo | Obrigatório | O que é |
|---|---|---|---|
| `all` | lista de strings não vazia | sim | As condições do grupo; todas precisam ser atendidas (E). |
| `comment` | string | não | O comentário do grupo (no texto, no fim da linha dele). |

```json
{
  "use": "Garrote",
  "name": "Garrote",
  "note": ["Renovar na janela de pandemia"],
  "when": [
    {"all": ["Garrote_DoT.down"], "comment": "sem DoT"},
    {"all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"], "comment": "restam 30% ou menos"}
  ]
}
```


Um mesmo slot pode aparecer em várias regras: por exemplo, Garrote a partir da Furtividade no alto da lista e a manutenção normal do Garrote mais abaixo.

#### Condições no JSON

Cada condição é uma string na sintaxe KRC: `Garrote_DoT.down`, `Rupture_DoT.duration <= 25`, `Kingsbane.cd <= 3`, `Combo_Points >= 70`, `enemies >= 2`, `target.distance <= 8`, `cd == 1`. A lista completa está em [Condições](https://keyrota.app/documentation/pt/conditions).

- Faça referência pelo nome (`Garrote_DoT`) ou pelo número: `buff1`, `slot3`, `resource4`.
- ` and ` dentro de uma string a divide em duas condições: `"Combo_Points >= 70 and Energy >= 70"` são duas condições, e as duas contam para o limite de 16.
- Sem `#` e sem quebras de linha em uma string.
- É o próprio mecanismo da KeyRota que lê as condições, por isso o JSON e o texto sempre significam o mesmo.

### Nomes

Um nome (`alias`) é como auras, slots e recursos são chamados nas condições e em `use`.

- O primeiro caractere é uma letra (de qualquer alfabeto) ou `_`; depois vêm letras, dígitos `0–9` e `_`. Letras acentuadas e de outros alfabetos servem; espaços, hifens e pontos, não: `Fan_of_Knives`, e não `Fan-of-Knives`.
- Um nome é único entre todas as auras, slots e recursos.
- Reservados: `use`, `when`, `and`, `or`, `rotation`, `gcd`, `enemies`, `target`, `aoe`, `st`, `cd`, `defensives`, `ground_spells`, `movement` e nomes como `buffN`, `slotN`, `resourceN`.
- As palavras-chave são sempre em minúsculas: `use`, `or`, `.up`. `Use`, `OR` e `.UP` são erros.

**Um nome a partir do rótulo.** Sem `alias`, a KeyRota cria um a partir de `label`: os colchetes e o que há dentro deles são descartados, as letras e os dígitos ficam, e todo o resto vira `_`. Por exemplo, `"Garrote no alvo [703]"` vira `Garrote_no_alvo`. Um nome vazio ou inutilizável vira `Aura_N` ou `Slot_N`; um nome já usado ganha `_2`, `_3`. Se uma regra fizer referência a `buffN` ou `slotN` que não estão nas listas, eles são declarados automaticamente como `Aura_N` e `Slot_N`.

### Campos obrigatórios e valores padrão

| Onde | Obrigatório | Valores padrão |
|---|---|---|
| Arquivo | `format`, `version` | `title` `""`, `specID` `0`, `ignoreMainIcon` `true`, `enemies` `{"range": 8, "combatOnly": true}`, listas vazias |
| Aura | `n` | `alias` a partir de `label`, `label` `""`, `spell` `0` |
| Slot | `n` | `show` `"target"`, todas as flags `false`, `spell` `0` |
| Regra | `use` | `name` `""`, `note` `[]`, `when` `[]` (sem condições) |
| Grupo | `all` (não vazio) | `comment` `""` |

### Limites

| O quê | Limite |
|---|---|
| Auras | 12 (`n` de 1 a 12) |
| Slots | 12 (`n` de 1 a 12) |
| Grupos OU em uma regra | 16 |
| Condições E em um grupo | 16 |
| Regras | sem limite |
| Número em uma condição | inteiro de 0 a 100 |
| `enemies.range` | de 1 a 100 |
| `spell` | de 0 a 100000000 |
| `specID` | de 0 a 100000 |
| Recursos | até 99 |

Exatamente 16 grupos de 16 condições é permitido; 17 é um erro.

### Erros

Uma rotação com erro não é carregada de jeito nenhum: não existe execução parcial. Um erro sempre indica o local. No JSON, é um caminho: `rules[3].when[1]: nome desconhecido Foo` (contando a partir de zero). No construtor, “Regra 4, grupo 2: nome desconhecido Foo” (contando a partir de um). No texto KRC, um número de linha.

**Estrutura do JSON:**

| Mensagem | Causa |
|---|---|
| `campo extra “offgcd”` | Um campo escrito errado ou desconhecido (maiúsculas e minúsculas importam: `offGcd`). |
| `falta o campo “format”` | Falta um campo obrigatório. |
| `format: era esperado “keyrota-rotation”` | Outro valor em `format`. |
| `version: é preciso a versão 1` | Sem `version` ou com valor menor que 1. |
| `slots[0]: falta o número n (1–12)` | Um slot ou uma aura sem `n`. |
| `slots[2].n: número fora de 1..12` | `n` fora do intervalo. |
| `slots[3]: o número 4 já está em uso` | Dois slots (ou duas auras) com o mesmo `n`. |
| `slots[1].show: era esperado “target” ou “combat”` | Outro valor em `show`. |
| `slots[0]: queue: apenas junto com offGcd` | `queue: true` sem `offGcd: true`. |
| `rules[2].use: não existe o slot “Garotte”` | `use` faz referência a um slot que não existe. |
| `rules[0].when[1].all: é preciso uma lista de condições não vazia` | Um grupo vazio ou sem `all`. |
| `rules[0].when[0].all[2]: condição vazia ou com # ou quebra de linha` | Uma string de condição vazia ou com `#`. |
| `….spell: era esperado um número inteiro` | Tipo errado: uma string em vez de um número, `true` em vez de um número etc. |

**Condições e declarações** (as mesmas do texto KRC):

| Código | Exemplo de mensagem | Causa |
|---|---|---|
| `unknown_ref` | `nome desconhecido Foo` | Não há aura, slot nem recurso com esse nome. |
| `unknown_ref` | `resource5 não declarado` | O recurso não está declarado em `resources`. |
| `wrong_kind` | `Garrote é slot, mas era esperado buff` | Uma propriedade de aura em um slot (`Garrote.up`) ou o contrário. |
| `bad_condition` | `não foi possível interpretar a condição "Energy => 50"` | Um erro de digitação na condição ou no operador. |
| `bad_condition` | `"Garrote.distance <= 8": distance só existe em target` | Só o alvo tem distância. |
| `value_range` | `o valor 120 está fora de 0..100` | Um número maior que 100. Não existem números negativos nem fracionários. |
| `toggle_value` | `"cd >= 1": alternador só aceita == 0 ou == 1` | Um alternador só é comparado com `==` e 0 ou 1. |
| `bad_alias` | `nome inválido Fan-of-Knives` | Caracteres inválidos em um nome. |
| `reserved_alias` | `o nome cd é reservado` | Um nome reservado. |
| `duplicate_alias` | `o nome Garrote já foi declarado` | Duas auras, slots ou recursos com o mesmo nome. |
| `index_range` | `buff13: número fora de 1..12` | Uma referência a um número maior que 12. |
| `too_many_groups` | `mais de 16 grupos OR` | Mais de 16 grupos em uma regra. |
| `too_many_conditions` | `17 condições no grupo (máximo 16)` | Mais de 16 condições em um grupo. |

O construtor também informa “o grupo não tem condições” (um grupo vazio), “nenhum slot selecionado” e “o nome não pode ter aspas”.

### Texto KRC

O texto KRC é a mesma rotação em forma de linhas. A página Texto e JSON o mostra, e você pode guardá-lo como arquivo `.txt`. O texto e o JSON se convertem um no outro sem perda de significado.

*Texto KRC:*

```text
rotation "Assassinato: mínimo"

buff1	Rupture_DoT = "Ruptura no alvo [1943]"
slot2	Rupture = "Ruptura"
slot4	Mutilate = "Mutilar"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Rupture when  # Ruptura
	Combo_Points >= 70 and Rupture_DoT.down  # 5+ pontos de combo, sem sangramento

use Mutilate when  # Mutilar
```


#### Linhas

- `#` fora de aspas duplas inicia um comentário que vai até o fim da linha. Dentro de um `"rótulo"`, `#` é um caractere comum.
- Linhas em branco e linhas só com comentário são ignoradas: é assim que se escrevem descrições e separadores.
- Qualquer outra linha é uma declaração, `use`, `or` ou uma linha de condições. Caso contrário, é um erro `stray_line`: “linha fora de regra: "…" (texto livre deve começar com #)”.
- Quaisquer espaços e tabulações entre as partes. A forma canônica usa uma tabulação depois de `buffN`/`slotN` e no início das linhas de condições.

#### Declarações

Somente antes do primeiro `use`:

```text
rotation "Nome"                    # opcional, no máximo uma vez
buff1	Garrote_DoT = "Garrote no alvo [703]"   # aura 1
slot1	Garrote = "Garrote"                     # slot 1
resource1	PlayerHP                            # recurso 1
```


`buffN` e `slotN` vão de 1 a 12, e `resourceN`, de 1 a 99. O rótulo entre aspas pode ser vazio: `slot5	Filler = ""`. Uma declaração depois do primeiro `use` é um erro `late_declaration`.

#### Regras

```text
use Rupture when  # Ruptura
	Combo_Points >= 70 and Rupture_DoT.down  # sem DoT
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # pandemia
```


- `use Slot when` abre uma regra; um comentário nessa linha é o nome da ação.
- Cada linha de condições é um grupo (condições unidas com `and`). Os grupos são separados por uma linha que contém apenas a palavra `or`.
- Uma regra sem linhas de condições não tem condições.
- Duas linhas de condições seguidas sem `or` são um erro `split_group`; `or` no início, no fim ou duas vezes seguidas é `empty_group`.

#### Texto e JSON: a correspondência

| No texto | No JSON |
|---|---|
| `rotation "…"` | `title` |
| Linhas `# …` antes do primeiro `use` | `notes` |
| Um comentário no fim de uma linha `buffN` / `slotN` | O `note` da aura / do slot |
| Linhas `# …` logo antes de `use` (e entre os grupos da regra) | O `note` da regra |
| Um comentário na linha `use` | O `name` da regra |
| Um comentário no fim de uma linha de condições | O `comment` do grupo |
| Linhas `# …` depois da última regra | `footer` |
| — (não existe no texto) | `specID`, `ignoreMainIcon`, `enemies`, `spell`, `show`, flags |

As linhas em branco nas bordas dos blocos de comentários são descartadas; no meio, elas ficam como `""`.

### Importação e armazenamento

- A KeyRota guarda a rotação dentro do perfil. Exportar, na janela principal, salva o perfil da KeyRota (JSON) com a rotação; Importar aceita um perfil da KeyRota e apenas o JSON de uma rotação.
- Novo — De um arquivo… aceita `.txt` com texto KRC, JSON de rotação e um perfil da KeyRota; Novo — Da área de transferência aceita o mesmo a partir da área de transferência.
- No construtor: Texto e JSON — Colar ou Abrir… substituem a rotação; os slots e as auras de mesmos números mantêm os IDs, Com alvo / Em combate e as flags se a nova versão não os tiver.
- Uma rotação em texto (sem JSON) pega os IDs e a visibilidade dos slots do perfil do Better Assistant já guardado no perfil da KeyRota, e os IDs das auras também das marcas `[703]` nos rótulos delas.

### O perfil do Better Assistant a partir do JSON

“Montar com slots e auras”, no construtor, cria o texto do perfil do Better Assistant a partir do JSON da rotação:

- **12 slots**: o slot N é `slots[n = N].spell`, visível conforme `show`. Um slot sem ID fica vazio.
- **Auras** em ordem a partir da primeira: `auras[n = 1].spell`, `auras[n = 2].spell`… Uma aura sem ID no meio é um erro.
- **Classe e especialização** a partir de `specID`.
- **Contador de inimigos** a partir de `enemies.range` e `enemies.combatOnly`.
- Se o perfil da KeyRota já tiver um perfil do Better Assistant da mesma especialização, as demais configurações dele e os slots e as auras correspondentes são mantidos.

No jogo: `/ba` — Profile — colar — Apply.

### JSON Schema

O schema do formato: [keyrota-rotation.schema.json](https://keyrota.app/documentation/keyrota-rotation.schema.json) (draft 2020-12). Ele verifica campos, tipos, intervalos, `queue` sem `offGcd` e a forma das strings de condição. Ele não verifica se `n` e os nomes são únicos, se os nomes usados nas condições existem nem o limite de 16 depois de dividir as strings em ` and `: isso a KeyRota faz ao carregar.

Para validar um arquivo:

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


Não coloque um campo `"$schema"` em um arquivo de rotação: a KeyRota o trata como um campo extra.

---

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

## Condições

Uma condição é uma única verificação: “o Garrote está no alvo”, “a energia está em pelo menos 70%”, “o Burst está ligado”. As condições formam grupos (E), e os grupos formam uma regra (OU). No construtor, você escolhe uma condição em listas; no texto KRC e no JSON, ela é escrita como uma string, e é isso que os exemplos mostram.

### Sintaxe

| Tipo | Forma | Exemplo |
|---|---|---|
| Aura: presente / ausente | `Aura.up`, `Aura.down` | `Garrote_DoT.down` |
| Aura: tempo restante, acúmulos | `Aura.duration op N`, `Aura.stacks op N` | `Rupture_DoT.duration <= 30` |
| Slot: pronto / não pronto | `Slot.ready`, `Slot.oncd` | `Kingsbane.ready` |
| Slot: recarga, cargas | `Slot.cd op N`, `Slot.charges op N` | `Deathmark.cd <= 3` |
| Slot: destaque | `Slot.glow`, `Slot.noglow` | `Ambush.glow` |
| Recurso | `Resource op N` | `Combo_Points >= 70` |
| Inimigos por perto | `enemies op N` | `enemies >= 3` |
| Distância até o alvo | `target.distance op N` | `target.distance <= 8` |
| Alternador | `aoe`, `st`, `cd`, `defensives`, `ground_spells`, `movement` `== 0` ou `== 1` | `cd == 1` |

**Operadores:** `<`, `<=`, `==`, `=` (o mesmo que `==`), `>=`, `>`. Não existe “diferente de”.

**O número** `N` é um inteiro de 0 a 100. Não há números negativos nem fracionários, nem acima de 100: `o valor 120 está fora de 0..100`.

**Os espaços** em volta do operador são opcionais: `Energy>=70` e `Energy >= 70` são a mesma coisa. Não há espaços dentro de um nome nem entre um nome e a sua propriedade: `Garrote_DoT.up`, e não `Garrote_DoT .up`.

**As referências** são feitas pelo nome (`Garrote_DoT`) ou pelo número: `buff1`, `slot3`, `resource4`. As palavras-chave são em minúsculas.

### Auras

Uma aura é um bônus seu ou uma penalidade sua no alvo, declarada na lista de auras com o ID dela. Bônus e penalidades de outros jogadores não são visíveis.

#### .up e .down

`Envenom_Buff.up`: a aura está presente. `Envenom_Buff.down`: ela está ausente. Se a aura for desconhecida (não lida), as duas são falsas.

```text
use Garrote when  # Garrote: aplicar quando estiver ausente
	Garrote_DoT.down
```


#### .duration: tempo restante em porcentagem

`Rupture_DoT.duration <= 30`: resta no máximo 30% da duração **total** da aura. A duração total é a desta aplicação: Ruptura com 5 pontos de combo dura 24 s, e com 7 dura 32 s; então 30% são 7,2 s e 9,6 s.

> [!IMPORTANT]
> Uma aura ausente tem **0** restante. Por isso, `Rupture_DoT.duration <= 30` também é atendida quando não há Ruptura nenhuma. Para renovar apenas uma aura que está ativa, escreva `Rupture_DoT.up and Rupture_DoT.duration <= 30` e cubra o caso “a aura está ausente” com um grupo separado com `Rupture_DoT.down`.

No WoW, a janela de pandemia é de 30% da duração: renovar dentro dela não desperdiça nada. Daí o limite comum `<= 30`.

*Texto KRC:*

```text
use Rupture when  # Ruptura
	Combo_Points >= 70 and Rupture_DoT.down  # sem DoT
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # pandemia
```

*JSON:*

```json
{
  "use": "Rupture",
  "name": "Ruptura",
  "when": [
    {"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "sem DoT"},
    {"all": ["Combo_Points >= 70", "Rupture_DoT.up", "Rupture_DoT.duration <= 30"], "comment": "pandemia"}
  ]
}
```


De segundos para porcentagem: `porcentagem = segundos / duração total × 100`. Garrote dura 18 s: “restam 14 s” é `<= 78`, “restam 5,4 s” é `<= 30`.

**Uma aura sem duração** (Furtividade e afins) sempre tem **1** restante. Para essas auras, use apenas `.up` e `.down`.

#### .stacks: número de acúmulos

`Opportunity.stacks >= 6`: a aura tem 6 acúmulos ou mais. Uma aura ausente tem 0 acúmulos.

> [!NOTE]
> A contagem de acúmulos começa em dois: uma aura com um único acúmulo é lida como **0**, assim como uma aura sem contador. Para verificar se uma aura está presente, use `.up`; use `.stacks` para limites de 2 ou mais.

```text
use Pistol_Shot when  # Tiro de Pistola com 6 acúmulos de Oportunidade
	Opportunity.stacks >= 6 and Combo_Points < 80
```


### Slots

As condições de slot leem o estado de **outro** botão: “pressionar Envenenar só enquanto a Marca da Morte ainda não estiver pronta” e assim por diante. O slot da própria regra é verificado automaticamente: se o feitiço dele não puder ser usado, a KeyRota simplesmente passa para a próxima regra.

#### .ready e .oncd

`Kingsbane.ready`: o feitiço do slot pode ser usado, sem contar a recarga global. Para isso, tudo isto precisa ser verdade:

- o feitiço foi aprendido (o talento foi escolhido);
- há recurso suficiente;
- o alvo está ao alcance, se for necessário um alvo;
- a recarga é menor que 0,2 s ou há uma carga disponível;
- o Better Assistant mostra o slot (Com alvo: você tem um alvo; Em combate: você está em combate).

`Kingsbane.oncd`: o slot **não está pronto** por qualquer um desses motivos, não só pela recarga. Se o estado for desconhecido, as duas são falsas.

```text
use Preparation when  # Preparação quando Adrenalina, No Meio da Testa e Matança estão em recarga
	Adrenaline_Rush.oncd and Between_the_Eyes.oncd and Killing_Spree.oncd
```


#### .cd: recarga restante em porcentagem

`Deathmark.cd <= 3`: resta no máximo 3% da recarga total. `0` significa pronto, e `100`, que acabou de ser usado. A recarga global não está incluída. Para um feitiço com cargas, `.cd` é a recarga da **próxima** carga, então o feitiço pode estar pronto com `cd > 0`.

| Recarga | 1% = | Exemplo |
|---|---|---|
| 30 s | 0,3 s | `X.cd <= 10`: restam ≤ 3 s |
| 1 min | 0,6 s | `Kingsbane.cd <= 3`: restam ≤ 1,8 s |
| 2 min | 1,2 s | `Deathmark.cd <= 3`: restam ≤ 3,6 s; `Deathmark.cd >= 44`: ainda faltam ≥ 52 s |
| 3 min | 1,8 s | `X.cd >= 50`: ainda faltam ≥ 90 s |

Um uso típico é “guardar para uma grande recarga”: não gastar Ruína dos Reis se a Marca da Morte estiver para voltar e gastá-la se a Marca da Morte ainda estiver longe.

```text
use Kingsbane when  # Ruína dos Reis
	cd == 1 and Deathmark_DoT.up  # sob a Marca da Morte
	or
	cd == 1 and Deathmark.cd >= 44  # Marca da Morte a mais de 52 s
```


#### .charges

`Barbed_Shot.charges >= 2`: o feitiço tem 2 cargas ou mais. Feitiços sem cargas têm 0. Um padrão típico evita que as cargas fiquem no máximo:

```text
use Barbed_Shot when  # Disparo Farpado
	Barbed_Shot.charges >= 2  # as duas cargas: não desperdiçar a recarga
	or
	Barbed_Shot.charges == 1 and Barbed_Shot.cd <= 20  # a segunda está quase de volta
```


#### .glow e .noglow: o botão está destacado

`Ambush.glow`: o jogo destaca o botão deste feitiço (o mesmo brilho que você vê na sua barra de ações quando um proc é ativado). `Ambush.noglow`: não destaca. Use `.glow` apenas se o botão deste feitiço realmente brilhar no jogo; se não tiver certeza, verifique o bônus do proc: `Blindside.up`.

### Recursos

`Energy >= 70`: pelo menos 70% da energia máxima. **Todos os recursos são porcentagens** de 0 a 100: vida, energia, mana, raiva, runas, pontos de combo.

| Recurso | Número | Exemplo |
|---|---|---|
| Vida do jogador | `resource1` (`PlayerHP`) | `PlayerHP <= 40`: vida em 40% ou menos |
| Vida do alvo | `resource2` (`TargetHP`) | `TargetHP >= 50`: o alvo ainda não chegou à metade. Desconhecida sem alvo |
| Recursos da especialização | de `resource3` em diante | `Energy >= 70`, `Combo_Points >= 70`, `Rage >= 40` |

**Para porcentagem:** `porcentagem = valor / máximo × 100`. Com 250 de energia, 175 de energia são 70%. A energia máxima e os outros recursos mudam com os talentos, por isso limites em porcentagem servem para outros personagens melhor do que valores absolutos.

**Pontos de combo.** Com um máximo de 7 pontos de combo, um ponto equivale a cerca de 14,3%. O valor é arredondado para um número inteiro e, dependendo do arredondamento, 2 pontos aparecem como 28 ou 29, 3 como 42 ou 43, 6 como 85 ou 86. Por isso, coloque o limite **no meio entre os degraus**: assim ele fica correto com qualquer arredondamento.

| Pontos de combo | % | “pelo menos N” | “no máximo 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` | — |

Para outro máximo, “pelo menos N” é `(N − 0,5) / máximo × 100`. Com 5 pontos de combo, “pelo menos 4” é `>= 70`, e “pelo menos 5” é `>= 90`.

### Inimigos por perto

`enemies >= 3`: 3 ou mais inimigos dentro do raio do contador. O raio e “Só inimigos em combate” são definidos na página Geral (`enemies.range` e `enemies.combatOnly` no JSON). Se a contagem for desconhecida, a condição é falsa.

- Para que os inimigos sejam contados, as placas de identificação dos inimigos precisam estar ativadas no jogo (a tecla V, por padrão), sem ocultar os inimigos inferiores.
- Escolha o raio de acordo com as suas habilidades: Leque de Facas atinge até 8 metros, então 8 é o raio honesto para “Leque de Facas ou Mutilar”.
- Para um único alvo, `enemies <= 1` é mais seguro do que `enemies == 1`: a regra continua funcionando se o inimigo não for contado.

### Distância até o alvo

`target.distance <= 8`: o alvo está a 8 metros ou menos. Sem alvo, a distância é desconhecida, e a condição é falsa. A distância é aproximada: a condição só é atendida quando a distância com certeza cumpre o limite; nos casos limítrofes, ela é falsa.

```text
use Pistol_Shot when  # o alvo está fora do alcance corpo a corpo, mas a até 20 metros
	target.distance >= 10 and target.distance <= 20
```


### Alternadores do painel

Os alternadores são os botões do painel de configurações rápidas, exibido por cima do jogo, além das teclas de atalho. A rotação decide o que eles significam.

| Condição | Botão do painel | Tecla: Windows, macOS | Significado comum |
|---|---|---|---|
| `aoe == 1` | Alvos: Vários | F2, ⌃⇧T, em ciclo | Forçar o modo de vários alvos |
| `st == 1` | Alvos: Um | F2, ⌃⇧T, em ciclo | Forçar um único alvo |
| `aoe == 0 and st == 0` | Alvos: Auto | F2, ⌃⇧T, em ciclo | As regras decidem, normalmente por `enemies` |
| `cd == 1` | Burst | F3, ⌃⇧B | Grandes recargas: usar agora ou guardar |
| `defensives == 1` | Cura / defesa | — | Cura e habilidades defensivas |
| `ground_spells == 1` | No chão | — | Feitiços com alvo no chão |
| `movement == 1` | Movimento | — | Ações em movimento |

- Compare apenas com `== 0` ou `== 1`.
- **`cd == 1` é o botão Burst, não a recarga de um feitiço.** A recarga de um slot é `Slot.cd`.
- `aoe` e `st` nunca valem 1 ao mesmo tempo. A tecla do modo de alvos alterna em ciclo entre Auto, Um e Vários.
- Por padrão, o Burst fica ligado, o modo de alvos fica em Auto e os outros botões ficam desligados. A KeyRota lembra o estado deles.
- Um botão do painel só fica ativo se a rotação ler esse alternador; com o perfil da Blizzard, todos ficam esmaecidos.
- Os alternadores nunca são desconhecidos.

### Como as condições são avaliadas

| Condição | Valor presente | Aura ausente | Desconhecido |
|---|---|---|---|
| `X.up` | verdadeira | falsa | **falsa** |
| `X.down` | falsa | verdadeira | **falsa** |
| `X.duration op N`, `X.stacks op N` | comparada | comparada com **0** | **falsa** |
| `X.ready` / `X.oncd` | conforme a prontidão | — | **falsa** (as duas) |
| `X.glow` / `X.noglow` | conforme o destaque | — | **falsa** (as duas) |
| `X.cd`, `X.charges`, um recurso, `enemies`, `target.distance` | comparada | — | **falsa** |
| um alternador | comparada | — | nunca |

Um grupo é verdadeiro quando todas as suas condições são verdadeiras. Uma regra é atendida quando pelo menos um grupo é verdadeiro ou quando ela não tem nenhum grupo.

### “Não”, parênteses e OU dentro de um grupo

O KRC não tem `not`, `!=` nem parênteses. Tudo é expresso com grupos:

- **“Não”** é a condição par: o contrário de `.up` é `.down`, de `.ready` é `.oncd`, de `.glow` é `.noglow`; para números, o operador inverso: o contrário de `>= 70` é `< 70`.
- **(A ou B) e C** são dois grupos: `A and C`, `B and C`.
- **A e não (B e C)** são dois grupos: `A and não-B`, `A and não-C`.
- **A mesma condição em todos os grupos** (como a proteção de canalização) é repetida em cada grupo.

```text
use Fan_of_Knives when  # Leque de Facas: (modo Vários OU Auto e 2+ inimigos) E menos de 5 pontos de combo
	aoe == 1 and Combo_Points < 70
	or
	st == 0 and enemies >= 2 and Combo_Points < 70
```


### Resumo

| Condição | Significado |
|---|---|
| `X.up` / `X.down` | aura presente / ausente |
| `X.duration <= 30` | restam ≤ 30% (uma aura ausente tem 0) |
| `X.up and X.duration <= 30` | presente e na hora de renovar |
| `X.stacks >= 2` | 2 acúmulos ou mais (1 acúmulo é lido como 0) |
| `X.ready` / `X.oncd` | slot pronto / não pronto por qualquer motivo |
| `X.cd <= 3` | restam ≤ 3% da recarga |
| `X.charges >= 2` | 2 cargas ou mais |
| `X.glow` / `X.noglow` | botão destacado / não destacado |
| `PlayerHP <= 40` | a sua vida ≤ 40% |
| `TargetHP >= 50` | o alvo com ≥ 50% (falsa sem alvo) |
| `Combo_Points >= 70` | 5+ pontos de combo de 7 |
| `Energy >= 70` | energia ≥ 70% |
| `enemies >= 3` | 3+ inimigos no raio |
| `target.distance <= 8` | o alvo a até 8 metros (falsa sem alvo) |
| `aoe == 1` / `st == 1` | modo Vários / Um |
| `aoe == 0 and st == 0` | modo Auto |
| `cd == 1` | Burst ligado |
| `defensives == 1` | Cura / defesa ligado |
| `ground_spells == 1` | No chão ligado |
| `movement == 1` | Movimento ligado |

---

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

## Exemplos de padrões

Cada padrão é uma rotação pequena, mas completa: o texto KRC à esquerda e o mesmo JSON à direita. Cole-o no construtor (Texto e JSON — Colar) para ver como ele fica nas páginas Slots e Regras. Os IDs de feitiços são reais, do Wowhead. No final: [rotações completas](#example-files).

### Um DoT renovado na janela de pandemia

Aplique um DoT quando ele estiver ausente e renove-o quando restarem 30% ou menos: renovar dentro dessa janela não desperdiça nada. Uma aura ausente tem 0 restante, por isso a renovação é um grupo separado com `.up`.

*Texto KRC:*

```text
rotation "Padrão: DoT com a janela de pandemia"

buff1	Garrote_DoT = "Garrote no alvo [703]"
slot1	Garrote = "Garrote"
slot4	Mutilate = "Mutilar"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Garrote when  # Garrote
	Garrote_DoT.down  # sem DoT
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30  # pandemia

use Mutilate when  # Mutilar
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Padrão: DoT com a janela de pandemia",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "Garrote no alvo [703]", "spell": 703}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "Garrote", "spell": 703},
    {"n": 4, "alias": "Mutilate", "label": "Mutilar", "spell": 1329}
  ],
  "rules": [
    {"use": "Garrote", "name": "Garrote", "when": [
      {"all": ["Garrote_DoT.down"], "comment": "sem DoT"},
      {"all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"], "comment": "pandemia"}
    ]},
    {"use": "Mutilate", "name": "Mutilar"}
  ]
}
```


- Para não aplicar um DoT novo em um alvo prestes a morrer quando houver 3 ou mais alvos, adicione `TargetHP >= 50` ao grupo “sem DoT” e um grupo separado `Garrote_DoT.down and enemies <= 2` para um ou dois alvos.
- Um DoT longo com duração variável (Ruptura: 4 s + 4 s por ponto de combo) funciona do mesmo jeito: as porcentagens são da duração dessa aplicação.

### Gerador e finalizador por pontos de combo

Gaste com 5 ou mais pontos de combo de 7 e gere abaixo disso. Os limites ficam no meio entre os degraus; veja a [tabela de pontos de combo](https://keyrota.app/documentation/pt/conditions#resources).

*Texto KRC:*

```text
rotation "Padrão: gerador e finalizador"

slot3	Envenom = "Envenenar"
slot4	Mutilate = "Mutilar"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Envenom when  # Envenenar
	Combo_Points >= 70  # 5+ pontos de combo

use Mutilate when  # Mutilar
	Combo_Points < 70  # menos de 5 pontos de combo
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Padrão: gerador e finalizador",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 3, "alias": "Envenom", "label": "Envenenar", "spell": 32645},
    {"n": 4, "alias": "Mutilate", "label": "Mutilar", "spell": 1329}
  ],
  "rules": [
    {"use": "Envenom", "name": "Envenenar", "when": [
      {"all": ["Combo_Points >= 70"], "comment": "5+ pontos de combo"}
    ]},
    {"use": "Mutilate", "name": "Mutilar", "when": [
      {"all": ["Combo_Points < 70"], "comment": "menos de 5 pontos de combo"}
    ]}
  ]
}
```


Um gerador com `Combo_Points < 70` não desperdiça pontos de combo: com 5 ou mais, ele fica em silêncio mesmo que o finalizador ainda não esteja pronto (falta energia), e a KeyRota espera.

### Acúmulo de recursos

Não gaste na hora; mantenha o bônus ativo e acumule energia: Envenenar quando o bônus estiver acabando, sob a Marca da Morte ou com muita energia. No resto do tempo, nenhuma regra serve com 5 ou mais pontos de combo, e a KeyRota espera mais energia: isso é o acúmulo.

*Texto KRC:*

```text
rotation "Padrão: acúmulo de energia"

buff3	Envenom_Buff = "Envenenar [32645]"
buff4	Deathmark_DoT = "Marca da Morte no alvo [360194]"
slot3	Envenom = "Envenenar"
slot4	Mutilate = "Mutilar"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Envenom when  # Envenenar
	Combo_Points >= 70 and Envenom_Buff.down  # sem o bônus
	or
	Combo_Points >= 70 and Envenom_Buff.duration <= 20  # o bônus está acabando
	or
	Combo_Points >= 70 and Deathmark_DoT.up  # sob a Marca da Morte
	or
	Combo_Points >= 70 and Energy >= 70  # não deixar a energia no máximo

use Mutilate when  # Mutilar
	Combo_Points < 70
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Padrão: acúmulo de energia",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 3, "alias": "Envenom_Buff", "label": "Envenenar [32645]", "spell": 32645},
    {"n": 4, "alias": "Deathmark_DoT", "label": "Marca da Morte no alvo [360194]", "spell": 360194}
  ],
  "slots": [
    {"n": 3, "alias": "Envenom", "label": "Envenenar", "spell": 32645},
    {"n": 4, "alias": "Mutilate", "label": "Mutilar", "spell": 1329}
  ],
  "rules": [
    {"use": "Envenom", "name": "Envenenar", "when": [
      {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "sem o bônus"},
      {"all": ["Combo_Points >= 70", "Envenom_Buff.duration <= 20"], "comment": "o bônus está acabando"},
      {"all": ["Combo_Points >= 70", "Deathmark_DoT.up"], "comment": "sob a Marca da Morte"},
      {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "não deixar a energia no máximo"}
    ]},
    {"use": "Mutilate", "name": "Mutilar", "when": [
      {"all": ["Combo_Points < 70"]}
    ]}
  ]
}
```


- O limite `Energy >= 70` evita que a energia chegue ao máximo.
- O grupo `Envenom_Buff.duration <= 20` também é acionado sem o bônus (0 restante); o grupo `.down` está lá para deixar tudo claro.
- Para ajustar o acúmulo, mude apenas o limite de energia: mais baixo gasta antes, mais alto acumula por mais tempo.

### Alvo único e vários alvos

O jogador define o modo de alvos com a tecla do modo de alvos (ela alterna em ciclo entre Auto, Um e Vários); no modo Auto, as regras decidem pelo número de inimigos. Cada regra de AoE ganha dois grupos, “modo Vários” e “Auto com 2+ inimigos”; a regra de alvo único ganha “modo Um” e “Auto com no máximo um inimigo”.

*Texto KRC:*

```text
rotation "Padrão: alvo único e vários alvos"

slot3	Envenom = "Envenenar"
slot4	Mutilate = "Mutilar"
slot6	Fan_of_Knives = "Leque de Facas"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Envenom when  # Envenenar
	Combo_Points >= 70

use Fan_of_Knives when  # Leque de Facas: 2+ alvos
	aoe == 1 and Combo_Points < 70  # modo Vários
	or
	st == 0 and enemies >= 2 and Combo_Points < 70  # modo Auto, 2+ inimigos

use Mutilate when  # Mutilar: alvo único
	st == 1 and Combo_Points < 70  # modo Um
	or
	aoe == 0 and enemies <= 1 and Combo_Points < 70  # modo Auto, um inimigo
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Padrão: alvo único e vários alvos",
  "specID": 259,
  "enemies": {"range": 8, "combatOnly": true},
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 3, "alias": "Envenom", "label": "Envenenar", "spell": 32645},
    {"n": 4, "alias": "Mutilate", "label": "Mutilar", "spell": 1329},
    {"n": 6, "alias": "Fan_of_Knives", "label": "Leque de Facas", "spell": 51723}
  ],
  "rules": [
    {"use": "Envenom", "name": "Envenenar", "when": [
      {"all": ["Combo_Points >= 70"]}
    ]},
    {"use": "Fan_of_Knives", "name": "Leque de Facas: 2+ alvos", "when": [
      {"all": ["aoe == 1", "Combo_Points < 70"], "comment": "modo Vários"},
      {"all": ["st == 0", "enemies >= 2", "Combo_Points < 70"], "comment": "modo Auto, 2+ inimigos"}
    ]},
    {"use": "Mutilate", "name": "Mutilar: alvo único", "when": [
      {"all": ["st == 1", "Combo_Points < 70"], "comment": "modo Um"},
      {"all": ["aoe == 0", "enemies <= 1", "Combo_Points < 70"], "comment": "modo Auto, um inimigo"}
    ]}
  ]
}
```


- `st == 0 and enemies >= 2` significa “fora do modo Um”: no modo Vários, a regra já é acionada pelo primeiro grupo.
- `enemies <= 1` é mais seguro do que `enemies == 1`: em um único alvo, o inimigo pode não ser contado.
- Baseie o raio do contador (`enemies.range`) na sua habilidade de AoE: Leque de Facas atinge até 8 metros.

### Recargas no Burst e “só sob a recarga”

`cd == 1` é o botão Burst. Uma grande recarga só é pressionada enquanto o Burst está ligado, e você a guarda desligando o Burst, por exemplo, antes de uma fase em que o chefe fica imune. O que fortalece a janela da recarga só é pressionado sob ela: aqui, Sumir só enquanto a Marca da Morte está no alvo, e Ruína dos Reis sob a Marca da Morte ou quando a Marca da Morte ainda está longe.

*Texto KRC:*

```text
rotation "Padrão: Burst"

buff1	Garrote_DoT = "Garrote no alvo [703]"
buff2	Rupture_DoT = "Ruptura no alvo [1943]"
buff4	Deathmark_DoT = "Marca da Morte no alvo [360194]"
buff10	Vanish_Buff = "Sumir [11327]"
slot1	Garrote = "Garrote"
slot4	Mutilate = "Mutilar"
slot8	Deathmark = "Marca da Morte"
slot9	Kingsbane = "Ruína dos Reis"
slot10	Vanish = "Sumir"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Garrote when  # Garrote da furtividade
	Vanish_Buff.up

use Deathmark when  # Marca da Morte
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up  # Burst ligado, DoTs ativos

use Kingsbane when  # Ruína dos Reis
	cd == 1 and Deathmark_DoT.up and Combo_Points < 50  # sob a Marca da Morte, 0-3 pontos de combo
	or
	cd == 1 and Deathmark.cd >= 44 and Combo_Points < 50  # Marca da Morte a mais de 52 s

use Vanish when  # Sumir
	Deathmark_DoT.up and Combo_Points < 65  # sob a Marca da Morte, 0-4 pontos de combo

use Mutilate when  # Mutilar
	Combo_Points < 70
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Padrão: Burst",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "Garrote no alvo [703]", "spell": 703},
    {"n": 2, "alias": "Rupture_DoT", "label": "Ruptura no alvo [1943]", "spell": 1943},
    {"n": 4, "alias": "Deathmark_DoT", "label": "Marca da Morte no alvo [360194]", "spell": 360194},
    {"n": 10, "alias": "Vanish_Buff", "label": "Sumir [11327]", "spell": 11327}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "Garrote", "spell": 703},
    {"n": 4, "alias": "Mutilate", "label": "Mutilar", "spell": 1329},
    {"n": 8, "alias": "Deathmark", "label": "Marca da Morte", "spell": 360194},
    {"n": 9, "alias": "Kingsbane", "label": "Ruína dos Reis", "spell": 385627},
    {"n": 10, "alias": "Vanish", "label": "Sumir", "spell": 1856, "offGcd": true, "queue": true}
  ],
  "rules": [
    {"use": "Garrote", "name": "Garrote da furtividade", "when": [
      {"all": ["Vanish_Buff.up"]}
    ]},
    {"use": "Deathmark", "name": "Marca da Morte", "when": [
      {"all": ["cd == 1", "Garrote_DoT.up", "Rupture_DoT.up"], "comment": "Burst ligado, DoTs ativos"}
    ]},
    {"use": "Kingsbane", "name": "Ruína dos Reis", "when": [
      {"all": ["cd == 1", "Deathmark_DoT.up", "Combo_Points < 50"], "comment": "sob a Marca da Morte, 0-3 pontos de combo"},
      {"all": ["cd == 1", "Deathmark.cd >= 44", "Combo_Points < 50"], "comment": "Marca da Morte a mais de 52 s"}
    ]},
    {"use": "Vanish", "name": "Sumir", "when": [
      {"all": ["Deathmark_DoT.up", "Combo_Points < 65"], "comment": "sob a Marca da Morte, 0-4 pontos de combo"}
    ]},
    {"use": "Mutilate", "name": "Mutilar", "when": [
      {"all": ["Combo_Points < 70"]}
    ]}
  ]
}
```


- Sumir não usa o GCD, mas também tem Na janela da fila (**O + Q**): caso contrário, seria pressionado no meio do GCD logo depois de Ruína dos Reis, antes de chegarem os pontos de combo de Ruína dos Reis, e verificaria a contagem antiga.
- Desligue o Burst, e a Marca da Morte e Ruína dos Reis esperam; Sumir espera a Marca da Morte.
- Ruína dos Reis com 0 a 3 pontos de combo: depois dela chegam mais 5, e nenhum é desperdiçado.

### Proteção de canalização

O jogo encerra algumas canalizações um pouco antes do último golpe, e o próximo pressionamento as interrompe. A proteção é a própria aura da canalização: enquanto restar mais de 8% dela, nenhuma regra é atendida. A condição vai em **cada** grupo de cada regra. A flag **C** no slot da canalização evita que ele seja pressionado duas vezes no início.

*Texto KRC:*

```text
rotation "Padrão: proteção de canalização"

buff10	Killing_Spree_Buff = "Matança, canalização [51690]"
slot8	Killing_Spree = "Matança"
slot9	Dispatch = "Liquidar"
slot11	Sinister_Strike = "Golpe Sinistro"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Killing_Spree when  # Matança
	Combo_Points >= 80 and Killing_Spree_Buff.duration <= 8

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

use Sinister_Strike when  # Golpe Sinistro
	Combo_Points < 80 and Killing_Spree_Buff.duration <= 8
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Padrão: proteção de canalização",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 10, "alias": "Killing_Spree_Buff", "label": "Matança, canalização [51690]", "spell": 51690}
  ],
  "slots": [
    {"n": 8, "alias": "Killing_Spree", "label": "Matança", "spell": 51690, "channel": true},
    {"n": 9, "alias": "Dispatch", "label": "Liquidar", "spell": 2098},
    {"n": 11, "alias": "Sinister_Strike", "label": "Golpe Sinistro", "spell": 193315}
  ],
  "rules": [
    {"use": "Killing_Spree", "name": "Matança", "when": [
      {"all": ["Combo_Points >= 80", "Killing_Spree_Buff.duration <= 8"]}
    ]},
    {"use": "Dispatch", "name": "Liquidar", "when": [
      {"all": ["Combo_Points >= 80", "Killing_Spree_Buff.duration <= 8"]}
    ]},
    {"use": "Sinister_Strike", "name": "Golpe Sinistro", "when": [
      {"all": ["Combo_Points < 80", "Killing_Spree_Buff.duration <= 8"]}
    ]}
  ]
}
```


- Por que `<= 8` e não `.down`: sem a canalização, a aura tem 0 restante e a condição é atendida; durante a canalização, ela espera só os últimos 8%, e não frações de segundo a mais depois do fim.
- Se a aura não for lida, a condição é falsa em todas as regras e a KeyRota não pressiona nada: é melhor pular um pressionamento do que interromper a canalização. Por isso, a aura da canalização precisa estar no perfil do Better Assistant.

### Uma macro fora do GCD na janela da fila

Há dois tipos de “fora do GCD”:
- **O**: o botão é pressionado na hora, mesmo no meio do GCD. É assim que Sorte Grande (que prolonga o Golpe de Sorte) não perde tempo.
- **O + Q**: o botão não usa o GCD, mas a macro ou o resultado dele depende do GCD. A macro de Adrenalina com Matança na segunda linha (Matança usa o GCD) é pressionada na janela da fila, no fim do GCD, e Matança é lançada logo depois de Adrenalina.

*A macro no jogo (slot 1):*

```text
#showtooltip Adrenalina
/cast Adrenalina
/cast Matança
```


*Texto KRC:*

```text
rotation "Padrão: fora do GCD"

buff2	Triple_Threat = "Golpe de Sorte, nível 3 [1214935]"
buff3	Jackpot = "Golpe de Sorte, nível 4 [1214937]"
buff6	Adrenaline_Rush_Buff = "Adrenalina [13750]"
slot1	Adrenaline_Rush = "Adrenalina + Matança (macro)"
slot4	Keep_It_Rolling = "Sorte Grande"
slot11	Sinister_Strike = "Golpe Sinistro"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Adrenaline_Rush when  # Adrenalina (+ Matança pela macro)
	Adrenaline_Rush_Buff.down and Combo_Points >= 7 and Combo_Points < 80  # 1-5 pontos de combo: com 0, a macro não lança Matança

use Keep_It_Rolling when  # Sorte Grande
	Triple_Threat.up
	or
	Jackpot.up

use Sinister_Strike when  # Golpe Sinistro
	Combo_Points < 80
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Padrão: fora do GCD",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 2, "alias": "Triple_Threat", "label": "Golpe de Sorte, nível 3 [1214935]", "spell": 1214935},
    {"n": 3, "alias": "Jackpot", "label": "Golpe de Sorte, nível 4 [1214937]", "spell": 1214937},
    {"n": 6, "alias": "Adrenaline_Rush_Buff", "label": "Adrenalina [13750]", "spell": 13750}
  ],
  "slots": [
    {"n": 1, "alias": "Adrenaline_Rush", "label": "Adrenalina + Matança (macro)", "spell": 13750, "offGcd": true, "queue": true},
    {"n": 4, "alias": "Keep_It_Rolling", "label": "Sorte Grande", "spell": 381989, "offGcd": true},
    {"n": 11, "alias": "Sinister_Strike", "label": "Golpe Sinistro", "spell": 193315}
  ],
  "rules": [
    {"use": "Adrenaline_Rush", "name": "Adrenalina (+ Matança pela macro)", "when": [
      {"all": ["Adrenaline_Rush_Buff.down", "Combo_Points >= 7", "Combo_Points < 80"], "comment": "1-5 pontos de combo: com 0, a macro não lança Matança"}
    ]},
    {"use": "Keep_It_Rolling", "name": "Sorte Grande", "when": [
      {"all": ["Triple_Threat.up"]},
      {"all": ["Jackpot.up"]}
    ]},
    {"use": "Sinister_Strike", "name": "Golpe Sinistro", "when": [
      {"all": ["Combo_Points < 80"]}
    ]}
  ]
}
```


O ID de um slot de macro é o ID do feitiço principal da macro (Adrenalina, 13750): o Better Assistant o usa para colocar o feitiço da macro no slot, e a KeyRota pega a tecla do botão da macro na sua barra.

### Uma defesa conforme a vida

Cura ou uma habilidade defensiva abaixo de um limite de vida, só quando Cura / defesa está ligado no painel. O slot é mostrado **em combate** (Em combate, `"show": "combat"`) para funcionar sem alvo. A regra vem primeiro: com pouca vida, ela importa mais do que o dano.

*Texto KRC:*

```text
rotation "Padrão: uma defesa conforme a vida"

slot4	Mutilate = "Mutilar"
slot11	Crimson_Vial = "Frasco Rubro"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Crimson_Vial when  # Frasco Rubro
	defensives == 1 and PlayerHP <= 40  # vida em 40% ou menos

use Mutilate when  # Mutilar
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Padrão: uma defesa conforme a vida",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 4, "alias": "Mutilate", "label": "Mutilar", "spell": 1329},
    {"n": 11, "alias": "Crimson_Vial", "label": "Frasco Rubro", "spell": 185311, "show": "combat"}
  ],
  "rules": [
    {"use": "Crimson_Vial", "name": "Frasco Rubro", "when": [
      {"all": ["defensives == 1", "PlayerHP <= 40"], "comment": "vida em 40% ou menos"}
    ]},
    {"use": "Mutilate", "name": "Mutilar"}
  ]
}
```


Cura / defesa vem desligado por padrão: ligue-o no painel de configurações rápidas quando quiser defesas automáticas.

### Procs: pelo bônus ou pelo destaque

Verifique um proc pelo bônus dele: na rotação de raide de Assassinato, o bônus Ponto Cego (`Blindside.up`) libera a regra de Emboscar. Se o jogo destacar o botão quando o proc é ativado, uma regra pode ler o destaque (`Ambush.glow`), mas só se você realmente vir esse brilho na sua barra.

*Texto KRC:*

```text
rotation "Padrão: um proc"

buff7	Blindside = "Ponto Cego [121153]"
slot4	Mutilate = "Mutilar"
slot5	Ambush = "Emboscar"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Ambush when  # Emboscar (Ponto Cego)
	Blindside.up and Combo_Points < 70

use Mutilate when  # Mutilar
	Combo_Points < 70
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Padrão: um proc",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 7, "alias": "Blindside", "label": "Ponto Cego [121153]", "spell": 121153}
  ],
  "slots": [
    {"n": 4, "alias": "Mutilate", "label": "Mutilar", "spell": 1329},
    {"n": 5, "alias": "Ambush", "label": "Emboscar", "spell": 8676}
  ],
  "rules": [
    {"use": "Ambush", "name": "Emboscar (Ponto Cego)", "when": [
      {"all": ["Blindside.up", "Combo_Points < 70"]}
    ]},
    {"use": "Mutilate", "name": "Mutilar", "when": [
      {"all": ["Combo_Points < 70"]}
    ]}
  ]
}
```


### Cargas

Um feitiço com cargas é pressionado com duas cargas ou quando a segunda está quase de volta, para que a recarga dele nunca fique parada. Exemplo: Disparo Farpado do caçador (2 cargas).

*Texto KRC:*

```text
rotation "Padrão: cargas"

slot1	Barbed_Shot = "Disparo Farpado"
slot2	Kill_Command = "Comando para Matar"
resource1	PlayerHP
resource2	TargetHP
resource3	Focus

use Barbed_Shot when  # Disparo Farpado
	Barbed_Shot.charges >= 2  # as duas cargas
	or
	Barbed_Shot.charges == 1 and Barbed_Shot.cd <= 20  # a segunda está quase de volta

use Kill_Command when  # Comando para Matar
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Padrão: cargas",
  "specID": 253,
  "resources": ["PlayerHP", "TargetHP", "Focus"],
  "slots": [
    {"n": 1, "alias": "Barbed_Shot", "label": "Disparo Farpado", "spell": 217200},
    {"n": 2, "alias": "Kill_Command", "label": "Comando para Matar", "spell": 34026}
  ],
  "rules": [
    {"use": "Barbed_Shot", "name": "Disparo Farpado", "when": [
      {"all": ["Barbed_Shot.charges >= 2"], "comment": "as duas cargas"},
      {"all": ["Barbed_Shot.charges == 1", "Barbed_Shot.cd <= 20"], "comment": "a segunda está quase de volta"}
    ]},
    {"use": "Kill_Command", "name": "Comando para Matar"}
  ]
}
```


Para um feitiço com cargas, `.cd` é a recarga da próxima carga: `Barbed_Shot.cd <= 20` significa que resta no máximo 20% da recarga dela.

### Distância até o alvo

Quando o alvo está fora do alcance corpo a corpo, mas dentro do alcance de uma habilidade à distância, pressione essa habilidade em vez de ficar parado. Sem alvo, a distância é desconhecida, e a regra fica em silêncio.

*Texto KRC:*

```text
rotation "Padrão: distância"

slot10	Pistol_Shot = "Tiro de Pistola"
slot11	Sinister_Strike = "Golpe Sinistro"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Pistol_Shot when  # Tiro de Pistola: o alvo está longe
	target.distance >= 10 and target.distance <= 20 and Combo_Points < 80

use Sinister_Strike when  # Golpe Sinistro
	Combo_Points < 80
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Padrão: distância",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 10, "alias": "Pistol_Shot", "label": "Tiro de Pistola", "spell": 185763},
    {"n": 11, "alias": "Sinister_Strike", "label": "Golpe Sinistro", "spell": 193315}
  ],
  "rules": [
    {"use": "Pistol_Shot", "name": "Tiro de Pistola: o alvo está longe", "when": [
      {"all": ["target.distance >= 10", "target.distance <= 20", "Combo_Points < 80"]}
    ]},
    {"use": "Sinister_Strike", "name": "Golpe Sinistro", "when": [
      {"all": ["Combo_Points < 80"]}
    ]}
  ]
}
```


Uma regra corpo a corpo não precisa verificar a distância: se o alvo estiver longe demais, o feitiço não pode ser usado, e a KeyRota passa sozinha para a próxima regra.

### Movimento

O botão Movimento do painel é o seu sinal para a rotação: “agora vou ter que correr”. A rotação decide o que fazer, por exemplo, trocar para uma habilidade à distância.

*Texto KRC:*

```text
rotation "Padrão: movimento"

slot10	Pistol_Shot = "Tiro de Pistola"
slot11	Sinister_Strike = "Golpe Sinistro"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Pistol_Shot when  # Tiro de Pistola em movimento
	movement == 1 and Combo_Points < 80

use Sinister_Strike when  # Golpe Sinistro
	movement == 0 and Combo_Points < 80
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Padrão: movimento",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 10, "alias": "Pistol_Shot", "label": "Tiro de Pistola", "spell": 185763},
    {"n": 11, "alias": "Sinister_Strike", "label": "Golpe Sinistro", "spell": 193315}
  ],
  "rules": [
    {"use": "Pistol_Shot", "name": "Tiro de Pistola em movimento", "when": [
      {"all": ["movement == 1", "Combo_Points < 80"]}
    ]},
    {"use": "Sinister_Strike", "name": "Golpe Sinistro", "when": [
      {"all": ["movement == 0", "Combo_Points < 80"]}
    ]}
  ]
}
```


### Feitiços com alvo no chão

O botão No chão libera feitiços que são posicionados no chão. A KeyRota só pressiona uma tecla, então é a macro que define o local: `[@player]` aos seus pés, `[@cursor]` sob o cursor.

*A macro no jogo:*

```text
#showtooltip Morte e Decomposição
/cast [@player] Morte e Decomposição
```


*Texto KRC:*

```text
rotation "Padrão: feitiços no chão"

slot1	Death_and_Decay = "Morte e Decomposição (macro @player)"
resource1	PlayerHP
resource2	TargetHP
resource3	Runes
resource4	Runic_Power

use Death_and_Decay when  # Morte e Decomposição
	ground_spells == 1 and enemies >= 2  # No chão ligado, 2+ inimigos
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Padrão: feitiços no chão",
  "specID": 250,
  "resources": ["PlayerHP", "TargetHP", "Runes", "Runic_Power"],
  "slots": [
    {"n": 1, "alias": "Death_and_Decay", "label": "Morte e Decomposição (macro @player)", "spell": 43265}
  ],
  "rules": [
    {"use": "Death_and_Decay", "name": "Morte e Decomposição", "when": [
      {"all": ["ground_spells == 1", "enemies >= 2"], "comment": "No chão ligado, 2+ inimigos"}
    ]}
  ]
}
```


### A rotação inicial completa

A rotação do [exemplo do construtor](https://keyrota.app/documentation/pt/editor#walkthrough): dois DoTs, um gerador, um finalizador com acúmulo, uma defesa e a Marca da Morte no Burst.

*Texto KRC:*

```text
rotation "Assassinato: exemplo v1"

# Exemplo da documentação do KeyRota: dois sangramentos, um gerador, um finalizador com acúmulo de energia,
# uma defesa com pouca vida e Marca da Morte no botão Burst.
# Pontos de combo em porcentagem de 7: 5 pontos = 71%, limite 70 = 5+.

buff1	Garrote_DoT = "Garrote no alvo [703]"
buff2	Rupture_DoT = "Ruptura no alvo [1943]"
buff3	Envenom_Buff = "Envenenar [32645]"
buff4	Deathmark_DoT = "Marca da Morte no alvo [360194]"
slot1	Garrote = "Garrote"
slot2	Rupture = "Ruptura"
slot3	Envenom = "Envenenar"
slot4	Mutilate = "Mutilar"
slot5	Deathmark = "Marca da Morte"
slot6	Crimson_Vial = "Frasco Rubro"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

# --- Defesa: só com “Cura / defesa” ligado ---
use Crimson_Vial when  # Frasco Rubro
	defensives == 1 and PlayerHP <= 40  # vida em 40% ou menos

# --- Recarga: só com o Burst ligado ---
use Deathmark when  # Marca da Morte
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up and Envenom_Buff.up  # Burst ligado, sangramentos e Envenenar ativos

# --- Sangramentos ---
use Garrote when  # Garrote
	Garrote_DoT.down  # sem sangramento
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30  # janela de pandemia: resta 30% ou menos

use Rupture when  # Ruptura
	Combo_Points >= 70 and Rupture_DoT.down  # 5+ pontos de combo, sem sangramento
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # 5+ pontos de combo, janela de pandemia

# --- Gasto: 5+ pontos de combo, acumulando energia ---
use Envenom when  # Envenenar
	Combo_Points >= 70 and Envenom_Buff.down  # sem bônus
	or
	Combo_Points >= 70 and Envenom_Buff.up and Envenom_Buff.duration <= 20  # o bônus está acabando
	or
	Combo_Points >= 70 and Energy >= 70  # não desperdiçar energia no máximo
	or
	Combo_Points >= 70 and Deathmark_DoT.up  # Marca da Morte no alvo

# --- Gerador: menos de 5 pontos de combo ---
use Mutilate when  # Mutilar
	Combo_Points < 70  # menos de 5 pontos de combo
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Assassinato: exemplo v1",
  "specID": 259,
  "ignoreMainIcon": true,
  "enemies": {"range": 8, "combatOnly": true},
  "notes": [
    "Exemplo da documentação do KeyRota: dois sangramentos, um gerador, um finalizador com acúmulo de energia,",
    "uma defesa com pouca vida e Marca da Morte no botão Burst.",
    "Pontos de combo em porcentagem de 7: 5 pontos = 71%, limite 70 = 5+."
  ],
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "Garrote no alvo [703]", "spell": 703},
    {"n": 2, "alias": "Rupture_DoT", "label": "Ruptura no alvo [1943]", "spell": 1943},
    {"n": 3, "alias": "Envenom_Buff", "label": "Envenenar [32645]", "spell": 32645},
    {"n": 4, "alias": "Deathmark_DoT", "label": "Marca da Morte no alvo [360194]", "spell": 360194}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "Garrote", "spell": 703, "show": "target"},
    {"n": 2, "alias": "Rupture", "label": "Ruptura", "spell": 1943, "show": "target"},
    {"n": 3, "alias": "Envenom", "label": "Envenenar", "spell": 32645, "show": "target"},
    {"n": 4, "alias": "Mutilate", "label": "Mutilar", "spell": 1329, "show": "target"},
    {"n": 5, "alias": "Deathmark", "label": "Marca da Morte", "spell": 360194, "show": "target"},
    {"n": 6, "alias": "Crimson_Vial", "label": "Frasco Rubro", "spell": 185311, "show": "combat"}
  ],
  "rules": [
    {
      "use": "Crimson_Vial",
      "name": "Frasco Rubro",
      "note": ["--- Defesa: só com “Cura / defesa” ligado ---"],
      "when": [{"all": ["defensives == 1", "PlayerHP <= 40"], "comment": "vida em 40% ou menos"}]
    },
    {
      "use": "Deathmark",
      "name": "Marca da Morte",
      "note": ["--- Recarga: só com o Burst ligado ---"],
      "when": [
        {
          "all": ["cd == 1", "Garrote_DoT.up", "Rupture_DoT.up", "Envenom_Buff.up"],
          "comment": "Burst ligado, sangramentos e Envenenar ativos"
        }
      ]
    },
    {
      "use": "Garrote",
      "name": "Garrote",
      "note": ["--- Sangramentos ---"],
      "when": [
        {"all": ["Garrote_DoT.down"], "comment": "sem sangramento"},
        {
          "all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"],
          "comment": "janela de pandemia: resta 30% ou menos"
        }
      ]
    },
    {
      "use": "Rupture",
      "name": "Ruptura",
      "when": [
        {"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "5+ pontos de combo, sem sangramento"},
        {
          "all": ["Combo_Points >= 70", "Rupture_DoT.up", "Rupture_DoT.duration <= 30"],
          "comment": "5+ pontos de combo, janela de pandemia"
        }
      ]
    },
    {
      "use": "Envenom",
      "name": "Envenenar",
      "note": ["--- Gasto: 5+ pontos de combo, acumulando energia ---"],
      "when": [
        {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "sem bônus"},
        {
          "all": ["Combo_Points >= 70", "Envenom_Buff.up", "Envenom_Buff.duration <= 20"],
          "comment": "o bônus está acabando"
        },
        {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "não desperdiçar energia no máximo"},
        {"all": ["Combo_Points >= 70", "Deathmark_DoT.up"], "comment": "Marca da Morte no alvo"}
      ]
    },
    {
      "use": "Mutilate",
      "name": "Mutilar",
      "note": ["--- Gerador: menos de 5 pontos de combo ---"],
      "when": [{"all": ["Combo_Points < 70"], "comment": "menos de 5 pontos de combo"}]
    }
  ]
}
```


### Uma rotação de raide completa

Uma rotação de raide de Assassinato real (Destinado): 15 regras, Burst, Sumir sob a Marca da Morte, cópia de DoTs com Tempestade Carmesim, AoE e alvo único, acúmulo de energia.

**Texto KRC: Assassinato, raide**
*Texto KRC:*

```text
rotation "Assassinato, raide v2.8: botão Burst, Method 12.1, SimulationCraft, melhores logs"

# Assassinato, raide. Base: o guia da Method (patch 12.1), a lista de ações do SimulationCraft e os melhores jogadores do Warcraft Logs.
# Ignorar o ícone principal: ligado. Marca da Morte e Ruína dos Reis só com o Burst ligado; Sumir só enquanto Marca da Morte estiver no alvo.
# Pontos de combo em porcentagem de 7: 3 = 43%, 4 = 57%, 5 = 71%, 6 = 86%, 7 = 100%.

# v2.4: Ruína dos Reis só com 0–3 pontos de combo (Golpes Implacáveis depois dão 5), Sumir com 0–4 (Garrote da furtividade dá 3).
# v2.5: Tempestade Carmesim só quando apenas um dos dois sangramentos está recente; antes era usada várias vezes seguidas.
# v2.6: com o Burst ligado e Marca da Morte pronta ou já no alvo, Garrote e Ruptura vão para um alvo com qualquer vida.
# v2.7 e v2.8: alvo novo sem sangramentos, Burst ligado, Marca da Morte pronta, 2+ inimigos por perto: primeiro Tempestade Carmesim copia os sangramentos (com quaisquer pontos de combo), depois Marca da Morte.

buff1	Garrote_DoT = "Garrote no alvo [703]"
buff2	Rupture_DoT = "Ruptura no alvo [1943]"
buff3	Envenom_Buff = "Envenenar [32645]"
buff4	Deathmark_DoT = "Marca da Morte no alvo [360194]"
buff5	Improved_Garrote = "Garrote Aprimorado [392401]"
buff6	Darkest_Night = "Noite Preta [457280]"
buff7	Blindside = "Ponto Cego [121153]"
buff8	Stealth_Buff = "Furtividade [1784]"
buff9	Stealth_Sub = "Furtividade (Subterfúgio) [115191]"
buff10	Vanish_Buff = "Sumir [11327]"
slot1	Garrote = "Garrote"
slot2	Rupture = "Ruptura"
slot3	Envenom = "Envenenar"
slot4	Mutilate = "Mutilar"
slot5	Ambush = "Emboscar"
slot6	Fan_of_Knives = "Leque de Facas"
slot7	Crimson_Tempest = "Tempestade Carmesim"
slot8	Deathmark = "Marca da Morte"
slot9	Kingsbane = "Ruína dos Reis"
slot10	Vanish = "Sumir"
slot11	Crimson_Vial = "Frasco Rubro"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

# --- Defesa: só com “Cura / defesa” ligado ---
use Crimson_Vial when  # Frasco Rubro
	defensives == 1 and PlayerHP <= 40  # vida em 40% ou menos

# === Furtividade ===
use Garrote when  # Garrote da furtividade
	Stealth_Buff.up  # em furtividade
	or
	Stealth_Sub.up  # em furtividade (Subterfúgio)
	or
	Vanish_Buff.up  # logo após Sumir

use Garrote when  # Garrote: janela de Garrote Aprimorado
	Improved_Garrote.up and Garrote_DoT.down  # janela aberta, sem Garrote no alvo
	or
	Improved_Garrote.up and Garrote_DoT.duration <= 78  # SimulationCraft: renovar quando restam 14 de 18 segundos

# === Recargas (botão Burst) ===
use Deathmark when  # Marca da Morte
	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 ligado, sangramentos ativos, Ruína dos Reis pronta, Envenenar por mais 2+ s

use Kingsbane when  # Ruína dos Reis
	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 ligado, Marca da Morte no alvo, 0–3 pontos de combo
	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 ligado, Marca da Morte só daqui a mais de 52 s, 0–3 pontos de combo

use Vanish when  # Sumir
	Deathmark_DoT.up and Improved_Garrote.down and Combo_Points < 65 and Stealth_Buff.down and Stealth_Sub.down  # Marca da Morte no alvo, 0–4 pontos de combo (Garrote da furtividade dá 3)

# === Sangramentos ===
use Crimson_Tempest when  # Tempestade Carmesim: copiar os sangramentos para um alvo novo para Marca da Morte
	cd == 1 and Deathmark.cd <= 3 and Garrote_DoT.down and Rupture_DoT.down and Envenom_Buff.up and enemies >= 2  # pontos de combo não importam

# Nenhum sangramento novo em adds quase mortos (como “o alvo vive mais 12+ s” do SimulationCraft): com 1–2 alvos e no modo “Um”, sempre;
# com 3+ alvos, só se o alvo tiver 50%+ de vida, ou com o Burst ligado e Marca da Morte pronta, ou se Marca da Morte já estiver no alvo.
use Garrote when  # Garrote: manutenção
	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+ alvos: só um alvo que vai durar
	or
	Garrote_DoT.down and Combo_Points < 95 and cd == 1 and Deathmark.cd <= 3  # Burst ligado e Marca da Morte pronta: a vida não importa
	or
	Garrote_DoT.down and Combo_Points < 95 and Deathmark_DoT.up  # Marca da Morte no alvo (sangramentos copiados)
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30 and Combo_Points < 95  # janela de pandemia (já ativo)

use Rupture when  # Ruptura
	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+ alvos: só um alvo que vai durar
	or
	Combo_Points >= 70 and Rupture_DoT.down and cd == 1 and Deathmark.cd <= 3  # Burst ligado e Marca da Morte pronta
	or
	Combo_Points >= 70 and Rupture_DoT.down and Deathmark_DoT.up  # Marca da Morte no alvo
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 25 and Darkest_Night.down  # renovação; não gastar nela os 7 pontos de combo de Noite Preta

# === Geradores: até 5 pontos de combo, até 7 com Noite Preta ===

# Tempestade Carmesim uma vez logo após uma Ruptura recente (com 4+ alvos também após um Garrote recente); senão, Leque de Facas.
# Só um dos dois pode estar recente (94%+): logo após Tempestade Carmesim os dois estão, então a próxima espera.
use Crimson_Tempest when  # Tempestade Carmesim: espalhar os sangramentos logo após uma Ruptura ou um Garrote recente
	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 alvos: só após uma Ruptura recente
	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 alvos: só após uma Ruptura recente

use Fan_of_Knives when  # Leque de Facas: alvo único, Noite Preta, falta um ponto de combo
	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  # Leque de Facas: 2+ alvos
	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  # Emboscar (Ponto Cego)
	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  # Mutilar
	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

# === Gasto: 5+ pontos de combo (7 com Noite Preta) ===
# SimulationCraft: não usar de imediato, e sim manter Envenenar ativo: no último segundo do bônus, enquanto Marca da Morte estiver no alvo, antes de a energia encher, mais cedo com 4+ alvos.
use Envenom when  # Envenenar
	Darkest_Night.down and Combo_Points >= 70 and Envenom_Buff.down
	or
	Darkest_Night.down and Combo_Points >= 70 and Envenom_Buff.duration <= 20  # resta ~1 s
	or
	Darkest_Night.down and Combo_Points >= 70 and Deathmark_DoT.up
	or
	Darkest_Night.down and Combo_Points >= 70 and Energy >= 70  # não desperdiçar energia no máximo
	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
```


O JSON dela está nos arquivos abaixo. A segunda rotação é de Fora da Lei (Trapaceiro), com a macro de Adrenalina (**O + Q**), Sorte Grande (**O**), Matança (**C**) e proteção de canalização em todas as regras.

### Arquivos de exemplo

| Exemplo | Arquivos |
|---|---|
| A rotação inicial de Assassinato do exemplo do construtor | [JSON](https://keyrota.app/documentation/examples/starter-assassination.pt.json), [texto KRC](https://keyrota.app/documentation/examples/starter-assassination.pt.txt) |
| Assassinato, raide: 15 regras | [JSON](https://keyrota.app/documentation/examples/assassination-raid.pt.json), [texto KRC](https://keyrota.app/documentation/examples/assassination-raid.pt.txt) |
| Fora da Lei, raide e Mítica+: 13 regras, flags O, OQ, C | [JSON](https://keyrota.app/documentation/examples/outlaw-raid.pt.json), [texto KRC](https://keyrota.app/documentation/examples/outlaw-raid.pt.txt) |
| A menor rotação útil | [JSON](https://keyrota.app/documentation/examples/minimal.pt.json), [texto KRC](https://keyrota.app/documentation/examples/minimal.pt.txt) |
| Uma amostra de sintaxe: todas as condições e flags (sem IDs, não serve para combate) | [JSON](https://keyrota.app/documentation/examples/syntax-every-condition.pt.json), [texto KRC](https://keyrota.app/documentation/examples/syntax-every-condition.pt.txt) |

Todos os exemplos existem em todos os idiomas do site: os rótulos, as regras e os comentários são traduzidos, enquanto as condições, os IDs de feitiços e as flags são os mesmos. O idioma está no nome do arquivo: `.en`, `.ru`, `.de`, `.fr`, `.es`, `.it`, `.pt`, `.ko`, `.zh`, `.zh-TW`.

Para abrir um arquivo: Novo — De um arquivo…, na janela principal, ou Abrir…, na página Texto e JSON do construtor.

---

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

## Criar uma rotação com um agente de IA

> [!TIP] Basta um link para esta página
> Você pode simplesmente dar ao seu agente de IA o link desta página: ele vai entender tudo sozinho e, se precisar, vai pedir a você os dados que faltarem.

Um agente de IA com acesso à internet e a arquivos pode criar uma rotação KRC para você: estudar os logs dos melhores jogadores da sua especialização, os guias e a lista de ações do SimulationCraft, comparar tudo com os seus talentos e os seus logs e entregar um JSON pronto. Aqui está o que fornecer a ele, um prompt pronto e como verificar o resultado.

### Do que você precisa

**Um agente** que consiga abrir sites (Warcraft Logs, Raider.IO, Wowhead, GitHub) e ler arquivos. Sem acesso à web, forneça a documentação e trechos dos logs como arquivos.

**Documentação para o agente** (os links já estão no prompt):

| Link | O que contém |
|---|---|
| [llms.txt](https://keyrota.app/documentation/llms.txt) | O índice da documentação para agentes de IA: todos os idiomas, arquivos e exemplos |
| [krc-guide.pt.md](https://keyrota.app/documentation/krc-guide.pt.md) | Toda a documentação em um único arquivo Markdown neste idioma; em inglês: [krc-guide.en.md](https://keyrota.app/documentation/krc-guide.en.md) |
| [keyrota-rotation.schema.json](https://keyrota.app/documentation/keyrota-rotation.schema.json) | O JSON Schema para verificar a resposta |
| [Assassinato, raide](https://keyrota.app/documentation/examples/assassination-raid.pt.json), [Fora da Lei, raide e Mítica+](https://keyrota.app/documentation/examples/outlaw-raid.pt.json) | Rotações de raide reais como modelo |

**Os seus dados** (os marcadores no prompt):

| Marcador | O que colocar | Exemplo |
|---|---|---|
| `{CLASS}` | Classe | Ladino |
| `{SPEC}` | Especialização | Assassinato |
| `{HERO_TALENTS}` | Talentos heroicos | Destinado |
| `{TALENT_STRING}` | O texto de exportação de talentos do jogo (janela de talentos, Compartilhar) | `CMQAAAAA…` |
| `{CONTENT}` | Raide ou Mítica+ | raide |
| `{RAID_OR_DUNGEONS}` | A raide ou uma lista de masmorras | The Venomous Abyss |
| `{DIFFICULTY}` | Dificuldade ou nível da chave | heroica |
| `{BOSSES}` | Os chefes para os quais a rotação é feita | todos |
| `{ITEM_LEVEL}` | Nível de item | 328 |
| `{MY_LOGS}` | Um link para o seu personagem ou relatório no Warcraft Logs | `https://www.warcraftlogs.com/character/eu/<reino>/<nome>` |
| `{COMBAT_LOG_FILE}` | O arquivo de registro de combate que você anexar | `WoWCombatLog-101726_214449.txt` |
| `{PREFERENCES}` | As suas preferências | “recargas só no botão Burst, sem defesas” |

### O prompt

O agente coleta os dados sozinho, compara-os com os seus e explica cada regra. Preencha as chaves e anexe um registro de combate, se tiver.

*Prompt:*

```text
Você é especialista em World of Warcraft e autor de rotações para a KeyRota. Crie para mim uma rotação avançada da KeyRota: um JSON no formato keyrota-rotation, versão 1.

MEU PERSONAGEM
- Classe e especialização: {CLASS}, {SPEC}. Talentos heroicos: {HERO_TALENTS}.
- Texto de talentos do jogo: {TALENT_STRING}
- Conteúdo: {CONTENT}: {RAID_OR_DUNGEONS}. Dificuldade ou níveis de chave: {DIFFICULTY}. Chefes: {BOSSES}.
- Nível de item: {ITEM_LEVEL}.
- Meus logs no Warcraft Logs: {MY_LOGS}
- Registro de combate (anexado): {COMBAT_LOG_FILE}
- Preferências: {PREFERENCES}

PASSO 1. APRENDA O FORMATO DA KEYROTA
- https://keyrota.app/documentation/llms.txt e https://keyrota.app/documentation/krc-guide.en.md: slots (até 12), auras (até 12, só os meus bônus e as minhas penalidades no alvo), recursos em porcentagem, todas as condições, flags dos slots, os alternadores do painel aoe, st, cd, defensives, ground_spells, movement, regras verificadas de cima para baixo, grupos OU de condições E, limite de 16 grupos de 16 condições, um valor desconhecido torna a condição falsa.
- JSON Schema: https://keyrota.app/documentation/keyrota-rotation.schema.json
- Modelos: https://keyrota.app/documentation/examples/assassination-raid.en.json e https://keyrota.app/documentation/examples/outlaw-raid.en.json

PASSO 2. COLETE OS DADOS
1. Warcraft Logs: rankings de dano de {SPEC} {CLASS} para cada chefe ({CONTENT}, {DIFFICULTY}); para Mítica+, para cada masmorra e nível de chave. Pegue os 5-10 melhores logs com os talentos heroicos {HERO_TALENTS}.
2. Compare os talentos deles com o meu texto de talentos. Aponte as diferenças que mudam a prioridade e diga se devo adotá-las.
3. Nos melhores logs, colete: a abertura e a ordem dos lançamentos; o tempo ativo dos bônus e das penalidades importantes; os recursos no momento dos lançamentos (pontos de combo ou equivalente nos finalizadores, energia ou equivalente antes de gastar, recurso perdido por estar no máximo); quando e junto com o quê as grandes recargas são usadas e como elas são alinhadas com as fases; quando e com quanta vida as defesas são usadas; a partir de quantos alvos eles passam para AoE; lançamentos por minuto e tempo sem lançamentos.
4. Para Mítica+: Raider.IO (a meta, as melhores partidas, talentos por masmorra).
5. Guias (Wowhead, Method, o Discord da classe) e a lista de ações (APL) do SimulationCraft para {SPEC} no branch da expansão atual: use-a como prioridade básica e confira-a com os logs.
6. Meus logs e meu registro de combate: onde o meu tempo ativo, os recursos nos gastos, as recargas e o ritmo diferem dos melhores jogadores.

PASSO 3. ESCREVA A ROTAÇÃO
- "format": "keyrota-rotation", "version": 1, o specID da minha especialização, resources conforme a tabela de especializações da documentação (resource1 PlayerHP, resource2 TargetHP, depois os recursos da especialização), "ignoreMainIcon": true.
- Slots: IDs reais de feitiços do Wowhead (o campo spell). "show": "combat" para cura e defesas. Flags: offGcd para feitiços fora do GCD; offGcd e queue para macros cuja segunda linha usa o GCD e para botões que precisam do resultado do golpe anterior; channel para canalizações; manual para o que eu pressiono por conta própria. Para um slot de macro, escreva o texto da macro (#showtooltip e /cast).
- Auras: IDs dos próprios bônus e penalidades, não dos feitiços que os aplicam. Só as minhas auras.
- Regras em ordem de prioridade. Defesas primeiro e só com defensives == 1. Grandes recargas só com cd == 1 (o botão Burst, não a recarga de um feitiço); o que fortalece a janela da recarga, só durante ela. Alvo único e AoE: um grupo aoe == 1 e um grupo st == 0 and enemies >= N para AoE; um grupo st == 1 e um grupo aoe == 0 and enemies <= 1 para alvo único. DoTs: um grupo X.down e um grupo X.up and X.duration <= 30. Recursos em porcentagem, limites no meio entre os degraus (pontos de combo de 7: "pelo menos 5" é Combo_Points >= 70, "no máximo 3" é Combo_Points < 50). Se o próximo botão interromper uma canalização, adicione X.duration <= 8 da aura da canalização a cada grupo de cada regra.
- O KRC não tem not, != nem parênteses: use os pares up/down, ready/oncd, glow/noglow, operadores inversos e vários grupos.
- Escreva os rótulos (label), os nomes das regras e os comentários em português do Brasil, e os nomes usados nas condições (alias) em letras latinas, sem acentos.
- Dê um name a cada regra e um comment curto a cada grupo: o quê e por quê.
- No fim, verifique: o JSON passa no schema; cada nome usado nas condições está declarado; no máximo 16 condições em um grupo e 16 grupos em uma regra; os IDs existem no Wowhead para o patch atual.

RESPOSTA
1. O JSON da rotação inteiro, em um único bloco.
2. Os textos das macros para os slots de macro.
3. Uma tabela: regra, o que ela faz, de onde vem (qual log, guia ou linha da APL).
4. O que ligar no jogo: botões do painel de configurações rápidas, o raio do contador de inimigos, o que colocar nas barras de ações.
5. Um plano de teste: um boneco de treinamento e depois um registro de combate comparado com os melhores logs; quais números comparar.
```


### Um prompt preenchido

O mesmo prompt completo, preenchido para Assassinato em uma raide heroica:

*Prompt: Assassinato, raide heroica:*

```text
Você é especialista em World of Warcraft e autor de rotações para a KeyRota. Crie para mim uma rotação avançada da KeyRota: um JSON no formato keyrota-rotation, versão 1.

MEU PERSONAGEM
- Classe e especialização: Ladino, Assassinato. Talentos heroicos: Destinado (Fatebound).
- Texto de talentos do jogo: CMQAAAAAAAAAAAAAAAAAAAAAAYmlZmFDGAAAAAYWGsNDAAAAAILzMzMzMjxyMzMbzsMzMPgZMzYMMzYMAGYBmxoxsBYbAbGAMzMGD
- Conteúdo: raide: The Venomous Abyss. Dificuldade: heroica. Chefes: todos; dê atenção especial a Ula'tek (janelas de dano no Coração).
- Nível de item: 328.
- Meus logs no Warcraft Logs: https://www.warcraftlogs.com/character/eu/<reino>/<nome>
- Registro de combate (anexado): WoWCombatLog-101726_214449.txt, 5 minutos em um boneco de treinamento, alvo único.
- Preferências: Marca da Morte e Ruína dos Reis só no botão Burst; Sumir só sob a Marca da Morte; Frasco Rubro com 40% de vida ou menos; acúmulo de energia como no SimulationCraft.

PASSO 1. APRENDA O FORMATO DA KEYROTA
- https://keyrota.app/documentation/llms.txt e https://keyrota.app/documentation/krc-guide.en.md: slots (até 12), auras (até 12, só os meus bônus e as minhas penalidades no alvo), recursos em porcentagem, todas as condições, flags dos slots, os alternadores do painel aoe, st, cd, defensives, ground_spells, movement, regras verificadas de cima para baixo, grupos OU de condições E, limite de 16 grupos de 16 condições, um valor desconhecido torna a condição falsa.
- JSON Schema: https://keyrota.app/documentation/keyrota-rotation.schema.json
- Modelos: https://keyrota.app/documentation/examples/assassination-raid.en.json e https://keyrota.app/documentation/examples/outlaw-raid.en.json

PASSO 2. COLETE OS DADOS
1. Warcraft Logs: rankings de dano de Ladino Assassinato para cada chefe (raide The Venomous Abyss, dificuldade heroica). Pegue os 5-10 melhores logs com os talentos heroicos Destinado (Fatebound).
2. Compare os talentos deles com o meu texto de talentos. Aponte as diferenças que mudam a prioridade e diga se devo adotá-las.
3. Nos melhores logs, colete: a abertura e a ordem dos lançamentos; o tempo ativo de Garrote, Ruptura e do bônus de Envenenar; os pontos de combo em Envenenar, Ruptura, Ruína dos Reis e Sumir, a energia antes de Envenenar, a energia e os pontos de combo perdidos por estarem no máximo; quando e junto com o quê Marca da Morte e Ruína dos Reis são usadas e como elas são alinhadas com as fases (principalmente com o Coração em Ula'tek); quando e com quanta vida Frasco Rubro e outras defesas são usados; a partir de quantos alvos eles passam para Leque de Facas e Tempestade Carmesim; lançamentos por minuto e tempo sem lançamentos.
4. Guias (Wowhead, Method, o Discord dos ladinos) e a lista de ações (APL) do SimulationCraft para Assassinato no branch da expansão atual: use-a como prioridade básica e confira-a com os logs.
5. Meus logs e meu registro de combate: onde o meu tempo ativo, os pontos de combo nos gastos, as recargas e o ritmo diferem dos melhores jogadores.

PASSO 3. ESCREVA A ROTAÇÃO
- "format": "keyrota-rotation", "version": 1, "specID": 259, "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"], "ignoreMainIcon": true.
- Slots: IDs reais de feitiços do Wowhead (o campo spell). "show": "combat" para o Frasco Rubro. Flags: offGcd para feitiços fora do GCD; offGcd e queue para Sumir (ele precisa dos pontos de combo do golpe anterior); channel para canalizações, se houver; manual para o que eu pressiono por conta própria. Para um slot de macro, escreva o texto da macro (#showtooltip e /cast).
- Auras: IDs dos próprios bônus e penalidades, não dos feitiços que os aplicam (por exemplo, o bônus de Sumir não é o mesmo que o feitiço). Só as minhas auras.
- Regras em ordem de prioridade. Frasco Rubro primeiro e só com defensives == 1 e vida em 40% ou menos. Marca da Morte e Ruína dos Reis só com cd == 1 (o botão Burst, não a recarga de um feitiço); Sumir só enquanto a Marca da Morte estiver no alvo. Alvo único e AoE: um grupo aoe == 1 e um grupo st == 0 and enemies >= 2 para Leque de Facas; um grupo st == 1 e um grupo aoe == 0 and enemies <= 1 para Mutilar. Garrote e Ruptura: um grupo X.down e um grupo X.up and X.duration <= 30. Pontos de combo de 7 em porcentagem, limites no meio entre os degraus: "pelo menos 5" é Combo_Points >= 70, "no máximo 3" é Combo_Points < 50. Acúmulo de energia: Envenenar com 5+ pontos de combo quando o bônus estiver acabando, sob a Marca da Morte ou com Energy >= 70.
- O KRC não tem not, != nem parênteses: use os pares up/down, ready/oncd, glow/noglow, operadores inversos e vários grupos.
- Escreva os rótulos (label), os nomes das regras e os comentários em português do Brasil, e os nomes usados nas condições (alias) em letras latinas, sem acentos.
- Dê um name a cada regra e um comment curto a cada grupo: o quê e por quê.
- No fim, verifique: o JSON passa no schema; cada nome usado nas condições está declarado; no máximo 16 condições em um grupo e 16 grupos em uma regra; os IDs existem no Wowhead para o patch atual.

RESPOSTA
1. O JSON da rotação inteiro, em um único bloco.
2. Os textos das macros para os slots de macro.
3. Uma tabela: regra, o que ela faz, de onde vem (qual log, guia ou linha da APL).
4. O que ligar no jogo: botões do painel de configurações rápidas, o raio do contador de inimigos, o que colocar nas barras de ações.
5. Um plano de teste: um boneco de treinamento e depois um registro de combate comparado com os melhores logs; quais números comparar.
```


### Como analisar logs

Dicas para o agente e para você: onde obter os dados e o que comparar.

**Warcraft Logs**
- Rankings: `https://www.warcraftlogs.com/zone/rankings/<id da zona>?boss=<id do chefe>&class=<Classe>&spec=<Especialização>&difficulty=<3|4|5>&metric=dps` (3 normal, 4 heroica, 5 mítica). Os rankings de Mítica+ são divididos por nível de chave.
- No relatório de um jogador: as abas Casts (ordem e momento dos lançamentos), Buffs e Debuffs (tempo ativo), Resources (recursos e desperdício no máximo), Damage Done (por habilidade e por alvo), Deaths.
- Talentos a partir de um log: o resumo do jogador tem o texto de exportação de talentos; abra-o na calculadora de talentos do Wowhead.
- Compare o comportamento, não o DPS: tempo ativo de DoTs e bônus, recursos nos gastos, lançamentos por minuto, tempo sem lançamentos, momento das grandes recargas em relação às fases do combate.

**Raider.IO** (Mítica+)
- As melhores partidas de uma masmorra: `https://raider.io/api/v1/mythic-plus/runs?season=<temporada>&region=world&dungeon=<slug>&page=0`; temporadas e masmorras: `https://raider.io/api/v1/mythic-plus/static-data?expansion_id=<id>`.
- A meta muda de semana para semana: use dados recentes, não conclusões antigas.

**SimulationCraft**
- A lista de ações (APL) de uma especialização fica no repositório `simulationcraft/simc` no GitHub, no branch da expansão atual, na pasta `ActionPriorityLists`.
- Como converter uma APL em KRC:

| APL do SimulationCraft | KRC |
|---|---|
| linhas `actions`, de cima para baixo | regras, de cima para baixo |
| `buff.X.up` | `X.up` |
| `dot.X.remains`, `buff.X.remains` | `X.duration` em porcentagem |
| `cooldown.X.remains` | `X.cd` em porcentagem |
| `combo_points`, `energy` | recursos em porcentagem |
| `active_enemies` | `enemies` |
| `target.time_to_die`, segundos exatos | não existe; use o substituto mais próximo, por exemplo, “o alvo vai durar mais 12 segundos” vira `TargetHP >= 50` com 3+ alvos |

**O registro de combate**
- Com o registro avançado, cada `SPELL_CAST_SUCCESS` traz os recursos de quem lançou (tipo, valor atual, máximo); a energia é o tipo 3.
- `SPELL_AURA_APPLIED`, `SPELL_AURA_REFRESH`, `SPELL_AURA_REMOVED`: tempo ativo e renovações das auras; `SPELL_ENERGIZE`: ganhos de recurso; `SPELL_CAST_FAILED`: pressionamentos que o jogo recusou.
- Conte: lançamentos por minuto, intervalos entre GCDs, tempo ativo de DoTs, pontos de combo nos finalizadores, energia desperdiçada no máximo, momento das grandes recargas.

### Como gravar um registro de combate

1. Nas configurações do jogo, seção Rede, ligue o Registro de combate avançado. Sem ele, o registro não tem recursos nem posições.
2. Antes de começar o combate, digite `/combatlog` no chat: a gravação começa. Depois do combate, digite `/combatlog` de novo: a gravação para.
3. O arquivo fica na pasta do jogo: `World of Warcraft\_retail_\Logs\WoWCombatLog-MMDDAA_HHMMSS.txt`. O jogo grava o arquivo com atraso: espere um minuto depois de parar a gravação.
4. O programa de envio do Warcraft Logs pode limpar o arquivo depois do envio: copie-o antes.

Faça os primeiros testes em um boneco de treinamento: 2 a 3 minutos em um único alvo e depois em um grupo de bonecos para AoE.

### Testes e ajustes

1. Carregue a rotação (veja abaixo), monte e cole o perfil do Better Assistant e coloque os feitiços dos slots nas suas barras, com teclas.
2. Teste em um boneco. O Log da janela principal mostra o que é pressionado. O arquivo de log da KeyRota (o botão de pasta ao lado de Log) registra, para cada GCD, a regra escolhida e por que as regras acima foram puladas: condições, não pronto, desconhecido, manual.
3. Dê ao agente o JSON da rotação, um registro de combate recente e, se necessário, o log da KeyRota. Peça que ele compare com os melhores logs: tempo ativo, recursos nos gastos, recargas, tempo parado.
4. Mude uma regra de cada vez e mantenha a versão no nome da rotação (“v1.3”). Guarde as versões antigas: Exportar, na janela principal, ou Texto e JSON — Salvar….
5. Depois da raide ou da chave, compare de novo com o Warcraft Logs.

### Como carregar o resultado

- **Como arquivo:** salve o JSON da resposta como um arquivo `.json` e depois use Rotação — Novo — De um arquivo….
- **Da área de transferência:** copie o JSON e depois use Novo — Da área de transferência.
- **Em uma rotação aberta:** o construtor — Texto e JSON — JSON — Colar. Os slots de mesmos números mantêm os IDs, as flags e a visibilidade se o novo JSON não os tiver.

A barra de status do construtor deve mostrar “Rotação válida”. Se houver um erro, ele indica o local: repasse-o ao agente palavra por palavra. Depois, Geral — “Montar com slots e auras” — “Copiar” e, no jogo, `/ba` — Profile — colar — Apply. Crie no jogo as macros da resposta e coloque-as nas suas barras.

---

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

## Perguntas frequentes e solução de problemas

### Uma regra nunca é acionada

Verifique nesta ordem:

1. **Uma regra acima sempre ganha.** As regras são verificadas de cima para baixo: se uma regra acima for atendida e o feitiço dela puder ser usado, a sua nunca terá vez. Mova a sua regra para cima ou restrinja as condições da regra de cima.
2. **Um valor desconhecido.** Uma condição sobre um valor desconhecido é falsa, até `.down`. Uma aura é desconhecida quando não está no perfil do Better Assistant ou está com o ID errado. Monte o perfil de novo (“Montar com slots e auras”) e cole-o no jogo.
3. **O ID da aura, não o do feitiço.** Um bônus pode ter um ID diferente do feitiço que o aplica: Sumir é `1856`, e o bônus dele, `11327`. Além disso, as regras só veem as suas auras, não os bônus de outros jogadores.
4. **O slot não está pronto.** Recurso insuficiente, alvo longe demais, recarga, talento não escolhido. Uma regra assim é pulada sem erro.
5. **O Better Assistant não mostra o slot.** Um slot Com alvo não fica pronto sem alvo. Use Em combate para cura e defesas.
6. **Sem tecla.** O feitiço do slot precisa estar em uma barra de ações com uma tecla atribuída (ou em uma macro com `#showtooltip`).
7. **Um alternador está desligado.** Cura / defesa vem desligado por padrão, o Burst pode ter sido desligado com a tecla do Burst (F3 no Windows, ⌃⇧B no macOS), e o modo de alvos pode ainda estar em Um ou Vários.
8. **Porcentagens.** 5 pontos de combo são `70`, e não `5`. Veja [Recursos](https://keyrota.app/documentation/pt/conditions#resources).
9. **Acúmulos.** Um único acúmulo é lido como 0: `X.stacks >= 1` não distingue um acúmulo da ausência da aura; use `.up`.
10. **Uma aura sem duração.** Furtividade e afins sempre têm 1 restante: `.duration` não funciona com elas.

O arquivo de log da KeyRota mostra qual regra foi escolhida e por que as de cima foram puladas: é o botão de pasta ao lado de Log, na janela principal.

### Pressiona cedo ou tarde demais

| O que você vê | Causa | O que fazer |
|---|---|---|
| Um feitiço fora do GCD espera o fim do GCD | Falta a flag O | Ligue Fora do GCD (O). |
| Um botão fora do GCD é pressionado antes de chegar o resultado do golpe anterior | A flag O pressiona na hora, no meio do GCD | Adicione Na janela da fila (Q): O + Q. |
| Uma macro cuja segunda linha usa o GCD não é executada por completo | A macro foi pressionada no meio do GCD | O + Q: a macro é pressionada no fim do GCD. |
| Uma regra fora do GCD mais abaixo não passa na frente de uma regra mais acima | É o comportamento esperado: prioridade estrita | Mova a regra para cima. |
| Depois de gastar, a rotação “fica parada” | Acúmulo de recursos: nenhuma regra é atendida | É normal; para gastar antes, baixe o limite de energia. |
| A rotação não pressiona nada enquanto você pressiona os seus próprios botões | A KeyRota dá a vez aos seus pressionamentos de habilidades | É normal. |

### Uma canalização é interrompida

- Ligue Canalização (C) no slot: durante a canalização, a KeyRota não pressiona nada e não pressiona o slot duas vezes no início.
- O jogo encerra algumas canalizações um pouco antes do último golpe, e um pressionamento logo depois do fim da canalização a interrompe. Adicione a aura da canalização às auras da rotação e a condição `Channel_aura.duration <= 8` a **cada grupo de cada regra**. Exemplo: [Proteção de canalização](https://keyrota.app/documentation/pt/patterns#channel).

### Não muda para AoE

1. O modo de alvos está em Auto (F2 no Windows, ⌃⇧T no macOS, em ciclo: Auto, Um, Vários)? No modo Um, as regras com `st == 0` ficam em silêncio.
2. As placas de identificação dos inimigos estão ativadas no jogo (V), sem ocultar os inimigos inferiores?
3. O raio do contador na página Geral é pelo menos igual ao raio da sua habilidade de AoE?
4. Só inimigos em combate: inimigos que ainda não estão em combate não são contados. Com grupos de inimigos que chegam um a um, a contagem pode ficar menor.
5. O limite da regra: `enemies >= 2` ou `>= 3`?
6. Depois de mudar o raio, monte e cole o perfil do Better Assistant de novo.

### O Burst não é acionado ou é acionado na hora errada

- `cd == 1` é **o botão Burst** (F3 no Windows, ⌃⇧B no macOS, o botão Burst no painel), e não a recarga de um feitiço. A recarga de um feitiço é `Slot.cd`.
- O Burst vem ligado por padrão. Desligue-o antes de um momento em que a recarga não deve ser gasta (imunidade, troca de fase) e ligue-o de novo quando chegar a hora.
- Se uma grande recarga depender de auras (DoTs no alvo), ela espera por elas. Verifique no log da KeyRota qual condição da regra não é atendida.
- Para o que só deve ser usado sob a recarga, verifique a aura da recarga (`Deathmark_DoT.up`), e não o botão Burst.

### Como calcular as porcentagens

- **Recursos e vida:** `valor / máximo × 100`. 175 de energia de 250 é `70`.
- **Pontos de combo de 7:** coloque o limite no meio entre os degraus: “pelo menos 5” é `>= 70`, e “no máximo 3” é `< 50`. [A tabela](https://keyrota.app/documentation/pt/conditions#resources).
- **Tempo restante de uma aura:** uma porcentagem da duração dessa aplicação. 30% é a janela de pandemia.
- **Recarga:** uma porcentagem da recarga total, sem o GCD. Para uma recarga de 2 minutos, 1% é 1,2 s.

### “Uma rotação com erro não é salva”

O construtor não salva uma rotação com erro: a KeyRota nunca executa uma rotação pela metade. A barra de status indica o local, por exemplo, “Regra 9, grupo 1: o grupo não tem condições”. Clique em Mostrar para abrir a regra. Causas comuns:

| Mensagem | O que fazer |
|---|---|
| o grupo não tem condições | Adicione uma condição ou exclua o grupo vazio. |
| nenhum slot selecionado | Escolha um slot em Pressionar. |
| flag Q: apenas junto com O | Ligue Fora do GCD (O) ou desligue Q. |
| nome desconhecido … | Um nome em uma condição não corresponde a nenhuma aura, slot ou recurso: verifique Nome no texto. |
| … é slot, mas era esperado buff | Uma propriedade de aura (`.up`, `.duration`) em um slot ou uma propriedade de slot (`.ready`, `.cd`) em uma aura. |
| o nome não pode ter aspas | Remova `"` do nome da rotação, do slot ou da aura. |

Todas as mensagens estão em [Erros](https://keyrota.app/documentation/pt/rotation-json#errors).

### Qual é a diferença entre `.oncd` e `.cd > 0`

`X.oncd`: o slot não está pronto por **qualquer** motivo: recarga, falta de recurso, alvo longe demais, slot não mostrado. `X.cd > 0`: uma recarga está em andamento. Para um feitiço com cargas, `.cd > 0` é possível com o slot pronto: há uma carga disponível, e a próxima está recarregando.

### Como escrever “não” e parênteses

O KRC não tem `not`, `!=` nem parênteses. “Não” é a condição par (`up`/`down`, `ready`/`oncd`, `glow`/`noglow`) ou o operador inverso (em vez de “não `>= 70`”, escreva `< 70`). “(A ou B) e C” são dois grupos: `A and C`, `B and C`. Mais detalhes: [“Não”, parênteses e OU](https://keyrota.app/documentation/pt/conditions#logic).

### Mais de 12 slots ou auras?

Não: uma rotação tem até 12 slots e até 12 auras, como o perfil do Better Assistant. As macros ajudam a economizar espaço (um botão, vários feitiços), e um mesmo slot pode aparecer em várias regras. O número de regras é ilimitado.

### Uma rotação com um talento que você não tem

Se um talento não foi escolhido, o feitiço não foi aprendido, o slot não fica pronto, e as regras dele são simplesmente puladas. Uma mesma rotação pode funcionar com builds de talentos diferentes: as regras dos feitiços ausentes ficam em silêncio.

### Como mover ou compartilhar uma rotação

- Exportar, na janela principal, salva o perfil com a rotação; Importar o carrega em outro computador.
- No construtor, Texto e JSON — Salvar… salva a rotação como `.json` ou `.txt`; para abri-la, use Novo — De um arquivo….
- O perfil do Better Assistant é montado de novo a partir dos slots e das auras da rotação: não é preciso repassá-lo à parte.

### Por que a KeyRota às vezes não pressiona nada

Com Ignorar o ícone principal ligado, quando nenhuma regra serve, a KeyRota espera. Em rotações que acumulam energia, isso é normal: com 5 ou mais pontos de combo, o finalizador espera a sua condição, e o gerador fica em silêncio. Se a espera parecer errada, verifique no log da KeyRota quais regras foram puladas e por quê.
