diff --git a/README.md b/README.md index 8586e53fc8..3f2b6a4d76 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,11 @@ MAA 的意思是 MAA Assistant Arknights 话不多说,看图! -![image](https://user-images.githubusercontent.com/18511905/148376809-a80537b7-5e97-4978-959e-afada28c03c3.png) -![image](https://user-images.githubusercontent.com/18511905/152695664-382dc0cd-de6c-4012-890f-456f697e8724.png) +![image](https://user-images.githubusercontent.com/99072975/172044929-3aae01a1-6c6d-4a9a-a7a8-ae753679b9ce.png) +![image](https://user-images.githubusercontent.com/99072975/172045492-698ab7fd-0413-4b08-aad7-0176f9480c05.png) +![image](https://user-images.githubusercontent.com/99072975/172045163-e9ead337-eb62-4f9f-a354-9e302f767a52.png) + + ## 下载地址 diff --git a/docs/模拟器支持.md b/docs/模拟器支持.md index de579da4df..d31a110d68 100644 --- a/docs/模拟器支持.md +++ b/docs/模拟器支持.md @@ -59,9 +59,13 @@ 勉强支持。 -- 需要使用 [自定义连接](#自定义连接) 的方式来连接,尝试连接配置选择 `WSA 旧版本` 或 `通用配置` -- 由于本软件仅对 720p 以上 `16:9` 分辨率支持较好,WSA 无法修改分辨率,所以请手动拖动窗口大小,尽量贴近 16:9 比例(如果你的显示器是 16:9 的,可以直接全屏) -- 但是! WSA 的截图经常莫名其妙截出来一个白屏,导致识别异常,还是不推荐使用 +- 2204或更高版本(版本号在子系统设置的`关于`页面中): + - 需要使用 [自定义连接](#自定义连接) 的方式来连接,连接配置选择`通用配置`。 + - 需将明日方舟游戏全屏运行(在明日方舟游戏界面上按`F11`),且辅助运行过程中请尽量保证明日方舟在前台且无其他安卓应用同时在前台运行,否则可能导致游戏暂停运行或辅助识别错误。 +- 2203或更老版本(版本号在子系统设置页面的上方): + - 连接配置选择`WSA旧版本`。 + - 由于本软件仅对 720p 以上 `16:9` 分辨率支持较好,旧版本 WSA 无法修改分辨率,所以请手动拖动窗口大小,尽量贴近 16:9 比例(如果你的显示器是 16:9 的,可以直接全屏)。 +- WSA 的截图经常莫名其妙截出来一个白屏,导致识别异常,还是不推荐使用 ### AVD diff --git a/resource/config.json b/resource/config.json index 757d9b1d59..b189652954 100644 --- a/resource/config.json +++ b/resource/config.json @@ -18,6 +18,10 @@ "cmdFormat_Doc": "命令格式,想打印详细信息可以尝试添加 -v -i" } }, + "intent": { + "Official": "com.hypergryph.arknights/com.u8.sdk.U8UnityContext", + "Bilibili": "com.hypergryph.arknights.bilibili/com.u8.sdk.U8UnityContext" + }, "connection": { "General": { "devices": "[Adb] devices", @@ -30,10 +34,10 @@ "displayFormat": " init=%dx%d", "screencapRawByNC": "[Adb] -s [AdbSerial] exec-out \"screencap | nc -w 3 [NcAddress] [NcPort]\"", "ncPort": 6723, - "ncPortReverse": "[Adb] -s [AdbSerial] reverse tcp:[NcPort] tcp:[NcPort]", "screencapRawWithGzip": "[Adb] -s [AdbSerial] exec-out \"screencap | gzip -1\"", "screencapEncode": "[Adb] -s [AdbSerial] exec-out screencap -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [AdbSerial] shell am start -n [Intent]" }, "BlueStacks": { "devices": "[Adb] devices", @@ -46,10 +50,10 @@ "displayFormat": "cur=%dx%d", "screencapRawByNC": "[Adb] -s [AdbSerial] exec-out \"screencap | nc -w 3 [NcAddress] [NcPort]\"", "ncPort": 6723, - "ncPortReverse": "[Adb] -s [AdbSerial] reverse tcp:[NcPort] tcp:[NcPort]", "screencapRawWithGzip": "[Adb] -s [AdbSerial] exec-out \"screencap | gzip -1\"", "screencapEncode": "[Adb] -s [AdbSerial] exec-out screencap -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [AdbSerial] shell am start -n [Intent]" }, "MuMuEmulator": { "devices": "[Adb] devices", @@ -62,10 +66,10 @@ "displayFormat": "cur=%dx%d", "screencapRawByNC": "[Adb] -s [AdbSerial] exec-out \"screencap | nc -w 3 [NcAddress] [NcPort]\"", "ncPort": 6723, - "ncPortReverse": "[Adb] -s [AdbSerial] reverse tcp:[NcPort] tcp:[NcPort]", "screencapRawWithGzip": "[Adb] -s [AdbSerial] exec-out \"screencap | gzip -1\"", "screencapEncode": "[Adb] -s [AdbSerial] exec-out screencap -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [AdbSerial] shell am start -n [Intent]" }, "LDPlayer": { "devices": "[Adb] devices", @@ -78,10 +82,10 @@ "displayFormat": "cur=%dx%d", "screencapRawByNC": "[Adb] -s [AdbSerial] exec-out \"screencap | nc -w 3 [NcAddress] [NcPort]\"", "ncPort": 6723, - "ncPortReverse": "[Adb] -s [AdbSerial] reverse tcp:[NcPort] tcp:[NcPort]", "screencapRawWithGzip": "[Adb] -s [AdbSerial] shell \"screencap | gzip -1\"", "screencapEncode": "[Adb] -s [AdbSerial] shell screencap -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [AdbSerial] shell am start -n [Intent]" }, "Nox": { "devices": "[Adb] devices", @@ -94,10 +98,10 @@ "displayFormat": "cur=%dx%d", "screencapRawByNC": "[Adb] -s [AdbSerial] exec-out \"screencap | nc -w 3 [NcAddress] [NcPort]\"", "ncPort": 6723, - "ncPortReverse": "[Adb] -s [AdbSerial] reverse tcp:[NcPort] tcp:[NcPort]", "screencapRawWithGzip": "[Adb] -s [AdbSerial] exec-out \"screencap | gzip -1\"", "screencapEncode": "[Adb] -s [AdbSerial] exec-out screencap -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [AdbSerial] shell am start -n [Intent]" }, "XYAZ": { "devices": "[Adb] devices", @@ -110,10 +114,10 @@ "displayFormat": " init=%dx%d", "screencapRawByNC": "[Adb] -s [AdbSerial] exec-out \"screencap | nc -w 3 [NcAddress] [NcPort]\"", "ncPort": 6723, - "ncPortReverse": "[Adb] -s [AdbSerial] reverse tcp:[NcPort] tcp:[NcPort]", "screencapRawWithGzip": "[Adb] -s [AdbSerial] shell \"screencap | gzip -1\"", "screencapEncode": "[Adb] -s [AdbSerial] shell screencap -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [AdbSerial] shell am start -n [Intent]" }, "WSA": { "devices": "[Adb] devices", @@ -127,10 +131,10 @@ "displayFormat": "Physical size:%dx%d", "screencapRawByNC": "[Adb] -s [AdbSerial] exec-out \"screencap | nc -w 3 [NcAddress] [NcPort]\"", "ncPort": 6723, - "ncPortReverse": "[Adb] -s [AdbSerial] reverse tcp:[NcPort] tcp:[NcPort]", "screencapRawWithGzip": "[Adb] -s [AdbSerial] shell \"screencap -d [DisplayId] | gzip -1\"", "screencapEncode": "[Adb] -s [AdbSerial] shell screencap -d [DisplayId] -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [AdbSerial] shell am start -n [Intent]" }, "Compatible": { "devices": "[Adb] devices", @@ -143,10 +147,10 @@ "displayFormat": " init=%dx%d", "screencapRawByNC": "[Adb] -s [AdbSerial] exec-out \"screencap | nc -w 3 [NcAddress] [NcPort]\"", "ncPort": 6723, - "ncPortReverse": "[Adb] -s [AdbSerial] reverse tcp:[NcPort] tcp:[NcPort]", "screencapRawWithGzip": "[Adb] -s [AdbSerial] exec-out \"screencap | gzip -1\"", "screencapEncode": "[Adb] -s [AdbSerial] exec-out screencap -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [AdbSerial] shell am start -n [Intent]" } } } diff --git a/resource/tasks.json b/resource/tasks.json index 23475003fd..e60f524c2b 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -485,16 +485,19 @@ ] }, "StageResource": { + "action": "ClickSelf", "doc": "进入资源关卡", + "roi": [ + 455, + 562, + 544, + 158 + ], "next": [ - "StageResourceSwipeToTheLeft" + "StageResource", + "SwipeToTheLeft" ] }, - "StageResourceSwipeToTheLeft": { - "doc": "向左滑动到资源关最左", - "algorithm": "JustReturn", - "action": "SwipeToTheLeft" - }, "StageCE": { "action": "ClickSelf", "cache": false, @@ -833,6 +836,7 @@ 255 ], "next": [ + "GameStart", "StartToWakeUp", "StartUpConnectingFlag", "StartLoginBServer", @@ -6686,4 +6690,4 @@ 100 ] } -} +} \ No newline at end of file diff --git a/src/MeoAssistant/AsstTypes.h b/src/MeoAssistant/AsstTypes.h index 1a8490a980..4672024e19 100644 --- a/src/MeoAssistant/AsstTypes.h +++ b/src/MeoAssistant/AsstTypes.h @@ -158,6 +158,7 @@ namespace asst double score = 0.0; Rect rect; }; + } namespace std diff --git a/src/MeoAssistant/Controller.cpp b/src/MeoAssistant/Controller.cpp index 0fde0d7dab..0f998bb678 100644 --- a/src/MeoAssistant/Controller.cpp +++ b/src/MeoAssistant/Controller.cpp @@ -689,6 +689,21 @@ cv::Mat asst::Controller::get_resized_image() const return resized_mat; } +std::optional asst::Controller::start_game(const std::string& server_type, bool block) +{ + if (auto intent_name = Resrc.cfg().get_intent_name(server_type)) + { + std::string cur_cmd = utils::string_replace_all(m_adb.start, "[Intent]", intent_name.value()); + int id = push_cmd(cur_cmd); + if (block) + { + wait(id); + } + return id; + } + return std::nullopt; +} + int asst::Controller::click(const Point& p, bool block) { int x = static_cast(p.x * m_control_scale); @@ -999,6 +1014,7 @@ bool asst::Controller::connect(const std::string& adb_path, const std::string& a m_adb.screencap_raw_with_gzip = cmd_replace(adb_cfg.screencap_raw_with_gzip); m_adb.screencap_encode = cmd_replace(adb_cfg.screencap_encode); m_adb.release = cmd_replace(adb_cfg.release); + m_adb.start = cmd_replace(adb_cfg.start); if (m_support_socket && !m_server_started) { std::string bind_address; diff --git a/src/MeoAssistant/Controller.h b/src/MeoAssistant/Controller.h index 92da86f57f..cc29c828aa 100644 --- a/src/MeoAssistant/Controller.h +++ b/src/MeoAssistant/Controller.h @@ -37,7 +37,9 @@ namespace asst cv::Mat get_image(bool raw = false); std::vector get_image_encode() const; - // 点击和滑动都是异步执行,返回该任务的id + // 开启/置顶游戏、点击和滑动都是异步执行,返回该任务的id + std::optional start_game(const std::string& server_type = "", bool block = true); + int click(const Point& p, bool block = true); int click(const Rect& rect, bool block = true); int click_without_scale(const Point& p, bool block = true); @@ -124,6 +126,8 @@ namespace asst std::string screencap_encode; std::string release; + std::string start; + /* propertities */ enum class ScreencapEndOfLine { diff --git a/src/MeoAssistant/GeneralConfiger.cpp b/src/MeoAssistant/GeneralConfiger.cpp index a8cbd7ac9c..cd615473f3 100644 --- a/src/MeoAssistant/GeneralConfiger.cpp +++ b/src/MeoAssistant/GeneralConfiger.cpp @@ -28,6 +28,12 @@ bool asst::GeneralConfiger::parse(const json::value& json) m_options.aip_ocr.client_id = aip_ocr.get("clientId", std::string()); m_options.aip_ocr.client_secret = aip_ocr.get("clientSerect", std::string()); } + + } + + for (const auto& [server_type, intent_name] : json.at("intent").as_object()) + { + m_intent_name[server_type]=intent_name.as_string(); } for (const auto& [name, cfg_json] : json.at("connection").as_object()) { @@ -47,6 +53,7 @@ bool asst::GeneralConfiger::parse(const json::value& json) adb.nc_port = static_cast(cfg_json.at("ncPort").as_integer()); adb.screencap_encode = cfg_json.at("screencapEncode").as_string(); adb.release = cfg_json.at("release").as_string(); + adb.start = cfg_json.at("start").as_string(); //adb.pullscreen = cfg_json.at("pullscreen").as_string(); m_adb_cfg[name] = std::move(adb); diff --git a/src/MeoAssistant/GeneralConfiger.h b/src/MeoAssistant/GeneralConfiger.h index 42c478871c..7a85215e70 100644 --- a/src/MeoAssistant/GeneralConfiger.h +++ b/src/MeoAssistant/GeneralConfiger.h @@ -55,6 +55,7 @@ namespace asst unsigned short nc_port = 0U; std::string screencap_encode; std::string release; + std::string start; }; class GeneralConfiger : public AbstractConfiger @@ -85,6 +86,16 @@ namespace asst } } + [[nodiscard]] std::optional get_intent_name(const std::string& server_type) const + { + if (auto iter = m_intent_name.find(server_type); + iter != m_intent_name.cend()) + { + return iter->second; + } + return std::nullopt; + } + void set_options(Options opt) noexcept { m_options = std::move(opt); @@ -96,5 +107,6 @@ namespace asst std::string m_version; Options m_options; std::unordered_map m_adb_cfg; + std::unordered_map m_intent_name; }; } diff --git a/src/MeoAssistant/MeoAssistant.vcxproj b/src/MeoAssistant/MeoAssistant.vcxproj index 293b9e6117..0809b993c1 100644 --- a/src/MeoAssistant/MeoAssistant.vcxproj +++ b/src/MeoAssistant/MeoAssistant.vcxproj @@ -86,6 +86,7 @@ + @@ -165,6 +166,7 @@ + @@ -334,4 +336,4 @@ - \ No newline at end of file + diff --git a/src/MeoAssistant/MeoAssistant.vcxproj.filters b/src/MeoAssistant/MeoAssistant.vcxproj.filters index 67898e17bf..e46ebc49dc 100644 --- a/src/MeoAssistant/MeoAssistant.vcxproj.filters +++ b/src/MeoAssistant/MeoAssistant.vcxproj.filters @@ -240,6 +240,9 @@ 头文件\Task\Sub + + 头文件\Task\Sub + 头文件\ImageAnalyzer\Final @@ -473,6 +476,9 @@ 源文件\Task\Sub + + 源文件\Task\Sub + 源文件\ImageAnalyzer\Final @@ -578,4 +584,4 @@ 资源文件 - \ No newline at end of file + diff --git a/src/MeoAssistant/StartGameTask.cpp b/src/MeoAssistant/StartGameTask.cpp new file mode 100644 index 0000000000..a0c35f61ad --- /dev/null +++ b/src/MeoAssistant/StartGameTask.cpp @@ -0,0 +1,26 @@ +#include "StartGameTask.h" + +#include "Controller.h" + +using namespace asst; + +bool StartGameTask::_run() +{ + if(m_ctrler->start_game(m_client_type)) + { + return true; + } + return false; +} + +StartGameTask& StartGameTask::set_param(std::string client_type) noexcept +{ + m_client_type = client_type; + return *this; +} + +StartGameTask& StartGameTask::set_enable(bool enable) noexcept +{ + AbstractTask::set_enable(enable); + return *this; +} diff --git a/src/MeoAssistant/StartGameTask.h b/src/MeoAssistant/StartGameTask.h new file mode 100644 index 0000000000..d359adbfb3 --- /dev/null +++ b/src/MeoAssistant/StartGameTask.h @@ -0,0 +1,22 @@ +#pragma once + +#include "AbstractTask.h" +#include "AsstTypes.h" + +namespace asst +{ + class StartGameTask : public AbstractTask + { + public: + using AbstractTask::AbstractTask; + ~StartGameTask() override = default; + + StartGameTask& set_param(std::string server_type = "") noexcept; + StartGameTask& set_enable(bool enable = false) noexcept override; + + protected: + bool _run() override; + + std::string m_client_type = ""; + }; +} diff --git a/src/MeoAssistant/StartUpTask.cpp b/src/MeoAssistant/StartUpTask.cpp index 2dcea8e628..f70cc92570 100644 --- a/src/MeoAssistant/StartUpTask.cpp +++ b/src/MeoAssistant/StartUpTask.cpp @@ -4,10 +4,19 @@ asst::StartUpTask::StartUpTask(AsstCallback callback, void* callback_arg) : PackageTask(callback, callback_arg, TaskType), - m_start_up_task_ptr(std::make_shared(m_callback, m_callback_arg, TaskType)) + m_start_game_task_ptr(std::make_shared(m_callback, m_callback_arg, TaskType)), + m_start_up_task_ptr(std::make_shared(m_callback, m_callback_arg, TaskType)) { - m_start_up_task_ptr->set_tasks({ "StartUp" }) - .set_times_limit("ReturnToTerminal", 0) - .set_times_limit("Terminal", 0); + m_start_up_task_ptr->set_tasks({"StartUp"}) + .set_times_limit("ReturnToTerminal", 0) + .set_times_limit("Terminal", 0); + m_subtasks.emplace_back(m_start_game_task_ptr); m_subtasks.emplace_back(m_start_up_task_ptr); } + +bool asst::StartUpTask::set_params(const json::value& params) +{ + m_start_game_task_ptr->set_param(params.get("client_type", "")) + .set_enable(params.get("start_game_enable",false)); + return true; +} diff --git a/src/MeoAssistant/StartUpTask.h b/src/MeoAssistant/StartUpTask.h index c508d01701..69be38ce29 100644 --- a/src/MeoAssistant/StartUpTask.h +++ b/src/MeoAssistant/StartUpTask.h @@ -1,5 +1,6 @@ #pragma once #include "PackageTask.h" +#include "StartGameTask.h" namespace asst { @@ -11,9 +12,11 @@ namespace asst StartUpTask(AsstCallback callback, void* callback_arg); virtual ~StartUpTask() = default; + bool set_params(const json::value& params) override; + static constexpr const char* TaskType = "StartUp"; private: - + std::shared_ptr m_start_game_task_ptr = nullptr; std::shared_ptr m_start_up_task_ptr = nullptr; }; } diff --git a/src/MeoAsstGui/Helper/AsstProxy.cs b/src/MeoAsstGui/Helper/AsstProxy.cs index a6aa4c7c2a..900ac57bbd 100644 --- a/src/MeoAsstGui/Helper/AsstProxy.cs +++ b/src/MeoAsstGui/Helper/AsstProxy.cs @@ -254,6 +254,10 @@ namespace MeoAsstGui switch (subTask) { + case "StartGameTask": + mainModel.AddLog("打开客户端失败,请\n检查配置文件", "darkred"); + break; + case "AutoRecruitTask": mainModel.AddLog("公招识别错误,已返回", "darkred"); break; @@ -687,9 +691,12 @@ namespace MeoAsstGui return AsstAppendTaskWithEncoding("Award"); } - public bool AsstAppendStartUp() + public bool AsstAppendStartUp(string server_type, bool enable) { - return AsstAppendTaskWithEncoding("StartUp"); + var task_params = new JObject(); + task_params["client_type"] = server_type; + task_params["start_game_enable"] = enable; + return AsstAppendTaskWithEncoding("StartUp", task_params); } public bool AsstAppendVisit() diff --git a/src/MeoAsstGui/MeoAsstGui.csproj b/src/MeoAsstGui/MeoAsstGui.csproj index cfe4314b65..1f5c3cf73e 100644 --- a/src/MeoAsstGui/MeoAsstGui.csproj +++ b/src/MeoAsstGui/MeoAsstGui.csproj @@ -101,6 +101,9 @@ + + StartSettingsUserControl.xaml + TimerSettingsUserControl.xaml @@ -153,6 +156,7 @@ MSBuild:Compile Designer + MSBuild:Compile Designer diff --git a/src/MeoAsstGui/UserControl/StartSettingsUserControl.xaml b/src/MeoAsstGui/UserControl/StartSettingsUserControl.xaml new file mode 100644 index 0000000000..e90e2b3017 --- /dev/null +++ b/src/MeoAsstGui/UserControl/StartSettingsUserControl.xaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/MeoAsstGui/UserControl/StartSettingsUserControl.xaml.cs b/src/MeoAsstGui/UserControl/StartSettingsUserControl.xaml.cs new file mode 100644 index 0000000000..92fbcd2e9c --- /dev/null +++ b/src/MeoAsstGui/UserControl/StartSettingsUserControl.xaml.cs @@ -0,0 +1,26 @@ +// MeoAsstGui - A part of the MeoAssistantArknights project +// Copyright (C) 2021 MistEO and Contributors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY + +using System.Windows.Controls; + +namespace MeoAsstGui +{ + /// + /// StartSettingsUserControl.xaml 的交互逻辑 + /// + public partial class StartSettingsUserControl : UserControl + { + public StartSettingsUserControl() + { + InitializeComponent(); + } + } +} diff --git a/src/MeoAsstGui/UserControl/ToastSettingsUserControl.xaml b/src/MeoAsstGui/UserControl/ToastSettingsUserControl.xaml index 8efff9a2ff..7182c70e6f 100644 --- a/src/MeoAsstGui/UserControl/ToastSettingsUserControl.xaml +++ b/src/MeoAsstGui/UserControl/ToastSettingsUserControl.xaml @@ -6,6 +6,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:s="https://github.com/canton7/Stylet" d:DesignHeight="300" xmlns:vm="clr-namespace:MeoAsstGui;assembly=MeoAsstGui" + xmlns:c="clr-namespace:CalcBinding;assembly=CalcBinding" d:DataContext="{d:DesignInstance {x:Type vm:SettingsViewModel}}" d:DesignWidth="550" mc:Ignorable="d"> @@ -14,18 +15,28 @@ - - - - - - - + + - + + + + + + + @@ -36,74 +47,41 @@ - - - - - - - - - + IsChecked="{Binding ToastPositionTopLeft}"/> + IsChecked="{Binding ToastPositionCenterLeft}"/> - + IsChecked="{Binding ToastPositionBottomLeft}"/> + IsChecked="{Binding ToastPositionTopCenter}"/> - + IsChecked="{Binding ToastPositionBottomCenter}"/> + IsChecked="{Binding ToastPositionTopRight}"/> + IsChecked="{Binding ToastPositionCenterRight}"/> + IsChecked="{Binding ToastPositionBottomRight}"/> - - - + +