From 15e06f17edc10d5efad6b2e026a2ca9a222f951d Mon Sep 17 00:00:00 2001 From: xoipz <85264015+xoipz@users.noreply.github.com> Date: Tue, 9 Sep 2025 19:48:37 +0800 Subject: [PATCH] =?UTF-8?q?js:=E6=AF=8F=E6=97=A5=E5=A7=94=E6=89=98=200.98.?= =?UTF-8?q?5=20(#1841)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/RecognitionObject/F.png | Bin 0 -> 1097 bytes .../Data/RecognitionObject/disabled_ui.png | Bin 0 -> 1201 bytes .../Data/RecognitionObject/team.png | Bin 0 -> 2052 bytes repo/js/AutoCommission/README.md | 144 +++++--- .../process/冒险家安娜/蒙德城/process.json | 71 +++- .../process/冒险家安娜/蒙德城/与安娜对话.json | 22 ++ .../蒙德城/冒险家,安娜!-蒙德城-1.json | 25 +- .../蒙德城/冒险家,安娜!-蒙德城-2.json | 46 ++- .../蒙德城/冒险家,安娜!-蒙德城-3.json | 62 ++-- .../蒙德城/冒险家,安娜!-蒙德城-4.json | 81 ++++ .../蒙德城/冒险家,安娜!-蒙德城-4(1).json | 42 +++ .../蒙德城/冒险家,安娜!-蒙德城-5.json | 42 +++ .../蒙德城/冒险家,安娜!-蒙德城-6.json | 51 +++ .../process/冒险家安娜/蒙德城/击退盗宝团.json | 22 ++ .../process/冒险家安娜/蒙德城/执行分支二.json | 40 ++ .../冒险家测验冒险诀窍/蒙德城/process.json | 29 +- .../process/大病初愈/蒙德城/process.json | 66 ++++ .../process/大病初愈/蒙德城/大病初愈-1.json | 51 +++ .../process/大病初愈/蒙德城/大病初愈-2.json | 87 +++++ .../process/大病初愈/蒙德城/大病初愈-3.json | 150 ++++++++ .../process/大病初愈/蒙德城/大病初愈-4.json | 168 +++++++++ .../process/大病初愈/蒙德城/大病初愈-5.json | 69 ++++ .../process/大病初愈/蒙德城/大病初愈-6.json | 114 ++++++ .../assets/process/大病初愈/蒙德城/攀爬.json | 1 + .../process/大病初愈/蒙德城/教堂顶上.json | 25 ++ .../process/大病初愈/蒙德城/风神像顶上.json | 45 +++ .../process/大病初愈/蒙德城/风车顶上.json | 32 ++ .../process/奇药庐中来/蒙德城/process.json | 66 ++++ .../奇药庐中来/蒙德城/奇药庐中来-1.json | 51 +++ .../奇药庐中来/蒙德城/奇药庐中来-2.json | 79 ++++ .../奇药庐中来/蒙德城/奇药庐中来-3.json | 142 +++++++ .../奇药庐中来/蒙德城/奇药庐中来-4.json | 132 +++++++ .../process/奇药庐中来/蒙德城/执行分支-1.json | 8 + .../process/奇药庐中来/蒙德城/执行分支-2.json | 32 ++ .../process/奇药庐中来/蒙德城/执行分支-3.json | 9 + .../报答神明的方式/蒙德城/process.json | 97 ++++- .../报答神明的方式/蒙德城/星落湖process.json | 22 ++ .../蒙德城/星落湖七天神像fight.json | 41 +++ .../蒙德城/星落湖七天神像path.json | 41 +++ .../蒙德城/晨曦酒庄process.json | 22 ++ .../蒙德城/晨曦酒庄七天神像fight.json | 40 ++ .../蒙德城/晨曦酒庄七天神像path.json | 41 +++ .../报答神明的方式/蒙德城/更换配队path.json | 26 ++ .../报答神明的方式/蒙德城/风起地process.json | 22 ++ .../蒙德城/风起地七天神像fight.json | 40 ++ .../蒙德城/风起地七天神像onlyTP.json | 31 ++ .../蒙德城/风起地七天神像path.json | 41 +++ .../新的风暴尚未出现/望风角/process.json | 1 + .../望风角/前往望风角塔楼打怪.json | 139 +++++++ .../望风角/前往望风角塔楼顶部.json | 213 ++++++----- .../望风角/新的风暴尚未出现-2.json | 104 ++---- .../父亲能做的事/晨曦酒庄/process.json | 57 ++- .../晨曦酒庄/父亲能做的事-晨曦酒庄-2.json | 9 - .../艾伯特先生别再冲了/蒙德城/process.json | 80 ++++ .../蒙德城/艾伯特先生别再冲了-蒙德城-1.json | 71 ++++ .../蒙德城/艾伯特先生别再冲了-蒙德城-2.json | 44 +++ .../蒙德城/艾伯特先生别再冲了-蒙德城-3.json | 170 +++++++++ .../蒙德城/艾伯特先生别再冲了-蒙德城-4.json | 53 +++ .../蒙德城/艾伯特先生别再冲了-蒙德城-5.json | 53 +++ .../艾伯特先生别再冲了一/蒙德城/process.json | 80 ++++ .../蒙德城/艾伯特先生别再冲了-蒙德城-1.json | 71 ++++ .../蒙德城/艾伯特先生别再冲了-蒙德城-2.json | 44 +++ .../蒙德城/艾伯特先生别再冲了-蒙德城-3.json | 170 +++++++++ .../蒙德城/艾伯特先生别再冲了-蒙德城-4.json | 53 +++ .../蒙德城/艾伯特先生别再冲了-蒙德城-5.json | 53 +++ .../蒙德城/process.json | 80 ++++ .../蒙德城/艾伯特先生别再冲了-蒙德城-1.json | 71 ++++ .../蒙德城/艾伯特先生别再冲了-蒙德城-2.json | 44 +++ .../蒙德城/艾伯特先生别再冲了-蒙德城-3.json | 170 +++++++++ .../蒙德城/艾伯特先生别再冲了-蒙德城-4.json | 53 +++ .../蒙德城/艾伯特先生别再冲了-蒙德城-5.json | 53 +++ .../process/语言交流/坠星山谷/process.json | 46 ++- .../process/语言交流/坠星山谷/语言交流-1.json | 26 +- .../process/语言交流/坠星山谷/语言交流-2.json | 40 +- .../process/语言交流/坠星山谷/语言交流-3.json | 57 ++- .../process/语言交流/坠星山谷/语言交流-4.json | 36 +- .../process/语言交流/苍风高地/process.json | 48 ++- .../process/语言交流/苍风高地/语言交流-1.json | 90 ++--- .../process/语言交流/苍风高地/语言交流-2.json | 40 +- .../process/语言交流/苍风高地/语言交流-3.json | 61 ++- .../process/语言交流/苍风高地/语言交流-4.json | 50 ++- .../鸽子习惯一去不回/清泉镇/process.json | 50 ++- .../清泉镇/把信件送给沙拉.json | 40 ++ .../鸽子习惯一去不回/清泉镇/点击关闭.json | 18 + .../鸽子习惯一去不回/清泉镇/调查前方.json | 62 ++++ .../清泉镇/鸽子习惯一去不回-1.json | 76 ++-- .../清泉镇/鸽子习惯一去不回-2.json | 109 ++++-- .../清泉镇/鸽子习惯一去不回-3.json | 111 +++--- .../清泉镇/鸽子习惯一去不回-4.json | 49 +++ .../assets/危险运输现象/坠星山谷-1.json | 161 ++++++++ .../assets/攀高危险/奔狼领-1.json | 75 ++-- repo/js/AutoCommission/lib/constants.js | 4 +- .../js/AutoCommission/lib/dialog-processor.js | 33 +- .../js/AutoCommission/lib/steps/auto-fight.js | 93 +++++ repo/js/AutoCommission/lib/steps/auto-skip.js | 346 ++++++++++++++++++ repo/js/AutoCommission/lib/ui.js | 1 + repo/js/AutoCommission/manifest.json | 4 +- repo/js/AutoCommission/name.json | 7 +- 98 files changed, 5507 insertions(+), 630 deletions(-) create mode 100644 repo/js/AutoCommission/Data/RecognitionObject/F.png create mode 100644 repo/js/AutoCommission/Data/RecognitionObject/disabled_ui.png create mode 100644 repo/js/AutoCommission/Data/RecognitionObject/team.png create mode 100644 repo/js/AutoCommission/assets/process/冒险家安娜/蒙德城/与安娜对话.json create mode 100644 repo/js/AutoCommission/assets/process/冒险家安娜/蒙德城/冒险家,安娜!-蒙德城-4.json create mode 100644 repo/js/AutoCommission/assets/process/冒险家安娜/蒙德城/冒险家,安娜!-蒙德城-4(1).json create mode 100644 repo/js/AutoCommission/assets/process/冒险家安娜/蒙德城/冒险家,安娜!-蒙德城-5.json create mode 100644 repo/js/AutoCommission/assets/process/冒险家安娜/蒙德城/冒险家,安娜!-蒙德城-6.json create mode 100644 repo/js/AutoCommission/assets/process/冒险家安娜/蒙德城/击退盗宝团.json create mode 100644 repo/js/AutoCommission/assets/process/冒险家安娜/蒙德城/执行分支二.json create mode 100644 repo/js/AutoCommission/assets/process/大病初愈/蒙德城/process.json create mode 100644 repo/js/AutoCommission/assets/process/大病初愈/蒙德城/大病初愈-1.json create mode 100644 repo/js/AutoCommission/assets/process/大病初愈/蒙德城/大病初愈-2.json create mode 100644 repo/js/AutoCommission/assets/process/大病初愈/蒙德城/大病初愈-3.json create mode 100644 repo/js/AutoCommission/assets/process/大病初愈/蒙德城/大病初愈-4.json create mode 100644 repo/js/AutoCommission/assets/process/大病初愈/蒙德城/大病初愈-5.json create mode 100644 repo/js/AutoCommission/assets/process/大病初愈/蒙德城/大病初愈-6.json create mode 100644 repo/js/AutoCommission/assets/process/大病初愈/蒙德城/攀爬.json create mode 100644 repo/js/AutoCommission/assets/process/大病初愈/蒙德城/教堂顶上.json create mode 100644 repo/js/AutoCommission/assets/process/大病初愈/蒙德城/风神像顶上.json create mode 100644 repo/js/AutoCommission/assets/process/大病初愈/蒙德城/风车顶上.json create mode 100644 repo/js/AutoCommission/assets/process/奇药庐中来/蒙德城/process.json create mode 100644 repo/js/AutoCommission/assets/process/奇药庐中来/蒙德城/奇药庐中来-1.json create mode 100644 repo/js/AutoCommission/assets/process/奇药庐中来/蒙德城/奇药庐中来-2.json create mode 100644 repo/js/AutoCommission/assets/process/奇药庐中来/蒙德城/奇药庐中来-3.json create mode 100644 repo/js/AutoCommission/assets/process/奇药庐中来/蒙德城/奇药庐中来-4.json create mode 100644 repo/js/AutoCommission/assets/process/奇药庐中来/蒙德城/执行分支-1.json create mode 100644 repo/js/AutoCommission/assets/process/奇药庐中来/蒙德城/执行分支-2.json create mode 100644 repo/js/AutoCommission/assets/process/奇药庐中来/蒙德城/执行分支-3.json create mode 100644 repo/js/AutoCommission/assets/process/报答神明的方式/蒙德城/星落湖process.json create mode 100644 repo/js/AutoCommission/assets/process/报答神明的方式/蒙德城/星落湖七天神像fight.json create mode 100644 repo/js/AutoCommission/assets/process/报答神明的方式/蒙德城/星落湖七天神像path.json create mode 100644 repo/js/AutoCommission/assets/process/报答神明的方式/蒙德城/晨曦酒庄process.json create mode 100644 repo/js/AutoCommission/assets/process/报答神明的方式/蒙德城/晨曦酒庄七天神像fight.json create mode 100644 repo/js/AutoCommission/assets/process/报答神明的方式/蒙德城/晨曦酒庄七天神像path.json create mode 100644 repo/js/AutoCommission/assets/process/报答神明的方式/蒙德城/更换配队path.json create mode 100644 repo/js/AutoCommission/assets/process/报答神明的方式/蒙德城/风起地process.json create mode 100644 repo/js/AutoCommission/assets/process/报答神明的方式/蒙德城/风起地七天神像fight.json create mode 100644 repo/js/AutoCommission/assets/process/报答神明的方式/蒙德城/风起地七天神像onlyTP.json create mode 100644 repo/js/AutoCommission/assets/process/报答神明的方式/蒙德城/风起地七天神像path.json create mode 100644 repo/js/AutoCommission/assets/process/新的风暴尚未出现/望风角/前往望风角塔楼打怪.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了/蒙德城/process.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了/蒙德城/艾伯特先生别再冲了-蒙德城-1.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了/蒙德城/艾伯特先生别再冲了-蒙德城-2.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了/蒙德城/艾伯特先生别再冲了-蒙德城-3.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了/蒙德城/艾伯特先生别再冲了-蒙德城-4.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了/蒙德城/艾伯特先生别再冲了-蒙德城-5.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了一/蒙德城/process.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了一/蒙德城/艾伯特先生别再冲了-蒙德城-1.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了一/蒙德城/艾伯特先生别再冲了-蒙德城-2.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了一/蒙德城/艾伯特先生别再冲了-蒙德城-3.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了一/蒙德城/艾伯特先生别再冲了-蒙德城-4.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了一/蒙德城/艾伯特先生别再冲了-蒙德城-5.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了一一/蒙德城/process.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了一一/蒙德城/艾伯特先生别再冲了-蒙德城-1.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了一一/蒙德城/艾伯特先生别再冲了-蒙德城-2.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了一一/蒙德城/艾伯特先生别再冲了-蒙德城-3.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了一一/蒙德城/艾伯特先生别再冲了-蒙德城-4.json create mode 100644 repo/js/AutoCommission/assets/process/艾伯特先生别再冲了一一/蒙德城/艾伯特先生别再冲了-蒙德城-5.json create mode 100644 repo/js/AutoCommission/assets/process/鸽子习惯一去不回/清泉镇/把信件送给沙拉.json create mode 100644 repo/js/AutoCommission/assets/process/鸽子习惯一去不回/清泉镇/点击关闭.json create mode 100644 repo/js/AutoCommission/assets/process/鸽子习惯一去不回/清泉镇/调查前方.json create mode 100644 repo/js/AutoCommission/assets/process/鸽子习惯一去不回/清泉镇/鸽子习惯一去不回-4.json create mode 100644 repo/js/AutoCommission/assets/危险运输现象/坠星山谷-1.json create mode 100644 repo/js/AutoCommission/lib/steps/auto-fight.js create mode 100644 repo/js/AutoCommission/lib/steps/auto-skip.js diff --git a/repo/js/AutoCommission/Data/RecognitionObject/F.png b/repo/js/AutoCommission/Data/RecognitionObject/F.png new file mode 100644 index 0000000000000000000000000000000000000000..8d56b9b94d605c510691ed0d1ceb18a3ed87baca GIT binary patch literal 1097 zcmV-P1h)H$P)Px(14%?dR9HvVm`zL@M-<2Zv$ioGHU=&2^0?H zP%agzqEHMjC791BAt8qp2Hfd^tF%W7DyRUk? zYwXrmyxz4_GG2Mt>v=Q3{lA$vJ5QWA(?L#$1Fs&f#)&tM!Q(DNdZ7&WjNTFeA42E` z>JL7k{UN1X1J7c6Sb6vazdep%R|ZJ3L!9!zN9X-#an5%N9=98kO)}bhLF$pBVC&i6 z`03|+xH&hE^{qHWaN-69df!K}v#21Qnr)Pb@Wof(;M32)hPZeC0eN3PX11+@+C2$B z#Yds*5Sv@u1Bq=ed4cWe+N(52}{h@0R#LmyLD2jsh z^>xUyY{=4Pv!SZ03X+t|q$GfVKxo<=lFc_ZHsJUB)w3Fw zg}~t8Aj-=AJqhFSIF^@};qiFT-QA7i;^OQNMFjrvF*Iobl83U-=fm3Cn%XIkx5dRp z6(+TCz3uI7M59sE)YKSqw>C`}k}zxql0g_U91b5qE-fvgqM{J(m6a*4WJ%V}&Q7$qx5Mdl8uB{3IpOZHNs}v1CMEe^Lqh}Xc6%B~Yilc- znwsEnIC6#@&nG0idv0zH<>lpRAa1uCE|)8#%9*HBmCP$7$I0h~AVU)Bm0mi?(TO~c z$^0tGaZ(FGq46u`*Y5wWIHjefSXfv{TNZP1bE2*m%r(f%qj`j^t*yoE>@0YaSS`tA zQNbsdr}CpDhaG+uYiVgQ9A=*PAgOD2aCqDrWLH<0`a;p%+>FM?Mpeb+{@Q|`2d`>` zz|g2Q$ko+VRXN@o@M@A5Kz=qAQoTUmz=$7?smjc6w6*8&j#r~l~45@D) zF7$nTm>~gK-be4HAjBV!{-mQvstY%~EVLYrZsLQB0}yvU`;t1_--X?7WIt@7M-!&s zeg7i{My4R%IoCl${k?eW&66gYDV)jb!{6~?|1f^}^*)66_V@7*7^F#M&4;}c P00000NkvXXu0mjfNJbCz literal 0 HcmV?d00001 diff --git a/repo/js/AutoCommission/Data/RecognitionObject/disabled_ui.png b/repo/js/AutoCommission/Data/RecognitionObject/disabled_ui.png new file mode 100644 index 0000000000000000000000000000000000000000..a5213c532097d4e2ab22e4ae4018db6d8ac5bf8f GIT binary patch literal 1201 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 - 识别到战斗结束返回true,超时返回false + */ + var waitFight = async function (timeout = 30000, intervals = 5000) { + let team = null; // 模板图像(Mat对象) + let cap = null; // 当前屏幕截图(Mat对象) + let teamRO = null; // 模板匹配识别对象 + + try { + team = file.readImageMatSync("Data/team.png"); + teamRO = RecognitionObject.TemplateMatch(team); + teamRO.useMask = true; // 忽略绿色区域 (RGB: 0,255,0) + + const startTime = Date.now(); + + // 循环检测直到超时 + while (Date.now() - startTime < timeout) { + // 按下 L 键 打开队伍 + keyPress("l"); + await sleep(1000); + + // 截取当前游戏区域 + cap = captureGameRegion(); + + // 查找模板 + if (cap.find(teamRO)) { + log.info("识别到战斗结束"); + // 取消 打开队伍 + keyPress("l"); + return true; + } + + log.info("未识别到战斗结束"); + await sleep(intervals); + } + + // 超时未识别 + return false; + + } catch (e) { + log.error(e); + } finally { + // 释放资源 + team?.Dispose(); + cap?.Dispose(); + } + } + try { + var timeout = step.data && step.data.timeout; + var intervals = step.data && step.data.intervals; + + let args = []; + + if (timeout) { args.push(timeout) }; + if (intervals) { args.push(intervals) }; + + // 创建取消令牌 + let cts = new CancellationTokenSource(); + + log.info("开始战斗"); + let fightTask = dispatcher.RunTask(new SoloTask("AutoFight"), cts); + + // 等待战斗结束或超时,动态传参,默认超时30秒,间隔10秒 + await waitFight(...args); + + // 超时或战斗结束,取消战斗任务 + cts.cancel(); + return true; + + } catch (error) { + // 捕获并记录执行过程中的异常 + log.error("处理自动战斗(自定时长版)步骤时出错: {error}", error.message); + return false; + } + }); +})(); + +/* +JSON使用示例: +{ + "type": "定时自动战斗", + "data": { + "timeout": 3000, //可选参数,单位为毫秒,默认30秒 + "intervals": 1000 //可选参数,单位为毫秒,默认10秒 + }, + "note": "开始自动战斗-自定时长版" +} +*/ \ No newline at end of file diff --git a/repo/js/AutoCommission/lib/steps/auto-skip.js b/repo/js/AutoCommission/lib/steps/auto-skip.js new file mode 100644 index 000000000..b8406c2fb --- /dev/null +++ b/repo/js/AutoCommission/lib/steps/auto-skip.js @@ -0,0 +1,346 @@ +// 原神每日委托自动执行脚本 - AutoSkip步骤处理器 +// 共同的AutoSkip逻辑函数 +var executeAutoSkipLogic = async function (stepData, stepName) { + try { + log.info("执行{stepName}步骤", stepName); + + // 从stepData中提取配置参数 + var customPriorityOptions = stepData.priorityOptions || []; + var customBlacklist = stepData.blacklist || []; + var customPriorityIcons = stepData.priorityIcons || []; + var customNpcWhiteList = stepData.npcWhiteList || []; + + var StoryRo = RecognitionObject.TemplateMatch( + file.ReadImageMatSync("Data/RecognitionObject/disabled_ui.png"), + 265, + 37, + 30, + 22 + ); + + // 识别图像函数 + var recognizeImage = async function (recognitionObject) { + try { + // 尝试识别图像 + var imageResult = captureGameRegion().find(recognitionObject); + if ( + imageResult && + imageResult.x !== 0 && + imageResult.y !== 0 && + imageResult.width !== 0 && + imageResult.height !== 0 + ) { + return { success: true, x: imageResult.x, y: imageResult.y }; + } + } catch (error) { + log.error("识别图像时发生异常: {error}", error.message); + } + return { success: false }; + }; + + var AutoSkip = async function ( + customPriorityOptions, + customBlacklist, + customPriorityIcons, + customNpcWhiteList + ) { + customPriorityOptions = customPriorityOptions || []; + customBlacklist = customBlacklist || []; + customPriorityIcons = customPriorityIcons || []; + customNpcWhiteList = customNpcWhiteList || []; + + // 默认配置 + var defaultPriorityOptions = []; + var defaultBlacklist = []; + var defaultPriorityIcons = []; + + // 将npcWhiteList添加到priorityOptions的前面 + var mergedPriorityOptions = customNpcWhiteList.concat( + customPriorityOptions + ); + + // 合并用户自定义配置和默认配置 + var effectivePriorityOptions = defaultPriorityOptions.concat( + mergedPriorityOptions + ); + var effectiveBlacklist = defaultBlacklist.concat(customBlacklist); + var effectivePriorityIcons = + customPriorityIcons.length > 0 + ? customPriorityIcons + : defaultPriorityIcons; + + // 重复执行自动剧情,直到返回主界面 + var maxAttempts = 1200; // 设置最大尝试次数,防止无限循环 + var attempts = 0; + var SkipTime = 100; // 跳过间隔时间(毫秒) + var storyIconDetectedOnce = false; // 首次出现机制标志 + + await sleep(1000); + + // 预加载优先图标识别对象 + var priorityIconROs = []; + for (var k = 0; k < effectivePriorityIcons.length; k++) { + var iconName = effectivePriorityIcons[k]; + try { + var iconPath = "Data/RecognitionObject/" + iconName; + var iconMat = file.ReadImageMatSync(iconPath); + if (iconMat) { + var ro = RecognitionObject.TemplateMatch(iconMat); + priorityIconROs.push(ro); + } + } catch (error) { + log.warn( + "无法加载优先图标 {iconName}: {error}", + iconName, + error.message + ); + } + } + + while (attempts < maxAttempts) { + var StoryResult = await recognizeImage(StoryRo); + + // 首次出现机制:如果图标曾经出现过,就必须通过这个判断 + if (storyIconDetectedOnce) { + if (!StoryResult.success) { + log.info("剧情图标消失,结束AutoSkip"); + return; + } + } else { + // 如果图标第一次被检测到,记录首次出现 + if (StoryResult.success) { + storyIconDetectedOnce = true; + log.info("检测到剧情图标首次出现,启用图标检测机制"); + } + // 如果图标从未出现过,继续执行不进行判断 + } + + attempts++; + + var startTime = new Date().getTime(); + + // 1秒内按空格键跳过 + while (new Date().getTime() - startTime < 1000) { + keyPress("VK_SPACE"); + await sleep(SkipTime); + } + + // 1. 查找F图标 + var fIconFound = false; + var fIconY = 0; + + // F图标检测逻辑 + var fIconRO = RecognitionObject.TemplateMatch( + file.ReadImageMatSync("Data/RecognitionObject/F.png"), + 1207, + 0, + 43, + 850 + ); + var fIconResult = await recognizeImage(fIconRO); + log.info(fIconResult.success) + + if (fIconResult.success) { + fIconFound = true; + fIconY = fIconResult.y; + } + + // 2. 查找优先图标 + var priorityIconClicked = false; + if (fIconFound) { + for (var m = 0; m < priorityIconROs.length; m++) { + var iconRO = priorityIconROs[m]; + var iconResult = await recognizeImage(iconRO); + if (iconResult.success) { + log.info("找到优先图标点击"); + click(iconResult.x, iconResult.y); + priorityIconClicked = true; + break; + } + } + } + + // 3. 如果没有找到优先图标,进行OCR识别 + if (fIconFound && !priorityIconClicked) { + // 定义OCR区域:1250, F图标的y+10 到 1800,850 + var ocrStartY = fIconY + 10; + var ocrHeight = 850 - ocrStartY; + + if (ocrHeight > 0) { + var captureRegion = captureGameRegion(); + var dialogArea = captureRegion.DeriveCrop( + 1250, + ocrStartY, + 550, + ocrHeight + ); + + // 创建OCR识别对象并识别文本 + var ocrRo = RecognitionObject.Ocr( + 0, + 0, + dialogArea.width, + dialogArea.height + ); + var ocrResults = dialogArea.FindMulti(ocrRo); + + if (ocrResults && ocrResults.count > 0) { + var foundValidOption = false; + var firstNonBlacklistOption = null; + + // 首先查找优先选项 + for (var i = 0; i < ocrResults.count; i++) { + var ocrText = ocrResults[i].text; + log.debug("选项 {index}: {text}", i + 1, ocrText); + + // 检查是否在优先选项列表中 + for (var j = 0; j < effectivePriorityOptions.length; j++) { + var priorityOption = effectivePriorityOptions[j]; + if (ocrText.includes(priorityOption)) { + log.info( + "找到优先选项: {option},点击该选项", + priorityOption + ); + ocrResults[i].click(); + foundValidOption = true; + break; + } + } + if (foundValidOption) break; + + // 记录第一个非黑名单选项 + if (!firstNonBlacklistOption) { + var isBlacklisted = false; + for (var k = 0; k < effectiveBlacklist.length; k++) { + var blackOption = effectiveBlacklist[k]; + if (ocrText.includes(blackOption)) { + isBlacklisted = true; + break; + } + } + if (!isBlacklisted) { + firstNonBlacklistOption = ocrResults[i]; + } + } + } + + // 如果没有找到优先选项,但有非黑名单选项,点击第一个非黑名单选项 + if (!foundValidOption && firstNonBlacklistOption) { + firstNonBlacklistOption.click(); + foundValidOption = true; + } + + // 如果既没有优先选项也没有非黑名单选项,按F键 + if (!foundValidOption) { + keyPress("F"); + } + } else { + keyPress("F"); + } + } + } + } + }; + + // 执行AutoSkip功能 + await AutoSkip( + customPriorityOptions, + customBlacklist, + customPriorityIcons, + customNpcWhiteList + ); + + log.info("{stepName}步骤执行完成", stepName); + } catch (error) { + log.error("执行{stepName}步骤时出错: {error}", stepName, error.message); + throw error; + } +}; + +// 注册"AutoSkip"步骤处理器 +StepProcessorLoader.register("AutoSkip", async function (stepData, context) { + await executeAutoSkipLogic(stepData, "AutoSkip"); +}); + +// 注册"对话"步骤处理器 +StepProcessorLoader.register("对话", async function (stepData, context) { + await executeAutoSkipLogic(stepData, "对话"); +}); + +/* +使用示例 - JSON格式配置: + +1. 基本用法(使用默认配置): +{ + "type": "AutoSkip" +} + +2. 带优先选项的用法: +{ + "type": "AutoSkip", + "priorityOptions": ["帮助", "同意", "确认"], + "note": "优先点击包含'帮助'、'同意'、'确认'的选项" +} + +3. 带NPC白名单的用法: +{ + "type": "AutoSkip", + "npcWhiteList": ["派蒙", "旅行者", "温迪"], + "note": "最优先点击包含指定NPC名称的选项" +} + +4. 带黑名单选项的用法: +{ + "type": "AutoSkip", + "blacklist": ["拒绝", "离开", "结束对话"], + "note": "避免点击包含'拒绝'、'离开'、'结束对话'的选项" +} + +5. 带优先图标的用法: +{ + "type": "AutoSkip", + "priorityIcons": ["icon_quest.png", "icon_important.png"], + "note": "优先点击指定图标" +} + +6. 完整配置示例: +{ + "type": "AutoSkip", + "npcWhiteList": ["委托发布者", "任务NPC"], + "priorityOptions": ["帮助", "委托", "任务"], + "blacklist": ["拒绝", "离开"], + "priorityIcons": ["icon_quest.png"], + "note": "完整配置:NPC白名单优先级最高,然后是任务相关选项,避免拒绝类选项" +} + +7. 实际场景示例: +{ + "type": "AutoSkip", + "npcWhiteList": ["凯瑟琳", "委托发布人"], + "priorityOptions": ["接受", "好的", "没问题"], + "blacklist": ["算了", "不了", "再见"], + "note": "委托对话:最优先选择NPC相关选项,然后是接受委托选项,避免拒绝选项" +} + +参数说明: +- npcWhiteList: NPC白名单关键词数组,具有最高优先级,会被添加到priorityOptions的前面 +- priorityOptions: 优先选项关键词数组,会优先点击包含这些关键词的对话选项 +- blacklist: 黑名单关键词数组,会避免点击包含这些关键词的选项 +- priorityIcons: 优先图标文件名数组,图标文件需放在Data/RecognitionObject/目录下 +- note: 步骤说明(可选),用于注释当前步骤的作用 + +优先级顺序: +1. NPC白名单选项(npcWhiteList)- 最高优先级 +2. 普通优先选项(priorityOptions) +3. 非黑名单选项 +4. 按F键(默认操作) + +功能说明: +- 自动识别剧情对话界面(通过disabled_ui.png图标) +- 连续按空格键跳过剧情文本 +- 检测F键提示图标的位置 +- 优先点击指定的图标(如果配置了priorityIcons) +- 使用OCR识别对话选项文本 +- 按上述优先级顺序选择对话选项 +- 循环执行直到剧情结束 +*/ diff --git a/repo/js/AutoCommission/lib/ui.js b/repo/js/AutoCommission/lib/ui.js index ae120e3cd..238f1e4d0 100644 --- a/repo/js/AutoCommission/lib/ui.js +++ b/repo/js/AutoCommission/lib/ui.js @@ -13,6 +13,7 @@ var UI = { await sleep(1000); click(300, 350); await sleep(100); + click(300, 350); log.debug("已进入委托界面"); return true; } catch (error) { diff --git a/repo/js/AutoCommission/manifest.json b/repo/js/AutoCommission/manifest.json index 60cd04f0c..34cf88542 100644 --- a/repo/js/AutoCommission/manifest.json +++ b/repo/js/AutoCommission/manifest.json @@ -1,9 +1,9 @@ { "manifest_version": 1, "name": "(对话+成就)全自动蒙德地区每日委托", - "version": "0.98.3", + "version": "0.98.5", "tags": ["委托","对话","战斗","成就","历练点"], - "description": "自动完成每日委托、自动识别委托内容、自动追踪战斗委托、自动完成对话委托、自动获得到隐藏成就。使用前请阅读README.md获取详细说明和常见问题解答。目前项目正处于开发阶段急需人手,有意者可加群。每天只需花 5 ~ 10 分钟做一个蒙德委托记下坐标,就当是顺路补下成就。感谢云闲vsv & 换苏伟u & 小鹰划船不用桨 & 塔台 &@未知_ 的共同开发", + "description": "自动完成每日委托、自动识别委托内容、自动追踪战斗委托、自动完成对话委托、自动获得到隐藏成就。使用前请阅读README.md获取详细说明和常见问题解答。目前项目急需人手,有意者可加群。感谢云闲vsv & 换苏伟u & 小鹰划船不用桨 & 塔台 & 未知_ 的共同开发", "authors": [ { "name": "星野", diff --git a/repo/js/AutoCommission/name.json b/repo/js/AutoCommission/name.json index bf90fa363..e11cb4328 100644 --- a/repo/js/AutoCommission/name.json +++ b/repo/js/AutoCommission/name.json @@ -15,6 +15,9 @@ "圆滚滚的易爆品" ], "talk": [ + "艾伯特先生别再冲了", + "艾伯特先生别再冲了一", + "艾伯特先生别再冲了一一", "艾琳未来的骑士", "艾琳未来的骑士一", "报答神明的方式", @@ -22,6 +25,7 @@ "趁鲜花气息逗留", "触不可及的恋人", "此路不通", + "大病初愈", "父亲能做的事", "鸽子习惯一去不回", "鸽子鸭子小孩子", @@ -36,8 +40,9 @@ "冒险家测验作战方式", "冒险家的能力极限", "冒险就要勇于前进", - "蒙德酒客", + "蒙德酒客", "那位先生的委托", + "奇药庐中来", "诗歌交流", "说到做到", "提米对不起",