From 3e0e7e29ec144d645a71e2ba1696deff4777c03b Mon Sep 17 00:00:00 2001 From: MistEO Date: Thu, 19 Aug 2021 01:30:23 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=9F=BA=E5=BB=BA=E7=9A=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E5=8F=8A=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MeoAssistance/InfrastConfiger.cpp | 46 +-- MeoAssistance/include/AsstDef.h | 33 +- MeoAssistance/include/InfrastConfiger.h | 9 +- MeoAssistance/include/RecruitConfiger.h | 2 +- MeoAssistance/include/Task.h | 4 +- MeoAssistance/src/Assistance.cpp | 8 +- MeoAssistance/src/RecruitConfiger.cpp | 2 +- MeoAssistance/src/Task.cpp | 233 ++++++------- Tools/TestCaller/main.cpp | 4 +- resource/config.json | 4 +- resource/infrast.json | 432 ++++++++++++++---------- 11 files changed, 443 insertions(+), 334 deletions(-) diff --git a/MeoAssistance/InfrastConfiger.cpp b/MeoAssistance/InfrastConfiger.cpp index c53764a650..16e6f01272 100644 --- a/MeoAssistance/InfrastConfiger.cpp +++ b/MeoAssistance/InfrastConfiger.cpp @@ -42,33 +42,39 @@ bool InfrastConfiger::_load(const std::string& filename) json::value root = ret.value(); try { - // 制造站 - for (json::value& comb_info : root["Manufacturing"]["combs"].as_array()) + // 通用的干员信息 + for (json::value& name : root["allNames"].as_array()) { - std::vector comb_vec; - for (json::value& oper_name : comb_info["comb"].as_array()) - { - std::string oper_name_str = oper_name.as_string(); - comb_vec.emplace_back(std::move(oper_name_str)); - } - m_mfg_combs.emplace_back(std::move(comb_vec)); + m_all_opers_name.emplace(name.as_string()); } - m_mfg_end = root["Manufacturing"]["end"].as_string(); - for (json::value& oper : root["Manufacturing"]["all"].as_array()) + for (json::value& pair : root["featureKey"].as_array()) { - m_mfg_opers.emplace(oper["name"].as_string()); + m_oper_name_feat.emplace(pair[0].as_string(), pair[1].as_string()); } - for (json::value& pair : root["Manufacturing"]["featureKey"].as_array()) + for (json::value& name : root["featureWhatever"].as_array()) { - m_mfg_feat.emplace(pair[0].as_string(), pair[1].as_string()); + m_oper_name_feat_whatever.emplace(name.as_string()); } - for (json::value& name : root["Manufacturing"]["featureWhatever"].as_array()) - { - m_mfg_feat_whatever.emplace(name.as_string()); - } - - // 贸易站 TODO…… + // 每个基建设施中的干员组合信息 + for (json::value& facility : root["infrast"].as_array()) + { + std::string key = facility["facility"].as_string(); + std::vector< std::vector> combs_vec; + for (json::value& comb : facility["combs"].as_array()) + { + std::vector opers; + for (json::value& oper : comb["opers"].as_array()) { + OperInfrastInfo info; + info.name = oper["name"].as_string(); + info.elite = oper.get("elite", 0); + info.level = oper.get("level", 0); + opers.emplace_back(std::move(info)); + } + combs_vec.emplace_back(std::move(opers)); + } + m_infrast_combs.emplace(std::move(key), std::move(combs_vec)); + } } catch (json::exception& e) { DebugTraceError("Load config json error!", e.what()); diff --git a/MeoAssistance/include/AsstDef.h b/MeoAssistance/include/AsstDef.h index c57d0a725b..b0205b0772 100644 --- a/MeoAssistance/include/AsstDef.h +++ b/MeoAssistance/include/AsstDef.h @@ -70,7 +70,7 @@ namespace asst { { int half_width_scale = static_cast(width * (1 - scale) / 2); int half_hight_scale = static_cast(height * (1 - scale) / 2); - return { x + half_width_scale, y + half_hight_scale, + return { x + half_width_scale, y + half_hight_scale, static_cast(width * scale), static_cast(height * scale) }; } int x = 0; @@ -177,8 +177,8 @@ namespace asst { int ocr_thread_number = 0; // OcrLite线程数量 }; - // 干员信息 - struct OperInfo { + // 干员信息,公开招募相关 + struct OperRecruitInfo { std::string name; std::string type; int level = 0; @@ -188,13 +188,34 @@ namespace asst { std::string name_en; }; - // 干员组合 - struct OperCombs { - std::vector opers; + // 公开招募的干员组合 + struct OperRecruitCombs { + std::vector opers; int max_level = 0; int min_level = 0; double avg_level = 0; }; + // 干员信息,基建相关 + struct OperInfrastInfo { + std::string name; + int elite = 0; // 精英化等级 + int level = 0; // 等级 + bool operator==(const OperInfrastInfo& rhs) const { + return name == rhs.name; + } + }; + constexpr double DoubleDiff = 1e-12; +} + +namespace std { + template<> + class hash { + public: + size_t operator()(const asst::OperInfrastInfo& info) const + { + return std::hash()(info.name); + } + }; } \ No newline at end of file diff --git a/MeoAssistance/include/InfrastConfiger.h b/MeoAssistance/include/InfrastConfiger.h index a5d1c17dff..40ada7b9ab 100644 --- a/MeoAssistance/include/InfrastConfiger.h +++ b/MeoAssistance/include/InfrastConfiger.h @@ -18,12 +18,11 @@ namespace asst { } bool load(const std::string& filename); + std::unordered_set m_all_opers_name; // 所有干员的名字 + std::unordered_map m_oper_name_feat; // 根据关键字需要特征检测干员名:如果OCR识别到了key的内容但是却没有value的内容,则进行特征检测进一步确认 + std::unordered_set m_oper_name_feat_whatever; // 无论如何都进行特征检测的干员名 - std::vector> m_mfg_combs; // 制造站组合 - std::unordered_set m_mfg_opers; // 制造站所有干员 - std::unordered_map m_mfg_feat; // 特征检测关键字,如果OCR识别到了key的内容但是却没有value的内容,则进行特征检测进一步确认 - std::unordered_set m_mfg_feat_whatever; // 无论如何都进行特征检测的干员名 - std::string m_mfg_end; // 识别到这个词,就认为干员遍历结束,一般用排序里最后的那个干员(?) + std::unordered_map>> m_infrast_combs; // 各个设施内的可能干员组合 private: InfrastConfiger() = default; diff --git a/MeoAssistance/include/RecruitConfiger.h b/MeoAssistance/include/RecruitConfiger.h index c5ac2f3d6a..e1566d5a1b 100644 --- a/MeoAssistance/include/RecruitConfiger.h +++ b/MeoAssistance/include/RecruitConfiger.h @@ -22,7 +22,7 @@ namespace asst { std::unordered_set m_all_tags; std::unordered_set m_all_types; - std::vector m_all_opers; + std::vector m_all_opers; constexpr static int CorrectNumberOfTags = 5; diff --git a/MeoAssistance/include/Task.h b/MeoAssistance/include/Task.h index 0a66f03252..8aa2ac06ae 100644 --- a/MeoAssistance/include/Task.h +++ b/MeoAssistance/include/Task.h @@ -272,12 +272,12 @@ namespace asst { m_swipe_end = end_rect; m_swipe_max_times = max_times; } - void set_facility(FacilityType facility) + void set_facility(const std::string& facility) { m_facility = facility; } private: - FacilityType m_facility = FacilityType::Invalid; + std::string m_facility; int m_swipe_delay = 0; Rect m_swipe_begin; Rect m_swipe_end; diff --git a/MeoAssistance/src/Assistance.cpp b/MeoAssistance/src/Assistance.cpp index d2a3b32027..5fedbe2549 100644 --- a/MeoAssistance/src/Assistance.cpp +++ b/MeoAssistance/src/Assistance.cpp @@ -68,14 +68,14 @@ Assistance::Assistance(AsstCallback callback, void* callback_arg) return; } - for (const auto& [key, name] : InfrastConfiger::get_instance().m_mfg_feat) { + for (const auto& [key, name] : InfrastConfiger::get_instance().m_oper_name_feat) { ret = m_identify_ptr->add_text_image(name, GetResourceDir() + "operators\\" + Utf8ToGbk(name) + ".png"); if (!ret) { callback_error(); return; } } - for (const auto& name : InfrastConfiger::get_instance().m_mfg_feat_whatever) { + for (const auto& name : InfrastConfiger::get_instance().m_oper_name_feat_whatever) { ret = m_identify_ptr->add_text_image(name, GetResourceDir() + "operators\\" + Utf8ToGbk(name) + ".png"); if (!ret) { callback_error(); @@ -255,8 +255,8 @@ bool asst::Assistance::start_infrast() auto task_ptr = std::make_shared(task_callback, (void*)this); // TODO 这个参数写到配置文件里,TODO 滑动位置要根据分辨率缩放 - task_ptr->set_swipe_param(1000, Rect(1800, 800, 0, 0), Rect(1200, 800, 0, 0), 20); - task_ptr->set_facility(FacilityType::Manufacturing); + task_ptr->set_swipe_param(2100, Rect(2400, 800, 0, 0), Rect(400, 800, 0, 0), 20); + task_ptr->set_facility("Manufacturing"); task_ptr->set_task_chain("Infrast"); m_tasks_queue.emplace(task_ptr); diff --git a/MeoAssistance/src/RecruitConfiger.cpp b/MeoAssistance/src/RecruitConfiger.cpp index 1e84a69d25..29bb765669 100644 --- a/MeoAssistance/src/RecruitConfiger.cpp +++ b/MeoAssistance/src/RecruitConfiger.cpp @@ -51,7 +51,7 @@ bool asst::RecruitConfiger::_load(const std::string& filename) json::value root = ret.value(); try { for (json::value& oper : root.as_array()) { - OperInfo oper_temp; + OperRecruitInfo oper_temp; oper_temp.name = oper["name"].as_string(); oper_temp.type = oper["type"].as_string(); m_all_types.emplace(oper_temp.type); diff --git a/MeoAssistance/src/Task.cpp b/MeoAssistance/src/Task.cpp index 4d8fd72bcb..d733fd8b93 100644 --- a/MeoAssistance/src/Task.cpp +++ b/MeoAssistance/src/Task.cpp @@ -517,10 +517,10 @@ bool OpenRecruitTask::run() } // key: tags comb, value: 干员组合 - // 例如 key: { "狙击"、"群攻" },value: OperCombs.opers{ "陨星", "白雪", "空爆" } - std::map, OperCombs> result_map; + // 例如 key: { "狙击"、"群攻" },value: OperRecruitCombs.opers{ "陨星", "白雪", "空爆" } + std::map, OperRecruitCombs> result_map; for (const std::vector& comb : all_combs) { - for (const OperInfo& cur_oper : RecruitConfiger::get_instance().m_all_opers) { + for (const OperRecruitInfo& cur_oper : RecruitConfiger::get_instance().m_all_opers) { int matched_count = 0; for (const std::string& tag : comb) { if (cur_oper.tags.find(tag) != cur_oper.tags.cend()) { @@ -544,7 +544,7 @@ bool OpenRecruitTask::run() } } - OperCombs& oper_combs = result_map[comb]; + OperRecruitCombs& oper_combs = result_map[comb]; oper_combs.opers.emplace_back(cur_oper); if (cur_oper.level == 1 || cur_oper.level == 2) { @@ -562,13 +562,13 @@ bool OpenRecruitTask::run() oper_combs.avg_level += cur_oper.level; } if (result_map.find(comb) != result_map.cend()) { - OperCombs& oper_combs = result_map[comb]; + OperRecruitCombs& oper_combs = result_map[comb]; oper_combs.avg_level /= oper_combs.opers.size(); } } // map没法按值排序,转个vector再排序 - std::vector, OperCombs>> result_vector; + std::vector, OperRecruitCombs>> result_vector; for (auto&& pair : result_map) { result_vector.emplace_back(std::move(pair)); } @@ -604,7 +604,7 @@ bool OpenRecruitTask::run() comb_json["tags"] = json::array(std::move(tags_json_vector)); std::vector opers_json_vector; - for (const OperInfo& oper_info : oper_comb.opers) { + for (const OperRecruitInfo& oper_info : oper_comb.opers) { json::value oper_json; oper_json["name"] = Utf8ToGbk(oper_info.name); oper_json["level"] = oper_info.level; @@ -685,27 +685,12 @@ bool TestOcrTask::run() return false; } - std::vector> all_oper_combs; // 所有的干员组合 - std::unordered_set all_oper_name; // 所有干员名 - std::string oper_end_flag; // 干员名结束标记,识别到这个string就认为识别完成了 - std::unordered_map feature_cond_default; // 特征检测关键字,如果OCR识别到了key的内容但是却没有value的内容,则进行特征检测进一步确认 - std::unordered_set feature_whatever_default; // 无论如何都进行特征检测的 - - all_oper_combs = InfrastConfiger::get_instance().m_mfg_combs; - all_oper_name = InfrastConfiger::get_instance().m_mfg_opers; - oper_end_flag = InfrastConfiger::get_instance().m_mfg_end; - feature_cond_default = InfrastConfiger::get_instance().m_mfg_feat; - feature_whatever_default = InfrastConfiger::get_instance().m_mfg_feat_whatever; - - std::unordered_map feature_cond = feature_cond_default; - std::unordered_set feature_whatever = feature_whatever_default; - auto detect_foo = [&](const cv::Mat& image) -> std::vector