feat: 初步实现MacController (#4161)

添加新的触控方式,针对 macOS 平台原生运行的 iOS 版明日方舟客户端。

## 背景

macOS 上有一个叫做 [PlayCover](https://playcover.io) 的 iOS
游戏启动器的项目。它的原理是通过注入库([PlayTools](https://github.com/PlayCover/PlayTools))让应用绕过系统的运行环境检查。

## 实现

我们可以 [fork 一份
PlayTools](https://github.com/hguandl/PlayTools/tree/MaaTools),添加一个功能类似
adb 的本地 server,来实现截图和触控。我们可以称其为 MaaTools。

## 协议

当前的 MaaTools 基于 TCP 实现了以下协议:

- 握手:`MAA\x00` 作为最初的 4 个字节发送以尝试建立连接,如果成功会收到 `OKAY`,连接就此建立。
- 请求体:后续请求会先有2字节作为长度,然后发送请求内容。
- 截图请求:内容为 `SCRN`,返回 4 字节头作为长度,然后紧接着是 RGBA bitmap 内容。
- 分辨率请求:内容为 `SIZE`,返回各 2 字节长度的宽和高。
- 触控请求:内容为 `TUCH` + 1 字节触控类型 + 各 2 字节长度的 x 和 y,无返回。
- 关闭请求:内容为 `TERM`,关闭客户端,无返回。

## 合并

请 @aa889788 帮忙看看我对新 Controller 类的实现是否完全。iOS 不支持 ESC
按键,不知道除了不能暂停部署之外,会不会对 MAA 的其他功能造成影响。最后再让玛丽 @MistEO 把把关()
This commit is contained in:
MistEO
2023-04-05 16:47:54 +08:00
committed by GitHub
9 changed files with 347 additions and 1 deletions

View File

@@ -87,6 +87,10 @@ bool asst::Assistant::set_instance_option(InstanceOptionKey key, const std::stri
m_ctrler->set_touch_mode(TouchMode::Maatouch);
return true;
}
else if (constexpr std::string_view MacPlayTools = "MacPlayTools"; value == MacPlayTools) {
m_ctrler->set_touch_mode(TouchMode::MacPlayTools);
return true;
}
break;
case InstanceOptionKey::DeploymentWithPause:
if (constexpr std::string_view Enable = "1"; value == Enable) {