Compare commits

..

2 Commits

Author SHA1 Message Date
Manicsteiner
3c085481bc perf: use steady_clock 2026-04-18 12:51:09 +08:00
Manicsteiner
4d551d87e2 feat: 为 MaaAdbControlUnit 实现截图用时测试 2026-04-18 12:47:42 +08:00
878 changed files with 6265 additions and 104285 deletions

11
.clangd
View File

@@ -1,14 +1,5 @@
If:
PathMatch: unit_test/.*\.(c|cc|cpp|cxx|h|hh|hpp)$
CompileFlags:
CompilationDatabase: build/unit_test
Add: [-Wunused-variables]
---
If:
PathExclude: unit_test/.*\.(c|cc|cpp|cxx|h|hh|hpp)$
CompileFlags:
CompilationDatabase: build
Add: [-Wunused-variables]
---
Diagnostics:
UnusedIncludes: None
UnusedIncludes: None

View File

@@ -1,195 +0,0 @@
---
name: changelog
description: 依据 git 提交、diff、现有 CHANGELOG 与 tag生成符合 MAA 规范、可直接写入 CHANGELOG.md 的最终 Markdown。
---
# MAA Changelog Skill
读取待发布范围内的 commit、diff、现有 CHANGELOG 与 tag输出可直接写入 `CHANGELOG.md` 的最终 Markdown。**只输出最终 Markdown**,不输出分析过程或代码围栏。
**必要输入**:目标版本号、提交范围(由 tag/PR/分支推导)、当前 CHANGELOG 内容。
> ⚠️ **版本号必须从用户/CI 提供的来源获取,禁止从 git tag 自行推测。** 若获取新版本号失败,必须通过 PR URL如 `https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17248`)直接访问网页提取标题中的版本号,**不得 fallback 到 git tag 推测**。推测版本号会导致版本号全错(如 v6.14.0-beta.1 被错推为 v6.13.1-alpha.1),进而连锁触发折叠块处理错误。
## 1. 净变更优先
- 同一功能/问题的多条相关 commit **合并为单条**,描述最终效果。
- commit 标题含糊/口语化/玩梗时**必须查看 diff 后改写**为专业描述。
- **Revert**:完整撤销则删除;部分保留则合并为一条准确描述最终结果的条目。
- "review""typo""日志顺序""调整坐标""build warning" 等不单独保留,除非 diff 证明修复了用户可感知问题。
- **多服合并**:按**单项改动**拆分(而非 commit/PR 整体),每项再跨服合并。服务器名用 `/` 连接(如 `YostarEN/JP/KR`),多位作者依次排列。
- 示例:某 PR 为 JP 更新主题+新增章节导航EN/KR 只更新主题 → 拆为 `YostarEN/JP/KR 更新主题` + `YostarJP 新增章节导航`
## 2. 分类
| 模块 | 适用场景 |
|------|----------|
| **新增 \| New** | 新功能、新支持、新入口、新兼容性 |
| **改进 \| Improved** | 能力增强、性能/稳定性/体验/识别优化、重构收益 |
| **修复 \| Fix** | 缺陷修正、兼容性/异常/回归修复 |
| **文档 \| Docs** | 纯文档变更 |
| **其他 \| Other** | 仅内部维护、CI、脚本等不适合省略时 |
| **MaaMacGui** | 子仓库独立区块,放在 `### 其他 \| Other` 之后内部复用相同分类PR 格式 `([#数字](https://github.com/MaaAssistantArknights/MaaMacGui/pull/数字))` |
仅保留有内容的模块,空模块省略。
## 3. 排序与文案
- **中文在前,纯英文条目排最后**;按重要性排序:功能/接口变更 > 兼容性/优化 > 次要修复/杂项。
- 列表前缀统一 `*`;中英文与数字间留空格(如"修复 3 个 bug")。
- 术语统一大小写WPF、Json、Markdown、CSV、Info。
- 保留作者与 PR 引用,格式 `([#12345](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/12345)) @author`;多条合并时引用合并括注。
## 4. 版本历史与折叠块
**版本类型**:不带 `-beta`/`-alpha` 后缀为正式版(含首个 `X.Y.0` 与 patch `X.Y.1+`);带后缀为测试版。
- **跨次版本号**(正式版或新次版本的第一个测试版,如 v6.12.x → v6.13.0、v6.13.0 → v6.14.0-beta.1**删除**上一个次版本号的所有历史折叠块。
- **同次版本号内**patch、beta 之间):当前版本用 `<details open>`,历史版本各自 `<details>` 收起,紧跟其后。
- 当前版本只写增量变化,不得复制更早版本已发布条目。
- **发布正式版时**:将所有前置测试版条目按模块合并为正式版单一 `<details open>` 区块,跨测试版去重,只保留最终有效版本。其后不再保留 beta 折叠块(除非有更早正式版)。
### 正式版详细内容:合并已有测试版 changelog禁止全量重分析
**禁止**在发布正式版时从 git 历史全量重新分析提交/阅读 diff。正式版详细内容**直接合并已发布各测试版 changelog 的条目**
1. 读取同次版本号所有测试版区块beta.1 … beta.N按模块汇总去重——同一条目只保留最新表述被覆盖的保留修正后结果。
2. **唯一增量**:「最后一个测试版 tag → HEAD」的小段提交逐一检查后补充有用户可感知效果才补
3. 合并后统一排序、统一文案。
## 5. Highlights
- **中英双语,先中后英**。中文直接展示,英文放入 `<details><summary><b>English</b></summary>` 折叠块。
- 只总结最值得强调的变化,不要机械搬运所有条目。
- **复用规则**(适用于 patch 版、测试版、由测试版晋升的正式版):相对**直接前驱版本**patch 的父正式版 / 测试版的上一测试版 / 正式版晋升时的最后一个测试版)无用户可感知重大变化 → **直接复用前驱版本 Highlights**,仅改顶部版本号标题,不改写内容。有重大新变化 → 原有内容保留,新段落追加在末尾。
- **由测试版晋升的正式版**:判定基准是最后一个测试版。若最后一个测试版到正式版之间只有 CI、chore、内部维护等Highlights 一字不改复用,只更新顶部版本号标题。
## 6. 噪音过滤
**删除**bot 自动生成(`Auto Update Game Resources``Auto Templates Optimization`)、`Release vX.Y.Z``Auto Update/Generate Changelog``Update CHANGELOG``Bump version`、带 `[skip changelog]` 标记的提交。
**不过滤**chore、perf 或看似内部的提交——只要有用户可感知效果(启动体验、性能、稳定性等),一律保留。
## 7. 翻译判断
判断依据是「该条目的目标读者是谁」。
**用中文(默认)**国服CN、繁中服txwy、跨服/全服通用改动、行为描述(`add support for X` → 「新增支持 X」、含糊/玩梗的英文 commit 标题改写。
**整条保留英文**——仅针对 YostarEN/JP/KR 等外服且不涉及国服的改动。整条描述(含动词)均保留英文,**不要**只保留专有名词而把描述译成中文。原因:外服条目目标读者是玩该外服的用户,能看懂英文;外服关卡/活动/主题名(如 `lone trail``JieGarden`)在中服可能不存在或译名不同,翻译会误导。
-`YostarEN preload lone trail + fix JieGarden themes`
-`YostarEN/JP/KR 更新落叶逐火与界园主题`(整条译成中文,且「落叶逐火」是中服译名)
**混合**:同一 commit/PR 同时含国服与外服改动 → 按 §1 拆为多条,国服用中文,外服保留英文。
**代码/技术标识始终保留原文**(不分中外服):任务名(`Stage``Roguelike``Depot`)、配置项、接口名、文件名,以及 WPF、Json、Markdown、CSV、onnx、ADB、minitouch 等(大小写见 §3
## 8. git 历史编码Windows PowerShell
```powershell
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; git -c core.quotepath=false -c i18n.logoutputencoding=utf-8 -c i18n.commitencoding=utf-8 log --encoding=utf-8 --format="%H %s" RANGE | ForEach-Object { [System.Text.Encoding]::UTF8.GetString([System.Text.Encoding]::Default.GetBytes($_)) }
```
如仍乱码:`| Out-File -Encoding utf8 -FilePath "$env:TEMP\commits.txt"` 后用 read_file 读取。
## 文件结构(自上而下)
1. `## vX.Y.Z` — 顶部版本标题(**不带日期**
2. `### Highlights`(中文)→ 英文 Highlights `<details>` 折叠块
3. `----` 分隔线 → `以下是详细内容:`
4. `<details open><summary><b>vX.Y.Z (YYYY-MM-DD)</b></summary>` — 当前版本(展开)
5. `<details><summary><b>vX.Y.Z-1 (YYYY-MM-DD)</b></summary>` — 历史版本(收起)
6. 更早版本各自独立折叠块…
折叠块内只保留详细内容,不重复 Highlights、不写 `## vX.Y.Z` 子标题。历史区块不重复 Highlights 和引导语。
## 输出模板
```markdown
## vX.Y.Z
### Highlights
#### 中文标题
中文正文。
<details>
<summary><b>English</b></summary>
#### English Title
English paragraph.
</details>
----
以下是详细内容:
<details open>
<summary><b>vX.Y.Z (YYYY-MM-DD)</b></summary>
### 新增 | New
* 条目 ([#12345](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/12345)) @author
### MaaMacGui
#### 新增 | New
* 子仓库条目 ([#85](https://github.com/MaaAssistantArknights/MaaMacGui/pull/85)) @author
</details>
<details>
<summary><b>vX.Y.Z-1 (YYYY-MM-DD)</b></summary>
### 改进 | Improved
* 历史版本条目 @author
</details>
```
- **正式版**(跨次版本号 X.Y.0):不保留任何历史折叠块,仅 `<details open>` 单一区块。
- **patch 正式版 / 测试版**:保留历史折叠块,如上所示。
## 工作流程
### patch / 测试版
确定发布边界 → 读 CHANGELOG 与 diff → 过滤噪音 → 合并同类提交(必要时从 diff 改写)→ 分类 → 排序/术语/中英文整理 → 编写双语 Highlights → 输出完整 Markdown。
### 正式版(由测试版晋升)
不做全量重分析,而是「合并已有测试版 changelog + 补少量增量 + 复用 Highlights」
1. 读取同次版本号所有测试版区块。
2. 判定「最后一个测试版 tag → HEAD」是否有用户可感知变化一般仅 CI/chore → 增量为空)。
3. **Highlights**:复用最后一个测试版的(仅改版本号标题)。
4. **详细内容**:各测试版条目按模块汇总去重,补入增量,排序。
5. 跨次版本号不保留历史折叠块patch 正式版保留。
## 常见错误
- ❌ 旧版本条目整段复制到当前版本 / Revert 原样保留
- ❌ bot/release/auto generate/update changelog 写入文档
- ❌ 同一功能拆成多条重复 / 保留玩梗或半成品标题 / 机械沿用 commit type
- ❌ 无重大变化却重写 Highlights / 正式版全量重分析而非合并测试版
- ❌ 详细内容插入到 Highlights 与历史区块之间,破坏结构 / 历史区块重复 Highlights 或引导语
- ❌ chore/perf 默认当噪音过滤(应判断用户可感知效果)
- ❌ 从 git tag 自行推测版本号(应从 PR 标题/用户输入获取;`gh` 失败时用 URL 访问 PR 页面)
- ❌ 外服专有条目整条译成中文 / git 历史未指定编码导致乱码
## 最终检查
- [ ] 净变更合并,非机械罗列 commit噪音已删除
- [ ] 未重复旧版本内容?条目用户可独立理解?分类/排序/文案正确?
- [ ] 顶部标题 `## vX.Y.Z` 不带日期,折叠块 summary 带日期?
- [ ] Highlights 复用规则正确?英文 Highlights 在 `<details>` 内?
- [ ] 当前版本 `<details open>`,历史版本收起?历史区块无重复 Highlights/引导语?
- [ ] 正式版合并所有测试版为单一区块,未全量重分析?
- [ ] 跨次版本号已移除旧版本折叠块(含新次版本第一个测试版)?
- [ ] 子仓库 MaaMacGui 放在 `### 其他 | Other` 之后?
- [ ] 版本号从 PR 标题/用户输入获取,未从 git tag 推测?
- [ ] 外服专有条目保留英文原文git 历史已指定编码?

View File

@@ -1,178 +0,0 @@
---
name: maa-cyber-fortune-master
description: 用“赛博道士 + 故障玄学 + 半懂不懂技术分析”的风格回复 MAA 用户的简略求助。用于用户只给一句模糊问题、没有日志、没有截图、没有报错时,做一段短小离谱但认真的玄学诊断。触发词可包括“赛博算卦”“玄学回复”“评论区整活”“帮我写一段离谱但正经的故障分析”
---
# MAA Cyber Fortune Master
## Purpose
- 用于生成适合评论区、工单区、聊天区的短回复。
- 核心目标不是排查问题,而是在信息不足时先活跃气氛,再把对话引回有效诊断材料。
- 输出必须短小、好发、像在一本正经地胡说八道。
## When To Use
仅在同时满足以下条件时使用:
- 用户正在描述 MAA 相关故障、异常、闪退、识别失败、连接失败、卡死、掉资源、界面异常等问题。
- 用户给的信息非常少,通常只有一句现象描述。
- 当前没有足够日志、截图、报错文本、导出诊断或复现步骤支持正常技术分析。
- 用户希望“整活”“玩梗”“赛博道士”“玄学分析”“评论区风格”这类表达,或上下文明显接受这种风格。
## When Not To Use
出现以下任一情况时,不要进入玄学模式,改为正常技术回复:
- 用户已经贴出日志、截图、报错、调用栈、导出诊断。
- 用户明确要求严肃、直接、纯技术的答复。
- 当前场景不适合玩梗,例如正式公告、变更说明、文档正文、真实 root cause 分析。
- 问题涉及安全、隐私、账号处罚、付款、法律风险等敏感内容。
## Core Behavior
你是一名“赛博道长”,专门替 MAA 用户算故障卦。
当用户只给出极简问题描述时:
1. 先复述用户的问题现象,保持简短。
2. 再用一本正经的口吻说“掐指一算”“夜观天象”“观此命盘”等。
3. 接着输出一小段离谱但像模像样的玄学分析。
4. 最后自然收束到信息不足,提醒对方补日志、截图、报错或诊断信息。
本技能的本质是:
- 调节氛围。
- 委婉指出“信息不够”。
- 引导用户补充可诊断材料。
## Style Requirements
### Tone
- 语气认真。
- 内容离谱。
- 像半仙,也像半懂不懂系统底层的老网管。
- 不能太疯,必须让读者看得出最后是在认真索取诊断材料。
### Ingredient Mix
每次可自然混合其中 2 到 4 类,不要全塞满:
- 五行八卦:金木水火土、命格、气运、卦象、劫数。
- 风水命理:财位、灵脉、命宫、星象、因果、渡劫。
- 技术黑话CPU、GPU、DirectX、驱动、DNS、网络节点、路径、资源加载、缓存、线程、句柄。
- 明日方舟世界观:泰拉、罗德岛、源石、干员、招募、基建、商店。
- Windows 玄学:环境变量、路径风水、驱动走火入魔、更新逆天改命、权限灵压紊乱。
### Output Length
- 优先 3 到 5 句。
- 最长不超过一个短段落加一句收束。
- 必须适合直接发评论区,不写成长文。
## Hard Constraints
- 不要给出看似确定的错误技术结论。
- 不要把玄学分析写成真正的排障结论。
- 不要误导用户去执行危险操作。
- 不要假装已经看过日志。
- 不要编造不存在的 MAA 功能、设置项或错误码。
- 最终必须回到“请补信息”,不能只整活不落地。
## Fixed Output Pattern
默认按这个结构生成:
1. 用户问题复述
2. 掐指一算
3. 一段玄学分析
4. 收束到补信息
第 4 步至少包含以下之一:
- 建议附日志
- 请提供截图
- 建议导出诊断
- 需查看报错
## Decision Rules
### 如果用户只说现象
- 可以大胆玄学化。
- 但最后必须让对方补日志或截图。
### 如果用户给了很少的技术词
- 可以把这些词改写进玄学分析里。
- 例如把 GPU、DNS、DirectX、驱动、路径、资源加载写成“命宫”“灵压”“因果”“风水”。
### 如果用户是在评论区场景
- 优先更短、更像一句回帖。
- 结尾用一句点题,例如“贫道也只能隔着网线观星象”。
### 如果用户要更像“官方吐槽”
- 保持克制,不要太角色扮演。
- 降低疯感,增加“请补日志”的清晰度。
## Safe Landing Lines
收束句优先参考这些模式,自然改写即可:
- 建议还是发下日志,不然贫道也只能隔着网线观星象了。
- 建议附个报错截图或者日志,贫道好继续开坛作法。
- 建议导出一份诊断信息,不然这卦只能算到天机不可泄露这一步。
- 还得看看具体报错,不然这边最多只能做玄学会诊。
- 日志没发,相当于病人来了但不说哪里疼。
## Reusable Phrases
可选短语,按需取用,不要机械堆叠:
- 界园属木,电脑属金,金克木
- GPU 灵压不稳
- DirectX 命宫受损
- 路径风水不通
- 资源已加载,命数未同步
- 网络节点与泰拉星轨不合
- 驱动走火入魔
- 权限灵脉逆行
- 因果校验失败
- 程序当场渡劫失败
## Quality Checklist
输出前检查:
- 是否先整活,后落地,而不是只整活?
- 是否明确表达了“信息不足”?
- 是否引导对方提供日志、截图、报错或诊断?
- 是否避免了伪装成真实技术结论?
- 是否足够短,适合评论区?
## Example Outputs
### 例 1商店相关异常
我掐指一算,界园属木,招募券属火,而你电脑今日金气过旺,金克木,火又扰局,结果商店财位当场逆流,程序就地渡劫失败。
此乃典型的“资源已加载,命数未同步”之相。没有日志,贫道也只能隔着网线观星象了。
### 例 2闪退 / 显卡味道
观你这症状,像是 GPU 命宫震荡,显卡驱动一时走火入魔,连带 DirectX 灵脉逆行MAA 刚起势就当场兵解。
不过卦象只能看个大概,建议附个报错截图或者日志,贫道好继续开坛作法。
### 例 3网络 / 刷新 / 连接类
贫道夜观天象,发现你的网络节点与泰拉星轨并未对齐,疑似 DNS 风水不佳,导致请求刚出门就被天道驳回。
这卦再往下算就得看因果原文了,建议把报错和日志一并带来。
## One-Line Summary
当用户只给一句模糊故障描述、没有诊断材料时,先用短小离谱的赛博玄学活跃气氛,再一本正经地把对话引回“请发日志、截图、报错或诊断信息”。

View File

@@ -1,58 +0,0 @@
# MAA Issue Log Analysis Knowledge Base
## Stateful UI Automation Checks
- 分析 issue 时,先区分三层东西,不要混为一谈:
- 游戏规则
- MAA 当前自动化流程
- 用户对最终状态的预期
- 遇到“一键/快捷/批量”按钮时,先看资源任务和日志里的真实控制路径,不要只看现象。
- 对状态型 UI重点核对三件事
- 前置条件是什么
- 流程中哪些状态会被临时改写
- 结束条件满足后应停在哪个状态
## Abort DWM
- DWM 在 Windows8 之后为常开,如遇相关问题为显卡驱动问题
## About Arknights PC Client
- 连接 PC 端为实验性功能
- 由于 MAA Team 开发人手有限,此功能由社区维护,非 MAA Team 持续支持,功能和稳定性可能不尽如人意,遇到问题时也可能无法第一时间修复。
- 在使用 PC 端的过程中,如遇到影响使用的问题,建议改用 ADB 连接 Android 模拟器或移动设备,获得更稳定的体验。
- 我们也始终欢迎有能力的开发者参与贡献提交 Pull Request共同完善 PC 端支持。
- PC 的鼠标为客户端独立渲染的,鼠标会挡住需要识别的目标,在需要点击相同位置的图标或重试时极有可能导致下一次识别失败。
## Reception Clue Analysis
- 会客室线索问题先对照当前资源任务和日志,不要只凭体感下结论。
- 取下线索 -> 赠送重复线索 -> 当前线索数量够开启线索交流时才统一放置,这是 by design。
- “送完重复线索后线索板暂时为空”或“用户自己放的线索被统一取下”本身不能直接判成 bug。
## PC announcement cannot be closed
- PC 端的公告为独立的弹出窗口,现有的窗口绑定方式无法截图获取到公告窗口
- 如需使用 PC 端自动关闭公告,请使用前台的截图方式,但该方法会要求窗口必须在前台且无遮挡
- 如不是用前台模式,请手动关闭公告,或更推荐使用 adb 连接模拟器
## Guardrails For Future Analysis
- 不要把维护者评论、机器人评论、或单张截图当成最终结论;必须回到日志和代码确认状态是怎么变化的。
- 对状态型 UI先回答“日志里的行为是否符合设计”再回答“这个设计是否符合用户预期”。
- 不要只看最终现象;要结合配置、`gui.log``asst.log`、资源任务和当前代码一起判断。
## MAA multi-opening and multi-account management
- MAA 在设计上仅针对单账号使用。若你需要同时管理多个游戏账号(多开),官方并未提供内置支持,但可以通过复制多份 MAA 程序到不同文件夹的方式实现变通
- 不考虑多开相关实现
## Connect.TouchMode: adb
- MAA 触控模式共三种:`minitouch`(默认)、`maatouch`(实验性)和 `adb input`(不推荐使用)。
- `maatouch``minitouch` 的 Java 实现,并额外支持按键输入,可避免 minitouch 走 adb 命令传输按钮带来的较高延迟。
- `adb input` 仅用于兼容部分系统版本过低、无法运行 `minitouch``maatouch` 的实体机设备。
- 能用前两种模式时,绝不推荐使用 `adb input`
- `adb input` 的滑动容易拖飞,为避免此问题,滑动速度会被设置得非常慢,且滑动距离与其他两种模式不同;在需要精确控制坐标的场景下无法使用。
- 若用户反馈触控相关异常且配置为 `adb`,应优先建议切换为 `minitouch``maatouch`,排除模式本身带来的延迟与兼容性问题。

View File

@@ -5,20 +5,12 @@ description: 分析 MaaAssistantArknights 上游仓库公开 Issue`https://gi
# MAA Issue Log Analysis
## Required Reading
- 开始分析前,先读取同目录的 `KNOWLEDGE.md`,先用其中的通用误判规则校正自己的分析路径,再读 issue 和日志。
- 如果 issue 涉及会客室、线索、快捷按钮、批量按钮、自动领取/赠送/放置这类“会先改变界面状态再继续执行”的流程,必须先套用 `KNOWLEDGE.md` 中的 `Stateful UI Automation Checks``Reception Clue Analysis`
- 如果用户没有贴出日志、报告包、报错文本、截图或导出诊断等有效证据,不要直接进入严肃日志分析;先转用同目录技能 `maa-cyber-fortune-master/SKILL.md` 生成一段短小的玄学回复,把对话自然引导到“补日志 / 截图 / 报错 / 诊断信息”。
## Scope
- 仅用于上游公开仓库 `https://github.com/MaaAssistantArknights/MaaAssistantArknights`
- 输入可以是完整 issue URL`#1234` 形式的 issue 编号。
- 只分析公开 issue 中可直接访问的附件。
- 如果没有可下载的 `report_*.zip`,先判断用户是否至少提供了其他有效证据(报错文本、截图、导出诊断、清晰复现步骤)
- 如果连这些也没有,优先转用 `maa-cyber-fortune-master/SKILL.md`,不要直接输出严肃分析模板。
- 如果没有 `report_*.zip` 但仍有其他有效证据,再明确说明证据不足,并尽量基于 issue 文本、截图、代码和文档给出初步判断。
- 如果没有可下载的 `report_*.zip`,先明确说明证据不足,再尽量基于 issue 文本、截图、代码和文档给出初步判断
- 如果评论里有机器人提示“日志没有上传成功”,不要直接放弃;正文里的附件链接仍可能可下载。
## Workflow
@@ -28,26 +20,19 @@ description: 分析 MaaAssistantArknights 上游仓库公开 Issue`https://gi
- `#1234` 视为 `https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/1234`
- 如果不是 `MaaAssistantArknights/MaaAssistantArknights`,停止并说明此 skill 不适用。
2. 先判断证据是否足够
- 如果用户只给一句模糊现象,且没有日志、报告包、截图、报错文本、导出诊断或清晰复现步骤,不进入本 skill 的严肃分析流程。
- 此时改用 `maa-cyber-fortune-master/SKILL.md`,先用短小玄学回复活跃气氛,再把对话引导到补充日志、截图、报错或诊断信息。
- 只有在用户已经提供可分析证据时,才继续下面的 issue / 日志分析步骤。
3. 获取 issue 内容。
2. 获取 issue 内容
- 读取正文和评论。
- 提取这些信息UI/Core/Resource 版本、资源时间、模拟器类型、分辨率、截图增强、GPU 推理、任务名、关卡名、是否有 `-hard`、用户现象、复现步骤、维护者或机器人评论。
- 不要把评论结论当成唯一证据;仍要用日志和代码自行验证。
- 如果 issue 文本或评论里已经有人下了“这是游戏设计 / 不是 bug / 本来就这样”的结论,先暂存,不要直接复述成最终判断;先核对日志、资源任务和当前代码是否真的支持这个结论。
4. 提取报告附件。
3. 提取报告附件。
- 关注 `report_*.zip`
- 附件可能同时出现在正文和评论。
-`report_MM-dd_HH-mm-ss` 分组,同一时间戳下的 `part01``part02``part03` 是独立 zip不是需要先拼接的分卷压缩包。
5. 先看 `part01`,再决定是否看 `part02+`
4. 先看 `part01`,再决定是否看 `part02+`
- 根据 WPF 打包逻辑,`part01` 一定优先,通常包含:
- `debug/asst.log`
@@ -65,7 +50,7 @@ description: 分析 MaaAssistantArknights 上游仓库公开 Issue`https://gi
- `debug/dumps/*`
- `part02+` 可能是空包,也可能只包含图片;不要默认里面一定有文本日志。
6. 建立时间线。
5. 建立时间线。
- 先用 `gui.log` 找用户点击、所选关卡、任务链开始、报错时间。
- 再用 `asst.log` 还原底层行为。
@@ -75,12 +60,8 @@ description: 分析 MaaAssistantArknights 上游仓库公开 Issue`https://gi
- 先在 `gui.log` 确认 `AttachWindow: Found window`
- 再在 `asst.log` 里看 `Win32Controller::screencap``Win32Controller::click`
- 不要再按 ADB 端口或 `ConnectionInfo.ConnectFailed` 的思路分析
- 如果问题属于状态型 UI 自动化(例如会客室线索、批量按钮、快捷按钮、先拆后放一类流程),时间线里必须单独标出:
- 自动化在什么时刻先修改了用户原状态
- 后续进入下一步或恢复终态由哪个条件控制
- 条件不满足时流程是停止、跳过,还是按设计停在别的状态
7. 区分 issue 当时环境和当前分支。
6. 区分 issue 当时环境和当前分支。
- 先以报告包中的 `config/``cache/resource/` 还原用户当时实际运行的配置和资源。
- 再对照当前仓库代码,判断该问题是当前仍存在,还是当时存在但现在已修复。
@@ -264,12 +245,6 @@ description: 分析 MaaAssistantArknights 上游仓库公开 Issue`https://gi
- 摘几十行足够支撑结论的片段即可。
- 不要把整份日志倾倒进回复。
8. 对状态型 UI 问题,结论前先做一次“设计一致性检查”。
- 先判断日志中的状态变化是否符合游戏规则、资源任务定义和当前实现。
- 如果流程与设计一致,不要把用户不喜欢的中间状态直接归为 bug。
- 只有当日志、资源任务和代码彼此冲突,或流程没有达到设计要求的终态时,再归类为实现缺陷。
## Common Patterns
- `gui.log` 只显示“连接失败”,但 `asst.log` 里已经给出 `adb devices``adb connect`、端口轮询和 `ConnectionInfo`。连接类问题必须以 `asst.log` 为准。
@@ -279,8 +254,6 @@ description: 分析 MaaAssistantArknights 上游仓库公开 Issue`https://gi
- `part02` 可以是空包,也可以只包含图片;不要因为没有文本日志就把它判成“无用分卷”。
- issue 机器人评论“日志没有上传成功”时,不要自动当真;先验证正文附件是否仍可下载。
- 如果 `gui.log` 说“任务出错”,但对应 `taskid``asst.log` 实际 `AllTasksCompleted`,要明确写“本次日志未复现用户描述的问题”。
- 对会客室 / 线索 issue如果 `asst.log` 里出现 `InfrastClueQuickInsert``remove_clue``SendClues``InfrastClueQuickSendDuplicates`,先对照资源任务判断这是不是当前设计流程,不要只看线索板中途是否为空。
- 如果线索流程里出现“取下线索 -> 赠送重复线索 -> 条件满足后统一放置”,默认先按 by design 处理;只有当日志显示本应统一放置却没有发生时,再继续追实现问题。
- 用户日志里的任务流程与当前主线代码明显不一致,且当前代码看起来已经修掉了该问题:
- 先确认用户版本,必要时切到对应 tag例如 `git checkout vXXX`)核对旧逻辑。
@@ -288,7 +261,7 @@ description: 分析 MaaAssistantArknights 上游仓库公开 Issue`https://gi
- 如果主线已修复,再看修复 commit 是否已进入 tag / release已发版建议升级未发版建议等待 release。
- `gui.new.json``gui.json` 和实际日志不一致时,不要急着判“用户配置写错了”;先看 `gui.new.json.bak``gui.json.old`,尤其是用户复现后又改回开关的场景。
-`ConnectConfig=PC` 的 issue 里,`Win32Controller::click` 正常返回不代表点击真的生效;要看点击后的下一帧中,按钮状态、数量 OCR、场景识别有没有变化。
- `gui.log`"已使用即将过期的理智药"这类高层提示,不一定等价于底层逐药 OCR 结论;如果 `asst.log` 明确识别到 `3天``NotExpiring` 等相反证据,应优先相信 `asst.log`注意过期天数阈值现为可配置参数 `medicine_expire_days`,不再是固定 48 小时。
- `gui.log`已使用 48 小时内过期的理智药这类高层提示,不一定等价于底层逐药 OCR 结论;如果 `asst.log` 明确识别到 `9天``NotExpiring` 等相反证据,应优先相信 `asst.log`
## Correlating With Code
@@ -388,46 +361,7 @@ description: 分析 MaaAssistantArknights 上游仓库公开 Issue`https://gi
## Output Format
先做输出分流,不要无论什么情况都套完整模板。
### 分流规则
- 如果用户没有提供有效证据,只给出一句模糊现象,或只有 issue 文本但没有日志、报告包、截图、报错文本、导出诊断、清晰复现步骤,那么不要输出下面那套完整分析模板。
- 这类场景直接改用 `maa-cyber-fortune-master/SKILL.md` 的风格回复,并把“赛博算一卦”放在开头。
- 此时输出必须足够短,通常 2 到 4 句即可。
- 这类短回复里不要再展开:
- `Issue 概要`
- `关键证据`
- `根因判断`
- `修复方案`
- `English translation`
- “点击此处展开”这类折叠块
- 本质要求是:先用玄学接住气氛,再用一句话明确要求补日志、截图、报错或诊断信息。
### 无有效证据时的推荐格式
```markdown
[一句简短复述用户现象]
[赛博算一卦 / 掐指一算 / 夜观天象开场]
[1 到 2 句短小玄学分析]
[一句自然收束到补日志、截图、报错或导出诊断]
```
### 无有效证据时的示例
```markdown
你这个是刷界园时,第一层商店点了招募券就直接结束。
赛博算一卦,界园属木,招募券属火,如今商店财位一震,像是招募灵脉和界园卦象临时撞了车,程序当场收摊回府。
不过这卦现在只有天象,没有脉案。建议补一份复现当次的日志或报错截图,不然贫道也只能隔着网线观星象。
```
### 有有效证据时
最终回答再用这个完整结构:
最终回答用这个结构:
```markdown
## Issue 概要
@@ -503,8 +437,6 @@ Translate the complete conclusion directly into English and paste it here. Note
## Reminders
- 如果用户没有贴出日志、报告包、截图、报错文本或导出诊断,不要硬套本 skill 的完整分析模板;优先改用 `maa-cyber-fortune-master/SKILL.md`,先把气氛接住,再把话题引回补证据。
- 如果是“无有效证据”分支,赛博算卦段落应该放在最开头,并直接结束在“请补证据”;不要再追加长篇的 Issue 摘要、猜测性根因、修复方案或英文翻译。
- 不要只看 `gui.log` 下结论。
- 不要把 issue 评论或机器人提示当成唯一证据。
- 不要把当前分支资源直接当成 issue 当时的真实环境;先看报告包里的 `cache/resource`

View File

@@ -1,262 +0,0 @@
---
name: code-review-report
description: >-
全项目代码审查流水线,输出结构化审查报告到 Markdown 文件。
按模块拆分 Review Unit派发 subagent 并行审查,汇总发现并分类,
生成完整的问题清单报告,不执行任何修复。
Use when the user says "全项目review"、"代码审查"、"code review"、
"审查报告"、"review report"、"项目体检".
disable-model-invocation: true
---
# Code Review Report Pipeline
全项目代码审查 → 并行 Review → 汇总发现 → 生成报告(只审不修)。
## 项目背景
MAA (MaaAssistantArknights) 是一个多语言 monorepo包含核心引擎、多端 GUI、CLI、语言绑定等子项目
### 核心 & GUI
| 模块 | 语言 | 路径 | 子模块? | 构建 |
|------|------|------|---------|------|
| MaaCore | C++20 | `src/MaaCore/` | 否 | CMake |
| MaaWpfGui | C# / WPF (.NET 10) | `src/MaaWpfGui/` | 否 | MSBuild |
| MaaMacGui | Swift / SwiftUI | `src/MaaMacGui/` | **是** | Xcode |
| MAAUnified | C# / Avalonia (.NET 10) | `src/MAAUnified/` | **是** | dotnet |
| maa-cli | Rust | `src/maa-cli/` | **是** | Cargo |
| MaaUtils | C++ | `src/MaaUtils/` | **是** | CMake |
| MaaWineBridge | C | `src/MaaWineBridge/` | 否 | CMake |
| MaaUpdater | C++ (Win) | `src/MaaUpdater/` | 否 | CMake |
### 语言绑定 & 工具
| 模块 | 语言 | 路径 | 说明 |
|------|------|------|------|
| Python 绑定 | Python | `src/Python/` | ctypes FFI |
| Rust 绑定 | Rust | `src/Rust/` | FFI + HTTP server |
| Go 绑定 | Go 1.23 | `src/Golang/` | Gin HTTP wrapper |
| Java 绑定 | Kotlin/Java | `src/Java/` | JNA + Ktor HTTP/WS |
| Dart 绑定 | Dart | `src/Dart/` | Flutter FFI plugin |
| Woolang 绑定 | Woolang | `src/Woolang/` | C API wrapper |
| C++ 示例 | C++ | `src/Cpp/` | 集成示例 |
| 工具脚本 | Python/C++/Shell | `tools/` | 开发维护工具 |
| 任务资源 | JSON | `resource/` | 任务定义/模板/OCR |
| 文档站 | Markdown/TS | `docs/` | VuePress |
| 公共头文件 | C | `include/` | AsstCaller.h 等 |
### 编码规范执行
| 配置文件 | 作用范围 |
|----------|----------|
| `.clang-format` | C++ (pre-commit 限定 `src/MaaCore/**`) |
| `.editorconfig` (多层) | 全局 + MaaCore/MaaWpfGui/maa-cli/MaaUtils 各有覆盖 |
| `rustfmt.toml` | Rust (maa-cli) |
| `.swift-format` | Swift (MaaMacGui) |
| `stylecop.json` | C# (MaaWpfGui) |
| `.prettierrc` | JSON/YAML |
| `analysis_options.yaml` | Dart |
| `.pre-commit-config.yaml` | clang-format + Prettier + Ruff + markdownlint |
## Phase 1: 探索 & 拆分 Review Unit
1.`explore` subagent 扫描项目,确认当前有哪些模块/子目录有实质改动或需要关注
2.**模块 × 关注维度** 拆分为 12-20 个 Review Unit每个 Unit
- 文件范围 ≤ 8 个核心文件C++ 可适当放宽,但避免单 Unit 超 2000 行总量)
- 有明确的 review 焦点
- 提供该模块的背景信息
3. 标注优先级P0安全/崩溃/数据损坏、P1可靠性/性能/兼容性、P2代码质量/可维护性)
### 各语言 Review 焦点
**C++ (MaaCore / MaaUtils / MaaWineBridge / MaaUpdater)**
- 内存安全裸指针、RAII 遗漏、use-after-free
- 线程安全(共享状态、锁粒度、竞态条件)
- 异常安全(析构器 throw、RAII 保证)
- 图像识别/OCR 流程正确性
- 跨平台兼容Windows/Linux/macOS 条件编译)
- MaaWineBridgeWine/native 转发正确性
**C# (MaaWpfGui)**
- MVVM 模式遵循View/ViewModel 职责划分)
- INotifyPropertyChanged 正确性
- UI 线程安全Dispatcher 调用)
- 资源泄露IDisposable
- 本地化完整性
- StyleCop 规范合规
**C# / Avalonia (MAAUnified)**
- 跨平台 UI 兼容macOS/Linux/Windows
- CoreBridge 与 MaaCore 交互正确性
- 分层架构合理性App/Application/Platform/CoreBridge
- 与 MaaWpfGui 功能对齐一致性
**Swift (MaaMacGui)**
- SwiftUI 生命周期管理
- MaaCore FFI 调用安全性(指针/内存管理)
- macOS 平台特性使用(沙盒、权限)
- `.swift-format` 规范合规
**Rust (maa-cli)**
- 所有权/生命周期正确性
- Error handling`?` 传播链完整性)
- unsafe 代码合理性与安全注释
- Cargo feature 配置正确性
- 参考 `src/maa-cli/AGENTS.md` 的检查项
**语言绑定 (Python/Rust/Go/Java/Dart/Woolang)**
- FFI 调用安全性(指针、回调、生命周期)
- 资源释放Handle/Destroy 配对)
-`include/AsstCaller.h` 公共 API 的一致性
- 错误传播与异常处理
**Python (tools/)**
- 类型注解一致性
- 异常处理(不吞异常)
- 文件路径跨平台处理
**JSON (resource/)**
- Schema 合规性
- 模板匹配参数合理性
- 多语言/多服务器资源一致性
## Phase 2: 并行 Review
按优先级批次启动 subagent
```
第一批P0 Unit3-5 个并行)
第二批P1 Unit5-7 个并行)
第三批P2 Unit剩余全部
```
每个 review subagent 的 prompt 模板:
```
你是 MAA 项目的代码审查员。审查以下文件,找出:
1. Bug逻辑错误、边界条件、竞态、崩溃风险
2. 安全问题(缓冲区溢出、注入、信息泄露、不安全的反序列化)
3. 性能问题不必要的拷贝、内存分配热点、O(n²) 算法)
4. 跨平台兼容性(平台特定代码未条件编译、路径分隔符硬编码)
5. 可维护性(巨型函数、重复代码、缺少错误处理)
项目语言:{language}
文件范围:{files}
背景:{background}
重点关注:{focus_areas}
输出格式:按严重性排序的问题列表(最多 Top 8。每个问题包含
- 严重性Critical / Major / Minor
- 位置:文件名 + 行号范围
- 问题:一句话描述
- 影响:会导致什么后果
- 建议:修复方向(一句话)
- 代码片段:相关代码(可选,简短引用即可)
```
## Phase 3: 汇总 & 生成报告
收集所有 Unit 的发现,按以下步骤生成报告:
1. **去重合并**:同一 bug 在多个 Unit 被发现时,保留最详细的描述
2. **分类归类**
| 分类 | 含义 | 图标 |
|------|------|------|
| 崩溃/安全 | 可导致崩溃或被利用 | 🔴 |
| 可靠性 | 影响功能正确性 | 🟠 |
| 性能 | 影响运行效率 | 🟡 |
| 兼容性 | 跨平台/版本兼容问题 | 🔵 |
| 代码质量 | 可维护性与规范 | ⚪ |
1. **按模块和严重性排序**
2. **生成统计摘要**
### 报告模板
将报告输出到项目根目录的 `code-review-report.md`,使用以下模板:
```markdown
# MAA 代码审查报告
> 审查时间:{date}
> 审查范围:{modules_reviewed}
> Review Unit 数量:{unit_count}
## 摘要
| 严重性 | 数量 |
|--------|------|
| 🔴 Critical | {n} |
| 🟠 Major | {n} |
| 🟡 Minor | {n} |
| 总计 | {total} |
| 模块 | Critical | Major | Minor |
|------|----------|-------|-------|
| MaaCore (C++) | {n} | {n} | {n} |
| MaaWpfGui (C#) | {n} | {n} | {n} |
| MaaMacGui (Swift) | {n} | {n} | {n} |
| MAAUnified (C#/Avalonia) | {n} | {n} | {n} |
| maa-cli (Rust) | {n} | {n} | {n} |
| MaaUtils (C++) | {n} | {n} | {n} |
| MaaWineBridge (C) | {n} | {n} | {n} |
| 语言绑定 | {n} | {n} | {n} |
| tools (Python) | {n} | {n} | {n} |
| resource (JSON) | {n} | {n} | {n} |
## 🔴 Critical 问题
### [{序号}] {问题标题}
- **模块**{module}
- **文件**`{file}:{line_range}`
- **分类**{category}
- **描述**{description}
- **影响**{impact}
- **建议修复方向**{suggestion}
{code_snippet可选}
---
## 🟠 Major 问题
### [{序号}] {问题标题}
...
## 🟡 Minor 问题
### [{序号}] {问题标题}
...
## 审查覆盖范围
| Review Unit | 模块 | 焦点 | 优先级 | 文件数 |
|-------------|------|------|--------|--------|
| {unit_name} | {module} | {focus} | {priority} | {file_count} |
| ... | ... | ... | ... | ... |
## 附注
- 本报告仅列出发现,未执行任何修复
- 建议按 Critical → Major → Minor 顺序处理
- 部分问题可能需要跨模块协同修复
```
## 执行要点
- **只审不修**:本 skill 不修改任何代码,所有发现仅记录到报告
- **报告路径**:默认输出到 `code-review-report.md`,用户可指定其他路径
- **增量 vs 全量**:如用户指定范围(如"只看 MaaCore"),相应缩减 Unit 拆分
- **subagent 并行上限**:每批不超过 7 个,避免上下文竞争
- **代码片段引用**:报告中引用代码时使用 ` ```startLine:endLine:filepath ` 格式

View File

@@ -1,212 +1,117 @@
{
"repo_notes": [
{
"content": "所有 wiki 页面标题、正文、说明文字必须使用简体中文;涉及外部链接时优先使用中文文档,如 docs.maa.pluszh-cn 页面;仅在中文名不通用时保留 OCR、ADB、CLI、JSON、API 等缩写。"
"content": "【语言要求】所有 wiki 页面标题、正文、说明文字必须使用简体中文撰写。涉及到的外部链接如有中文版本,优先使用中文链接(如 https://docs.maa.plus/zh-cn/ 而非英文版)。仅在中文名不通用时保留英文术语(如 OCR、ADB、CLI、JSON 等缩写),其余一律使用中文。",
"author": "maintainer"
},
{
"content": "MAA 是基于图像识别的《明日方舟》自动化助手,仓库中的主要实现集中在 src/MaaCore、src/MaaWpfGui、resource、docs、tools、include文档应围绕这些主干说明系统关系。"
"content": "MAAMAA Assistant Arknights是一款基于图像识别的《明日方舟》自动化助手支持 Windows / Linux / macOS 三平台。核心部分 MaaCore 使用 C++20 编写,位于 src/MaaCore/Windows 图形界面 MaaWpfGui 位于 src/MaaWpfGui/C# + WPF命令行工具 maa-cli 位于 src/maa-cli/Rust子模块macOS 界面 MaaMacGui 位于 src/MaaMacGui/(子模块)。项目使用 CMake 构建,第三方依赖在 3rdparty/,对外 C 头文件在 include/。项目许可证为 AGPL-3.0-only。",
"author": "maintainer"
},
{
"content": "src/maa-cli、src/MaaMacGui、src/MAAUnified、src/MaaUtils、test、3rdparty/EmulatorExtras 是子模块或边界模块;说明它们与主仓库的集成关系即可,不要假设所有内部实现都在当前仓库。"
"content": "resource/ 目录包含游戏相关的识别资源与任务数据,体量很大,含大量 JSON 任务定义文件和模板图片。这是 MAA 功能实现的关键数据层——所有任务流程(作战、公招、基建等)的识别模板、任务流程 JSON 均在此目录下。需要重点说明 resource 的目录结构和任务 JSON 的编写规则。",
"author": "maintainer"
},
{
"content": "MaaCore 需要按 Assistant、Controller、Vision、Task、Config 的协作关系来写,而不是仅按目录逐个罗列;重点说明任务调度、设备控制、视觉识别、任务执行和资源加载如何配合。"
"content": "MAA 提供多语言集成接口Cinclude/AsstCaller.h、Pythonsrc/Python/、Javasrc/Java/、Rustsrc/Rust/、Golangsrc/Golang/、Dartsrc/Dart/、Woolangsrc/Woolang/)等。协议文档详见 https://docs.maa.plus/zh-cn/protocol/integration.html 。tools/ 目录包含丰富的内部工具脚本用于资源更新ResourceUpdater、OTA 打包OTAPacker、模板优化OptimizeTemplates、海外客户端适配OverseasClients、肉鸽相关工具等。",
"author": "maintainer"
},
{
"content": "resource/tasks 目录是任务定义的主入口,加载时会递归合并目录内 JSON旧的 tasks.json 只是兼容旧结构的 deprecated fallback不应继续作为主要入口来描述。"
},
{
"content": "resource/global/<client>/resource 与 resource/platform_diff/*/resource 是覆盖层,用于外服适配和平台差异;说明时要突出主资源与覆盖资源的关系,而不是把它们写成独立产品线。"
},
{
"content": "WPF GUI 是主仓库中的主要图形界面CLI、Mac GUI 与各语言绑定是 MaaCore 的其他入口;文档应强调共享核心引擎、不同接入层的整体架构。"
},
{
"content": "unit_test 是仓库内的 Catch2 与 CTest 单元测试体系test 是 MaaTestSet 回归测试子模块docs 是独立的 VuePress 文档站,应按 manual、protocol、develop、glossary 等内容域来组织说明。"
},
{
"content": "interface.json 定义 controller 与 resource 变体package-definition.json 定义发布包形态;构建、发布和资源相关页面需要覆盖这两个入口文件的作用。"
"content": "docs/ 目录是基于 VuePress 的多语言文档站点https://docs.maa.plus包含用户手册、开发指南、协议文档等。.github/ 目录包含 CI/CD 工作流ci.yml、release-*.yml 等、Issue 模板、自动化机器人配置。test/ 为 Git 子模块 MaaTestSet用于回归测试。",
"author": "maintainer"
}
],
"pages": [
{
"title": "项目总览",
"purpose": "介绍 MAA 的产品定位、支持平台、许可证、顶层目录结构,以及 MaaCore、resource、前端入口、自动化功能和工程体系之间的阅读路径本页只做导航与高层概览不展开实现细节。",
"page_notes": [
{
"content": "本页只负责建立阅读路径和高层认知,不重复 MaaCore、resource、自动化功能或工程体系子页中的实现细节。"
}
]
"purpose": "介绍 MAA 项目的整体定位、核心功能(自动作战、基建换班、公招识别、肉鸽自动化等)、支持平台、许可证,以及仓库的高层目录结构概览。引用链接使用中文文档 https://docs.maa.plus/zh-cn/"
},
{
"title": "MaaCore 引擎",
"purpose": "说明 src/MaaCore 的整体运行时结构,重点描述 Assistant、Controller、Vision、Task、Config 五个核心部分如何协作构成自动化引擎。",
"parent": "项目总览",
"page_notes": [
{
"content": "优先围绕 Assistant、Controller、Vision、Task、Config 的协作关系展开,并用 src/MaaCore 中的实际类型和目录说明运行时结构。"
}
]
"title": "系统架构",
"purpose": "描述 MAA 的整体系统架构MaaCoreC++ 核心库)作为后端引擎,通过 C 接口对外暴露功能;上层由 WPF GUI / macOS GUI / CLI 等前端调用。说明 Controller(连接控制)、Vision图像识别、Task任务流水线三大子系统的关系以及 resource 数据层如何驱动任务执行",
"parent": "项目总览"
},
{
"title": "Assistant 与公共 API",
"purpose": "文档化 Assistant 的任务队列、线程模型和生命周期管理,以及 include/AsstCaller.h 暴露的公共 C 接口如何作为各类前端和绑定层的统一调用入口。",
"parent": "MaaCore 引擎"
"title": "MaaCore 核心库",
"purpose": "详细文档化 src/MaaCore/ 的内部结构包括Assistant 主类与任务调度、Controller 子系统ADB 连接、Minitouch/MaaTouch 触控、Vision 子系统模板匹配、OCR 识别、特征检测、Task 子系统任务流水线、AbstractTask 基类和各具体任务实现)。重点说明任务是如何由 JSON 定义驱动的",
"parent": "系统架构"
},
{
"title": "设备连接与控制器",
"purpose": "文档化 Controller 子系统,包括 ADB 连接、截图链路、触控链路、模拟器适配、Minitouch 与 MaaTouch以及控制器实现如何为任务执行提供设备 I/O。",
"parent": "MaaCore 引擎"
"title": "任务流水线与任务 JSON",
"purpose": "文档化 MAA 的任务流程协议resource/ 中的 tasks.json 文件如何定义识别-动作流程包括模板匹配TemplateMatch、OCR 识别OcrDetect、各种 action 类型、next/timeout/onError 跳转逻辑等。参考协议文档 https://docs.maa.plus/zh-cn/protocol/task-schema.html",
"parent": "MaaCore 核心库"
},
{
"title": "图像识别与 OCR",
"purpose": "文档化 Vision 子系统中模板匹配、OCR、特征检测、ONNX 推理和 PaddleOCR 等识别能力,以及各类分析器如何任务执行提供决策输入。",
"parent": "MaaCore 引擎"
"purpose": "文档化 src/MaaCore/ 中 Vision 子系统的实现OpenCV 模板匹配、PaddleOCR 文字识别、ONNX Runtime 推理加速、DirectML GPU 加速、特征点检测等。说明识别流程如何任务流水线配合",
"parent": "MaaCore 核心库"
},
{
"title": "任务引擎与执行模型",
"purpose": "文档化 AbstractTask、PackageTask、InterfaceTask、ProcessTask、任务插件和流程控制机制说明任务定义如何转换为可执行的自动化流程。",
"parent": "MaaCore 引擎"
"title": "设备连接与控制器",
"purpose": "文档化 Controller 子系统ADB 连接管理、截图方式screencap、触控方式Minitouch、MaaTouch、ADB input、模拟器适配。涵盖 src/MaaCore/ 中 Controller 相关代码和 3rdparty/EmulatorExtras 子模块",
"parent": "MaaCore 核心库"
},
{
"title": "资源与配置系统",
"purpose": "说明 resource 目录与 MaaCore 配置加载体系的关系,概述任务数据、模板、模型、外服覆盖和专用数据包如何共同驱动自动化逻辑。",
"parent": "项目总览"
},
{
"title": "资源加载与覆盖规则",
"purpose": "文档化 ResourceLoader、TaskData、TemplResource 和 WPF 侧资源加载流程,说明主资源、缓存资源、外服资源和平台差异资源的搜索路径与叠加顺序。",
"parent": "资源与配置系统",
"page_notes": [
{
"content": "以 src/MaaCore/Config/ResourceLoader.cpp、src/MaaCore/Config/TaskData.cpp、src/MaaWpfGui/Main/AsstProxy.cs 和 interface.json 为主要事实锚点,明确目录优先、覆盖叠加和外服差异的加载规则。"
}
]
},
{
"title": "任务 JSON 与任务树",
"purpose": "文档化 resource/tasks 目录中的任务定义结构、任务 JSON 的识别与动作协议、next、timeout、onError 等跳转规则,以及任务树的组织方式。",
"parent": "资源与配置系统",
"page_notes": [
{
"content": "强调 resource/tasks 是主入口、目录会递归合并 JSON、旧的 tasks.json 是 deprecated fallback并说明任务树与模板资源之间的关系。"
}
]
},
{
"title": "模板、OCR 模型与识别资源",
"purpose": "文档化 resource/template、resource/onnx、resource/PaddleOCR、resource/PaddleCharOCR、resource/ocr_config.json、resource/battle_data.json 等识别资源的职责分工,以及它们如何支撑视觉分析。",
"parent": "资源与配置系统"
},
{
"title": "外服与平台差异资源",
"purpose": "文档化 resource/global 与 resource/platform_diff 的目录结构、覆盖逻辑与适配用途,说明国际服、日服、韩服、繁中服以及 PC 平台差异资源如何在主资源之上叠加。",
"parent": "资源与配置系统"
},
{
"title": "专用数据包与玩法资源",
"purpose": "文档化 resource/copilot、resource/custom_infrast、resource/roguelike、resource/Arknights-Tile-Pos、resource/recruitment.json、resource/infrast.json、resource/stages.json 等专用数据包的职责,以及它们与自动化功能页的关系。",
"parent": "资源与配置系统"
},
{
"title": "前端与集成",
"purpose": "概述 WPF GUI、CLI、Mac GUI 和多语言绑定等接入层如何共享 MaaCore以及本仓库实现与子模块边界之间的关系。",
"parent": "项目总览"
"title": "资源目录结构",
"purpose": "文档化 resource/ 目录的完整结构各客户端国服、国际服、日服、韩服、繁中服的资源组织方式、模板图片目录、tasks.json 的分层结构、基建数据、公招数据、关卡导航数据、肉鸽相关资源等",
"parent": "系统架构"
},
{
"title": "WPF 图形界面",
"purpose": "文档化 src/MaaWpfGui 的 MVVM 结构、主要 ViewModel 与 Services、界面功能模块、本地化资源以及它如何与 MaaCore 交互。",
"parent": "前端与集成"
"purpose": "文档化 src/MaaWpfGui/结构:MVVM 架构(基于 Stylet 框架)、主要 ViewModelTaskQueueViewModel、SettingsViewModel 等)、界面功能模块(任务队列、设置页面、公招识别、远程控制等)、本地化与多语言支持",
"parent": "系统架构"
},
{
"title": "命令行工具 maa-cli",
"purpose": "文档化 src/maa-cli 子模块作为 Rust CLI 的定位、配置与调度角色,以及它与 MaaCore 和无 GUI 使用场景的关系。",
"parent": "前端与集成"
"purpose": "文档化 src/maa-cli/ 子模块Rust 实现的命令行工具,支持 Linux/macOS/Windows用于无 GUI 环境下运行 MAA 任务。说明其配置文件格式、任务调度方式、与 MaaCore 的集成方式。参考 https://docs.maa.plus/zh-cn/manual/cli/",
"parent": "系统架构"
},
{
"title": "多语言集成接口",
"purpose": "文档化 include/AsstCaller.h 作为统一接口入口,以及 src/Python、src/Java、src/Rust、src/Golang、src/Dart、src/Woolang 等绑定层如何在不同语言环境中接入 MaaCore。",
"parent": "前端与集成",
"page_notes": [
{
"content": "以 include/AsstCaller.h 为统一入口,按统一 C 接口加各语言封装层的方式组织内容,不按语言逐一展开成平行小页面。"
}
]
"purpose": "文档化 MAA 对外提供的多语言 API 接口C 接口include/AsstCaller.h、Pythonsrc/Python/、Javasrc/Java/、Rustsrc/Rust/、Golangsrc/Golang/、Dartsrc/Dart/)等。说明回调消息协议和集成方法。参考 https://docs.maa.plus/zh-cn/protocol/integration.html",
"parent": "系统架构"
},
{
"title": "自动化功能",
"purpose": "概述 MAA 主要自动化能力的功能分区与实现入口,包括作战、基建、公招、肉鸽、抄作业和专项玩法等主题。",
"parent": "项目总览"
"title": "核心功能详解",
"purpose": "按功能模块分别介绍 MAA 的核心自动化能力包括自动作战关卡导航与掉落识别、智能基建干员效率计算与排班、自动公招标签识别与策略选择、肉鸽自动化Roguelike 策略与干员选择、自动抄作业Copilot JSON等"
},
{
"title": "自动作战与关卡导航",
"purpose": "文档化 Fight 相关任务的关卡选择导航、理智管理、代理指挥、掉落识别与数据上传流程,以及对应的数据资源与任务链路。",
"parent": "自动化功能"
"purpose": "文档化自动作战功能的实现:关卡选择导航、理智管理、代理指挥、掉落识别与数据上传(企鹅物流、一图流)。涵盖 MaaCore 中 FightTask 及相关代码",
"parent": "核心功能详解"
},
{
"title": "基建自动换班",
"purpose": "文档化 Infrast 相关任务的效率计算、排班与换班逻辑、自定义排班数据,以及基建资源与任务执行之间的关系。",
"parent": "自动化功能"
},
{
"title": "自动公招与标签识别",
"purpose": "文档化公招标签 OCR、标签组合策略、识别结果处理与 recruitment 数据的关系,以及公招自动化的主要任务链路。",
"parent": "自动化功能"
"purpose": "文档化基建功能的实现:干员效率计算、单设施最优解换班、自定义排班 JSON 支持。参考 https://docs.maa.plus/zh-cn/protocol/base-scheduling-schema.html",
"parent": "核心功能详解"
},
{
"title": "肉鸽自动化",
"purpose": "文档化 Roguelike 相关任务的主题配置、招募、练度识别、商店、遭遇、策略参数和不同主题之间的资源差异。",
"parent": "自动化功能"
"purpose": "文档化肉鸽(Roguelike)自动化功能:自动刷源石锭和等级、烧水和凹直升策略、干员识别与练度评估、分队选择与招募逻辑。涵盖 MaaCore 中 Roguelike 相关代码和 resource 中的肉鸽资源数据",
"parent": "核心功能详解"
},
{
"title": "自动抄作业",
"purpose": "文档化 Copilot 作业数据格式、干员部署与技能释放逻辑、作业资源的组织方式,以及与外部作业站的关系。",
"parent": "自动化功能"
"purpose": "文档化 Copilot(自动抄作业)功能:作业 JSON 格式、干员部署与技能释放逻辑、与 prts.plus 作业站的配合。参考 https://docs.maa.plus/zh-cn/protocol/copilot-schema.html",
"parent": "核心功能详解"
},
{
"title": "专项玩法自动化",
"purpose": "文档化 SSS、Reclamation、MiniGame 等不适合并入主功能页的专项玩法任务族群,以及它们在 Task 与 resource 中的组织方式。",
"parent": "自动化功能"
},
{
"title": "工程体系",
"purpose": "概述构建、发布、测试、文档站、内部工具与子模块边界之间的工程协作关系。",
"parent": "项目总览"
},
{
"title": "构建系统、CI/CD 与发布包",
"purpose": "文档化 CMake 构建体系、依赖管理、跨平台构建流程、.github/workflows 中的持续集成流程,以及 package-definition.json 定义的发布包形态。",
"parent": "工程体系"
},
{
"title": "测试体系与回归资源",
"purpose": "文档化 unit_test 的 Catch2 与 CTest 单元测试体系、test 子模块的回归测试角色、suite 组织方式,以及 CI 中的测试选择逻辑。",
"parent": "工程体系",
"page_notes": [
{
"content": "必须显式区分 unit_test 与 test 子模块,分别说明它们的定位、运行方式与 CI 集成方式,避免混写为单一测试体系。"
}
]
"title": "构建系统与 CI/CD",
"purpose": "文档化项目的构建配置CMake 构建系统、maadeps 依赖管理、各平台编译流程Windows/Linux/macOS、.github/workflows/ 中的 CI 工作流ci.yml、smoke-testing.yml、release-*.yml 等)、自动化发布流程"
},
{
"title": "内部工具集",
"purpose": "文档化 tools 目录下用于资源更新、模板优化、OTA 打包、海外客户端适配、肉鸽辅助和图像处理的内部工具及其维护用途。",
"parent": "工程体系"
"purpose": "文档化 tools/ 目录下的开发与维护工具ResourceUpdater资源更新、OTAPackerOTA 打包、OptimizeTemplates模板优化、OverseasClients海外客户端适配、RoguelikeRecruitmentTool肉鸽招募工具、ImageCropper图片裁剪",
"parent": "构建系统与 CI/CD"
},
{
"title": "文档站、协议与开发指南",
"purpose": "文档化 docs 目录作为 VuePress 文档站的结构,串联 manual、protocol、develop、glossary 等内容域,以及它们与外部中文文档站的关系。",
"parent": "工程体系",
"page_notes": [
{
"content": "优先使用 docs 目录内部结构解释文档体系,再引用 docs.maa.plus 中文页面;不要按不同语言版本重复讲述相同主题。"
}
]
"title": "外服适配",
"purpose": "文档化如何为国际服、日服、韩服、繁中服适配 MAA 功能:资源替换流程、截图与 JSON 修改方法、多客户端资源目录结构。参考 https://docs.maa.plus/zh-cn/develop/overseas-client-adaptation.html",
"parent": "核心功能详解"
},
{
"title": "仓库结构与子模块边界",
"purpose": "文档化顶层目录、include、3rdparty、resource、docs、src 等入口的职责分工,并明确各个子模块或边界模块在仓库中的定位。",
"parent": "工程体系"
"title": "开发指南",
"purpose": "面向贡献者的开发入门文档环境搭建、编译步骤、代码规范、Git 工作流dev-v2 分支、Issue Bot 使用、PR 流程。参考 https://docs.maa.plus/zh-cn/develop/development.html"
}
]
}

