From 7cc1e7b551e619cd78f5f9e49de0e46b35eb546c Mon Sep 17 00:00:00 2001 From: status102 <102887808+status102@users.noreply.github.com> Date: Thu, 14 Mar 2024 11:24:18 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E8=87=AA=E5=8A=A8=E6=88=98=E6=96=97-?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E7=BC=96=E9=98=9F=E5=AD=98=E5=82=A8=E7=BC=96?= =?UTF-8?q?=E9=98=9F=E4=BF=A1=E6=81=AF=20(#8542)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MaaCore/Task/Interface/CopilotTask.cpp | 1 + .../Miscellaneous/BattleFormationTask.cpp | 19 +++++++++++-------- .../Task/Miscellaneous/BattleFormationTask.h | 12 +++++++----- .../Task/Miscellaneous/BattleProcessTask.cpp | 17 ++++++++++++++++- .../Task/Miscellaneous/BattleProcessTask.h | 2 ++ 5 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/MaaCore/Task/Interface/CopilotTask.cpp b/src/MaaCore/Task/Interface/CopilotTask.cpp index d669dad8b6..b73e9c77ce 100644 --- a/src/MaaCore/Task/Interface/CopilotTask.cpp +++ b/src/MaaCore/Task/Interface/CopilotTask.cpp @@ -158,6 +158,7 @@ bool asst::CopilotTask::set_params(const json::value& params) } m_battle_task_ptr->set_wait_until_end(need_navigate); + m_battle_task_ptr->set_formation_task_ptr(m_formation_task_ptr->get_opers_in_formation()); size_t loop_times = params.get("loop_times", 1); if (need_navigate) { diff --git a/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp b/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp index 0e52e31fec..19f5eeaf37 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp +++ b/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp @@ -42,6 +42,11 @@ void asst::BattleFormationTask::set_select_formation(int index) m_select_formation_index = index; } +std::shared_ptr>asst::BattleFormationTask::get_opers_in_formation() const +{ + return m_opers_in_formation; +} + void asst::BattleFormationTask::set_data_resource(DataResource resource) { m_data_resource = resource; @@ -63,9 +68,7 @@ bool asst::BattleFormationTask::_run() save_img(utils::path("debug") / utils::path("other")); return false; } - auto missing_operators = std::vector(); - for (auto& [role, oper_groups] : m_formation) { add_formation(role, oper_groups, missing_operators); } @@ -83,7 +86,7 @@ bool asst::BattleFormationTask::_run() if (m_add_user_additional) { auto limit = 12 - m_size_of_operators_in_formation; for (const auto& [name, skill] : m_user_additional) { - if (m_operators_in_formation.contains(name)) { + if (m_opers_in_formation->contains(name)) { continue; } if (--limit < 0) { @@ -93,7 +96,7 @@ bool asst::BattleFormationTask::_run() oper.name = name; oper.skill = skill; std::vector usage { std::move(oper) }; - m_user_formation.emplace_back(std::move(usage)); + m_user_formation.emplace_back(name, std::move(usage)); } add_formation(battle::Role::Unknown, m_user_formation, missing_operators); } @@ -265,7 +268,7 @@ void asst::BattleFormationTask::report_missing_operators(std::vector& std::vector> oper_names; for (auto& group : groups) { std::vector names; - for (auto& oper : group) { + for (const auto& oper : group.second) { names.push_back(oper.name); } oper_names.push_back(names); @@ -352,12 +355,12 @@ bool asst::BattleFormationTask::select_opers_in_cur_page(std::vector& bool found = false; auto iter = groups.begin(); for (; iter != groups.end(); ++iter) { - for (const auto& oper : *iter) { + for (const auto& oper : iter->second) { if (oper.name == name) { found = true; skill = oper.skill; - m_operators_in_formation.emplace(name); + m_opers_in_formation->emplace(name, iter->first); ++m_size_of_operators_in_formation; break; } @@ -454,7 +457,7 @@ bool asst::BattleFormationTask::parse_formation() } // for unknown, will use { "BattleQuickFormationRole-All", "BattleQuickFormationRole-All-OCR" } - m_formation[same_role ? role : battle::Role::Unknown].emplace_back(opers_vec); + m_formation[same_role ? role : battle::Role::Unknown].emplace_back(name, opers_vec); } callback(AsstMsg::SubTaskExtraInfo, info); diff --git a/src/MaaCore/Task/Miscellaneous/BattleFormationTask.h b/src/MaaCore/Task/Miscellaneous/BattleFormationTask.h index ae91b359d4..9892d6b47a 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleFormationTask.h +++ b/src/MaaCore/Task/Miscellaneous/BattleFormationTask.h @@ -36,6 +36,7 @@ namespace asst void set_add_trust(bool add_trust); // 设置对指定编队自动编队 void set_select_formation(int index); + std::shared_ptr> get_opers_in_formation() const; enum class DataResource { @@ -45,7 +46,7 @@ namespace asst void set_data_resource(DataResource resource); protected: - using OperGroup = std::vector; + using OperGroup = std::pair>; virtual bool _run() override; bool add_formation(battle::Role role, std::vector oper_group, std::vector& missing); @@ -69,10 +70,11 @@ namespace asst std::string m_stage_name; std::unordered_map> m_formation; std::vector m_user_formation; - int m_size_of_operators_in_formation = 0; // 编队中干员个数 - std::set m_operators_in_formation; // 编队中的干员名称,用来判断能不能追加某个干员 - bool m_add_trust = false; // 是否需要追加信赖干员 - bool m_add_user_additional = false; // 补用户自定义干员 + 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; diff --git a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp index 5406a36619..0098f7b5c7 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp +++ b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp @@ -84,16 +84,31 @@ void asst::BattleProcessTask::set_wait_until_end(bool wait_until_end) m_need_to_wait_until_end = wait_until_end; } +void asst::BattleProcessTask::set_formation_task_ptr(std::shared_ptr> value) +{ + m_formation_ptr = value; +} + bool asst::BattleProcessTask::to_group() { std::unordered_map> groups; + // 从编队任务中获取<干员-组名>映射 + if (m_formation_ptr != nullptr) { + for (const auto& [group, oper] : *m_formation_ptr) { + groups.emplace(oper, std::vector { group }); + } + } + // 补充剩余的干员 for (const auto& [group_name, oper_list] : get_combat_data().groups) { + if (groups.contains(group_name)) { + continue; + } std::vector oper_name_list; ranges::transform(oper_list, std::back_inserter(oper_name_list), [](const auto& oper) { return oper.name; }); groups.emplace(group_name, std::move(oper_name_list)); } - std::unordered_set char_set; + std::unordered_set char_set; // 干员集合 for (const auto& oper : m_cur_deployment_opers) { char_set.emplace(oper.name); } diff --git a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h index 478388b6b7..dc363ee4de 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h +++ b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h @@ -16,6 +16,7 @@ namespace asst virtual bool set_stage_name(const std::string& stage_name) override; void set_wait_until_end(bool wait_until_end); + void set_formation_task_ptr(std::shared_ptr> value); protected: virtual bool _run() override; @@ -46,5 +47,6 @@ namespace asst bool m_in_bullet_time = false; bool m_need_to_wait_until_end = false; + std::shared_ptr> m_formation_ptr = nullptr; }; }