diff --git a/repo/js/参量质变仪/assets/baikuan.bmp b/repo/js/参量质变仪/assets/baikuan.bmp new file mode 100644 index 00000000..dccb4c21 Binary files /dev/null and b/repo/js/参量质变仪/assets/baikuan.bmp differ diff --git a/repo/js/参量质变仪/assets/bh.bmp b/repo/js/参量质变仪/assets/bh.bmp new file mode 100644 index 00000000..76659a39 Binary files /dev/null and b/repo/js/参量质变仪/assets/bh.bmp differ diff --git a/repo/js/参量质变仪/assets/cai.bmp b/repo/js/参量质变仪/assets/cai.bmp new file mode 100644 index 00000000..4219b7c0 Binary files /dev/null and b/repo/js/参量质变仪/assets/cai.bmp differ diff --git a/repo/js/参量质变仪/assets/cl.bmp b/repo/js/参量质变仪/assets/cl.bmp new file mode 100644 index 00000000..b1a7355c Binary files /dev/null and b/repo/js/参量质变仪/assets/cl.bmp differ diff --git a/repo/js/参量质变仪/assets/jit.bmp b/repo/js/参量质变仪/assets/jit.bmp new file mode 100644 index 00000000..247c1f91 Binary files /dev/null and b/repo/js/参量质变仪/assets/jit.bmp differ diff --git a/repo/js/参量质变仪/assets/jx.bmp b/repo/js/参量质变仪/assets/jx.bmp new file mode 100644 index 00000000..e68004d2 Binary files /dev/null and b/repo/js/参量质变仪/assets/jx.bmp differ diff --git a/repo/js/参量质变仪/assets/mg.bmp b/repo/js/参量质变仪/assets/mg.bmp new file mode 100644 index 00000000..110fd4ba Binary files /dev/null and b/repo/js/参量质变仪/assets/mg.bmp differ diff --git a/repo/js/参量质变仪/assets/nd.bmp b/repo/js/参量质变仪/assets/nd.bmp new file mode 100644 index 00000000..57cc185a Binary files /dev/null and b/repo/js/参量质变仪/assets/nd.bmp differ diff --git a/repo/js/参量质变仪/assets/nj1.bmp b/repo/js/参量质变仪/assets/nj1.bmp new file mode 100644 index 00000000..7648d187 Binary files /dev/null and b/repo/js/参量质变仪/assets/nj1.bmp differ diff --git a/repo/js/参量质变仪/assets/nj2.bmp b/repo/js/参量质变仪/assets/nj2.bmp new file mode 100644 index 00000000..48ca872d Binary files /dev/null and b/repo/js/参量质变仪/assets/nj2.bmp differ diff --git a/repo/js/参量质变仪/assets/nj3.bmp b/repo/js/参量质变仪/assets/nj3.bmp new file mode 100644 index 00000000..ad8d7ae8 Binary files /dev/null and b/repo/js/参量质变仪/assets/nj3.bmp differ diff --git a/repo/js/参量质变仪/assets/qr.bmp b/repo/js/参量质变仪/assets/qr.bmp new file mode 100644 index 00000000..2b998301 Binary files /dev/null and b/repo/js/参量质变仪/assets/qr.bmp differ diff --git a/repo/js/参量质变仪/assets/shuijink.bmp b/repo/js/参量质变仪/assets/shuijink.bmp new file mode 100644 index 00000000..876cfc04 Binary files /dev/null and b/repo/js/参量质变仪/assets/shuijink.bmp differ diff --git a/repo/js/参量质变仪/assets/tth.bmp b/repo/js/参量质变仪/assets/tth.bmp new file mode 100644 index 00000000..06479ae8 Binary files /dev/null and b/repo/js/参量质变仪/assets/tth.bmp differ diff --git a/repo/js/参量质变仪/assets/zhibian.bmp b/repo/js/参量质变仪/assets/zhibian.bmp new file mode 100644 index 00000000..a26732b4 Binary files /dev/null and b/repo/js/参量质变仪/assets/zhibian.bmp differ diff --git a/repo/js/参量质变仪/main.js b/repo/js/参量质变仪/main.js new file mode 100644 index 00000000..b15f9bc1 --- /dev/null +++ b/repo/js/参量质变仪/main.js @@ -0,0 +1,246 @@ +(async function () { + + //初始化配置====================================================================================== + var BH = typeof settings.BH === 'string' && settings.BH.trim() !== '' ? settings.BH : "assets/bh.bmp"; + var ZHIBIANYI = typeof settings.ZHIBIANY === 'string' && settings.ZHIBIANYI.trim() !== '' ? settings.ZHIBIANYI : "assets/zhibian.bmp"; + var actiontime = settings.actiontime != undefined && ~~settings.actiontime > 0 ? ~~settings.actiontime : 50; + var TEAM + const ITEM = settings.ITEM !== undefined ? ( + settings.ITEM === "1养成道具" ? 1 : + settings.ITEM === "2食物" ? 2 : + settings.ITEM === "3材料" ? 3 : + 3 ) : 3; // 如果settings.ITEM完全未定义,也赋予ITEM为3 + + /** + * 文字OCR识别封装函数(测试中,未封装完成,后续会优化逻辑) + * @param text 要识别的文字,默认为"空参数" + * @param timeout 超时时间,单位为秒,默认为10秒 + * @param afterBehavior 点击模式,0表示不点击,1表示点击识别到文字的位置,2表示输出模式,默认为0 + * @param debugmodel 调试代码,0表示输入判断模式,1表示输出位置信息,2表示输出判断模式,默认为0 + * @param x OCR识别区域的起始X坐标,默认为0 + * @param y OCR识别区域的起始Y坐标,默认为0 + * @param w OCR识别区域的宽度,默认为1920 + * @param h OCR识别区域的高度,默认为1080 + * @returns 包含识别结果的对象,包括识别的文字、坐标和是否找到的结果 + */ + async function textOCR(text="空参数",timeout=10,afterBehavior=0,debugmodel=0,x=0,y=0,w=1920,h=1080) { + const startTime = new Date(); + var Outcheak = 0 + for (var ii = 0; ii < 10; ii++) + { + // 获取一张截图 + var captureRegion = captureGameRegion(); + var res1 + var res2 + var conuntcottimecot=1; + var conuntcottimecomp=1; + // 对整个区域进行 OCR + var resList = captureRegion.findMulti(RecognitionObject.ocr(x,y,w,h)); + //log.info("OCR 全区域识别结果数量 {len}", resList.count); + if (resList.count !== 0) { + for (let i = 0; i < resList.count; i++) + { // 遍历的是 C# 的 List 对象,所以要用 count,而不是 length + let res = resList[i]; + res1=res.text + conuntcottimecomp++; + if (res.text.includes(text) && debugmodel !==2 ) { + conuntcottimecot ++; + log.info(`“${res1}”找到`); + if (debugmodel===1 & x===0 & y===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10);}else{log.info("文本OCR完成'{text}'", res.text);} + if (afterBehavior===1){log.info("点击模式:开");await sleep(1000);click(res.x, res.y);}else{if (debugmodel===1 & x===0 & y===0){log.info("点击模式:关")}} + if (afterBehavior===2){log.info("F模式:开");await sleep(100);keyPress("F");}else{if (debugmodel===1 & x===0 & y===0){log.info("F模式:关");}} + if (conuntcottimecot>=conuntcottimecomp/2){return result = { text: res.text, x: res.x, y: res.y, found: true };}else{return result = { found: false};} + } + if (debugmodel ===2 ){ + if (res1 === res2){conuntcottimecot ++;res2=res1;} + log.info("输出模式:全图代码位置:({x},{y},{h},{w},{string})", res.x-10, res.y-10, res.width+10, res.Height+10, res.text); + if (Outcheak===1){ if (conuntcottimecot>=conuntcottimecomp/2){return result = { text: res.text, x: res.x, y: res.y, found: true };}else{return result = { found: false};}} + }}} + const NowTime = new Date(); + if ((NowTime - startTime)>timeout*1000){if (debugmodel===2){ if (resList.count === 0){return result = {found: false};} else{Outcheak=1;ii=2;} } else {Outcheak=0;if (debugmodel===1 & x===0 & y===0){log.info(`${timeout}秒超时退出,"${text}"未找到`)};return result = {found: false };}} + else{ii=2;if (debugmodel===1 & x===0 & y===0){log.info(`"${text}"识别中……`); } } + await sleep(100); + } + } + + /** + * 封装函数,执行图片识别及点击操作(测试中,未封装完成,后续会优化逻辑) + * + * @param filePath 图片路径,默认为"空参数" + * @param timeout 超时时间,单位为秒,默认为10秒 + * @param afterBehavior 点击模式,0为关闭点击,1为开启点击,2为开启F键点击,默认为0 + * @param debugmodel 调试代码模式,0为关闭调试模式,1为开启调试模式,默认为0 + * @param xa 识别区域的x轴偏移量,默认为0 + * @param ya 识别区域的y轴偏移量,默认为0 + * @param wa 识别区域的宽度,默认为1920 + * @param ha 识别区域的高度,默认为1080 + * @returns 返回识别结果,包括图片的x轴坐标、y轴坐标、宽度、高度及是否找到图片 + */ + async function imageRecognition(filePath="空参数",timeout=10,afterBehavior=0,debugmodel=0,xa=0,ya=0,wa=1920,ha=1080) { + const startTime = new Date(); + const Imagidentify = RecognitionObject.TemplateMatch(file.ReadImageMatSync(filePath)); + for (let ii = 0; ii < 10; ii++) { + captureRegion = captureGameRegion(); // 获取一张截图 + res = captureRegion.DeriveCrop(xa, ya, wa, ha).Find(Imagidentify); + if (res.isEmpty()) { + if (debugmodel===1 & xa===0 & ya===0){log.info("识别图片中")}; + } else { + if (afterBehavior===1){log.info("点击模式:开");await sleep(1000);click(res.x, res.y);}else{if (debugmodel===1 & xa===0 & ya===0){log.info("点击模式:关")}} + if (afterBehavior===2){log.info("F模式:开");await sleep(1000);keyPress("F");}else{if (debugmodel===1 & xa===0 & ya===0){log.info("F模式:关")}} + if (debugmodel===1 & xa===0 & ya===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10);}else{ log.info("识别到图片");} + return result = { x: res.x, y: res.y, w:res.width,h:res.Height,found: true } + } + const NowTime = new Date(); + if ((NowTime - startTime)>timeout*1000){if (debugmodel===1 & xa===0 & ya===0){log.info(`${timeout}秒超时退出,未找到图片`);}return result = {found: false };}else{ii=8} + await sleep(200); + } + await sleep(1200); + } + +/**====================================================================================== + * 执行质变仪的部署动作,未找到质变仪时返回false结束,找到质变仪时返回true + */ +async function deployTransformer(){ + + await sleep(500); + await keyPress("B"); + await sleep(1000); + await click(1067,57);//点开背包,可做图像识别优化 + + await textOCR("小道具",3,0,0,126,17,99,53);if (!result.found){throw new Error("未打开'小道具'页面");}//确认在小道具界面 + await sleep(500); + await imageRecognition(ZHIBIANYI,1,1,0);//识别质变仪图片 + if (!result.found){await genshin.returnMainUi();throw new Error("'质变仪CD中'或'未找到质变仪!'");}//没找到质变仪退出流程 + else{await sleep(1000);await click(1699,1004);await sleep(1000);await genshin.returnMainUi();return true} //点击部署操作 + +} + +/**====================================================================================== + * 游戏内“参量质变仪”的放入薄荷交互流程 + */ +async function insertMaterial(){ + + //检测并进入质变仪界面 + await middleButtonClick(); + await sleep(500); + await textOCR("参量质变仪",1,2,0,1205,508,140,53);//单条F检测 + await keyPress("F"); + + //检测是否到达材料页面 + await textOCR("进行质变",3,0,0,1675,994,150,50);if (!result.found){throw new Error("质变仪页面未打开");}//单条F检测 + await sleep(500); + switch (ITEM) { + case 1: + await click(863,47); // 初始化与'1养成道具'相关的设置或资源 + await textOCR("养成道具",3,0,0,120,19,240,50);if (!result.found){throw new Error("'养成道具'页面未打开");} + break; + case 2: + await click(959,45);// 初始化与'2食物'相关的设置或资源 + await textOCR("食物",3,0,0,124,16,93,63);if (!result.found){throw new Error("'食物'页面未打开");} + break; + case 3: + await click(1050,50); // 初始化与'3材料'相关的设置或资源 + await textOCR("材料",3,0,0,124,16,93,63);if (!result.found){throw new Error("'材料'页面未打开");} + break; + default: + // 处理未知ITEM值的情况 + break; + } + + //滚轮预操作 + await moveMouseTo(1287,131); + await sleep(100); + await leftButtonDown(); + await sleep(100); + await moveMouseBy(0,30); + // 薄荷图片检测 + const maxRetries = 8; // 最大重试次数 + let retries = 0; // 当前重试次数 + while (retries < maxRetries) { + await imageRecognition(BH, 1, 0, 0); + if (result.found) { + await leftButtonUp(); + await sleep(500); + await click(result.x,result.y); + await sleep(1000); + await click(440,1008); //选择最大数量 + await sleep(1000); + await click(1792,1019); //质变按钮 + await textOCR("参量质变仪",3,0,0,828,253,265,73);if (!result.found){throw new Error("单种材料不足,退出!");} + await sleep(1000); + await click(1183,764); //确认 ; + await sleep(1000); + await genshin.returnMainUi(); + return true + } + retries++; // 重试次数加1 + //滚轮操作 + await moveMouseBy(0,30); + await sleep(500); + if (retries === maxRetries) { + await leftButtonUp(); + await genshin.returnMainUi(); + throw new Error("未找到材料(默认薄荷,自定义请看'注意使用事项.txt')!");} + } +} + + +/**====================================================================================== + * 执行芭芭拉攻击指令,并等待质变仪完成提示出现。 若超时则强制结束流程。 + */ +async function executeAttack(){ + + await genshin.SwitchParty(TEAM); //切换到指定队伍,必须进行配置,4号位放芭芭拉 + await sleep(1000); + await keyPress("4"); + await sleep(1200); + await middleButtonClick(); + await sleep(1000); + log.info(`攻击动作开始,${actiontime}秒后超时退出!一般20秒左右完成!`) + + var startTime = new Date(); + await sleep(500); + var NowTime = new Date(); + //芭芭拉攻击指令,等待质变仪完成提示出现,若超时则强制结束流程。 + while ((NowTime - startTime)