# KeyRota: rotaciones avanzadas (KRC), documentación

Fuente: https://keyrota.app/documentation/es/advanced (Actualizado el 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/es/advanced -->

## Rotaciones avanzadas (KRC)

> [!TIP] Te recomendamos crear la rotación con un agente de IA
> Es mucho más rápido y cómodo que configurarla a mano. Cuanto más avanzado sea el agente de IA, más se ajustará la rotación a lo que necesitas desde el primer intento. Te recomendamos los modelos más recientes de Anthropic y OpenAI con el nivel de razonamiento «Extra (xhigh)». Cómo hacerlo: [Creación con un agente de IA](https://keyrota.app/documentation/es/ai).

Una rotación avanzada es tu propia lista de reglas: qué habilidad pulsar y cuándo. En combate, KeyRota comprueba las reglas y pulsa el primer botón que encaja. El formato y el motor de estas rotaciones se llaman **KRC** (KeyRota Customization).

### Básica o avanzada

| | Blizzard (básica) | Avanzada (KRC) |
|---|---|---|
| Quién elige el botón | El juego: la recomendación de Blizzard | Tus reglas |
| Configuración | Ninguna | Ranuras, auras y reglas: en el constructor o desde un archivo |
| Especializaciones | Cualquier especialización de daño (DPS cuerpo a cuerpo y a distancia) y de tanque | La especialización para la que está escrita la rotación |
| Burst y modo de objetivos | No se usan | Los botones «Burst» y «Objetivos»; las reglas deciden qué significan |
| Cuándo elegirla | Para empezar rápido con cualquier personaje | Necesitas una prioridad exacta: DoT, acumulación de recursos, tiempos de reutilización en una ventana de burst, tu propia lógica para varios objetivos |

En el bloque «Rotación» de la aplicación, el perfil de Blizzard aparece primero y tus rotaciones debajo, en el grupo «Rotaciones propias». Puedes cambiar de una a otra en cualquier momento mientras la rotación esté detenida.

### De qué se compone una rotación

| Parte | Qué es | Cuántas |
|---|---|---|
| **Ranuras** | Los botones de la rotación. La ranura N de la rotación es la ranura N del perfil de Better Assistant. | hasta 12 |
| **Auras** | Tus beneficios y tus perjuicios sobre el objetivo, por ID de hechizo. El aura N de la rotación es el aura N de la lista de Better Assistant. | hasta 12 |
| **Recursos** | La salud del jugador y del objetivo, y los recursos de la especialización: energía, puntos de combo, ira, maná y otros. Todos los valores van en porcentaje. | según la especialización |
| **Combate** | El número de enemigos cerca y la distancia al objetivo. | 2 |
| **Interruptores** | Los botones del panel de ajustes rápidos: modo de objetivos (dos indicadores en las reglas: `aoe` y `st`), «Burst», «Cura / defensa», «En el suelo», «Movimiento». | 6 |
| **Reglas** | Qué ranura pulsar y en qué condiciones. El orden de las reglas es la prioridad. | sin límite |

Una regla se compone de grupos de condiciones. La regla se cumple si se cumple **al menos uno** de sus grupos (O), y un grupo se cumple si se cumplen **todas** sus condiciones (Y). Una regla sin grupos se cumple siempre.

*Texto KRC:*

```text
use Envenom when  # Envenenar
	Combo_Points >= 70 and Envenom_Buff.down  # 5+ puntos de combo, sin beneficio
	or
	Combo_Points >= 70 and Energy >= 70  # 5+ puntos de combo, mucha energía
```

*JSON:*

```json
{
  "use": "Envenom",
  "name": "Envenenar",
  "when": [
    {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "5+ puntos de combo, sin beneficio"},
    {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "5+ puntos de combo, mucha energía"}
  ]
}
```


Se lee así: «Pulsa Envenenar si tienes 5 puntos de combo o más y no tienes el beneficio de Envenenar, **o** si tienes 5 puntos de combo o más y al menos un 70 % de energía». Por qué 5 puntos de combo son `70` se explica en [Recursos](https://keyrota.app/documentation/es/conditions#resources).

### Cómo elige KeyRota el botón

1. Las reglas se comprueban **de arriba abajo**, en el orden de la lista.
2. En cada regla se comprueban sus grupos. Si no se cumple ninguno, KeyRota pasa a la regla siguiente.
3. Si la regla se cumple, pero su hechizo **no se puede usar** en ese momento (reutilización, falta de recurso, objetivo demasiado lejos, sin objetivo, hechizo no aprendido), KeyRota también pasa a la regla siguiente. No necesitas una condición para comprobar si la propia ranura está lista.
4. La primera regla que se cumple y cuyo hechizo se puede usar queda **elegida**. El tiempo de reutilización global (GCD) no cambia la elección: una regla que espera al final del GCD sigue elegida y las reglas de debajo no se le adelantan.
5. Si no encaja ninguna regla: con «Ignorar el icono principal» activado, KeyRota espera; con la opción desactivada, pulsa la recomendación del juego.

Esperar es normal. Por ejemplo, una rotación que acumula energía a menudo no pulsa nada durante medio segundo o un segundo, hasta que hay energía suficiente para una regla superior.

### Un valor desconocido nunca permite una regla

A veces KeyRota no conoce un valor: un aura no se lee (su ID no está en el perfil de Better Assistant), no hay objetivo (la salud del objetivo y la distancia a él son desconocidas) o no se han contado los enemigos. Una condición que lee un valor desconocido es **falsa**: tanto `X.up` como `X.down`, tanto `TargetHP >= 50` como `TargetHP < 50`. Un valor desconocido solo puede impedir una regla, nunca permitirla: es mejor saltarse una pulsación que pulsar algo incorrecto.

> [!TIP]
> Si una regla nunca se activa, comprueba primero que todas las auras que lee están en el perfil de Better Assistant con el ID correcto. Más información en [Preguntas frecuentes y solución de problemas](https://keyrota.app/documentation/es/faq#never-fires).

### Cuándo se pulsa un botón

- **Un hechizo normal** (que activa el GCD) se pulsa en la ventana de cola de hechizos, justo al final del GCD: el juego lo lanza en cuanto termina el GCD.
- **Las marcas de ranura** cambian esto: «Solo manual (M)», «Canalización (C)», «Fuera del GCD (O)», «En la ventana de cola (Q)». Qué hace cada una y cómo combinarlas se explica en [Marcas de ranura](https://keyrota.app/documentation/es/rotation-json#flags).
- **Canalizaciones.** Mientras dura una canalización, KeyRota no pulsa nada para no interrumpirla. Durante un **lanzamiento**, KeyRota espera hasta que solo quede la ventana de cola.
- **Tus propias pulsaciones.** Cuando pulsas tú la tecla de una habilidad, KeyRota se aparta y no compite contigo.

### Inicio rápido

Si todavía no has instalado KeyRota, empieza por los [primeros pasos](https://keyrota.app/documentation/es/start).

1. En KeyRota, abre «Rotación» — «Nuevo» — «En el constructor…».
2. En la página «General», elige la especialización y ponle nombre a la rotación.
3. En la página «Ranuras», añade los botones y los ID de sus hechizos; en la página «Auras», los beneficios y perjuicios que leerán las reglas.
4. En la página «Reglas», añade las reglas por orden de prioridad.
5. En la página «General», haz clic en «Crear desde ranuras y auras» y después en «Copiar». En el juego: `/ba` — pestaña Profile — pega la cadena — Apply.
6. Coloca los hechizos de las ranuras en tus barras de acción y asígnales teclas (también sirve una macro con `#showtooltip`).
7. Haz clic en «Guardar», elige el perfil en la lista e inicia la rotación con F1 (en macOS, ⌃⇧Espacio).

Cada botón, con un ejemplo completo, se explica en [Constructor de rotación](https://keyrota.app/documentation/es/editor).

### En esta sección

- [Constructor de rotación](https://keyrota.app/documentation/es/editor) — todas las páginas y botones de la ventana, y una rotación creada paso a paso.
- [Rotación en JSON](https://keyrota.app/documentation/es/rotation-json) — cada campo del formato, marcas de ranura, nombres, límites, errores y el texto KRC.
- [Condiciones](https://keyrota.app/documentation/es/conditions) — todos los tipos de condición, operadores, porcentajes y valores desconocidos.
- [Ejemplos de patrones](https://keyrota.app/documentation/es/patterns) — DoT, acumulación, generador y gasto, AoE, Burst, defensa y otras plantillas.
- [Creación con un agente de IA](https://keyrota.app/documentation/es/ai) — una plantilla de prompt, análisis de logs y comprobación del resultado.
- [Preguntas frecuentes y solución de problemas](https://keyrota.app/documentation/es/faq) — por qué una regla no se activa, pulsa demasiado pronto o demasiado tarde o corta una canalización.

---

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

## Constructor de rotación

El constructor de rotación es la ventana de KeyRota en la que montas una rotación avanzada sin escribirla a mano: ranuras con marcas, auras y reglas, con el texto KRC y el JSON al lado. La documentación es la misma para Windows y macOS; las capturas se hicieron en Windows. Muestran la rotación de banda de Asesinato de los [ejemplos](https://keyrota.app/documentation/es/patterns#example-files).

### Cómo abrirlo

- **Tu rotación.** Selecciona el perfil en el bloque «Rotación» de la ventana principal y haz clic en «Configurar».
- **Una rotación nueva.** «Nuevo» — «En el constructor…». La especialización se toma del juego o del perfil actual. La rotación se convierte en un perfil la primera vez que la guardas.
- **Desde un archivo o el portapapeles.** «Nuevo» — «Desde un archivo…» admite texto KRC (`.txt`), JSON de rotación y archivos de perfil de KeyRota; «Nuevo» — «Desde el portapapeles» toma lo mismo del portapapeles. Abre el perfil nuevo en el constructor con «Configurar».

![Una rotación nueva en el constructor: la página General, todavía sin ranuras ni reglas](https://keyrota.app/documentation/img/es/editor-new.png)

Para un **perfil de Blizzard**, el constructor solo muestra el nombre y el retraso de pulsación: el botón principal lo elige el juego. «Crear una rotación propia» crea un perfil nuevo con una rotación avanzada; el perfil de Blizzard sigue en la lista.

![Un perfil de Blizzard en el constructor: el nombre del perfil, el retraso de pulsación y «Crear una rotación propia»](https://keyrota.app/documentation/img/es/editor-blizzard.png)

#### La ventana

- **A la izquierda**, las páginas: «General», «Ranuras», «Auras», «Reglas» (con el número de reglas) y «Texto y JSON». Encima, «Rotación propia» y la especialización elegida.
- **A la derecha**, la página seleccionada.
- **Abajo**, la barra de estado: si la rotación es válida («Rotación válida: 15 reglas, 11 ranuras, 10 auras»), si hay cambios sin guardar y, si hay un error, dónde está, con un botón «Mostrar». A la derecha, «Cerrar» y «Guardar».

No se aplica nada hasta que haces clic en «Guardar» (en Windows, también Ctrl+S).

### General

![La página General: perfil, especialización, nombre de la rotación, Ignorar el icono principal, retraso de pulsación](https://keyrota.app/documentation/img/es/editor-general.png)

| Control | Qué hace |
|---|---|
| **Nombre del perfil** | El nombre del perfil en la lista de rotaciones de la ventana principal. |
| **Especialización** | Define los recursos de la rotación (energía, puntos de combo, ira…) y la clase y especialización del perfil de Better Assistant. Al cambiarla se sustituyen los recursos, salvo que las reglas lean recursos de la especialización anterior (la salud no cuenta). |
| **Nombre de la rotación** | La primera línea del texto KRC (`rotation "…"`), que aparece en el registro de KeyRota. Sin comillas dobles. Es un buen sitio para la versión: «Asesinato v1.3». |
| **Ignorar el icono principal** | Activo: KeyRota solo pulsa según las reglas; si no se cumple ninguna, espera. Inactivo: en ese caso pulsa la recomendación del juego. En las rotaciones propias suele estar activo: esperar (por ejemplo, para acumular energía) es normal. |
| **Retraso de pulsación** | Una pausa antes de cada pulsación, como haría una persona: «No», «Fijo» (un intervalo de 0–1000 ms) o «Aleatorio» (un rango de 0–1000 ms). «También para interrupciones y defensa» aplica la misma pausa a esas pulsaciones. |

![La página General más abajo: el bloque Better Assistant, el radio del contador de enemigos, Solo enemigos en combate y la descripción](https://keyrota.app/documentation/img/es/editor-general-ba.png)

| Control | Qué hace |
|---|---|
| **Perfil: …** | Un resumen de la cadena del perfil de Better Assistant: especialización, número de hechizos y de auras. |
| **Crear desde ranuras y auras** | Crea la cadena del perfil de Better Assistant a partir de los ID de hechizo de las ranuras, el ajuste «Visible en Better Assistant» de cada ranura, las auras en orden, la especialización, el radio y «Solo enemigos en combate». Si ya hay pegado un perfil de la misma especialización, se conservan sus demás ajustes. |
| **Desde el portapapeles** | Pega una cadena de perfil ya hecha. Su especialización debe coincidir con la de la rotación. |
| **Copiar** | Copia la cadena para pegarla en el juego. |
| **Radio del contador de enemigos, metros** | 1–100; 8 de forma predeterminada. Lo usa la condición «Enemigos cerca» (`enemies`). |
| **Solo enemigos en combate** | Activo de forma predeterminada: no se cuentan los enemigos que aún no están en combate. |
| **Descripción** | Notas sobre la rotación: líneas que empiezan por `#` en el texto KRC. No afectan al funcionamiento de la rotación. |

Debajo de los botones aparecen avisos: qué ranuras usadas en las reglas no tienen ID de hechizo (no estarán en el perfil de Better Assistant) y qué no coincide con la rotación en un perfil ya pegado.

> [!IMPORTANT]
> En el perfil de Better Assistant, las auras van seguidas, empezando por la primera. Si el aura 3 no tiene ID y el aura 4 sí, el perfil no se crea: «El aura 3 no tiene número de hechizo». Rellena el ID o renumera las auras.

#### El perfil de Better Assistant en el juego

La ranura N de la rotación es la ranura N de Better Assistant, y el aura N es el aura N de su lista. La cadena del perfil coloca allí tus ranuras y auras en el orden correcto.

1. En la página «General», haz clic en «Crear desde ranuras y auras» y después en «Copiar».
2. En el juego, escribe `/ba`, abre la pestaña **Profile**, pega la cadena, haz clic en **Apply** y confirma.
3. Después de cualquier cambio en las ranuras o las auras (ID, orden, «Con objetivo» / «En combate»), vuelve a crear y a pegar el perfil.

### Ranuras

![La página Ranuras: los 12 puestos a la izquierda; a la derecha, la ranura 10 seleccionada, Esfumarse, con el ID 1856](https://keyrota.app/documentation/img/es/editor-slots.png)

A la izquierda están los 12 puestos: número, nombre, ID de hechizo, marcas («fuera del GCD, en cola») y «sin usar» cuando la ranura no aparece en ninguna regla. Un puesto vacío indica «Vacía»; selecciónalo para que aparezca el botón «Añadir ranura».

| Control | Qué hace |
|---|---|
| **Nombre** | El nombre del hechizo en el juego. Se ve en la lista de reglas y en el registro. |
| **ID del hechizo** | El número del enlace de Wowhead: en `wowhead.com/spell=1856/vanish` es `1856`. Better Assistant lo usa para poner el hechizo en esta ranura. |
| **Visible en Better Assistant** | «Con objetivo» o «En combate». La ranura solo está lista cuando Better Assistant la muestra. «En combate» es para sanación y habilidades defensivas que deben funcionar sin objetivo. |
| **Cómo pulsar** | Cuatro interruptores de marcas; consulta la tabla de abajo. |
| **Nombre en el texto** | El nombre de la ranura en las reglas y en el texto KRC: letras, números y `_`, sin espacios. |
| **Comentario** | Un comentario al final de la línea de declaración en el texto. |
| **Se usa en las reglas** | Las reglas que pulsan o leen la ranura. «Quitar ranura» solo está disponible cuando la ranura no se usa. |

Para que KeyRota pulse una ranura, su hechizo debe estar en una barra de acción del juego con una tecla asignada: KeyRota toma la tecla de tus barras. También sirve una macro con `#showtooltip Nombre`. Una ranura sin tecla nunca se pulsa.

#### Cómo pulsar: marcas

![Los interruptores de Cómo pulsar de la ranura Esfumarse: Fuera del GCD (O) y En la ventana de cola (Q) están activados](https://keyrota.app/documentation/img/es/editor-slot-flags.png)

| Interruptor | Qué hace | Cuándo usarlo |
|---|---|---|
| sin marcas | La ranura se pulsa como un hechizo normal: al final del tiempo de reutilización global, en la ventana de cola. | Casi todos los hechizos que activan el GCD. |
| **Solo manual (M)** | KeyRota nunca pulsa esta ranura por sí sola y omite sus reglas. Si pulsas tú su tecla, la rotación se pausa. | Habilidades que solo quieres pulsar tú. |
| **Canalización (C)** | Mientras este hechizo se canaliza, KeyRota no pulsa nada ni lo interrumpe. | Hechizos canalizados, como Asesinato múltiple. |
| **Fuera del GCD (O)** | No espera al tiempo de reutilización global: se pulsa al momento, incluso en mitad del GCD. | Hechizos fuera del GCD, como Suerte prolongada. |
| **En la ventana de cola (Q)** | Solo junto con «Fuera del GCD»: se pulsa al final del GCD, en la ventana de cola de hechizos. | Macros cuya segunda línea activa el GCD (Subidón de adrenalina + Asesinato múltiple) y botones que necesitan el resultado del golpe anterior (Esfumarse tras Perdición de Reyes). |

Todas las combinaciones de marcas y su JSON se explican en [Marcas de ranura](https://keyrota.app/documentation/es/rotation-json#flags).

### Auras

![La página Auras: el aura 1, Garrote en el objetivo [703], ID 703, nombre en el texto Garrote_DoT, se usa en las reglas 3, 4, 5, 7, 8 y 10](https://keyrota.app/documentation/img/es/editor-auras.png)

Las auras son tus beneficios y tus perjuicios sobre el objetivo que leen las reglas. El aura N de la rotación es el aura N de la lista de Better Assistant.

| Control | Qué hace |
|---|---|
| **Nombre** | El nombre del aura; se ve en las reglas. Resulta práctico con el ID entre corchetes: «Garrote en el objetivo [703]». |
| **ID del hechizo** | El número del aura en Wowhead. Better Assistant la busca entre tus beneficios y tus perjuicios sobre el objetivo. |
| **Nombre en el texto**, **Comentario** | Igual que en las ranuras. |
| **Se usa en las reglas** | Dónde se lee el aura. «Quitar aura» solo funciona con un aura que no se usa. |

> [!NOTE]
> El ID de un aura y el del hechizo que la aplica pueden ser distintos. El hechizo Esfumarse es `1856` y el beneficio que da es `11327`; Sigilo es `1784`, y Sigilo con el talento Subterfugio es `115191`. Comprueba en Wowhead el ID del propio beneficio o perjuicio.

Solo se ven **tus** auras: los beneficios que te aplicas tú y los perjuicios que aplicas tú al objetivo. Las reglas no ven los beneficios de otros jugadores ni los perjuicios que otros jugadores aplican al objetivo.

### Reglas

![La página Reglas: 15 reglas a la izquierda; a la derecha, la regla 4, Marca letal, con su grupo de condiciones](https://keyrota.app/documentation/img/es/editor-rules.png)

Las reglas se comprueban de arriba abajo: KeyRota pulsa la primera que se cumple y cuyo hechizo se puede lanzar; si no se puede (reutilización, recurso, alcance), mira la siguiente.

**La barra de herramientas sobre la lista:**

| Botón | Qué hace |
|---|---|
| **+** | Una regla nueva debajo de la seleccionada. Pulsa la primera ranura y todavía no tiene condiciones. |
| **Duplicar** | Una copia de la regla, justo debajo. |
| **Papelera** | Elimina la regla. |
| **Subir**, **Bajar** | Mueve la regla hacia arriba (se comprueba antes) o hacia abajo (se comprueba después). |

Cada regla de la lista muestra su número (la prioridad), la ranura, el nombre y el número de grupos; una regla con un error lleva una marca roja.

**La regla seleccionada:**

| Control | Qué hace |
|---|---|
| **Pulsar** | Qué ranura pulsar cuando se cumple la regla. |
| **Nombre** | Se ve en el registro cuando la regla se activa. |
| **Descripción** | Notas sobre la regla en el texto KRC. |
| **Cuándo pulsar** | Los grupos de condiciones: la regla se cumple si se cumple al menos un grupo (O); un grupo, si se cumplen todas sus condiciones (Y). |

![Los grupos de condiciones de la regla Ruptura: el grupo 1 y el grupo 2, separados por O](https://keyrota.app/documentation/img/es/editor-rule-groups.png)

Cada grupo tiene «Grupo N», un cuadro «Comentario del grupo» y los botones «Duplicar grupo» y «Eliminar grupo». Una fila de condición tiene **qué comprobar**, la **propiedad**, la **comparación** y el **número**; la cruz quita la condición. «+ Condición» añade una condición al grupo y «+ Grupo (O)», un grupo nuevo. Un grupo admite hasta 16 condiciones y una regla, hasta 16 grupos: al llegar al límite, los botones se desactivan. Una regla sin grupos indica «Sin condiciones: la regla se activa siempre que se pueda lanzar el hechizo».

| Qué comprobar | Propiedades | En el texto KRC |
|---|---|---|
| **Auras** (cada aura de la rotación) | presente, ausente, restante %, acumulaciones | `Garrote_DoT.up`, `.down`, `.duration <= 30`, `.stacks >= 3` |
| **Ranuras** (cada ranura) | listo, en reutilización, reutilización %, cargas, resaltado, no resaltado | `Kingsbane.ready`, `.oncd`, `.cd <= 3`, `.charges >= 2`, `.glow`, `.noglow` |
| **Recursos** | salud del jugador y del objetivo, recursos de la especialización, % | `PlayerHP <= 40`, `Energy >= 70` |
| **Combate**: Enemigos cerca | un número | `enemies >= 3` |
| **Combate**: Distancia al objetivo | metros | `target.distance <= 8` |
| **Panel de ajustes rápidos** | activo, inactivo | `aoe == 1`, `st == 1`, `cd == 1`, `defensives == 1`, `ground_spells == 1`, `movement == 1` |

Comparaciones: `<`, `≤`, `=`, `≥`, `>`; el número va de 0 a 100. Una condición nueva empieza como «presente» para la primera aura; cuando cambias qué comprobar, la propiedad y el número vuelven a sus valores predeterminados (`≥ 50` para un recurso, `≥ 2` para los enemigos, `≤ 8` para la distancia). Todas las condiciones en detalle: [Condiciones](https://keyrota.app/documentation/es/conditions).

### Errores y la barra de estado

![Un error en la regla 9: el grupo 1 sin condiciones aparece con borde rojo; la barra de estado indica «Regla 9, grupo 1: el grupo no tiene condiciones» con Mostrar](https://keyrota.app/documentation/img/es/editor-problem.png)

- **En verde**: «Rotación válida: …», sin errores; se puede guardar.
- **En rojo** se indica el lugar: «Regla 9, grupo 1: el grupo no tiene condiciones». «Mostrar» abre ese lugar. La regla queda marcada en la lista y el grupo, con borde rojo.
- Una rotación con errores no se guarda: «Una rotación con errores no se guarda: corrige lo que se indica abajo».
- Mientras la rotación está en marcha no se puede guardar: «Detén la rotación para guardar».

### Texto y JSON

![La página Texto y JSON en modo Texto KRC: el principio del texto de la rotación, con la descripción y las declaraciones buff1–buff7](https://keyrota.app/documentation/img/es/editor-text.png)

![La página Texto y JSON en modo JSON: el principio del JSON de la rotación, con format, version, title, specID, ignoreMainIcon, enemies y notes](https://keyrota.app/documentation/img/es/editor-json.png)

| Control | Qué hace |
|---|---|
| **Texto KRC / JSON** | Cambia la vista. |
| **Copiar** | Copia todo el texto o todo el JSON. |
| **Pegar** | Sustituye la rotación por el contenido del portapapeles: texto KRC, JSON de rotación o un perfil de KeyRota. |
| **Abrir…** | Carga una rotación desde un archivo `.txt` o `.json`. |
| **Guardar…** | Guarda la vista actual en un archivo: el texto como `.txt` y el JSON como `.json`. |

Un cambio en el cuadro se aplica al momento si no tiene errores; si hay un error, aparece debajo del cuadro y las demás páginas conservan la última versión válida.

**Qué guarda el texto y qué solo guarda el JSON.** El texto KRC no incluye los ID de hechizo, las marcas de ranura, «Con objetivo» / «En combate», la especialización, «Ignorar el icono principal» ni los ajustes del contador de enemigos. Cuando editas el texto, estos datos se quedan en las ranuras y auras con el mismo número. El JSON lo guarda todo. Cuando pegas o abres una versión nueva de la rotación, las ranuras y auras con el mismo número conservan sus ID, su visibilidad y sus marcas si la versión nueva no los trae.

### Guardar y cerrar

- «Guardar» (en Windows, también Ctrl+S) escribe la rotación en el perfil; el botón muestra «Guardado» durante un momento. Una rotación nueva se convierte en un perfil y queda seleccionada en la lista.
- Si cierras con cambios sin guardar, aparece «¿Guardar los cambios?»: «Guardar», «No guardar» o «Cancelar». Lo mismo ocurre al cerrar KeyRota.
- «Exportar» en la ventana principal guarda el perfil con su rotación como JSON; «Importar» admite tanto un perfil de KeyRota como un JSON de rotación suelto.

### Ejemplo: una rotación desde cero

Vamos a crear una pequeña rotación de Asesinato: dos sangrados (Garrote y Ruptura), un generador (Mutilar), un gasto (Envenenar), una defensa (Vial carmesí con un 40 % de salud o menos) y una reutilización en el botón Burst (Marca letal).

**1. Perfil nuevo.** «Rotación» — «Nuevo» — «En el constructor…».

**2. General.** Nombre del perfil: «Asesinato: ejemplo». Especialización: Asesinato (los recursos pasan a ser `PlayerHP`, `TargetHP`, `Energy` y `Combo_Points`). Nombre de la rotación: «Asesinato: ejemplo v1». Ignorar el icono principal: activo.

**3. Ranuras.** Para cada fila de la tabla: selecciona el puesto a la izquierda, haz clic en «Añadir ranura» y rellena «Nombre», «ID del hechizo» y «Nombre en el texto»; para Vial carmesí, elige «En combate». No hace falta ninguna marca.

| Ranura | Nombre | ID | Nombre en el texto | Visible en Better Assistant |
|---|---|---|---|---|
| 1 | Garrote | 703 | `Garrote` | Con objetivo |
| 2 | Ruptura | 1943 | `Rupture` | Con objetivo |
| 3 | Envenenar | 32645 | `Envenom` | Con objetivo |
| 4 | Mutilar | 1329 | `Mutilate` | Con objetivo |
| 5 | Marca letal | 360194 | `Deathmark` | Con objetivo |
| 6 | Vial carmesí | 185311 | `Crimson_Vial` | En combate |

**4. Auras.** Lo mismo en la página «Auras»:

| Aura | Nombre | ID | Nombre en el texto |
|---|---|---|---|
| 1 | Garrote en el objetivo [703] | 703 | `Garrote_DoT` |
| 2 | Ruptura en el objetivo [1943] | 1943 | `Rupture_DoT` |
| 3 | Envenenar [32645] | 32645 | `Envenom_Buff` |
| 4 | Marca letal en el objetivo [360194] | 360194 | `Deathmark_DoT` |

**5. Reglas.** En la página «Reglas», haz clic en «+», elige la ranura en «Pulsar» y escribe el «Nombre». «+ Grupo (O)» añade un grupo con una condición predeterminada: cambia qué comprobar, la propiedad, la comparación y el número. «+ Condición» añade la siguiente condición al mismo grupo. Las reglas, en este orden:

| # | Pulsar | Grupos (O), condiciones de un grupo (Y) |
|---|---|---|
| 1 | Vial carmesí | Cura / defensa activo, Salud del jugador ≤ 40 |
| 2 | Marca letal | Burst activo, Garrote en el objetivo presente, Ruptura en el objetivo presente, Envenenar presente |
| 3 | Garrote | (1) Garrote en el objetivo ausente; (2) Garrote en el objetivo presente, restante ≤ 30 % |
| 4 | Ruptura | (1) Puntos de combo ≥ 70, Ruptura en el objetivo ausente; (2) Puntos de combo ≥ 70, Ruptura en el objetivo presente, restante ≤ 30 % |
| 5 | Envenenar | (1) Puntos de combo ≥ 70, Envenenar ausente; (2) Puntos de combo ≥ 70, Envenenar presente, restante ≤ 20 %; (3) Puntos de combo ≥ 70, Energía ≥ 70; (4) Puntos de combo ≥ 70, Marca letal en el objetivo presente |
| 6 | Mutilar | Puntos de combo < 70 |

Por qué:
- **La defensa primero**: con poca salud, Vial carmesí importa más que el daño. Solo se activa cuando «Cura / defensa» está activado en el panel de ajustes rápidos.
- **Marca letal con Burst**: `cd == 1` es el botón Burst (F3 en Windows, ⌃⇧B en macOS), no el tiempo de reutilización del hechizo. Si desactivas Burst, Marca letal espera.
- **Sangrados con la ventana de pandemia**: a un aura ausente le queda 0, así que la renovación necesita dos grupos: «sin sangrado» y «sangrado activo al que le queda ≤ 30 %».
- **5 puntos de combo = 70**: de 7 puntos de combo, 5 son el 71 %; el umbral `70` funciona con cualquier redondeo. La tabla está en [Recursos](https://keyrota.app/documentation/es/conditions#resources).
- **Mutilar al final** y solo con menos de 5 puntos de combo, para no desperdiciar energía mientras Envenenar espera a que se cumplan sus condiciones.

**6. Comprobación.** La barra de estado debe indicar «Rotación válida: 6 reglas, 6 ranuras, 4 auras». Abre «Texto y JSON» para ver lo mismo que aparece abajo.

**7. El perfil de Better Assistant.** «General» — «Crear desde ranuras y auras» — «Copiar»; en el juego, `/ba` — Profile — pega — Apply.

**8. Teclas.** Coloca los seis hechizos en tus barras de acción y asígnales teclas.

**9. Ponla en marcha.** Haz clic en «Guardar», cierra la ventana, elige el perfil «Asesinato: ejemplo» e inicia la rotación (F1 en Windows, ⌃⇧Espacio en macOS). En el panel de ajustes rápidos, activa «Cura / defensa» si quieres usar Vial carmesí; el botón Burst activa y desactiva Marca letal.

*Texto KRC:*

```text
rotation "Asesinato: ejemplo v1"

# Ejemplo de la documentación de KeyRota: dos sangrados, un generador, un gasto con acumulación de energía,
# una defensa con poca salud y Marca letal en el botón Burst.
# Puntos de combo en porcentaje de 7: 5 puntos = 71 %, umbral 70 = 5+.

buff1	Garrote_DoT = "Garrote en el objetivo [703]"
buff2	Rupture_DoT = "Ruptura en el objetivo [1943]"
buff3	Envenom_Buff = "Envenenar [32645]"
buff4	Deathmark_DoT = "Marca letal en el objetivo [360194]"
slot1	Garrote = "Garrote"
slot2	Rupture = "Ruptura"
slot3	Envenom = "Envenenar"
slot4	Mutilate = "Mutilar"
slot5	Deathmark = "Marca letal"
slot6	Crimson_Vial = "Vial carmesí"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

# --- Defensa: solo con «Cura / defensa» activado ---
use Crimson_Vial when  # Vial carmesí
	defensives == 1 and PlayerHP <= 40  # salud al 40 % o menos

# --- Reutilización: solo con Burst activado ---
use Deathmark when  # Marca letal
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up and Envenom_Buff.up  # Burst activado, sangrados y Envenenar activos

# --- Sangrados ---
use Garrote when  # Garrote
	Garrote_DoT.down  # sin sangrado
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30  # ventana de pandemia: queda un 30 % o menos

use Rupture when  # Ruptura
	Combo_Points >= 70 and Rupture_DoT.down  # 5+ puntos de combo, sin sangrado
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # 5+ puntos de combo, ventana de pandemia

# --- Gasto: 5+ puntos de combo, acumulando energía ---
use Envenom when  # Envenenar
	Combo_Points >= 70 and Envenom_Buff.down  # sin beneficio
	or
	Combo_Points >= 70 and Envenom_Buff.up and Envenom_Buff.duration <= 20  # el beneficio se acaba
	or
	Combo_Points >= 70 and Energy >= 70  # no desbordar la energía
	or
	Combo_Points >= 70 and Deathmark_DoT.up  # Marca letal en el objetivo

# --- Generador: menos de 5 puntos de combo ---
use Mutilate when  # Mutilar
	Combo_Points < 70  # menos de 5 puntos de combo
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Asesinato: ejemplo v1",
  "specID": 259,
  "ignoreMainIcon": true,
  "enemies": {"range": 8, "combatOnly": true},
  "notes": [
    "Ejemplo de la documentación de KeyRota: dos sangrados, un generador, un gasto con acumulación de energía,",
    "una defensa con poca salud y Marca letal en el botón Burst.",
    "Puntos de combo en porcentaje de 7: 5 puntos = 71 %, umbral 70 = 5+."
  ],
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "Garrote en el objetivo [703]", "spell": 703},
    {"n": 2, "alias": "Rupture_DoT", "label": "Ruptura en el objetivo [1943]", "spell": 1943},
    {"n": 3, "alias": "Envenom_Buff", "label": "Envenenar [32645]", "spell": 32645},
    {"n": 4, "alias": "Deathmark_DoT", "label": "Marca letal en el objetivo [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 letal", "spell": 360194, "show": "target"},
    {"n": 6, "alias": "Crimson_Vial", "label": "Vial carmesí", "spell": 185311, "show": "combat"}
  ],
  "rules": [
    {
      "use": "Crimson_Vial",
      "name": "Vial carmesí",
      "note": ["--- Defensa: solo con «Cura / defensa» activado ---"],
      "when": [{"all": ["defensives == 1", "PlayerHP <= 40"], "comment": "salud al 40 % o menos"}]
    },
    {
      "use": "Deathmark",
      "name": "Marca letal",
      "note": ["--- Reutilización: solo con Burst activado ---"],
      "when": [
        {
          "all": ["cd == 1", "Garrote_DoT.up", "Rupture_DoT.up", "Envenom_Buff.up"],
          "comment": "Burst activado, sangrados y Envenenar activos"
        }
      ]
    },
    {
      "use": "Garrote",
      "name": "Garrote",
      "note": ["--- Sangrados ---"],
      "when": [
        {"all": ["Garrote_DoT.down"], "comment": "sin sangrado"},
        {
          "all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"],
          "comment": "ventana de pandemia: queda un 30 % o menos"
        }
      ]
    },
    {
      "use": "Rupture",
      "name": "Ruptura",
      "when": [
        {"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "5+ puntos de combo, sin sangrado"},
        {
          "all": ["Combo_Points >= 70", "Rupture_DoT.up", "Rupture_DoT.duration <= 30"],
          "comment": "5+ puntos de combo, ventana de pandemia"
        }
      ]
    },
    {
      "use": "Envenom",
      "name": "Envenenar",
      "note": ["--- Gasto: 5+ puntos de combo, acumulando energía ---"],
      "when": [
        {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "sin beneficio"},
        {
          "all": ["Combo_Points >= 70", "Envenom_Buff.up", "Envenom_Buff.duration <= 20"],
          "comment": "el beneficio se acaba"
        },
        {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "no desbordar la energía"},
        {"all": ["Combo_Points >= 70", "Deathmark_DoT.up"], "comment": "Marca letal en el objetivo"}
      ]
    },
    {
      "use": "Mutilate",
      "name": "Mutilar",
      "note": ["--- Generador: menos de 5 puntos de combo ---"],
      "when": [{"all": ["Combo_Points < 70"], "comment": "menos de 5 puntos de combo"}]
    }
  ]
}
```


Descarga este ejemplo: [JSON](https://keyrota.app/documentation/examples/starter-assassination.es.json), [texto KRC](https://keyrota.app/documentation/examples/starter-assassination.es.txt). Ábrelo con «Abrir…» en la página «Texto y JSON» o con «Nuevo» — «Desde un archivo…».

---

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

## Rotación en JSON

El JSON es la descripción completa de una rotación avanzada: todo lo que tiene el texto KRC, más los ID de hechizo, las marcas de ranura y los ajustes del perfil. El constructor lo muestra en la página «Texto y JSON», y KeyRota lo admite como archivo («Nuevo» — «Desde un archivo…», «Importar»). El formato se llama `keyrota-rotation`, versión 1. Hay un [JSON Schema](#schema) para validarlo.

### Archivo de ejemplo

La rotación útil más corta: Ruptura con 5 puntos de combo o más cuando no está en el objetivo y, si no, Mutilar.

*minimal.json:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Asesinato: mínimo",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [{"n": 1, "alias": "Rupture_DoT", "label": "Ruptura en el objetivo [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+ puntos de combo, sin sangrado"}]
    },
    {"use": "Mutilate", "name": "Mutilar"}
  ]
}
```


Todo lo que el archivo omite toma su valor predeterminado: las ranuras se muestran «Con objetivo» y no tienen marcas, el contador de enemigos es de 8 metros y solo cuenta enemigos en combate. Una regla sin `when` se cumple siempre.

### Campos de primer nivel

| Campo | Tipo | Obligatorio | Predeterminado | Qué es |
|---|---|---|---|---|
| `format` | cadena | sí | — | Siempre `"keyrota-rotation"`. |
| `version` | entero | sí | — | Siempre `1`. Una versión más nueva se rechaza: «actualízala». |
| `title` | cadena | no | `""` | Nombre de la rotación: la primera línea del texto, el nombre en el registro. Sin comillas dobles. |
| `specID` | entero 0–100000 | no | `0` | Especialización de WoW; `0` = cualquiera. Necesario para el perfil de Better Assistant. |
| `ignoreMainIcon` | true / false | no | `true` | Activado: pulsar solo según las reglas. Desactivado: si no se cumple ninguna regla, pulsar la recomendación del juego. |
| `enemies` | objeto | no | `{"range": 8, "combatOnly": true}` | El contador de enemigos de la condición `enemies`. |
| `notes` | cadena o lista de cadenas | no | `[]` | Descripción: líneas `#` al principio del texto. |
| `resources` | lista de cadenas y `null` | no | `[]` | Nombres de `resource1…N`, en orden. |
| `auras` | lista | no | `[]` | Auras `buff1…12`. |
| `slots` | lista | no | `[]` | Ranuras `slot1…12`. |
| `rules` | lista | no | `[]` | Reglas por orden de prioridad. |
| `footer` | cadena o lista de cadenas | no | `[]` | Comentarios después de la última regla. |

Cualquier otro campo es un error, «campo sobrante»: las erratas no se pasan por alto. Por eso no añadas `"$schema"` al archivo; asocia el esquema en tu editor o validador.

Casi en cualquier sitio, `null` puede ocupar el lugar de un valor; equivale a omitir el campo.

### format y version

`"format": "keyrota-rotation"` y `"version": 1` son obligatorios. Si `version` es mayor que 1, KeyRota la rechaza: «la versión 2 es más nueva de lo que entiende esta KeyRota: actualízala». Sin `version`: «se necesita la versión 1».

### title

Una cadena sin comillas dobles `"`. Los saltos de línea se convierten en espacios. En el texto KRC es `rotation "…"`. Es un buen sitio para la versión: `"Asesinato v1.3"`.

### specID

El ID de la especialización en el juego. Determina los recursos de la rotación (cuando se crea en el constructor) y la clase y especialización del perfil de Better Assistant. `0` significa cualquier especialización: la rotación funciona, pero el perfil de Better Assistant no se crea («Elige una especialización: el perfil de Better Assistant la necesita»).

| Clase | Especialización | specID | Recursos de la especialización (`resource3`…) |
|---|---|---|---|
| Guerrero | Armas | 71 | `Rage` |
| Guerrero | Furia | 72 | `Rage` |
| Guerrero | Protección | 73 | `Rage` |
| Paladín | Sagrado | 65 | `Mana`, `Holy_Power` |
| Paladín | Protección | 66 | `Mana`, `Holy_Power` |
| Paladín | Reprensión | 70 | `Mana`, `Holy_Power` |
| Cazador | Bestias | 253 | `Focus` |
| Cazador | Puntería | 254 | `Focus` |
| Cazador | Supervivencia | 255 | `Focus` |
| Pícaro | Asesinato | 259 | `Energy`, `Combo_Points` |
| Pícaro | Forajido | 260 | `Energy`, `Combo_Points` |
| Pícaro | Sutileza | 261 | `Energy`, `Combo_Points` |
| Sacerdote | Disciplina | 256 | `Mana`, `Insanity` |
| Sacerdote | Sagrado | 257 | `Mana`, `Insanity` |
| Sacerdote | Sombra | 258 | `Mana`, `Insanity` |
| Caballero de la Muerte | Sangre | 250 | `Runes`, `Runic_Power` |
| Caballero de la Muerte | Escarcha | 251 | `Runes`, `Runic_Power` |
| Caballero de la Muerte | Profano | 252 | `Runes`, `Runic_Power` |
| Chamán | Elemental | 262 | `Mana`, `Maelstrom` |
| Chamán | Mejora | 263 | `Mana`, `Maelstrom` |
| Chamán | Restauración | 264 | `Mana`, `Maelstrom` |
| Mago | Arcano | 62 | `Mana`, `Arcane_Charges` |
| Mago | Fuego | 63 | `Mana`, `Arcane_Charges` |
| Mago | Escarcha | 64 | `Mana`, `Arcane_Charges` |
| Brujo | Aflicción | 265 | `Mana`, `Soul_Shards` |
| Brujo | Demonología | 266 | `Mana`, `Soul_Shards` |
| Brujo | Destrucción | 267 | `Mana`, `Soul_Shards` |
| Monje | Maestro cervecero | 268 | `Energy`, `Stagger` |
| Monje | Tejedor de niebla | 270 | `Mana` |
| Monje | Viajero del viento | 269 | `Energy`, `Chi` |
| Druida | Equilibrio | 102 | `Mana`, `Astral_Power` |
| Druida | Feral | 103 | `Energy`, `Combo_Points` |
| Druida | Guardián | 104 | `Rage` |
| Druida | Restauración | 105 | `Mana`, `Astral_Power` |
| Cazador de demonios | Devastación | 577 | `Fury` |
| Cazador de demonios | Venganza | 581 | `Fury` |
| Cazador de demonios | Devorador | 1480 | `Fury` |
| Evocador | Devastación | 1467 | `Mana`, `Essence` |
| Evocador | Preservación | 1468 | `Mana`, `Essence` |
| Evocador | Aumento | 1473 | `Mana`, `Essence` |

### ignoreMainIcon

`true` (predeterminado): KeyRota solo pulsa según las reglas; si no se cumple ninguna, espera. `false`: en ese caso pulsa la recomendación del juego, como el perfil de Blizzard. La recomendación es el último recurso, después de todas las reglas; nunca se adelanta a una regla.

### enemies

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


| Campo | Tipo | Predeterminado | Qué es |
|---|---|---|---|
| `range` | entero 1–100 | `8` | El radio del contador de enemigos, en metros. |
| `combatOnly` | true / false | `true` | Contar solo los enemigos que ya están en combate. |

La condición `enemies` lee este contador (consulta [Enemigos cerca](https://keyrota.app/documentation/es/conditions#enemies)). En el constructor son «Radio del contador de enemigos, metros» y «Solo enemigos en combate», en la página «General». Estos valores también pasan al perfil de Better Assistant.

### notes y footer

La descripción de la rotación (`notes`) y los comentarios después de la última regla (`footer`). Una lista de cadenas o una sola cadena con `\n`. Una cadena vacía `""` es una línea en blanco en el texto. Las líneas en blanco de los extremos se descartan.

```json
"notes": ["Basada en una guía y en los mejores logs, parche 12.1", "", "v1.1: Envenenar antes con 4+ objetivos"]
```


En el texto KRC son líneas `# …` antes de las declaraciones. No afectan al funcionamiento de la rotación.

### resources

Los nombres de los recursos en orden: el primer elemento es `resource1`, el segundo `resource2`, etc. **El número determina qué recurso es**; el nombre solo es cómo lo escribes en las condiciones:

- `resource1` es la salud del jugador y `resource2`, la salud del objetivo;
- de `resource3` en adelante son los recursos de la especialización, en el orden de la [tabla de specID](#spec-id): para un pícaro, `resource3` es la energía y `resource4`, los puntos de combo.

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


Usa los nombres estándar de la tabla: el constructor los muestra con palabras («Salud del jugador», «Energía») y otras personas y los agentes de IA entienden las condiciones a la primera. `null` se salta un número: `["PlayerHP", null, "Energy"]` solo declara `resource1` y `resource3`. Un recurso no declarado no se puede leer: «resource2 no declarado».

Todos los recursos son **porcentajes** del máximo, de 0 a 100. Cómo pasar a porcentaje los puntos de combo, la energía y las runas: [Recursos](https://keyrota.app/documentation/es/conditions#resources), en Condiciones.

### auras

Las auras son tus beneficios y tus perjuicios sobre el objetivo. El aura `n` de la rotación es el aura `n` de la lista de Better Assistant.

| Campo | Tipo | Obligatorio | Predeterminado | Qué es |
|---|---|---|---|---|
| `n` | entero 1–12 | sí | — | Número del aura (`buffN`). Cada número, una sola vez. |
| `alias` | cadena | no | a partir de `label` | El nombre en las condiciones. Consulta [Nombres](#aliases). |
| `label` | cadena | no | `""` | Nombre visible. Sin comillas dobles `"`. Resulta práctico con el ID entre corchetes: `"Garrote en el objetivo [703]"`. |
| `spell` | entero 0–100000000 | no | `0` | El ID del aura en Wowhead. `0` = sin definir: el aura no estará en el perfil de Better Assistant y será desconocida. |
| `note` | cadena | no | `""` | Un comentario al final de la línea de declaración. |

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


El orden de la lista no importa; importa `n`. Puede haber huecos en la numeración, pero para el perfil de Better Assistant las auras con ID deben ir seguidas desde la primera.

### slots

Las ranuras son los botones de la rotación. La ranura `n` de la rotación es la ranura `n` de Better Assistant.

| Campo | Tipo | Obligatorio | Predeterminado | Qué es |
|---|---|---|---|---|
| `n` | entero 1–12 | sí | — | Número de ranura (`slotN`). |
| `alias` | cadena | no | a partir de `label` | El nombre en las reglas y las condiciones. |
| `label` | cadena | no | `""` | El nombre del hechizo. Sin comillas dobles `"`. |
| `spell` | entero 0–100000000 | no | `0` | El ID del hechizo en Wowhead. Better Assistant lo usa para poner el hechizo en la ranura. |
| `note` | cadena | no | `""` | Un comentario al final de la línea de declaración. |
| `show` | `"target"` / `"combat"` | no | `"target"` | Cuándo muestra Better Assistant la ranura. |
| `manual` | true / false | no | `false` | Marca **M**. |
| `channel` | true / false | no | `false` | Marca **C**. |
| `offGcd` | true / false | no | `false` | Marca **O**. |
| `queue` | true / false | no | `false` | Marca **Q**, solo con `offGcd`. |

#### show

- `"target"`: la ranura se muestra cuando tienes un objetivo. Es lo habitual en casi todos los ataques.
- `"combat"`: la ranura se muestra en combate aunque no haya objetivo. Para sanación y habilidades defensivas: Vial carmesí debe funcionar cuando no hay objetivo.

Una ranura solo está lista cuando Better Assistant la muestra. Una ranura `"target"` sin objetivo no está lista y sus reglas se omiten.

### Marcas de ranura

Las marcas indican **cómo** pulsar una ranura una vez elegida su regla. En el constructor son los interruptores de «Cómo pulsar».

| Marcas | En JSON | Cómo se pulsa | Ejemplo |
|---|---|---|---|
| ninguna | todas `false` | En la ventana de cola, al final del GCD: el hechizo se lanza en cuanto termina el GCD. | Mutilar, Envenenar |
| **M** | `"manual": true` | Nunca. Las reglas de la ranura se omiten. Si pulsas tú su tecla, la rotación se pausa. | Una habilidad que pulsas tú |
| **C** | `"channel": true` | Como un hechizo normal; mientras dura la canalización, no se pulsa nada. Tras la pulsación, la ranura no se vuelve a pulsar hasta que empieza la canalización. | Asesinato múltiple (51690) |
| **O** | `"offGcd": true` | Al momento, incluso en mitad del GCD. | Suerte prolongada (381989) |
| **O + Q** | `"offGcd": true, "queue": true` | Fuera del GCD, pero solo en la ventana de cola al final del GCD. | La macro Subidón de adrenalina + Asesinato múltiple (13750); Esfumarse (1856) tras Perdición de Reyes |
| **C + O** | `"channel": true, "offGcd": true` | Una canalización que empieza fuera del GCD: al momento, y después nada hasta que termina la canalización. | Poco habitual |
| **C + O + Q** | las tres | Lo mismo, en la ventana de cola. | Poco habitual |
| **Q** sin O | `"queue": true` | Error: «queue solo va junto con offGcd». | — |
| **M** + otras | `"manual": true, …` | Manda M: la ranura no se pulsa y las demás marcas dan igual. | — |

Por qué **O + Q** y no solo **O**: un botón solo con O se pulsa al momento, en mitad del GCD, antes de que haya llegado el golpe anterior. Esfumarse tras Perdición de Reyes solo con O se pulsaría antes de que lleguen los puntos de combo de Perdición de Reyes, y la regla de Esfumarse (`Combo_Points < 65`) comprobaría el valor antiguo. Con Q, el botón espera al final del GCD.

Prioridad estricta: una regla fuera del GCD que esté más abajo en la lista **no se adelanta** a una regla superior que espera al GCD.

```json
"slots": [
  {"n": 1, "alias": "Adrenaline_Rush", "label": "Subidón de adrenalina (macro con Asesinato múltiple)", "spell": 13750, "offGcd": true, "queue": true},
  {"n": 4, "alias": "Keep_It_Rolling", "label": "Suerte prolongada", "spell": 381989, "offGcd": true},
  {"n": 8, "alias": "Killing_Spree", "label": "Asesinato múltiple", "spell": 51690, "channel": true},
  {"n": 11, "alias": "Crimson_Vial", "label": "Vial carmesí", "spell": 185311, "show": "combat"}
]
```


### rules

Las reglas por orden de prioridad: la primera de la lista se comprueba primero.

| Campo | Tipo | Obligatorio | Predeterminado | Qué es |
|---|---|---|---|---|
| `use` | cadena | sí | — | La ranura que se pulsa: su `alias` o `slotN`. |
| `name` | cadena | no | `""` | El nombre de la acción, que aparece en el registro. En el texto, el comentario de la línea `use`. |
| `note` | cadena o lista de cadenas | no | `[]` | Notas sobre la regla (líneas `#` antes de `use`). |
| `when` | lista de grupos | no | `[]` | Grupos O. Vacío o ausente: una regla sin condiciones, que se pulsa siempre que el hechizo se pueda usar. |

#### when: grupos y condiciones

| Campo | Tipo | Obligatorio | Qué es |
|---|---|---|---|
| `all` | lista de cadenas no vacía | sí | Las condiciones del grupo; deben cumplirse todas (Y). |
| `comment` | cadena | no | El comentario del grupo (en el texto, al final de su línea). |

```json
{
  "use": "Garrote",
  "name": "Garrote",
  "note": ["Renovar en la ventana de pandemia"],
  "when": [
    {"all": ["Garrote_DoT.down"], "comment": "sin sangrado"},
    {"all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"], "comment": "queda un 30 % o menos"}
  ]
}
```


Una misma ranura puede aparecer en varias reglas: por ejemplo, Garrote desde Sigilo arriba en la lista y el mantenimiento normal de Garrote más abajo.

#### Condiciones en JSON

Cada condición es una cadena con sintaxis KRC: `Garrote_DoT.down`, `Rupture_DoT.duration <= 25`, `Kingsbane.cd <= 3`, `Combo_Points >= 70`, `enemies >= 2`, `target.distance <= 8`, `cd == 1`. La lista completa está en [Condiciones](https://keyrota.app/documentation/es/conditions).

- Se hace referencia por nombre (`Garrote_DoT`) o por número: `buff1`, `slot3`, `resource4`.
- ` and ` dentro de una cadena la divide en dos condiciones: `"Combo_Points >= 70 and Energy >= 70"` son dos condiciones, y ambas cuentan para el límite de 16.
- Sin `#` ni saltos de línea dentro de una cadena.
- Las condiciones las lee el propio motor de KeyRota, así que el JSON y el texto siempre significan lo mismo.

### Nombres

Un nombre (`alias`) es cómo se llaman las auras, las ranuras y los recursos en las condiciones y en `use`.

- El primer carácter es una letra (de cualquier alfabeto) o `_`; después, letras, dígitos `0–9` y `_`. Se admiten letras con tilde, la ñ y otros alfabetos, como el cirílico; espacios, guiones y puntos no: `Fan_of_Knives`, no `Fan-of-Knives`.
- Un nombre es único entre todas las auras, ranuras y recursos.
- Reservados: `use`, `when`, `and`, `or`, `rotation`, `gcd`, `enemies`, `target`, `aoe`, `st`, `cd`, `defensives`, `ground_spells`, `movement`, y los nombres del tipo `buffN`, `slotN`, `resourceN`.
- Las palabras clave van solo en minúsculas: `use`, `or`, `.up`. `Use`, `OR` y `.UP` son errores.

**Un nombre a partir de la etiqueta.** Sin `alias`, KeyRota crea uno a partir de `label`: los corchetes y su contenido se descartan, las letras y los dígitos se quedan y todo lo demás pasa a ser `_`. Por ejemplo, `"Garrote en el objetivo [703]"` se convierte en `Garrote_en_el_objetivo`. Un nombre vacío o inservible pasa a ser `Aura_N` o `Slot_N`; uno ya ocupado recibe `_2`, `_3`. Si una regla hace referencia a `buffN` o `slotN` que no están en las listas, se declaran automáticamente como `Aura_N` y `Slot_N`.

### Campos obligatorios y valores predeterminados

| Dónde | Obligatorio | Predeterminados |
|---|---|---|
| Archivo | `format`, `version` | `title` `""`, `specID` `0`, `ignoreMainIcon` `true`, `enemies` `{"range": 8, "combatOnly": true}`, listas vacías |
| Aura | `n` | `alias` a partir de `label`, `label` `""`, `spell` `0` |
| Ranura | `n` | `show` `"target"`, todas las marcas `false`, `spell` `0` |
| Regla | `use` | `name` `""`, `note` `[]`, `when` `[]` (sin condiciones) |
| Grupo | `all` (no vacía) | `comment` `""` |

### Límites

| Qué | Límite |
|---|---|
| Auras | 12 (`n` 1–12) |
| Ranuras | 12 (`n` 1–12) |
| Grupos O en una regla | 16 |
| Condiciones Y en un grupo | 16 |
| Reglas | sin límite |
| Número en una condición | entero 0–100 |
| `enemies.range` | 1–100 |
| `spell` | 0–100000000 |
| `specID` | 0–100000 |
| Recursos | hasta 99 |

Exactamente 16 grupos de 16 condiciones está permitido; 17 es un error.

### Errores

Una rotación con un error no se carga en absoluto: no hay ejecución parcial. Un error siempre indica el lugar. En JSON es una ruta: `rules[3].when[1]: nombre desconocido Foo` (contando desde cero). En el constructor, «Regla 4, grupo 2: nombre desconocido Foo» (contando desde uno). En el texto KRC, un número de línea.

**Estructura del JSON:**

| Mensaje | Causa |
|---|---|
| `campo sobrante «offgcd»` | Un campo mal escrito o desconocido (importan las mayúsculas: `offGcd`). |
| `falta el campo «format»` | Falta un campo obligatorio. |
| `format: se esperaba «keyrota-rotation»` | Otro valor en `format`. |
| `version: se necesita la versión 1` | Falta `version` o es menor que 1. |
| `slots[0]: falta el número n (1–12)` | Una ranura o un aura sin `n`. |
| `slots[2].n: número fuera de 1..12` | `n` fuera de rango. |
| `slots[3]: el número 4 ya está ocupado` | Dos ranuras (o dos auras) con el mismo `n`. |
| `slots[1].show: se esperaba «target» o «combat»` | Otro valor en `show`. |
| `slots[0]: queue solo va junto con offGcd` | `queue: true` sin `offGcd: true`. |
| `rules[2].use: no existe la ranura «Garotte»` | `use` hace referencia a una ranura que no existe. |
| `rules[0].when[1].all: se necesita una lista de condiciones no vacía` | Un grupo vacío o sin `all`. |
| `rules[0].when[0].all[2]: condición vacía o con # o salto de línea` | Una cadena de condición vacía o con `#`. |
| `….spell: se esperaba un número entero` | Tipo incorrecto: una cadena en lugar de un número, `true` en lugar de un número, etc. |

**Condiciones y declaraciones** (igual que en el texto KRC):

| Código | Mensaje de ejemplo | Causa |
|---|---|---|
| `unknown_ref` | `nombre desconocido Foo` | No hay ningún aura, ranura ni recurso con ese nombre. |
| `unknown_ref` | `resource5 no declarado` | El recurso no está declarado en `resources`. |
| `wrong_kind` | `Garrote es slot, pero se necesita buff` | Una propiedad de aura en una ranura (`Garrote.up`) o al revés. |
| `bad_condition` | `no se entiende la condición "Energy => 50"` | Una errata en la condición o en el operador. |
| `bad_condition` | `"Garrote.distance <= 8": distance solo existe para target` | Solo el objetivo tiene distancia. |
| `value_range` | `valor 120 fuera de 0..100` | Un número mayor que 100. No hay números negativos ni decimales. |
| `toggle_value` | `"cd >= 1": el interruptor solo admite == 0 o == 1` | Un interruptor solo se compara con `==` y 0 o 1. |
| `bad_alias` | `nombre no válido Fan-of-Knives` | Caracteres no válidos en un nombre. |
| `reserved_alias` | `el nombre cd está reservado` | Un nombre reservado. |
| `duplicate_alias` | `el nombre Garrote ya está declarado` | Dos auras, ranuras o recursos con el mismo nombre. |
| `index_range` | `buff13: número fuera de 1..12` | Una referencia a un número mayor que 12. |
| `too_many_groups` | `más de 16 grupos OR` | Más de 16 grupos en una regla. |
| `too_many_conditions` | `17 condiciones en el grupo (máximo 16)` | Más de 16 condiciones en un grupo. |

El constructor también indica «el grupo no tiene condiciones» (un grupo vacío), «no se ha elegido ranura» y «el nombre no puede llevar comillas».

### Texto KRC

El texto KRC es la misma rotación en forma de líneas. La página «Texto y JSON» lo muestra y puedes guardarlo como archivo `.txt`. El texto y el JSON se convierten el uno en el otro sin perder significado.

*Texto KRC:*

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

buff1	Rupture_DoT = "Ruptura en el objetivo [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+ puntos de combo, sin sangrado

use Mutilate when  # Mutilar
```


#### Líneas

- `#` fuera de comillas dobles inicia un comentario hasta el final de la línea. Dentro de una `"etiqueta"`, `#` es un carácter normal.
- Las líneas en blanco y las que solo tienen un comentario se omiten: así se escriben las descripciones y los separadores.
- Cualquier otra línea es una declaración, `use`, `or` o una línea de condiciones. Si no, es un error `stray_line`: «línea fuera de una regla: "…" (el texto libre debe empezar con #)».
- Se admite cualquier cantidad de espacios y tabulaciones entre las partes. La forma canónica usa una tabulación después de `buffN`/`slotN` y al principio de las líneas de condiciones.

#### Declaraciones

Solo antes del primer `use`:

```text
rotation "Nombre"                        # opcional, como mucho una vez
buff1	Garrote_DoT = "Garrote en el objetivo [703]"   # aura 1
slot1	Garrote = "Garrote"                         # ranura 1
resource1	PlayerHP                               # recurso 1
```


`buffN` y `slotN` van de 1 a 12; `resourceN`, de 1 a 99. La etiqueta entre comillas puede estar vacía: `slot5	Filler = ""`. Una declaración después del primer `use` es un error `late_declaration`.

#### Reglas

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


- `use Ranura when` abre una regla; un comentario en esa línea es el nombre de la acción.
- Cada línea de condiciones es un grupo (condiciones unidas con `and`). Los grupos se separan con una línea que solo contiene la palabra `or`.
- Una regla sin líneas de condiciones no tiene condiciones.
- Dos líneas de condiciones seguidas sin `or` son un error `split_group`; `or` al principio, al final o dos veces seguidas es `empty_group`.

#### Texto y JSON: correspondencia

| En el texto | En JSON |
|---|---|
| `rotation "…"` | `title` |
| Líneas `# …` antes del primer `use` | `notes` |
| Un comentario al final de una línea `buffN` / `slotN` | `note` del aura o de la ranura |
| Líneas `# …` justo antes de `use` (y entre los grupos de la regla) | `note` de la regla |
| Un comentario en la línea `use` | `name` de la regla |
| Un comentario al final de una línea de condiciones | `comment` del grupo |
| Líneas `# …` después de la última regla | `footer` |
| — (no está en el texto) | `specID`, `ignoreMainIcon`, `enemies`, `spell`, `show`, marcas |

Las líneas en blanco de los extremos de los bloques de comentarios se descartan; las del interior se conservan como `""`.

### Importación y almacenamiento

- KeyRota guarda la rotación dentro del perfil. «Exportar» en la ventana principal guarda el perfil de KeyRota (JSON) con su rotación; «Importar» admite un perfil de KeyRota y un JSON de rotación suelto.
- «Nuevo» — «Desde un archivo…» admite `.txt` con texto KRC, JSON de rotación y perfiles de KeyRota; «Nuevo» — «Desde el portapapeles», lo mismo desde el portapapeles.
- En el constructor: «Texto y JSON» — «Pegar» o «Abrir…» sustituyen la rotación; las ranuras y auras con el mismo número conservan sus ID, «Con objetivo» / «En combate» y sus marcas si la versión nueva no los trae.
- Una rotación en texto (sin JSON) toma los ID y la visibilidad de las ranuras del perfil de Better Assistant ya guardado en el perfil de KeyRota, y los ID de las auras también de las marcas `[703]` de sus etiquetas.

### El perfil de Better Assistant a partir del JSON

«Crear desde ranuras y auras», en el constructor, genera la cadena del perfil de Better Assistant a partir del JSON de la rotación:

- **12 ranuras**: la ranura N es `slots[n = N].spell`, mostrada según `show`. Una ranura sin ID queda vacía.
- **Auras**, en orden desde la primera: `auras[n = 1].spell`, `auras[n = 2].spell`… Un aura sin ID en medio es un error.
- **Clase y especialización**, a partir de `specID`.
- **Contador de enemigos**, a partir de `enemies.range` y `enemies.combatOnly`.
- Si el perfil de KeyRota ya contiene un perfil de Better Assistant de la misma especialización, se conservan sus demás ajustes y las ranuras y auras que coinciden.

En el juego: `/ba` — Profile — pega — Apply.

### JSON Schema

El esquema del formato: [keyrota-rotation.schema.json](https://keyrota.app/documentation/keyrota-rotation.schema.json) (draft 2020-12). Comprueba los campos, los tipos, los rangos, `queue` sin `offGcd` y la forma de las cadenas de condición. No comprueba que `n` y los nombres sean únicos, que existan los nombres usados en las condiciones ni el límite de 16 tras dividir las cadenas por ` and `: eso lo hace KeyRota al cargar.

Para validar un archivo:

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


No pongas un campo `"$schema"` en un archivo de rotación: KeyRota lo toma por un campo sobrante.

---

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

## Condiciones

Una condición es una comprobación: «Garrote está en el objetivo», «la energía es al menos del 70 %», «Burst está activado». Las condiciones forman grupos (Y) y los grupos forman una regla (O). En el constructor eliges la condición en listas; en el texto KRC y en JSON se escribe como una cadena, que es lo que muestran los ejemplos.

### Sintaxis

| Tipo | Forma | Ejemplo |
|---|---|---|
| Aura: presente / ausente | `Aura.up`, `Aura.down` | `Garrote_DoT.down` |
| Aura: tiempo restante, acumulaciones | `Aura.duration op N`, `Aura.stacks op N` | `Rupture_DoT.duration <= 30` |
| Ranura: lista / no lista | `Ranura.ready`, `Ranura.oncd` | `Kingsbane.ready` |
| Ranura: reutilización, cargas | `Ranura.cd op N`, `Ranura.charges op N` | `Deathmark.cd <= 3` |
| Ranura: resaltado | `Ranura.glow`, `Ranura.noglow` | `Ambush.glow` |
| Recurso | `Recurso op N` | `Combo_Points >= 70` |
| Enemigos cerca | `enemies op N` | `enemies >= 3` |
| Distancia al objetivo | `target.distance op N` | `target.distance <= 8` |
| Interruptor | `aoe`, `st`, `cd`, `defensives`, `ground_spells`, `movement` `== 0` o `== 1` | `cd == 1` |

**Operadores:** `<`, `<=`, `==`, `=` (igual que `==`), `>=`, `>`. No existe «distinto de».

**El número** `N` es un entero de 0 a 100. No hay números negativos ni decimales, ni mayores que 100: `valor 120 fuera de 0..100`.

**Los espacios** alrededor del operador son opcionales: `Energy>=70` y `Energy >= 70` son lo mismo. No se admiten espacios dentro de un nombre ni entre un nombre y su propiedad: `Garrote_DoT.up`, no `Garrote_DoT .up`.

**Las referencias** se hacen por nombre (`Garrote_DoT`) o por número: `buff1`, `slot3`, `resource4`. Las palabras clave van en minúsculas.

### Auras

Un aura es un beneficio tuyo o un perjuicio tuyo sobre el objetivo, declarado en la lista de auras con su ID. Los beneficios y perjuicios de otros jugadores no se ven.

#### .up y .down

`Envenom_Buff.up`: el aura está presente. `Envenom_Buff.down`: el aura está ausente. Si el aura es desconocida (no se lee), las dos son falsas.

```text
use Garrote when  # Garrote: aplicarlo cuando falta
	Garrote_DoT.down
```


#### .duration: tiempo restante en porcentaje

`Rupture_DoT.duration <= 30`: queda como mucho un 30 % de la duración **total** del aura. La duración total es la que tuvo esa aplicación: Ruptura con 5 puntos de combo dura 24 s y con 7 dura 32 s, así que el 30 % son 7,2 s y 9,6 s.

> [!IMPORTANT]
> A un aura ausente le queda **0**. Por eso `Rupture_DoT.duration <= 30` también se cumple cuando no hay ninguna Ruptura. Para renovar solo un aura que está activa, escribe `Rupture_DoT.up and Rupture_DoT.duration <= 30`, y cubre el caso «falta el aura» con un grupo aparte con `Rupture_DoT.down`.

La ventana de pandemia en WoW es el 30 % de la duración: si renuevas dentro de ella, no pierdes nada. De ahí el umbral habitual `<= 30`.

*Texto KRC:*

```text
use Rupture when  # Ruptura
	Combo_Points >= 70 and Rupture_DoT.down  # sin sangrado
	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": "sin sangrado"},
    {"all": ["Combo_Points >= 70", "Rupture_DoT.up", "Rupture_DoT.duration <= 30"], "comment": "pandemia"}
  ]
}
```


De segundos a porcentaje: `porcentaje = segundos / duración total × 100`. Garrote dura 18 s: «quedan 14 s» es `<= 78` y «quedan 5,4 s» es `<= 30`.

**A un aura sin duración** (Sigilo y similares) siempre le queda **1**. Con esas auras usa solo `.up` y `.down`.

#### .stacks: número de acumulaciones

`Opportunity.stacks >= 6`: el aura tiene 6 acumulaciones o más. Un aura ausente tiene 0 acumulaciones.

> [!NOTE]
> El contador de acumulaciones empieza en dos: un aura con una sola acumulación se lee como **0**, igual que un aura sin contador. Para comprobar que un aura está presente, usa `.up`; usa `.stacks` para umbrales de 2 o más.

```text
use Pistol_Shot when  # Disparo de pistola con 6 acumulaciones de Oportunidad
	Opportunity.stacks >= 6 and Combo_Points < 80
```


### Ranuras

Las condiciones de ranura leen el estado de **otro** botón: «pulsa Envenenar solo mientras Marca letal aún no está lista», etc. La ranura de la propia regla se comprueba automáticamente: si su hechizo no se puede usar, KeyRota simplemente pasa a la regla siguiente.

#### .ready y .oncd

`Kingsbane.ready`: el hechizo de la ranura se puede usar, sin contar el tiempo de reutilización global. Para eso deben cumplirse todas estas condiciones:

- el hechizo está aprendido (el talento está elegido);
- hay suficiente recurso;
- el objetivo está a su alcance, si hace falta un objetivo;
- al tiempo de reutilización le quedan menos de 0,2 s o hay una carga disponible;
- Better Assistant muestra la ranura («Con objetivo»: tienes un objetivo; «En combate»: estás en combate).

`Kingsbane.oncd`: la ranura **no está lista** por cualquiera de estos motivos, no solo por el tiempo de reutilización. Si el estado es desconocido, las dos son falsas.

```text
use Preparation when  # Preparación cuando Subidón de adrenalina, Entre ceja y ceja y Asesinato múltiple están en reutilización
	Adrenaline_Rush.oncd and Between_the_Eyes.oncd and Killing_Spree.oncd
```


#### .cd: reutilización restante en porcentaje

`Deathmark.cd <= 3`: queda como mucho un 3 % del tiempo de reutilización total. `0` significa listo y `100`, que se acaba de usar. El tiempo de reutilización global no se incluye. En un hechizo con cargas, `.cd` es la recarga de la carga **siguiente**, así que el hechizo puede estar listo con `cd > 0`.

| Tiempo de reutilización | 1 % = | Ejemplo |
|---|---|---|
| 30 s | 0,3 s | `X.cd <= 10`: quedan ≤ 3 s |
| 1 min | 0,6 s | `Kingsbane.cd <= 3`: quedan ≤ 1,8 s |
| 2 min | 1,2 s | `Deathmark.cd <= 3`: quedan ≤ 3,6 s; `Deathmark.cd >= 44`: todavía ≥ 52 s |
| 3 min | 1,8 s | `X.cd >= 50`: todavía ≥ 90 s |

Un uso típico es «reservar para una reutilización importante»: no gastar Perdición de Reyes si Marca letal está a punto de volver y gastarla si a Marca letal aún le falta mucho.

```text
use Kingsbane when  # Perdición de Reyes
	cd == 1 and Deathmark_DoT.up  # con Marca letal en el objetivo
	or
	cd == 1 and Deathmark.cd >= 44  # a Marca letal le faltan más de 52 s
```


#### .charges

`Barbed_Shot.charges >= 2`: el hechizo tiene 2 cargas o más. Los hechizos sin cargas tienen 0. Un patrón típico evita que las cargas lleguen al máximo:

```text
use Barbed_Shot when  # Disparo con púas
	Barbed_Shot.charges >= 2  # las dos cargas: no desperdiciar la recarga
	or
	Barbed_Shot.charges == 1 and Barbed_Shot.cd <= 20  # la segunda casi está lista
```


#### .glow y .noglow: el botón brilla

`Ambush.glow`: el juego resalta el botón de este hechizo (el mismo brillo que ves en tu barra de acción cuando hay un proc). `Ambush.noglow`: no lo resalta. Usa `.glow` solo si el botón de este hechizo brilla de verdad en el juego; si no estás seguro, comprueba el beneficio del proc: `Blindside.up`.

### Recursos

`Energy >= 70`: al menos un 70 % de la energía máxima. **Todos los recursos van en porcentaje**, de 0 a 100: salud, energía, maná, ira, runas, puntos de combo.

| Recurso | Número | Ejemplo |
|---|---|---|
| Salud del jugador | `resource1` (`PlayerHP`) | `PlayerHP <= 40`: salud al 40 % o menos |
| Salud del objetivo | `resource2` (`TargetHP`) | `TargetHP >= 50`: el objetivo aún no está a la mitad. Desconocida si no hay objetivo |
| Recursos de la especialización | `resource3` en adelante | `Energy >= 70`, `Combo_Points >= 70`, `Rage >= 40` |

**A porcentaje:** `porcentaje = valor / máximo × 100`. Con 250 de energía, 175 de energía son el 70 %. La energía máxima y otros recursos cambian con los talentos, así que los umbrales en porcentaje se trasladan entre personajes mejor que los valores absolutos.

**Puntos de combo.** Con un máximo de 7 puntos de combo, un punto es aproximadamente el 14,3 %. El valor se redondea a un número entero y, según el redondeo, 2 puntos se leen como 28 o 29, 3 como 42 o 43, y 6 como 85 u 86. Por eso pon el umbral **a medio camino entre los escalones**: así es correcto con cualquier redondeo.

| Puntos de combo | % | «al menos N» | «como mucho 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` | — |

Con otro máximo, «al menos N» es `(N − 0,5) / máximo × 100`. Con 5 puntos de combo, «al menos 4» es `>= 70` y «al menos 5» es `>= 90`.

### Enemigos cerca

`enemies >= 3`: 3 enemigos o más dentro del radio del contador. El radio y «Solo enemigos en combate» se configuran en la página «General» (`enemies.range` y `enemies.combatOnly` en JSON). Si el recuento es desconocido, la condición es falsa.

- Para que se cuenten los enemigos, las placas de nombre de enemigos deben estar activadas en el juego (la tecla V de forma predeterminada) y los enemigos menores no deben estar ocultos.
- Elige el radio según tus habilidades: Abanico de cuchillos golpea a 8 metros, así que 8 es el radio correcto para «Abanico de cuchillos o Mutilar».
- Para un solo objetivo, `enemies <= 1` es más seguro que `enemies == 1`: la regla sigue funcionando aunque el enemigo no se cuente.

### Distancia al objetivo

`target.distance <= 8`: el objetivo está a 8 metros o menos. Sin objetivo, la distancia es desconocida y la condición es falsa. La distancia es aproximada: la condición solo se cumple cuando la distancia cumple el umbral con seguridad; en los casos dudosos es falsa.

```text
use Pistol_Shot when  # el objetivo está fuera del cuerpo a cuerpo, pero a 20 metros o menos
	target.distance >= 10 and target.distance <= 20
```


### Interruptores del panel

Los interruptores son los botones del panel de ajustes rápidos que se muestra sobre el juego, más los atajos de teclado. La rotación decide qué significan.

| Condición | Botón del panel | Tecla: Windows, macOS | Significado habitual |
|---|---|---|---|
| `aoe == 1` | Objetivos: Varios | F2, ⌃⇧T, en ciclo | Forzar el modo de varios objetivos |
| `st == 1` | Objetivos: Uno | F2, ⌃⇧T, en ciclo | Forzar un solo objetivo |
| `aoe == 0 and st == 0` | Objetivos: Auto | F2, ⌃⇧T, en ciclo | Deciden las reglas, normalmente según `enemies` |
| `cd == 1` | Burst | F3, ⌃⇧B | Reutilizaciones importantes: usarlas ya o reservarlas |
| `defensives == 1` | Cura / defensa | — | Sanación y habilidades defensivas |
| `ground_spells == 1` | En el suelo | — | Hechizos con objetivo en el suelo |
| `movement == 1` | Movimiento | — | Acciones en movimiento |

- Compara solo con `== 0` o `== 1`.
- **`cd == 1` es el botón Burst, no el tiempo de reutilización de un hechizo.** El tiempo de reutilización de una ranura es `Ranura.cd`.
- `aoe` y `st` nunca valen 1 a la vez. La tecla del modo de objetivos alterna en ciclo Auto, Uno y Varios.
- De forma predeterminada, Burst está activado, el modo de objetivos es Auto y los demás botones están desactivados. KeyRota recuerda su estado.
- Un botón del panel solo está activo si la rotación lee ese interruptor; con el perfil de Blizzard, todos aparecen atenuados.
- Los interruptores nunca son desconocidos.

### Cómo se evalúan las condiciones

| Condición | Hay valor | Aura ausente | Desconocido |
|---|---|---|---|
| `X.up` | verdadero | falso | **falso** |
| `X.down` | falso | verdadero | **falso** |
| `X.duration op N`, `X.stacks op N` | se compara | se compara con **0** | **falso** |
| `X.ready` / `X.oncd` | según si está lista | — | **falso** (las dos) |
| `X.glow` / `X.noglow` | según el brillo | — | **falso** (las dos) |
| `X.cd`, `X.charges`, un recurso, `enemies`, `target.distance` | se compara | — | **falso** |
| un interruptor | se compara | — | nunca |

Un grupo es verdadero cuando todas sus condiciones son verdaderas. Una regla se cumple cuando al menos un grupo es verdadero, o cuando no tiene ningún grupo.

### «No», paréntesis y O dentro de un grupo

KRC no tiene `not`, `!=` ni paréntesis. Todo se expresa con grupos:

- **«No»** es la condición opuesta: lo contrario de `.up` es `.down`; de `.ready`, `.oncd`; de `.glow`, `.noglow`; con números, el operador inverso: lo contrario de `>= 70` es `< 70`.
- **(A o B) y C** son dos grupos: `A and C`, `B and C`.
- **A y no (B y C)** son dos grupos: `A and no-B`, `A and no-C`.
- **La misma condición en todos los grupos** (como la protección de una canalización) se repite en cada grupo.

```text
use Fan_of_Knives when  # Abanico de cuchillos: (modo Varios O Auto con 2+ enemigos) Y menos de 5 puntos de combo
	aoe == 1 and Combo_Points < 70
	or
	st == 0 and enemies >= 2 and Combo_Points < 70
```


### Referencia rápida

| Condición | Significado |
|---|---|
| `X.up` / `X.down` | aura presente / ausente |
| `X.duration <= 30` | queda ≤ 30 % (a un aura ausente le queda 0) |
| `X.up and X.duration <= 30` | activa y lista para renovar |
| `X.stacks >= 2` | 2 acumulaciones o más (1 acumulación se lee como 0) |
| `X.ready` / `X.oncd` | ranura lista / no lista por cualquier motivo |
| `X.cd <= 3` | queda ≤ 3 % del tiempo de reutilización |
| `X.charges >= 2` | 2 cargas o más |
| `X.glow` / `X.noglow` | botón resaltado / no resaltado |
| `PlayerHP <= 40` | tu salud ≤ 40 % |
| `TargetHP >= 50` | el objetivo está al ≥ 50 % (falso sin objetivo) |
| `Combo_Points >= 70` | 5+ puntos de combo de 7 |
| `Energy >= 70` | energía ≥ 70 % |
| `enemies >= 3` | 3+ enemigos en el radio |
| `target.distance <= 8` | el objetivo a 8 metros o menos (falso sin objetivo) |
| `aoe == 1` / `st == 1` | modo Varios / Uno |
| `aoe == 0 and st == 0` | modo Auto |
| `cd == 1` | Burst activado |
| `defensives == 1` | Cura / defensa activado |
| `ground_spells == 1` | En el suelo activado |
| `movement == 1` | Movimiento activado |

---

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

## Ejemplos de patrones

Cada patrón es una rotación pequeña pero completa: el texto KRC a la izquierda y el mismo JSON a la derecha. Pégala en el constructor («Texto y JSON» — «Pegar») para ver cómo queda en las páginas «Ranuras» y «Reglas». Los ID de hechizo son reales, de Wowhead. Al final: [rotaciones completas](#example-files).

### Un DoT renovado en la ventana de pandemia

Aplica un DoT (daño en el tiempo) cuando falta y renuévalo cuando le queda un 30 % o menos: renovarlo dentro de esa ventana no hace perder nada. A un aura ausente le queda 0, así que la renovación va en un grupo aparte con `.up`.

*Texto KRC:*

```text
rotation "Patrón: DoT con ventana de pandemia"

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

use Garrote when  # Garrote
	Garrote_DoT.down  # sin sangrado
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30  # pandemia

use Mutilate when  # Mutilar
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Patrón: DoT con ventana de pandemia",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "Garrote en el objetivo [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": "sin sangrado"},
      {"all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"], "comment": "pandemia"}
    ]},
    {"use": "Mutilate", "name": "Mutilar"}
  ]
}
```


- Para no aplicar un DoT nuevo a un objetivo que está a punto de morir cuando hay 3 objetivos o más, añade `TargetHP >= 50` al grupo «sin sangrado» y un grupo aparte `Garrote_DoT.down and enemies <= 2` para uno o dos objetivos.
- Un DoT largo con duración variable (Ruptura: 4 s + 4 s por punto de combo) funciona igual: los porcentajes son de la duración de esa aplicación.

### Generador y gasto por puntos de combo

Gasta con 5 puntos de combo o más de 7 y genera por debajo. Los umbrales están a medio camino entre los escalones; consulta la [tabla de puntos de combo](https://keyrota.app/documentation/es/conditions#resources).

*Texto KRC:*

```text
rotation "Patrón: generador y gasto"

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

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

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

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Patrón: generador y gasto",
  "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+ puntos de combo"}
    ]},
    {"use": "Mutilate", "name": "Mutilar", "when": [
      {"all": ["Combo_Points < 70"], "comment": "menos de 5 puntos de combo"}
    ]}
  ]
}
```


Un generador con `Combo_Points < 70` no desborda los puntos de combo: con 5 o más no se activa aunque el gasto aún no esté listo (por falta de energía), y KeyRota espera.

### Acumulación de recursos

No gastes enseguida: mantén el beneficio activo y acumula energía. Envenenar cuando su beneficio se está acabando, con Marca letal en el objetivo o cuando hay mucha energía. El resto del tiempo, con 5 puntos de combo o más no encaja ninguna regla y KeyRota espera a tener más energía: eso es acumular.

*Texto KRC:*

```text
rotation "Patrón: acumulación de energía"

buff3	Envenom_Buff = "Envenenar [32645]"
buff4	Deathmark_DoT = "Marca letal en el objetivo [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  # sin beneficio
	or
	Combo_Points >= 70 and Envenom_Buff.duration <= 20  # el beneficio se acaba
	or
	Combo_Points >= 70 and Deathmark_DoT.up  # con Marca letal en el objetivo
	or
	Combo_Points >= 70 and Energy >= 70  # no desbordar la energía

use Mutilate when  # Mutilar
	Combo_Points < 70
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Patrón: acumulación de energía",
  "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 letal en el objetivo [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": "sin beneficio"},
      {"all": ["Combo_Points >= 70", "Envenom_Buff.duration <= 20"], "comment": "el beneficio se acaba"},
      {"all": ["Combo_Points >= 70", "Deathmark_DoT.up"], "comment": "con Marca letal en el objetivo"},
      {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "no desbordar la energía"}
    ]},
    {"use": "Mutilate", "name": "Mutilar", "when": [
      {"all": ["Combo_Points < 70"]}
    ]}
  ]
}
```


- El umbral `Energy >= 70` evita que la energía llegue al máximo y se desperdicie.
- El grupo `Envenom_Buff.duration <= 20` también se activa sin el beneficio (le queda 0); el grupo `.down` está ahí por claridad.
- Para ajustar la acumulación, cambia solo el umbral de energía: más bajo gasta antes y más alto acumula durante más tiempo.

### Un objetivo y varios objetivos

El jugador elige el modo de objetivos con su tecla (alterna en ciclo Auto, Uno y Varios); en Auto deciden las reglas según el número de enemigos. Cada regla de AoE lleva dos grupos, «modo Varios» y «Auto con 2+ enemigos»; la regla de un objetivo lleva «modo Uno» y «Auto con un enemigo como mucho».

*Texto KRC:*

```text
rotation "Patrón: uno y varios objetivos"

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

use Envenom when  # Envenenar
	Combo_Points >= 70

use Fan_of_Knives when  # Abanico de cuchillos: 2+ objetivos
	aoe == 1 and Combo_Points < 70  # modo Varios
	or
	st == 0 and enemies >= 2 and Combo_Points < 70  # modo Auto, 2+ enemigos

use Mutilate when  # Mutilar: un objetivo
	st == 1 and Combo_Points < 70  # modo Uno
	or
	aoe == 0 and enemies <= 1 and Combo_Points < 70  # modo Auto, un enemigo
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Patrón: uno y varios objetivos",
  "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": "Abanico de cuchillos", "spell": 51723}
  ],
  "rules": [
    {"use": "Envenom", "name": "Envenenar", "when": [
      {"all": ["Combo_Points >= 70"]}
    ]},
    {"use": "Fan_of_Knives", "name": "Abanico de cuchillos: 2+ objetivos", "when": [
      {"all": ["aoe == 1", "Combo_Points < 70"], "comment": "modo Varios"},
      {"all": ["st == 0", "enemies >= 2", "Combo_Points < 70"], "comment": "modo Auto, 2+ enemigos"}
    ]},
    {"use": "Mutilate", "name": "Mutilar: un objetivo", "when": [
      {"all": ["st == 1", "Combo_Points < 70"], "comment": "modo Uno"},
      {"all": ["aoe == 0", "enemies <= 1", "Combo_Points < 70"], "comment": "modo Auto, un enemigo"}
    ]}
  ]
}
```


- `st == 0 and enemies >= 2` significa «no está en modo Uno»: en modo Varios, la regla se activa de todos modos por su primer grupo.
- `enemies <= 1` es más seguro que `enemies == 1`: con un solo objetivo, puede que el enemigo no se cuente.
- Toma el radio del contador (`enemies.range`) de tu habilidad de AoE: Abanico de cuchillos golpea a 8 metros.

### Reutilizaciones con Burst y «solo con la reutilización activa»

`cd == 1` es el botón Burst. Una reutilización importante solo se pulsa mientras Burst está activado, y la reservas desactivando Burst; por ejemplo, antes de una fase en la que el jefe es inmune. Lo que refuerza la ventana de la reutilización solo se pulsa dentro de ella: aquí, Esfumarse solo mientras Marca letal está en el objetivo, y Perdición de Reyes con Marca letal en el objetivo o cuando a Marca letal aún le falta mucho.

*Texto KRC:*

```text
rotation "Patrón: Burst"

buff1	Garrote_DoT = "Garrote en el objetivo [703]"
buff2	Rupture_DoT = "Ruptura en el objetivo [1943]"
buff4	Deathmark_DoT = "Marca letal en el objetivo [360194]"
buff10	Vanish_Buff = "Esfumarse [11327]"
slot1	Garrote = "Garrote"
slot4	Mutilate = "Mutilar"
slot8	Deathmark = "Marca letal"
slot9	Kingsbane = "Perdición de Reyes"
slot10	Vanish = "Esfumarse"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Garrote when  # Garrote desde Sigilo
	Vanish_Buff.up

use Deathmark when  # Marca letal
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up  # Burst activado, sangrados activos

use Kingsbane when  # Perdición de Reyes
	cd == 1 and Deathmark_DoT.up and Combo_Points < 50  # Marca letal en el objetivo, 0-3 puntos de combo
	or
	cd == 1 and Deathmark.cd >= 44 and Combo_Points < 50  # a Marca letal le faltan más de 52 s

use Vanish when  # Esfumarse
	Deathmark_DoT.up and Combo_Points < 65  # Marca letal en el objetivo, 0-4 puntos de combo

use Mutilate when  # Mutilar
	Combo_Points < 70
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Patrón: Burst",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "Garrote en el objetivo [703]", "spell": 703},
    {"n": 2, "alias": "Rupture_DoT", "label": "Ruptura en el objetivo [1943]", "spell": 1943},
    {"n": 4, "alias": "Deathmark_DoT", "label": "Marca letal en el objetivo [360194]", "spell": 360194},
    {"n": 10, "alias": "Vanish_Buff", "label": "Esfumarse [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 letal", "spell": 360194},
    {"n": 9, "alias": "Kingsbane", "label": "Perdición de Reyes", "spell": 385627},
    {"n": 10, "alias": "Vanish", "label": "Esfumarse", "spell": 1856, "offGcd": true, "queue": true}
  ],
  "rules": [
    {"use": "Garrote", "name": "Garrote desde Sigilo", "when": [
      {"all": ["Vanish_Buff.up"]}
    ]},
    {"use": "Deathmark", "name": "Marca letal", "when": [
      {"all": ["cd == 1", "Garrote_DoT.up", "Rupture_DoT.up"], "comment": "Burst activado, sangrados activos"}
    ]},
    {"use": "Kingsbane", "name": "Perdición de Reyes", "when": [
      {"all": ["cd == 1", "Deathmark_DoT.up", "Combo_Points < 50"], "comment": "Marca letal en el objetivo, 0-3 puntos de combo"},
      {"all": ["cd == 1", "Deathmark.cd >= 44", "Combo_Points < 50"], "comment": "a Marca letal le faltan más de 52 s"}
    ]},
    {"use": "Vanish", "name": "Esfumarse", "when": [
      {"all": ["Deathmark_DoT.up", "Combo_Points < 65"], "comment": "Marca letal en el objetivo, 0-4 puntos de combo"}
    ]},
    {"use": "Mutilate", "name": "Mutilar", "when": [
      {"all": ["Combo_Points < 70"]}
    ]}
  ]
}
```


- Esfumarse va fuera del GCD, pero también lleva «En la ventana de cola» (**O + Q**): si no, se pulsaría en mitad del GCD justo después de Perdición de Reyes, antes de que lleguen los puntos de combo de Perdición de Reyes, y comprobaría el recuento antiguo.
- Si desactivas Burst, Marca letal y Perdición de Reyes esperan; Esfumarse espera a Marca letal.
- Perdición de Reyes con 0–3 puntos de combo: después llegan 5 más y no se desperdicia ninguno.

### Protección de una canalización

El juego termina algunas canalizaciones un poco antes del último golpe, y la siguiente pulsación las corta. La protección es la propia aura de la canalización: mientras le quede más del 8 %, no se cumple ninguna regla. La condición va en **todos** los grupos de todas las reglas. La marca **C** en la ranura de la canalización evita que se pulse dos veces al empezar.

*Texto KRC:*

```text
rotation "Patrón: protección de una canalización"

buff10	Killing_Spree_Buff = "Asesinato múltiple, canalización [51690]"
slot8	Killing_Spree = "Asesinato múltiple"
slot9	Dispatch = "Despachar"
slot11	Sinister_Strike = "Golpe siniestro"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Killing_Spree when  # Asesinato múltiple
	Combo_Points >= 80 and Killing_Spree_Buff.duration <= 8

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

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

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Patrón: protección de una canalización",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 10, "alias": "Killing_Spree_Buff", "label": "Asesinato múltiple, canalización [51690]", "spell": 51690}
  ],
  "slots": [
    {"n": 8, "alias": "Killing_Spree", "label": "Asesinato múltiple", "spell": 51690, "channel": true},
    {"n": 9, "alias": "Dispatch", "label": "Despachar", "spell": 2098},
    {"n": 11, "alias": "Sinister_Strike", "label": "Golpe siniestro", "spell": 193315}
  ],
  "rules": [
    {"use": "Killing_Spree", "name": "Asesinato múltiple", "when": [
      {"all": ["Combo_Points >= 80", "Killing_Spree_Buff.duration <= 8"]}
    ]},
    {"use": "Dispatch", "name": "Despachar", "when": [
      {"all": ["Combo_Points >= 80", "Killing_Spree_Buff.duration <= 8"]}
    ]},
    {"use": "Sinister_Strike", "name": "Golpe siniestro", "when": [
      {"all": ["Combo_Points < 80", "Killing_Spree_Buff.duration <= 8"]}
    ]}
  ]
}
```


- Por qué `<= 8` y no `.down`: sin canalización, al aura le queda 0 y la condición se cumple; durante la canalización solo espera al último 8 %, no a unas décimas de segundo de más después del final.
- Si el aura no se lee, la condición es falsa en todas las reglas y KeyRota no pulsa nada: es mejor saltarse una pulsación que cortar la canalización. Por eso el aura de la canalización debe estar en el perfil de Better Assistant.

### Una macro fuera del GCD en la ventana de cola

Hay dos tipos de «fuera del GCD»:
- **O**: el botón se pulsa al momento, incluso en mitad del GCD. Así Suerte prolongada (que prolonga A suertes) no pierde tiempo.
- **O + Q**: el botón va fuera del GCD, pero su macro o su resultado dependen del GCD. La macro de Subidón de adrenalina con Asesinato múltiple en la segunda línea (Asesinato múltiple activa el GCD) se pulsa en la ventana de cola al final del GCD, y Asesinato múltiple se lanza justo después de Subidón de adrenalina.

*La macro en el juego (ranura 1):*

```text
#showtooltip Subidón de adrenalina
/cast Subidón de adrenalina
/cast Asesinato múltiple
```


*Texto KRC:*

```text
rotation "Patrón: fuera del GCD"

buff2	Triple_Threat = "A suertes, nivel 3 [1214935]"
buff3	Jackpot = "A suertes, nivel 4 [1214937]"
buff6	Adrenaline_Rush_Buff = "Subidón de adrenalina [13750]"
slot1	Adrenaline_Rush = "Subidón de adrenalina + Asesinato múltiple (macro)"
slot4	Keep_It_Rolling = "Suerte prolongada"
slot11	Sinister_Strike = "Golpe siniestro"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Adrenaline_Rush when  # Subidón de adrenalina (+ Asesinato múltiple con la macro)
	Adrenaline_Rush_Buff.down and Combo_Points >= 7 and Combo_Points < 80  # 1-5 puntos de combo: con 0, el Asesinato múltiple de la macro no se lanza

use Keep_It_Rolling when  # Suerte prolongada
	Triple_Threat.up
	or
	Jackpot.up

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

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Patrón: fuera del GCD",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 2, "alias": "Triple_Threat", "label": "A suertes, nivel 3 [1214935]", "spell": 1214935},
    {"n": 3, "alias": "Jackpot", "label": "A suertes, nivel 4 [1214937]", "spell": 1214937},
    {"n": 6, "alias": "Adrenaline_Rush_Buff", "label": "Subidón de adrenalina [13750]", "spell": 13750}
  ],
  "slots": [
    {"n": 1, "alias": "Adrenaline_Rush", "label": "Subidón de adrenalina + Asesinato múltiple (macro)", "spell": 13750, "offGcd": true, "queue": true},
    {"n": 4, "alias": "Keep_It_Rolling", "label": "Suerte prolongada", "spell": 381989, "offGcd": true},
    {"n": 11, "alias": "Sinister_Strike", "label": "Golpe siniestro", "spell": 193315}
  ],
  "rules": [
    {"use": "Adrenaline_Rush", "name": "Subidón de adrenalina (+ Asesinato múltiple con la macro)", "when": [
      {"all": ["Adrenaline_Rush_Buff.down", "Combo_Points >= 7", "Combo_Points < 80"], "comment": "1-5 puntos de combo: con 0, el Asesinato múltiple de la macro no se lanza"}
    ]},
    {"use": "Keep_It_Rolling", "name": "Suerte prolongada", "when": [
      {"all": ["Triple_Threat.up"]},
      {"all": ["Jackpot.up"]}
    ]},
    {"use": "Sinister_Strike", "name": "Golpe siniestro", "when": [
      {"all": ["Combo_Points < 80"]}
    ]}
  ]
}
```


El ID de una ranura de macro es el ID del hechizo principal de la macro (Subidón de adrenalina, 13750): Better Assistant lo usa para poner el hechizo de la macro en la ranura, y KeyRota toma la tecla del botón de la macro en tu barra.

### Una defensa según la salud

Sanación o una habilidad defensiva por debajo de un umbral de salud, solo cuando «Cura / defensa» está activado en el panel. La ranura se muestra **en combate** («En combate», `"show": "combat"`) para que funcione sin objetivo. La regla va la primera: con poca salud, importa más que el daño.

*Texto KRC:*

```text
rotation "Patrón: una defensa según la salud"

slot4	Mutilate = "Mutilar"
slot11	Crimson_Vial = "Vial carmesí"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Crimson_Vial when  # Vial carmesí
	defensives == 1 and PlayerHP <= 40  # salud al 40 % o menos

use Mutilate when  # Mutilar
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Patrón: una defensa según la salud",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 4, "alias": "Mutilate", "label": "Mutilar", "spell": 1329},
    {"n": 11, "alias": "Crimson_Vial", "label": "Vial carmesí", "spell": 185311, "show": "combat"}
  ],
  "rules": [
    {"use": "Crimson_Vial", "name": "Vial carmesí", "when": [
      {"all": ["defensives == 1", "PlayerHP <= 40"], "comment": "salud al 40 % o menos"}
    ]},
    {"use": "Mutilate", "name": "Mutilar"}
  ]
}
```


«Cura / defensa» está desactivado de forma predeterminada: actívalo en el panel de ajustes rápidos cuando quieras defensas automáticas.

### Procs: por beneficio o por brillo

Comprueba un proc por su beneficio: en la rotación de banda de Asesinato, el beneficio de Punto ciego (`Blindside.up`) permite la regla de Emboscada. Si el juego resalta el botón cuando hay un proc, una regla puede leer el brillo (`Ambush.glow`), pero solo si de verdad ves ese brillo en tu barra.

*Texto KRC:*

```text
rotation "Patrón: un proc"

buff7	Blindside = "Punto ciego [121153]"
slot4	Mutilate = "Mutilar"
slot5	Ambush = "Emboscada"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Ambush when  # Emboscada (Punto ciego)
	Blindside.up and Combo_Points < 70

use Mutilate when  # Mutilar
	Combo_Points < 70
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Patrón: un proc",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 7, "alias": "Blindside", "label": "Punto ciego [121153]", "spell": 121153}
  ],
  "slots": [
    {"n": 4, "alias": "Mutilate", "label": "Mutilar", "spell": 1329},
    {"n": 5, "alias": "Ambush", "label": "Emboscada", "spell": 8676}
  ],
  "rules": [
    {"use": "Ambush", "name": "Emboscada (Punto ciego)", "when": [
      {"all": ["Blindside.up", "Combo_Points < 70"]}
    ]},
    {"use": "Mutilate", "name": "Mutilar", "when": [
      {"all": ["Combo_Points < 70"]}
    ]}
  ]
}
```


### Cargas

Un hechizo con cargas se pulsa con dos cargas o cuando la segunda casi está lista, para que su recarga nunca esté parada. Ejemplo: Disparo con púas del cazador (2 cargas).

*Texto KRC:*

```text
rotation "Patrón: cargas"

slot1	Barbed_Shot = "Disparo con púas"
slot2	Kill_Command = "Matar"
resource1	PlayerHP
resource2	TargetHP
resource3	Focus

use Barbed_Shot when  # Disparo con púas
	Barbed_Shot.charges >= 2  # las dos cargas
	or
	Barbed_Shot.charges == 1 and Barbed_Shot.cd <= 20  # la segunda casi está lista

use Kill_Command when  # Matar
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Patrón: cargas",
  "specID": 253,
  "resources": ["PlayerHP", "TargetHP", "Focus"],
  "slots": [
    {"n": 1, "alias": "Barbed_Shot", "label": "Disparo con púas", "spell": 217200},
    {"n": 2, "alias": "Kill_Command", "label": "Matar", "spell": 34026}
  ],
  "rules": [
    {"use": "Barbed_Shot", "name": "Disparo con púas", "when": [
      {"all": ["Barbed_Shot.charges >= 2"], "comment": "las dos cargas"},
      {"all": ["Barbed_Shot.charges == 1", "Barbed_Shot.cd <= 20"], "comment": "la segunda casi está lista"}
    ]},
    {"use": "Kill_Command", "name": "Matar"}
  ]
}
```


En un hechizo con cargas, `.cd` es la recarga de la carga siguiente: `Barbed_Shot.cd <= 20` significa que le queda como mucho un 20 % de la recarga.

### Distancia al objetivo

Cuando el objetivo está fuera del alcance cuerpo a cuerpo pero al alcance de una habilidad a distancia, pulsa esa habilidad en lugar de quedarte parado. Sin objetivo, la distancia es desconocida y la regla no se activa.

*Texto KRC:*

```text
rotation "Patrón: distancia"

slot10	Pistol_Shot = "Disparo de pistola"
slot11	Sinister_Strike = "Golpe siniestro"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Pistol_Shot when  # Disparo de pistola: el objetivo está lejos
	target.distance >= 10 and target.distance <= 20 and Combo_Points < 80

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

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Patrón: distancia",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 10, "alias": "Pistol_Shot", "label": "Disparo de pistola", "spell": 185763},
    {"n": 11, "alias": "Sinister_Strike", "label": "Golpe siniestro", "spell": 193315}
  ],
  "rules": [
    {"use": "Pistol_Shot", "name": "Disparo de pistola: el objetivo está lejos", "when": [
      {"all": ["target.distance >= 10", "target.distance <= 20", "Combo_Points < 80"]}
    ]},
    {"use": "Sinister_Strike", "name": "Golpe siniestro", "when": [
      {"all": ["Combo_Points < 80"]}
    ]}
  ]
}
```


Una regla cuerpo a cuerpo no necesita comprobar la distancia: si el objetivo está demasiado lejos, el hechizo no se puede usar y KeyRota pasa por sí sola a la regla siguiente.

### Movimiento

El botón «Movimiento» del panel es tu señal para la rotación: «ahora voy a tener que moverme». La rotación decide qué hacer; por ejemplo, cambiar a una habilidad a distancia.

*Texto KRC:*

```text
rotation "Patrón: movimiento"

slot10	Pistol_Shot = "Disparo de pistola"
slot11	Sinister_Strike = "Golpe siniestro"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Pistol_Shot when  # Disparo de pistola en movimiento
	movement == 1 and Combo_Points < 80

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

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Patrón: movimiento",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 10, "alias": "Pistol_Shot", "label": "Disparo de pistola", "spell": 185763},
    {"n": 11, "alias": "Sinister_Strike", "label": "Golpe siniestro", "spell": 193315}
  ],
  "rules": [
    {"use": "Pistol_Shot", "name": "Disparo de pistola en movimiento", "when": [
      {"all": ["movement == 1", "Combo_Points < 80"]}
    ]},
    {"use": "Sinister_Strike", "name": "Golpe siniestro", "when": [
      {"all": ["movement == 0", "Combo_Points < 80"]}
    ]}
  ]
}
```


### Hechizos con objetivo en el suelo

El botón «En el suelo» permite los hechizos que se colocan en el suelo. KeyRota solo pulsa una tecla, así que el lugar lo fija la macro: `[@player]` a tus pies, `[@cursor]` bajo el cursor.

*La macro en el juego:*

```text
#showtooltip Muerte y descomposición
/cast [@player] Muerte y descomposición
```


*Texto KRC:*

```text
rotation "Patrón: hechizos en el suelo"

slot1	Death_and_Decay = "Muerte y descomposición (macro @player)"
resource1	PlayerHP
resource2	TargetHP
resource3	Runes
resource4	Runic_Power

use Death_and_Decay when  # Muerte y descomposición
	ground_spells == 1 and enemies >= 2  # En el suelo activado, 2+ enemigos
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Patrón: hechizos en el suelo",
  "specID": 250,
  "resources": ["PlayerHP", "TargetHP", "Runes", "Runic_Power"],
  "slots": [
    {"n": 1, "alias": "Death_and_Decay", "label": "Muerte y descomposición (macro @player)", "spell": 43265}
  ],
  "rules": [
    {"use": "Death_and_Decay", "name": "Muerte y descomposición", "when": [
      {"all": ["ground_spells == 1", "enemies >= 2"], "comment": "En el suelo activado, 2+ enemigos"}
    ]}
  ]
}
```


### La rotación inicial completa

La rotación del [ejemplo del constructor](https://keyrota.app/documentation/es/editor#walkthrough): dos sangrados, un generador, un gasto con acumulación, una defensa y Marca letal con Burst.

*Texto KRC:*

```text
rotation "Asesinato: ejemplo v1"

# Ejemplo de la documentación de KeyRota: dos sangrados, un generador, un gasto con acumulación de energía,
# una defensa con poca salud y Marca letal en el botón Burst.
# Puntos de combo en porcentaje de 7: 5 puntos = 71 %, umbral 70 = 5+.

buff1	Garrote_DoT = "Garrote en el objetivo [703]"
buff2	Rupture_DoT = "Ruptura en el objetivo [1943]"
buff3	Envenom_Buff = "Envenenar [32645]"
buff4	Deathmark_DoT = "Marca letal en el objetivo [360194]"
slot1	Garrote = "Garrote"
slot2	Rupture = "Ruptura"
slot3	Envenom = "Envenenar"
slot4	Mutilate = "Mutilar"
slot5	Deathmark = "Marca letal"
slot6	Crimson_Vial = "Vial carmesí"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

# --- Defensa: solo con «Cura / defensa» activado ---
use Crimson_Vial when  # Vial carmesí
	defensives == 1 and PlayerHP <= 40  # salud al 40 % o menos

# --- Reutilización: solo con Burst activado ---
use Deathmark when  # Marca letal
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up and Envenom_Buff.up  # Burst activado, sangrados y Envenenar activos

# --- Sangrados ---
use Garrote when  # Garrote
	Garrote_DoT.down  # sin sangrado
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30  # ventana de pandemia: queda un 30 % o menos

use Rupture when  # Ruptura
	Combo_Points >= 70 and Rupture_DoT.down  # 5+ puntos de combo, sin sangrado
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # 5+ puntos de combo, ventana de pandemia

# --- Gasto: 5+ puntos de combo, acumulando energía ---
use Envenom when  # Envenenar
	Combo_Points >= 70 and Envenom_Buff.down  # sin beneficio
	or
	Combo_Points >= 70 and Envenom_Buff.up and Envenom_Buff.duration <= 20  # el beneficio se acaba
	or
	Combo_Points >= 70 and Energy >= 70  # no desbordar la energía
	or
	Combo_Points >= 70 and Deathmark_DoT.up  # Marca letal en el objetivo

# --- Generador: menos de 5 puntos de combo ---
use Mutilate when  # Mutilar
	Combo_Points < 70  # menos de 5 puntos de combo
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Asesinato: ejemplo v1",
  "specID": 259,
  "ignoreMainIcon": true,
  "enemies": {"range": 8, "combatOnly": true},
  "notes": [
    "Ejemplo de la documentación de KeyRota: dos sangrados, un generador, un gasto con acumulación de energía,",
    "una defensa con poca salud y Marca letal en el botón Burst.",
    "Puntos de combo en porcentaje de 7: 5 puntos = 71 %, umbral 70 = 5+."
  ],
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "Garrote en el objetivo [703]", "spell": 703},
    {"n": 2, "alias": "Rupture_DoT", "label": "Ruptura en el objetivo [1943]", "spell": 1943},
    {"n": 3, "alias": "Envenom_Buff", "label": "Envenenar [32645]", "spell": 32645},
    {"n": 4, "alias": "Deathmark_DoT", "label": "Marca letal en el objetivo [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 letal", "spell": 360194, "show": "target"},
    {"n": 6, "alias": "Crimson_Vial", "label": "Vial carmesí", "spell": 185311, "show": "combat"}
  ],
  "rules": [
    {
      "use": "Crimson_Vial",
      "name": "Vial carmesí",
      "note": ["--- Defensa: solo con «Cura / defensa» activado ---"],
      "when": [{"all": ["defensives == 1", "PlayerHP <= 40"], "comment": "salud al 40 % o menos"}]
    },
    {
      "use": "Deathmark",
      "name": "Marca letal",
      "note": ["--- Reutilización: solo con Burst activado ---"],
      "when": [
        {
          "all": ["cd == 1", "Garrote_DoT.up", "Rupture_DoT.up", "Envenom_Buff.up"],
          "comment": "Burst activado, sangrados y Envenenar activos"
        }
      ]
    },
    {
      "use": "Garrote",
      "name": "Garrote",
      "note": ["--- Sangrados ---"],
      "when": [
        {"all": ["Garrote_DoT.down"], "comment": "sin sangrado"},
        {
          "all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"],
          "comment": "ventana de pandemia: queda un 30 % o menos"
        }
      ]
    },
    {
      "use": "Rupture",
      "name": "Ruptura",
      "when": [
        {"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "5+ puntos de combo, sin sangrado"},
        {
          "all": ["Combo_Points >= 70", "Rupture_DoT.up", "Rupture_DoT.duration <= 30"],
          "comment": "5+ puntos de combo, ventana de pandemia"
        }
      ]
    },
    {
      "use": "Envenom",
      "name": "Envenenar",
      "note": ["--- Gasto: 5+ puntos de combo, acumulando energía ---"],
      "when": [
        {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "sin beneficio"},
        {
          "all": ["Combo_Points >= 70", "Envenom_Buff.up", "Envenom_Buff.duration <= 20"],
          "comment": "el beneficio se acaba"
        },
        {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "no desbordar la energía"},
        {"all": ["Combo_Points >= 70", "Deathmark_DoT.up"], "comment": "Marca letal en el objetivo"}
      ]
    },
    {
      "use": "Mutilate",
      "name": "Mutilar",
      "note": ["--- Generador: menos de 5 puntos de combo ---"],
      "when": [{"all": ["Combo_Points < 70"], "comment": "menos de 5 puntos de combo"}]
    }
  ]
}
```


### Una rotación de banda completa

Una rotación real de Asesinato para banda (Fatebound): 15 reglas, Burst, Esfumarse con Marca letal en el objetivo, copia de sangrados con Tempestad carmesí, AoE y un objetivo, y acumulación de energía.

**Texto KRC: Asesinato, banda**
*Texto KRC:*

```text
rotation "Asesinato, banda v2.8: botón Burst, Method 12.1, SimulationCraft, mejores registros"

