feat: 自动战斗新增战斗列表选项

This commit is contained in:
status102
2023-09-13 22:29:33 +08:00
parent 993f5fe731
commit 56d831e627
22 changed files with 785 additions and 125 deletions

View File

@@ -3,33 +3,48 @@
#include <regex>
#include "Config/Miscellaneous/CopilotConfig.h"
#include "Config/TaskData.h"
#include "Task/Miscellaneous/BattleFormationTask.h"
#include "Task/Miscellaneous/BattleProcessTask.h"
#include "Task/Miscellaneous/CopilotListNotificationPlugin.h"
#include "Task/Miscellaneous/TaskFileReloadTask.h"
#include "Task/ProcessTask.h"
#include "Utils/Logger.hpp"
#include "Utils/Platform.hpp"
asst::CopilotTask::CopilotTask(const AsstCallback& callback, Assistant* inst)
: InterfaceTask(callback, inst, TaskType),
m_task_file_reload_task_ptr(std::make_shared<TaskFileReloadTask>(callback, inst, TaskType)),
m_navigate_task_ptr(std::make_shared<ProcessTask>(callback, inst, TaskType)),
m_not_use_prts_task_ptr(std::make_shared<ProcessTask>(callback, inst, TaskType)),
m_adverse_select_task_ptr(std::make_shared<ProcessTask>(callback, inst, TaskType)),
m_formation_task_ptr(std::make_shared<BattleFormationTask>(callback, inst, TaskType)),
m_battle_task_ptr(std::make_shared<BattleProcessTask>(callback, inst, TaskType)),
m_stop_task_ptr(std::make_shared<ProcessTask>(callback, inst, TaskType))
{
LogTraceFunction;
m_subtasks.emplace_back(m_task_file_reload_task_ptr);
m_subtasks.emplace_back(m_navigate_task_ptr);
m_subtasks.emplace_back(m_not_use_prts_task_ptr);
// 选择突袭模式
m_adverse_select_task_ptr->set_tasks({ "ChangeToAdverseDifficulty", "AdverseConfirm" });
m_subtasks.emplace_back(m_adverse_select_task_ptr);
auto start_1_tp = std::make_shared<ProcessTask>(callback, inst, TaskType);
start_1_tp->set_tasks({ "BattleStartPre" }).set_retry_times(0).set_ignore_error(true);
m_subtasks.emplace_back(start_1_tp);
m_subtasks.emplace_back(m_formation_task_ptr);
m_subtasks.emplace_back(m_formation_task_ptr)->set_retry_times(0);
auto start_2_tp = std::make_shared<ProcessTask>(callback, inst, TaskType);
start_2_tp->set_tasks({ "BattleStartAll" }).set_ignore_error(false);
m_copilot_list_notification_ptr = start_2_tp->register_plugin<CopilotListNotificationPlugin>();
m_subtasks.emplace_back(start_2_tp);
m_subtasks.emplace_back(m_battle_task_ptr)->set_retry_times(0);
m_stop_task_ptr->set_tasks({ "ClickCornerUntilStartButton" });
m_stop_task_ptr->set_enable(false);
m_subtasks.emplace_back(m_stop_task_ptr);
}
@@ -56,10 +71,14 @@ bool asst::CopilotTask::set_params(const json::value& params)
Log.error("CopilotConfig parse failed");
return false;
}
m_task_file_reload_task_ptr->set_magic_code(match[1].str());
}
else if (!Copilot.load(utils::path(*filename_opt))) {
Log.error("CopilotConfig parse failed");
return false;
else {
if (!Copilot.load(utils::path(*filename_opt))) {
Log.error("CopilotConfig parse failed");
return false;
}
m_task_file_reload_task_ptr->set_path(std::move(*filename_opt));
}
m_stage_name = Copilot.get_stage_name();
@@ -70,6 +89,8 @@ bool asst::CopilotTask::set_params(const json::value& params)
bool with_formation = params.get("formation", false);
m_formation_task_ptr->set_enable(with_formation);
// 自动补信赖
m_formation_task_ptr->set_add_trust(params.get("add_trust", false));
m_formation_task_ptr->set_add_user_additional(params.get("add_user_additional", false));
auto user_additional_opt = params.find<json::array>("user_additional");
@@ -88,21 +109,46 @@ bool asst::CopilotTask::set_params(const json::value& params)
m_formation_task_ptr->set_user_additional(std::move(user_additional));
}
// 是否在当前页面左右滑动寻找关卡
// 启用队列的话这项为true
bool need_navigate = params.get("need_navigate", false);
m_task_file_reload_task_ptr->set_enable(need_navigate);
// 不使用代理指挥
m_not_use_prts_task_ptr->set_enable(need_navigate && with_formation);
m_not_use_prts_task_ptr->set_tasks({ "NotUsePrts", "Stop" });
bool is_adverse = params.get("is_adverse", false);
m_adverse_select_task_ptr->set_enable(need_navigate && is_adverse);
// 防止在关卡名展开的情况下无法滑动,调整滑动区域
std::string m_navigate_name = params.get("navigate_name", std::string());
Task.get<OcrTaskInfo>(m_navigate_name + "@Copilot@ClickStageName")->text = { m_navigate_name };
Task.get<OcrTaskInfo>(m_navigate_name + "@Copilot@ClickedCorrectStage")->text = { m_navigate_name };
Task.get(m_navigate_name + "@Copilot@FullStageNavigation")->specific_rect = Rect(600, 100, 20, 20);
m_navigate_task_ptr->set_tasks({ m_navigate_name + "@Copilot@StageNavigationBegin" });
m_navigate_task_ptr->set_enable(need_navigate);
std::string support_unit_name = params.get("support_unit_name", std::string());
m_formation_task_ptr->set_support_unit_name(std::move(support_unit_name));
size_t loop_times = params.get("loop_times", 1);
if (loop_times > 1) {
m_stop_task_ptr->set_tasks({ "ClickCornerUntilStartButton" });
m_stop_task_ptr->set_enable(true);
// 追加
m_subtasks.reserve(m_subtasks.size() * loop_times);
auto raw_end = m_subtasks.end();
for (size_t i = 1; i < loop_times; ++i) {
// FIXME: 如果多次调用 set_params这里复制的会有问题
m_subtasks.insert(m_subtasks.end(), m_subtasks.begin(), raw_end);
}
m_stop_task_ptr->set_enable(true);
}
else {
m_stop_task_ptr->set_enable(false);
else if (need_navigate) {
Task.get<OcrTaskInfo>("Copilot@BattleStartPreFlag")->text.emplace_back(m_navigate_name);
m_stop_task_ptr->set_tasks({ "Copilot@ClickCornerUntilStartButton" });
m_stop_task_ptr->set_enable(true);
}
return true;