# KeyRota：高级循环（KRC）文档

来源: https://keyrota.app/documentation/zh/advanced (更新于 2026年10月18日). JSON Schema: https://keyrota.app/documentation/keyrota-rotation.schema.json. AI 智能体索引: https://keyrota.app/documentation/llms.txt.

---

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

## 高级循环（KRC）

> [!TIP] 推荐使用 AI 智能体创建循环
> 这比手动设置循环快捷、方便得多。AI 智能体越先进，第一次生成的循环就越贴近你的要求。我们推荐使用 Anthropic 和 OpenAI 的最新模型，并将推理强度设为“Extra (xhigh)”。具体做法请参阅[使用 AI 智能体创建](https://keyrota.app/documentation/zh/ai)。

高级循环就是你自己的一组规则：规定什么时候按哪个技能。战斗中，KeyRota 会检查这些规则，并按下第一个符合条件的按钮。这类循环的格式和引擎称为 **KRC**（KeyRota Customization）。

### 基础循环还是高级循环

| | Blizzard（基础） | 高级（KRC） |
|---|---|---|
| 由谁选择按钮 | 游戏：Blizzard 的推荐 | 你的规则 |
| 设置 | 无需设置 | 槽位、光环和规则：在构建器中设置或从文件导入 |
| 专精 | 任意输出（近战、远程 DPS）和坦克专精 | 循环所针对的专精 |
| Burst 和目标模式 | 不使用 | Burst 和“目标”按钮，其含义由规则决定 |
| 适用场景 | 想在任意角色上快速开始 | 需要精确的优先级：DoT、资源积攒、在爆发窗口内使用冷却技能、自定义多目标逻辑 |

在应用的“输出循环”区块中，Blizzard 配置排在最前面，你的循环排在它下方的“自定义循环”分组中。只要循环处于停止状态，随时都可以切换。

### 循环的组成

| 部分 | 说明 | 数量 |
|---|---|---|
| **槽位** | 循环的按钮。循环的槽位 N 就是 Better Assistant 配置中的槽位 N。 | 最多 12 个 |
| **光环** | 你自己的增益效果和你在目标身上的减益效果，按法术 ID 指定。循环的光环 N 就是 Better Assistant 列表中的光环 N。 | 最多 12 个 |
| **资源** | 玩家和目标的生命值，以及专精的资源：能量、连击点数、怒气、法力值等。所有数值均为百分比。 | 取决于专精 |
| **战斗** | 附近敌人数和与目标的距离。 | 2 |
| **开关** | 快速设置面板上的按钮：目标模式（在规则中对应 `aoe` 和 `st` 两个开关）、Burst、治疗 / 防御、地面法术、移动。 | 6 |
| **规则** | 在什么条件下按哪个槽位。规则的顺序就是优先级。 | 不限 |

规则由条件组构成。只要**至少一个**组成立，规则就成立（或，OR）；组内**所有**条件都成立，组才成立（且，AND）。没有组的规则始终成立。

*KRC 文本:*

```text
use Envenom when  # 毒伤
	Combo_Points >= 70 and Envenom_Buff.down  # 5+ 个连击点，没有增益
	or
	Combo_Points >= 70 and Energy >= 70  # 5+ 个连击点，能量充足
```

*JSON:*

```json
{
  "use": "Envenom",
  "name": "毒伤",
  "when": [
    {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "5+ 个连击点，没有增益"},
    {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "5+ 个连击点，能量充足"}
  ]
}
```


这条规则的意思是：“如果有 5 个或更多连击点且没有毒伤增益效果，**或者**有 5 个或更多连击点且能量不低于 70%，就按毒伤。”为什么 5 个连击点写作 `70`，请参阅[资源](https://keyrota.app/documentation/zh/conditions#resources)。

### KeyRota 如何选择按钮

1. 按列表顺序**从上到下**检查规则。
2. 对每条规则检查它的各个组。如果没有任何组成立，KeyRota 就检查下一条规则。
3. 如果规则成立，但它的法术此刻**无法使用**（冷却中、资源不足、目标太远、没有目标、未学会该法术），KeyRota 同样会检查下一条规则。无需为槽位自身是否就绪编写条件。
4. 第一条成立且法术可以使用的规则即被**选中**。公共冷却（GCD）不会改变选择：正在等待 GCD 结束的规则仍保持选中状态，下方的规则不会抢先。
5. 如果没有任何规则符合：开启“忽略主图标”时，KeyRota 会等待；关闭时，则按游戏推荐的技能。

等待是正常现象。例如，攒能量的循环经常会有半秒到一秒什么都不按，直到能量足以满足上方的某条规则。

### 未知值永远不会让规则成立

有时 KeyRota 无法得知某个值：未读取到光环（它的 ID 不在 Better Assistant 配置中）、没有目标（目标的生命值和距离未知）、未统计到敌人数。读取未知值的条件一律为**假**：`X.up` 和 `X.down`、`TargetHP >= 50` 和 `TargetHP < 50` 都是如此。未知值只能阻止规则，永远不会让规则成立：宁可少按一次，也不要按错。

> [!TIP]
> 如果某条规则从不触发，请先检查它读取的每个光环是否都已用正确的 ID 加入 Better Assistant 配置。详情请参阅[常见问题与故障排除](https://keyrota.app/documentation/zh/faq#never-fires)。

### 何时按下按钮

- **普通法术**（占用 GCD）在 GCD 即将结束时的法术队列窗口内按下：GCD 一结束，游戏就会施放它。
- **槽位标记**可以改变这一行为：“仅手动（M）”、“引导（C）”、“不占 GCD（O）”、“法术队列窗口（Q）”。各标记的作用和组合方式请参阅[槽位标记](https://keyrota.app/documentation/zh/rotation-json#flags)。
- **引导。** 引导期间，KeyRota 不会按任何键，以免打断引导。**施法**期间，KeyRota 会等到只剩法术队列窗口时再按。
- **你自己的按键。** 当你亲自按下技能键时，KeyRota 会让你优先，不会与你抢按。

### 快速入门

如果还没有安装 KeyRota，请先阅读[新手入门](https://keyrota.app/documentation/zh/start)。

1. 在 KeyRota 中依次选择“输出循环”——“新建”——“在构建器中…”。
2. 在“常规”页面上选择专精并为循环命名。
3. 在“槽位”页面上添加按钮及其法术 ID；在“光环”页面上添加规则要读取的增益效果和减益效果。
4. 在“规则”页面上按优先级顺序添加规则。
5. 在“常规”页面上点击“根据槽位和光环生成”，然后点击“复制”。在游戏中：`/ba`——Profile 选项卡——粘贴字符串——Apply。
6. 把槽位法术放到动作条上并绑定按键（也可以使用带 `#showtooltip` 的宏）。
7. 点击“保存”，在列表中选择该配置，按 F1（macOS 上为 ⌃⇧Space）启动循环。

所有按钮的说明及完整示例请参阅[循环构建器](https://keyrota.app/documentation/zh/editor)。

### 本部分内容

- [循环构建器](https://keyrota.app/documentation/zh/editor) — 窗口的每个页面和按钮，以及逐步构建循环的示例。
- [循环 JSON](https://keyrota.app/documentation/zh/rotation-json) — 格式的每个字段、槽位标记、名称、限制、错误和 KRC 文本。
- [条件](https://keyrota.app/documentation/zh/conditions) — 所有条件类型、运算符、百分比和未知值。
- [模式示例](https://keyrota.app/documentation/zh/patterns) — DoT、资源积攒、生成技能与消耗技能、AoE、Burst、防御技能及其他模板。
- [使用 AI 智能体创建](https://keyrota.app/documentation/zh/ai) — 提示词模板、日志分析和结果检查。
- [常见问题与故障排除](https://keyrota.app/documentation/zh/faq) — 规则为何不触发、按得过早或过晚、打断引导。

---

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

## 循环构建器

循环构建器是 KeyRota 中的一个窗口，无需手写代码即可在其中组装高级循环：带标记的槽位、光环、规则，旁边同步显示 KRC 文本和 JSON。本文档同时适用于 Windows 和 macOS，截图取自 Windows，展示的是[示例](https://keyrota.app/documentation/zh/patterns#example-files)中的奇袭团队副本循环。

### 打开构建器

- **你的循环。** 在主窗口的“输出循环”区块中选择配置，然后点击“设置”。
- **新循环。** “新建”——“在构建器中…”。专精取自游戏或当前配置。第一次保存时，循环会成为一个配置。
- **从文件或剪贴板。** “新建”——“从文件…”可接受 KRC 文本（`.txt`）、循环 JSON 和 KeyRota 配置文件；“新建”——“从剪贴板”则从剪贴板读取同样的内容。然后点击“设置”，在构建器中打开新配置。

![构建器中的新循环：“常规”页面，尚无槽位和规则](https://keyrota.app/documentation/img/zh/editor-new.png)

对于 **Blizzard 配置**，构建器只显示名称和按键延迟：主按钮由游戏决定。“创建自定义循环”会新建一个带高级循环的配置；Blizzard 配置仍保留在列表中。

![构建器中的 Blizzard 配置：配置名称、按键延迟和“创建自定义循环”](https://keyrota.app/documentation/img/zh/editor-blizzard.png)

#### 窗口布局

- **左侧**是各个页面：“常规”“槽位”“光环”“规则”（附规则数量）和“文本和 JSON”。页面上方显示“自定义循环”和所选专精。
- **右侧**是所选页面。
- **底部**是状态栏：显示循环是否正常（“循环正常：15 条规则，11 个槽位，10 个光环”）、是否有未保存的更改；出错时显示出错位置和“查看”按钮。右侧是“关闭”和“保存”。

在点击“保存”之前，任何更改都不会生效（在 Windows 上也可以按 Ctrl+S）。

### 常规

![“常规”页面：配置、专精、循环名称、忽略主图标、按键延迟](https://keyrota.app/documentation/img/zh/editor-general.png)

| 控件 | 作用 |
|---|---|
| **配置名称** | 配置在主窗口循环列表中显示的名称。 |
| **专精** | 决定循环的资源（能量、连击点数、怒气…）以及 Better Assistant 配置的职业和专精。更改专精会替换资源，除非规则中读取了原专精的资源（生命值不算）。 |
| **循环名称** | KRC 文本的第一行（`rotation "…"`），显示在 KeyRota 日志中。不能包含双引号。适合写上版本号，例如“奇袭 v1.3”。 |
| **忽略主图标** | 开启：KeyRota 只按规则按键；没有符合的规则时就等待。关闭：此时改按游戏推荐。自定义循环通常开启此项：等待（例如攒能量）是正常的。 |
| **按键延迟** | 每次按键前稍作停顿，像真人一样：“无”“固定”（间隔 0–1000 毫秒）或“随机”（范围 0–1000 毫秒）。“也用于打断和防御”会对打断和防御技能应用同样的停顿。 |

![“常规”页面下半部分：Better Assistant 区块、敌人计数半径、仅计入战斗中的敌人和描述](https://keyrota.app/documentation/img/zh/editor-general-ba.png)

| 控件 | 作用 |
|---|---|
| **配置：…** | Better Assistant 配置字符串的摘要：专精、法术数量和光环数量。 |
| **根据槽位和光环生成** | 根据槽位的法术 ID、每个槽位的“Better Assistant 显示条件”、按顺序排列的光环、专精、半径和“仅计入战斗中的敌人”，生成 Better Assistant 配置字符串。如果已经粘贴了同一专精的配置，则保留它的其他设置。 |
| **从剪贴板** | 粘贴现成的配置字符串。它的专精必须与循环的专精一致。 |
| **复制** | 复制字符串，以便粘贴到游戏中。 |
| **敌人计数半径（码）** | 1–100，默认 8。用于“附近敌人数”条件（`enemies`）。 |
| **仅计入战斗中的敌人** | 默认开启：尚未进入战斗的敌人不计入。 |
| **描述** | 循环备注：KRC 文本中以 `#` 开头的行。不影响循环运行。 |

按钮下方会显示警告：规则中使用的哪些槽位没有法术 ID（它们不会进入 Better Assistant 配置），以及已粘贴的配置中哪些内容与循环不符。

> [!IMPORTANT]
> Better Assistant 配置中的光环必须从第一个开始连续排列。如果光环 3 没有 ID 而光环 4 有，配置将无法生成：“光环 3 没有法术编号”。请填写 ID，或重新为光环编号。

#### 游戏中的 Better Assistant 配置

循环的槽位 N 就是 Better Assistant 中的槽位 N，光环 N 就是其列表中的光环 N。配置字符串会按正确的顺序把你的槽位和光环放进去。

1. 在“常规”页面上点击“根据槽位和光环生成”，然后点击“复制”。
2. 在游戏中输入 `/ba`，打开 **Profile** 选项卡，粘贴字符串，点击 **Apply** 并确认。
3. 每次更改槽位或光环（ID、顺序、“有目标时”/“战斗中”）后，都要重新生成并粘贴配置。

### 槽位

![“槽位”页面：左侧是 12 个位置，右侧是选中的槽位 10 消失，ID 1856](https://keyrota.app/documentation/img/zh/editor-slots.png)

左侧是 12 个位置：编号、名称、法术 ID、标记（“不占 GCD，队列内”），槽位未被任何规则使用时显示“未使用”。空位置显示“空”；选中它即可看到“添加槽位”按钮。

| 控件 | 作用 |
|---|---|
| **名称** | 法术在游戏中的名称。显示在规则列表和日志中。 |
| **法术 ID** | Wowhead 链接中的数字：`wowhead.com/spell=1856/vanish` 中的 `1856`。Better Assistant 据此把法术放入此槽位。 |
| **Better Assistant 显示条件** | “有目标时”或“战斗中”。只有 Better Assistant 显示该槽位时，槽位才算就绪。“战斗中”用于没有目标时也必须能用的治疗和防御技能。 |
| **按键方式** | 四个标记开关，见下表。 |
| **文本中的名称** | 槽位在规则和 KRC 文本中的名称：字母、数字和 `_`，不含空格。 |
| **注释** | 文本中声明行末尾的注释。 |
| **使用它的规则** | 按下或读取该槽位的规则。只有槽位未被使用时，才能“移除槽位”。 |

要让 KeyRota 按下某个槽位，它的法术必须放在游戏中的动作条上并绑定按键：KeyRota 从你的动作条读取按键。也可以使用带 `#showtooltip 名称` 的宏。没有按键的槽位永远不会被按下。

#### 按键方式：标记

![消失槽位的“按键方式”开关：已开启“不占 GCD（O）”和“法术队列窗口（Q）”](https://keyrota.app/documentation/img/zh/editor-slot-flags.png)

| 开关 | 作用 | 适用场景 |
|---|---|---|
| 无标记 | 槽位像普通法术一样按下：在公共冷却即将结束时、法术队列窗口内。 | 几乎所有占用 GCD 的法术。 |
| **仅手动（M）** | KeyRota 从不自动按此槽位，并会跳过它的规则。你亲自按下它的按键时，循环会暂停。 | 只想自己按的技能。 |
| **引导（C）** | 该法术引导期间，KeyRota 不按任何键，也不会打断引导。 | 引导法术，例如影舞步。 |
| **不占 GCD（O）** | 不等待公共冷却：立即按下，即使正处于 GCD 中。 | 不占 GCD 的法术，例如时运继延。 |
| **法术队列窗口（Q）** | 仅与“不占 GCD”一起使用：在 GCD 的最后、法术队列窗口内按下。 | 第二行占用 GCD 的宏（冲动 + 影舞步），以及需要上一次攻击结果的按钮（君王之灾之后的消失）。 |

所有标记组合及其 JSON 写法请参阅[槽位标记](https://keyrota.app/documentation/zh/rotation-json#flags)。

### 光环

![“光环”页面：光环 1“目标身上的锁喉 [703]”，ID 703，文本中的名称 Garrote_DoT，用于规则 3、4、5、7、8、10](https://keyrota.app/documentation/img/zh/editor-auras.png)

光环是规则读取的你自己的增益效果，以及你在目标身上的减益效果。循环的光环 N 就是 Better Assistant 列表中的光环 N。

| 控件 | 作用 |
|---|---|
| **名称** | 光环的名称，显示在规则中。建议在方括号中附上 ID：“目标身上的锁喉 [703]”。 |
| **法术 ID** | 光环在 Wowhead 上的编号。Better Assistant 会在你自己的增益效果和你在目标身上的减益效果中查找它。 |
| **文本中的名称**、**注释** | 与槽位相同。 |
| **使用它的规则** | 读取该光环的规则。只有未被使用的光环才能“移除光环”。 |

> [!NOTE]
> 光环的 ID 可能与施加它的法术 ID 不同。消失法术是 `1856`，它给予的增益效果是 `11327`；潜行是 `1784`，带“诡诈”天赋的潜行是 `115191`。请在 Wowhead 上核对增益或减益效果本身的 ID。

只有**你自己的**光环可见：你给自己施加的增益效果，以及你施加在目标身上的减益效果。规则看不到其他玩家给你的增益效果，也看不到其他玩家施加在目标身上的减益效果。

### 规则

![“规则”页面：左侧是 15 条规则，右侧是规则 4 死亡印记及其条件组](https://keyrota.app/documentation/img/zh/editor-rules.png)

规则从上到下检查：KeyRota 按下第一条已满足且法术可以施放的规则；如果无法施放（冷却、资源、距离），就检查下一条。

**列表上方的工具栏：**

| 按钮 | 作用 |
|---|---|
| **+** | 在所选规则下方新建规则。新规则按第一个槽位，暂时没有条件。 |
| **复制规则** | 在下方创建该规则的副本。 |
| **删除规则**（垃圾桶图标） | 删除规则。 |
| **上移**、**下移** | 向上移动（更早检查）或向下移动（更晚检查）。 |

列表中的每条规则都会显示编号（即优先级）、槽位、名称和组数；有错误的规则带有红色标记。

**所选规则：**

| 控件 | 作用 |
|---|---|
| **按下** | 规则满足时要按的槽位。 |
| **名称** | 规则触发时显示在日志中。 |
| **描述** | KRC 文本中规则上方的备注。 |
| **何时按下** | 条件组：只要有一个组满足，规则即满足（或）；组内所有条件都满足，组才满足（且）。 |

![割裂规则的条件组：组 1 和组 2 之间以“或”分隔](https://keyrota.app/documentation/img/zh/editor-rule-groups.png)

每个组都有“组 N”标题、“组注释”输入框，以及“复制组”和“删除组”按钮。条件行包括**检查对象**、**属性**、**比较方式**和**数值**；点击叉号可移除条件。“+ 条件”向组中添加条件，“+ 组（或）”添加新组。一个组最多 16 个条件，一条规则最多 16 个组：达到上限时，按钮会被禁用。没有组的规则会显示“无条件：只要法术可以施放，规则就会触发。”

| 检查对象 | 属性 | KRC 文本中的写法 |
|---|---|---|
| **光环**（循环中的每个光环） | 存在、不存在、剩余时间（%）、层数 | `Garrote_DoT.up`、`.down`、`.duration <= 30`、`.stacks >= 3` |
| **槽位**（每个槽位） | 就绪、冷却中、冷却（%）、充能次数、高亮、未高亮 | `Kingsbane.ready`、`.oncd`、`.cd <= 3`、`.charges >= 2`、`.glow`、`.noglow` |
| **资源** | 玩家和目标的生命值、专精的资源（%） | `PlayerHP <= 40`、`Energy >= 70` |
| **战斗**：附近敌人数 | 数量 | `enemies >= 3` |
| **战斗**：与目标的距离 | 码 | `target.distance <= 8` |
| **快速设置面板** | 开启、关闭 | `aoe == 1`、`st == 1`、`cd == 1`、`defensives == 1`、`ground_spells == 1`、`movement == 1` |

比较方式：`<`、`≤`、`=`、`≥`、`>`；数值为 0 到 100。新条件默认为第一个光环“存在”；更改检查对象后，属性和数值会重置为默认值（资源为 `≥ 50`，敌人数为 `≥ 2`，距离为 `≤ 8`）。各条件的详细说明请参阅[条件](https://keyrota.app/documentation/zh/conditions)。

### 错误和状态栏

![规则 9 中的错误：没有条件的组 1 以红框标出，状态栏显示“规则 9，组 1：组中没有条件”和“查看”](https://keyrota.app/documentation/img/zh/editor-problem.png)

- **绿色**：“循环正常：…”，表示没有错误，可以保存。
- **红色**会指出出错位置：“规则 9，组 1：组中没有条件”。点击“查看”即可跳转到该位置。列表中会标记该规则，并用红框标出该组。
- 有错误的循环无法保存：“有错误的循环无法保存：请修正下方标出的问题”。
- 循环运行期间无法保存：“请先停止输出循环再保存”。

### 文本和 JSON

![“文本和 JSON”页面的 KRC 文本模式：循环文本开头的描述和 buff1–buff7 声明](https://keyrota.app/documentation/img/zh/editor-text.png)

![“文本和 JSON”页面的 JSON 模式：循环 JSON 开头的 format、version、title、specID、ignoreMainIcon、enemies 和 notes](https://keyrota.app/documentation/img/zh/editor-json.png)

| 控件 | 作用 |
|---|---|
| **KRC 文本 / JSON** | 切换视图。 |
| **复制** | 复制全部文本或 JSON。 |
| **粘贴** | 用剪贴板内容替换循环：KRC 文本、循环 JSON 或 KeyRota 配置。 |
| **打开…** | 从 `.txt` 或 `.json` 文件加载循环。 |
| **保存…** | 将当前视图保存为文件：文本存为 `.txt`，JSON 存为 `.json`。 |

在输入框中所做的修改如果没有错误，会立即生效；有错误时，错误信息显示在输入框下方，其他页面保留最后一个有效版本。

**哪些内容只保存在 JSON 中。** KRC 文本不包含法术 ID、槽位标记、“有目标时”/“战斗中”、专精、“忽略主图标”和敌人计数设置。编辑文本时，这些设置保留在编号相同的槽位和光环上。JSON 则保存全部内容。粘贴或打开循环的新版本时，如果新版本中没有这些设置，编号相同的槽位和光环会保留原有的 ID、显示条件和标记。

### 保存和关闭

- “保存”（在 Windows 上也可以按 Ctrl+S）会把循环写入配置，按钮会短暂显示“已保存”。新循环会成为一个配置，并在列表中被选中。
- 有未保存的更改时关闭窗口，会询问“保存更改？”：“保存”“不保存”或“取消”。关闭 KeyRota 时也是如此。
- 主窗口中的“导出”会将配置连同其循环保存为 JSON；“导入”既接受 KeyRota 配置，也接受单独的循环 JSON。

### 示例：从零开始构建循环

我们来构建一个简单的奇袭循环：两个流血效果（锁喉和割裂）、一个生成技能（毁伤）、一个消耗技能（毒伤）、一个防御技能（生命值 40% 及以下时使用猩红之瓶），以及由 Burst 按钮控制的冷却技能（死亡印记）。

**1. 新建配置。** “输出循环”——“新建”——“在构建器中…”。

**2. 常规。** 配置名称：“奇袭：示例”。专精：奇袭（资源变为 `PlayerHP`、`TargetHP`、`Energy`、`Combo_Points`）。循环名称：“奇袭：示例 v1”。忽略主图标：开启。

**3. 槽位。** 按下表逐行操作：在左侧选择位置，点击“添加槽位”，填写“名称”“法术 ID”和“文本中的名称”；为猩红之瓶选择“战斗中”。不需要任何标记。

| 槽位 | 名称 | ID | 文本中的名称 | Better Assistant 显示条件 |
|---|---|---|---|---|
| 1 | 锁喉 | 703 | `Garrote` | 有目标时 |
| 2 | 割裂 | 1943 | `Rupture` | 有目标时 |
| 3 | 毒伤 | 32645 | `Envenom` | 有目标时 |
| 4 | 毁伤 | 1329 | `Mutilate` | 有目标时 |
| 5 | 死亡印记 | 360194 | `Deathmark` | 有目标时 |
| 6 | 猩红之瓶 | 185311 | `Crimson_Vial` | 战斗中 |

**4. 光环。** 在“光环”页面上同样操作：

| 光环 | 名称 | ID | 文本中的名称 |
|---|---|---|---|
| 1 | 目标身上的锁喉 [703] | 703 | `Garrote_DoT` |
| 2 | 目标身上的割裂 [1943] | 1943 | `Rupture_DoT` |
| 3 | 毒伤 [32645] | 32645 | `Envenom_Buff` |
| 4 | 目标身上的死亡印记 [360194] | 360194 | `Deathmark_DoT` |

**5. 规则。** 在“规则”页面上点击“+”，在“按下”中选择槽位并填写“名称”。“+ 组（或）”会添加一个带默认条件的组：修改检查对象、属性、比较方式和数值。“+ 条件”会向同一组添加下一个条件。规则按以下顺序排列：

| # | 按下 | 组（或），组内条件（且） |
|---|---|---|
| 1 | 猩红之瓶 | “治疗 / 防御”开启，玩家生命值 ≤ 40 |
| 2 | 死亡印记 | Burst 开启，“目标身上的锁喉”存在，“目标身上的割裂”存在，“毒伤”存在 |
| 3 | 锁喉 | （1）“目标身上的锁喉”不存在；（2）“目标身上的锁喉”存在，剩余时间 ≤ 30% |
| 4 | 割裂 | （1）连击点数 ≥ 70，“目标身上的割裂”不存在；（2）连击点数 ≥ 70，“目标身上的割裂”存在，剩余时间 ≤ 30% |
| 5 | 毒伤 | （1）连击点数 ≥ 70，“毒伤”不存在；（2）连击点数 ≥ 70，“毒伤”存在，剩余时间 ≤ 20%；（3）连击点数 ≥ 70，能量 ≥ 70；（4）连击点数 ≥ 70，“目标身上的死亡印记”存在 |
| 6 | 毁伤 | 连击点数 < 70 |

原因：
- **防御技能放在最前**：生命值低时，猩红之瓶比伤害更重要。它只在快速设置面板上的“治疗 / 防御”开启时触发。
- **死亡印记由 Burst 控制**：`cd == 1` 是 Burst 按钮（Windows 上为 F3，macOS 上为 ⌃⇧B），而不是法术的冷却。关闭 Burst，死亡印记就会等待。
- **DoT 与刷新窗口**：不存在的光环剩余时间为 0，因此刷新需要两个组：“没有 DoT”和“DoT 存在且剩余 ≤ 30%”。
- **5 个连击点 = 70**：连击点上限为 7 时，5 点是 71%；无论怎样取整，阈值 `70` 都成立。对照表请参阅[资源](https://keyrota.app/documentation/zh/conditions#resources)。
- **毁伤放在最后**，并且只在少于 5 个连击点时使用，这样在毒伤等待条件满足期间不会浪费能量。

**6. 检查。** 状态栏应显示“循环正常：6 条规则，6 个槽位，4 个光环”。打开“文本和 JSON”页面，即可看到与下方相同的内容。

**7. Better Assistant 配置。** “常规”——“根据槽位和光环生成”——“复制”；在游戏中：`/ba`——Profile——粘贴——Apply。

**8. 按键。** 把这六个法术放到动作条上并绑定按键。

**9. 运行。** 点击“保存”，关闭窗口，选择配置“奇袭：示例”，然后启动循环（Windows 上按 F1，macOS 上按 ⌃⇧Space）。如果需要猩红之瓶，请在快速设置面板上开启“治疗 / 防御”；Burst 按钮用于开启和关闭死亡印记。

*KRC 文本:*

```text
rotation "奇袭：示例 v1"

# KeyRota 文档中的示例：两个流血、一个生成技能、一个攒能量的消耗技能，
# 低生命值时的防御，以及由 Burst 按钮控制的死亡印记。
# 连击点按 7 点的百分比计：5 点 = 71%，阈值 70 = 5 点以上。

buff1	Garrote_DoT = "目标身上的锁喉 [703]"
buff2	Rupture_DoT = "目标身上的割裂 [1943]"
buff3	Envenom_Buff = "毒伤 [32645]"
buff4	Deathmark_DoT = "目标身上的死亡印记 [360194]"
slot1	Garrote = "锁喉"
slot2	Rupture = "割裂"
slot3	Envenom = "毒伤"
slot4	Mutilate = "毁伤"
slot5	Deathmark = "死亡印记"
slot6	Crimson_Vial = "猩红之瓶"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

# --- 防御：仅在“治疗 / 防御”开启时 ---
use Crimson_Vial when  # 猩红之瓶
	defensives == 1 and PlayerHP <= 40  # 生命值 40% 及以下

# --- 冷却技能：仅在 Burst 开启时 ---
use Deathmark when  # 死亡印记
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up and Envenom_Buff.up  # Burst 开启，流血和毒伤都在

# --- 流血 ---
use Garrote when  # 锁喉
	Garrote_DoT.down  # 没有流血
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30  # 刷新窗口：剩余 30% 及以下

use Rupture when  # 割裂
	Combo_Points >= 70 and Rupture_DoT.down  # 5+ 个连击点，没有流血
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # 5+ 个连击点，刷新窗口

# --- 消耗：5+ 个连击点，攒能量 ---
use Envenom when  # 毒伤
	Combo_Points >= 70 and Envenom_Buff.down  # 没有增益
	or
	Combo_Points >= 70 and Envenom_Buff.up and Envenom_Buff.duration <= 20  # 增益快结束
	or
	Combo_Points >= 70 and Energy >= 70  # 避免能量溢出
	or
	Combo_Points >= 70 and Deathmark_DoT.up  # 目标身上有死亡印记

# --- 生成技能：少于 5 个连击点 ---
use Mutilate when  # 毁伤
	Combo_Points < 70  # 少于 5 个连击点
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "奇袭：示例 v1",
  "specID": 259,
  "ignoreMainIcon": true,
  "enemies": {"range": 8, "combatOnly": true},
  "notes": [
    "KeyRota 文档中的示例：两个流血、一个生成技能、一个攒能量的消耗技能，",
    "低生命值时的防御，以及由 Burst 按钮控制的死亡印记。",
    "连击点按 7 点的百分比计：5 点 = 71%，阈值 70 = 5 点以上。"
  ],
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "目标身上的锁喉 [703]", "spell": 703},
    {"n": 2, "alias": "Rupture_DoT", "label": "目标身上的割裂 [1943]", "spell": 1943},
    {"n": 3, "alias": "Envenom_Buff", "label": "毒伤 [32645]", "spell": 32645},
    {"n": 4, "alias": "Deathmark_DoT", "label": "目标身上的死亡印记 [360194]", "spell": 360194}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "锁喉", "spell": 703, "show": "target"},
    {"n": 2, "alias": "Rupture", "label": "割裂", "spell": 1943, "show": "target"},
    {"n": 3, "alias": "Envenom", "label": "毒伤", "spell": 32645, "show": "target"},
    {"n": 4, "alias": "Mutilate", "label": "毁伤", "spell": 1329, "show": "target"},
    {"n": 5, "alias": "Deathmark", "label": "死亡印记", "spell": 360194, "show": "target"},
    {"n": 6, "alias": "Crimson_Vial", "label": "猩红之瓶", "spell": 185311, "show": "combat"}
  ],
  "rules": [
    {
      "use": "Crimson_Vial",
      "name": "猩红之瓶",
      "note": ["--- 防御：仅在“治疗 / 防御”开启时 ---"],
      "when": [{"all": ["defensives == 1", "PlayerHP <= 40"], "comment": "生命值 40% 及以下"}]
    },
    {
      "use": "Deathmark",
      "name": "死亡印记",
      "note": ["--- 冷却技能：仅在 Burst 开启时 ---"],
      "when": [
        {
          "all": ["cd == 1", "Garrote_DoT.up", "Rupture_DoT.up", "Envenom_Buff.up"],
          "comment": "Burst 开启，流血和毒伤都在"
        }
      ]
    },
    {
      "use": "Garrote",
      "name": "锁喉",
      "note": ["--- 流血 ---"],
      "when": [
        {"all": ["Garrote_DoT.down"], "comment": "没有流血"},
        {"all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"], "comment": "刷新窗口：剩余 30% 及以下"}
      ]
    },
    {
      "use": "Rupture",
      "name": "割裂",
      "when": [
        {"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "5+ 个连击点，没有流血"},
        {
          "all": ["Combo_Points >= 70", "Rupture_DoT.up", "Rupture_DoT.duration <= 30"],
          "comment": "5+ 个连击点，刷新窗口"
        }
      ]
    },
    {
      "use": "Envenom",
      "name": "毒伤",
      "note": ["--- 消耗：5+ 个连击点，攒能量 ---"],
      "when": [
        {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "没有增益"},
        {"all": ["Combo_Points >= 70", "Envenom_Buff.up", "Envenom_Buff.duration <= 20"], "comment": "增益快结束"},
        {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "避免能量溢出"},
        {"all": ["Combo_Points >= 70", "Deathmark_DoT.up"], "comment": "目标身上有死亡印记"}
      ]
    },
    {
      "use": "Mutilate",
      "name": "毁伤",
      "note": ["--- 生成技能：少于 5 个连击点 ---"],
      "when": [{"all": ["Combo_Points < 70"], "comment": "少于 5 个连击点"}]
    }
  ]
}
```


下载此示例：[JSON](https://keyrota.app/documentation/examples/starter-assassination.zh.json)、[KRC 文本](https://keyrota.app/documentation/examples/starter-assassination.zh.txt)。可以在“文本和 JSON”页面上用“打开…”打开，或通过“新建”——“从文件…”打开。

---

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

## 循环 JSON

JSON 是高级循环的完整描述：包含 KRC 文本中的全部内容，外加法术 ID、槽位标记和配置设置。构建器在“文本和 JSON”页面上显示 JSON，KeyRota 也可以以文件形式接受它（“新建”——“从文件…”、“导入”）。该格式称为 `keyrota-rotation`，版本为 1。可以使用 [JSON Schema](#schema) 对其进行校验。

### 示例文件

最简短的实用循环：目标身上没有割裂且有 5 个以上连击点时施放割裂，否则施放毁伤。

*minimal.json:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "奇袭：最小示例",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [{"n": 1, "alias": "Rupture_DoT", "label": "目标身上的割裂 [1943]", "spell": 1943}],
  "slots": [
    {"n": 2, "alias": "Rupture", "label": "割裂", "spell": 1943},
    {"n": 4, "alias": "Mutilate", "label": "毁伤", "spell": 1329}
  ],
  "rules": [
    {
      "use": "Rupture",
      "name": "割裂",
      "when": [{"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "5+ 个连击点，没有流血"}]
    },
    {"use": "Mutilate", "name": "毁伤"}
  ]
}
```


文件中省略的内容一律取默认值：槽位在“有目标时”显示且没有标记，敌人计数半径为 8 码，只计入战斗中的敌人。没有 `when` 的规则始终成立。

### 顶层字段

| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| `format` | 字符串 | 是 | — | 始终为 `"keyrota-rotation"`。 |
| `version` | 整数 | 是 | — | 始终为 `1`。更高的版本会被拒绝：“请更新 KeyRota”。 |
| `title` | 字符串 | 否 | `""` | 循环名称：文本的第一行，也是日志中显示的名称。不能包含双引号。 |
| `specID` | 整数 0–100000 | 否 | `0` | 魔兽世界专精，`0` = 任意。生成 Better Assistant 配置时需要。 |
| `ignoreMainIcon` | true / false | 否 | `true` | 开启：只按规则按键。关闭：没有符合的规则时，按游戏推荐。 |
| `enemies` | 对象 | 否 | `{"range": 8, "combatOnly": true}` | `enemies` 条件使用的敌人计数器。 |
| `notes` | 字符串或字符串列表 | 否 | `[]` | 描述：文本顶部以 `#` 开头的行。 |
| `resources` | 由字符串和 `null` 组成的列表 | 否 | `[]` | 按顺序排列的 `resource1…N` 名称。 |
| `auras` | 列表 | 否 | `[]` | 光环 `buff1…12`。 |
| `slots` | 列表 | 否 | `[]` | 槽位 `slot1…12`。 |
| `rules` | 列表 | 否 | `[]` | 按优先级排列的规则。 |
| `footer` | 字符串或字符串列表 | 否 | `[]` | 最后一条规则之后的注释。 |

其他任何字段都会报错“多余字段”：拼写错误不会被悄悄忽略。因此不要在文件中添加 `"$schema"`；请在编辑器或校验工具中关联 Schema。

几乎所有位置都可以用 `null` 代替值，其效果与省略该字段相同。

### format 和 version

`"format": "keyrota-rotation"` 和 `"version": 1` 为必填项。如果 `version` 大于 1，KeyRota 会拒绝加载：“版本 2 比此 KeyRota 支持的更新：请更新 KeyRota”。缺少 `version` 时：“需要版本 1”。

### title

不含双引号 `"` 的字符串。换行符会变为空格。在 KRC 文本中写作 `rotation "…"`。适合写上版本号：`"奇袭 v1.3"`。

### specID

游戏中的专精 ID。它决定循环的资源（在构建器中创建时）以及 Better Assistant 配置中的职业和专精。`0` 表示任意专精：循环可以运行，但无法生成 Better Assistant 配置（“请选择专精：Better Assistant 配置需要它”）。

| 职业 | 专精 | specID | 专精资源（`resource3`…） |
|---|---|---|---|
| 战士 | 武器 | 71 | `Rage` |
| 战士 | 狂怒 | 72 | `Rage` |
| 战士 | 防护 | 73 | `Rage` |
| 圣骑士 | 神圣 | 65 | `Mana`、`Holy_Power` |
| 圣骑士 | 防护 | 66 | `Mana`、`Holy_Power` |
| 圣骑士 | 惩戒 | 70 | `Mana`、`Holy_Power` |
| 猎人 | 野兽控制 | 253 | `Focus` |
| 猎人 | 射击 | 254 | `Focus` |
| 猎人 | 生存 | 255 | `Focus` |
| 潜行者 | 奇袭 | 259 | `Energy`、`Combo_Points` |
| 潜行者 | 狂徒 | 260 | `Energy`、`Combo_Points` |
| 潜行者 | 敏锐 | 261 | `Energy`、`Combo_Points` |
| 牧师 | 戒律 | 256 | `Mana`、`Insanity` |
| 牧师 | 神圣 | 257 | `Mana`、`Insanity` |
| 牧师 | 暗影 | 258 | `Mana`、`Insanity` |
| 死亡骑士 | 鲜血 | 250 | `Runes`、`Runic_Power` |
| 死亡骑士 | 冰霜 | 251 | `Runes`、`Runic_Power` |
| 死亡骑士 | 邪恶 | 252 | `Runes`、`Runic_Power` |
| 萨满祭司 | 元素 | 262 | `Mana`、`Maelstrom` |
| 萨满祭司 | 增强 | 263 | `Mana`、`Maelstrom` |
| 萨满祭司 | 恢复 | 264 | `Mana`、`Maelstrom` |
| 法师 | 奥术 | 62 | `Mana`、`Arcane_Charges` |
| 法师 | 火焰 | 63 | `Mana`、`Arcane_Charges` |
| 法师 | 冰霜 | 64 | `Mana`、`Arcane_Charges` |
| 术士 | 痛苦 | 265 | `Mana`、`Soul_Shards` |
| 术士 | 恶魔学识 | 266 | `Mana`、`Soul_Shards` |
| 术士 | 毁灭 | 267 | `Mana`、`Soul_Shards` |
| 武僧 | 酒仙 | 268 | `Energy`、`Stagger` |
| 武僧 | 织雾 | 270 | `Mana` |
| 武僧 | 踏风 | 269 | `Energy`、`Chi` |
| 德鲁伊 | 平衡 | 102 | `Mana`、`Astral_Power` |
| 德鲁伊 | 野性 | 103 | `Energy`、`Combo_Points` |
| 德鲁伊 | 守护 | 104 | `Rage` |
| 德鲁伊 | 恢复 | 105 | `Mana`、`Astral_Power` |
| 恶魔猎手 | 浩劫 | 577 | `Fury` |
| 恶魔猎手 | 复仇 | 581 | `Fury` |
| 恶魔猎手 | 噬灭 | 1480 | `Fury` |
| 唤魔师 | 湮灭 | 1467 | `Mana`、`Essence` |
| 唤魔师 | 恩护 | 1468 | `Mana`、`Essence` |
| 唤魔师 | 增辉 | 1473 | `Mana`、`Essence` |

### ignoreMainIcon

`true`（默认）：KeyRota 只按规则按键；没有符合的规则时就等待。`false`：此时按游戏推荐，与 Blizzard 配置相同。游戏推荐是所有规则之后的最后选择，永远不会抢在规则之前。

### enemies

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


| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `range` | 整数 1–100 | `8` | 敌人计数半径，单位为码。 |
| `combatOnly` | true / false | `true` | 只计入已进入战斗的敌人。 |

`enemies` 条件读取的就是这个计数器（见[附近敌人数](https://keyrota.app/documentation/zh/conditions#enemies)）。在构建器中，它们对应“常规”页面上的“敌人计数半径（码）”和“仅计入战斗中的敌人”。这些值也会写入 Better Assistant 配置。

### notes 和 footer

循环的描述（`notes`）以及最后一条规则之后的注释（`footer`）。可以是字符串列表，也可以是一个含 `\n` 的字符串。空字符串 `""` 在文本中是一个空行。首尾的空行会被删除。

```json
"notes": ["依据指南和顶尖日志，12.1 版本", "", "v1.1：4+ 个目标时更早使用毒伤"]
```


在 KRC 文本中，它们是声明之前的 `# …` 行。不影响循环运行。

### resources

按顺序排列的资源名称：第一项是 `resource1`，第二项是 `resource2`，依此类推。**编号决定资源是什么**；名称只是在条件中的写法：

- `resource1` 是玩家的生命值，`resource2` 是目标的生命值；
- 从 `resource3` 起是专精的资源，顺序与 [specID 表](#spec-id)相同：对于潜行者，`resource3` 是能量，`resource4` 是连击点数。

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


请使用表中的标准名称：构建器会用通俗的文字显示它们（“玩家生命值”“能量”），其他人和 AI 智能体也能立刻看懂条件。`null` 用于跳过一个编号：`["PlayerHP", null, "Energy"]` 只声明 `resource1` 和 `resource3`。未声明的资源无法读取：“resource2 未声明”。

所有资源都是相对最大值的**百分比**，范围为 0–100。如何把连击点数、能量和符文换算成百分比，请参阅“条件”中的[资源](https://keyrota.app/documentation/zh/conditions#resources)。

### auras

光环是你自己的增益效果，以及你在目标身上的减益效果。循环的光环 `n` 就是 Better Assistant 列表中的光环 `n`。

| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| `n` | 整数 1–12 | 是 | — | 光环编号（`buffN`）。每个编号只能出现一次。 |
| `alias` | 字符串 | 否 | 由 `label` 生成 | 在条件中使用的名称。见[名称](#aliases)。 |
| `label` | 字符串 | 否 | `""` | 显示名称。不能包含双引号 `"`。建议在方括号中附上 ID：`"目标身上的锁喉 [703]"`。 |
| `spell` | 整数 0–100000000 | 否 | `0` | 光环在 Wowhead 上的 ID。`0` = 未设置：该光环不会进入 Better Assistant 配置，其值将是未知的。 |
| `note` | 字符串 | 否 | `""` | 声明行末尾的注释。 |

```json
"auras": [
  {"n": 1, "alias": "Garrote_DoT", "label": "目标身上的锁喉 [703]", "spell": 703},
  {"n": 2, "alias": "Rupture_DoT", "label": "目标身上的割裂 [1943]", "spell": 1943}
]
```


列表中的顺序无关紧要，起作用的是 `n`。编号之间可以有空缺，但为了生成 Better Assistant 配置，带 ID 的光环必须从第一个开始连续排列。

### slots

槽位是循环的按钮。循环的槽位 `n` 就是 Better Assistant 中的槽位 `n`。

| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| `n` | 整数 1–12 | 是 | — | 槽位编号（`slotN`）。 |
| `alias` | 字符串 | 否 | 由 `label` 生成 | 在规则和条件中使用的名称。 |
| `label` | 字符串 | 否 | `""` | 法术名称。不能包含双引号 `"`。 |
| `spell` | 整数 0–100000000 | 否 | `0` | 法术在 Wowhead 上的 ID。Better Assistant 据此把法术放入槽位。 |
| `note` | 字符串 | 否 | `""` | 声明行末尾的注释。 |
| `show` | `"target"` / `"combat"` | 否 | `"target"` | Better Assistant 何时显示该槽位。 |
| `manual` | true / false | 否 | `false` | 标记 **M**。 |
| `channel` | true / false | 否 | `false` | 标记 **C**。 |
| `offGcd` | true / false | 否 | `false` | 标记 **O**。 |
| `queue` | true / false | 否 | `false` | 标记 **Q**，只能与 `offGcd` 一起使用。 |

#### show

- `"target"`：有目标时显示该槽位。几乎所有攻击技能都是如此。
- `"combat"`：在战斗中即使没有目标也显示该槽位。用于治疗和防御技能：没有目标时，猩红之瓶也必须能用。

只有 Better Assistant 显示槽位时，槽位才算就绪。没有目标时，`"target"` 槽位不算就绪，它的规则会被跳过。

### 槽位标记

标记规定选中某个槽位的规则后**如何**按下它。在构建器中，它们就是“按键方式”开关。

| 标记 | JSON 写法 | 按键方式 | 示例 |
|---|---|---|---|
| 无 | 全部为 `false` | 在 GCD 即将结束时的法术队列窗口内按下：GCD 一结束，法术就会施放。 | 毁伤、毒伤 |
| **M** | `"manual": true` | 从不自动按下。该槽位的规则会被跳过。你亲自按下它的按键时，循环会暂停。 | 你想自己按的技能 |
| **C** | `"channel": true` | 像普通法术一样按下；引导期间不按任何键。按下后，在引导开始之前不会再次按此槽位。 | 影舞步（51690） |
| **O** | `"offGcd": true` | 立即按下，即使正处于 GCD 中。 | 时运继延（381989） |
| **O + Q** | `"offGcd": true, "queue": true` | 不占 GCD，但只在 GCD 即将结束时的法术队列窗口内按下。 | 冲动 + 影舞步宏（13750）；君王之灾之后的消失（1856） |
| **C + O** | `"channel": true, "offGcd": true` | 不占 GCD 启动的引导：立即按下，然后在引导结束前不按任何键。 | 少见 |
| **C + O + Q** | 三者全开 | 同上，但在法术队列窗口内按下。 | 少见 |
| 不带 O 的 **Q** | `"queue": true` | 错误：“queue 只能与 offGcd 一起使用”。 | — |
| **M** + 其他 | `"manual": true, …` | M 优先：该槽位不会被按下，其他标记不起作用。 | — |

为什么用 **O + Q** 而不是只用 **O**：只带 O 的按钮会在 GCD 中途立即按下，此时上一次攻击还没有生效。如果君王之灾之后的消失只带 O，它会在君王之灾的连击点到账之前被按下，消失规则（`Combo_Points < 65`）检查的将是旧值。加上 Q 后，按钮会等到 GCD 结束时再按。

严格优先级：列表中靠下的不占 GCD 规则**不会抢在**正在等待 GCD 的靠上规则之前。

```json
"slots": [
  {"n": 1, "alias": "Adrenaline_Rush", "label": "冲动（与影舞步组成的宏）", "spell": 13750, "offGcd": true, "queue": true},
  {"n": 4, "alias": "Keep_It_Rolling", "label": "时运继延", "spell": 381989, "offGcd": true},
  {"n": 8, "alias": "Killing_Spree", "label": "影舞步", "spell": 51690, "channel": true},
  {"n": 11, "alias": "Crimson_Vial", "label": "猩红之瓶", "spell": 185311, "show": "combat"}
]
```


### rules

按优先级排列的规则：列表中的第一条最先检查。

| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| `use` | 字符串 | 是 | — | 要按的槽位：它的 `alias` 或 `slotN`。 |
| `name` | 字符串 | 否 | `""` | 动作名称，显示在日志中。在文本中是 `use` 行上的注释。 |
| `note` | 字符串或字符串列表 | 否 | `[]` | 规则上方的备注（`use` 之前以 `#` 开头的行）。 |
| `when` | 组列表 | 否 | `[]` | “或”组。为空或省略时：规则没有条件，只要法术可以使用就会按下。 |

#### when：组和条件

| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `all` | 非空字符串列表 | 是 | 组的条件，必须全部成立（且）。 |
| `comment` | 字符串 | 否 | 组的注释（在文本中位于该行末尾）。 |

```json
{
  "use": "Garrote",
  "name": "锁喉",
  "note": ["在刷新窗口内刷新"],
  "when": [
    {"all": ["Garrote_DoT.down"], "comment": "没有流血"},
    {"all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"], "comment": "剩余 30% 及以下"}
  ]
}
```


同一个槽位可以出现在多条规则中：例如，列表靠上的潜行中的锁喉，以及靠下的常规锁喉保持。

#### JSON 中的条件

每个条件都是一个 KRC 语法的字符串：`Garrote_DoT.down`、`Rupture_DoT.duration <= 25`、`Kingsbane.cd <= 3`、`Combo_Points >= 70`、`enemies >= 2`、`target.distance <= 8`、`cd == 1`。完整列表请参阅[条件](https://keyrota.app/documentation/zh/conditions)。

- 可以按名称（`Garrote_DoT`）或按编号引用：`buff1`、`slot3`、`resource4`。
- 字符串中的 ` and ` 会把它拆成两个条件：`"Combo_Points >= 70 and Energy >= 70"` 是两个条件，两者都计入 16 个条件的上限。
- 字符串中不能有 `#`，也不能换行。
- 条件由 KeyRota 自己的引擎解析，因此 JSON 和文本的含义始终一致。

### 名称

名称（`alias`）是光环、槽位和资源在条件和 `use` 中的称呼。

- 第一个字符是字母（任何文字均可）或 `_`，之后可以是字母、数字 `0–9` 和 `_`。可以使用汉字、西里尔字母等，但不能有空格、连字符和点：要写 `Fan_of_Knives`，而不是 `Fan-of-Knives`。
- 名称在所有光环、槽位和资源中必须唯一。
- 保留名称：`use`、`when`、`and`、`or`、`rotation`、`gcd`、`enemies`、`target`、`aoe`、`st`、`cd`、`defensives`、`ground_spells`、`movement`，以及 `buffN`、`slotN`、`resourceN` 形式的名称。
- 关键字只能小写：`use`、`or`、`.up`。`Use`、`OR` 和 `.UP` 都会报错。

**由 label 生成名称。** 如果没有 `alias`，KeyRota 会根据 `label` 生成名称：去掉方括号及其中的内容，保留字母和数字，其他字符都变为 `_`。例如，`"Garrote on target [703]"` 变为 `Garrote_on_target`，`"目标身上的锁喉 [703]"` 变为 `目标身上的锁喉`。如果名称为空或不可用，则变为 `Aura_N` 或 `Slot_N`；如果名称已被占用，则加上 `_2`、`_3`。如果规则引用了列表中不存在的 `buffN` 或 `slotN`，它们会被自动声明为 `Aura_N` 和 `Slot_N`。

### 必填字段和默认值

| 位置 | 必填 | 默认值 |
|---|---|---|
| 文件 | `format`、`version` | `title` `""`、`specID` `0`、`ignoreMainIcon` `true`、`enemies` `{"range": 8, "combatOnly": true}`、空列表 |
| 光环 | `n` | `alias` 由 `label` 生成、`label` `""`、`spell` `0` |
| 槽位 | `n` | `show` `"target"`、所有标记为 `false`、`spell` `0` |
| 规则 | `use` | `name` `""`、`note` `[]`、`when` `[]`（无条件） |
| 组 | `all`（非空） | `comment` `""` |

### 限制

| 项目 | 上限 |
|---|---|
| 光环 | 12（`n` 1–12） |
| 槽位 | 12（`n` 1–12） |
| 每条规则的“或”组 | 16 |
| 每个组的“且”条件 | 16 |
| 规则 | 不限 |
| 条件中的数值 | 整数 0–100 |
| `enemies.range` | 1–100 |
| `spell` | 0–100000000 |
| `specID` | 0–100000 |
| 资源 | 最多 99 个 |

恰好 16 个组、每组 16 个条件是允许的；17 个就会报错。

### 错误

有错误的循环完全不会加载：不存在部分执行。错误信息总会指出出错位置。在 JSON 中是路径：`rules[3].when[1]: 未知名称 Foo`（从零开始计数）。在构建器中是“规则 4，组 2：未知名称 Foo”（从一开始计数）。在 KRC 文本中是行号。

**JSON 结构：**

| 消息 | 原因 |
|---|---|
| `多余字段“offgcd”` | 字段拼写错误或未知（区分大小写：`offGcd`）。 |
| `缺少字段“format”` | 缺少必填字段。 |
| `format: 应为“keyrota-rotation”` | `format` 为其他值。 |
| `version: 需要版本 1` | 缺少 `version`，或其值小于 1。 |
| `slots[0]: 缺少编号 n（1–12）` | 槽位或光环没有 `n`。 |
| `slots[2].n: 数字超出 1..12` | `n` 超出范围。 |
| `slots[3]: 编号 4 已被占用` | 两个槽位（或两个光环）的 `n` 相同。 |
| `slots[1].show: 应为“target”或“combat”` | `show` 为其他值。 |
| `slots[0]: queue 只能与 offGcd 一起使用` | `queue: true` 而没有 `offGcd: true`。 |
| `rules[2].use: 没有槽位“Garotte”` | `use` 引用了不存在的槽位。 |
| `rules[0].when[1].all: 需要非空的条件列表` | 空组，或没有 `all`。 |
| `rules[0].when[0].all[2]: 条件为空，或包含 # 或换行符` | 条件字符串为空，或其中含有 `#`。 |
| `….spell: 应为整数` | 类型错误：用字符串代替数字、用 `true` 代替数字等。 |

**条件和声明**（与 KRC 文本中相同）：

| 代码 | 消息示例 | 原因 |
|---|---|---|
| `unknown_ref` | `未知名称 Foo` | 没有该名称的光环、槽位或资源。 |
| `unknown_ref` | `resource5 未声明` | 资源未在 `resources` 中声明。 |
| `wrong_kind` | `Garrote 是 slot，但需要 buff` | 对槽位使用了光环属性（`Garrote.up`），或反之。 |
| `bad_condition` | `无法解析条件 "Energy => 50"` | 条件或运算符有拼写错误。 |
| `bad_condition` | `"Garrote.distance <= 8"：只有 target 才有 distance` | 只有目标才有距离。 |
| `value_range` | `数值 120 超出 0..100` | 数值大于 100。没有负数和小数。 |
| `toggle_value` | `"cd >= 1"：开关只能为 == 0 或 == 1` | 开关只能用 `==` 与 0 或 1 比较。 |
| `bad_alias` | `无效名称 Fan-of-Knives` | 名称中有无效字符。 |
| `reserved_alias` | `名称 cd 为保留名称` | 使用了保留名称。 |
| `duplicate_alias` | `名称 Garrote 已声明` | 两个光环、槽位或资源同名。 |
| `index_range` | `buff13：编号超出 1..12` | 引用了大于 12 的编号。 |
| `too_many_groups` | `OR 组超过 16 个` | 规则中的组超过 16 个。 |
| `too_many_conditions` | `17 个条件在同一组中（最多 16 个）` | 组中的条件超过 16 个。 |

构建器还会报告“组中没有条件”（空组）、“未选择槽位”和“名称中不能有引号”。

### KRC 文本

KRC 文本是以行的形式表示的同一个循环。“文本和 JSON”页面会显示它，你也可以把它保存为 `.txt` 文件。文本和 JSON 可以相互转换，含义不会丢失。

*KRC 文本:*

```text
rotation "奇袭：最小示例"

buff1	Rupture_DoT = "目标身上的割裂 [1943]"
slot2	Rupture = "割裂"
slot4	Mutilate = "毁伤"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Rupture when  # 割裂
	Combo_Points >= 70 and Rupture_DoT.down  # 5+ 个连击点，没有流血

use Mutilate when  # 毁伤
```


#### 行

- 双引号之外的 `#` 表示注释开始，直到行尾。在 `"label"` 内部，`#` 是普通字符。
- 空行和只有注释的行会被跳过：描述和分隔线就是这样写的。
- 其他任何行都必须是声明、`use`、`or` 或条件行，否则会出现 `stray_line` 错误：`规则之外的行："…"（说明文字请以 # 开头）`。
- 各部分之间可以有任意数量的空格和制表符。规范格式在 `buffN`/`slotN` 之后以及条件行开头使用制表符。

#### 声明

只能写在第一个 `use` 之前：

```text
rotation "名称"                    # 可选，最多一次
buff1	Garrote_DoT = "目标身上的锁喉 [703]"   # 光环 1
slot1	Garrote = "锁喉"                         # 槽位 1
resource1	PlayerHP                               # 资源 1
```


`buffN` 和 `slotN` 为 1–12，`resourceN` 为 1–99。引号中的名称可以为空：`slot5	Filler = ""`。在第一个 `use` 之后写声明会导致 `late_declaration` 错误。

#### 规则

```text
use Rupture when  # 割裂
	Combo_Points >= 70 and Rupture_DoT.down  # 没有流血
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # 刷新窗口
```


- `use 槽位 when` 开始一条规则；该行上的注释就是动作名称。
- 每个条件行是一个组（条件用 `and` 连接）。组与组之间用只含单词 `or` 的一行分隔。
- 没有条件行的规则没有条件。
- 两个条件行之间没有 `or` 会导致 `split_group` 错误；`or` 位于开头、结尾或连续出现两次会导致 `empty_group` 错误。

#### 文本与 JSON 的对应关系

| 文本中 | JSON 中 |
|---|---|
| `rotation "…"` | `title` |
| 第一个 `use` 之前的 `# …` 行 | `notes` |
| `buffN` / `slotN` 行末尾的注释 | 光环 / 槽位的 `note` |
| 紧挨在 `use` 之前（以及规则的各组之间）的 `# …` 行 | 规则的 `note` |
| `use` 行上的注释 | 规则的 `name` |
| 条件行末尾的注释 | 组的 `comment` |
| 最后一条规则之后的 `# …` 行 | `footer` |
| —（文本中没有） | `specID`、`ignoreMainIcon`、`enemies`、`spell`、`show`、标记 |

注释块首尾的空行会被删除，中间的空行保留为 `""`。

### 导入和存储

- KeyRota 将循环保存在配置中。主窗口中的“导出”会保存 KeyRota 配置（JSON）及其循环；“导入”接受 KeyRota 配置和单独的循环 JSON。
- “新建”——“从文件…”接受含 KRC 文本的 `.txt`、循环 JSON 和 KeyRota 配置；“新建”——“从剪贴板”则从剪贴板读取同样的内容。
- 在构建器中：“文本和 JSON”页面上的“粘贴”或“打开…”会替换循环；如果新版本中没有相应设置，编号相同的槽位和光环会保留原有的 ID、“有目标时”/“战斗中”设置和标记。
- 纯文本循环（没有 JSON）会从 KeyRota 配置中已保存的 Better Assistant 配置获取槽位的 ID 和显示条件，光环的 ID 还可以从其名称中的 `[703]` 标记获取。

### 由 JSON 生成 Better Assistant 配置

构建器中的“根据槽位和光环生成”会根据循环 JSON 生成 Better Assistant 配置字符串：

- **12 个槽位**：槽位 N 为 `slots[n = N].spell`，按 `show` 显示。没有 ID 的槽位保持为空。
- **光环**从第一个开始按顺序排列：`auras[n = 1].spell`、`auras[n = 2].spell`……中间出现没有 ID 的光环会报错。
- **职业和专精**取自 `specID`。
- **敌人计数器**取自 `enemies.range` 和 `enemies.combatOnly`。
- 如果 KeyRota 配置中已有同一专精的 Better Assistant 配置，则保留它的其他设置以及相符的槽位和光环。

在游戏中：`/ba`——Profile——粘贴——Apply。

### JSON Schema

该格式的 Schema：[keyrota-rotation.schema.json](https://keyrota.app/documentation/keyrota-rotation.schema.json)（draft 2020-12）。它会检查字段、类型、范围、不带 `offGcd` 的 `queue`，以及条件字符串的格式。它不检查 `n` 和名称是否唯一、条件中的名称是否存在，也不检查按 ` and ` 拆分字符串后的 16 个条件上限：这些由 KeyRota 在加载时检查。

校验文件：

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


不要在循环文件中加入 `"$schema"` 字段：KeyRota 会把它视为多余字段。

---

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

## 条件

条件就是一项检查：“目标身上有锁喉”“能量至少 70%”“Burst 已开启”。条件组成组（且），组组成规则（或）。在构建器中，你从列表中选择条件；在 KRC 文本和 JSON 中，条件写成字符串，下文的示例展示的就是这种写法。

### 语法

| 类型 | 形式 | 示例 |
|---|---|---|
| 光环：存在 / 不存在 | `Aura.up`、`Aura.down` | `Garrote_DoT.down` |
| 光环：剩余时间、层数 | `Aura.duration op N`、`Aura.stacks op N` | `Rupture_DoT.duration <= 30` |
| 槽位：就绪 / 未就绪 | `Slot.ready`、`Slot.oncd` | `Kingsbane.ready` |
| 槽位：冷却、充能 | `Slot.cd op N`、`Slot.charges op N` | `Deathmark.cd <= 3` |
| 槽位：高亮 | `Slot.glow`、`Slot.noglow` | `Ambush.glow` |
| 资源 | `Resource op N` | `Combo_Points >= 70` |
| 附近敌人数 | `enemies op N` | `enemies >= 3` |
| 与目标的距离 | `target.distance op N` | `target.distance <= 8` |
| 开关 | `aoe`、`st`、`cd`、`defensives`、`ground_spells`、`movement` `== 0` 或 `== 1` | `cd == 1` |

**运算符：** `<`、`<=`、`==`、`=`（与 `==` 相同）、`>=`、`>`。没有“不等于”。

**数值** `N` 是 0 到 100 的整数。不能为负数或小数，也不能大于 100：`数值 120 超出 0..100`。

**空格**：运算符两边的空格可写可不写：`Energy>=70` 和 `Energy >= 70` 相同。名称内部以及名称与属性之间不能有空格：要写 `Garrote_DoT.up`，而不是 `Garrote_DoT .up`。

**引用**可以按名称（`Garrote_DoT`）或按编号：`buff1`、`slot3`、`resource4`。关键字均为小写。

### 光环

光环是你自己的增益效果或你在目标身上的减益效果，在光环列表中以其 ID 声明。其他玩家的增益和减益效果不可见。

#### .up 和 .down

`Envenom_Buff.up`：光环存在。`Envenom_Buff.down`：光环不存在。如果光环未知（未读取到），两者都为假。

```text
use Garrote when  # 锁喉：没有时施放
	Garrote_DoT.down
```


#### .duration：以百分比表示的剩余时间

`Rupture_DoT.duration <= 30`：光环剩余时间不超过其**完整**持续时间的 30%。完整持续时间是指这一次施放时获得的持续时间：5 个连击点的割裂持续 24 秒，7 个连击点的持续 32 秒，因此 30% 分别是 7.2 秒和 9.6 秒。

> [!IMPORTANT]
> 不存在的光环剩余时间为 **0**。因此，即使目标身上根本没有割裂，`Rupture_DoT.duration <= 30` 也成立。如果只想刷新已存在的光环，请写 `Rupture_DoT.up and Rupture_DoT.duration <= 30`，并用单独一个含 `Rupture_DoT.down` 的组来处理“光环不存在”的情况。

魔兽世界中的刷新窗口（pandemic）是持续时间的 30%：在这个窗口内刷新不会有任何损失。因此常用的阈值是 `<= 30`。

*KRC 文本:*

```text
use Rupture when  # 割裂
	Combo_Points >= 70 and Rupture_DoT.down  # 没有流血
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # 刷新窗口
```

*JSON:*

```json
{
  "use": "Rupture",
  "name": "割裂",
  "when": [
    {"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "没有流血"},
    {"all": ["Combo_Points >= 70", "Rupture_DoT.up", "Rupture_DoT.duration <= 30"], "comment": "刷新窗口"}
  ]
}
```


秒数换算为百分比：`百分比 = 秒数 / 完整持续时间 × 100`。锁喉持续 18 秒：“剩余 14 秒”是 `<= 78`，“剩余 5.4 秒”是 `<= 30`。

**没有持续时间的光环**（潜行等）的剩余时间始终读作 **1**。对这类光环只使用 `.up` 和 `.down`。

#### .stacks：层数

`Opportunity.stacks >= 6`：光环有 6 层或更多。不存在的光环层数为 0。

> [!NOTE]
> 层数从 2 开始计：只有 1 层的光环读作 **0**，与没有计数的光环相同。要检查光环是否存在，请使用 `.up`；`.stacks` 用于 2 层及以上的阈值。

```text
use Pistol_Shot when  # 可乘之机达到 6 层时的手枪射击
	Opportunity.stacks >= 6 and Combo_Points < 80
```


### 槽位

槽位条件读取的是**另一个**按钮的状态：例如“只在死亡印记尚未就绪时按毒伤”。规则自身的槽位会被自动检查：如果它的法术无法使用，KeyRota 就直接检查下一条规则。

#### .ready 和 .oncd

`Kingsbane.ready`：该槽位的法术可以使用（不考虑公共冷却）。这需要同时满足：

- 已学会该法术（已点出相应天赋）；
- 资源足够；
- 如果需要目标，目标在射程内；
- 冷却剩余不到 0.2 秒，或有可用的充能；
- Better Assistant 显示该槽位（“有目标时”：你有目标；“战斗中”：你处于战斗中）。

`Kingsbane.oncd`：槽位因上述**任何**原因**未就绪**，而不仅仅是因为冷却。如果状态未知，两者都为假。

```text
use Preparation when  # 冲动、正中眉心和影舞步都在冷却时使用伺机待发
	Adrenaline_Rush.oncd and Between_the_Eyes.oncd and Killing_Spree.oncd
```


#### .cd：以百分比表示的剩余冷却

`Deathmark.cd <= 3`：剩余冷却不超过完整冷却时间的 3%。`0` 表示就绪，`100` 表示刚刚使用。不包括公共冷却。对于有充能的法术，`.cd` 是**下一层**充能的恢复进度，因此法术在 `cd > 0` 时也可能已经就绪。

| 冷却时间 | 1% = | 示例 |
|---|---|---|
| 30 秒 | 0.3 秒 | `X.cd <= 10`：剩余 ≤ 3 秒 |
| 1 分钟 | 0.6 秒 | `Kingsbane.cd <= 3`：剩余 ≤ 1.8 秒 |
| 2 分钟 | 1.2 秒 | `Deathmark.cd <= 3`：剩余 ≤ 3.6 秒；`Deathmark.cd >= 44`：还剩 ≥ 52 秒 |
| 3 分钟 | 1.8 秒 | `X.cd >= 50`：还剩 ≥ 90 秒 |

典型用法是“为大冷却技能保留”：如果死亡印记即将冷却完毕，就先不用君王之灾；如果离死亡印记还很久，就用掉它。

```text
use Kingsbane when  # 君王之灾
	cd == 1 and Deathmark_DoT.up  # 目标身上有死亡印记
	or
	cd == 1 and Deathmark.cd >= 44  # 距离死亡印记还有 52 秒以上
```


#### .charges

`Barbed_Shot.charges >= 2`：该法术有 2 层或更多充能。没有充能的法术为 0。典型模式是避免充能溢出：

```text
use Barbed_Shot when  # 倒刺射击
	Barbed_Shot.charges >= 2  # 两层充能都在：不要浪费充能恢复时间
	or
	Barbed_Shot.charges == 1 and Barbed_Shot.cd <= 20  # 第二层快好了
```


#### .glow 和 .noglow：按钮高亮

`Ambush.glow`：游戏高亮了该法术的按钮（就是触发效果时你在动作条上看到的那种高亮）。`Ambush.noglow`：没有高亮。只有当该法术的按钮在游戏中确实会高亮时才使用 `.glow`；如果不确定，请改为检查触发效果的增益：`Blindside.up`。

### 资源

`Energy >= 70`：能量至少为最大值的 70%。**所有资源都是百分比**，范围为 0 到 100：生命值、能量、法力值、怒气、符文、连击点数。

| 资源 | 编号 | 示例 |
|---|---|---|
| 玩家生命值 | `resource1`（`PlayerHP`） | `PlayerHP <= 40`：生命值 40% 及以下 |
| 目标生命值 | `resource2`（`TargetHP`） | `TargetHP >= 50`：目标生命值还没降到一半。没有目标时未知 |
| 专精资源 | 从 `resource3` 起 | `Energy >= 70`、`Combo_Points >= 70`、`Rage >= 40` |

**换算为百分比：** `百分比 = 数值 / 最大值 × 100`。能量上限为 250 时，175 点能量是 70%。能量和其他资源的上限会随天赋变化，因此以百分比表示的阈值比原始数值更容易在不同角色之间通用。

**连击点数。** 连击点上限为 7 时，一点约为 14.3%。该值会取整为整数，取决于取整方式，2 点读作 28 或 29，3 点读作 42 或 43，6 点读作 85 或 86。因此请把阈值设在**两档之间的中点**：这样无论怎样取整都正确。

| 连击点 | % | “至少 N 点” | “至多 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` | — |

对于其他上限，“至少 N 点”为 `(N − 0.5) / 上限 × 100`。连击点上限为 5 时，“至少 4 点”为 `>= 70`，“至少 5 点”为 `>= 90`。

### 附近敌人数

`enemies >= 3`：计数半径内有 3 个或更多敌人。半径和“仅计入战斗中的敌人”在“常规”页面上设置（JSON 中为 `enemies.range` 和 `enemies.combatOnly`）。如果数量未知，条件为假。

- 要统计敌人，游戏中必须开启敌方姓名板（默认按 V 键），并且不隐藏次要敌人。
- 根据你的技能选择半径：刀扇的作用范围是 8 码，因此对于“刀扇还是毁伤”来说，8 码才是准确的半径。
- 对于单体，`enemies <= 1` 比 `enemies == 1` 更稳妥：即使敌人未被统计，规则也能继续工作。

### 与目标的距离

`target.distance <= 8`：目标距离 8 码或更近。没有目标时距离未知，条件为假。距离是近似值：只有当距离确定满足阈值时，条件才成立；在临界情况下为假。

```text
use Pistol_Shot when  # 目标在近战范围外，但在 20 码以内
	target.distance >= 10 and target.distance <= 20
```


### 面板开关

开关是游戏上方快速设置面板中的按钮，并配有快捷键。它们的含义由循环决定。

| 条件 | 面板按钮 | 按键：Windows、macOS | 常见含义 |
|---|---|---|---|
| `aoe == 1` | 目标：群体 | F2、⌃⇧T，循环切换 | 强制多目标模式 |
| `st == 1` | 目标：单体 | F2、⌃⇧T，循环切换 | 强制单体 |
| `aoe == 0 and st == 0` | 目标：自动 | F2、⌃⇧T，循环切换 | 由规则决定，通常依据 `enemies` |
| `cd == 1` | Burst | F3、⌃⇧B | 大冷却技能：现在使用还是保留 |
| `defensives == 1` | 治疗 / 防御 | — | 治疗和防御技能 |
| `ground_spells == 1` | 地面法术 | — | 需要选择地面位置的法术 |
| `movement == 1` | 移动 | — | 移动中的操作 |

- 只能与 `== 0` 或 `== 1` 比较。
- **`cd == 1` 是 Burst 按钮，而不是法术的冷却。** 槽位的冷却是 `Slot.cd`。
- `aoe` 和 `st` 永远不会同时为 1。目标模式键会依次切换“自动”“单体”“群体”。
- 默认情况下，Burst 开启，目标模式为“自动”，其他按钮关闭。KeyRota 会记住它们的状态。
- 只有循环读取了某个开关，面板上对应的按钮才可用；使用 Blizzard 配置时，所有按钮都显示为灰色。
- 开关永远不会是未知值。

### 条件如何求值

| 条件 | 有值 | 光环不存在 | 未知 |
|---|---|---|---|
| `X.up` | 真 | 假 | **假** |
| `X.down` | 假 | 真 | **假** |
| `X.duration op N`、`X.stacks op N` | 比较 | 与 **0** 比较 | **假** |
| `X.ready` / `X.oncd` | 按就绪状态 | — | **假**（两者） |
| `X.glow` / `X.noglow` | 按高亮状态 | — | **假**（两者） |
| `X.cd`、`X.charges`、资源、`enemies`、`target.distance` | 比较 | — | **假** |
| 开关 | 比较 | — | 不会未知 |

组内所有条件都为真时，组为真。至少一个组为真，或者规则根本没有组时，规则成立。

### “非”、括号和组内的“或”

KRC 中没有 `not`、`!=` 和括号。所有逻辑都用组来表达：

- **“非”**就是配对的条件：非 `.up` 即 `.down`，非 `.ready` 即 `.oncd`，非 `.glow` 即 `.noglow`；对于数值，使用相反的运算符：非 `>= 70` 即 `< 70`。
- **(A 或 B) 且 C** 是两个组：`A and C`、`B and C`。
- **A 且 非 (B 且 C)** 是两个组：`A and 非B`、`A and 非C`。
- **每个组中都相同的条件**（例如引导保护）需要在每个组中重复。

```text
use Fan_of_Knives when  # 刀扇：（“群体”模式 或 “自动”且 2+ 个敌人）且 少于 5 个连击点
	aoe == 1 and Combo_Points < 70
	or
	st == 0 and enemies >= 2 and Combo_Points < 70
```


### 速查表

| 条件 | 含义 |
|---|---|
| `X.up` / `X.down` | 光环存在 / 不存在 |
| `X.duration <= 30` | 剩余 ≤ 30%（不存在的光环为 0） |
| `X.up and X.duration <= 30` | 存在且需要刷新 |
| `X.stacks >= 2` | 2 层或更多（1 层读作 0） |
| `X.ready` / `X.oncd` | 槽位就绪 / 因任何原因未就绪 |
| `X.cd <= 3` | 剩余冷却 ≤ 3% |
| `X.charges >= 2` | 2 层或更多充能 |
| `X.glow` / `X.noglow` | 按钮高亮 / 未高亮 |
| `PlayerHP <= 40` | 你的生命值 ≤ 40% |
| `TargetHP >= 50` | 目标生命值 ≥ 50%（没有目标时为假） |
| `Combo_Points >= 70` | 5+ 个连击点（上限 7） |
| `Energy >= 70` | 能量 ≥ 70% |
| `enemies >= 3` | 半径内有 3+ 个敌人 |
| `target.distance <= 8` | 目标在 8 码以内（没有目标时为假） |
| `aoe == 1` / `st == 1` | “群体” / “单体”模式 |
| `aoe == 0 and st == 0` | “自动”模式 |
| `cd == 1` | Burst 开启 |
| `defensives == 1` | “治疗 / 防御”开启 |
| `ground_spells == 1` | “地面法术”开启 |
| `movement == 1` | “移动”开启 |

---

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

## 模式示例

每个模式都是一个小而完整的循环：左侧是 KRC 文本，右侧是对应的 JSON。把它粘贴到构建器中（“文本和 JSON”——“粘贴”），即可看到它在“槽位”和“规则”页面上的样子。法术 ID 均为真实 ID，取自 Wowhead。文末有[完整循环](#example-files)。

### 在刷新窗口内刷新的 DoT

DoT 不存在时施放，剩余 30% 及以下时刷新：在这个窗口内刷新不会有任何损失。不存在的光环剩余时间为 0，因此刷新要用一个带 `.up` 的单独组。

*KRC 文本:*

```text
rotation "模式：带刷新窗口的 DoT"

buff1	Garrote_DoT = "目标身上的锁喉 [703]"
slot1	Garrote = "锁喉"
slot4	Mutilate = "毁伤"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Garrote when  # 锁喉
	Garrote_DoT.down  # 没有流血
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30  # 刷新窗口

use Mutilate when  # 毁伤
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "模式：带刷新窗口的 DoT",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "目标身上的锁喉 [703]", "spell": 703}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "锁喉", "spell": 703},
    {"n": 4, "alias": "Mutilate", "label": "毁伤", "spell": 1329}
  ],
  "rules": [
    {"use": "Garrote", "name": "锁喉", "when": [
      {"all": ["Garrote_DoT.down"], "comment": "没有流血"},
      {"all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"], "comment": "刷新窗口"}
    ]},
    {"use": "Mutilate", "name": "毁伤"}
  ]
}
```


- 在 3+ 个目标时，为了避免给快死的目标上新 DoT，可以在“没有流血”组中加上 `TargetHP >= 50`，并为一到两个目标另加一个 `Garrote_DoT.down and enemies <= 2` 组。
- 持续时间可变的长 DoT（割裂：4 秒 + 每个连击点 4 秒）也是同样的写法：百分比按这一次施放的持续时间计算。

### 按连击点数使用生成技能和消耗技能

7 点连击点中达到 5 点以上时使用消耗技能，否则使用生成技能。阈值设在两档之间的中点，见[连击点数对照表](https://keyrota.app/documentation/zh/conditions#resources)。

*KRC 文本:*

```text
rotation "模式：生成技能与消耗技能"

slot3	Envenom = "毒伤"
slot4	Mutilate = "毁伤"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Envenom when  # 毒伤
	Combo_Points >= 70  # 5+ 个连击点

use Mutilate when  # 毁伤
	Combo_Points < 70  # 少于 5 个连击点
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "模式：生成技能与消耗技能",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 3, "alias": "Envenom", "label": "毒伤", "spell": 32645},
    {"n": 4, "alias": "Mutilate", "label": "毁伤", "spell": 1329}
  ],
  "rules": [
    {"use": "Envenom", "name": "毒伤", "when": [
      {"all": ["Combo_Points >= 70"], "comment": "5+ 个连击点"}
    ]},
    {"use": "Mutilate", "name": "毁伤", "when": [
      {"all": ["Combo_Points < 70"], "comment": "少于 5 个连击点"}
    ]}
  ]
}
```


带 `Combo_Points < 70` 的生成技能不会让连击点溢出：达到 5 点以上时，即使消耗技能还没就绪（能量不足），它也不会触发，KeyRota 会等待。

### 资源积攒

不要立刻消耗，而是保持增益效果并积攒能量：在毒伤增益快结束时、目标身上有死亡印记时或能量充足时使用毒伤。其余时间，在 5 个以上连击点时没有规则符合，KeyRota 会等待更多能量：这就是资源积攒（攒能量）。

*KRC 文本:*

```text
rotation "模式：攒能量"

buff3	Envenom_Buff = "毒伤 [32645]"
buff4	Deathmark_DoT = "目标身上的死亡印记 [360194]"
slot3	Envenom = "毒伤"
slot4	Mutilate = "毁伤"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Envenom when  # 毒伤
	Combo_Points >= 70 and Envenom_Buff.down  # 没有增益
	or
	Combo_Points >= 70 and Envenom_Buff.duration <= 20  # 增益快结束
	or
	Combo_Points >= 70 and Deathmark_DoT.up  # 目标身上有死亡印记
	or
	Combo_Points >= 70 and Energy >= 70  # 避免能量溢出

use Mutilate when  # 毁伤
	Combo_Points < 70
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "模式：攒能量",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 3, "alias": "Envenom_Buff", "label": "毒伤 [32645]", "spell": 32645},
    {"n": 4, "alias": "Deathmark_DoT", "label": "目标身上的死亡印记 [360194]", "spell": 360194}
  ],
  "slots": [
    {"n": 3, "alias": "Envenom", "label": "毒伤", "spell": 32645},
    {"n": 4, "alias": "Mutilate", "label": "毁伤", "spell": 1329}
  ],
  "rules": [
    {"use": "Envenom", "name": "毒伤", "when": [
      {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "没有增益"},
      {"all": ["Combo_Points >= 70", "Envenom_Buff.duration <= 20"], "comment": "增益快结束"},
      {"all": ["Combo_Points >= 70", "Deathmark_DoT.up"], "comment": "目标身上有死亡印记"},
      {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "避免能量溢出"}
    ]},
    {"use": "Mutilate", "name": "毁伤", "when": [
      {"all": ["Combo_Points < 70"]}
    ]}
  ]
}
```


- 阈值 `Energy >= 70` 可以避免能量溢出。
- `Envenom_Buff.duration <= 20` 组在没有增益时（剩余 0）也会触发；`.down` 组只是为了清晰起见。
- 调整积攒行为只需修改能量阈值：调低会更早消耗，调高会积攒更久。

### 单目标和多目标

玩家用目标模式键设置目标模式（依次切换“自动”“单体”“群体”）；在“自动”模式下，由规则根据敌人数决定。每条 AoE 规则有两个组：“‘群体’模式”和“‘自动’模式且 2+ 个敌人”；单体规则则有“‘单体’模式”和“‘自动’模式且至多一个敌人”。

*KRC 文本:*

```text
rotation "模式：单目标与多目标"

slot3	Envenom = "毒伤"
slot4	Mutilate = "毁伤"
slot6	Fan_of_Knives = "刀扇"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Envenom when  # 毒伤
	Combo_Points >= 70

use Fan_of_Knives when  # 刀扇：2+ 个目标
	aoe == 1 and Combo_Points < 70  # “群体”模式
	or
	st == 0 and enemies >= 2 and Combo_Points < 70  # “自动”模式，2+ 个敌人

use Mutilate when  # 毁伤：单体
	st == 1 and Combo_Points < 70  # “单体”模式
	or
	aoe == 0 and enemies <= 1 and Combo_Points < 70  # “自动”模式，一个敌人
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "模式：单目标与多目标",
  "specID": 259,
  "enemies": {"range": 8, "combatOnly": true},
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 3, "alias": "Envenom", "label": "毒伤", "spell": 32645},
    {"n": 4, "alias": "Mutilate", "label": "毁伤", "spell": 1329},
    {"n": 6, "alias": "Fan_of_Knives", "label": "刀扇", "spell": 51723}
  ],
  "rules": [
    {"use": "Envenom", "name": "毒伤", "when": [
      {"all": ["Combo_Points >= 70"]}
    ]},
    {"use": "Fan_of_Knives", "name": "刀扇：2+ 个目标", "when": [
      {"all": ["aoe == 1", "Combo_Points < 70"], "comment": "“群体”模式"},
      {"all": ["st == 0", "enemies >= 2", "Combo_Points < 70"], "comment": "“自动”模式，2+ 个敌人"}
    ]},
    {"use": "Mutilate", "name": "毁伤：单体", "when": [
      {"all": ["st == 1", "Combo_Points < 70"], "comment": "“单体”模式"},
      {"all": ["aoe == 0", "enemies <= 1", "Combo_Points < 70"], "comment": "“自动”模式，一个敌人"}
    ]}
  ]
}
```


- `st == 0 and enemies >= 2` 表示“不是‘单体’模式”：在“群体”模式下，规则无论如何都会通过第一个组触发。
- `enemies <= 1` 比 `enemies == 1` 更稳妥：单目标时，敌人可能未被统计。
- 计数半径（`enemies.range`）取自你的 AoE 技能：刀扇的作用范围是 8 码。

### Burst 冷却技能与“只在冷却期间”

`cd == 1` 是 Burst 按钮。大冷却技能只在 Burst 开启时按下；关闭 Burst 就能保留它，例如在首领免疫的阶段之前。凡是能增强冷却窗口的技能都只在窗口期间按下：这里，消失只在目标身上有死亡印记时使用，君王之灾在目标身上有死亡印记或离死亡印记还很久时使用。

*KRC 文本:*

```text
rotation "模式：Burst"

buff1	Garrote_DoT = "目标身上的锁喉 [703]"
buff2	Rupture_DoT = "目标身上的割裂 [1943]"
buff4	Deathmark_DoT = "目标身上的死亡印记 [360194]"
buff10	Vanish_Buff = "消失 [11327]"
slot1	Garrote = "锁喉"
slot4	Mutilate = "毁伤"
slot8	Deathmark = "死亡印记"
slot9	Kingsbane = "君王之灾"
slot10	Vanish = "消失"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Garrote when  # 潜行中的锁喉
	Vanish_Buff.up

use Deathmark when  # 死亡印记
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up  # Burst 开启，流血都在

use Kingsbane when  # 君王之灾
	cd == 1 and Deathmark_DoT.up and Combo_Points < 50  # 目标身上有死亡印记，0-3 个连击点
	or
	cd == 1 and Deathmark.cd >= 44 and Combo_Points < 50  # 距离死亡印记还有 52 秒以上

use Vanish when  # 消失
	Deathmark_DoT.up and Combo_Points < 65  # 目标身上有死亡印记，0-4 个连击点

use Mutilate when  # 毁伤
	Combo_Points < 70
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "模式：Burst",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "目标身上的锁喉 [703]", "spell": 703},
    {"n": 2, "alias": "Rupture_DoT", "label": "目标身上的割裂 [1943]", "spell": 1943},
    {"n": 4, "alias": "Deathmark_DoT", "label": "目标身上的死亡印记 [360194]", "spell": 360194},
    {"n": 10, "alias": "Vanish_Buff", "label": "消失 [11327]", "spell": 11327}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "锁喉", "spell": 703},
    {"n": 4, "alias": "Mutilate", "label": "毁伤", "spell": 1329},
    {"n": 8, "alias": "Deathmark", "label": "死亡印记", "spell": 360194},
    {"n": 9, "alias": "Kingsbane", "label": "君王之灾", "spell": 385627},
    {"n": 10, "alias": "Vanish", "label": "消失", "spell": 1856, "offGcd": true, "queue": true}
  ],
  "rules": [
    {"use": "Garrote", "name": "潜行中的锁喉", "when": [
      {"all": ["Vanish_Buff.up"]}
    ]},
    {"use": "Deathmark", "name": "死亡印记", "when": [
      {"all": ["cd == 1", "Garrote_DoT.up", "Rupture_DoT.up"], "comment": "Burst 开启，流血都在"}
    ]},
    {"use": "Kingsbane", "name": "君王之灾", "when": [
      {"all": ["cd == 1", "Deathmark_DoT.up", "Combo_Points < 50"], "comment": "目标身上有死亡印记，0-3 个连击点"},
      {"all": ["cd == 1", "Deathmark.cd >= 44", "Combo_Points < 50"], "comment": "距离死亡印记还有 52 秒以上"}
    ]},
    {"use": "Vanish", "name": "消失", "when": [
      {"all": ["Deathmark_DoT.up", "Combo_Points < 65"], "comment": "目标身上有死亡印记，0-4 个连击点"}
    ]},
    {"use": "Mutilate", "name": "毁伤", "when": [
      {"all": ["Combo_Points < 70"]}
    ]}
  ]
}
```


- 消失不占 GCD，但同时开启了“法术队列窗口”（**O + Q**）：否则它会在君王之灾之后的 GCD 中途立即按下，此时君王之灾的连击点还没到账，检查的会是旧的数值。
- 关闭 Burst，死亡印记和君王之灾就会等待；消失则等待死亡印记。
- 君王之灾在 0–3 个连击点时使用：之后还会获得 5 点，一点都不会浪费。

### 引导保护

游戏会在最后一击之前稍早结束某些引导，此时下一次按键就会打断引导。保护手段是引导自身的光环：只要它的剩余时间超过 8%，任何规则都不成立。该条件要加到每条规则的**每个**组中。引导槽位上的标记 **C** 可以防止在引导开始时重复按下。

*KRC 文本:*

```text
rotation "模式：引导保护"

buff10	Killing_Spree_Buff = "影舞步，引导 [51690]"
slot8	Killing_Spree = "影舞步"
slot9	Dispatch = "斩击"
slot11	Sinister_Strike = "影袭"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Killing_Spree when  # 影舞步
	Combo_Points >= 80 and Killing_Spree_Buff.duration <= 8

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

use Sinister_Strike when  # 影袭
	Combo_Points < 80 and Killing_Spree_Buff.duration <= 8
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "模式：引导保护",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 10, "alias": "Killing_Spree_Buff", "label": "影舞步，引导 [51690]", "spell": 51690}
  ],
  "slots": [
    {"n": 8, "alias": "Killing_Spree", "label": "影舞步", "spell": 51690, "channel": true},
    {"n": 9, "alias": "Dispatch", "label": "斩击", "spell": 2098},
    {"n": 11, "alias": "Sinister_Strike", "label": "影袭", "spell": 193315}
  ],
  "rules": [
    {"use": "Killing_Spree", "name": "影舞步", "when": [
      {"all": ["Combo_Points >= 80", "Killing_Spree_Buff.duration <= 8"]}
    ]},
    {"use": "Dispatch", "name": "斩击", "when": [
      {"all": ["Combo_Points >= 80", "Killing_Spree_Buff.duration <= 8"]}
    ]},
    {"use": "Sinister_Strike", "name": "影袭", "when": [
      {"all": ["Combo_Points < 80", "Killing_Spree_Buff.duration <= 8"]}
    ]}
  ]
}
```


- 为什么用 `<= 8` 而不是 `.down`：没有引导时光环剩余为 0，条件成立；引导期间，它只等待最后 8%，而不会在引导结束后再多等零点几秒。
- 如果光环未被读取，条件在每条规则中都为假，KeyRota 什么也不按：宁可少按一次，也不要打断引导。因此，引导的光环必须在 Better Assistant 配置中。

### 法术队列窗口内的不占 GCD 宏

“不占 GCD”有两种：
- **O**：按钮立即按下，即使正处于 GCD 中。时运继延（延长命运骨骰）就是这样做到不浪费时间的。
- **O + Q**：按钮本身不占 GCD，但它的宏或结果依赖 GCD。第二行是影舞步（占用 GCD）的冲动宏会在 GCD 即将结束时的法术队列窗口内按下，影舞步紧接着冲动施放。

*游戏中的宏（槽位 1）:*

```text
#showtooltip 冲动
/cast 冲动
/cast 影舞步
```


*KRC 文本:*

```text
rotation "模式：不占 GCD"

buff2	Triple_Threat = "命运骨骰，3 级 [1214935]"
buff3	Jackpot = "命运骨骰，4 级 [1214937]"
buff6	Adrenaline_Rush_Buff = "冲动 [13750]"
slot1	Adrenaline_Rush = "冲动 + 影舞步（宏）"
slot4	Keep_It_Rolling = "时运继延"
slot11	Sinister_Strike = "影袭"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Adrenaline_Rush when  # 冲动（宏里带影舞步）
	Adrenaline_Rush_Buff.down and Combo_Points >= 7 and Combo_Points < 80  # 1-5 个连击点：0 点时宏里的影舞步放不出来

use Keep_It_Rolling when  # 时运继延
	Triple_Threat.up
	or
	Jackpot.up

use Sinister_Strike when  # 影袭
	Combo_Points < 80
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "模式：不占 GCD",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 2, "alias": "Triple_Threat", "label": "命运骨骰，3 级 [1214935]", "spell": 1214935},
    {"n": 3, "alias": "Jackpot", "label": "命运骨骰，4 级 [1214937]", "spell": 1214937},
    {"n": 6, "alias": "Adrenaline_Rush_Buff", "label": "冲动 [13750]", "spell": 13750}
  ],
  "slots": [
    {"n": 1, "alias": "Adrenaline_Rush", "label": "冲动 + 影舞步（宏）", "spell": 13750, "offGcd": true, "queue": true},
    {"n": 4, "alias": "Keep_It_Rolling", "label": "时运继延", "spell": 381989, "offGcd": true},
    {"n": 11, "alias": "Sinister_Strike", "label": "影袭", "spell": 193315}
  ],
  "rules": [
    {"use": "Adrenaline_Rush", "name": "冲动（宏里带影舞步）", "when": [
      {"all": ["Adrenaline_Rush_Buff.down", "Combo_Points >= 7", "Combo_Points < 80"], "comment": "1-5 个连击点：0 点时宏里的影舞步放不出来"}
    ]},
    {"use": "Keep_It_Rolling", "name": "时运继延", "when": [
      {"all": ["Triple_Threat.up"]},
      {"all": ["Jackpot.up"]}
    ]},
    {"use": "Sinister_Strike", "name": "影袭", "when": [
      {"all": ["Combo_Points < 80"]}
    ]}
  ]
}
```


宏槽位的 ID 是宏中主法术的 ID（冲动，13750）：Better Assistant 据此把宏的法术放入槽位，KeyRota 则从你动作条上的宏按钮读取按键。

### 按生命值使用防御技能

生命值低于阈值时使用治疗或防御技能，且只在面板上的“治疗 / 防御”开启时使用。该槽位**在战斗中**显示（“战斗中”，`"show": "combat"`），这样没有目标时也能使用。这条规则放在最前：生命值低时，它比伤害更重要。

*KRC 文本:*

```text
rotation "模式：按生命值使用防御技能"

slot4	Mutilate = "毁伤"
slot11	Crimson_Vial = "猩红之瓶"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Crimson_Vial when  # 猩红之瓶
	defensives == 1 and PlayerHP <= 40  # 生命值 40% 及以下

use Mutilate when  # 毁伤
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "模式：按生命值使用防御技能",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 4, "alias": "Mutilate", "label": "毁伤", "spell": 1329},
    {"n": 11, "alias": "Crimson_Vial", "label": "猩红之瓶", "spell": 185311, "show": "combat"}
  ],
  "rules": [
    {"use": "Crimson_Vial", "name": "猩红之瓶", "when": [
      {"all": ["defensives == 1", "PlayerHP <= 40"], "comment": "生命值 40% 及以下"}
    ]},
    {"use": "Mutilate", "name": "毁伤"}
  ]
}
```


“治疗 / 防御”默认关闭：想要自动使用防御技能时，请在快速设置面板上开启它。

### 触发效果：按增益或按高亮

按增益效果检查触发：在奇袭团队副本循环中，侧袭增益（`Blindside.up`）允许伏击规则触发。如果游戏会在触发时高亮按钮，规则也可以读取高亮（`Ambush.glow`），但前提是你在动作条上确实看到了这种高亮。

*KRC 文本:*

```text
rotation "模式：触发效果"

buff7	Blindside = "侧袭 [121153]"
slot4	Mutilate = "毁伤"
slot5	Ambush = "伏击"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Ambush when  # 伏击（侧袭）
	Blindside.up and Combo_Points < 70

use Mutilate when  # 毁伤
	Combo_Points < 70
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "模式：触发效果",
  "specID": 259,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 7, "alias": "Blindside", "label": "侧袭 [121153]", "spell": 121153}
  ],
  "slots": [
    {"n": 4, "alias": "Mutilate", "label": "毁伤", "spell": 1329},
    {"n": 5, "alias": "Ambush", "label": "伏击", "spell": 8676}
  ],
  "rules": [
    {"use": "Ambush", "name": "伏击（侧袭）", "when": [
      {"all": ["Blindside.up", "Combo_Points < 70"]}
    ]},
    {"use": "Mutilate", "name": "毁伤", "when": [
      {"all": ["Combo_Points < 70"]}
    ]}
  ]
}
```


### 充能

有充能的法术在有两层充能或第二层快恢复时按下，这样它的充能恢复永远不会闲置。示例：猎人的倒刺射击（2 层充能）。

*KRC 文本:*

```text
rotation "模式：充能"

slot1	Barbed_Shot = "倒刺射击"
slot2	Kill_Command = "杀戮命令"
resource1	PlayerHP
resource2	TargetHP
resource3	Focus

use Barbed_Shot when  # 倒刺射击
	Barbed_Shot.charges >= 2  # 两层充能
	or
	Barbed_Shot.charges == 1 and Barbed_Shot.cd <= 20  # 第二层快好了

use Kill_Command when  # 杀戮命令
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "模式：充能",
  "specID": 253,
  "resources": ["PlayerHP", "TargetHP", "Focus"],
  "slots": [
    {"n": 1, "alias": "Barbed_Shot", "label": "倒刺射击", "spell": 217200},
    {"n": 2, "alias": "Kill_Command", "label": "杀戮命令", "spell": 34026}
  ],
  "rules": [
    {"use": "Barbed_Shot", "name": "倒刺射击", "when": [
      {"all": ["Barbed_Shot.charges >= 2"], "comment": "两层充能"},
      {"all": ["Barbed_Shot.charges == 1", "Barbed_Shot.cd <= 20"], "comment": "第二层快好了"}
    ]},
    {"use": "Kill_Command", "name": "杀戮命令"}
  ]
}
```


对于有充能的法术，`.cd` 是下一层充能的恢复进度：`Barbed_Shot.cd <= 20` 表示它的充能恢复还剩不超过 20%。

### 与目标的距离

当目标超出近战范围、但仍在远程技能射程内时，按远程技能，而不是闲着。没有目标时距离未知，规则不会触发。

*KRC 文本:*

```text
rotation "模式：距离"

slot10	Pistol_Shot = "手枪射击"
slot11	Sinister_Strike = "影袭"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Pistol_Shot when  # 手枪射击：目标较远
	target.distance >= 10 and target.distance <= 20 and Combo_Points < 80

use Sinister_Strike when  # 影袭
	Combo_Points < 80
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "模式：距离",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 10, "alias": "Pistol_Shot", "label": "手枪射击", "spell": 185763},
    {"n": 11, "alias": "Sinister_Strike", "label": "影袭", "spell": 193315}
  ],
  "rules": [
    {"use": "Pistol_Shot", "name": "手枪射击：目标较远", "when": [
      {"all": ["target.distance >= 10", "target.distance <= 20", "Combo_Points < 80"]}
    ]},
    {"use": "Sinister_Strike", "name": "影袭", "when": [
      {"all": ["Combo_Points < 80"]}
    ]}
  ]
}
```


近战规则不需要检查距离：如果目标太远，法术无法使用，KeyRota 会自动检查下一条规则。

### 移动

面板上的“移动”按钮是你给循环的信号：“我马上要跑位了”。由循环决定该怎么做，例如改用远程技能。

*KRC 文本:*

```text
rotation "模式：移动"

slot10	Pistol_Shot = "手枪射击"
slot11	Sinister_Strike = "影袭"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

use Pistol_Shot when  # 移动中的手枪射击
	movement == 1 and Combo_Points < 80

use Sinister_Strike when  # 影袭
	movement == 0 and Combo_Points < 80
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "模式：移动",
  "specID": 260,
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "slots": [
    {"n": 10, "alias": "Pistol_Shot", "label": "手枪射击", "spell": 185763},
    {"n": 11, "alias": "Sinister_Strike", "label": "影袭", "spell": 193315}
  ],
  "rules": [
    {"use": "Pistol_Shot", "name": "移动中的手枪射击", "when": [
      {"all": ["movement == 1", "Combo_Points < 80"]}
    ]},
    {"use": "Sinister_Strike", "name": "影袭", "when": [
      {"all": ["movement == 0", "Combo_Points < 80"]}
    ]}
  ]
}
```


### 地面目标法术

“地面法术”按钮允许使用需要放置在地面上的法术。KeyRota 只负责按键，因此位置由宏决定：`[@player]` 表示脚下，`[@cursor]` 表示鼠标指针处。

*游戏中的宏:*

```text
#showtooltip 枯萎凋零
/cast [@player] 枯萎凋零
```


*KRC 文本:*

```text
rotation "模式：地面法术"

slot1	Death_and_Decay = "枯萎凋零（宏 @player）"
resource1	PlayerHP
resource2	TargetHP
resource3	Runes
resource4	Runic_Power

use Death_and_Decay when  # 枯萎凋零
	ground_spells == 1 and enemies >= 2  # “地面法术”开启，2+ 个敌人
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "模式：地面法术",
  "specID": 250,
  "resources": ["PlayerHP", "TargetHP", "Runes", "Runic_Power"],
  "slots": [
    {"n": 1, "alias": "Death_and_Decay", "label": "枯萎凋零（宏 @player）", "spell": 43265}
  ],
  "rules": [
    {"use": "Death_and_Decay", "name": "枯萎凋零", "when": [
      {"all": ["ground_spells == 1", "enemies >= 2"], "comment": "“地面法术”开启，2+ 个敌人"}
    ]}
  ]
}
```


### 完整的入门循环

来自[构建器示例](https://keyrota.app/documentation/zh/editor#walkthrough)的循环：两个 DoT、一个生成技能、一个带攒能量逻辑的消耗技能、一个防御技能，以及由 Burst 控制的死亡印记。

*KRC 文本:*

```text
rotation "奇袭：示例 v1"

# KeyRota 文档中的示例：两个流血、一个生成技能、一个攒能量的消耗技能，
# 低生命值时的防御，以及由 Burst 按钮控制的死亡印记。
# 连击点按 7 点的百分比计：5 点 = 71%，阈值 70 = 5 点以上。

buff1	Garrote_DoT = "目标身上的锁喉 [703]"
buff2	Rupture_DoT = "目标身上的割裂 [1943]"
buff3	Envenom_Buff = "毒伤 [32645]"
buff4	Deathmark_DoT = "目标身上的死亡印记 [360194]"
slot1	Garrote = "锁喉"
slot2	Rupture = "割裂"
slot3	Envenom = "毒伤"
slot4	Mutilate = "毁伤"
slot5	Deathmark = "死亡印记"
slot6	Crimson_Vial = "猩红之瓶"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

# --- 防御：仅在“治疗 / 防御”开启时 ---
use Crimson_Vial when  # 猩红之瓶
	defensives == 1 and PlayerHP <= 40  # 生命值 40% 及以下

# --- 冷却技能：仅在 Burst 开启时 ---
use Deathmark when  # 死亡印记
	cd == 1 and Garrote_DoT.up and Rupture_DoT.up and Envenom_Buff.up  # Burst 开启，流血和毒伤都在

# --- 流血 ---
use Garrote when  # 锁喉
	Garrote_DoT.down  # 没有流血
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30  # 刷新窗口：剩余 30% 及以下

use Rupture when  # 割裂
	Combo_Points >= 70 and Rupture_DoT.down  # 5+ 个连击点，没有流血
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 30  # 5+ 个连击点，刷新窗口

# --- 消耗：5+ 个连击点，攒能量 ---
use Envenom when  # 毒伤
	Combo_Points >= 70 and Envenom_Buff.down  # 没有增益
	or
	Combo_Points >= 70 and Envenom_Buff.up and Envenom_Buff.duration <= 20  # 增益快结束
	or
	Combo_Points >= 70 and Energy >= 70  # 避免能量溢出
	or
	Combo_Points >= 70 and Deathmark_DoT.up  # 目标身上有死亡印记

# --- 生成技能：少于 5 个连击点 ---
use Mutilate when  # 毁伤
	Combo_Points < 70  # 少于 5 个连击点
```

*JSON:*

```json
{
  "format": "keyrota-rotation",
  "version": 1,
  "title": "奇袭：示例 v1",
  "specID": 259,
  "ignoreMainIcon": true,
  "enemies": {"range": 8, "combatOnly": true},
  "notes": [
    "KeyRota 文档中的示例：两个流血、一个生成技能、一个攒能量的消耗技能，",
    "低生命值时的防御，以及由 Burst 按钮控制的死亡印记。",
    "连击点按 7 点的百分比计：5 点 = 71%，阈值 70 = 5 点以上。"
  ],
  "resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"],
  "auras": [
    {"n": 1, "alias": "Garrote_DoT", "label": "目标身上的锁喉 [703]", "spell": 703},
    {"n": 2, "alias": "Rupture_DoT", "label": "目标身上的割裂 [1943]", "spell": 1943},
    {"n": 3, "alias": "Envenom_Buff", "label": "毒伤 [32645]", "spell": 32645},
    {"n": 4, "alias": "Deathmark_DoT", "label": "目标身上的死亡印记 [360194]", "spell": 360194}
  ],
  "slots": [
    {"n": 1, "alias": "Garrote", "label": "锁喉", "spell": 703, "show": "target"},
    {"n": 2, "alias": "Rupture", "label": "割裂", "spell": 1943, "show": "target"},
    {"n": 3, "alias": "Envenom", "label": "毒伤", "spell": 32645, "show": "target"},
    {"n": 4, "alias": "Mutilate", "label": "毁伤", "spell": 1329, "show": "target"},
    {"n": 5, "alias": "Deathmark", "label": "死亡印记", "spell": 360194, "show": "target"},
    {"n": 6, "alias": "Crimson_Vial", "label": "猩红之瓶", "spell": 185311, "show": "combat"}
  ],
  "rules": [
    {
      "use": "Crimson_Vial",
      "name": "猩红之瓶",
      "note": ["--- 防御：仅在“治疗 / 防御”开启时 ---"],
      "when": [{"all": ["defensives == 1", "PlayerHP <= 40"], "comment": "生命值 40% 及以下"}]
    },
    {
      "use": "Deathmark",
      "name": "死亡印记",
      "note": ["--- 冷却技能：仅在 Burst 开启时 ---"],
      "when": [
        {
          "all": ["cd == 1", "Garrote_DoT.up", "Rupture_DoT.up", "Envenom_Buff.up"],
          "comment": "Burst 开启，流血和毒伤都在"
        }
      ]
    },
    {
      "use": "Garrote",
      "name": "锁喉",
      "note": ["--- 流血 ---"],
      "when": [
        {"all": ["Garrote_DoT.down"], "comment": "没有流血"},
        {"all": ["Garrote_DoT.up", "Garrote_DoT.duration <= 30"], "comment": "刷新窗口：剩余 30% 及以下"}
      ]
    },
    {
      "use": "Rupture",
      "name": "割裂",
      "when": [
        {"all": ["Combo_Points >= 70", "Rupture_DoT.down"], "comment": "5+ 个连击点，没有流血"},
        {
          "all": ["Combo_Points >= 70", "Rupture_DoT.up", "Rupture_DoT.duration <= 30"],
          "comment": "5+ 个连击点，刷新窗口"
        }
      ]
    },
    {
      "use": "Envenom",
      "name": "毒伤",
      "note": ["--- 消耗：5+ 个连击点，攒能量 ---"],
      "when": [
        {"all": ["Combo_Points >= 70", "Envenom_Buff.down"], "comment": "没有增益"},
        {"all": ["Combo_Points >= 70", "Envenom_Buff.up", "Envenom_Buff.duration <= 20"], "comment": "增益快结束"},
        {"all": ["Combo_Points >= 70", "Energy >= 70"], "comment": "避免能量溢出"},
        {"all": ["Combo_Points >= 70", "Deathmark_DoT.up"], "comment": "目标身上有死亡印记"}
      ]
    },
    {
      "use": "Mutilate",
      "name": "毁伤",
      "note": ["--- 生成技能：少于 5 个连击点 ---"],
      "when": [{"all": ["Combo_Points < 70"], "comment": "少于 5 个连击点"}]
    }
  ]
}
```


### 完整的团队副本循环

一个真实的奇袭团队副本循环（命缚者）：15 条规则，包括 Burst、在目标身上有死亡印记时使用消失、用猩红风暴复制 DoT、AoE 与单体、攒能量。

**KRC 文本：奇袭，团队副本**
*KRC 文本:*

```text
rotation "奇袭，团队副本 v2.8：Burst 按钮、Method 12.1、SimulationCraft、顶尖日志"

