perf: 优化CopilotTask参数设置 (#7631)

* perf: 优化CopilotTask参数设置逻辑

* perf: 调整参数顺序

* perf: format
This commit is contained in:
status102
2023-12-22 13:12:23 +08:00
committed by GitHub
parent 4bee22d193
commit 1f93faa7d9

View File

@@ -26,6 +26,8 @@ asst::CopilotTask::CopilotTask(const AsstCallback& callback, Assistant* inst)
m_subtasks.emplace_back(m_task_file_reload_task_ptr);
m_subtasks.emplace_back(m_navigate_task_ptr);
m_not_use_prts_task_ptr->set_tasks({ "NotUsePrts" }).set_retry_times(0);
m_subtasks.emplace_back(m_not_use_prts_task_ptr);
// 选择突袭模式
@@ -66,6 +68,16 @@ bool asst::CopilotTask::set_params(const json::value& params)
return false;
}
bool need_navigate = params.get("need_navigate", false); // 是否在当前页面左右滑动寻找关卡启用战斗列表则为true
std::string navigate_name = params.get("navigate_name", std::string()); // 导航的关卡名
bool is_adverse = params.get("is_adverse", false); // 是否为突袭关卡
bool use_sanity_potion = params.get("use_sanity_potion", false); // 是否吃理智药
bool with_formation = params.get("formation", false); // 是否使用自动编队
int select_formation = params.get("select_formation", 0); // 选择第几个编队0为不选择
bool add_trust = params.get("add_trust", false); // 是否自动补信赖
bool add_user_additional = params.get("add_user_additional", false); // 是否自动补用户自定义干员
std::string support_unit_name = params.get("support_unit_name", std::string());
auto filename_opt = params.find<std::string>("filename");
if (!filename_opt) {
Log.error("CopilotTask set_params failed, stage_name or filename not found");
@@ -75,6 +87,7 @@ bool asst::CopilotTask::set_params(const json::value& params)
static const std::regex maa_regex(R"(^maa://(\d+)$)");
std::smatch match;
m_task_file_reload_task_ptr->set_enable(need_navigate);
if (std::regex_match(*filename_opt, match, maa_regex)) {
if (!Copilot.parse_magic_code(match[1].str())) {
Log.error("CopilotConfig parse failed");
@@ -96,21 +109,33 @@ bool asst::CopilotTask::set_params(const json::value& params)
return false;
}
m_medicine_task_ptr->set_enable(params.get("use_sanity_potion", false));
if (!navigate_name.empty()) {
Task.get<OcrTaskInfo>(navigate_name + "@Copilot@ClickStageName")->text = { navigate_name };
Task.get<OcrTaskInfo>(navigate_name + "@Copilot@ClickedCorrectStage")->text = { navigate_name };
m_navigate_task_ptr->set_tasks({ navigate_name + "@Copilot@StageNavigationBegin" });
}
else {
m_navigate_task_ptr->set_tasks({});
}
// 选择指定编队
m_formation_task_ptr->set_select_formation(params.get("select_formation", 0));
m_navigate_task_ptr->set_enable(need_navigate);
m_adverse_select_task_ptr->set_enable(need_navigate && is_adverse);
m_not_use_prts_task_ptr->set_enable(need_navigate); // 不使用代理指挥
m_medicine_task_ptr->set_enable(use_sanity_potion);
// 自动补信赖
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");
if (!user_additional_opt) {
Log.error("add_user_additional not found");
// 关卡名含有"TR"的为教学关,不需要编队
m_formation_task_ptr->set_enable(with_formation && navigate_name.find("TR") == std::string::npos);
m_formation_task_ptr->set_select_formation(select_formation);
m_formation_task_ptr->set_add_trust(add_trust);
m_formation_task_ptr->set_add_user_additional(add_user_additional);
m_formation_task_ptr->set_support_unit_name(std::move(support_unit_name));
if (auto opt = params.find<json::array>("user_additional"); !opt) {
Log.warn("add_user_additional not found");
}
else {
std::vector<std::pair<std::string, int>> user_additional;
for (const auto& op : user_additional_opt.value()) {
for (const auto& op : *opt) {
std::string name = op.get("name", std::string());
if (name.empty()) {
continue;
@@ -120,41 +145,12 @@ 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_battle_task_ptr->set_wait_until_end(need_navigate);
// 不使用代理指挥
m_not_use_prts_task_ptr->set_enable(need_navigate);
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());
if (!m_navigate_name.empty()) {
Task.get<OcrTaskInfo>(m_navigate_name + "@Copilot@ClickStageName")->text = { m_navigate_name };
Task.get<OcrTaskInfo>(m_navigate_name + "@Copilot@ClickedCorrectStage")->text = { m_navigate_name };
m_navigate_task_ptr->set_tasks({ m_navigate_name + "@Copilot@StageNavigationBegin" });
}
else {
m_navigate_task_ptr->set_tasks({});
}
m_navigate_task_ptr->set_enable(need_navigate);
bool with_formation = params.get("formation", false);
// 关卡名含有"TR"的为教学关,不需要编队
m_formation_task_ptr->set_enable(with_formation && m_navigate_name.find("TR") == std::string::npos);
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 (need_navigate) {
// 如果没三星就中止
Task.get<OcrTaskInfo>("Copilot@BattleStartPreFlag")->text.emplace_back(m_navigate_name);
Task.get<OcrTaskInfo>("Copilot@BattleStartPreFlag")->text.emplace_back(navigate_name);
m_stop_task_ptr->set_tasks({ "Copilot@ClickCornerUntilEndOfAction" });
m_stop_task_ptr->set_enable(true);
}