From b0f16bf4aa7dbed765fdd86b93eda2beda2dc901 Mon Sep 17 00:00:00 2001 From: status102 <102887808+status102@users.noreply.github.com> Date: Sun, 18 May 2025 20:57:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=87=AA=E5=8A=A8=E6=88=98=E6=96=97?= =?UTF-8?q?=E7=BC=96=E9=98=9F=E6=97=B6=E9=87=8D=E5=A4=8D=E9=80=89=E4=B8=AD?= =?UTF-8?q?=E5=90=8C=E4=B8=80=E5=B9=B2=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Task/Miscellaneous/BattleFormationTask.cpp | 15 ++++++++++----- .../Task/Miscellaneous/BattleFormationTask.h | 7 ++++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp b/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp index f461f3dded..6d3a7a27d6 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp +++ b/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp @@ -347,13 +347,13 @@ void asst::BattleFormationTask::report_missing_operators(std::vector& callback(AsstMsg::SubTaskError, info); } -std::vector asst::BattleFormationTask::analyzer_opers() +std::vector asst::BattleFormationTask::analyzer_opers() { auto formation_task_ptr = Task.get("BattleQuickFormationOCR"); auto image = ctrler()->get_image(); const auto& ocr_replace = Task.get("CharsNameOcrReplace"); - std::vector opers_result; - + std::vector opers_result; + cv::Mat select; for (int i = 0; i < 8; ++i) { std::string task_name = "BattleQuickFormation-OperNameFlag" + std::to_string(i); @@ -378,7 +378,11 @@ std::vector asst::BattleFormationTask::analyzer_ope if (find_it != opers_result.end() || res.text.empty()) { continue; } - opers_result.emplace_back(std::move(res)); + QuickFormationOper oper(res); + select = make_roi(image, res.flag_rect.move({ 0, -10, 5, 4 })); + cv::inRange(select, cv::Scalar(200, 140, 0), cv::Scalar(255, 180, 100), select); + oper.is_selected = cv::hasNonZero(select); + opers_result.emplace_back(std::move(oper)); } } @@ -417,7 +421,8 @@ bool asst::BattleFormationTask::select_opers_in_cur_page(std::vector& int delay = Task.get("BattleQuickFormationOCR")->post_delay; int skill = 0; - for (const auto& res : opers_result) { + for (const auto& res : + opers_result | views::filter([](const QuickFormationOper& oper) { return !oper.is_selected; })) { const std::string& name = res.text; bool found = false; auto iter = groups.begin(); diff --git a/src/MaaCore/Task/Miscellaneous/BattleFormationTask.h b/src/MaaCore/Task/Miscellaneous/BattleFormationTask.h index 4c62b8c007..69c8cdbd45 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleFormationTask.h +++ b/src/MaaCore/Task/Miscellaneous/BattleFormationTask.h @@ -29,6 +29,11 @@ public: battle::RoleCounts role_counts; }; + struct QuickFormationOper : public asst::TemplDetOCRer::Result + { + bool is_selected = false; // 是否选中 + }; + void append_additional_formation(AdditionalFormation formation) { m_additional.emplace_back(std::move(formation)); } // 设置追加自定干员列表 @@ -98,7 +103,7 @@ protected: bool select_random_support_unit(); void report_missing_operators(std::vector& groups); - std::vector analyzer_opers(); + std::vector analyzer_opers(); std::string m_stage_name; std::unordered_map> m_formation;