# 奇袭，团队副本。依据：Method 指南（12.1 版本）、SimulationCraft 动作列表和 Warcraft Logs 顶尖玩家。
# 忽略主图标：开启。死亡印记和君王之灾仅在 Burst 开启时使用；消失仅在目标身上有死亡印记时使用。
# 连击点按 7 点的百分比计：3 = 43%，4 = 57%，5 = 71%，6 = 86%，7 = 100%。

# v2.4：君王之灾仅在 0–3 个连击点时使用（之后无情打击再给 5 点），消失在 0–4 点时使用（潜行中的锁喉给 3 点）。
# v2.5：仅当两个流血中只有一个是新上的时才使用猩红风暴；此前它会连续按好几次。
# v2.6：Burst 开启且死亡印记就绪或已在目标身上时，无论目标生命值多少都施放锁喉和割裂。
# v2.7 和 v2.8：没有流血的新目标、Burst 开启、死亡印记就绪、附近 2+ 个敌人：先用猩红风暴复制流血（连击点不限），再用死亡印记。

buff1	Garrote_DoT = "目标身上的锁喉 [703]"
buff2	Rupture_DoT = "目标身上的割裂 [1943]"
buff3	Envenom_Buff = "毒伤 [32645]"
buff4	Deathmark_DoT = "目标身上的死亡印记 [360194]"
buff5	Improved_Garrote = "强化锁喉 [392401]"
buff6	Darkest_Night = "至黑之夜 [457280]"
buff7	Blindside = "侧袭 [121153]"
buff8	Stealth_Buff = "潜行 [1784]"
buff9	Stealth_Sub = "潜行（诡诈） [115191]"
buff10	Vanish_Buff = "消失 [11327]"
slot1	Garrote = "锁喉"
slot2	Rupture = "割裂"
slot3	Envenom = "毒伤"
slot4	Mutilate = "毁伤"
slot5	Ambush = "伏击"
slot6	Fan_of_Knives = "刀扇"
slot7	Crimson_Tempest = "猩红风暴"
slot8	Deathmark = "死亡印记"
slot9	Kingsbane = "君王之灾"
slot10	Vanish = "消失"
slot11	Crimson_Vial = "猩红之瓶"
resource1	PlayerHP
resource2	TargetHP
resource3	Energy
resource4	Combo_Points

