From c36e97c44a1b98bfa7d4a078e988275c5bbd0559 Mon Sep 17 00:00:00 2001 From: MistEO Date: Wed, 27 Oct 2021 23:43:36 +0800 Subject: [PATCH] =?UTF-8?q?perf.=E4=BC=98=E5=8C=96=E5=AE=BF=E8=88=8D?= =?UTF-8?q?=E6=8D=A2=E7=8F=AD=E6=B5=81=E7=A8=8B=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=94=9F=E4=BA=A7=E8=AE=BE=E6=96=BD=E8=AF=86=E5=88=AB=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/tasks.json | 40 ++++++--- resource/template/02.png | Bin 1914 -> 0 bytes resource/template/03.png | Bin 1893 -> 0 bytes resource/template/04.png | Bin 1666 -> 0 bytes resource/template/05.png | Bin 1613 -> 0 bytes resource/template/GoIn.png | Bin 4667 -> 0 bytes resource/template/Listless.png | Bin 6976 -> 0 bytes resource/template/OnShift.png | Bin 5535 -> 18146 bytes resource/template/OperSelected.png | Bin 1089 -> 672 bytes resource/template/OperSelectedCropped.png | Bin 814 -> 0 bytes resource/template/Resting.png | Bin 5115 -> 0 bytes src/MeoAssistance/Assistance.cpp | 81 +++--------------- src/MeoAssistance/AsstDef.h | 5 +- src/MeoAssistance/CreditShopImageAnalyzer.cpp | 8 +- src/MeoAssistance/InfrastDormTask.cpp | 61 ++++++++----- .../InfrastMoodImageAnalyzer.cpp | 59 ++++++++++++- src/MeoAssistance/InfrastMoodImageAnalyzer.h | 2 + src/MeoAssistance/InfrastProductionTask.cpp | 63 ++++++++------ src/MeoAssistance/InfrastProductionTask.h | 4 +- .../InfrastSkillsImageAnalyzer.cpp | 10 +-- src/MeoAssistance/MultiMatchImageAnalyzer.cpp | 1 - src/MeoAssistance/ProcessTask.cpp | 2 +- src/MeoAssistance/RecruitImageAnalyzer.cpp | 2 +- src/MeoAssistance/TaskData.cpp | 8 +- 24 files changed, 194 insertions(+), 152 deletions(-) delete mode 100644 resource/template/02.png delete mode 100644 resource/template/03.png delete mode 100644 resource/template/04.png delete mode 100644 resource/template/05.png delete mode 100644 resource/template/GoIn.png delete mode 100644 resource/template/Listless.png delete mode 100644 resource/template/OperSelectedCropped.png delete mode 100644 resource/template/Resting.png diff --git a/resource/tasks.json b/resource/tasks.json index f8ac4a32cf..a8aead637c 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -475,7 +475,7 @@ }, "CreditShop-Commoditys": { "template": "CreditPoint.png", - "resultMove": [ + "rectMove": [ -60, -180, 220, @@ -526,7 +526,7 @@ "template": "RecruitTimeReduce.png", "templThreshold": 0.89, "action": "clickSelf", - "resultMove": [ + "rectMove": [ 7, 94, 129, @@ -825,23 +825,23 @@ "algorithm": "justReturn", "roi": [ 400, - 250, + 280, 880, - 110 + 80 ] }, "InfrastSkillsLower": { "algorithm": "justReturn", "roi": [ 400, - 530, + 560, 880, - 110 + 80 ] }, "InfrastSkillsHash": { "algorithm": "justReturn", - "resultMove": [ + "rectMove": [ -8, -202, 82, @@ -881,7 +881,7 @@ "histThreshold": 100, "histThreshold_Doc": "该任务里的Hist阈值,是特化了拿来做灰度图平均值的,懒得重新写个字段了", "cache": false, - "resultMove": [ + "rectMove": [ -8, -42, 82, @@ -945,7 +945,7 @@ "histThreshold": 20, "Doc": "这里的templThreshold,作为进度条最小灰度阈值使用;histThreshold作为进度条相邻点最大变化阈值使用。懒得重新弄个字段了", "cache": false, - "resultMove": [ + "rectMove": [ 21, 8, 85, @@ -1096,7 +1096,7 @@ 120, 255 ], - "templThreshold": 0.8, + "templThreshold": 0.8, "roi": [ 0, 0, @@ -1238,11 +1238,29 @@ "rearDelay": 1000 }, "InfrastOperSelected": { - "template": "OperSelectedCropped.png", + "template": "OperSelected.png", "cache": false, + "templThreshold": 0.35, "maskRange": [ 1, 255 + ], + "rectMove": [ + -8, + -260, + 82, + 320 + ] + }, + "InfrastOperOnShift": { + "template": "OnShift.png", + "cache": false, + "templThreshold": 0.8, + "rectMove": [ + -20, + -100, + 70, + 50 ] } } \ No newline at end of file diff --git a/resource/template/02.png b/resource/template/02.png deleted file mode 100644 index c4af879b732283da5b381a68fe82b424911af88b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1914 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 diff --git a/resource/template/04.png b/resource/template/04.png deleted file mode 100644 index aada9d78e5f7f39336295dded2ce614aaa4ecb92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1666 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 LNkvXXu0mjf39Jgu diff --git a/resource/template/GoIn.png b/resource/template/GoIn.png deleted file mode 100644 index 394c441edbe6f1587258ab98232ee75ebb97228e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4667 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 SQUKTh00006}&0{ diff --git a/resource/template/OnShift.png b/resource/template/OnShift.png index 3418ef61d6819f7f767c6f0b6918d759f5b8f1dd..4a68639b19ac2ddd96bf8ceaabca33623a83c79b 100644 GIT binary patch literal 18146 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 literal 5535 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 diff --git a/resource/template/OperSelectedCropped.png b/resource/template/OperSelectedCropped.png deleted file mode 100644 index 71abe0e8146beb9ba1ff8781d647a1a9e871d902..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 814 zcmeAS@N?(olHy`uVBq!ia0vp^K+Gt~!3Jcp94TsGU|{;{>EaktG3V{oKtCl%5r>Oe zM?PNO!CL-o-JRK+*{22kTW}$Z=i=)@u>Uem*w@dN>8Nr+_s-xSYB+p&OG@{?a}|X&uYFu+fZ<0c6;=*x>~urA2&#)JvpzoY2JzAxsRA;oamS!sHp7Z z*3!cvDQKjW;xZ~Q8XkC)!wIb?MeBlN7=(f8WmE0$4L1K`W6#%@O_~4pa;M10lGU9e f?_S#|E1wrjHJa6S`q2hpK49>4^>bP0l+XkK`5GM@ diff --git a/resource/template/Resting.png b/resource/template/Resting.png deleted file mode 100644 index 36bc510c163b0ef709d7a673a73c9c7cc067c651..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5115 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 diff --git a/src/MeoAssistance/Assistance.cpp b/src/MeoAssistance/Assistance.cpp index f6f7a1e13c..fb04cd15d4 100644 --- a/src/MeoAssistance/Assistance.cpp +++ b/src/MeoAssistance/Assistance.cpp @@ -267,27 +267,14 @@ bool asst::Assistance::start_infrast_shift() return false; } - /* 基建任务整体流程: - 1. 从任意界面进入基建,使用ProcessTask: "InfrastBegin" - 2. 一键收获贸易站、制造站、干员信赖,使用ProcessTask - 3. 进入宿舍,把心情低于阈值的、心情没满但不在工作的,都换下去,使用InfrastEnterFacilityTask - 4. 根据用户设置,按顺序进入制造站or贸易站,使用InfrastEnterFacilityTask - 5. 对制造站or贸易站进行换班,使用InfrastShiftTask - 6. 根据用户设置,使用无人机加速制造or贸易,使用ProcessTask - 7. 会客室线索处理、发电站换班、控制中枢、办公室换班,同样需要根据用户设置决定顺序,TODO - 8. 再次进入宿舍,把基建中可能换下来的干员(心情不低的)加入宿舍 - */ - - // 1. 从任意界面进入基建,使用ProcessTask - // 2. 一键收获贸易站、制造站、干员信赖,使用ProcessTask - // 这个任务结束后,是在进入基建后的主界面 constexpr static const char* InfrastTaskCahin = "Infrast"; + // 这个流程任务,结束的时候是处于基建主界面的。既可以用于进入基建,也可以用于从设施里返回基建主界面 append_match_task(InfrastTaskCahin, { "InfrastBegin" }); - auto enter_task_ptr = std::make_shared(task_callback, (void*)this); - enter_task_ptr->set_task_chain(InfrastTaskCahin); - m_tasks_deque.emplace_back(enter_task_ptr); + auto dorm_task_ptr = std::make_shared(task_callback, (void*)this); + dorm_task_ptr->set_task_chain(InfrastTaskCahin); + m_tasks_deque.emplace_back(dorm_task_ptr); append_match_task(InfrastTaskCahin, { "InfrastBegin" }); @@ -301,63 +288,15 @@ bool asst::Assistance::start_infrast_shift() trade_task_ptr->set_task_chain(InfrastTaskCahin); m_tasks_deque.emplace_back(trade_task_ptr); + // 贸易站无人机 + append_match_task(InfrastTaskCahin, { "UavAssist-Trade" }); + append_match_task(InfrastTaskCahin, { "InfrastBegin" }); - //// 3. 进入宿舍,把心情低于阈值的、心情没满但不在工作的,都换下去 - //auto dorm_task_ptr = std::make_shared(task_callback, (void*)this); - //dorm_task_ptr->set_task_chain(InfrastTaskCahin); - //m_tasks_deque.emplace_back(dorm_task_ptr); + // 再次进宿舍,把刚从设施里换下来的人放进去 + m_tasks_deque.emplace_back(dorm_task_ptr); - //// 返回基建的主界面 - //append_match_task(InfrastTaskCahin, { "InfrastBegin" }); - - //// 5. 对制造站or贸易站进行换班,使用InfrastStationTask - - //// TODO,这里需要根据用户设置,是先制造站还是先贸易站,或者是别的设施 - //// 从进入制造站,到设施列表的界面 - //append_match_task(InfrastTaskCahin, { "ManufacturingMini", "Manufacturing" }); - - //// 制造站换班 - //m_tasks_deque.emplace_back(shift_task_ptr); - - //// 返回基建的主界面 - //append_match_task(InfrastTaskCahin, { "InfrastBegin" }); - - //// TODO,这里需要根据用户设置,是先制造站还是先贸易站,或者是别的设施 - //// 从进入贸易站,到设施列表的界面 - //append_match_task(InfrastTaskCahin, { "Trade", "TradeMini" }); - - //// 贸易站换班 - //m_tasks_deque.emplace_back(shift_task_ptr); - - //// 6. 根据用户设置,使用无人机加速制造or贸易,使用ProcessTask - //// 对贸易站使用无人机加速 - //append_match_task(InfrastTaskCahin, { "UavAssist-Trade" }); - - //// 返回基建的主界面 - //append_match_task(InfrastTaskCahin, { "InfrastBegin" }); - - //// 7. 会客室线索处理、发电站换班、控制中枢、办公室换班,同样需要根据用户设置决定顺序,TODO - //// 发电站换班 - //auto power_task_ptr = std::make_shared(task_callback, (void*)this); - //power_task_ptr->set_task_chain(InfrastTaskCahin); - //m_tasks_deque.emplace_back(std::move(power_task_ptr)); - - //// 返回基建的主界面 - //append_match_task(InfrastTaskCahin, { "InfrastBegin" }); - - //auto office_task_ptr = std::make_shared(task_callback, (void*)this); - //office_task_ptr->set_task_chain(InfrastTaskCahin); - //m_tasks_deque.emplace_back(std::move(office_task_ptr)); - - //// 返回基建的主界面 - //append_match_task(InfrastTaskCahin, { "InfrastBegin" }); - - //// 8. 再次进入宿舍,把基建中可能换下来的干员(心情不低的)加入宿舍 - //m_tasks_deque.emplace_back(dorm_task_ptr); - - //// 全操作完之后,再返回基建的主界面 - //append_match_task(InfrastTaskCahin, { "InfrastBegin" }); + append_match_task(InfrastTaskCahin, { "InfrastBegin" }); m_thread_idle = false; m_condvar.notify_one(); diff --git a/src/MeoAssistance/AsstDef.h b/src/MeoAssistance/AsstDef.h index 7d1ba1bb35..ae2654642f 100644 --- a/src/MeoAssistance/AsstDef.h +++ b/src/MeoAssistance/AsstDef.h @@ -177,7 +177,7 @@ namespace asst { int rear_delay = 0; // 执行该任务后的延时 int retry_times = INT_MAX; // 未找到图像时的重试次数 Rect roi; // 要识别的区域,若为0则全图识别 - Rect result_move; // 识别结果移动:有些结果识别到的,和要点击的不是同一个位置。即识别到了res,点击res + result_move的位置 + Rect rect_move; // 识别结果移动:有些结果识别到的,和要点击的不是同一个位置。即识别到了res,点击res + result_move的位置 }; // 文字识别任务的信息 @@ -250,6 +250,8 @@ namespace asst { InfrastSmileyInfo smiley; double percentage = 0; // 心情进度条的百分比 Rect rect; + bool working = false; // 干员是否在工作中 + bool selected = false; // 干员是否已被选择(蓝色的选择框) }; struct InfrastSkill { @@ -311,6 +313,7 @@ namespace asst std::string hash; // 有些干员的技能是完全一样的,做个hash区分一下不同干员 InfrastSkillsComb skills_comb; Rect rect; + bool selected = false; // 干员是否已被选择(蓝色的选择框) }; // 基建技能组 struct InfrastSkillsGroup { diff --git a/src/MeoAssistance/CreditShopImageAnalyzer.cpp b/src/MeoAssistance/CreditShopImageAnalyzer.cpp index 70684cf0c1..795115e998 100644 --- a/src/MeoAssistance/CreditShopImageAnalyzer.cpp +++ b/src/MeoAssistance/CreditShopImageAnalyzer.cpp @@ -42,10 +42,10 @@ bool asst::CreditShopImageAnalyzer::commoditys_analyze() m_commoditys.reserve(credit_points_result.size()); for (const MatchRect& mr : credit_points_result) { Rect commodity; - commodity.x = mr.rect.x + commodity_task_ptr->result_move.x; - commodity.y = mr.rect.y + commodity_task_ptr->result_move.y; - commodity.width = commodity_task_ptr->result_move.width; - commodity.height = commodity_task_ptr->result_move.height; + commodity.x = mr.rect.x + commodity_task_ptr->rect_move.x; + commodity.y = mr.rect.y + commodity_task_ptr->rect_move.y; + commodity.width = commodity_task_ptr->rect_move.width; + commodity.height = commodity_task_ptr->rect_move.height; m_commoditys.emplace_back(std::move(commodity)); } diff --git a/src/MeoAssistance/InfrastDormTask.cpp b/src/MeoAssistance/InfrastDormTask.cpp index 0119099a40..0766430052 100644 --- a/src/MeoAssistance/InfrastDormTask.cpp +++ b/src/MeoAssistance/InfrastDormTask.cpp @@ -15,37 +15,56 @@ bool asst::InfrastDormTask::run() }; m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); - for (int i = 0; i < m_max_num_of_dorm; ++i) { - enter_facility(FacilityName, i); + for (; m_cur_dorm_index < m_max_num_of_dorm; ++m_cur_dorm_index) { + enter_facility(FacilityName, m_cur_dorm_index); if (!enter_oper_list_page()) { return false; } - if (i == 0) { - swipe_to_the_left_of_operlist(); - } + swipe_to_the_left_of_operlist(); click_clear_button(); - const auto& image = ctrler.get_image(); - InfrastMoodImageAnalyzer mood_analyzer(image); - if (!mood_analyzer.analyze()) { - return false; - } - mood_analyzer.sort_result(); - const auto& mood_result = mood_analyzer.get_result(); - int quantity_selected = 0; - for (const auto& mood_info : mood_result) { - // TODO:这个阈值写到配置文件里去 - if (mood_info.percentage < 0.3) { - ctrler.click(mood_info.rect); - if (++quantity_selected >= MaxNumOfOpers) { + while (quantity_selected < MaxNumOfOpers) { + const auto& image = ctrler.get_image(); + InfrastMoodImageAnalyzer mood_analyzer(image); + if (!mood_analyzer.analyze()) { + return false; + } + mood_analyzer.sort_result(); + const auto& mood_result = mood_analyzer.get_result(); + + int quantity_resting = 0; + for (const auto& mood_info : mood_result) { + switch (mood_info.smiley.type) + { + case InfrastSmileyType::Rest: + // 如果当前页面休息完成的人数超过5个,说明已经已经把所有心情不满的滑过一遍、没有更多的了,直接退出即可 + if (++quantity_resting >= MaxNumOfOpers) { + click_confirm_button(); + return true; + } + break; + case InfrastSmileyType::Work: + case InfrastSmileyType::Distract: + // 干员没有被选择的情况下,心情小于30%,或不在工作,就进驻宿舍 + if (mood_info.selected == false + && (mood_info.percentage < 0.3 // TODO:这个阈值写到配置文件里去 + || mood_info.working == false)) + { + ctrler.click(mood_info.rect); + if (++quantity_selected >= MaxNumOfOpers) { + break; + } + } + break; + default: break; } } - else { - click_confirm_button(); - return true; + if (quantity_selected >= MaxNumOfOpers) { + break; } + sync_swipe_of_operlist(); } click_confirm_button(); click_return_button(); diff --git a/src/MeoAssistance/InfrastMoodImageAnalyzer.cpp b/src/MeoAssistance/InfrastMoodImageAnalyzer.cpp index 067fe1811d..c92385a922 100644 --- a/src/MeoAssistance/InfrastMoodImageAnalyzer.cpp +++ b/src/MeoAssistance/InfrastMoodImageAnalyzer.cpp @@ -2,6 +2,7 @@ #include "Resource.h" #include "InfrastSmileyImageAnalyzer.h" +#include "MatchImageAnalyzer.h" #include "AsstUtils.hpp" bool asst::InfrastMoodImageAnalyzer::analyze() @@ -9,6 +10,8 @@ bool asst::InfrastMoodImageAnalyzer::analyze() mood_detect(); mood_analyze(); hash_calc(); + selected_analyze(); + working_analyze(); return true; } @@ -38,8 +41,8 @@ bool asst::InfrastMoodImageAnalyzer::mood_detect() const auto hash_task_ptr = resource.task().task_ptr("InfrastSkillsHash"); const auto prg_task_ptr = resource.task().task_ptr("InfrastOperMoodProgressBar"); - Rect hash_rect_move = hash_task_ptr->result_move; - Rect progress_rect_move = prg_task_ptr->result_move; + Rect hash_rect_move = hash_task_ptr->rect_move; + Rect progress_rect_move = prg_task_ptr->rect_move; std::vector roi_vec = { upper_task_ptr->roi, @@ -66,7 +69,7 @@ bool asst::InfrastMoodImageAnalyzer::mood_detect() continue; } #ifdef LOG_TRACE - cv::rectangle(m_image_draw, utils::make_rect(prg_rect), cv::Scalar(0, 0, 255), 2); + //cv::rectangle(m_image_draw, utils::make_rect(prg_rect), cv::Scalar(0, 0, 255), 2); #endif // LOG_TRACE InfrastOperMoodInfo info; @@ -167,7 +170,7 @@ bool asst::InfrastMoodImageAnalyzer::mood_analyze() bool asst::InfrastMoodImageAnalyzer::hash_calc() { const auto hash_task_ptr = resource.task().task_ptr("InfrastSkillsHash"); - Rect hash_rect_move = hash_task_ptr->result_move; + Rect hash_rect_move = hash_task_ptr->rect_move; for (auto&& info : m_result) { Rect hash_rect = hash_rect_move; @@ -176,4 +179,52 @@ bool asst::InfrastMoodImageAnalyzer::hash_calc() info.hash = calc_hash(hash_rect); } return true; +} + +bool asst::InfrastMoodImageAnalyzer::selected_analyze() +{ + const auto selected_task_ptr = std::dynamic_pointer_cast( + resource.task().task_ptr("InfrastOperSelected")); + Rect rect_move = selected_task_ptr->rect_move; + + MatchImageAnalyzer selected_analyzer(m_image); + selected_analyzer.set_task_info(*selected_task_ptr); + + for (auto&& info : m_result) { + Rect selected_rect = rect_move; + selected_rect.x += info.rect.x; + selected_rect.y += info.rect.y; + selected_analyzer.set_roi(selected_rect); + if (selected_analyzer.analyze()) { + info.selected = true; +#ifdef LOG_TRACE + cv::putText(m_image_draw, "SELECTED", cv::Point(selected_rect.x, selected_rect.y + 30), 1, 1, cv::Scalar(0, 0, 255), 2); +#endif + } + } + return true; +} + +bool asst::InfrastMoodImageAnalyzer::working_analyze() +{ + const auto working_task_ptr = std::dynamic_pointer_cast( + resource.task().task_ptr("InfrastOperOnShift")); + Rect rect_move = working_task_ptr->rect_move; + + MatchImageAnalyzer selected_analyzer(m_image); + selected_analyzer.set_task_info(*working_task_ptr); + + for (auto&& info : m_result) { + Rect working_rect = rect_move; + working_rect.x += info.rect.x; + working_rect.y += info.rect.y; + selected_analyzer.set_roi(working_rect); + if (selected_analyzer.analyze()) { + info.selected = true; +#ifdef LOG_TRACE + cv::putText(m_image_draw, "ONSHIFT", cv::Point(working_rect.x, working_rect.y), 1, 1, cv::Scalar(0, 0, 255), 2); +#endif + } + } + return true; } \ No newline at end of file diff --git a/src/MeoAssistance/InfrastMoodImageAnalyzer.h b/src/MeoAssistance/InfrastMoodImageAnalyzer.h index ccb8bcb7f7..22a0514c3f 100644 --- a/src/MeoAssistance/InfrastMoodImageAnalyzer.h +++ b/src/MeoAssistance/InfrastMoodImageAnalyzer.h @@ -29,6 +29,8 @@ namespace asst { bool mood_detect(); bool mood_analyze(); bool hash_calc(); + bool selected_analyze(); + bool working_analyze(); std::vector m_result; }; diff --git a/src/MeoAssistance/InfrastProductionTask.cpp b/src/MeoAssistance/InfrastProductionTask.cpp index 9dbd7d40eb..3b7be8478c 100644 --- a/src/MeoAssistance/InfrastProductionTask.cpp +++ b/src/MeoAssistance/InfrastProductionTask.cpp @@ -21,7 +21,7 @@ // m_all_available_opers.clear(); // // swipe_to_the_left_of_operlist(); -// bool ret = opers_detect(); +// bool ret = opers_detect_with_swipe(); // // optimal_calc(); // @@ -69,9 +69,12 @@ bool asst::InfrastProductionTask::shift_facility_list() swipe_to_the_left_of_operlist(); if (m_all_available_opers.empty()) { - opers_detect(); + opers_detect_with_swipe(); swipe_to_the_left_of_operlist(); } + else { + opers_detect(); + } optimal_calc(); opers_choose(); click_confirm_button(); @@ -79,41 +82,20 @@ bool asst::InfrastProductionTask::shift_facility_list() return true; } -bool asst::InfrastProductionTask::opers_detect() +bool asst::InfrastProductionTask::opers_detect_with_swipe() { m_all_available_opers.clear(); int first_number = 0; while (true) { - const auto& image = ctrler.get_image(); - - InfrastSkillsImageAnalyzer skills_analyzer(image); - skills_analyzer.set_facility(m_facility); - - if (!skills_analyzer.analyze()) { - return false; - } - const auto& cur_all_info = skills_analyzer.get_result(); - if (first_number == 0) { - first_number = cur_all_info.size(); - } - // 如果两个的hash距离过小,则认为是同一个干员,不进行插入 - for (const auto& cur : cur_all_info) { - auto find_iter = std::find_if(m_all_available_opers.cbegin(), m_all_available_opers.cend(), - [&cur](const InfrastOperSkillInfo& info) -> bool { - int dist = utils::hamming(cur.hash, info.hash); - return dist < HashDistThres; - }); - if (find_iter == m_all_available_opers.cend()) { - m_all_available_opers.emplace_back(cur); - } - } + size_t num = opers_detect(); // 这里本来是判断不相等就可以退出循环。 // 但是有时候滑动会把一个干员挡住一半,一个页面完整的干员真的只有10个,所以加个2的差值 - if (first_number - cur_all_info.size() > 2) { + if (max_num_of_opers_per_page - num > 2) { break; } + // 异步在最后会多滑动一下,耽误的时间还不如用同步 sync_swipe_of_operlist(); } @@ -124,6 +106,33 @@ bool asst::InfrastProductionTask::opers_detect() return false; } +size_t asst::InfrastProductionTask::opers_detect() +{ + const auto& image = ctrler.get_image(); + + InfrastSkillsImageAnalyzer skills_analyzer(image); + skills_analyzer.set_facility(m_facility); + + if (!skills_analyzer.analyze()) { + return 0; + } + const auto& cur_all_info = skills_analyzer.get_result(); + max_num_of_opers_per_page = (std::max)(max_num_of_opers_per_page, cur_all_info.size()); + + // 如果两个的hash距离过小,则认为是同一个干员,不进行插入 + for (const auto& cur : cur_all_info) { + auto find_iter = std::find_if(m_all_available_opers.cbegin(), m_all_available_opers.cend(), + [&cur](const InfrastOperSkillInfo& info) -> bool { + int dist = utils::hamming(cur.hash, info.hash); + return dist < HashDistThres; + }); + if (find_iter == m_all_available_opers.cend()) { + m_all_available_opers.emplace_back(cur); + } + } + return cur_all_info.size(); +} + bool asst::InfrastProductionTask::optimal_calc() { auto& facility_info = resource.infrast().get_facility_info(m_facility); diff --git a/src/MeoAssistance/InfrastProductionTask.h b/src/MeoAssistance/InfrastProductionTask.h index 5a2922d3b2..2210de1510 100644 --- a/src/MeoAssistance/InfrastProductionTask.h +++ b/src/MeoAssistance/InfrastProductionTask.h @@ -21,7 +21,8 @@ namespace asst { protected: bool shift_facility_list(); bool facility_list_detect(); - bool opers_detect(); + bool opers_detect_with_swipe(); + size_t opers_detect(); // 返回当前页面的干员数 bool optimal_calc(); bool opers_choose(); @@ -32,5 +33,6 @@ namespace asst { std::vector m_all_available_opers; std::vector m_optimal_opers; std::vector m_facility_list_tabs; + size_t max_num_of_opers_per_page = 0; }; } diff --git a/src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp b/src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp index e052a8a338..fa7d2375cc 100644 --- a/src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp +++ b/src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp @@ -27,7 +27,7 @@ bool asst::InfrastSkillsImageAnalyzer::skills_detect() const auto lower_task_ptr = resource.task().task_ptr("InfrastSkillsLower"); const auto hash_task_ptr = resource.task().task_ptr("InfrastSkillsHash"); - Rect hash_rect_move = hash_task_ptr->result_move; + Rect hash_rect_move = hash_task_ptr->rect_move; std::vector roi_vec = { upper_task_ptr->roi, @@ -45,10 +45,10 @@ bool asst::InfrastSkillsImageAnalyzer::skills_detect() const auto& smiley_res = smiley_analyzer.get_result(); const auto task_ptr = resource.task().task_ptr("InfrastSkills"); - int skills_x_offset = task_ptr->result_move.x; - int skills_y_offset = task_ptr->result_move.y; - int skills_width = task_ptr->result_move.width; - int skills_height = task_ptr->result_move.height; + int skills_x_offset = task_ptr->rect_move.x; + int skills_y_offset = task_ptr->rect_move.y; + int skills_width = task_ptr->rect_move.width; + int skills_height = task_ptr->rect_move.height; for (const auto& [_type, smiley_rect] : smiley_res) { Rect skills_rect; diff --git a/src/MeoAssistance/MultiMatchImageAnalyzer.cpp b/src/MeoAssistance/MultiMatchImageAnalyzer.cpp index 2854e41510..48d9005930 100644 --- a/src/MeoAssistance/MultiMatchImageAnalyzer.cpp +++ b/src/MeoAssistance/MultiMatchImageAnalyzer.cpp @@ -53,7 +53,6 @@ bool asst::MultiMatchImageAnalyzer::multi_match_templ(const cv::Mat& templ) //cv::threshold(mask, mask, m_mask_range.first, 255, cv::THRESH_BINARY); cv::inRange(mask, m_mask_range.first, m_mask_range.second, mask); cv::matchTemplate(image_roi, templ, matched, cv::TM_CCOEFF_NORMED, mask); - int test = 0; } int mini_distance = (std::min)(templ.cols, templ.rows) / 2; diff --git a/src/MeoAssistance/ProcessTask.cpp b/src/MeoAssistance/ProcessTask.cpp index 97c8a147be..e77351ea1b 100644 --- a/src/MeoAssistance/ProcessTask.cpp +++ b/src/MeoAssistance/ProcessTask.cpp @@ -31,7 +31,7 @@ bool ProcessTask::run() } auto task_info_ptr = analyzer.get_result(); Rect rect = analyzer.get_rect(); - const auto& res_move = task_info_ptr->result_move; + const auto& res_move = task_info_ptr->rect_move; if (!res_move.empty()) { rect.x += res_move.x; rect.y += res_move.y; diff --git a/src/MeoAssistance/RecruitImageAnalyzer.cpp b/src/MeoAssistance/RecruitImageAnalyzer.cpp index 04d41c58c5..16640d584f 100644 --- a/src/MeoAssistance/RecruitImageAnalyzer.cpp +++ b/src/MeoAssistance/RecruitImageAnalyzer.cpp @@ -57,7 +57,7 @@ bool asst::RecruitImageAnalyzer::time_analyze() if (time_analyzer.analyze()) { Rect rect = time_analyzer.get_result().rect; - const auto& res_move = time_task_ptr->result_move; + const auto& res_move = time_task_ptr->rect_move; if (!res_move.empty()) { rect.x += res_move.x; rect.y += res_move.y; diff --git a/src/MeoAssistance/TaskData.cpp b/src/MeoAssistance/TaskData.cpp index 35a0d297ab..9fbde86fa7 100644 --- a/src/MeoAssistance/TaskData.cpp +++ b/src/MeoAssistance/TaskData.cpp @@ -225,16 +225,16 @@ bool asst::TaskData::parse(const json::value& json) task_info_ptr->next.emplace_back(next.as_string()); } } - if (task_json.exist("resultMove")) { - const json::array& move_arr = task_json.at("resultMove").as_array(); - task_info_ptr->result_move = Rect( + if (task_json.exist("rectMove")) { + const json::array& move_arr = task_json.at("rectMove").as_array(); + task_info_ptr->rect_move = Rect( move_arr[0].as_integer(), move_arr[1].as_integer(), move_arr[2].as_integer(), move_arr[3].as_integer()); } else { - task_info_ptr->result_move = Rect(); + task_info_ptr->rect_move = Rect(); } m_all_tasks_info.emplace(name, task_info_ptr);