Перейти к содержимому

循环 JSON

更新于 2026年10月18日

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

示例文件#

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

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

ignoreMainIcon#

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

enemies#

JSON
"enemies": {"range": 8, "combatOnly": true}
字段类型默认值说明
range整数 1–1008敌人计数半径,单位为码。
combatOnlytrue / falsetrue只计入已进入战斗的敌人。

enemies 条件读取的就是这个计数器(见附近敌人数)。在构建器中,它们对应“常规”页面上的“敌人计数半径(码)”和“仅计入战斗中的敌人”。这些值也会写入 Better Assistant 配置。

notes 和 footer#

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

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

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

resources#

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

  • resource1 是玩家的生命值,resource2 是目标的生命值;
  • 从 resource3 起是专精的资源,顺序与 specID 表相同:对于潜行者,resource3 是能量,resource4 是连击点数。
JSON
"resources": ["PlayerHP", "TargetHP", "Energy", "Combo_Points"]

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

所有资源都是相对最大值的百分比,范围为 0–100。如何把连击点数、能量和符文换算成百分比,请参阅“条件”中的资源。

auras#

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

字段类型必填默认值说明
n整数 1–12是—光环编号(buffN)。每个编号只能出现一次。
alias字符串否由 label 生成在条件中使用的名称。见名称。
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 何时显示该槽位。
manualtrue / false否false标记 M。
channeltrue / false否false标记 C。
offGcdtrue / false否false标记 O。
queuetrue / 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。完整列表请参阅条件。

  • 可以按名称(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、versiontitle ""、specID 0、ignoreMainIcon true、enemies {"range": 8, "combatOnly": true}、空列表
光环nalias 由 label 生成、label ""、spell 0
槽位nshow "target"、所有标记为 false、spell 0
规则usename ""、note []、when [](无条件)
组all(非空)comment ""

限制#

项目上限
光环12(n 1–12)
槽位12(n 1–12)
每条规则的“或”组16
每个组的“且”条件16
规则不限
条件中的数值整数 0–100
enemies.range1–100
spell0–100000000
specID0–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..12n 超出范围。
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_refresource5 未声明资源未在 resources 中声明。
wrong_kindGarrote 是 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_rangebuff13:编号超出 1..12引用了大于 12 的编号。
too_many_groupsOR 组超过 16 个规则中的组超过 16 个。
too_many_conditions17 个条件在同一组中(最多 16 个)组中的条件超过 16 个。

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

KRC 文本#

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

KRC 文本
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 之前:

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

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

规则#

KRC 文本
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(draft 2020-12)。它会检查字段、类型、范围、不带 offGcd 的 queue,以及条件字符串的格式。它不检查 n 和名称是否唯一、条件中的名称是否存在,也不检查按 and 拆分字符串后的 16 个条件上限:这些由 KeyRota 在加载时检查。

校验文件:

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

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