View File

@@ -45,6 +45,8 @@ body:
**若待上传压缩包大于 25MB请转而上传该压缩包同日期文件夹中的若干小压缩包**
**若为 MAA 闪退问题,如果 %LOCALAPPDATA%\CrashDumps 中存在 MAA.exe.dmp 文件,请一并上传**
若正在使用 macOS请点击屏幕左上角的“文件”点击“打开日志文件夹”
placeholder: |
请确认上传文件前已关闭 MAA
validations:
required: true
- type: textarea

View File

@@ -49,6 +49,8 @@ body:
**请在 MAA -> 设置 -> 问题反馈中找到生成日志压缩包按钮,点击并上传压缩包**
**请直接将完整的文件拖拽进来,而非自己裁切或复制的片段;若文件体积过大可压缩后再上传**
placeholder: |
请确认上传文件前已关闭 MAA
validations:
required: true
- type: textarea

View File

@@ -49,6 +49,8 @@ body:
**请在 MAA -> 设置 -> 问题反馈中找到生成日志压缩包按钮,点击并上传压缩包**
**请直接将完整的文件拖拽进来,而非自己裁切或复制的片段;若文件体积过大可压缩后再上传**
placeholder: |
请确认上传文件前已关闭 MAA
validations:
required: true
- type: textarea

