# KeyRota: erweiterte Rotationen (KRC), Dokumentation

Quelle: https://keyrota.app/documentation/de/advanced (Aktualisiert am 18.10.2026). JSON Schema: https://keyrota.app/documentation/keyrota-rotation.schema.json. Index für KI-Agenten: https://keyrota.app/documentation/llms.txt.

---

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

## Erweiterte Rotationen (KRC)

> [!TIP] Wir empfehlen, Rotationen mit einem KI-Agenten zu erstellen
> Das geht viel schneller und bequemer, als eine Rotation von Hand einzurichten. Je leistungsfähiger der KI-Agent, desto genauer trifft die Rotation schon beim ersten Versuch deine Anforderungen. Wir empfehlen die neuesten Modelle von Anthropic und OpenAI mit der Reasoning-Stufe „Extra (xhigh)“. So geht's: [Rotation mit einem KI-Agenten erstellen](https://keyrota.app/documentation/de/ai).

Eine erweiterte Rotation ist deine eigene Liste von Regeln: welche Fähigkeit wann gedrückt wird. KeyRota prüft die Regeln im Kampf und drückt die erste passende Taste. Format und Engine dieser Rotationen heißen **KRC** (KeyRota Customization).

### Basis- oder erweiterte Rotation

| | Blizzard (Basis) | Erweitert (KRC) |
|---|---|---|
| Wer wählt die Taste | Das Spiel: der Vorschlag von Blizzard | Deine Regeln |
| Einrichtung | Keine | Slots, Auren und Regeln: im Editor oder aus einer Datei |
| Spezialisierungen | Jede Schadens- (Nah- und Fernkampf) oder Tank-Spezialisierung | Die, für die die Rotation geschrieben ist |
| Burst und Zielmodus | Werden nicht verwendet | Die Schalter „Burst“ und „Ziele“; was sie bedeuten, legen die Regeln fest |
| Wann wählen | Um auf jedem Charakter schnell loszulegen | Du brauchst eine genaue Priorität: DoTs, Ressourcen sparen, Abklingzeiten im Burst-Fenster, eigene Logik für mehrere Ziele |

Im Block „Rotation“ der App steht das Blizzard-Profil an erster Stelle, deine Rotationen folgen darunter in der Gruppe „Eigene Rotationen“. Wechseln kannst du jederzeit, solange die Rotation gestoppt ist.

### Woraus eine Rotation besteht

| Teil | Was das ist | Wie viele |
|---|---|---|
| **Slots** | Die Tasten der Rotation. Slot N der Rotation ist Slot N im Profil für Better Assistant. | bis zu 12 |
| **Auren** | Deine Buffs und deine Debuffs auf dem Ziel, nach Zauber-ID. Aura N der Rotation ist Aura N in der Liste von Better Assistant. | bis zu 12 |
| **Ressourcen** | Gesundheit von Spieler und Ziel sowie die Ressourcen der Spezialisierung: Energie, Combopunkte, Wut, Mana und weitere. Alle Werte sind Prozentwerte. | je nach Spezialisierung |
| **Kampf** | Die Anzahl der Gegner in der Nähe und die Entfernung zum Ziel. | 2 |
| **Schalter** | Die Schalter der Schnelleinstellungen: Zielmodus (in den Regeln zwei Werte: `aoe` und `st`), „Burst“, „Heilung/Schutz“, „Bodenzauber“, „Bewegung“. | 6 |
| **Regeln** | Welcher Slot unter welchen Bedingungen gedrückt wird. Die Reihenfolge der Regeln ist die Priorität. | unbegrenzt |

Eine Regel besteht aus Bedingungsgruppen. Eine Regel ist erfüllt, wenn **mindestens eine** ihrer Gruppen erfüllt ist (ODER), und eine Gruppe ist erfüllt, wenn **alle** ihre Bedingungen erfüllt sind (UND). Eine Regel ohne Gruppen ist immer erfüllt.

*KRC-Text:*

```text
use Envenom when  # Vergiften
	Combo_Points >= 70 and Envenom_Buff.down  # 5+ Combopunkte, kein Buff
	or
	Combo_Points >= 70 and Energy >= 70  # 5+ Combopunkte, viel Energie
```

*JSON:*

```json
{
  "use": "Envenom",
  "name": "Vergiften",
  "when": [
    {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "5+ Combopunkte, kein Buff"},
    {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "5+ Combopunkte, viel Energie"}
  ]
}
```