# --- 防御：仅在“治疗 / 防御”开启时 ---
use Crimson_Vial when  # 猩红之瓶
	defensives == 1 and PlayerHP <= 40  # 生命值 40% 及以下

# === 潜行 ===
use Garrote when  # 潜行中的锁喉
	Stealth_Buff.up  # 潜行中
	or
	Stealth_Sub.up  # 潜行中（诡诈）
	or
	Vanish_Buff.up  # 消失之后立即

use Garrote when  # 锁喉：强化锁喉窗口
	Improved_Garrote.up and Garrote_DoT.down  # 窗口已开，目标身上没有锁喉
	or
	Improved_Garrote.up and Garrote_DoT.duration <= 78  # SimulationCraft：18 秒剩 14 秒时刷新

# === 冷却技能（Burst 按钮） ===
use Deathmark when  # 死亡印记
	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 开启，流血都在，君王之灾就绪，毒伤还剩 2 秒以上

use Kingsbane when  # 君王之灾
	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 开启，目标身上有死亡印记，0–3 个连击点
	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 开启，距离死亡印记还有 52 秒以上，0–3 个连击点

use Vanish when  # 消失
	Deathmark_DoT.up and Improved_Garrote.down and Combo_Points < 65 and Stealth_Buff.down and Stealth_Sub.down  # 目标身上有死亡印记，0–4 个连击点（潜行中的锁喉给 3 点）