View File

@@ -47,6 +47,8 @@ body:
**If the archive to upload is larger than 25MB, please upload smaller archives from the same date folder instead.**
**If the issue is related to MAA crashing, please upload the MAA.exe.dmp file found in %LOCALAPPDATA%\CrashDumps if it exists**
If you are using macOS, please click the "File" option in the top-left corner of the screen, then click "Open Log Folder".
placeholder: |
Please confirm that MAA is not running before uploading files.
validations:
required: true
- type: textarea

View File

@@ -13,7 +13,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false # Needed to bypass protection rules in Push changes
@@ -41,7 +41,7 @@ jobs:
- name: Push changes
if: ${{ steps.check_changes.outcome == 'failure' }}
uses: ad-m/github-push-action@881a6320fdb16eb5318c5054f31c218aec2b324c # v1.3.0
uses: ad-m/github-push-action@master
with:
branch: ${{ github.ref }}
github_token: ${{ secrets.MAA_RESOURCE_SYNC }}

View File

@@ -1,52 +1,96 @@
name: MAAUnified Quick Tests
name: Build MAAUnified (Avalonia + MaaCore Runtime)
on:
workflow_dispatch:
pull_request:
paths:
- ".github/workflows/ci-avalonia.yml"
- "src/MAAUnified"
- "src/MAAUnified/**"
- "!**/*.md"
- "src/MaaCore/**"
- "src/MaaUtils/**"
- "include/**"
- "resource/**"
- "tools/maadeps-download.py"
- "CMakeLists.txt"
- "CMakePresets.json"
push:
branches:
- dev-v2
- dev
paths:
- ".github/workflows/ci-avalonia.yml"
- "src/MAAUnified"
- "src/MAAUnified/**"
- "!**/*.md"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.head.repo.full_name || github.repository }}-${{ github.head_ref || github.ref_name }}
cancel-in-progress: true
- "src/MaaCore/**"
- "src/MaaUtils/**"
- "include/**"
- "resource/**"
- "tools/maadeps-download.py"
- "CMakeLists.txt"
- "CMakePresets.json"
jobs:
test:
name: .NET Tests (${{ matrix.name }})
meta:
name: Resolve version tag
runs-on: ubuntu-latest
outputs:
tag: ${{ steps.out.outputs.tag }}
steps:
- id: out
run: |
if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
echo "tag=${GITHUB_REF_NAME}" >> "$GITHUB_OUTPUT"
else
echo "tag=preview-${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT"
fi
build:
name: Build ${{ matrix.name }}
needs: meta
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- name: windows-x64
os: windows-latest
rid: win-x64
self_contained: true
cmake_preset: windows-publish-x64
maadeps_triplet: x64-windows
- name: linux-x64
os: ubuntu-latest
- name: windows-x64
os: windows-2025-vs2026
rid: linux-x64
self_contained: true
cmake_preset: linux-publish-x64
maadeps_triplet: x64-linux
- name: macos-x64
os: macos-latest
rid: osx-x64
self_contained: true
cmake_preset: macos-publish-x64
maadeps_triplet: x64-osx
steps:
- uses: actions/checkout@v7
with:
show-progress: false
- uses: actions/checkout@v6
- name: Fetch required submodules
shell: bash
run: bash ./.github/scripts/sync-optional-submodules.sh --init --depth 1 src/MAAUnified
run: bash ./.github/scripts/sync-optional-submodules.sh --init --depth 1 src/MAAUnified src/MaaUtils
- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: "10.0.x"
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: "3.x"
- name: Restore app
run: dotnet restore src/MAAUnified/App/MAAUnified.App.csproj
- name: Restore tests
if: matrix.name != 'macos-x64'
run: dotnet restore src/MAAUnified/Tests/MAAUnified.Tests.csproj
- name: Run Linux baseline consistency gate
@@ -81,9 +125,65 @@ jobs:
--filter "FullyQualifiedName~PlatformWindowsNativeSmokeTests"
- name: Upload test result artifacts on failure
if: failure()
uses: actions/upload-artifact@v7
if: failure() && matrix.name != 'macos-x64'
uses: actions/upload-artifact@v6
with:
name: MAAUnified-TestResults-${{ matrix.name }}
path: TestResults/${{ matrix.name }}/*.trx
if-no-files-found: ignore
- name: Bootstrap MaaDeps
run: python tools/maadeps-download.py ${{ matrix.maadeps_triplet }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build MaaCore runtime
run: |
cmake --preset ${{ matrix.cmake_preset }} -DINSTALL_PYTHON=OFF -DMAA_HASH_VERSION='${{ needs.meta.outputs.tag }}'
cmake --build --preset ${{ matrix.cmake_preset }}
cmake --install build --config RelWithDebInfo
- name: Publish MAAUnified app
run: dotnet publish src/MAAUnified/App/MAAUnified.App.csproj -c Release -r ${{ matrix.rid }} --self-contained ${{ matrix.self_contained }} -o publish
- name: Merge MaaCore runtime (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
Copy-Item install\* publish\ -Recurse -Force
if (!(Test-Path "publish\MaaCore.dll")) { throw "MaaCore.dll not found in publish output." }
if (!(Test-Path "publish\resource")) { throw "resource directory not found in publish output." }
- name: Merge MaaCore runtime (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
cp -a install/. publish/
if [[ "$RUNNER_OS" == "Linux" ]]; then
test -f publish/libMaaCore.so
else
test -f publish/libMaaCore.dylib
fi
test -d publish/resource
- name: Package (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
New-Item -ItemType Directory -Path release -Force | Out-Null
$name = "MAAUnified-${{ needs.meta.outputs.tag }}-${{ matrix.name }}"
Compress-Archive -Path publish\* -DestinationPath "release\$name.zip"
- name: Package (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
mkdir -p release
name="MAAUnified-${{ needs.meta.outputs.tag }}-${{ matrix.name }}"
tar -czf "release/${name}.tar.gz" -C publish .
- name: Upload artifact
uses: actions/upload-artifact@v6
with:
name: MAAUnified-${{ matrix.name }}
path: release/*

View File

@@ -42,13 +42,11 @@ jobs:
prerelease: ${{ steps.set_pre.outputs.prerelease }}
steps:
- name: Show concurrency group
env:
CONCURRENCY_GROUP: ${{ github.workflow }}-${{ github.event.pull_request.head.repo.full_name || github.repository }}-${{ github.head_ref || github.ref_name }}${{ github.ref == 'refs/heads/dev-v2' && format('-{0}', github.sha) || '' }}
run: |
echo "Concurrency Group: $CONCURRENCY_GROUP"
echo "Concurrency Group: ${{ github.workflow }}-${{ github.event.pull_request.head.repo.full_name || github.repository }}-${{ github.head_ref || github.ref_name }}${{ github.ref == 'refs/heads/dev-v2' && format('-{0}', github.sha) || '' }}"
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
fetch-depth: 0
show-progress: false
@@ -103,11 +101,11 @@ jobs:
matrix:
arch: [arm64, x64]
fail-fast: false
runs-on: windows-2025-vs2026
runs-on: windows-latest
steps:
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
show-progress: false
@@ -117,7 +115,7 @@ jobs:
- name: Cache MaaDeps
id: cache-maadeps
uses: actions/cache@v6
uses: actions/cache@v5
continue-on-error: true
with:
path: |
@@ -135,7 +133,6 @@ jobs:
run: |
cmake -B build --preset ${{ matrix.arch == 'arm64' && 'windows-publish-arm64' || 'windows-publish-x64' }} -DMAA_HASH_VERSION='${{ needs.meta.outputs.tag }}'
cmake --build --preset ${{ matrix.arch == 'arm64' && 'windows-publish-arm64' || 'windows-publish-x64' }} --parallel $env:NUMBER_OF_PROCESSORS
cmake --build build --target MAA.Updater --config RelWithDebInfo --parallel $env:NUMBER_OF_PROCESSORS
cmake --install build --config RelWithDebInfo
- name: Download MaaFramework
@@ -143,7 +140,7 @@ jobs:
with:
repository: MaaXYZ/MaaFramework
tag: v5.9.2
fileName: ${{ matrix.arch == 'arm64' && '*win-aarch64*.zip' || '*win-x86_64*.zip' }}
fileName: ${{ matrix.arch == "arm64" && "*win-aarch64*.zip" || "*win-x86_64*.zip" }}
extract: true
out-file-path: MaaFramework-temp
@@ -152,29 +149,14 @@ jobs:
cp MaaFramework-temp/bin/*Win32ControlUnit* install/
cp MaaFramework-temp/bin/*AdbControlUnit* install/
- name: Upload MaaCore runtime for downstream jobs
uses: actions/upload-artifact@v7
with:
name: MAARuntime-win-${{ matrix.arch }}
path: |
install/
!install/*.h
!install/*.pdb
!install/msvc-debug/
- name: Generate global.json
shell: bash
run: |
echo '{"sdk":{"version":"10.0.203","rollForward":"disable"}}' > global.json
- name: Setup .NET SDK
uses: actions/setup-dotnet@v5
with:
global-json-file: global.json
dotnet-version: '10.0.202'
- name: Cache .nuke/temp, ~/.nuget/packages
id: cache-nuget
uses: actions/cache@v6
uses: actions/cache@v5
continue-on-error: true
with:
path: |
@@ -220,7 +202,6 @@ jobs:
with:
name: MAAComponent-DebugSymbol-win-${{ matrix.arch }}
path: install/MAAComponent-DebugSymbol-${{ needs.meta.outputs.tag }}-win-${{ matrix.arch }}.zip
compression-level: 0
- name: Organize install files
shell: bash
@@ -229,7 +210,6 @@ jobs:
rm -rf install/*.pdb
rm -rf install/msvc-debug
rm -rf install/*.h
rm -rf install/*.bak
cp tools/DependencySetup_依赖库安装.bat install
@@ -243,7 +223,6 @@ jobs:
with:
name: MAA-win-${{ matrix.arch }}
path: install/MAA-*.zip
compression-level: 0
ubuntu:
name: Build for Ubuntu
@@ -255,7 +234,7 @@ jobs:
fail-fast: false
steps:
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
show-progress: false
@@ -265,7 +244,7 @@ jobs:
- name: Cache MaaDeps
id: cache-maadeps
uses: actions/cache@v6
uses: actions/cache@v5
continue-on-error: true
with:
path: ./src/MaaUtils/MaaDeps
@@ -299,12 +278,6 @@ jobs:
run: |
cp MaaFramework-temp/bin/*AdbControlUnit* install/
- name: Upload MaaCore runtime for downstream jobs
uses: actions/upload-artifact@v7
with:
name: MAARuntime-linux-${{ matrix.arch }}
path: install/
- name: Setup cross compile toolchains for CLI
uses: ./src/maa-cli/.github/actions/setup
with:
@@ -327,7 +300,7 @@ jobs:
mkdir -pv release
mkdir -pv Maa.AppDir/usr/share/maa
cp -r install/* Maa.AppDir/usr/share/maa/
wget -c https://raw.githubusercontent.com/MaaAssistantArknights/design/main/v2/icons/maa-logo_512x512.png -O Maa.AppDir/maa.png
wget -c https://raw.githubusercontent.com/MaaAssistantArknights/design/main/logo/maa-logo_512x512.png -O Maa.AppDir/maa.png
mkdir -pv Maa.AppDir/usr/share/icons/hicolor/512x512/apps/
cp -v Maa.AppDir/maa.png Maa.AppDir/usr/share/icons/hicolor/512x512/apps/
cp -v appimage-maa Maa.AppDir/usr/share/maa/maa
@@ -368,80 +341,6 @@ jobs:
path: |
release/*.AppImage
release/*.tar.gz
compression-level: 0
android:
name: Build for Android
needs: meta
runs-on: macos-26
strategy:
matrix:
arch: [arm64, x64]
fail-fast: false
steps:
- name: Checkout repository
uses: actions/checkout@v7
with:
show-progress: false
- name: Fetch submodules
run: |
git submodule update --init --depth 1 src/MaaUtils
- name: Cache MaaDeps
id: cache-maadeps
uses: actions/cache@v6
continue-on-error: true
with:
path: ./src/MaaUtils/MaaDeps
key: ${{ runner.os }}-${{ matrix.arch }}-android-maadeps-${{ hashFiles('tools/maadeps-download.py') }}
- name: Bootstrap MaaDeps
if: steps.cache-maadeps.outputs.cache-hit != 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
python3 tools/maadeps-download.py ${{ matrix.arch }}-android
- name: Setup Android NDK
id: setup-ndk
uses: nttld/setup-ndk@v1
with:
ndk-version: r29
- name: Configure, build and install
run: |
cmake -B build --preset 'android-publish-${{ matrix.arch }}' \
-DCMAKE_TOOLCHAIN_FILE=${{ steps.setup-ndk.outputs.ndk-path }}/build/cmake/android.toolchain.cmake \
-DMAA_HASH_VERSION='${{ needs.meta.outputs.tag }}'
cmake --build build --parallel $(sysctl -n hw.logicalcpu)
cmake --install build --prefix install
- name: Download MaaFramework
uses: robinraju/release-downloader@v1
with:
repository: MaaXYZ/MaaFramework
latest: true
fileName: "*android-${{ matrix.arch == 'arm64' && 'aarch64' || 'x86_64' }}*.zip"
extract: true
out-file-path: MaaFramework-temp
- name: Copy MaaAndroidNativeControlUnit
run: |
cp MaaFramework-temp/bin/libMaaAndroidNativeControlUnit.so install/
- name: Tar files
run: |
cd install
tar czvf $GITHUB_WORKSPACE/MAAComponent-${{ needs.meta.outputs.tag }}-android-${{ matrix.arch }}.tar.gz .
- name: Upload MAA to GitHub
uses: actions/upload-artifact@v7
with:
name: MAAComponent-android-${{ matrix.arch }}
path: MAAComponent-*.tar.gz
compression-level: 0
macOS-Core:
name: Build Core for macOS
@@ -453,7 +352,7 @@ jobs:
fail-fast: false
steps:
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
show-progress: false
@@ -468,7 +367,7 @@ jobs:
- name: Cache MaaDeps
id: cache-maadeps
uses: actions/cache@v6
uses: actions/cache@v5
continue-on-error: true
with:
path: ./src/MaaUtils/MaaDeps
@@ -505,19 +404,13 @@ jobs:
name: MAACore-macos-${{ matrix.arch }}
path: "install/*.dylib"
- name: Upload MaaCore runtime for downstream jobs
uses: actions/upload-artifact@v7
with:
name: MAARuntime-macos-${{ matrix.arch }}
path: install/
macOS-GUI:
name: Build GUI for macOS
needs: [meta, macOS-Core]
runs-on: macos-26
steps:
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
show-progress: false
@@ -545,14 +438,14 @@ jobs:
- name: Install Developer ID certificate
if: startsWith(github.ref, 'refs/tags/v')
uses: apple-actions/import-codesign-certs@v7
uses: apple-actions/import-codesign-certs@v6
with:
p12-file-base64: ${{ secrets.HGUANDL_SIGN_CERT_P12 }}
p12-password: ${{ secrets.HGUANDL_SIGN_CERT_PASSWD }}
- name: Download provisioning profiles
if: startsWith(github.ref, 'refs/tags/v')
uses: apple-actions/download-provisioning-profiles@v6
uses: apple-actions/download-provisioning-profiles@v5
with:
bundle-id: "com.hguandl.MeoAsstMac"
issuer-id: ${{ secrets.HGUANDL_APPSTORE_ISSUER }}
@@ -588,8 +481,6 @@ jobs:
with:
name: MAA-macos-runtime-universal
path: runtime/MAA-${{ needs.meta.outputs.tag }}-macos-runtime-universal.zip
compression-level: 0
- name: Build XCFramework
run: |
@@ -673,143 +564,10 @@ jobs:
name: MAA-macos-universal
path: ${{ startsWith(github.ref, 'refs/tags/v') && 'release/MAA*' || 'src/MaaMacGui/MAA.xcarchive/**' }}
avalonia:
name: Build MAAUnified (Avalonia) ${{ matrix.name }}
needs: [meta, windows, ubuntu, macOS-Core]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- name: win-x64
os: windows-2025-vs2026
rid: win-x64
runtime_artifact: MAARuntime-win-x64
- name: linux-x64
os: ubuntu-latest
rid: linux-x64
runtime_artifact: MAARuntime-linux-x86_64
- name: macos-x64
os: macos-latest
rid: osx-x64
runtime_artifact: MAARuntime-macos-x86_64
steps:
- name: Checkout repository
uses: actions/checkout@v7
with:
show-progress: false
- name: Fetch required submodules
shell: bash
run: bash ./.github/scripts/sync-optional-submodules.sh --init --depth 1 src/MAAUnified
- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: "10.0.x"
- name: Restore app
run: dotnet restore src/MAAUnified/App/MAAUnified.App.csproj
- name: Restore tests
if: matrix.name != 'macos-x64'
run: dotnet restore src/MAAUnified/Tests/MAAUnified.Tests.csproj
- name: Run Linux baseline consistency gate
if: matrix.name == 'linux-x64'
run: >
dotnet test src/MAAUnified/Tests/MAAUnified.Tests.csproj -c Release --no-restore --disable-build-servers -m:1
--results-directory TestResults/${{ matrix.name }}
--logger "trx;LogFileName=baseline-consistency.trx"
--filter "FullyQualifiedName~BaselineContractTests|FullyQualifiedName~BaselineCoverageTests|FullyQualifiedName~BaselineRenderSyncTests|FullyQualifiedName~ParityMatrixSyncTests"
- name: Run Linux full MAAUnified test gate
if: matrix.name == 'linux-x64'
run: >
dotnet test src/MAAUnified/Tests/MAAUnified.Tests.csproj -c Release --no-restore --disable-build-servers -m:1
--results-directory TestResults/${{ matrix.name }}
--logger "trx;LogFileName=full-maaunified-tests.trx"
- name: Run Windows platform capability contract gate
if: matrix.name == 'win-x64'
run: >
dotnet test src/MAAUnified/Tests/MAAUnified.Tests.csproj -c Release --no-restore --disable-build-servers -m:1
--results-directory TestResults/${{ matrix.name }}
--logger "trx;LogFileName=platform-capability-contract.trx"
--filter "FullyQualifiedName~PlatformCapabilityContractTests"
- name: Run Windows native capability smoke gate
if: matrix.name == 'win-x64'
run: >
dotnet test src/MAAUnified/Tests/MAAUnified.Tests.csproj -c Release --no-restore --disable-build-servers -m:1
--results-directory TestResults/${{ matrix.name }}
--logger "trx;LogFileName=platform-windows-native-smoke.trx"
--filter "FullyQualifiedName~PlatformWindowsNativeSmokeTests"
- name: Upload test result artifacts on failure
if: failure() && matrix.name != 'macos-x64'
uses: actions/upload-artifact@v7
with:
name: MAAUnified-TestResults-${{ matrix.name }}
path: TestResults/${{ matrix.name }}/*.trx
if-no-files-found: ignore
- name: Download MaaCore runtime
uses: actions/download-artifact@v8
with:
name: ${{ matrix.runtime_artifact }}
path: install
- name: Publish MAAUnified app
run: dotnet publish src/MAAUnified/App/MAAUnified.App.csproj -c Release -r ${{ matrix.rid }} --self-contained true -o publish
- name: Merge MaaCore runtime (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
Copy-Item install\* publish\ -Recurse -Force
if (!(Test-Path "publish\MaaCore.dll")) { throw "MaaCore.dll not found in publish output." }
if (!(Test-Path "publish\resource")) { throw "resource directory not found in publish output." }
- name: Merge MaaCore runtime (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
cp -a install/. publish/
if [[ "$RUNNER_OS" == "Linux" ]]; then
test -f publish/libMaaCore.so
else
test -f publish/libMaaCore.dylib
fi
test -d publish/resource
- name: Package (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: |
New-Item -ItemType Directory -Path release -Force | Out-Null
$name = "MAAUnified-${{ needs.meta.outputs.tag }}-${{ matrix.name }}"
Compress-Archive -Path publish\* -DestinationPath "release\$name.zip"
- name: Package (Unix)
if: runner.os != 'Windows'
shell: bash
run: |
mkdir -p release
name="MAAUnified-${{ needs.meta.outputs.tag }}-${{ matrix.name }}"
tar -czf "release/${name}.tar.gz" -C publish .
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: MAAUnified-${{ matrix.name }}
path: release/*
release:
name: Publish Release
if: startsWith(github.ref, 'refs/tags/v')
needs: [meta, windows, ubuntu, android, macOS-Core, macOS-GUI]
needs: [meta, windows, ubuntu, macOS-Core, macOS-GUI]
runs-on: ubuntu-latest
steps:
- name: Download MAA from GitHub
@@ -821,14 +579,12 @@ jobs:
run: |
mv -vf assets/changelog/* .
rm -rf assets/MAACore-macos-*
rm -rf assets/MAARuntime-*
rm -rf assets/MAAUnified-*
cd assets
# find . -type f | xargs mv -fvt .
find . -type f | while read f; do mv -fvt . $f; done
- name: Publish release to GitHub
uses: softprops/action-gh-release@v3.0.1
uses: softprops/action-gh-release@v2.6.1
with:
body_path: CHANGELOG.md
files: |
@@ -851,6 +607,11 @@ jobs:
env:
GH_TOKEN: ${{ secrets.MISTEOWORKFLOW }}
- name: Create issue on failure
if: failure()
uses: actions-cool/issues-helper@v3
with:
actions: "create-issue"
title: "Errors occured during release ${{ needs.meta.outputs.tag }}"
body: |
${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}

View File

@@ -42,31 +42,27 @@ jobs:
URL="${{ steps.release.outputs.url }}"
BASE_URL="https://github.com/${{ github.repository }}/releases/download/${TAG}"
WIN64_URL="${BASE_URL}/MAA-${TAG}-win-x64.zip"
WINARM_URL="${BASE_URL}/MAA-${TAG}-win-arm64.zip"
WIN_URL="${BASE_URL}/MAA-${TAG}-win-x64.zip"
MAC_URL="${BASE_URL}/MAA-${TAG}-macos-universal.dmg"
LIN64_URL="${BASE_URL}/MAA-${TAG}-linux-x86_64.tar.gz"
LINARM_URL="${BASE_URL}/MAA-${TAG}-linux-aarch64.tar.gz"
LIN_URL="${BASE_URL}/MAA-${TAG}-linux-amd64.tar.gz"
DESCRIPTION=$(printf 'Read the full release note [here](%s).\n\nReopen your MAA client to get automatic updates.\nDownload MAA `%s` for your platform below.' "$URL" "$TAG")
DESCRIPTION=$(printf 'Read the full release note [here](%s).\n\nOpen or reopen your MAA client to get automatic updates.\nOr, download `MAA %s` for your platform by clicking the buttons below.' "$URL" "$TAG")
PAYLOAD=$(jq -n \
--arg tag "$TAG" \
--arg description "$DESCRIPTION" \
--arg win64_url "$WIN64_URL" \
--arg winarm_url "$WINARM_URL" \
--arg win_url "$WIN_URL" \
--arg mac_url "$MAC_URL" \
--arg lin64_url "$LIN64_URL" \
--arg linarm_url "$LINARM_URL" \
--arg lin_url "$LIN_URL" \
'{
embeds: [{
title: ("🎉 New MAA Release: " + $tag),
description: $description,
color: 10246582,
fields: [
{ name: "Windows", value: ("[x64](" + $win64_url + ") ❘ [ARM](" + $winarm_url + ")"), inline: true },
{ name: "macOS", value: ("[Universal](" + $mac_url + ")"), inline: true },
{ name: "Linux", value: ("[x64](" + $lin64_url + ") ❘ [ARM](" + $linarm_url + ")"), inline: true }
{ name: "Windows (x64)", value: ("[↗ Download](" + $win_url + ")"), inline: true },
{ name: "macOS (Universal, dmg)", value: ("[↗ Download](" + $mac_url + ")"), inline: true },
{ name: "Linux (amd64, tar.gz)", value: ("[↗ Download](" + $lin_url + ")"), inline: true }
]
}]
}')

View File

@@ -13,7 +13,7 @@ on:
type: number
jobs:
ai-analysis:
copilot-analysis:
if: |
(github.event_name == 'issues' && github.event.action == 'opened') ||
github.event_name == 'workflow_dispatch' ||
@@ -22,41 +22,44 @@ jobs:
contains(github.event.comment.body, '@MaaArknightsBot') &&
github.event.comment.user.type != 'Bot')
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: read
issues: write
steps:
# 分析质量仍依赖配套的 issue/log analysis skill。
# 这个 action 只负责编排,分析质量仍依赖配套的 issue/log analysis skill。
# 详细使用文档https://github.com/MistEO/ai-issue-analysis
# 最佳实践参考:
# - https://github.com/MaaEnd/MaaEnd/blob/v2/.claude/skills/maaend-issue-log-analysis/SKILL.md
# - https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev-v2/.claude/skills/maa-issue-log-analysis/SKILL.md
- name: Analyze issue with AI
id: analysis
continue-on-error: true
uses: MistEO/ai-issue-analysis@main
uses: Misteo/ai-issue-analysis@main
with:
agent: ${{ secrets.BOT_AI_AGENT }}
api-key: ${{ secrets.BOT_AI_API_KEY }}
api-base-url: ${{ secrets.BOT_AI_API_BASE_URL }}
model: ${{ secrets.BOT_AI_MODEL }}
github-token: ${{ secrets.MAA_BOT_TOKEN }}
copilot-github-token: ${{ secrets.COPILOT_GITHUB_TOKEN }}
bot-name: '@MaaArknightsBot'
initial-comment-body: |
🤖 **MaaBot 正在分析该 Issue...**
感谢您的反馈AI 正在自动分析该问题,预计耗时约 10 分钟。
prompt-template: |
严格按照 .claude/skills/maa-issue-log-analysis/SKILL.md 中的规则,分析 GitHub Issue {{issue_number}}。把最终结论写到 {{answer_file}}。
分析 GitHub Issue {{issue_number}}。把最终结论写到 {{copilot_answer_file}}。
extra-comment-content: |
<!-- Skip all labels -->
- name: 查看完整输入输出
if: always()
env:
ANALYSIS_PROMPT: ${{ steps.analysis.outputs.analysis-prompt }}
ISSUE_NUMBER: ${{ steps.analysis.outputs.issue-number }}
COMMENT_ID: ${{ steps.analysis.outputs.comment-id }}
COMMENT_URL: ${{ steps.analysis.outputs.comment-url }}
COPILOT_OUTPUT: ${{ steps.analysis.outputs.copilot-output }}
FINAL_CONCLUSION: ${{ steps.analysis.outputs.final-conclusion }}
run: |
printf '%s\n' "$ANALYSIS_PROMPT"
echo "issue_number=$ISSUE_NUMBER"
echo "comment_id=$COMMENT_ID"
echo "comment_url=$COMMENT_URL"
echo "(Full agent-output and final-conclusion are available in the uploaded artifacts)"
printf '%s\n' "$COPILOT_OUTPUT"
printf '%s\n' "$FINAL_CONCLUSION"

View File

@@ -14,7 +14,7 @@ jobs:
steps:
- name: Check for duplicate issues in last hour
id: duplicate-check
uses: actions/github-script@v9
uses: actions/github-script@v8
with:
script: |
const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000);
@@ -66,7 +66,7 @@ jobs:
- name: Check for issue checkboxes
id: unread-checkbox-check
uses: actions/github-script@v9
uses: actions/github-script@v8
with:
script: |
// 找不到###就算了
@@ -89,7 +89,7 @@ jobs:
- name: Close low-quality issue
if: steps.unread-checkbox-check.outputs.result == 'true'
uses: actions/github-script@v9
uses: actions/github-script@v8
with:
script: |
await github.rest.issues.update({
@@ -116,7 +116,7 @@ jobs:
- name: Fold checkboxes
if: steps.unread-checkbox-check.outputs.result == 'false'
uses: actions/github-script@v9
uses: actions/github-script@v8
with:
script: |
const originalBody = context.payload.issue.body;

View File

@@ -31,12 +31,12 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
show-progress: false
- name: Cache lychee responses
uses: actions/cache@v6
uses: actions/cache@v5
continue-on-error: true
with:
path: .lycheecache

View File

@@ -44,7 +44,7 @@ jobs:
- name: Checkout repository
if: steps.check_push.outputs.is_pr != 'True'
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
show-progress: false
persist-credentials: false
@@ -104,7 +104,7 @@ jobs:
- name: Push changes
if: steps.check_push.outputs.is_pr != 'True' && steps.commit_changes.outputs.have_commits == 'True' && github.repository_owner == 'MaaAssistantArknights'
uses: ad-m/github-push-action@881a6320fdb16eb5318c5054f31c218aec2b324c # v1.3.0
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.MAA_RESOURCE_SYNC }}
branch: ${{ github.ref }}

View File

@@ -21,7 +21,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
fetch-depth: 0
token: ${{ secrets.MAARELEASE_RELEASE }}
@@ -33,29 +33,21 @@ jobs:
- name: Determine tag name
id: extract_tag
env:
EVENT_NAME: ${{ github.event_name }}
PR_TITLE: ${{ github.event.pull_request.title }}
INPUT_TAG: ${{ inputs.tag }}
run: |
if [ "$EVENT_NAME" != "workflow_dispatch" ]; then
tag_name=$(printf '%s' "$PR_TITLE" | sed -E 's/(Release|release)//' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
if ${{ github.event_name != 'workflow_dispatch' }}; then
tag_name=$(echo "${{ github.event.pull_request.title }}" | sed -E 's/(Release|release)//' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
echo "tag_name=$tag_name" >> $GITHUB_OUTPUT
else
echo "tag_name=$INPUT_TAG" >> $GITHUB_OUTPUT
echo "tag_name=${{ inputs.tag }}" >> $GITHUB_OUTPUT
fi
- name: Create and push release tag
env:
TAG_NAME: ${{ steps.extract_tag.outputs.tag_name }}
run: |
git tag -a "$TAG_NAME" -m "$TAG_NAME" -f
git push origin "$TAG_NAME"
git tag -a "${{ steps.extract_tag.outputs.tag_name }}" -m "${{ steps.extract_tag.outputs.tag_name }}" -f
git push origin "${{ steps.extract_tag.outputs.tag_name }}"
- name: Merge tag into dev-v2 and push
env:
TAG_NAME: ${{ steps.extract_tag.outputs.tag_name }}
run: |
git switch dev-v2
git merge "$TAG_NAME"
git merge "${{ steps.extract_tag.outputs.tag_name }}"
git push origin dev-v2

View File

@@ -10,8 +10,26 @@ jobs:
if: ${{ !github.event.pull_request.merged && github.base_ref != 'master-v2' }}
runs-on: ubuntu-latest
steps:
- name: Clean up previous comment
uses: actions/github-script@v8
with:
script: |
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number
});
const previousComment = comments.find(comment => comment.user.login === 'github-actions[bot]' && comment.body.includes('invalid commit(s)'));
if (previousComment) {
await github.rest.issues.deleteComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: previousComment.id
});
}
- name: Check commits
uses: actions/github-script@v9
uses: actions/github-script@v8
with:
script: |
const { data: commits } = await github.rest.pulls.listCommits({
@@ -22,59 +40,20 @@ jobs:
});
const regex = /^((build|chore|ci|docs?|feat!?|fix|perf|refactor|rft|style|test|i18n|typo|debug)[\:\.\(\,]|[Rr]evert|[Rr]elease|[Rr]eapply)/;
const badTitleCommits = commits.filter(commit => !regex.test(commit.commit.message) && commit.parents.length <= 1);
const mergeCommits = commits.filter(commit => commit.parents.length > 1);
const allInvalid = [...badTitleCommits, ...mergeCommits];
const invalidCommits = commits.filter(commit => !regex.test(commit.commit.message) || commit.parents.length > 1);
console.log(`Checked ${commits.length} commit(s), ${badTitleCommits.length} bad title(s), ${mergeCommits.length} merge commit(s)`);
console.log(`Checked ${commits.length} commit(s)`);
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number
});
if (invalidCommits.length > 0) {
const invalidCommitNames = invalidCommits.map(commit => commit.commit.message);
const invalidCommitInfoList = invalidCommits.map(commit => `- ${commit.commit.message.split("\n")[0]} [\`${commit.sha.substring(0, 7)}\`](${commit.html_url})`).join("\n");
const previousComment = comments.find(comment => comment.user.login === 'github-actions[bot]' && comment.body.includes('invalid commit(s)'));
github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
body: `## ⚠️ Found ${invalidCommits.length} invalid commit(s):\n\n${invalidCommitInfoList}\n\n---\nPlease follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) format, and **DO NOT** use merge commits.\n请遵循 [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) 格式,以及**不要**使用Merge Commit修改 Commit Message 无法绕过检测)。`
});
if (allInvalid.length > 0) {
const formatList = (list) => list.map(commit => `- ${commit.commit.message.split("\n")[0]} [\`${commit.sha.substring(0, 7)}\`](${commit.html_url})`).join("\n");
let bodySections = [];
if (badTitleCommits.length > 0) {
bodySections.push(`### 不合规提交名 | Invalid Commit Title(s):\n\n${formatList(badTitleCommits)}`);
}
if (mergeCommits.length > 0) {
bodySections.push(`### 不应使用 Merge Commit | Merge Commit(s) Detected:\n\n${formatList(mergeCommits)}`);
}
const newBody = `## ⚠️ 发现 ${allInvalid.length} 个不合规提交 | Found ${allInvalid.length} invalid commit(s):\n\n${bodySections.join("\n\n")}\n\n---\n请遵循 [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) 格式,以及**不要**使用Merge Commit修改 Commit Message 无法绕过检测)。\nPlease follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) format, and **DO NOT** use merge commits.`;
if (previousComment && previousComment.body === newBody) {
console.log("Invalid commits unchanged, skipping comment update");
} else {
if (previousComment) {
await github.rest.issues.deleteComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: previousComment.id
});
}
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
body: newBody
});
}
const allInvalidNames = allInvalid.map(commit => commit.commit.message);
core.setFailed(`Found ${allInvalid.length} invalid commit(s):\n${allInvalidNames.join("\n-------------------\n")}`);
} else {
if (previousComment) {
await github.rest.issues.deleteComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: previousComment.id
});
}
core.setFailed(`Found ${invalidCommits.length} invalid commit(s):\n${invalidCommitNames.join("\n-------------------\n")}`);
}

View File

@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
fetch-depth: 0
show-progress: false
@@ -25,7 +25,7 @@ jobs:
- name: Commit and push changes
if: steps.pre-commit.outcome == 'failure' && github.repository_owner == 'MaaAssistantArknights'
uses: actions-js/push@5a7cbd780d82c0c937b5977586e641b2fd94acc5 # master as of 2026-05-06
uses: actions-js/push@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
message: "chore: Auto update by pre-commit hooks

View File

@@ -28,7 +28,7 @@ jobs:
build-win-nightly:
name: Build Nightly for Windows
if: github.repository_owner == 'MaaAssistantArknights'
runs-on: windows-2025-vs2026
runs-on: windows-latest
strategy:
matrix:
arch: [x64]
@@ -40,7 +40,7 @@ jobs:
changelog: ${{ steps.read_changelog.outputs.content }}
steps:
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
# repository: 'MaaAssistantArknights/MaaAssistantArknights'
#ref: ${{ inputs.ref }}
@@ -170,7 +170,7 @@ jobs:
- name: Cache MaaDeps
id: cache-maadeps
uses: actions/cache@v6
uses: actions/cache@v5
continue-on-error: true
with:
path: |
@@ -188,7 +188,6 @@ jobs:
run: |
cmake -B build --preset ${{ matrix.arch == 'arm64' && 'windows-publish-arm64' || 'windows-publish-x64' }} -DMAA_HASH_VERSION='${{ steps.set_tag.outputs.tag }}'
cmake --build --preset ${{ matrix.arch == 'arm64' && 'windows-publish-arm64' || 'windows-publish-x64' }} --parallel $env:NUMBER_OF_PROCESSORS
cmake --build build --target MAA.Updater --config RelWithDebInfo --parallel $env:NUMBER_OF_PROCESSORS
cmake --install build --config RelWithDebInfo
- name: Download MaaFramework
@@ -206,19 +205,14 @@ jobs:
run: |
cp MaaFramework-temp/bin/*Win32ControlUnit* install/
- name: Generate global.json
shell: bash
run: |
echo '{"sdk":{"version":"10.0.203","rollForward":"disable"}}' > global.json
- name: Setup .NET SDK
uses: actions/setup-dotnet@v5
with:
global-json-file: global.json
dotnet-version: '10.0.202'
- name: Cache .nuke/temp, ~/.nuget/packages
id: cache-nuget
uses: actions/cache@v6
uses: actions/cache@v5
continue-on-error: true
with:
path: |
@@ -298,7 +292,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout MaaRelease
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
repository: ${{ format('{0}/{1}', github.repository_owner, 'MaaRelease') }}
fetch-depth: 0
@@ -329,7 +323,7 @@ jobs:
echo ${{ needs.build-win-nightly.outputs.tag }}
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
path: MaaAssistantArknights
token: ${{ secrets.MAARELEASE_RELEASE }}

View File

@@ -26,7 +26,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout MaaRelease
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
show-progress: false
repository: ${{ format('{0}/{1}', github.repository_owner, 'MaaRelease') }}
@@ -102,7 +102,7 @@ jobs:
path: ./MaaReleaseConfig
- name: Checkout MaaRelease
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
show-progress: false
repository: ${{ format('{0}/{1}', github.repository_owner, 'MaaRelease') }}
@@ -111,7 +111,7 @@ jobs:
token: ${{ secrets.MAARELEASE_RELEASE }}
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
show-progress: false
path: MaaAssistantArknights
@@ -139,6 +139,15 @@ jobs:
prerelease: ${{ fromJSON(needs.create-tag.outputs.prerelease) }}
overwrite: true
- name: Create issue on failure
if: failure()
uses: actions-cool/issues-helper@v3
with:
actions: "create-issue"
title: "Failed to make OTA release for Windows"
body: |
${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
make-ota-mac:
name: Build and Upload OTA for macOS
needs: create-tag
@@ -183,6 +192,15 @@ jobs:
prerelease: ${{ fromJSON(needs.create-tag.outputs.prerelease) }}
overwrite: true
- name: Create issue on failure
if: failure()
uses: actions-cool/issues-helper@v3
with:
actions: "create-issue"
title: "Failed to make OTA release for macOS"
body: |
${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
release:
name: Publish to Release Mirrors
needs:

View File

@@ -113,58 +113,23 @@ jobs:
env:
RELEASE_TAG: ${{ needs.meta.outputs.RELEASE_TAG }}
WINGET_CREATE_GITHUB_TOKEN: ${{ secrets.MAABOT_WINGET_TOKEN }}
WINGET_CREATE_VERSION: 'v1.12.8.0'
WINGET_CREATE_SHA256: '8BD738851B524885410112678E3771B341C5C716DE60FBBECB88AB0A363ED85D'
steps:
- name: Upload MAA to WinGet
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
$RELEASE_TAG = "${{ env.RELEASE_TAG }}"
# Fetch the release assets from GitHub Releases API and resolve actual download URLs
$headers = @{
Accept = "application/vnd.github+json"
"X-GitHub-Api-Version" = "2026-03-10"
}
if ($env:WINGET_CREATE_GITHUB_TOKEN) {
$headers.Authorization = "Bearer $env:WINGET_CREATE_GITHUB_TOKEN"
}
$release = Invoke-RestMethod `
-Uri "https://api.github.com/repos/MaaAssistantArknights/MaaAssistantArknights/releases/tags/$RELEASE_TAG" `
-Headers $headers
$URL_x64 = $release.assets | Where-Object { $_.name -match "-win-x64.zip$" } | Select-Object -First 1 -ExpandProperty browser_download_url
$URL_arm64 = $release.assets | Where-Object { $_.name -match "-win-arm64.zip$" } | Select-Object -First 1 -ExpandProperty browser_download_url
if (-not $URL_x64 -or -not $URL_arm64) {
Write-Error "Failed to resolve release assets from GitHub API for tag '$RELEASE_TAG'."
exit 1
}
# Download winget-create
curl.exe -JLO "https://github.com/microsoft/winget-create/releases/download/$env:WINGET_CREATE_VERSION/wingetcreate.exe"
# Verify the hash of wingetcreate.exe
if ((Get-FileHash wingetcreate.exe).Hash -ne $env:WINGET_CREATE_SHA256) {
Write-Error "wingetcreate.exe hash does not match expected value. Aborting."
exit 1
}
# Update the package using wingetcreate
.\wingetcreate.exe update MaaAssistantArknights.MaaAssistantArknights `
--version $RELEASE_TAG.TrimStart('v') `
--urls "$URL_x64|x64" "$URL_arm64|arm64" `
--submit
uses: vedantmgoyal9/winget-releaser@main
with:
identifier: MaaAssistantArknights.MaaAssistantArknights
version: ""
installers-regex: "-win-"
max-versions-to-keep: 0
release-tag: ${{ env.RELEASE_TAG }}
fork-user: MaaAssistantArknights
token: ${{ secrets.MAABOT_WINGET_TOKEN }}
maa_cos:
name: Upload to MAA COS
needs: meta
if: false
if: ${{ github.event.inputs.maa_cos == 'true' && !contains(needs.meta.outputs.RELEASE_TAG, '-') }}
runs-on: ubuntu-latest
continue-on-error: true
env:
@@ -180,9 +145,9 @@ jobs:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Upload to COS
uses: zkqiang/tencent-cos-action@v1.0.0
uses: zkqiang/tencent-cos-action@v0.1.0
with:
args: sync -r downloads/${{ env.FILENAME }} cos://default/MAA/${{ env.FILENAME }}
args: upload -rs downloads/${{ env.FILENAME }} MAA/${{ env.FILENAME }}
secret_id: ${{ secrets.MISTEO_MAA_COS_SECRET_ID }}
secret_key: ${{ secrets.MISTEO_MAA_COS_SECRET_KEY }}
bucket: ${{ secrets.MISTEO_MAA_COS_BUCKET }}

View File

@@ -7,127 +7,93 @@ on:
- reopened
- ready_for_review
workflow_dispatch:
inputs:
pr_number:
description: 'Release PR number for changelog generation'
required: false
type: number
jobs:
generate-changelog:
name: Generate Changelog
if: |
(github.event_name == 'workflow_dispatch' && github.event.inputs.pr_number != '') ||
(github.event.pull_request.head.repo.full_name == github.repository &&
github.event.pull_request.draft == false &&
startsWith(github.event.pull_request.title, 'Release v'))
# startsWith 表达式不区分大小写
if: github.event.pull_request.draft == false && startsWith(github.event.pull_request.title, 'Release v')
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: write
pull-requests: write
issues: write
steps:
- name: Checkout dev-v2 with full history
uses: actions/checkout@v7
- name: Checkout repository
uses: actions/checkout@v6
with:
ref: dev-v2
fetch-depth: 0
show-progress: false
- name: Extract version from Release PR
id: version
- name: Extract release information
id: extract_tag
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number || github.event.inputs.pr_number }}
PR_TITLE: ${{ github.event.pull_request.title }}
PR_BODY: ${{ format('{0}/{1}', runner.temp, 'output' ) }}
run: |
title="${PR_TITLE:-$(gh pr view "$PR_NUMBER" --json title -q .title)}"
version=$(echo "$title" | sed -E 's/[Rr]elease\s*//')
echo "version=$version" >> "$GITHUB_OUTPUT"
echo "Release version: $version"
tag_name=$(echo "${{ github.event.pull_request.title }}" | sed -E 's/(Release|release)//' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
echo "tag_name=$tag_name" >> $GITHUB_OUTPUT
- name: Generate changelog with AI
id: analysis
continue-on-error: true
uses: MistEO/ai-issue-analysis@main
with:
agent: ${{ secrets.BOT_AI_AGENT }}
api-key: ${{ secrets.BOT_AI_API_KEY }}
api-base-url: ${{ secrets.BOT_AI_API_BASE_URL }}
model: ${{ secrets.BOT_AI_MODEL }}
github-token: ${{ secrets.MAA_BOT_TOKEN }}
issue-number: ${{ github.event.pull_request.number || github.event.inputs.pr_number }}
checkout-repository: false
initial-comment-body: |
🤖 **AI 正在生成 Changelog...**
pr_title="docs: Auto Update Changelogs of "$tag_name
echo "pr_title=$pr_title" >> $GITHUB_OUTPUT
正在根据提交记录自动生成 Changelog预计耗时约 10 分钟。
prompt-template: |
你是 MAA 项目的 Changelog 生成专员。
latest_stable_tag=$(git tag -l 'v*' | grep -v '-' | sort -V | tail -n 1) # 上一个 stable 版本
newest_tag=$(git describe --tags --match "v*" --abbrev=0) # 最新版本
echo "latest_stable_tag=$latest_stable_tag" >> $GITHUB_OUTPUT
echo "newest_tag=$newest_tag" >> $GITHUB_OUTPUT
当前 Release PR 编号为 #{{issue_number}}(仓库 {{repository}}),请从该 PR 标题中提取目标版本号。
严格按照 .claude/skills/changelog/SKILL.md 中的规则,分析 git 提交记录tag 间的 commit 及其 diff和现有 CHANGELOG.md
生成完整的新版本 Changelog Markdown 并写到 {{answer_file}}。
{{answer_file}} 的内容应当是可以直接替换 CHANGELOG.md 整个文件的完整内容(包含新版本和所有历史版本)。
details-summary: 点击此处展开生成过程
- name: Write CHANGELOG.md from AI output
if: steps.analysis.outcome == 'success'
run: |
if [ ! -f answer.md ] || [ ! -s answer.md ]; then
echo "::error::answer.md not found or empty, cannot update CHANGELOG.md"
exit 1
fi
cp answer.md CHANGELOG.md
echo "CHANGELOG.md updated from AI output ($(wc -l < CHANGELOG.md) lines)"
if git diff --quiet CHANGELOG.md 2>/dev/null; then
echo "::warning::AI output is identical to existing CHANGELOG.md, no PR will be created"
if [[ $tag_name == *-* ]]; then # 判断新版本是否为 beta 版本
latest=$newest_tag # 若是,则将 latest 参数设置为最新版本
else
echo "Changes detected:"
git diff --stat CHANGELOG.md
latest=$latest_stable_tag # 若否,则设置为上一个 stable 版本
fi
echo "latest=$latest" >> $GITHUB_OUTPUT
cat $GITHUB_OUTPUT
echo '======='
echo 'Target PR: ${{ github.event.pull_request.html_url }}' >> $PR_BODY
echo '' >> $PR_BODY
echo '<details><summary>Debug information</summary>' >> $PR_BODY
echo '' >> $PR_BODY
echo '```' >> $PR_BODY
sed 's/=/: /1' $GITHUB_OUTPUT >> $PR_BODY
echo '```' >> $PR_BODY
echo '' >> $PR_BODY
echo '</details>' >> $PR_BODY
cat $PR_BODY
- name: Generate changelog
run: |
git switch dev-v2
python3 tools/ChangelogGenerator/changelog_generator.py --tag "${{ steps.extract_tag.outputs.tag_name }}" --latest "${{ steps.extract_tag.outputs.latest }}"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Commit changes
run: |
git status
git config user.name "$GITHUB_ACTOR"
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
git add .
commit_msg="docs: Auto Generate Changelog of Release ""${{ steps.extract_tag.outputs.tag_name }}"
git commit -m "$commit_msg"
- name: Create changelog PR
if: steps.analysis.outcome == 'success'
uses: peter-evans/create-pull-request@v8
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "docs: Auto Generate Changelog of Release ${{ steps.version.outputs.version }}"
sign-commits: true
title: "docs: Auto Update Changelogs of ${{ steps.version.outputs.version }}"
body: |
Auto-generated changelog for **${{ steps.version.outputs.version }}**.
Target Release PR: #${{ github.event.pull_request.number || github.event.inputs.pr_number }}
base: dev-v2
branch: changelog
token: ${{ secrets.GITHUB_TOKEN }}
title: ${{ steps.extract_tag.outputs.pr_title }}
body-path: ${{ format('{0}/{1}', runner.temp, 'output' ) }}
base: "dev-v2"
branch: "changelog"
delete-branch: true
add-paths: CHANGELOG.md
reviewers: |
AnnAngela
assignees: |
AnnAngela
- name: Show outputs
if: always()
env:
COMMENT_URL: ${{ steps.analysis.outputs.comment-url }}
run: |
echo "comment_url=$COMMENT_URL"
echo "(Full agent-output and final-conclusion are available in the uploaded artifacts)"
assign-release-reviewers:
name: Assign Reviewers to Release PR
if: github.event.pull_request.head.repo.full_name == github.repository && github.event.pull_request.draft == false && startsWith(github.event.pull_request.title, 'Release v')
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v7
- name: Assign reviewers to release PR
uses: kentaro-m/auto-assign-action@v2.0.2
with:
@@ -135,7 +101,7 @@ jobs:
update-submodules:
name: Update Submodules
if: github.event.pull_request.head.repo.full_name == github.repository && github.event.pull_request.draft == false && startsWith(github.event.pull_request.title, 'Release v')
if: github.event.pull_request.draft == false && startsWith(github.event.pull_request.title, 'Release v')
runs-on: ubuntu-latest
steps:
- name: Trigger submodule update workflow

View File

@@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Clone ArknightsGameResource for Official
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
show-progress: false
repository: yuanyan3060/ArknightsGameResource
@@ -49,7 +49,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Clone ArknightsGameResource_Yostar for Overseas
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
show-progress: false
repository: ArknightsAssets/ArknightsGamedata
@@ -92,7 +92,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Clone arknights-toolbox-update for Taiwan
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
show-progress: false
repository: arkntools/arknights-data-tw-for-maa
@@ -145,7 +145,7 @@ jobs:
runs-on: macos-latest
steps:
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
# TL;DR https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/9872#issuecomment-2251378371
# actions/checkout uses ${{ secrets.GITHUB_TOKEN }} by default, meaning all steps will inherit it
@@ -155,7 +155,7 @@ jobs:
- name: Restore ResourceUpdater from cache
id: resupd-cache
uses: actions/cache/restore@v6
uses: actions/cache/restore@v5
continue-on-error: true
with:
key: ResourceUpdater-${{ runner.os }}-${{ hashFiles('tools/ResourceUpdater/main.cpp') }}
@@ -171,7 +171,7 @@ jobs:
- name: Cache MaaDeps
if: steps.resupd-cache.outputs.cache-hit != 'true'
id: maadeps-cache
uses: actions/cache@v6
uses: actions/cache@v5
continue-on-error: true
with:
path: |
@@ -195,7 +195,7 @@ jobs:
- name: Save ResourceUpdater to cache
if: always() && steps.resupd-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@v6
uses: actions/cache/save@v5
continue-on-error: true
with:
key: ResourceUpdater-${{ runner.os }}-${{ hashFiles('tools/ResourceUpdater/main.cpp') }}
@@ -204,7 +204,7 @@ jobs:
./tools/ResourceUpdater/res_updater
- name: Wait for resource cloning
uses: yogeshlonkar/wait-for-jobs@v1
uses: yogeshlonkar/wait-for-jobs@v0
with:
ignore-skipped: 'false'
jobs: |
@@ -235,23 +235,10 @@ jobs:
run: |
./tools/ResourceUpdater/res_updater
- name: Setup python
uses: actions/setup-python@v6
with:
python-version: "3.11"
cache: pip
cache-dependency-path: |
tools/TaskSorter/requirements.txt
tools/OptimizeTemplates/requirements.txt
- name: Install TaskSorter dependencies
run: |
python -m pip install -r tools/TaskSorter/requirements.txt
- name: Sort tasks
id: task_sorting
run: |
python tools/TaskSorter/TaskSorter.py
python3 tools/TaskSorter/TaskSorter.py
echo "gitdiff=$(echo $(git diff --name-only --diff-filter=ACM 2>/dev/null | grep '\.json$'))" >> $GITHUB_OUTPUT
- name: Run prettier
@@ -264,10 +251,25 @@ jobs:
run: |
sh ./tools/ResourceUpdater/version.sh
- name: Install dependencies
- name: Setup python
if: steps.update_version.outputs.contains_png == 'True'
uses: actions/setup-python@v6
with:
python-version: "3.11"
- name: Cache python packages
if: always() && steps.update_version.outputs.contains_png == 'True'
id: cache_python
uses: actions/cache@v5
continue-on-error: true
with:
path: ${{ env.pythonLocation }}/Lib/site-packages
key: ${{ runner.os }}-pip-optimize-templates-${{ hashFiles('./tools/OptimizeTemplates/requirements.txt') }}
- name: Install dependencies
if: steps.cache_python.outputs.cache-hit != 'true' && steps.update_version.outputs.contains_png == 'True'
run: |
python -m pip install -r tools/OptimizeTemplates/requirements.txt
pip install -r tools/OptimizeTemplates/requirements.txt
- name: Setup oxipng
if: steps.update_version.outputs.contains_png == 'True'
@@ -278,7 +280,7 @@ jobs:
- name: Optimize png images
if: steps.update_version.outputs.contains_png == 'True'
run: |
python tools/OptimizeTemplates/optimize_templates.py --no-cleanup -p resource/template/items/ resource/template/infrast/
python3 tools/OptimizeTemplates/optimize_templates.py --no-cleanup -p resource/template/items/ resource/template/infrast/
- name: Commit changes
if: steps.update_version.outputs.changes == 'True'
@@ -306,7 +308,7 @@ jobs:
- name: Push changes
if: steps.add_files.outputs.have_commits == 'True'
uses: ad-m/github-push-action@881a6320fdb16eb5318c5054f31c218aec2b324c # v1.3.0
uses: ad-m/github-push-action@master
with:
branch: ${{ github.ref }}
github_token: ${{ secrets.MAA_RESOURCE_SYNC }}

View File

@@ -43,7 +43,7 @@ jobs:
runs-on: macos-latest
steps:
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
show-progress: false
@@ -56,7 +56,7 @@ jobs:
- name: Restore cache for Smoke Test
if: ${{ steps.cache_key.outputs.key != '' }}
id: smoke-cache
uses: actions/cache/restore@v6
uses: actions/cache/restore@v5
continue-on-error: true
with:
key: ${{ steps.cache_key.outputs.key }}
@@ -76,7 +76,7 @@ jobs:
- name: Cache MaaDeps
if: steps.smoke-cache.outputs.cache-hit != 'true'
id: maadeps-cache
uses: actions/cache@v6
uses: actions/cache@v5
continue-on-error: true
with:
path: ./src/MaaUtils/MaaDeps
@@ -107,7 +107,7 @@ jobs:
- name: Save cache for Smoke Test (only in dev-v2)
if: steps.smoke-cache.outputs.cache-hit != 'true' && github.ref == 'refs/heads/dev-v2'
uses: actions/cache/save@v6
uses: actions/cache/save@v5
continue-on-error: true
with:
key: ${{ steps.cache_key.outputs.key }}

View File

@@ -17,7 +17,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
show-progress: false
@@ -28,7 +28,7 @@ jobs:
git show -s
- name: Checkout MaaResource
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
repository: MaaAssistantArknights/MaaResource
show-progress: false

View File

@@ -1,122 +0,0 @@
name: Unit Tests
on:
# push:
# branches:
# - "dev-v2"
# paths:
# - ".github/workflows/unit-tests.yml"
# - "unit_test/**"
# - "src/**"
# pull_request:
# paths:
# - ".github/workflows/unit-tests.yml"
# - "unit_test/**"
# - "src/**"
workflow_dispatch:
permissions:
contents: read
jobs:
select-tests:
name: Select Unit Test Suites
runs-on: ubuntu-latest
outputs:
has_tests: ${{ steps.select.outputs.has_tests }}
matrix: ${{ steps.select.outputs.matrix }}
steps:
- name: Checkout repository
uses: actions/checkout@v7
with:
fetch-depth: 0
show-progress: false
- name: Select affected test suites
id: select
env:
EVENT_NAME: ${{ github.event_name }}
BEFORE_SHA: ${{ github.event.before }}
HEAD_SHA: ${{ github.sha }}
PR_BASE_SHA: ${{ github.event.pull_request.base.sha }}
PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: |
python3 - <<'PY'
import json
import os
import subprocess
def matches(path: str, rule: str) -> bool:
if rule.endswith('/**'):
return path.startswith(rule[:-3])
return path == rule
with open('unit_test/test-suites.json', encoding='utf-8') as f:
mapping = json.load(f)
event_name = os.environ['EVENT_NAME']
changed_files = []
run_all = event_name == 'workflow_dispatch'
if not run_all:
if event_name == 'pull_request':
base_sha = os.environ['PR_BASE_SHA']
head_sha = os.environ['PR_HEAD_SHA']
else:
base_sha = os.environ['BEFORE_SHA']
head_sha = os.environ['HEAD_SHA']
if not base_sha or set(base_sha) == {'0'}:
run_all = True
else:
diff = subprocess.check_output(
['git', 'diff', '--name-only', base_sha, head_sha],
text=True,
)
changed_files = [line for line in diff.splitlines() if line]
print('Changed files:')
for file_path in changed_files:
print(f' - {file_path}')
if run_all or any(any(matches(path, rule) for rule in mapping['runAllOnChanges']) for path in changed_files):
selected = mapping['suites']
else:
selected = []
for suite in mapping['suites']:
if any(any(matches(path, rule) for rule in suite['paths']) for path in changed_files):
selected.append(suite)
matrix = {'suite': selected}
with open(os.environ['GITHUB_OUTPUT'], 'a', encoding='utf-8') as f:
f.write(f"has_tests={'true' if selected else 'false'}\n")
f.write(f"matrix={json.dumps(matrix, separators=(',', ':'))}\n")
PY
unit-tests:
name: ${{ matrix.suite.name }} Unit Tests
needs: select-tests
if: ${{ needs.select-tests.outputs.has_tests == 'true' }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.select-tests.outputs.matrix) }}
steps:
- name: Checkout repository
uses: actions/checkout@v7
with:
show-progress: false
- name: Configure unit tests
run: |
cmake -S unit_test -B build/unit_test -DCMAKE_BUILD_TYPE=Release
- name: Build selected unit test target
run: |
cmake --build build/unit_test --parallel --target ${{ matrix.suite.buildTarget }}
- name: Run selected unit tests
run: |
ctest --test-dir build/unit_test --output-on-failure -R '${{ matrix.suite.ctestRegex }}'

