fix: fix typings in Recruit task

fix: https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/9517
This commit is contained in:
Horror Proton
2024-07-09 00:31:49 +08:00
parent e6555b4e44
commit d14c2dfd49
3 changed files with 45 additions and 44 deletions

View File

@@ -44,11 +44,48 @@ namespace asst
}
};
// 选择额外 Tags 的模式
enum class ExtraTagsMode
{
NoExtra, // 0 - 默认行为
Extra, // 1 - 选 3 个 Tags, 即使可能冲突
ExtraOnlyRare, // 2 - 如果可能, 同时选择更多的高星 Tag 组合, 即使可能冲突
};
class RecruitConfig final : public SingletonHolder<RecruitConfig>, 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<std::string>& get_all_tags() const noexcept { return m_all_tags; }
const std::vector<Recruitment>& 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<std::string> m_all_tags;
std::vector<Recruitment> m_all_opers;
std::unordered_map<TagId, std::string> m_all_tags_name;
};
// 公开招募的干员组合
struct RecruitCombs
{
// TODO: using vector here can be expensive
std::vector<std::string> tags;
std::vector<RecruitConfig::TagId> tags;
std::vector<Recruitment> 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<RecruitConfig>, 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<std::string>& get_all_tags() const noexcept { return m_all_tags; }
const std::vector<Recruitment>& 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<std::string> m_all_tags;
std::vector<Recruitment> m_all_opers;
std::unordered_map<TagId, std::string> m_all_tags_name;
};
inline static auto& RecruitData = RecruitConfig::get_instance();
} // namespace asst

View File

@@ -838,13 +838,13 @@ std::vector<std::string>
return names;
}
std::vector<std::string> asst::AutoRecruitTask::get_select_tags(
std::vector<asst::RecruitConfig::TagId> asst::AutoRecruitTask::get_select_tags(
const std::vector<RecruitCombs>& combinations,
std::vector<RecruitConfig::TagId> tag_ids)
{
LogTraceFunction;
std::unordered_set<std::string> unique_tags;
std::vector<std::string> select;
std::unordered_set<RecruitConfig::TagId> unique_tags;
std::vector<RecruitConfig::TagId> 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<std::string> 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<std::string> 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<std::string> 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);

View File

@@ -50,7 +50,7 @@ namespace asst
bool hire_all();
bool initialize_dirty_slot_info(const cv::Mat&);
std::vector<std::string> get_tag_names(const std::vector<RecruitConfig::TagId>& ids) const;
std::vector<std::string> get_select_tags(const std::vector<RecruitCombs>& combinations, std::vector<RecruitConfig::TagId> tag_ids);
std::vector<asst::RecruitConfig::TagId> get_select_tags(const std::vector<RecruitCombs>& combinations, std::vector<RecruitConfig::TagId> tag_ids);
static std::vector<TextRect> start_recruit_analyze(const cv::Mat& image);
template <typename Rng>