From 7f6a301bd6c3611e77db5ad8709e0d415e2507b1 Mon Sep 17 00:00:00 2001 From: MistEO Date: Sat, 14 Jan 2023 20:09:38 +0800 Subject: [PATCH 1/6] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=88=98=E6=96=97=E5=BC=80=E5=B1=80=E6=9A=82=E5=81=9C=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B=E4=BF=AE=E5=A4=8D=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=88=98=E6=96=97=E8=B7=9D=E7=A6=BB=E5=A4=AA=E7=9F=AD=E5=B9=B2?= =?UTF-8?q?=E5=91=98=E6=94=BE=E4=B8=8D=E4=B8=8B=E5=8E=BB=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/tasks.json | 6 ++++-- src/MaaCore/Task/BattleHelper.cpp | 24 ++++++++++++++++++------ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/resource/tasks.json b/resource/tasks.json index bcc867dd70..8e88ed72e3 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -6154,12 +6154,14 @@ "specialParams": [ 400, 2, - 0 + 0, + 100 ], "specialParamsDoc": [ "设置朝向时的滑动距离", "滑动初速度(平均速度是固定的,初速度快末速度慢相当于一直减速)", - "滑动末速度" + "滑动末速度", + "最小滑动时长" ] }, "BattleOpersFlag": { diff --git a/src/MaaCore/Task/BattleHelper.cpp b/src/MaaCore/Task/BattleHelper.cpp index e13a4b1479..27ed7956c2 100644 --- a/src/MaaCore/Task/BattleHelper.cpp +++ b/src/MaaCore/Task/BattleHelper.cpp @@ -283,6 +283,10 @@ bool asst::BattleHelper::deploy_oper(const std::string& name, const Point& loc, // 1000 是随便取的一个系数,把整数的 pre_delay 转成小数用的 int duration = static_cast(dist / 1000.0 * swipe_oper_task_ptr->pre_delay); + // 时间太短了的压根放不上去,故意加长一点 + if (int min_duration = swipe_oper_task_ptr->special_params.at(3); duration < min_duration) { + duration = min_duration; + } bool deploy_with_pause = m_inst_helper.ctrler()->support_swipe_with_pause(); m_inst_helper.ctrler()->swipe(oper_rect, Rect(target_point.x, target_point.y, 1, 1), duration, false, swipe_oper_task_ptr->special_params.at(1), swipe_oper_task_ptr->special_params.at(2), @@ -392,8 +396,12 @@ bool asst::BattleHelper::wait_until_start() { LogTraceFunction; - while (!m_inst_helper.need_exit() && !check_in_battle()) { + cv::Mat image = m_inst_helper.ctrler()->get_image(); + while (!m_inst_helper.need_exit() && !check_pause_button(image)) { + do_strategic_action(image); std::this_thread::yield(); + + image = m_inst_helper.ctrler()->get_image(); } return true; } @@ -402,16 +410,20 @@ bool asst::BattleHelper::wait_until_end() { LogTraceFunction; - while (!m_inst_helper.need_exit() && check_in_battle()) { - do_strategic_action(); + cv::Mat image = m_inst_helper.ctrler()->get_image(); + while (!m_inst_helper.need_exit() && check_in_battle(image)) { + do_strategic_action(image); std::this_thread::yield(); + + image = m_inst_helper.ctrler()->get_image(); } return true; } bool asst::BattleHelper::do_strategic_action(const cv::Mat& reusable) { - return check_in_battle(reusable) && use_all_ready_skill(reusable); + cv::Mat image = reusable.empty() ? m_inst_helper.ctrler()->get_image() : reusable; + return check_in_battle(image) && use_all_ready_skill(image); } bool asst::BattleHelper::use_all_ready_skill(const cv::Mat& reusable) @@ -474,8 +486,8 @@ void asst::BattleHelper::save_map(const cv::Mat& image) auto draw = image.clone(); for (const auto& [loc, info] : m_normal_tile_info) { - std::string text = "( " + std::to_string(loc.x) + ", " + std::to_string(loc.y) + " )"; - cv::putText(draw, text, cv::Point(info.pos.x - 30, info.pos.y), 1, 1.2, cv::Scalar(0, 0, 255), 2); + cv::circle(draw, cv::Point(info.pos.x, info.pos.y), 5, cv::Scalar(0, 255, 0), -1); + cv::putText(draw, loc.to_string(), cv::Point(info.pos.x - 30, info.pos.y), 1, 1.2, cv::Scalar(0, 0, 255), 2); } std::string suffix; From 1c917b5e530fcd6cab4f494cdb8d705f1b7696a4 Mon Sep 17 00:00:00 2001 From: MistEO Date: Sat, 14 Jan 2023 23:22:44 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E4=BF=9D?= =?UTF-8?q?=E5=85=A8=E5=8D=8F=E8=AE=AE=EF=BC=8C=E6=95=B4=E5=90=88drops?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=EF=BC=8C=E5=B9=B6=E6=94=AF=E6=8C=81=E6=88=98?= =?UTF-8?q?=E6=96=97=E4=B8=AD=E8=8E=B7=E5=8F=96=E6=88=98=E5=88=A9=E5=93=81?= =?UTF-8?q?action?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/3.7-保全派驻协议.md | 32 +++++--- resource/copilot/SSS_Test.json | 13 +-- resource/tasks.json | 74 +++++++++++++++--- resource/template/SSSDropRecruitmentFlag.png | Bin 5146 -> 0 bytes src/MaaCore/Common/AsstBattleDef.h | 5 +- .../Config/Miscellaneous/CopilotConfig.cpp | 8 ++ .../Config/Miscellaneous/SSSCopilotConfig.cpp | 25 ++---- .../Task/Miscellaneous/BattleProcessTask.cpp | 15 ++++ src/MaaCore/Task/SSS/SSSBattleProcessTask.cpp | 21 +++++ src/MaaCore/Task/SSS/SSSBattleProcessTask.h | 1 + .../Task/SSS/SSSDropRewardsTaskPlugin.cpp | 2 +- 11 files changed, 145 insertions(+), 51 deletions(-) delete mode 100644 resource/template/SSSDropRecruitmentFlag.png diff --git a/docs/3.7-保全派驻协议.md b/docs/3.7-保全派驻协议.md index 3a68c26618..e772afd08d 100644 --- a/docs/3.7-保全派驻协议.md +++ b/docs/3.7-保全派驻协议.md @@ -28,18 +28,19 @@ ], "tool_men": { // 剩余所需各职业人数,按费用排序随便拿,可选 "Pioneer": 13, - "Warrior": 2, // 中英文均可 + "近卫": 2, // 中英文均可 "Medic": 2 }, - "drop_buffs": [ // 战斗后拿buff的优先级。好像只有第四层有?可选 - "定向部署支援系统" - ], - "drop_tool_men": [ // 战斗结束后招募干员职业的优先级,可选 + "drops": [ // 战斗开始时和战斗中途,招募干员、获取装备优先级 "空弦", - "能天使", - "先锋", // 中英文均可 + "能天使", // 支持干员名、职业名 + "先锋", // 职业名中英文均可 "Support", - "无需增调干员" // 不招人 + "无需增调干员", // 不招人 + "重整导能组件", // 支持装备名,全写一起.jpg + "反制导能组件", + "战备激活阀", // 关卡中途的可选装备,也也放这里。需要配合 actions 中 type: GetDrops 使用 + "改派发讯器", ], "stages": [ { @@ -88,7 +89,6 @@ } ], "draw_as_possible": true, // “调配干员”按钮,是否好了就用,可选,默认 true - "actions": [ // 可选 // 基本复用抄作业的逻辑,可参考 3.3-战斗流程协议.md // 符合 action 的条件就执行 action,否则执行上面的 strategies 的逻辑 @@ -100,10 +100,16 @@ "name": "棘刺" }, { - "type": "CheckIfStartOver", // 检查干员在不在,不在就退出重开 - "tool_men": { - "Pioneer": 2 - } + "type": "CheckIfStartOver", // 新 type,检查战利品并获取 + "name": "棘刺" + }, + { + "type": "GetDrops", // 检查获取战斗中途的战利品,将按照 drops 字段的排序进行拿去 + // 若 drops 字段为空,或 drops 中的物品一个都没识别到,将会选择放弃战利品 + // 若执行动作时未识别到战利品获取,将会直接跳过该 action + "kills": 20, + "pre_delay": 3000 // 小技巧:一般来说都是打死了某个怪才会出,所以可以基于击杀数来触发 + // 但是从击杀数达到到选择界面跳出来可能有个延迟,所以建议价格 pre_delay }, { "name": "桃金娘", diff --git a/resource/copilot/SSS_Test.json b/resource/copilot/SSS_Test.json index 61b0ff0806..ad5ae3d173 100644 --- a/resource/copilot/SSS_Test.json +++ b/resource/copilot/SSS_Test.json @@ -33,15 +33,16 @@ "近卫": 6, "医疗": 2 }, - "drop_buffs": [ - "定向部署支援系统" - ], - "drop_tool_men": [ + "drops": [ "空弦", "能天使", "先锋", - "辅助", - "无需增调干员" + "Support", + "无需增调干员", + "重整导能组件", + "反制导能组件", + "战备激活阀", + "改派发讯器" ], "stages": [ { diff --git a/resource/tasks.json b/resource/tasks.json index 8e88ed72e3..f94ae8cc59 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -9439,14 +9439,19 @@ ] }, "SSSDropRecruitmentFlag": { + "algorithm": "OcrDetect", "action": "DoNothing", - "roi": [ - 0, - 39, - 250, - 203 + "text": [ + "请选择", + "请进行" ], - "postDelay": 2000, + "roi": [ + 163, + 78, + 900, + 112 + ], + "postDelay": 5000, "next": [ "SSSStartFighting2", "SSSDropRecruitmentFlag" @@ -9472,9 +9477,9 @@ "cache": false, "roi": [ 0, - 434, + 352, 1280, - 169 + 263 ] }, "SSSDropRecruitmentConfrim": { @@ -9482,13 +9487,64 @@ "action": "ClickSelf", "text": [ "确认调用", - "放弃调用" + "放弃调用", + "确认选择" ], "roi": [ 1105, 525, 175, 132 + ], + "preDelay": 1000, + "postDelay": 1000 + }, + "SSSHalfTimeDropsBegin": { + "algorithm": "JustReturn", + "action": "DoNothing", + "next": [ + "SSSHalfTimeDrops", + "SSSHalfTimeDropsCancel" + ] + }, + "SSSHalfTimeDrops": { + "algorithm": "OcrDetect", + "action": "ClickSelf", + "text": [], + "roi": [ + 206, + 452, + 897, + 88 + ], + "next": [ + "SSSHalfTimeDropsConfirm" + ] + }, + "SSSHalfTimeDropsConfirm": { + "algorithm": "OcrDetect", + "action": "ClickSelf", + "text": [ + "确认" + ], + "roi": [ + 1073, + 281, + 155, + 151 + ] + }, + "SSSHalfTimeDropsCancel": { + "algorithm": "OcrDetect", + "action": "ClickSelf", + "text": [ + "放弃" + ], + "roi": [ + 51, + 251, + 146, + 199 ] }, "ClickCornerUntilStartButton": { diff --git a/resource/template/SSSDropRecruitmentFlag.png b/resource/template/SSSDropRecruitmentFlag.png deleted file mode 100644 index 300c7920f58db4b307b0f5b4d0bdabc7172c6ac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5146 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 diff --git a/src/MaaCore/Common/AsstBattleDef.h b/src/MaaCore/Common/AsstBattleDef.h index 665eb8e3f2..5acb70c69e 100644 --- a/src/MaaCore/Common/AsstBattleDef.h +++ b/src/MaaCore/Common/AsstBattleDef.h @@ -157,6 +157,7 @@ namespace asst::battle /* for SSS */ DrawCard, // “调配干员” CheckIfStartOver, // 检查如果没有某干员则退出重开 + GetDrops, // 识别并获取战斗中途的掉落物 }; struct Action @@ -212,6 +213,7 @@ namespace asst::battle std::vector strategies; bool draw_as_possible = false; int retry_times = 0; + std::vector order_of_drops; }; enum class EquipmentType @@ -231,8 +233,7 @@ namespace asst::battle copilot::OperUsageGroups groups; RoleCounts tool_men; - std::vector drop_buffs; - std::vector drop_tool_men; + std::vector order_of_drops; std::unordered_map stages_data; }; diff --git a/src/MaaCore/Config/Miscellaneous/CopilotConfig.cpp b/src/MaaCore/Config/Miscellaneous/CopilotConfig.cpp index 382e0a7fa6..6063d6ecd3 100644 --- a/src/MaaCore/Config/Miscellaneous/CopilotConfig.cpp +++ b/src/MaaCore/Config/Miscellaneous/CopilotConfig.cpp @@ -155,6 +155,14 @@ std::vector asst::CopilotConfig::parse_actions(co { "CHECKIFSTARTOVER", ActionType::CheckIfStartOver }, { "checkifstartover", ActionType::CheckIfStartOver }, { "检查重开", ActionType::CheckIfStartOver }, + + { "GetDrops", ActionType::GetDrops }, + { "Getdrops", ActionType::GetDrops }, + { "GETDROPS", ActionType::GetDrops }, + { "getdrops", ActionType::GetDrops }, + { "获取战利品", ActionType::GetDrops }, + { "获取掉落", ActionType::GetDrops }, + { "获取装备", ActionType::GetDrops }, }; std::string type_str = action_info.get("type", "Deploy"); diff --git a/src/MaaCore/Config/Miscellaneous/SSSCopilotConfig.cpp b/src/MaaCore/Config/Miscellaneous/SSSCopilotConfig.cpp index 1043c6ac54..f9aba5ba66 100644 --- a/src/MaaCore/Config/Miscellaneous/SSSCopilotConfig.cpp +++ b/src/MaaCore/Config/Miscellaneous/SSSCopilotConfig.cpp @@ -42,29 +42,13 @@ bool asst::SSSCopilotConfig::parse(const json::value& json) } } - if (auto drop_buffs = json.find("drop_buffs")) { - for (const auto& drop_buff : drop_buffs.value()) { - m_data.drop_buffs.emplace_back(drop_buff.as_string()); + if (auto drops_opt = json.find("drops")) { + m_data.order_of_drops.reserve(drops_opt->size()); + for (const auto& drop : *drops_opt) { + m_data.order_of_drops.emplace_back(drop.as_string()); } } - if (auto drop_tool_men = json.find("drop_tool_men")) { - for (const auto& man : drop_tool_men.value()) { - std::string name = man.as_string(); - if (auto role = get_role_type(name); role != Role::Unknown) { - m_data.drop_tool_men.emplace_back(name); - } - else if (BattleData.get_rarity(name) != 0) { - m_data.drop_tool_men.emplace_back(name); - } - else if (name == "None") { - m_data.drop_tool_men.emplace_back(name); - } - else { - Log.warn("Unknown drop tool man", name); - } - } - } for (const auto& stage : json.at("stages").as_array()) { CombatData stage_data; stage_data.info = CopilotConfig::parse_basic_info(stage); @@ -72,6 +56,7 @@ bool asst::SSSCopilotConfig::parse(const json::value& json) stage_data.actions = CopilotConfig::parse_actions(stage); stage_data.groups = m_data.groups; + stage_data.order_of_drops = m_data.order_of_drops; for (const auto& strategy_info : stage.at("strategies").as_array()) { Strategy strategy; diff --git a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp index a676e2700f..cd077c93ae 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp +++ b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp @@ -262,6 +262,9 @@ bool asst::BattleProcessTask::wait_condition(const Action& action) break; } } + if (!check_in_battle(image)) { + return false; + } do_strategy_and_update_image(); } } @@ -273,6 +276,9 @@ bool asst::BattleProcessTask::wait_condition(const Action& action) if (m_kills >= action.kills) { break; } + if (!check_in_battle(image)) { + return false; + } do_strategy_and_update_image(); } } @@ -284,6 +290,9 @@ bool asst::BattleProcessTask::wait_condition(const Action& action) if (m_cost >= action.costs) { break; } + if (!check_in_battle(image)) { + return false; + } do_strategy_and_update_image(); } } @@ -298,6 +307,9 @@ bool asst::BattleProcessTask::wait_condition(const Action& action) if (cooling_count == action.cooling) { break; } + if (!check_in_battle(image)) { + return false; + } do_strategy_and_update_image(); } } @@ -312,6 +324,9 @@ bool asst::BattleProcessTask::wait_condition(const Action& action) iter != m_cur_deployment_opers.cend() && iter->second.available) { break; } + if (!check_in_battle(image)) { + return false; + } do_strategy_and_update_image(); } } diff --git a/src/MaaCore/Task/SSS/SSSBattleProcessTask.cpp b/src/MaaCore/Task/SSS/SSSBattleProcessTask.cpp index f14de4297f..384f645458 100644 --- a/src/MaaCore/Task/SSS/SSSBattleProcessTask.cpp +++ b/src/MaaCore/Task/SSS/SSSBattleProcessTask.cpp @@ -1,6 +1,7 @@ #include "SSSBattleProcessTask.h" #include "Config/Miscellaneous/SSSCopilotConfig.h" +#include "Config/TaskData.h" #include "Controller.h" #include "Task/ProcessTask.h" #include "Utils/Logger.hpp" @@ -47,6 +48,8 @@ bool asst::SSSBattleProcessTask::do_derived_action(size_t action_index) return draw_card(); case battle::copilot::ActionType::CheckIfStartOver: return check_if_start_over(action); + case battle::copilot::ActionType::GetDrops: + return get_drops(); default: Log.error("unknown action type", static_cast(action.type)); return false; @@ -161,9 +164,27 @@ bool asst::SSSBattleProcessTask::check_if_start_over(const battle::copilot::Acti bool asst::SSSBattleProcessTask::draw_card(bool with_retry) { + LogTraceFunction; + ProcessTask task(*this, { "SSSDrawCard" }); if (!with_retry) { task.set_retry_times(0); } return task.run(); } + +bool asst::SSSBattleProcessTask::get_drops() +{ + LogTraceFunction; + + const auto& drops = m_sss_combat_data.order_of_drops; + + // 不一定就有掉落界面,有可能宝箱怪压根没被打掉。所以不重试 + if (drops.empty()) { + return ProcessTask(*this, { inst_string() + "@SSSHalfTimeDropsCancel" }).set_retry_times(0).run(); + } + else { + Task.get(inst_string() + "@SSSHalfTimeDrops")->text = { drops }; + return ProcessTask(*this, { inst_string() + "@SSSHalfTimeDropsBegin" }).set_retry_times(0).run(); + } +} diff --git a/src/MaaCore/Task/SSS/SSSBattleProcessTask.h b/src/MaaCore/Task/SSS/SSSBattleProcessTask.h index dc031ebede..0df5ff24e0 100644 --- a/src/MaaCore/Task/SSS/SSSBattleProcessTask.h +++ b/src/MaaCore/Task/SSS/SSSBattleProcessTask.h @@ -21,6 +21,7 @@ namespace asst bool check_if_start_over(const battle::copilot::Action& action); bool draw_card(bool with_retry = true); + bool get_drops(); battle::sss::CombatData m_sss_combat_data; std::unordered_set m_all_cores; diff --git a/src/MaaCore/Task/SSS/SSSDropRewardsTaskPlugin.cpp b/src/MaaCore/Task/SSS/SSSDropRewardsTaskPlugin.cpp index 7846cbb54f..f28644c1de 100644 --- a/src/MaaCore/Task/SSS/SSSDropRewardsTaskPlugin.cpp +++ b/src/MaaCore/Task/SSS/SSSDropRewardsTaskPlugin.cpp @@ -44,7 +44,7 @@ bool asst::SSSDropRewardsTaskPlugin::_run() .ocr_res = result, .role = role == Role::Unknown ? std::nullopt : std::optional(role) }); } - for (const std::string& name : SSSCopilot.get_data().drop_tool_men) { + for (const std::string& name : SSSCopilot.get_data().order_of_drops) { auto role = get_role_type(name); bool is_role = role != Role::Unknown; auto iter = ranges::find_if(opers, [&](const DropRecruitment& props) { From 6553272d607ed160a95e5a93b8f672ed97e1295b Mon Sep 17 00:00:00 2001 From: MistEO Date: Sun, 15 Jan 2023 02:23:33 +0800 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BF=9D=E5=85=A8?= =?UTF-8?q?MoveCamera=E5=8A=A8=E4=BD=9C=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MaaCore/Task/BattleHelper.cpp | 21 ++++++++++++------- src/MaaCore/Task/BattleHelper.h | 6 +++--- src/MaaCore/Task/SSS/SSSBattleProcessTask.cpp | 5 +++-- src/MaaCore/Task/SSS/SSSBattleProcessTask.h | 2 +- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/MaaCore/Task/BattleHelper.cpp b/src/MaaCore/Task/BattleHelper.cpp index 27ed7956c2..2348635f41 100644 --- a/src/MaaCore/Task/BattleHelper.cpp +++ b/src/MaaCore/Task/BattleHelper.cpp @@ -384,20 +384,25 @@ bool asst::BattleHelper::check_pause_button(const cv::Mat& reusable) return ret; } -bool asst::BattleHelper::check_in_battle(const cv::Mat& reusable) +bool asst::BattleHelper::check_in_battle(const cv::Mat& reusable, bool weak) { cv::Mat image = reusable.empty() ? m_inst_helper.ctrler()->get_image() : reusable; - BattleImageAnalyzer analyzer(image); - m_in_battle = analyzer.analyze(); + if (weak) { + m_in_battle = check_pause_button(image); + } + else { + BattleImageAnalyzer analyzer(image); + m_in_battle = analyzer.analyze(); + } return m_in_battle; } -bool asst::BattleHelper::wait_until_start() +bool asst::BattleHelper::wait_until_start(bool weak) { LogTraceFunction; cv::Mat image = m_inst_helper.ctrler()->get_image(); - while (!m_inst_helper.need_exit() && !check_pause_button(image)) { + while (!m_inst_helper.need_exit() && !check_in_battle(image, weak)) { do_strategic_action(image); std::this_thread::yield(); @@ -406,12 +411,12 @@ bool asst::BattleHelper::wait_until_start() return true; } -bool asst::BattleHelper::wait_until_end() +bool asst::BattleHelper::wait_until_end(bool weak) { LogTraceFunction; cv::Mat image = m_inst_helper.ctrler()->get_image(); - while (!m_inst_helper.need_exit() && check_in_battle(image)) { + while (!m_inst_helper.need_exit() && check_in_battle(image, weak)) { do_strategic_action(image); std::this_thread::yield(); @@ -591,7 +596,7 @@ bool asst::BattleHelper::move_camera(const std::pair& delta) // 还没转场的时候 if (m_kills != 0) { - wait_until_end(); + wait_until_end(true); } m_kills = 0; diff --git a/src/MaaCore/Task/BattleHelper.h b/src/MaaCore/Task/BattleHelper.h index 5c389e60c3..9e823e1a75 100644 --- a/src/MaaCore/Task/BattleHelper.h +++ b/src/MaaCore/Task/BattleHelper.h @@ -45,9 +45,9 @@ namespace asst bool use_skill(const std::string& name, bool keep_waiting = true); bool use_skill(const Point& loc, bool keep_waiting = true); bool check_pause_button(const cv::Mat& reusable = cv::Mat()); - bool check_in_battle(const cv::Mat& reusable = cv::Mat()); - virtual bool wait_until_start(); - bool wait_until_end(); + bool check_in_battle(const cv::Mat& reusable = cv::Mat(), bool weak = false); + virtual bool wait_until_start(bool weak = false); + bool wait_until_end(bool weak = false); bool use_all_ready_skill(const cv::Mat& reusable = cv::Mat()); bool check_and_use_skill(const std::string& name, const cv::Mat& reusable = cv::Mat()); bool check_and_use_skill(const Point& loc, const cv::Mat& reusable = cv::Mat()); diff --git a/src/MaaCore/Task/SSS/SSSBattleProcessTask.cpp b/src/MaaCore/Task/SSS/SSSBattleProcessTask.cpp index 384f645458..2e7e915f9b 100644 --- a/src/MaaCore/Task/SSS/SSSBattleProcessTask.cpp +++ b/src/MaaCore/Task/SSS/SSSBattleProcessTask.cpp @@ -124,11 +124,12 @@ bool asst::SSSBattleProcessTask::do_strategic_action(const cv::Mat& reusable) return true; } -bool asst::SSSBattleProcessTask::wait_until_start() +bool asst::SSSBattleProcessTask::wait_until_start(bool weak) { LogTraceFunction; - return ProcessTask(*this, { "SSSFightDirectly" }).set_retry_times(300).run(); + return ProcessTask(*this, { "SSSFightDirectly" }).set_retry_times(300).run() && + BattleProcessTask::wait_until_start(weak); } bool asst::SSSBattleProcessTask::check_if_start_over(const battle::copilot::Action& action) diff --git a/src/MaaCore/Task/SSS/SSSBattleProcessTask.h b/src/MaaCore/Task/SSS/SSSBattleProcessTask.h index 0df5ff24e0..dda26788b4 100644 --- a/src/MaaCore/Task/SSS/SSSBattleProcessTask.h +++ b/src/MaaCore/Task/SSS/SSSBattleProcessTask.h @@ -17,7 +17,7 @@ namespace asst virtual battle::copilot::CombatData& get_combat_data() override { return m_sss_combat_data; } virtual const std::string oper_name_ocr_task_name() const noexcept override { return "SSSBattleOperName"; } virtual bool need_to_wait_until_end() const noexcept override { return true; } - virtual bool wait_until_start() override; + virtual bool wait_until_start(bool weak = false) override; bool check_if_start_over(const battle::copilot::Action& action); bool draw_card(bool with_retry = true); From 388fa018ba29906abedb2945b47a77980dbbe33d Mon Sep 17 00:00:00 2001 From: MistEO Date: Sun, 15 Jan 2023 03:23:54 +0800 Subject: [PATCH 4/6] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=95=9C=E5=A4=B4?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E5=B8=A6=E6=9D=A5=E7=9A=84=E5=87=BB=E6=9D=80?= =?UTF-8?q?=E6=95=B0=E7=8A=B6=E6=80=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MaaCore/Task/BattleHelper.cpp | 18 +++++++++++------- src/MaaCore/Task/BattleHelper.h | 4 ++-- src/MaaCore/Task/SSS/SSSBattleProcessTask.h | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/MaaCore/Task/BattleHelper.cpp b/src/MaaCore/Task/BattleHelper.cpp index 2348635f41..ea35e55547 100644 --- a/src/MaaCore/Task/BattleHelper.cpp +++ b/src/MaaCore/Task/BattleHelper.cpp @@ -86,14 +86,13 @@ bool asst::BattleHelper::update_deployment(bool init, const cv::Mat& reusable) LogTraceFunction; if (init) { - wait_until_start(); + wait_until_start(false); } cv::Mat image = init || reusable.empty() ? m_inst_helper.ctrler()->get_image() : reusable; if (init) { auto draw_future = std::async(std::launch::async, [&]() { save_map(image); }); - update_kills(image); } BattleImageAnalyzer oper_analyzer(image); @@ -219,11 +218,16 @@ bool asst::BattleHelper::update_deployment(bool init, const cv::Mat& reusable) AvatarCache.set_avatar(name, oper.role, oper.avatar); } } - pause(); if (!unknown_opers.empty()) { cancel_oper_selection(); } + + image = m_inst_helper.ctrler()->get_image(); + } + + if (init) { + update_kills(image); } check_in_battle(image); @@ -388,12 +392,12 @@ bool asst::BattleHelper::check_in_battle(const cv::Mat& reusable, bool weak) { cv::Mat image = reusable.empty() ? m_inst_helper.ctrler()->get_image() : reusable; if (weak) { - m_in_battle = check_pause_button(image); - } - else { BattleImageAnalyzer analyzer(image); m_in_battle = analyzer.analyze(); } + else { + m_in_battle = check_pause_button(image); + } return m_in_battle; } @@ -596,7 +600,7 @@ bool asst::BattleHelper::move_camera(const std::pair& delta) // 还没转场的时候 if (m_kills != 0) { - wait_until_end(true); + wait_until_end(false); } m_kills = 0; diff --git a/src/MaaCore/Task/BattleHelper.h b/src/MaaCore/Task/BattleHelper.h index 9e823e1a75..9c85e66b1c 100644 --- a/src/MaaCore/Task/BattleHelper.h +++ b/src/MaaCore/Task/BattleHelper.h @@ -46,8 +46,8 @@ namespace asst bool use_skill(const Point& loc, bool keep_waiting = true); bool check_pause_button(const cv::Mat& reusable = cv::Mat()); bool check_in_battle(const cv::Mat& reusable = cv::Mat(), bool weak = false); - virtual bool wait_until_start(bool weak = false); - bool wait_until_end(bool weak = false); + virtual bool wait_until_start(bool weak = true); + bool wait_until_end(bool weak = true); bool use_all_ready_skill(const cv::Mat& reusable = cv::Mat()); bool check_and_use_skill(const std::string& name, const cv::Mat& reusable = cv::Mat()); bool check_and_use_skill(const Point& loc, const cv::Mat& reusable = cv::Mat()); diff --git a/src/MaaCore/Task/SSS/SSSBattleProcessTask.h b/src/MaaCore/Task/SSS/SSSBattleProcessTask.h index dda26788b4..42b8bf1173 100644 --- a/src/MaaCore/Task/SSS/SSSBattleProcessTask.h +++ b/src/MaaCore/Task/SSS/SSSBattleProcessTask.h @@ -17,7 +17,7 @@ namespace asst virtual battle::copilot::CombatData& get_combat_data() override { return m_sss_combat_data; } virtual const std::string oper_name_ocr_task_name() const noexcept override { return "SSSBattleOperName"; } virtual bool need_to_wait_until_end() const noexcept override { return true; } - virtual bool wait_until_start(bool weak = false) override; + virtual bool wait_until_start(bool weak = true) override; bool check_if_start_over(const battle::copilot::Action& action); bool draw_card(bool with_retry = true); From 64cdc291a667b3736278e2c8231c3cf6d650c9a3 Mon Sep 17 00:00:00 2001 From: MistEO Date: Sun, 15 Jan 2023 03:51:41 +0800 Subject: [PATCH 5/6] =?UTF-8?q?feat:=20=E9=87=8D=E6=96=B0=E6=94=BE?= =?UTF-8?q?=E5=BC=80=E6=8E=89=E8=90=BD=E8=AF=86=E5=88=AB=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E4=BC=81=E9=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MaaCore/Task/Fight/StageDropsTaskPlugin.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/MaaCore/Task/Fight/StageDropsTaskPlugin.cpp b/src/MaaCore/Task/Fight/StageDropsTaskPlugin.cpp index a002e2eea3..adbed24c7d 100644 --- a/src/MaaCore/Task/Fight/StageDropsTaskPlugin.cpp +++ b/src/MaaCore/Task/Fight/StageDropsTaskPlugin.cpp @@ -209,13 +209,7 @@ void asst::StageDropsTaskPlugin::upload_to_penguin() { LogTraceFunction; - Log.warn("debug version, not upload to penguin"); - return; - - // https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/3290 - // 新的掉落识别算法,在确认识别结果完全准确前,暂时禁用上传功能 -#if 0 - if (m_server != "CN" && m_server != "US" && m_server != "JP") { + if (m_server != "CN" && m_server != "US" && m_server != "JP" && m_server != "KR") { return; } @@ -276,7 +270,6 @@ void asst::StageDropsTaskPlugin::upload_to_penguin() .set_extra_param(extra_param) .set_retry_times(5) .run(); -#endif } void asst::StageDropsTaskPlugin::report_penguin_callback(AsstMsg msg, const json::value& detail, AbstractTask* task_ptr) From cb928d7d415d2f5bd7183e78c291914ab21d172b Mon Sep 17 00:00:00 2001 From: MistEO Date: Sun, 15 Jan 2023 03:54:20 +0800 Subject: [PATCH 6/6] docs: update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f89008ff9..aa0fe6ab2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## v4.10.0-beta.2 + +- 修复 `引航者试炼` 部分已知问题 @MistEO +- 更新 `保全派驻` 协议,新增部分功能支持 @MistEO +- 开放 掉落识别上传企鹅物流 @MistEO + ## v4.10.0-beta.1 - 修复 `引航者试炼` 地图格子错误 @horror-proton