- name
- autocollect-add-route
- description
- 新增或改写 MaaEnd 的 AutoCollect 自动采集路线说明。默认包含路线文件创建、AutoCollect 主入口接线、任务选项注册和多语言文案补充。适用于“参考现有 AutoCollect 路线新建一条采集线”“给定传送点与路径点位生成 AutoCollectRouteX.json 并注册到任务中”“用户已经写好路线文件,只需要补注册接口”等场景。注意:本 skill 仅适用于参考 `assets/resource/pipeline/AutoCollect/AutoCollectRoute6.json` 的单段 `MapNavigateAction` 路线,不适用于 `MapTrackerMove` 路线,也不再处理多段 `GotoFindN` 路线;定位节点必须使用 `MapLocateAssertLocation`。
- argument-hint
- 如果是新建路线,推荐直接提供任务名(如“路线6:四号谷地-轻红柱状菌”)、第一个传送点(如 `SceneEnterWorldValleyIVTheHub2`)、断言点和完整 path 点列,以及“点击采集”或“挖掘类路线”。如果用户已经有路线文件、只需要注册接口,则只提供任务名即可。
# AutoCollect 新增路线
## 目的
在 MaaEnd 现有的 AutoCollect 体系中,支持两类常见工作:
- 新建一条完整可用的自动采集路线,并同步完成相关注册
- 在已有 `AutoCollectRouteX.json` 的前提下,只补齐注册接口和多语言文案
默认涉及的文件包括:
- `assets/resource/pipeline/AutoCollect/AutoCollectRouteX.json`
- `assets/resource/pipeline/AutoCollect.json`
- `assets/tasks/AutoCollect.json`
- `assets/locales/interface/*.json`
这里的“新路线建立”仅指参考 `AutoCollectRoute6.json` 的单段路线,也就是:
- 定位节点使用 `MapLocateAssertLocation`
- 导航节点固定为单个 `AutoCollectRouteXGoto`
- `MapNavigateAction` 的采集点通过同一条 `path` 中的动作点控制
- 最终 `next` 直接指向 `AutoCollectRouteXEnd`
## 适用范围
以下场景使用本 skill:
- 参考现有 AutoCollect 单段路线新增一条 `AutoCollectRouteX.json`
- 用户提供传送点和路径点位,要求生成并注册一条单段 AutoCollect 路线
- 用户已经写好 `AutoCollectRouteX.json`,只要求补齐 `AutoCollect.json`、`assets/tasks/AutoCollect.json` 和 locale 注册
- 用户要求补齐 AutoCollect 路线的任务注册、多语言文案和主入口接线
以下场景不适用本 skill:
- `EnvironmentMonitoring` 路线
- `AutoEssence` 路线
- `AutoEcoFarm` 路线
- Go Service 算法扩展
- 使用 `MapTrackerMove` 的 AutoCollect 路线
- 任何多段 `GotoFind1/2/3...` 结构的 AutoCollect 路线
## 开始前先读什么
优先阅读并对照以下文件:
1. `assets/resource/pipeline/AutoCollect/AutoCollectRoute6.json`
2. `docs/zh_cn/developers/components/map-navigator.md`
3. `assets/resource/pipeline/AutoCollect.json`
4. `assets/tasks/AutoCollect.json`
5. `assets/locales/interface/zh_cn.json`
必要时补充阅读:
- `assets/locales/interface/zh_tw.json`
- `assets/locales/interface/en_us.json`
- `assets/locales/interface/ja_jp.json`
- `assets/locales/interface/ko_kr.json`
- `assets/resource/pipeline/Interface/SceneValleyIV.json`
- 其他 `SceneManager` / `Interface` 相关文件
## 先判断任务类型
动手前,先判断当前需求属于哪一种:
### 1. 新建路线文件
适用于:用户还没有 `AutoCollectRouteX.json`,希望你生成路线文件并完成注册。
这一类需要完整参数:
- 任务名
- 第一个传送点
- 断言点
- 完整路径点列
- 采集类型
### 2. 仅注册接口
适用于:用户已经有现成的 `AutoCollectRouteX.json`,只希望把它接入任务入口和选项。
这一类默认只需要:
- 任务名
然后直接完成以下注册:
- `assets/resource/pipeline/AutoCollect.json`
- `assets/tasks/AutoCollect.json`
- `assets/locales/interface/*.json`
不需要再追问传送点、断言点、path 或采集类型。
## 必要参数
### 场景 A:新建路线文件
默认流程下,以下 5 类信息是必需的:
1. 任务名
2. 第一个传送点
3. 断言点与完整路径点列
4. 采集类型
### 场景 B:仅注册接口
默认只需要 1 项:
1. 任务名
### 1. 任务名
- 示例:`路线6:四号谷地-轻红柱状菌`
- 必须能从任务名里解析出路线编号
- `路线6` 将决定:
- 文件名:`AutoCollectRoute6.json`
- 节点前缀:`AutoCollectRoute6...`
- 子入口:`AutoCollectRoute6Sub`
- 任务 case:`Route6`
- locale 键:`option.AutoCollectRoute6.label`
### 2. 第一个传送点
- 示例:`SceneEnterWorldValleyIVTheHub2`
- 它决定 `Start.next` 中的 `[JumpBack]SceneEnterWorldXxx`
- 仅在“新建路线文件”场景需要
### 3. 断言点与完整路径点列
- 断言点用于生成 `MapLocateAssertLocation.target`
- 完整路径点列用于生成单个 `AutoCollectRouteXGoto.action.param.custom_action_param.path`
- 用户通常会把采集点标记成 `[x, y, true]`
- 本 skill 需要在写入前把这些 `true` 转换成具体动作字符串
- 仅在“新建路线文件”场景需要
### 4. 采集类型
- 点击采集路线:将 `[x, y, true]` 转换为 `[x, y, "COLLECT"]`
- 挖掘类路线:将 `[x, y, true]` 转换为 `[x, y, "DIG"]`
- 仅在“新建路线文件”场景需要
### 5. 是否需要一并注册接口
- 如果用户明确说“只写路线文件,不注册”,那就只生成路线文件
- 如果用户没有特别说明,默认同时完成注册
## 缺少参数时的处理
### 新建路线文件时
遇到以下情况时,先向用户确认,不要直接生成路线:
- 没有任务名,无法确定路线编号和文件命名
- 任务名不符合“路线X:xxx”格式,无法安全解析编号
- 没有第一个传送点,无法确定 `[JumpBack]SceneEnterWorldXxx`
- 没有断言点,无法生成 `MapLocateAssertLocation.target`
- 没有完整路径点列,无法生成 `path`
- 没有采集类型,无法把 `true` 转换成 `COLLECT` 或 `DIG`
推荐追问方式尽量简短,例如:
- “还缺任务名,请给我类似 `路线6:四号谷地-轻红柱状菌` 的名称。”
- “还缺第一个传送点,请给我类似 `SceneEnterWorldValleyIVTheHub2` 的入口名。”
- “还缺断言点,请给我传送后用于定位的坐标。”
- “还缺完整 path 点列,请把整条单段路线的点位发我。”
- “还缺采集类型,请确认是点击采集还是挖掘路线。”
### 仅注册接口时
遇到以下情况时,先向用户确认,不要直接注册:
- 没有任务名,无法确定路线编号和注册键名
- 任务名不符合“路线X:xxx”格式,无法安全解析编号
只要任务名齐全,就直接执行注册,不需要追问其它路线参数。
## 核心判断规则
### 1. 先判断是“新建路线”还是“只注册”
优先观察用户给出的关键信息:
- 如果用户明确说“已经有路线文件,只注册接口”,则直接走注册流程
- 如果用户给出 `AutoCollectRouteX.json` 文件路径并要求接入任务,也按“只注册”处理
- 如果用户要求生成 `path`、断言点或整条路线文件,则走“新建路线”流程
### 2. 只处理 `Route6` 风格单段路线
优先观察用户给出的关键信息:
- 如果用户明确说“参考 Route6”,通常就是本 skill 的目标场景
- 如果路线使用 `MapNavigateAction + MapLocateAssertLocation + AutoCollectRouteXGoto`,说明符合本 skill 范围
- 如果用户要求拆成 `GotoFind1/2/3...`,说明这不属于本 skill 的范围,应先澄清
- 如果路线使用 `MapTrackerMove`,说明这不属于本 skill 的主流程,应先澄清
本 skill 仅处理以下结构:
- `AutoCollectRouteXAssertLocation`
- `AutoCollectRouteXGoto`
- `AutoCollectRouteXEnd`
不要在本 skill 中生成以下结构:
- `AutoCollectRouteXGotoFind1`
- `AutoCollectRouteXGotoFind2`
- 任意 `anchor` 串联的多段节点
- `MapTrackerMove`
### 3. 传送入口与断言点不要混淆
用户可能会说“传送点参考某条路线”,这通常只表示:
- 复用该路线的 `SceneEnterWorldXxx`
- 复用同一区域的大地图入口
这不一定表示复用旧路线的断言坐标。
如果用户另外提供了“第一个点用于传送后定位”或显式给出了定位坐标,则:
- `AutoCollectRouteXAssertLocation` 必须使用用户新给的坐标
- 不要继续沿用参考路线原本的 `target`
### 4. 首个断言点与导航路径要分离
如果用户明确说明:
- “第一个点只是定位点”
- “使用 `MapLocateAssertLocation` 进行判断”
则:
- 首个坐标先视为断言点 `[x, y]`,再换算为 `target: [x-10, y-10, 20, 20]`
- 不要把这个点再塞回 `path` 里
- 不要写成 `MapTrackerAssertLocation.expected` 结构;这里应直接写 `zone_id` 和 `target`
### 5. 把用户输入的 `true` 转换成动作字符串
根据 `map-navigator.md`,MapNavigator 采集语义使用动作字符串,而不是布尔值:
- `COLLECT`: 采集点
- `DIG`: 挖掘点
因此当用户给出 `[x, y, true]` 时,本 skill 应按采集类型做归一化:
- 点击采集路线:`[x, y, true]` -> `[x, y, "COLLECT"]`
- 挖掘类路线:`[x, y, true]` -> `[x, y, "DIG"]`
如果用户已经直接给出 `[x, y, "COLLECT"]` 或 `[x, y, "DIG"]`,则沿用原值,不要重复改写。
### 6. 动作点保留在单段 `path` 中
如果用户给出的路径中包含采集点标记,则应:
- 保留在同一个 `path` 数组中
- 保持单个 `AutoCollectRouteXGoto` 节点
- 不要因为出现多个采集点就拆成 `GotoFindN`
- 不要再使用旧的 `anchor + AutoCollectClickStart` / `AutoCollectDigStart` 链式写法
## 需要整理出的信息
### 新建路线文件时
动手前,尽量整理齐以下字段:
| 字段 | 说明 |
| ---------------- | ------------------------------------------------------------------ |
| `TaskLabel` | 任务名,例如 `路线6:四号谷地-轻红柱状菌` |
| `RouteId` | 从 `TaskLabel` 解析出的编号,例如 `6` |
| `RouteFile` | 目标文件名,例如 `AutoCollectRoute6.json` |
| `TemplateRoute` | 参考路线,例如 `Route6` |
| `EnterWorldNode` | 第一个传送点,例如 `SceneEnterWorldValleyIVTheHub2` |
| `AssertTarget` | 断言框坐标;若断言点为 `[x, y]`,默认换算为 `[x-10, y-10, 20, 20]` |
| `ZoneId` | 通常来自 `path` 第一项 `{"action":"ZONE","zone_id":"..."}` |
| `ActionType` | 固定为 `MapNavigateAction` |
| `CollectType` | `Click` 或 `Dig`,决定 `true` 转成 `COLLECT` 还是 `DIG` |
| `GotoNode` | 固定为 `AutoCollectRouteXGoto` |
| `Path` | 完整单段路径;采集动作通过 `"COLLECT"` / `"DIG"` 标记表达 |
其中以下 4 项应优先确认:
- `TaskLabel`
- `EnterWorldNode`
- `AssertTarget`
- 原始完整路径点列
### 仅注册接口时
动手前至少确认:
- `TaskLabel`
- `RouteId`
- `RouteFile`
- `RouteSub`
- `RouteCase`
- `LocaleKey`
## 标准实施步骤
### 场景 A:新建路线文件
#### 第一步:从任务名解析路线编号
任务名必须形如:
- `路线6:四号谷地-轻红柱状菌`
- `路线12:武陵城-某某资源`
解析规则:
1. 从任务名开头提取 `路线X`
2. 得到 `RouteId = X`
3. 用 `RouteId` 推导以下命名:
- `AutoCollectRouteX.json`
- `AutoCollectRouteXStart`
- `AutoCollectRouteXEnd`
- `AutoCollectRouteXAssertLocation`
- `AutoCollectRouteXGoto`
- `AutoCollectRouteXSub`
- `RouteX`
- `option.AutoCollectRouteX.label`
如果任务名不满足上述格式,先让用户补一个合规名称,再继续。
#### 第二步:归一化用户给出的路径点
在生成 JSON 前,先按以下规则整理原始 path:
- 保留首个 `ZONE` 节点不变
- 保留普通坐标点 `[x, y]` 不变
- 如果用户给的是 `[x, y, true]`:
- 点击采集路线改成 `[x, y, "COLLECT"]`
- 挖掘类路线改成 `[x, y, "DIG"]`
- 如果用户给的是 `[x, y, "COLLECT"]` 或 `[x, y, "DIG"]`,直接保留
- 不要把 `true` 原样写进最终 `path`
#### 第三步:生成 `AutoCollectRouteX.json`
文件骨架固定如下:
```json
{
"AutoCollectRouteXStart": { ... },
"AutoCollectRouteXEnd": { ... },
"AutoCollectRouteXAssertLocation": { ... },
"AutoCollectRouteXGoto": { ... }
}
```
不要生成任何 `GotoFindN` 节点。
##### `Start` 节点规则
- `next` 第一个目标是 `AutoCollectRouteXAssertLocation`
- `next` 第二个目标是对应的 `[JumpBack]SceneEnterWorldXxx`
- `focus.Node.Recognition.Succeeded` 使用中文,例如:`开始路线X`
##### `End` 节点规则
保持:
```json
"pre_delay": 0,
"post_delay": 0
```
##### `AssertLocation` 节点规则
- 必须使用 `MapLocateAssertLocation`
- `desc` 使用中文,例如:`传送到采集点`
- `recognition` 固定写成字符串:`"Custom"`
- `custom_recognition` 固定写成:`"MapLocateAssertLocation"`
- `zone_id` 不作为独立入参单独向用户追问,优先从 `path` 的第一个 `ZONE` 推导
- 如果用户给的是断言点 `[x, y]`,默认换算为 `[x-10, y-10, 20, 20]`
- 仅当用户明确给出其它容差矩形时,才不要使用上述默认换算
- `action` 固定为 `"DoNothing"`
- 不要写 `expected` 数组
- 不要写 `map_name`
- `next` 固定指向 `AutoCollectRouteXGoto`
标准结构参考当前 `Route6`:
```json
{
"AutoCollectRouteXAssertLocation": {
"desc": "传送到采集点",
"recognition": "Custom",
"custom_recognition": "MapLocateAssertLocation",
"custom_recognition_param": {
"zone_id": "ValleyIV_Base",
"target": [
520,
687,
20,
20
]
},
"action": "DoNothing",
"next": [
"AutoCollectRouteXGoto"
]
}
}
```
##### `Goto` 节点规则
本 skill 新建路线固定使用 `MapNavigateAction`:
- `action.type = "Custom"`
- `action.param.custom_action = "MapNavigateAction"`
- `action.param.custom_action_param.path` 第一项必须是:
```json
{
"action": "ZONE",
"zone_id": "..."
}
```
节点内容规则:
- 节点名固定为 `AutoCollectRouteXGoto`
- `desc` 使用中文,例如:`前往采集点`
- `path` 为完整单段路线
- 路径内的采集点应使用 `"COLLECT"` 或 `"DIG"`
- `next` 直接指向 `AutoCollectRouteXEnd`
- 不要写 `anchor`
- 不要拆分为多个导航节点
- 不要把 `[x, y, true]` 直接保留到最终 JSON 中
#### 第四步:按需注册接口
如果用户未明确要求“只生成路线文件”,则默认继续完成注册:
- `assets/resource/pipeline/AutoCollect.json`
- `assets/tasks/AutoCollect.json`
- `assets/locales/interface/*.json`
### 场景 B:仅注册接口
#### 第一步:从任务名解析注册命名
从任务名推导:
- `RouteFile`: `AutoCollectRouteX.json`
- `RouteSub`: `AutoCollectRouteXSub`
- `RouteCase`: `RouteX`
- `LocaleKey`: `option.AutoCollectRouteX.label`
#### 第二步:注册到 `assets/resource/pipeline/AutoCollect.json`
必须同步修改两处:
- 在 `AutoCollectStart.next` 中加入 `"[JumpBack]AutoCollectRouteXSub"`
- 新增 `AutoCollectRouteXSub` 节点并指向 `AutoCollectRouteXStart`
#### 第三步:注册到 `assets/tasks/AutoCollect.json`
必须同步修改两处:
- 如项目默认勾选所有路线,则把 `RouteX` 追加到 `default_case`
- 在 `cases` 中新增 `RouteX` 对应项
#### 第四步:补充 `assets/locales/interface/*.json`
至少新增以下语言:
- `zh_cn`
- `zh_tw`
- `en_us`
- `ja_jp`
- `ko_kr`
统一新增键:
```json
"option.AutoCollectRouteX.label": "..."
```
## 文案规范
路线文件内的提示文案应遵守以下规则:
- `focus.Node.Recognition.Succeeded` 用中文
- `desc` 用中文
- `AssertLocation` 必须使用 `MapLocateAssertLocation`
- `Goto` 使用单段命名和单段文案
推荐写法:
- `Start.focus`: `开始路线X`
- `AssertLocation.desc`: `传送到采集点`
- `Goto.desc`: `前往采集点`
不要写英文内部提示,例如:
- `Start Route X`
- `Arrive at collection point`
在 GitHub 查看