# === 流血 ===
use Crimson_Tempest when  # 猩红风暴：为死亡印记把流血复制到新目标
	cd == 1 and Deathmark.cd <= 3 and Garrote_DoT.down and Rupture_DoT.down and Envenom_Buff.up and enemies >= 2  # 连击点不限

# 不给快死的小怪上新流血（同 SimulationCraft 的“目标还能活 12 秒以上”）：1–2 个目标和“单体”模式下总是施放；
# 3+ 个目标时，仅当目标生命值 50% 以上，或 Burst 开启且死亡印记就绪，或目标身上已有死亡印记。
use Garrote when  # 锁喉：保持
	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+ 个目标：只给活得久的目标
	or
	Garrote_DoT.down and Combo_Points < 95 and cd == 1 and Deathmark.cd <= 3  # Burst 开启且死亡印记就绪：生命值不限
	or
	Garrote_DoT.down and Combo_Points < 95 and Deathmark_DoT.up  # 目标身上有死亡印记（复制的流血）
	or
	Garrote_DoT.up and Garrote_DoT.duration <= 30 and Combo_Points < 95  # 刷新窗口（已在目标身上）

use Rupture when  # 割裂
	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+ 个目标：只给活得久的目标
	or
	Combo_Points >= 70 and Rupture_DoT.down and cd == 1 and Deathmark.cd <= 3  # Burst 开启且死亡印记就绪
	or
	Combo_Points >= 70 and Rupture_DoT.down and Deathmark_DoT.up  # 目标身上有死亡印记
	or
	Combo_Points >= 70 and Rupture_DoT.up and Rupture_DoT.duration <= 25 and Darkest_Night.down  # 刷新；不要把至黑之夜的 7 个连击点花在这里

