文件 參考

回執與原因碼

每條命令的回執都帶有狀態碼和原因碼。它們是 Bot 和 Agent 自我修正的依據:把「為什麼沒做成」變成機器可讀的數字。

r = g.train(barracks, "hfoo")
bool(r)        # False
r.status       # 1              -> rejected
r.verdict      # 3              -> 人口不足
r.reason       # 'rejected(人口不够)'
r.exec_us      # 這條命令在遊戲執行緒上執行了幾微秒

if r: 等同於 r.status == 0(引擎接下了)。

狀態碼 status

碼名稱含義常見原因
0accepted引擎接下了—(但接下 ≠ 做成,見下文)
1rejected被引擎拒絕看 verdict
2bad_unit單位不存在或控制代碼對不上單位已經陣亡;使用了過期的單位物件
3not_owner不是你的單位以 player 身分指揮別人的單位
4fault執行時發生例外(執行環境已攔下,不會拖垮遊戲)請附上重現步驟回報
5bad_args參數錯誤座標、格號、四字碼寫錯
6unsupported不支援這個版本的執行環境沒有這項能力
7bad_target目標無效目標已經不在了;目標類型不對
8forbidden車道角色不允許以 observer 身分下令
97cancelled批次區塊內拋出例外,整批都沒送出with g.batch(): 區塊裡的程式碼出錯
98held單位被更高優先順序的層佔用,沒有送出參考大腦的毫秒層、指揮台的手動下令正佔用這個單位
99timeout逾時遊戲暫停或卡頓時超過了截止時間(過期的命令不會再執行)

原因碼 verdict

被拒時,執行環境會用引擎自己的可行性檢查說明原因。也可以先不下令、先詢問:g.can_do(單位, 四字碼) 會回傳同樣的碼。

碼含義怎麼辦
0 / 220可以—
3人口不足蓋人口建築;用 g.production(b).blocked 提早發現
8黃金不足等錢;下令前先用 g.can_afford(code)
9木材不足多派人伐木
32訓練佇列已滿(7 格)佇列只排 1 個:g.queue(b) 空了再排
183缺少前置科技/建築先蓋前置建築、升級主堡
185建築忙碌中祭壇正在復活英雄;大廳佇列沒空時不能升級
221沒有這一項/建造中/升級中/已存在英雄已經有了(陣亡要用 revive);這家商店不賣這個
89商店還沒進貨開局要等到物品表的上架時間才有貨;新蓋的商店從蓋好那一刻才開始計算
1001目標看不見目標在戰爭迷霧或黑色遮罩區裡;對它的位置用 attack_move

接下 ≠ 做成

回執只說明「引擎接下了這條命令」,是在同一幀裡讀回來的。之後可能發生的事它管不到:

命令回執接下之後仍可能失敗怎麼確認
建造樹林裡的點也會當場接下,工人走到了才失敗用 build_near(追蹤地基是否出現),或等 production.done
施法被打斷、魔力不足下一拍看 g.cooldown(u, 技能) 有沒有進入冷卻
訓練排進佇列但人口不足,一直不開始g.production(b).blocked
移動/攻擊被其他邏輯(或更高優先順序的層)改掉g.current_target(u)、g.order_of(u)

查詢 API

以下 API 不下令,只詢問引擎,結果也放在回執的 value 裡(SDK 直接回傳值):

API回傳
g.can_do(u, code) / g.can_do_many([(u, code), ...])上表的原因碼
g.tech(code, player=None) / g.tech_many([...])研究等級/已建成的建築數(升級鏈也算在內)
g.visible(x, y)這一點我方看不看得見
g.gold_left(mine)金礦還剩多少黃金
g.enemy_ai_plan(敵兵)電腦對手的隊長要帶兵去哪裡(只對電腦 AI 有效)