From 91c1eb9513348c642a2a07902b8b4172bbe4faa1 Mon Sep 17 00:00:00 2001 From: Horror Proton <107091537+horror-proton@users.noreply.github.com> Date: Wed, 27 Jul 2022 10:33:35 +0800 Subject: [PATCH] fix: update recruit retry mech --- src/MeoAssistant/AutoRecruitTask.cpp | 83 +++++++++++++++------------- src/MeoAssistant/AutoRecruitTask.h | 15 ++++- 2 files changed, 58 insertions(+), 40 deletions(-) diff --git a/src/MeoAssistant/AutoRecruitTask.cpp b/src/MeoAssistant/AutoRecruitTask.cpp index d94f31ecf0..3fcab79e53 100644 --- a/src/MeoAssistant/AutoRecruitTask.cpp +++ b/src/MeoAssistant/AutoRecruitTask.cpp @@ -119,10 +119,10 @@ asst::AutoRecruitTask& asst::AutoRecruitTask::set_set_time(bool set_time) noexce bool asst::AutoRecruitTask::_run() { + if (m_force_discard_flag) return false; + if (is_calc_only_task()) { - int tags_selected = 0; - bool force_skip = false; - return recruit_calc_task(force_skip, tags_selected); + return recruit_calc_task().success; } if (!recruit_begin()) return false; @@ -131,25 +131,27 @@ bool asst::AutoRecruitTask::_run() return false; } - if (!m_use_expedited) - analyze_start_buttons(); // analyze once only + if (!m_use_expedited) { // analyze once only + if (!analyze_start_buttons()) return false; + } static constexpr size_t slot_retry_limit = 3; - size_t slot_fail = 0; // m_cur_times means how many times has the confirm button been pressed, NOT expedited plan used while ((m_use_expedited || !m_pending_recruit_slot.empty()) && m_cur_times != m_max_times) { - if (slot_fail >= slot_retry_limit) { return false; } + if (m_slot_fail >= slot_retry_limit) { return false; } if (m_use_expedited) { Log.info("ready to use expedited"); if (need_exit()) return false; - recruit_now(); - if (!check_recruit_home_page()) return false; + if (!recruit_now()) { + m_force_discard_flag = true; + return false; + } analyze_start_buttons(); } if (need_exit()) return false; if (!recruit_one()) - ++slot_fail; + ++m_slot_fail; else ++m_cur_times; } @@ -200,14 +202,12 @@ bool asst::AutoRecruitTask::recruit_one() m_ctrler->click(button); sleep(delay); - bool force_skip = true; - int selected = 0; - bool calc_recognized = recruit_calc_task(force_skip, selected); + auto calc_result = recruit_calc_task(); sleep(delay); m_pending_recruit_slot.pop_front(); - if (!calc_recognized) { + if (!calc_result.success) { // recognition failed, perhaps open the slot again would not help { json::value info = basic_info(); @@ -219,7 +219,7 @@ bool asst::AutoRecruitTask::recruit_one() return false; } - if (force_skip) { + if (calc_result.force_skip) { // mark the slot as completed and return click_return_button(); return true; @@ -227,7 +227,7 @@ bool asst::AutoRecruitTask::recruit_one() if (need_exit()) return false; - if (!check_time_reduced()) { + if (m_set_time && !check_time_reduced()) { // timer was not set to 09:00:00 properly, likely the tag selection was also corrupted // see https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/300#issuecomment-1073287984 // return and try later @@ -241,10 +241,9 @@ bool asst::AutoRecruitTask::recruit_one() if (need_exit()) return false; - if (!confirm()) { + if (!confirm()) { // ran out of recruit permit? Log.info("Failed to confirm current recruit config."); - m_pending_recruit_slot.push_back(index); - click_return_button(); + m_force_discard_flag = true; return false; } @@ -252,7 +251,7 @@ bool asst::AutoRecruitTask::recruit_one() } // set recruit timer and tags only -bool asst::AutoRecruitTask::recruit_calc_task(bool& out_force_skip, int& out_selected) +asst::AutoRecruitTask::calc_task_result_type asst::AutoRecruitTask::recruit_calc_task() { LogTraceFunction; @@ -267,7 +266,7 @@ bool asst::AutoRecruitTask::recruit_calc_task(bool& out_force_skip, int& out_sel if (!image_analyzer.analyze()) continue; if (image_analyzer.get_tags_result().size() != RecruitConfiger::CorrectNumberOfTags) continue; - const std::vector &tags = image_analyzer.get_tags_result(); + const std::vector& tags = image_analyzer.get_tags_result(); bool has_refresh = !image_analyzer.get_refresh_rect().empty(); std::vector tag_names; @@ -313,7 +312,7 @@ bool asst::AutoRecruitTask::recruit_calc_task(bool& out_force_skip, int& out_sel std::vector result_vec = recruit_calc::get_all_combs(tag_names); // assuming timer would be set to 09:00:00 - for (RecruitCombs& rc: result_vec) { + for (RecruitCombs& rc : result_vec) { rc.min_level = (std::max)(rc.min_level, 3); } @@ -369,7 +368,7 @@ bool asst::AutoRecruitTask::recruit_calc_task(bool& out_force_skip, int& out_sel callback(AsstMsg::SubTaskExtraInfo, info); } - if (need_exit()) return false; + if (need_exit()) return {}; // refresh if (m_need_refresh && has_refresh @@ -386,7 +385,7 @@ bool asst::AutoRecruitTask::recruit_calc_task(bool& out_force_skip, int& out_sel { "refresh_limit", refresh_limit } }; callback(AsstMsg::SubTaskError, info); - return false; + return {}; } refresh(); @@ -397,7 +396,7 @@ bool asst::AutoRecruitTask::recruit_calc_task(bool& out_force_skip, int& out_sel json::value info = basic_info(); info["what"] = "RecruitTagsRefreshed"; info["details"] = json::object{ - { "count", refresh_count }, + { "count", refresh_count }, { "refresh_limit", refresh_limit } }; callback(AsstMsg::SubTaskExtraInfo, info); @@ -409,20 +408,22 @@ bool asst::AutoRecruitTask::recruit_calc_task(bool& out_force_skip, int& out_sel continue; } - if (need_exit()) return false; + if (need_exit()) return {}; if (!is_calc_only_task()) { // do not confirm, force skip if (std::find(m_confirm_level.cbegin(), m_confirm_level.cend(), final_combination.min_level) == m_confirm_level.cend()) { - out_force_skip = true; - out_selected = 0; - return true; + calc_task_result_type result; + result.success = true; + result.force_skip = true; + return result; } if (m_skip_robot && has_robot_tag) { - out_force_skip = true; - out_selected = 0; - return true; + calc_task_result_type result; + result.success = true; + result.force_skip = true; + return result; } } @@ -435,9 +436,11 @@ bool asst::AutoRecruitTask::recruit_calc_task(bool& out_force_skip, int& out_sel // nothing to select, leave the selection empty if (std::find(m_select_level.cbegin(), m_select_level.cend(), final_combination.min_level) == m_select_level.cend()) { - out_force_skip = false; - out_selected = 0; - return true; + calc_task_result_type result; + result.success = true; + result.force_skip = false; + result.tags_selected = 0; + return result; } // select tags @@ -458,11 +461,13 @@ bool asst::AutoRecruitTask::recruit_calc_task(bool& out_force_skip, int& out_sel callback(AsstMsg::SubTaskExtraInfo, info); } - out_selected = static_cast(final_combination.tags.size()); - out_force_skip = false; - return true; + calc_task_result_type result; + result.success = true; + result.force_skip = false; + result.tags_selected = static_cast(final_combination.tags.size()); + return result; } - return false; + return {}; } bool asst::AutoRecruitTask::recruit_begin() diff --git a/src/MeoAssistant/AutoRecruitTask.h b/src/MeoAssistant/AutoRecruitTask.h index 536b537937..e10b3b7c2d 100644 --- a/src/MeoAssistant/AutoRecruitTask.h +++ b/src/MeoAssistant/AutoRecruitTask.h @@ -3,6 +3,9 @@ #include "AsstTypes.h" +#include +#include + namespace asst { class AutoRecruitTask final : public AbstractTask @@ -32,7 +35,16 @@ namespace asst bool recruit_now(); bool confirm(); bool refresh(); - bool recruit_calc_task(bool&, int&); + + struct calc_task_result_type { + bool success = false; + bool force_skip = false; + [[maybe_unused]] int tags_selected = 0; + }; + + calc_task_result_type recruit_calc_task(); + + bool m_force_discard_flag = false; std::vector m_select_level; std::vector m_confirm_level; @@ -44,6 +56,7 @@ namespace asst std::vector m_start_buttons; std::list m_pending_recruit_slot; + int m_slot_fail = 0; int m_cur_times = 0; }; }