From be90db2ce56ad46f6eedb253ea0c2c8bd368cbbd Mon Sep 17 00:00:00 2001 From: MistEO Date: Fri, 21 Jan 2022 00:12:39 +0800 Subject: [PATCH] =?UTF-8?q?opt.=E7=AE=80=E5=8D=95=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BA=86=E4=B8=8B=E6=88=98=E6=96=97=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BattlePerspectiveImageAnalyzer.cpp | 18 ++++----- src/MeoAssistant/BattleTask.cpp | 39 ++++++++++--------- src/MeoAssistant/BattleTask.h | 3 ++ src/MeoAssistant/TaskData.cpp | 4 +- tools/TestCaller/main.cpp | 4 +- 5 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/MeoAssistant/BattlePerspectiveImageAnalyzer.cpp b/src/MeoAssistant/BattlePerspectiveImageAnalyzer.cpp index 98a07f8608..d0e7896411 100644 --- a/src/MeoAssistant/BattlePerspectiveImageAnalyzer.cpp +++ b/src/MeoAssistant/BattlePerspectiveImageAnalyzer.cpp @@ -29,7 +29,7 @@ bool asst::BattlePerspectiveImageAnalyzer::placed_analyze() cv::Mat hsv; cv::cvtColor(m_image, hsv, cv::COLOR_BGR2HSV); cv::Mat bin; - cv::inRange(hsv, cv::Scalar(60, 100, 60), cv::Scalar(80, 150, 120), bin); + cv::inRange(hsv, cv::Scalar(60, 100, 60), cv::Scalar(80, 150, 150), bin); // 形态学降噪 cv::Mat morph_dst = bin; @@ -64,13 +64,13 @@ bool asst::BattlePerspectiveImageAnalyzer::placed_analyze() cv::circle(m_image_draw, cv::Point(m_nearest_point.x, m_nearest_point.y), 3, cv::Scalar(255, 255, 0)); #endif -// // 格子的边缘是没法上人的,往格子中间位置校正一下 -// Point home_center(home.x + home.width / 2, home.y + home.height / 2); -// m_nearest_point.x += home_center.x < m_nearest_point.x ? 30 : -30; -// m_nearest_point.y += home_center.y < m_nearest_point.y ? 20 : -20; -// -//#ifdef ASST_DEBUG -// cv::circle(m_image_draw, cv::Point(m_nearest_point.x, m_nearest_point.y), 3, cv::Scalar(255, 255, 0), -1); -//#endif + // // 格子的边缘是没法上人的,往格子中间位置校正一下 + // Point home_center(home.x + home.width / 2, home.y + home.height / 2); + // m_nearest_point.x += home_center.x < m_nearest_point.x ? 30 : -30; + // m_nearest_point.y += home_center.y < m_nearest_point.y ? 20 : -20; + // + //#ifdef ASST_DEBUG + // cv::circle(m_image_draw, cv::Point(m_nearest_point.x, m_nearest_point.y), 3, cv::Scalar(255, 255, 0), -1); + //#endif return true; } diff --git a/src/MeoAssistant/BattleTask.cpp b/src/MeoAssistant/BattleTask.cpp index f6de857a5d..720dcd39f5 100644 --- a/src/MeoAssistant/BattleTask.cpp +++ b/src/MeoAssistant/BattleTask.cpp @@ -27,30 +27,25 @@ bool asst::BattleTask::auto_battle() if (opers.empty()) { return true; } + if (auto cur_home = oper_analyzer.get_homes(); + !cur_home.empty()) { + m_home_cache = cur_home; + } static const std::array RoleOrder = { + Role::Medic, Role::Pioneer, Role::Sniper, - Role::Support, Role::Warrior, + Role::Support, Role::Caster, Role::Special, - Role::Medic, Role::Tank, Role::Drone }; const auto use_oper_task_ptr = Task.get("BattleUseOper"); // 点击当前最合适的干员 - - //auto oper_iter = std::find_first_of( - // opers.cbegin(), opers.cend(), RoleOrder.cbegin(), RoleOrder.cend(), - // [](const Oper& oper, const Role& role) -> bool { - // return oper.available && oper.role == role; - //}); - //if (oper_iter == opers.cend()) { - // return true; - //} Oper opt_oper; bool oper_found = false; for (auto role : RoleOrder) { @@ -74,7 +69,7 @@ bool asst::BattleTask::auto_battle() // 将干员拖动到场上 BattlePerspectiveImageAnalyzer placed_analyzer(Ctrler.get_image()); - placed_analyzer.set_src_homes(oper_analyzer.get_homes()); + placed_analyzer.set_src_homes(m_home_cache); if (!placed_analyzer.analyze()) { return true; } @@ -87,11 +82,19 @@ bool asst::BattleTask::auto_battle() Rect home = placed_analyzer.get_homes().front(); Point home_center(home.x + home.width / 2, home.y + home.height / 2); + int dx = nearest_point.x - home_center.x; + int dy = nearest_point.y - home_center.y; + Point end_point; + switch (opt_oper.role) { case Role::Medic: case Role::Support: - Ctrler.swipe(nearest_point, home_center, 300); - break; + { + constexpr int coeff = 5; + end_point.x = nearest_point.x - coeff * dx; + end_point.y = nearest_point.y - coeff * dy; + } + break; case Role::Pioneer: case Role::Warrior: case Role::Sniper: @@ -101,12 +104,12 @@ bool asst::BattleTask::auto_battle() case Role::Drone: default: { - Point reverse_point; - reverse_point.x = nearest_point.x * 2 - home_center.x; - reverse_point.y = nearest_point.y * 2 - home_center.y; - Ctrler.swipe(nearest_point, reverse_point, 300); + constexpr int coeff = 5; + end_point.x = nearest_point.x + coeff * dx; + end_point.y = nearest_point.y + coeff * dy; } break; } + Ctrler.swipe(nearest_point, end_point, 300); return true; } diff --git a/src/MeoAssistant/BattleTask.h b/src/MeoAssistant/BattleTask.h index 086badffcf..7de588a893 100644 --- a/src/MeoAssistant/BattleTask.h +++ b/src/MeoAssistant/BattleTask.h @@ -1,6 +1,7 @@ #pragma once #include "AbstractTask.h" +#include "AsstDef.h" namespace asst { @@ -14,5 +15,7 @@ namespace asst virtual bool _run() override; bool auto_battle(); + + std::vector m_home_cache; }; } diff --git a/src/MeoAssistant/TaskData.cpp b/src/MeoAssistant/TaskData.cpp index ab0d4273eb..81d9f353c7 100644 --- a/src/MeoAssistant/TaskData.cpp +++ b/src/MeoAssistant/TaskData.cpp @@ -103,7 +103,7 @@ bool asst::TaskData::parse(const json::value& json) for (const json::value& hash : task_json.at("hash").as_array()) { hash_task_info_ptr->hashs.emplace_back(hash.as_string()); } - hash_task_info_ptr->dist_threshold = task_json.get("threshold", 0.0); + hash_task_info_ptr->dist_threshold = task_json.get("threshold", 0); if (task_json.exist("maskRange")) { hash_task_info_ptr->mask_range = std::make_pair( task_json.at("maskRange")[0].as_integer(), @@ -217,4 +217,4 @@ bool asst::TaskData::parse(const json::value& json) } #endif return true; -} \ No newline at end of file +} diff --git a/tools/TestCaller/main.cpp b/tools/TestCaller/main.cpp index 5e287543e4..78a9e8cb20 100644 --- a/tools/TestCaller/main.cpp +++ b/tools/TestCaller/main.cpp @@ -30,14 +30,14 @@ int main(int argc, char** argv) char ch = 0; while (ch != 'q') { + AsstAppendDebug(ptr); // AsstAppendStartUp(ptr); - AsstAppendFight(ptr, "CE-5", 0, 0, 99999); + //AsstAppendFight(ptr, "CE-5", 0, 0, 99999); // AsstAppendVisit(ptr, true); //{ // const int required[] = { 3, 4, 5, 6 }; // AsstStartRecruitCalc(ptr, required, sizeof(required) / sizeof(int), true); // } - // AsstAppendDebug(ptr); //{ // const char* order[] = { "Trade", "Dorm" }; // AsstAppendInfrast(ptr, 1, order, 2, "Money", 0.3);