# Asesinato, banda. Base: la guía de Method (parche 12.1), la lista de acciones de SimulationCraft y los mejores jugadores de Warcraft Logs.
# Ignorar el icono principal: activado. Marca letal y Perdición de Reyes solo con Burst activado; Esfumarse solo mientras Marca letal esté en el objetivo.
# Puntos de combo en porcentaje de 7: 3 = 43 %, 4 = 57 %, 5 = 71 %, 6 = 86 %, 7 = 100 %.

# v2.4: Perdición de Reyes solo con 0–3 puntos de combo (Golpes implacables luego dan 5), Esfumarse con 0–4 (Garrote desde Sigilo da 3).
# v2.5: Tempestad carmesí solo cuando solo uno de los dos sangrados es reciente; antes se pulsaba varias veces seguidas.
# v2.6: con Burst activado y Marca letal lista o ya en el objetivo, Garrote y Ruptura se aplican a un objetivo con cualquier salud.
# v2.7 y v2.8: objetivo nuevo sin sangrados, Burst activado, Marca letal lista, 2+ enemigos cerca: primero Tempestad carmesí copia los sangrados (con cualquier cantidad de puntos de combo), luego Marca letal.

buff1	Garrote_DoT = "Garrote en el objetivo [703]"
buff2	Rupture_DoT = "Ruptura en el objetivo [1943]"
buff3	Envenom_Buff = "Envenenar [32645]"
buff4	Deathmark_DoT = "Marca letal en el objetivo [360194]"
buff5	Improved_Garrote = "Garrote mejorado [392401]"
buff6	Darkest_Night = "Noche cerrada [457280]"
buff7	Blindside = "Punto ciego [121153]"
buff8	Stealth_Buff = "Sigilo [1784]"
buff9	Stealth_Sub = "Sigilo (Subterfugio) [115191]"
buff10	Vanish_Buff = "Esfumarse [11327]"
slot1	Garrote = "Garrote"
slot2	Rupture = "Ruptura"
slot3	Envenom = "Envenenar"
slot4	Mutilate = "Mutilar"
slot5	Ambush = "Emboscada"
slot6	Fan_of_Knives = "Abanico de cuchillos"
slot7	Crimson_Tempest = "Tempestad carmesí"
slot8	Deathmark = "Marca letal"
slot9	Kingsbane = "Perdición de Reyes"
slot10	Vanish = "Esfumarse"
slot11	Crimson_Vial = "Vial carmesí"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