# === 生成技能：最多 5 个连击点，至黑之夜期间最多 7 个 ===

# 新上割裂后立即用一次猩红风暴（4+ 个目标时新上锁喉后也用），其余时间用刀扇。
# 两个流血只能有一个是新的（94% 以上）：猩红风暴之后两个都是新的，下一次就会等待。
use Crimson_Tempest when  # 猩红风暴：新上割裂或锁喉后立即扩散流血
	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 个目标：仅在新上割裂之后
	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 个目标：仅在新上割裂之后

use Fan_of_Knives when  # 刀扇：单体，至黑之夜，还差 1 个连击点
	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  # 刀扇：2+ 个目标
	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  # 伏击（侧袭）
	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  # 毁伤
	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

# === 消耗：5+ 个连击点（至黑之夜期间 7 个） ===
# SimulationCraft：不要马上按，而是让毒伤保持不断：增益最后 1 秒、目标身上有死亡印记时、能量快满时，4+ 个目标时更早。
use Envenom when  # 毒伤
	Darkest_Night.down and Combo_Points >= 70 and Envenom_Buff.down
	or
	Darkest_Night.down and Combo_Points >= 70 and Envenom_Buff.duration <= 20  # 约剩 1 秒
	or
	Darkest_Night.down and Combo_Points >= 70 and Deathmark_DoT.up
	or
	Darkest_Night.down and Combo_Points >= 70 and Energy >= 70  # 避免能量溢出
	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