Gelesen wird das so: „Drücke Vergiften, wenn du 5 oder mehr Combopunkte und keinen Buff von Vergiften hast, **oder** wenn du 5 oder mehr Combopunkte und mindestens 70 % Energie hast.“ Warum 5 Combopunkte als `70` geschrieben werden, erklärt der Abschnitt [Ressourcen](https://keyrota.app/documentation/de/conditions#resources).

### Wie KeyRota eine Taste auswählt

1. Die Regeln werden **von oben nach unten** in der Reihenfolge der Liste geprüft.
2. Für jede Regel werden ihre Gruppen geprüft. Ist keine erfüllt, geht KeyRota zur nächsten Regel.
3. Ist die Regel erfüllt, ihr Zauber aber gerade **nicht einsetzbar** (Abklingzeit, zu wenig Ressource, Ziel zu weit entfernt, kein Ziel, Zauber nicht erlernt), geht KeyRota ebenfalls zur nächsten Regel. Eine Bedingung für die Bereitschaft des eigenen Slots brauchst du nicht.
4. Die erste Regel, die erfüllt ist und deren Zauber eingesetzt werden kann, wird **ausgewählt**. Die globale Abklingzeit (GCD) ändert die Auswahl nicht: Eine Regel, die auf das Ende des GCD wartet, bleibt ausgewählt, und die Regeln darunter überholen sie nicht.
5. Passt keine Regel: Ist „Hauptsymbol ignorieren“ eingeschaltet, wartet KeyRota; ist es ausgeschaltet, drückt KeyRota den Vorschlag des Spiels.

Warten ist normal. Eine Rotation, die Energie spart, drückt zum Beispiel oft eine halbe oder ganze Sekunde lang nichts, bis genug Energie für eine weiter oben stehende Regel da ist.

### Ein unbekannter Wert erlaubt nie eine Regel

Manchmal kennt KeyRota einen Wert nicht: Eine Aura wird nicht ausgelesen (ihre ID fehlt im Profil für Better Assistant), es gibt kein Ziel (Gesundheit des Ziels und Entfernung sind unbekannt), die Gegner wurden nicht gezählt. Eine Bedingung, die einen unbekannten Wert ausliest, ist **falsch**: `X.up` ebenso wie `X.down`, `TargetHP >= 50` ebenso wie `TargetHP < 50`. Ein unbekannter Wert kann eine Regel nur verhindern, nie erlauben: Lieber einen Tastendruck auslassen als das Falsche drücken.

> [!TIP]
> Greift eine Regel nie, prüfe zuerst, ob jede Aura, die sie ausliest, mit der richtigen ID im Profil für Better Assistant steht. Mehr dazu unter [FAQ und Problembehandlung](https://keyrota.app/documentation/de/faq#never-fires).

### Wann eine Taste gedrückt wird

- **Ein normaler Zauber** (auf dem GCD) wird im Warteschlangenfenster ganz am Ende des GCD gedrückt: Das Spiel wirkt ihn, sobald der GCD endet.
- **Slot-Flags** ändern das: „Nur manuell (M)“, „Kanalisieren (C)“, „Außerhalb des GCD (O)“, „Im Warteschlangenfenster (Q)“. Was jedes Flag bewirkt und wie man sie kombiniert, steht unter [Slot-Flags](https://keyrota.app/documentation/de/rotation-json#flags).
- **Kanalisieren.** Solange eine Kanalisierung läuft, drückt KeyRota nichts, um sie nicht abzubrechen. Während eines **Zaubers mit Zauberzeit** wartet KeyRota, bis nur noch das Warteschlangenfenster übrig ist.
- **Deine eigenen Tastendrücke.** Drückst du selbst eine Fähigkeitstaste, hält sich KeyRota zurück und kommt dir nicht in die Quere.

### Schnellstart

Ist KeyRota noch nicht installiert, beginne mit den [ersten Schritten](https://keyrota.app/documentation/de/start).

1. Öffne in KeyRota „Rotation“ — „Neu“ — „Im Editor…“.
2. Wähle auf der Seite „Allgemein“ die Spezialisierung und gib der Rotation einen Namen.
3. Füge auf der Seite „Slots“ die Tasten mit ihren Zauber-IDs hinzu, auf der Seite „Auren“ die Buffs und Debuffs, die die Regeln auslesen.
4. Füge auf der Seite „Regeln“ die Regeln in der Reihenfolge ihrer Priorität hinzu.
5. Klicke auf der Seite „Allgemein“ auf „Aus Slots und Auren erstellen“ und dann auf „Kopieren“. Im Spiel: `/ba` — Registerkarte Profile — String einfügen — Apply.
6. Lege die Zauber der Slots auf deine Aktionsleisten und belege sie mit Tasten (ein Makro mit `#showtooltip` funktioniert ebenfalls).
7. Klicke auf „Speichern“, wähle das Profil in der Liste aus und starte die Rotation mit F1 (unter macOS mit ⌃⇧Leertaste).

Jede Schaltfläche mit einem durchgehenden Beispiel findest du unter [Rotationseditor](https://keyrota.app/documentation/de/editor).

### In diesem Bereich

- [Rotationseditor](https://keyrota.app/documentation/de/editor) — jede Seite und jede Schaltfläche des Fensters und eine Rotation, Schritt für Schritt erstellt.
- [Rotations-JSON](https://keyrota.app/documentation/de/rotation-json) — jedes Feld des Formats, Slot-Flags, Namen, Grenzen, Fehler und der KRC-Text.
- [Bedingungen](https://keyrota.app/documentation/de/conditions) — alle Bedingungstypen, Operatoren, Prozentwerte und unbekannte Werte.
- [Muster und Beispiele](https://keyrota.app/documentation/de/patterns) — DoTs, Ressourcen sparen, Aufbauer und Verbraucher, AoE, Burst, Verteidigung und weitere Vorlagen.
- [Rotation mit einem KI-Agenten erstellen](https://keyrota.app/documentation/de/ai) — eine Prompt-Vorlage, Log-Analyse und die Prüfung des Ergebnisses.
- [FAQ und Problembehandlung](https://keyrota.app/documentation/de/faq) — warum eine Regel nicht greift, zu früh oder zu spät drückt oder eine Kanalisierung abbricht.

---

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

## Rotationseditor

Der Rotationseditor ist das Fenster von KeyRota, in dem du eine erweiterte Rotation zusammenstellst, ohne sie abzutippen: Slots mit Flags, Auren und Regeln, daneben der KRC-Text und das JSON. Die Dokumentation gilt gleichermaßen für Windows und macOS; die Screenshots stammen von Windows. Sie zeigen die Schlachtzugsrotation für Meucheln aus den [Beispielen](https://keyrota.app/documentation/de/patterns#example-files).

### Öffnen

- **Deine Rotation.** Wähle das Profil im Block „Rotation“ des Hauptfensters aus und klicke auf „Anpassen“.
- **Eine neue Rotation.** „Neu“ — „Im Editor…“. Die Spezialisierung stammt aus dem Spiel oder aus dem aktuellen Profil. Zum Profil wird die Rotation beim ersten Speichern.
- **Aus einer Datei oder der Zwischenablage.** „Neu“ — „Aus Datei…“ nimmt KRC-Text (`.txt`), Rotations-JSON und KeyRota-Profildateien an; „Neu“ — „Aus Zwischenablage“ nimmt dasselbe aus der Zwischenablage. Das neue Profil öffnest du mit „Anpassen“ im Editor.

![Eine neue Rotation im Editor: die Seite „Allgemein“, noch ohne Slots und Regeln](https://keyrota.app/documentation/img/de/editor-new.png)

Bei einem **Blizzard-Profil** zeigt der Editor nur den Namen und die Tastenverzögerung: Die Hauptaktion wählt das Spiel. „Eigene Rotation erstellen“ legt ein neues Profil mit einer erweiterten Rotation an; das Blizzard-Profil bleibt in der Liste.

![Ein Blizzard-Profil im Editor: Profilname, Tastenverzögerung und „Eigene Rotation erstellen“](https://keyrota.app/documentation/img/de/editor-blizzard.png)

#### Das Fenster

- **Links** die Seiten: „Allgemein“, „Slots“, „Auren“, „Regeln“ (mit der Anzahl der Regeln), „Text und JSON“. Darüber „Eigene Rotation“ und die gewählte Spezialisierung.
- **Rechts** die ausgewählte Seite.
- **Unten** die Statusleiste: ob die Rotation gültig ist („Die Rotation ist gültig: 15 Regeln, 11 Slots, 10 Auren“), ob es ungespeicherte Änderungen gibt und bei einem Fehler, wo er liegt, samt der Schaltfläche „Anzeigen“. Rechts „Schließen“ und „Speichern“.

Erst mit „Speichern“ wird etwas übernommen (unter Windows auch mit Strg+S).

### Allgemein

![Die Seite „Allgemein“: Profil, Spezialisierung, Name der Rotation, „Hauptsymbol ignorieren“, Tastenverzögerung](https://keyrota.app/documentation/img/de/editor-general.png)

| Element | Funktion |
|---|---|
| **Profilname** | So heißt das Profil in der Rotationsliste des Hauptfensters. |
| **Spezialisierung** | Bestimmt die Ressourcen der Rotation (Energie, Combopunkte, Wut …) sowie Klasse und Spezialisierung des Profils für Better Assistant. Beim Wechsel werden die Ressourcen ersetzt, sofern die Regeln keine Ressourcen der alten Spezialisierung auslesen (Gesundheit zählt nicht). |
| **Name der Rotation** | Die erste Zeile des KRC-Textes (`rotation "…"`), erscheint im KeyRota-Protokoll. Ohne doppelte Anführungszeichen. Ein guter Platz für die Version: „Meucheln v1.3“. |
| **Hauptsymbol ignorieren** | Ein: KeyRota drückt nur nach den Regeln; trifft keine Regel zu, wartet KeyRota. Aus: Dann drückt KeyRota den Vorschlag des Spiels. Bei eigenen Rotationen meist eingeschaltet: Warten (zum Beispiel beim Energiesparen) ist normal. |
| **Tastenverzögerung** | Eine Pause vor jedem Tastendruck, wie bei einem Menschen: „Keine“, „Fest“ (ein Intervall von 0–1000 ms) oder „Zufällig“ (ein Bereich von 0–1000 ms). „Auch für Unterbrechen und Verteidigung“ wendet dieselbe Pause auch darauf an. |

![Weiter unten auf der Seite „Allgemein“: der Block „Better Assistant“, der Radius des Gegnerzählers, „Nur Gegner im Kampf“ und die Beschreibung](https://keyrota.app/documentation/img/de/editor-general-ba.png)

| Element | Funktion |
|---|---|
| **Profil: …** | Eine Zusammenfassung des Profil-Strings für Better Assistant: Spezialisierung, Anzahl der Zauber und Auren. |
| **Aus Slots und Auren erstellen** | Erstellt den Profil-String für Better Assistant aus den Zauber-IDs der Slots, der Einstellung „Better Assistant zeigt ihn“ jedes Slots, den Auren in ihrer Reihenfolge, der Spezialisierung, dem Radius und „Nur Gegner im Kampf“. Ist bereits ein Profil derselben Spezialisierung eingefügt, bleiben seine übrigen Einstellungen erhalten. |
| **Aus Zwischenablage** | Fügt einen fertigen Profil-String ein. Seine Spezialisierung muss mit der der Rotation übereinstimmen. |
| **Kopieren** | Kopiert den String, damit du ihn im Spiel einfügen kannst. |
| **Radius des Gegnerzählers, Meter** | 1–100, standardmäßig 8. Wird von der Bedingung „Gegner in der Nähe“ (`enemies`) verwendet. |
| **Nur Gegner im Kampf** | Standardmäßig eingeschaltet: Gegner, die noch nicht im Kampf sind, werden nicht gezählt. |
| **Beschreibung** | Notizen zur Rotation: Zeilen, die im KRC-Text mit `#` beginnen. Auf die Funktion der Rotation wirken sie sich nicht aus. |

Unter den Schaltflächen erscheinen Warnungen: welche in Regeln verwendeten Slots keine Zauber-ID haben (sie fehlen dann im Profil für Better Assistant) und was in einem bereits eingefügten Profil nicht zur Rotation passt.

> [!IMPORTANT]
> Die Auren im Profil für Better Assistant folgen lückenlos ab der ersten aufeinander. Hat Aura 3 keine ID, Aura 4 aber schon, lässt sich das Profil nicht erstellen: „Aura 3 hat keine Zaubernummer“. Trage die ID ein oder nummeriere die Auren neu.

#### Das Profil für Better Assistant im Spiel

Slot N der Rotation ist Slot N in Better Assistant, Aura N ist Aura N in seiner Liste. Der Profil-String trägt deine Slots und Auren dort in der richtigen Reihenfolge ein.

1. Klicke auf der Seite „Allgemein“ auf „Aus Slots und Auren erstellen“ und dann auf „Kopieren“.
2. Gib im Spiel `/ba` ein, öffne die Registerkarte **Profile**, füge den String ein, klicke auf **Apply** und bestätige.
3. Nach jeder Änderung an Slots oder Auren (IDs, Reihenfolge, „Mit Ziel“ / „Im Kampf“) erstellst du das Profil neu und fügst es erneut ein.

### Slots

![Die Seite „Slots“: links 12 Plätze, rechts der ausgewählte Slot 10 Verschwinden mit der ID 1856](https://keyrota.app/documentation/img/de/editor-slots.png)

Links stehen die 12 Plätze: Nummer, Name, Zauber-ID, Flags („außerhalb des GCD, in Warteschlange“) und „nicht verwendet“, wenn der Slot in keiner Regel vorkommt. Ein leerer Platz zeigt „Leer“; wählst du ihn aus, erscheint die Schaltfläche „Slot hinzufügen“.

| Element | Funktion |
|---|---|
| **Name** | Der Name des Zaubers im Spiel. Erscheint in der Regelliste und im Protokoll. |
| **Zauber-ID** | Die Nummer im Wowhead-Link: In `wowhead.com/de/spell=1856/verschwinden` ist es `1856`. Damit setzt Better Assistant den Zauber in diesen Slot. |
| **Better Assistant zeigt ihn** | „Mit Ziel“ oder „Im Kampf“. Der Slot ist nur bereit, wenn Better Assistant ihn anzeigt. „Im Kampf“ ist für Heilung und Verteidigung gedacht, die auch ohne Ziel funktionieren müssen. |
| **Wie gedrückt wird** | Vier Flag-Schalter, siehe die Tabelle unten. |
| **Name im Text** | Der Name des Slots in den Regeln und im KRC-Text: Buchstaben, Ziffern und `_`, ohne Leerzeichen. |
| **Kommentar** | Ein Kommentar am Ende der Deklarationszeile im Text. |
| **Verwendet in den Regeln** | Die Regeln, die den Slot drücken oder auslesen. „Slot entfernen“ ist nur verfügbar, wenn der Slot nirgends verwendet wird. |

Damit KeyRota einen Slot drücken kann, muss sein Zauber im Spiel auf einer Aktionsleiste liegen und mit einer Taste belegt sein: KeyRota übernimmt die Taste aus deinen Aktionsleisten. Ein Makro mit `#showtooltip Name` funktioniert ebenfalls. Ein Slot ohne Taste wird nie gedrückt.

#### Wie gedrückt wird: Flags

![Die Schalter „Wie gedrückt wird“ des Slots Verschwinden: „Außerhalb des GCD (O)“ und „Im Warteschlangenfenster (Q)“ sind eingeschaltet](https://keyrota.app/documentation/img/de/editor-slot-flags.png)

| Schalter | Funktion | Wann verwenden |
|---|---|---|
| keine Flags | Der Slot wird wie ein normaler Zauber gedrückt: am Ende der globalen Abklingzeit, im Warteschlangenfenster. | Fast jeder Zauber auf dem GCD. |
| **Nur manuell (M)** | KeyRota drückt diesen Slot nie selbst und überspringt seine Regeln. Drückst du seine Taste selbst, pausiert die Rotation. | Fähigkeiten, die du nur selbst drücken willst. |
| **Kanalisieren (C)** | Solange dieser Zauber kanalisiert wird, drückt KeyRota nichts und bricht ihn nicht ab. | Kanalisierte Zauber wie Mordlust. |
| **Außerhalb des GCD (O)** | Wartet nicht auf die globale Abklingzeit: wird sofort gedrückt, auch mitten im GCD. | Zauber außerhalb des GCD wie Großer Wurf. |
| **Im Warteschlangenfenster (Q)** | Nur zusammen mit „Außerhalb des GCD“: ganz am Ende des GCD drücken, im Warteschlangenfenster für Zauber. | Makros, deren zweite Zeile auf dem GCD liegt (Adrenalinrausch + Mordlust), und Tasten, die das Ergebnis des vorherigen Schlags brauchen (Verschwinden nach Königsmord). |

Jede Flag-Kombination samt JSON findest du unter [Slot-Flags](https://keyrota.app/documentation/de/rotation-json#flags).

### Auren

![Die Seite „Auren“: Aura 1 „Erdrosseln auf dem Ziel [703]“, ID 703, Name im Text Garrote_DoT, verwendet in den Regeln 3, 4, 5, 7, 8, 10](https://keyrota.app/documentation/img/de/editor-auras.png)

Auren sind deine Buffs und deine Debuffs auf dem Ziel, die die Regeln auslesen. Aura N der Rotation ist Aura N in der Liste von Better Assistant.

| Element | Funktion |
|---|---|
| **Name** | Der Name der Aura; erscheint in den Regeln. Praktisch mit der ID in eckigen Klammern: „Erdrosseln auf dem Ziel [703]“. |
| **Zauber-ID** | Die Nummer der Aura auf Wowhead. Better Assistant sucht sie unter deinen Buffs und deinen Debuffs auf dem Ziel. |
| **Name im Text**, **Kommentar** | Wie bei Slots. |
| **Verwendet in den Regeln** | Wo die Aura ausgelesen wird. „Aura entfernen“ funktioniert nur bei einer nicht verwendeten Aura. |

> [!NOTE]
> Die ID einer Aura und die ID des Zaubers, der sie auslöst, können sich unterscheiden. Der Zauber Verschwinden hat die ID `1856`, der Buff, den er gibt, `11327`; Verstohlenheit hat `1784`, Verstohlenheit mit dem Talent Trickbetrug `115191`. Prüfe auf Wowhead die ID des Buffs oder Debuffs selbst.

Sichtbar sind nur **deine** Auren: Buffs, die du dir selbst gibst, und Debuffs, die du auf das Ziel legst. Buffs von anderen Spielern und Debuffs anderer Spieler auf dem Ziel sehen die Regeln nicht.

### Regeln

![Die Seite „Regeln“: links 15 Regeln, rechts Regel 4 Todesmal mit ihrer Bedingungsgruppe](https://keyrota.app/documentation/img/de/editor-rules.png)

Die Regeln werden von oben nach unten geprüft: KeyRota drückt die erste, die erfüllt ist und deren Zauber gewirkt werden kann; geht das nicht (Abklingzeit, Ressource, Reichweite), prüft KeyRota die nächste.

**Die Symbolleiste über der Liste:**

| Schaltfläche | Funktion |
|---|---|
| **+** | Eine neue Regel unter der ausgewählten. Sie drückt den ersten Slot und hat noch keine Bedingungen. |
| **Duplizieren** | Eine Kopie der Regel direkt darunter. |
| **Papierkorb** | Löscht die Regel. |
| **Nach oben**, **Nach unten** | Verschiebt die Regel nach oben (wird früher geprüft) oder nach unten (wird später geprüft). |

Jede Regel in der Liste zeigt ihre Nummer (die Priorität), den Slot, den Namen und die Anzahl der Gruppen; eine Regel mit Fehler trägt eine rote Markierung.

**Die ausgewählte Regel:**

| Element | Funktion |
|---|---|
| **Drücken** | Welcher Slot gedrückt wird, wenn die Regel erfüllt ist. |
| **Name** | Erscheint im Protokoll, wenn die Regel greift. |
| **Beschreibung** | Notizen über der Regel im KRC-Text. |
| **Wann gedrückt wird** | Bedingungsgruppen: Die Regel ist erfüllt, wenn mindestens eine Gruppe erfüllt ist (ODER); eine Gruppe, wenn alle ihre Bedingungen erfüllt sind (UND). |

![Die Bedingungsgruppen der Regel Blutung: Gruppe 1 und Gruppe 2, getrennt durch ODER](https://keyrota.app/documentation/img/de/editor-rule-groups.png)

Jede Gruppe hat die Überschrift „Gruppe N“, ein Feld „Gruppenkommentar“ und die Schaltflächen „Gruppe duplizieren“ und „Gruppe löschen“. Eine Bedingungszeile besteht aus dem, **was geprüft wird**, der **Eigenschaft**, dem **Vergleich** und der **Zahl**; das Kreuz entfernt die Bedingung. „+ Bedingung“ fügt der Gruppe eine Bedingung hinzu, „+ Gruppe (ODER)“ eine neue Gruppe. Eine Gruppe fasst bis zu 16 Bedingungen, eine Regel bis zu 16 Gruppen: Ist das Limit erreicht, sind die Schaltflächen deaktiviert. Eine Regel ohne Gruppen zeigt „Ohne Bedingungen: Die Regel greift immer, wenn der Zauber gewirkt werden kann“.

| Was geprüft wird | Eigenschaften | Im KRC-Text |
|---|---|---|
| **Auren** (jede Aura der Rotation) | aktiv, fehlt, Restdauer %, Stapel | `Garrote_DoT.up`, `.down`, `.duration <= 30`, `.stacks >= 3` |
| **Slots** (jeder Slot) | bereit, auf Abklingzeit, Abklingzeit %, Aufladungen, leuchtet, leuchtet nicht | `Kingsbane.ready`, `.oncd`, `.cd <= 3`, `.charges >= 2`, `.glow`, `.noglow` |
| **Ressourcen** | Gesundheit von Spieler und Ziel, Ressourcen der Spezialisierung, % | `PlayerHP <= 40`, `Energy >= 70` |
| **Kampf**: Gegner in der Nähe | eine Zahl | `enemies >= 3` |
| **Kampf**: Entfernung zum Ziel | Meter | `target.distance <= 8` |
| **Schnelleinstellungen** | ein, aus | `aoe == 1`, `st == 1`, `cd == 1`, `defensives == 1`, `ground_spells == 1`, `movement == 1` |

Vergleiche: `<`, `≤`, `=`, `≥`, `>`; die Zahl liegt zwischen 0 und 100. Eine neue Bedingung beginnt als „aktiv“ für die erste Aura; änderst du, was geprüft wird, werden Eigenschaft und Zahl auf Standardwerte zurückgesetzt (`≥ 50` für eine Ressource, `≥ 2` für Gegner, `≤ 8` für die Entfernung). Alle Bedingungen im Detail: [Bedingungen](https://keyrota.app/documentation/de/conditions).

### Fehler und Statusleiste

![Ein Fehler in Regel 9: Gruppe 1 ohne Bedingungen ist rot umrandet; die Statusleiste meldet „Regel 9, Gruppe 1: die Gruppe hat keine Bedingungen“ mit „Anzeigen“](https://keyrota.app/documentation/img/de/editor-problem.png)

- **Grün**: „Die Rotation ist gültig: …“. Keine Fehler, die Rotation kann gespeichert werden.
- **Rot** nennt die Stelle: „Regel 9, Gruppe 1: die Gruppe hat keine Bedingungen“. „Anzeigen“ öffnet diese Stelle. Die Regel ist in der Liste markiert, die Gruppe rot umrandet.
- Eine Rotation mit Fehler wird nicht gespeichert: „Eine Rotation mit Fehler lässt sich nicht speichern: Behebe, was unten markiert ist“.
- Solange die Rotation läuft, kannst du nicht speichern: „Stoppe die Rotation, um zu speichern“.

### Text und JSON

![Die Seite „Text und JSON“ in der Ansicht „KRC-Text“: der Anfang des Rotationstextes mit der Beschreibung und den Deklarationen buff1–buff7](https://keyrota.app/documentation/img/de/editor-text.png)

![Die Seite „Text und JSON“ in der Ansicht „JSON“: der Anfang des Rotations-JSON mit format, version, title, specID, ignoreMainIcon, enemies und notes](https://keyrota.app/documentation/img/de/editor-json.png)

| Element | Funktion |
|---|---|
| **KRC-Text / JSON** | Wechselt die Ansicht. |
| **Kopieren** | Kopiert den ganzen Text oder das ganze JSON. |
| **Einfügen** | Ersetzt die Rotation durch den Inhalt der Zwischenablage: KRC-Text, Rotations-JSON oder ein KeyRota-Profil. |
| **Öffnen…** | Lädt eine Rotation aus einer `.txt`- oder `.json`-Datei. |
| **Speichern…** | Speichert die aktuelle Ansicht als Datei: den Text als `.txt`, das JSON als `.json`. |

Eine Änderung im Feld gilt sofort, wenn sie fehlerfrei ist; ein Fehler erscheint unter dem Feld, und die anderen Seiten behalten die letzte gültige Fassung.

**Was der Text enthält und was nur das JSON enthält.** Der KRC-Text enthält keine Zauber-IDs, keine Slot-Flags, kein „Mit Ziel“ / „Im Kampf“, keine Spezialisierung, kein „Hauptsymbol ignorieren“ und keine Einstellungen des Gegnerzählers. Bearbeitest du den Text, bleiben diese Werte bei den Slots und Auren mit denselben Nummern erhalten. Das JSON enthält alles. Fügst du eine neue Fassung der Rotation ein oder öffnest sie, behalten Slots und Auren mit denselben Nummern ihre IDs, ihre Sichtbarkeit und ihre Flags, sofern die neue Fassung keine eigenen hat.

### Speichern und Schließen

- „Speichern“ (unter Windows auch Strg+S) schreibt die Rotation ins Profil; die Schaltfläche zeigt kurz „Gespeichert“. Eine neue Rotation wird zum Profil und in der Liste ausgewählt.
- Schließt du den Editor mit ungespeicherten Änderungen, fragt er „Änderungen speichern?“: „Speichern“, „Nicht speichern“ oder „Abbrechen“. Dasselbe gilt beim Beenden von KeyRota.
- „Export“ im Hauptfenster speichert das Profil mit seiner Rotation als JSON; „Import“ nimmt sowohl ein KeyRota-Profil als auch ein reines Rotations-JSON an.

### Beispiel: eine Rotation von Grund auf

Wir erstellen eine kleine Rotation für Meucheln: zwei DoTs (Erdrosseln und Blutung), einen Aufbauer (Verstümmeln), einen Verbraucher (Vergiften), eine Verteidigung (Blutrote Phiole bei 40 % Gesundheit oder weniger) und eine Abklingzeit auf der Burst-Taste (Todesmal).

**1. Neues Profil.** „Rotation“ — „Neu“ — „Im Editor…“.

**2. Allgemein.** Profilname: „Meucheln: Beispiel“. Spezialisierung: Meucheln (die Ressourcen werden zu `PlayerHP`, `TargetHP`, `Energy`, `Combo_Points`). Name der Rotation: „Meucheln: Beispiel v1“. „Hauptsymbol ignorieren“: ein.

**3. Slots.** Für jede Zeile der Tabelle: Wähle links den Platz aus, klicke auf „Slot hinzufügen“ und fülle „Name“, „Zauber-ID“ und „Name im Text“ aus; wähle bei Blutrote Phiole „Im Kampf“. Flags sind nicht nötig.

| Slot | Name | ID | Name im Text | Better Assistant zeigt ihn |
|---|---|---|---|---|
| 1 | Erdrosseln | 703 | `Garrote` | Mit Ziel |
| 2 | Blutung | 1943 | `Rupture` | Mit Ziel |
| 3 | Vergiften | 32645 | `Envenom` | Mit Ziel |
| 4 | Verstümmeln | 1329 | `Mutilate` | Mit Ziel |
| 5 | Todesmal | 360194 | `Deathmark` | Mit Ziel |
| 6 | Blutrote Phiole | 185311 | `Crimson_Vial` | Im Kampf |

**4. Auren.** Dasselbe auf der Seite „Auren“:

| Aura | Name | ID | Name im Text |
|---|---|---|---|
| 1 | Erdrosseln auf dem Ziel [703] | 703 | `Garrote_DoT` |
| 2 | Blutung auf dem Ziel [1943] | 1943 | `Rupture_DoT` |
| 3 | Vergiften [32645] | 32645 | `Envenom_Buff` |
| 4 | Todesmal auf dem Ziel [360194] | 360194 | `Deathmark_DoT` |

**5. Regeln.** Klicke auf der Seite „Regeln“ auf „+“, wähle unter „Drücken“ den Slot und gib den Namen ein. „+ Gruppe (ODER)“ fügt eine Gruppe mit einer Standardbedingung hinzu: Ändere, was geprüft wird, die Eigenschaft, den Vergleich und die Zahl. „+ Bedingung“ fügt derselben Gruppe die nächste Bedingung hinzu. Die Regeln in dieser Reihenfolge:

| # | Drücken | Gruppen (ODER), Bedingungen in einer Gruppe (UND) |
|---|---|---|
| 1 | Blutrote Phiole | Heilung/Schutz ein, Gesundheit des Spielers ≤ 40 |
| 2 | Todesmal | Burst ein, Erdrosseln auf dem Ziel aktiv, Blutung auf dem Ziel aktiv, Vergiften aktiv |
| 3 | Erdrosseln | (1) Erdrosseln auf dem Ziel fehlt; (2) Erdrosseln auf dem Ziel aktiv, Restdauer ≤ 30 % |
| 4 | Blutung | (1) Combopunkte ≥ 70, Blutung auf dem Ziel fehlt; (2) Combopunkte ≥ 70, Blutung auf dem Ziel aktiv, Restdauer ≤ 30 % |
| 5 | Vergiften | (1) Combopunkte ≥ 70, Vergiften fehlt; (2) Combopunkte ≥ 70, Vergiften aktiv, Restdauer ≤ 20 %; (3) Combopunkte ≥ 70, Energie ≥ 70; (4) Combopunkte ≥ 70, Todesmal auf dem Ziel aktiv |
| 6 | Verstümmeln | Combopunkte < 70 |

Warum so:
- **Die Verteidigung zuerst**: Bei niedriger Gesundheit ist Blutrote Phiole wichtiger als Schaden. Sie greift nur, wenn „Heilung/Schutz“ in den Schnelleinstellungen eingeschaltet ist.
- **Todesmal auf Burst**: `cd == 1` ist die Burst-Taste (F3 unter Windows, ⌃⇧B unter macOS), nicht die Abklingzeit des Zaubers. Schaltest du Burst aus, wartet Todesmal.
- **DoTs mit Pandemie-Fenster**: Eine fehlende Aura hat 0 übrig, deshalb braucht das Erneuern zwei Gruppen: „kein DoT“ und „DoT aktiv mit ≤ 30 % Restdauer“.
- **5 Combopunkte = 70**: Von 7 Combopunkten entsprechen 5 genau 71 %; die Schwelle `70` funktioniert bei jeder Rundung. Die Tabelle steht unter [Ressourcen](https://keyrota.app/documentation/de/conditions#resources).
- **Verstümmeln zuletzt** und nur unter 5 Combopunkten, damit keine Energie verschwendet wird, während Vergiften auf seine Bedingungen wartet.

**6. Prüfen.** Die Statusleiste sollte „Die Rotation ist gültig: 6 Regeln, 6 Slots, 4 Auren“ melden. Öffne „Text und JSON“: Dort siehst du dasselbe wie unten.

**7. Das Profil für Better Assistant.** „Allgemein“ — „Aus Slots und Auren erstellen“ — „Kopieren“; im Spiel `/ba` — Profile — einfügen — Apply.

**8. Tasten.** Lege die sechs Zauber auf deine Aktionsleisten und belege sie mit Tasten.

**9. Starten.** Speichere, schließe das Fenster, wähle das Profil „Meucheln: Beispiel“ aus und starte die Rotation (F1 unter Windows, ⌃⇧Leertaste unter macOS). Schalte in den Schnelleinstellungen „Heilung/Schutz“ ein, wenn du Blutrote Phiole nutzen willst; die Schaltfläche „Burst“ schaltet Todesmal ein und aus.

*KRC-Text:*

```text
rotation "Meucheln: Beispiel v1"

# Beispiel aus der KeyRota-Dokumentation: zwei Blutungen, ein Aufbauer, ein Verbraucher mit Energiesparen,
# eine Verteidigung bei niedriger Gesundheit und Todesmal auf der Burst-Taste.
# Combopunkte in Prozent von 7: 5 Punkte = 71 %, Schwelle 70 = 5+.

buff1	Garrote_DoT = "Erdrosseln auf dem Ziel [703]"
buff2	Rupture_DoT = "Blutung auf dem Ziel [1943]"
buff3	Envenom_Buff = "Vergiften [32645]"
buff4	Deathmark_DoT = "Todesmal auf dem Ziel [360194]"
slot1	Garrote = "Erdrosseln"
slot2	Rupture = "Blutung"
slot3	Envenom = "Vergiften"
slot4	Mutilate = "Verstümmeln"
slot5	Deathmark = "Todesmal"
slot6	Crimson_Vial = "Blutrote Phiole"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

# --- Verteidigung: nur mit „Heilung/Schutz“ an ---
use Crimson_Vial when  # Blutrote Phiole
	defensives == 1 and PlayerHP <= 40  # Gesundheit 40 % oder weniger

# --- Abklingzeit: nur mit Burst an ---
use Deathmark when  # Todesmal
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up and Envenom_Buff.up  # Burst an, Blutungen und Vergiften aktiv

# --- Blutungen ---
use Garrote when  # Erdrosseln
	Garrote_DoT.down  # keine Blutung
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30  # Pandemie-Fenster: 30 % oder weniger übrig

use Rupture when  # Blutung
	Combo_Points >= 70 and Rupture_DoT.down  # 5+ Combopunkte, keine Blutung
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # 5+ Combopunkte, Pandemie-Fenster

# --- Verbraucher: 5+ Combopunkte, Energie sparen ---
use Envenom when  # Vergiften
	Combo_Points >= 70 and Envenom_Buff.down  # kein Buff
	or
	Combo_Points >= 70 and Envenom_Buff.up and Envenom_Buff.duration <= 20  # Buff läuft aus
	or
	Combo_Points >= 70 and Energy >= 70  # Energie nicht überlaufen lassen
	or
	Combo_Points >= 70 and Deathmark_DoT.up  # Todesmal auf dem Ziel

# --- Aufbauer: unter 5 Combopunkten ---
use Mutilate when  # Verstümmeln
	Combo_Points < 70  # unter 5 Combopunkten
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Meucheln: Beispiel v1",
  "specID": 259,
  "ignoreMainIcon": true,
  "enemies": {"range": 8, "combatOnly": true},
  "notes": [
    "Beispiel aus der KeyRota-Dokumentation: zwei Blutungen, ein Aufbauer, ein Verbraucher mit Energiesparen,",
    "eine Verteidigung bei niedriger Gesundheit und Todesmal auf der Burst-Taste.",
    "Combopunkte in Prozent von 7: 5 Punkte = 71 %, Schwelle 70 = 5+."
  ],
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "Erdrosseln auf dem Ziel [703]", "spell": 703},
    {"n": 2, "alias": "Rupture_DoT", "label": "Blutung auf dem Ziel [1943]", "spell": 1943},
    {"n": 3, "alias": "Envenom_Buff", "label": "Vergiften [32645]", "spell": 32645},
    {"n": 4, "alias": "Deathmark_DoT", "label": "Todesmal auf dem Ziel [360194]", "spell": 360194}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "Erdrosseln", "spell": 703, "show": "target"},
    {"n": 2, "alias": "Rupture", "label": "Blutung", "spell": 1943, "show": "target"},
    {"n": 3, "alias": "Envenom", "label": "Vergiften", "spell": 32645, "show": "target"},
    {"n": 4, "alias": "Mutilate", "label": "Verstümmeln", "spell": 1329, "show": "target"},
    {"n": 5, "alias": "Deathmark", "label": "Todesmal", "spell": 360194, "show": "target"},
    {"n": 6, "alias": "Crimson_Vial", "label": "Blutrote Phiole", "spell": 185311, "show": "combat"}
  ],
  "rules": [
    {
      "use": "Crimson_Vial",
      "name": "Blutrote Phiole",
      "note": ["--- Verteidigung: nur mit „Heilung/Schutz“ an ---"],
      "when": [{"all": ["defensives == 1", "PlayerHP <= 40"], "comment": "Gesundheit 40 % oder weniger"}]
    },
    {
      "use": "Deathmark",
      "name": "Todesmal",
      "note": ["--- Abklingzeit: nur mit Burst an ---"],
      "when": [
        {
          "all": ["cd == 1", "Garrote_DoT.up", "Rupture_DoT.up", "Envenom_Buff.up"],
          "comment": "Burst an, Blutungen und Vergiften aktiv"
        }
      ]
    },
    {
      "use": "Garrote",
      "name": "Erdrosseln",
      "note": ["--- Blutungen ---"],
      "when": [
        {"all": ["Garrote_DoT.down"], "comment": "keine Blutung"},
        {
          "all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"],
          "comment": "Pandemie-Fenster: 30 % oder weniger übrig"
        }
      ]
    },
    {
      "use": "Rupture",
      "name": "Blutung",
      "when": [
        {"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "5+ Combopunkte, keine Blutung"},
        {
          "all": ["Combo_Points >= 70", "Rupture_DoT.up", "Rupture_DoT.duration <= 30"],
          "comment": "5+ Combopunkte, Pandemie-Fenster"
        }
      ]
    },
    {
      "use": "Envenom",
      "name": "Vergiften",
      "note": ["--- Verbraucher: 5+ Combopunkte, Energie sparen ---"],
      "when": [
        {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "kein Buff"},
        {
          "all": ["Combo_Points >= 70", "Envenom_Buff.up", "Envenom_Buff.duration <= 20"],
          "comment": "Buff läuft aus"
        },
        {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "Energie nicht überlaufen lassen"},
        {"all": ["Combo_Points >= 70", "Deathmark_DoT.up"], "comment": "Todesmal auf dem Ziel"}
      ]
    },
    {
      "use": "Mutilate",
      "name": "Verstümmeln",
      "note": ["--- Aufbauer: unter 5 Combopunkten ---"],
      "when": [{"all": ["Combo_Points < 70"], "comment": "unter 5 Combopunkten"}]
    }
  ]
}
```


Dieses Beispiel zum Herunterladen: [JSON](https://keyrota.app/documentation/examples/starter-assassination.de.json), [KRC-Text](https://keyrota.app/documentation/examples/starter-assassination.de.txt). Öffne es mit „Öffnen…“ auf der Seite „Text und JSON“ oder mit „Neu“ — „Aus Datei…“.

---

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

## Rotations-JSON

Das JSON ist die vollständige Beschreibung einer erweiterten Rotation: alles, was der KRC-Text enthält, dazu Zauber-IDs, Slot-Flags und Profileinstellungen. Der Editor zeigt es auf der Seite „Text und JSON“, und KeyRota nimmt es als Datei an („Neu“ — „Aus Datei…“, „Import“). Das Format heißt `keyrota-rotation`, Version 1. Zur Prüfung gibt es ein [JSON Schema](#schema).

### Beispieldatei

Die kürzeste sinnvolle Rotation: Blutung bei 5+ Combopunkten, wenn sie nicht auf dem Ziel ist, sonst Verstümmeln.

*minimal.json:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Meucheln: Minimum",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [{"n": 1, "alias": "Rupture_DoT", "label": "Blutung auf dem Ziel [1943]", "spell": 1943}],
  "slots": [
    {"n": 2, "alias": "Rupture", "label": "Blutung", "spell": 1943},
    {"n": 4, "alias": "Mutilate", "label": "Verstümmeln", "spell": 1329}
  ],
  "rules": [
    {
      "use": "Rupture",
      "name": "Blutung",
      "when": [{"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "5+ Combopunkte, keine Blutung"}]
    },
    {"use": "Mutilate", "name": "Verstümmeln"}
  ]
}
```


Alles, was die Datei weglässt, erhält seinen Standardwert: Slots werden „Mit Ziel“ angezeigt und haben keine Flags, der Gegnerzähler hat 8 Meter Radius und zählt nur Gegner im Kampf. Eine Regel ohne `when` ist immer erfüllt.

### Felder der obersten Ebene

| Feld | Typ | Pflicht | Standard | Bedeutung |
|---|---|---|---|---|
| `format` | String | ja | — | Immer `"keyrota-rotation"`. |
| `version` | Ganzzahl | ja | — | Immer `1`. Eine neuere Version wird abgelehnt: „Aktualisiere KeyRota“. |
| `title` | String | nein | `""` | Name der Rotation: die erste Textzeile, der Name im Protokoll. Ohne doppelte Anführungszeichen. |
| `specID` | Ganzzahl 0–100000 | nein | `0` | WoW-Spezialisierung, `0` = beliebig. Nötig für das Profil für Better Assistant. |
| `ignoreMainIcon` | true / false | nein | `true` | Ein: nur nach den Regeln drücken. Aus: Trifft keine Regel zu, den Vorschlag des Spiels drücken. |
| `enemies` | Objekt | nein | `{"range": 8, "combatOnly": true}` | Der Gegnerzähler für die Bedingung `enemies`. |
| `notes` | String oder Liste von Strings | nein | `[]` | Beschreibung: `#`-Zeilen am Anfang des Textes. |
| `resources` | Liste von Strings und `null` | nein | `[]` | Namen von `resource1…N` in ihrer Reihenfolge. |
| `auras` | Liste | nein | `[]` | Auren `buff1…12`. |
| `slots` | Liste | nein | `[]` | Slots `slot1…12`. |
| `rules` | Liste | nein | `[]` | Regeln in der Reihenfolge ihrer Priorität. |
| `footer` | String oder Liste von Strings | nein | `[]` | Kommentare nach der letzten Regel. |

Jedes andere Feld ist ein Fehler („überflüssiges Feld“): Tippfehler werden nicht stillschweigend übergangen. Füge der Datei deshalb kein `"$schema"` hinzu; binde das Schema in deinem Editor oder Validator ein.

Fast überall darf `null` anstelle eines Werts stehen; das bedeutet dasselbe wie ein weggelassenes Feld.

### format und version

`"format": "keyrota-rotation"` und `"version": 1` sind Pflicht. Ist `version` größer als 1, lehnt KeyRota die Datei ab: „Version 2 ist neuer, als diese KeyRota versteht: Aktualisiere KeyRota“. Fehlt `version`: „Version 1 erforderlich“.

### title

Ein String ohne doppelte Anführungszeichen `"`. Zeilenumbrüche werden zu Leerzeichen. Im KRC-Text ist es `rotation "…"`. Ein guter Platz für die Version: `"Meucheln v1.3"`.

### specID

Die Spezialisierungs-ID des Spiels. Sie bestimmt die Ressourcen der Rotation (bei der Erstellung im Editor) sowie Klasse und Spezialisierung im Profil für Better Assistant. `0` bedeutet beliebige Spezialisierung: Die Rotation funktioniert, aber das Profil für Better Assistant lässt sich nicht erstellen („Wähle eine Spezialisierung: Das Profil für Better Assistant braucht sie“).

| Klasse | Spezialisierung | specID | Ressourcen der Spezialisierung (`resource3`…) |
|---|---|---|---|
| Krieger | Waffen | 71 | `Rage` |
| Krieger | Furor | 72 | `Rage` |
| Krieger | Schutz | 73 | `Rage` |
| Paladin | Heilig | 65 | `Mana`, `Holy_Power` |
| Paladin | Schutz | 66 | `Mana`, `Holy_Power` |
| Paladin | Vergeltung | 70 | `Mana`, `Holy_Power` |
| Jäger | Tierherrschaft | 253 | `Focus` |
| Jäger | Treffsicherheit | 254 | `Focus` |
| Jäger | Überleben | 255 | `Focus` |
| Schurke | Meucheln | 259 | `Energy`, `Combo_Points` |
| Schurke | Gesetzlosigkeit | 260 | `Energy`, `Combo_Points` |
| Schurke | Täuschung | 261 | `Energy`, `Combo_Points` |
| Priester | Disziplin | 256 | `Mana`, `Insanity` |
| Priester | Heilig | 257 | `Mana`, `Insanity` |
| Priester | Schatten | 258 | `Mana`, `Insanity` |
| Todesritter | Blut | 250 | `Runes`, `Runic_Power` |
| Todesritter | Frost | 251 | `Runes`, `Runic_Power` |
| Todesritter | Unheilig | 252 | `Runes`, `Runic_Power` |
| Schamane | Elementar | 262 | `Mana`, `Maelstrom` |
| Schamane | Verstärkung | 263 | `Mana`, `Maelstrom` |
| Schamane | Wiederherstellung | 264 | `Mana`, `Maelstrom` |
| Magier | Arkan | 62 | `Mana`, `Arcane_Charges` |
| Magier | Feuer | 63 | `Mana`, `Arcane_Charges` |
| Magier | Frost | 64 | `Mana`, `Arcane_Charges` |
| Hexenmeister | Gebrechen | 265 | `Mana`, `Soul_Shards` |
| Hexenmeister | Dämonologie | 266 | `Mana`, `Soul_Shards` |
| Hexenmeister | Zerstörung | 267 | `Mana`, `Soul_Shards` |
| Mönch | Braumeister | 268 | `Energy`, `Stagger` |
| Mönch | Nebelwirker | 270 | `Mana` |
| Mönch | Windläufer | 269 | `Energy`, `Chi` |
| Druide | Gleichgewicht | 102 | `Mana`, `Astral_Power` |
| Druide | Wildheit | 103 | `Energy`, `Combo_Points` |
| Druide | Wächter | 104 | `Rage` |
| Druide | Wiederherstellung | 105 | `Mana`, `Astral_Power` |
| Dämonenjäger | Verwüstung | 577 | `Fury` |
| Dämonenjäger | Rachsucht | 581 | `Fury` |
| Dämonenjäger | Verschlinger | 1480 | `Fury` |
| Rufer | Verheerung | 1467 | `Mana`, `Essence` |
| Rufer | Bewahrung | 1468 | `Mana`, `Essence` |
| Rufer | Verstärkung | 1473 | `Mana`, `Essence` |

### ignoreMainIcon

`true` (Standard): KeyRota drückt nur nach den Regeln; trifft keine zu, wartet KeyRota. `false`: Dann drückt KeyRota den Vorschlag des Spiels, wie beim Blizzard-Profil. Der Vorschlag ist der letzte Ausweg nach allen Regeln; er überholt nie eine Regel.

### enemies

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


| Feld | Typ | Standard | Bedeutung |
|---|---|---|---|
| `range` | Ganzzahl 1–100 | `8` | Der Radius des Gegnerzählers in Metern. |
| `combatOnly` | true / false | `true` | Nur Gegner zählen, die bereits im Kampf sind. |

Die Bedingung `enemies` liest diesen Zähler aus (siehe [Gegner in der Nähe](https://keyrota.app/documentation/de/conditions#enemies)). Im Editor sind das „Radius des Gegnerzählers, Meter“ und „Nur Gegner im Kampf“ auf der Seite „Allgemein“. Die Werte gehen auch in das Profil für Better Assistant ein.

### notes und footer

Die Beschreibung der Rotation (`notes`) und die Kommentare nach der letzten Regel (`footer`). Eine Liste von Strings oder ein einzelner String mit `\n`. Ein leerer String `""` ist eine Leerzeile im Text. Leerzeilen am Anfang und am Ende entfallen.

```json
"notes": ["Grundlage: ein Guide und Top-Logs, Patch 12.1", "", "v1.1: Vergiften früher bei 4+ Zielen"]
```


Im KRC-Text sind das `# …`-Zeilen vor den Deklarationen. Auf die Funktion der Rotation wirken sie sich nicht aus.

### resources

Ressourcennamen in Reihenfolge: Der erste Eintrag ist `resource1`, der zweite `resource2` und so weiter. **Die Nummer bestimmt, was die Ressource ist**; der Name ist nur die Schreibweise in Bedingungen:

- `resource1` ist die Gesundheit des Spielers, `resource2` die Gesundheit des Ziels;
- ab `resource3` folgen die Ressourcen der Spezialisierung in der Reihenfolge der [specID-Tabelle](#spec-id): Beim Schurken ist `resource3` Energie und `resource4` Combopunkte.

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


Verwende die Standardnamen aus der Tabelle: Der Editor zeigt sie im Klartext an („Gesundheit des Spielers“, „Energie“), und andere Menschen und KI-Agenten verstehen die Bedingungen sofort. `null` überspringt eine Nummer: `["PlayerHP", null, "Energy"]` deklariert nur `resource1` und `resource3`. Eine nicht deklarierte Ressource lässt sich nicht auslesen: „resource2 nicht deklariert“.

Alle Ressourcen sind **Prozentwerte** des Maximums, 0–100. Wie du Combopunkte, Energie und Runen in Prozent umrechnest, steht unter [Ressourcen](https://keyrota.app/documentation/de/conditions#resources) auf der Seite „Bedingungen“.

### auras

Auren sind deine Buffs und deine Debuffs auf dem Ziel. Aura `n` der Rotation ist Aura `n` in der Liste von Better Assistant.

| Feld | Typ | Pflicht | Standard | Bedeutung |
|---|---|---|---|---|
| `n` | Ganzzahl 1–12 | ja | — | Nummer der Aura (`buffN`). Jede Nummer nur einmal. |
| `alias` | String | nein | aus `label` | Der Name in Bedingungen. Siehe [Namen](#aliases). |
| `label` | String | nein | `""` | Anzeigename. Ohne doppelte Anführungszeichen `"`. Praktisch mit der ID in eckigen Klammern: `"Erdrosseln auf dem Ziel [703]"`. |
| `spell` | Ganzzahl 0–100000000 | nein | `0` | Die Wowhead-ID der Aura. `0` = nicht festgelegt: Die Aura fehlt im Profil für Better Assistant und ist unbekannt. |
| `note` | String | nein | `""` | Ein Kommentar am Ende der Deklarationszeile. |

```json
"auras": [
  {"n": 1, "alias": "Garrote_DoT", "label": "Erdrosseln auf dem Ziel [703]", "spell": 703},
  {"n": 2, "alias": "Rupture_DoT", "label": "Blutung auf dem Ziel [1943]", "spell": 1943}
]
```


Die Reihenfolge in der Liste spielt keine Rolle, `n` schon. Die Nummern dürfen Lücken haben, aber für das Profil für Better Assistant müssen die Auren mit IDs lückenlos ab der ersten aufeinander folgen.

### slots

Slots sind die Tasten der Rotation. Slot `n` der Rotation ist Slot `n` in Better Assistant.

| Feld | Typ | Pflicht | Standard | Bedeutung |
|---|---|---|---|---|
| `n` | Ganzzahl 1–12 | ja | — | Nummer des Slots (`slotN`). |
| `alias` | String | nein | aus `label` | Der Name in Regeln und Bedingungen. |
| `label` | String | nein | `""` | Der Name des Zaubers. Ohne doppelte Anführungszeichen `"`. |
| `spell` | Ganzzahl 0–100000000 | nein | `0` | Die Wowhead-ID des Zaubers. Damit setzt Better Assistant den Zauber in den Slot. |
| `note` | String | nein | `""` | Ein Kommentar am Ende der Deklarationszeile. |
| `show` | `"target"` / `"combat"` | nein | `"target"` | Wann Better Assistant den Slot anzeigt. |
| `manual` | true / false | nein | `false` | Flag **M**. |
| `channel` | true / false | nein | `false` | Flag **C**. |
| `offGcd` | true / false | nein | `false` | Flag **O**. |
| `queue` | true / false | nein | `false` | Flag **Q**, nur zusammen mit `offGcd`. |

#### show

- `"target"`: Der Slot wird angezeigt, wenn du ein Ziel hast. Gilt für fast jeden Angriff.
- `"combat"`: Der Slot wird im Kampf auch ohne Ziel angezeigt. Für Heilung und Verteidigung: Blutrote Phiole muss auch ohne Ziel funktionieren.

Ein Slot ist nur bereit, wenn Better Assistant ihn anzeigt. Ein `"target"`-Slot ist ohne Ziel nicht bereit, und seine Regeln werden übersprungen.

### Slot-Flags

Flags legen fest, **wie** ein Slot gedrückt wird, sobald seine Regel ausgewählt ist. Im Editor sind das die Schalter unter „Wie gedrückt wird“.

| Flags | Im JSON | Wie gedrückt wird | Beispiel |
|---|---|---|---|
| keine | alle `false` | Im Warteschlangenfenster am Ende des GCD: Der Zauber wird gewirkt, sobald der GCD endet. | Verstümmeln, Vergiften |
| **M** | `"manual": true` | Nie. Die Regeln des Slots werden übersprungen. Drückst du seine Taste selbst, pausiert die Rotation. | Eine Fähigkeit, die du selbst drückst |
| **C** | `"channel": true` | Wie ein normaler Zauber; solange die Kanalisierung läuft, wird nichts gedrückt. Nach dem Tastendruck wird der Slot nicht erneut gedrückt, bis die Kanalisierung beginnt. | Mordlust (51690) |
| **O** | `"offGcd": true` | Sofort, auch mitten im GCD. | Großer Wurf (381989) |
| **O + Q** | `"offGcd": true, "queue": true` | Außerhalb des GCD, aber nur im Warteschlangenfenster am Ende des GCD. | Das Makro Adrenalinrausch + Mordlust (13750); Verschwinden (1856) nach Königsmord |
| **C + O** | `"channel": true, "offGcd": true` | Eine Kanalisierung, die außerhalb des GCD beginnt: sofort, danach nichts, bis die Kanalisierung endet. | Selten |
| **C + O + Q** | alle drei | Dasselbe, im Warteschlangenfenster. | Selten |
| **Q** ohne O | `"queue": true` | Fehler: „queue nur zusammen mit offGcd“. | — |
| **M** + andere | `"manual": true, …` | M gewinnt: Der Slot wird nicht gedrückt, die anderen Flags spielen keine Rolle. | — |

Warum **O + Q** und nicht nur **O**: Eine Taste nur mit O wird sofort gedrückt, mitten im GCD, bevor der vorherige Schlag angekommen ist. Verschwinden nach Königsmord nur mit O würde gedrückt, bevor die Combopunkte von Königsmord eintreffen, und die Regel für Verschwinden (`Combo_Points < 65`) würde den alten Wert prüfen. Mit Q wartet die Taste auf das Ende des GCD.

Strikte Priorität: Eine Regel außerhalb des GCD weiter unten in der Liste **überholt keine** höhere Regel, die auf den GCD wartet.

```json
"slots": [
  {"n": 1, "alias": "Adrenaline_Rush", "label": "Adrenalinrausch (Makro mit Mordlust)", "spell": 13750, "offGcd": true, "queue": true},
  {"n": 4, "alias": "Keep_It_Rolling", "label": "Großer Wurf", "spell": 381989, "offGcd": true},
  {"n": 8, "alias": "Killing_Spree", "label": "Mordlust", "spell": 51690, "channel": true},
  {"n": 11, "alias": "Crimson_Vial", "label": "Blutrote Phiole", "spell": 185311, "show": "combat"}
]
```


### rules

Regeln in der Reihenfolge ihrer Priorität: Die erste in der Liste wird zuerst geprüft.

| Feld | Typ | Pflicht | Standard | Bedeutung |
|---|---|---|---|---|
| `use` | String | ja | — | Der Slot, der gedrückt wird: sein `alias` oder `slotN`. |
| `name` | String | nein | `""` | Der Name der Aktion, erscheint im Protokoll. Im Text der Kommentar in der `use`-Zeile. |
| `note` | String oder Liste von Strings | nein | `[]` | Notizen über der Regel (`#`-Zeilen vor `use`). |
| `when` | Liste von Gruppen | nein | `[]` | ODER-Gruppen. Leer oder fehlend: eine Regel ohne Bedingungen, die immer gedrückt wird, wenn der Zauber eingesetzt werden kann. |

#### when: Gruppen und Bedingungen

| Feld | Typ | Pflicht | Bedeutung |
|---|---|---|---|
| `all` | nicht leere Liste von Strings | ja | Die Bedingungen der Gruppe; alle müssen erfüllt sein (UND). |
| `comment` | String | nein | Der Kommentar der Gruppe (im Text am Ende ihrer Zeile). |

```json
{
  "use": "Garrote",
  "name": "Erdrosseln",
  "note": ["Im Pandemie-Fenster erneuern"],
  "when": [
    {"all": ["Garrote_DoT.down"], "comment": "kein DoT"},
    {"all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"], "comment": "30 % oder weniger übrig"}
  ]
}
```


Ein Slot darf in mehreren Regeln vorkommen: zum Beispiel Erdrosseln aus der Verstohlenheit weit oben in der Liste und das normale Aufrechterhalten von Erdrosseln weiter unten.

#### Bedingungen im JSON

Jede Bedingung ist ein String in KRC-Syntax: `Garrote_DoT.down`, `Rupture_DoT.duration <= 25`, `Kingsbane.cd <= 3`, `Combo_Points >= 70`, `enemies >= 2`, `target.distance <= 8`, `cd == 1`. Die vollständige Liste steht unter [Bedingungen](https://keyrota.app/documentation/de/conditions).

- Verweise per Name (`Garrote_DoT`) oder per Nummer: `buff1`, `slot3`, `resource4`.
- ` and ` innerhalb eines Strings teilt ihn in zwei Bedingungen: `"Combo_Points >= 70 and Energy >= 70"` sind zwei Bedingungen, und beide zählen zum Limit von 16.
- Kein `#` und keine Zeilenumbrüche in einem String.
- KeyRota liest die Bedingungen mit seiner eigenen Engine, deshalb bedeuten JSON und Text immer dasselbe.

### Namen

Ein Name (`alias`) ist die Bezeichnung von Auren, Slots und Ressourcen in Bedingungen und in `use`.

- Das erste Zeichen ist ein Buchstabe (beliebiges Alphabet) oder `_`, danach folgen Buchstaben, Ziffern `0–9` und `_`. Umlaute und Kyrillisch sind erlaubt; Leerzeichen, Bindestriche und Punkte nicht: `Fan_of_Knives`, nicht `Fan-of-Knives`.
- Ein Name ist unter allen Auren, Slots und Ressourcen eindeutig.
- Reserviert sind: `use`, `when`, `and`, `or`, `rotation`, `gcd`, `enemies`, `target`, `aoe`, `st`, `cd`, `defensives`, `ground_spells`, `movement` sowie Namen wie `buffN`, `slotN`, `resourceN`.
- Schlüsselwörter werden nur kleingeschrieben: `use`, `or`, `.up`. `Use`, `OR` und `.UP` sind Fehler.

**Ein Name aus dem Label.** Ohne `alias` bildet KeyRota einen Namen aus `label`: Eckige Klammern samt Inhalt entfallen, Buchstaben und Ziffern bleiben, alles andere wird zu `_`. Zum Beispiel wird aus `"Erdrosseln auf dem Ziel [703]"` der Name `Erdrosseln_auf_dem_Ziel`. Ein leerer oder unbrauchbarer Name wird zu `Aura_N` bzw. `Slot_N`; ein bereits vergebener erhält `_2`, `_3`. Verweist eine Regel auf `buffN` oder `slotN`, die in den Listen fehlen, werden sie automatisch als `Aura_N` und `Slot_N` deklariert.

### Pflichtfelder und Standardwerte

| Wo | Pflicht | Standardwerte |
|---|---|---|
| Datei | `format`, `version` | `title` `""`, `specID` `0`, `ignoreMainIcon` `true`, `enemies` `{"range": 8, "combatOnly": true}`, leere Listen |
| Aura | `n` | `alias` aus `label`, `label` `""`, `spell` `0` |
| Slot | `n` | `show` `"target"`, alle Flags `false`, `spell` `0` |
| Regel | `use` | `name` `""`, `note` `[]`, `when` `[]` (keine Bedingungen) |
| Gruppe | `all` (nicht leer) | `comment` `""` |

### Grenzen

| Was | Grenze |
|---|---|
| Auren | 12 (`n` 1–12) |
| Slots | 12 (`n` 1–12) |
| ODER-Gruppen in einer Regel | 16 |
| UND-Bedingungen in einer Gruppe | 16 |
| Regeln | unbegrenzt |
| Zahl in einer Bedingung | Ganzzahl 0–100 |
| `enemies.range` | 1–100 |
| `spell` | 0–100000000 |
| `specID` | 0–100000 |
| Ressourcen | bis zu 99 |

Genau 16 Gruppen mit je 16 Bedingungen sind in Ordnung; 17 sind ein Fehler.

### Fehler

Eine Rotation mit Fehler wird überhaupt nicht geladen: Eine teilweise Ausführung gibt es nicht. Ein Fehler nennt immer die Stelle. Im JSON ist das ein Pfad: `rules[3].when[1]: unbekannter Name Foo` (gezählt ab null). Im Editor „Regel 4, Gruppe 2: unbekannter Name Foo“ (gezählt ab eins). Im KRC-Text eine Zeilennummer.

**JSON-Struktur:**

| Meldung | Ursache |
|---|---|
| `überflüssiges Feld „offgcd“` | Ein falsch geschriebenes oder unbekanntes Feld (Groß- und Kleinschreibung zählen: `offGcd`). |
| `fehlendes Feld „format“` | Ein Pflichtfeld fehlt. |
| `format: „keyrota-rotation“ erwartet` | Ein anderer Wert für `format`. |
| `version: Version 1 erforderlich` | Kein `version` oder ein Wert unter 1. |
| `slots[0]: Nummer n fehlt (1–12)` | Ein Slot oder eine Aura ohne `n`. |
| `slots[2].n: Zahl außerhalb 1..12` | `n` außerhalb des Bereichs. |
| `slots[3]: Nummer 4 ist bereits vergeben` | Zwei Slots (oder zwei Auren) mit demselben `n`. |
| `slots[1].show: „target“ oder „combat“ erwartet` | Ein anderer Wert für `show`. |
| `slots[0]: queue nur zusammen mit offGcd` | `queue: true` ohne `offGcd: true`. |
| `rules[2].use: kein Slot „Garotte“` | `use` verweist auf einen Slot, den es nicht gibt. |
| `rules[0].when[1].all: nicht leere Liste von Bedingungen erforderlich` | Eine leere Gruppe oder kein `all`. |
| `rules[0].when[0].all[2]: Bedingung ist leer oder enthält # oder einen Zeilenumbruch` | Ein leerer Bedingungs-String oder ein `#` darin. |
| `….spell: Ganzzahl erwartet` | Falscher Typ: ein String statt einer Zahl, `true` statt einer Zahl und so weiter. |

**Bedingungen und Deklarationen** (dieselben wie im KRC-Text):

| Code | Beispielmeldung | Ursache |
|---|---|---|
| `unknown_ref` | `unbekannter Name Foo` | Keine Aura, kein Slot und keine Ressource mit diesem Namen. |
| `unknown_ref` | `resource5 nicht deklariert` | Die Ressource ist in `resources` nicht deklariert. |
| `wrong_kind` | `Garrote ist vom Typ slot, nötig ist buff` | Eine Aura-Eigenschaft an einem Slot (`Garrote.up`) oder umgekehrt. |
| `bad_condition` | `Bedingung nicht erkannt: "Energy => 50"` | Ein Tippfehler in der Bedingung oder im Operator. |
| `bad_condition` | `"Garrote.distance <= 8": distance gibt es nur bei target` | Nur das Ziel hat eine Entfernung. |
| `value_range` | `Wert 120 außerhalb 0..100` | Eine Zahl über 100. Negative Zahlen und Kommazahlen gibt es nicht. |
| `toggle_value` | `"cd >= 1": Schalter nur == 0 oder == 1` | Ein Schalter wird nur mit `==` und 0 oder 1 verglichen. |
| `bad_alias` | `unzulässiger Name Fan-of-Knives` | Unzulässige Zeichen in einem Namen. |
| `reserved_alias` | `Name cd ist reserviert` | Ein reservierter Name. |
| `duplicate_alias` | `Name Garrote ist bereits deklariert` | Zwei Auren, Slots oder Ressourcen mit demselben Namen. |
| `index_range` | `buff13: Nummer außerhalb 1..12` | Ein Verweis auf eine Nummer über 12. |
| `too_many_groups` | `mehr als 16 OR-Gruppen` | Mehr als 16 Gruppen in einer Regel. |
| `too_many_conditions` | `17 Bedingungen in der Gruppe (maximal 16)` | Mehr als 16 Bedingungen in einer Gruppe. |

Der Editor meldet außerdem „die Gruppe hat keine Bedingungen“ (eine leere Gruppe), „kein Slot gewählt“ und „keine Anführungszeichen im Namen erlaubt“.

### KRC-Text

Der KRC-Text ist dieselbe Rotation in Zeilenform. Die Seite „Text und JSON“ zeigt ihn an, und du kannst ihn als `.txt`-Datei aufbewahren. Text und JSON lassen sich ohne Bedeutungsverlust ineinander umwandeln.

*KRC-Text:*

```text
rotation "Meucheln: Minimum"

buff1	Rupture_DoT = "Blutung auf dem Ziel [1943]"
slot2	Rupture = "Blutung"
slot4	Mutilate = "Verstümmeln"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Rupture when  # Blutung
	Combo_Points >= 70 and Rupture_DoT.down  # 5+ Combopunkte, keine Blutung

use Mutilate when  # Verstümmeln
```


#### Zeilen

- `#` außerhalb doppelter Anführungszeichen beginnt einen Kommentar bis zum Zeilenende. Innerhalb eines `"label"` ist `#` ein gewöhnliches Zeichen.
- Leerzeilen und reine Kommentarzeilen werden übersprungen: So entstehen Beschreibungen und Trennlinien.
- Jede andere Zeile ist eine Deklaration, `use`, `or` oder eine Bedingungszeile. Sonst ist es ein Fehler `stray_line`: „Zeile außerhalb einer Regel: "…" (Fließtext mit # beginnen)“.
- Zwischen den Teilen sind beliebige Leerzeichen und Tabs erlaubt. Die kanonische Form verwendet einen Tab nach `buffN`/`slotN` und am Anfang von Bedingungszeilen.

#### Deklarationen

Nur vor dem ersten `use`:

```text
rotation "Name"                    # optional, höchstens einmal
buff1	Garrote_DoT = "Erdrosseln auf dem Ziel [703]"   # Aura 1
slot1	Garrote = "Erdrosseln"                         # Slot 1
resource1	PlayerHP                               # Ressource 1
```


`buffN` und `slotN` gehen von 1 bis 12, `resourceN` von 1 bis 99. Das Label in Anführungszeichen darf leer sein: `slot5	Filler = ""`. Eine Deklaration nach dem ersten `use` ist ein Fehler `late_declaration`.

#### Regeln

```text
use Rupture when  # Blutung
	Combo_Points >= 70 and Rupture_DoT.down  # kein DoT
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # Pandemie
```


- `use Slot when` beginnt eine Regel; ein Kommentar in dieser Zeile ist der Name der Aktion.
- Jede Bedingungszeile ist eine Gruppe (Bedingungen mit `and` verbunden). Gruppen werden durch eine Zeile mit dem einzelnen Wort `or` getrennt.
- Eine Regel ohne Bedingungszeilen hat keine Bedingungen.
- Zwei Bedingungszeilen hintereinander ohne `or` sind ein Fehler `split_group`; `or` am Anfang, am Ende oder zweimal hintereinander ist `empty_group`.

#### Text und JSON: Zuordnung

| Im Text | Im JSON |
|---|---|
| `rotation "…"` | `title` |
| `# …`-Zeilen vor dem ersten `use` | `notes` |
| Ein Kommentar am Ende einer `buffN`- oder `slotN`-Zeile | `note` der Aura bzw. des Slots |
| `# …`-Zeilen direkt vor `use` (und zwischen den Gruppen der Regel) | `note` der Regel |
| Ein Kommentar in der `use`-Zeile | `name` der Regel |
| Ein Kommentar am Ende einer Bedingungszeile | `comment` der Gruppe |
| `# …`-Zeilen nach der letzten Regel | `footer` |
| — (nicht im Text) | `specID`, `ignoreMainIcon`, `enemies`, `spell`, `show`, Flags |

Leerzeilen am Rand von Kommentarblöcken entfallen; innerhalb bleiben sie als `""` erhalten.

### Import und Speicherung

- KeyRota speichert die Rotation im Profil. „Export“ im Hauptfenster speichert das KeyRota-Profil (JSON) mit seiner Rotation; „Import“ nimmt ein KeyRota-Profil und ein reines Rotations-JSON an.
- „Neu“ — „Aus Datei…“ nimmt `.txt` mit KRC-Text, Rotations-JSON und ein KeyRota-Profil an; „Neu“ — „Aus Zwischenablage“ dasselbe aus der Zwischenablage.
- Im Editor ersetzen „Text und JSON“ — „Einfügen“ oder „Öffnen…“ die Rotation; Slots und Auren mit denselben Nummern behalten ihre IDs, „Mit Ziel“ / „Im Kampf“ und Flags, sofern die neue Fassung keine eigenen hat.
- Eine Textrotation (ohne JSON) übernimmt IDs und Sichtbarkeit der Slots aus dem Profil für Better Assistant, das bereits im KeyRota-Profil gespeichert ist, und die IDs der Auren zusätzlich aus Markierungen wie `[703]` in ihren Labels.

### Das Profil für Better Assistant aus dem JSON

„Aus Slots und Auren erstellen“ im Editor erzeugt den Profil-String für Better Assistant aus dem Rotations-JSON:

- **12 Slots**: Slot N ist `slots[n = N].spell`, angezeigt gemäß `show`. Ein Slot ohne ID bleibt leer.
- **Auren** in Reihenfolge ab der ersten: `auras[n = 1].spell`, `auras[n = 2].spell` … Eine Aura ohne ID mittendrin ist ein Fehler.
- **Klasse und Spezialisierung** aus `specID`.
- **Gegnerzähler** aus `enemies.range` und `enemies.combatOnly`.
- Enthält das KeyRota-Profil bereits ein Profil für Better Assistant derselben Spezialisierung, bleiben dessen übrige Einstellungen und die passenden Slots und Auren erhalten.

Im Spiel: `/ba` — Profile — einfügen — Apply.

### JSON Schema

Das Schema des Formats: [keyrota-rotation.schema.json](https://keyrota.app/documentation/keyrota-rotation.schema.json) (Draft 2020-12). Es prüft Felder, Typen, Wertebereiche, `queue` ohne `offGcd` und die Form der Bedingungs-Strings. Nicht geprüft wird, ob `n` und Namen eindeutig sind, ob die Namen in Bedingungen existieren und ob das Limit von 16 nach dem Aufteilen der Strings an ` and ` eingehalten wird: Das übernimmt KeyRota beim Laden.

So prüfst du eine Datei:

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


Füge in eine Rotationsdatei kein Feld `"$schema"` ein: KeyRota hält es für ein überflüssiges Feld.

---

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

## Bedingungen

Eine Bedingung ist eine einzelne Prüfung: „Erdrosseln ist auf dem Ziel“, „Energie ist mindestens 70 %“, „Burst ist eingeschaltet“. Bedingungen bilden Gruppen (UND), Gruppen bilden eine Regel (ODER). Im Editor wählst du eine Bedingung aus Listen aus; im KRC-Text und im JSON wird sie als String geschrieben, und so zeigen sie auch die Beispiele.

### Syntax

| Art | Form | Beispiel |
|---|---|---|
| Aura: vorhanden / fehlt | `Aura.up`, `Aura.down` | `Garrote_DoT.down` |
| Aura: Restdauer, Stapel | `Aura.duration op N`, `Aura.stacks op N` | `Rupture_DoT.duration <= 30` |
| Slot: bereit / nicht bereit | `Slot.ready`, `Slot.oncd` | `Kingsbane.ready` |
| Slot: Abklingzeit, Aufladungen | `Slot.cd op N`, `Slot.charges op N` | `Deathmark.cd <= 3` |
| Slot: Leuchten | `Slot.glow`, `Slot.noglow` | `Ambush.glow` |
| Ressource | `Resource op N` | `Combo_Points >= 70` |
| Gegner in der Nähe | `enemies op N` | `enemies >= 3` |
| Entfernung zum Ziel | `target.distance op N` | `target.distance <= 8` |
| Schalter | `aoe`, `st`, `cd`, `defensives`, `ground_spells`, `movement` `== 0` oder `== 1` | `cd == 1` |

**Operatoren:** `<`, `<=`, `==`, `=` (dasselbe wie `==`), `>=`, `>`. Ein „ungleich“ gibt es nicht.

**Die Zahl** `N` ist eine Ganzzahl von 0 bis 100. Keine negativen Zahlen, keine Kommazahlen und nichts über 100: `Wert 120 außerhalb 0..100`.

**Leerzeichen** um den Operator sind optional: `Energy>=70` und `Energy >= 70` sind dasselbe. Keine Leerzeichen innerhalb eines Namens oder zwischen Name und Eigenschaft: `Garrote_DoT.up`, nicht `Garrote_DoT .up`.

**Verweise** gehen per Name (`Garrote_DoT`) oder per Nummer: `buff1`, `slot3`, `resource4`. Schlüsselwörter werden kleingeschrieben.

### Auren

Eine Aura ist dein Buff oder dein Debuff auf dem Ziel, deklariert in der Aurenliste mit ihrer ID. Buffs und Debuffs anderer Spieler sind nicht sichtbar.

#### .up und .down

`Envenom_Buff.up`: Die Aura ist vorhanden. `Envenom_Buff.down`: Sie fehlt. Ist die Aura unbekannt (nicht ausgelesen), sind beide falsch.

```text
use Garrote when  # Erdrosseln: anwenden, wenn es fehlt
	Garrote_DoT.down
```


#### .duration: Restdauer in Prozent

`Rupture_DoT.duration <= 30`: Von der **vollen** Dauer der Aura sind höchstens 30 % übrig. Die volle Dauer ist die, die diese Anwendung erhalten hat: Blutung hält bei 5 Combopunkten 24 s, bei 7 Combopunkten 32 s, 30 % sind also 7,2 s bzw. 9,6 s.

> [!IMPORTANT]
> Eine fehlende Aura hat **0** übrig. Deshalb ist `Rupture_DoT.duration <= 30` auch dann erfüllt, wenn gar keine Blutung da ist. Um nur eine aktive Aura zu erneuern, schreibe `Rupture_DoT.up and Rupture_DoT.duration <= 30` und decke „die Aura fehlt“ mit einer eigenen Gruppe mit `Rupture_DoT.down` ab.

Das Pandemie-Fenster in WoW beträgt 30 % der Dauer: Wer innerhalb dieses Fensters erneuert, verliert nichts. Daher die übliche Schwelle `<= 30`.

*KRC-Text:*

```text
use Rupture when  # Blutung
	Combo_Points >= 70 and Rupture_DoT.down  # kein DoT
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # Pandemie
```

*JSON:*

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


Sekunden in Prozent: `Prozent = Sekunden / volle Dauer × 100`. Erdrosseln hält 18 s: „noch 14 s“ ist `<= 78`, „noch 5,4 s“ ist `<= 30`.

**Eine Aura ohne Dauer** (Verstohlenheit und Ähnliches) hat immer **1** übrig. Verwende für solche Auren nur `.up` und `.down`.

#### .stacks: Anzahl der Stapel

`Opportunity.stacks >= 6`: Die Aura hat 6 oder mehr Stapel. Eine fehlende Aura hat 0 Stapel.

> [!NOTE]
> Die Stapelanzahl beginnt bei zwei: Eine Aura mit einem einzigen Stapel wird als **0** gelesen, wie eine Aura ohne Zähler. Ob eine Aura vorhanden ist, prüfst du mit `.up`; `.stacks` verwendest du für Schwellen ab 2.

```text
use Pistol_Shot when  # Pistolenschuss bei 6 Stapeln Gelegenheit
	Opportunity.stacks >= 6 and Combo_Points < 80
```


### Slots

Slot-Bedingungen lesen den Zustand einer **anderen** Taste aus: „Vergiften nur drücken, solange Todesmal noch nicht bereit ist“ und Ähnliches. Der eigene Slot der Regel wird automatisch geprüft: Kann sein Zauber nicht eingesetzt werden, geht KeyRota einfach zur nächsten Regel.

#### .ready und .oncd

`Kingsbane.ready`: Der Zauber des Slots kann eingesetzt werden, die globale Abklingzeit nicht mitgerechnet. Dafür muss alles Folgende zutreffen:

- Der Zauber ist erlernt (das Talent ist gewählt);
- es ist genug Ressource vorhanden;
- das Ziel ist in Reichweite, falls eines nötig ist;
- die Abklingzeit liegt unter 0,2 s oder eine Aufladung ist verfügbar;
- Better Assistant zeigt den Slot an („Mit Ziel“: du hast ein Ziel; „Im Kampf“: du bist im Kampf).

`Kingsbane.oncd`: Der Slot ist aus irgendeinem dieser Gründe **nicht bereit**, nicht nur wegen der Abklingzeit. Ist der Zustand unbekannt, sind beide falsch.

```text
use Preparation when  # Vorbereitung, wenn Adrenalinrausch, Zwischen die Augen und Mordlust auf Abklingzeit sind
	Adrenaline_Rush.oncd and Between_the_Eyes.oncd and Killing_Spree.oncd
```


#### .cd: verbleibende Abklingzeit in Prozent

`Deathmark.cd <= 3`: Von der vollen Abklingzeit sind höchstens 3 % übrig. `0` ist bereit, `100` wurde gerade eingesetzt. Die globale Abklingzeit ist nicht enthalten. Bei einem Zauber mit Aufladungen ist `.cd` die Aufladezeit der **nächsten** Aufladung, deshalb kann der Zauber auch mit `cd > 0` bereit sein.

| Abklingzeit | 1 % = | Beispiel |
|---|---|---|
| 30 s | 0,3 s | `X.cd <= 10`: ≤ 3 s übrig |
| 1 min | 0,6 s | `Kingsbane.cd <= 3`: ≤ 1,8 s übrig |
| 2 min | 1,2 s | `Deathmark.cd <= 3`: ≤ 3,6 s übrig; `Deathmark.cd >= 44`: noch ≥ 52 s |
| 3 min | 1,8 s | `X.cd >= 50`: noch ≥ 90 s |

Ein typischer Einsatz ist „für eine große Abklingzeit zurückhalten“: Königsmord nicht verbrauchen, wenn Todesmal gleich wieder bereit ist, aber verbrauchen, wenn Todesmal noch lange braucht.

```text
use Kingsbane when  # Königsmord
	cd == 1 and Deathmark_DoT.up  # unter Todesmal
	or
	cd == 1 and Deathmark.cd >= 44  # Todesmal erst in über 52 s
```


#### .charges

`Barbed_Shot.charges >= 2`: Der Zauber hat 2 oder mehr Aufladungen. Zauber ohne Aufladungen haben 0. Ein typisches Muster verhindert, dass die Aufladungen am Maximum verfallen:

```text
use Barbed_Shot when  # Stachelpfeil
	Barbed_Shot.charges >= 2  # beide Aufladungen: Aufladezeit nicht verschwenden
	or
	Barbed_Shot.charges == 1 and Barbed_Shot.cd <= 20  # die zweite ist fast wieder da
```


#### .glow und .noglow: Die Taste leuchtet

`Ambush.glow`: Das Spiel hebt die Taste dieses Zaubers hervor (dasselbe Leuchten, das du bei einem Proc auf deiner Aktionsleiste siehst). `Ambush.noglow`: Sie leuchtet nicht. Verwende `.glow` nur, wenn die Taste dieses Zaubers im Spiel tatsächlich leuchtet; bist du unsicher, prüfe stattdessen den Buff des Procs: `Blindside.up`.

### Ressourcen

`Energy >= 70`: mindestens 70 % der maximalen Energie. **Alle Ressourcen sind Prozentwerte** von 0 bis 100: Gesundheit, Energie, Mana, Wut, Runen, Combopunkte.

| Ressource | Nummer | Beispiel |
|---|---|---|
| Gesundheit des Spielers | `resource1` (`PlayerHP`) | `PlayerHP <= 40`: Gesundheit bei 40 % oder weniger |
| Gesundheit des Ziels | `resource2` (`TargetHP`) | `TargetHP >= 50`: Das Ziel ist noch nicht bei der Hälfte. Ohne Ziel unbekannt |
| Ressourcen der Spezialisierung | ab `resource3` | `Energy >= 70`, `Combo_Points >= 70`, `Rage >= 40` |

**In Prozent umrechnen:** `Prozent = Wert / Maximum × 100`. Bei 250 Energie sind 175 Energie 70 %. Die maximale Energie und andere Ressourcen ändern sich mit Talenten; Schwellen in Prozent lassen sich deshalb besser zwischen Charakteren übertragen als absolute Werte.

**Combopunkte.** Bei maximal 7 Combopunkten entspricht ein Punkt etwa 14,3 %. Der Wert wird auf eine ganze Zahl gerundet, und je nach Rundung werden 2 Punkte als 28 oder 29 gelesen, 3 als 42 oder 43, 6 als 85 oder 86. Setze die Schwelle deshalb **in die Mitte zwischen zwei Stufen**: Dann stimmt sie bei jeder Rundung.

| Combopunkte | % | „mindestens N“ | „höchstens 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` | — |

Für ein anderes Maximum ist „mindestens N“ gleich `(N − 0,5) / Maximum × 100`. Bei 5 Combopunkten ist „mindestens 4“ `>= 70` und „mindestens 5“ `>= 90`.

### Gegner in der Nähe

`enemies >= 3`: 3 oder mehr Gegner im Radius des Zählers. Radius und „Nur Gegner im Kampf“ legst du auf der Seite „Allgemein“ fest (`enemies.range` und `enemies.combatOnly` im JSON). Ist die Anzahl unbekannt, ist die Bedingung falsch.

- Damit Gegner gezählt werden, müssen im Spiel die Namensplaketten von Gegnern eingeschaltet sein (standardmäßig mit der Taste V), und unbedeutende Gegner dürfen nicht ausgeblendet sein.
- Wähle den Radius passend zu deinen Fähigkeiten: Dolchfächer trifft im Umkreis von 8 Metern, also ist 8 der ehrliche Radius für „Dolchfächer oder Verstümmeln“.
- Für ein einzelnes Ziel ist `enemies <= 1` sicherer als `enemies == 1`: Die Regel funktioniert weiter, auch wenn der Gegner nicht gezählt wird.

### Entfernung zum Ziel

`target.distance <= 8`: Das Ziel ist 8 Meter oder näher entfernt. Ohne Ziel ist die Entfernung unbekannt und die Bedingung falsch. Die Entfernung ist ein Näherungswert: Die Bedingung ist nur erfüllt, wenn die Entfernung die Schwelle sicher einhält; in Grenzfällen ist sie falsch.

```text
use Pistol_Shot when  # das Ziel ist außerhalb der Nahkampfreichweite, aber innerhalb von 20 Metern
	target.distance >= 10 and target.distance <= 20
```


### Schalter der Schnelleinstellungen

Schalter sind die Schaltflächen der Schnelleinstellungen über dem Spiel, dazu Tastenkürzel. Was sie bedeuten, entscheidet die Rotation.

| Bedingung | Schaltfläche | Taste: Windows, macOS | Übliche Bedeutung |
|---|---|---|---|
| `aoe == 1` | Ziele: Mehrere | F2, ⌃⇧T, reihum | Modus für mehrere Ziele erzwingen |
| `st == 1` | Ziele: Einzeln | F2, ⌃⇧T, reihum | Einzelziel erzwingen |
| `aoe == 0 and st == 0` | Ziele: Auto | F2, ⌃⇧T, reihum | Die Regeln entscheiden, meist anhand von `enemies` |
| `cd == 1` | Burst | F3, ⌃⇧B | Große Abklingzeiten: jetzt einsetzen oder zurückhalten |
| `defensives == 1` | Heilung/Schutz | — | Heilung und defensive Fähigkeiten |
| `ground_spells == 1` | Bodenzauber | — | Zauber mit Zielort am Boden |
| `movement == 1` | Bewegung | — | Aktionen in Bewegung |

- Vergleiche nur mit `== 0` oder `== 1`.
- **`cd == 1` ist die Burst-Taste, nicht die Abklingzeit eines Zaubers.** Die Abklingzeit eines Slots ist `Slot.cd`.
- `aoe` und `st` sind nie gleichzeitig 1. Die Taste für den Zielmodus schaltet reihum zwischen „Auto“, „Einzeln“ und „Mehrere“ um.
- Standardmäßig ist Burst eingeschaltet, der Zielmodus steht auf „Auto“, und die übrigen Schaltflächen sind ausgeschaltet. KeyRota merkt sich ihren Zustand.
- Eine Schaltfläche der Schnelleinstellungen ist nur aktiv, wenn die Rotation diesen Schalter ausliest; beim Blizzard-Profil sind alle abgeblendet.
- Schalter sind nie unbekannt.

### Wie Bedingungen ausgewertet werden

| Bedingung | Wert vorhanden | Aura fehlt | Unbekannt |
|---|---|---|---|
| `X.up` | wahr | falsch | **falsch** |
| `X.down` | falsch | wahr | **falsch** |
| `X.duration op N`, `X.stacks op N` | wird verglichen | wird mit **0** verglichen | **falsch** |
| `X.ready` / `X.oncd` | nach Bereitschaft | — | **falsch** (beide) |
| `X.glow` / `X.noglow` | nach Leuchten | — | **falsch** (beide) |
| `X.cd`, `X.charges`, eine Ressource, `enemies`, `target.distance` | wird verglichen | — | **falsch** |
| ein Schalter | wird verglichen | — | nie |

Eine Gruppe ist wahr, wenn alle ihre Bedingungen wahr sind. Eine Regel ist erfüllt, wenn mindestens eine Gruppe wahr ist oder wenn sie gar keine Gruppen hat.

### „Nicht“, Klammern und ODER innerhalb einer Gruppe

KRC kennt kein `not`, kein `!=` und keine Klammern. Alles wird mit Gruppen ausgedrückt:

- **„Nicht“** ist die Gegenbedingung: nicht `.up` ist `.down`, nicht `.ready` ist `.oncd`, nicht `.glow` ist `.noglow`; bei Zahlen der umgekehrte Operator: nicht `>= 70` ist `< 70`.
- **(A oder B) und C** sind zwei Gruppen: `A and C`, `B and C`.
- **A und nicht (B und C)** sind zwei Gruppen: `A and nicht-B`, `A and nicht-C`.
- **Dieselbe Bedingung in jeder Gruppe** (etwa der Schutz einer Kanalisierung) wird in jeder Gruppe wiederholt.

```text
use Fan_of_Knives when  # Dolchfächer: (Modus Mehrere ODER Auto und 2+ Gegner) UND unter 5 Combopunkten
	aoe == 1 and Combo_Points < 70
	or
	st == 0 and enemies >= 2 and Combo_Points < 70
```


### Spickzettel

| Bedingung | Bedeutung |
|---|---|
| `X.up` / `X.down` | Aura vorhanden / fehlt |
| `X.duration <= 30` | ≤ 30 % übrig (eine fehlende Aura hat 0) |
| `X.up and X.duration <= 30` | aktiv und fällig zum Erneuern |
| `X.stacks >= 2` | 2 oder mehr Stapel (1 Stapel wird als 0 gelesen) |
| `X.ready` / `X.oncd` | Slot bereit / aus irgendeinem Grund nicht bereit |
| `X.cd <= 3` | ≤ 3 % der Abklingzeit übrig |
| `X.charges >= 2` | 2 oder mehr Aufladungen |
| `X.glow` / `X.noglow` | Taste leuchtet / leuchtet nicht |
| `PlayerHP <= 40` | deine Gesundheit ≤ 40 % |
| `TargetHP >= 50` | das Ziel bei ≥ 50 % (ohne Ziel falsch) |
| `Combo_Points >= 70` | 5+ von 7 Combopunkten |
| `Energy >= 70` | Energie ≥ 70 % |
| `enemies >= 3` | 3+ Gegner im Radius |
| `target.distance <= 8` | das Ziel innerhalb von 8 Metern (ohne Ziel falsch) |
| `aoe == 1` / `st == 1` | Modus „Mehrere“ / „Einzeln“ |
| `aoe == 0 and st == 0` | Modus „Auto“ |
| `cd == 1` | Burst ein |
| `defensives == 1` | Heilung/Schutz ein |
| `ground_spells == 1` | Bodenzauber ein |
| `movement == 1` | Bewegung ein |

---

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

## Muster und Beispiele

Jedes Muster ist eine kleine, aber vollständige Rotation: links der KRC-Text, rechts dasselbe als JSON. Füge es in den Editor ein („Text und JSON“ — „Einfügen“), um zu sehen, wie es auf den Seiten „Slots“ und „Regeln“ aussieht. Die Zauber-IDs sind echt und stammen von Wowhead. Am Ende: [vollständige Rotationen](#example-files).

### Ein DoT, im Pandemie-Fenster erneuert

Lege einen DoT an, wenn er fehlt, und erneuere ihn, wenn 30 % oder weniger übrig sind: Wer innerhalb dieses Fensters erneuert, verliert nichts. Eine fehlende Aura hat 0 übrig, deshalb ist das Erneuern eine eigene Gruppe mit `.up`.

*KRC-Text:*

```text
rotation "Muster: DoT mit Pandemie-Fenster"

buff1	Garrote_DoT = "Erdrosseln auf dem Ziel [703]"
slot1	Garrote = "Erdrosseln"
slot4	Mutilate = "Verstümmeln"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Garrote when  # Erdrosseln
	Garrote_DoT.down  # kein DoT
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30  # Pandemie

use Mutilate when  # Verstümmeln
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Muster: DoT mit Pandemie-Fenster",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "Erdrosseln auf dem Ziel [703]", "spell": 703}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "Erdrosseln", "spell": 703},
    {"n": 4, "alias": "Mutilate", "label": "Verstümmeln", "spell": 1329}
  ],
  "rules": [
    {"use": "Garrote", "name": "Erdrosseln", "when": [
      {"all": ["Garrote_DoT.down"], "comment": "kein DoT"},
      {"all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"], "comment": "Pandemie"}
    ]},
    {"use": "Mutilate", "name": "Verstümmeln"}
  ]
}
```


- Damit bei 3+ Zielen kein neuer DoT auf ein Ziel kommt, das gleich stirbt, ergänze die Gruppe „kein DoT“ um `TargetHP >= 50` und füge für ein oder zwei Ziele eine eigene Gruppe `Garrote_DoT.down and enemies <= 2` hinzu.
- Ein langer DoT mit variabler Dauer (Blutung: 4 s + 4 s pro Combopunkt) funktioniert genauso: Die Prozentwerte beziehen sich auf die Dauer dieser Anwendung.

### Aufbauer und Verbraucher nach Combopunkten

Verbrauche bei 5+ von 7 Combopunkten, baue darunter auf. Die Schwellen liegen in der Mitte zwischen zwei Stufen, siehe die [Tabelle der Combopunkte](https://keyrota.app/documentation/de/conditions#resources).

*KRC-Text:*

```text
rotation "Muster: Aufbauer und Verbraucher"

slot3	Envenom = "Vergiften"
slot4	Mutilate = "Verstümmeln"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Envenom when  # Vergiften
	Combo_Points >= 70  # 5+ Combopunkte

use Mutilate when  # Verstümmeln
	Combo_Points < 70  # unter 5 Combopunkten
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Muster: Aufbauer und Verbraucher",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 3, "alias": "Envenom", "label": "Vergiften", "spell": 32645},
    {"n": 4, "alias": "Mutilate", "label": "Verstümmeln", "spell": 1329}
  ],
  "rules": [
    {"use": "Envenom", "name": "Vergiften", "when": [
      {"all": ["Combo_Points >= 70"], "comment": "5+ Combopunkte"}
    ]},
    {"use": "Mutilate", "name": "Verstümmeln", "when": [
      {"all": ["Combo_Points < 70"], "comment": "unter 5 Combopunkten"}
    ]}
  ]
}
```


Ein Aufbauer mit `Combo_Points < 70` lässt die Combopunkte nicht überlaufen: Bei 5+ schweigt er, auch wenn der Verbraucher noch nicht bereit ist (zu wenig Energie), und KeyRota wartet.

### Ressourcen sparen

Nicht sofort verbrauchen, sondern den Buff aufrechterhalten und Energie sparen: Vergiften, wenn sein Buff ausläuft, unter Todesmal oder bei viel Energie. Die übrige Zeit passt bei 5+ Combopunkten keine Regel, und KeyRota wartet auf mehr Energie: Genau das ist Ressourcen sparen.

*KRC-Text:*

```text
rotation "Muster: Energie sparen"

buff3	Envenom_Buff = "Vergiften [32645]"
buff4	Deathmark_DoT = "Todesmal auf dem Ziel [360194]"
slot3	Envenom = "Vergiften"
slot4	Mutilate = "Verstümmeln"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Envenom when  # Vergiften
	Combo_Points >= 70 and Envenom_Buff.down  # kein Buff
	or
	Combo_Points >= 70 and Envenom_Buff.duration <= 20  # Buff läuft aus
	or
	Combo_Points >= 70 and Deathmark_DoT.up  # unter Todesmal
	or
	Combo_Points >= 70 and Energy >= 70  # Energie nicht überlaufen lassen

use Mutilate when  # Verstümmeln
	Combo_Points < 70
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Muster: Energie sparen",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 3, "alias": "Envenom_Buff", "label": "Vergiften [32645]", "spell": 32645},
    {"n": 4, "alias": "Deathmark_DoT", "label": "Todesmal auf dem Ziel [360194]", "spell": 360194}
  ],
  "slots": [
    {"n": 3, "alias": "Envenom", "label": "Vergiften", "spell": 32645},
    {"n": 4, "alias": "Mutilate", "label": "Verstümmeln", "spell": 1329}
  ],
  "rules": [
    {"use": "Envenom", "name": "Vergiften", "when": [
      {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "kein Buff"},
      {"all": ["Combo_Points >= 70", "Envenom_Buff.duration <= 20"], "comment": "Buff läuft aus"},
      {"all": ["Combo_Points >= 70", "Deathmark_DoT.up"], "comment": "unter Todesmal"},
      {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "Energie nicht überlaufen lassen"}
    ]},
    {"use": "Mutilate", "name": "Verstümmeln", "when": [
      {"all": ["Combo_Points < 70"]}
    ]}
  ]
}
```


- Die Schwelle `Energy >= 70` verhindert, dass die Energie am Maximum überläuft.
- Die Gruppe `Envenom_Buff.duration <= 20` greift auch ohne Buff (0 übrig); die Gruppe mit `.down` steht nur der Übersicht halber da.
- Um das Sparen abzustimmen, ändere nur die Energieschwelle: niedriger verbraucht früher, höher spart länger.

### Einzelziel und mehrere Ziele

Den Zielmodus legt der Spieler mit der Taste für den Zielmodus fest (sie schaltet reihum zwischen „Auto“, „Einzeln“ und „Mehrere“ um); im Modus „Auto“ entscheiden die Regeln nach der Anzahl der Gegner. Jede AoE-Regel bekommt zwei Gruppen, „Modus Mehrere“ und „Auto mit 2+ Gegnern“; die Einzelzielregel bekommt „Modus Einzeln“ und „Auto mit höchstens einem Gegner“.

*KRC-Text:*

```text
rotation "Muster: Einzelziel und mehrere Ziele"

slot3	Envenom = "Vergiften"
slot4	Mutilate = "Verstümmeln"
slot6	Fan_of_Knives = "Dolchfächer"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Envenom when  # Vergiften
	Combo_Points >= 70

use Fan_of_Knives when  # Dolchfächer: 2+ Ziele
	aoe == 1 and Combo_Points < 70  # Modus Mehrere
	or
	st == 0 and enemies >= 2 and Combo_Points < 70  # Modus Auto, 2+ Gegner

use Mutilate when  # Verstümmeln: Einzelziel
	st == 1 and Combo_Points < 70  # Modus Einzeln
	or
	aoe == 0 and enemies <= 1 and Combo_Points < 70  # Modus Auto, ein Gegner
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Muster: Einzelziel und mehrere Ziele",
  "specID": 259,
  "enemies": {"range": 8, "combatOnly": true},
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 3, "alias": "Envenom", "label": "Vergiften", "spell": 32645},
    {"n": 4, "alias": "Mutilate", "label": "Verstümmeln", "spell": 1329},
    {"n": 6, "alias": "Fan_of_Knives", "label": "Dolchfächer", "spell": 51723}
  ],
  "rules": [
    {"use": "Envenom", "name": "Vergiften", "when": [
      {"all": ["Combo_Points >= 70"]}
    ]},
    {"use": "Fan_of_Knives", "name": "Dolchfächer: 2+ Ziele", "when": [
      {"all": ["aoe == 1", "Combo_Points < 70"], "comment": "Modus Mehrere"},
      {"all": ["st == 0", "enemies >= 2", "Combo_Points < 70"], "comment": "Modus Auto, 2+ Gegner"}
    ]},
    {"use": "Mutilate", "name": "Verstümmeln: Einzelziel", "when": [
      {"all": ["st == 1", "Combo_Points < 70"], "comment": "Modus Einzeln"},
      {"all": ["aoe == 0", "enemies <= 1", "Combo_Points < 70"], "comment": "Modus Auto, ein Gegner"}
    ]}
  ]
}
```


- `st == 0 and enemies >= 2` bedeutet „nicht Modus Einzeln“: Im Modus „Mehrere“ greift die Regel ohnehin über ihre erste Gruppe.
- `enemies <= 1` ist sicherer als `enemies == 1`: Bei einem einzelnen Ziel wird der Gegner womöglich nicht gezählt.
- Den Radius des Zählers (`enemies.range`) richtest du nach deiner AoE-Fähigkeit: Dolchfächer trifft im Umkreis von 8 Metern.

### Abklingzeiten auf Burst und „nur unter der Abklingzeit“

`cd == 1` ist die Burst-Taste. Eine große Abklingzeit wird nur gedrückt, solange Burst eingeschaltet ist, und du hältst sie zurück, indem du Burst ausschaltest, zum Beispiel vor einer Phase, in der der Boss immun ist. Was das Fenster der Abklingzeit verstärkt, wird nur darunter gedrückt: hier Verschwinden nur, solange Todesmal auf dem Ziel ist, und Königsmord unter Todesmal oder wenn Todesmal noch lange braucht.

*KRC-Text:*

```text
rotation "Muster: Burst"

buff1	Garrote_DoT = "Erdrosseln auf dem Ziel [703]"
buff2	Rupture_DoT = "Blutung auf dem Ziel [1943]"
buff4	Deathmark_DoT = "Todesmal auf dem Ziel [360194]"
buff10	Vanish_Buff = "Verschwinden [11327]"
slot1	Garrote = "Erdrosseln"
slot4	Mutilate = "Verstümmeln"
slot8	Deathmark = "Todesmal"
slot9	Kingsbane = "Königsmord"
slot10	Vanish = "Verschwinden"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Garrote when  # Erdrosseln aus der Verstohlenheit
	Vanish_Buff.up

use Deathmark when  # Todesmal
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up  # Burst an, DoTs aktiv

use Kingsbane when  # Königsmord
	cd == 1 and Deathmark_DoT.up and Combo_Points < 50  # unter Todesmal, 0–3 Combopunkte
	or
	cd == 1 and Deathmark.cd >= 44 and Combo_Points < 50  # Todesmal erst in über 52 s

use Vanish when  # Verschwinden
	Deathmark_DoT.up and Combo_Points < 65  # unter Todesmal, 0–4 Combopunkte

use Mutilate when  # Verstümmeln
	Combo_Points < 70
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Muster: Burst",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "Erdrosseln auf dem Ziel [703]", "spell": 703},
    {"n": 2, "alias": "Rupture_DoT", "label": "Blutung auf dem Ziel [1943]", "spell": 1943},
    {"n": 4, "alias": "Deathmark_DoT", "label": "Todesmal auf dem Ziel [360194]", "spell": 360194},
    {"n": 10, "alias": "Vanish_Buff", "label": "Verschwinden [11327]", "spell": 11327}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "Erdrosseln", "spell": 703},
    {"n": 4, "alias": "Mutilate", "label": "Verstümmeln", "spell": 1329},
    {"n": 8, "alias": "Deathmark", "label": "Todesmal", "spell": 360194},
    {"n": 9, "alias": "Kingsbane", "label": "Königsmord", "spell": 385627},
    {"n": 10, "alias": "Vanish", "label": "Verschwinden", "spell": 1856, "offGcd": true, "queue": true}
  ],
  "rules": [
    {"use": "Garrote", "name": "Erdrosseln aus der Verstohlenheit", "when": [
      {"all": ["Vanish_Buff.up"]}
    ]},
    {"use": "Deathmark", "name": "Todesmal", "when": [
      {"all": ["cd == 1", "Garrote_DoT.up", "Rupture_DoT.up"], "comment": "Burst an, DoTs aktiv"}
    ]},
    {"use": "Kingsbane", "name": "Königsmord", "when": [
      {"all": ["cd == 1", "Deathmark_DoT.up", "Combo_Points < 50"], "comment": "unter Todesmal, 0–3 Combopunkte"},
      {"all": ["cd == 1", "Deathmark.cd >= 44", "Combo_Points < 50"], "comment": "Todesmal erst in über 52 s"}
    ]},
    {"use": "Vanish", "name": "Verschwinden", "when": [
      {"all": ["Deathmark_DoT.up", "Combo_Points < 65"], "comment": "unter Todesmal, 0–4 Combopunkte"}
    ]},
    {"use": "Mutilate", "name": "Verstümmeln", "when": [
      {"all": ["Combo_Points < 70"]}
    ]}
  ]
}
```


- Verschwinden liegt außerhalb des GCD, hat aber zusätzlich „Im Warteschlangenfenster“ (**O + Q**): Sonst würde es mitten im GCD direkt nach Königsmord gedrückt, bevor die Combopunkte von Königsmord eintreffen, und würde den alten Stand prüfen.
- Schaltest du Burst aus, warten Todesmal und Königsmord; Verschwinden wartet auf Todesmal.
- Königsmord bei 0–3 Combopunkten: Danach kommen 5 weitere hinzu, und keiner geht verloren.

### Schutz von Kanalisierungen

Manche Kanalisierungen beendet das Spiel kurz vor dem letzten Treffer, und der nächste Tastendruck bricht sie ab. Den Schutz bildet die eigene Aura der Kanalisierung: Solange mehr als 8 % davon übrig sind, ist keine Regel erfüllt. Die Bedingung gehört in **jede** Gruppe jeder Regel. Das Flag **C** am Slot der Kanalisierung verhindert, dass er zu Beginn doppelt gedrückt wird.

*KRC-Text:*

```text
rotation "Muster: Schutz von Kanalisierungen"

buff10	Killing_Spree_Buff = "Mordlust, kanalisiert [51690]"
slot8	Killing_Spree = "Mordlust"
slot9	Dispatch = "Tötung"
slot11	Sinister_Strike = "Finsterer Stoß"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Killing_Spree when  # Mordlust
	Combo_Points >= 80 and Killing_Spree_Buff.duration <= 8

use Dispatch when  # Tötung
	Combo_Points >= 80 and Killing_Spree_Buff.duration <= 8

use Sinister_Strike when  # Finsterer Stoß
	Combo_Points < 80 and Killing_Spree_Buff.duration <= 8
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Muster: Schutz von Kanalisierungen",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 10, "alias": "Killing_Spree_Buff", "label": "Mordlust, kanalisiert [51690]", "spell": 51690}
  ],
  "slots": [
    {"n": 8, "alias": "Killing_Spree", "label": "Mordlust", "spell": 51690, "channel": true},
    {"n": 9, "alias": "Dispatch", "label": "Tötung", "spell": 2098},
    {"n": 11, "alias": "Sinister_Strike", "label": "Finsterer Stoß", "spell": 193315}
  ],
  "rules": [
    {"use": "Killing_Spree", "name": "Mordlust", "when": [
      {"all": ["Combo_Points >= 80", "Killing_Spree_Buff.duration <= 8"]}
    ]},
    {"use": "Dispatch", "name": "Tötung", "when": [
      {"all": ["Combo_Points >= 80", "Killing_Spree_Buff.duration <= 8"]}
    ]},
    {"use": "Sinister_Strike", "name": "Finsterer Stoß", "when": [
      {"all": ["Combo_Points < 80", "Killing_Spree_Buff.duration <= 8"]}
    ]}
  ]
}
```


- Warum `<= 8` und nicht `.down`: Ohne Kanalisierung hat die Aura 0 übrig, und die Bedingung ist erfüllt; während der Kanalisierung wartet sie nur die letzten 8 % ab, nicht noch zusätzliche Sekundenbruchteile nach dem Ende.
- Wird die Aura nicht ausgelesen, ist die Bedingung in jeder Regel falsch, und KeyRota drückt nichts: Lieber einen Tastendruck auslassen als die Kanalisierung abbrechen. Die Aura der Kanalisierung muss deshalb im Profil für Better Assistant stehen.

### Ein Makro außerhalb des GCD im Warteschlangenfenster

Es gibt zwei Arten von „außerhalb des GCD“:
- **O**: Die Taste wird sofort gedrückt, auch mitten im GCD. So verliert Großer Wurf (verlängert Schicksalswürfel) keine Zeit.
- **O + Q**: Die Taste liegt außerhalb des GCD, aber ihr Makro oder ihr Ergebnis hängt vom GCD ab. Das Makro Adrenalinrausch mit Mordlust in der zweiten Zeile (Mordlust liegt auf dem GCD) wird im Warteschlangenfenster am Ende des GCD gedrückt, und Mordlust wird direkt nach Adrenalinrausch gewirkt.

*Das Makro im Spiel (Slot 1):*

```text
#showtooltip Adrenalinrausch
/cast Adrenalinrausch
/cast Mordlust
```


*KRC-Text:*

```text
rotation "Muster: außerhalb des GCD"

buff2	Triple_Threat = "Schicksalswürfel, Stufe 3 [1214935]"
buff3	Jackpot = "Schicksalswürfel, Stufe 4 [1214937]"
buff6	Adrenaline_Rush_Buff = "Adrenalinrausch [13750]"
slot1	Adrenaline_Rush = "Adrenalinrausch + Mordlust (Makro)"
slot4	Keep_It_Rolling = "Großer Wurf"
slot11	Sinister_Strike = "Finsterer Stoß"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Adrenaline_Rush when  # Adrenalinrausch (+ Mordlust per Makro)
	Adrenaline_Rush_Buff.down and Combo_Points >= 7 and Combo_Points < 80  # 1–5 Combopunkte: bei 0 wirkt das Makro Mordlust nicht

use Keep_It_Rolling when  # Großer Wurf
	Triple_Threat.up
	or
	Jackpot.up

use Sinister_Strike when  # Finsterer Stoß
	Combo_Points < 80
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Muster: außerhalb des GCD",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 2, "alias": "Triple_Threat", "label": "Schicksalswürfel, Stufe 3 [1214935]", "spell": 1214935},
    {"n": 3, "alias": "Jackpot", "label": "Schicksalswürfel, Stufe 4 [1214937]", "spell": 1214937},
    {"n": 6, "alias": "Adrenaline_Rush_Buff", "label": "Adrenalinrausch [13750]", "spell": 13750}
  ],
  "slots": [
    {"n": 1, "alias": "Adrenaline_Rush", "label": "Adrenalinrausch + Mordlust (Makro)", "spell": 13750, "offGcd": true, "queue": true},
    {"n": 4, "alias": "Keep_It_Rolling", "label": "Großer Wurf", "spell": 381989, "offGcd": true},
    {"n": 11, "alias": "Sinister_Strike", "label": "Finsterer Stoß", "spell": 193315}
  ],
  "rules": [
    {"use": "Adrenaline_Rush", "name": "Adrenalinrausch (+ Mordlust per Makro)", "when": [
      {"all": ["Adrenaline_Rush_Buff.down", "Combo_Points >= 7", "Combo_Points < 80"], "comment": "1–5 Combopunkte: bei 0 wirkt das Makro Mordlust nicht"}
    ]},
    {"use": "Keep_It_Rolling", "name": "Großer Wurf", "when": [
      {"all": ["Triple_Threat.up"]},
      {"all": ["Jackpot.up"]}
    ]},
    {"use": "Sinister_Strike", "name": "Finsterer Stoß", "when": [
      {"all": ["Combo_Points < 80"]}
    ]}
  ]
}
```


Die ID eines Makro-Slots ist die ID des Hauptzaubers des Makros (Adrenalinrausch, 13750): Damit setzt Better Assistant den Zauber des Makros in den Slot, und KeyRota übernimmt die Taste von der Makro-Schaltfläche auf deiner Aktionsleiste.

### Verteidigung nach Gesundheit

Heilung oder eine Verteidigung unterhalb einer Gesundheitsschwelle, nur wenn „Heilung/Schutz“ in den Schnelleinstellungen eingeschaltet ist. Der Slot wird **im Kampf** angezeigt („Im Kampf“, `"show": "combat"`), damit er auch ohne Ziel funktioniert. Die Regel steht an erster Stelle: Bei niedriger Gesundheit ist sie wichtiger als Schaden.

*KRC-Text:*

```text
rotation "Muster: Verteidigung nach Gesundheit"

slot4	Mutilate = "Verstümmeln"
slot11	Crimson_Vial = "Blutrote Phiole"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Crimson_Vial when  # Blutrote Phiole
	defensives == 1 and PlayerHP <= 40  # Gesundheit 40 % oder weniger

use Mutilate when  # Verstümmeln
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Muster: Verteidigung nach Gesundheit",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 4, "alias": "Mutilate", "label": "Verstümmeln", "spell": 1329},
    {"n": 11, "alias": "Crimson_Vial", "label": "Blutrote Phiole", "spell": 185311, "show": "combat"}
  ],
  "rules": [
    {"use": "Crimson_Vial", "name": "Blutrote Phiole", "when": [
      {"all": ["defensives == 1", "PlayerHP <= 40"], "comment": "Gesundheit 40 % oder weniger"}
    ]},
    {"use": "Mutilate", "name": "Verstümmeln"}
  ]
}
```


„Heilung/Schutz“ ist standardmäßig ausgeschaltet: Schalte es in den Schnelleinstellungen ein, wenn du automatische Verteidigung willst.

### Procs: nach Buff oder nach Leuchten

Prüfe einen Proc anhand seines Buffs: In der Schlachtzugsrotation für Meucheln erlaubt der Buff Wunder Punkt (`Blindside.up`) die Regel für Hinterhalt. Hebt das Spiel die Taste bei einem Proc hervor, kann eine Regel auch das Leuchten auslesen (`Ambush.glow`), aber nur, wenn du dieses Leuchten tatsächlich auf deiner Aktionsleiste siehst.

*KRC-Text:*

```text
rotation "Muster: Proc"

buff7	Blindside = "Wunder Punkt [121153]"
slot4	Mutilate = "Verstümmeln"
slot5	Ambush = "Hinterhalt"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Ambush when  # Hinterhalt (Wunder Punkt)
	Blindside.up and Combo_Points < 70

use Mutilate when  # Verstümmeln
	Combo_Points < 70
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Muster: Proc",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 7, "alias": "Blindside", "label": "Wunder Punkt [121153]", "spell": 121153}
  ],
  "slots": [
    {"n": 4, "alias": "Mutilate", "label": "Verstümmeln", "spell": 1329},
    {"n": 5, "alias": "Ambush", "label": "Hinterhalt", "spell": 8676}
  ],
  "rules": [
    {"use": "Ambush", "name": "Hinterhalt (Wunder Punkt)", "when": [
      {"all": ["Blindside.up", "Combo_Points < 70"]}
    ]},
    {"use": "Mutilate", "name": "Verstümmeln", "when": [
      {"all": ["Combo_Points < 70"]}
    ]}
  ]
}
```


### Aufladungen

Ein Zauber mit Aufladungen wird bei zwei Aufladungen gedrückt oder wenn die zweite fast wieder da ist, damit seine Aufladezeit nie ungenutzt verstreicht. Beispiel: Stachelpfeil des Jägers (2 Aufladungen).

*KRC-Text:*

```text
rotation "Muster: Aufladungen"

slot1	Barbed_Shot = "Stachelpfeil"
slot2	Kill_Command = "Tötungsbefehl"
resource1	PlayerHP
resource2	TargetHP
resource3	Focus

use Barbed_Shot when  # Stachelpfeil
	Barbed_Shot.charges >= 2  # beide Aufladungen
	or
	Barbed_Shot.charges == 1 and Barbed_Shot.cd <= 20  # die zweite ist fast wieder da

use Kill_Command when  # Tötungsbefehl
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Muster: Aufladungen",
  "specID": 253,
  "resources": ["PlayerHP", "TargetHP", "Focus"],
  "slots": [
    {"n": 1, "alias": "Barbed_Shot", "label": "Stachelpfeil", "spell": 217200},
    {"n": 2, "alias": "Kill_Command", "label": "Tötungsbefehl", "spell": 34026}
  ],
  "rules": [
    {"use": "Barbed_Shot", "name": "Stachelpfeil", "when": [
      {"all": ["Barbed_Shot.charges >= 2"], "comment": "beide Aufladungen"},
      {"all": ["Barbed_Shot.charges == 1", "Barbed_Shot.cd <= 20"], "comment": "die zweite ist fast wieder da"}
    ]},
    {"use": "Kill_Command", "name": "Tötungsbefehl"}
  ]
}
```


Bei einem Zauber mit Aufladungen ist `.cd` die Aufladezeit der nächsten Aufladung: `Barbed_Shot.cd <= 20` bedeutet, dass höchstens 20 % ihrer Aufladezeit übrig sind.

### Entfernung zum Ziel

Ist das Ziel außerhalb der Nahkampfreichweite, aber in Reichweite einer Fernkampffähigkeit, drücke diese, statt untätig zu bleiben. Ohne Ziel ist die Entfernung unbekannt, und die Regel schweigt.

*KRC-Text:*

```text
rotation "Muster: Entfernung"

slot10	Pistol_Shot = "Pistolenschuss"
slot11	Sinister_Strike = "Finsterer Stoß"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Pistol_Shot when  # Pistolenschuss: Das Ziel ist weit weg
	target.distance >= 10 and target.distance <= 20 and Combo_Points < 80

use Sinister_Strike when  # Finsterer Stoß
	Combo_Points < 80
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Muster: Entfernung",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 10, "alias": "Pistol_Shot", "label": "Pistolenschuss", "spell": 185763},
    {"n": 11, "alias": "Sinister_Strike", "label": "Finsterer Stoß", "spell": 193315}
  ],
  "rules": [
    {"use": "Pistol_Shot", "name": "Pistolenschuss: Das Ziel ist weit weg", "when": [
      {"all": ["target.distance >= 10", "target.distance <= 20", "Combo_Points < 80"]}
    ]},
    {"use": "Sinister_Strike", "name": "Finsterer Stoß", "when": [
      {"all": ["Combo_Points < 80"]}
    ]}
  ]
}
```


Eine Nahkampfregel muss die Entfernung nicht prüfen: Ist das Ziel zu weit weg, kann der Zauber nicht eingesetzt werden, und KeyRota geht von selbst zur nächsten Regel.

### Bewegung

Die Schaltfläche „Bewegung“ in den Schnelleinstellungen ist dein Signal an die Rotation: „Ich muss gleich laufen.“ Was dann passiert, entscheidet die Rotation, zum Beispiel der Wechsel zu einer Fernkampffähigkeit.

*KRC-Text:*

```text
rotation "Muster: Bewegung"

slot10	Pistol_Shot = "Pistolenschuss"
slot11	Sinister_Strike = "Finsterer Stoß"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Pistol_Shot when  # Pistolenschuss in Bewegung
	movement == 1 and Combo_Points < 80

use Sinister_Strike when  # Finsterer Stoß
	movement == 0 and Combo_Points < 80
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Muster: Bewegung",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 10, "alias": "Pistol_Shot", "label": "Pistolenschuss", "spell": 185763},
    {"n": 11, "alias": "Sinister_Strike", "label": "Finsterer Stoß", "spell": 193315}
  ],
  "rules": [
    {"use": "Pistol_Shot", "name": "Pistolenschuss in Bewegung", "when": [
      {"all": ["movement == 1", "Combo_Points < 80"]}
    ]},
    {"use": "Sinister_Strike", "name": "Finsterer Stoß", "when": [
      {"all": ["movement == 0", "Combo_Points < 80"]}
    ]}
  ]
}
```


### Bodenzauber

Die Schaltfläche „Bodenzauber“ erlaubt Zauber, die auf dem Boden platziert werden. KeyRota drückt nur eine Taste, deshalb legt das Makro den Ort fest: `[@player]` zu deinen Füßen, `[@cursor]` unter dem Mauszeiger.

*Das Makro im Spiel:*

```text
#showtooltip Tod und Verfall
/cast [@player] Tod und Verfall
```


*KRC-Text:*

```text
rotation "Muster: Bodenzauber"

slot1	Death_and_Decay = "Tod und Verfall (Makro @player)"
resource1	PlayerHP
resource2	TargetHP
resource3	Runes
resource4	Runic_Power

use Death_and_Decay when  # Tod und Verfall
	ground_spells == 1 and enemies >= 2  # Bodenzauber an, 2+ Gegner
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Muster: Bodenzauber",
  "specID": 250,
  "resources": ["PlayerHP", "TargetHP", "Runes", "Runic_Power"],
  "slots": [
    {"n": 1, "alias": "Death_and_Decay", "label": "Tod und Verfall (Makro @player)", "spell": 43265}
  ],
  "rules": [
    {"use": "Death_and_Decay", "name": "Tod und Verfall", "when": [
      {"all": ["ground_spells == 1", "enemies >= 2"], "comment": "Bodenzauber an, 2+ Gegner"}
    ]}
  ]
}
```


### Die vollständige Einstiegsrotation

Die Rotation aus dem [Beispiel im Editor](https://keyrota.app/documentation/de/editor#walkthrough): zwei DoTs, ein Aufbauer, ein Verbraucher mit Energiesparen, eine Verteidigung und Todesmal auf Burst.

*KRC-Text:*

```text
rotation "Meucheln: Beispiel v1"

# Beispiel aus der KeyRota-Dokumentation: zwei Blutungen, ein Aufbauer, ein Verbraucher mit Energiesparen,
# eine Verteidigung bei niedriger Gesundheit und Todesmal auf der Burst-Taste.
# Combopunkte in Prozent von 7: 5 Punkte = 71 %, Schwelle 70 = 5+.

buff1	Garrote_DoT = "Erdrosseln auf dem Ziel [703]"
buff2	Rupture_DoT = "Blutung auf dem Ziel [1943]"
buff3	Envenom_Buff = "Vergiften [32645]"
buff4	Deathmark_DoT = "Todesmal auf dem Ziel [360194]"
slot1	Garrote = "Erdrosseln"
slot2	Rupture = "Blutung"
slot3	Envenom = "Vergiften"
slot4	Mutilate = "Verstümmeln"
slot5	Deathmark = "Todesmal"
slot6	Crimson_Vial = "Blutrote Phiole"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

# --- Verteidigung: nur mit „Heilung/Schutz“ an ---
use Crimson_Vial when  # Blutrote Phiole
	defensives == 1 and PlayerHP <= 40  # Gesundheit 40 % oder weniger

# --- Abklingzeit: nur mit Burst an ---
use Deathmark when  # Todesmal
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up and Envenom_Buff.up  # Burst an, Blutungen und Vergiften aktiv

# --- Blutungen ---
use Garrote when  # Erdrosseln
	Garrote_DoT.down  # keine Blutung
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30  # Pandemie-Fenster: 30 % oder weniger übrig

use Rupture when  # Blutung
	Combo_Points >= 70 and Rupture_DoT.down  # 5+ Combopunkte, keine Blutung
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # 5+ Combopunkte, Pandemie-Fenster

# --- Verbraucher: 5+ Combopunkte, Energie sparen ---
use Envenom when  # Vergiften
	Combo_Points >= 70 and Envenom_Buff.down  # kein Buff
	or
	Combo_Points >= 70 and Envenom_Buff.up and Envenom_Buff.duration <= 20  # Buff läuft aus
	or
	Combo_Points >= 70 and Energy >= 70  # Energie nicht überlaufen lassen
	or
	Combo_Points >= 70 and Deathmark_DoT.up  # Todesmal auf dem Ziel

# --- Aufbauer: unter 5 Combopunkten ---
use Mutilate when  # Verstümmeln
	Combo_Points < 70  # unter 5 Combopunkten
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "Meucheln: Beispiel v1",
  "specID": 259,
  "ignoreMainIcon": true,
  "enemies": {"range": 8, "combatOnly": true},
  "notes": [
    "Beispiel aus der KeyRota-Dokumentation: zwei Blutungen, ein Aufbauer, ein Verbraucher mit Energiesparen,",
    "eine Verteidigung bei niedriger Gesundheit und Todesmal auf der Burst-Taste.",
    "Combopunkte in Prozent von 7: 5 Punkte = 71 %, Schwelle 70 = 5+."
  ],
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "Erdrosseln auf dem Ziel [703]", "spell": 703},
    {"n": 2, "alias": "Rupture_DoT", "label": "Blutung auf dem Ziel [1943]", "spell": 1943},
    {"n": 3, "alias": "Envenom_Buff", "label": "Vergiften [32645]", "spell": 32645},
    {"n": 4, "alias": "Deathmark_DoT", "label": "Todesmal auf dem Ziel [360194]", "spell": 360194}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "Erdrosseln", "spell": 703, "show": "target"},
    {"n": 2, "alias": "Rupture", "label": "Blutung", "spell": 1943, "show": "target"},
    {"n": 3, "alias": "Envenom", "label": "Vergiften", "spell": 32645, "show": "target"},
    {"n": 4, "alias": "Mutilate", "label": "Verstümmeln", "spell": 1329, "show": "target"},
    {"n": 5, "alias": "Deathmark", "label": "Todesmal", "spell": 360194, "show": "target"},
    {"n": 6, "alias": "Crimson_Vial", "label": "Blutrote Phiole", "spell": 185311, "show": "combat"}
  ],
  "rules": [
    {
      "use": "Crimson_Vial",
      "name": "Blutrote Phiole",
      "note": ["--- Verteidigung: nur mit „Heilung/Schutz“ an ---"],
      "when": [{"all": ["defensives == 1", "PlayerHP <= 40"], "comment": "Gesundheit 40 % oder weniger"}]
    },
    {
      "use": "Deathmark",
      "name": "Todesmal",
      "note": ["--- Abklingzeit: nur mit Burst an ---"],
      "when": [
        {
          "all": ["cd == 1", "Garrote_DoT.up", "Rupture_DoT.up", "Envenom_Buff.up"],
          "comment": "Burst an, Blutungen und Vergiften aktiv"
        }
      ]
    },
    {
      "use": "Garrote",
      "name": "Erdrosseln",
      "note": ["--- Blutungen ---"],
      "when": [
        {"all": ["Garrote_DoT.down"], "comment": "keine Blutung"},
        {
          "all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"],
          "comment": "Pandemie-Fenster: 30 % oder weniger übrig"
        }
      ]
    },
    {
      "use": "Rupture",
      "name": "Blutung",
      "when": [
        {"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "5+ Combopunkte, keine Blutung"},
        {
          "all": ["Combo_Points >= 70", "Rupture_DoT.up", "Rupture_DoT.duration <= 30"],
          "comment": "5+ Combopunkte, Pandemie-Fenster"
        }
      ]
    },
    {
      "use": "Envenom",
      "name": "Vergiften",
      "note": ["--- Verbraucher: 5+ Combopunkte, Energie sparen ---"],
      "when": [
        {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "kein Buff"},
        {
          "all": ["Combo_Points >= 70", "Envenom_Buff.up", "Envenom_Buff.duration <= 20"],
          "comment": "Buff läuft aus"
        },
        {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "Energie nicht überlaufen lassen"},
        {"all": ["Combo_Points >= 70", "Deathmark_DoT.up"], "comment": "Todesmal auf dem Ziel"}
      ]
    },
    {
      "use": "Mutilate",
      "name": "Verstümmeln",
      "note": ["--- Aufbauer: unter 5 Combopunkten ---"],
      "when": [{"all": ["Combo_Points < 70"], "comment": "unter 5 Combopunkten"}]
    }
  ]
}
```


### Eine vollständige Schlachtzugsrotation

Eine echte Schlachtzugsrotation für Meucheln (Fatebound): 15 Regeln, Burst, Verschwinden unter Todesmal, Kopieren der DoTs mit Blutroter Sturm, AoE und Einzelziel, Energiesparen.

**KRC-Text: Meucheln, Schlachtzug**
*KRC-Text:*

```text
rotation "Meucheln, Schlachtzug v2.8: Burst-Taste, Method 12.1, SimulationCraft, Top-Logs"

# Meucheln, Schlachtzug. Grundlage: der Method-Guide (Patch 12.1), die Aktionsliste von SimulationCraft und die besten Spieler auf Warcraft Logs.
# Hauptsymbol ignorieren: ein. Todesmal und Königsmord nur mit eingeschaltetem Burst; Verschwinden nur, solange Todesmal auf dem Ziel ist.
# Combopunkte in Prozent von 7: 3 = 43 %, 4 = 57 %, 5 = 71 %, 6 = 86 %, 7 = 100 %.

# v2.4: Königsmord nur bei 0–3 Combopunkten (danach geben „Unerbittliche Hiebe“ 5 dazu), Verschwinden bei 0–4 (Erdrosseln aus der Verstohlenheit gibt 3).
# v2.5: Blutroter Sturm nur, wenn genau eine der beiden Blutungen frisch ist; vorher wurde er mehrmals hintereinander gedrückt.
# v2.6: Ist Burst an und Todesmal bereit oder schon auf dem Ziel, kommen Erdrosseln und Blutung auf ein Ziel mit beliebiger Gesundheit.
# v2.7 und v2.8: neues Ziel ohne Blutungen, Burst an, Todesmal bereit, 2+ Gegner in der Nähe: zuerst kopiert Blutroter Sturm die Blutungen (bei beliebigen Combopunkten), danach Todesmal.

buff1	Garrote_DoT = "Erdrosseln auf dem Ziel [703]"
buff2	Rupture_DoT = "Blutung auf dem Ziel [1943]"
buff3	Envenom_Buff = "Vergiften [32645]"
buff4	Deathmark_DoT = "Todesmal auf dem Ziel [360194]"
buff5	Improved_Garrote = "Verbessertes Erdrosseln [392401]"
buff6	Darkest_Night = "Dunkelste Nacht [457280]"
buff7	Blindside = "Wunder Punkt [121153]"
buff8	Stealth_Buff = "Verstohlenheit [1784]"
buff9	Stealth_Sub = "Verstohlenheit (Trickbetrug) [115191]"
buff10	Vanish_Buff = "Verschwinden [11327]"
slot1	Garrote = "Erdrosseln"
slot2	Rupture = "Blutung"
slot3	Envenom = "Vergiften"
slot4	Mutilate = "Verstümmeln"
slot5	Ambush = "Hinterhalt"
slot6	Fan_of_Knives = "Dolchfächer"
slot7	Crimson_Tempest = "Blutroter Sturm"
slot8	Deathmark = "Todesmal"
slot9	Kingsbane = "Königsmord"
slot10	Vanish = "Verschwinden"
slot11	Crimson_Vial = "Blutrote Phiole"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

# --- Verteidigung: nur mit „Heilung/Schutz“ an ---
use Crimson_Vial when  # Blutrote Phiole
	defensives == 1 and PlayerHP <= 40  # Gesundheit 40 % oder weniger

# === Verstohlenheit ===
use Garrote when  # Erdrosseln aus der Verstohlenheit
	Stealth_Buff.up  # in Verstohlenheit
	or
	Stealth_Sub.up  # in Verstohlenheit (Trickbetrug)
	or
	Vanish_Buff.up  # direkt nach Verschwinden

use Garrote when  # Erdrosseln: Fenster von Verbessertes Erdrosseln
	Improved_Garrote.up and Garrote_DoT.down  # Fenster offen, kein Erdrosseln auf dem Ziel
	or
	Improved_Garrote.up and Garrote_DoT.duration <= 78  # SimulationCraft: erneuern, wenn noch 14 von 18 Sekunden übrig sind

# === Abklingzeiten (Burst-Taste) ===
use Deathmark when  # Todesmal
	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 an, Blutungen aktiv, Königsmord bereit, Vergiften noch 2+ Sekunden

use Kingsbane when  # Königsmord
	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 an, Todesmal auf dem Ziel, 0–3 Combopunkte
	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 an, Todesmal erst in über 52 s, 0–3 Combopunkte

use Vanish when  # Verschwinden
	Deathmark_DoT.up and Improved_Garrote.down and Combo_Points < 65 and Stealth_Buff.down and Stealth_Sub.down  # Todesmal auf dem Ziel, 0–4 Combopunkte (Erdrosseln aus der Verstohlenheit gibt 3)

# === Blutungen ===
use Crimson_Tempest when  # Blutroter Sturm: Blutungen für Todesmal auf ein neues Ziel kopieren
	cd == 1 and Deathmark.cd <= 3 and Garrote_DoT.down and Rupture_DoT.down and Envenom_Buff.up and enemies >= 2  # Combopunkte egal

# Keine neue Blutung auf fast tote Adds (wie in SimulationCraft „Ziel lebt noch 12+ s“): bei 1–2 Zielen und im Modus „Einzeln“ immer;
# bei 3+ Zielen nur, wenn das Ziel 50 %+ Gesundheit hat, oder Burst an und Todesmal bereit ist, oder Todesmal schon auf dem Ziel ist.
use Garrote when  # Erdrosseln: aufrechterhalten
	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+ Ziele: nur ein Ziel, das überlebt
	or
	Garrote_DoT.down and Combo_Points < 95 and cd == 1 and Deathmark.cd <= 3  # Burst an und Todesmal bereit: Gesundheit egal
	or
	Garrote_DoT.down and Combo_Points < 95 and Deathmark_DoT.up  # Todesmal auf dem Ziel (kopierte Blutungen)
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30 and Combo_Points < 95  # Pandemie-Fenster (läuft schon)

use Rupture when  # Blutung
	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+ Ziele: nur ein Ziel, das überlebt
	or
	Combo_Points >= 70 and Rupture_DoT.down and cd == 1 and Deathmark.cd <= 3  # Burst an und Todesmal bereit
	or
	Combo_Points >= 70 and Rupture_DoT.down and Deathmark_DoT.up  # Todesmal auf dem Ziel
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 25 and Darkest_Night.down  # Erneuern; die 7 Combopunkte von Dunkelste Nacht nicht dafür ausgeben

# === Aufbauer: bis 5 Combopunkte, mit Dunkelste Nacht bis 7 ===

# Blutroter Sturm einmal direkt nach frischer Blutung (bei 4+ Zielen auch nach frischem Erdrosseln), sonst Dolchfächer.
# Nur eine der beiden darf frisch sein (94 %+): direkt nach Blutroter Sturm sind beide frisch, also wartet der nächste.
use Crimson_Tempest when  # Blutroter Sturm: Blutungen direkt nach frischer Blutung oder frischem Erdrosseln verteilen
	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 Ziele: nur nach frischer Blutung
	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 Ziele: nur nach frischer Blutung

use Fan_of_Knives when  # Dolchfächer: Einzelziel, Dunkelste Nacht, ein Combopunkt fehlt
	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  # Dolchfächer: 2+ Ziele
	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  # Hinterhalt (Wunder Punkt)
	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  # Verstümmeln
	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

# === Verbraucher: 5+ Combopunkte (mit Dunkelste Nacht 7) ===
# SimulationCraft: nicht sofort drücken, sondern Vergiften durchgehend halten: in der letzten Sekunde des Buffs, solange Todesmal auf dem Ziel ist, bevor die Energie voll ist, bei 4+ Zielen früher.
use Envenom when  # Vergiften
	Darkest_Night.down and Combo_Points >= 70 and Envenom_Buff.down
	or
	Darkest_Night.down and Combo_Points >= 70 and Envenom_Buff.duration <= 20  # noch etwa 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  # Energie nicht überlaufen lassen
	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
```


Ihr JSON findest du in den Dateien unten. Die zweite Rotation ist Gesetzlosigkeit (Trickster) mit dem Makro Adrenalinrausch (**O + Q**), Großer Wurf (**O**), Mordlust (**C**) und dem Schutz der Kanalisierung in jeder Regel.

### Beispieldateien

| Beispiel | Dateien |
|---|---|
| Die Einstiegsrotation für Meucheln aus dem Beispiel im Editor | [JSON](https://keyrota.app/documentation/examples/starter-assassination.de.json), [KRC-Text](https://keyrota.app/documentation/examples/starter-assassination.de.txt) |
| Meucheln, Schlachtzug: 15 Regeln | [JSON](https://keyrota.app/documentation/examples/assassination-raid.de.json), [KRC-Text](https://keyrota.app/documentation/examples/assassination-raid.de.txt) |
| Gesetzlosigkeit, Schlachtzug und Mythisch+: 13 Regeln, Flags O, OQ, C | [JSON](https://keyrota.app/documentation/examples/outlaw-raid.de.json), [KRC-Text](https://keyrota.app/documentation/examples/outlaw-raid.de.txt) |
| Die kürzeste sinnvolle Rotation | [JSON](https://keyrota.app/documentation/examples/minimal.de.json), [KRC-Text](https://keyrota.app/documentation/examples/minimal.de.txt) |
| Ein Syntaxbeispiel: jede Bedingung und jedes Flag (ohne IDs, nicht für den Kampf) | [JSON](https://keyrota.app/documentation/examples/syntax-every-condition.de.json), [KRC-Text](https://keyrota.app/documentation/examples/syntax-every-condition.de.txt) |

Jedes Beispiel gibt es in allen Sprachen der Website: Labels, Regeln und Kommentare sind übersetzt, Bedingungen, Zauber-IDs und Flags sind gleich. Die Sprache steht im Dateinamen: `.en`, `.ru`, `.de`, `.fr`, `.es`, `.it`, `.pt`, `.ko`, `.zh`, `.zh-TW`.

So öffnest du eine Datei: „Neu“ — „Aus Datei…“ im Hauptfenster oder „Öffnen…“ auf der Seite „Text und JSON“ des Editors.

---

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

## Rotation mit einem KI-Agenten erstellen

> [!TIP] Ein Link auf diese Seite genügt
> Du kannst deinem KI-Agenten einfach den Link auf diese Seite geben: Er findet sich selbst zurecht und fragt dich bei Bedarf nach fehlenden Angaben.

Ein KI-Agent mit Zugriff auf das Web und auf Dateien kann eine KRC-Rotation für dich erstellen: die Logs der besten Spieler deiner Spezialisierung, Guides und die Aktionsliste von SimulationCraft auswerten, sie mit deinen Talenten und Logs vergleichen und dir ein fertiges JSON liefern. Hier erfährst du, was du ihm geben solltest, findest einen fertigen Prompt und liest, wie du das Ergebnis prüfst.

### Was du brauchst

**Einen Agenten**, der Websites öffnen (Warcraft Logs, Raider.IO, Wowhead, GitHub) und Dateien lesen kann. Hat er keinen Webzugriff, gib ihm die Dokumentation und Auszüge aus den Logs als Dateien.

**Dokumentation für den Agenten** (die Links stehen bereits im Prompt):

| Link | Inhalt |
|---|---|
| [llms.txt](https://keyrota.app/documentation/llms.txt) | Der Dokumentationsindex für KI-Agenten: alle Sprachen, Dateien und Beispiele |
| [krc-guide.de.md](https://keyrota.app/documentation/krc-guide.de.md) | Die gesamte Dokumentation als eine Markdown-Datei in dieser Sprache; auf Englisch: [krc-guide.en.md](https://keyrota.app/documentation/krc-guide.en.md) |
| [keyrota-rotation.schema.json](https://keyrota.app/documentation/keyrota-rotation.schema.json) | JSON Schema zum Prüfen der Antwort |
| [Meucheln, Schlachtzug](https://keyrota.app/documentation/examples/assassination-raid.de.json), [Gesetzlosigkeit, Schlachtzug und Mythisch+](https://keyrota.app/documentation/examples/outlaw-raid.de.json) | Echte Schlachtzugsrotationen als Vorlage |

**Deine Daten** (die Platzhalter im Prompt):

| Platzhalter | Was einsetzen | Beispiel |
|---|---|---|
| `{CLASS}` | Klasse | Schurke |
| `{SPEC}` | Spezialisierung | Meucheln |
| `{HERO_TALENTS}` | Heldentalente | Fatebound |
| `{TALENT_STRING}` | Der Exportstring der Talente aus dem Spiel (Talentfenster, „Teilen“) | `CMQAAAAA…` |
| `{CONTENT}` | Schlachtzug oder Mythisch+ | Schlachtzug |
| `{RAID_OR_DUNGEONS}` | Der Schlachtzug oder eine Liste von Dungeons | The Venomous Abyss |
| `{DIFFICULTY}` | Schwierigkeitsgrad oder Schlüsselstufe | heroisch |
| `{BOSSES}` | Bosse, für die die Rotation gedacht ist | alle |
| `{ITEM_LEVEL}` | Gegenstandsstufe | 328 |
| `{MY_LOGS}` | Ein Link zu deinem Charakter oder Bericht auf Warcraft Logs | `https://www.warcraftlogs.com/character/eu/<realm>/<name>` |
| `{COMBAT_LOG_FILE}` | Die Kampflog-Datei, die du anhängst | `WoWCombatLog-101726_214449.txt` |
| `{PREFERENCES}` | Deine Wünsche | „Abklingzeiten nur über die Burst-Taste, keine Verteidigung“ |

### Der Prompt

Der Agent sammelt die Daten selbst, vergleicht sie mit deinen und erklärt jede Regel. Fülle die geschweiften Klammern aus und hänge ein Kampflog an, falls du eines hast.

*Prompt:*

```text
Du bist ein Experte für World of Warcraft und Autor von Rotationen für KeyRota. Erstelle mir eine erweiterte Rotation für KeyRota: JSON im Format keyrota-rotation, Version 1.

MEIN CHARAKTER
- Klasse und Spezialisierung: {CLASS}, {SPEC}. Heldentalente: {HERO_TALENTS}.
- Talentstring aus dem Spiel: {TALENT_STRING}
- Inhalt: {CONTENT}: {RAID_OR_DUNGEONS}. Schwierigkeitsgrad oder Schlüsselstufen: {DIFFICULTY}. Bosse: {BOSSES}.
- Gegenstandsstufe: {ITEM_LEVEL}.
- Meine Warcraft Logs: {MY_LOGS}
- Kampflog (angehängt): {COMBAT_LOG_FILE}
- Wünsche: {PREFERENCES}

SCHRITT 1. LERNE DAS FORMAT VON KEYROTA
- https://keyrota.app/documentation/llms.txt und https://keyrota.app/documentation/krc-guide.en.md: Slots (bis zu 12), Auren (bis zu 12, nur meine Buffs und meine Debuffs auf dem Ziel), Ressourcen in Prozent, alle Bedingungen, Slot-Flags, die Schalter aoe, st, cd, defensives, ground_spells, movement, Regeln von oben nach unten, ODER-Gruppen aus UND-Bedingungen, Grenzen von 16 Gruppen mit je 16 Bedingungen, ein unbekannter Wert macht eine Bedingung falsch.
- JSON Schema: https://keyrota.app/documentation/keyrota-rotation.schema.json
- Vorlagen: https://keyrota.app/documentation/examples/assassination-raid.en.json und https://keyrota.app/documentation/examples/outlaw-raid.en.json

SCHRITT 2. SAMMLE DIE DATEN
1. Warcraft Logs: Schadensranglisten für {SPEC} {CLASS} für jeden Boss ({CONTENT}, {DIFFICULTY}); bei Mythisch+ für jeden Dungeon und jede Schlüsselstufe. Nimm die 5–10 besten Logs mit den Heldentalenten {HERO_TALENTS}.
2. Vergleiche ihre Talente mit meinem String. Nenne die Unterschiede, die die Priorität ändern, und sag mir, ob ich sie übernehmen sollte.
3. Sammle aus den Top-Logs: den Opener und die Reihenfolge der Zauber; die Uptime der wichtigen Buffs und Debuffs; die Ressourcen beim Wirken (Combopunkte oder Entsprechendes bei Finishern, Energie oder Entsprechendes vor dem Verbrauchen, durch Überlaufen verlorene Ressourcen); wann und zusammen mit was große Abklingzeiten eingesetzt werden und wie sie auf die Phasen abgestimmt sind; wann und bei welcher Gesundheit Verteidigungsfähigkeiten eingesetzt werden; ab wie vielen Zielen auf AoE gewechselt wird; Zauber pro Minute und Zeit ohne Zauber.
4. Bei Mythisch+: Raider.IO (die Meta, die besten Durchläufe, Talente pro Dungeon).
5. Guides (Wowhead, Method, der Discord der Klasse) und die Aktionsliste (APL) von SimulationCraft für {SPEC} im Branch der aktuellen Erweiterung: Nimm sie als Grundlage für die Priorität und prüfe sie anhand der Logs.
6. Meine Logs und mein Kampflog: Wo weichen meine Uptimes, Ressourcen bei Verbrauchern, Abklingzeiten und mein Tempo von den Top-Spielern ab?

SCHRITT 3. SCHREIBE DIE ROTATION
- "format": "keyrota-rotation", "version": 1, die specID meiner Spezialisierung, resources nach der Spezialisierungstabelle in der Dokumentation (resource1 PlayerHP, resource2 TargetHP, dann die Ressourcen der Spezialisierung), "ignoreMainIcon": true.
- Slots: echte Zauber-IDs von Wowhead (das Feld spell). "show": "combat" für Heilung und Verteidigung. Flags: offGcd für Zauber außerhalb des GCD; offGcd und queue für Makros, deren zweite Zeile auf dem GCD liegt, und für Tasten, die das Ergebnis des vorherigen Schlags brauchen; channel für Kanalisierungen; manual für das, was ich selbst drücke. Schreibe für einen Makro-Slot den Makrotext (#showtooltip und /cast).
- Auren: die IDs der Buffs und Debuffs selbst, nicht der Zauber, die sie auslösen. Nur meine Auren.
- Regeln in der Reihenfolge der Priorität. Verteidigung zuerst und nur mit defensives == 1. Große Abklingzeiten nur mit cd == 1 (die Burst-Taste, nicht die Abklingzeit eines Zaubers); was das Fenster der Abklingzeit verstärkt, nur darunter. Einzelziel und AoE: eine Gruppe aoe == 1 und eine Gruppe st == 0 and enemies >= N für AoE; eine Gruppe st == 1 und eine Gruppe aoe == 0 and enemies <= 1 für das Einzelziel. DoTs: eine Gruppe X.down und eine Gruppe X.up and X.duration <= 30. Ressourcen in Prozent, Schwellen in der Mitte zwischen zwei Stufen (Combopunkte von 7: „mindestens 5“ ist Combo_Points >= 70, „höchstens 3“ ist Combo_Points < 50). Wenn die nächste Taste eine Kanalisierung abbricht, ergänze X.duration <= 8 für die Aura der Kanalisierung in jeder Gruppe jeder Regel.
- KRC kennt kein not, kein != und keine Klammern: Verwende die Paare up/down, ready/oncd, glow/noglow, umgekehrte Operatoren und mehrere Gruppen.
- Schreibe die Labels (label), Regelnamen und Kommentare auf Deutsch und die Namen in den Bedingungen (alias) in lateinischen Buchstaben ohne Umlaute.
- Gib jeder Regel einen Namen (name) und jeder Gruppe einen kurzen Kommentar (comment): was und warum.
- Prüfe am Ende: Das JSON besteht die Schemaprüfung; jeder Name in den Bedingungen ist deklariert; höchstens 16 Bedingungen pro Gruppe und 16 Gruppen pro Regel; die IDs existieren auf Wowhead für den aktuellen Patch.

ANTWORT
1. Das gesamte Rotations-JSON in einem Block.
2. Makrotexte für die Makro-Slots.
3. Eine Tabelle: Regel, was sie tut, woher sie stammt (welches Log, welcher Guide oder welche APL-Zeile).
4. Was im Spiel einzuschalten ist: Schaltflächen der Schnelleinstellungen, der Radius des Gegnerzählers, was auf die Aktionsleisten gehört.
5. Ein Testplan: eine Trainingsattrappe, danach ein Kampflog im Vergleich mit den Top-Logs; welche Zahlen zu vergleichen sind.
```


### Ein ausgefüllter Prompt

Derselbe Prompt vollständig, ausgefüllt für Meucheln in einem heroischen Schlachtzug:

*Prompt: Meucheln, heroischer Schlachtzug:*

```text
Du bist ein Experte für World of Warcraft und Autor von Rotationen für KeyRota. Erstelle mir eine erweiterte Rotation für KeyRota: JSON im Format keyrota-rotation, Version 1.

MEIN CHARAKTER
- Klasse und Spezialisierung: Schurke, Meucheln. Heldentalente: Fatebound.
- Talentstring aus dem Spiel: CMQAAAAAAAAAAAAAAAAAAAAAAYmlZmFDGAAAAAYWGsNDAAAAAILzMzMzMjxyMzMbzsMzMPgZMzYMMzYMAGYBmxoxsBYbAbGAMzMGD
- Inhalt: Schlachtzug: The Venomous Abyss. Schwierigkeitsgrad: heroisch. Bosse: alle; achte besonders auf Ula'tek (Schadensfenster auf dem Herzen).
- Gegenstandsstufe: 328.
- Meine Warcraft Logs: https://www.warcraftlogs.com/character/eu/<realm>/<name>
- Kampflog (angehängt): WoWCombatLog-101726_214449.txt, 5 Minuten an einer Trainingsattrappe, Einzelziel.
- Wünsche: Todesmal und Königsmord nur über die Burst-Taste; Verschwinden nur unter Todesmal; Blutrote Phiole bei 40 % Gesundheit oder weniger; Energiesparen wie in SimulationCraft.

SCHRITT 1. LERNE DAS FORMAT VON KEYROTA
- https://keyrota.app/documentation/llms.txt und https://keyrota.app/documentation/krc-guide.en.md: Slots (bis zu 12), Auren (bis zu 12, nur meine Buffs und meine Debuffs auf dem Ziel), Ressourcen in Prozent, alle Bedingungen, Slot-Flags, die Schalter aoe, st, cd, defensives, ground_spells, movement, Regeln von oben nach unten, ODER-Gruppen aus UND-Bedingungen, Grenzen von 16 Gruppen mit je 16 Bedingungen, ein unbekannter Wert macht eine Bedingung falsch.
- JSON Schema: https://keyrota.app/documentation/keyrota-rotation.schema.json
- Vorlagen: https://keyrota.app/documentation/examples/assassination-raid.en.json und https://keyrota.app/documentation/examples/outlaw-raid.en.json

SCHRITT 2. SAMMLE DIE DATEN
1. Warcraft Logs: Schadensranglisten für Schurken mit Meucheln für jeden Boss (Schlachtzug The Venomous Abyss, Schwierigkeitsgrad heroisch). Nimm die 5–10 besten Logs mit den Heldentalenten Fatebound.
2. Vergleiche ihre Talente mit meinem String. Nenne die Unterschiede, die die Priorität ändern, und sag mir, ob ich sie übernehmen sollte.
3. Sammle aus den Top-Logs: den Opener und die Reihenfolge der Zauber; die Uptime von Erdrosseln, Blutung und dem Buff von Vergiften; die Combopunkte bei Vergiften, Blutung, Königsmord und Verschwinden, die Energie vor Vergiften, durch Überlaufen verlorene Energie und Combopunkte; wann und zusammen mit was Todesmal und Königsmord eingesetzt werden und wie sie auf die Phasen abgestimmt sind (besonders auf das Herz bei Ula'tek); wann und bei welcher Gesundheit Blutrote Phiole und andere Verteidigungsfähigkeiten eingesetzt werden; ab wie vielen Zielen auf Dolchfächer und Blutroter Sturm gewechselt wird; Zauber pro Minute und Zeit ohne Zauber.
4. Guides (Wowhead, Method, der Discord der Schurken) und die Aktionsliste (APL) von SimulationCraft für Meucheln im Branch der aktuellen Erweiterung: Nimm sie als Grundlage für die Priorität und prüfe sie anhand der Logs.
5. Meine Logs und mein Kampflog: Wo weichen meine Uptimes, Combopunkte bei Verbrauchern, Abklingzeiten und mein Tempo von den Top-Spielern ab?

SCHRITT 3. SCHREIBE DIE ROTATION
- "format": "keyrota-rotation", "version": 1, "specID": 259, "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"], "ignoreMainIcon": true.
- Slots: echte Zauber-IDs von Wowhead (das Feld spell). "show": "combat" für Blutrote Phiole. Flags: offGcd für Zauber außerhalb des GCD; offGcd und queue für Verschwinden (es braucht die Combopunkte des vorherigen Schlags); channel für Kanalisierungen, falls es welche gibt; manual für das, was ich selbst drücke. Schreibe für einen Makro-Slot den Makrotext (#showtooltip und /cast).
- Auren: die IDs der Buffs und Debuffs selbst, nicht der Zauber, die sie auslösen (zum Beispiel ist der Buff von Verschwinden nicht dasselbe wie der Zauber). Nur meine Auren.
- Regeln in der Reihenfolge der Priorität. Blutrote Phiole zuerst und nur mit defensives == 1 und Gesundheit bei 40 % oder weniger. Todesmal und Königsmord nur mit cd == 1 (die Burst-Taste, nicht die Abklingzeit eines Zaubers); Verschwinden nur, solange Todesmal auf dem Ziel ist. Einzelziel und AoE: eine Gruppe aoe == 1 und eine Gruppe st == 0 and enemies >= 2 für Dolchfächer; eine Gruppe st == 1 und eine Gruppe aoe == 0 and enemies <= 1 für Verstümmeln. Erdrosseln und Blutung: eine Gruppe X.down und eine Gruppe X.up and X.duration <= 30. Combopunkte von 7 in Prozent, Schwellen in der Mitte zwischen zwei Stufen: „mindestens 5“ ist Combo_Points >= 70, „höchstens 3“ ist Combo_Points < 50. Energiesparen: Vergiften bei 5+ Combopunkten, wenn der Buff ausläuft, unter Todesmal oder bei Energy >= 70.
- KRC kennt kein not, kein != und keine Klammern: Verwende die Paare up/down, ready/oncd, glow/noglow, umgekehrte Operatoren und mehrere Gruppen.
- Schreibe die Labels (label), Regelnamen und Kommentare auf Deutsch und die Namen in den Bedingungen (alias) in lateinischen Buchstaben ohne Umlaute.
- Gib jeder Regel einen Namen (name) und jeder Gruppe einen kurzen Kommentar (comment): was und warum.
- Prüfe am Ende: Das JSON besteht die Schemaprüfung; jeder Name in den Bedingungen ist deklariert; höchstens 16 Bedingungen pro Gruppe und 16 Gruppen pro Regel; die IDs existieren auf Wowhead für den aktuellen Patch.

ANTWORT
1. Das gesamte Rotations-JSON in einem Block.
2. Makrotexte für die Makro-Slots.
3. Eine Tabelle: Regel, was sie tut, woher sie stammt (welches Log, welcher Guide oder welche APL-Zeile).
4. Was im Spiel einzuschalten ist: Schaltflächen der Schnelleinstellungen, der Radius des Gegnerzählers, was auf die Aktionsleisten gehört.
5. Ein Testplan: eine Trainingsattrappe, danach ein Kampflog im Vergleich mit den Top-Logs; welche Zahlen zu vergleichen sind.
```


### So wertest du Logs aus

Hinweise für den Agenten und für dich: woher die Daten kommen und was zu vergleichen ist.

**Warcraft Logs**
- Ranglisten: `https://www.warcraftlogs.com/zone/rankings/<zone id>?boss=<boss id>&class=<Class>&spec=<Spec>&difficulty=<3|4|5>&metric=dps` (3 normal, 4 heroisch, 5 mythisch). Bei Mythisch+ sind die Ranglisten nach Schlüsselstufe aufgeteilt.
- Im Bericht eines Spielers: die Registerkarten Casts (Reihenfolge und Zeitpunkte der Zauber), Buffs und Debuffs (Uptime), Resources (Ressourcen und Überlaufen), Damage Done (nach Fähigkeit und Ziel), Deaths.
- Talente aus einem Log: Die Zusammenfassung des Spielers enthält den Exportstring der Talente; öffne ihn im Talentrechner von Wowhead.
- Vergleiche das Verhalten, nicht den DPS: Uptime von DoTs und Buffs, Ressourcen bei Verbrauchern, Zauber pro Minute, Zeit ohne Zauber, Zeitpunkte großer Abklingzeiten im Verhältnis zu den Phasen des Kampfes.

**Raider.IO** (Mythisch+)
- Die besten Durchläufe eines Dungeons: `https://raider.io/api/v1/mythic-plus/runs?season=<season>&region=world&dungeon=<slug>&page=0`; Saisons und Dungeons: `https://raider.io/api/v1/mythic-plus/static-data?expansion_id=<id>`.
- Die Meta ändert sich von Woche zu Woche: Nimm frische Daten, keine alten Schlussfolgerungen.

**SimulationCraft**
- Die Aktionsliste (APL) einer Spezialisierung liegt im Repository `simulationcraft/simc` auf GitHub, im Branch der aktuellen Erweiterung, im Ordner `ActionPriorityLists`.
- So überträgst du eine APL in KRC:

| APL von SimulationCraft | KRC |
|---|---|
| `actions`-Zeilen von oben nach unten | Regeln von oben nach unten |
| `buff.X.up` | `X.up` |
| `dot.X.remains`, `buff.X.remains` | `X.duration` in Prozent |
| `cooldown.X.remains` | `X.cd` in Prozent |
| `combo_points`, `energy` | Ressourcen in Prozent |
| `active_enemies` | `enemies` |
| `target.time_to_die`, exakte Sekunden | gibt es nicht; der nächstbeste Ersatz, zum Beispiel ist „das Ziel lebt noch 12 Sekunden“ `TargetHP >= 50` bei 3+ Zielen |

**Das Kampflog**
- Mit erweiterter Kampfprotokollierung enthält jedes `SPELL_CAST_SUCCESS` die Ressourcen des Zaubernden (Typ, aktueller Wert, Maximum); Energie ist Typ 3.
- `SPELL_AURA_APPLIED`, `SPELL_AURA_REFRESH`, `SPELL_AURA_REMOVED`: Uptime und Erneuerungen von Auren; `SPELL_ENERGIZE`: Ressourcengewinne; `SPELL_CAST_FAILED`: Tastendrücke, die das Spiel abgelehnt hat.
- Zähle: Zauber pro Minute, Lücken zwischen GCDs, Uptime der DoTs, Combopunkte bei Finishern, überlaufende Energie, Zeitpunkte großer Abklingzeiten.

### Ein Kampflog aufzeichnen

1. Schalte in den Spieleinstellungen im Bereich „Netzwerk“ die erweiterte Kampfprotokollierung (Advanced Combat Logging) ein. Ohne sie enthält das Log keine Ressourcen und keine Positionen.
2. Gib vor dem Pull `/combatlog` in den Chat ein: Die Aufzeichnung beginnt. Gib nach dem Kampf erneut `/combatlog` ein: Die Aufzeichnung endet.
3. Die Datei liegt im Spielordner: `World of Warcraft\_retail_\Logs\WoWCombatLog-MMTTJJ_HHMMSS.txt`. Das Spiel schreibt sie verzögert: Warte nach dem Beenden der Aufzeichnung eine Minute.
4. Der Uploader von Warcraft Logs kann die Datei nach dem Hochladen leeren: Kopiere sie vorher.

Die ersten Tests machst du an einer Trainingsattrappe: 2–3 Minuten auf ein einzelnes Ziel, danach auf eine Gruppe von Attrappen für AoE.

### Testen und Verbessern

1. Lade die Rotation (siehe unten), erstelle das Profil für Better Assistant und füge es ein, lege die Zauber der Slots mit Tasten auf deine Aktionsleisten.
2. Teste an einer Trainingsattrappe. Das „Protokoll“ im Hauptfenster zeigt, was gedrückt wird. Die Protokolldatei von KeyRota (die Ordner-Schaltfläche neben „Protokoll“) hält für jeden GCD die gewählte Regel fest und warum die Regeln darüber übersprungen wurden: Bedingungen, nicht bereit, unbekannt, manuell.
3. Gib dem Agenten das Rotations-JSON, ein frisches Kampflog und bei Bedarf das KeyRota-Protokoll. Bitte ihn um einen Vergleich mit den Top-Logs: Uptime, Ressourcen bei Verbrauchern, Abklingzeiten, Leerlauf.
4. Ändere jeweils nur eine Regel und halte die Version im Namen der Rotation fest („v1.3“). Bewahre die alten Fassungen auf: „Export“ im Hauptfenster oder „Text und JSON“ — „Speichern…“.
5. Vergleiche nach dem Schlachtzug oder dem Schlüssel erneut mit Warcraft Logs.

### Das Ergebnis laden

- **Als Datei:** Speichere das JSON aus der Antwort als `.json`-Datei, dann „Rotation“ — „Neu“ — „Aus Datei…“.
- **Aus der Zwischenablage:** Kopiere das JSON, dann „Neu“ — „Aus Zwischenablage“.
- **In eine geöffnete Rotation:** Editor — „Text und JSON“ — „JSON“ — „Einfügen“. Slots mit denselben Nummern behalten ihre IDs, Flags und Sichtbarkeit, sofern das neue JSON keine eigenen hat.

Die Statusleiste des Editors sollte „Die Rotation ist gültig“ melden. Gibt es einen Fehler, nennt er die Stelle: Gib ihn wörtlich an den Agenten weiter. Danach „Allgemein“ — „Aus Slots und Auren erstellen“ — „Kopieren“, im Spiel `/ba` — Profile — einfügen — Apply. Lege die Makros aus der Antwort im Spiel an und ziehe sie auf deine Aktionsleisten.

---

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

## FAQ und Problembehandlung

### Eine Regel greift nie

Prüfe in dieser Reihenfolge:

1. **Eine Regel weiter oben gewinnt immer.** Die Regeln werden von oben nach unten geprüft: Ist eine höhere Regel erfüllt und ihr Zauber einsetzbar, kommt deine nie an die Reihe. Verschiebe deine Regel nach oben oder grenze die Bedingungen der höheren ein.
2. **Ein unbekannter Wert.** Eine Bedingung mit einem unbekannten Wert ist falsch, sogar `.down`. Eine Aura ist unbekannt, wenn sie nicht im Profil für Better Assistant steht oder eine falsche ID hat. Erstelle das Profil neu („Aus Slots und Auren erstellen“) und füge es im Spiel ein.
3. **Die ID der Aura, nicht die des Zaubers.** Ein Buff kann eine andere ID haben als der Zauber, der ihn auslöst: Verschwinden hat `1856`, sein Buff `11327`. Außerdem sehen die Regeln nur deine Auren, keine Buffs von anderen Spielern.
4. **Der Slot ist nicht bereit.** Zu wenig Ressource, das Ziel zu weit entfernt, eine Abklingzeit, das Talent nicht gewählt. Eine solche Regel wird ohne Fehler übersprungen.
5. **Better Assistant zeigt den Slot nicht an.** Ein Slot mit „Mit Ziel“ ist ohne Ziel nicht bereit. Verwende für Heilung und Verteidigung „Im Kampf“.
6. **Keine Taste.** Der Zauber des Slots muss auf einer Aktionsleiste liegen und mit einer Taste belegt sein (oder ein Makro mit `#showtooltip`).
7. **Ein Schalter ist aus.** „Heilung/Schutz“ ist standardmäßig ausgeschaltet, Burst wurde vielleicht mit der Burst-Taste ausgeschaltet (F3 unter Windows, ⌃⇧B unter macOS), der Zielmodus steht womöglich noch auf „Einzeln“ oder „Mehrere“.
8. **Prozentwerte.** 5 Combopunkte sind `70`, nicht `5`. Siehe [Ressourcen](https://keyrota.app/documentation/de/conditions#resources).
9. **Stapel.** Ein einzelner Stapel wird als 0 gelesen: `X.stacks >= 1` kann einen Stapel nicht von einer fehlenden Aura unterscheiden; verwende `.up`.
10. **Eine Aura ohne Dauer.** Verstohlenheit und Ähnliches haben immer 1 übrig: `.duration` funktioniert bei ihnen nicht.

Die Protokolldatei von KeyRota zeigt, welche Regel gewählt wurde und warum die darüber übersprungen wurden: die Ordner-Schaltfläche neben „Protokoll“ im Hauptfenster.

### Es wird zu früh oder zu spät gedrückt

| Was du siehst | Ursache | Was tun |
|---|---|---|
| Ein Zauber außerhalb des GCD wartet auf das Ende des GCD | Kein Flag O | Schalte „Außerhalb des GCD (O)“ ein. |
| Eine Taste außerhalb des GCD wird gedrückt, bevor das Ergebnis des vorherigen Schlags da ist | Flag O drückt sofort, mitten im GCD | Ergänze „Im Warteschlangenfenster (Q)“: O + Q. |
| Ein Makro, dessen zweite Zeile auf dem GCD liegt, wird nicht vollständig ausgeführt | Das Makro wurde mitten im GCD gedrückt | O + Q: Das Makro wird am Ende des GCD gedrückt. |
| Eine tiefere Regel außerhalb des GCD überholt eine höhere nicht | So gewollt: strikte Priorität | Verschiebe die Regel nach oben. |
| Nach dem Verbrauchen „steht“ die Rotation | Ressourcen sparen: Keine Regel ist erfüllt | Das ist normal; um früher zu verbrauchen, senke die Energieschwelle. |
| Die Rotation drückt nichts, während du eigene Tasten drückst | KeyRota hält sich bei deinen Fähigkeitstasten zurück | Das ist normal. |

### Eine Kanalisierung wird abgebrochen

- Schalte für den Slot „Kanalisieren (C)“ ein: Während der Kanalisierung drückt KeyRota nichts und drückt den Slot zu Beginn nicht doppelt.
- Manche Kanalisierungen beendet das Spiel kurz vor dem letzten Treffer, und ein Tastendruck direkt nach dem Ende der Kanalisierung bricht sie ab. Füge die Aura der Kanalisierung zu den Auren der Rotation hinzu und die Bedingung `Channel_aura.duration <= 8` zu **jeder Gruppe jeder Regel**. Beispiel: [Schutz von Kanalisierungen](https://keyrota.app/documentation/de/patterns#channel).

### Es wird nicht auf AoE gewechselt

1. Steht der Zielmodus auf „Auto“ (F2 unter Windows, ⌃⇧T unter macOS, reihum „Auto“, „Einzeln“, „Mehrere“)? Im Modus „Einzeln“ schweigen die Regeln mit `st == 0`.
2. Sind im Spiel die Namensplaketten von Gegnern eingeschaltet (V) und unbedeutende Gegner nicht ausgeblendet?
3. Ist der Radius des Zählers auf der Seite „Allgemein“ mindestens so groß wie der Radius deiner AoE-Fähigkeit?
4. „Nur Gegner im Kampf“: Gegner, die noch nicht im Kampf sind, werden nicht gezählt. Kommen Gruppen einzeln heran, kann die Zahl niedriger ausfallen.
5. Die Schwelle der Regel: `enemies >= 2` oder `>= 3`?
6. Erstelle nach einer Änderung des Radius das Profil für Better Assistant neu und füge es erneut ein.

### Burst greift nicht oder zur falschen Zeit

- `cd == 1` ist **die Burst-Taste** (F3 unter Windows, ⌃⇧B unter macOS, die Schaltfläche „Burst“ in den Schnelleinstellungen), nicht die Abklingzeit eines Zaubers. Die Abklingzeit eines Zaubers ist `Slot.cd`.
- Burst ist standardmäßig eingeschaltet. Schalte es vor einem Moment aus, in dem die Abklingzeit nicht verbraucht werden darf (Immunität, Phasenwechsel), und wieder ein, wenn es so weit ist.
- Hängt eine große Abklingzeit von Auren ab (DoTs auf dem Ziel), wartet sie auf diese. Prüfe im KeyRota-Protokoll, welche Bedingung der Regel nicht erfüllt ist.
- Für alles, was nur unter der Abklingzeit eingesetzt werden soll, prüfe die Aura der Abklingzeit (`Deathmark_DoT.up`), nicht die Burst-Taste.

### Wie Prozentwerte berechnet werden

- **Ressourcen und Gesundheit:** `Wert / Maximum × 100`. 175 von 250 Energie sind `70`.
- **Combopunkte von 7:** Setze die Schwelle in die Mitte zwischen zwei Stufen: „mindestens 5“ ist `>= 70`, „höchstens 3“ ist `< 50`. [Die Tabelle](https://keyrota.app/documentation/de/conditions#resources).
- **Restdauer einer Aura:** ein Prozentwert der Dauer dieser Anwendung. 30 % sind das Pandemie-Fenster.
- **Abklingzeit:** ein Prozentwert der vollen Abklingzeit ohne GCD. Bei einer Abklingzeit von 2 Minuten ist 1 % gleich 1,2 s.

### „Eine Rotation mit Fehler lässt sich nicht speichern“

Der Editor speichert keine Rotation mit Fehler: KeyRota führt eine Rotation nie nur teilweise aus. Die Statusleiste nennt die Stelle, zum Beispiel „Regel 9, Gruppe 1: die Gruppe hat keine Bedingungen“. Klicke auf „Anzeigen“, um die Regel zu öffnen. Häufige Ursachen:

| Meldung | Was tun |
|---|---|
| die Gruppe hat keine Bedingungen | Füge eine Bedingung hinzu oder lösche die leere Gruppe. |
| kein Slot gewählt | Wähle unter „Drücken“ einen Slot. |
| Flag Q nur zusammen mit O | Schalte „Außerhalb des GCD (O)“ ein oder Q aus. |
| unbekannter Name … | Ein Name in einer Bedingung passt zu keiner Aura, keinem Slot und keiner Ressource: Prüfe „Name im Text“. |
| … ist vom Typ slot, nötig ist buff | Eine Aura-Eigenschaft (`.up`, `.duration`) an einem Slot oder eine Slot-Eigenschaft (`.ready`, `.cd`) an einer Aura. |
| keine Anführungszeichen im Namen erlaubt | Entferne `"` aus dem Namen der Rotation, des Slots oder der Aura. |

Alle Meldungen findest du unter [Fehler](https://keyrota.app/documentation/de/rotation-json#errors).

### Worin sich `.oncd` von `.cd > 0` unterscheidet

`X.oncd`: Der Slot ist aus **irgendeinem** Grund nicht bereit: Abklingzeit, keine Ressource, das Ziel zu weit entfernt, der Slot nicht angezeigt. `X.cd > 0`: Eine Abklingzeit läuft. Bei einem Zauber mit Aufladungen ist `.cd > 0` möglich, während der Slot bereit ist: Eine Aufladung ist verfügbar, die nächste lädt gerade auf.

### Wie man „nicht“ und Klammern schreibt

KRC kennt kein `not`, kein `!=` und keine Klammern. „Nicht“ ist die Gegenbedingung (`up`/`down`, `ready`/`oncd`, `glow`/`noglow`) oder der umgekehrte Operator (statt „nicht `>= 70`“ schreibst du `< 70`). „(A oder B) und C“ sind zwei Gruppen: `A and C`, `B and C`. Mehr dazu: [„Nicht“, Klammern und ODER](https://keyrota.app/documentation/de/conditions#logic).

### Mehr als 12 Slots oder Auren?

Nein: Eine Rotation hat bis zu 12 Slots und bis zu 12 Auren, genau wie das Profil für Better Assistant. Makros helfen, Platz zu sparen (eine Taste, mehrere Zauber), und ein Slot kann in mehreren Regeln vorkommen. Die Anzahl der Regeln ist unbegrenzt.

### Eine Rotation mit einem Talent, das du nicht hast

Ist ein Talent nicht gewählt, ist der Zauber nicht erlernt, der Slot nicht bereit, und seine Regeln werden einfach übersprungen. Eine Rotation kann mit verschiedenen Talentverteilungen funktionieren: Die Regeln für fehlende Zauber schweigen.

### Eine Rotation übertragen oder teilen

- „Export“ im Hauptfenster speichert das Profil mit seiner Rotation; „Import“ lädt es auf einem anderen Computer.
- Im Editor speichert „Text und JSON“ — „Speichern…“ die Rotation als `.json` oder `.txt`; zum Öffnen „Neu“ — „Aus Datei…“.
- Das Profil für Better Assistant wird aus den Slots und Auren der Rotation neu erstellt: Du musst es nicht separat weitergeben.

### Warum KeyRota manchmal nichts drückt

Ist „Hauptsymbol ignorieren“ eingeschaltet und passt keine Regel, wartet KeyRota. Bei Rotationen, die Energie sparen, ist das normal: Bei 5+ Combopunkten wartet der Verbraucher auf seine Bedingung, und der Aufbauer schweigt. Wirkt das Warten falsch, prüfe im KeyRota-Protokoll, welche Regeln warum übersprungen wurden.
