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

輸出循環 JSON

更新於 2026年10月18日

JSON 是進階循環的完整描述:包含 KRC 文字中的所有內容,再加上法術 ID、欄位旗標與設定檔設定。建立器會在「文字與 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否0WoW 專精,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";請改在你的編輯器或驗證工具中指定結構描述。

幾乎所有地方都可以用 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否0Wowhead 法術 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三者皆開啟同上,但在佇列視窗內按下。罕見
Q 但沒有 O"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": "沒有 DoT"},
    {"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(從 0 開始計數)。在建立器中是「規則 4,群組 2: 未知名稱 Foo」(從 1 開始計數)。在 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_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 錯誤:「不屬於任何規則的行:"…"(說明文字請以 # 開頭)」。
  • 各部分之間可以用任意數量的空格與 Tab。標準格式在 buffN/slotN 之後以及條件行開頭使用 Tab。

宣告#

只能放在第一個 use 之前:

KRC 文字
rotation "名稱"                    # 選填,最多一次
buff1	Garrote_DoT = "目標身上的絞喉 [703]"   # 光環 1
slot1	Garrote = "絞喉"                         # 欄位 1
resource1	PlayerHP                               # 資源 1

buffN 與 slotN 為 1–12,resourceN 為 1–99。引號中的 label 可以是空的:slot5 Filler = ""。在第一個 use 之後的宣告是 late_declaration 錯誤。

規則#

KRC 文字
use Rupture when  # 割裂
	Combo_Points >= 70 and Rupture_DoT.down  # 沒有 DoT
	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 也可以從其 label 中的 [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#

此格式的結構描述: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 會將它視為多餘的屬性。