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

JSON da rotação

Atualizado em 18/10/2026

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 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
{
  "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#

CampoTipoObrigatórioPadrãoO que é
formatstringsim—Sempre "keyrota-rotation".
versioninteirosim—Sempre 1. Uma versão mais nova é recusada: “atualize a KeyRota”.
titlestringnão""O nome da rotação: a primeira linha do texto, o nome no log. Sem aspas duplas.
specIDinteiro de 0 a 100000não0A especialização do WoW; 0 = qualquer uma. Necessário para o perfil do Better Assistant.
ignoreMainIcontrue / falsenãotrueLigado: pressiona apenas pelas regras. Desligado: quando nenhuma regra é atendida, pressiona a sugestão do jogo.
enemiesobjetonão{"range": 8, "combatOnly": true}O contador de inimigos da condição enemies.
notesstring ou lista de stringsnão[]A descrição: linhas com # no início do texto.
resourceslista de strings e nullnão[]Os nomes de resource1…N, em ordem.
auraslistanão[]As auras buff1…12.
slotslistanão[]Os slots slot1…12.
ruleslistanão[]As regras, em ordem de prioridade.
footerstring ou lista de stringsnã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”).

ClasseEspecializaçãospecIDRecursos da especialização (resource3…)
GuerreiroArmas71Rage
GuerreiroFúria72Rage
GuerreiroProteção73Rage
PaladinoSagrado65Mana, Holy_Power
PaladinoProteção66Mana, Holy_Power
PaladinoRetribuição70Mana, Holy_Power
CaçadorDomínio das Feras253Focus
CaçadorPrecisão254Focus
CaçadorSobrevivência255Focus
LadinoAssassinato259Energy, Combo_Points
LadinoFora da Lei260Energy, Combo_Points
LadinoSubterfúgio261Energy, Combo_Points
SacerdoteDisciplina256Mana, Insanity
SacerdoteSagrado257Mana, Insanity
SacerdoteSombra258Mana, Insanity
Cavaleiro da MorteSangue250Runes, Runic_Power
Cavaleiro da MorteGélido251Runes, Runic_Power
Cavaleiro da MorteProfano252Runes, Runic_Power
XamãElemental262Mana, Maelstrom
XamãAperfeiçoamento263Mana, Maelstrom
XamãRestauração264Mana, Maelstrom
MagoArcano62Mana, Arcane_Charges
MagoFogo63Mana, Arcane_Charges
MagoGélido64Mana, Arcane_Charges
BruxoSuplício265Mana, Soul_Shards
BruxoDemonologia266Mana, Soul_Shards
BruxoDestruição267Mana, Soul_Shards
MongeMestre Cervejeiro268Energy, Stagger
MongeTecelão da Névoa270Mana
MongeAndarilho do Vento269Energy, Chi
DruidaEquilíbrio102Mana, Astral_Power
DruidaFeral103Energy, Combo_Points
DruidaGuardião104Rage
DruidaRestauração105Mana, Astral_Power
Caçador de DemôniosDevastação577Fury
Caçador de DemôniosVingança581Fury
Caçador de DemôniosDevorador1480Fury
ConjuranteDevastação1467Mana, Essence
ConjurantePreservação1468Mana, Essence
ConjuranteAprimoramento1473Mana, 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}
CampoTipoPadrãoO que é
rangeinteiro de 1 a 1008O raio do contador de inimigos, em metros.
combatOnlytrue / falsetrueContar só os inimigos que já estão em combate.

A condição enemies lê esse contador (veja Inimigos por perto). 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: 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, 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.

CampoTipoObrigatórioPadrãoO que é
ninteiro de 1 a 12sim—O número da aura (buffN). Cada número aparece uma vez.
aliasstringnãoa partir de labelO nome nas condições. Veja Nomes.
labelstringnão""O nome exibido. Sem aspas duplas ". É prático incluir o ID entre colchetes: "Garrote no alvo [703]".
spellinteiro de 0 a 100000000não0O ID da aura no Wowhead. 0 = não definido: a aura não entra no perfil do Better Assistant e fica desconhecida.
notestringnã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.