# --- Defensa: solo con «Cura / defensa» activado ---
use Crimson_Vial when  # Vial carmesí
	defensives == 1 and PlayerHP <= 40  # salud al 40 % o menos

# === Sigilo ===
use Garrote when  # Garrote desde Sigilo
	Stealth_Buff.up  # en sigilo
	or
	Stealth_Sub.up  # en sigilo (Subterfugio)
	or
	Vanish_Buff.up  # justo después de Esfumarse

use Garrote when  # Garrote: ventana de Garrote mejorado
	Improved_Garrote.up and Garrote_DoT.down  # ventana abierta, sin Garrote en el objetivo
	or
	Improved_Garrote.up and Garrote_DoT.duration <= 78  # SimulationCraft: renovar cuando quedan 14 de 18 segundos

# === Reutilizaciones (botón Burst) ===
use Deathmark when  # Marca letal
	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 activado, sangrados activos, Perdición de Reyes lista, Envenenar 2+ s más

use Kingsbane when  # Perdición de Reyes
	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 activado, Marca letal en el objetivo, 0–3 puntos 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 activado, Marca letal en más de 52 s, 0–3 puntos de combo

use Vanish when  # Esfumarse
	Deathmark_DoT.up and Improved_Garrote.down and Combo_Points < 65 and Stealth_Buff.down and Stealth_Sub.down  # Marca letal en el objetivo, 0–4 puntos de combo (Garrote desde Sigilo da 3)

