Conditions
Updated October 18, 2026
A condition is one check: "Garrote is on the target", "energy is at least 70%", "Burst is on". Conditions make up groups (AND), groups make up a rule (OR). In the builder you pick a condition from lists; in KRC text and JSON it is written as a string, which is what the examples show.
Syntax#
| Kind | Form | Example |
|---|---|---|
| Aura: present / absent | Aura.up, Aura.down | Garrote_DoT.down |
| Aura: time left, stacks | Aura.duration op N, Aura.stacks op N | Rupture_DoT.duration <= 30 |
| Slot: ready / not ready | Slot.ready, Slot.oncd | Kingsbane.ready |
| Slot: cooldown, charges | Slot.cd op N, Slot.charges op N | Deathmark.cd <= 3 |
| Slot: glow | Slot.glow, Slot.noglow | Ambush.glow |
| Resource | Resource op N | Combo_Points >= 70 |
| Enemies nearby | enemies op N | enemies >= 3 |
| Distance to target | target.distance op N | target.distance <= 8 |
| Toggle | aoe, st, cd, defensives, ground_spells, movement == 0 or == 1 | cd == 1 |
Operators: <, <=, ==, = (the same as ==), >=, >. There is no "not equal".
The number N is an integer from 0 to 100. No negative or fractional numbers and nothing above 100: value 120 outside 0..100.
Spaces around the operator are optional: Energy>=70 and Energy >= 70 are the same. No spaces inside a name or between a name and its property: Garrote_DoT.up, not Garrote_DoT .up.
References are by name (Garrote_DoT) or by number: buff1, slot3, resource4. Keywords are lowercase.
Auras#
An aura is your buff or your debuff on the target, declared in the aura list with its ID. Other players' buffs and debuffs aren't visible.
.up and .down#
Envenom_Buff.up: the aura is present. Envenom_Buff.down: it is absent. If the aura is unknown (not read), both are false.
use Garrote when # Garrote: apply it when it's missing
Garrote_DoT.down
.duration: time left in percent#
Rupture_DoT.duration <= 30: no more than 30% of the aura's full duration is left. The full duration is the one this application got: Rupture at 5 combo points lasts 24 s, at 7 it lasts 32 s, so 30% is 7.2 s and 9.6 s.
Important
An absent aura has 0 left. So Rupture_DoT.duration <= 30 also holds when there is no Rupture at all. To refresh only an aura that is up, write Rupture_DoT.up and Rupture_DoT.duration <= 30, and cover "the aura is missing" with a separate group with Rupture_DoT.down.
The pandemic window in WoW is 30% of the duration: refreshing within it loses nothing. Hence the usual threshold <= 30.
use Rupture when # Rupture
Combo_Points >= 70 and Rupture_DoT.down # no DoT
or
Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30 # pandemic
{
"use": "Rupture",
"name": "Rupture",
"when": [
{"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "no DoT"},
{"all": ["Combo_Points >= 70", "Rupture_DoT.up", "Rupture_DoT.duration <= 30"], "comment": "pandemic"}
]
}
Seconds to percent: percent = seconds / full duration × 100. Garrote lasts 18 s: "14 s left" is <= 78, "5.4 s left" is <= 30.
An aura without a duration (Stealth and the like) always reads 1 left. Use only .up and .down for such auras.
.stacks: number of stacks#
Opportunity.stacks >= 6: the aura has 6 stacks or more. An absent aura has 0 stacks.
Note
The stack count starts at two: an aura with a single stack reads as 0, like an aura without a counter. To check that an aura is present use .up; use .stacks for thresholds of 2 and above.
use Pistol_Shot when # Pistol Shot at 6 stacks of Opportunity
Opportunity.stacks >= 6 and Combo_Points < 80
Slots#
Slot conditions read the state of another button: "press Envenom only while Deathmark isn't ready yet" and so on. The rule's own slot is checked automatically: if its spell can't be used, KeyRota simply moves on to the next rule.
.ready and .oncd#
Kingsbane.ready: the slot's spell can be used, not counting the global cooldown. That needs all of:
- the spell is learned (the talent is taken);
- there is enough resource;
- the target is in range, if one is needed;
- the cooldown is below 0.2 s or a charge is available;
- Better Assistant shows the slot (With a target: you have a target; In combat: you are in combat).
Kingsbane.oncd: the slot is not ready for any of these reasons, not only the cooldown. If the state is unknown, both are false.
use Preparation when # Preparation when Adrenaline Rush, Between the Eyes and Killing Spree are on cooldown
Adrenaline_Rush.oncd and Between_the_Eyes.oncd and Killing_Spree.oncd
.cd: cooldown left in percent#
Deathmark.cd <= 3: no more than 3% of the full cooldown is left. 0 is ready, 100 was just used. The global cooldown is not included. For a spell with charges .cd is the recharge of the next charge, so the spell can be ready with cd > 0.
| Cooldown | 1% = | Example |
|---|---|---|
| 30 s | 0.3 s | X.cd <= 10: ≤ 3 s left |
| 1 min | 0.6 s | Kingsbane.cd <= 3: ≤ 1.8 s left |
| 2 min | 1.2 s | Deathmark.cd <= 3: ≤ 3.6 s left; Deathmark.cd >= 44: still ≥ 52 s |
| 3 min | 1.8 s | X.cd >= 50: still ≥ 90 s |
A typical use is "hold for a big cooldown": don't spend Kingsbane if Deathmark is about to come back, spend it if Deathmark is far away.
use Kingsbane when # Kingsbane
cd == 1 and Deathmark_DoT.up # under Deathmark
or
cd == 1 and Deathmark.cd >= 44 # Deathmark more than 52 s away
.charges#
Barbed_Shot.charges >= 2: the spell has 2 charges or more. Spells without charges have 0. A typical pattern keeps the charges from capping:
use Barbed_Shot when # Barbed Shot
Barbed_Shot.charges >= 2 # both charges: don't waste the recharge
or
Barbed_Shot.charges == 1 and Barbed_Shot.cd <= 20 # the second one is almost back
.glow and .noglow: the button glows#
Ambush.glow: the game highlights this spell's button (the same glow you see on your action bar on a proc). Ambush.noglow: it doesn't. Use .glow only if this spell's button really glows in the game; if you aren't sure, check the proc's buff instead: Blindside.up.
Resources#
Energy >= 70: at least 70% of maximum energy. All resources are percentages from 0 to 100: health, energy, mana, rage, runes, combo points.
| Resource | Number | Example |
|---|---|---|
| Player health | resource1 (PlayerHP) | PlayerHP <= 40: health at 40% or lower |
| Target health | resource2 (TargetHP) | TargetHP >= 50: the target isn't at half yet. Unknown without a target |
| Specialization resources | resource3 and on | Energy >= 70, Combo_Points >= 70, Rage >= 40 |
To percent: percent = value / maximum × 100. With 250 energy, 175 energy is 70%. Maximum energy and other resources change with talents, so thresholds in percent carry over between characters better than raw values.
Combo points. With a maximum of 7 combo points one point is about 14.3%. The value is rounded to a whole number, and depending on the rounding 2 points read 28 or 29, 3 read 42 or 43, 6 read 85 or 86. So put the threshold halfway between the steps: then it is right with any rounding.
| Combo points | % | "at least N" | "at most 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 | — |
For another maximum, "at least N" is (N − 0.5) / maximum × 100. With 5 combo points, "at least 4" is >= 70 and "at least 5" is >= 90.
Enemies nearby#
enemies >= 3: 3 or more enemies within the counter's radius. The radius and "Only enemies in combat" are set on the General page (enemies.range and enemies.combatOnly in JSON). If the count is unknown, the condition is false.
- For enemies to be counted, enemy nameplates must be on in the game (the V key by default), with minor enemies not hidden.
- Choose the radius by your abilities: Fan of Knives hits within 8 yards, so 8 is the honest radius for "Fan of Knives or Mutilate".
- For a single target,
enemies <= 1is safer thanenemies == 1: the rule keeps working if the enemy isn't counted.
Distance to the target#
target.distance <= 8: the target is 8 yards away or closer. Without a target the distance is unknown and the condition is false. The distance is approximate: the condition holds only when the distance surely meets the threshold; in borderline cases it is false.
use Pistol_Shot when # the target is out of melee but within 20 yards
target.distance >= 10 and target.distance <= 20
Panel toggles#
Toggles are the buttons of the quick settings panel over the game, plus hotkeys. The rotation decides what they mean.
| Condition | Panel button | Key: Windows, macOS | Usual meaning |
|---|---|---|---|
aoe == 1 | Targets: Multiple | F2, ⌃⇧T, cycling | Force multi-target mode |
st == 1 | Targets: Single | F2, ⌃⇧T, cycling | Force a single target |
aoe == 0 and st == 0 | Targets: Auto | F2, ⌃⇧T, cycling | The rules decide, usually by enemies |
cd == 1 | Burst | F3, ⌃⇧B | Big cooldowns: use now or hold |
defensives == 1 | Healing / defense | — | Healing and defensive abilities |
ground_spells == 1 | Ground | — | Ground-targeted spells |
movement == 1 | Movement | — | Actions while moving |
- Compare only with
== 0or== 1. cd == 1is the Burst button, not a spell's cooldown. A slot's cooldown isSlot.cd.aoeandstare never 1 at the same time. The target mode key cycles Auto, Single, Multiple.- By default Burst is on, the target mode is Auto and the other buttons are off. KeyRota remembers their state.
- A panel button is active only if the rotation reads that toggle; with the Blizzard profile they are all dimmed.
- Toggles are never unknown.
How conditions are evaluated#
| Condition | Value present | Aura absent | Unknown |
|---|---|---|---|
X.up | true | false | false |
X.down | false | true | false |
X.duration op N, X.stacks op N | compared | compared with 0 | false |
X.ready / X.oncd | by readiness | — | false (both) |
X.glow / X.noglow | by the glow | — | false (both) |
X.cd, X.charges, a resource, enemies, target.distance | compared | — | false |
| a toggle | compared | — | never |
A group is true when all its conditions are true. A rule holds when at least one group is true, or when it has no groups at all.
"Not", parentheses and OR inside a group#
KRC has no not, != or parentheses. Everything is expressed with groups:
- "Not" is the paired condition: not
.upis.down, not.readyis.oncd, not.glowis.noglow; for numbers, the inverse operator: not>= 70is< 70. - (A or B) and C is two groups:
A and C,B and C. - A and not (B and C) is two groups:
A and not-B,A and not-C. - The same condition in every group (like channel protection) is repeated in each group.
use Fan_of_Knives when # Fan of Knives: (Multiple mode OR Auto and 2+ enemies) AND below 5 CP
aoe == 1 and Combo_Points < 70
or
st == 0 and enemies >= 2 and Combo_Points < 70
Cheat sheet#
| Condition | Meaning |
|---|---|
X.up / X.down | aura present / absent |
X.duration <= 30 | ≤ 30% left (an absent aura has 0) |
X.up and X.duration <= 30 | up and due for a refresh |
X.stacks >= 2 | 2 stacks or more (1 stack reads as 0) |
X.ready / X.oncd | slot ready / not ready for any reason |
X.cd <= 3 | ≤ 3% of the cooldown left |
X.charges >= 2 | 2 charges or more |
X.glow / X.noglow | button glowing / not |
PlayerHP <= 40 | your health ≤ 40% |
TargetHP >= 50 | the target at ≥ 50% (false without a target) |
Combo_Points >= 70 | 5+ combo points out of 7 |
Energy >= 70 | energy ≥ 70% |
enemies >= 3 | 3+ enemies in the radius |
target.distance <= 8 | the target within 8 yards (false without a target) |
aoe == 1 / st == 1 | Multiple / Single mode |
aoe == 0 and st == 0 | Auto mode |
cd == 1 | Burst on |
defensives == 1 | Healing / defense on |
ground_spells == 1 | Ground on |
movement == 1 | Movement on |