From 58c73a02583c27c7942dd2c0e331f2d77141fd09 Mon Sep 17 00:00:00 2001 From: kaedelcb <57870068+kaedelcb@users.noreply.github.com> Date: Sat, 24 May 2025 16:12:08 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=9C=B0=E8=84=89=E8=8A=B1=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=E6=A3=80=E6=B5=8B=E3=80=82=20(#912)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 1.地脉花加入异步检测。 1.地脉花加入异步检测。 2.其他一些描述修改 * Update repo/js/Auto全自动“枫丹”地脉花/main.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update repo/js/Auto全自动“枫丹”地脉花/main.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * 改了跑了一遍,应该可以了 --------- Co-authored-by: 秋云 Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../AAA 地脉花注意事项.txt | 5 +- repo/js/Auto全自动“枫丹”地脉花/main.js | 261 ++++++++++-------- repo/js/Auto全自动“枫丹”地脉花/manifest.json | 14 +- repo/js/Auto全自动“枫丹”地脉花/settings.json | 10 + repo/js/参量质变仪/manifest.json | 2 +- repo/js/爱可菲厨艺机关/manifest.json | 2 +- 6 files changed, 179 insertions(+), 115 deletions(-) diff --git a/repo/js/Auto全自动“枫丹”地脉花/AAA 地脉花注意事项.txt b/repo/js/Auto全自动“枫丹”地脉花/AAA 地脉花注意事项.txt index 13776157..3c9e83f6 100644 --- a/repo/js/Auto全自动“枫丹”地脉花/AAA 地脉花注意事项.txt +++ b/repo/js/Auto全自动“枫丹”地脉花/AAA 地脉花注意事项.txt @@ -53,4 +53,7 @@ v.2.0版本:20250503 2、添加直跑模式,当打完一个地脉花后,如下一个地脉花比较近,直接跑过去而不是重新传送。(要求BGI的44.8版本) v.2.1版本:20250512 -1、更改UID识别方法。(适配原神UI改变) \ No newline at end of file +1、更改UID识别方法。(适配原神UI改变) + +v.2.2版本:20250524 +1、参考D捣蛋和秋云佬的代码,加入异步检测战斗结束。 \ No newline at end of file diff --git a/repo/js/Auto全自动“枫丹”地脉花/main.js b/repo/js/Auto全自动“枫丹”地脉花/main.js index 82fe348b..30c5660c 100644 --- a/repo/js/Auto全自动“枫丹”地脉花/main.js +++ b/repo/js/Auto全自动“枫丹”地脉花/main.js @@ -62,34 +62,45 @@ await sleep(100); } } + + //初始化 + var SMODEL = settings.SMODEL ? settings.SMODEL : false; // false 公版BETTERGI,true 自编译版本LCB + var SHUOVER=0 //0初始状态,1队伍配置标志,2结束线路,3线路出错 + var haoganq=0 //0初始状态,1好感队伍配置标志 + var SHUV = settings.shuv ? settings.shuv : 1; // 1 单线路,2 树脂耗尽 + var Rewards = settings.Rewards ? settings.Rewards : false; // ture 领取冒险点奖励,false 不领取冒险点奖励 + var Fligtin = false; //领取冒险点奖励标志。 + var FINDagin = 0; //地脉花寻找标志。lv.1.2新增,用于判断是否找线路余下地脉花。 + var tolerance = 25; + var position ={}; + var Lastexecution = false;//线路执行标志,用于判断上一线路是否执行。 + var Fightquick = settings.Fightquick ? settings.Fightquick : false; + var Fighttimeout = settings.timeout = settings.timeout * 1000 || 120000; + const ocrRegion2 = { x: 0, y: 200, width: 300, height: 300 }; // 追踪任务区域 + const ocrRo2 = RecognitionObject.ocr(ocrRegion2.x, ocrRegion2.y, ocrRegion2.width, ocrRegion2.height); + const ocrRegion1 = { x: 800, y: 200, width: 300, height: 100 }; // 中心区域 + const ocrRo1 = RecognitionObject.ocr(ocrRegion1.x, ocrRegion1.y, ocrRegion1.width, ocrRegion1.height); + + log.debug(`DEBUG:${SHUV}.${color}.${rawTimes}`);//调试LOG + if (Rewards){log.warn("结束后领励练点和提交每日!");if(settings.nh === undefined || settings.nh === "") {log.warn("好感队未配置,领奖励时不切换队伍")}} + if (settings.nh === undefined || settings.nh === "") { log.warn("好感队禁用!");haoganq=0}else{var haogandui = settings.nh;haoganq=1;if(settings.n === undefined ) {throw new Error("好感队已经设置,请填战斗队伍!")}} + if (settings.n === undefined || settings.n === "") { log.warn("队伍名称未配置,不更换队伍!");SHUOVER=1;} + if (SHUV == 1) {log.warn("线路模式 :'单线路!'");}else{log.warn("线路模式 :'树脂耗尽模式,强制打完整体线路!'");rawTimes=12} + if (color == 1) {log.warn("地脉类型 :'蓝色-经验书花!'");}else{log.warn("地脉类型 :'黄色-摩拉花!'")} + let nowuidString = settings.nowuid ? settings.nowuid : ""; + + filePath = "" + // 读取原始次数配置 + var rawTimes = settings.times*2 ? settings.times : "12"; + var color = settings.color ? settings.color : 1; + var BIAOZZ = "assets/model/BIAOZ.bmp" + + + if (color == 2){var DIMAIHUA = "assets/model/DIMAIHUA-huank.bmp";} + else if (color == 1){var DIMAIHUA = "assets/model/DIMAIHUA-lank.bmp";} + else{var DIMAIHUA = "assets/model/DIMAIHUA-lank.bmp";} - // //容错检测函数,备用 - // function checkOverlap() { - // const overlappingPoints = []; - - // for (let i = 0; i < allFlowerCoords.length; i++) { - // for (let j = i + 1; j < allFlowerCoords.length; j++) { - // const point1 = allFlowerCoords[i]; - // const point2 = allFlowerCoords[j]; - - // const dx = Math.abs(point1.x - point2.x); - // const dy = Math.abs(point1.y - point2.y); - - // if (dx <= tolerance && dy <= tolerance) { - // overlappingPoints.push({ - // point1: { line: point1.line, flower: point1.flower, x: point1.x, y: point1.y }, - // point2: { line: point2.line, flower: point2.flower, x: point2.x, y: point2.y } - // }); - // } - // } - // } - // overlappingPoints.forEach((point, index) => { - // log.info(`重叠点 ${index + 1}:${JSON.stringify(point)}`); - // }); - // return overlappingPoints; - // // await checkOverlap(allFlowerCoords,tolerance); - // } setGameMetrics(1920, 1080, 1); //================= 1.设定路线 ================= @@ -192,51 +203,7 @@ "路线5 新枫丹科学院左锚点": folder5, "路线6 芒索斯山东麓": folder6 }; - - filePath = "" - // 读取原始次数配置 - var LOOOKING = 0 - var rawTimes = settings.times*2 ? settings.times : "12"; - var color = settings.color ? settings.color : 1; - var BIAOZZ = "assets/model/BIAOZ.bmp" - - if (LOOOKING == 0) { - if (color == 2){var DIMAIHUA = "assets/model/DIMAIHUA-huank.bmp";} - else if (color == 1){var DIMAIHUA = "assets/model/DIMAIHUA-lank.bmp";} - else{var DIMAIHUA = "assets/model/DIMAIHUA-lank.bmp";} - - } else if (LOOOKING == 1) { - if (color == 2){var DIMAIHUA = "assets/model/DIMAIHUA-huan.bmp";} - else if (color == 1){var DIMAIHUA = "assets/model/DIMAIHUA-lan.bmp";} - else{var DIMAIHUA = "assets/model/DIMAIHUA-lan.bmp";} - } - - // // 验证是否为数字 - // var timesValue; - // if (!/^-?\d+\.?\d*$/.test(rawTimes)) { // 匹配整数和小数 - // timesValue = 12 - // // log.info("⚠️ 刷本次数设置不为数字,改为默认值12"); - // } else { - // // 转换为数字 - // const num = parseFloat(rawTimes*2); // 乘以2,因为每次战斗两次(一次战斗两次掉落) - // // 范围检查 - // if (num < 1) { - // timesValue = 1; - // //log.info(`⚠️ 次数 ${num} 小于1,已调整为1`); - // } else if (num > 12) { - // timesValue = 12; - // // log.info(`⚠️ 次数 ${num} 大于12,已调整为12`); - // } else { - // // 处理小数 - // if (!Number.isInteger(num)) { - // timesValue = Math.floor(num); - // // log.info(`⚠️ 次数 ${num} 不是整数,已向下取整为 ${timesValue}`); - // } else { - // timesValue = num; - // } - // } - // } - // var timesConfig = { value: timesValue }; + var timesValue = 12; // 设置默认值 var num = parseFloat(rawTimes) * 2; // 直接计算乘以2后的值,并尝试转换为浮点数 @@ -244,14 +211,9 @@ // 如果输入是有效的数字,并且在合理范围内,则更新timesValue if (/^-?\d+\.?\d*$/.test(rawTimes) && num >= 1 && num <= 24) { timesValue = Math.max(1, Math.min(12, Math.floor(num))); // 确保值在1到12之间,并向下取整 - } - - // 如果num大于12(因为乘以2了,所以实际上是原始值大于6),则设置为最大值12 - // 注意:这里不需要额外检查,因为Math.min已经处理了上限 - + } + var timesConfig = { value: timesValue }; - - const allFlowerCoords = [ // 线路1 { line: 1, flower: 1, x: 773, y: 669 }, @@ -288,7 +250,7 @@ { line: 6, flower: 4, x: 371, y: 281 },//227 379 290 ]; - // 快速寻路模式寻路 + // 输出选择的线路 async function PathCheak1() { await genshin.returnMainUi(); @@ -436,7 +398,7 @@ } async function isOnRewardPage() { - const rewardText = await Textocr("地脉之花", 0.5, 0, 0, 861,265, 194, 265); + const rewardText = await Textocr("地脉之花", 0.2, 0, 0, 861,265, 194, 265); return rewardText.found; } @@ -447,7 +409,7 @@ * @param timeout 超时时间,单位为毫秒,默认值为1000毫秒 * @returns 无返回值 */ - async function checkRewardPage(timeout = 1000) { + async function checkRewardPage(timeout = 2000) { if (!shouldContinueChecking) { return; // 如果不应该继续检测,则直接返回 @@ -464,6 +426,99 @@ } } + //异步检测战斗,来自D捣蛋&秋云佬的全自动地脉花的代码 + async function autoFight(Fighttimeout) { + const cts = new CancellationTokenSource(); + log.info("开始战斗"); + dispatcher.RunTask(new SoloTask("AutoFight"), cts); + let fightResult = await recognizeTextInRegion(Fighttimeout); + logFightResult = fightResult ? "成功" : "失败"; + log.info(`战斗结束,战斗结果:${logFightResult}`); + cts.cancel(); + return fightResult; + } + + function recognizeFightText(captureRegion) { + try { + let result = captureRegion.find(ocrRo2); + let text = result.text; + keywords = ["打倒", "所有", "敌人"]; + for (let keyword of keywords) { + if (text.includes(keyword)) { + return true; + } + } + return false; + } catch (error) { + log.error("OCR过程中出错: {0}", error); + } + } + + async function recognizeTextInRegion(Fighttimeout) { + return new Promise((resolve, reject) => { + (async () => { + try { + let startTime = Date.now(); + let noTextCount = 0; + const successKeywords = ["挑战达成", "战斗胜利", "挑战成功"]; + const failureKeywords = ["挑战失败"]; + + // 循环检测直到超时 + while (Date.now() - startTime < Fighttimeout) { + try { + let captureRegion = captureGameRegion(); + let result = captureRegion.find(ocrRo1); + let text = result.text; + + // 检查成功关键词 + for (let keyword of successKeywords) { + if (text.includes(keyword)) { + log.info("检测到战斗成功关键词: {0}", keyword); + resolve(true); + return; + } + } + + // 检查失败关键词 + for (let keyword of failureKeywords) { + if (text.includes(keyword)) { + log.warn("检测到战斗失败关键词: {0}", keyword); + resolve(false); + return; + } + } + + //战斗区域 + let foundText = recognizeFightText(captureRegion); + if (!foundText) { + noTextCount++; + log.info(`检测到可能离开战斗区域,当前计数: ${noTextCount}`); + + if (noTextCount >= 10) { + log.warn("已离开战斗区域"); + resolve(false); + return; + } + } + else { + noTextCount = 0; // 重置计数 + } + } + catch (error) { + log.error("OCR过程中出错: {0}", error); + } + + await sleep(1000); // 检查间隔 + } + + log.warn("在超时时间内未检测到战斗结果"); + resolve(false); + } catch (error) { + reject(error); + } + })(); + }); + } async function Veinfligt() { // 定义路线常量 @@ -507,7 +562,6 @@ if(position.line==2 && (i+position.flower*2-2)==8){await pathingScript.runFile("assets/枫丹地脉花-路线2 秋分山西侧锚点左下/线路修复/枫丹地脉花-路线2 秋分山西侧锚点左下-5:秋分山左左下下1-线路修复.json");} else{await pathingScript.runFile(`${selectedFolder}${jsonFile1}`);} } - // 寻找地脉溢口,文字识别不到转圈寻找,不管有没找到都执行战斗,最后领取奖励判断是否继续执行 shouldContinueChecking = true; @@ -516,17 +570,25 @@ await sleep(1000); dispatcher.addTimer(new RealtimeTimer("AutoPick", { "forceInteraction": false })); - //执行自动战斗,配置器中的设置建议填你的队伍打一次大概得时间 - await dispatcher.runTask(new SoloTask("AutoFight")); - await sleep(2000); - await dispatcher.runTask(new SoloTask("AutoFight"));//公版BETTERGI战斗两次可能触发已经出现的地脉花 + if (!Fightquick){ + await dispatcher.runTask(new SoloTask("AutoFight")); //固定执行两次战斗,执行自动战斗,配置器中的设置建议填你的队伍打一次大概得时间 + await sleep(2000); + await dispatcher.runTask(new SoloTask("AutoFight")); + }else + { + shouldContinueChecking = false; + if(!await autoFight(Fighttimeout)){ + log.warn("战斗失败,测试寻找地脉花入口"); + } + shouldContinueChecking = true; + } //执行到地脉花地点的寻路脚本 log.info(`开始执行寻找地脉花奖励:${jsonFile2}`); await pathingScript.runFile(`${selectedFolder}${jsonFile2}`); await sleep(3000); // 领取奖励,开始找地脉口 - log.info(`开始第 ${executedCount/2} 朵花的奖励领取`); + log.info(`开始第 ${executedCount/2+1} 朵花的奖励领取`); if (haoganq==1){log.info(`切换好感队伍:'${haogandui}'`);await genshin.returnMainUi(); await sleep(1000);await genshin.SwitchParty(haogandui);} shouldContinueChecking = false; await sleep(2000); @@ -545,30 +607,7 @@ } FINDagin = 0; //重置地脉花寻找标志。lv.1.2新增,用于判断是否找线路余下地脉花。 return true;// 线路完成 - } - - - //初始化 - var SMODEL = settings.SMODEL ? settings.SMODEL : false; // false 公版BETTERGI,true 自编译版本LCB - var SHUOVER=0 //0初始状态,1队伍配置标志,2结束线路,3线路出错 - var haoganq=0 //0初始状态,1好感队伍配置标志 - var SHUV = settings.shuv ? settings.shuv : 1; // 1 单线路,2 树脂耗尽 - var Rewards = settings.Rewards ? settings.Rewards : false; // ture 领取冒险点奖励,false 不领取冒险点奖励 - var Fligtin = false; //领取冒险点奖励标志。 - var FINDagin = 0; //地脉花寻找标志。lv.1.2新增,用于判断是否找线路余下地脉花。 - var tolerance = 25; - var position ={}; - var Lastexecution = false;//线路执行标志,用于判断上一线路是否执行。 - - - - log.debug(`DEBUG:${SHUV}.${color}.${rawTimes}`);//调试LOG - if (Rewards){log.warn("结束后领励练点和提交每日!");if(settings.nh === undefined || settings.nh === "") {log.warn("好感队未配置,领奖励时不切换队伍")}} - if (settings.nh === undefined || settings.nh === "") { log.warn("好感队禁用!");haoganq=0}else{var haogandui = settings.nh;haoganq=1;if(settings.n === undefined ) {throw new Error("好感队已经设置,请填战斗队伍!")}} - if (settings.n === undefined || settings.n === "") { log.warn("队伍名称未配置,不更换队伍!");SHUOVER=1;} - if (SHUV == 1) {log.warn("线路模式 :'单线路!'");}else{log.warn("线路模式 :'树脂耗尽模式,强制打完整体线路!'");rawTimes=12} - if (color == 1) {log.warn("地脉类型 :'蓝色-经验书花!'");}else{log.warn("地脉类型 :'黄色-摩拉花!'")} - let nowuidString = settings.nowuid ? settings.nowuid : ""; + } // UID获取存在概率不成功,慎用!请更换背景纯色的名片提高OCR成功率 let uidNumbers = nowuidString.match(/\d+/g); diff --git a/repo/js/Auto全自动“枫丹”地脉花/manifest.json b/repo/js/Auto全自动“枫丹”地脉花/manifest.json index 4a026dc0..67c4ca14 100644 --- a/repo/js/Auto全自动“枫丹”地脉花/manifest.json +++ b/repo/js/Auto全自动“枫丹”地脉花/manifest.json @@ -4,10 +4,22 @@ "version": "2.1", "bgi_version": "0.44.8", "description": "枫丹地脉花,蓝花金花通用。生存压力大,请带盾奶;避免纯水输出,请注意说明文件。如有BUG请联系作者QQ:119996800", - "tags" : [ "地脉花" ], + "tags":["地脉花"], "authors": [ { "name": "LCB-茶包" + }, + { + "name": "ddaodan", + "link": "https://github.com/ddaodan" + }, + { + "name": "平面镜", + "link": "https://github.com/Flatmirrr" + }, + { + "name": "秋云", + "link": "https://github.com/physligl" } ], "settings_ui": "settings.json", diff --git a/repo/js/Auto全自动“枫丹”地脉花/settings.json b/repo/js/Auto全自动“枫丹”地脉花/settings.json index 48721bc6..9f57491a 100644 --- a/repo/js/Auto全自动“枫丹”地脉花/settings.json +++ b/repo/js/Auto全自动“枫丹”地脉花/settings.json @@ -46,5 +46,15 @@ "name": "SMODEL", "type": "checkbox", "label": "直跑模式:如下个花近直跑过去,不传送,测试慎用,要求44.8版本!" + }, + { + "name": "Fightquick", + "type": "checkbox", + "label": "更快检测结束战斗,开启后下方的超时时间才有效" + }, + { + "name": "timeout", + "type": "input-text", + "label": "更快检测结束战斗的战斗超时时间,单位秒,默认120秒" } ] \ No newline at end of file diff --git a/repo/js/参量质变仪/manifest.json b/repo/js/参量质变仪/manifest.json index 2a53b78a..6269fbf7 100644 --- a/repo/js/参量质变仪/manifest.json +++ b/repo/js/参量质变仪/manifest.json @@ -4,7 +4,7 @@ "version": "1.2", "bgi_version": "0.44.0", "description": "参量质变仪自动化,请注意说明文件,如有BUG请联系作者QQ:119996800", - "tags" : [ "参量质变仪" ], + "tags":["参量质变仪" ], "authors": [ { "name": "LCB-茶包" diff --git a/repo/js/爱可菲厨艺机关/manifest.json b/repo/js/爱可菲厨艺机关/manifest.json index 12bba7a5..1bf62ca0 100644 --- a/repo/js/爱可菲厨艺机关/manifest.json +++ b/repo/js/爱可菲厨艺机关/manifest.json @@ -4,7 +4,7 @@ "version": "1.3", "bgi_version": "0.44.0", "description": "爱可菲厨艺机关自动化,请注意说明文件,如有BUG请联系作者QQ:119996800", - "tags" : [ "爱可菲厨艺机关自动化"], + "tags": ["爱可菲厨艺机关"], "authors": [ { "name": "LCB-茶包"