# === Sangrados ===
use Crimson_Tempest when  # Tempestad carmesí: copiar los sangrados a un objetivo nuevo para Marca letal
	cd == 1 and Deathmark.cd <= 3 and Garrote_DoT.down and Rupture_DoT.down and Envenom_Buff.up and enemies >= 2  # los puntos de combo no importan

# Ningún sangrado nuevo en adds casi muertos (como «el objetivo vive 12+ s más» de SimulationCraft): con 1–2 objetivos y en modo «Uno», siempre;
# con 3+ objetivos, solo si el objetivo tiene 50 %+ de salud, o con Burst activado y Marca letal lista, o si Marca letal ya está en el objetivo.
use Garrote when  # Garrote: mantenimiento
	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+ objetivos: solo un objetivo que aguante
	or
	Garrote_DoT.down and Combo_Points < 95 and cd == 1 and Deathmark.cd <= 3  # Burst activado y Marca letal lista: la salud no importa
	or
	Garrote_DoT.down and Combo_Points < 95 and Deathmark_DoT.up  # Marca letal en el objetivo (sangrados copiados)
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30 and Combo_Points < 95  # ventana de pandemia (ya activo)

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+ objetivos: solo un objetivo que aguante
	or
	Combo_Points >= 70 and Rupture_DoT.down and cd == 1 and Deathmark.cd <= 3  # Burst activado y Marca letal lista
	or
	Combo_Points >= 70 and Rupture_DoT.down and Deathmark_DoT.up  # Marca letal en el objetivo
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 25 and Darkest_Night.down  # renovación; no gastar en ella los 7 puntos de combo de Noche cerrada

