Commit Graph

18758 Commits

Author SHA1 Message Date
uye
ffd98e800e Release v6.9.0-beta.3 (#16397)
## Summary by Sourcery

改进战场技能就绪状态分类流水线与调试图像处理逻辑,并在无法获取主模块信息时,使 BlueStacks 模拟器的终止流程更加健壮。

Bug 修复:
- 修复技能就绪状态分类中的 ONNX 输入张量形状错误问题,该问题将宽度和高度的顺序颠倒使用。
- 确保对技能就绪调试保存状态的并发访问是同步的,以避免在运行多个分类器时出现数据竞争。
- 允许在无法获取进程主模块或其文件路径时,仍可通过基于端口的逻辑继续关闭 BlueStacks 模拟器。

增强改进:
- 调整战场技能就绪分类器中的图像缩放与归一化逻辑,使其更好地匹配通道布局和模型预期。
- 扩展技能就绪调试捕获能力,使低置信度预测和长时间运行的会话能够更可靠地被捕获。
- 为技能就绪引入集中式调试图像保存机制,对每个目录使用队列,并自动清理较旧文件,以限制保留图像的数量上限。

<details>
<summary>Original summary in English</summary>

## Summary by Sourcery

Improve battlefield skill readiness classification pipeline and debug
image handling, and make BlueStacks emulator termination more robust
when main module information is unavailable.

Bug Fixes:
- Fix incorrect ONNX input tensor shape for skill readiness
classification that used width/height in reversed order.
- Ensure concurrent access to skill readiness debug saving state is
synchronized to avoid data races when running multiple classifiers.
- Allow BlueStacks emulator shutdown to proceed via port-based logic
even when the process main module or its file path cannot be retrieved.

Enhancements:
- Adjust image resizing and normalization logic in the battlefield skill
readiness classifier to better match channel layout and model
expectations.
- Extend skill readiness debug capture so that low-confidence
predictions and long‑running sessions are captured more reliably.
- Introduce centralized debug image saving for skill readiness with
per-directory queues and automatic cleanup of older files to cap
retained images.

</details>
v6.9.0-beta.3
2026-05-01 13:01:22 +08:00
uye
d504e074ce docs: Update CHANGELOG for v6.9.0-beta.3 release 2026-05-01 12:58:05 +08:00
uye
c7d1fe686d fix: 修复小游戏列表中下拉框偶现无法展开的问题 2026-05-01 12:57:42 +08:00
Shawn Sun
cf30d71067 fix: 修复蓝叠模拟器关闭失败的问题 (#16388)
fix: 修复模拟器关闭失败的问题

优化 EmulatorHelper 逻辑并升级 MailKit 依赖

优化了 EmulatorHelper 的异常处理和分支逻辑,提升对不同 BlueStacks 版本的识别与日志记录。将 MailKit 包从 4.15.1 升级至 4.16.0。
2026-05-01 12:43:30 +08:00
Copilot
2216175e5c feat: 适配七周年许愿墙 2026-05-01 12:24:29 +08:00
uye
a91286f41d perf: 大幅提升技能就绪识别准确率,优化技能截图保存策略 (#16393)
* feat: 技能截图默认保存 50 张,如存在 DEBUG_skill_ready.txt 时无限存储

* feat: maa 迎来大变

* fix: 修复技能截图保存的目录处理与并发安全

* perf: 写文件在锁外执行,init 在锁内执行
2026-05-01 12:14:12 +08:00
HX3N
2061050857 chore: YostarKR MiniGame SPA (#16364)
* i18n: kr

* chore: placeholder

* chore: template

* chore: remove GiveUp.png
alpha/v6.9.0-beta.2.d003.g2061050857
2026-04-30 13:40:16 +02:00
Rememorio
a20351fcf1 fix: lower YoStarJP office mini threshold (#16390)
Made-with: Cursor
2026-04-30 16:25:04 +08:00
github-actions[bot]
84152a88f3 chore: Auto update by pre-commit hooks
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/25134605560
[skip changelog]
alpha/v6.9.0-beta.2.d001.g84152a88f3
2026-04-29 21:24:20 +00:00
uye
9adf423aa4 Release v6.9.0-beta.2 (#16378)
## Summary by Sourcery

没有任何实际的代码或配置更改;此发布提交仅触及 `tasks.json` 资源文件,但未更改其内容。

<details>
<summary>Original summary in English</summary>

## Summary by Sourcery

No effective code or configuration changes; this release commit only
touches the tasks.json resource file without altering its contents.

</details>
v6.9.0-beta.2
2026-04-30 00:30:15 +08:00
uye
426c964e59 docs: Add v6.9.0-beta.2 to CHANGELOG 2026-04-30 00:29:26 +08:00
uye
b1659e0a70 fix: 升级结算时闪退 2026-04-30 00:22:12 +08:00
uye
ef614156d0 Release v6.9.0-beta.1 (#16373)
## Summary by Sourcery

为更新程序提供更丰富的用户体验,改进连接与控制器行为,支持更多模拟器和客户端配置,并进行多项稳定性与文档更新。

New Features:
- 为外部更新程序新增 Windows 进度 UI,支持深色模式,包含双语状态文本和失败提示。
- 为更新程序新增可选的控制台输出,以及一个面向用户的设置,用于在委托更新时显示更新器控制台。
- 允许二次启动 MAA 时,通过命名事件激活已有实例窗口,而不是启动重复进程。
- 通过新的客户端类型实例选项支持解析客户端特定的 Android 包名,并从 WPF 前端一路接入核心控制器。
- 新增对腾讯安桌(Tencent Androws)模拟器的检测与配置支持,包括 ADB 路径自动发现以及所有支持语言的文档更新。
- 在关卡掉落识别与 UI 日志中暴露剿灭(Annihilation)每周进度和基于合成玉(orundum)的停止条件。

Bug Fixes:
- 修复 OCR 包标签路径比较问题,确保在加载模型时可以正确拾取已有的识别标签文件。
- 通过检查选项值而非选项数量,修正肉鸽遭遇回调校验逻辑。
- 通过以干员名称而非格子位置作为键,防止错误复用上一次技能时间戳。
- 确保 Minitouch 使用当前连接上下文(包括事件 ID 和显示 ID),而不是在本地重建 ADB 状态。
- 正确处理理智上限提升至新最大值的情况,避免将合法数值误判为超出范围。
- 避免在 C API 封装中在销毁阶段对同一个 AsstHandle 指针进行二次销毁。
- 通过使用解析后的坐标而不是逻辑点对象,修复 PlayTools 的滑动起点。
- 确保在识别标签路径更新时,只在标签文件真正变化时才重置 OCR 识别器。
- 仅在找到匹配任务时才更新最后任务名,保持进程任务状态一致性。

Enhancements:
- 改进更新程序日志,可选镜像输出到控制台,提供更结构化的消息以及双语控制台提示。
- 新增无模式、跟随主题的更新进度窗口,支持逐文件进度和高层状态阶段,并集成到更新流程中。
- 收紧多实例处理逻辑,引入哈希化的单实例键,并在退出时清理激活监听资源。
- 扩展 ADB 连接上下文,缓存配置、显示 ID、输入事件 ID 以及 netcat 地址/端口,以便在各控制器中复用。
- 为 Win32Controller 实现优雅的 stop_game:先发送 WM_CLOSE,如有需要再回退到进程终止。
- 优化后置动作行为,使 AttachWindow 模式在禁用不支持的 Android 端动作的同时保持 PC 端选项一致。
- 改进剿灭奖励处理逻辑,要求必定掉落合成玉后才继续,并在回调中暴露每周进度。
- 调整 copilot schema 文档和 minimum_required 版本说明,明确动作类型的语言支持情况。
- 更新多项任务与资源定义,包括 UI 主题任务布局、战斗数据、格子位置以及小游戏任务。
- 改进调试工具,将生成的 UI 主题图片重定向到正确的模板子目录中。

Build:
- 将更新程序链接到额外的 Windows 库(`comctl32`、`advapi32`、`dwmapi`),以支持新的进度 UI
和主题检测。

CI:
- 将 macOS 签名与配置相关的 GitHub Actions 升级到较新的主版本,用于发布构建。

Documentation:
- 在所有支持语言中补充腾讯应用商店 / 安桌模拟器的支持说明、连接细节与 ADB 配置文档。
- 明确 copilot schema JSON 的使用方式、版本策略以及动作类型的语言限制。
- 整理 GitHub issue 模板,移除过时占位内容,并明确日志上传说明。

Chores:
- 更新物品、任务、版本和格子位置等资源 JSON 文件,以匹配最新的游戏内容和 UI 主题。

<details>
<summary>Original summary in English</summary>

## Summary by Sourcery

Add richer updater UX, improved connection and controller behavior,
support for additional emulator and client configurations, and various
stability and documentation updates.

New Features:
- Introduce a Windows progress UI with dark mode support for the
external updater, including bilingual status text and failure prompts.
- Add optional console output for the updater and a user-facing setting
to show the updater console during delegated updates.
- Allow secondary MAA launches to activate the existing instance window
instead of starting a duplicate process via a named event.
- Support resolving client-specific Android package names via a new
client type instance option wired from the WPF front-end into the core
controller.
- Add detection and configuration support for Tencent Androws emulator,
including ADB path discovery and documentation updates for all supported
languages.
- Expose annihilation weekly progress and orundum-based stop conditions
in stage drop recognition and UI logging.

Bug Fixes:
- Fix OCR pack label path comparison so that existing recognition label
files are correctly picked up when loading models.
- Correct roguelike encounter callback validation by checking the choice
value instead of the option count.
- Prevent incorrect reuse of last-skill timestamps by keying battlefield
cooldowns by operator name rather than tile location.
- Ensure Minitouch uses the current connection context (including event
and display IDs) instead of a locally reconstructed ADB state.
- Handle sanity cap increases up to the new maximum to avoid
misclassifying valid values as out-of-range.
- Avoid destroying an AsstHandle pointer twice on teardown in the C API
wrapper.
- Fix PlayTools swipe starting point by using the resolved coordinates
instead of the logical point object.
- Ensure recognition label path updates only reset the OCR recognizer
when the label file actually changes.
- Keep process task state consistent by only updating last task names
when a match is found.

Enhancements:
- Improve updater logging to optionally mirror to the console with
better structured messages and bilingual console prompts.
- Add a modeless, theme-aware updater progress window with per-file
progress and high-level status phases, integrated into the update flow.
- Tighten multiple-instance handling by introducing a hashed
single-instance key and cleaning up activation listener resources on
exit.
- Extend ADB connection context to cache configuration, display ID,
input event ID, and netcat address/port for reuse across controllers.
- Implement graceful stop_game for Win32Controller by sending WM_CLOSE
and falling back to process termination if needed.
- Refine post-action behavior so AttachWindow mode disables unsupported
Android-side actions while keeping PC-side options consistent.
- Improve annihilation reward handling by requiring orundum drops before
continuing and exposing weekly process in callbacks.
- Adjust copilot schema docs and minimum_required version guidance,
clarifying language support for action types.
- Update various task and resource definitions, including UI theme task
layouts, battle data, tile positions, and mini-game tasks.
- Improve debug tooling by redirecting generated UI theme images into
the correct template subdirectory.

Build:
- Link the updater against additional Windows libraries (comctl32,
advapi32, dwmapi) required for the new progress UI and theme detection.

CI:
- Bump macOS signing and provisioning GitHub Actions to newer major
versions for release builds.

Documentation:
- Document Tencent App Store/Androws emulator support, connection
details, and ADB configuration across all supported languages.
- Clarify copilot schema JSON usage, versioning, and language
constraints for action types.
- Tidy GitHub issue templates by removing outdated placeholders and
clarifying log upload instructions.

Chores:
- Update resource JSON files for items, tasks, versions, and tile
positions to match the latest game content and UI themes.

</details>
v6.9.0-beta.1
2026-04-29 22:03:25 +08:00
github-actions[bot]
d56ecf73b9 docs: Auto Update Changelogs of v6.9.0-beta.1 (#16374)
* docs: Auto Generate Changelog of Release v6.9.0-beta.1

* docs: Update CHANGELOG for v6.9.0-beta.1

Updated changelog for version 6.9.0-beta.1 with new features, improvements, fixes, and documentation updates.

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2026-04-29 21:58:01 +08:00
uye
b4429c4b6f feat: 重复启动时通过跨进程事件激活主窗口而非弹窗警告 (#16363)
* feat: 重复启动时通过跨进程事件激活主窗口而非弹窗警告

* perf: GetSingleInstanceKey 改用路径哈希
2026-04-29 21:33:08 +08:00
github-actions[bot]
719d04f53d chore: Auto Templates Optimization
Triggered by 5f2d547998

[skip changelog]
2026-04-29 13:22:47 +00:00
Manicsteiner
5f2d547998 chore: YostarJP MiniGame SPA (#16372) 2026-04-29 21:22:22 +08:00
Roland125
e9d8f6a844 fix: 修复剿灭后出现升级界面,导致无法继续任务的问题(#16255) (#16370) 2026-04-29 21:20:35 +08:00
status102
4215a05371 perf: 合并简化任务状态 2026-04-29 19:44:22 +08:00
github-actions[bot]
dd7ec5cd20 chore: Auto update by pre-commit hooks
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/25078413821
[skip changelog]
alpha/v6.8.1-alpha.1.d033.gdd7ec5cd20
2026-04-28 21:24:51 +00:00
uye
a62258f74e feat: 在关卡没解锁代理/剿灭没使用全权代理时报错停止 (#16357)
* feat: 在关卡没解锁代理/剿灭没使用全权代理时报错停止

* chore: 添加最大循环次数
2026-04-28 23:45:24 +08:00
github-actions[bot]
de4476b545 chore: Auto Templates Optimization
Triggered by e6b3223e29

[skip changelog]
2026-04-28 12:13:55 +00:00
Roland125
e6b3223e29 feat: 增加 保存代理指挥记录 支持; 新增合成玉掉落检查, 0掉落结束 (#16356)
* fix: 增加在剿灭代理记录更新界面,点击确认按钮的任务和图片资源
fix: 增加剿灭模式下,对合成玉的掉落检测。不掉落合成玉时,结束战斗任务

* perf: 使用代理卡时不会更新记录

Co-authored-by: Status102 <102887808+status102@users.noreply.github.com>

---------

Co-authored-by: Status102 <102887808+status102@users.noreply.github.com>
2026-04-28 20:12:41 +08:00
github-actions[bot]
be77d7b1bc chore: Auto Update Game Resources - 2026-04-28
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/25046601559

[skip changelog]
2026-04-28 10:04:06 +00:00
status102
34d1f8413a feat(wpf): 掉落物识别额外输出剿灭进度 2026-04-28 14:05:15 +08:00
status102
04a793e6ce rft: ProcessTask匹配命中状态更新统一化 2026-04-28 13:35:50 +08:00
status102
5619aefa10 fix: 干员使用技能间隔未能生效 2026-04-28 13:22:12 +08:00
github-actions[bot]
d2ee76d2f6 chore: Auto update by pre-commit hooks
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/25020210469
[skip changelog]
alpha/v6.8.1-alpha.1.d025.gd2ee76d2f6
2026-04-27 21:23:04 +00:00
uye
8f1b7fd087 feat: 新增 get_last_matched_task_name 方法;成功命中新节点时与 get_last_task_name 一致,在进入下一轮匹配后若未再命中新节点时,仍保留最近一次成功命中的任务名,避免误取空值 2026-04-28 00:49:06 +08:00
uye
ea22cbab4a chore: 支持打包日志文件后 GitHub 上传日志不再需要先关闭 MAA 2026-04-27 22:37:34 +08:00
dependabot[bot]
f733530b67 ci: bump the github-actions group in /.github/workflows with 2 updates (#16344)
Bumps the github-actions group in /.github/workflows with 2 updates: [apple-actions/import-codesign-certs](https://github.com/apple-actions/import-codesign-certs) and [apple-actions/download-provisioning-profiles](https://github.com/apple-actions/download-provisioning-profiles).


Updates `apple-actions/import-codesign-certs` from 6 to 7
- [Release notes](https://github.com/apple-actions/import-codesign-certs/releases)
- [Commits](https://github.com/apple-actions/import-codesign-certs/compare/v6...v7)

Updates `apple-actions/download-provisioning-profiles` from 5 to 6
- [Release notes](https://github.com/apple-actions/download-provisioning-profiles/releases)
- [Commits](https://github.com/apple-actions/download-provisioning-profiles/compare/v5...v6)

---
updated-dependencies:
- dependency-name: apple-actions/import-codesign-certs
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: apple-actions/download-provisioning-profiles
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-27 15:12:47 +08:00
github-actions[bot]
33885b1294 chore: Auto update by pre-commit hooks
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/24967148430
[skip changelog]
alpha/v6.8.1-alpha.1.d021.g33885b1294
2026-04-26 21:12:26 +00:00
uye
893793efff chore: 调整完整后 无其他 MAA 选项绑定逻辑,不再强制勾选退出模拟器 2026-04-27 02:02:13 +08:00
status102
8161976869 fix: 干员仓储识别手动指定术兔
临时修复
2026-04-27 01:37:56 +08:00
Jin Zhaonian
60cbc68e59 fear: PC 端支持 完成后退出明日方舟 (#16351)
* fix: 修复pc端任务完成后勾选自动关闭游戏但无法关闭的问题

* fix: IsWindow检查与WM_CLOSE关闭

Co-authored-by: Copilot <copilot@github.com>

---------

Co-authored-by: Copilot <copilot@github.com>
2026-04-27 01:36:19 +08:00
uye
b65b37fba8 chore: 调整选项 IsEnabled 2026-04-27 01:35:10 +08:00
Alex Gu
7d3f8bfa2d fix: 若干正确性问题修正(null check / race / clamp / retry 等 9 处) (#16332)
## 概述

代码 review 发现的一批正确性问题批量修正,都是 `src/MaaCore` 下单行 / 局部 logic 级别的
bug,彼此独立,按严重度从高到低逐条 commit。没有功能改动、没有 API 变化、没有 breaking behavior。

每个 commit 单独对应一条 bug,便于逐条 review 或按需
revert。下表也按严重度从高到低排序,附上「原问题」与「修法理由」。

### 发现来源

使用 Claude Code 新版 `/ultrareview` 多 agent review 扫了 `src/MaaCore` 源码(~58k
行),人工逐条核对后提 PR。另有 2 条(AvatarCacheManager 并发保护 / CopilotConfig
默认值语义)涉及设计决策或 breaking change,已单独提 issue 讨论,不在本 PR 内。

---

## Fix 列表(按严重度排序)

### 1. `Controller::back_to_home` 空指针解引用崩溃 — HIGH

**位置**:`src/MaaCore/Controller/Controller.cpp:137`

**原问题**:
```cpp
bool asst::Controller::back_to_home()
{
    m_controller->back_to_home();   // 无 null 检查
    return true;
}
```
未连接设备时 `m_controller == nullptr`,此处直接 segfault。同文件 `sync_params` /
`start_game` / `stop_game` / `click` 等所有公开方法都有 null 保护(前者用 `if
(!m_controller) return`,后者用 `CHECK_EXIST(m_controller, false)` 宏),**只有
`back_to_home` 漏了**。

**触发路径**:任务运行中 ADB 断连使 `m_controller` 被 reset 成 null → 调度走到"回主页"分支 → 崩溃。

**修法**:函数开头加 `CHECK_EXIST(m_controller,
false);`,与同文件其他方法保持一致。最小改动,零行为变化(未连接时 `back_to_home` 返回 `false` 而不是崩溃)。

---

### 2. `MumuExtras::screencap` reload 之后没有真正重试 — MEDIUM-HIGH

**位置**:`src/MaaCore/Controller/MumuExtras.cpp:54-83`

**原问题**:
```cpp
int ret = capture_display_func_(...);       // 第一次 capture
if (ret) {
    // Try reloading once before giving up.
    if (!reload()) { ... return std::nullopt; }
    if (ret) {                              // ← 检查的是同一个 ret,不是重试之后的
        LogError << "Failed to capture display, but reload before retrying capture was successful." ...;
        return std::nullopt;
    }
}
```
注释承诺"失败时 reload 后重试 capture",但第二个 `if (ret)` 检查的还是第一次调用写入的
`ret`,`capture_display_func_` **从未被重新调用过**。reload 成功或失败都必然返回
`std::nullopt`,注释里的"reload before retrying capture was
successful"日志其实**只是字面,retry 压根没发生**。

**后果**:MuMu 模拟器短暂 capture 失败(内存抖动 / 显示切换)时,原本 reload
应能恢复,但代码从不真正重试,上层看到的永远是「截图失败」。

**修法**:在两个 `if (ret)` 之间加上**真正的**重试:重新调用 `capture_display_func_` 并更新
`ret`。reload 可能改变设备状态,所以 `display_id` 也重新 `get_display_id()`
取一次。失败信息相应改为"Failed to capture display even after reload",语义准确。

---

### 3. `Controller` 中 `d_size` 被 `const static` 固化,分辨率变化后缩放错误 — MEDIUM

**位置**:`src/MaaCore/Controller/Controller.cpp:146` 和 `:438`(两处)

**原问题**:
```cpp
const static cv::Size d_size(m_scale_size.first, m_scale_size.second);
```
C++ 函数内 `static` 局部变量的初始化表达式**仅在第一次进入该函数时执行一次**。首次调用时 `m_scale_size`
的值被固化到 `d_size`,之后用户切换模拟器、改分辨率预设、连接新设备等导致 `m_scale_size` 变化时,**`d_size`
不会更新**。

**后果**:
- `cv::resize(..., d_size, ...)` 把图缩到错误的目标尺寸 → OCR / 模板匹配的坐标/尺寸都错
- 截图失败兜底路径 `m_cache_image = cv::Mat(d_size, CV_8UC3)` 也分配错误尺寸的空图
- 用户看到各种"识别不到 / 坐标偏移"但不崩溃,**只能通过重启 MaaCore 恢复**

**修法**:去掉 `static`,每次调用重新构造。`cv::Size` 就是两个
`int`,栈上构造基本无开销,不存在性能回归。两处都修。

---

### 4. `PlayToolsController::swipe` 起点钳制没有应用到 `toucher_down` —
MEDIUM-LOW

**位置**:`src/MaaCore/Controller/PlayToolsController.cpp:230`

**原问题**:
```cpp
int x1 = p1.x, y1 = p1.y;                          // 拷贝到局部变量
// ...
if (x1 < 0 || x1 >= width || y1 < 0 || y1 >= height) {
    x1 = std::clamp(x1, 0, width - 1);             // 只钳制了局部 x1/y1
    y1 = std::clamp(y1, 0, height - 1);
}
// ...
toucher_down(p1);                                  // ← 仍用原始的 const Point& p1
```
注释"起点不能在屏幕外,但是终点可以"已经说明了钳制意图,但钳制结果只存在局部 `x1/y1`,`toucher_down(p1)`
使用的还是未钳制的原始 `p1`。后续 `progressive_move` 用 `x1/y1` 所以中段 swipe 在屏幕内,**但首个
touch-down 事件发到屏幕外坐标**,iOS PlayTools 侧多半会被丢弃或忽略 → 整个手势无效。

**修法**:`toucher_down(p1)` → `toucher_down({ x1, y1 })`,用已钳制的坐标构造临时
`Point`。与同文件下方 `toucher_move({ x, y })` 的风格一致。

---

### 5. `Assistant::m_task_id` 非原子 static 导致跨实例数据竞争 — MEDIUM-LOW

**位置**:`src/MaaCore/Assistant.h:214`(声明)+
`src/MaaCore/Assistant.cpp:295-296`(使用)

**原问题**:
```cpp
// Assistant.h
inline static TaskId m_task_id = 0;                     // 进程级 static,非 atomic
mutable std::mutex m_mutex;                             // 实例级 mutex
inline static std::atomic<AsyncCallId> m_call_id = 0;   // 旁证:同文件另一个 static 是 atomic

// Assistant.cpp:295
std::unique_lock<std::mutex> lock(m_mutex);             // 锁的是当前实例的 mutex
int task_id = ++m_task_id;                              // 改的是进程共享的 static
```
`m_task_id` 是 static(**所有 Assistant 实例共享一个内存地址**),但 `m_mutex`
是每个实例各自的锁。两个不同实例并发 `++m_task_id` 时,各自 lock 各自的 mutex,彼此不互斥 ——
**数据竞争**,`++` 对非原子 `int` 是 RMW 三步,可能让两个实例拿到同一个 `task_id`。

单实例客户端(MaaWpfGui、MaaMacGui)触发不了;多实例 + 并发下任务的客户端(命令行批处理 / 自动化测试)会偶现任务 id
冲突,后续 `AsstSetTaskParams` / `AsstStop` 可能误中另一个实例的任务。

旁证:同文件 line 227 的另一个同类 static `m_call_id` 已经声明成
`std::atomic<AsyncCallId>`,一致性也对不上,显然是作者漏改。

**修法**:`TaskId m_task_id` → `std::atomic<TaskId>
m_task_id`。`++m_task_id` 靠 `std::atomic::operator++` 原子化,语法不变。`m_mutex`
原先是为紧跟的 `m_tasks_list.emplace_back` 服务的,继续保留。

---

### 6. `OcrPack::load` 复制粘贴导致 `rec_label` 变化检测用错字段 — LOW-MEDIUM

**位置**:`src/MaaCore/Config/Miscellaneous/OcrPack.cpp:61`

**原问题**:
```cpp
// 前两块都正确:当前保存路径 != 新路径 时才更新
if (exists(det_model_file) && m_det_model_path != det_model_file) { ... }
if (exists(rec_model_file) && m_rec_model_path != rec_model_file) { ... }
// 第三块:应该检查 m_rec_label_path,却写成了 m_rec_model_path
if (exists(rec_label_file) && m_rec_model_path != rec_label_file) {
    m_rec_label_path = rec_label_file;
    m_rec = nullptr;
}
```
模型路径以 `.onnx` 结尾,标签路径以 `.txt` 结尾,`m_rec_model_path != rec_label_file`
**恒为真**(只要标签文件存在)。结果每次调用 `load()` 都会:
- 无效地重新给 `m_rec_label_path` 赋同样的值
- 把 `m_rec` 置空 → 触发下一次 OCR 时 lazy 重载

不会导致正确性崩塌(`check_and_load` 路径会 lazy 重建
`m_rec`),但"路径没变则保留缓存"的设计目的完全失败,且多次 `load()` 会产生不必要的模型重载开销。

**修法**:`m_rec_model_path != rec_label_file` → `m_rec_label_path !=
rec_label_file`,与上面 `det` / `rec_model` 两块的模式对齐。

---

### 7. `RoguelikeStageEncounterConfig` `fallback_choices` 校验写错变量 — LOW


**位置**:`src/MaaCore/Config/Roguelike/RoguelikeStageEncounterConfig.cpp:77`

**原问题**:
```cpp
int option_num = pair_arr[0].as_integer();
if (option_num < 0) { ... return false; }               // 校验 option_num,OK
int choice = pair_arr[1].as_integer();
if (option_num < 0) {                                   // ← 重复检查 option_num
    Log.error(
        std::format(
            "RoguelikeEncounterConfig | callback choice for event {} with {} option(s) is less than zero",
            ...));
    return false;
}
```
错误信息本身已经说明是在校验 `choice`("callback choice ... is less than
zero"),但实际比较的是上面已经保证过非负的 `option_num`,这个 `if` 永远进不去。

**后果**:坏 JSON 中 `[3, -5]` 这类负数 `choice` 能被静默接受,后续
`static_cast<size_t>(-5)` 产生巨大无符号数,作为索引使用时 UB。正常配置不触发,但这条防御校验已名存实亡。

**修法**:第二个 `if` 判断变量改为 `choice`。错误消息中 `option_num` 作为上下文保留(用于打印 option
数量,语义正确)。

---

### 8. `AsstDestroy` 对值传入的形参赋 `nullptr` 是死代码 — TRIVIAL

**位置**:`src/MaaCore/AsstCaller.cpp:98`

**原问题**:
```cpp
void AsstDestroy(AsstHandle handle)
{
    if (handle == nullptr) return;
    delete handle;
    handle = nullptr;       // ← 改的是局部拷贝,对调用方的变量无影响
}
```
`AsstHandle` 按值传入,`handle = nullptr` 只修改本函数作用域的局部拷贝。`delete handle`
已正确销毁对象,这行既没有替调用方置空(要做到需接受 `AsstHandle*`),也不会影响 delete 行为,纯死代码。

**修法**:删掉这行,保持 `delete` 行为不变,避免给读者错误印象。

---

### 9. `AvatarCacheManager.h` 开头两行重复的 `#pragma once` — TRIVIAL

**位置**:`src/MaaCore/Config/Miscellaneous/AvatarCacheManager.h:1-3`

**原问题**:
```cpp
#pragma once

#pragma once        // ← 重复
#include "Config/AbstractResource.h"
```
pragma once 幂等,没有功能影响,但看起来是编辑时的残留。清理即可。

---

## Test plan

- [x] `git diff dev-v2..HEAD --stat`:8 文件 / +18/-11,只有目标修改,无无关改动
- [x] 每条 fix 都有对应的单独 commit,便于逐条 review 或按需 revert
- [x] **本地 macOS arm64 build 通过**:`cmake --preset macos-arm64 && cmake
--build build --config Release` → 203/203 targets 编译链接成功,0 error,修改的 8
个文件 0 warning(全局唯一 1 条 warning 是 `MaaUtils/Logger.cpp` 的 `#pragma
message` 版本信息打印,与本 PR 无关)
- [ ] 单元测试:macOS preset 默认没有编译 test target(`unit_test/MaaCore/` 下仅 1 个
`AlgorithmTest.cpp`,与本 PR 改动的函数无交集),本地 `ctest` 返回 "No tests were
found"。依赖上游 CI 完整矩阵(Linux / Windows / macOS + 各自测试)验证。

## Notes for reviewers

- 每条 fix 的 commit message 都附了原理说明,结合 PR 正文对应条目阅读
- **没有功能性增加**,也**不动任何 public API / ABI**
- 不涉及 resource / JSON 数据文件
- 合并之后建议开一个跟进 issue 讨论 ultrareview 的另外两条 finding(AvatarCacheManager
并发保护、CopilotConfig 默认值语义)—— 这两条需要设计决策,不适合塞进本 PR

---

_PR 发现来源:Claude Code `/ultrareview` 多 agent 扫描后人工复核。_

## Summary by Sourcery

在不改变公共 API 或行为的前提下,修复了控制器、OCR、肉鸽配置以及工具组件中的多处正确性问题。

Bug 修复:
- 在 `Controller::back_to_home` 中增加空指针检查,以防在底层控制器不可用时发生崩溃。
- 确保 `MumuExtras::screencap` 在成功重新加载后确实会重试屏幕捕获,并且能准确记录失败日志。
- 在 Controller 中为缩放后的图像尺寸使用非静态的 `cv::Size`,以便在无需重启的情况下正确响应分辨率变化。
- 对传递给 `PlayTools toucher_down` 的滑动起始点进行限制,确保初始触控事件始终在屏幕范围内。
- 将 Assistant 的进程级任务 ID 计数器改为原子类型,避免在多实例场景下产生数据竞争。
- 修正 `OcrPack` 标签路径变更检测逻辑,使 OCR 模型只在标签文件实际变更时才会重新加载。
- 修复 `RoguelikeStageEncounterConfig` 的回退选项校验逻辑,按预期拒绝负数选项。
- 移除 `AsstDestroy` 中无效的句柄重置代码,该代码试图将值传递参数置空但实际上无效。
- 移除 `AvatarCacheManager.h` 中多余的 `#pragma once`,以清理头文件。

<details>
<summary>Original summary in English</summary>

## Summary by Sourcery

Fix multiple correctness issues across controller, OCR, roguelike
config, and utility components without changing public APIs or
behaviors.

Bug Fixes:
- Add a null check in Controller::back_to_home to prevent crashes when
the underlying controller is unavailable.
- Ensure MumuExtras::screencap actually retries display capture after a
successful reload and logs failures accurately.
- Use a non-static cv::Size for scaled image dimensions in Controller so
resolution changes are respected without restart.
- Clamp the swipe starting point passed to PlayTools toucher_down to
keep initial touch events within screen bounds.
- Make Assistant's process-wide task ID counter atomic to avoid data
races across instances.
- Correct OcrPack label path change detection so OCR models are only
reloaded when the label file actually changes.
- Fix RoguelikeStageEncounterConfig fallback choice validation to reject
negative choices as intended.
- Remove ineffective handle reset code in AsstDestroy that tried to null
a by-value parameter.
- Remove a redundant #pragma once in AvatarCacheManager.h to clean up
the header.

</details>
2026-04-27 00:46:12 +08:00
SherkeyXD
4a77baba13 feat: 适配界面主题「重构」 (#16349)
* feat: 界面主题「重构」预载

* fix: 修复小工具 updater 路径错误
2026-04-27 00:45:09 +08:00
uye
b9fca6f03d chore: 连接方式使用 PC 端时禁用不支持的完成后操作 2026-04-27 00:32:13 +08:00
srdr0p
1b1bc15aca feat: 支持腾讯应用宝 5.10.56.xx (#16292)
* feat(connection): 新增腾讯应用宝模拟器支持

在 WinAdapter 和 config.json 中添加应用宝(Androws)模拟器入口。
本次仅支持 ADB Input 方式和官方渠道。

同步更新各语言连接文档(zh/en/ja/ko/tw)及 UI 本地化字符串。

* feat(controller): 为腾讯应用宝新增多渠道与 Minitouch 支持

应用宝的应用与 DisplayId 绑定,需在 connect() 前确定包名。
新增 InstanceOptionKey::ClientType (= 6),经由
AsstSetInstanceOption -> Assistant::set_instance_option
-> Controller::set_client_type 传递渠道信息;
AdbController::connect 在建立连接时通过 ctrler()->get_client_type()
读取并写入 AdbConnectionContext,用于替换命令模板中的 [PackageName]。

引入 AdbConnectionContext 保存 ADB 连接信息供 Minitouch 使用,
并通过 eventId 标识所绑定的输入设备。
2026-04-26 23:48:24 +08:00
status102
54f07fc3ad perf(wpf): 优化1星词条选项操作描述 2026-04-26 12:59:09 +08:00
github-actions[bot]
ce9fc40ef5 chore: Auto update by pre-commit hooks
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/24940764290
[skip changelog]
alpha/v6.8.1-alpha.1.d011.gce9fc40ef5
2026-04-25 21:12:38 +00:00
晓丶梦丶仁
fa5929a5f5 feat: 争锋频道 绿藤城 (#16345)
* feat: 争锋频道 绿藤城

* i18n: jp kr

* fix: key
2026-04-25 23:53:09 +08:00
status102
adcf581ab3 fix: 干员仓储识别未跳过数据查找失败的干员 2026-04-25 23:17:06 +08:00
SherkeyXD
7567ca7950 chore: 周年月卡文本更新 2026-04-25 23:12:09 +08:00
github-actions[bot]
83ce081ac5 chore: Auto Update Game Resources - 2026-04-25
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/24932890662

[skip changelog]
2026-04-25 14:18:43 +00:00
Constrat
d6cdfc6c77 fix: EN IS6 trail regex 2026-04-25 15:27:15 +02:00
status102
b0f46de1e6 perf: 理智上限增加到210 2026-04-25 20:47:49 +08:00
SherkeyXD
a1064f7c21 fix: 月度小队不再隐藏分队选择 2026-04-25 18:10:04 +08:00
uye
ac3b986d7a feat: updater 支持暗色模式 alpha/v6.8.1-alpha.1.d003.gac3b986d7a 2026-04-25 05:51:09 +08:00