diff --git a/resource/config.json b/resource/config.json index 7e32960ca6..6d2cc61874 100644 --- a/resource/config.json +++ b/resource/config.json @@ -85,6 +85,7 @@ "start": "[Adb] -s [AdbSerial] shell am start -n [Intent]", "stop": "[Adb] -s [AdbSerial] shell \"PACKAGE_NAME=$(dumpsys activity activities 2>/dev/null | grep -i -o -E '(packageName|Activities)=.+arknights' 2>/dev/null | grep -i -o -E '[^= ]*arknights[^ /]*' | head -n 1); if [ -n \\\"$PACKAGE_NAME\\\" ]; then echo \\\"Closing $PACKAGE_NAME\\\"; am force-stop $PACKAGE_NAME; else echo \\\"app not running or arknights package name not found\\\"; fi\"", "abilist": "[Adb] -s [AdbSerial] shell getprop ro.product.cpu.abilist", + "version": "[Adb] -s [AdbSerial] shell getprop ro.build.version.release", "orientation": "[Adb] -s [AdbSerial] shell \"dumpsys input | grep SurfaceOrientation | grep -m 1 -o -E [0-9]\"", "pushMinitouch": "[Adb] -s [AdbSerial] push \"[minitouchLocalPath]\" \"/data/local/tmp/[minitouchWorkingFile]\"", "chmodMinitouch": "[Adb] -s [AdbSerial] shell chmod 700 \"/data/local/tmp/[minitouchWorkingFile]\"", diff --git a/src/MaaCore/Config/GeneralConfig.cpp b/src/MaaCore/Config/GeneralConfig.cpp index 8b4be80b1e..5e3e01e865 100644 --- a/src/MaaCore/Config/GeneralConfig.cpp +++ b/src/MaaCore/Config/GeneralConfig.cpp @@ -96,6 +96,7 @@ bool asst::GeneralConfig::parse(const json::value& json) adb.start = cfg_json.get("start", base_cfg.start); adb.stop = cfg_json.get("stop", base_cfg.stop); adb.abilist = cfg_json.get("abilist", base_cfg.abilist); + adb.version = cfg_json.get("version", base_cfg.version); adb.orientation = cfg_json.get("orientation", base_cfg.orientation); adb.push_minitouch = cfg_json.get("pushMinitouch", base_cfg.push_minitouch); adb.chmod_minitouch = cfg_json.get("chmodMinitouch", base_cfg.chmod_minitouch); diff --git a/src/MaaCore/Config/GeneralConfig.h b/src/MaaCore/Config/GeneralConfig.h index f04941d69a..cf0fef6dd4 100644 --- a/src/MaaCore/Config/GeneralConfig.h +++ b/src/MaaCore/Config/GeneralConfig.h @@ -78,6 +78,7 @@ struct AdbCfg std::string start; std::string stop; std::string abilist; + std::string version; std::string orientation; std::string push_minitouch; std::string chmod_minitouch; diff --git a/src/MaaCore/Controller/AdbController.cpp b/src/MaaCore/Controller/AdbController.cpp index eb6afcd2c3..b7c984ef9b 100644 --- a/src/MaaCore/Controller/AdbController.cpp +++ b/src/MaaCore/Controller/AdbController.cpp @@ -156,6 +156,7 @@ std::optional asst::AdbController::call_command( ", socket size:", sock_data.size()); if (!pipe_data.empty() && pipe_data.size() < 4096) { + m_pipe_data_size = pipe_data.size(); Log.trace("stdout output:", Logger::separator::newline, pipe_data); } if (recv_by_socket && !sock_data.empty() && sock_data.size() < 4096) { @@ -178,6 +179,16 @@ std::optional asst::AdbController::call_command( return std::nullopt; } +size_t asst::AdbController::get_pipe_data_size() const noexcept +{ + return m_pipe_data_size; +} + +size_t asst::AdbController::get_version() const noexcept +{ + return m_version; +} + void asst::AdbController::callback(AsstMsg msg, const json::value& details) { if (m_callback) { @@ -760,6 +771,23 @@ bool asst::AdbController::connect( info["details"]["uuid"] = m_uuid; callback(AsstMsg::ConnectionInfo, info); } + /* get android version */ + { + auto version_ret = call_command(cmd_replace(adb_cfg.version)); + if (!version_ret) { + json::value info = get_info_json() + | json::object { + { "what", "ConnectFailed" }, + { "why", "Android version command failed to exec" }, + }; + callback(AsstMsg::ConnectionInfo, info); + return false; + } + + auto& version_str = version_ret.value(); + convert_lf(version_str); + m_version = std::stoul(version_str); + } if (need_exit()) { return false; diff --git a/src/MaaCore/Controller/AdbController.h b/src/MaaCore/Controller/AdbController.h index c8d92c440a..096af9493a 100644 --- a/src/MaaCore/Controller/AdbController.h +++ b/src/MaaCore/Controller/AdbController.h @@ -35,6 +35,10 @@ public: virtual const std::string& get_uuid() const override; + virtual size_t get_pipe_data_size() const noexcept override; + + virtual size_t get_version() const noexcept override; + virtual bool screencap(cv::Mat& image_payload, bool allow_reconnect = false) override; virtual bool start_game(const std::string& client_type) override; @@ -128,6 +132,8 @@ protected: std::string start; std::string stop; + std::string version; + std::string back_to_home; /* properties */ @@ -151,6 +157,8 @@ protected: } m_adb; std::string m_uuid; + size_t m_pipe_data_size = 0; + size_t m_version = 0; std::pair m_screen_size = { 0, 0 }; int m_width = 0; int m_height = 0; diff --git a/src/MaaCore/Controller/Controller.cpp b/src/MaaCore/Controller/Controller.cpp index 02eb26efc0..8c7bff0afc 100644 --- a/src/MaaCore/Controller/Controller.cpp +++ b/src/MaaCore/Controller/Controller.cpp @@ -12,7 +12,7 @@ #ifdef _MSC_VER #pragma warning(push) -#pragma warning(disable : 4068) +#pragma warning(disable: 4068) #endif #include #ifdef _MSC_VER @@ -25,7 +25,9 @@ #include "Utils/Logger.hpp" asst::Controller::Controller(const AsstCallback& callback, Assistant* inst) - : InstHelper(inst), m_callback(callback), m_rand_engine(std::random_device {}()) + : InstHelper(inst) + , m_callback(callback) + , m_rand_engine(std::random_device {}()) { LogTraceFunction; @@ -37,6 +39,17 @@ asst::Controller::~Controller() LogTraceFunction; } +size_t asst::Controller::get_pipe_data_size() const noexcept +{ + return m_controller->get_pipe_data_size(); +} + +size_t asst::Controller::get_version() const noexcept +{ + return m_controller->get_version(); +} + + std::pair asst::Controller::get_scale_size() const noexcept { return m_scale_size; @@ -114,15 +127,27 @@ bool asst::Controller::click(const Rect& rect) return m_scale_proxy->click(rect); } -bool asst::Controller::swipe(const Point& p1, const Point& p2, int duration, bool extra_swipe, double slope_in, - double slope_out, bool with_pause) +bool asst::Controller::swipe( + const Point& p1, + const Point& p2, + int duration, + bool extra_swipe, + double slope_in, + double slope_out, + bool with_pause) { CHECK_EXIST(m_controller, false); return m_scale_proxy->swipe(p1, p2, duration, extra_swipe, slope_in, slope_out, with_pause); } -bool asst::Controller::swipe(const Rect& r1, const Rect& r2, int duration, bool extra_swipe, double slope_in, - double slope_out, bool with_pause) +bool asst::Controller::swipe( + const Rect& r1, + const Rect& r2, + int duration, + bool extra_swipe, + double slope_in, + double slope_out, + bool with_pause) { CHECK_EXIST(m_controller, false); return m_scale_proxy->swipe(r1, r2, duration, extra_swipe, slope_in, slope_out, with_pause); @@ -148,14 +173,18 @@ asst::ControlFeat::Feat asst::Controller::support_features() return m_controller->support_features(); } -bool asst::Controller::connect(const std::string& adb_path, const std::string& address, const std::string& config) +bool asst::Controller::connect( + const std::string& adb_path, + const std::string& address, + const std::string& config) { LogTraceFunction; clear_info(); m_controller = - m_controller_factory->create_controller(m_controller_type, adb_path, address, config, m_platform_type); + m_controller_factory + ->create_controller(m_controller_type, adb_path, address, config, m_platform_type); if (!m_controller) { Log.error("connect failed"); @@ -192,7 +221,8 @@ bool asst::Controller::connect(const std::string& adb_path, const std::string& a }; try { - m_scale_proxy = std::make_shared(m_controller, m_controller_type, proxy_callback); + m_scale_proxy = + std::make_shared(m_controller, m_controller_type, proxy_callback); } catch (const std::exception& e) { Log.error("Cannot create controller proxy: {}", e.what()); diff --git a/src/MaaCore/Controller/Controller.h b/src/MaaCore/Controller/Controller.h index c86656adb8..b476f9a2e1 100644 --- a/src/MaaCore/Controller/Controller.h +++ b/src/MaaCore/Controller/Controller.h @@ -28,80 +28,98 @@ namespace asst { - class Assistant; +class Assistant; - class Controller : private InstHelper - { - public: - Controller(const AsstCallback& callback, Assistant* inst); - Controller(const Controller&) = delete; - Controller(Controller&&) = delete; - ~Controller(); +class Controller : private InstHelper +{ +public: + Controller(const AsstCallback& callback, Assistant* inst); + Controller(const Controller&) = delete; + Controller(Controller&&) = delete; + ~Controller(); - bool connect(const std::string& adb_path, const std::string& address, const std::string& config); - bool inited() noexcept; - void set_touch_mode(const TouchMode& mode) noexcept; - void set_swipe_with_pause(bool enable) noexcept; - void set_adb_lite_enabled(bool enable) noexcept; - void set_kill_adb_on_exit(bool enable) noexcept; + bool + connect(const std::string& adb_path, const std::string& address, const std::string& config); + bool inited() noexcept; + void set_touch_mode(const TouchMode& mode) noexcept; + void set_swipe_with_pause(bool enable) noexcept; + void set_adb_lite_enabled(bool enable) noexcept; + void set_kill_adb_on_exit(bool enable) noexcept; - const std::string& get_uuid() const; - cv::Mat get_image(bool raw = false); - cv::Mat get_image_cache() const; - bool screencap(bool allow_reconnect = false); + const std::string& get_uuid() const; - bool start_game(const std::string& client_type); - bool stop_game(); + size_t get_pipe_data_size() const noexcept; - bool click(const Point& p); - bool click(const Rect& rect); + size_t get_version() const noexcept; - bool swipe(const Point& p1, const Point& p2, int duration = 0, bool extra_swipe = false, double slope_in = 1, - double slope_out = 1, bool with_pause = false); - bool swipe(const Rect& r1, const Rect& r2, int duration = 0, bool extra_swipe = false, double slope_in = 1, - double slope_out = 1, bool with_pause = false); + cv::Mat get_image(bool raw = false); + cv::Mat get_image_cache() const; + bool screencap(bool allow_reconnect = false); - bool inject_input_event(InputEvent& event); + bool start_game(const std::string& client_type); + bool stop_game(); - bool press_esc(); - ControlFeat::Feat support_features(); + bool click(const Point& p); + bool click(const Rect& rect); - std::pair get_scale_size() const noexcept; + bool swipe( + const Point& p1, + const Point& p2, + int duration = 0, + bool extra_swipe = false, + double slope_in = 1, + double slope_out = 1, + bool with_pause = false); + bool swipe( + const Rect& r1, + const Rect& r2, + int duration = 0, + bool extra_swipe = false, + double slope_in = 1, + double slope_out = 1, + bool with_pause = false); - Controller& operator=(const Controller&) = delete; - Controller& operator=(Controller&&) = delete; + bool inject_input_event(InputEvent& event); - bool back_to_home(); + bool press_esc(); + ControlFeat::Feat support_features(); - private: - cv::Mat get_resized_image_cache() const; + std::pair get_scale_size() const noexcept; - void clear_info() noexcept; - void callback(AsstMsg msg, const json::value& details); - void sync_params(); + Controller& operator=(const Controller&) = delete; + Controller& operator=(Controller&&) = delete; - AsstCallback m_callback = nullptr; + bool back_to_home(); - std::minstd_rand m_rand_engine; +private: + cv::Mat get_resized_image_cache() const; - PlatformType m_platform_type = PlatformType::Native; + void clear_info() noexcept; + void callback(AsstMsg msg, const json::value& details); + void sync_params(); - ControllerType m_controller_type = ControllerType::Minitouch; + AsstCallback m_callback = nullptr; - std::shared_ptr m_controller = nullptr; + std::minstd_rand m_rand_engine; - std::unique_ptr m_controller_factory = nullptr; + PlatformType m_platform_type = PlatformType::Native; - std::shared_ptr m_scale_proxy = nullptr; + ControllerType m_controller_type = ControllerType::Minitouch; - std::string m_uuid; + std::shared_ptr m_controller = nullptr; - std::pair m_scale_size = { WindowWidthDefault, WindowHeightDefault }; + std::unique_ptr m_controller_factory = nullptr; - bool m_swipe_with_pause = false; - bool m_kill_adb_on_exit = false; + std::shared_ptr m_scale_proxy = nullptr; - mutable std::shared_mutex m_image_mutex; - cv::Mat m_cache_image; - }; + std::string m_uuid; + + std::pair m_scale_size = { WindowWidthDefault, WindowHeightDefault }; + + bool m_swipe_with_pause = false; + bool m_kill_adb_on_exit = false; + + mutable std::shared_mutex m_image_mutex; + cv::Mat m_cache_image; +}; } // namespace asst diff --git a/src/MaaCore/Controller/ControllerAPI.h b/src/MaaCore/Controller/ControllerAPI.h index 75f56b616f..989e8c3c2f 100644 --- a/src/MaaCore/Controller/ControllerAPI.h +++ b/src/MaaCore/Controller/ControllerAPI.h @@ -7,70 +7,85 @@ namespace asst { - struct InputEvent; +struct InputEvent; - enum class ControllerType +enum class ControllerType +{ + Adb, + Minitouch, + Maatouch, + MacPlayTools, +}; + +class ControllerAPI +{ +public: + virtual ~ControllerAPI() = default; + + virtual bool connect( + const std::string& adb_path, + const std::string& address, + const std::string& config) = 0; + virtual bool inited() const noexcept = 0; + + virtual void set_swipe_with_pause([[maybe_unused]] bool enable) noexcept {} + + virtual void set_kill_adb_on_exit([[maybe_unused]] bool enable) noexcept {} + + virtual const std::string& get_uuid() const = 0; + + virtual size_t get_pipe_data_size() const noexcept = 0; + + virtual size_t get_version() const noexcept = 0; + + virtual bool screencap(cv::Mat& image_payload, bool allow_reconnect = false) = 0; + + virtual bool start_game(const std::string& client_type) = 0; + virtual bool stop_game() = 0; + + virtual bool click(const Point& p) = 0; + + virtual bool swipe( + const Point& p1, + const Point& p2, + int duration = 0, + bool extra_swipe = false, + double slope_in = 1, + double slope_out = 1, + bool with_pause = false) = 0; + // TODO: 抽象出gesture类 + + virtual bool inject_input_event(const InputEvent& event) = 0; + + virtual bool press_esc() = 0; + virtual ControlFeat::Feat support_features() const noexcept = 0; + + virtual std::pair get_screen_res() const noexcept = 0; + + ControllerAPI& operator=(const ControllerAPI&) = delete; + ControllerAPI& operator=(ControllerAPI&&) = delete; + + virtual void back_to_home() noexcept {} +}; + +struct InputEvent +{ + enum class Type { - Adb, - Minitouch, - Maatouch, - MacPlayTools, - }; + TOUCH_DOWN, + TOUCH_UP, + TOUCH_MOVE, + TOUCH_RESET, + KEY_DOWN, + KEY_UP, + WAIT_MS, + COMMIT, + UNKNOWN = INT_MAX + } type = Type::UNKNOWN; - class ControllerAPI - { - public: - virtual ~ControllerAPI() = default; - - virtual bool connect(const std::string& adb_path, const std::string& address, const std::string& config) = 0; - virtual bool inited() const noexcept = 0; - virtual void set_swipe_with_pause([[maybe_unused]] bool enable) noexcept {} - virtual void set_kill_adb_on_exit([[maybe_unused]] bool enable) noexcept {} - - virtual const std::string& get_uuid() const = 0; - - virtual bool screencap(cv::Mat& image_payload, bool allow_reconnect = false) = 0; - - virtual bool start_game(const std::string& client_type) = 0; - virtual bool stop_game() = 0; - - virtual bool click(const Point& p) = 0; - - virtual bool swipe(const Point& p1, const Point& p2, int duration = 0, bool extra_swipe = false, - double slope_in = 1, double slope_out = 1, bool with_pause = false) = 0; - // TODO: 抽象出gesture类 - - virtual bool inject_input_event(const InputEvent& event) = 0; - - virtual bool press_esc() = 0; - virtual ControlFeat::Feat support_features() const noexcept = 0; - - virtual std::pair get_screen_res() const noexcept = 0; - - ControllerAPI& operator=(const ControllerAPI&) = delete; - ControllerAPI& operator=(ControllerAPI&&) = delete; - - virtual void back_to_home() noexcept {} - }; - - struct InputEvent - { - enum class Type - { - TOUCH_DOWN, - TOUCH_UP, - TOUCH_MOVE, - TOUCH_RESET, - KEY_DOWN, - KEY_UP, - WAIT_MS, - COMMIT, - UNKNOWN = INT_MAX - } type = Type::UNKNOWN; - - int pointerId = 0; - asst::Point point = { 0, 0 }; - int keycode = 0; - long milisec = 0; - }; + int pointerId = 0; + asst::Point point = { 0, 0 }; + int keycode = 0; + long milisec = 0; +}; } // namespace asst diff --git a/src/MaaCore/Controller/PlayToolsController.cpp b/src/MaaCore/Controller/PlayToolsController.cpp index 39803c99b0..8bfb5a3596 100644 --- a/src/MaaCore/Controller/PlayToolsController.cpp +++ b/src/MaaCore/Controller/PlayToolsController.cpp @@ -8,9 +8,13 @@ using asio::ip::tcp; namespace socket_ops = asio::detail::socket_ops; -asst::PlayToolsController::PlayToolsController(const AsstCallback& callback, Assistant* inst, - PlatformType type [[maybe_unused]]) - : InstHelper(inst), m_callback(callback), m_socket(m_context) +asst::PlayToolsController::PlayToolsController( + const AsstCallback& callback, + Assistant* inst, + PlatformType type [[maybe_unused]]) + : InstHelper(inst) + , m_callback(callback) + , m_socket(m_context) { LogTraceFunction; } @@ -20,8 +24,10 @@ asst::PlayToolsController::~PlayToolsController() close(); } -bool asst::PlayToolsController::connect(const std::string& adb_path [[maybe_unused]], const std::string& address, - const std::string& config [[maybe_unused]]) +bool asst::PlayToolsController::connect( + const std::string& adb_path [[maybe_unused]], + const std::string& address, + const std::string& config [[maybe_unused]]) { if (m_address != address) { close(); @@ -42,7 +48,19 @@ const std::string& asst::PlayToolsController::get_uuid() const return uuid; } -bool asst::PlayToolsController::screencap(cv::Mat& image_payload, bool allow_reconnect [[maybe_unused]]) +size_t asst::PlayToolsController::get_pipe_data_size() const noexcept +{ + return size_t(); +} + +size_t asst::PlayToolsController::get_version() const noexcept +{ + return size_t(); +} + +bool asst::PlayToolsController::screencap( + cv::Mat& image_payload, + bool allow_reconnect [[maybe_unused]]) { LogTraceFunction; @@ -103,8 +121,14 @@ bool asst::PlayToolsController::click(const Point& p) return toucher_down(p) && toucher_up(p); } -bool asst::PlayToolsController::swipe(const Point& p1, const Point& p2, int duration, bool extra_swipe, double slope_in, - double slope_out, bool with_pause [[maybe_unused]]) +bool asst::PlayToolsController::swipe( + const Point& p1, + const Point& p2, + int duration, + bool extra_swipe, + double slope_in, + double slope_out, + bool with_pause [[maybe_unused]]) { int x1 = p1.x, y1 = p1.y; int x2 = p2.x, y2 = p2.y; @@ -129,8 +153,10 @@ bool asst::PlayToolsController::swipe(const Point& p1, const Point& p2, int dura }; // TODO: move this to math.hpp const auto progressive_move = [&](int _x1, int _y1, int _x2, int _y2, int _duration) { - for (int cur_time = DefaultSwipeDelay; cur_time < _duration; cur_time += DefaultSwipeDelay) { - double progress = cubic_spline(slope_in, slope_out, static_cast(cur_time) / duration); + for (int cur_time = DefaultSwipeDelay; cur_time < _duration; + cur_time += DefaultSwipeDelay) { + double progress = + cubic_spline(slope_in, slope_out, static_cast(cur_time) / duration); int cur_x = static_cast(std::lerp(_x1, _x2, progress)); int cur_y = static_cast(std::lerp(_y1, _y2, progress)); if (cur_x < 0 || cur_x > width || cur_y < 0 || cur_y > height) { @@ -149,7 +175,12 @@ bool asst::PlayToolsController::swipe(const Point& p1, const Point& p2, int dura if (extra_swipe && opt.minitouch_extra_swipe_duration > 0) { toucher_wait(opt.minitouch_swipe_extra_end_delay); // 停留终点 - progressive_move(x2, y2, x2, y2 - opt.minitouch_extra_swipe_dist, opt.minitouch_extra_swipe_duration); + progressive_move( + x2, + y2, + x2, + y2 - opt.minitouch_extra_swipe_dist, + opt.minitouch_extra_swipe_duration); } return toucher_up(p2); @@ -290,7 +321,10 @@ bool asst::PlayToolsController::fetch_screen_res() return true; } -bool asst::PlayToolsController::toucher_commit(const TouchPhase phase, const Point& p, const int delay) +bool asst::PlayToolsController::toucher_commit( + const TouchPhase phase, + const Point& p, + const int delay) { open(); uint16_t x = socket_ops::host_to_network_short(static_cast(p.x)); diff --git a/src/MaaCore/Controller/PlayToolsController.h b/src/MaaCore/Controller/PlayToolsController.h index 02765cdddd..ce157d3153 100644 --- a/src/MaaCore/Controller/PlayToolsController.h +++ b/src/MaaCore/Controller/PlayToolsController.h @@ -13,73 +13,94 @@ namespace asst { - class PlayToolsController : public ControllerAPI, protected InstHelper +class PlayToolsController + : public ControllerAPI + , protected InstHelper +{ +public: + PlayToolsController(const AsstCallback& callback, Assistant* inst, PlatformType type); + PlayToolsController(const PlayToolsController&) = delete; + PlayToolsController(PlayToolsController&&) = delete; + virtual ~PlayToolsController(); + + virtual bool connect( + const std::string& adb_path, + const std::string& address, + const std::string& config) override; + virtual bool inited() const noexcept override; + + virtual const std::string& get_uuid() const override; + + virtual size_t get_pipe_data_size() const noexcept override; + + virtual size_t get_version() const noexcept override; + + virtual bool screencap(cv::Mat& image_payload, bool allow_reconnect = false) override; + + virtual bool start_game(const std::string& client_type) override; + virtual bool stop_game() override; + + virtual bool click(const Point& p) override; + + virtual bool swipe( + const Point& p1, + const Point& p2, + int duration = 0, + bool extra_swipe = false, + double slope_in = 1, + double slope_out = 1, + bool with_pause = false) override; + + virtual bool inject_input_event([[maybe_unused]] const InputEvent& event) override { - public: - PlayToolsController(const AsstCallback& callback, Assistant* inst, PlatformType type); - PlayToolsController(const PlayToolsController&) = delete; - PlayToolsController(PlayToolsController&&) = delete; - virtual ~PlayToolsController(); + return false; + } - virtual bool connect(const std::string& adb_path, const std::string& address, - const std::string& config) override; - virtual bool inited() const noexcept override; + virtual bool press_esc() override; - virtual const std::string& get_uuid() const override; + virtual ControlFeat::Feat support_features() const noexcept override + { + return ControlFeat::NONE; + } - virtual bool screencap(cv::Mat& image_payload, bool allow_reconnect = false) override; + virtual std::pair get_screen_res() const noexcept override; - virtual bool start_game(const std::string& client_type) override; - virtual bool stop_game() override; + PlayToolsController& operator=(const PlayToolsController&) = delete; + PlayToolsController& operator=(PlayToolsController&&) = delete; - virtual bool click(const Point& p) override; + virtual void back_to_home() noexcept override; - virtual bool swipe(const Point& p1, const Point& p2, int duration = 0, bool extra_swipe = false, - double slope_in = 1, double slope_out = 1, bool with_pause = false) override; +protected: + AsstCallback m_callback; - virtual bool inject_input_event([[maybe_unused]] const InputEvent& event) override { return false; } + asio::io_context m_context; + asio::ip::tcp::socket m_socket; - virtual bool press_esc() override; - virtual ControlFeat::Feat support_features() const noexcept override { return ControlFeat::NONE; } + std::string m_address; + std::pair m_screen_size = { 0, 0 }; - virtual std::pair get_screen_res() const noexcept override; - - PlayToolsController& operator=(const PlayToolsController&) = delete; - PlayToolsController& operator=(PlayToolsController&&) = delete; - - virtual void back_to_home() noexcept override; - - protected: - AsstCallback m_callback; - - asio::io_context m_context; - asio::ip::tcp::socket m_socket; - - std::string m_address; - std::pair m_screen_size = { 0, 0 }; - - enum class TouchPhase - { - Began = 0, - Moved = 1, - Ended = 3, - }; - - static constexpr int DefaultClickDelay = 50; - static constexpr int DefaultSwipeDelay = 5; - - bool toucher_down(const Point& p, const int delay = DefaultClickDelay); - bool toucher_move(const Point& p, const int delay = DefaultSwipeDelay); - bool toucher_up(const Point& p, const int delay = DefaultClickDelay); - - void toucher_wait(const int delay); - - private: - static constexpr int MinimalVersion = 2; - void close(); - bool open(); - bool check_version(); - bool fetch_screen_res(); - bool toucher_commit(const TouchPhase phase, const Point& p, const int delay); + enum class TouchPhase + { + Began = 0, + Moved = 1, + Ended = 3, }; + + static constexpr int DefaultClickDelay = 50; + static constexpr int DefaultSwipeDelay = 5; + + bool toucher_down(const Point& p, const int delay = DefaultClickDelay); + bool toucher_move(const Point& p, const int delay = DefaultSwipeDelay); + bool toucher_up(const Point& p, const int delay = DefaultClickDelay); + + void toucher_wait(const int delay); + +private: + static constexpr int MinimalVersion = 2; + void close(); + bool open(); + bool check_version(); + bool fetch_screen_res(); + bool toucher_commit(const TouchPhase phase, const Point& p, const int delay); +}; } // namespace asst diff --git a/src/MaaCore/Task/Miscellaneous/StartGameTaskPlugin.cpp b/src/MaaCore/Task/Miscellaneous/StartGameTaskPlugin.cpp index ab65240d71..c2d22f4823 100644 --- a/src/MaaCore/Task/Miscellaneous/StartGameTaskPlugin.cpp +++ b/src/MaaCore/Task/Miscellaneous/StartGameTaskPlugin.cpp @@ -9,7 +9,49 @@ bool StartGameTaskPlugin::_run() if (m_client_type.empty()) { return false; } - return ctrler()->start_game(m_client_type); + + // check for android version, because it leads to different magic values + // https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/8966#issuecomment-2094369694 + if (ctrler()->get_version() > 8) { + do { + if (!ctrler()->start_game(m_client_type)) { + return false; + } + + // https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/8961#issue-2277568882 + // 167: magic value needs to be >164 but <172 (as that's max) + if (ctrler()->get_pipe_data_size() > 167) { + return true; + } + + sleep(1500); + + } while (true); + } + else { + do { + if (!ctrler()->start_game(m_client_type)) { + return false; + } + + // 145: needs to be >85 but <153 (as that's max) + // magic value lowered because of different android version + if (ctrler()->get_pipe_data_size() > 145) { + // As there's no way to know (in Android < 8) if Ark has correctly started + // we run the command a few more times to be sure + for (auto _ = 3; _--;) { + sleep(1500); + if (!ctrler()->start_game(m_client_type)) { + return false; + } + } + return true; + } + + sleep(1500); + + } while (true); + } } StartGameTaskPlugin& StartGameTaskPlugin::set_client_type(std::string client_type) noexcept