# === Generadores: hasta 5 puntos de combo, hasta 7 con Noche cerrada ===

# Tempestad carmesí una vez justo después de una Ruptura reciente (con 4+ objetivos también tras un Garrote reciente); si no, Abanico de cuchillos.
# Solo uno de los dos debe ser reciente (94 %+): justo después de Tempestad carmesí lo son los dos, así que la siguiente espera.
use Crimson_Tempest when  # Tempestad carmesí: extender los sangrados justo después de una Ruptura o un Garrote recientes
	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 objetivos: solo tras una Ruptura reciente
	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 objetivos: solo tras una Ruptura reciente

use Fan_of_Knives when  # Abanico de cuchillos: un objetivo, Noche cerrada, falta un punto 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  # Abanico de cuchillos: 2+ objetivos
	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  # Emboscada (Punto ciego)
	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+ puntos de combo (7 con Noche cerrada) ===
# SimulationCraft: no pulsarlo enseguida, sino mantener Envenenar activo: en el último segundo del beneficio, mientras Marca letal esté en el objetivo, antes de llenar la energía, antes con 4+ objetivos.
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  # queda ~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  # no desbordar la energía
	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
```


Su JSON está en los archivos de abajo. La segunda rotación es de Forajido (Trickster), con la macro de Subidón de adrenalina (**O + Q**), Suerte prolongada (**O**), Asesinato múltiple (**C**) y protección de la canalización en todas las reglas.

### Archivos de ejemplo

| Ejemplo | Archivos |
|---|---|
| La rotación inicial de Asesinato del ejemplo del constructor | [JSON](https://keyrota.app/documentation/examples/starter-assassination.es.json), [texto KRC](https://keyrota.app/documentation/examples/starter-assassination.es.txt) |
| Asesinato, banda: 15 reglas | [JSON](https://keyrota.app/documentation/examples/assassination-raid.es.json), [texto KRC](https://keyrota.app/documentation/examples/assassination-raid.es.txt) |
| Forajido, banda y mítica+: 13 reglas, marcas O, OQ y C | [JSON](https://keyrota.app/documentation/examples/outlaw-raid.es.json), [texto KRC](https://keyrota.app/documentation/examples/outlaw-raid.es.txt) |
| La rotación útil más corta | [JSON](https://keyrota.app/documentation/examples/minimal.es.json), [texto KRC](https://keyrota.app/documentation/examples/minimal.es.txt) |
| Una muestra de sintaxis: todas las condiciones y marcas (sin ID, no apta para combate) | [JSON](https://keyrota.app/documentation/examples/syntax-every-condition.es.json), [texto KRC](https://keyrota.app/documentation/examples/syntax-every-condition.es.txt) |

Todos los ejemplos existen en todos los idiomas del sitio: las etiquetas, las reglas y los comentarios están traducidos, mientras que las condiciones, los ID de hechizo y las marcas son los mismos. El idioma aparece en el nombre del archivo: `.es`, `.en`, `.ru`, `.de`, `.fr`, `.it`, `.pt`, `.ko`, `.zh`, `.zh-TW`.

Para abrir un archivo: «Nuevo» — «Desde un archivo…» en la ventana principal, o «Abrir…» en la página «Texto y JSON» del constructor.

---

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

## Crear una rotación con un agente de IA

> [!TIP] Basta con un enlace a esta página
> Puedes darle a tu agente de IA el enlace a esta página: lo entenderá todo por su cuenta y, si le falta algún dato, te lo pedirá.

Un agente de IA con acceso a la web y a archivos puede crear una rotación KRC por ti: estudiar los logs de los mejores jugadores de tu especialización, las guías y la lista de acciones de SimulationCraft, compararlos con tus talentos y tus logs, y entregarte un JSON listo. Aquí tienes qué darle, un prompt listo para usar y cómo comprobar el resultado.

### Qué necesitas

**Un agente** que pueda abrir sitios web (Warcraft Logs, Raider.IO, Wowhead, GitHub) y leer archivos. Si no tiene acceso a la web, dale la documentación y fragmentos de los logs como archivos.

**Documentación para el agente** (los enlaces ya están en el prompt):

| Enlace | Qué contiene |
|---|---|
| [llms.txt](https://keyrota.app/documentation/llms.txt) | El índice de la documentación para agentes de IA: todos los idiomas, archivos y ejemplos |
| [krc-guide.es.md](https://keyrota.app/documentation/krc-guide.es.md) | Toda la documentación en un solo archivo Markdown en este idioma; en 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) | El JSON Schema para validar la respuesta |
| [Asesinato, banda](https://keyrota.app/documentation/examples/assassination-raid.es.json), [Forajido, banda y mítica+](https://keyrota.app/documentation/examples/outlaw-raid.es.json) | Rotaciones de banda reales como modelo |

**Tus datos** (los marcadores del prompt):

| Marcador | Qué poner | Ejemplo |
|---|---|---|
| `{CLASS}` | Clase | Pícaro |
| `{SPEC}` | Especialización | Asesinato |
| `{HERO_TALENTS}` | Talentos de héroe | Fatebound |
| `{TALENT_STRING}` | La cadena de exportación de talentos del juego (ventana de talentos, «Compartir») | `CMQAAAAA…` |
| `{CONTENT}` | Banda o mítica+ | banda |
| `{RAID_OR_DUNGEONS}` | La banda o una lista de mazmorras | The Venomous Abyss |
| `{DIFFICULTY}` | Dificultad o nivel de piedra angular | heroica |
| `{BOSSES}` | Jefes para los que es la rotación | todos |
| `{ITEM_LEVEL}` | Nivel de objeto | 328 |
| `{MY_LOGS}` | Un enlace a tu personaje o a un informe en Warcraft Logs | `https://www.warcraftlogs.com/character/eu/<reino>/<nombre>` |
| `{COMBAT_LOG_FILE}` | El archivo del registro de combate que adjuntas | `WoWCombatLog-101726_214449.txt` |
| `{PREFERENCES}` | Tus preferencias | «reutilizaciones solo con el botón Burst, sin defensas» |

