diff --git a/resource/config.json b/resource/config.json index 366d834b1d..bf793c7fe3 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,7 +34,8 @@ "displayFormat": " init=%dx%d", "screencapRawWithGzip": "[Adb] -s [Address] exec-out \"screencap | gzip -1\"", "screencapEncode": "[Adb] -s [Address] exec-out screencap -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [Address] shell am start -n [Intent]" }, "BlueStacks": { "devices": "[Adb] devices", @@ -43,7 +48,8 @@ "displayFormat": "cur=%dx%d", "screencapRawWithGzip": "[Adb] -s [Address] exec-out \"screencap | gzip -1\"", "screencapEncode": "[Adb] -s [Address] exec-out screencap -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [Address] shell am start -n [Intent]" }, "MuMuEmulator": { "devices": "[Adb] devices", @@ -56,7 +62,8 @@ "displayFormat": "cur=%dx%d", "screencapRawWithGzip": "[Adb] -s [Address] exec-out \"screencap | gzip -1\"", "screencapEncode": "[Adb] -s [Address] exec-out screencap -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [Address] shell am start -n [Intent]" }, "LDPlayer": { "devices": "[Adb] devices", @@ -69,7 +76,8 @@ "displayFormat": "cur=%dx%d", "screencapRawWithGzip": "[Adb] -s [Address] shell \"screencap | gzip -1\"", "screencapEncode": "[Adb] -s [Address] shell screencap -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [Address] shell am start -n [Intent]" }, "Nox": { "devices": "[Adb] devices", @@ -82,7 +90,8 @@ "displayFormat": "cur=%dx%d", "screencapRawWithGzip": "[Adb] -s [Address] exec-out \"screencap | gzip -1\"", "screencapEncode": "[Adb] -s [Address] exec-out screencap -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [Address] shell am start -n [Intent]" }, "XYAZ": { "devices": "[Adb] devices", @@ -95,7 +104,8 @@ "displayFormat": " init=%dx%d", "screencapRawWithGzip": "[Adb] -s [Address] shell \"screencap | gzip -1\"", "screencapEncode": "[Adb] -s [Address] shell screencap -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [Address] shell am start -n [Intent]" }, "WSA": { "devices": "[Adb] devices", @@ -109,7 +119,8 @@ "displayFormat": "Physical size:%dx%d", "screencapRawWithGzip": "[Adb] -s [Address] shell \"screencap -d [DisplayId] | gzip -1\"", "screencapEncode": "[Adb] -s [Address] shell screencap -d [DisplayId] -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [Address] shell am start -n [Intent]" }, "Compatible": { "devices": "[Adb] devices", @@ -122,7 +133,8 @@ "displayFormat": " init=%dx%d", "screencapRawWithGzip": "[Adb] -s [Address] exec-out \"screencap | gzip -1\"", "screencapEncode": "[Adb] -s [Address] exec-out screencap -p", - "release": "[Adb] kill-server" + "release": "[Adb] kill-server", + "start": "[Adb] -s [Address] shell am start -n [Intent]" } } } diff --git a/resource/tasks.json b/resource/tasks.json index 40252cc8d9..69659ff6f6 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -836,6 +836,7 @@ 255 ], "next": [ + "GameStart", "StartToWakeUp", "StartUpConnectingFlag", "StartLoginBServer", 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 9ab6a6249f..2e39182a88 100644 --- a/src/MeoAssistant/Controller.cpp +++ b/src/MeoAssistant/Controller.cpp @@ -522,6 +522,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); @@ -828,6 +843,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); return true; } diff --git a/src/MeoAssistant/Controller.h b/src/MeoAssistant/Controller.h index 47e2d117bb..77724c85c9 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); @@ -108,6 +110,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 47c372bcb1..56c5744f16 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()) { @@ -45,6 +51,7 @@ bool asst::GeneralConfiger::parse(const json::value& json) adb.screencap_raw_with_gzip = cfg_json.at("screencapRawWithGzip").as_string(); 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 cb1ee76c99..1dc8dac6db 100644 --- a/src/MeoAssistant/GeneralConfiger.h +++ b/src/MeoAssistant/GeneralConfiger.h @@ -53,6 +53,7 @@ namespace asst std::string screencap_raw_with_gzip; std::string screencap_encode; std::string release; + std::string start; }; class GeneralConfiger : public AbstractConfiger @@ -83,6 +84,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); @@ -94,5 +105,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 27bed142f1..4bef932522 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/ViewModels/SettingsViewModel.cs b/src/MeoAsstGui/ViewModels/SettingsViewModel.cs index 42d3b575a5..a7c6cae591 100644 --- a/src/MeoAsstGui/ViewModels/SettingsViewModel.cs +++ b/src/MeoAsstGui/ViewModels/SettingsViewModel.cs @@ -48,6 +48,7 @@ namespace MeoAsstGui _listTitle.Add("自动公招"); _listTitle.Add("信用商店"); _listTitle.Add("定时执行"); + _listTitle.Add("唤醒设置"); _listTitle.Add("企鹅数据"); _listTitle.Add("连接设置"); _listTitle.Add("通知显示"); @@ -132,6 +133,12 @@ namespace MeoAsstGui new CombData { Display = "刷源石锭投资,第一层商店后直接退出", Value = "1" }, new CombData { Display = "刷源石锭投资,投资过后退出", Value = "2" } }; + + ServerTypeList = new List + { + new CombData { Display = "官服", Value = "Official" }, + new CombData { Display = "Bilibili服", Value = "Bilibili" } + }; } private bool _idle = true; @@ -145,12 +152,39 @@ namespace MeoAsstGui } } + /* 唤醒设置 */ + + private bool _startGameEnable = Convert.ToBoolean(ViewStatusStorage.Get("Start.StartGameEnable", bool.FalseString)); + + public bool StartGameEnable + { + get { return _startGameEnable; } + set + { + SetAndNotify(ref _startGameEnable, value); + ViewStatusStorage.Set("Start.StartGameEnable", value.ToString()); + } + } + + private string _serverType = ViewStatusStorage.Get("Start.ServerType", "Official"); + + public string ServerType + { + get { return _serverType; } + set + { + SetAndNotify(ref _serverType, value); + ViewStatusStorage.Set("Start.ServerType", value); + } + } + /* 基建设置 */ public Dictionary FacilityKey = new Dictionary(); public ObservableCollection InfrastItemViewModels { get; set; } public List UsesOfDronesList { get; set; } public List RoguelikeModeList { get; set; } + public List ServerTypeList { get; set; } public List ConnectConfigList { get; set; } private int _dormThreshold = Convert.ToInt32(ViewStatusStorage.Get("Infrast.DormThreshold", "30")); diff --git a/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs b/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs index 15bafc93ca..78cbf53a1d 100644 --- a/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs +++ b/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs @@ -257,7 +257,7 @@ namespace MeoAsstGui } else if (item.Name == "开始唤醒") { - ret &= asstProxy.AsstAppendStartUp(); + ret &= appendStart(); } else if (item.Name == "刷理智") { @@ -334,6 +334,15 @@ namespace MeoAsstGui ViewStatusStorage.Set("MainFunction.TimesLimited.Quantity", MaxTimes); } + private bool appendStart() + { + var settings = _container.Get(); + var asstProxy = _container.Get(); + var mode = settings.ServerType; + var enable = settings.StartGameEnable; + return asstProxy.AsstAppendStartUp(mode, enable); + } + private bool appendFight() { int medicine = 0; diff --git a/src/MeoAsstGui/Views/SettingsView.xaml b/src/MeoAsstGui/Views/SettingsView.xaml index 4b5ee02d1c..53f8f4ab41 100644 --- a/src/MeoAsstGui/Views/SettingsView.xaml +++ b/src/MeoAsstGui/Views/SettingsView.xaml @@ -41,18 +41,21 @@ - + - + - + - + + + +