From 1940bdf0e7868e69eb0e74775f73f851125b517a Mon Sep 17 00:00:00 2001 From: kaedelcb <57870068+kaedelcb@users.noreply.github.com> Date: Tue, 1 Jul 2025 00:17:12 +0800 Subject: [PATCH] =?UTF-8?q?=20v.1.5=E7=89=88=E6=9C=AC=20=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=B9=BD=E5=A2=83=E5=8D=B1=E6=88=98=EF=BC=8820250630=EF=BC=89?= =?UTF-8?q?=20(#1249)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - **新增功能**: 1. 自动战斗失败原地`重试2次`,失败后再退出秘境重试。 - **优化**: 1. 优化`LOG`显示。 2. 优化`完全没有树脂`情况弹窗提示处理。 3. 优化删除拾取`黑名单`文件(0.47.0后不会乱触发了)。 4. 优化各种`异常状态`的退出处理方法。 5. 优化当有须臾树脂时,脆弱树脂不显示时的处理。 --- repo/js/AutoStygianOnslaught/README.md | 14 ++ .../assets/fragile_resin_count.png | Bin 3754 -> 1988 bytes .../assets/moment_resin_count.png | Bin 0 -> 1974 bytes repo/js/AutoStygianOnslaught/assets/one.png | Bin 0 -> 2854 bytes repo/js/AutoStygianOnslaught/main.js | 234 +++++++++++------- repo/js/AutoStygianOnslaught/manifest.json | 2 +- 6 files changed, 159 insertions(+), 91 deletions(-) create mode 100644 repo/js/AutoStygianOnslaught/assets/moment_resin_count.png create mode 100644 repo/js/AutoStygianOnslaught/assets/one.png diff --git a/repo/js/AutoStygianOnslaught/README.md b/repo/js/AutoStygianOnslaught/README.md index 63eae94c..c60357c1 100644 --- a/repo/js/AutoStygianOnslaught/README.md +++ b/repo/js/AutoStygianOnslaught/README.md @@ -82,3 +82,17 @@ 1. 优化`再次挑战`挑战的点击逻辑,添加重试。 2. 优化相关自动拾取代码。 3. 优化`难度选择`和`圣遗物选择`的识别范围。 + + ### v.1.5版本(20250630) + +- **新增功能**: + 1. 自动战斗失败原地`重试2次`,失败后再退出秘境重试。 +- **优化**: + 1. 优化`LOG`显示。 + 2. 优化`完全没有树脂`情况弹窗提示处理。 + 3. 优化删除拾取`黑名单`文件(0.47.0后不会乱触发了)。 + 4. 优化各种`异常状态`的退出处理方法。 + 5. 优化当有须臾树脂时,脆弱树脂不显示时的处理。 + + + diff --git a/repo/js/AutoStygianOnslaught/assets/fragile_resin_count.png b/repo/js/AutoStygianOnslaught/assets/fragile_resin_count.png index e1e4bc012cace5e2d869a5118810901095d71b36..8a000ea84f1484731fd063d97b6a46802b24ece8 100644 GIT binary patch literal 1988 zcmcIleQXnD7(WnD1_+3MOoi+?SPU&*Vi2>X{Ueeri@B4dy z&+qwopFUH$Xx^BD2MZ7c8567sRKa(~zGo=3ik3y~g^_y2qb7oknqdEiATPdLh##R!66J)BpM<)CdZ6BwF-STP?q*LH~3gepP>p)tr)J2mn(w6x~uZ6}1_8L94TT7*skC zLPF2es%AD#FkwWB*9po&+9BnDq0pV7i9{Z4T4igYm#p4f5}V<)4u~pXYITMP%GLta znv!!SiTSg7oe|GODv1P$g9L<`P#BeWrAIYOGo#vV;>d63qtQ9P0eDL@!kQM(6{<4F zg3>T*^x@@-Drre`x~(XC00ejo_%NEJT{y|&3>l_r&P8(!^$6+VNOAxgf_)(I7C$(! zCMj}yFwjtl3#z8Yt0D*nd>9nvP!x#+v`jG~&*C!4x^WNV6mTyfWt^wHg2&~SWSVwn zbiwlhO{}xiXP+NvTS*fkM?OQG$KzsnnUZnF?RMc#kJE_@!0p9Jm&kYohM{SJ&9N;u z6nJy^_|2@gDhV=@Zq_Y&NgfwSkAO>plf?yE066ObZl?%b9;Ym0s3dZ-W+ZsnCrW~k z076$I82XPIzZTbwkS4*LGdHgX{r*Zrla)B!FstU3qQNphOLeMn;SdHUk~h1FY6uizuSG< zXFOE!UO~ge`V&o!GY;c_on1Qf;`-m}n-cdmmYy1MZo}t$pBnk`W_Lx8)%`5lzxCez zBOHxvy@ruyC$@PTKCHR?bw-RD-O3s zF5IA>Ux98qyZGI6>&`SyJKy%n=(h^0TNILR_@z3w_3qw}x>p?<-@HmK-x3~I+BX%L9)r}=x-$eT+v0IeZKJ8jj YbL*?KXSPc49~eP`Ws3s4OIJVnH*(&xI{*Lx literal 3754 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 0) onerewards = resinTypeMap[rewards[0]]; - if (rewards.length > 1) secendrewards = resinTypeMap[rewards[1]]; - if (rewards.length > 2) threendrewards = resinTypeMap[rewards[2]]; - if (rewards.length > 3) fourdrewards = resinTypeMap[rewards[3]]; + if (rewards.length > 0) onerewards = golbalRewards[rewards[0]]; + if (rewards.length > 1) secendrewards = golbalRewards[rewards[1]]; + if (rewards.length > 2) threendrewards = golbalRewards[rewards[2]]; + if (rewards.length > 3) fourdrewards = golbalRewards[rewards[3]]; + const golbalRewardText = [onerewards, secendrewards, threendrewards, fourdrewards].filter(Boolean);// - log.info(`使用树脂类型数量:${rewards.length}`); - log.info(`优先使用的树脂类型:${onerewards} --> ${secendrewards??"无"} --> ${threendrewards??"无"} --> ${fourdrewards??"无"}`); - - const rewardTextRo = RecognitionObject.Ocr(1210, 515, 200, 50);//领奖区域检测 var advanceNum = 0;//前进次数 var verticalNum = 0; + var resinAgain = false; var Artifacts = settings.Artifacts ? settings.Artifacts : "保持圣遗物奖励不变"; @@ -61,8 +60,6 @@ "如雷的盛怒 / 平息鸣雷的尊者": "assets/Artifacts/artifact_18.bmp" }; - - async function Textocr(wenzi="空参数",chaotime=10,clickocr=0,debugcode=0,x=0,y=0,w=1920,h=1080) { const startTime = new Date(); for (let ii = 0; ii < 10; ii++) @@ -80,8 +77,8 @@ if (res.text===wenzi) { log.info(`识别到 ·${res1}·`); if (debugcode===1){if (x===0 & y===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10);return result = { text: res.text, x: res.x, y: res.y, found: true }}}else{if (x===0 & y===0){log.info("文本OCR完成'{text}'", res.text);}} - if (clickocr===1){await sleep(1000);click(res.x, res.y);}else{} - if (clickocr===2){await sleep(100);keyPress("F");}else{} + if (clickocr===1){await sleep(1000);await click(res.x, res.y);}else{} + if (clickocr===2){await sleep(100);await keyPress("F");}else{} return result = { text: res.text, x: res.x, y: res.y, found: true } } if (debugcode===2 && !res.isEmpty()){ @@ -120,17 +117,19 @@ var condensedResin = "assets/condensed_resin_count.png"; var originalResin = "assets/original_resin_count.png"; var fragileResin = "assets/fragile_resin_count.png"; + var momentResin = "assets/moment_resin_count.png"; + var oneResin = "assets/one.png"; async function getRemainResinStatus() { var condensedResinCount = 0; // 浓缩树脂 var originalResinCount = 0; // 原粹树脂 - var fragileResinCount = 0; // 脆弱树脂 - + var fragileResinCount = 0; // 脆弱树脂 + var momentResinCount = 0; // 须臾树脂 var originalResinCountRa = await imageRecognition(originalResin,0.3, 0, 0,1500,0,200,90); if (originalResinCountRa.found) { // await moveMouseTo(originalResinCountRa.x,originalResinCountRa.y); - let countArea = await Textocr("",1, 1, 2,originalResinCountRa.x+originalResinCountRa.w,originalResinCountRa.y,originalResinCountRa.w*3,originalResinCountRa.h);// + let countArea = await Textocr("",1, 0, 2,originalResinCountRa.x+originalResinCountRa.w,originalResinCountRa.y,originalResinCountRa.w*3,originalResinCountRa.h);// if (countArea.found){ log.info("原粹树脂识别数量结果:"+ countArea.text); let match = countArea.text.match(/(\d+)\s*[/1]\s*(2|20|200)/); @@ -138,13 +137,11 @@ originalResinCount = match[1]; // log.info("脆弱树脂识别数量提取:"+ originalResinCount); } - else - { + else{ log.info("原粹树脂识别数量提取失败"); } } - else - { + else{ log.info("原粹树脂识别数量结果::无"); } @@ -156,52 +153,73 @@ var condensedResinCountRa = await imageRecognition(condensedResin,0.1, 0, 0,960,0,800,100); if (condensedResinCountRa.found) { // await moveMouseTo(condensedResinCountRa.x,condensedResinCountRa.y); - let countArea = await Textocr("",0.5, 1, 2,condensedResinCountRa.x+condensedResinCountRa.w,condensedResinCountRa.y,condensedResinCountRa.w,condensedResinCountRa.h);// + let countArea = await Textocr("",0.5, 0, 2,condensedResinCountRa.x+condensedResinCountRa.w,condensedResinCountRa.y,condensedResinCountRa.w,condensedResinCountRa.h);// if (countArea.found){ // log.info("浓缩树脂识别数量结果: "+ countArea.text); condensedResinCount = countArea.text } - else - { + else{ condensedResinCount = "1"; - log.info("浓缩树脂识别数量结果:1");//1无法识别,0是不显示图标的,所以就当时1了,反正也没啥影响 + log.info("浓缩树脂识别数量结果:1");//不知道为什么,1无法识别,0是不显示图标的,所以就当时1了,反正也没啥影响 } } else { log.info("未检测到浓缩树脂图标"); - } + } - - - var fragileResinCountRa = await imageRecognition(fragileResin,0.1, 0, 1,1170,0,350,100); - if (fragileResinCountRa.found) { - // await moveMouseTo(fragileResinCountRa.x,fragileResinCountRa.y); - let countArea = await Textocr("",1, 1, 2,fragileResinCountRa.x+fragileResinCountRa.w,fragileResinCountRa.y,fragileResinCountRa.w*2,fragileResinCountRa.h);// + var momentResinCountRa = await imageRecognition(momentResin,0.1, 0, 1,1170,0,350,100); + if (momentResinCountRa.found) { + // await moveMouseTo(momentResinCountRa.x+momentResinCountRa.w+15+momentResinCountRa.w+50,momentResinCountRa.y-15+momentResinCountRa.h+25); + let countArea = await Textocr("",0.5, 0, 2,momentResinCountRa.x+momentResinCountRa.w+15,momentResinCountRa.y-15,momentResinCountRa.w+50,momentResinCountRa.h+25);// if (countArea.found){ - // log.info("脆弱树脂识别数量结果:"+ countArea.text); - fragileResinCount = countArea.text + //log.info("须臾树脂识别数量结果:"+ countArea.text); + momentResinCount = countArea.text } - else - { - log.info("脆弱树脂识别数量结果::无"); - + else{ + var oneRa = await imageRecognition(oneResin,0.1, 0, 1,momentResinCountRa.x+momentResinCountRa.w+15,momentResinCountRa.y-15,momentResinCountRa.w+50,momentResinCountRa.h+25); + if (oneRa.found){ + momentResinCount = "1"; + }else{ + log.info("须臾树脂强制为 1 "); + momentResinCount = "1"; + } + } + log.info("脆弱树脂强制为 1 ");//须臾树脂出现,脆弱树脂不显示,强制设置为1,情况非常少,大不了打多一次 + fragileResinCount = "1"; + }else + { + var fragileResinCountRa = await imageRecognition(fragileResin,0.1, 0, 1,1170,0,350,100); + if (fragileResinCountRa.found) { + // await moveMouseTo(fragileResinCountRa.x,fragileResinCountRa.y); + let countArea = await Textocr("",0.5, 0, 2,fragileResinCountRa.x+fragileResinCountRa.w+15,fragileResinCountRa.y-15,fragileResinCountRa.w+50,fragileResinCountRa.h+25);// + if (countArea.found){ + // log.info("脆弱树脂识别数量结果:"+ countArea.text); + fragileResinCount = countArea.text + } + else{ + var oneRa = await imageRecognition(oneResin,0.1, 0, 1,fragileResinCountRa.x+fragileResinCountRa.w+15,fragileResinCountRa.y-15,fragileResinCountRa.w+50,fragileResinCountRa.h+25); + if (oneRa.found){ + fragileResinCount = "1"; + }else{ + fragileResinCount = "1"; + log.info("脆弱树脂识别强制为 1 ");//有图标说明至少为1 + } + } + } + else { + log.info("未检测到脆弱树脂图标"); } - - } else { - log.info("未检测到脆弱树脂图标"); } - log.info("树脂状态:浓缩{0} 原粹{1} 脆弱{2} ", condensedResinCount, originalResinCount, fragileResinCount) - return {condensedResinCount,originalResinCount,fragileResinCount} + log.info("树脂状态:浓缩{0} 原粹{1} 脆弱{2} 须臾{3}", condensedResinCount, originalResinCount, fragileResinCount,momentResinCount) + return {condensedResinCount,originalResinCount,fragileResinCount,momentResinCount} } - //征讨之花领奖 const autoNavigateToReward = async () => { // 定义识别对象 const boxIconRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/box.png")); - const rewardTextRo = RecognitionObject.Ocr(1210, 515, 200, 50);//领奖区域检测 - + advanceNum = 0;//前进次数 //调整为俯视视野 middleButtonClick(); @@ -312,8 +330,8 @@ logFightResult = fightResult ? "成功" : "失败"; log.info(`战斗结束,战斗结果:${logFightResult}`); cts.cancel(); - return fightResult;} - + return fightResult; + } async function recognizeTextInRegion(timeout) { return new Promise((resolve, reject) => { @@ -462,7 +480,7 @@ log.info(` ${resinTypeMap[rewards[i]]} 获取奖励...`); await Textocr("锁定辅助",10,0,0,1768,0,115,90); - let { condensedResinCount, originalResinCount, fragileResinCount } = await getRemainResinStatus(); + let { condensedResinCount, originalResinCount, fragileResinCount , momentResinCount} = await getRemainResinStatus(); let shouldExit = true; if (resinTypes.includes("1")) @@ -476,7 +494,12 @@ if (resinTypes.includes("3")) { shouldExit &= (parseInt(fragileResinCount, 10) == 0); - } + } + if (resinTypes.includes("4")) + { + shouldExit &= (parseInt(momentResinCount, 10) == 0); + } + if (shouldExit) { log.warn("树脂耗尽,停止执行..."); @@ -520,16 +543,15 @@ } } } - } - - var resinAgain = false; - log.warn("自动幽境危战版本:v1.4"); - log.warn("根目录下有建议加的黑名单的名称,建议加入自动 <<拾取黑名单>> ..."); - log.warn("请保证队伍战斗实力,战斗失败或执行错误,会重试一次..."); + } + + log.warn("自动幽境危战版本:v1.5"); + log.warn("请保证队伍战斗实力,战斗失败或执行错误,会重试两次..."); log.warn("使用前请在 <<幽境危战>> 中配置好战斗队伍..."); - log.warn("最好关闭自动拾取功能..."); - log.info(`圣遗物奖励选择:'${Artifacts}'`); - + log.info("使用树脂类型数量:{0} ", rewards.length) + log.info(`使用树脂顺序:${golbalRewardText.join(" ->")}`); + log.info("圣遗物奖励选择:{0} ", Artifacts) + //重试两次 for (let j = 0;j < 2;j++) { @@ -569,11 +591,11 @@ let artifact = await imageRecognition(artifactImageMap[Artifacts],0.2,0,0,186,972,71,71); if (!artifact.found) { log.warn("圣遗物奖励和设定不一致,尝试切换...") - if (!await selectionHolyRelics()){throw new Error("圣遗物奖励设置错误,停止执行...")} + if (!await selectionHolyRelics()){await genshin.returnMainUi();throw new Error("圣遗物奖励设置错误,停止执行...")} } else - { - log.warn("圣遗物奖励一致,无需切换...") + { + log.warn("圣遗物奖励一致,无需切换 {0} ", Artifacts) } } @@ -592,7 +614,7 @@ await sleep(1000); //选择挑战怪兽 - log.info(`选择挑战Boss:'${challengeName}' 挑战次数:'${challengeNum}'`); + log.info("选择挑战Boss:'{0}' 挑战次数:'{1}'", challengeName,challengeNum) log.info(`期间树脂耗尽会自动退出秘境...`); switch (challengeName) { @@ -618,32 +640,56 @@ //开始战斗循环 for (let i = 0;i < challengeNum; i++) { - //进入秘境 - let battleBegins = await Textocr("战斗开始",20,0,0,877,235,164,50); - if (!battleBegins.found){await genshin.returnMainUi();throw new Error("未进入战斗环境,停止执行...")}//退出待写 - - log.info(`进入战斗环境,开始第 ${i+1} 次战斗`); + //进入秘境 + log.info("进入战斗环境,开始第 {0} 次战斗", i+1) - await keyDown("w"); - await sleep(Startforward); - await keyUp("w"); + for (let fightCount = 0; fightCount < 3; fightCount++) { - try { - if(!await autoFight(Fighttimeout)){ - log.warn("战斗失败,退出秘境..."); - await sleep(1000); + let battleBegins = await Textocr("战斗开始",20,0,0,877,235,164,50); + if (!battleBegins.found){ await keyPress("VK_ESCAPE"); - await sleep(1000); - await keyPress("VK_ESCAPE"); - await sleep(1000); - let exitChallenge = await Textocr("退出挑战",2,1,0,866,719,274,86); await sleep(1000); - throw new Error("战斗失败,停止执行..."); + await keyPress("VK_ESCAPE"); + await sleep(1000); + let exitChallenge = await Textocr("退出挑战",5,1,0,866,719,274,86); + await sleep(1000); + throw new Error("未进入战斗环境,停止执行...") + } + + try { + await keyDown("w"); + await sleep(Startforward); + await keyUp("w"); + + if(!await autoFight(Fighttimeout)){ + + resinAgain = true; + + if (fightCount >= 2){ + await sleep(1000); + await keyPress("VK_ESCAPE"); + await sleep(1000); + break; + } + else + { + let Again = await Textocr("再次挑战",10,1,0,1059,920,177,65); + if (!Again.found)break; + await sleep(1000); + log.warn("战斗失败,第 {0} 次重试...", fightCount+1) + throw new Error(`战斗失败,第 ${fightCount+1} 次重试...`) + } + + }else + { + resinAgain= false; + break; + } + } catch (error) { + if (fightCount < 2)continue; + else break; } - } catch (error) { - resinAgain = true; - if (j==0)log.info(`挑战失败,再来一次...`); - } + } if (resinAgain != true) { @@ -657,14 +703,13 @@ await sleep(1000); } - log.info(`第 ${i+1} 次领奖`); + log.info("幽境危战:第 {0} 次领奖...", i+1) if(!(await autoNavigateToReward())){verticalNum++;continue;} await sleep(1000); - if (!(await claimRewards())) { - log.warn("树脂消耗完毕,结束任务"); + if (!(await claimRewards())) { resinexhaustion = true; } else @@ -672,7 +717,15 @@ if (challengeNum != i+1) { let challengeAgian = await Textocr("再次挑战",10,0,0,1094,958,200,70); - if (!challengeAgian.found){await genshin.returnMainUi();throw new Error("未找到·再次挑战·按键,停止执行...")}//退出待写 + if (!challengeAgian.found){ + await keyPress("VK_ESCAPE"); + await sleep(1000); + await keyPress("VK_ESCAPE"); + await sleep(1000); + let exitChallenge = await Textocr("退出挑战",5,1,0,866,719,274,86); + await sleep(1000); + throw new Error("未找到·再次挑战·按键,停止执行...") + } for (let retry = 0; retry < 5 && challengeAgian.found; retry++) { challengeAgian = await Textocr("再次挑战",0.2,0,0,1094,958,200,70); @@ -688,7 +741,7 @@ await sleep(1000); await keyPress("VK_ESCAPE"); await sleep(200); - log.info(`树脂提升已耗尽,...`); + log.info(`树脂提示已耗尽,...`); resinexhaustion = true; } } @@ -696,8 +749,9 @@ } //是否继续 - if (challengeNum == i+1 || resinexhaustion == true){ - log.info (`完成 ${i+1} 次战斗或树脂耗尽,退出挑战...`); + if (challengeNum == i+1 || resinexhaustion == true || resinAgain == true ){ + log.info(resinAgain ? "累计战斗失败 3 次,退出秘境..." + : (challengeNum == i+1) ? `完成 ${i+1}/${challengeNum} 次战斗,退出挑战...`: `树脂耗尽,退出挑战...`); await sleep(1000); await keyPress("VK_ESCAPE"); await sleep(1000); @@ -719,7 +773,7 @@ exitTimeout++; } await genshin.returnMainUi(); - if (resinAgain == true){throw new Error("执行错误,重试一次...")} + if (resinAgain == true){throw new Error("执行重试错误...")} return true; } diff --git a/repo/js/AutoStygianOnslaught/manifest.json b/repo/js/AutoStygianOnslaught/manifest.json index ba4d2706..112b135d 100644 --- a/repo/js/AutoStygianOnslaught/manifest.json +++ b/repo/js/AutoStygianOnslaught/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "自动幽境危战", - "version": "1.4", + "version": "1.5", "tags": ["幽境危战"], "bgi_version": "0.44.8", "description": "请先配置好秘境内的队伍,幽境危战战斗失败或执行错误会重试一次,请保证队伍实力",