### El prompt

El agente reúne los datos por su cuenta, los compara con los tuyos y explica cada regla. Rellena las llaves y adjunta un registro de combate si lo tienes.

*Prompt:*

```text
Eres un experto en World of Warcraft y autor de rotaciones para KeyRota. Créame una rotación avanzada de KeyRota: un JSON en formato keyrota-rotation, versión 1.

MI PERSONAJE
- Clase y especialización: {CLASS}, {SPEC}. Talentos de héroe: {HERO_TALENTS}.
- Cadena de talentos del juego: {TALENT_STRING}
- Contenido: {CONTENT}: {RAID_OR_DUNGEONS}. Dificultad o niveles de piedra angular: {DIFFICULTY}. Jefes: {BOSSES}.
- Nivel de objeto: {ITEM_LEVEL}.
- Mis logs de Warcraft Logs: {MY_LOGS}
- Registro de combate (adjunto): {COMBAT_LOG_FILE}
- Preferencias: {PREFERENCES}

PASO 1. APRENDE EL FORMATO DE KEYROTA
- https://keyrota.app/documentation/llms.txt y https://keyrota.app/documentation/krc-guide.en.md: ranuras (hasta 12), auras (hasta 12, solo mis beneficios y mis perjuicios sobre el objetivo), recursos en porcentaje, todas las condiciones, marcas de ranura, los interruptores del panel aoe, st, cd, defensives, ground_spells y movement, reglas comprobadas de arriba abajo, grupos O de condiciones Y, límites de 16 grupos de 16 condiciones; un valor desconocido hace falsa la condición.
- JSON Schema: https://keyrota.app/documentation/keyrota-rotation.schema.json
- Modelos: https://keyrota.app/documentation/examples/assassination-raid.en.json y https://keyrota.app/documentation/examples/outlaw-raid.en.json

PASO 2. REÚNE LOS DATOS
1. Warcraft Logs: clasificaciones de daño de {SPEC} ({CLASS}) para cada jefe ({CONTENT}, {DIFFICULTY}); para mítica+, para cada mazmorra y nivel de piedra angular. Toma los 5-10 mejores logs con los talentos de héroe {HERO_TALENTS}.
2. Compara sus talentos con mi cadena. Señala las diferencias que cambian la prioridad y dime si debería cogerlas.
3. De los mejores logs, reúne: la apertura y el orden de lanzamientos; el tiempo activo de los beneficios y perjuicios importantes; los recursos en cada lanzamiento (puntos de combo o su equivalente en los remates, energía o su equivalente antes de gastar, recurso perdido por llegar al máximo); cuándo y junto con qué se usan las reutilizaciones importantes y cómo se cuadran con las fases; cuándo y con qué salud se usan las defensas; a partir de cuántos objetivos pasan a AoE; lanzamientos por minuto y tiempo sin lanzar.
4. Para mítica+: Raider.IO (el meta, las mejores partidas, los talentos por mazmorra).
5. Guías (Wowhead, Method, el Discord de la clase) y la lista de acciones (APL) de SimulationCraft para {SPEC} en la rama de la expansión actual: úsala como prioridad base y contrástala con los logs.
6. Mis logs y mi registro de combate: dónde mis tiempos activos, los recursos en los gastos, las reutilizaciones y el ritmo se apartan de los mejores jugadores.

PASO 3. ESCRIBE LA ROTACIÓN
- "format": "keyrota-rotation", "version": 1, el specID de mi especialización, los recursos de la tabla de especializaciones de la documentación (resource1 PlayerHP, resource2 TargetHP y después los recursos de la especialización), "ignoreMainIcon": true.
- Ranuras: ID de hechizo reales de Wowhead (el campo spell). "show": "combat" para sanación y defensas. Marcas: offGcd para los hechizos fuera del GCD; offGcd y queue para las macros cuya segunda línea activa el GCD y para los botones que necesitan el resultado del golpe anterior; channel para las canalizaciones; manual para lo que pulso yo. Para una ranura de macro, escribe el texto de la macro (#showtooltip y /cast).
- Auras: los ID de los propios beneficios y perjuicios, no de los hechizos que los aplican. Solo mis auras.
- Reglas por orden de prioridad. Las defensas primero y solo con defensives == 1. Las reutilizaciones importantes solo con cd == 1 (el botón Burst, no el tiempo de reutilización de un hechizo); lo que refuerza la ventana de la reutilización, solo dentro de ella. Un objetivo y AoE: un grupo aoe == 1 y un grupo st == 0 and enemies >= N para AoE; un grupo st == 1 y un grupo aoe == 0 and enemies <= 1 para un objetivo. DoT: un grupo X.down y un grupo X.up and X.duration <= 30. Recursos en porcentaje, umbrales a medio camino entre escalones (puntos de combo de 7: «al menos 5» es Combo_Points >= 70, «como mucho 3» es Combo_Points < 50). Si el botón siguiente corta una canalización, añade X.duration <= 8 del aura de la canalización a todos los grupos de todas las reglas.
- KRC no tiene not, != ni paréntesis: usa los pares up/down, ready/oncd, glow/noglow, los operadores inversos y varios grupos.
- Escribe las etiquetas (label), los nombres de las reglas y los comentarios en español, y los nombres que se usan en las condiciones (alias), con letras latinas.
- Pon a cada regla un nombre (name) y a cada grupo un comentario breve (comment): qué y por qué.
- Al final, comprueba: el JSON cumple el esquema; todos los nombres de las condiciones están declarados; no hay más de 16 condiciones en un grupo ni más de 16 grupos en una regla; los ID existen en Wowhead para el parche actual.

RESPUESTA
1. El JSON completo de la rotación en un solo bloque.
2. Los textos de las macros para las ranuras de macro.
3. Una tabla: regla, qué hace y de dónde sale (qué log, guía o línea de la APL).
4. Qué activar en el juego: botones del panel de ajustes rápidos, el radio del contador de enemigos, qué poner en las barras de acción.
5. Un plan de pruebas: un muñeco de entrenamiento y después un registro de combate frente a los mejores logs; qué cifras comparar.
```


