diff --git a/resource/tasks.json b/resource/tasks.json index a1b04e4918..a2ad959618 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -3036,8 +3036,14 @@ }, "BattleOperAvailable": { "template": "empty.png", - "specialThreshold": 100, - "specialThreshold_Doc": "用于做V通道平均值阈值" + "specialThreshold": 110, + "specialThreshold_Doc": "用于做V通道平均值阈值", + "rectMove": [ + -41, + 6, + 31, + 25 + ] }, "BattleOperRoleRange": { "algorithm": "JustReturn", @@ -3064,6 +3070,8 @@ }, "BattleOperRoleWarrior": { }, + "BattleOperRoleDrone": { + }, "BattleOperCostRange": { "algorithm": "hash", "hash": [ @@ -3123,7 +3131,8 @@ "BattleOperCost3": { "algorithm": "hash", "hash": [ - "3ffe7ffffc3ff81fe01f001f03fe07fc07fe003f001fe01fe01ff83fffff7ffe" + "3ffe7ffffc3ff81fe01f001f03fe07fc07fe003f001fe01fe01ff83fffff7ffe", + "07f01ffe700e700700070007000c0078003c000700070007e007700e1e7e0ff0" ] }, "BattleOperCost4": { @@ -3135,7 +3144,8 @@ "BattleOperCost5": { "algorithm": "hash", "hash": [ - "3ffe7c007c0078007ff87ffe7ffe7c3f781f0007e007f81ffc1fffff7ffe3ffc" + "3ffe7c007c0078007ff87ffe7ffe7c3f781f0007e007f81ffc1fffff7ffe3ffc", + "3ffe38003800780070007ff87ffe703e000f000fc00ff81ffc3f7ffe3ffc07e0" ] }, "BattleOperCost6": { diff --git a/resource/template/BattleOperRoleDrone.png b/resource/template/BattleOperRoleDrone.png new file mode 100644 index 0000000000..f7ed1fad02 Binary files /dev/null and b/resource/template/BattleOperRoleDrone.png differ diff --git a/src/MeoAssistant/BattleImageAnalyzer.cpp b/src/MeoAssistant/BattleImageAnalyzer.cpp index 0f80f093b1..04b886d634 100644 --- a/src/MeoAssistant/BattleImageAnalyzer.cpp +++ b/src/MeoAssistant/BattleImageAnalyzer.cpp @@ -18,6 +18,8 @@ const std::vector& asst::BattleImageAnalyzer::g bool asst::BattleImageAnalyzer::opers_analyze() { + LogTraceFunction; + MultiMatchImageAnalyzer flags_analyzer(m_image); flags_analyzer.set_task_info("BattleOpersFlag"); if (!flags_analyzer.analyze()) { @@ -28,11 +30,14 @@ bool asst::BattleImageAnalyzer::opers_analyze() const auto click_move = Task.get("BattleOperClickRange")->rect_move; const auto role_move = Task.get("BattleOperRoleRange")->rect_move; const auto cost_move = Task.get("BattleOperCostRange")->rect_move; + const auto avlb_move = Task.get("BattleOperAvailable")->rect_move; for (const MatchRect& flag_mrect : flags_analyzer.get_result()) { Oper oper; oper.rect = flag_mrect.rect.move(click_move); - oper.available = oper_available_analyze(oper.rect); + + Rect available_rect = flag_mrect.rect.move(avlb_move); + oper.available = oper_available_analyze(available_rect); #ifdef ASST_DEBUG if (oper.available) { @@ -65,12 +70,13 @@ asst::BattleImageAnalyzer::Role asst::BattleImageAnalyzer::oper_role_analyze(con { Role::Special, "Special" }, { Role::Support, "Support" }, { Role::Tank, "Tank" }, - { Role::Warrior, "Warrior" } + { Role::Warrior, "Warrior" }, + { Role::Drone, "Drone" } }; MatchImageAnalyzer role_analyzer(m_image); - Role result = Role::Invaild; + Role result = Role::Unknown; double max_score = 0; for (auto&& [role, role_name] : RolesName) { role_analyzer.set_task_info("BattleOperRole" + role_name); @@ -86,7 +92,15 @@ asst::BattleImageAnalyzer::Role asst::BattleImageAnalyzer::oper_role_analyze(con } #ifdef ASST_DEBUG - cv::putText(m_image_draw, RolesName.at(result), cv::Point(roi.x, roi.y - 5), 1, 1, cv::Scalar(0, 255, 255)); + std::string role_name; + if (auto iter = RolesName.find(result); + iter == RolesName.cend()) { + role_name = "Unknown"; + } + else { + role_name = iter->second; + } + cv::putText(m_image_draw, role_name, cv::Point(roi.x, roi.y - 5), 1, 1, cv::Scalar(0, 255, 255)); #endif return result; diff --git a/src/MeoAssistant/BattleImageAnalyzer.h b/src/MeoAssistant/BattleImageAnalyzer.h index 922627c316..1a454f03b3 100644 --- a/src/MeoAssistant/BattleImageAnalyzer.h +++ b/src/MeoAssistant/BattleImageAnalyzer.h @@ -8,7 +8,7 @@ namespace asst public: enum class Role { - Invaild, + Unknown, Caster, Medic, Pioneer, @@ -16,12 +16,13 @@ namespace asst Special, Support, Tank, - Warrior + Warrior, + Drone }; struct Oper { int cost = 0; - Role role = Role::Invaild; + Role role = Role::Unknown; bool available = false; Rect rect; }; diff --git a/src/MeoAssistant/HashImageAnalyzer.cpp b/src/MeoAssistant/HashImageAnalyzer.cpp index 085ae518d2..7140491522 100644 --- a/src/MeoAssistant/HashImageAnalyzer.cpp +++ b/src/MeoAssistant/HashImageAnalyzer.cpp @@ -1,6 +1,7 @@ #include "HashImageAnalyzer.h" #include "AsstUtils.hpp" +#include "Logger.hpp" bool asst::HashImageAnalyzer::analyze() { @@ -31,11 +32,13 @@ bool asst::HashImageAnalyzer::analyze() to_hash = bound_bin(to_hash); } std::string hash_result = shash(to_hash); + Log.trace(hash_result); int min_dist = INT_MAX; std::string cur_min_dist_name; for (auto&& [name, templ] : m_hash_templates) { int hm = hamming(hash_result, templ); + Log.trace(name, "dist:", hm); if (hm < min_dist) { cur_min_dist_name = name; min_dist = hm;