```


它的 JSON 见下方的文件。第二个循环是狂徒（欺诈者），包含冲动宏（**O + Q**）、时运继延（**O**）、影舞步（**C**），并在每条规则中都加入了引导保护。

### 示例文件

| 示例 | 文件 |
|---|---|
| 构建器示例中的奇袭入门循环 | [JSON](https://keyrota.app/documentation/examples/starter-assassination.zh.json)、[KRC 文本](https://keyrota.app/documentation/examples/starter-assassination.zh.txt) |
| 奇袭，团队副本：15 条规则 | [JSON](https://keyrota.app/documentation/examples/assassination-raid.zh.json)、[KRC 文本](https://keyrota.app/documentation/examples/assassination-raid.zh.txt) |
| 狂徒，团队副本和史诗钥石：13 条规则，标记 O、OQ、C | [JSON](https://keyrota.app/documentation/examples/outlaw-raid.zh.json)、[KRC 文本](https://keyrota.app/documentation/examples/outlaw-raid.zh.txt) |
| 最简短的实用循环 | [JSON](https://keyrota.app/documentation/examples/minimal.zh.json)、[KRC 文本](https://keyrota.app/documentation/examples/minimal.zh.txt) |
| 语法示例：所有条件和标记（无 ID，不用于实战） | [JSON](https://keyrota.app/documentation/examples/syntax-every-condition.zh.json)、[KRC 文本](https://keyrota.app/documentation/examples/syntax-every-condition.zh.txt) |

每个示例都提供网站支持的所有语言版本：名称、规则和注释均已翻译，而条件、法术 ID 和标记完全相同。语言体现在文件名中：`.en`、`.ru`、`.de`、`.fr`、`.es`、`.it`、`.pt`、`.ko`、`.zh`、`.zh-TW`。

打开文件：在主窗口中选择“新建”——“从文件…”，或在构建器的“文本和 JSON”页面上点击“打开…”。

---

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

## 使用 AI 智能体创建循环

> [!TIP] 只需提供本页链接
> 你只需把本页的链接发给 AI 智能体：它会自行弄清一切，如有需要，还会向你询问缺少的信息。

具备网络和文件访问能力的 AI 智能体可以替你创建 KRC 循环：研究你所玩专精顶尖玩家的日志、指南和 SimulationCraft 动作列表，与你的天赋和日志进行比较，然后交给你一份现成的 JSON。本页介绍需要提供给它的内容、一份现成的提示词，以及如何检查结果。

### 需要准备什么

**智能体**：能够打开网站（Warcraft Logs、Raider.IO、Wowhead、GitHub）并读取文件。如果它无法访问网络，请以文件形式提供文档和日志摘录。

**供智能体阅读的文档**（链接已包含在提示词中）：

| 链接 | 内容 |
|---|---|
| [llms.txt](https://keyrota.app/documentation/llms.txt) | 面向 AI 智能体的文档索引：所有语言、文件和示例 |
| [krc-guide.zh.md](https://keyrota.app/documentation/krc-guide.zh.md) | 合并为一个 Markdown 文件的整套简体中文文档；英文版：[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 |
| [奇袭，团队副本](https://keyrota.app/documentation/examples/assassination-raid.zh.json)、[狂徒，团队副本和史诗钥石](https://keyrota.app/documentation/examples/outlaw-raid.zh.json) | 作为范例的真实团队副本循环 |

**你的数据**（提示词中的占位符）：

| 占位符 | 填写内容 | 示例 |
|---|---|---|
| `{CLASS}` | 职业 | 潜行者 |
| `{SPEC}` | 专精 | 奇袭 |
| `{HERO_TALENTS}` | 英雄天赋 | 命缚者 |
| `{TALENT_STRING}` | 游戏中的天赋导出字符串（天赋窗口，“分享”） | `CMQAAAAA…` |
| `{CONTENT}` | 团队副本或史诗钥石 | 团队副本 |
| `{RAID_OR_DUNGEONS}` | 团队副本或地下城列表 | The Venomous Abyss |
| `{DIFFICULTY}` | 难度或钥石等级 | 英雄 |
| `{BOSSES}` | 循环所针对的首领 | 全部 |
| `{ITEM_LEVEL}` | 物品等级 | 328 |
| `{MY_LOGS}` | 你在 Warcraft Logs 上的角色或报告链接 | `https://www.warcraftlogs.com/character/eu/<realm>/<name>` |
| `{COMBAT_LOG_FILE}` | 你附上的战斗记录文件 | `WoWCombatLog-101726_214449.txt` |
| `{PREFERENCES}` | 你的要求 | “冷却技能只由 Burst 按钮控制，不使用防御技能” |

