From 9fef421cc21b5916f0084bd749ca3a07775e52a8 Mon Sep 17 00:00:00 2001 From: MistEO Date: Sun, 29 May 2022 15:56:02 +0800 Subject: [PATCH 1/8] =?UTF-8?q?docs.=E6=96=B0=E5=A2=9E=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=88=98=E6=96=97=20cost=5Fchanges=20=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0=EF=BC=9B=E4=BF=AE=E6=94=B9=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E7=9A=84=E6=96=87=E6=A1=A3=E8=A1=A8=E8=BF=B0?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/战斗流程协议.md | 22 ++++++++++++++-------- docs/详细介绍.md | 16 ++++++++++------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/docs/战斗流程协议.md b/docs/战斗流程协议.md index 9d9712bc04..37bceefe3c 100644 --- a/docs/战斗流程协议.md +++ b/docs/战斗流程协议.md @@ -59,7 +59,10 @@ // "二倍速" 是可切换的,即使用一次变成二倍速,再次使用又变回一倍速 // "子弹时间" 即点击任意干员后的 1/5 速度,再进行任意 action 会恢复正常速度 - "kills": 0, // 击杀数条件,如果没达到就一直等待。可选,默认为 0。直接执行 + "kills": 0, // 击杀数条件,如果没达到就一直等待。可选,默认为 0,直接执行 + + "cost_changes": 5, // 费用变化量,如果没达到就一直等待。可选,默认为 0,直接执行 + // 注意是从开始执行本 actions 开始计算的(即前一个 action 结束时的费用作为基准) // TODO: 其他条件 // TODO: "condition_type": 0, // 执行条件间的关系,可选,默认 0 // // 0 - 且; 1 - 或 @@ -67,8 +70,10 @@ "name": "棘刺", // 干员名 或 群组名, type 为 "部署" | "技能" | "撤退" 之一时必选 "location": [ 5, 5 ], // 部署干员的位置。 - // type 为 "部署" 时必选 - // type 为 `撤退` 时可选(仅推荐部署多个同名召唤物时使用 location 进行撤退,正常部署的干员请使用 name 进行撤退) + // type 为 "部署" 时必选。 + // type 为 `撤退` 时可选, + // 仅推荐有多个同名召唤物时,不填写 name, 并使用 location 进行撤退。 + // 正常部署的干员请使用 name 进行撤退 "direction": "左", // 部署干员的干员朝向。 type 为 "部署" 时必选 // "Left" | "Right" | "Up" | "Down" | "None" @@ -82,7 +87,8 @@ "pre_delay": 0, // 前置延时。可选,默认 0, 单位毫秒 "rear_delay": 0, // 后置延时。可选,默认 0, 单位毫秒 - "timeout": 999999999, // 超时时间。当 type 为 "部署" | "技能" 时可选。默认 INT_MAX, 单位毫秒 + // "timeout": 999999999, // 保留字段,暂未实现。 + // 超时时间。当 type 为 "部署" | "技能" 时可选。默认 INT_MAX, 单位毫秒 // 等待超时则放弃当前动作, 转而执行下一个动作 "doc": "下棘刺了!", // 描述,可选。会显示在界面上,没有实际作用 @@ -94,6 +100,7 @@ "location": [ 5, 6 ], "direction": "右" }, + // 举例 2 { "name": "史尔特尔", "location": [ 4, 5 ], @@ -101,14 +108,13 @@ "doc": "你史尔特尔奶奶来啦!", "doc_color": "red" }, - // 举例 2 + // 举例 3 { "type": "二倍速" } ], - "minimum_required": "v4.0", // 最低要求 maa 版本号,必选。保留字段 - "doc": { // 描述,可选,保留字段。 - // 后期完成了作业分享平台后,可能直接展示该字段给其他用户看 + "minimum_required": "v4.0", // 最低要求 maa 版本号,必选。保留字段,暂未实现 + "doc": { // 描述,可选。 "title": "低练度高成功率作业", "title_color": "dark", "details": "对练度要求很低balabala……", // 建议在这里写上你的名字!(作者名)、参考的视频攻略链接等 diff --git a/docs/详细介绍.md b/docs/详细介绍.md index fd507231b2..a3a68ddfe2 100644 --- a/docs/详细介绍.md +++ b/docs/详细介绍.md @@ -6,8 +6,8 @@ - 若选项中没有你需要的关卡,请手动进入游戏 **蓝色开始按钮** 界面,并选择 `当前关卡`。 - 主界面上的 `吃理智`、`吃石头`、`指定次数` 三个选项为短路开关,即三个选项中的任一条件达到,均会视为任务完成,停止刷理智。 - - 举例1:设置 `吃理智药` : `999`、`吃石头` : `10`、`指定次数` : `1`。则在刷完 **一次** 后,由于满足了 `指定次数`:`1` 的条件,视为任务完成,停止刷理智。 - - 举例2:不勾选 `吃理智药`、不勾选 `吃石头`,设置 `指定次数` : `100`。则在当前可用理智全部刷完后(可能只刷了几次),由于满足了 `不吃理智药`、`不吃石头` 的条件,视为任务完成,停止刷理智。 + - 举例1:设置 `吃理智药` : `999`、`吃石头` : `10`、`指定次数` : `1`。则在刷完 **一次** 后,由于满足了 `指定次数`:`1` 的条件,视为任务完成,停止刷理智。 + - 举例2:不勾选 `吃理智药`、不勾选 `吃石头`,设置 `指定次数` : `100`。则在当前可用理智全部刷完后(可能只刷了几次),由于满足了 `不吃理智药`、`不吃石头` 的条件,视为任务完成,停止刷理智。 - 刷完自动上传 [企鹅物流数据统计](https://penguin-stats.cn/) - 可自定义企鹅物流 ID - 识别并显示材料掉落 @@ -44,10 +44,12 @@ ### 自动肉鸽功能 -- 设置中的三个选项 - - 尽可能往后打:用于刷蜡烛 - - 刷源石锭投资,第一层商店后直接退出:刷源石锭最高效的模式,建议手动选择 `古堡观光` (简单)模式 - - 刷源石锭投资,投资后退出:兼顾刷蜡烛和刷源石锭投资的模式 +- 设置中的三个选项 + + - 尽可能往后打:用于刷蜡烛 + - 刷源石锭投资,第一层商店后直接退出:刷源石锭最高效的模式,建议手动选择 `古堡观光` (简单)模式 + - 刷源石锭投资,投资后退出:兼顾刷蜡烛和刷源石锭投资的模式 + - 肉鸽已支持自动识别干员及练度,并自动选择较优干员及技能 - 支持掉线重连、支持凌晨 4 点更新后继续回去刷 - 如果软件出现 bug 卡住了,会自动放弃当次探索并重试。但如果经常在某个地方卡住然后放弃、严重影响效率的,欢迎提个 issue 反馈一下~ @@ -55,6 +57,7 @@ ### 自动抄作业 欢迎加作业分享 Q 群: 912322156 + #### 抄作业 - 本功能需要在有 `开始行动` 的关卡入口界面开始运行 @@ -64,6 +67,7 @@ - exe 同目录下有简易的制作器,可以结合 [文档](战斗流程协议.md) 使用 - `stage_name` 需要是关卡中文名(但危机合约的关卡又需要是关卡 id, 目前有点乱,之后版本会想办法统一下) +- 地图坐标获取:填写 `stage_name` 后直接开一局,会在目录下生成 `map.png`, 可以用于参考。后面会想办法直接在制作器上显示坐标(画饼) - 若某个干员名字一直识别不对,可以打开日志 `asst.log` 看一下到底被识别成了什么,并修改 `resource/tasks.json` - `CharsNameOcrReplace` 进行正则替换 - 推荐在作业描述里填上你自己的名字(作者名)、参考的攻略视频 url, 其他想说的等等( From 4ce0b7e5e4a68a251e43f49d054952fcc2ee9b71 Mon Sep 17 00:00:00 2001 From: MistEO Date: Sun, 29 May 2022 16:31:39 +0800 Subject: [PATCH 2/8] =?UTF-8?q?feat.=E8=87=AA=E5=8A=A8=E6=88=98=E6=96=97?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=94=AF=E6=8C=81=E8=B4=B9=E7=94=A8=E5=A2=9E?= =?UTF-8?q?=E9=87=8F=E5=AD=97=E6=AE=B5=EF=BC=8C=E4=B8=8E=E5=87=BB=E6=9D=80?= =?UTF-8?q?=E6=95=B0=E6=98=AF=E4=B8=8E=E7=9A=84=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/战斗流程协议.md | 1 + resource/tasks.json | 6 +++--- src/MeoAssistant/AsstBattleDef.h | 1 + src/MeoAssistant/BattleImageAnalyzer.cpp | 13 ++++++++++--- src/MeoAssistant/BattleImageAnalyzer.h | 1 + src/MeoAssistant/BattleProcessTask.cpp | 24 +++++++++++++++++++++++- src/MeoAssistant/CopilotConfiger.cpp | 1 + 7 files changed, 40 insertions(+), 7 deletions(-) diff --git a/docs/战斗流程协议.md b/docs/战斗流程协议.md index 37bceefe3c..f69ec536a8 100644 --- a/docs/战斗流程协议.md +++ b/docs/战斗流程协议.md @@ -63,6 +63,7 @@ "cost_changes": 5, // 费用变化量,如果没达到就一直等待。可选,默认为 0,直接执行 // 注意是从开始执行本 actions 开始计算的(即前一个 action 结束时的费用作为基准) + // 另外仅在费用是两位数的时候识别的比较准,三位数的费用可能会识别错,不推荐使用 // TODO: 其他条件 // TODO: "condition_type": 0, // 执行条件间的关系,可选,默认 0 // // 0 - 且; 1 - 或 diff --git a/resource/tasks.json b/resource/tasks.json index 9bc0bd84a1..ca6804ed0e 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -4647,10 +4647,10 @@ "algorithm": "OcrDetect", "text": [], "roi": [ - 1197, - 492, + 1196, + 494, 83, - 48 + 44 ] }, "BattleAutoSkillFlag": { diff --git a/src/MeoAssistant/AsstBattleDef.h b/src/MeoAssistant/AsstBattleDef.h index 94fe0b88d7..d7be21d1af 100644 --- a/src/MeoAssistant/AsstBattleDef.h +++ b/src/MeoAssistant/AsstBattleDef.h @@ -54,6 +54,7 @@ namespace asst struct BattleAction // 操作 { int kills = 0; + int cost_changes = 0; BattleActionType type = BattleActionType::Deploy; std::string group_name; // 目标名,若 type >= SwitchSpeed, group_name 为空 Point location; diff --git a/src/MeoAssistant/BattleImageAnalyzer.cpp b/src/MeoAssistant/BattleImageAnalyzer.cpp index dd39f9c075..75deef6198 100644 --- a/src/MeoAssistant/BattleImageAnalyzer.cpp +++ b/src/MeoAssistant/BattleImageAnalyzer.cpp @@ -5,6 +5,7 @@ #include "MultiMatchImageAnalyzer.h" #include "MatchImageAnalyzer.h" #include "OcrImageAnalyzer.h" +#include "OcrWithPreprocessImageAnalyzer.h" #include "HashImageAnalyzer.h" #include "Logger.hpp" #include "TaskData.h" @@ -86,6 +87,11 @@ int asst::BattleImageAnalyzer::get_kills() const noexcept return m_kills; } +int asst::BattleImageAnalyzer::get_cost() const noexcept +{ + return m_cost; +} + void asst::BattleImageAnalyzer::clear() noexcept { m_opers.clear(); @@ -468,14 +474,15 @@ bool asst::BattleImageAnalyzer::kills_analyze() bool asst::BattleImageAnalyzer::cost_analyze() { - OcrImageAnalyzer cost_analyzer(m_image); - cost_analyzer.set_task_info("BattleKillsFlag"); + OcrWithPreprocessImageAnalyzer cost_analyzer(m_image); + cost_analyzer.set_task_info("BattleCostData"); + cost_analyzer.set_replace( + std::dynamic_pointer_cast(Task.get("NumberOcrReplace"))->replace_map); if (!cost_analyzer.analyze()) { return false; } - cost_analyzer.sort_result_by_score(); std::string cost_str = cost_analyzer.get_result().front().text; if (cost_str.empty() || diff --git a/src/MeoAssistant/BattleImageAnalyzer.h b/src/MeoAssistant/BattleImageAnalyzer.h index 37be6dc96f..08ad7b4083 100644 --- a/src/MeoAssistant/BattleImageAnalyzer.h +++ b/src/MeoAssistant/BattleImageAnalyzer.h @@ -34,6 +34,7 @@ namespace asst const std::vector& get_ready_skills() const noexcept; int get_hp() const noexcept; int get_kills() const noexcept; + int get_cost() const noexcept; void clear() noexcept; diff --git a/src/MeoAssistant/BattleProcessTask.cpp b/src/MeoAssistant/BattleProcessTask.cpp index b09a8ea1bd..2ee3714968 100644 --- a/src/MeoAssistant/BattleProcessTask.cpp +++ b/src/MeoAssistant/BattleProcessTask.cpp @@ -339,7 +339,6 @@ bool asst::BattleProcessTask::wait_condition(const BattleAction& action) } image = m_ctrler->get_image(); BattleImageAnalyzer analyzer(image); - analyzer.set_target(BattleImageAnalyzer::Target::Kills); if (analyzer.analyze()) { m_kills = analyzer.get_kills(); @@ -352,6 +351,29 @@ bool asst::BattleProcessTask::wait_condition(const BattleAction& action) std::this_thread::yield(); } + if (action.cost_changes != 0) { + int cost_base = -1; + + while (true) { + image = m_ctrler->get_image(); + BattleImageAnalyzer analyzer(image); + analyzer.set_target(BattleImageAnalyzer::Target::Cost); + if (analyzer.analyze()) { + int cost = analyzer.get_cost(); + if (cost_base == -1) { + cost_base = cost; + continue; + } + if (cost >= cost_base + action.cost_changes) { + break; + } + } + + try_possible_skill(image); + std::this_thread::yield(); + } + } + // 部署干员还有额外等待费用够或 CD 转好 if (action.type == BattleActionType::Deploy) { const std::string& name = m_group_to_oper_mapping[action.group_name].name; diff --git a/src/MeoAssistant/CopilotConfiger.cpp b/src/MeoAssistant/CopilotConfiger.cpp index c3de75b1db..c95a04bd47 100644 --- a/src/MeoAssistant/CopilotConfiger.cpp +++ b/src/MeoAssistant/CopilotConfiger.cpp @@ -90,6 +90,7 @@ bool asst::CopilotConfiger::parse(const json::value& json) action.type = BattleActionType::Deploy; } action.kills = action_info.get("kills", 0); + action.cost_changes = action_info.get("cost_changes", 0); action.group_name = action_info.get("name", std::string()); action.location.x = action_info.get("location", 0, 0); From e7f6fcb9864d23689b6ade23a317ef8bbeb6df14 Mon Sep 17 00:00:00 2001 From: MistEO Date: Sun, 29 May 2022 16:35:36 +0800 Subject: [PATCH 3/8] =?UTF-8?q?fix.=E4=BF=AE=E5=A4=8D=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=88=98=E6=96=97cost=5Fchanges=E5=92=8Ckills=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E5=AD=98=E5=9C=A8=E6=97=B6=EF=BC=8Ccost=5Fchanges?= =?UTF-8?q?=E5=9F=BA=E5=87=86=E8=AE=A1=E7=AE=97=E9=94=99=E8=AF=AF=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MeoAssistant/BattleProcessTask.cpp | 36 ++++++++++++++------------ 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/MeoAssistant/BattleProcessTask.cpp b/src/MeoAssistant/BattleProcessTask.cpp index 2ee3714968..cbd4207bfc 100644 --- a/src/MeoAssistant/BattleProcessTask.cpp +++ b/src/MeoAssistant/BattleProcessTask.cpp @@ -333,24 +333,8 @@ bool asst::BattleProcessTask::do_action(const BattleAction& action) bool asst::BattleProcessTask::wait_condition(const BattleAction& action) { cv::Mat image; - while (m_kills < action.kills) { - if (need_exit()) { - return false; - } - image = m_ctrler->get_image(); - BattleImageAnalyzer analyzer(image); - analyzer.set_target(BattleImageAnalyzer::Target::Kills); - if (analyzer.analyze()) { - m_kills = analyzer.get_kills(); - if (m_kills >= action.kills) { - break; - } - } - - try_possible_skill(image); - std::this_thread::yield(); - } + // 因为要算基准cost,所以这个要放在kills前面 if (action.cost_changes != 0) { int cost_base = -1; @@ -374,6 +358,24 @@ bool asst::BattleProcessTask::wait_condition(const BattleAction& action) } } + while (m_kills < action.kills) { + if (need_exit()) { + return false; + } + image = m_ctrler->get_image(); + BattleImageAnalyzer analyzer(image); + analyzer.set_target(BattleImageAnalyzer::Target::Kills); + if (analyzer.analyze()) { + m_kills = analyzer.get_kills(); + if (m_kills >= action.kills) { + break; + } + } + + try_possible_skill(image); + std::this_thread::yield(); + } + // 部署干员还有额外等待费用够或 CD 转好 if (action.type == BattleActionType::Deploy) { const std::string& name = m_group_to_oper_mapping[action.group_name].name; From 4ee746f715058dec53a6b53364e850e7b70b8085 Mon Sep 17 00:00:00 2001 From: MistEO Date: Sun, 29 May 2022 16:53:04 +0800 Subject: [PATCH 4/8] =?UTF-8?q?feat.=E4=BD=9C=E4=B8=9A=E5=88=B6=E4=BD=9C?= =?UTF-8?q?=E5=99=A8=E6=96=B0=E5=A2=9E=E6=94=AF=E6=8C=81cost=5Fchanges?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=EF=BC=8C=E5=B9=B6=E7=AE=80=E5=8D=95=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E4=BA=86=E4=B8=80=E4=B8=8B=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/CopilotDesinger/自动战斗作业生成器.html | 91 +++++++++++-------- 1 file changed, 54 insertions(+), 37 deletions(-) diff --git a/tools/CopilotDesinger/自动战斗作业生成器.html b/tools/CopilotDesinger/自动战斗作业生成器.html index 7498199820..1678caeba3 100644 --- a/tools/CopilotDesinger/自动战斗作业生成器.html +++ b/tools/CopilotDesinger/自动战斗作业生成器.html @@ -37,7 +37,7 @@

- 描述 + 文本

@@ -57,7 +57,7 @@
-
+

选择干员

@@ -133,7 +133,8 @@ 修改 类别 Kills - 干员 + 费用变化 + 干员名字 x坐标 y坐标 方向 @@ -165,15 +166,23 @@
-
+
+
+ + +
+
+
@@ -190,8 +199,7 @@
-
-
+
-
+
+
+
-
+
+
+ + +
-
- - -
+