mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-16 17:57:01 +08:00
perf: 整理一下关卡导航代码,调整滑动速度
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user