From 2124d9022bb42d69d2ba7781439ea4bbb37e20d0 Mon Sep 17 00:00:00 2001 From: MistEO Date: Thu, 21 Jul 2022 23:58:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=82=89=E9=B8=BD=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E7=BC=96=E9=98=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/tasks.json | 44 +++++++++++ ...guelike1QuickFormationClearAndReselect.png | Bin 0 -> 1424 bytes .../RoguelikeFormationImageAnalyzer.cpp | 2 + .../RoguelikeFormationImageAnalyzer.h | 4 - .../RoguelikeFormationTaskPlugin.cpp | 73 +++++++++++++++++- .../RoguelikeFormationTaskPlugin.h | 6 ++ 6 files changed, 122 insertions(+), 7 deletions(-) create mode 100644 resource/template/Roguelike1QuickFormationClearAndReselect.png diff --git a/resource/tasks.json b/resource/tasks.json index 9589341cbc..19b1034ae2 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -6962,6 +6962,50 @@ ], "rearDelay": 2000 }, + "Roguelike1QuickFormationDelay": { + "algorithm": "JustReturn", + "action": "DoNothing", + "rearDelay": 100 + }, + "Roguelike1QuickFormationClearAndReselect": { + "action": "ClickSelf", + "roi": [ + 821, + 608, + 139, + 112 + ], + "next": [ + "Roguelike1QuickFormationClearAndReselect-Confirm" + ] + }, + "Roguelike1QuickFormationClearAndReselect-Confirm": { + "template": "Roguelike1FormationConfirm.png", + "roi": [ + 1015, + 601, + 265, + 119 + ], + "next": [ + "Roguelike1QuickFormationClearAndReselect-Formation" + ] + }, + "Roguelike1QuickFormationClearAndReselect-Formation": { + "template": "Roguelike1QuickFormation.png", + "action": "ClickSelf", + "roi": [ + 817, + 0, + 402, + 146 + ], + "next": [ + "Roguelike1QuickFormationClearAndReselect-Formation", + "Stop" + ], + "rearDelay": 2000 + }, "Roguelike1FormationOper": { "cache": false, "roi": [ diff --git a/resource/template/Roguelike1QuickFormationClearAndReselect.png b/resource/template/Roguelike1QuickFormationClearAndReselect.png new file mode 100644 index 0000000000000000000000000000000000000000..dd85423a9e4d9bef56def71f3654bb03cbcef709 GIT binary patch literal 1424 zcmeAS@N?(olHy`uVBq!ia0vp^>Oicr>Eaj?!MXR~#%$5EQtS`z zuTi$N`qanvSLEO^<>rj9hZbcgKYpvbWuxdF`vYm)Wo)B$nvTi{98ywRsdFSsiF>05 zTcNHFOLv3UHiJ;E=K{q^MS3wFg^^+*cAspTW)?nRF@Ai2GwoQT@R=TF^%;`;AD)`3 zU0huJV&k@L+cs|8xP5#3ePy6p#!NvhWd0l}-J>n##&btGVaWj1^hFy?yu2PffUl zBkkBeY4f}@=g)I1F48#ke|PEYYZH~-FFgMH`+NMpnwfsfH{bN(Xso@zzdk-L&aFKm z?TvJ=o48(#Mahc^Q-uDv^~>AaReWHO1={%j++6GQ^Yf+#J&OPI_V#vh{kR3r2F84I z64FX|*qGOrin#tL4iw1+g1kJSBfbcn>FIk|Q1SVh@6ss(O!XdKKYxCH9=<;A@1LK- zwk*brlPzTW+?16L#YaX)O7haWH6WYd`*2VKj3A(B&mO?T0UBxVSLvtNZ)w<>lqY&(Fo~D)IE< zT#z|yTkiU}y;Z-yywvDYn|$)rsV;#>zrMZ(Mgc=uc=++hg&d3^yAMkwuT@oID2)vd zovPwFYnhiOgKMCP@8su|GRK2XZOh%Pqr7O7&em%Td%mCBDZo_4k>=KJcr41>h2hn% zb*r>ICz<$84Pxk8lrc-~{AY{4rBiZmr$xHCq()|~WvqBVw^)${6exVjJzJ-BFkC5( z4Go>7k~vFjDT9dXMHAn7&kJR|HE(Y_yQ!z+)TS#@%pdMqKX>AIp*TZQ_LxMrt{~%z z*Sl7&Qt`ZG66(dM(X}XZmd*Lc7Sn>Z<<3r(6r7s6ax2?|z2)ax1ug*N#j3~fT9gt~ z!1dD5P|rzAGFMGu3J`I1?Adrt zNU&koy49<^CaL%aFBNH6q%mvR$mCbOk`gzRIh!|iZKYMw( z|N7Y7W$*9V0zKs3FIV|~vracK+;;BUH}Cn+1cQn{KR$kZd>k_&?5X|z?d$97)Ai%` z0a*zK3?Du{J$?1+)!pUq64qKx50W|d9y?eksa&ofzVhyGZ z`}XbIy}SC^nVCCxS}Gn{AHUzs-2D5uZ+>&FL|p|j;^AKxA~G%N|NQ|L4E?g!ZTmkx zJlqbBGZ#YikC-zn{<7=iQOuVPi=21)78&qol`;+0Ba|hS^xk5 literal 0 HcmV?d00001 diff --git a/src/MeoAssistant/RoguelikeFormationImageAnalyzer.cpp b/src/MeoAssistant/RoguelikeFormationImageAnalyzer.cpp index c0430d9e77..6ed600d112 100644 --- a/src/MeoAssistant/RoguelikeFormationImageAnalyzer.cpp +++ b/src/MeoAssistant/RoguelikeFormationImageAnalyzer.cpp @@ -7,6 +7,8 @@ bool asst::RoguelikeFormationImageAnalyzer::analyze() { + m_result.clear(); + MultiMatchImageAnalyzer opers_analyzer(m_image); opers_analyzer.set_task_info("Roguelike1FormationOper"); diff --git a/src/MeoAssistant/RoguelikeFormationImageAnalyzer.h b/src/MeoAssistant/RoguelikeFormationImageAnalyzer.h index 3275bbcc89..40fc63ceaf 100644 --- a/src/MeoAssistant/RoguelikeFormationImageAnalyzer.h +++ b/src/MeoAssistant/RoguelikeFormationImageAnalyzer.h @@ -25,10 +25,6 @@ namespace asst { AbstractImageAnalyzer::set_roi(roi); } - virtual void set_image(const cv::Mat image, const Rect& roi) - { - AbstractImageAnalyzer::set_image(image, roi); - } bool selected_analyze(const Rect& roi); diff --git a/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp b/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp index 6554a49154..c2f0f4cd31 100644 --- a/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp +++ b/src/MeoAssistant/RoguelikeFormationTaskPlugin.cpp @@ -4,6 +4,7 @@ #include "Controller.h" #include "TaskData.h" #include "ProcessTask.h" +#include "Logger.hpp" bool asst::RoguelikeFormationTaskPlugin::verify(AsstMsg msg, const json::value& details) const { @@ -23,17 +24,83 @@ bool asst::RoguelikeFormationTaskPlugin::verify(AsstMsg msg, const json::value& bool asst::RoguelikeFormationTaskPlugin::_run() { RoguelikeFormationImageAnalyzer formation_analyzer(m_ctrler->get_image()); - if (!formation_analyzer.analyze()) { return false; } + size_t pre_selected = 0; + size_t select_count = 0; + for (const auto& oper : formation_analyzer.get_result()) { + if (oper.selected) { + ++pre_selected; + continue; + } + m_ctrler->click(oper.rect); + ++select_count; + } + Log.info(__FUNCTION__, "pre_selected: ", pre_selected, " select: ", select_count); + + // 以下情况清空重选(游戏会自动排序) + // 1. 这一页选满 8 个了 + // 2. select 有值,但是重新识别后发现总的选择数量并没有增加(说明上面的click都没生效) + bool reselect = false; + + if (pre_selected == MaxNumOfOperPerPage) { + reselect = true; + } + if (!reselect && select_count != 0) { + sleep(Task.get("Roguelike1QuickFormationDelay")->rear_delay); + formation_analyzer.set_image(m_ctrler->get_image()); + + if (!formation_analyzer.analyze()) { + Log.warn("RoguelikeFormationImageAnalyzer re analyze failed"); + return true; + } + + auto& new_result = formation_analyzer.get_result(); + size_t new_selected_count = std::count_if(new_result.cbegin(), new_result.cend(), + [](const auto& oper) { return oper.selected; }); + // 说明 select_count 计数没生效,即都没点上 + if (new_selected_count == pre_selected) { + reselect = true; + } + } + + if (reselect) { + clear_and_reselect(); + } + + return true; +} + +void asst::RoguelikeFormationTaskPlugin::clear_and_reselect() +{ + // 清空并退出游戏会自动按等级重新排序 + ProcessTask(*this, { "Roguelike1QuickFormationClearAndReselect" }).run(); + + size_t select_count = analyze_and_select(); + // 说明第二页还有 + if (select_count == MaxNumOfOperPerPage) { + ProcessTask(*this, { "SlowlySwipeToTheRight" }).run(); + analyze_and_select(); + // 应该不可能还有第三页吧,不管了 + } +} + +size_t asst::RoguelikeFormationTaskPlugin::analyze_and_select() +{ + RoguelikeFormationImageAnalyzer formation_analyzer(m_ctrler->get_image()); + if (!formation_analyzer.analyze()) { + return false; + } + + size_t select_count = 0; for (const auto& oper : formation_analyzer.get_result()) { if (oper.selected) { continue; } m_ctrler->click(oper.rect); + ++select_count; } - - return true; + return select_count; } diff --git a/src/MeoAssistant/RoguelikeFormationTaskPlugin.h b/src/MeoAssistant/RoguelikeFormationTaskPlugin.h index a72f11db46..d2d6109423 100644 --- a/src/MeoAssistant/RoguelikeFormationTaskPlugin.h +++ b/src/MeoAssistant/RoguelikeFormationTaskPlugin.h @@ -6,6 +6,9 @@ namespace asst // 集成战略模式快捷编队任务 class RoguelikeFormationTaskPlugin : public AbstractTaskPlugin { + public: + static constexpr size_t MaxNumOfOperPerPage = 8; + public: using AbstractTaskPlugin::AbstractTaskPlugin; virtual ~RoguelikeFormationTaskPlugin() = default; @@ -14,5 +17,8 @@ namespace asst protected: virtual bool _run() override; + + void clear_and_reselect(); + size_t analyze_and_select(); }; }