From 9da092b3b9eab6537f021225658f063bbcafaed4 Mon Sep 17 00:00:00 2001 From: MistEO Date: Mon, 16 Jan 2023 01:20:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BF=9D=E5=85=A8?= =?UTF-8?q?=E6=B4=BE=E9=A9=BB=E5=B7=A5=E5=85=B7=E4=BA=BA=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E7=AD=96=E7=95=A5=EF=BC=8C=E6=96=B0=E5=A2=9E=E9=BB=91=E5=90=8D?= =?UTF-8?q?=E5=8D=95=E5=AD=97=E6=AE=B5=EF=BC=8C=E4=BF=AE=E5=A4=8D=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E5=8D=A1=E4=BD=8F=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=83=A8=E5=88=86=E7=95=8C=E9=9D=A2=E6=8F=90?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/3.7-保全派驻协议.md | 14 ++++++---- resource/tasks.json | 4 +-- src/MaaCore/Common/AsstBattleDef.h | 1 + .../Config/Miscellaneous/SSSCopilotConfig.cpp | 6 +++++ src/MaaCore/Task/BattleHelper.cpp | 2 +- src/MaaCore/Task/SSS/SSSBattleProcessTask.cpp | 26 ++++++++++++++----- .../Task/SSS/SSSDropRewardsTaskPlugin.cpp | 7 ++++- src/MaaCore/Task/SSS/SSSStageManagerTask.cpp | 6 ++--- src/MaaWpfGui/Main/CopilotViewModel.cs | 15 +++++++++++ 9 files changed, 63 insertions(+), 18 deletions(-) diff --git a/docs/3.7-保全派驻协议.md b/docs/3.7-保全派驻协议.md index e772afd08d..b57dbaf255 100644 --- a/docs/3.7-保全派驻协议.md +++ b/docs/3.7-保全派驻协议.md @@ -15,11 +15,13 @@ }, "buff": "自适应补给元件", // 开局导能元件选择,可选 "equipment": [ // 开局装备选择,横着数,可选 + // 当前版本暂未实现,只会在界面上显示一下 "A", "A", "A", "A", "B", "B", "B", "B" ], "strategy": "优选策略", // 或者 自由策略,可选 - "opers": [ // 指定干员,可选 + // 当前版本暂未实现,只会在界面上显示一下 + "opers": [ // 指定干员,可选 { "name": "棘刺", "skill": 3, @@ -27,6 +29,7 @@ } ], "tool_men": { // 剩余所需各职业人数,按费用排序随便拿,可选 + // 当前版本暂未实现,只会在界面上显示一下 "Pioneer": 13, "近卫": 2, // 中英文均可 "Medic": 2 @@ -42,6 +45,11 @@ "战备激活阀", // 关卡中途的可选装备,也也放这里。需要配合 actions 中 type: GetDrops 使用 "改派发讯器", ], + "blacklist": [ // 黑名单,可选。在 drops 里不会选这些人。 + // 后续版本支持编队后,编队工具人也不会选这些人 + "夜半", + "梅尔" + ], "stages": [ { "stage_name": "蜂拥而上", // 单层关卡名,必选 @@ -99,10 +107,6 @@ "type": "CheckIfStartOver", // 新 type,检查干员在不在,不在就退出重开 "name": "棘刺" }, - { - "type": "CheckIfStartOver", // 新 type,检查战利品并获取 - "name": "棘刺" - }, { "type": "GetDrops", // 检查获取战斗中途的战利品,将按照 drops 字段的排序进行拿去 // 若 drops 字段为空,或 drops 中的物品一个都没识别到,将会选择放弃战利品 diff --git a/resource/tasks.json b/resource/tasks.json index f94ae8cc59..ff95a22d07 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -9480,7 +9480,8 @@ 352, 1280, 263 - ] + ], + "postDelay": 1000 }, "SSSDropRecruitmentConfrim": { "algorithm": "OcrDetect", @@ -9496,7 +9497,6 @@ 175, 132 ], - "preDelay": 1000, "postDelay": 1000 }, "SSSHalfTimeDropsBegin": { diff --git a/src/MaaCore/Common/AsstBattleDef.h b/src/MaaCore/Common/AsstBattleDef.h index 5acb70c69e..394ef2f6ad 100644 --- a/src/MaaCore/Common/AsstBattleDef.h +++ b/src/MaaCore/Common/AsstBattleDef.h @@ -234,6 +234,7 @@ namespace asst::battle copilot::OperUsageGroups groups; RoleCounts tool_men; std::vector order_of_drops; + std::unordered_set blacklist; std::unordered_map stages_data; }; diff --git a/src/MaaCore/Config/Miscellaneous/SSSCopilotConfig.cpp b/src/MaaCore/Config/Miscellaneous/SSSCopilotConfig.cpp index f9aba5ba66..d7e10d9e8b 100644 --- a/src/MaaCore/Config/Miscellaneous/SSSCopilotConfig.cpp +++ b/src/MaaCore/Config/Miscellaneous/SSSCopilotConfig.cpp @@ -48,6 +48,12 @@ bool asst::SSSCopilotConfig::parse(const json::value& json) m_data.order_of_drops.emplace_back(drop.as_string()); } } + if (auto blacklist_opt = json.find("blacklist")) { + m_data.blacklist.reserve(blacklist_opt->size()); + for (const auto& black : *blacklist_opt) { + m_data.blacklist.emplace(black.as_string()); + } + } for (const auto& stage : json.at("stages").as_array()) { CombatData stage_data; diff --git a/src/MaaCore/Task/BattleHelper.cpp b/src/MaaCore/Task/BattleHelper.cpp index ea35e55547..10e11953ec 100644 --- a/src/MaaCore/Task/BattleHelper.cpp +++ b/src/MaaCore/Task/BattleHelper.cpp @@ -432,7 +432,7 @@ bool asst::BattleHelper::wait_until_end(bool weak) bool asst::BattleHelper::do_strategic_action(const cv::Mat& reusable) { cv::Mat image = reusable.empty() ? m_inst_helper.ctrler()->get_image() : reusable; - return check_in_battle(image) && use_all_ready_skill(image); + return use_all_ready_skill(image); } bool asst::BattleHelper::use_all_ready_skill(const cv::Mat& reusable) diff --git a/src/MaaCore/Task/SSS/SSSBattleProcessTask.cpp b/src/MaaCore/Task/SSS/SSSBattleProcessTask.cpp index 2e7e915f9b..9bcf757ff5 100644 --- a/src/MaaCore/Task/SSS/SSSBattleProcessTask.cpp +++ b/src/MaaCore/Task/SSS/SSSBattleProcessTask.cpp @@ -96,22 +96,36 @@ bool asst::SSSBattleProcessTask::do_strategic_action(const cv::Mat& reusable) return deploy_oper(strategy.core, strategy.location, strategy.direction); } + bool skip = false; for (auto& [role, quantity] : strategy.tool_men) { if (quantity <= 0) { continue; } // for apple-clang build error Role role_for_lambda = role; - auto iter = ranges::find_if(available_tool_men, [&](const auto& pair) { + + // 如果有可用的干员,直接使用 + auto available_iter = ranges::find_if(available_tool_men, [&](const auto& pair) { return pair.first == role_for_lambda && !m_all_action_opers.contains(pair.second.name); }); - if (iter == available_tool_men.end()) { - continue; + if (available_iter != available_tool_men.end()) { + --quantity; + // 部署完,画面会发生变化,所以直接返回,后续逻辑交给下次循环处理 + return deploy_oper(available_iter->second.name, strategy.location, strategy.direction); } - --quantity; - // 部署完,画面会发生变化,所以直接返回,后续逻辑交给下次循环处理 - return deploy_oper(iter->second.name, strategy.location, strategy.direction); + // 如果有对应职业干员,但费用没转好,就等他转好,而不是部署下一个策略中的 tool_men + auto deployment_iter = ranges::find_if(m_cur_deployment_opers, [&](const auto& pair) { + return pair.second.role == role_for_lambda && !m_all_action_opers.contains(pair.second.name); + }); + if (deployment_iter == m_cur_deployment_opers.end()) { + continue; + } + skip = true; + break; + } + if (skip) { + break; } } diff --git a/src/MaaCore/Task/SSS/SSSDropRewardsTaskPlugin.cpp b/src/MaaCore/Task/SSS/SSSDropRewardsTaskPlugin.cpp index f28644c1de..3c08659ea5 100644 --- a/src/MaaCore/Task/SSS/SSSDropRewardsTaskPlugin.cpp +++ b/src/MaaCore/Task/SSS/SSSDropRewardsTaskPlugin.cpp @@ -2,6 +2,7 @@ #include "Config/Miscellaneous/BattleDataConfig.h" #include "Config/Miscellaneous/SSSCopilotConfig.h" +#include "Config/TaskData.h" #include "Controller.h" #include "Task/ProcessTask.h" #include "Task/SSS/SSSBattleProcessTask.h" @@ -39,6 +40,9 @@ bool asst::SSSDropRewardsTaskPlugin::_run() std::vector opers; for (const auto& result : analyzer.get_result()) { + if (SSSCopilot.get_data().blacklist.contains(result.text)) { + continue; + } auto role = BattleData.get_role(result.text); opers.emplace_back(DropRecruitment { .ocr_res = result, .role = role == Role::Unknown ? std::nullopt : std::optional(role) }); @@ -52,9 +56,10 @@ bool asst::SSSDropRewardsTaskPlugin::_run() }); if (iter != opers.cend()) { ctrler()->click(iter->ocr_res.rect); + sleep(Task.get("SSSDropRecruitmentOCR")->post_delay); break; } } - return ProcessTask(*this, { "SSSDropRecruitmentConfrim" }).run(); + return ProcessTask(*this, { "SSSDropRecruitmentConfrim" }).set_retry_times(5).run(); } diff --git a/src/MaaCore/Task/SSS/SSSStageManagerTask.cpp b/src/MaaCore/Task/SSS/SSSStageManagerTask.cpp index b95ff263d2..a6369dfeff 100644 --- a/src/MaaCore/Task/SSS/SSSStageManagerTask.cpp +++ b/src/MaaCore/Task/SSS/SSSStageManagerTask.cpp @@ -16,6 +16,9 @@ bool asst::SSSStageManagerTask::_run() preprocess_data(); while (!need_exit()) { + do { + } while (!comfirm_battle_complete() && !need_exit()); // + auto stage_opt = analyze_stage(); if (!stage_opt) { // TODO: 在点完开始之后,加载动画时,还会有一个很大的关卡名,可能识别成功率会更高 @@ -36,9 +39,6 @@ bool asst::SSSStageManagerTask::_run() break; } } - - do { - } while (!comfirm_battle_complete() && !need_exit()); // } return true; } diff --git a/src/MaaWpfGui/Main/CopilotViewModel.cs b/src/MaaWpfGui/Main/CopilotViewModel.cs index 7ce50247c9..91816278f1 100644 --- a/src/MaaWpfGui/Main/CopilotViewModel.cs +++ b/src/MaaWpfGui/Main/CopilotViewModel.cs @@ -315,6 +315,21 @@ namespace MaaWpfGui if (type == "SSS") { TaskType = "SSSCopilot"; + + if (json.ContainsKey("tool_men")) + { + AddLog("编队工具人:\n" + json["tool_men"].ToString(), UILogColor.Message); + } + + if (json.ContainsKey("equipment")) + { + AddLog("开局装备(横向):\n" + json["equipment"].ToString(), UILogColor.Message); + } + + if (json.ContainsKey("strategy")) + { + AddLog("开局策略:" + json["strategy"].ToString(), UILogColor.Message); + } } } else