ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MaaAssistantArknights 自定义基建排班协议(custom_infrast)字段手册与源码实现解析

MaaAssistantArknights 自定义基建排班协议(custom_infrast)字段手册与源码实现解析 MaaAssistantArknights 自定义基建排班协议custom_infrast字段手册与源码实现解析【免费下载链接】MaaAssistantArknights《明日方舟》小助手全日常一键长草| A one-click tool for the daily tasks of Arknights, supporting all clients.项目地址: https://gitcode.com/GitHub_Trending/ma/MaaAssistantArknightsMaaAssistantArknights 的基建换班支持“自定义排班”模式用户把排班方案写成 JSON 文件放入resource/custom_infrast/目录即可让助手指令干员按既定顺序进驻各设施。本文基于 基建排班协议文档完整讲解该协议的全部字段、取值范围与默认值并结合 InfrastTask 解析实现 逐条印证各字段在 Core 端的真实处理逻辑读完你可以独立编写、排错并集成一套多天多班次的基建换班方案。一、协议定位文件驱动的自定义换班协议文档定义的对象是resource/custom_infrast/*.json。当任务参数mode为自定义Custom时InfrastTask::set_params 会读取filename与plan_index默认 0两个参数调用parse_and_set_custom_config完成加载if (mode Mode::Custom !m_running) { auto filename_opt params.findstd::string(filename); if (!filename_opt) { Log.error(filename is not set while custom mode is enabled); return false; } std::string filename filename_opt.value(); int index params.get(plan_index, 0); ... return parse_and_set_custom_config(utils::path(filename), index); }从源码可以看到几个硬性约束filename缺失时直接报错返回自定义模式下文件名是必选参数解析过程捕获json::exception与std::exception任何 JSON 解析失败都会输出Json parse failed日志并中止任务每个 JSON 文件可包含多个planplan_index指定本次执行哪一个计划见 plans 数组解析auto all_plans custom_json.at(plans).as_array(); if (index 0 || index int(all_plans.size())) { Log.error(index is out of range, plans size:, all_plans.size(), , index:, index); return false; }因此“一天三换”这类多计划方案的标准做法就是一个文件、plans数组放多个计划换班时递增plan_index。请注意 JSON 文件是不支持注释的下文的注释仅用于演示请勿直接复制使用。二、完整 JSON 结构一览以下为文档给出的完整字段示例含注释是理解整个协议的骨架{ title: 小号的换班方案, // 作业名可选 description: 哈哈哈哈, // 作业描述可选 plans: [ { name: 早班, // 计划名可选 description: lol, // 计划描述可选 description_post: , // 计划执行完时显示的描述可选 period: [ // 换班时间段可选 // 若当前时间在该区间内则自动选择该计划整个 json 文件中可能包含多个计划 // 如果该字段不存在则每次换班结束后自动切换为下一个计划 // core 不处理该字段若您使用接口集成 maa请自行实现该逻辑 [ 22:00, // 要求格式 hh:mm目前只是简单的比较数字大小如果要跨天请仿照该示例中写法 23:59 ], [ 00:00, 06:00 ] ], duration: 360, // 工作持续时长分钟保留字段目前无作用。以后可能到时间了弹窗提醒该换班了或者直接自动换了 Fiammetta: { // “菲亚梅塔” 为哪位干员使用可选不填写则不使用 enable: true, // 是否使用“菲亚梅塔”可选默认 true target: 巫恋, // 目标干员使用 OCR 进行需要传入对应客户端语言的干员名 order: pre // 在整个换班前使用还是换完班才用可选取值范围 pre / post默认 pre }, drones: { // 无人机使用可选不填写则不使用无人机 enable: true, // 是否使用无人机可选默认 true room: trading, // 为哪个类型房间使用取值范围 trading / manufacture index: 1, // 为第几个该类型房间使用对应左边 tab 栏序号取值范围 [1, 5] rule: all, // 使用规则保留字段目前无作用。以后可能拿来支持插拔等操作 order: pre // 在换干员前使用还是在换完才用可选取值范围 pre / post默认 pre }, groups: [ // 对于 control / manufacture / trading可以设置干员编组 { name: 古银, operators: [古米, 银灰, 梅] }, { name: 清流, operators: [清流, 森蚺, 温蒂] } ], rooms: { // 房间信息必选 // 取值范围 control / manufacture / trading / power / meeting / hire / dormitory / processing // 缺少某个则该设施使用默认算法进行换班。 // 若想不对某个房间换班请使用 skip 字段或直接在软件 任务设置 - 基建换班 - 常规设置 中取消该设施的勾选 control: [ { operators: [ 夕, // 使用 OCR 进行需要传入对应客户端语言的干员名 令, 凯尔希, 阿米娅, 玛恩纳 ] } ], manufacture: [ { operators: [芬, 稀音, 克洛丝], sort: false // 是否排序按照上面 operators 的顺序可选默认 false // 例子当使用稀音、帕拉斯、巫恋、等干员且 sort: false干员顺序可能会被打乱导致暖机效果丢失。 // 使用 sort: true可以避免这个问题 }, { skip: true // 是否跳过当前房间数组序号对应可选默认 false // 若为 true其他字段均可为空。仅跳过换干员操作其他如使用无人机、线索交流等仍会正常进行 }, { operators: [Castle-3], autofill: true, // 使用原先的算法自动填充剩下的位置可选默认 false // 若 operators 为空则该房间完整的使用原先算法进行排班 // 若 operators 不为空将仅考虑单干员效率而不考虑整个组合效率 // 注意可能和后面自定义的干员产生冲突比如把后面需要的干员拿到这里用了请谨慎使用或将 autofill 的房间顺序放到最后 product: Battle Record // 当前制造产物可选。 // 若识别到当前设施与作业中设置的产物不符合界面会弹个红色字样提示以后可能有更多作用 // 取值范围 Battle Record | Pure Gold | Dualchip | Originium Shard | LMD | Orundum }, { operators: [多萝西], candidates: [ // 备选干员可选。这里面的有谁用谁选满为止 // 与 autofilltrue 不兼容即该数组不为空时autofill 需要为 false 星源, 白面鸮, 赫默 ] }, { use_operator_groups: true, // 设置为 true 以使用 groups 中的干员编组默认为 false operators: [ // 启用后, operators 中的名字将被解释为编组名 古银, // 将按照心情阈值以及设置顺序选择编组 清流 // 如 古银 组中有干员心情低于阈值将使用 清流 组 ] } ], meeting: [ { autofill: true // 这个房间内整个 autofill } ] } }, { name: 晚班 // ... } ] }结构上分为三层顶层描述title/description供 GUI 展示、计划数组plans每个计划对应一次换班、计划内的房间与全局选项Fiammetta/drones/groups/rooms。其中title、description、name、description、description_post等展示字段不参与 Core 的换班逻辑。period 与 durationGUI 侧字段Core 不处理period时间段选择计划用。文档明确“core 不处理该字段若您使用接口集成 maa请自行实现该逻辑”。格式为hh:mm目前是简单的数字大小比较跨天区间要拆成两个区间写如示例中的22:00~23:59与00:00~06:00。从源码看parse_and_set_custom_config 全程未读取period与文档表述一致。duration工作持续时长分钟保留字段目前无作用。同样可以在源码中确认其未被解析。三、rooms设施类型与任务对象的映射rooms是计划内的必选字段。文档给出的 8 个合法 key 与源码中的分发逻辑一一对应设施分发代码rooms 的 key映射到的基建任务对应设施controlInfrastControlTask指挥所manufactureInfrastMfgTask制造站tradingInfrastTradeTask贸易站powerInfrastPowerTask发电站meetingInfrastReceptionTask会客室hireInfrastOfficeTask人事部processingInfrastProcessingTask加工站dormitoryInfrastDormTask宿舍两个重要行为缺省即默认算法rooms中没写的设施仍会按默认算法换班未知 key 直接判错源码遇到不认识的设施名会Log.error并return false整个换班任务终止。写 JSON 时 key 拼错不会静默忽略这点和很多配置系统不同。单个房间对象的字段解析每个设施的值是数组数组下标对应游戏内该类型设施的 tab 顺序。解析入口见 room_config 构造各字段的默认值与源码一致字段类型/取值默认值说明operators干员名字数组OCR 识别须与客户端语言一致空空名字会被跳过并给出警告operators.name is emptyskipboolfalse跳过该房间的换干员操作无人机、线索交流等其他行为仍会正常进行autofillboolfalse用默认算法填充剩余位置operators为空则整间走默认算法不为空则只按单干员效率补位sortboolfalse是否严格按operators书写顺序进驻稀音/帕拉斯/巫恋等需要固定顺序发挥暖机/技能效果时建议trueproduct字符串无当前制造产物识别到实际产物不符时界面弹红字提示candidates干员名字数组空备选干员有谁用谁、选满为止与autofill: true不兼容use_operator_groupsboolfalse启用后operators中的名字被解释为groups中的编组名这些字段的内存表示定义在 CustomRoomConfig 结构体struct CustomRoomConfig { enum class Product { Unknown, BattleRecord, PureGold, Dualchip, OriginiumShard, LMD, Orundum, }; bool skip false; bool use_operator_groups false; std::unordered_mapstd::string, std::vectorstd::string operator_groups; std::vectorstd::string names; bool autofill false; Product product Product::Unknown; std::vectorstd::string candidates; int selected 0; bool sort false; };product 的白名单校验product的取值在 解析代码 中通过白名单映射为枚举Battle Record、Pure Gold、Dualchip、Originium Shard、LMD、Orundum。注意Orundum是源石Orundum的拼写写错拼写会触发Unknown product错误并使整个解析失败——这是自定义排班排错时最容易被忽略的一点。autofill 与 candidates 的冲突规则operators为空 autofill: true该房间完全交给默认算法示例中meeting的用法operators非空 autofill: true只考虑单干员效率补位不考虑组合效率可能把后面自定义房间需要的干员提前用掉。文档建议把 autofill 房间排在数组最后因为自定义房间是按顺序逐间进驻的candidates非空时autofill必须为false。源码解析上两者可共存语义冲突由使用者自行规避。四、groups干员编组groups在 计划解析之初被整体录入 为一个“编组名 → 干员列表”的映射供control/manufacture/trading的房间通过use_operator_groups: true引用// 录入干员编组 std::unordered_mapstd::string, std::vectorstd::string ori_operator_groups; if (auto opt cur_plan.findjson::array(groups)) { for (const auto group_info : opt.value()) { std::vectorstd::string oper_group; for (const auto oper_info : group_info.at(operators).as_array()) { oper_group.emplace_back(oper_info.as_string()); } ori_operator_groups.emplace(group_info.at(name).as_string(), std::move(oper_group)); } }当某房间设置了use_operator_groups且operators引用了编组名时解析器会把对应编组展开装载进房间配置。使用时按编组书写顺序依次尝试若当前组有干员心情低于阈值则跳过使用下一组。编组判定用到的心情阈值并非 JSON 字段而是任务的threshold参数源码中默认为 0.3会统一下发到各设施任务。从源码结构看编组的实际挑选逻辑位于 InfrastAbstractTask 与各设施任务的自定义排班分支中。五、Fiammetta为指定干员“开”菲亚梅塔Fiammetta字段让菲亚梅塔进驻宿舍并为目标干员targetOCR 匹配客户端语言名字恢复精力。解析逻辑见 Fia 处理代码有几个文档没写透的细节enable缺省为truetarget为空时会警告Fiammettas target is unsetted or empty并放弃该段逻辑不是报错源码里构造了两个宿舍任务一个pre_task先把目标干员放到宿舍第二位再把菲亚梅塔与其排序进驻sort: true。注释写明了原因如果菲亚梅塔在换班前就位于宿舍第二个位置直接换并不会让她的技能生效位置没变还在第二个位置所以强制给他换个顺序见 L440-L451order: pre默认时这两个任务被插入子任务队列最前面开始换班之前执行post时插在最后面换完班再执行if (Fia_json.get(order, pre) ! post) { m_subtasks.insert(m_subtasks.begin(), { m_infrast_begin_task_ptr, pre_task_ptr, Fia_task_ptr }); Fia_is_pre true; } else { m_subtasks.insert(m_subtasks.end(), { pre_task_ptr, Fia_task_ptr, m_infrast_begin_task_ptr }); }六、drones无人机进驻drones控制为指定房间提前派出无人机自动进驻目标干员。解析见 drones 处理代码字段取值/默认值说明enablebool默认true缺省为启用写drones对象但enable: false则完全不使用roomtrading/manufacture必填且只能二选一为空警告退出其他值报错终止整个解析indexint[1, 5]默认1对应左侧 tab 序号源码中减 1 转成 0 基下标存储orderpre/post默认pre换干员前还是换完班后才使用无人机rule保留字段目前无作用源码未解析将来可能用于支持插拔等操作room决定配置挂到哪个任务上trading→InfrastTradeTaskmanufacture→InfrastMfgTask见 L506-L513。菲亚梅塔与无人机的优先级当菲亚梅塔为pre且无人机也是pre时源码会额外插入一个“仅无人机”的专用任务到最前面L480-L505注释说明此时“无人机和肥鸭同时为 true 时优先使用无人机”。也就是说两种pre配置同时存在不会冲突执行顺序是无人机 → 菲亚梅塔 → 正常换班。七、排班执行顺序FacilityStep 调度链各设施任务的执行顺序由 FacilityStep 与 build_facility_plan 决定。枚举定义了宿舍前置、宿舍重排、制造检查、制造、贸易、发电、人事、指挥、会客、加工、训练、助战切换等步骤从源码结构看常规Default模式设施是“启用集合”数组顺序不参与调度步骤按固定顺序执行宿舍前置 → 发电 → 人事 → 指挥 → 制造 → 贸易 → 会客 → 宿舍重排 → 加工 → 训练 → 助战切换仅启用项才执行自定义/轮换Custom/Rotation模式步骤按传入的设施数组顺序生成Rotation 模式还会跳过宿舍、发电、人事、指挥这几类设施。这意味着在自定义模式下哪些设施被换班、以什么顺序换班由启用集合与顺序共同决定而 JSON 中rooms的缺失设施仍会落入默认算法处理见上文分发代码。设施的技能效率数据则由 InfrastConfig 从资源仓库的基建技能配置中加载供默认算法与autofill的补位计算使用。八、编写排班文件的实操要点文件位置放入资源仓库的resource/custom_infrast/目录文件扩展名.jsonJSON 不支持注释文档示例中的注释仅供阅读。干员名必须与客户端语言一致所有operators、candidates、Fiammetta.target都走 OCR 匹配国服写中文、日服写日文。最小可用文件rooms是唯一必填项其余全可选{ title: 手动排班, plans: [ { name: 早班, rooms: { control: [ { operators: [夕, 令, 凯尔希, 阿米娅, 玛恩纳] } ], manufacture: [ { operators: [芬, 稀音, 克洛丝], sort: true }, { skip: true }, { autofill: true } ] } } ] }一天多换plans数组放多个计划GUI 侧可通过period按时间段自动选择用接口集成时自行维护plan_index递增逻辑period与duration均不由 Core 处理。参考样例协议文档附带了243_layout_3_times_a_day.json与153_layout_3_times_a_day.json两个“153/243 极限效率、一天三换”的官方样例位于资源仓库resource/custom_infrast/目录可作为复杂方案的模板。文档同时推荐了两类第三方排班生成工具可视化排班生成工具、自动生成基建排班表工具适合干员多、组合复杂时批量生成 JSON。排错顺序换班整体没跑起来时优先查 JSON 语法、rooms的 key 拼写、product拼写、drones.room取值——这四处都会直接导致解析失败Log.error 返回 falseFiammetta.target/drones.room为空只是警告并跳过对应功能。九、字段速查表层级字段必填默认值备注顶层title/description否无仅展示顶层plans是—计划数组plan_index选取其一计划name/description/description_post否无展示字段计划period否无GUI 侧按时间段选计划Core 不处理跨天拆两段计划duration否无保留字段当前无作用计划Fiammetta.enable/target/order否true/—/pretarget 需客户端语言名字pre 会插入前置宿舍任务强制换位计划drones.enable/room/index/order否true/—/1/preroom 仅限 trading/manufacture与 Fia pre 同时启用时无人机先行计划groups[].name/operators否无供 use_operator_groups 房间引用计划rooms是—缺省设施走默认算法未知 key 报错房间operators否空OCR 匹配空名被跳过房间skip否false仅跳过换干员房间sort否false保持进驻顺序保住暖机等效果房间autofill否false与 candidates 不兼容建议排数组最后房间product否无白名单Battle Record/Pure Gold/Dualchip/Originium Shard/LMD/Orundum房间candidates否空备选干员选满为止房间use_operator_groups否falseoperators 按编组名解释心情低于阈值切换下一组配套文档可参考 协议总览、SSS 协议 等本文涉及的核心源码为 InfrastTask.cpp协议解析与任务分发与 AsstInfrastDef.h排班数据结构与步骤调度均可以直接打开对照阅读。【免费下载链接】MaaAssistantArknights《明日方舟》小助手全日常一键长草| A one-click tool for the daily tasks of Arknights, supporting all clients.项目地址: https://gitcode.com/GitHub_Trending/ma/MaaAssistantArknights创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表