From b2baed17b181ec0cbbadf08aaa2fe693b33a7d0e Mon Sep 17 00:00:00 2001 From: MistEO Date: Sat, 19 Feb 2022 21:59:20 +0800 Subject: [PATCH] =?UTF-8?q?fix.=E4=BF=AE=E5=A4=8D=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=90=8E=E7=9A=84=20controller=20=E6=88=AA=E5=9B=BE=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MeoAssistant/AbstractTask.cpp | 1 + src/MeoAssistant/Assistant.cpp | 2 +- src/MeoAssistant/Controller.cpp | 133 +++++++++++----------- src/MeoAssistant/Controller.h | 2 +- src/MeoAssistant/StageDropsTaskPlugin.cpp | 2 +- 5 files changed, 69 insertions(+), 71 deletions(-) diff --git a/src/MeoAssistant/AbstractTask.cpp b/src/MeoAssistant/AbstractTask.cpp index 0423bd6f9b..d7326f8f56 100644 --- a/src/MeoAssistant/AbstractTask.cpp +++ b/src/MeoAssistant/AbstractTask.cpp @@ -148,6 +148,7 @@ void asst::AbstractTask::callback(AsstMsg msg, const json::value& detail) { for (TaskPluginPtr plugin : m_plugins) { plugin->set_exit_flag(m_exit_flag); + plugin->set_ctrler(m_ctrler); plugin->set_task_ptr(this); if (!plugin->verify(msg, detail)) { diff --git a/src/MeoAssistant/Assistant.cpp b/src/MeoAssistant/Assistant.cpp index f45f52ca5d..bb99b5e71b 100644 --- a/src/MeoAssistant/Assistant.cpp +++ b/src/MeoAssistant/Assistant.cpp @@ -221,7 +221,7 @@ bool asst::Assistant::append_recruit(unsigned max_times, const std::vector& if (!m_inited) { return false; } - static const std::string TaskChain = "Recruit"; + constexpr static const char* TaskChain = "Recruit"; auto recruit_task_ptr = std::make_shared(task_callback, (void*)this, TaskChain); recruit_task_ptr->set_max_times(max_times) diff --git a/src/MeoAssistant/Controller.cpp b/src/MeoAssistant/Controller.cpp index 673ff61a9f..a8b98752cb 100644 --- a/src/MeoAssistant/Controller.cpp +++ b/src/MeoAssistant/Controller.cpp @@ -104,58 +104,58 @@ asst::Controller::~Controller() #endif } -asst::Rect asst::Controller::shaped_correct(const Rect & rect) const -{ - if (rect.empty() - || m_scale_size.first == 0 - || m_scale_size.second == 0) { - return rect; - } - // 明日方舟在异形屏上,有的地方是按比例缩放的,有的地方又是直接位移。没法整,这里简单粗暴一点截一个长条 - Rect dst = rect; - if (m_scale_size.first != WindowWidthDefault) { // 说明是宽屏 - if (rect.width <= WindowWidthDefault / 2) { - if (rect.x + rect.width <= WindowWidthDefault / 2) { // 整个矩形都在左半边 - dst.x = 0; - dst.width = m_scale_size.first / 2; - } - else if (rect.x >= WindowWidthDefault / 2) { // 整个矩形都在右半边 - dst.x = m_scale_size.first / 2; - dst.width = m_scale_size.first / 2; - } - else { // 整个矩形横跨了中线 - dst.x = 0; - dst.width = m_scale_size.first; - } - } - else { - dst.x = 0; - dst.width = m_scale_size.first; - } - } - else if (m_scale_size.second != WindowHeightDefault) { // 说明是偏方形屏 - if (rect.height <= WindowHeightDefault / 2) { - if (rect.y + rect.height <= WindowHeightDefault / 2) { // 整个矩形都在上半边 - dst.y = 0; - dst.height = m_scale_size.second / 2; - } - else if (rect.y >= WindowHeightDefault / 2) { // 整个矩形都在下半边 - dst.y = m_scale_size.second / 2; - dst.height = m_scale_size.second / 2; // 整个矩形横跨了中线 - } - else { - dst.y = 0; - dst.height = m_scale_size.second; - } - } - - else { - dst.y = 0; - dst.height = m_scale_size.second; - } - } - return dst; -} +//asst::Rect asst::Controller::shaped_correct(const Rect & rect) const +//{ +// if (rect.empty() +// || m_scale_size.first == 0 +// || m_scale_size.second == 0) { +// return rect; +// } +// // 明日方舟在异形屏上,有的地方是按比例缩放的,有的地方又是直接位移。没法整,这里简单粗暴一点截一个长条 +// Rect dst = rect; +// if (m_scale_size.first != WindowWidthDefault) { // 说明是宽屏 +// if (rect.width <= WindowWidthDefault / 2) { +// if (rect.x + rect.width <= WindowWidthDefault / 2) { // 整个矩形都在左半边 +// dst.x = 0; +// dst.width = m_scale_size.first / 2; +// } +// else if (rect.x >= WindowWidthDefault / 2) { // 整个矩形都在右半边 +// dst.x = m_scale_size.first / 2; +// dst.width = m_scale_size.first / 2; +// } +// else { // 整个矩形横跨了中线 +// dst.x = 0; +// dst.width = m_scale_size.first; +// } +// } +// else { +// dst.x = 0; +// dst.width = m_scale_size.first; +// } +// } +// else if (m_scale_size.second != WindowHeightDefault) { // 说明是偏方形屏 +// if (rect.height <= WindowHeightDefault / 2) { +// if (rect.y + rect.height <= WindowHeightDefault / 2) { // 整个矩形都在上半边 +// dst.y = 0; +// dst.height = m_scale_size.second / 2; +// } +// else if (rect.y >= WindowHeightDefault / 2) { // 整个矩形都在下半边 +// dst.y = m_scale_size.second / 2; +// dst.height = m_scale_size.second / 2; // 整个矩形横跨了中线 +// } +// else { +// dst.y = 0; +// dst.height = m_scale_size.second; +// } +// } +// +// else { +// dst.y = 0; +// dst.height = m_scale_size.second; +// } +// } +// return dst; +//} std::pair asst::Controller::get_scale_size() const noexcept { @@ -379,8 +379,6 @@ bool asst::Controller::screencap() { LogTraceFunction; - auto& adb = m_adb; - DecodeFunc decode_raw_with_gzip = [&](const std::vector& data) -> bool { auto unzip_data = gzip::decompress(data.data(), data.size()); Log.trace("unzip data size:", unzip_data.size()); @@ -401,7 +399,7 @@ bool asst::Controller::screencap() if (is_all_zero) { return false; } - cv::Mat temp = cv::Mat(m_width, m_height, CV_8UC4, unzip_data.data() + header_size); + cv::Mat temp(m_height, m_width, CV_8UC4, unzip_data.data() + header_size); if (temp.empty()) { return false; } @@ -421,15 +419,15 @@ bool asst::Controller::screencap() return true; }; - switch (adb.screencap_method) { + switch (m_adb.screencap_method) { case AdbProperty::ScreencapMethod::UnknownYet: { - if (screencap(adb.screencap_raw_with_gzip, decode_raw_with_gzip)) { - adb.screencap_method = AdbProperty::ScreencapMethod::RawWithGzip; + if (screencap(m_adb.screencap_raw_with_gzip, decode_raw_with_gzip)) { + m_adb.screencap_method = AdbProperty::ScreencapMethod::RawWithGzip; return true; } - else if (screencap(adb.screencap_encode, decode_encode)) { - adb.screencap_method = AdbProperty::ScreencapMethod::Encode; + else if (screencap(m_adb.screencap_encode, decode_encode)) { + m_adb.screencap_method = AdbProperty::ScreencapMethod::Encode; return true; } else { @@ -438,12 +436,12 @@ bool asst::Controller::screencap() } case AdbProperty::ScreencapMethod::RawWithGzip: { - return screencap(adb.screencap_raw_with_gzip, decode_raw_with_gzip); + return screencap(m_adb.screencap_raw_with_gzip, decode_raw_with_gzip); } break; case AdbProperty::ScreencapMethod::Encode: { - return screencap(adb.screencap_encode, decode_encode); + return screencap(m_adb.screencap_encode, decode_encode); } break; } @@ -453,7 +451,6 @@ bool asst::Controller::screencap() bool asst::Controller::screencap(const std::string & cmd, DecodeFunc decode_func) { - auto& adb = m_adb; auto ret = call_command(cmd); if (!ret || ret.value().empty()) { @@ -462,25 +459,25 @@ bool asst::Controller::screencap(const std::string & cmd, DecodeFunc decode_func } auto data = std::move(ret).value(); - if (adb.screencap_end_of_line == AdbProperty::ScreencapEndOfLine::CRLF) { + if (m_adb.screencap_end_of_line == AdbProperty::ScreencapEndOfLine::CRLF) { convert_lf(data); } if (decode_func(data)) { - if (adb.screencap_end_of_line == AdbProperty::ScreencapEndOfLine::UnknownYet) { - adb.screencap_end_of_line = AdbProperty::ScreencapEndOfLine::LF; + if (m_adb.screencap_end_of_line == AdbProperty::ScreencapEndOfLine::UnknownYet) { + m_adb.screencap_end_of_line = AdbProperty::ScreencapEndOfLine::LF; } return true; } else { Log.info("data is not empty, but image is empty"); - if (adb.screencap_end_of_line == AdbProperty::ScreencapEndOfLine::UnknownYet) { + if (m_adb.screencap_end_of_line == AdbProperty::ScreencapEndOfLine::UnknownYet) { Log.info("try to cvt lf"); convert_lf(data); if (decode_func(data)) { - adb.screencap_end_of_line = AdbProperty::ScreencapEndOfLine::CRLF; + m_adb.screencap_end_of_line = AdbProperty::ScreencapEndOfLine::CRLF; return true; } else { diff --git a/src/MeoAssistant/Controller.h b/src/MeoAssistant/Controller.h index 1c05617dee..04de3d7f8b 100644 --- a/src/MeoAssistant/Controller.h +++ b/src/MeoAssistant/Controller.h @@ -50,7 +50,7 @@ namespace asst void wait(unsigned id) const noexcept; // 异形屏矫正 - Rect shaped_correct(const Rect& rect) const; + //Rect shaped_correct(const Rect& rect) const; std::pair get_scale_size() const noexcept; Controller& operator=(const Controller&) = delete; diff --git a/src/MeoAssistant/StageDropsTaskPlugin.cpp b/src/MeoAssistant/StageDropsTaskPlugin.cpp index 5cfe246aaa..0c0991dd77 100644 --- a/src/MeoAssistant/StageDropsTaskPlugin.cpp +++ b/src/MeoAssistant/StageDropsTaskPlugin.cpp @@ -64,7 +64,7 @@ bool asst::StageDropsTaskPlugin::recognize_drops() if (need_exit()) { return false; } - cv::Mat image = m_ctrler->get_image(); + const cv::Mat image = m_ctrler->get_image(); std::string res = Resrc.penguin().recognize(image); Log.trace("Results of penguin recognition:\n", res); m_cur_drops = json::parse(res).value();