### Un prompt rellenado

El mismo prompt completo, rellenado para Asesinato en una banda heroica:

*Prompt: Asesinato, banda heroica:*

```text
Eres un experto en World of Warcraft y autor de rotaciones para KeyRota. Créame una rotación avanzada de KeyRota: un JSON en formato keyrota-rotation, versión 1.

MI PERSONAJE
- Clase y especialización: Pícaro, Asesinato. Talentos de héroe: Fatebound.
- Cadena de talentos del juego: CMQAAAAAAAAAAAAAAAAAAAAAAYmlZmFDGAAAAAYWGsNDAAAAAILzMzMzMjxyMzMbzsMzMPgZMzYMMzYMAGYBmxoxsBYbAbGAMzMGD
- Contenido: banda: The Venomous Abyss. Dificultad: heroica. Jefes: todos; presta especial atención a Ula'tek (ventanas de daño en el Corazón).
- Nivel de objeto: 328.
- Mis logs de Warcraft Logs: https://www.warcraftlogs.com/character/eu/<reino>/<nombre>
- Registro de combate (adjunto): WoWCombatLog-101726_214449.txt, 5 minutos contra un muñeco de entrenamiento, un solo objetivo.
- Preferencias: Marca letal y Perdición de Reyes solo con el botón Burst; Esfumarse solo con Marca letal en el objetivo; Vial carmesí con un 40 % de salud o menos; acumulación de energía como en SimulationCraft.

PASO 1. APRENDE EL FORMATO DE KEYROTA
- https://keyrota.app/documentation/llms.txt y https://keyrota.app/documentation/krc-guide.en.md: ranuras (hasta 12), auras (hasta 12, solo mis beneficios y mis perjuicios sobre el objetivo), recursos en porcentaje, todas las condiciones, marcas de ranura, los interruptores del panel aoe, st, cd, defensives, ground_spells y movement, reglas comprobadas de arriba abajo, grupos O de condiciones Y, límites de 16 grupos de 16 condiciones; un valor desconocido hace falsa la condición.
- JSON Schema: https://keyrota.app/documentation/keyrota-rotation.schema.json
- Modelos: https://keyrota.app/documentation/examples/assassination-raid.en.json y https://keyrota.app/documentation/examples/outlaw-raid.en.json

PASO 2. REÚNE LOS DATOS
1. Warcraft Logs: clasificaciones de daño de Asesinato (Pícaro) para cada jefe (banda The Venomous Abyss, dificultad heroica). Toma los 5-10 mejores logs con los talentos de héroe Fatebound.
2. Compara sus talentos con mi cadena. Señala las diferencias que cambian la prioridad y dime si debería cogerlas.
3. De los mejores logs, reúne: la apertura y el orden de lanzamientos; el tiempo activo de Garrote, Ruptura y el beneficio de Envenenar; los puntos de combo en Envenenar, Ruptura, Perdición de Reyes y Esfumarse, la energía antes de Envenenar, la energía y los puntos de combo perdidos por llegar al máximo; cuándo y junto con qué se usan Marca letal y Perdición de Reyes y cómo se cuadran con las fases (sobre todo con el Corazón en Ula'tek); cuándo y con qué salud se usan Vial carmesí y otras defensas; a partir de cuántos objetivos pasan a Abanico de cuchillos y Tempestad carmesí; lanzamientos por minuto y tiempo sin lanzar.
4. Guías (Wowhead, Method, el Discord de pícaros) y la lista de acciones (APL) de SimulationCraft para Asesinato en la rama de la expansión actual: úsala como prioridad base y contrástala con los logs.
5. Mis logs y mi registro de combate: dónde mis tiempos activos, los puntos de combo en los gastos, las reutilizaciones y el ritmo se apartan de los mejores jugadores.

PASO 3. ESCRIBE LA ROTACIÓN
- "format": "keyrota-rotation", "version": 1, "specID": 259, "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"], "ignoreMainIcon": true.
- Ranuras: ID de hechizo reales de Wowhead (el campo spell). "show": "combat" para Vial carmesí. Marcas: offGcd para los hechizos fuera del GCD; offGcd y queue para Esfumarse (necesita los puntos de combo del golpe anterior); channel para las canalizaciones, si las hay; manual para lo que pulso yo. Para una ranura de macro, escribe el texto de la macro (#showtooltip y /cast).
- Auras: los ID de los propios beneficios y perjuicios, no de los hechizos que los aplican (por ejemplo, el beneficio de Esfumarse no es lo mismo que el hechizo). Solo mis auras.
- Reglas por orden de prioridad. Vial carmesí primero y solo con defensives == 1 y la salud al 40 % o menos. Marca letal y Perdición de Reyes solo con cd == 1 (el botón Burst, no el tiempo de reutilización de un hechizo); Esfumarse solo mientras Marca letal esté en el objetivo. Un objetivo y AoE: un grupo aoe == 1 y un grupo st == 0 and enemies >= 2 para Abanico de cuchillos; un grupo st == 1 y un grupo aoe == 0 and enemies <= 1 para Mutilar. Garrote y Ruptura: un grupo X.down y un grupo X.up and X.duration <= 30. Puntos de combo de 7 en porcentaje, umbrales a medio camino entre escalones: «al menos 5» es Combo_Points >= 70, «como mucho 3» es Combo_Points < 50. Acumulación de energía: Envenenar con 5+ puntos de combo cuando el beneficio se está acabando, con Marca letal en el objetivo o con Energy >= 70.
- KRC no tiene not, != ni paréntesis: usa los pares up/down, ready/oncd, glow/noglow, los operadores inversos y varios grupos.
- Escribe las etiquetas (label), los nombres de las reglas y los comentarios en español, y los nombres que se usan en las condiciones (alias), con letras latinas.
- Pon a cada regla un nombre (name) y a cada grupo un comentario breve (comment): qué y por qué.
- Al final, comprueba: el JSON cumple el esquema; todos los nombres de las condiciones están declarados; no hay más de 16 condiciones en un grupo ni más de 16 grupos en una regla; los ID existen en Wowhead para el parche actual.

RESPUESTA
1. El JSON completo de la rotación en un solo bloque.
2. Los textos de las macros para las ranuras de macro.
3. Una tabla: regla, qué hace y de dónde sale (qué log, guía o línea de la APL).
4. Qué activar en el juego: botones del panel de ajustes rápidos, el radio del contador de enemigos, qué poner en las barras de acción.
5. Un plan de pruebas: un muñeco de entrenamiento y después un registro de combate frente a los mejores logs; qué cifras comparar.
```


