perf: 整理一下关卡导航代码,调整滑动速度

This commit is contained in:
MistEO
2022-11-27 03:11:35 +08:00
parent 48f94432a8
commit 2f5bdbae3f
4 changed files with 99 additions and 44 deletions

View File

@@ -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

View File

@@ -2,66 +2,111 @@
#include <regex>
#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<char>(::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<char>(::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<OcrTaskInfo>(Task.get(m_stage_name + "@ClickStageName"))->text = { m_stage_name };
std::dynamic_pointer_cast<OcrTaskInfo>(Task.get(m_stage_name + "@ClickedCorrectStage"))->text = { m_stage_name };
return ProcessTask(*this, { m_stage_name + "@StageNavigationBegin" }).run();
// TODO: 这里多实例会炸,不能这么写,得改回原来的循环
Task.get<OcrTaskInfo>(m_stage_code + "@ClickStageName")->text = { m_stage_code };
Task.get<OcrTaskInfo>(m_stage_code + "@ClickedCorrectStage")->text = { m_stage_code };
return ProcessTask(*this, { m_stage_code + "@StageNavigationBegin" }).run();
}

View File

@@ -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;
};
}

View File

@@ -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);