diff --git a/src/MeoAssistant/BattleFormationTask.cpp b/src/MeoAssistant/BattleFormationTask.cpp index 574e37dcc2..7aded579b6 100644 --- a/src/MeoAssistant/BattleFormationTask.cpp +++ b/src/MeoAssistant/BattleFormationTask.cpp @@ -55,7 +55,7 @@ bool asst::BattleFormationTask::select_opers_in_cur_page() { auto formation_task_ptr = Task.get("BattleQuickFormationOCR"); OcrWithFlagTemplImageAnalyzer name_analyzer(m_ctrler->get_image()); - auto& ocr_replace = std::dynamic_pointer_cast(Task.get("CharsNameOcrReplace"))->replace_map; + auto& ocr_replace = Task.get("CharsNameOcrReplace")->replace_map; name_analyzer.set_task_info("BattleQuickFormation-OperNameFlag", "BattleQuickFormationOCR"); name_analyzer.set_replace(ocr_replace); if (!name_analyzer.analyze()) { diff --git a/src/MeoAssistant/BattleImageAnalyzer.cpp b/src/MeoAssistant/BattleImageAnalyzer.cpp index 8467703315..ff2e3a27a8 100644 --- a/src/MeoAssistant/BattleImageAnalyzer.cpp +++ b/src/MeoAssistant/BattleImageAnalyzer.cpp @@ -214,8 +214,7 @@ asst::BattleRole asst::BattleImageAnalyzer::oper_role_analyze(const Rect& roi) bool asst::BattleImageAnalyzer::oper_cooling_analyze(const Rect& roi) { - const auto cooling_task_ptr = std::dynamic_pointer_cast( - Task.get("BattleOperCooling")); + const auto cooling_task_ptr = Task.get("BattleOperCooling"); cv::Mat hsv; cv::cvtColor(m_image(utils::make_rect(roi)), hsv, cv::COLOR_BGR2HSV); @@ -301,8 +300,8 @@ bool asst::BattleImageAnalyzer::oper_available_analyze(const Rect& roi) cv::Scalar avg = cv::mean(hsv); Log.trace("oper available, mean", avg[2]); - static int thres = static_cast(std::dynamic_pointer_cast( - Task.get("BattleOperAvailable"))->special_threshold); + static int thres = static_cast( + Task.get("BattleOperAvailable")->special_threshold); if (avg[2] < thres) { return false; } @@ -442,7 +441,7 @@ bool asst::BattleImageAnalyzer::kills_analyze() OcrWithFlagTemplImageAnalyzer kills_analyzer(m_image); kills_analyzer.set_task_info("BattleKillsFlag", "BattleKills"); kills_analyzer.set_replace( - std::dynamic_pointer_cast(Task.get("NumberOcrReplace"))->replace_map); + Task.get("NumberOcrReplace")->replace_map); if (!kills_analyzer.analyze()) { return false; @@ -512,7 +511,7 @@ bool asst::BattleImageAnalyzer::cost_analyze() OcrWithPreprocessImageAnalyzer cost_analyzer(m_image); cost_analyzer.set_task_info("BattleCostData"); cost_analyzer.set_replace( - std::dynamic_pointer_cast(Task.get("NumberOcrReplace"))->replace_map); + Task.get("NumberOcrReplace")->replace_map); if (!cost_analyzer.analyze()) { return false; diff --git a/src/MeoAssistant/BattleProcessTask.cpp b/src/MeoAssistant/BattleProcessTask.cpp index b3f3a9ca8b..cb74b1e275 100644 --- a/src/MeoAssistant/BattleProcessTask.cpp +++ b/src/MeoAssistant/BattleProcessTask.cpp @@ -165,9 +165,7 @@ bool asst::BattleProcessTask::analyze_opers_preview() OcrWithPreprocessImageAnalyzer name_analyzer(image); name_analyzer.set_task_info("BattleOperName"); name_analyzer.set_replace( - std::dynamic_pointer_cast( - Task.get("CharsNameOcrReplace")) - ->replace_map); + Task.get("CharsNameOcrReplace")->replace_map); std::string oper_name = "Unknown"; if (name_analyzer.analyze()) { @@ -280,9 +278,7 @@ bool asst::BattleProcessTask::update_opers_info(const cv::Mat& image) OcrWithPreprocessImageAnalyzer name_analyzer(m_ctrler->get_image()); name_analyzer.set_task_info("BattleOperName"); name_analyzer.set_replace( - std::dynamic_pointer_cast( - Task.get("CharsNameOcrReplace")) - ->replace_map); + Task.get("CharsNameOcrReplace")->replace_map); if (name_analyzer.analyze()) { name_analyzer.sort_result_by_score(); diff --git a/src/MeoAssistant/CreditShopImageAnalyzer.cpp b/src/MeoAssistant/CreditShopImageAnalyzer.cpp index e8ec0264f8..bf952bfa26 100644 --- a/src/MeoAssistant/CreditShopImageAnalyzer.cpp +++ b/src/MeoAssistant/CreditShopImageAnalyzer.cpp @@ -59,8 +59,7 @@ bool asst::CreditShopImageAnalyzer::commoditys_analyze() bool asst::CreditShopImageAnalyzer::whether_to_buy_analyze() { - const auto product_name_task_ptr = std::dynamic_pointer_cast( - Task.get("CreditShop-ProductName")); + const auto product_name_task_ptr = Task.get("CreditShop-ProductName"); for (const Rect& commodity : m_commoditys) { // 商品名的区域 diff --git a/src/MeoAssistant/DepotImageAnalyzer.cpp b/src/MeoAssistant/DepotImageAnalyzer.cpp index e311958a3d..6f6788eff9 100644 --- a/src/MeoAssistant/DepotImageAnalyzer.cpp +++ b/src/MeoAssistant/DepotImageAnalyzer.cpp @@ -193,8 +193,7 @@ size_t asst::DepotImageAnalyzer::match_item(const Rect& roi, /* out */ ItemInfo& int asst::DepotImageAnalyzer::match_quantity(const Rect& roi) { - auto task_ptr = std::dynamic_pointer_cast( - Task.get("DeoptQuantity")); + auto task_ptr = Task.get("DeoptQuantity"); Rect quantity_roi = roi.move(task_ptr->roi); cv::Mat quantity_img = m_image_resized(utils::make_rect(quantity_roi)); diff --git a/src/MeoAssistant/InfrastOperImageAnalyzer.cpp b/src/MeoAssistant/InfrastOperImageAnalyzer.cpp index a10a749b28..084517867f 100644 --- a/src/MeoAssistant/InfrastOperImageAnalyzer.cpp +++ b/src/MeoAssistant/InfrastOperImageAnalyzer.cpp @@ -128,8 +128,7 @@ void asst::InfrastOperImageAnalyzer::mood_analyze() { LogTraceFunction; - const auto prg_task_ptr = std::dynamic_pointer_cast( - Task.get("InfrastOperMoodProgressBar")); + const auto prg_task_ptr = Task.get("InfrastOperMoodProgressBar"); uint8_t prg_lower_limit = static_cast(prg_task_ptr->templ_threshold); int prg_diff_thres = static_cast(prg_task_ptr->special_threshold); Rect rect_move = prg_task_ptr->rect_move; @@ -221,8 +220,7 @@ void asst::InfrastOperImageAnalyzer::skill_analyze() { LogTraceFunction; - const auto task_ptr = std::dynamic_pointer_cast( - Task.get("InfrastSkills")); + const auto task_ptr = Task.get("InfrastSkills"); const auto bright_thres = task_ptr->special_threshold; MatchImageAnalyzer skill_analyzer(m_image); @@ -347,8 +345,7 @@ void asst::InfrastOperImageAnalyzer::selected_analyze() { LogTraceFunction; - const auto selected_task_ptr = std::dynamic_pointer_cast( - Task.get("InfrastOperSelected")); + const auto selected_task_ptr = Task.get("InfrastOperSelected"); Rect rect_move = selected_task_ptr->rect_move; for (auto&& oper : m_result) { diff --git a/src/MeoAssistant/InfrastProductionTask.cpp b/src/MeoAssistant/InfrastProductionTask.cpp index 9c01c6defe..67d9fc0125 100644 --- a/src/MeoAssistant/InfrastProductionTask.cpp +++ b/src/MeoAssistant/InfrastProductionTask.cpp @@ -383,9 +383,7 @@ bool asst::InfrastProductionTask::optimal_calc() else { OcrWithPreprocessImageAnalyzer name_analyzer(find_iter->name_img); name_analyzer.set_replace( - std::dynamic_pointer_cast( - Task.get("CharsNameOcrReplace")) - ->replace_map); + Task.get("CharsNameOcrReplace")->replace_map); Log.trace("Analyze name filter"); if (!name_analyzer.analyze()) { continue; @@ -518,9 +516,7 @@ bool asst::InfrastProductionTask::opers_choose() else { OcrWithPreprocessImageAnalyzer name_analyzer(lhs.name_img); name_analyzer.set_replace( - std::dynamic_pointer_cast( - Task.get("CharsNameOcrReplace")) - ->replace_map); + Task.get("CharsNameOcrReplace")->replace_map); Log.trace("Analyze name filter"); if (!name_analyzer.analyze()) { return false; diff --git a/src/MeoAssistant/OcrWithFlagTemplImageAnalyzer.cpp b/src/MeoAssistant/OcrWithFlagTemplImageAnalyzer.cpp index 7d6ff72979..9b274a7f79 100644 --- a/src/MeoAssistant/OcrWithFlagTemplImageAnalyzer.cpp +++ b/src/MeoAssistant/OcrWithFlagTemplImageAnalyzer.cpp @@ -62,7 +62,7 @@ const std::vector& asst::OcrWithFlagTemplImageAnalyzer::get_resu void asst::OcrWithFlagTemplImageAnalyzer::set_task_info(const std::string& templ_task_name, const std::string& ocr_task_name) { - auto ocr_task_ptr = std::dynamic_pointer_cast(Task.get(ocr_task_name)); + auto ocr_task_ptr = Task.get(ocr_task_name); OcrWithPreprocessImageAnalyzer::set_task_info(*ocr_task_ptr); m_flag_rect_move = ocr_task_ptr->roi; m_multi_match_image_analyzer.set_task_info(templ_task_name); diff --git a/src/MeoAssistant/RecruitImageAnalyzer.cpp b/src/MeoAssistant/RecruitImageAnalyzer.cpp index d742c9b67b..72d7da0754 100644 --- a/src/MeoAssistant/RecruitImageAnalyzer.cpp +++ b/src/MeoAssistant/RecruitImageAnalyzer.cpp @@ -22,8 +22,7 @@ bool asst::RecruitImageAnalyzer::tags_analyze() static bool analyzer_inited = false; static OcrImageAnalyzer tags_analyzer; if (!analyzer_inited) { - const auto tags_task_ptr = std::dynamic_pointer_cast( - Task.get("RecruitTags")); + const auto tags_task_ptr = Task.get("RecruitTags"); tags_analyzer.set_roi(tags_task_ptr->roi); auto& all_tags_set = Resrc.recruit().get_all_tags(); std::vector all_tags_vec; diff --git a/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp b/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp index 1a98d13150..becd93b9e8 100644 --- a/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp +++ b/src/MeoAssistant/RoguelikeBattleTaskPlugin.cpp @@ -295,9 +295,7 @@ bool asst::RoguelikeBattleTaskPlugin::auto_battle() OcrWithPreprocessImageAnalyzer oper_name_analyzer(m_ctrler->get_image()); oper_name_analyzer.set_task_info("BattleOperName"); oper_name_analyzer.set_replace( - std::dynamic_pointer_cast( - Task.get("CharsNameOcrReplace")) - ->replace_map); + Task.get("CharsNameOcrReplace")->replace_map); std::string oper_name = "Unknown"; if (oper_name_analyzer.analyze()) { diff --git a/src/MeoAssistant/RoguelikeFormationImageAnalyzer.cpp b/src/MeoAssistant/RoguelikeFormationImageAnalyzer.cpp index 9c712fcbbc..c0430d9e77 100644 --- a/src/MeoAssistant/RoguelikeFormationImageAnalyzer.cpp +++ b/src/MeoAssistant/RoguelikeFormationImageAnalyzer.cpp @@ -46,8 +46,7 @@ bool asst::RoguelikeFormationImageAnalyzer::selected_analyze(const Rect& roi) cv::Mat img_roi = m_image(utils::make_rect(roi)); cv::Mat hsv; - const auto selected_task_ptr = std::dynamic_pointer_cast( - Task.get("Roguelike1FormationOperSelected")); + const auto selected_task_ptr = Task.get("Roguelike1FormationOperSelected"); cv::cvtColor(img_roi, hsv, cv::COLOR_BGR2HSV); std::vector channels; cv::split(hsv, channels); diff --git a/src/MeoAssistant/RoguelikeRecruitImageAnalyzer.cpp b/src/MeoAssistant/RoguelikeRecruitImageAnalyzer.cpp index eabed13917..e39faae750 100644 --- a/src/MeoAssistant/RoguelikeRecruitImageAnalyzer.cpp +++ b/src/MeoAssistant/RoguelikeRecruitImageAnalyzer.cpp @@ -13,9 +13,7 @@ bool asst::RoguelikeRecruitImageAnalyzer::analyze() OcrWithFlagTemplImageAnalyzer analyzer(m_image); analyzer.set_task_info("Roguelike1RecruitOcrFlag", "Roguelike1RecruitOcr"); analyzer.set_replace( - std::dynamic_pointer_cast( - Task.get("CharsNameOcrReplace")) - ->replace_map); + Task.get("CharsNameOcrReplace")->replace_map); analyzer.set_required(Resrc.roguelike_recruit().get_oper_order()); @@ -80,7 +78,7 @@ int asst::RoguelikeRecruitImageAnalyzer::match_level(const Rect& raw_roi) auto task_ptr = Task.get("Roguelike1RecruitLevel"); OcrWithPreprocessImageAnalyzer analyzer(m_image, raw_roi.move(task_ptr->roi)); - auto& replace = std::dynamic_pointer_cast(Task.get("NumberOcrReplace"))->replace_map; + auto& replace = Task.get("NumberOcrReplace")->replace_map; analyzer.set_replace(replace); analyzer.set_expansion(1); diff --git a/src/MeoAssistant/RoguelikeSkillSelectionImageAnalyzer.cpp b/src/MeoAssistant/RoguelikeSkillSelectionImageAnalyzer.cpp index 6d015650c5..e83ea309c7 100644 --- a/src/MeoAssistant/RoguelikeSkillSelectionImageAnalyzer.cpp +++ b/src/MeoAssistant/RoguelikeSkillSelectionImageAnalyzer.cpp @@ -44,7 +44,7 @@ bool asst::RoguelikeSkillSelectionImageAnalyzer::analyze() std::string asst::RoguelikeSkillSelectionImageAnalyzer::name_analyze(const Rect& roi) { OcrWithPreprocessImageAnalyzer analyzer; - auto name_task_ptr = std::dynamic_pointer_cast(Task.get("Roguelike1SkillSelectionName")); + auto name_task_ptr = Task.get("Roguelike1SkillSelectionName"); analyzer.set_task_info(name_task_ptr); analyzer.set_image(m_image, roi.move(name_task_ptr->roi)); analyzer.set_required(Resrc.roguelike_recruit().get_oper_order()); @@ -61,7 +61,7 @@ std::string asst::RoguelikeSkillSelectionImageAnalyzer::name_analyze(const Rect& std::vector asst::RoguelikeSkillSelectionImageAnalyzer::skill_analyze(const Rect& roi) { - const auto task_ptr = std::dynamic_pointer_cast(Task.get("Roguelike1SkillSelectionRect")); + const auto task_ptr = Task.get("Roguelike1SkillSelectionRect"); Rect cor_roi = roi.move(task_ptr->roi); cv::Mat image_roi = m_image(utils::make_rect(cor_roi)); diff --git a/src/MeoAssistant/StageDropsImageAnalyzer.cpp b/src/MeoAssistant/StageDropsImageAnalyzer.cpp index 1ee763c95e..eaacee0cca 100644 --- a/src/MeoAssistant/StageDropsImageAnalyzer.cpp +++ b/src/MeoAssistant/StageDropsImageAnalyzer.cpp @@ -235,8 +235,7 @@ bool asst::StageDropsImageAnalyzer::analyze_baseline() { LogTraceFunction; - auto task_ptr = std::dynamic_pointer_cast( - Task.get("StageDrops-BaseLine")); + auto task_ptr = Task.get("StageDrops-BaseLine"); cv::Mat roi = m_image(utils::make_rect(task_ptr->roi)); cv::Mat gray; @@ -444,8 +443,7 @@ std::string asst::StageDropsImageAnalyzer::match_item(const Rect& roi, StageDrop int asst::StageDropsImageAnalyzer::match_quantity(const Rect& roi) { - auto task_ptr = std::dynamic_pointer_cast( - Task.get("StageDrops-Quantity")); + auto task_ptr = Task.get("StageDrops-Quantity"); Rect quantity_roi = roi.move(task_ptr->roi); cv::Mat quantity_img = m_image(utils::make_rect(quantity_roi)); diff --git a/src/MeoAssistant/TaskData.cpp b/src/MeoAssistant/TaskData.cpp index 92249f1642..22190fd73a 100644 --- a/src/MeoAssistant/TaskData.cpp +++ b/src/MeoAssistant/TaskData.cpp @@ -9,27 +9,12 @@ #include "TemplResource.h" #include "Logger.hpp" -std::shared_ptr asst::TaskData::get(const std::string& name) const noexcept -{ - if (auto iter = m_all_tasks_info.find(name); - iter != m_all_tasks_info.cend()) { - return iter->second; - } - else { - return nullptr; - } -} const std::unordered_set& asst::TaskData::get_templ_required() const noexcept { return m_templ_required; } -std::shared_ptr asst::TaskData::get(const std::string& name) -{ - return m_all_tasks_info[name]; -} - bool asst::TaskData::parse(const json::value& json) { LogTraceFunction; diff --git a/src/MeoAssistant/TaskData.h b/src/MeoAssistant/TaskData.h index 590c1075d0..32adeff585 100644 --- a/src/MeoAssistant/TaskData.h +++ b/src/MeoAssistant/TaskData.h @@ -25,8 +25,24 @@ namespace asst } const std::unordered_set& get_templ_required() const noexcept; - std::shared_ptr get(const std::string& name) const noexcept; - std::shared_ptr get(const std::string& name); + template + constexpr std::shared_ptr get(const std::string& name) + { + auto it = m_all_tasks_info.find(name); + if (it == m_all_tasks_info.cend()) { + return nullptr; + } + + if constexpr (std::is_same_v) { + return it->second; + } + else if constexpr (std::is_base_of_v) { + return std::dynamic_pointer_cast(it->second); + } + else { + static_assert(!sizeof(TargetTaskInfoType), "Parameter must be a TaskInfo"); + } + } protected: TaskData() = default;