### 提示词

智能体会自行收集数据，与你的数据进行比较，并解释每条规则。请填写花括号中的内容；如果有战斗记录，也请附上。

*提示词:*

```text
你是魔兽世界专家，也是 KeyRota 循环作者。请为我创建一个 KeyRota 高级循环：keyrota-rotation 格式、版本 1 的 JSON。

我的角色
- 职业和专精：{CLASS}，{SPEC}。英雄天赋：{HERO_TALENTS}。
- 游戏中的天赋字符串：{TALENT_STRING}
- 内容：{CONTENT}：{RAID_OR_DUNGEONS}。难度或钥石等级：{DIFFICULTY}。首领：{BOSSES}。
- 物品等级：{ITEM_LEVEL}。
- 我的 Warcraft Logs：{MY_LOGS}
- 战斗记录（附件）：{COMBAT_LOG_FILE}
- 要求：{PREFERENCES}

第 1 步：学习 KeyRota 格式
- https://keyrota.app/documentation/llms.txt 和 https://keyrota.app/documentation/krc-guide.en.md：槽位（最多 12 个）、光环（最多 12 个，只有我自己的增益效果和我在目标身上的减益效果）、以百分比表示的资源、所有条件、槽位标记、面板开关 aoe、st、cd、defensives、ground_spells、movement、从上到下检查的规则、由“且”条件组成的“或”组、最多 16 个组且每组最多 16 个条件、未知值会使条件为假。
- JSON Schema：https://keyrota.app/documentation/keyrota-rotation.schema.json
- 范例：https://keyrota.app/documentation/examples/assassination-raid.en.json 和 https://keyrota.app/documentation/examples/outlaw-raid.en.json

第 2 步：收集数据
1. Warcraft Logs：每个首领的 {SPEC} {CLASS} 伤害排名（{CONTENT}，{DIFFICULTY}）；史诗钥石则按每个地下城和钥石等级查看。选取使用英雄天赋 {HERO_TALENTS} 的 5-10 份最佳日志。
2. 将他们的天赋与我的天赋字符串进行比较。指出会改变优先级的差异，并说明我是否应该点这些天赋。
3. 从顶尖日志中收集：起手和施法顺序；重要增益和减益效果的覆盖率；施法时的资源（终结技时的连击点或等效资源、消耗前的能量或等效资源、因溢出损失的资源）；大冷却技能在何时、与什么一起使用，以及如何与阶段对齐；防御技能在何时、多少生命值时使用；从多少个目标开始切换到 AoE；每分钟施法次数和无施法时间。
4. 史诗钥石：Raider.IO（当前强势配置、顶尖记录、各地下城的天赋）。
5. 指南（Wowhead、Method、职业 Discord）以及当前资料片分支上 {SPEC} 的 SimulationCraft 动作列表（APL）：将其作为基础优先级，并用日志加以验证。
6. 我的日志和战斗记录：我的覆盖率、消耗技能时的资源、冷却技能和节奏与顶尖玩家有哪些差异。

第 3 步：编写循环
- "format": "keyrota-rotation"，"version": 1，我所玩专精的 specID，资源取自文档中的专精表（resource1 PlayerHP，resource2 TargetHP，然后是专精的资源），"ignoreMainIcon": true。
- 槽位：Wowhead 上真实的法术 ID（spell 字段）。治疗和防御技能使用 "show": "combat"。标记：不占 GCD 的法术用 offGcd；第二行占用 GCD 的宏以及需要上一次攻击结果的按钮用 offGcd 和 queue；引导法术用 channel；我自己按的技能用 manual。宏槽位请写出宏文本（#showtooltip 和 /cast）。
- 光环：使用增益和减益效果本身的 ID，而不是施加它们的法术 ID。只用我自己的光环。
- 按优先级排列规则。防御技能放在最前，并且只在 defensives == 1 时使用。大冷却技能只在 cd == 1 时使用（Burst 按钮，不是法术冷却）；凡是能增强冷却窗口的技能都只在窗口期间使用。单体与 AoE：AoE 用一个 aoe == 1 组和一个 st == 0 and enemies >= N 组；单体用一个 st == 1 组和一个 aoe == 0 and enemies <= 1 组。DoT：一个 X.down 组和一个 X.up and X.duration <= 30 组。资源用百分比，阈值设在两档之间的中点（连击点上限为 7：“至少 5 点”是 Combo_Points >= 70，“至多 3 点”是 Combo_Points < 50）。如果下一次按键会打断引导，请在每条规则的每个组中为引导的光环加上 X.duration <= 8。
- KRC 中没有 not、!= 和括号：请使用 up/down、ready/oncd、glow/noglow 这些配对、相反的运算符以及多个组。
- 名称（label）、规则名称和注释用简体中文书写，条件中使用的名称（alias）用拉丁字母书写。
- 为每条规则命名，并为每个组写一条简短注释：做什么、为什么。
- 最后检查：JSON 通过 Schema 校验；条件中的每个名称都已声明；每个组不超过 16 个条件，每条规则不超过 16 个组；所有 ID 在当前版本的 Wowhead 上都存在。

回答
1. 完整的循环 JSON，放在一个代码块中。
2. 宏槽位的宏文本。
3. 一张表格：规则、作用、依据（哪份日志、哪份指南或哪行 APL）。
4. 游戏中需要开启什么：快速设置面板按钮、敌人计数半径、动作条上需要放什么。
5. 测试计划：先打训练假人，再用战斗记录与顶尖日志进行比较；需要比较哪些数据。
```


### 填写好的提示词

以下是为英雄难度团队副本中的奇袭填写好的完整提示词：

*提示词：奇袭，英雄难度团队副本:*

