diff --git a/src/MaaCore/Config/Miscellaneous/RecruitConfig.h b/src/MaaCore/Config/Miscellaneous/RecruitConfig.h index 88dc6d9f0c..2ddc555e73 100644 --- a/src/MaaCore/Config/Miscellaneous/RecruitConfig.h +++ b/src/MaaCore/Config/Miscellaneous/RecruitConfig.h @@ -44,11 +44,48 @@ namespace asst } }; + // 选择额外 Tags 的模式 + enum class ExtraTagsMode + { + NoExtra, // 0 - 默认行为 + Extra, // 1 - 选 3 个 Tags, 即使可能冲突 + ExtraOnlyRare, // 2 - 如果可能, 同时选择更多的高星 Tag 组合, 即使可能冲突 + }; + + class RecruitConfig final : public SingletonHolder, public AbstractConfig + { + public: + using TagId = std::string; + + public: + static constexpr bool is_valid_extra_tags_mode(ExtraTagsMode mode) + { + return mode == ExtraTagsMode::NoExtra || mode == ExtraTagsMode::Extra || mode == ExtraTagsMode::ExtraOnlyRare; + } + + public: + virtual ~RecruitConfig() override = default; + static constexpr int CorrectNumberOfTags = 5; + + const std::unordered_set& get_all_tags() const noexcept { return m_all_tags; } + const std::vector& get_all_opers() const noexcept { return m_all_opers; } + std::string get_tag_name(const TagId& id) const noexcept; + + protected: + virtual bool parse(const json::value& json) override; + + void clear(); + + std::unordered_set m_all_tags; + std::vector m_all_opers; + std::unordered_map m_all_tags_name; + }; + // 公开招募的干员组合 struct RecruitCombs { // TODO: using vector here can be expensive - std::vector tags; + std::vector tags; std::vector opers; int max_level = 0; int min_level = 0; @@ -89,41 +126,5 @@ namespace asst } }; - // 选择额外 Tags 的模式 - enum class ExtraTagsMode - { - NoExtra, // 0 - 默认行为 - Extra, // 1 - 选 3 个 Tags, 即使可能冲突 - ExtraOnlyRare, // 2 - 如果可能, 同时选择更多的高星 Tag 组合, 即使可能冲突 - }; - - class RecruitConfig final : public SingletonHolder, public AbstractConfig - { - public: - using TagId = std::string; - - public: - static constexpr bool is_valid_extra_tags_mode(ExtraTagsMode mode) - { - return mode == ExtraTagsMode::NoExtra || mode == ExtraTagsMode::Extra || mode == ExtraTagsMode::ExtraOnlyRare; - } - - public: - virtual ~RecruitConfig() override = default; - static constexpr int CorrectNumberOfTags = 5; - - const std::unordered_set& get_all_tags() const noexcept { return m_all_tags; } - const std::vector& get_all_opers() const noexcept { return m_all_opers; } - std::string get_tag_name(const TagId& id) const noexcept; - - protected: - virtual bool parse(const json::value& json) override; - - void clear(); - - std::unordered_set m_all_tags; - std::vector m_all_opers; - std::unordered_map m_all_tags_name; - }; inline static auto& RecruitData = RecruitConfig::get_instance(); } // namespace asst diff --git a/src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp b/src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp index ec71967ef3..bccfa39a22 100644 --- a/src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp +++ b/src/MaaCore/Task/Miscellaneous/AutoRecruitTask.cpp @@ -838,13 +838,13 @@ std::vector return names; } -std::vector asst::AutoRecruitTask::get_select_tags( +std::vector asst::AutoRecruitTask::get_select_tags( const std::vector& combinations, std::vector tag_ids) { LogTraceFunction; - std::unordered_set unique_tags; - std::vector select; + std::unordered_set unique_tags; + std::vector select; if (combinations.front().min_level == 3) { // only run if we have certain preferred tags for level-3 tags @@ -857,7 +857,7 @@ std::vector asst::AutoRecruitTask::get_select_tags( } // the preferred tag is the tag's substring if (tag_name.find(preferred_tag) != std::string::npos) { - select.emplace_back(tag_name); + select.emplace_back(tag_id); continue; } } @@ -874,7 +874,7 @@ std::vector asst::AutoRecruitTask::get_select_tags( else if (m_select_extra_tags_mode == ExtraTagsMode::Extra) { while (select.size() < 3) { for (const asst::RecruitCombs& comb : combinations) { - for (const std::string& tag : comb.tags) { + for (const RecruitConfig::TagId& tag : comb.tags) { if (unique_tags.find(tag) == unique_tags.cend()) { unique_tags.insert(tag); select.emplace_back(tag); @@ -901,7 +901,7 @@ std::vector asst::AutoRecruitTask::get_select_tags( return select; } emplace_back_count = 0; - for (const std::string& tag : comb.tags) { + for (const RecruitConfig::TagId& tag : comb.tags) { if (unique_tags.find(tag) == unique_tags.cend()) { unique_tags.insert(tag); select.emplace_back(tag); diff --git a/src/MaaCore/Task/Miscellaneous/AutoRecruitTask.h b/src/MaaCore/Task/Miscellaneous/AutoRecruitTask.h index 301dcc2369..e0fbfeaa5f 100644 --- a/src/MaaCore/Task/Miscellaneous/AutoRecruitTask.h +++ b/src/MaaCore/Task/Miscellaneous/AutoRecruitTask.h @@ -50,7 +50,7 @@ namespace asst bool hire_all(); bool initialize_dirty_slot_info(const cv::Mat&); std::vector get_tag_names(const std::vector& ids) const; - std::vector get_select_tags(const std::vector& combinations, std::vector tag_ids); + std::vector get_select_tags(const std::vector& combinations, std::vector tag_ids); static std::vector start_recruit_analyze(const cv::Mat& image); template