From 47b5ecf40bdedbbf913219a540782f0ed44e6397 Mon Sep 17 00:00:00 2001 From: zzyyyl Date: Mon, 3 Oct 2022 22:02:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/tasks.json | 232 +++++++++++----------------------- src/MeoAssistant/TaskData.cpp | 2 +- src/MeoAssistant/TaskData.h | 79 +++++++++--- 3 files changed, 136 insertions(+), 177 deletions(-) diff --git a/resource/tasks.json b/resource/tasks.json index 583ce2ad20..d667aa71a2 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -1939,10 +1939,10 @@ "StartUpConnectingFlag", "StartLoginBServer", "BServerPrivacyPolicy", - "Terminal", - "CloseAnno", - "TodaysSupplies", - "ReturnToTerminal", + "Terminal@Main", + "Terminal@CloseAnno", + "Terminal@TodaysSupplies", + "Terminal@ReturnTo", "OfflineConfirm", "EndOfAction", "StageSNFlag" @@ -1963,10 +1963,10 @@ "StartUpConnectingFlag", "StartLoginBServer", "BServerPrivacyPolicy", - "Terminal", - "CloseAnno", + "Terminal@Main", + "Terminal@CloseAnno", "OfflineConfirm", - "TodaysSupplies" + "Terminal@TodaysSupplies" ] }, "Annihilation": { @@ -1990,11 +1990,11 @@ "algorithm": "JustReturn", "action": "DoNothing", "next": [ - "ReturnToTerminal", - "Terminal", - "CloseAnno", - "StageSNReturnToTerminal", - "TodaysSupplies" + "Terminal@ReturnTo", + "Terminal@Main", + "Terminal@CloseAnno", + "Terminal@StageSNReturnTo", + "Terminal@TodaysSupplies" ] }, "FightBegin": { @@ -2036,10 +2036,10 @@ "StartUpConnectingFlag", "StartLoginBServer", "BServerPrivacyPolicy", - "Terminal", - "CloseAnno", + "Terminal@Main", + "Terminal@CloseAnno", "OfflineConfirm", - "TodaysSupplies" + "Terminal@TodaysSupplies" ] }, "StartUpConnectingFlag": { @@ -2055,10 +2055,10 @@ "StartLoginBServer", "BServerPrivacyPolicy", "StartUpConnectingFlag", - "Terminal", - "CloseAnno", + "Terminal@Main", + "Terminal@CloseAnno", "OfflineConfirm", - "TodaysSupplies" + "Terminal@TodaysSupplies" ] }, "StartLoginBServer": { @@ -2073,13 +2073,13 @@ "StartUpConnectingFlag", "StartLoginBServer", "BServerPrivacyPolicy", - "Terminal", - "CloseAnno", + "Terminal@Main", + "Terminal@CloseAnno", "OfflineConfirm", - "TodaysSupplies" + "Terminal@TodaysSupplies" ] }, - "ReturnToTerminal": { + "ReturnTo": { "template": "Return.png", "templThreshold": 0.7, "action": "ClickSelf", @@ -2090,14 +2090,15 @@ 80 ], "next": [ - "ReturnToTerminal", - "Terminal", - "ReturnToTerminalConfirm", + "ReturnTo", + "Main", + "ReturnToConfirm", "CloseAnno", - "StageSNReturnToTerminal" + "StageSNReturnTo", + "TodaysSupplies" ] }, - "ReturnToTerminalConfirm": { + "ReturnToConfirm": { "template": "PopupConfirm.png", "action": "ClickSelf", "roi": [ @@ -2107,11 +2108,11 @@ 160 ], "next": [ - "ReturnToTerminal", - "Terminal", + "ReturnTo", + "Main", "CloseAnno", - "StageSNReturnToTerminal", - "ReturnToTerminalConfirm" + "StageSNReturnTo", + "TodaysSupplies" ] }, "UsePrts": { @@ -2225,26 +2226,6 @@ "Stop" ] }, - "StageSNReturnToAward": { - "template": "StageSNReturnFlag.png", - "action": "ClickRect", - "cache": false, - "roi": [ - 284, - 509, - 242, - 141 - ], - "specificRect": [ - 20, - 20, - 135, - 35 - ], - "next": [ - "ReturnToAward" - ] - }, "StageSNReturnToFriends": { "template": "StageSNReturnFlag.png", "action": "ClickRect", @@ -2345,7 +2326,7 @@ "ReturnToRoguelike1" ] }, - "StageSNReturnToTerminal": { + "StageSNReturnTo": { "template": "StageSNReturnFlag.png", "action": "ClickRect", "cache": false, @@ -2362,7 +2343,7 @@ 35 ], "next": [ - "ReturnToTerminal" + "ReturnTo" ] }, "StartButton2": { @@ -2590,9 +2571,9 @@ "StartUpConnectingFlag", "StartLoginBServer", "BServerPrivacyPolicy", - "Terminal", - "CloseAnno", - "TodaysSupplies", + "Terminal@Main", + "Terminal@CloseAnno", + "Terminal@TodaysSupplies", "OfflineConfirm" ] }, @@ -2833,13 +2814,13 @@ 255 ], "next": [ - "CloseAnno", + "Terminal@CloseAnno", "StartToWakeUp", "StartUpConnectingFlag", "StartLoginBServer", "BServerPrivacyPolicy", "OfflineConfirmImpl", - "TodaysSupplies" + "Terminal@TodaysSupplies" ] }, "StartToWakeUp": { @@ -2855,10 +2836,10 @@ "StartUpConnectingFlag", "StartLoginBServer", "BServerPrivacyPolicy", - "Terminal", - "CloseAnno", + "Terminal@Main", + "Terminal@CloseAnno", "OfflineConfirm", - "TodaysSupplies" + "Terminal@TodaysSupplies" ] }, "CloseAnno": { @@ -2871,12 +2852,19 @@ 200 ], "next": [ - "Terminal", + "Main", "CloseAnno", + "ReturnTo", + "StageSNReturnTo", "TodaysSupplies" ] }, - "Terminal": { + "Main": { + "Doc": "base_task: Main", + "template": "empty.png" + }, + "Terminal@Main": { + "template": "Terminal.png", "action": "ClickSelf", "roi": [ 880, @@ -2885,15 +2873,15 @@ 120 ], "exceededNext": [ - "TodaysSupplies", - "CloseAnno", + "Terminal@TodaysSupplies", + "Terminal@CloseAnno", "Stop" ], "next": [ "GoLastBattle", - "Terminal", - "CloseAnno", - "TodaysSupplies", + "Terminal@Main", + "Terminal@CloseAnno", + "Terminal@TodaysSupplies", "Stop" ], "rearDelay": 3000 @@ -2918,7 +2906,7 @@ ], "next": [ "CloseAnno", - "Terminal" + "Main" ] }, "LastOrCurBattleBegin": { @@ -2929,11 +2917,11 @@ "StartButton1", "UsePrts", "UsePrts-StageSN", - "ReturnToTerminal", - "Terminal", - "CloseAnno", - "StageSNReturnToTerminal", - "TodaysSupplies", + "Terminal@ReturnTo", + "Terminal@Main", + "Terminal@CloseAnno", + "Terminal@StageSNReturnTo", + "Terminal@TodaysSupplies", "PRTS3", "PRTS", "PRTS2", @@ -3414,40 +3402,17 @@ "algorithm": "JustReturn", "action": "DoNothing", "next": [ - "ReturnToAward", - "Award", + "Award@ReturnTo", + "Award@Main", "ReceiveAward", "DailyTask", "WeeklyTask", - "ReturnToAwardCloseAnno", - "StageSNReturnToAward", - "TodaysSuppliesToAward" + "Award@CloseAnno", + "Award@StageSNReturnTo", + "Award@TodaysSupplies" ] }, - "TodaysSuppliesToAward": { - "algorithm": "OcrDetect", - "text": [ - "今日配给" - ], - "action": "ClickRect", - "specificRect": [ - 1000, - 1, - 270, - 340 - ], - "roi": [ - 500, - 50, - 300, - 150 - ], - "next": [ - "ReturnToAwardCloseAnno", - "Award" - ] - }, - "Award": { + "Award@Main": { "template": "Task.png", "action": "ClickSelf", "roi": [ @@ -3460,9 +3425,9 @@ "ReceiveAward", "DailyTask", "WeeklyTask", - "Award", - "ReturnToAwardCloseAnno", - "TodaysSuppliesToAward" + "Award@Main", + "Award@CloseAnno", + "Award@TodaysSupplies" ] }, "ReceiveAward": { @@ -3548,61 +3513,6 @@ "Stop" ] }, - "ReturnToAward": { - "template": "Return.png", - "templThreshold": 0.7, - "action": "ClickSelf", - "roi": [ - 0, - 0, - 180, - 80 - ], - "next": [ - "Award", - "ReturnToAward", - "ReturnToAwardConfirm", - "ReturnToAwardCloseAnno", - "StageSNReturnToAward", - "TodaysSuppliesToAward" - ] - }, - "ReturnToAwardConfirm": { - "template": "PopupConfirm.png", - "action": "ClickSelf", - "roi": [ - 630, - 400, - 650, - 160 - ], - "next": [ - "Award", - "ReturnToAward", - "ReturnToAwardCloseAnno", - "StageSNReturnToAward", - "TodaysSuppliesToAward", - "ReturnToAwardConfirm" - ] - }, - "ReturnToAwardCloseAnno": { - "template": "CloseAnno.png", - "action": "ClickSelf", - "cache": false, - "roi": [ - 1100, - 0, - 180, - 200 - ], - "next": [ - "Award", - "ReturnToAwardCloseAnno", - "ReturnToAward", - "StageSNReturnToAward", - "TodaysSuppliesToAward" - ] - }, "VisitBegin": { "algorithm": "JustReturn", "action": "DoNothing", diff --git a/src/MeoAssistant/TaskData.cpp b/src/MeoAssistant/TaskData.cpp index ebf7b236c7..cb9ca41e05 100644 --- a/src/MeoAssistant/TaskData.cpp +++ b/src/MeoAssistant/TaskData.cpp @@ -170,7 +170,7 @@ bool asst::TaskData::parse(const json::value& json) #ifdef ASST_DEBUG for (const auto& [name, task] : m_all_tasks_info) { for (const auto& next : task->next) { - if (m_all_tasks_info.find(next) == m_all_tasks_info.cend()) { + if (get(next) == nullptr) { Log.error(name, "'s next", next, "is null"); return false; } diff --git a/src/MeoAssistant/TaskData.h b/src/MeoAssistant/TaskData.h index e460c8ebbc..721749a3b3 100644 --- a/src/MeoAssistant/TaskData.h +++ b/src/MeoAssistant/TaskData.h @@ -14,33 +14,82 @@ namespace asst class TaskData final : public SingletonHolder, public AbstractConfigerWithTempl { + private: + std::shared_ptr generate_task_info(const std::shared_ptr& base_ptr, + const std::string& task_prefix) const + { + std::shared_ptr task_info_ptr; + switch (base_ptr->algorithm) { + case AlgorithmType::MatchTemplate: + task_info_ptr = std::make_shared(*std::dynamic_pointer_cast(base_ptr)); + break; + case AlgorithmType::OcrDetect: + task_info_ptr = std::make_shared(*std::dynamic_pointer_cast(base_ptr)); + break; + case AlgorithmType::Hash: + task_info_ptr = std::make_shared(*std::dynamic_pointer_cast(base_ptr)); + break; + default: + task_info_ptr = std::make_shared(*base_ptr); + break; + } + task_info_ptr->on_error_next = {}; + for (const std::string& on_error_next : base_ptr->on_error_next) { + task_info_ptr->on_error_next.emplace_back(task_prefix + on_error_next); + } + task_info_ptr->exceeded_next = {}; + for (const std::string& exceeded_next : base_ptr->exceeded_next) { + task_info_ptr->exceeded_next.emplace_back(task_prefix + exceeded_next); + } + task_info_ptr->next = {}; + for (const std::string& next : base_ptr->next) { + task_info_ptr->next.emplace_back(task_prefix + next); + } + return task_info_ptr; + } + public: virtual ~TaskData() override = default; virtual const std::unordered_set& get_templ_required() const noexcept override; - template - requires std::derived_from && - (!std::same_as) // Parameter must be a TaskInfo and not same as TaskInfo - std::shared_ptr get(const std::string& name) - { - auto it = m_all_tasks_info.find(name); - if (it == m_all_tasks_info.cend()) { - return nullptr; - } - - return std::dynamic_pointer_cast(it->second); - } - template - requires std::same_as // Parameter must be a TaskInfo + requires (std::derived_from || + std::same_as) // Parameter must be a TaskInfo std::shared_ptr get(const std::string& name) { auto it = m_all_tasks_info.find(name); if (it == m_all_tasks_info.cend()) { + if (size_t name_split_pos = name.find('@'); + name_split_pos == std::string::npos) { + return nullptr; + } + else { + size_t name_len = name_split_pos + 1; + std::string base_task_name = std::string(name, name_len); + std::string derived_task_name = std::string(name, 0, name_len); + if (auto base_task_iter = get(base_task_name); + base_task_iter != nullptr) { + if (auto task_info_ptr = generate_task_info(base_task_iter, derived_task_name); + task_info_ptr != nullptr) { + m_all_tasks_info[name] = task_info_ptr; + if constexpr (std::same_as) { + return task_info_ptr; + } + else { + return std::dynamic_pointer_cast(task_info_ptr); + } + } + } + } return nullptr; } - return it->second; + if constexpr (std::same_as) { + return it->second; + } + else { + return std::dynamic_pointer_cast(it->second); + } } protected: