From e6ecbfe484035ebf2e77aedb061a3357a74716e1 Mon Sep 17 00:00:00 2001 From: DavidWang19 Date: Sat, 8 Oct 2022 06:10:00 +0100 Subject: [PATCH] =?UTF-8?q?perf:=20=E5=8A=A0=E9=80=9F=E4=BA=86=E5=AF=B9?= =?UTF-8?q?=E6=92=A4=E9=80=80=E5=B9=B2=E5=91=98=E7=9A=84=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Task/Plugin/RoguelikeBattleTaskPlugin.cpp | 31 ++++++++++--------- .../Task/Plugin/RoguelikeBattleTaskPlugin.h | 3 +- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.cpp b/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.cpp index e6ce104d3b..a3e6251d82 100644 --- a/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.cpp +++ b/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.cpp @@ -287,8 +287,8 @@ bool asst::RoguelikeBattleTaskPlugin::auto_battle() m_cur_home_index = 0; } - size_t available_count = 0; - size_t cooling_count = 0; + int available_count = 0; + int cooling_count = 0; std::vector new_urgent; std::vector cooling_opers; const auto use_oper_task_ptr = Task.get("BattleUseOper"); @@ -313,13 +313,11 @@ bool asst::RoguelikeBattleTaskPlugin::auto_battle() if (!can_use_dice) { m_use_dice = false; } - // 如果发现有新撤退的或者新转好cd的,就更新m_retreated_opers - if (cooling_count != m_retreated_opers.size()) { - const decltype(m_retreated_opers) ret_copy(m_retreated_opers); - m_retreated_opers.clear(); - if (cooling_count > 0) { - battle_pause(); - } + // 如果发现有新撤退,就更新m_retreated_opers + // 如果发现有新转好的,只更新m_last_cooling_count,在部署时从set中删去 + if (cooling_count > m_last_cooling_count) { + battle_pause(); + int remain_add = cooling_count - m_last_cooling_count; Rect cur_rect; for (size_t i = 0; i < opers.size(); ++i) { const auto& cur_opers = battle_analyzer.get_opers(); @@ -354,9 +352,8 @@ bool asst::RoguelikeBattleTaskPlugin::auto_battle() if (oper_name == "Unknown") { continue; } - m_retreated_opers.emplace(oper_name); - if (ret_copy.contains(oper_name)) { + if (m_retreated_opers.contains(oper_name)) { continue; } auto iter = m_opers_in_field.find(oper_name); @@ -385,12 +382,14 @@ bool asst::RoguelikeBattleTaskPlugin::auto_battle() m_used_tiles.erase(del_pos_tiles); } m_opers_in_field.erase(iter); + m_retreated_opers.emplace(oper_name); + remain_add--; + if (!remain_add) break; } - if (cooling_count > 0) { - m_ctrler->click(cur_rect); - battle_pause(); - } + m_ctrler->click(cur_rect); + battle_pause(); } + m_last_cooling_count = cooling_count; if (!new_urgent.empty()) { // 出现新的紧急情况,立即切到这条线路,并把其他紧急情况压入栈 Log.info("New urgent situation detected"); @@ -604,6 +603,7 @@ bool asst::RoguelikeBattleTaskPlugin::auto_battle() m_opers_used = true; m_used_tiles.emplace(placed_loc, std::make_pair(opt_oper.name, opt_oper.role)); m_opers_in_field.emplace(opt_oper.name, placed_loc); + m_retreated_opers.erase(opt_oper.name); if (get_role_type(opt_oper.role) == BattleRoleType::Melee) { m_has_deployed_melee_num++; } @@ -737,6 +737,7 @@ void asst::RoguelikeBattleTaskPlugin::clear() m_has_deployed_melee_num = 0; m_has_deployed_ranged_num = 0; m_has_finished_deploy_ranged = false; + m_last_cooling_count = 0; for (auto& [key, status] : m_restore_status) { m_status->set_number(key, status); diff --git a/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.h b/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.h index ce987930c5..e4350fdc61 100644 --- a/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.h +++ b/src/MeoAssistant/Task/Plugin/RoguelikeBattleTaskPlugin.h @@ -85,6 +85,7 @@ namespace asst int m_has_deployed_melee_num = 0; int m_deploy_ranged_num = 0; int m_has_deployed_ranged_num = 0; + int m_last_cooling_count = 0; bool m_has_finished_deploy_ranged = false; size_t m_cur_home_index = 0; cv::Mat m_dice_image; @@ -100,7 +101,7 @@ namespace asst std::unordered_map> m_medic_for_home_index; std::stack m_next_urgent_index; std::unordered_set m_blacklist_location; - std::unordered_set m_retreated_opers; + std::set m_retreated_opers; std::queue m_key_kills; std::unordered_map> m_used_tiles; std::unordered_map m_opers_in_field;