```text
你是魔兽世界专家，也是 KeyRota 循环作者。请为我创建一个 KeyRota 高级循环：keyrota-rotation 格式、版本 1 的 JSON。

我的角色
- 职业和专精：潜行者（Rogue），奇袭（Assassination）。英雄天赋：命缚者（Fatebound）。
- 游戏中的天赋字符串：CMQAAAAAAAAAAAAAAAAAAAAAAYmlZmFDGAAAAAYWGsNDAAAAAILzMzMzMjxyMzMbzsMzMPgZMzYMMzYMAGYBmxoxsBYbAbGAMzMGD
- 内容：团队副本：The Venomous Abyss。难度：英雄。首领：全部；特别关注 Ula'tek（心脏出现时的伤害窗口）。
- 物品等级：328。
- 我的 Warcraft Logs：https://www.warcraftlogs.com/character/eu/<realm>/<name>
- 战斗记录（附件）：WoWCombatLog-101726_214449.txt，在训练假人上打了 5 分钟，单目标。
- 要求：死亡印记和君王之灾只由 Burst 按钮控制；消失只在目标身上有死亡印记时使用；生命值 40% 及以下时使用猩红之瓶；按 SimulationCraft 的方式攒能量。

第 1 步：学习 KeyRota 格式
- https://keyrota.app/documentation/llms.txt 和 https://keyrota.app/documentation/krc-guide.en.md：槽位（最多 12 个）、光环（最多 12 个，只有我自己的增益效果和我在目标身上的减益效果）、以百分比表示的资源、所有条件、槽位标记、面板开关 aoe、st、cd、defensives、ground_spells、movement、从上到下检查的规则、由“且”条件组成的“或”组、最多 16 个组且每组最多 16 个条件、未知值会使条件为假。
- JSON Schema：https://keyrota.app/documentation/keyrota-rotation.schema.json
- 范例：https://keyrota.app/documentation/examples/assassination-raid.en.json 和 https://keyrota.app/documentation/examples/outlaw-raid.en.json

第 2 步：收集数据
1. Warcraft Logs：每个首领的奇袭潜行者伤害排名（团队副本 The Venomous Abyss，英雄难度）。选取使用英雄天赋命缚者（Fatebound）的 5-10 份最佳日志。
2. 将他们的天赋与我的天赋字符串进行比较。指出会改变优先级的差异，并说明我是否应该点这些天赋。
3. 从顶尖日志中收集：起手和施法顺序；锁喉、割裂和毒伤增益的覆盖率；毒伤、割裂、君王之灾和消失时的连击点，毒伤前的能量，因溢出损失的能量和连击点；死亡印记和君王之灾在何时、与什么一起使用，以及如何与阶段对齐（尤其是 Ula'tek 的心脏阶段）；猩红之瓶和其他防御技能在何时、多少生命值时使用；从多少个目标开始切换到刀扇和猩红风暴；每分钟施法次数和无施法时间。
4. 指南（Wowhead、Method、潜行者 Discord）以及当前资料片分支上奇袭的 SimulationCraft 动作列表（APL）：将其作为基础优先级，并用日志加以验证。
5. 我的日志和战斗记录：我的覆盖率、消耗技能时的连击点、冷却技能和节奏与顶尖玩家有哪些差异。

第 3 步：编写循环
- "format": "keyrota-rotation"，"version": 1，"specID": 259，"resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"]，"ignoreMainIcon": true。
- 槽位：Wowhead 上真实的法术 ID（spell 字段）。猩红之瓶使用 "show": "combat"。标记：不占 GCD 的法术用 offGcd；消失用 offGcd 和 queue（它需要上一次攻击带来的连击点）；如果有引导法术，用 channel；我自己按的技能用 manual。宏槽位请写出宏文本（#showtooltip 和 /cast）。
- 光环：使用增益和减益效果本身的 ID，而不是施加它们的法术 ID（例如，消失的增益效果与消失法术的 ID 不同）。只用我自己的光环。
- 按优先级排列规则。猩红之瓶放在最前，并且只在 defensives == 1 且生命值 40% 及以下时使用。死亡印记和君王之灾只在 cd == 1 时使用（Burst 按钮，不是法术冷却）；消失只在目标身上有死亡印记时使用。单体与 AoE：刀扇用一个 aoe == 1 组和一个 st == 0 and enemies >= 2 组；毁伤用一个 st == 1 组和一个 aoe == 0 and enemies <= 1 组。锁喉和割裂：一个 X.down 组和一个 X.up and X.duration <= 30 组。连击点上限为 7，用百分比表示，阈值设在两档之间的中点：“至少 5 点”是 Combo_Points >= 70，“至多 3 点”是 Combo_Points < 50。攒能量：5 个以上连击点时，在毒伤增益快结束时、目标身上有死亡印记时或 Energy >= 70 时使用毒伤。
- KRC 中没有 not、!= 和括号：请使用 up/down、ready/oncd、glow/noglow 这些配对、相反的运算符以及多个组。
- 名称（label）、规则名称和注释用简体中文书写，条件中使用的名称（alias）用拉丁字母书写。
- 为每条规则命名，并为每个组写一条简短注释：做什么、为什么。
- 最后检查：JSON 通过 Schema 校验；条件中的每个名称都已声明；每个组不超过 16 个条件，每条规则不超过 16 个组；所有 ID 在当前版本的 Wowhead 上都存在。

回答
1. 完整的循环 JSON，放在一个代码块中。
2. 宏槽位的宏文本。
3. 一张表格：规则、作用、依据（哪份日志、哪份指南或哪行 APL）。
4. 游戏中需要开启什么：快速设置面板按钮、敌人计数半径、动作条上需要放什么。
5. 测试计划：先打训练假人，再用战斗记录与顶尖日志进行比较；需要比较哪些数据。
```


### 如何分析日志

给智能体和你自己的提示：从哪里获取数据、比较什么。

**Warcraft Logs**
- 排名：`https://www.warcraftlogs.com/zone/rankings/<zone id>?boss=<boss id>&class=<Class>&spec=<Spec>&difficulty=<3|4|5>&metric=dps`（3 为普通，4 为英雄，5 为史诗）。史诗钥石排名按钥石等级划分。
- 在玩家的报告中：Casts 选项卡（施法顺序和时间）、Buffs 和 Debuffs（覆盖率）、Resources（资源和溢出）、Damage Done（按技能和目标统计的伤害）、Deaths（死亡）。
- 日志中的天赋：玩家摘要中有天赋导出字符串，可在 Wowhead 的天赋模拟器中打开。
- 比较行为，而不是 DPS：DoT 和增益的覆盖率、消耗技能时的资源、每分钟施法次数、无施法时间、大冷却技能相对战斗阶段的使用时机。

**Raider.IO**（史诗钥石）
- 地下城的顶尖记录：`https://raider.io/api/v1/mythic-plus/runs?season=<season>&region=world&dungeon=<slug>&page=0`；赛季和地下城：`https://raider.io/api/v1/mythic-plus/static-data?expansion_id=<id>`。
- 强势配置每周都在变化：请使用最新数据，而不是旧结论。

**SimulationCraft**
- 专精的动作列表（APL）位于 GitHub 上 `simulationcraft/simc` 仓库当前资料片的分支中，在 `ActionPriorityLists` 文件夹内。
- 如何把 APL 转换为 KRC：

| SimulationCraft APL | KRC |
|---|---|
| `actions` 行，从上到下 | 规则，从上到下 |
| `buff.X.up` | `X.up` |
| `dot.X.remains`、`buff.X.remains` | 以百分比表示的 `X.duration` |
| `cooldown.X.remains` | 以百分比表示的 `X.cd` |
| `combo_points`、`energy` | 以百分比表示的资源 |
| `active_enemies` | `enemies` |
| `target.time_to_die`、精确秒数 | 没有对应项；使用最接近的替代，例如“目标还能活 12 秒以上”在 3+ 个目标时写作 `TargetHP >= 50` |

**战斗记录**
- 开启高级战斗记录后，每个 `SPELL_CAST_SUCCESS` 都带有施法者的资源（类型、当前值、最大值）；能量的类型为 3。
- `SPELL_AURA_APPLIED`、`SPELL_AURA_REFRESH`、`SPELL_AURA_REMOVED`：光环覆盖率和刷新；`SPELL_ENERGIZE`：资源获取；`SPELL_CAST_FAILED`：被游戏拒绝的按键。
- 需要统计：每分钟施法次数、GCD 之间的间隔、DoT 覆盖率、终结技时的连击点、能量溢出、大冷却技能的使用时机。

### 录制战斗记录

1. 在游戏设置的“网络”部分开启“高级战斗记录”。不开启的话，记录中没有资源和位置信息。
2. 开怪前在聊天框中输入 `/combatlog`：开始记录。战斗结束后再次输入 `/combatlog`：停止记录。
3. 文件位于游戏文件夹中：`World of Warcraft\_retail_\Logs\WoWCombatLog-MMDDYY_HHMMSS.txt`。游戏写入文件有延迟：停止记录后请等待一分钟。
4. Warcraft Logs 上传工具可能会在上传后清空该文件：请先复制一份。

第一次测试请在训练假人上进行：先打 2–3 分钟单目标，再对一组假人测试 AoE。

### 测试和迭代

1. 加载循环（见下文），生成并粘贴 Better Assistant 配置，把槽位法术放到动作条上并绑定按键。
2. 在假人上测试。主窗口中的“日志”会显示按下了什么。KeyRota 日志文件（“日志”旁边的文件夹按钮）会为每个 GCD 记录选中的规则，以及上方规则被跳过的原因：条件不满足、未就绪、未知、手动。
3. 把循环 JSON、最新的战斗记录以及必要时的 KeyRota 日志交给智能体。请它与顶尖日志进行比较：覆盖率、消耗技能时的资源、冷却技能、空闲时间。
4. 每次只修改一条规则，并在循环名称中保留版本号（“v1.3”）。保留旧版本：使用主窗口中的“导出”，或“文本和 JSON”——“保存…”。
5. 打完团队副本或钥石后，再次与 Warcraft Logs 进行比较。

### 加载结果

- **作为文件：** 将答案中的 JSON 保存为 `.json` 文件，然后选择“输出循环”——“新建”——“从文件…”。
- **从剪贴板：** 复制 JSON，然后选择“新建”——“从剪贴板”。
- **载入已打开的循环：** 构建器——“文本和 JSON”——“JSON”——“粘贴”。如果新 JSON 中没有相应设置，编号相同的槽位会保留原有的 ID、标记和显示条件。

构建器的状态栏应显示“循环正常”。如果有错误，状态栏会指出出错位置：请将其原样交给智能体。然后选择“常规”——“根据槽位和光环生成”——“复制”，在游戏中：`/ba`——Profile——粘贴——Apply。根据答案在游戏中创建宏，并把它们放到动作条上。

---

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

## 常见问题与故障排除

### 规则从不触发

请按以下顺序检查：

1. **上方的规则总是优先。** 规则从上到下检查：如果上方某条规则成立且它的法术可以使用，你的规则就永远轮不到。请把你的规则上移，或收紧上方规则的条件。
2. **未知值。** 基于未知值的条件为假，即使是 `.down`。光环不在 Better Assistant 配置中或 ID 有误时，它就是未知的。请重新生成配置（“根据槽位和光环生成”）并粘贴到游戏中。
3. **光环的 ID，而不是法术的 ID。** 增益效果的 ID 可能与施加它的法术不同：消失是 `1856`，它的增益效果是 `11327`。另外，规则只能看到你自己的光环，看不到其他玩家给你的增益效果。
4. **槽位未就绪。** 资源不足、目标太远、正在冷却、未点出天赋。这样的规则会被跳过，不会报错。
5. **Better Assistant 未显示该槽位。** “有目标时”槽位在没有目标时不算就绪。治疗和防御技能请使用“战斗中”。
6. **没有按键。** 槽位的法术必须放在动作条上并绑定按键（或使用带 `#showtooltip` 的宏）。
7. **开关已关闭。** “治疗 / 防御”默认关闭；Burst 可能已被 Burst 键（Windows 上为 F3，macOS 上为 ⌃⇧B）关闭；目标模式可能仍是“单体”或“群体”。
8. **百分比。** 5 个连击点是 `70`，而不是 `5`。请参阅[资源](https://keyrota.app/documentation/zh/conditions#resources)。
9. **层数。** 只有 1 层时读作 0：`X.stacks >= 1` 无法区分 1 层和没有光环；请使用 `.up`。
10. **没有持续时间的光环。** 潜行等光环的剩余时间始终读作 1：`.duration` 对它们无效。

KeyRota 日志文件会显示选中了哪条规则，以及上方的规则为何被跳过：点击主窗口中“日志”旁边的文件夹按钮即可找到它。

### 按得太早或太晚

| 现象 | 原因 | 解决方法 |
|---|---|---|
| 不占 GCD 的法术等到 GCD 结束才按 | 没有 O 标记 | 开启“不占 GCD（O）”。 |
| 不占 GCD 的按钮在上一次攻击的结果生效之前就被按下 | 标记 O 会在 GCD 中途立即按下 | 加上“法术队列窗口（Q）”：O + Q。 |
| 第二行占用 GCD 的宏没有完整施放 | 宏在 GCD 中途被按下 | O + Q：宏会在 GCD 结束时按下。 |
| 靠下的不占 GCD 规则不会抢在靠上的规则之前 | 设计如此：严格优先级 | 把该规则上移。 |
| 消耗之后循环“停住不动” | 资源积攒：没有规则成立 | 这是正常的；想更早消耗，请调低能量阈值。 |
| 你按自己的按钮时循环什么都不按 | 你按技能键时 KeyRota 会让你优先 | 这是正常的。 |

### 引导被打断

- 为该槽位开启“引导（C）”：引导期间 KeyRota 不按任何键，也不会在引导开始时重复按下该槽位。
- 游戏会在最后一击之前稍早结束某些引导，引导结束后立即按键就会打断它。请把引导的光环加入循环的光环，并在**每条规则的每个组**中加上条件 `Channel_aura.duration <= 8`。示例：[引导保护](https://keyrota.app/documentation/zh/patterns#channel)。

### 不切换到 AoE

1. 目标模式是否为“自动”（Windows 上为 F2，macOS 上为 ⌃⇧T，依次切换“自动”“单体”“群体”）？在“单体”模式下，带 `st == 0` 的规则不会触发。
2. 游戏中是否开启了敌方姓名板（V），并且没有隐藏次要敌人？
3. “常规”页面上的计数半径是否不小于你 AoE 技能的作用半径？
4. 仅计入战斗中的敌人：尚未进入战斗的敌人不计入。如果怪物是一个接一个过来的，计数可能会偏低。
5. 规则的阈值是 `enemies >= 2` 还是 `>= 3`？
6. 更改半径后，请重新生成并粘贴 Better Assistant 配置。

### Burst 不触发或触发时机不对

- `cd == 1` 是 **Burst 按钮**（Windows 上为 F3，macOS 上为 ⌃⇧B，或面板上的 Burst 按钮），而不是法术的冷却。法术的冷却是 `Slot.cd`。
- Burst 默认开启。在不能使用冷却技能的时刻（免疫、转阶段）之前关闭它，时机到了再开启。
- 如果大冷却技能依赖某些光环（目标身上的 DoT），它会等待这些光环。请在 KeyRota 日志中查看规则的哪个条件不成立。
- 对于只应在冷却期间使用的技能，请检查冷却技能的光环（`Deathmark_DoT.up`），而不是 Burst 按钮。

### 如何计算百分比

- **资源和生命值：** `数值 / 最大值 × 100`。250 点能量中的 175 点是 `70`。
- **连击点（上限 7）：** 把阈值设在两档之间的中点：“至少 5 点”是 `>= 70`，“至多 3 点”是 `< 50`。[对照表](https://keyrota.app/documentation/zh/conditions#resources)。
- **光环剩余时间：** 这一次施放持续时间的百分比。30% 就是刷新窗口。
- **冷却：** 不含 GCD 的完整冷却时间的百分比。对于 2 分钟的冷却，1% 是 1.2 秒。

### “有错误的循环无法保存”

构建器不会保存有错误的循环：KeyRota 从不部分执行循环。状态栏会指出出错位置，例如“规则 9，组 1：组中没有条件”。点击“查看”即可打开该规则。常见原因：

| 消息 | 解决方法 |
|---|---|
| 组中没有条件 | 添加条件，或删除空组。 |
| 未选择槽位 | 在“按下”中选择槽位。 |
| 标记 Q 只能与 O 一起使用 | 开启“不占 GCD（O）”，或关闭 Q。 |
| 未知名称 … | 条件中的名称与任何光环、槽位或资源都不匹配：请检查“文本中的名称”。 |
| … 是 slot，但需要 buff | 对槽位使用了光环属性（`.up`、`.duration`），或对光环使用了槽位属性（`.ready`、`.cd`）。 |
| 名称中不能有引号 | 从循环、槽位或光环的名称中删除 `"`。 |

所有消息请参阅[错误](https://keyrota.app/documentation/zh/rotation-json#errors)。

### `.oncd` 与 `.cd > 0` 有何不同

`X.oncd`：槽位因**任何**原因未就绪：冷却、资源不足、目标太远、槽位未显示。`X.cd > 0`：冷却正在进行。对于有充能的法术，槽位就绪时也可能 `.cd > 0`：有一层充能可用，下一层正在恢复。

### 如何表达“非”和括号

KRC 中没有 `not`、`!=` 和括号。“非”就是配对的条件（`up`/`down`、`ready`/`oncd`、`glow`/`noglow`）或相反的运算符（不要写“非 `>= 70`”，而要写 `< 70`）。“(A 或 B) 且 C”是两个组：`A and C`、`B and C`。详情请参阅[“非”、括号和“或”](https://keyrota.app/documentation/zh/conditions#logic)。

### 槽位或光环能超过 12 个吗？

不能：与 Better Assistant 配置一样，一个循环最多有 12 个槽位和 12 个光环。宏可以帮你节省位置（一个按钮，多个法术），而且一个槽位可以出现在多条规则中。规则的数量不限。

### 循环中有你没有的天赋

如果没有点出某个天赋，对应的法术就未学会，槽位不会就绪，它的规则会被直接跳过。同一个循环可以适用于不同的天赋配置：缺少的法术对应的规则不会触发。

### 迁移或分享循环

- 主窗口中的“导出”会保存配置及其循环；在另一台电脑上用“导入”加载。
- 在构建器中，“文本和 JSON”——“保存…”可将循环保存为 `.json` 或 `.txt`；要打开它，请使用“新建”——“从文件…”。
- Better Assistant 配置会根据循环的槽位和光环重新生成：无需单独传递。

### 为什么 KeyRota 有时什么都不按

开启“忽略主图标”后，没有规则符合时 KeyRota 会等待。在攒能量的循环中，这是正常的：5 个以上连击点时，消耗技能在等待它的条件，生成技能则不会触发。如果等待看起来不对劲，请在 KeyRota 日志中查看哪些规则被跳过以及原因。