CampoTipoObrigatórioPadrãoO que é
ninteiro de 1 a 12sim—O número do slot (slotN).
aliasstringnãoa partir de labelO nome nas regras e nas condições.
labelstringnão""O nome do feitiço. Sem aspas duplas ".
spellinteiro de 0 a 100000000não0O ID do feitiço no Wowhead. O Better Assistant o usa para colocar o feitiço no slot.
notestringnão""Um comentário no fim da linha de declaração.
show"target" / "combat"não"target"Quando o Better Assistant mostra o slot.
manualtrue / falsenãofalseFlag M.
channeltrue / falsenãofalseFlag C.
offGcdtrue / falsenãofalseFlag O.
queuetrue / falsenãofalseFlag 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.

FlagsNo JSONComo é pressionadoExemplo
nenhumatodas falseNa janela da fila, no fim do GCD: o feitiço é lançado assim que o GCD termina.Mutilar, Envenenar
M"manual": trueNunca. 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": trueComo 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": trueNa hora, mesmo no meio do GCD.Sorte Grande (381989)
O + Q"offGcd": true, "queue": trueFora 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": trueUma canalização que começa fora do GCD: na hora e depois nada até a canalização terminar.Raro
C + O + Qas trêsO mesmo, na janela da fila.Raro
Q sem O"queue": trueErro: “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.

CampoTipoObrigatórioPadrãoO que é
usestringsim—O slot a pressionar: o alias dele ou slotN.
namestringnão""O nome da ação, exibido no log. No texto, é o comentário da linha use.
notestring ou lista de stringsnão[]Notas acima da regra (linhas com # antes de use).
whenlista de gruposnã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#

CampoTipoObrigatórioO que é
alllista de strings não vaziasimAs condições do grupo; todas precisam ser atendidas (E).
commentstringnãoO 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.

  • 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#

OndeObrigatórioValores padrão
Arquivoformat, versiontitle "", specID 0, ignoreMainIcon true, enemies {"range": 8, "combatOnly": true}, listas vazias
Auranalias a partir de label, label "", spell 0
Slotnshow "target", todas as flags false, spell 0
Regrausename "", note [], when [] (sem condições)
Grupoall (não vazio)comment ""

Limites#

O quêLimite
Auras12 (n de 1 a 12)
Slots12 (n de 1 a 12)
Grupos OU em uma regra16
Condições E em um grupo16
Regrassem limite
Número em uma condiçãointeiro de 0 a 100
enemies.rangede 1 a 100
spellde 0 a 100000000
specIDde 0 a 100000
Recursosaté 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:

MensagemCausa
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 1Sem 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..12n fora do intervalo.
slots[3]: o número 4 já está em usoDois 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 offGcdqueue: 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 vaziaUm grupo vazio ou sem all.
rules[0].when[0].all[2]: condição vazia ou com # ou quebra de linhaUma string de condição vazia ou com #.
….spell: era esperado um número inteiroTipo 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ódigoExemplo de mensagemCausa
unknown_refnome desconhecido FooNão há aura, slot nem recurso com esse nome.
unknown_refresource5 não declaradoO recurso não está declarado em resources.
wrong_kindGarrote é slot, mas era esperado buffUma propriedade de aura em um slot (Garrote.up) ou o contrário.
bad_conditionnã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 targetSó o alvo tem distância.
value_rangeo valor 120 está fora de 0..100Um número maior que 100. Não existem números negativos nem fracionários.
toggle_value"cd >= 1": alternador só aceita == 0 ou == 1Um alternador só é comparado com == e 0 ou 1.
bad_aliasnome inválido Fan-of-KnivesCaracteres inválidos em um nome.
reserved_aliaso nome cd é reservadoUm nome reservado.
duplicate_aliaso nome Garrote já foi declaradoDuas auras, slots ou recursos com o mesmo nome.
index_rangebuff13: número fora de 1..12Uma referência a um número maior que 12.
too_many_groupsmais de 16 grupos ORMais de 16 grupos em uma regra.
too_many_conditions17 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
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:

Texto KRC
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#

Texto KRC
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 textoNo JSON
rotation "…"title
Linhas # … antes do primeiro usenotes
Um comentário no fim de uma linha buffN / slotNO 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 useO name da regra
Um comentário no fim de uma linha de condiçõesO comment do grupo
Linhas # … depois da última regrafooter
— (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 (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:

Texto
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.