字段详解与源码实现解析)
MaaAssistantArknights 战斗流程协议Copilot JSON字段详解与源码实现解析【免费下载链接】MaaAssistantArknights《明日方舟》小助手全日常一键长草| A one-click tool for the daily tasks of Arknights, supporting all clients.项目地址: https://gitcode.com/GitHub_Trending/ma/MaaAssistantArknightsMaaAssistantArknightsMAA 明日方舟小助手的“作战协议”Copilot是一套以 JSON 文件描述的关卡自动战斗流程作者把一份作业攻略翻译成“编队要求 按顺序执行的操作列表”放到resource/copilot/目录下小助手即可自动编队、按条件时机部署干员、开技能、撤退、变速直至战斗结束。本文基于协议文档 docs/zh-tw/protocol/copilot-schema.md 与核心解析源码 CopilotConfig.cpp完整覆盖协议的每个字段、默认值与取值范围并结合仓库内真实作业文件 OF-1_credit_fight.json 给出可运行的示例解读帮助你读懂、校验乃至编写自己的作战协议。需要特别注意JSON 文件本身不支持注释。协议文档中的注释仅为字段说明实际提交的作业文件中不能包含//注释否则会导致解析失败。一、协议文件的存放位置与任务入口作战协议文件统一放在resource/copilot/目录下按关卡名称建子目录归档仓库中已内置了多套保全派驻作业例如 SSS_施佩尔山脚_逻各斯圣聆初雪浊心斯卡蒂_冷爆机.json。从源码结构看协议由 CopilotTask.cpp 统一入口加载任务参数支持copilot_file指定单个协议文件名也支持copilot_list传入多个文件名以启用多作业插件MultiCopilotTaskPlugin连续执行。解析工作则全部委托给单例配置类 CopilotConfig其parse()依次调用三个静态解析函数parse_basic_info()解析stage_name与doc描述信息parse_groups()解析opers单个干员列表与groups干员分组parse_actions()解析有序动作列表actions。解析失败如干员名在干员数据中不存在且配置了非法练度要求时parse_groups()返回空整个协议加载即视为失败——这解释了为什么作业中干员名称必须与游戏内数据严格一致。二、顶层字段一览一份完整的协议文件顶层结构如下注释为说明实际文件不可带注释{ stage_name: 暴君, // 关卡名称必填。关卡中文名、code、stageId、levelId 等只要能唯一识别均可 opers: [ // 指定干员与 groups 二选一或并用 { name: 重岳, role: guard, // 职业选填用于区分同名干员填英文职业名大小写不限 skill: 3, // 技能序号选填默认 0取值范围 [0, 3] skill_usage: 2, // 技能用法选填默认 0含义见下文 skill_times: 5, // 技能使用次数选填默认 1 requirements: { // 练度要求自动编队时验证选填 elite: 2, // 精英化等级选填默认 -1 即不作要求 level: 90, // 干员等级选填默认 -1 skill_level: 10, // 技能等级选填默认 -1 module: 1, // 模组编号选填默认 -10 表示不使用模组1-4 对应不同编号的模组 module_level: 3, // 模组等级暂不支援 potential: 1 // 潜能要求暂不支援 } } ], groups: [ { name: 任意正常群奶, // 分组名称必填 opers: [ // 组内干员任选其一无顺序要求优先选练度高的 { name: 夜莺, skill: 3, skill_usage: 2 }, { name: 白面鸮, skill: 2, skill_usage: 2 } ] } ], actions: [ /* 有序动作列表必填见下文各节 */ ], minimum_required: v4.0, // 最低要求 MAA 版本号必填 doc: { // 描述信息选填用于界面展示 title: 低练度高成功率作业, title_color: dark, details: 对练度要求很低……, // 建议写上作者名称、参考的视频攻略出处 details_color: dark }, difficulty: 0 // 作业对应难度选填默认 0 }字段要点stage_name必填是作业在界面上展示与匹配的关卡标识中文名、code、stageId、levelId 均可保证唯一即可。parse_basic_info()中通过json.at(stage_name)强取该字段缺失会直接抛异常minimum_required必填声明该作业要求的最低 MAA 版本用于提醒用户当前客户端版本是否兼容doctitle/title_color/details/details_color四个字段全部选填仅在协议预览界面展示不影响战斗逻辑difficulty选填默认 0取值 0 未设置 / 1 支援普通难度 / 2 支援突袭难度 / 3 普通与突袭均支援。三、干员用法字段opers 与 groups3.1 单个干员条目name必填。role选填填英文职业名如guard用于区分同名干员解析时大小写不敏感AsstBattleDef.h 中get_role_type()同时兼容Guard/GUARD/近卫等写法并归一到Role::Warrior等枚举。skill选填默认 0取值[0, 3]0 表示使用默认技能或上次编队技能。源码在parse_oper_usage()中做了一道稀有度兼容性校验稀有度低于 6 星的干员填skill: 3非阿米娅会被强制改回 0稀有度低于 4 星填skill: 2会被强制改回 0稀有度低于 3 星填skill: 1会被强制改回 0。这是为兼容古早作业中“超规格”技能编号的兜底逻辑运行时会在日志中打印错误说明。skill_usage选填默认 0对应枚举SkillUsage取值枚举含义典型例子0NotUse不自动使用完全依赖actions中的“技能”动作全自动触发技能填 01Possibly好了就用有多少次用多少次棘刺 3 技能、桃金娘 1 技能2Times使用 X 次次数由skill_times控制山 2 技能用 1 次、重岳 3 技能用 5 次3InTime自动判断使用时机画饼尚未落地—skill_times选填默认 1仅在skill_usage: 2时决定实际释放次数。3.2 练度要求 requirementsrequirements全部选填默认 -1不作要求elite精英化、level等级、skill_level技能等级、module-1 无要求 / 0 不使用模组 / 1-4 对应不同编号的模组、module_level与potential暂不支援。parse_oper_usage()中还有两条推断规则值得注意skill_level 7即要求专精时精英化要求至少提升到 2skill_level 4时至少为 1module 0要求携带模组时精英化要求至少提升到 2模组系统仅精二开放若显式指定的elite低于上述推断值解析会记录错误并整体拒绝该干员返回nullopt避免编队阶段出现“等级够了但技能等级永远达不到”的死锁。3.3 分组 groups自动在多个候选干员中择一groups用于表达“任意一个都可以”的岗位例如“夜莺或白面鸮任一作为群奶”。每个组必须有name组名opers列出候选干员字段与 3.1 完全一致。自动编队时会在组内优先选择练度高的干员组名随后直接作为actions中name字段的引用值如name: 任意正常群奶。从源码看parse_groups()会为每个组计算elite_min/level_min取组内最低精英化/等级门槛精一 80 级、精二 70 级的经验下限参与比较供编队界面展示与筛选。另外顶层opers数组中的单个干员会被自动包装为以干员名命名的组因此在动作引用层单个干员与分组是统一处理的——actions里的name既可以是干员名也可以是组名。四、actions动作类型全表actions是协议的核心有序数组执行完前一条才会开始处理下一条。每个动作的type选填默认Deploy中英文写法效果相同。完整的字符串到ActionType枚举的映射定义在parse_actions()的ActionTypeMapping表中摘录如下枚举英文写法中文写法行为说明DeployDeploy部署部署干员费用不足时一直等待直到 timeoutUseSkillSkill技能开技能CD 未转好时一直等待直到 timeoutRetreatRetreat撤退撤退干员/召唤物SwitchSpeedSpeedUp二倍速可切换第一次使用进入二倍速再次使用回到一倍速BulletTimeBulletTime子弹时间点击任意干员后的 1/5 速度后续任意 action 恢复正常速度SkillUsageSkillUsage技能用法运行时修改某干员的技能用法OutputOutput输出/打印不执行任何操作仅输出doc内容可作字幕SkillDaemonSkillDaemon摆完挂机/开摆只做“好了就用”的开技能其余不做直到战斗结束ResetStopwatchResetStopwatch重置全局计时器重置全局计时器实验性功能见 elapsed_timeMoveCameraMoveCamera移动镜头用于「引航者试炼」模式需填distance未知type会打印Unknown action type警告并跳过该条动作不中断后续流程编写时务必核对拼写。此外源码中还存在DrawCard抽卡/调配干员与CheckIfStartOver检查重开两个类型从源码结构看它们是保全派驻SSS专用扩展配合resource/copilot/下大量SSS_*.json作业使用普通关卡作业不需要。子弹时间BulletTime的使用细则name或location必填一项表示点击哪个干员进入 1/5 速度战场已部署与待部署区的干员均可自动判断若下一条动作是“技能”或“撤退”需填与下一条动作相同的name/location若下一条动作是“部署”随便填谁都可以但不建议填待部署的那位——头像被点击会影响后续头像辨识。技能用法SkillUsage的典型场景配合skill_usage/skill_times字段使用例如刚下场的桃金娘需要普攻打几个怪不能自动开技能中后期阵型平稳后改为自动开技能则可在对应时刻插入一条type: 技能用法的动作将其改为 1。移动镜头MoveCamera仅「引航者试炼」模式需要必填distance字段[x 移动格子数, y 移动格子数]可为小数、可为负x 为正表示镜头右移y 为正表示镜头上移。例如distance: [-1, 1]配合location: [5, 6]实际部署落点会是[6, 7]——即坐标是移动后的相对结果。五、actions触发条件字段与的关系一条动作可以带多个触发条件当前全部条件之间是逻辑与关系全部满足才执行该动作未满足则持续轮询等待。源码中五个条件字段的默认值如下字段默认值说明kills0直接执行击倒数条件未达标则一直等待costs0直接执行部署费用条件费用受潜能等影响可能不完全准确仅适合对时间轴要求不严格的战斗。另外仅两位数费用辨识较准三位数费用可能辨识错不推荐cost_changes0直接执行费用变化量条件从本动作开始执行时即上一动作结束时的费用作为基准起算支援负数如“孑”等吸费干员使费用下降。同样仅两位数辨识可靠cooling-1不辨识CD 中再部署冷却干员数量条件elapsed_time0直接执行毫秒级全局计时条件使用前必须先执行过ResetStopwatch动作重置计时器否则该条件无法满足会卡住对费用精确敏感的作业建议优先用cost_changes增量辨识而非costs绝对值辨识。文档中亦保留了condition_type0 且 / 1 或的 TODO 规划尚未实装编写时不要引用。六、actions目标与位置字段name干员名或组名。“部署”时必填“技能”“撤退”时选填role职业选填用于区分同名干员location[x, y]格子坐标。“部署”时必填“技能”“撤退”时选填。推荐用法技能仅推荐给场地自动装置一类不填name、用location点击开启的场景正常部署的干员推荐用name开技能撤退仅推荐给存在多个同名召唤物时需要按位置区分撤退的场景正常干员推荐用name撤退。坐标可在地图工具中将「座标展示」切换为「MAA」后读取即为 MAA 使用的坐标体系direction部署朝向“部署”时必填Left | Right | Up | Down | None或中文 左/右/上/下/无缺省时默认Right见string_to_direction()的兜底返回值。无人机等无方向单位用None。七、actions时序控制字段pre_delay前置延时选填默认 0毫秒。所有条件满足后开始计时计时结束后才执行动作post_delay后置延时选填默认 0毫秒。动作执行完成后计时结束后再进入下一动作。源码还兼容历史遗留字段rear_delay当post_delay不存在时回退读取timeout超时时间选填默认 -1 即不限制毫秒。条件与pre_delay完成后开始计时等待超时则放弃当前动作直接进入下一个值为 0 时只检查一次不等待。旧的skip_if_not_ready字段已弃用——源码中检测到它会打印 DEPRECATED 警告并映射为timeout: 0若同时设置timeout则整条动作被忽略新作业请直接写timeout。一个典型组合是部署动作费用不足时默认无限等待给高费用干员部署加timeout: 30000可在 30 秒内费用不达标时放弃该步骤继续后续流程提升作业容错。八、真实作业解读OF-1 信用战斗仓库内置的 OF-1_credit_fight.json 是一份麻雀虽小五脏俱全的协议完整体现了各字段的协作{ minimum_required: v4.0.0, stage_name: OF-1, opers: [], groups: [ { name: 先锋, opers: [ { name: 推进之王, skill: 2 }, { name: 风笛, skill: 2 }, { name: 凛御银灰, skill: 3, skill_usage: 1 }, { name: 德克萨斯, skill: 2, skill_usage: 1 }, { name: 焰尾 }, { name: 凛冬 }, { name: 贾维 }, { name: 清道夫 }, { name: 讯使 }, { name: 芬 }, { name: 香草 } ] } ], actions: [ { type: SpeedUp }, { type: Deploy, name: 先锋, location: [5, 3], direction: Right }, { type: SkillDaemon } ], doc: { title: OF-1 Credit Fight, details: OF-1 Credit Fight } }解读groups定义了名为“先锋”的岗位11 名回费型先锋任选其一自动选练度最高者skill: 2指定 2 技能凛御银灰与德克萨斯额外标注skill_usage: 1好了就用动作时间轴共三步先SpeedUp切二倍速再在费用足够时Deploy 默认无限等待费用把选出的“先锋”部署到[5, 3]、朝右最后SkillDaemon进入挂机模式——之后只剩“好了就用”的技能自动释放直到战斗结束。整个过程仅用 3 条 action是“低练度、低操作”作业的标准范式。九、界面展示字段doc 与 doc_color每条 action 可选填doc描述文字与doc_color文字颜色如orange、red默认灰色仅在协议预览/执行界面展示无战斗逻辑作用type: Output的动作则专门用于输出doc内容本身界面不显示该步骤常被用来做字幕或解说。顶层doc中的details建议写上作者署名与参考攻略出处方便使用者追溯与致谢。十、编写与提交协议的注意事项汇总JSON 不带注释文档中的注释仅供阅读复制模板时必须手工删除stage_name、groups[].name当使用分组时、部署动作的location/direction、minimum_required是硬性必填项缺失会导致解析失败或运行时卡死干员名必须与仓库干员数据resource/battle_data.json一类数据源由BattleData配置加载中的名字一致否则parse_oper_usage()会告警并降级处理 requirements技能序号受稀有度约束3 技能需 6 星、2 技能需 4 星、1 技能需 3 星超规格会被静默重置为 0elapsed_time必须配合前置的ResetStopwatch动作否则等待条件永远无法满足三位数部署费用辨识不可靠费用条件尽量选cost_changes或避免依赖费用动作顺序即时间轴顺序SkillDaemon/摆完挂机一般应放在末尾协议文件放入resource/copilot/后通过ParadoxCopilotTask类任务参数copilot_file或copilot_list执行保全派驻场景另有 SSS 专属动作类型DrawCard、CheckIfStartOver与SSS_前缀的作业命名惯例可参照。以上字段与行为均可在 CopilotConfig.cpp 的解析函数与 AsstBattleDef.h 的OperUsage/Action/ActionType定义中逐一对照验证建议将这份“文档 源码 真实作业”三者对照作为编写新作业的标准流程。【免费下载链接】MaaAssistantArknights《明日方舟》小助手全日常一键长草| A one-click tool for the daily tasks of Arknights, supporting all clients.项目地址: https://gitcode.com/GitHub_Trending/ma/MaaAssistantArknights创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考