--- name: side-story-navigation description: 新增/更新 SideStory(别传)活动关卡导航。涵盖 tasks/Stages 导航任务、StageActivityV2.json 活动配置、MaaRelease 仓库同步三个文件的联动修改。用户要求添加新活动导航、更新活动关卡、活动开放或复刻时调整导航,以及提到同步 MaaRelease 时均应使用本 skill。 --- # SideStory 活动导航 Skill 新增或更新一个 SideStory 活动的关卡导航,涉及多个文件的联动修改。 ## 用户输入格式 典型输入是一行式:活动 wiki 链接 + 关卡号与掉落物名称粘着的配对(搓玉关如有一并给出): ``` https://prts.wiki/w/昨日海 6全新装置 7转质盐组 8液化高能气体 ``` - wiki 链接用 WebFetch 抓取,提取:活动全名、关卡开放起止时间、分期章节名(二期/三期章节名及其开放时间)。**关卡前缀(关卡代号形如 `YW-N`)在 wiki 活动主页通常没有**,可靠路径是从关卡子页面确认(如直接访问 `https://prts.wiki/w/-1` 验证页面存在),拿不准就向用户要。 - `<关卡号><材料名>` 配对:材料名在 `resource/item_index.json` 按 `name` 字段反查 key,得 Drop 的 item ID。 - 选章三件套(方式、识别内容、roi 坐标)与进活动等待时间不在输入里,需另行向用户收集。 ## 必需信息清单 先从用户输入与 wiki 链接提取;仍缺的向用户收集,列出缺少的项目。 | # | 信息项 | 来源 | 说明 | 示例 | |---|--------|------|------|------| | 1 | 活动前缀代号 XX | wiki/用户 | 两字母关卡前缀;wiki 活动主页通常无关卡代号,从关卡子页面确认(访问 `prts.wiki/w/-1` 验证)或直接问用户 | `TO` | | 2 | 活动全名 | wiki | 填入 StageActivityV2 的 Tip/StageName | `昨日海` | | 3 | OpenOcr 识别文字 | wiki | 活动名、二期章节名、三期章节名(如有),见 §2.4 | `昨日海, 我们的伊比利亚` | | 4 | 关卡编号列表 | 用户输入 | 通常后三关 + 可选搓玉关 | `6, 7, 8` 或 `4, 6, 7, 8` | | 5 | 各关卡掉落物名称(非搓玉关) | 用户输入 | 用于查 `item_index.json` 取 ID | `全新装置、转质盐组、液化高能气体` | | 6 | 搓玉关掉落描述(如有搓玉关) | 用户 | 直接填入 Drop 字段,不查表 | `搓玉效率0.98` | | 7 | 关卡开放时间 | wiki | 起止时间,**用关卡关闭时间,勿用商店截止时间**(见 §3.2) | `10.9 12:00 — 10.23 03:59` | | 8 | 选章方式 | 用户 | OCR 文字 / 模板图 | OCR「伊比利亚」或模板图 | | 9 | 选章识别内容 | 用户 | OCR 文字或模板图文件名;基本是第一期章节名(或其局部),但具体措辞与能否被 OCR 识别无法预判,须由用户从活动内截图确认 | `伊比利亚` | | 10 | 选章 roi 坐标 | 用户 | 用户可能用 `[x, y, w, h]` 或 `x+w y+h` 两种格式之一 | `[870, 560, 120, 50]` 或 `x870+120 y560+50` | | 11 | 进活动后等待时间 | 用户 | postDelay 毫秒数,默认 5000 | `5000`(等 5 秒) | > 若选章方式为模板图,还需额外提醒用户提供模板图片,并准备修改 `MinimumRequired` 版本号。 ## 0. 术语 | 简称 | 含义 | |------|------| | **XX** | 活动前缀代号,如 `TD`、`TO`、`AT`,取自关卡名 `XX-7` 的前半 | | **tasks 导航文件** | `resource/tasks/Stages/XX.json` | | **StageActivityV2** | `build/bin/Debug/cache/gui/StageActivityV2.json`(主仓库的缓存副本) | | **MaaRelease** | 上级目录 `../MaaRelease/MaaAssistantArknights/api/` 下的镜像文件 | ## 1. 涉及的文件 | # | 文件路径 | 必需性 | 作用 | |---|----------|--------|------| | 1 | `resource/tasks/Stages/XX.json` | ✅ 必须 | 关卡导航任务定义(OCR 识别活动入口、选章、找关) | | 2 | `build/bin/Debug/cache/gui/StageActivityV2.json` | ✅ 本地测试 | 本地构建缓存,客户端运行时从远程 API(`gui/StageActivityV2.json`)拉取,改此文件用于本地测试 | | 3 | `../MaaRelease/MaaAssistantArknights/api/gui/StageActivityV2.json` | ✅ 必须 | MaaRelease 远程源文件,StageActivityV2 的真正来源 | | 4 | `../MaaRelease/MaaAssistantArknights/api/resource/tasks.json` | 🔶 可选 | MaaRelease 精简 tasks 覆盖层(只放活动导航,依赖项由客户端本地资源提供) | ## 2. tasks 导航文件结构(`resource/tasks/Stages/XX.json`) 参考往期活动(如 `AT.json`、`ME.json`、`AveMujica.json`)。 ### 2.1 关卡范围 - 通常是活动的**后三关**(如 7/8/9、6/7/8、8/9/10),但具体关卡编号由用户提供。 - 可能有额外的低关卡用于**搓玉**(如第 4 关、第 5 关),搓玉关与后三关一并加入导航。 ### 2.2 任务定义模板 ```jsonc { // —— 关卡入口(按编号从小到大)—— "XX-4": { "algorithm": "JustReturn", "sub": ["XX-4@XX-OpenOpt"], "next": ["XX-4@SideStoryStage", "XX-4@SwipeToStage"] }, "XX-7": { ... }, "XX-8": { ... }, "XX-9": { ... }, // —— 关卡识别(按编号从小到大)—— "XX-4@SideStoryStage": { "text": ["XX-4"] }, "XX-7@SideStoryStage": { "text": ["XX-7"] }, "XX-8@SideStoryStage": { "text": ["XX-8"] }, "XX-9@SideStoryStage": { "text": ["XX-9"] }, // —— 活动入口 —— "XX-OpenOpt": { "algorithm": "JustReturn", "next": ["XX-OpenOcr", "XX-Open"] }, "XX-Open": { "baseTask": "SS-Open", "postDelay": 5000, // 进活动后等待时间,按需调整 "template": ["StageSideStory.png", "StageActivity.png"], "next": ["XXChapterToXX"] }, "XX-OpenOcr": { "baseTask": "SS-OpenOcr", "text": [...], // 见下方 OCR 文本规则 "postDelay": 5000, "next": ["XXChapterToXX"] }, // —— 选章(进入活动后选择关卡列表)—— "XXChapterToXX": { // 方式 A:OCR 识别(章节名可被 OCR 时优先使用) "algorithm": "OcrDetect", "action": "ClickSelf", "text": ["章节名"], "roi": [x, y, w, h], "postDelay": 2000, "next": ["#self", "SideStoryStage", "ChapterSwipeToTheRight"] } } ``` ### 2.3 `XXChapterToXX` 选章任务的两种方式 | 方式 | 适用场景 | algorithm | |------|----------|------------| | **A. OCR** | 章节名是可识别的文字 | `OcrDetect` | | **B. 模板图** | 章节名不可 OCR(特殊字体/图标) | `MatchTemplate` | 方式 B 示例: ```jsonc "XXChapterToXX": { "action": "ClickSelf", "template": "XXChapterToXX.png", "roi": [x, y, w, h], "postDelay": 2000, "next": ["#self", "SideStoryStage", "ChapterSwipeToTheRight"] } ``` > ⚠️ **使用模板图时的联动操作**:需要新增 `XXChapterToXX.png` 模板图片到 `resource/template/StageNavigation/SideStory/XX/` 目录,并且 **必须修改 StageActivityV2.json 中的 `MinimumRequired`**(详见 §3.3)。 ### 2.4 OCR 文本规则 - `text` 依次列出:**活动名、二期章节名、三期章节名(如有)**,纯整词,不切短词。 - 示例:`"text": ["昨日海", "我们的伊比利亚"]` - 活动入口横幅随分期开放变化:第一期显示活动名,后续章节开放后变为对应章节名,须提前从 wiki/公告把各期章节名写全。 - **不切短词**:活动名与章节名都是常用字,OCR 不存在问题,切出的短词反而有误匹配风险。 ### 2.5 排列顺序规则 > **tasks 导航文件中关卡按编号从小到大排列;搓玉关放最后。** 先放所有入口任务,再放所有 `@SideStoryStage`,最后放 Open/Chapter 相关。排列时:常规关卡按编号从小到大,**搓玉关**(低编号如 `XX-4`/`XX-5`,Drop 为搓玉描述)放在常规关之后。 ### 2.6 roi 坐标 由用户提供截图坐标。格式为 `[x, y, width, height]`。 - `XXChapterToXX` 的 roi 通常由用户指定形如 "x1040+150 y420+50",即 `[1040, 420, 150, 50]`。 ## 3. StageActivityV2.json ### 3.1 位置 - 本地测试缓存:`build/bin/Debug/cache/gui/StageActivityV2.json`(客户端运行时从远程 API 拉取到本地缓存,修改此文件用于本地测试) - 远程源文件:`../MaaRelease/MaaAssistantArknights/api/gui/StageActivityV2.json`(StageActivityV2 的真正来源,修改须 commit 推送后才对用户生效;提交/推送 MaaRelease 与主仓库一样,须先获得用户明确指令) - 两者内容必须一致。 ### 3.2 替换规则 将旧活动条目整体替换为新活动。键名为活动前缀(如 `"TO"`),结构如下: ```jsonc "TO": { "MinimumRequired": "v6.11.0", // 见 §3.3 版本号规则 "Activity": { "Tip": "SideStory「活动全名」", "StageName": "活动全名", "UtcStartTime": "2026/08/01 12:00:00", "UtcExpireTime": "2026/08/22 03:59:59", "TimeZone": 8 }, "Stages": [ { "Display": "TO-9", "Value": "TO-9", "Drop": "31033" }, { "Display": "TO-8", "Value": "TO-8", "Drop": "31013" }, { "Display": "TO-7", "Value": "TO-7", "Drop": "30023" }, { "Display": "TO-4", "Value": "TO-4", "Drop": "搓玉用" } ] } ``` > ⚠️ **时间取关卡开放周期,不取商店周期**:`UtcStartTime` = 活动关卡开放时刻(如 `12:00:00`),`UtcExpireTime` = **关卡关闭时刻**(通常开放日起第 14 天的 `03:59:59`)。活动商店兑换通常比关卡多开约一周(如关卡 10/23 03:59 关、商店 10/30 03:59 关),wiki/公告里两个时间并列时勿拿商店截止时间当 ExpireTime——该字段控制关卡导航在 GUI 的有效期。 ### 3.3 MinimumRequired 版本号规则 | `XXChapterToXX` 方式 | 版本号处理 | |----------------------|------------| | **A. OCR**(已有任务可复用) | 沿用旧活动的值,通常无需改动 | | **B. 模板图**(需新增模板) | 必须改为**当前最新 tag 的下一个版本** | 模板图方式的具体操作: 1. 查看当前最新版本号(如 `git describe --tags` 得到 `v6.15.1`)。 2. 将 `MinimumRequired` 改为下一个 patch 版本(如 `v6.15.2`)。 3. **通知用户复查**该版本号是否正确,因为新模板图片需要随新版本客户端分发。 ### 3.4 排列顺序规则 > **StageActivityV2 的 Stages 数组按编号从大到小排列。** 高难关卡(高掉落价值)排在前面,搓玉等低关卡排在后面。 ### 3.5 Drop 字段 | 关卡类型 | Drop 取值 | 获取方式 | |----------|------------|----------| | 后三关(常规掉落) | item_index ID(如 `"31033"`) | 在 `resource/item_index.json` 中按材料名查表取 key | | 搓玉关等特殊关 | 用户提供的文字描述(如 `"搓玉效率0.98"`) | **直接使用用户提供的描述,不查表** | > 💡 **知识**:个别关卡可能有独立的 `MinimumRequired`(如某关卡需要更新版本才能解锁),可单独加到该关卡的条目中:`{ "Display": "XX-4", "Value": "XX-4", "Drop": "搓玉用", "MinimumRequired": "v6.16.0" }`。但用户通常不会指定,不需要主动询问。 ## 4. MaaRelease 仓库同步(可选) > MaaRelease 仓库的同步是**可选操作**。用户本地可能没有拉取该仓库,或者仓库不在上级目录。**操作前先检查 `../MaaRelease/` 是否存在,不存在则跳过此步骤。** ### 4.1 前置检查 ```powershell # 检查上级目录是否有 MaaRelease Test-Path ..\MaaRelease ``` 若存在则 `git pull` 更新到最新。 ### 4.2 需要同步的文件 | 文件 | 操作 | |------|------| | `api/gui/StageActivityV2.json` | 与主仓库缓存保持一致 | | `api/resource/tasks.json` | 将新活动导航任务放文件**开头**(`BlackFlowTemporary` 之前),**并删除被替换旧活动的整块任务** | ### 4.3 tasks.json 追加规则 - MaaRelease 的 `tasks.json` 是精简覆盖层,**只放活动导航任务本身**,不放依赖项(`SS-Open`、`SideStoryStage`、`SwipeToStage`、`ChapterSwipeToTheRight` 等基础任务由客户端本地资源提供)。 - 新内容放**文件开头**(`{` 之后、第一个已有 key 之前),不是末尾。 - **同时删除被替换旧活动的全部任务块**(旧前缀 `<旧XX>-` 开头的所有键):覆盖层只保留现役活动导航,与 StageActivityV2 旧条目整体替换的语义对齐。 - 内容与主仓库 `resource/tasks/Stages/XX.json` 完全一致。 ## 5. 排列顺序速查 | 文件 | 顺序 | |------|------| | `resource/tasks/Stages/XX.json` | 常规关卡编号**从小到大**,**搓玉关放最后** | | MaaRelease `api/resource/tasks.json` | 同上 | | `StageActivityV2.json` 的 `Stages` 数组 | 关卡编号**从大到小**(搓玉关天然在末尾) | ## 6. 完整操作清单 0. ✅ 解析用户输入:WebFetch wiki 链接提取活动名/前缀/关卡时间(关卡关闭时刻)/各期章节名;材料名查 `item_index.json` 反查 Drop ID;仍缺的选章信息向用户收集 1. ✅ 创建/修改 `resource/tasks/Stages/XX.json`(导航任务,常规关卡从小到大,搓玉关放最后) 2. ✅ 修改 `build/bin/Debug/cache/gui/StageActivityV2.json`(本地测试缓存,替换活动,关卡从大到小,Drop 查表或用用户描述) - 若 `XXChapterToXX` 用模板图:修改 `MinimumRequired` 为下一个版本,通知用户复查 3. 🔶 检查 `../MaaRelease/` 是否存在;存在则: - `cd ../MaaRelease; git pull` - 修改 `api/gui/StageActivityV2.json`(远程源文件,同步骤 2) - 修改 `api/resource/tasks.json`(导航任务放开头、删除旧活动整块,关卡从小到大)