标准战斗流程

你的 Agent 要打一场战斗时,走这页的回路:开战时建立一次战斗目录,之后每个回合读上下文、执行动作、看回执,再决定下一步。

开战或接管一场已有战斗:

npm run fvtt:cdp -- --port 9230 --target-url autofvtt.criticalrole.top doctor
npm run fvtt:cdp -- --port 9230 --target-url autofvtt.criticalrole.top combat-snapshot
npm run fvtt:cdp -- --port 9230 --target-url autofvtt.criticalrole.top build-combat-catalog --out encounter.json

每个回合

npm run fvtt:cdp -- --port 9230 --target-url autofvtt.criticalrole.top combat-context --json '@encounter.json'
npm run fvtt:cdp -- --port 9230 --target-url autofvtt.criticalrole.top execute-turn --json '@turn.json' --include-context-after

推荐 turn.json:

{
  "sourceTokenId": "pNPz2V5cFKYZmzds",
  "actionKey": "greatsword.attack",
  "targetTokenIds": ["SUnqlZmNomEYNOzh"],
  "catalog": {
    "version": 1,
    "tokens": {}
  }
}

execute-turn 默认不推进回合;需要在动作或动作序列结束后推进时,加 --advance 或在 JSON 顶层写 "advance": true。

多重攻击序列

多重攻击可以放在一个 actions 序列里,顶层 sourceTokenId、targetTokenIds 和 catalog 会作为每一下的默认值:

{
  "sourceTokenId": "pNPz2V5cFKYZmzds",
  "targetTokenIds": ["SUnqlZmNomEYNOzh"],
  "catalog": {
    "version": 1,
    "tokens": {}
  },
  "actions": [
    { "actionKey": "claws.attack" },
    { "actionKey": "claws.attack" }
  ]
}

调试或临时调用时,也可以直接传真实 Foundry ID:

{
  "sourceTokenId": "pNPz2V5cFKYZmzds",
  "itemId": "CXwSa8DUIlIvjg9H",
  "activityId": "dnd5eactivity000",
  "targetTokenIds": ["SUnqlZmNomEYNOzh"],
  "postDelayMs": 0
}

执行结果

执行结果会包含:

  • status: completed / no-workflow / error
  • itemCardId
  • damageRolled
  • tokenDiffs
  • warnings
  • timings
  • 可选 combatAfter / contextAfter

序列模式会额外返回 sequence: true、actions[] 和 resolvedActions[];聚合 result 里包含整组的 status、actionCount、successCount、damageRolled、tokenDiffs、warnings 和 itemCardIds。

agent 判定结果时优先看 tokenDiffs,再看 chat flags。midi-qol raw damage 可能因为抗性、免疫、减半或 temp HP 和实际 HP diff 不一致。