From c87c65e1316830dceede0b9bcdd7ae13a548e059 Mon Sep 17 00:00:00 2001 From: MistEO Date: Sun, 13 Mar 2022 00:51:14 +0800 Subject: [PATCH] =?UTF-8?q?feat.=E5=AE=8C=E6=88=90=E8=82=89=E9=B8=BD?= =?UTF-8?q?=E5=B9=B2=E5=91=98=E9=80=89=E6=8B=A9=EF=BC=88=E6=8A=80=E8=83=BD?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E8=BF=98=E6=B2=A1=E5=81=9A=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/AsstDef.h | 4 - resource/tasks.json | 80 ++++--------------- src/MeoAssistant/AbstractImageAnalyzer.h | 1 - src/MeoAssistant/InfrastProductionTask.cpp | 1 + src/MeoAssistant/MeoAssistant.vcxproj | 3 +- src/MeoAssistant/MeoAssistant.vcxproj.filters | 9 ++- .../RoguelikeRecruitTaskPlugin.cpp | 41 ++++++++++ src/MeoAssistant/RoguelikeRecruitTaskPlugin.h | 21 +++++ src/MeoAssistant/RoguelikeTask.cpp | 23 +++++- src/MeoAssistant/RoguelikeTask.h | 2 + tools/TestCaller/main.cpp | 16 ++++ 11 files changed, 124 insertions(+), 77 deletions(-) delete mode 100644 include/AsstDef.h create mode 100644 src/MeoAssistant/RoguelikeRecruitTaskPlugin.cpp create mode 100644 src/MeoAssistant/RoguelikeRecruitTaskPlugin.h diff --git a/include/AsstDef.h b/include/AsstDef.h deleted file mode 100644 index a09d9ec94c..0000000000 --- a/include/AsstDef.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#define AsstParamIdPenguinId "penguin_id" -#define AsstParamIdOcrText "ocr_text" diff --git a/resource/tasks.json b/resource/tasks.json index fc3b3f1631..55cbad9089 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -519,6 +519,7 @@ ] }, "EndOfAction": { + "Doc": "本任务注册了插件 StageDropsTaskPlugin", "algorithm": "OcrDetect", "text": [ "行动结束" @@ -3898,69 +3899,16 @@ "rearDelay": 1000 }, "Roguelike1ChooseOper": { + "Doc": "本任务注册了插件 RoguelikeRecruitTaskPlugin", + "algorithm": "JustReturn", + "action": "DoNothing", + "next": [ + "Roguelike1ChooseOperConfirm" + ] + }, + "Roguelike1RecruitData": { "algorithm": "OcrDetect", - "action": "ClickSelf", - "cache": false, - "Doc": "所有肉鸽可能招募的干员,不在列表里的不会则被招募,可以手动修改,在前面的会优先招募", - "Doc2": "画面中如果既有低星又有高星,说明希望不够(高星是灰的不让选,但也被识别到了),所以尽量把低星的放前面,优先招募", - "text": [ - "---三星备选干员---", - "芬", - "玫兰莎", - "香草", - "梓兰", - "芙蓉", - "安赛尔", - "预备干员", - "---近卫---", - "幽灵鲨", - "煌", - "帕拉斯", - "银灰", - "陈", - "棘刺", - "---先锋---", - "凛冬", - "德克萨斯", - "风笛", - "嵯峨", - "推进之王", - "---重装---", - "古米", - "蛇屠箱", - "临光", - "泥岩", - "塞雷娅", - "星熊", - "---狙击---", - "白金", - "能天使", - "假日威龙陈", - "黑", - "---术士---", - "阿米娅", - "天火", - "艾雅法拉", - "异客", - "---治疗---", - "白面鸮", - "赫默", - "凯尔希", - "闪灵", - "夜莺", - "---辅助---", - "梅尔", - "巫恋", - "初雪", - "真理", - "安洁莉娜", - "铃兰", - "麦哲伦", - "令", - "---特种---", - "水月", - "狮蝎" - ], + "text": [], "ocrReplace": [ [ "白面.+", @@ -3976,9 +3924,6 @@ 69, 666, 614 - ], - "next": [ - "Roguelike1ChooseOperConfirm" ] }, "Roguelike1ChooseOperConfirm": { @@ -4196,6 +4141,9 @@ 298, 289 ], + "reduceOtherTimes": [ + "Roguelike1StageTraderInvestConfirm" + ], "next": [ "Roguelike1StageTraderInvestCancel" ] @@ -4593,6 +4541,7 @@ ] }, "Roguelike1QuickFormation": { + "Doc": "本任务注册了插件 RoguelikeFormationTaskPlugin", "action": "ClickSelf", "roi": [ 817, @@ -4640,6 +4589,7 @@ ] }, "Roguelike1StartAction": { + "Doc": "本任务注册了插件 RoguelikeBattleTaskPlugin", "action": "ClickSelf", "roi": [ 905, diff --git a/src/MeoAssistant/AbstractImageAnalyzer.h b/src/MeoAssistant/AbstractImageAnalyzer.h index 131be58a0a..35fb4b1a37 100644 --- a/src/MeoAssistant/AbstractImageAnalyzer.h +++ b/src/MeoAssistant/AbstractImageAnalyzer.h @@ -19,7 +19,6 @@ namespace asst virtual void set_image(const cv::Mat image, const Rect& roi = Rect()); virtual void set_roi(const Rect& roi) noexcept; - void set_task_data(std::shared_ptr task_data); virtual bool analyze() = 0; diff --git a/src/MeoAssistant/InfrastProductionTask.cpp b/src/MeoAssistant/InfrastProductionTask.cpp index efa276733d..09d58f8828 100644 --- a/src/MeoAssistant/InfrastProductionTask.cpp +++ b/src/MeoAssistant/InfrastProductionTask.cpp @@ -31,6 +31,7 @@ void asst::InfrastProductionTask::set_product(std::string product_name) noexcept json::value callback_info = basic_info_with_what("ProductOfFacility"); callback_info["details"]["product"] = m_product; + // 该回调注册了插件 DronesForShamareTaskPlugin callback(AsstMsg::SubTaskExtraInfo, callback_info); } diff --git a/src/MeoAssistant/MeoAssistant.vcxproj b/src/MeoAssistant/MeoAssistant.vcxproj index 271068d44a..33e1c4d044 100644 --- a/src/MeoAssistant/MeoAssistant.vcxproj +++ b/src/MeoAssistant/MeoAssistant.vcxproj @@ -12,7 +12,6 @@ - @@ -70,6 +69,7 @@ + @@ -135,6 +135,7 @@ + diff --git a/src/MeoAssistant/MeoAssistant.vcxproj.filters b/src/MeoAssistant/MeoAssistant.vcxproj.filters index 87bee6484f..9a7a40c098 100644 --- a/src/MeoAssistant/MeoAssistant.vcxproj.filters +++ b/src/MeoAssistant/MeoAssistant.vcxproj.filters @@ -270,9 +270,6 @@ 头文件\Task - - 头文件\Caller - 头文件\Caller @@ -294,6 +291,9 @@ 头文件\Task + + 头文件\Task\Plugin + @@ -482,6 +482,9 @@ 源文件\Task + + 源文件\Task\Plugin + diff --git a/src/MeoAssistant/RoguelikeRecruitTaskPlugin.cpp b/src/MeoAssistant/RoguelikeRecruitTaskPlugin.cpp new file mode 100644 index 0000000000..a144c969fd --- /dev/null +++ b/src/MeoAssistant/RoguelikeRecruitTaskPlugin.cpp @@ -0,0 +1,41 @@ +#include "RoguelikeRecruitTaskPlugin.h" + +#include "OcrImageAnalyzer.h" +#include "Controller.h" +#include "TaskData.h" + +void asst::RoguelikeRecruitTaskPlugin::set_opers(std::vector opers) +{ + m_opers = std::move(opers); +} + +bool asst::RoguelikeRecruitTaskPlugin::verify(AsstMsg msg, const json::value& details) const +{ + if (msg != AsstMsg::SubTaskCompleted + || details.get("subtask", std::string()) != "ProcessTask") { + return false; + } + + if (details.at("details").at("task").as_string() == "Roguelike1ChooseOper") { + return true; + } + else { + return false; + } +} + +bool asst::RoguelikeRecruitTaskPlugin::_run() +{ + OcrImageAnalyzer analyzer(m_ctrler->get_image()); + analyzer.set_task_info(Task.get("Roguelike1RecruitData")); + analyzer.set_required(m_opers); + + if (!analyzer.analyze()) { + return false; + } + + Rect target = analyzer.get_result().front().rect; + m_ctrler->click(target); + + return true; +} diff --git a/src/MeoAssistant/RoguelikeRecruitTaskPlugin.h b/src/MeoAssistant/RoguelikeRecruitTaskPlugin.h new file mode 100644 index 0000000000..e913e1980f --- /dev/null +++ b/src/MeoAssistant/RoguelikeRecruitTaskPlugin.h @@ -0,0 +1,21 @@ +#pragma once +#include "AbstractTaskPlugin.h" + +namespace asst +{ + class RoguelikeRecruitTaskPlugin : public AbstractTaskPlugin + { + public: + using AbstractTaskPlugin::AbstractTaskPlugin; + virtual ~RoguelikeRecruitTaskPlugin() = default; + + virtual bool verify(AsstMsg msg, const json::value& details) const override; + + void set_opers(std::vector opers); + + protected: + virtual bool _run() override; + + std::vector m_opers; + }; +} diff --git a/src/MeoAssistant/RoguelikeTask.cpp b/src/MeoAssistant/RoguelikeTask.cpp index c78867ef8a..5493682739 100644 --- a/src/MeoAssistant/RoguelikeTask.cpp +++ b/src/MeoAssistant/RoguelikeTask.cpp @@ -3,6 +3,7 @@ #include "ProcessTask.h" #include "RoguelikeFormationTaskPlugin.h" #include "RoguelikeBattleTaskPlugin.h" +#include "RoguelikeRecruitTaskPlugin.h" #include "Logger.hpp" @@ -12,8 +13,11 @@ asst::RoguelikeTask::RoguelikeTask(AsstCallback callback, void* callback_arg) { m_roguelike_task_ptr->set_tasks({ "Roguelike1Begin" }) .set_retry_times(50); + m_roguelike_task_ptr->regiseter_plugin(); m_roguelike_task_ptr->regiseter_plugin(); + m_recruit_task_ptr = m_roguelike_task_ptr->regiseter_plugin(); + m_recruit_task_ptr->set_retry_times(2); // 这个任务如果卡住会放弃当前的肉鸽并重新开始,所以多添加一点。先这样凑合用 for (int i = 0; i != 10000; ++i) { @@ -28,6 +32,21 @@ bool asst::RoguelikeTask::set_params(const json::value& params) // 2 - 投资过后再退出,没有投资就继续往后打 int mode = params.get("mode", 0); + std::vector opers_vec; + if (params.contains("opers") && params.at("opers").is_array()) { + for (auto& oper : params.at("opers").as_array()) { + if (oper.contains("name") && oper.at("name").is_string()) { + opers_vec.emplace_back(oper.at("name").as_string()); + } + else { + return false; + } + } + } + else { + return false; + } + switch (mode) { case 0: break; @@ -42,9 +61,7 @@ bool asst::RoguelikeTask::set_params(const json::value& params) return false; } - if (params.contains("opers") && params.at("opers").is_array()) { - // TODO - } + m_recruit_task_ptr->set_opers(std::move(opers_vec)); return true; } diff --git a/src/MeoAssistant/RoguelikeTask.h b/src/MeoAssistant/RoguelikeTask.h index 7d3148db38..30e760552d 100644 --- a/src/MeoAssistant/RoguelikeTask.h +++ b/src/MeoAssistant/RoguelikeTask.h @@ -4,6 +4,7 @@ namespace asst { class ProcessTask; + class RoguelikeRecruitTaskPlugin; class RoguelikeTask : public PackageTask { @@ -17,5 +18,6 @@ namespace asst private: std::shared_ptr m_roguelike_task_ptr = nullptr; + std::shared_ptr m_recruit_task_ptr = nullptr; }; } diff --git a/tools/TestCaller/main.cpp b/tools/TestCaller/main.cpp index d72f1fb471..635a3e7270 100644 --- a/tools/TestCaller/main.cpp +++ b/tools/TestCaller/main.cpp @@ -69,6 +69,22 @@ int main(int argc, char** argv) )"); AsstAppendTask(ptr, "Award", R"({})"); + AsstAppendTask(ptr, "Roguelike", R"( +{ + "opers": [ + { + "name": "帕拉斯" + }, + { + "name": "梓兰" + }, + { + "name": "安赛尔" + } + ] +} +)"); + AsstStart(ptr); getchar();