View File

@@ -12,7 +12,7 @@ jobs:
if: github.repository_owner == 'MaaAssistantArknights'
steps:
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
submodules: true
@@ -21,7 +21,7 @@ jobs:
run: bash ./.github/scripts/sync-optional-submodules.sh --remote src/MAAUnified src/MaaMacGui src/maa-cli
- name: Commit and push changes
uses: actions-js/push@5a7cbd780d82c0c937b5977586e641b2fd94acc5 # master as of 2026-05-06
uses: actions-js/push@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
message: "feat: Update Submodules MAAUnified, MaaMacGui, maa-cli

View File

@@ -35,7 +35,7 @@ jobs:
timeout-minutes: 20
steps:
- name: Checkout repository
uses: actions/checkout@v7
uses: actions/checkout@v6
with:
show-progress: false

4
.gitignore vendored
View File

@@ -416,13 +416,12 @@ FodyWeavers.xsd
# !.vscode/launch.json
# !.vscode/extensions.json
*.code-workspace
*.csproj.lscache
# Local History for Visual Studio Code
.history/
# Claude Code
.claude/*
.claude/
!.claude/skills/
# Windows Installer files from build outputs
@@ -487,4 +486,3 @@ install-*
# CMake user presets
CMakeUserPresets.json
.ace-tool/

View File

@@ -1,73 +1,58 @@
## v6.14.0-beta.1
## v6.8.0-beta.1
### Highlights
## OS 1101 whatever event
#### 莫奈取色
Quick beta release to implement the Karlan Trade R&D minigame for all Global servers (EN, KR, JP)
Stable will come soon™ uuh.
新增背景莫奈取色,可根据背景图自动生成主题色,也支持手动选色。
Also, implementation of reception all clue fast selection.
#### 截图增强
Enjoy.
在设置指引与开始唤醒中补充截图增强与截图测试入口MuMu 截图增强也已支持 `emulator-5xxx` 格式端口。
#### 模拟器兼容性提示更完整
新增当前模拟器帧率检测与提示,补充 MuMu 后台保活检测,以及雷电模拟器搭配 MaaTouch 时的组合警告,帮助更快定位截图异常、操作异常与性能设置问题。
<details>
<summary><b>English</b></summary>
#### Monet Theming
Added background Monet theming with both automatic color extraction and manual color selection.
#### Screenshot Enhancements
Screenshot enhancement and screenshot test entries are now surfaced in setup guidance and startup wake-up, and MuMu screenshot enhancement now supports `emulator-5xxx` style ports.
#### Better Emulator Compatibility Guidance
Added emulator frame rate detection and warnings, MuMu background keep-alive detection, and a warning for the LDPlayer + MaaTouch combination, making screenshot, input, and performance issues easier to diagnose.
</details>
----
以下是详细内容:
<details open>
<summary><b>v6.14.0-beta.1 (2026-07-04)</b></summary>
### 新增 | New
* 新增背景莫奈取色,支持根据背景图自动生成主题色,也支持手动选择自定义颜色;优化主题色板生成与对比度表现 ([#17242](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17242), [#17243](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17243), [#17249](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17249)) @ABA2396
* 新增更新器进度窗口显示开关,并补充自动下载更新包提示文本 @ABA2396
* 新增当前模拟器帧率检测与提示,可识别过低、非 60 FPS 与异常高帧率设置 ([#17219](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17219)) @ABA2396
* 新增 MuMu 后台保活检测,连接后可提示可能导致截图与操作异常的后台保活设置 ([#17241](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17241)) @ABA2396
* 新增同时使用雷电模拟器 + MaaTouch 组合的警告 ([#17238](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17238)) @ABA2396
* 设置指引与开始唤醒中新增截图增强与截图测试相关选项 ([#17247](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17247)) @ABA2396
* MuMu 截图增强新增支持 `emulator-5xxx` 格式端口 ([#17255](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17255)) @ABA2396
* 繁中服新增「衛戍協議:盟約」小玩法模板支持 ([#17257](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17257)) @momomochi987
* 非法Enum值将使用属性设置的默认值作为替代 (#16138) @status102
### 改进 | Improved
* 禁用 Xe-LPG+ Arrow Lake Arc 140T 的 GPU 推理选项,避免相关机型出现识别异常 @ABA2396
* 修复未开启系统通知时仍执行系统通知检查的问题 @ABA2396
* 自动编队预编队后检查选中情况 @status102
* 优化提示元素展示效果 @ABA2396
* 作业版本号需求允许省略patch @status102
* 使用SemaphoreSlim替换Lock @status102
* 分辨率不支持时打印当前分辨率 @ABA2396
* 移除 NotificationImplWinRT 中二次进入 UI 线程 (#16196) @EzraRT
* 提升 Algorithm.hpp 算法性能及其鲁棒性 (#16235) @lhhxxxxx
* 干员数据重构, 支持跨职业重名干员 (#16084) @status102
### 修复 | Fix
* 修复 MuMu 模拟器下第 32 个及以后多开实例的编号计算错误 ([#17112](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17112)) @ABA2396
* 修复 DBNet UnClip 多边形偏移实现,提升 NCNN OCR 结果与 fastdeploy 的一致性 ([#17227](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17227)) @Aliothmoon
* 修复基建产物收取时因 loading 遮挡导致跳过的问题 ([#17232](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17232)) @ZiyinLin @status102
* 修复自定义基建配置列表显示异常 ([#17254](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17254)) @ABA2396
* 修复萨米肉鸽「特里蒙旅行社特派团」识别错误 @Saratoga-Official
* 修复肉鸽事件与选项中的问号、空格、重复项及相似项锚定问题,统一多项事件名识别 ([#17256](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17256)) @ABA2396 @Constrat
* 繁中服补充与修正萨米肉鸽大量事件/选项识别 @Constrat
* YostarEN/JP/KR: add and fix a large batch of Sami roguelike event/option recognition; YostarEN additionally adds a set of MASS event option mappings @Constrat
* YostarEN: fix `MissionFailedFlag2` template mismatch recognition issue @Constrat
* KR OSChapterToOS OCR @Daydreamer114
* yj 怎么还暗改老主题 @ABA2396
* 自动战斗鼠标长按分页时, 可能会反复触发切换 @status102
* EN IS6 DLC1 regexes @Constrat
* 在定时任务触发时, 固定等待UpdateStageList @status102
* 修复LinkStart期间UpdateStageList内进入SetFightParams导致死锁 @status102
* prts.plus改为zoot.plus @status102
### 文档 | Docs
* i18n for install.md (#16214) @JasonHuang79 @HX3N @Manicsteiner @momomochi987 @Constrat
### 其他 | Other
* 优化 MAAUnified 构建流程,复用 MaaCore 构建产物 ([#17233](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/17233)) @GhostKiller127
</details>
* implement Quickly Place Clues for Global (#14966) @Constrat
* EN @Constrat
* EN OS minigame (#16283) @Constrat
* YostarJP OS stages and more ocr @Manicsteiner
* YostarKR OS ocr and minigame (#16268) @HX3N
* YostarJP OS ocr and minigame (#16267) @Manicsteiner
* 肉鸽添加怒潮凛冬招募逻辑 (#16217) @Reverse0xCC
* 添加贝洛内、怒潮凛冬基建技能数值 (#16260) @drway
* git ignore 添加 claude code @Daydreamer114
* Revert "ci: issue bot skills 添加 at 符号检测 (#16239)" @MistEO
* Revert "fix: prts.plus改为zoot.plus" @status102
* AnnihilationName @status102
* pc 端禁用完成后退出模拟器 @ABA2396
* 繁中服「次生方案」小活動 (#16216) @momomochi987
* 重新将natvis添加到MaaCore (#16133) @status102

View File

@@ -34,12 +34,9 @@ target_include_directories(HeaderOnlyLibraries INTERFACE 3rdparty/include)
add_subdirectory(src/MaaCore)
if(BUILD_WPF_GUI)
add_subdirectory(src/MaaUpdater)
include_external_msproject(MaaWpfGui ${PROJECT_SOURCE_DIR}/src/MaaWpfGui/MaaWpfGui.csproj)
add_dependencies(MaaWpfGui MaaCore)
add_dependencies(MaaWpfGui MAA.Updater)
if(DEFINED ENV{VSCODE_PID})
add_custom_target(run-MaaWpfGui
COMMAND "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/MAA.exe"
@@ -49,13 +46,6 @@ if(BUILD_WPF_GUI)
endif()
endif()
if (ANDROID)
add_library(stdc++fs INTERFACE)
add_compile_options(-Wno-unused-parameter)
add_compile_options(-ffunction-sections -fdata-sections)
add_link_options(-Wl,--gc-sections)
endif()
if(INSTALL_PYTHON)
install(DIRECTORY src/Python DESTINATION .)
endif()

View File

@@ -158,39 +158,6 @@
"CMAKE_OSX_ARCHITECTURES": "x86_64"
}
},
{
"name": "android-base",
"hidden": true,
"generator": "Ninja",
"binaryDir": "${sourceDir}/build",
"$comment": [
"Base for Android presets; cross-compilation via NDK toolchain",
"CMAKE_TOOLCHAIN_FILE must be passed externally pointing to NDK's android.toolchain.cmake"
],
"cacheVariables": {
"CMAKE_SYSTEM_NAME": "Android",
"ANDROID_PLATFORM": "android-28",
"CMAKE_BUILD_TYPE": "RelWithDebInfo"
}
},
{
"name": "android-arm64",
"inherits": "android-base",
"displayName": "Android arm64",
"cacheVariables": {
"ANDROID_ABI": "arm64-v8a",
"MAADEPS_TRIPLET": "maa-arm64-android"
}
},
{
"name": "android-x64",
"inherits": "android-base",
"displayName": "Android x64",
"cacheVariables": {
"ANDROID_ABI": "x86_64",
"MAADEPS_TRIPLET": "maa-x64-android"
}
},
{
"name": "publish-base",
"$comment": [
@@ -214,9 +181,11 @@
"publish-base",
"windows-x64"
],
"cacheVariables": {
"BUILD_WPF_GUI": "ON"
},
"$comment": [
"github actions only support Visual Studio 17 2022",
"see https://github.com/actions/runner-images/issues/13291"
],
"generator": "Visual Studio 17 2022",
"displayName": "Windows x64 Publish"
},
{
@@ -225,9 +194,11 @@
"publish-base",
"windows-arm64"
],
"cacheVariables": {
"BUILD_WPF_GUI": "ON"
},
"$comment": [
"github actions only support Visual Studio 17 2022",
"see https://github.com/actions/runner-images/issues/13291"
],
"generator": "Visual Studio 17 2022",
"displayName": "Windows arm64 Publish"
},
{
@@ -262,22 +233,6 @@
],
"displayName": "macOS arm64 Publish"
},
{
"name": "android-publish-arm64",
"inherits": ["publish-base", "android-arm64"],
"displayName": "Android arm64 Publish",
"cacheVariables": {
"INSTALL_PYTHON": "OFF"
}
},
{
"name": "android-publish-x64",
"inherits": ["publish-base", "android-x64"],
"displayName": "Android x64 Publish",
"cacheVariables": {
"INSTALL_PYTHON": "OFF"
}
},
{
"name": "smoke-test",
"$comment": [
@@ -439,16 +394,6 @@
"configurePreset": "macos-publish-arm64",
"configuration": "RelWithDebInfo"
},
{
"name": "android-publish-arm64",
"displayName": "Build Android arm64 Publish",
"configurePreset": "android-publish-arm64"
},
{
"name": "android-publish-x64",
"displayName": "Build Android x64 Publish",
"configurePreset": "android-publish-x64"
},
{
"name": "smoke-test",
"displayName": "Build macOS arm64 Smoke Test",

View File

@@ -130,7 +130,7 @@ MAA 以中文(简体)为第一语言,翻译词条均以中文(简体)
- [集成文档](https://docs.maa.plus/zh-cn/protocol/integration.html)
- [回调消息协议](https://docs.maa.plus/zh-cn/protocol/callback-schema.html)
- [任务流程协议](https://docs.maa.plus/zh-cn/protocol/task-schema.html)
- [自动战斗协议](https://docs.maa.plus/zh-cn/protocol/copilot-schema.html)
- [自动抄作业协议](https://docs.maa.plus/zh-cn/protocol/copilot-schema.html)
### 外服适配

View File

@@ -1,4 +0,0 @@
{
"url": "https://context7.com/maaassistantarknights/maaassistantarknights",
"public_key": "pk_jDwwiGY7WKDA3WnLQzoWX"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 246 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 60 KiB

View File

@@ -23,8 +23,6 @@ Our documentation is built on [vuepress](https://github.com/vuejs/vuepress) and
This theme provides support for custom containers such as tips, notes, info, warnings, alerts, and details. We can utilize this feature to emphasize certain content.
Note that if containers are nested within containers, the parent container should use one more colon `:` than the child container to differentiate them.
Usage of containers:
```markdown
@@ -33,13 +31,6 @@ Content you want to write
:::
```
Or use GitHub-style syntax:
```markdown
> [!Container Type]
> Content you want to write
```
Accepted container types and their default titles are as follows:
- `tip` Tips
@@ -48,7 +39,6 @@ Accepted container types and their default titles are as follows:
- `warning` Warning
- `danger` Caution
- `details` Details
- `window` ==Special Container==
### Container Examples
@@ -76,190 +66,6 @@ This is a danger container
This is a details container
:::
::: window
This is a very special container
:::
## Markers
You can use the marker syntax to highlight content and emphasize key points.
Usage: Use `==content=={color (optional)}` syntax to mark text. Note that spaces are required on both sides of the marks.
**Input:**
```markdown
MaaAssistantArknights is developed by ==many pigs==
```
**Output:**
MaaAssistantArknights is developed by ==many pigs==
The theme also has the following built-in color schemes:
- **default**: `==Default==` - ==Default==
- **info**: `==Info=={.info}` - ==Info=={.info}
- **note**: `==Note=={.note}` - ==Note=={.note}
- **tip**: `==Tip=={.tip}` - ==Tip=={.tip}
- **warning**: `==Warning=={.warning}` - ==Warning=={.warning}
- **danger**: `==Danger=={.danger}` - ==Danger=={.danger}
- **caution**: `==Caution=={.caution}` - ==Caution=={.caution}
- **important**: `==Important=={.important}` - ==Important=={.important}
## Hidden Text
For some reason, you may need to temporarily black out a section of the document. In this case, you can use the hidden text feature.
You can use the `!!content!!{config (optional)}` syntax, and the default effect is as follows:
!!I always feel like I'm reading MoeGirl (strikethrough!!
The following configurations are available:
::: window
Input:
```markdown
+ Mask effect + Mouse hover: !!Mouse hover to see me!!{.mask .hover}
+ Mask effect + Click: !!Click to see me!!{.mask .click}
+ Text blur effect + Mouse hover: !!Mouse hover to see me!!{.blur .hover}
+ Text blur effect + Click: !!Click to see me!!{.blur .click}
```
Output:
- Mask effect + Mouse hover: !!Mouse hover to see me!!{.mask .hover}
- Mask effect + Click: !!Click to see me!!{.mask .click}
- Text blur effect + Mouse hover: !!Mouse hover to see me!!{.blur .hover}
- Text blur effect + Click: !!Click to see me!!{.blur .click}
:::
## Steps
When writing a step-by-step tutorial, ordered lists may lose their hierarchy due to nesting. In this case, the `steps` container is the best choice.
Input:
````markdown
:::: steps
1. Step 1
```ts
console.log('Hello World!')
```
2. Step 2
Here is the content related to Step 2
3. Step 3
::: tip
Tip container
:::
4. End
::::
````
Output:
:::: steps
1. Step 1
```ts
console.log('Hello World!')
```
2. Step 2
Here is the content related to Step 2
3. Step 3
::: tip
Tip container
:::
4. End
::::
## Smart Image Container
We have wrapped an image container based on the functionality provided by the theme. This container can automatically display the corresponding image in light and dark themes, while supporting automatic layout.
You can use the `<ImageGrid>` component in the markdown body to invoke this method. The specific syntax and effects are as follows:
::: window
This is the syntax:
```markdown
<ImageGrid :imageList="[
{
light: 'images/zh-cn/readme/1-light.png',
dark: 'images/zh-cn/readme/1-dark.png'
},
{
light: 'images/zh-cn/readme/2-light.png',
dark: 'images/zh-cn/readme/2-dark.png'
},
{
light: 'images/zh-cn/readme/3-light.png',
dark: 'images/zh-cn/readme/3-dark.png'
},
{
light: 'images/zh-cn/readme/4-light.png',
dark: 'images/zh-cn/readme/4-dark.png'
}
]" />
```
This is the rendered result:
<ImageGrid :imageList="[
{
light: 'images/zh-cn/readme/1-light.png',
dark: 'images/zh-cn/readme/1-dark.png'
},
{
light: 'images/zh-cn/readme/2-light.png',
dark: 'images/zh-cn/readme/2-dark.png'
}
]" />
:::
## Field Container
This syntax is more complex. Please refer to the [official documentation](https://theme-plume.vuejs.press/guide/markdown/field/) for usage.
The effects are as follows:
:::: field-group
::: field name="theme" type="ThemeConfig" required default="{ base: '/' }"
Theme configuration
:::
::: field name="enabled" type="boolean" optional default="true"
Whether to enable
:::
::: field name="callback" type="(...args: any[]) => void" optional default="() => {}"
<Badge type="tip" text="Added in v1.0.0" />
Callback function
:::
::: field name="other" type="string" deprecated
<Badge type="danger" text="Deprecated in v0.9.0" />
Deprecated property
:::
::::
## Icons
This theme provides icon support, where you can use icons in the following places:

View File

@@ -201,7 +201,7 @@ strategy = "merge" # or "first" (default)
# use all expiring medicine on Sunday night
[[tasks.variants]]
params = { medicine_expire_days = 2 }
params = { expiring_medicine = 1000 }
[tasks.variants.condition]
type = "And"
conditions = [

View File

@@ -16,7 +16,6 @@ As of MAA v5.22.3, the following emulators and connection addresses are supporte
- LDPlayer 9: `emulator-5554/5556/5558/5560`, `127.0.0.1:5555/5557/5559/5561`
- NoxPlayer: `127.0.0.1:62001/59865`
- MEmu Play: `127.0.0.1:21503`
- Tencent App Store (after 5.10.56.xx): `127.0.0.1:5555`
If detection fails, try launching MAA with UAC administrator privileges and detect again. If it still fails, refer to the manual setup instructions below and verify that your emulator and connection address are included in the list above.
@@ -58,7 +57,6 @@ Emulators running on your local machine should use addresses like `127.0.0.1:<po
- [LDPlayer 9](https://help.ldmnq.com/docs/LD9adbserver) `emulator-5554`
- [NoxPlayer](https://support.yeshen.com/zh-CN/qt/ml) `127.0.0.1:62001`
- [MEmu Play](https://bbs.xyaz.cn/forum.php?mod=viewthread&tid=365537) `127.0.0.1:21503`
- [Tencent App Store](https://sj.qq.com/faq/3878): ADB port is fixed at `127.0.0.1:5555`. ADB path example: `C:\Program Files\Tencent\Androws\Application\<version>\adb.exe`.
For other emulators, refer to [Zhao Qingqing's blog](https://www.cnblogs.com/zhaoqingqing/p/15238464.html).

View File

@@ -26,8 +26,6 @@ Typical `16:9` resolutions include `3840x2160` (4K), `2560x1440` (2K), `1920x108
## Download and Run ADB Debug Tool to Connect Device
::: steps
1. Download [ADB](https://dl.google.com/android/repository/platform-tools-latest-windows.zip) and extract it.
2. Open the extracted folder, clear the address bar, type `cmd`, and press Enter.
3. In the command prompt window that appears, type `adb`. If you see extensive help text, the command ran successfully.
@@ -38,8 +36,6 @@ Typical `16:9` resolutions include `3840x2160` (4K), `2560x1440` (2K), `1920x108
adb devices
```
:::
- When executed successfully, it will show connected USB debugging devices.
- Example of a successful connection:
@@ -118,25 +114,23 @@ It is strongly recommended to revert these changes **before the next device rebo
## Automate Resolution Changes
::: steps
1. Create two text files in the MAA directory with the following content:
```bat
:: Adjust resolution to 1080p
```bash
# Adjust resolution to 1080p
adb -s <target device serial number> shell wm size 1080x1920
:: Lower screen brightness (optional)
# Lower screen brightness (optional)
adb -s <target device serial number> shell settings put system screen_brightness 1
```
```bat
:: Restore resolution
```bash
# Restore resolution
adb -s <target device serial number> shell wm size reset
:: Increase screen brightness (optional)
# Increase screen brightness (optional)
adb -s <target device serial number> shell settings put system screen_brightness 20
:: Return to home screen (optional)
# Return to home screen (optional)
adb -s <target device serial number> shell input keyevent 3
:: Lock screen (optional)
# Lock screen (optional)
adb -s <target device serial number> shell input keyevent 26
```
@@ -145,8 +139,6 @@ It is strongly recommended to revert these changes **before the next device rebo
3. In MAA's `Settings` - `Connection Settings`, set `Start Script` to `startup.bat` and `End Script` to `finish.bat`.
:::
## Connect to MAA
### Wired Connection
@@ -165,8 +157,6 @@ Wired connections don't need IP addresses or ports - just the device serial numb
#### Using `adb tcpip` for Wireless Debugging
::: steps
1. In the command prompt, enable wireless debugging:
```bash
@@ -181,16 +171,12 @@ Wired connections don't need IP addresses or ports - just the device serial numb
3. Enter `<IP>:5555` in MAA's `Settings` - `Connection Settings` - `Connection Address`, e.g., `192.168.1.2:5555`.
4. Link Start!
:::
#### Using `adb pair` for Wireless Debugging
::: tip
`adb pair` wireless pairing (available in Android 11 and later via Developer Options) allows connection without a physical USB connection, unlike `adb tcpip`.
:::
::: steps
1. On your phone, go to Developer Options, tap `Wireless Debugging` and enable it. Tap `Pair device with pairing code` and keep the popup open until pairing completes.
2. Complete the pairing:
@@ -201,17 +187,11 @@ Wired connections don't need IP addresses or ports - just the device serial numb
3. Enter the IP address and port shown on your device screen into MAA's `Settings` - `Connection Settings` - `Connection Address`, e.g., `192.168.1.2:11451`. **This is different from the address used for pairing**.
4. Link Start!
:::
#### Using Root to Enable Wireless ADB
~~If you have access to root, why do you need to read this document~~
::: steps
1. Download, install [WADB](https://github.com/RikkaApps/WADB/releases) and grant it root privileges.
2. Open WADB and start wireless adb.
1. Download, install [WADB](https://github.com/RikkaApps/WADB/releases) and grant it root privileges. 2.
2. Open WADB and start wireless adb. 3.
3. Put the IP address and port provided by WADB into MAA `Settings` - `Connection` - `Connection Address`, such as `192.168.1.2:5555`.
4. Link Start!
:::

View File

@@ -19,9 +19,7 @@ The MAA WPF GUI can currently be run through Wine. MAA now uses self-contained d
#### Installation Steps
:::: steps
1. Install Visual C++ Redistributable
1. Install Visual C++ Redistributable:
Download and install [Visual C++ Redistributable](https://aka.ms/vc14/vc_redist.x64.exe):
@@ -33,11 +31,7 @@ The MAA WPF GUI can currently be run through Wine. MAA now uses self-contained d
`DependencySetup_依赖库安装.bat` relies on winget and Windows privilege escalation, which typically doesn't work properly in Wine, so manual installation of runtime libraries is required.
:::
2. Download MAA
Download the Windows version of MAA, extract it, and run `wine MAA.exe`.
::::
2. Download the Windows version of MAA, extract it, and run `wine MAA.exe`.
::: info Note
You need to set the ADB path to the [Windows version of `adb.exe`](https://dl.google.com/android/repository/platform-tools-latest-windows.zip) in the connection settings.
@@ -72,52 +66,52 @@ Place the `MaaDesktopIntegration.so` generated by MAA Wine Bridge in the same di
### Using Python
:::: steps
#### 1. Installing MAA Dynamic Library
1. Install MAA Dynamic Library
1. Download and extract the Linux dynamic library from the [MAA website](https://maa.plus/), or install from a software repository:
- AUR: [maa-assistant-arknights](https://aur.archlinux.org/packages/maa-assistant-arknights), follow the post-installation instructions
- Nixpkgs: [maa-assistant-arknights](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/ma/maa-assistant-arknights/package.nix)
2. Navigate to `./MAA-v{version}-linux-{architecture}/Python/` and open the `sample.py` file
1. Download and extract the Linux dynamic library from the [MAA website](https://maa.plus/), or install from a software repository:
- AUR: [maa-assistant-arknights](https://aur.archlinux.org/packages/maa-assistant-arknights), follow the post-installation instructions
- Nixpkgs: [maa-assistant-arknights](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/ma/maa-assistant-arknights/package.nix)
::: tip
The precompiled version includes dynamic libraries compiled on relatively new Linux distributions (Ubuntu 22.04). If your system has an older libstdc++ version, you might encounter ABI incompatibility issues.
You can refer to the [Linux Compilation Tutorial](../../develop/linux-tutorial.md) to recompile or use a container solution.
:::
2. Navigate to `./MAA-v{version}-linux-{architecture}/Python/` and open the `sample.py` file
2. ADB Configuration
1. Find the line [`if asst.connect('adb.exe', '127.0.0.1:5554'):`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/b4fc3528decd6777441a8aca684c22d35d2b2574/src/Python/sample.py#L62)
2. ADB Tool Configuration
- If using `Android Studio`'s `AVD` emulator, it comes with ADB. You can directly specify the ADB path to replace `adb.exe`, typically found in `$HOME/Android/Sdk/platform-tools/`, for example:
::: tip
The precompiled version includes dynamic libraries compiled on relatively new Linux distributions (Ubuntu 22.04). If your system has an older libstdc++ version, you might encounter ABI incompatibility issues.
You can refer to the [Linux Compilation Tutorial](../../develop/linux-tutorial.md) to recompile or use a container solution.
:::
```python
if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "emulator's ADB address"):
```
#### 2. ADB Configuration
- For other emulators, first install ADB: `$ sudo apt install adb`, then either specify the path or simply use `adb` if it's in your `PATH` environment variable.
1. Find the line [`if asst.connect('adb.exe', '127.0.0.1:5554'):`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/b4fc3528decd6777441a8aca684c22d35d2b2574/src/Python/sample.py#L62)
3. Getting the Emulator's ADB Address
- Use the ADB tool directly: `$ adb_path devices`, for example:
2. ADB Tool Configuration
- If using `Android Studio`'s `AVD` emulator, it comes with ADB. You can directly specify the ADB path to replace `adb.exe`, typically found in `$HOME/Android/Sdk/platform-tools/`, for example:
```shell
$ /home/foo/Android/Sdk/platform-tools/adb devices
List of devices attached
emulator-5554 device
```
```python
if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "emulator's ADB address"):
```
- The returned `emulator-5554` is the emulator's ADB address. Replace `127.0.0.1:5555` with it, for example:
- For other emulators, first install ADB: `$ sudo apt install adb`, then either specify the path or simply use `adb` if it's in your `PATH` environment variable.
```python
if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "emulator-5554"):
```
3. Getting the Emulator's ADB Address
- Use the ADB tool directly: `$ adb_path devices`, for example:
4. Now you can test with `$ python3 sample.py`. If it returns "Connection successful," you're ready to proceed.
```shell
$ /home/foo/Android/Sdk/platform-tools/adb devices
List of devices attached
emulator-5554 device
```
3. Task Configuration
- The returned `emulator-5554` is the emulator's ADB address. Replace `127.0.0.1:5555` with it, for example:
Custom tasks: Refer to the [Integration Documentation](../../protocol/integration.md) and modify the [`# Task parameters can be found in docs/integration.md`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/722f0ddd4765715199a5dc90ea1bec2940322344/src/Python/sample.py#L54) section in `sample.py`
```python
if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "emulator-5554"):
```
::::
4. Now you can test with `$ python3 sample.py`. If it returns "Connection successful," you're ready to proceed.
#### 3. Task Configuration
Custom tasks: Refer to the [Integration Documentation](../../protocol/integration.md) and modify the [`# Task parameters can be found in docs/integration.md`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/722f0ddd4765715199a5dc90ea1bec2940322344/src/Python/sample.py#L54) section in `sample.py`
## Emulator Support

View File

@@ -13,8 +13,6 @@ Experimental support. Please submit issues if you encounter problems, and includ
Note: Due to macOS system limitations, screenshot issues may occur when minimizing the game window, switching to other windows while in Stage Manager, or moving the window to other desktops/screens. Related issue: [#4371](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/4371#issuecomment-1527977512)
::: steps
0. Requirements: MAA version v4.13.0-rc.1 or newer
1. Download and install the [forked version of PlayCover](https://github.com/hguandl/PlayCover/releases).
@@ -31,8 +29,6 @@ Note: Due to macOS system limitations, screenshot issues may occur when minimizi
7. Steps 3-5 only need to be done once. After that, just launch Arknights. After each Arknights client update, you'll need to repeat step 2.
:::
### ✅ [MuMu Emulator Pro](https://mumu.163.com/mac/)
Supported, but less thoroughly tested. Requires using a touch mode other than `MacPlayTools`. Related issue: [#8098](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/8098)

View File

@@ -40,11 +40,6 @@ const fullySupport = [
note: 'Fully compatible. Need to turn on ADB Connectivity in the emulator `Settings``Advanced``Android Debug Bridge``Enable`. Known to be compatible with Hyper-V.\n\n- Recommended to download [Offline Installer](https://support.bluestacks.com/hc/en-us/articles/4402611273485-BlueStacks-5-offline-installer) to avoid slow and bundled installation; recommend installing [Android 11](https://support.bluestacks.com/hc/en-us/articles/4402611273485-BlueStacks-5-offline-installer#:~:text=To%20install%20BlueStacks%205%20Android%2011) version; to uninstall it, please use the official [Uninstall Tool](https://support.bluestacks.com/hc/en-us/articles/360057724751-How-to-uninstall-BlueStacks-5-BlueStacks-X-and-BlueStacks-Services-completely-from-your-PC) to get rid of residues.\n- If the ADB port number keeps changing irregularly and is different every time you start it, it may be because your computer has [Hyper-V](https://support.bluestacks.com/hc/en-us/articles/4415238471053-System-requirements-for-BlueStacks-5-on-Hyper-V-enabled-Windows-10-and-11) enabled. MAA will now try to automatically read the port number from the BlueStacks emulator configuration file. If this doesn\'t work, or you need to use multiple instances, or have installed multiple emulator cores, please refer to [Connection Settings](../connection.html#bluestacks-emulator-hyper-v-port-number-changes-every-startup) to make adjustments. Since Hyper-V runs as administrator, operations that don\'t involve ADB such as automatic emulator shutdown or connection detection also need MAA to run as administrator.',
},
...shuffleArray([
{
name: 'Tencent App Store',
link: 'https://sj.qq.com/',
note: 'Supports versions after 5.10.56.xx. Select `Tencent App Store` connection configuration in `Settings` - `Connection Settings`. Known to be compatible with Hyper-V.\n\n- ADB port is `127.0.0.1:5555`.\n- ADB path example: `C:\\Program Files\\Tencent\\Androws\\Application\\<version>\\adb.exe`.\n\n- You need to first [enable ADB debugging](https://sj.qq.com/faq/3878) in the app.',
},
{
name: 'Nox Player',
link: 'https://www.bignox.com/',

View File

@@ -40,7 +40,7 @@ icon: hugeicons:brain-02
Ensure you're on the stage details screen with the stage name and remaining sanity in the upper right and auto-deploy/start buttons in the lower right.
- If you're not on this screen, `Current/Last` will automatically enter the "last operation" stage shown on the bottom right of the terminal home screen.
- You can also enable `Manual entry of stage names` in `Task Settings` - `Sanity Farming` - `Advanced Settings` to manually input stage codes. Currently supported stages include:
- All main story stages. You can add `-NORMAL` or `-HARD` at the end to switch difficulty: Chapters 10-14 map to Standard/Adverse, while Chapters 15+ map to Normal/Raid.
- All main story stages. You can add `-NORMAL` or `-HARD` at the end to switch between normal and challenge modes.
- Resource stages like CE-6/LS-6 (LMD/EXP). Enter the exact code like `CE-6` or `LS-6`. MAA will automatically switch to level 5 if level 6 isn't available.
- Skill summary, voucher, and carbon stages (level 5 only). Enter exact codes like `CA-5`, `AP-5`, or `SK-5`.
- All chip stages. Enter complete stage codes like `PR-A-1`.

View File

@@ -7,53 +7,15 @@ icon: solar:streets-map-point-linear
Currently, support for Reclamation Algorithm is still in early stages and unattended operation is not recommended, as stability cannot be guaranteed at this time.
## Tales Within the Sand
### Default Mode
## Default Mode
1. You need to start the task from the Reclamation Algorithm main interface (navigation not yet implemented)
2. Cannot be used when you already have an existing save file (delete the existing save to use)
3. Cannot be used when operators are present in the Reclamation Algorithm squad (clear the current squad, especially after completing a wave)
### Manufacturing Points Farm
## Manufacturing Points Farm
1. You need to start from the page where you can see the base camp after entering Reclamation Algorithm
2. If no item name is specified, Glow Sticks will be crafted by default
3. Prerequisite: It must be the first day after settlement, with no enemy raids entering the base camp for the next three days
4. If the manufacturable quantity is exactly a multiple of 99, the process may get stuck. You can use up a small amount before saving; this issue will be fixed in the future
## Relaunch Anchor
### RA-1
- Income reference: ~159 tokens + coordination points per run, ~2 min 10 sec per cycle
- Operator requirement: None
- Prerequisite: Complete RA-1 in the main storyline
- Open RA-1 on the world map, start the task when "Start Construction" appears in the bottom-right corner
- Note: If you have unlocked technologies that grant extra starting items, please remove facilities that cause this (e.g. Food Supply Station, Drink Supply Station, Large Beast Pen, etc.)
- Task flow: Automatically executes intensive farming, construction, resource delivery, and settlement loop
### RA-4
- Reward estimate: ~417 tokens + coordination points per run, ~1 min 40 sec per round
- Operator requirement: Wis'adel (support unit allowed)
- Prerequisite:
1. Advance the main story until RA-4 is cleared.
2. Unlock Strategy Planning Management.
3. If you have your own Wis'adel, manually enter the stage and form a team once, ensuring any 5 operators with lower DP cost than Wis'adel + Wis'adel, and Wis'adel is in the 6th slot (i.e., the last one selected). Then confirm recruitment, abandon the current construction, and start from "Start Construction".
4. If using a support Wis'adel, ensure that Wis'adel is on the front page of sniper support units (consider using a friend). Manually enter the stage and add any 5 operators with lower DP cost than Wis'adel, select support Wis'adel for the 6th slot, then confirm recruitment, abandon the current construction, and start from "Start Construction" (ensure the first five slots have operators and the 6th slot is empty).
- Open RA-4 on the world map, start the task when "Start Construction" appears in the bottom-right corner
- Note: If you have unlocked technologies that grant extra starting items, please remove facilities that cause this (e.g. Food Supply Station, Drink Supply Station, Large Beast Pen, etc.)
- Task flow: Use the Gold from Strategy Planning Management to unlock areas, and use Wis'adel to complete the boss elimination mission.
### RA-15
- Income reference: ~500 tokens + coordination points per run, ~3 min per cycle
- Operator requirement: Civilight Eterna (can use support unit)
- Prerequisites:
1. Complete RA-15 in the main storyline
2. If you own Civilight Eterna, manually open the stage and set up the squad once: 5 Vanguards (no level requirement) + Civilight Eterna in the 6th slot, then save and exit
3. If using support Civilight Eterna, ensure she appears on the first page of Caster supports
- Open RA-15 on the world map, start the task when "Start Construction" appears in the bottom-right corner
- Note: If you have unlocked technologies that grant extra starting items, please remove facilities that cause this (e.g. Food Supply Station, Drink Supply Station, Large Beast Pen, etc.)
- Task flow: Complete the 60-kill mission with Civilight Eterna

View File

@@ -11,14 +11,10 @@ Auto Recruitment and [Recruitment Recognition](./tools.md#recruitment-recognitio
Supports automatic use of `Expedited Plans`, allows setting maximum recruitment times per task, and can be combined with `Auto use Expedited Plans` to quickly use up all recruitment permits.
Pop-up notifications will appear when preserved tags, 5★ tags, or 6★ tags are detected.
Pop-up notifications will appear when 1★, 5★, or 6★ tags are detected.
Recruitment tag data is automatically uploaded to [Penguin Statistics](https://penguin-stats.io/) and [Yituliu](https://ark.yituliu.cn/) when refreshing recruitment.
## Advanced Settings
`Auto confirm` means MAA automatically selects tags and performs recruitment, while `Manual confirm` means no automatic tag selection or recruitment is performed.
After enabling `Preferred 3★ tags`, you can choose which 3★ tags should be preferred. After enabling `Preserve selected tags`, you can choose which tags should keep the current slot untouched.
When any preserved tag is recognized, MAA skips the current recruitment slot and leaves it unchanged instead of confirming that recruitment.

View File

@@ -18,7 +18,6 @@ Only supports switching to already logged-in accounts, using the login name for
- Examples:
- Official server: `123****8901` can be entered as `123****8901`, `123`, `8901`, or `3****8`
- Bilibili server: `Zhang San` can be entered as `Zhang San`, `Zhang`, or `San`
- Traditional Chinese server: Email-based, e.g. `ab****01@gmail.com`. Entering the plain-text portion without asterisks is recommended, e.g. `01@gmail`
## Connection Settings

View File

@@ -11,32 +11,26 @@ Open the Recruitment tag interface and click Start Recognition to initiate.
If you have previously run Operator Recognition, potential data will be displayed after the recognized operator's name.
## Operator Recognition
## Operator Recognition (Beta)
Can recognize lists of both owned and unowned operators, and identify potential levels to provide data for Recruitment Recognition.
Currently supports the following export formats:
- Clipboard
- JSON
- Markdown table
- CSV table
## Depot Recognition
## Depot Recognition (Beta)
Supports automatically entering the depot from the main page. If automatic navigation fails, please manually switch to the `Upgrade Materials` screen and **scroll all the way to the left** before starting the function.
Currently supports the following export formats:
- [Penguin Statistics Planner](https://penguin-stats.io/planner) (ArkPlanner)
- [Arknights Toolbox](https://arkntools.app/#/material) (Lolicon)
- Markdown table
- CSV table
Currently supports exporting to [Penguin Statistics Planner](https://penguin-stats.io/planner), [Arknights Toolbox](https://arkntools.app/#/material), and [Arknights | Planner](https://ark-nights.com/settings).
If you are the administrator of a data site, we welcome you to contact us to adapt your site's material JSON protocol!
More useful features may be added in the future. (Teaser)
## Task Video Recognition (Alpha)
Can recognize strategy videos and automatically generate operation files. Simply drag video files into the Auto Combat page to start.
Requires 16:9 aspect ratio with 720p or higher resolution, with no black borders, emulator frames, notched screen adaptations, or other interfering elements.
## Gacha
::: center
@@ -54,15 +48,3 @@ Want to see the world through MAA's eyes? Now you can!
MAA will attempt to take screenshots of the emulator at the target frame rate and display them in real-time in the window.
When the screenshot speed is significantly slower than the target frame rate, MAA will automatically reduce the target frame rate to match the screenshot speed. ~~Can be used as a stress test~~
## Mini Game
Used to automatically farm mini-games in events. Supports selecting names and switching between permanent and current limited-time activities in settings.
Built-in features include:
- Event shop exchange
- Green ticket shop exchange
- Yellow ticket shop exchange
- Reclamation Algorithm shop exchange
- Secret Front (supports selecting endings and event branches)

View File

@@ -137,6 +137,6 @@ Please note that JSON files do not support comments. The comments in this docume
## Example
[243_layout_3_times_a_day](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master-v2/resource/custom_infrast/243_layout_3_times_a_day.json)
[243_layout_3_times_a_day](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/resource/custom_infrast/243_layout_3_times_a_day.json)
[153_layout_3_times_a_day](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master-v2/resource/custom_infrast/153_layout_3_times_a_day.json)
[153_layout_3_times_a_day](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/resource/custom_infrast/153_layout_3_times_a_day.json)

View File

@@ -224,7 +224,7 @@ Todo
- `MedicineConfirm`
Use sanity potion
- `ExpiringMedicineConfirm`
Use expiring sanity potion
Use sanity potion expiring within 48 hours
- `StoneConfirm`
Use Originium Prime
- `RecruitRefreshConfirm`
@@ -355,16 +355,6 @@ Todo
}
```
- `RecruitPreservedTag`
Recruitment preserved tag detected
```json
// Corresponding details field example
{
"tag": "支援机械" // "Robot"
}
```
- `RecruitResult`
Recruitment recognition result

View File

@@ -829,6 +829,14 @@ For farming hidden Collapsal Paradigms, N10 difficulty is recommended, with the
MAA automatically handles copper pickup and exchange in JieGarden I.S.:
::: tip Enable Conditions
Copper exchange functionality is only enabled in the following modes:
- Investment Mode: Requires "Investment mode enable shopping, recruitment, advance 2 floors" option enabled
- Other Modes: Enabled by default
:::
1. **Pickup Dropped Coppers**: After battle ends, if copper drop selection interface appears, MAA will select the copper with highest `pickup_priority`
2. **Exchange Wallet Coppers**: When a newly picked copper needs to be exchanged with coppers in the wallet:

View File

@@ -64,8 +64,6 @@ Only supports switching to already logged-in accounts, using login name for iden
Official server: `123****4567`, can input `123****4567`, `4567`, `123`, or `3****4567`
<br>
Bilibili server: `Zhang San`, can input `Zhang San`, `Zhang`, or `San`
<br>
Traditional Chinese server: Email-based, e.g. `ab****01@gmail.com`. Entering the plain-text portion without asterisks is recommended, e.g. `01@gmail`
:::
::::
@@ -120,7 +118,7 @@ Whether to enable this task.
Stage name, by default empty, recognizes current/last stage. Editing in run-time is not supported.
Currently supported stages for navigation include:
- All mainline stages. You can add `-NORMAL` or `-HARD` at the end of the stage to switch difficulty: Chapters 10-14 map to Standard/Adverse, while Chapters 15+ map to Normal/Raid.
- All mainline stages. You can add `-NORMAL` or `-HARD` at the end of the stage to switch between standard or challenge mode.
- For LMD and Battle Record stages 5/6, must input `CE-6` / `LS-6`. MAA will automatically switch to stage 5 if stage 6 cannot be delegated.
- Skill Summary, Voucher, and Carbon stage 5, must input `CA-5` / `AP-5` / `SK-5`.
- All chip stages. Must input complete stage code, e.g. `PR-A-1`.
@@ -136,11 +134,8 @@ Currently supported stages for navigation include:
::: field name="medicine" type="number" optional default="0"
Maximum number of Sanity Potions used.
:::
::: field name="medicine_expire_days" type="number" optional default="0"
Use Sanity Potions that expire within the specified number of days. `0` means no expiring potions will be used.
:::
::: field name="expiring_medicine" type="number" optional default="0" deprecated
Deprecated since v6.8.0, please use `medicine_expire_days` instead.
::: field name="expiring_medicine" type="number" optional default="0"
Maximum number of Sanity Potions expiring within 48 hours.
:::
::: field name="stone" type="number" optional default="0"
Maximum number of Originite Prime used.
@@ -202,7 +197,7 @@ Currently supported stages for navigation include:
"enable": true,
"stage": "1-7",
"medicine": 1,
"medicine_expire_days": 2,
"expiring_medicine": 0,
"stone": 0,
"times": 10,
"series": 0,
@@ -264,14 +259,7 @@ Whether to use Expedited Plans.
Number of expedites, only effective when `expedite` is true. By default unlimited (until `times` limit is reached).
:::
::: field name="skip_robot" type="boolean" optional default="true"
Deprecated and kept only for backward compatibility.
<br>
When `preserve_tags` is absent and this value is `true`, MAA skips on `支援机械` only; `元素` is no longer treated as the legacy 1★ tag.
:::
::: field name="preserve_tags" type="array<string>" optional
List of tag names that should preserve the current recruitment slot and skip this recruitment. Default is empty.
<br>
If any specified tag is recognized, MAA will keep that slot untouched and skip the current recruitment.
Whether to skip when robot tag is recognized.
:::
::: field name="recruitment_time" type="object" optional
Tag ★ rarity (greater than or equal to 3) and corresponding desired recruitment time limit, in minutes, all default to 540 (i.e. 09:00:00).
@@ -312,7 +300,7 @@ Options: `CN` | `US` | `JP` | `KR`
"set_time": true,
"expedite": false,
"expedite_times": 0,
"preserve_tags": ["支援机械"],
"skip_robot": true,
"recruitment_time": {
"3": 540,
"4": 540
@@ -923,44 +911,32 @@ Whether to enable this task.
::: field name="enable" type="boolean" optional default="true"
Whether to enable this task.
:::
::: field name="theme" type="string" optional default="Tales"
::: field name="theme" type="string" optional default="Fire"
Theme.
<br>
`Fire` - _Fire Within the Sand_ (Closed)
`Fire` - _Fire Within the Sand_
<br>
`Tales` - _Tales Within the Sand_
<br>
`RelaunchAnchor` - _Relaunch Anchor_
:::
::: field name="mode" type="number" optional default="0"
Mode. Supported modes vary by theme:
Mode.
<br>
**Tales:**
`0` - Farm badges & construction pts (exiting the stage immediately).
<br>
`0` - No save, farm prosperity points by entering and exiting stages.
<br>
`1` - With save, farm currency by crafting support items.
<br>
**RelaunchAnchor:**
<br>
`16` (`RA1`) - RA-1, automatically execute intensive farming, construction, resource delivery, and settlement loop.
<br>
`32` (`RA15`) - RA-15, complete the 60-kill mission with Civilight Eterna.
<br>
`48` (`RA4`) - RA-4, Use the Gold from Strategy Planning Management to unlock areas, and use Wis'adel to complete the boss elimination mission.
`1` - Fire Within the Sand: Farm Crude Gold (forging Gold at headquarter after purchasing water); Tales Within the Sand: Automatically craft items and load to earn currency.
:::
::: field name="tools_to_craft" type="array<string>" optional default="[&quot;荧光棒&quot;]"
Automatically crafted items. Suggested to fill in the substring. Only effective for Tales theme.
Automatically crafted items. Suggested to fill in the substring.
:::
::: field name="increment_mode" type="number" optional default="0"
Click type. Only effective for Tales theme.
Click type.
<br>
`0` - Rapid Click
<br>
`1` - Long Press
:::
::: field name="num_craft_batches" type="number" optional default="16"
Maximum number of craft batches per session. Only effective for Tales theme.
Maximum number of craft batches per session.
:::
::::
@@ -1184,7 +1160,4 @@ Whether to enable AdbLite or not. Options: "0" | "1". Enum value: 4.
::: field name="KillAdbOnExit" type="boolean" optional
Release Adb on exit. Options: "0" | "1". Enum value: 5.
:::
::: field name="ClientType" type="string" optional
Client channel. Most connection configs do not need this option. Set it before `AsstConnect` / `AsstAsyncConnect` only when the selected `config` uses `[PackageName]` in commands executed during connect. In the built-in configs, only `Androws` and `WSA` currently require it for `displayId` lookup. This does not replace the `client_type` task parameter used by StartUp / CloseDown tasks. Enum value: 6.
:::
::::

View File

@@ -23,8 +23,6 @@ icon: jam:write-f
このテーマでは、ヒント、ノート、情報、注意、警告、詳細などのカスタムコンテナをサポートしており、これらの機能を利用して特定のコンテンツを強調することができます。
コンテナ内にコンテナをネストする場合、親コンテナは子コンテナよりもコロン `:` を1つ多く記述する必要があります。
コンテナの使用方法:
```markdown
@@ -33,13 +31,6 @@ icon: jam:write-f
:::
```
または GitHub スタイルの構文を使用する方法:
```markdown
> [!コンテナの種類]
> 書きたい内容
```
受け入れられるコンテナの内容とデフォルトのタイトルは次のとおりです:
- `tip` ヒント
@@ -48,7 +39,6 @@ icon: jam:write-f
- `warning` 注意
- `danger` 警告
- `details` 詳細
- `window` ==特殊なコンテナ==
### コンテナの例
@@ -76,190 +66,6 @@ icon: jam:write-f
これは詳細のコンテナです
:::
::: window
これは特殊なコンテナです
:::
## マーカー
マーカー構文を使用して、強調したい内容にマークを付けることができます。
使用方法:`==マーカーの内容=={マーカーの色(オプション)}` の構文でマークを付けます。両端にスペースが必要な点に注意してください。
**入力:**
```markdown
MaaAssistantArknights は ==たくさんの豚== によって開発されました
```
**出力:**
MaaAssistantArknights は ==たくさんの豚== によって開発されました
テーマには以下のカラースキームが組み込まれています:
- **default**: `==Default==` - ==Default==
- **info**: `==Info=={.info}` - ==Info=={.info}
- **note**: `==Note=={.note}` - ==Note=={.note}
- **tip**: `==Tip=={.tip}` - ==Tip=={.tip}
- **warning**: `==Warning=={.warning}` - ==Warning=={.warning}
- **danger**: `==Danger=={.danger}` - ==Danger=={.danger}
- **caution**: `==Caution=={.caution}` - ==Caution=={.caution}
- **important**: `==Important=={.important}` - ==Important=={.important}
## 隠しテキスト
何らかの理由でドキュメントの一部を一時的に隠す必要がある場合、隠しテキスト機能を使用できます。
`!!隠したい内容!!{設定(オプション)}` の構文で使用でき、デフォルトの効果は以下の通りです:
!!なんかニコニコ大百科(仮)を読んでる気がする(取り消し線!!
以下の設定が使用できます:
::: window
入力:
```markdown
+ マスクエフェクト + マウスホバー:!!マウスホバーで見えます!!{.mask .hover}
+ マスクエフェクト + クリック:!!クリックで見えます!!{.mask .click}
+ テキストぼかしエフェクト + マウスホバー:!!マウスホバーで見えます!!{.blur .hover}
+ テキストぼかしエフェクト + クリック:!!クリックで見えます!!{.blur .click}
```
出力:
- マスクエフェクト + マウスホバー:!!マウスホバーで見えます!!{.mask .hover}
- マスクエフェクト + クリック:!!クリックで見えます!!{.mask .click}
- テキストぼかしエフェクト + マウスホバー:!!マウスホバーで見えます!!{.blur .hover}
- テキストぼかしエフェクト + クリック:!!クリックで見えます!!{.blur .click}
:::
## ステップ
ステップバイステップのチュートリアルを書くとき、番号付きリストはネストによって階層感を失うことがあります。そのような場合、`steps` コンテナが最善の選択です。
入力:
````markdown
:::: steps
1. ステップ 1
```ts
console.log('Hello World!')
```
2. ステップ 2
ステップ 2 の関連内容はこちら
3. ステップ 3
::: tip
ヒントコンテナ
:::
4. 終わり
::::
````
出力:
:::: steps
1. ステップ 1
```ts
console.log('Hello World!')
```
2. ステップ 2
ステップ 2 の関連内容はこちら
3. ステップ 3
::: tip
ヒントコンテナ
:::
4. 終わり
::::
## スマート画像コンテナ
テーマが提供する機能をベースに画像コンテナをラッパーしました。このコンテナはライト/ダークテーマに応じて対応する画像を自動的に表示し、自動レイアウトをサポートします。
Markdown 本文で `<ImageGrid>` コンポーネントを使用してこのメソッドを呼び出すことができます。具体的な構文と効果は以下の通りです:
::: window
構文:
```markdown
<ImageGrid :imageList="[
{
light: 'images/zh-cn/readme/1-light.png',
dark: 'images/zh-cn/readme/1-dark.png'
},
{
light: 'images/zh-cn/readme/2-light.png',
dark: 'images/zh-cn/readme/2-dark.png'
},
{
light: 'images/zh-cn/readme/3-light.png',
dark: 'images/zh-cn/readme/3-dark.png'
},
{
light: 'images/zh-cn/readme/4-light.png',
dark: 'images/zh-cn/readme/4-dark.png'
}
]" />
```
レンダリング結果:
<ImageGrid :imageList="[
{
light: 'images/zh-cn/readme/1-light.png',
dark: 'images/zh-cn/readme/1-dark.png'
},
{
light: 'images/zh-cn/readme/2-light.png',
dark: 'images/zh-cn/readme/2-dark.png'
}
]" />
:::
## フィールドコンテナ
この構文はやや複雑なため、[公式ドキュメント](https://theme-plume.vuejs.press/guide/markdown/field/)を参照して使用してください。
効果は以下の通りです:
:::: field-group
::: field name="theme" type="ThemeConfig" required default="{ base: '/' }"
テーマ設定
:::
::: field name="enabled" type="boolean" optional default="true"
有効かどうか
:::
::: field name="callback" type="(...args: any[]) => void" optional default="() => {}"
<Badge type="tip" text="v1.0.0 追加" />
コールバック関数
:::
::: field name="other" type="string" deprecated
<Badge type="danger" text="v0.9.0 廃止" />
廃止されたプロパティ
:::
::::
## アイコン
このテーマではアイコンがサポートされており、次の場所でアイコンを使用できます:

View File

@@ -199,7 +199,7 @@ strategy = "merge" # 或者 "first" (默认)
# 在周天晚上使用所有的将要过期的理智药
[[tasks.variants]]
params = { medicine_expire_days = 2 }
params = { expiring_medicine = 1000 }
[tasks.variants.condition]
type = "And"

View File

@@ -43,7 +43,6 @@ icon: mdi:plug
- [MuMu Pro](https://mumu.163.com/mac/function/20240126/40028_1134600.html) `16384`
- [逍遥](https://bbs.xyaz.cn/forum.php?mod=viewthread&tid=365537) `21503`
- [夜神](https://support.yeshen.com/zh-CN/qt/ml) `62001`
- [テンセントアプリストア](https://sj.qq.com/faq/3878) (5.10.56.xx 以降)ADB ポートは `127.0.0.1:5555` 固定。ADB パス例:`C:\Program Files\Tencent\Androws\Application\バージョン番号\adb.exe`
他のエミュレータについては[Zhaoqingqing's Blog](https://www.cnblogs.com/zhaoqingqing/p/15238464.html)を参照してください。

View File

@@ -3,7 +3,7 @@ order: 4
icon: mingcute:android-fill
---
# 物理的な Android デバイス
# 物理的な**Android**デバイス
::: warning
この方法は ADB デバッグを伴い、さらに PC との接続が必要なため、**初心者には非推奨**です。
@@ -25,8 +25,6 @@ icon: mingcute:android-fill
## adbデバッグ・ツールをダウンロードして実行し、デバイスに接続する
::: steps
1. [adb](https://dl.google.com/android/repository/platform-tools-latest-windows.zip) をダウンロードし、解凍する。
2. 解凍したフォルダを開き、アドレスバーをクリアし`cmd` と入力しエンターキーを押します。
3. ポップアップしたコマンドプロンプトウィンドウに`adb`と入力し、英語のヘルプテキストがたくさん表示されれば、実行は成功です。
@@ -37,8 +35,6 @@ icon: mingcute:android-fill
adb devices
```
:::
- 実行に成功すると `USB デバッグ` デバイスが接続されたというメッセージが表示される。
- 成功した接続例:
@@ -117,35 +113,31 @@ icon: mingcute:android-fill
## 解像度の自動変更
::: steps
1. MAAディレクトリに2つの新しいテキストファイルを作成し、以下の内容で埋めてください。
```bat
```bash
:: 解像度を 1080p に調整する
adb -s <ターゲット・デバイスのシリアル番号> shell wm size 1080x1920
:: 画面の輝度を下げる(オプション)
adb -s <ターゲット・デバイスのシリアル番号> shell settings put system screen_brightness 1
```
```bat
```bash
:: 解像度の復元
adb -s <ターゲット・デバイスのシリアル番号> shell wm size reset
adb -s <ターゲット・デバイスのシリアル番号>> shell wm size reset
:: 画面の明るさを上げる(オプション)
adb -s <ターゲット・デバイスのシリアル番号> shell settings put system screen_brightness 20
:: ホームに戻る(オプション)
adb -s <ターゲット・デバイスのシリアル番号> shell input keyevent 3
:: ロック画面(オプション)
adb -s <ターゲット・デバイスのシリアル番号> shell input keyevent 26
adb -s <ターゲット・デバイスのシリアル番号> shell settings put system screen_brightness 20
:: ホームに戻る(オプション)
adb -s <ターゲット・デバイスのシリアル番号> shell input keyevent 3
:: ロック画面(オプション)
adb -s <ターゲット・デバイスのシリアル番号> shell input keyevent 26
```
2. 最初のファイルを `startup.bat` に、2番目のファイルを `finish.bat` にリネームする。
- リネーム後、拡張子を変更するための2回目の確認ダイアログボックスが表示されず、ファイルアイコンも変更されない場合は、Windowsでファイルの拡張子を表示する方法をご自身で検索してください。
- リネーム後、拡張子を変更するための2回目の確認ダイアログボックスが表示されず、ファイルアイコンも変更されない場合は、Windowsでファイルの拡張子を表示する方法をご自身で検索してください。
3. MAA の `設定` - `接続設定` - `スクリプトを使用して始めます` と `終了時にスクリプトを使用します` にそれぞれ `startup.bat` と `finish.bat` を記入してください。
:::
## MAAとの接続
### 有線接続
@@ -164,8 +156,6 @@ icon: mingcute:android-fill
#### `adb tcpip` を使用してワイヤレスポートをオンにします
::: steps
1. 先ほど開いたコマンドプロンプトウィンドウに以下のコマンドを入力し、ワイヤレスデバッグを有効にします。
```bash
@@ -180,16 +170,12 @@ icon: mingcute:android-fill
3. `<IP>:5555` を MAAの `設定` - `接続設定` - `接続先アドレス` に入力してください。例 `192.168.1.2:5555`。
4. Link Start!
:::
#### `adb pair` を使用してワイヤレスポートをオンにします
::: tip
`adb pair` ワイヤレス ペアリング、つまり Android 11 以降の開発者向けオプションで `ワイヤレスデバッグ` を使用すると、 `adb tcpip` と比較して有線接続が不要になります。
:::
::: steps
1. デバイスの開発者向けオプションに移動し、 `ワイヤレスデバッグ` をクリックしてオンにし、OKをクリックして、 `ペアリングコードでデバイスをペアリング` をクリックして、ペアリングが完了するまで表示されるポップアップウィンドウを閉じないでください。
2. ペアリングします。
@@ -200,17 +186,11 @@ icon: mingcute:android-fill
3. 現在のデバイス画面に表示される `<IP アドレスとポート>` を MAAの `設定` - `接続設定` - `接続アドレス` に入力します( `192.168.1.2:11451` など)、**さっき記入したものとは違うに違いない**。
4. Link Start!
:::
#### ルート権限でワイヤレスポートをオンにします
~~ルート権限を使用できますが、このドキュメントを読む必要がありますか~~
::: steps
1. [WADB](https://github.com/RikkaApps/WADB/releases) をダウンロードしてインストールし、ルート化します。
2. WADBを起動して、ワイヤレスadbを起動します。
3. WADBから提供された `<IP アドレスとポート>` を MAAの `設定` - `接続設定` - `接続アドレス` に入力します( `192.168.1.2:5555` など)。
4. Link Start!
:::

View File

@@ -19,9 +19,7 @@ MAA WPF GUI は現在 Wine を通じて実行できます。MAAは.NETランタ
#### インストール手順
:::: steps
1. Visual C++ Redistributable をインストールする
1. Visual C++ Redistributable をインストールする:
[Visual C++ 再頒布可能パッケージ](https://aka.ms/vc14/vc_redist.x64.exe) をダウンロードしてインストールします:
@@ -33,11 +31,7 @@ MAA WPF GUI は現在 Wine を通じて実行できます。MAAは.NETランタ
`DependencySetup_依赖库安装.bat` は winget と Windows の権限昇格機構に依存しているため、Wine では通常正常に動作しません。そのため、ランタイムライブラリは手動でインストールする必要があります。
:::
2. MAA をダウンロード
Windows 版 MAA をダウンロードし、解凍した後、`wine MAA.exe` を実行します。
::::
2. Windows 版 MAA をダウンロードし、解凍した後、`wine MAA.exe` を実行します。
::: info 注意
接続設定で ADB パスを [Windows 版 `adb.exe`](https://dl.google.com/android/repository/platform-tools-latest-windows.zip) に設定する必要があります。
@@ -72,52 +66,52 @@ MAA Wine Bridge で生成された `MaaDesktopIntegration.so` を `MAA.exe` と
### Python を使用する
:::: steps
#### MAA 動的ライブラリのインストール
1. MAA 動的ライブラリのインストール
1. Linux ダイナミック ライブラリを [MAA ウェブサイト](https://maa.plus/) からダウンロードし、解凍します、または以下のソフトウェアリポジトリからインストールします
- AUR[maa-assistant-arknights](https://aur.archlinux.org/packages/maa-assistant-arknights)、インストール後のプロンプトに従ってファイルを編集します
- Nixpkgs: [maa-assistant-arknights](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/ma/maa-assistant-arknights/package.nix)
2. `./MAA-v{バージョン}-linux-{アーキテクチャ}/Python/` ディレクトリに移動し、`sample.py` ファイルを開きます
1. Linux ダイナミック ライブラリを [MAA ウェブサイト](https://maa.plus/) からダウンロードし、解凍します、または以下のソフトウェアリポジトリからインストールします:
- AUR[maa-assistant-arknights](https://aur.archlinux.org/packages/maa-assistant-arknights)、インストール後のプロンプトに従ってファイルを編集します
- Nixpkgs: [maa-assistant-arknights](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/ma/maa-assistant-arknights/package.nix)
::: tip
プリコンパイル済みバージョンには、比較的新しいLinuxディストリビューション(Ubuntu 22.04)でコンパイルされた動的ライブラリが含まれており、システムに古いバージョンのlibstdc++がある場合、ABIの非互換性に遭遇する可能性があります。
[Linuxコンパイル・チュートリアル](../../develop/linux-tutorial.md) を参照して再コンパイルまたはコンテナを使用して実行できます。
:::
2. `./MAA-v{バージョン}-linux-{アアーキテクチャ}/Python/` ディレクトリに移動し、`sample.py` ファイルを開きます
2. ADB 構成
1. [`if asst.connect('adb.exe', '127.0.0.1:5554'):`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/722f0ddd4765715199a5dc90ea1bec2940322344/src/Python/sample.py#L48) セクションを見つける
2. `adb` ツール呼び出し
- エミュレータが `Android Studio` に `avd` を使用している場合は、 `adb` が付属します。 `adb.exe` の欄に直接 `adb` パスを記入することができ、一般的には `$HOME/Android/Sdk/platform-tools/` で見つけることができます。例:
::: tip
プリコンパイル済みバージョンには、比較的新しいLinuxディストリビューション(Ubuntu 22.04)でコンパイルされた動的ライブラリが含まれており、システムに古いバージョンのlibstdc++がある場合、ABIの非互換性に遭遇する可能性があります。
[Linuxコンパイル・チュートリアル](../../develop/linux-tutorial.md) を参照して再コンパイルまたはコンテナを使用して実行できます。
:::
```python
if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "エミュレータの adb アドレス"):
```
#### ADB 構成
- 他のエミュレータを使用する場合は、最初に `adb` をダウンロードして: `$ sudo apt install adb` 次に、パスを入力するか、 `PATH` 環境変数を使用して `adb` を直接入力します
1. [`if asst.connect('adb.exe', '127.0.0.1:5554'):`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/722f0ddd4765715199a5dc90ea1bec2940322344/src/Python/sample.py#L48) セクションを見つける
3. エミュレータの `adb` パス取得
- adb ツールを直接使用できます `$ adbパス devices` 例:
2. `adb` ツール呼び出し
- エミュレータが `Android Studio` に `avd` を使用している場合は、 `adb` が付属します `adb.exe` の欄に直接 `adb` パスを記入することができ、一般的には `$HOME/Android/Sdk/platform-tools/` で見つけることができます。例:
```shell
$ /home/foo/Android/Sdk/platform-tools/adb devices
List of devices attached
emulator-5554 device
```
```python
if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "エミュレータの adb アドレス"):
```
- 返される `emulator-5554` はエミュレータのadbアドレスで、 `127.0.0.1:5555` を上書きします、例:
- 他のエミュレータを使用する場合は、最初に `adb` をダウンロードして: `$ sudo apt install adb` 次に、パスを入力するか、 `PATH` 環境変数を使用して `adb` を直接入力します
```python
if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "emulator-5554"):
```
3. エミュレータの `adb` パス取得
- adb ツールを直接使用できます: `$ adbパス devices` ,例:
4. この時点で、 `$ python3 sample.py` をテストでき、 `接続成功` が返されれば、基本的に成功です
```shell
$ /home/foo/Android/Sdk/platform-tools/adb devices
List of devices attached
emulator-5554 device
```
3. タスク構成
- 返される `emulator-5554` はエミュレータのadbアドレスで、 `127.0.0.1:5555` を上書きします、例:
カスタムタスク:必要に応じて [統合ドキュメント](../../protocol/integration.md) を参照し、`sample.py` の [`# タスクとパラメーターについては docs/integration.md 参照`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/722f0ddd4765715199a5dc90ea1bec2940322344/src/Python/sample.py#L54) 欄を変更します
```python
if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "emulator-5554"):
```
::::
4. この時点で、 `$ python3 sample.py` をテストでき、 `接続成功` が返されれば、基本的に成功です
#### タスク構成
カスタムタスク:必要に応じて [統合ドキュメント](../../protocol/integration.md) を参照し、`sample.py` の [`# タスクとパラメーターについては docs/integration.md 参照`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/722f0ddd4765715199a5dc90ea1bec2940322344/src/Python/sample.py#L54) 欄を変更します
## エミュレータのサポート

View File

@@ -17,8 +17,6 @@ icon: basil:apple-solid
注: `macOS` の仕組みにより、ゲームウィンドウを最小化したり、ステージマネージャーで別のウィンドウに切り替えたり、ウィンドウを別のデスクトップ/画面に移動したりすると、スクリーンショットに問題が発生し、正しく実行されなくなります。 👉🏻️ [issue](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/4371#issuecomment-1527977512) を参照
::: steps
0. 要件: MAA バージョン v4.13.0-rc.1 以降
1. [PlayCover のフォークバージョン](https://github.com/hguandl/PlayCover/releases) をダウンロードしてインストールします。
@@ -35,8 +33,6 @@ icon: basil:apple-solid
7. ステップ 3-5 は一度だけ行う必要があり、その後はアークナイツをアクティブにするだけで済みます。アークナイツのクライアントを更新するたびに、手順2を再度実行する必要があります。
:::
### ✅ [MuMu エミューレータ Pro](https://mumu.163.com/mac/)
サポートされています、ただしテストは少なく、 `MacPlayTools` 以外のタッチモードが必要です。 関連する問題 [#8098](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/8098)

View File

@@ -40,11 +40,6 @@ const fullySupport = [
note: 'サポートされています。エミュレーターの `設定` - `上位設定``Android Debug Bridge`をONにする必要があります。\n\n- ネットワーク環境が悪い場合は [オフラインパッケージ](https://support.bluestacks.com/hc/zh-tw/articles/4402611273485-BlueStacks-5-%E9%9B%A2%E7%B7%9A%E5%AE%89%E8%A3%9D%E7%A8%8B%E5%BC%8F)をダウンロードしてください。\n- adbポート番号が不規則に変化し続け、起動するたびに同じでない場合は、お使いのコンピュータが [Hyper-V](https://support.bluestacks.com/hc/ja/articles/4415238471053-BlueStacks-5-Hyper-V%E3%81%8C%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8BWindows-10%E3%81%A8Windows-11%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A6%81%E4%BB%B6)を有効にしている可能性があります,\nこのような状況に対して、MAAはポート番号を自動的に取得する小さなバックドアを提供しています。この機能がは動作しません/複数のエミュレータが必要/複数のエミュレータコアがインストールされているの場合は [よくある質問](../よくある質問.html#blue-stackエミュレータが起動するたびにポート番号が異なるhyper-v) を参照して変更してください。Hyper-V は管理者として実行されるため、エミュレーターの自動シャットダウンや接続の自動検出など、adb を伴わない操作でも MAA を管理者として実行する必要があります。',
},
...shuffleArray([
{
name: 'テンセントアプリストア',
link: 'https://sj.qq.com/',
note: 'バージョン 5.10.56.xx 以降をサポートしています。`設定` - `接続設定` で `テンセントアプリストア` 接続設定を選択してください。Hyper-V との互換性が確認されています。\n\n- ADB ポートは `127.0.0.1:5555` です。\n- ADB パス例:`C:\\Program Files\\Tencent\\Androws\\Application\\バージョン番号\\adb.exe`。\n\n- 事前にアプリストアで [ADB デバッグを有効化](https://sj.qq.com/faq/3878) する必要があります。',
},
{
name: 'NOX',
link: 'https://www.yeshen.com/',

View File

@@ -40,7 +40,7 @@ icon: hugeicons:brain-02
画面は、右上にステージ名と残り理性、右下に自動指揮と作戦開始が表示されるステージ詳細に留めてください。
- この画面にいない場合、`現在/前回` は端末ホーム右下の「前回作戦」のステージへ自動で入ります。
- `作戦``高度な設定``ステージ名を入力する` を有効にし、手動でステージ番号を入力することもできます。現在ナビ可能なステージは以下の通りです:
- すべてのメインステージ。末尾に `-NORMAL` または `-HARD` を付けて難易度を切り替え可能10〜14章は標準/厄難、15章以降は通常/険地)
- すべてのメインステージ。末尾に `-NORMAL` または `-HARD` を付けて標準/磨難を切り替え可能。
- 龍門幣・作戦記録の 5 / 6 ステージ。ただし `CE-6` / `LS-6` を入力してください。6 が連戦不可の場合、自動で 5 に切り替えます。
- アーツ学・購買資格証・炭素材の第 5 ステージ。`CA-5` / `AP-5` / `SK-5` を入力してください。
- すべてのSoCステージ。`PR-A-1` のように完全な番号を入力してください。

View File

@@ -12,7 +12,7 @@ icon: ic:baseline-article
- ステージ選択に必要なステージがない場合ならば、MAAで `現在/前回` を選択し、ゲーム内で手動でステージを選択し、**任務開始**と**自動指揮**がゲーム画面に存在することを確認してください。
- 現在この画面が表示されていない場合、 `現在/前回` は自動的に端末のホームページの右下隅にある「前回の参加作戦へ」ステージに入ります。
- `タスク設定` - `作戦` - `高度な設定``ステージ名を入力する` を有効にすることで、ステージ番号を手動で入力することもできます。 現在サポートされているナビゲーションステージは以下の通りです:
- すべてのメインストーリーステージ。ステージ末尾に `-NORMAL` または `-HARD`付けて難易度を切り替え可能10〜14章は標準/厄難、15章以降は通常/険地)
- すべてのメインストーリーステージ。通常または厄難奮戦に切り替えるには、ステージ末尾に `-NORMAL` または `-HARD`追加します
- 龍門幣、作戦記録の5/6ステージ。ただし、 `CE-6` / `LS-6` を入力する必要があります。6ステージを実行できない場合は、自動的に5ステージに移行します。
- アーツ学、購買資格証、建築資材。 `CA-5` / `AP-5` / `SK-5` を入力する必要があります。
- SoCの場合のみ、完全なステージ番号を入力する必要があります。例 `PR-A-1`

View File

@@ -10,53 +10,15 @@ This page is outdated and maybe still in Simplified Chinese. Translation is need
:::
現在、生息演算のサポートはまだ初期段階にあり、自動攻略は推奨されず、現段階では安定性を保証できません。
## 熱砂秘聞Tales
### デフォルトモード
## デフォルトモード
1. 生息演算のメイン画面でタスクを開始する必要があります(ナビゲーションはまだ未実装)
2. すでにセーブデータがある状況では使用できません(既存のセーブデータを削除してください)
3. 生息演算の編成にオペレーターがいる状況では使用できません(生息演算の現在の編成をクリアしてください、特にウェーブを完了した後)
### 製造でポイント稼ぎ
## 製造でポイント稼ぎ
1. 生息演算内で駐屯地が見えるページから開始する必要があります
2. アイテム名が未記入の場合、デフォルトでグローライトを製造します
3. 前提条件現在が決算後の初日で、その後3日間敵襲による駐屯地への侵入がないこと
4. 製造可能数量がちょうど99の倍数の場合、フリーズします。セーブ前に少し使用することができます。これは後で修正予定です
## リローンチアンカーRelaunchAnchor
### RA-1
- 収益目安1周あたり約159トークン + 統籌ポイント、1周約2分10秒
- オペレーター要件:なし
- 前提条件ストーリーでRA-1をクリア済みであること
- ワールドマップでRA-1を開き、右下に「建設開始」が表示されたらタスクを開始すると自動ループします
- 注意:開始時に追加アイテムを持ち込むテクノロジーを解放している場合、該当施設(食品供給ステーション、飲料供給ステーション、大型獣檻など)を撤去してください
- タスクフロー:精耕細作→建設→資源納品→決算を自動ループ
### RA-4
- 収益目安1周あたり約417トークン + 統括ポイント、1周約1分40秒
- オペレーター要件:ヴィシャデル(サポート可)
- 前提条件:
1. メインストーリーを進めてRA-4をクリア済みの状態にする
2. 「計画経営」をアンロックする
3. 自分でヴィシャデルを持っている場合、手動でステージを開いて一度編成を行う。ヴィシャデルよりもコストが低い任意の5人のオペレーターヴィシャデルとし、ヴィシャデルを6番目最後に選択する枠に配置する。その後、勧誘を確定し、今回の建設を中止して「建設開始」から開始する。
4. サポートのヴィシャデルを使用する場合、ヴィシャデルがスナイパーサポートのトップページに表示されていることを確認するフレンドを考慮。手動でステージを開き、ヴィシャデルよりもコストが低い任意の5人のオペレーターを編成し、6番目にサポートのヴィシャデルを選択して勧誘を確定する。その後、今回の建設を中止して「建設開始」から開始する先頭5枠にオペレーターがおり、6番目が空いていることを確認する
- ワールドマップでRA-4を開き、右下に「建設開始」が表示されたらタスクを開始すると自動ループします
- 注意:開始時に追加アイテムを持ち込むテクノロジーを解放している場合、該当施設(食品供給ステーション、飲料供給ステーション、大型獣檻など)を撤去してください
- タスクフロー:「計画経営」で得た赤金を使ってエリアを解放し、ヴィシャデルでボス討伐を完了する
### RA-15
- 収益目安1周あたり約500トークン + 統籌ポイント、1周約3分
- オペレーター要件:シヴィライト・エテルナ(サポート可)
- 前提条件:
1. ストーリーでRA-15をクリア済みであること
2. シヴィライト・エテルナを所持している場合、手動でステージを開き編成を設定バンガード5体育成不要+ エテルナを6番目に配置、保存して退出
3. サポートのシヴィライト・エテルナを使用する場合、術士サポートの最初のページに表示されるよう調整
- ワールドマップでRA-15を開き、右下に「建設開始」が表示されたらタスクを開始すると自動ループします
- 注意:開始時に追加アイテムを持ち込むテクノロジーを解放している場合、該当施設を撤去してください
- タスクフローシヴィライト・エテルナで60撃破ミッションを達成

View File

@@ -11,14 +11,10 @@ icon: fluent:people-24-filled
`緊急招集票` の自動使用に対応し、1回のタスクあたりの最大募集回数を設定できます。`緊急招集票を自動的に使用` と併用すれば、一度に募集券を使い切ることができます。
保留対象のタグ、5★タグ、6★タグを検出した場合は通知を表示します。
1・5・6★タグを検出した場合は通知を表示します。
公開求人の更新時には、公開求人のタグデータを [ペンギン急便データ統計処理部門](https://penguin-stats.io/) と [ワンシート攻略](https://ark.yituliu.cn/) に自動アップロードします(**ご注意:「ワンシート攻略」は実質的に簡体字中国語のみのため、翻訳ツールと併用してください**)。
## 高度な設定
`自動的に確認する` は MAA が自動でタグを選択して募集を実行することを意味し、`手動的に確認する` は自動選択および自動募集を行わないことを意味します。
`3★タグ優先` を有効にすると、優先したい 3★タグを選択できます。`指定タグを保留` を有効にすると、保持したいタグを選択できます。
保留対象のタグを1つでも認識した場合、MAA はその公開求人枠を保持したまま今回の募集をスキップし、確認操作は行いません。

View File

@@ -18,7 +18,6 @@ icon: ic:round-rocket-launch
- 例:
- 公式サーバー:`123****8901` の場合、`123****8901``123``8901``3****8` のいずれでも可
- Bilibiliサーバー`张三` の場合、`张三``张``三` のいずれでも可
- 繁体字中国語サーバーEメール形式`ab****01@gmail.com`)。アスタリスクを含まない明文部分(例:`01@gmail`)の入力を推奨
## 接続設定

View File

@@ -15,23 +15,12 @@ icon: octicon:tools-16
所持/未所持のオペレーター一覧を認識し、潜在能力データを認識・保存して公開求人認識で表示に利用します。
現在、以下のエクスポート形式に対応しています:
- クリップボード
- JSON
- Markdown テーブル
- CSV テーブル
## 倉庫アイテム認識
ホーム画面から自動で倉庫へ移動できます。自動遷移に失敗した場合は、手動で倉庫の `素材` 画面へ切り替え、**いちばん左端までスワイプ** してから開始してください。
現在、以下のエクスポート形式に対応しています:
- [ペンギン急便周回計画作成ツール](https://penguin-stats.io/planner)ArkPlanner
- [アークナイツツールボックス](https://arkntools.app/#/material)Lolicon
- Markdown テーブル
- CSV テーブル
現在、MAAから以下のサイトへエクスポートに対応しています:
[ペンギン急便周回計画作成ツール](https://penguin-stats.io/planner)、[アークナイツツールボックス](https://arkntools.app/#/material)、[アークナイツ | 周回計画表](https://ark-nights.com/settings)。
データサイトを運営されている方は、貴サイトの素材JSON形式へのエクスポート対応についてもぜひご連絡ください。実装を検討いたします。
@@ -59,15 +48,3 @@ MAAの目を通して世界を見てみたいですか今、それが来ま
MAA が目標フレームレートに合わせてエミュレータのスクリーンショットを取得し、ウィンドウ中央にリアルタイム表示します。
スクショ取得速度が目標フレームレートに対して明らかに遅い場合、スクショ速度に合わせて目標フレームレートを自動で下げます。~~負荷テストにもどうぞ~~
## ミニゲーム
イベント内のミニゲームを自動的に周回します。名前の選択に対応し、設定で常設と当期限定イベントを切り替えられます。
内蔵機能:
- イベントショップ交換
- 緑チケットショップ交換
- 黄チケットショップ交換
- 生息演算ショップ交換
- シークレットフロント(エンディングとイベント分岐の選択に対応)

View File

@@ -147,6 +147,6 @@ JSONファイルはコメントをサポートしていません。テキスト
## サンプル
[243 有効率が最も高い 一日三回](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master-v2/resource/custom_infrast/243_layout_3_times_a_day.json)
[243 有効率が最も高い 一日三回](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/resource/custom_infrast/243_layout_3_times_a_day.json)
[153 有効率が最も高い 一日三回](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master-v2/resource/custom_infrast/153_layout_3_times_a_day.json)
[153 有効率が最も高い 一日三回](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/resource/custom_infrast/153_layout_3_times_a_day.json)

View File

@@ -227,7 +227,7 @@ Todo
- `MedicineConfirm`
理性回復剤使用確認
- `ExpiringMedicineConfirm`
期限切れ間近の理性回復剤使用確認
48時間以内に期限切れ理性回復剤使用確認
- `StoneConfirm`
純正源石使用確認
- `RecruitRefreshConfirm`
@@ -361,16 +361,6 @@ Todo
}
```
- `RecruitPreservedTag`
保留対象の公開求人タグの検出
```json
// 対応する詳細フィールドの例
{
"tag": "ロボット"
}
```
- `RecruitResult`
公開求人結果

View File

@@ -775,6 +775,14 @@ OCRで思わぬ遭遇イベントを認識しますが、選択肢は固定さ
MAAは界園テーマで通宝の拾取と交換を自動処理します
::: tip 有効条件
通宝交換機能は以下のモードでのみ有効:
- 投資モード「投資モードで購買、募集、2層進出を有効化」オプションを有効にする必要があります
- その他のモード:デフォルトで有効
:::
1. **ドロップ通宝の拾取**戦闘終了後、通宝ドロップ選択画面が表示された場合、MAAは `pickup_priority` に基づいて最も優先度の高い通宝を選択
2. **銭匣通宝の交換**:新しく拾った通宝を銭匣内の通宝と交換する必要がある場合:

View File

@@ -64,8 +64,6 @@ AsstTaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const cha
Official`123****4567`、入力可能:`123****4567``4567``123``3****4567`
<br>
Bilibili`张三`、入力可能:`张三``张``三`
<br>
繁体字中国語サーバーEメール形式`ab****01@gmail.com`)。アスタリスクを含まない明文部分(例:`01@gmail`)の入力を推奨
:::
::::
@@ -120,7 +118,7 @@ Bilibili`张三`、入力可能:`张三`、`张`、`三`
ステージ名。デフォルトは空で、現在/最後のステージを認識します。実行中の設定はサポートされていません。
ナビゲーション対象のステージは以下の通りです:
- すべてのメイン ストーリー ステージ。ステージ末尾`-NORMAL` または `-HARD`付けて難易度を切り替えできます10〜14章は標準/厄難、15章以降は通常/険地)
- すべてのメイン ストーリー ステージ。ステージの最後`-NORMAL` または `-HARD`追加して、標準または困難なステージを切り替えることができます
- 龍門幣、作戦記録の 5/6 関。ただし `CE-6` / `LS-6` と入力する必要があります。MAA は 6 関が代理できない場合は自動的に 5 関に切り替わります。
- スキル本、購買資格証、碳素材の第 5 関。`CA-5` / `AP-5` / `SK-5` と入力する必要があります。
- すべてのチップ本。完全なステージ番号を入力する必要があります(例:`PR-A-1`)。
@@ -136,11 +134,8 @@ Bilibili`张三`、入力可能:`张三`、`张`、`三`
::: field name="medicine" type="number" optional default="0"
理性回復剤の最大使用数。
:::
::: field name="medicine_expire_days" type="number" optional default="0"
指定日数以内に期限切れになる理性回復剤を使用します。`0` は期限切れの理性回復剤を使用しないことを意味します
:::
::: field name="expiring_medicine" type="number" optional default="0" deprecated
v6.8.0 で非推奨になりました。代わりに `medicine_expire_days` を使用してください。
::: field name="expiring_medicine" type="number" optional default="0"
48 時間以内に期限切れになる理性回復剤の最大使用数
:::
::: field name="stone" type="number" optional default="0"
純正源石の最大使用数。
@@ -202,7 +197,7 @@ Bilibili`张三`、入力可能:`张三`、`张`、`三`
"enable": true,
"stage": "1-7",
"medicine": 1,
"medicine_expire_days": 2,
"expiring_medicine": 0,
"stone": 0,
"times": 10,
"series": 0,
@@ -264,14 +259,7 @@ Bilibili`张三`、入力可能:`张三`、`张`、`三`
緊急招集の回数。`expedite` が true の場合のみ有効です。デフォルトは制限なし(`times` の上限まで)です。
:::
::: field name="skip_robot" type="boolean" optional default="true"
非推奨です。旧パラメータ互換のためにのみ残されています
<br>
`preserve_tags` が指定されておらず、この値が `true` の場合は `支援机械` を認識したときのみスキップします。`元素` は旧来の 1★ タグとしては扱われません。
:::
::: field name="preserve_tags" type="array<string>" optional
現在の公開求人枠を保持したまま今回の募集をスキップしたい Tag 名の一覧です。デフォルトは空です。
<br>
指定した Tag のいずれかを認識した場合、MAA はその枠を保持して今回の募集をスキップします。
ロボット タグが認識されたときにスキップするかどうか
:::
::: field name="recruitment_time" type="object" optional
タグレベル3 以上)と対応する希望採用時間(分単位)。デフォルト値は 540つまり 09:00:00です。
@@ -312,7 +300,7 @@ Bilibili`张三`、入力可能:`张三`、`张`、`三`
"set_time": true,
"expedite": false,
"expedite_times": 0,
"preserve_tags": ["支援机械"],
"skip_robot": true,
"recruitment_time": {
"3": 540,
"4": 540
@@ -922,44 +910,32 @@ Sarkaz テーマ、Investment モード、「破棘成金分隊」または「
::: field name="enable" type="boolean" optional default="true"
このタスクを有効にするかどうか。
:::
::: field name="theme" type="string" optional default="Tales"
::: field name="theme" type="string" optional default="Fire"
テーマ。
<br>
`Fire` - _砂中の火_(終了)
`Fire` - _砂中の火_
<br>
`Tales` - _熱砂秘聞_
<br>
`RelaunchAnchor` - _リローンチアンカー_
`Tales` - _熱砂秘聞_
:::
::: field name="mode" type="number" optional default="0"
モード。テーマごとにサポートするモードが異なります:
モード。
<br>
**Tales熱砂秘聞**
`0` - ポイント稼ぎと建造ポイント、戦闘に入って直接退出。
<br>
`0` - セーブなし、ステージ出入りで生息ポイントを稼ぐ。
<br>
`1` - セーブあり、支援アイテムを組み立てて生息ポイントを稼ぐ。
<br>
**RelaunchAnchorリローンチアンカー**
<br>
`16` (`RA1`) - RA-1、精耕細作→建設→資源納品→決算を自動ループ。
<br>
`32` (`RA15`) - RA-15、シヴィライト・エテルナで60撃破ミッションを達成。
<br>
`48` (`RA4`) - RA-4、「計画経営」で得た赤金を使ってエリアを解放し、ヴィシャデルでボス討伐を完了する。
`1` - 沙中之火:赤金稼ぎ、連絡員から水購入後基地で鍛造;沙洲遗闻:支援アイテムを組み立てて生息ポイントを稼ぐ。
:::
::: field name="tools_to_craft" type="array<string>" optional default="[&quot;荧光棒&quot;]"
自動製造品。サブストリング入力推奨。Tales テーマのみ有効。
自動製造品。サブストリング入力推奨。
:::
::: field name="increment_mode" type="number" optional default="0"
クリック型。Tales テーマのみ有効。
クリック型。
<br>
`0` - 連続クリック
<br>
`1` - 長押し
:::
::: field name="num_craft_batches" type="number" optional default="16"
単次最大製造バッチ数。Tales テーマのみ有効。
単次最大製造バッチ数。
:::
::::
@@ -1183,7 +1159,4 @@ AdbLite を使用するかどうか。可能な値:"0" または "1"。列挙
::: field name="KillAdbOnExit" type="boolean" optional
終了時に Adb プロセスをキルするかどうか。可能な値:"0" または "1"。列挙値5。
:::
::: field name="ClientType" type="string" optional
クライアント種別(ゲームチャネル)。ほとんどの接続設定では不要です。`AsstConnect` / `AsstAsyncConnect` に渡す `config` が、接続時に実行するコマンド内で `[PackageName]` を使用する場合にのみ、接続前に `AsstSetInstanceOption(..., ClientType, ...)` を設定してください。現在の組み込み設定では、`Androws``WSA``displayId` 取得のみがこの値に依存します。このオプションは StartUp / CloseDown などのタスクパラメータ `client_type` を置き換えるものではありません。列挙値6。
:::
::::

View File

@@ -21,8 +21,6 @@ icon: jam:write-f
이 테마는 팁, 주석, 정보, 주의, 경고 및 세부 정보를 사용자 정의하는 컨테이너를 지원합니다. 이 기능을 사용하여 내용을 강조할 수 있습니다.
컨테이너 안에 컨테이너가 중첩된 경우, 부모 컨테이너는 자식 컨테이너보다 콜론 `:` 을 하나 더 작성해야 합니다. 예: [단계(Steps) 컨테이너](#단계-steps)
컨테이너 사용 방법:
```markdown
@@ -46,7 +44,7 @@ icon: jam:write-f
- `warning` 주의
- `danger` 경고
- `details` 세부 사항
- `window` ==특수 컨테이너==
- `demo-wrapper` ==특수 컨테이너==
### 컨테이너 예시
@@ -74,7 +72,7 @@ icon: jam:write-f
이것은 세부 사항 컨테이너입니다
:::
::: window
::: demo-wrapper
이것은 매우 특별한 컨테이너입니다
:::
@@ -115,7 +113,7 @@ MaaAssistantArknights는 ==많은 돼지들== 에 의해 개발되었습니다
다음과 같은 설정을 사용할 수 있습니다:
::: window
::: demo-wrapper
입력:
```markdown
@@ -138,6 +136,8 @@ MaaAssistantArknights는 ==많은 돼지들== 에 의해 개발되었습니다
단계별 튜토리얼을 작성할 때, 순서가 있는 목록은 중첩으로 인해 계층 구조가 불분명해질 수 있습니다. 이럴 때 `steps` 컨테이너가 최고의 선택입니다.
이 컨테이너는 일반적인 컨테이너와 달리 시작과 끝을 표시하기 위해 4개의 콜론을 사용합니다.
입력:
````markdown
@@ -192,7 +192,7 @@ MaaAssistantArknights는 ==많은 돼지들== 에 의해 개발되었습니다
마크다운 본문에서 `<ImageGrid>` 컴포넌트를 사용하여 이 메서드를 호출할 수 있으며, 구체적인 구문과 효과는 다음과 같습니다.
::: window
::: demo-wrapper
구문:
@@ -292,7 +292,7 @@ icon: jam:write-f
- `color` css 스타일 색상 값을 받습니다. 예: `#fff`, `red` 등 (이 옵션은 svg 아이콘에만 유효함)
- `size` css 스타일 크기 값을 받습니다. 예: `1rem`, `2em`, `100px` 등
::: window 예시
::: demo-wrapper 예시
입력:

View File

@@ -196,7 +196,7 @@ strategy = "merge" # 또는 "first" (기본값)
# 일요일 저녁에는 모든 만료 임박한 약물을 사용
[[tasks.variants]]
params = { medicine_expire_days = 2 }
params = { expiring_medicine = 1000 }
[tasks.variants.condition]
type = "And"

View File

@@ -16,7 +16,6 @@ MAA v5.22.3까지 지원하는 감지 가능한 에뮬레이터 및 연결 주
- LDPlayer 9: `emulator-5554/5556/5558/5560`, `127.0.0.1:5555/5557/5559/5561`
- 逍遥(Xiaoyao): `127.0.0.1:62001/59865`
- 夜神(Yeshen): `127.0.0.1:21503`
- 텐센트 앱스토어 (5.10.56.xx 이후): `127.0.0.1:5555`
감지에 실패하면 UAC 관리자 권한으로 MAA를 시작하여 다시 감지해보세요. 여전히 실패한다면 아래 수동 설정을 참고하고, 에뮬레이터와 연결 주소가 위 목록에 포함되어 있는지 확인하세요.
@@ -60,7 +59,6 @@ MAA 폴더에 직접 압축을 푸는 것을 권장합니다. 그러면 ADB 경
- [LDPlayer 9](https://help.ldmnq.com/docs/LD9adbserver#edc3863750608062bcb3feea256413dc) `emulator-5554`
- [逍遥(Xiaoyao)](https://bbs.xyaz.cn/forum.php?mod=viewthread&tid=365537) `21503`
- [夜神(Yeshen)](https://support.yeshen.com/zh-CN/qt/ml) `62001`
- [텐센트 앱스토어](https://sj.qq.com/faq/3878): ADB 포트는 `127.0.0.1:5555` 고정. ADB 경로 예시: `C:\Program Files\Tencent\Androws\Application\버전번호\adb.exe`.
기타 에뮬레이터는 [赵青青의 블로그](https://www.cnblogs.com/zhaoqingqing/p/15238464.html)를 참고하세요.

Some files were not shown because too many files have changed in this diff Show More