From 8bd5a390cc010f4850b5f4a122f2cf1700ea7c2a Mon Sep 17 00:00:00 2001 From: MistEO Date: Fri, 30 Sep 2022 23:31:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20ProcessTask=E6=94=AF=E6=8C=81=E5=90=8E?= =?UTF-8?q?=E7=BD=AE=E8=B6=85=E9=99=90=EF=BC=8C=E5=B9=B6=E5=B0=86=E8=82=89?= =?UTF-8?q?=E9=B8=BD=E5=88=B7=E6=BA=90=E7=9F=B3=E9=94=AD=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E8=BF=9B=E5=85=A5=E7=AC=AC=E4=BA=8C=E5=B1=82=E5=90=8E=E5=86=8D?= =?UTF-8?q?=E9=80=80=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/2037 fix https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/1959 fix https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/1073 fix https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/396 --- .../addition/Roguelike2/resource/tasks.json | 16 ++++++++++++ resource/tasks.json | 11 +++++--- src/MeoAssistant/Task/RoguelikeTask.cpp | 2 +- src/MeoAssistant/Task/Sub/ProcessTask.cpp | 26 ++++++++++++++++--- src/MeoAssistant/Task/Sub/ProcessTask.h | 17 ++++++++++-- 5 files changed, 62 insertions(+), 10 deletions(-) diff --git a/resource/addition/Roguelike2/resource/tasks.json b/resource/addition/Roguelike2/resource/tasks.json index 0bfa4f8b9c..4266c13421 100644 --- a/resource/addition/Roguelike2/resource/tasks.json +++ b/resource/addition/Roguelike2/resource/tasks.json @@ -460,5 +460,21 @@ "Roguelike2CloseCollectionContinue", "Roguelike2CloseCollectionClose" ] + }, + "Roguelike2DiceConfirmThenAbandon": { + "Doc": "骰子的确认按钮", + "action": "ClickSelf", + "template": "Roguelike2DiceConfirm.png", + "cache": false, + "roi": [ + 551, + 577, + 174, + 143 + ], + "templThreshold": 0.95, + "next": [ + "Roguelike1ExitThenAbandon" + ] } } diff --git a/resource/tasks.json b/resource/tasks.json index b58c816678..653b8dd249 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -7919,9 +7919,6 @@ 234, 204 ], - "exceededNext": [ - "Roguelike1ExitThenAbandon" - ], "next": [ "Roguelike1StageTraderLeaveConfirm", "Roguelike1StageTraderLeave" @@ -7976,6 +7973,10 @@ 295, 203 ], + "exceededNext": [ + "Roguelike2DiceConfirmThenAbandon", + "Roguelike1ExitThenAbandon" + ], "next": [ "Roguelike1StageTrader", "Roguelike1StageSafeHouse", @@ -7993,6 +7994,10 @@ "Roguelike2CloseCollectionClose" ] }, + "Roguelike2DiceConfirmThenAbandon": { + "template": "empty.png", + "templThreshold": 2.0 + }, "Roguelike2CloseCollectionContinue": { "template": "empty.png", "templThreshold": 2.0 diff --git a/src/MeoAssistant/Task/RoguelikeTask.cpp b/src/MeoAssistant/Task/RoguelikeTask.cpp index fd4e41c2da..547f05878a 100644 --- a/src/MeoAssistant/Task/RoguelikeTask.cpp +++ b/src/MeoAssistant/Task/RoguelikeTask.cpp @@ -50,7 +50,7 @@ bool asst::RoguelikeTask::set_params(const json::value& params) case 0: break; case 1: - m_roguelike_task_ptr->set_times_limit("Roguelike1StageTraderLeave", 0); + m_roguelike_task_ptr->set_times_limit("Roguelike1StageTraderLeaveConfirm", 0, ProcessTask::TimesLimitType::Post); break; case 2: [[unlikely]] m_roguelike_task_ptr->set_times_limit("Roguelike1StageTraderInvestCancel", 0); diff --git a/src/MeoAssistant/Task/Sub/ProcessTask.cpp b/src/MeoAssistant/Task/Sub/ProcessTask.cpp index e37c616a8d..a05a78cf4c 100644 --- a/src/MeoAssistant/Task/Sub/ProcessTask.cpp +++ b/src/MeoAssistant/Task/Sub/ProcessTask.cpp @@ -67,9 +67,9 @@ asst::ProcessTask& asst::ProcessTask::set_tasks(std::vector tasks_n return *this; } -ProcessTask& asst::ProcessTask::set_times_limit(std::string name, int limit) +ProcessTask& asst::ProcessTask::set_times_limit(std::string name, int limit, TimesLimitType type) { - m_times_limit[std::move(name)] = limit; + m_times_limit[std::move(name)] = TimesLimitData { limit, type }; return *this; } @@ -136,16 +136,19 @@ bool ProcessTask::_run() int& exec_times = m_exec_times[cur_name]; int max_times = m_cur_task_ptr->max_times; + TimesLimitType limit_type = TimesLimitType::Pre; if (auto iter = m_times_limit.find(cur_name); iter != m_times_limit.cend()) { - max_times = iter->second; + max_times = iter->second.times; + limit_type = iter->second.type; } - if (exec_times >= max_times) { + if (limit_type == TimesLimitType::Pre && exec_times >= max_times) { info["what"] = "ExceededLimit"; info["details"] = json::object { { "task", cur_name }, { "exec_times", exec_times }, { "max_times", max_times }, + { "limit_type", "pre" }, }; Log.info("exec times exceeded the limit", info.to_string()); callback(AsstMsg::SubTaskExtraInfo, info); @@ -243,6 +246,21 @@ bool ProcessTask::_run() callback(AsstMsg::SubTaskCompleted, info); + if (limit_type == TimesLimitType::Post && exec_times >= max_times) { + info["what"] = "ExceededLimit"; + info["details"] = json::object { + { "task", cur_name }, + { "exec_times", exec_times }, + { "max_times", max_times }, + { "limit_type", "post" }, + }; + Log.info("exec times exceeded the limit", info.to_string()); + callback(AsstMsg::SubTaskExtraInfo, info); + m_cur_tasks_name = m_cur_task_ptr->exceeded_next; + sleep(m_task_delay); + continue; + } + if (m_cur_task_ptr->next.empty()) { need_stop = true; } diff --git a/src/MeoAssistant/Task/Sub/ProcessTask.h b/src/MeoAssistant/Task/Sub/ProcessTask.h index 139f897e59..822b663c2c 100644 --- a/src/MeoAssistant/Task/Sub/ProcessTask.h +++ b/src/MeoAssistant/Task/Sub/ProcessTask.h @@ -8,6 +8,19 @@ namespace asst // 流程任务,按照配置文件里的设置的流程运行 class ProcessTask : public AbstractTask { + public: + enum class TimesLimitType + { + Pre, + Post, + }; + + struct TimesLimitData + { + int times = 0; + TimesLimitType type = TimesLimitType::Pre; + }; + public: using AbstractTask::AbstractTask; ProcessTask(const AbstractTask& abs, std::vector tasks_name); @@ -19,7 +32,7 @@ namespace asst ProcessTask& set_task_delay(int delay) noexcept; ProcessTask& set_tasks(std::vector tasks_name) noexcept; - ProcessTask& set_times_limit(std::string name, int limit); + ProcessTask& set_times_limit(std::string name, int limit, TimesLimitType type = TimesLimitType::Pre); ProcessTask& set_rear_delay(std::string name, int delay); protected: @@ -36,7 +49,7 @@ namespace asst std::vector m_cur_tasks_name; std::string m_pre_task_name; std::unordered_map m_rear_delay; - std::unordered_map m_times_limit; + std::unordered_map m_times_limit; std::unordered_map m_exec_times; static constexpr int TaskDelayUnsetted = -1; int m_task_delay = TaskDelayUnsetted;