From fa4e9b63e4cfbff7520d131d19e3375f9cb5d8d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E7=AB=AF=E5=AE=A2?= <107686912+Kirito520Asuna@users.noreply.github.com> Date: Wed, 24 Dec 2025 11:16:44 +0800 Subject: [PATCH] =?UTF-8?q?feat(resin):=20=E4=BC=98=E5=8C=96=E6=A0=91?= =?UTF-8?q?=E8=84=82=E6=95=B0=E9=87=8F=E7=BB=9F=E8=AE=A1=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20(#2555)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改countOriginalResin函数增加openMap参数支持 - 添加优化模式日志输出和错误处理 - 调整游戏界面操作流程,先返回主界面再打开地图 - 重构树脂统计逻辑,区分补充树脂界面和地图界面统计 - 修复physical.js中的区域识别错误 - 移除不必要的ESC键操作 - 添加统计流程的详细日志记录 --- .../utils/calCountByResin.js | 56 ++++++++++--------- repo/js/AutoLeyLineOutcrop/utils/physical.js | 13 +++-- 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/repo/js/AutoLeyLineOutcrop/utils/calCountByResin.js b/repo/js/AutoLeyLineOutcrop/utils/calCountByResin.js index e67a397d4..33d2a2d96 100644 --- a/repo/js/AutoLeyLineOutcrop/utils/calCountByResin.js +++ b/repo/js/AutoLeyLineOutcrop/utils/calCountByResin.js @@ -205,16 +205,18 @@ async function recognizeNumberByOCR(ocrRegion, pattern) { * 统计原粹树脂数量 * @returns {number} 原粹树脂数量 */ -async function countOriginalResin(tryOriginalMode,opToMainUi) { +async function countOriginalResin(tryOriginalMode,opToMainUi,openMap) { if (tryOriginalMode) { log.info("尝试使用原始模式"); return await countOriginalResinBackup() } else { - let ocrPhysical = await physical.ocrPhysical(opToMainUi); + log.info('尝试使用优化模式'); + let ocrPhysical = await physical.ocrPhysical(opToMainUi,openMap); await sleep(600) if (ocrPhysical && ocrPhysical.ok) { return ocrPhysical.remainder; } else { + log.error(`ocrPhysical error`); throw new Error("ocrPhysical error"); } } @@ -457,43 +459,47 @@ this.countAllResin = async function () { setGameMetrics(1920, 1080, 1); log.info("开始统计树脂数量"); - // 返回主界面 - let toMainUi=true - // await genshin.returnMainUi(); - // await sleep(CONFIG.UI_DELAY); - - let tryPass = true; - try { - resinCounts.original = await countOriginalResin(false,toMainUi); - } catch (e) { - tryPass = false - } + await genshin.returnMainUi(); await sleep(CONFIG.UI_DELAY); // 打开地图界面统计原粹/浓缩树脂 await openMap(); await sleep(CONFIG.UI_DELAY); + let tryPass = true; + try { + log.info("[开始]统计补充树脂界面中的树脂"); + resinCounts.original = await countOriginalResin(false,false); + moveMouseTo(CONFIG.COORDINATES.AVOID_SELECTION.x, CONFIG.COORDINATES.AVOID_SELECTION.y) + await sleep(500); + resinCounts.transient = await countTransientResin(); + resinCounts.fragile = await countFragileResin(); + log.info("[完成]统计补充树脂界面中的树脂"); + // 点击避免选中效果影响统计 + click(CONFIG.COORDINATES.AVOID_SELECTION.x, CONFIG.COORDINATES.AVOID_SELECTION.y); + } catch (e) { + tryPass = false + } + await sleep(CONFIG.UI_DELAY); log.info("开始统计地图界面中的树脂"); - if (!tryPass){ // 如果第一次尝试失败,则切换到蒙德 await switchtoCountrySelection(CONFIG.COORDINATES.MONDSTADT.x, CONFIG.COORDINATES.MONDSTADT.y) resinCounts.original = await countOriginalResin(!tryPass); } resinCounts.condensed = await countCondensedResin(); + if (!tryPass) { + // 打开补充树脂界面统计须臾/脆弱树脂 + await openReplenishResinUi(); + await sleep(CONFIG.UI_DELAY); - // 打开补充树脂界面统计须臾/脆弱树脂 - await openReplenishResinUi(); - await sleep(CONFIG.UI_DELAY); - - // 点击避免选中效果影响统计 - click(CONFIG.COORDINATES.AVOID_SELECTION.x, CONFIG.COORDINATES.AVOID_SELECTION.y); - await sleep(500); - - log.info("开始统计补充树脂界面中的树脂"); - resinCounts.transient = await countTransientResin(); - resinCounts.fragile = await countFragileResin(); + // 点击避免选中效果影响统计 + click(CONFIG.COORDINATES.AVOID_SELECTION.x, CONFIG.COORDINATES.AVOID_SELECTION.y); + await sleep(500); + log.info("开始统计补充树脂界面中的树脂"); + resinCounts.transient = await countTransientResin(); + resinCounts.fragile = await countFragileResin(); + } // 显示结果 displayResults(resinCounts); diff --git a/repo/js/AutoLeyLineOutcrop/utils/physical.js b/repo/js/AutoLeyLineOutcrop/utils/physical.js index c59db88f6..45abf8ffd 100644 --- a/repo/js/AutoLeyLineOutcrop/utils/physical.js +++ b/repo/js/AutoLeyLineOutcrop/utils/physical.js @@ -62,7 +62,7 @@ async function saveOnlyNumber(str) { * - min {number}: 最小可执行体力值 * - remainder {number}: 当前剩余体力值 */ -async function ocrPhysical(opToMainUi = false) { +async function ocrPhysical(opToMainUi = false,openMap=false) { // 检查是否启用体力识别功能,如果未启用则直接返回默认结果 if (!settings.isResinExhaustionMode) { log.info(`===未启用===`) @@ -79,8 +79,10 @@ async function ocrPhysical(opToMainUi = false) { } //设置最小可执行体力值 let minPhysical = MinPhysical - //打开地图界面 - await keyPress('M') + if (openMap){ + //打开地图界面 + await keyPress('M') + } await sleep(ms) log.debug(`===[点击+]===`) //点击+ 按钮 x=1264,y=39,width=18,height=19 @@ -95,7 +97,7 @@ async function ocrPhysical(opToMainUi = false) { let templateMatchAddButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(`${add_objJson.path}`), add_objJson.x, add_objJson.y, add_objJson.width, add_objJson.height); let regionA = captureGameRegion() // let buttonA = captureGameRegion().find(templateMatchAddButtonRo); - let buttonA = region.find(templateMatchAddButtonRo); + let buttonA = regionA.find(templateMatchAddButtonRo); regionA.Dispose() await sleep(ms) @@ -178,7 +180,7 @@ async function ocrPhysical(opToMainUi = false) { let execute = (remainder - minPhysical) >= 0 log.info(`最小可执行原粹树脂:{min},原粹树脂:{key}`, minPhysical, remainder,) - await keyPress('VK_ESCAPE') + // await keyPress('VK_ESCAPE') return { ok: execute, min: minPhysical, @@ -187,6 +189,7 @@ async function ocrPhysical(opToMainUi = false) { } catch (e) { throwError(`识别失败,err:${e.message}`) } finally { + //返回地图操作 if (opToMainUi) { await toMainUi(); // 切换到主界面 }