From 2f5bdbae3f3e23fd7b0246bf0a848e5ebb4bfd11 Mon Sep 17 00:00:00 2001 From: MistEO Date: Sun, 27 Nov 2022 03:11:35 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=95=B4=E7=90=86=E4=B8=80=E4=B8=8B?= =?UTF-8?q?=E5=85=B3=E5=8D=A1=E5=AF=BC=E8=88=AA=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=BB=91=E5=8A=A8=E9=80=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/tasks.json | 18 +-- .../Task/Fight/StageNavigationTask.cpp | 109 +++++++++++++----- .../Task/Fight/StageNavigationTask.h | 10 +- src/MeoAssistant/Task/Interface/FightTask.cpp | 6 +- 4 files changed, 99 insertions(+), 44 deletions(-) diff --git a/resource/tasks.json b/resource/tasks.json index 113211ed04..86e6d93ff9 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -294,21 +294,21 @@ 122 ] }, - "Hard": { + "ChapterDifficultyHard": { "baseTask": "LevelOfDifficulty", "next": [ - "EnterHard", + "EnterChapterDifficultyHard", "Return" ] }, - "Normal": { + "ChapterDifficultyNormal": { "baseTask": "LevelOfDifficulty", "next": [ - "EnterNormal", + "EnterChapterDifficultyNormal", "Return" ] }, - "EnterHard": { + "EnterChapterDifficultyHard": { "algorithm": "OcrDetect", "action": "ClickSelf", "text": [ @@ -321,7 +321,7 @@ 145 ] }, - "EnterNormal": { + "EnterChapterDifficultyNormal": { "algorithm": "OcrDetect", "action": "ClickSelf", "text": [ @@ -480,7 +480,7 @@ "exceededNext": [ "Home@ReturnTo" ], - "maxTimes": 20 + "maxTimes": 10 }, "ClickedCorrectStageOrSwipe": { "baseTask": "StartButton1", @@ -609,13 +609,13 @@ "ChapterSlowlySwipeToTheLeft": { "baseTask": "SlowlySwipeToTheLeft", "specificRect": [ - 300, + 200, 350, 20, 20 ], "rectMove": [ - 900, + 1000, 350, 20, 20 diff --git a/src/MeoAssistant/Task/Fight/StageNavigationTask.cpp b/src/MeoAssistant/Task/Fight/StageNavigationTask.cpp index 94840477ba..69198efdd9 100644 --- a/src/MeoAssistant/Task/Fight/StageNavigationTask.cpp +++ b/src/MeoAssistant/Task/Fight/StageNavigationTask.cpp @@ -2,66 +2,111 @@ #include -#include "Controller.h" -#include "Vision/OcrImageAnalyzer.h" #include "Config/TaskData.h" +#include "Controller.h" #include "Task/ProcessTask.h" #include "Utils/Logger.hpp" +#include "Vision/OcrImageAnalyzer.h" -void asst::StageNavigationTask::set_stage_name(std::string stage_name) +bool asst::StageNavigationTask::set_stage_name(const std::string& stage_name) { - m_stage_name = std::move(stage_name); + LogTraceFunction; + + clear(); + + // 已有关卡优先使用 tasks.json 中的逻辑 + if (Task.get(stage_name)) { + m_is_directly = true; + m_directly_task = stage_name; + Log.error("directly task", m_directly_task); + return true; + } + + m_is_directly = false; + // 10-1 -> [1] "", [2] "10", [3] "1", [4] "" + // JT8-2 -> [1] "JT", [2] "8", [3] "2", [4] "" + // 10-1-Hard -> [1] "", [2] "10", [3] "1", [4] "Hard" + static const std::regex StageRegex(R"(^([A-Za-z]{0,3})(\d{1,2})-(\d{1,2})(?:-(\w+))*$)"); + std::smatch stage_sm; + if (!std::regex_match(stage_name, stage_sm, StageRegex)) { + Log.error("Unknown stage", stage_name); + return false; + } + const std::string& stage_prefix = stage_sm[1].str(); + const std::string& chapter = stage_sm[2].str(); + const std::string& stage_index = stage_sm[3].str(); + const std::string& difficulty = stage_sm[4].str(); + + static const std::string EpisodeTaskPrefix = "Episode"; + m_chapter_task = EpisodeTaskPrefix + chapter; + Log.info("chapter task", m_chapter_task); + if (!Task.get(m_chapter_task)) { + Log.error("chapter task not exists", m_chapter_task); + return false; + } + + if (!difficulty.empty()) { + std::string upper_difficulty = difficulty; + upper_difficulty[0] = static_cast(::toupper(upper_difficulty[0])); + static const std::string DifficultyTaskPrefix = "ChapterDifficulty"; + m_difficulty_task = DifficultyTaskPrefix + upper_difficulty; + Log.info("difficulty task", m_difficulty_task); + if (!Task.get(m_difficulty_task)) { + Log.error("difficulty task not exists", m_difficulty_task); + return false; + } + } + + std::string upper_perfix = stage_prefix; + ranges::transform(upper_perfix, upper_perfix.begin(), + [](char ch) -> char { return static_cast(::toupper(ch)); }); + m_stage_code = upper_perfix + chapter + "-" + stage_index; + Log.info("stage code", m_stage_code); + + return true; } bool asst::StageNavigationTask::_run() { LogTraceFunction; - m_cur_retry = m_retry_times; - // 已有关卡优先使用 tasks.json 中的逻辑 - if (Task.get(m_stage_name)) { - return ProcessTask(*this, { m_stage_name }).run(); + if (m_is_directly) { + return ProcessTask(*this, { m_directly_task }).run(); } return chapter_wayfinding() && swipe_and_find_stage(); } +void asst::StageNavigationTask::clear() noexcept +{ + m_is_directly = false; + m_directly_task.clear(); + m_chapter_task.clear(); + m_difficulty_task.clear(); + m_stage_code.clear(); +} + bool asst::StageNavigationTask::chapter_wayfinding() { LogTraceFunction; - static const std::regex EpisodeRegex(R"(^([A-Za-z]*)(\d+)-(\d+)([Hh]ard|[Nn]ormal)*$)"); - std::smatch episode_sm; - if (!std::regex_match(m_stage_name, episode_sm, EpisodeRegex)) { - Log.error("Unknown stage", m_stage_name); + if (!ProcessTask(*this, { m_chapter_task }).run()) { return false; } - - static const std::string EpisodeTaskPrefix = "Episode"; - std::string episode_task_prefix = episode_sm[1].str(); - std::string episode_task_name = EpisodeTaskPrefix + episode_sm[2].str(); - std::string episode_task_level = episode_sm[4].str(); - if (!episode_task_prefix.empty()) { - for (int i = 0; i < episode_task_prefix.size(); i++) - episode_task_prefix[i] = (char)toupper(episode_task_prefix[i]); + if (!m_difficulty_task.empty()) { + return ProcessTask(*this, { m_difficulty_task }).run(); } - if (!episode_task_level.empty()) { - episode_task_level[0] = (char)toupper(episode_task_level[0]); - } - - m_stage_name = episode_task_prefix + episode_sm[2].str() + "-" + episode_sm[3].str(); - - Log.info("chapter name", episode_task_name); - - return Task.get(episode_task_name) && ProcessTask(*this, { episode_task_name }).run() && episode_task_level.empty() ? true : ProcessTask(*this, { episode_task_level }).run(); + return true; } bool asst::StageNavigationTask::swipe_and_find_stage() { LogTraceFunction; - std::dynamic_pointer_cast(Task.get(m_stage_name + "@ClickStageName"))->text = { m_stage_name }; - std::dynamic_pointer_cast(Task.get(m_stage_name + "@ClickedCorrectStage"))->text = { m_stage_name }; - return ProcessTask(*this, { m_stage_name + "@StageNavigationBegin" }).run(); + + // TODO: 这里多实例会炸,不能这么写,得改回原来的循环 + Task.get(m_stage_code + "@ClickStageName")->text = { m_stage_code }; + Task.get(m_stage_code + "@ClickedCorrectStage")->text = { m_stage_code }; + return ProcessTask(*this, { m_stage_code + "@StageNavigationBegin" }).run(); } diff --git a/src/MeoAssistant/Task/Fight/StageNavigationTask.h b/src/MeoAssistant/Task/Fight/StageNavigationTask.h index d318d83477..62f48ed8de 100644 --- a/src/MeoAssistant/Task/Fight/StageNavigationTask.h +++ b/src/MeoAssistant/Task/Fight/StageNavigationTask.h @@ -9,14 +9,20 @@ namespace asst using AbstractTask::AbstractTask; virtual ~StageNavigationTask() noexcept override = default; - void set_stage_name(std::string stage_name); + bool set_stage_name(const std::string& stage_name); protected: virtual bool _run() override; + void clear() noexcept; bool chapter_wayfinding(); bool swipe_and_find_stage(); - std::string m_stage_name; + bool m_is_directly = false; + std::string m_directly_task; + // Not directly + std::string m_chapter_task; + std::string m_difficulty_task; + std::string m_stage_code; }; } diff --git a/src/MeoAssistant/Task/Interface/FightTask.cpp b/src/MeoAssistant/Task/Interface/FightTask.cpp index b4fa178b26..c31b09bbea 100644 --- a/src/MeoAssistant/Task/Interface/FightTask.cpp +++ b/src/MeoAssistant/Task/Interface/FightTask.cpp @@ -9,6 +9,7 @@ #include "Task/Fight/StageNavigationTask.h" #include "Task/Miscellaneous/GameCrashRestartTaskPlugin.h" #include "Task/ProcessTask.h" +#include "Utils/Logger.hpp" #include "Utils/Ranges.hpp" asst::FightTask::FightTask(const AsstCallback& callback, void* callback_arg) @@ -79,7 +80,10 @@ bool asst::FightTask::set_params(const json::value& params) } else { m_start_up_task_ptr->set_tasks({ "StageBegin" }).set_times_limit("GoLastBattle", 0); - m_stage_navigation_task_ptr->set_stage_name(stage); + if (!m_stage_navigation_task_ptr->set_stage_name(stage)) { + Log.error("Cannot set stage", stage); + return false; + } m_stage_navigation_task_ptr->set_enable(true); } m_stage_drops_plugin_ptr->set_server(server);