### Cómo analizar los logs

Pistas para el agente y para ti: de dónde sacar los datos y qué comparar.

**Warcraft Logs**
- Clasificaciones: `https://www.warcraftlogs.com/zone/rankings/<zone id>?boss=<boss id>&class=<Class>&spec=<Spec>&difficulty=<3|4|5>&metric=dps` (3 normal, 4 heroica, 5 mítica). Las clasificaciones de mítica+ se dividen por nivel de piedra angular.
- En el informe de un jugador: la pestaña Casts (orden y momento de los lanzamientos), Buffs y Debuffs (tiempo activo), Resources (recursos y desbordamiento), Damage Done (por habilidad y objetivo), Deaths.
- Talentos desde un log: el resumen del jugador incluye la cadena de exportación de talentos; ábrela en la calculadora de talentos de Wowhead.
- Compara el comportamiento, no el DPS: tiempo activo de DoT y beneficios, recursos en los gastos, lanzamientos por minuto, tiempo sin lanzar y el momento de las reutilizaciones importantes respecto a las fases del combate.

**Raider.IO** (mítica+)
- Las mejores partidas de una mazmorra: `https://raider.io/api/v1/mythic-plus/runs?season=<season>&region=world&dungeon=<slug>&page=0`; temporadas y mazmorras: `https://raider.io/api/v1/mythic-plus/static-data?expansion_id=<id>`.
- El meta cambia de una semana a otra: usa datos recientes, no conclusiones antiguas.

**SimulationCraft**
- La lista de acciones (APL) de una especialización está en el repositorio `simulationcraft/simc` de GitHub, en la rama de la expansión actual, dentro de la carpeta `ActionPriorityLists`.
- Cómo pasar una APL a KRC:

| APL de SimulationCraft | KRC |
|---|---|
| líneas `actions`, de arriba abajo | reglas, de arriba abajo |
| `buff.X.up` | `X.up` |
| `dot.X.remains`, `buff.X.remains` | `X.duration` en porcentaje |
| `cooldown.X.remains` | `X.cd` en porcentaje |
| `combo_points`, `energy` | recursos en porcentaje |
| `active_enemies` | `enemies` |
| `target.time_to_die`, segundos exactos | no existe; el sustituto más cercano, por ejemplo, «el objetivo vive 12 segundos más» es `TargetHP >= 50` con 3 objetivos o más |

**El registro de combate**
- Con el registro avanzado, cada `SPELL_CAST_SUCCESS` incluye los recursos de quien lanza (tipo, valor actual, máximo); la energía es el tipo 3.
- `SPELL_AURA_APPLIED`, `SPELL_AURA_REFRESH`, `SPELL_AURA_REMOVED`: tiempo activo y renovaciones de las auras; `SPELL_ENERGIZE`: recursos obtenidos; `SPELL_CAST_FAILED`: pulsaciones que el juego rechazó.
- Cuenta: lanzamientos por minuto, huecos entre GCD, tiempo activo de los DoT, puntos de combo en los remates, energía desbordada y el momento de las reutilizaciones importantes.

### Grabar un registro de combate

1. En las opciones del juego, sección «Red», activa «Registro de combate avanzado» (Advanced Combat Logging). Sin él, el registro no incluye recursos ni posiciones.
2. Antes de iniciar el combate, escribe `/combatlog` en el chat: empieza la grabación. Después del combate, vuelve a escribir `/combatlog`: la grabación se detiene.
3. El archivo está en la carpeta del juego: `World of Warcraft\_retail_\Logs\WoWCombatLog-MMDDYY_HHMMSS.txt`. El juego lo escribe con retraso: espera un minuto después de detener la grabación.
4. El programa de subida de Warcraft Logs puede vaciar el archivo después de subirlo: cópialo antes.

Haz las primeras pruebas con un muñeco de entrenamiento: 2–3 minutos contra un solo objetivo y después contra un grupo de muñecos para el AoE.

### Pruebas e iteraciones

1. Carga la rotación (consulta más abajo), crea y pega el perfil de Better Assistant, y coloca los hechizos de las ranuras en tus barras con sus teclas.
2. Pruébala con un muñeco. El «Registro» de la ventana principal muestra lo que se pulsa. El archivo de registro de KeyRota (el botón de la carpeta junto a «Registro») anota, en cada GCD, la regla elegida y por qué se omitieron las reglas superiores: condiciones, no lista, desconocido, manual.
3. Dale al agente el JSON de la rotación, un registro de combate reciente y, si hace falta, el registro de KeyRota. Pídele que lo compare con los mejores logs: tiempo activo, recursos en los gastos, reutilizaciones, tiempo inactivo.
4. Cambia una regla cada vez y mantén la versión en el nombre de la rotación («v1.3»). Guarda las versiones antiguas: «Exportar» en la ventana principal o «Texto y JSON» — «Guardar…».
5. Después de la banda o de la piedra angular, vuelve a comparar con Warcraft Logs.

### Cargar el resultado

- **Como archivo:** guarda el JSON de la respuesta como archivo `.json` y después usa «Rotación» — «Nuevo» — «Desde un archivo…».
- **Desde el portapapeles:** copia el JSON y después usa «Nuevo» — «Desde el portapapeles».
- **En una rotación abierta:** en el constructor, «Texto y JSON» — «JSON» — «Pegar». Las ranuras con el mismo número conservan sus ID, sus marcas y su visibilidad si el JSON nuevo no los trae.

La barra de estado del constructor debe indicar «Rotación válida». Si hay un error, se indica el lugar: pásaselo al agente tal cual. Después, «General» — «Crear desde ranuras y auras» — «Copiar» y, en el juego, `/ba` — Profile — pega — Apply. Crea en el juego las macros de la respuesta y colócalas en tus barras.

---

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

## Preguntas frecuentes y solución de problemas

### Una regla nunca se activa

Compruébalo en este orden:

1. **Siempre gana una regla superior.** Las reglas se comprueban de arriba abajo: si una regla de más arriba se cumple y su hechizo se puede usar, a la tuya nunca le llega el turno. Sube tu regla o restringe las condiciones de la de arriba.
2. **Un valor desconocido.** Una condición sobre un valor desconocido es falsa, incluso `.down`. Un aura es desconocida cuando no está en el perfil de Better Assistant o tiene un ID incorrecto. Vuelve a crear el perfil («Crear desde ranuras y auras») y pégalo en el juego.
3. **El ID del aura, no el del hechizo.** Un beneficio puede tener un ID distinto del hechizo que lo aplica: Esfumarse es `1856` y su beneficio, `11327`. Además, las reglas solo ven tus auras, no los beneficios de otros jugadores.
4. **La ranura no está lista.** Falta recurso, el objetivo está demasiado lejos, hay un tiempo de reutilización o no tienes el talento. Esa regla se omite sin ningún error.
5. **Better Assistant no muestra la ranura.** Una ranura «Con objetivo» no está lista si no hay objetivo. Usa «En combate» para sanación y habilidades defensivas.
6. **No hay tecla.** El hechizo de la ranura debe estar en una barra de acción con una tecla asignada (o en una macro con `#showtooltip`).
7. **Un interruptor está desactivado.** «Cura / defensa» está desactivado de forma predeterminada, puede que hayas desactivado Burst con su tecla (F3 en Windows, ⌃⇧B en macOS) o que el modo de objetivos siga en «Uno» o «Varios».
8. **Porcentajes.** 5 puntos de combo son `70`, no `5`. Consulta [Recursos](https://keyrota.app/documentation/es/conditions#resources).
9. **Acumulaciones.** Una sola acumulación se lee como 0: `X.stacks >= 1` no distingue una acumulación de que no haya aura; usa `.up`.
10. **Un aura sin duración.** A Sigilo y auras similares siempre les queda 1: `.duration` no funciona con ellas.

El archivo de registro de KeyRota muestra qué regla se eligió y por qué se omitieron las de arriba: es el botón de la carpeta junto a «Registro», en la ventana principal.

### Pulsa demasiado pronto o demasiado tarde

| Qué ves | Causa | Qué hacer |
|---|---|---|
| Un hechizo fuera del GCD espera al final del GCD | Falta la marca O | Activa «Fuera del GCD (O)». |
| Un botón fuera del GCD se pulsa antes de que llegue el resultado del golpe anterior | La marca O pulsa al momento, en mitad del GCD | Añade «En la ventana de cola (Q)»: O + Q. |
| Una macro cuya segunda línea activa el GCD no se ejecuta entera | La macro se pulsó en mitad del GCD | O + Q: la macro se pulsa al final del GCD. |
| Una regla fuera del GCD de más abajo no se adelanta a una de más arriba | Es intencionado: prioridad estricta | Sube la regla. |
| Después de gastar, la rotación «se queda parada» | Acumulación de recursos: no se cumple ninguna regla | Es normal; para gastar antes, baja el umbral de energía. |
| La rotación no pulsa nada mientras pulsas tus propios botones | KeyRota se aparta cuando pulsas habilidades | Es normal. |

### Se corta una canalización

- Activa «Canalización (C)» en la ranura: durante la canalización, KeyRota no pulsa nada y no pulsa la ranura dos veces al empezar.
- El juego termina algunas canalizaciones un poco antes del último golpe, y una pulsación justo después del final de la canalización la corta. Añade el aura de la canalización a las auras de la rotación y la condición `Aura_de_la_canalización.duration <= 8` a **todos los grupos de todas las reglas**. Ejemplo: [Protección de una canalización](https://keyrota.app/documentation/es/patterns#channel).

### No pasa a AoE

1. ¿Está el modo de objetivos en Auto (F2 en Windows, ⌃⇧T en macOS, que alterna en ciclo Auto, Uno y Varios)? En modo Uno, las reglas con `st == 0` no se activan.
2. ¿Están activadas en el juego las placas de nombre de enemigos (V), sin ocultar a los enemigos menores?
3. ¿El radio del contador en la página «General» es al menos igual al radio de tu habilidad de AoE?
4. «Solo enemigos en combate»: no se cuentan los enemigos que aún no están en combate. Con grupos de enemigos que entran de uno en uno, el recuento puede ser menor.
5. El umbral de la regla: ¿`enemies >= 2` o `>= 3`?
6. Después de cambiar el radio, vuelve a crear y a pegar el perfil de Better Assistant.

### Burst no se activa o se activa a destiempo

- `cd == 1` es **el botón Burst** (F3 en Windows, ⌃⇧B en macOS, el botón «Burst» del panel), no el tiempo de reutilización de un hechizo. El tiempo de reutilización de un hechizo es `Ranura.cd`.
- Burst está activado de forma predeterminada. Desactívalo antes de un momento en el que no se debe gastar la reutilización (inmunidad, cambio de fase) y vuelve a activarlo cuando llegue el momento.
- Si una reutilización importante depende de auras (DoT en el objetivo), espera a que estén. Comprueba en el registro de KeyRota qué condición de la regla no se cumple.
- Para lo que solo debe usarse dentro de la reutilización, comprueba el aura de la reutilización (`Deathmark_DoT.up`), no el botón Burst.

### Cómo calcular los porcentajes

- **Recursos y salud:** `valor / máximo × 100`. 175 de energía de 250 es `70`.
- **Puntos de combo de 7:** pon el umbral a medio camino entre escalones: «al menos 5» es `>= 70` y «como mucho 3» es `< 50`. [La tabla](https://keyrota.app/documentation/es/conditions#resources).
- **Tiempo restante de un aura:** un porcentaje de la duración de esa aplicación. El 30 % es la ventana de pandemia.
- **Tiempo de reutilización:** un porcentaje del tiempo de reutilización total, sin el GCD. Con una reutilización de 2 minutos, el 1 % son 1,2 s.

### «Una rotación con errores no se guarda»

El constructor no guarda una rotación con un error: KeyRota nunca ejecuta una rotación a medias. La barra de estado indica el lugar, por ejemplo «Regla 9, grupo 1: el grupo no tiene condiciones». Haz clic en «Mostrar» para abrir la regla. Causas habituales:

| Mensaje | Qué hacer |
|---|---|
| el grupo no tiene condiciones | Añade una condición o elimina el grupo vacío. |
| no se ha elegido ranura | Elige una ranura en «Pulsar». |
| la marca Q solo va junto con O | Activa «Fuera del GCD (O)» o desactiva Q. |
| nombre desconocido … | Un nombre de una condición no coincide con ningún aura, ranura ni recurso: revisa «Nombre en el texto». |
| … es slot, pero se necesita buff | Una propiedad de aura (`.up`, `.duration`) en una ranura, o una propiedad de ranura (`.ready`, `.cd`) en un aura. |
| el nombre no puede llevar comillas | Quita `"` del nombre de la rotación, de la ranura o del aura. |

Todos los mensajes están en [Errores](https://keyrota.app/documentation/es/rotation-json#errors).

### En qué se diferencia `.oncd` de `.cd > 0`

`X.oncd`: la ranura no está lista por **cualquier** motivo: tiempo de reutilización, falta de recurso, objetivo demasiado lejos, ranura no mostrada. `X.cd > 0`: hay un tiempo de reutilización en curso. En un hechizo con cargas, `.cd > 0` es posible mientras la ranura está lista: hay una carga disponible y la siguiente se está recargando.

### Cómo escribir «no» y paréntesis

KRC no tiene `not`, `!=` ni paréntesis. «No» es la condición opuesta (`up`/`down`, `ready`/`oncd`, `glow`/`noglow`) o el operador inverso (en lugar de «no `>= 70`», escribe `< 70`). «(A o B) y C» son dos grupos: `A and C`, `B and C`. Más información: [«No», paréntesis y O](https://keyrota.app/documentation/es/conditions#logic).

### ¿Más de 12 ranuras o auras?

No: una rotación tiene hasta 12 ranuras y hasta 12 auras, igual que el perfil de Better Assistant. Las macros ayudan a ahorrar espacio (un botón, varios hechizos) y una misma ranura puede aparecer en varias reglas. El número de reglas no tiene límite.

### Una rotación con un talento que no tienes

Si no tienes un talento, el hechizo no está aprendido, la ranura no está lista y sus reglas simplemente se omiten. Una misma rotación puede funcionar con distintas configuraciones de talentos: las reglas de los hechizos que faltan no se activan.

### Trasladar o compartir una rotación

- «Exportar», en la ventana principal, guarda el perfil con su rotación; «Importar» lo carga en otro ordenador.
- En el constructor, «Texto y JSON» — «Guardar…» guarda la rotación como `.json` o `.txt`; para abrirla, «Nuevo» — «Desde un archivo…».
- El perfil de Better Assistant se vuelve a crear a partir de las ranuras y auras de la rotación: no hace falta pasarlo por separado.

### Por qué KeyRota a veces no pulsa nada

Con «Ignorar el icono principal» activado, si no encaja ninguna regla, KeyRota espera. En las rotaciones que acumulan energía es normal: con 5 puntos de combo o más, el gasto espera a que se cumpla su condición y el generador no se activa. Si la espera no parece correcta, comprueba en el registro de KeyRota qué reglas se omitieron y por qué.
