feat.为 ProcessTask 添加子任务字段

fix https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/584
This commit is contained in:
MistEO
2022-05-30 02:06:50 +08:00
parent acf07e063d
commit 4f67e9dc04
4 changed files with 26 additions and 0 deletions

View File

@@ -30,6 +30,15 @@
// - SwipeToTheLeft: 滑动到最左侧
// - SwipeToTheRight: 滑动到最右侧
"sub": [ "SubTaskName1", "SubTaskName2" ],
// 可选项,子任务。会在执行完当前任务后,依次执行每一个子任务
// 可以套娃,子任务再套子任务。但要注意不要写出了死循环
"subErrorIgnored": true, // 可选项,是否忽略子任务的错误。
// 不填写默认 true
// 为 false 时,若某个子任务出错,则不继续执行后续任务(相当于本任务出错了)
// 为 true 时,子任务是否出错没有影响
"next": [ "OtherTaskName1", "OtherTaskName2"],
// 可选项,表示执行完当前任务后,下一个要执行的任务
// 会从前往后依次去识别,去执行第一个匹配上的

View File

@@ -219,6 +219,8 @@ namespace asst
AlgorithmType::Invalid;
ProcessTaskAction action = // 要进行的操作
ProcessTaskAction::Invalid;
std::vector<std::string> sub; // 子任务(列表)
bool sub_error_ignored = true; // 子任务如果失败了,是否继续执行剩下的任务
std::vector<std::string> next; // 下一个可能的任务(列表)
int max_times = INT_MAX; // 任务最多执行多少次
std::vector<std::string> exceeded_next; // 达到最多次数了之后,下一个可能的任务(列表)

View File

@@ -224,6 +224,13 @@ bool ProcessTask::_run()
return false;
}
for (const std::string& sub : cur_task_ptr->sub) {
bool sub_ret = ProcessTask(*this, { sub }).run();
if (!sub_ret && !cur_task_ptr->sub_error_ignored) {
return false;
}
}
callback(AsstMsg::SubTaskCompleted, info);
if (cur_task_ptr->next.empty()) {

View File

@@ -189,11 +189,19 @@ bool asst::TaskData::parse(const json::value& json)
task_info_ptr->roi = Rect();
}
if (task_json.contains("sub")) {
for (const json::value& sub : task_json.at("sub").as_array()) {
task_info_ptr->sub.emplace_back(sub.as_string());
}
}
task_info_ptr->sub_error_ignored = task_json.get("subErrorIgnored", true);
if (task_json.contains("next")) {
for (const json::value& next : task_json.at("next").as_array()) {
task_info_ptr->next.emplace_back(next.as_string());
}
}
if (task_json.contains("rectMove")) {
const json::array& move_arr = task_json.at("rectMove").as_array();
task_info_ptr->rect_move = Rect(