diff --git a/repo/js/AutoArtifactsPro/README.md b/repo/js/AutoArtifactsPro/README.md index 18365a6b..8f625897 100644 --- a/repo/js/AutoArtifactsPro/README.md +++ b/repo/js/AutoArtifactsPro/README.md @@ -171,7 +171,8 @@ https://www.kdocs.cn/wo/sl/v13uXscL ## 更新日志 - +### 1.6.0(2025.07.16) +1.新增摧毁换取摩拉的选项和沿途分解选项 ### 1.5.9(2025.07.15) 1.微调(激活大炮第二炮掉出影响/204卡木条/216避开穷点/224避开书本/302微调/405微调/407微调/428微调/605微调) ### 1.5.7(2025.07.13) diff --git a/repo/js/AutoArtifactsPro/assets/RecognitionObject/ArtifactsButton.png b/repo/js/AutoArtifactsPro/assets/RecognitionObject/ArtifactsButton.png new file mode 100644 index 00000000..0f0f79f3 Binary files /dev/null and b/repo/js/AutoArtifactsPro/assets/RecognitionObject/ArtifactsButton.png differ diff --git a/repo/js/AutoArtifactsPro/assets/RecognitionObject/AutoAddButton.png b/repo/js/AutoArtifactsPro/assets/RecognitionObject/AutoAddButton.png new file mode 100644 index 00000000..3d2fbfc7 Binary files /dev/null and b/repo/js/AutoArtifactsPro/assets/RecognitionObject/AutoAddButton.png differ diff --git a/repo/js/AutoArtifactsPro/assets/RecognitionObject/ConfirmButton.png b/repo/js/AutoArtifactsPro/assets/RecognitionObject/ConfirmButton.png new file mode 100644 index 00000000..78d72f29 Binary files /dev/null and b/repo/js/AutoArtifactsPro/assets/RecognitionObject/ConfirmButton.png differ diff --git a/repo/js/AutoArtifactsPro/assets/RecognitionObject/DeleteButton.png b/repo/js/AutoArtifactsPro/assets/RecognitionObject/DeleteButton.png new file mode 100644 index 00000000..ea48c70d Binary files /dev/null and b/repo/js/AutoArtifactsPro/assets/RecognitionObject/DeleteButton.png differ diff --git a/repo/js/AutoArtifactsPro/assets/RecognitionObject/DestoryButton.png b/repo/js/AutoArtifactsPro/assets/RecognitionObject/DestoryButton.png new file mode 100644 index 00000000..1bff592c Binary files /dev/null and b/repo/js/AutoArtifactsPro/assets/RecognitionObject/DestoryButton.png differ diff --git a/repo/js/AutoArtifactsPro/main.js b/repo/js/AutoArtifactsPro/main.js index 7bc87d27..4b8756a5 100644 --- a/repo/js/AutoArtifactsPro/main.js +++ b/repo/js/AutoArtifactsPro/main.js @@ -9,6 +9,9 @@ let finished = false; const accountName = settings.accountName || "默认账户"; let version = "default"; let runnedToday = false; +let artifactExperienceDiff = 0; +let moraDiff = 0; +let pathIndex = 0; //预处理 const minIntervalTime = settings.minIntervalTime || "5"; @@ -20,6 +23,7 @@ const runActivatePath = settings.runActivatePath || false; let enemyType = "无"; (async function () { + setGameMetrics(1920, 1080, 1); //伪造js结束记录 await fakeLog("自动狗粮重制版", true, true, 0); @@ -370,8 +374,12 @@ let enemyType = "无"; } //运行前按自定义配置清理狗粮 - const result1 = await decomposeArtifacts(settings.keep4Star, settings.doDecompose); - + if (settings.decomposeMode === "分解(经验瓶)") { + await processArtifacts(21); + } else { + artifactExperienceDiff -= await processArtifacts(21); + } + moraDiff -= await mora(); artifacts: { if (runnedToday && finished) { break artifacts; @@ -379,19 +387,9 @@ let enemyType = "无"; // 开始运行狗粮路线 let runArtifactsResult = true; - runArtifactsResult = await runArtifactsPaths(runRouteA, grindPartyName, settings.useABE); - const result2 = await decomposeArtifacts(settings.keep4Star, settings.doDecompose); - // 计算 mora 和 artifactExperience 的差值 - const moraDiff = Number(result2.mora) - Number(result1.mora); // 将字符串转换为数字后计算差值 - let artifactExperienceDiff; - if (!settings.doDecompose) { - artifactExperienceDiff = result2.artifactExperience - result1.artifactExperience; - } else { - artifactExperienceDiff = result2.artifactExperience; - } - - + artifactExperienceDiff += await processArtifacts(21); + moraDiff += await mora(); log.info(`狗粮路线获取摩拉: ${moraDiff}`); log.info(`狗粮路线获取狗粮经验: ${artifactExperienceDiff}`); @@ -503,6 +501,10 @@ async function runArtifactsPaths(runRouteA, grindPartyName, useABE) { // 执行地图追踪文件 for (const fileName of jsonFilePaths) { + pathIndex++; + if ((pathIndex % 5 === 0) && settings.autoSalvage && settings.decomposeMode != "保留") { + artifactExperienceDiff += await processArtifacts(1); + } const fullPath = fileName; await fakeLog(fileName, false, true, 0); currentTask += 1; // 更新当前任务计数器 @@ -934,12 +936,6 @@ function validateTimeoutSetting(value, defaultValue, timeoutType) { return timeout; } -// 定义替换映射表 -const replacementMap = { - "监": "盐", - "卵": "卯" -}; - // 定义所有图标的图像识别对象,每个图片都有自己的识别区域 let CharacterMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/CharacterMenu.png"), 60, 991, 38, 38); @@ -974,12 +970,7 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 3000) { let resList = captureGameRegion().findMulti(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); // 指定识别区域 // 遍历识别结果,检查是否找到目标文本 for (let res of resList) { - // 后处理:根据替换映射表检查和替换错误识别的字符 let correctedText = res.text; - for (let [wrongChar, correctChar] of Object.entries(replacementMap)) { - correctedText = correctedText.replace(new RegExp(wrongChar, 'g'), correctChar); - } - if (correctedText.includes(targetText)) { // 如果找到目标文本,计算并点击文字的中心坐标 let centerX = Math.round(res.x + res.width / 2); @@ -1024,7 +1015,7 @@ async function recognizeTextInRegion(ocrRegion, timeout = 5000) { } } catch (error) { retryCount++; // 增加重试计数 - log.warn(`OCR 摩拉数识别失败,正在进行第 ${retryCount} 次重试...`); + log.warn(`OCR 识别失败,正在进行第 ${retryCount} 次重试...`); } await sleep(500); // 短暂延迟,避免过快循环 } @@ -1032,59 +1023,7 @@ async function recognizeTextInRegion(ocrRegion, timeout = 5000) { return null; // 如果未识别到文字,返回 null } -async function decomposeArtifacts(keep4Star, doDecompose) { - setGameMetrics(1920, 1080, 1); - await genshin.returnMainUi(); - - // 按下 C 键 - keyPress("C"); - await sleep(1500); - - let recognized = false; - - // 识别“角色菜单”图标或“天赋”文字 - let startTime = Date.now(); - while (Date.now() - startTime < 5000) { - // 尝试识别“角色菜单”图标 - let characterMenuResult = await recognizeImage(CharacterMenuRo, 5000); - if (characterMenuResult.success) { - await click(177, 433); - await sleep(500); - recognized = true; - break; - } - - // 尝试识别“天赋”文字 - let targetText = "天赋"; - let ocrRegion = { x: 133, y: 395, width: 115, height: 70 }; // 设置对应的识别区域 - let talentResult = await recognizeTextAndClick(targetText, ocrRegion); - if (talentResult.success) { - log.info(`点击天赋文字,坐标: x=${talentResult.x}, y=${talentResult.y}`); - recognized = true; - break; - } - - await sleep(1000); // 短暂延迟,避免过快循环 - } - - let recognizedText = ""; - - // 如果识别到了“角色菜单”或“天赋”,则识别“摩拉数值” - if (recognized) { - let ocrRegionMora = { x: 1620, y: 25, width: 152, height: 46 }; // 设置对应的识别区域 - recognizedText = await recognizeTextInRegion(ocrRegionMora); - if (recognizedText) { - log.info(`成功识别到摩拉数值: ${recognizedText}`); - - } else { - log.warn("未能识别到摩拉数值。"); - } - } else { - log.warn("未能识别到角色菜单或天赋,跳过摩拉数值识别。"); - } - await sleep(500); - await genshin.returnMainUi(); - +async function decomposeArtifacts() { keyPress("B"); await sleep(1000); await click(670, 45); @@ -1109,7 +1048,7 @@ async function decomposeArtifacts(keep4Star, doDecompose) { let firstNumber = 0; let firstNumber2 = 0; - if (keep4Star) { + if (settings.keep4Star) { await recognizeTextAndClick("快速选择", { x: 248, y: 996, width: 121, height: 49 }); moveMouseTo(960, 540); await sleep(1000); @@ -1140,7 +1079,7 @@ async function decomposeArtifacts(keep4Star, doDecompose) { moveMouseTo(960, 540); await sleep(1000); - if (keep4Star) { + if (settings.keep4Star) { await click(370, 370);//取消选择四星 await sleep(1000); } @@ -1172,7 +1111,7 @@ async function decomposeArtifacts(keep4Star, doDecompose) { log.warn(`在指定区域未识别到有效数字: ${newValue}`); } - if (doDecompose) { + if (settings.decomposeMode === "分解(经验瓶)") { log.info(`用户选择了分解,执行分解`); // 根据用户配置,分解狗粮 await sleep(1000); @@ -1203,12 +1142,136 @@ async function decomposeArtifacts(keep4Star, doDecompose) { if (resultExperience === 0) { resultExperience = initialValue; } - const result = { - mora: recognizedText, // 将 recognizedText 赋值给 mora - artifactExperience: resultExperience, - fourStarNum: fourStarNum - }; + const result = resultExperience; await genshin.returnMainUi(); return result; } +/** + * 摧毁圣遗物换摩拉 + */ +async function destroyArtifacts(times = 1) { + const ArtifactsButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/ArtifactsButton.png")); + const DeleteButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/DeleteButton.png")); + const AutoAddButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/AutoAddButton.png")); + const ConfirmButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/ConfirmButton.png")); + const DestoryButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/DestoryButton.png")); + const MidDestoryButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/DestoryButton.png"), 900, 600, 500, 300); + await genshin.returnMainUi(); + keyPress("B"); + await sleep(1500); + + let ArtifactsButton = captureGameRegion().find(ArtifactsButtonRo); + if (ArtifactsButton.isExist()) { + log.info("识别到圣遗物按钮"); + ArtifactsButton.click(); + await sleep(1500); + } + + try { + for (let i = 0; i < times; i++) { + captureGameRegion().find(DeleteButtonRo).click();// 点击摧毁 + await sleep(600); + captureGameRegion().find(AutoAddButtonRo).click();// 点击自动添加 + await sleep(600); + await sleep(300); + click(150, 150); + await sleep(300); + click(150, 220); + await sleep(300); + click(150, 300); + if (!settings.keep4Star) { + await sleep(300); + click(150, 370); + } + captureGameRegion().find(ConfirmButtonRo).click();// 点击快捷放入 + await sleep(600); + captureGameRegion().find(DestoryButtonRo).click();// 点击摧毁 + await sleep(600); + captureGameRegion().find(MidDestoryButtonRo).click();// 弹出页面点击摧毁 + await sleep(600); + click(960, 1000);// 点击空白处 + await sleep(1000); + } + } catch (ex) { + log.info("背包里的圣遗物已摧毁完毕,提前结束") + } finally { + await genshin.returnMainUi(); + } + +} + +async function processArtifacts(times = 1) { + await genshin.returnMainUi(); + let result = 0; + try { + if (settings.decomposeMode === "销毁(摩拉)") { + result = await destroyArtifacts(times); + } else { + result = await decomposeArtifacts(); + } + } catch (error) { + log.error(`处理狗粮分解时发生异常: ${error.message}`); + } + await genshin.returnMainUi(); + return result; +} + +async function mora() { + let result = 0; + let tryTimes = 0; + while (result = 0 && tryTimes < 3) { + await genshin.returnMainUi(); + + // 按下 C 键 + keyPress("C"); + await sleep(1500); + + let recognized = false; + + // 识别“角色菜单”图标或“天赋”文字 + let startTime = Date.now(); + while (Date.now() - startTime < 5000) { + // 尝试识别“角色菜单”图标 + let characterMenuResult = await recognizeImage(CharacterMenuRo, 5000); + if (characterMenuResult.success) { + await click(177, 433); + await sleep(500); + recognized = true; + break; + } + + // 尝试识别“天赋”文字 + let targetText = "天赋"; + let ocrRegion = { x: 133, y: 395, width: 115, height: 70 }; // 设置对应的识别区域 + let talentResult = await recognizeTextAndClick(targetText, ocrRegion); + if (talentResult.success) { + log.info(`点击天赋文字,坐标: x=${talentResult.x}, y=${talentResult.y}`); + recognized = true; + break; + } + + await sleep(1000); // 短暂延迟,避免过快循环 + } + + let recognizedText = ""; + + // 如果识别到了“角色菜单”或“天赋”,则识别“摩拉数值” + if (recognized) { + let ocrRegionMora = { x: 1620, y: 25, width: 152, height: 46 }; // 设置对应的识别区域 + recognizedText = await recognizeTextInRegion(ocrRegionMora); + if (recognizedText) { + log.info(`成功识别到摩拉数值: ${recognizedText}`); + result = recognizedText; + } else { + log.warn("未能识别到摩拉数值。"); + } + } else { + log.warn("未能识别到角色菜单或天赋"); + } + await sleep(500); + tryTimes++; + await genshin.returnMainUi(); + } + return Number(result); +} \ No newline at end of file diff --git a/repo/js/AutoArtifactsPro/manifest.json b/repo/js/AutoArtifactsPro/manifest.json index ed014b53..745e0670 100644 --- a/repo/js/AutoArtifactsPro/manifest.json +++ b/repo/js/AutoArtifactsPro/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "自动狗粮重制版", - "version": "1.5.9", + "version": "1.6.0", "tags": [ "好感", "狗粮" diff --git a/repo/js/AutoArtifactsPro/settings.json b/repo/js/AutoArtifactsPro/settings.json index dca90240..a7dafbec 100644 --- a/repo/js/AutoArtifactsPro/settings.json +++ b/repo/js/AutoArtifactsPro/settings.json @@ -15,7 +15,7 @@ { "name": "runActivatePath", "type": "checkbox", - "label": "是否启用激活路线,启用后将先花费约3分钟激活狗粮点\n启用该选项后可提高稳定性,并允许中断后重新运行和极大降低最短间隔时间" + "label": "是否启用激活路线,启用后将先花费约5分钟激活狗粮点\n启用该选项后可提高稳定性,并允许极大降低最短间隔时间" }, { "name": "useABE", @@ -47,15 +47,26 @@ "default": "狗粮" }, { - "name": "doDecompose", - "type": "checkbox", - "label": "是否分解狗粮(默认不分解)" + "name": "decomposeMode", + "type": "select", + "label": "狗粮分解模式", + "options": [ + "保留", + "分解(经验瓶)", + "销毁(摩拉)" + ], + "default": "保留" }, { "name": "keep4Star", "type": "checkbox", "label": "是否保留四星(默认不保留)" }, + { + "name": "autoSalvage", + "type": "checkbox", + "label": "是否沿路自动分解(默认:否)" + }, { "name": "minIntervalTime", "type": "input-text",