Rotations-JSON
Aktualisiert am 18.10.2026
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.
Beispieldatei#
Die kürzeste sinnvolle Rotation: Blutung bei 5+ Combopunkten, wenn sie nicht auf dem Ziel ist, sonst Verstümmeln.
{
"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#
"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). 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.
"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:
resource1ist die Gesundheit des Spielers,resource2die Gesundheit des Ziels;- ab
resource3folgen die Ressourcen der Spezialisierung in der Reihenfolge der specID-Tabelle: Beim Schurken istresource3Energie undresource4Combopunkte.
"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 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. |
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. |
"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.
"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). |
{
"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.
- Verweise per Name (
Garrote_DoT) oder per Nummer:buff1,slot3,resource4. andinnerhalb 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, Ziffern0–9und_. Umlaute und Kyrillisch sind erlaubt; Leerzeichen, Bindestriche und Punkte nicht:Fan_of_Knives, nichtFan-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,movementsowie Namen wiebuffN,slotN,resourceN. - Schlüsselwörter werden nur kleingeschrieben:
use,or,.up.Use,ORund.UPsind 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.
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,oroder eine Bedingungszeile. Sonst ist es ein Fehlerstray_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/slotNund am Anfang von Bedingungszeilen.
Deklarationen#
Nur vor dem ersten use:
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#
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 whenbeginnt eine Regel; ein Kommentar in dieser Zeile ist der Name der Aktion.- Jede Bedingungszeile ist eine Gruppe (Bedingungen mit
andverbunden). Gruppen werden durch eine Zeile mit dem einzelnen Wortorgetrennt. - Eine Regel ohne Bedingungszeilen hat keine Bedingungen.
- Zwei Bedingungszeilen hintereinander ohne
orsind ein Fehlersplit_group;oram Anfang, am Ende oder zweimal hintereinander istempty_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
.txtmit 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.rangeundenemies.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 (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:
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.