From 959162ba4de8a86016905972f9ee7a2f4454f308 Mon Sep 17 00:00:00 2001
From: Windsland <86581225+Windsland52@users.noreply.github.com>
Date: Thu, 19 Dec 2024 17:05:05 +0800
Subject: [PATCH] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E7=94=A8=E6=88=B7?=
=?UTF-8?q?=E6=89=8B=E5=86=8C&=E5=BC=80=E5=8F=91=E6=96=87=E6=A1=A3=20(#281?=
=?UTF-8?q?)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 1 +
.../develop/Bug \346\216\222\346\237\245.md" | 77 +++++++-----
.../Pipeline \347\274\226\345\206\231.md" | 114 +++++++++++++-----
...nterface.json \347\274\226\345\206\231.md" | 48 +++++---
...04\346\272\220\347\273\264\346\212\244.md" | 30 +++--
...71\347\233\256\351\207\215\346\236\204.md" | 48 +++++---
...60\346\211\213\344\270\212\350\267\257.md" | 4 +-
...37\350\203\275\344\273\213\347\273\215.md" | 27 +++--
8 files changed, 235 insertions(+), 114 deletions(-)
diff --git a/README.md b/README.md
index 4ea80e74..1dcdd26d 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,7 @@
目前已有的功能:
- 启动/关闭游戏
+- 切换账号
- 收取荒原、魔精收取生产物品
- 每日心相(意志解析)
- 刷体力、最优材料关卡、活动关卡、吃糖选项
diff --git "a/docs/zh_cn/develop/Bug \346\216\222\346\237\245.md" "b/docs/zh_cn/develop/Bug \346\216\222\346\237\245.md"
index fbcb9ea1..60a4fb83 100644
--- "a/docs/zh_cn/develop/Bug \346\216\222\346\237\245.md"
+++ "b/docs/zh_cn/develop/Bug \346\216\222\346\237\245.md"
@@ -1,6 +1,8 @@
# Bug 排查
-修 bug 也是开发中重要的一环,如何快速准确地定位、分析、解决 bug 是有技巧的。本文将介绍一些常见的 bug 排查方法。
+修 bug 也是开发中重要的一环。
+如何快速准确地定位、分析、解决 bug 是有技巧的。
+本文将简单介绍排查 bug 的一般流程。
> [!NOTE]
>
@@ -8,45 +10,44 @@
## 前置准备
-与 bug 发现者沟通,尽可能的获取 bug 相关的信息,如:
+与 bug 提出者沟通,尽可能的获取 bug 相关的信息,如:
-- 资源版本
-- 系统版本
-- 问题的细节(发生的时间、场景等)
-- 配置文件、日志、截图等
+- 问题的细节描述(发生的时间、场景等)
+- 配置文件、日志、截图等必要信息
-## 定位问题
+## 定位关键 log
-### 确认资源版本以及运行方式
+1. 确认资源版本以及运行方式
-对于 M9A 来说,有两种运行方式:1. MaaPiCli 2. MFAWPF
+ 对于 M9A 来说,有两种运行方式:1. MaaPiCli 2. MFAWPF
-根据观察,MaaPiCli运行时有行log为
+ 根据观察,MaaPiCli运行时有行log为
-```plaintext
-[2024-11-28 19:46:32.571][INF][Px14600][Tx16498][Parser.cpp][L56][MaaNS::ProjectInterfaceNS::Parser::parse_interface] Interface Version: [data.version=v2.4.11]
-```
+ ```plaintext
+ [2024-11-28 19:46:32.571][INF][Px14600][Tx16498][Parser.cpp][L56][MaaNS::ProjectInterfaceNS::Parser::parse_interface] Interface Version: [data.version=v2.4.11]
+ ```
-既能看出资源版本,又能看出是以 MaaPiCli 方式运行。
+ 而 MFAWPF 运行时有log为
-```plaintext
-[2024-11-30 01:46:56.490][INF][Px20060][Tx33876][Parser.cpp][L56][MaaNS::ProjectInterfaceNS::Parser::parse_interface] Interface Version: [data.version=]
-```
+ ```plaintext
+ MFAWPF Version: [mfa.version=v1.2.2.0] Interface Version: [data.version=v2.5.5]
+ ```
-当 `version` 为空时,MaaPiCli log 为以上样式。
+ 由 data.version 可以确定资源版本。以此判断当前问题发生的版本是否已修复当前 bug。
+ 同时确认运行方式。因为不同运行方式,可能影响问题的复刻。
-确认资源版本可以了解是否为已修复bug版本,确认运行方式则是因为不同运行方式,config文件不同,同时可能生成的bug也不同。
+2. 定位问题所在的 log 位置
-### 确定问题 log 范围
+ 分两种情况:
+ - 任务提前结束
+ - 任务陷入无限循环
-- 根据问题描述发生的时间缩小范围
-- 根据问题发生的任务缩小范围
-- 根据[ERR]确定错误相关原因
-- 根据bug相关的[ERR]处反向查找 `Task Hit` ,以确定出错任务
+ 前者全局搜素 **[ERR]** ,查看报错是与什么有关。
+ 后者全局搜索 **Task Hit** ,查找不正常的匹配情况(如持续匹配一个本不该一直匹配的 node)。
## 分析问题
-在这里我将问题大致分为三类:资源加载问题、连接问题以及 pipeline 问题(timeout)。
+在这里我将问题大致分为三类:资源加载问题、连接问题以及 pipeline 问题。
### 资源加载问题
@@ -64,19 +65,31 @@
[2024-11-24 23:44:05.539][ERR][Px26056][Tx55883][ControlUnitMgr.cpp][L55][MaaNS::CtrlUnitNs::ControlUnitMgr::connect] failed to connect [adb_path_=D:/MuMu Player 12/shell/adb.exe] [adb_serial_=127.0.0.1:16384]
```
-### pipeline 问题
+### Pipeline 问题
+
+这类是 M9A 主要需要关注的问题,需要了解原 pipeline 流程以及 log 展示的执行情况,加以分析。
+
+1. 非 pipeline 流程类问题
+
+ 这种问题本身 pipeline 流程逻辑上没有问题。
+
+ 根据出问题的 node 分为两种:
+
+ 第一种是 非 无条件匹配/inverse node。
+ 常见原因是截图截太快了,匹配到 `next` 中 node,但当前画面尚未未稳定。
+ 解决方案是为当前 node 添加合适的 `post_wait_freezes`,等待画面稳定再做判断。
-一般来说,是pipeline逻辑有漏洞导致的,需要进一步分析。
+ 第二种是 无条件匹配/inverse node。
+ 这种可能是进到非预期界面,导致判断失误。
+ 解决方案是按需修改。
-常用的解决方法有:
+2. pipeline 流程类问题
-- 增加 `flag` 任务
-- 增加 `pre/post_wait_freezes` (注意默认 `target` 是否是你想要的)
-- 更改实现逻辑(如更换识别方式以及动作逻辑)
+ 这种是任务流程本身完备性不足,需在分析后修改。
## 解决问题
-前两种参考[常见问题](../manual/常见问题.md)解决,pipeline 问题需要进一步分析。
+前两种参考[常见问题](../manual/常见问题.md)解决,pipeline 问题根据分析结果修改。
## 验证修复
diff --git "a/docs/zh_cn/develop/Pipeline \347\274\226\345\206\231.md" "b/docs/zh_cn/develop/Pipeline \347\274\226\345\206\231.md"
index 66872619..113de643 100644
--- "a/docs/zh_cn/develop/Pipeline \347\274\226\345\206\231.md"
+++ "b/docs/zh_cn/develop/Pipeline \347\274\226\345\206\231.md"
@@ -9,50 +9,106 @@
#### 资源命名
- 对于图片等文件,采用大驼峰命名法,所有单词的首字母都大写。
-- 对于 `pipeline.json` 文件,一般来说,采用蛇形命名法,单词之间用下划线分隔,所有字母小写,
- 特别地,专有名词的活动采取大驼峰命名法,一般在 `activity` 内。
-- 对于 `image` 下文件夹,每个文件夹对应一个 `pipeline.json` 文件,文件夹名采用大驼峰命名法,
- 特别地,`activity` 内 `pipeline.json` 对应的 `image` 放到 `Combat/Activity` 处。
+- 对于 `pipeline` 文件夹下的 json 文件名,一般采用蛇形命名法,单词之间用下划线分隔,所有字母小写,
+ 特别地,专有名词的活动采取大驼峰命名法,一般在 `activity` 文件夹内。
+- 对于 `image` 下文件夹,每个文件夹对应一个 `pipeline` 文件夹下的 json 文件,文件夹名采用大驼峰命名法,
+ 特别地,`activity` 内 json 文件对应的 `image` 放到 `Combat/Activity` 处。
-#### Task 命名
+#### Node 命名
-大多数采用大驼峰命名法,特别地,部分情况下用 `_` 连接前、后缀。
+node 的定义为符合任务流水线(Pipeline)协议的一个完整的 `JsonObject`,大多数采用大驼峰命名法,特别地,部分情况下用 `_` 连接前、后缀。
-前缀一般为 `Sub` 或 当前活动缩写(如 `SOD` 黄昏的音序、`EITM` 山麓的回音)等,其他情况建议不要前缀。
+前缀一般为 `Sub` 或 当前活动缩写(如 `SOD` 黄昏的音序、`EITM` 山麓的回音)等。(其他情况建议不要前缀)
-后缀一般为 `数字` 或 `状态` 等,表示该任务的具体阶段或状态。(建议新写的任务不加后缀)
+后缀一般为 `数字` 或 `状态` 等,表示该 node 的具体阶段或状态。(建议新写的 node 不加后缀)
-### Task 编写
+### Node 编写
-参考[Pipeline 协议详细说明](https://github.com/MaaXYZ/MaaFramework/blob/main/docs/zh_cn/3.1-%E4%BB%BB%E5%8A%A1%E6%B5%81%E6%B0%B4%E7%BA%BF%E5%8D%8F%E8%AE%AE.md)
+具体内容参见[Pipeline 协议详细说明](https://github.com/MaaXYZ/MaaFramework/blob/main/docs/zh_cn/3.1-%E4%BB%BB%E5%8A%A1%E6%B5%81%E6%B0%B4%E7%BA%BF%E5%8D%8F%E8%AE%AE.md)
> [!NOTE]
>
-> - 一般 `next` 放置当前任务的出口任务,`interrupt` 放置当前任务的中断任务。
-> - 建议多写些 `Flag` 任务进行判断,以保证任务的稳定性。
-> - 部分情况下,可在 `next` 加入自身,以提高任务的稳定性。(存在程序未正确接受动作的情况)
+> - `next` 放置当前 node 的出口 node,`interrupt` 放置当前 node 的中断 node。
+> - 多将具有 Flag 性质的 node 设为出口 node,作为当前 node 完成的标志。
+> - 降低 node 之间的耦合。
+> 如 `BackButton` 一般不设置 `next`,而是作为一个“异常处理”放入 `interrupt`,以便保证任务流程的清晰,并方便 interrupt node 被其它任务复用。
+> - 部分情况下,可将 node 加入自身 `next` 。(存在动作未被游戏正确接受/尚未在游戏内生效的情况)
+> - 在涉及切换页面的 node 中加入 `post_wait_freezes` ,并使用 `object` 作为值,设置合适的 `time` 和 `target`。
+> - 涉及滑动的操作时,在后面加个点击操作,以便确保画面稳定。
+
+> [!WARNING]
+>
+> - 慎用 `inverse` 字段,这可能会导致任务的不可预测。
+> 如必须使用,请保证其有带 `post_wait_freezes` 的前置 node,以保证匹配该 node 时处于预期状态。
+> - 慎用“无条件匹配” node。
+> node 的 `recognition` 字段默认为 `DirectHit`。 `recognition` 字段为 `DirectHit` 的 node 即为“无条件匹配” node。
+> 使用“无条件匹配” node,可能导致任务运行到非预期状态时,程序未能正常报错,而是循环匹配该 node,造成任务卡死。
+> 如非必要,请选择其它实现逻辑完成任务。
+
+#### Node 连接
+
+Node 间主要通过 `next` 或 `interrupt` 字段连接。
+
+`next`完成 node 间的串联,`interrupt`实现执行以当前 interrupt node为 entry 的新任务链,并在该任务链完成后返回当前 node。
+
+简单表示如下:
+
+```mermaid
+graph LR
+ A(Task Entry
Node A) --> |next| B(Node B)
+ A --> |interrupt| C(Node C)
+ C --> |return| A
+```
+
+将 interrupt node 变复杂点:
+
+```mermaid
+graph LR
+ A(Task Entry
Node A) --> |next| B(Node B)
+ A --> |interrupt| C(Node C)
+ C --> |next| D(Node D)
+ C --> |interrupt| E(Node E)
+ D --> |return| A
+ E --> |return| C
+```
+
+为保证任务链有一个较好的结构,请按以下原则进行 node 连接:
+
+1. 标志完成阶段性任务的 node 应放在 `next` 中。
+2. 为达到匹配 `next` 中 node 而处理其他状况的 node 应放在 `interrupt` 中。
+
+如 活动刷取任务、位于活动主界面、进入活动主界面 三者关系如下:
+
+```mermaid
+graph LR
+ A(活动刷取任务) --> |next| B(位于活动主界面)
+ A --> |interrupt| C(进入活动主界面)
+ C --> |return| A
+```
+
+这里“进入活动主界面”就不会放在 `next` ,而是放入 `interrupt` 。
-### next & interrupt 任务顺序
+#### Next & Interrupt Node 排序
-总体上,`interrupt` 第一个任务 比 `next` 最后一个任务低一优先级。
+总体上,`interrupt` 第一个 node 比 `next` 最后一个 node 低一优先级。
在 `next` 或 `interrupt` 内部,统一先按照优先级由高到低顺序排列,不能出现优先级倒挂的情况。举例:
```plaintext
-现有判断一个小弹窗的任务B,和判断跳出弹窗前界面的任务A。
-如果弹窗出现时依旧能匹配到任务A,则任务B的优先级应该高于任务A,否则会出现无法处理B而卡死于A的情况
+现有判断一个小弹窗的 node B,和判断跳出弹窗前界面的 node A。
+如果弹窗出现时依旧能匹配到A,则B的优先级应该高于A,否则会出现无法处理B而卡死于A的情况。
```
-同一优先级内的任务,可按照匹配频率由高到低顺序排列,以便提高命中率,降低资源消耗。
+同一优先级内的 node,可按照匹配频率由高到低顺序排列,以便提高 node 命中率,降低资源消耗。
-### 注释规范
+#### 注释规范
`pipeline.json` 文件中,注释共两种属性字段:
1. `.*_doc$|^doc$`: 以 _doc 结尾的字符串或者正好是 doc 的字符串。
2. `.*_code$|^code$`:以 _code 结尾的字符串或者正好是 code 的字符串。
-前者为对当前 task(或某字段)的说明,后者为对必填字段的占位。举例:
+前者为对当前 node(或某字段)的说明,后者为对必填字段的占位。举例:
```json
{
@@ -67,16 +123,20 @@
183
],
"action": "Click",
- "post_wait_freezes": 300,
- "next": [
- "ActivityMainFlag",
- "EnterTheActivityMain"
- ]
+ "post_wait_freezes": {
+ "time": 500,
+ "target": [
+ 0,
+ 179,
+ 190,
+ 541
+ ]
+ }
}
}
```
-`doc` 为当前 task 说明。
+`doc` 为当前 node 说明。
`template_code` 为必填字段占位,
-原因是 `recognition` 为 `TemplateMatch` 时, "template" 字段必填,但我们想在 `interface.json` 中修改,故用 `template_code` 占位。
+原因是 `recognition` 为 `TemplateMatch` 时, "template" 字段必填,但我们想在 `interface.json` 中修改,而不是该 json 文件中。故用 `template_code` 占位。
diff --git "a/docs/zh_cn/develop/interface.json \347\274\226\345\206\231.md" "b/docs/zh_cn/develop/interface.json \347\274\226\345\206\231.md"
index 4d0ed756..c5e319d2 100644
--- "a/docs/zh_cn/develop/interface.json \347\274\226\345\206\231.md"
+++ "b/docs/zh_cn/develop/interface.json \347\274\226\345\206\231.md"
@@ -1,6 +1,10 @@
# interface.json 编写
-[参考资料——interface.schema.json](https://github.com/MaaXYZ/MaaFramework/blob/main/tools/interface.schema.json)
+> [!TIP]
+>
+> 参考资料:
+> [interface.schema.json](https://github.com/MaaXYZ/MaaFramework/blob/main/tools/interface.schema.json)
+> [ProjectInterface协议.md](https://github.com/MaaXYZ/MaaFramework/blob/main/docs/zh_cn/3.2-ProjectInterface%E5%8D%8F%E8%AE%AE.md)
`interface.json` 旨在提供菜单配置。
@@ -36,7 +40,7 @@
任务列表。任务列表包含多个任务,而每个任务又有任务名 `name`、任务入口 `entry`、任务参数 `pipeline_override`、以及任务选项 `option`,其中 `name` `entry` 必填。
-`pipeline_override` 中应为 pipeline task,并带有覆写参数,例如:
+`pipeline_override` 中应为 pipeline node,并带有覆写参数,例如:
```json
{
@@ -51,14 +55,14 @@
}
```
-这里原task为:
+这里原 node 为:
```json
{
"EnterTheActivityMain": {
"doc": "进入当期活动主界面",
- "template_code": "在interface.json中修改template",
"recognition": "TemplateMatch",
+ "template_code": "在interface.json中修改template",
"roi": [
885,
123,
@@ -66,16 +70,20 @@
183
],
"action": "Click",
- "post_wait_freezes": 300,
- "next": [
- "ActivityMainFlag",
- "EnterTheActivityMain"
- ]
+ "post_wait_freezes": {
+ "time": 500,
+ "target": [
+ 0,
+ 179,
+ 190,
+ 541
+ ]
+ }
}
}
```
-经过覆写,该 task 在执行“轶事派遣(角色故事请自行阅读)”任务时,实际执行效果等同于:
+经过覆写,该 node 在执行“轶事派遣(角色故事请自行阅读)”任务时,实际执行效果等同于:
```json
{
@@ -89,18 +97,22 @@
183
],
"action": "Click",
- "post_wait_freezes": 300,
- "next": [
- "ActivityMainFlag",
- "EnterTheActivityMain"
- ]
+ "post_wait_freezes": {
+ "time": 500,
+ "target": [
+ 0,
+ 179,
+ 190,
+ 541
+ ]
+ }
}
}
```
-执行“轶事派遣(角色故事请自行阅读)”任务后,task 便会恢复原状。
+执行“轶事派遣(角色故事请自行阅读)”任务后,node 便会恢复原状。
-`option` 则是根据你下面的具体设置来决定如何覆写 pipeline task。
+`option` 则是根据你下面的具体设置来决定如何覆写 pipeline node。
## option
@@ -147,6 +159,8 @@
}
```
+`defaul_case` 为默认选项,从 `cases` 中选择一个。
+
## version
版本。不必填写,ci install 时会自动生成。
diff --git "a/docs/zh_cn/develop/\346\264\273\345\212\250\350\265\204\346\272\220\347\273\264\346\212\244.md" "b/docs/zh_cn/develop/\346\264\273\345\212\250\350\265\204\346\272\220\347\273\264\346\212\244.md"
index a863347a..b9986965 100644
--- "a/docs/zh_cn/develop/\346\264\273\345\212\250\350\265\204\346\272\220\347\273\264\346\212\244.md"
+++ "b/docs/zh_cn/develop/\346\264\273\345\212\250\350\265\204\346\272\220\347\273\264\346\212\244.md"
@@ -1,13 +1,27 @@
# 活动资源维护
-一般是新活动开启时,新增 `./assets/resource/base/image` 下资源,以及 `./assets/interface.json` 中活动相关的 `pipeline_override` 的修改。
+一般是新活动开启时,新增 `./assets/resource/base/image` 下资源,以及修改 `./assets/interface.json` 中活动相关的 `pipeline_override` 。
## 维护列表
-| 任务/选项名 | 覆写任务 | 覆写参数 | 备注 |
-| --- | --- | --- | --- |
-| 轶事派遣 | EnterTheActivityMain | template | 当期活动入口模板 |
-| 活动选择 | ActivityEnterTheShow | template | 当期活动入口模板 |
-| 活动选择 | TargetStageName | expected | 关卡编号 |
-| 活动选择 | StageDifficulty | next | 关卡难度 |
-| - | CloseRewardPage | template | 独一律签到按钮 |
+### interface.json
+
+| 名称 | 类型 | 覆写任务 | 覆写字段 | 备注 |
+| --- | --- | --- | --- | --- |
+| 轶事派遣 | task | EnterTheActivityMain | template | 当期活动入口模板 |
+| 活动选择 | option | EnterTheActivityMain | template | 当期活动入口模板 |
+| 活动选择 | option | TargetStageName | expected | 关卡编号 |
+| 活动选择 | option | StageDifficulty | next | 关卡难度 |
+
+> [!NOTE]
+>
+> `活动选择`选项列表需要根据当前活动版本进行更新,
+> 当前开放中活动放最前面,
+> 已关闭但有尚未复刻的活动需标记“已结束”后放至最后,
+> 已关闭且外服已复刻完毕的活动需删除选项及相关资源(如模板图片)。
+
+### pipeline
+
+| resource | 文件名 | 覆写任务 | 覆写字段 | 备注 |
+| --- | --- | --- | --- | --- |
+| base | startup.json | CloseRewardPage | template | 独一律签到页关闭按钮,
图片命名为 `CloseRewardPage_<游戏版本>.png` |
diff --git "a/docs/zh_cn/develop/\351\241\271\347\233\256\351\207\215\346\236\204.md" "b/docs/zh_cn/develop/\351\241\271\347\233\256\351\207\215\346\236\204.md"
index f79dbdc5..cd8a1695 100644
--- "a/docs/zh_cn/develop/\351\241\271\347\233\256\351\207\215\346\236\204.md"
+++ "b/docs/zh_cn/develop/\351\241\271\347\233\256\351\207\215\346\236\204.md"
@@ -1,38 +1,52 @@
# 项目重构
-## 资源
+## Image/Model
-注意对其修改时不要落下任何用到该资源的任务。
+注意对其修改时不要落下任何用到该Image/Model的 node。
> [!TIP]
>
> 善用全局搜索
-## 任务
+## Pipeline
-### sub 任务
+### Sub Node
-这里将 `is_sub` (已废弃) 值为 `true` 的任务称为 `sub 任务` 。
+这里将 `is_sub` (已废弃) 值为 `true` 的 node 称为 `sub node` 。
-重构 `sub 任务` ,有以下几个步骤:
+重构 `sub node` ,有以下几个步骤:
-1. 判断该 `sub 任务` 在当前任务 `next` 列表中是否处于最低优先级(即直接放到当前任务 `interrupt` 列表中对实际效果有无影响)
-2. 若该 `sub 任务` 不处于最低优先级,重构方法是将当前任务的 `next` 和 `interrupt` 加入 `sub 任务` (原 `next` 和 `interrupt` 为空可直接进行,不为空则需考虑是否冲突);若该 `sub 任务` 处于最低优先级,重构方法为直接放到当前任务的 `interrupt` 中
-3. 若该 `sub 任务` 不处于最低优先级,且步骤2的改动会引起冲突,则需要重新考虑任务逻辑。
-4. 将 `sub 任务` 的 `is_sub` 属性删除
+1. 判断该 `sub node` 在 当前node `next` 列表中是否处于最低优先级(即直接放到 当前node `interrupt` 列表中对实际效果有无影响)
+2. 若该 `sub node` 不处于最低优先级,重构方法是将 当前node 的 `next` 和 `interrupt` 加入 `sub node` (原 `next` 和 `interrupt` 为空可直接进行,不为空则需考虑是否冲突);若该 `sub node` 处于最低优先级,重构方法为直接放到 当前node 的 `interrupt` 中
+3. 若该 `sub node` 不处于最低优先级,且步骤2的改动会引起冲突,则需要重新考虑任务逻辑
+4. 将 `sub node` 的 `is_sub` 属性删除
> [!WARNING]
>
-> 以上全部改动均需考虑所有使用该 `sub 任务` 的任务,不要落下!
+> 以上全部改动均需考虑所有使用该 `sub node` 的 node,不要落下!
-### 其它任务
+### 其它 node
-#### 简化任务链
+接下来按照其它 node 的重构目的来分别说明如何重构。
-##### 目的
+#### 规范 node 名称
-简化 pipeline、理清逻辑
+如果只是想规范 node 名称,则只需通过 vscode 的全局搜索、替换功能完成即可。
+不过需要注意替换时带着双引号替换,以免出现包含该 node 名的其它 node 也被修改。
-##### 操作
+#### 简化任务流程、减少耦合
-部分任务可放在 `当前 task` 的 `父 task`(或 `父 task` 的 `父 task` 等等)的 `interrupt` 中,若一味的放入 `next` 则会导致任务链过长,影响 pipeline 的可读性和简洁性。
+先行阅读 [Node 连接](./Pipeline%20编写.md#node-连接),向贴合连接原则的方向进行重构。
+
+部分node 可放在 当前node 的 祖先node 的 `interrupt` 中。
+注意移动后将不必要的 next node 删除,避免在 `interrupt` 中继续执行主任务链,导致后续任务报错后跳回 祖先node。
+
+#### 合并相同功能 node
+
+如果有多个 node 都实现了相同的功能,则可以考虑合并为一个 node。
+
+步骤为:
+
+1. 合并前检查该 node `next` 中是否不相关的 node,如有则先将其拆分出来。
+2. 合并时所有 node 改用相同规范名称。
+3. 合并后检查该 node 在所有任务中的位置是否正确。如本该在 `interrupt` 中的 node 是否位于任务链主干的 `next` 部分。
diff --git "a/docs/zh_cn/manual/\346\226\260\346\211\213\344\270\212\350\267\257.md" "b/docs/zh_cn/manual/\346\226\260\346\211\213\344\270\212\350\267\257.md"
index 0944950d..900a1c60 100644
--- "a/docs/zh_cn/manual/\346\226\260\346\211\213\344\270\212\350\267\257.md"
+++ "b/docs/zh_cn/manual/\346\226\260\346\211\213\344\270\212\350\267\257.md"
@@ -29,7 +29,7 @@ winget install Microsoft.VCRedist.2017.x64 Microsoft.DotNet.DesktopRuntime.8
### 3. 下载正确的版本
-M9A 下载地址:
+M9A 下载(更新)地址:
#### Windows
@@ -58,7 +58,7 @@ M9A 下载地址:
#### Android
-~~这个不是 apk ,一般人用不到~~
+[相关疑问](https://github.com/MaaXYZ/MaaFramework/issues/475)
### 4. 正确解压
diff --git "a/docs/zh_cn/manual/\351\203\250\345\210\206\345\212\237\350\203\275\344\273\213\347\273\215.md" "b/docs/zh_cn/manual/\351\203\250\345\210\206\345\212\237\350\203\275\344\273\213\347\273\215.md"
index 4aba605a..864c5bc6 100644
--- "a/docs/zh_cn/manual/\351\203\250\345\210\206\345\212\237\350\203\275\344\273\213\347\273\215.md"
+++ "b/docs/zh_cn/manual/\351\203\250\345\210\206\345\212\237\350\203\275\344\273\213\347\273\215.md"
@@ -34,34 +34,39 @@
> 1. 请在当期角色故事阅读并领取奖励后使用本任务
> 2. 轶事活动关闭后请关闭本任务
-## 雨中悬想:迷思海
+## 切换账号
-完成透光层50M后可运行,以完成 `寻思` 扫荡。
+本功能仅会切换当前最后一个账号(超过3个的账号会忽略),切换后可继续添加任务,以便多账号定制化运行任务。
## 局外演绎:黄昏的音序
最有用的肉鸽刷取信用功能。
+### 非速刷模式
+
> [!TIP]
>
-> 1. 队伍推荐带一个奶,具体可根据个人情况调整
-> 2. 使用前在箱子里置顶(标记)四个角色
-> 3. 使用前请保证最近一次战斗处于自动战斗状态,否则需要进入第一次战斗时手动点击进入自动战斗
-> 4. 账号首次进行肉鸽时,请先至少自己打一遍,M9A不对仅在初次玩肉鸽的剧情、引导等做额外处理
-> 5. 使用速刷功能前请先将 `刻画生长-指引之歌` 点满
+> 1. 使用前可在箱子里置顶(标记)四个角色,作为出战角色
+> 2. 队伍配置推荐携带一个奶
+> 3. 使用前请保证最近一次战斗处于自动战斗状态,M9A不能检查是否处于自动战斗
> [!WARNING]
>
-> 1. 勿挂资料片(M9A无法识别“问号”节点)
-> 2. 如有可能,请不要使用天使娜娜,否则可能导致任务失败(未知原因~~,本人还在测试~~)
+> 1. 使用天使娜娜可能导致战斗中自动取消战斗(未知原因~~,本人还在测试~~)
+> 2. M9A不对仅在初次玩肉鸽出现的剧情、引导等做额外处理,使用前需先自行通关一遍
> [!NOTE]
> 由于本功能实现较为复杂,容易出现奇怪的问题。如果有条件请开启模拟器的录屏,发现问题时尽量保留足够的证据(`debug`目录下`maa.log`、问题发生时间、录屏/截图),以便开发者快速定位问题并解决。[提交问题点击此处](https://github.com/MaaXYZ/M9A/issues/new/choose)
-### 置顶演示
+#### 置顶演示
![置顶演示](https://github.com/user-attachments/assets/ff9d66d8-9540-447a-9eac-315caec00fe9)
-### 置顶成功
+#### 置顶成功
![置顶成功](https://github.com/user-attachments/assets/d88fea79-df1b-4651-9d6d-386a40bf3b55)
+
+### 速刷模式
+
+> [!NOTE]
+> 使用速刷功能前请先将 `刻画生长-指引之歌` 点满