diff --git a/src/MaaCore/Task/Interface/CopilotTask.cpp b/src/MaaCore/Task/Interface/CopilotTask.cpp index 347288d27c..c90e5bc942 100644 --- a/src/MaaCore/Task/Interface/CopilotTask.cpp +++ b/src/MaaCore/Task/Interface/CopilotTask.cpp @@ -145,7 +145,6 @@ bool asst::CopilotTask::set_params(const json::value& params) m_formation_task_ptr->set_enable(with_formation && navigate_name.find("TR") == std::string::npos); m_formation_task_ptr->set_select_formation(select_formation); m_formation_task_ptr->set_add_trust(add_trust); - m_formation_task_ptr->set_add_user_additional(add_user_additional); m_formation_task_ptr->set_support_unit_name(std::move(support_unit_name)); if (auto opt = params.find("user_additional"); add_user_additional && opt) { diff --git a/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp b/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp index ee7365f913..cc99220a53 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp +++ b/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp @@ -22,11 +22,6 @@ void asst::BattleFormationTask::set_support_unit_name(std::string name) m_support_unit_name = std::move(name); } -void asst::BattleFormationTask::set_add_user_additional(bool add_user_additional) -{ - m_add_user_additional = add_user_additional; -} - void asst::BattleFormationTask::set_user_additional(std::vector> user_additional) { m_user_additional = std::move(user_additional); @@ -42,7 +37,7 @@ void asst::BattleFormationTask::set_select_formation(int index) m_select_formation_index = index; } -std::shared_ptr>asst::BattleFormationTask::get_opers_in_formation() const +std::shared_ptr> asst::BattleFormationTask::get_opers_in_formation() const { return m_opers_in_formation; } @@ -72,18 +67,19 @@ bool asst::BattleFormationTask::_run() for (auto& [role, oper_groups] : m_formation) { add_formation(role, oper_groups, missing_operators); } - + if (!missing_operators.empty()) { if (missing_operators.size() == 1) { // TODO: 自动借助战? } - + report_missing_operators(missing_operators); return false; } - if (m_add_user_additional) { + // 对于有在干员组中存在的自定干员,无法提前得知是否成功编入,故不提前加入编队 + if (!m_user_additional.empty()) { auto limit = 12 - m_size_of_operators_in_formation; for (const auto& [name, skill] : m_user_additional) { if (m_opers_in_formation->contains(name)) { @@ -96,9 +92,11 @@ bool asst::BattleFormationTask::_run() oper.name = name; oper.skill = skill; std::vector usage { std::move(oper) }; - m_user_formation.emplace_back(name, std::move(usage)); + m_user_formation[BattleData.get_role(name)].emplace_back(name, std::move(usage)); + } + for (auto& [role, oper_groups] : m_user_formation) { + add_formation(role, oper_groups, missing_operators); } - add_formation(battle::Role::Unknown, m_user_formation, missing_operators); } add_additional(); @@ -117,7 +115,10 @@ bool asst::BattleFormationTask::_run() return true; } -bool asst::BattleFormationTask::add_formation(battle::Role role, std::vector oper_group, std::vector& missing) +bool asst::BattleFormationTask::add_formation( + battle::Role role, + std::vector oper_group, + std::vector& missing) { LogTraceFunction; @@ -145,7 +146,7 @@ bool asst::BattleFormationTask::add_formation(battle::Role role, std::vectorsecond, "BattleQuickFormationRole-All", "BattleQuickFormationRole-All-OCR"}; + tasks = { "BattleQuickFormationRole-" + role_iter->second, + "BattleQuickFormationRole-All", + "BattleQuickFormationRole-All-OCR" }; } return ProcessTask(*this, tasks).set_retry_times(0).run(); } @@ -475,7 +477,8 @@ bool asst::BattleFormationTask::select_formation(int select_index) // 第二组是名字最左边和最右边的一块区域 // 右边比左边窄,暂定为左边 10*58 - static const std::vector select_formation_task = { "BattleSelectFormation1", "BattleSelectFormation2", + static const std::vector select_formation_task = { "BattleSelectFormation1", + "BattleSelectFormation2", "BattleSelectFormation3", "BattleSelectFormation4" }; diff --git a/src/MaaCore/Task/Miscellaneous/BattleFormationTask.h b/src/MaaCore/Task/Miscellaneous/BattleFormationTask.h index 9892d6b47a..d62ad0b87d 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleFormationTask.h +++ b/src/MaaCore/Task/Miscellaneous/BattleFormationTask.h @@ -7,80 +7,81 @@ namespace asst { - class BattleFormationTask : public AbstractTask +class BattleFormationTask : public AbstractTask +{ +public: + using AbstractTask::AbstractTask; + virtual ~BattleFormationTask() override = default; + + enum class Filter { - public: - using AbstractTask::AbstractTask; - virtual ~BattleFormationTask() override = default; - - enum class Filter - { - None, - Trust, - Cost, - }; - struct AdditionalFormation - { - Filter filter = Filter::None; - bool double_click_filter = true; - battle::RoleCounts role_counts; - }; - void append_additional_formation(AdditionalFormation formation); - - void set_support_unit_name(std::string name); - // 是否追加自定干员 - void set_add_user_additional(bool add_user_additional); - // 设置追加自定干员列表 - void set_user_additional(std::vector> user_additional); - // 是否追加低信赖干员 - void set_add_trust(bool add_trust); - // 设置对指定编队自动编队 - void set_select_formation(int index); - std::shared_ptr> get_opers_in_formation() const; - - enum class DataResource - { - Copilot, - SSSCopilot, - }; - void set_data_resource(DataResource resource); - - protected: - using OperGroup = std::pair>; - - virtual bool _run() override; - bool add_formation(battle::Role role, std::vector oper_group, std::vector& missing); - // 追加附加干员(按部署费用等小分类) - bool add_additional(); - // 补充刷信赖的干员,从最小的开始 - bool add_trust_operators(); - bool enter_selection_page(); - bool select_opers_in_cur_page(std::vector& groups); - void swipe_page(); - void swipe_to_the_left(int times = 2); - bool confirm_selection(); - bool click_role_table(battle::Role role); - bool parse_formation(); - bool select_formation(int select_index); - bool select_random_support_unit(); - void report_missing_operators(std::vector& groups); - - std::vector analyzer_opers(); - - std::string m_stage_name; - std::unordered_map> m_formation; - std::vector m_user_formation; - int m_size_of_operators_in_formation = 0; // 编队中干员个数 - std::shared_ptr> m_opers_in_formation = - std::make_shared>(); // 编队中的干员名称-所属组名 - bool m_add_trust = false; // 是否需要追加信赖干员 - bool m_add_user_additional = false; // 补用户自定义干员 - std::vector> m_user_additional; // 追加干员表,从头往后加 - std::string m_support_unit_name; - DataResource m_data_resource = DataResource::Copilot; - std::vector m_additional; - std::string m_last_oper_name; - int m_select_formation_index = 0; - int m_missing_retry_times = 1; // 识别不到干员的重试次数 + None, + Trust, + Cost, }; + + struct AdditionalFormation + { + Filter filter = Filter::None; + bool double_click_filter = true; + battle::RoleCounts role_counts; + }; + + void append_additional_formation(AdditionalFormation formation); + + void set_support_unit_name(std::string name); + // 是否追加自定干员 + void set_add_user_additional(bool add_user_additional); + // 设置追加自定干员列表 + void set_user_additional(std::vector> user_additional); + // 是否追加低信赖干员 + void set_add_trust(bool add_trust); + // 设置对指定编队自动编队 + void set_select_formation(int index); + std::shared_ptr> get_opers_in_formation() const; + + enum class DataResource + { + Copilot, + SSSCopilot, + }; + void set_data_resource(DataResource resource); + +protected: + using OperGroup = std::pair>; + + virtual bool _run() override; + bool add_formation(battle::Role role, std::vector oper_group, std::vector& missing); + // 追加附加干员(按部署费用等小分类) + bool add_additional(); + // 补充刷信赖的干员,从最小的开始 + bool add_trust_operators(); + bool enter_selection_page(); + bool select_opers_in_cur_page(std::vector& groups); + void swipe_page(); + void swipe_to_the_left(int times = 2); + bool confirm_selection(); + bool click_role_table(battle::Role role); + bool parse_formation(); + bool select_formation(int select_index); + bool select_random_support_unit(); + void report_missing_operators(std::vector& groups); + + std::vector analyzer_opers(); + + std::string m_stage_name; + std::unordered_map> m_formation; + std::unordered_map> m_user_formation; + int m_size_of_operators_in_formation = 0; // 编队中干员个数 + std::shared_ptr> m_opers_in_formation = + std::make_shared>(); // 编队中的干员名称-所属组名 + bool m_add_trust = false; // 是否需要追加信赖干员 + std::vector> m_user_additional; // 追加干员表,从头往后加 + std::string m_support_unit_name; + DataResource m_data_resource = DataResource::Copilot; + std::vector m_additional; + std::string m_last_oper_name; + int m_select_formation_index = 0; + int m_missing_retry_times = 1; // 识别不到干员的重试次数 +}; } // namespace asst