feat(resin): 优化树脂数量统计功能 (#2555)

- 修改countOriginalResin函数增加openMap参数支持
- 添加优化模式日志输出和错误处理
- 调整游戏界面操作流程,先返回主界面再打开地图
- 重构树脂统计逻辑,区分补充树脂界面和地图界面统计
- 修复physical.js中的区域识别错误
- 移除不必要的ESC键操作
- 添加统计流程的详细日志记录
This commit is contained in:
云端客
2025-12-24 11:16:44 +08:00
committed by GitHub
parent 451fe273ca
commit fa4e9b63e4
2 changed files with 39 additions and 30 deletions

View File

@@ -205,16 +205,18 @@ async function recognizeNumberByOCR(ocrRegion, pattern) {
* 统计原粹树脂数量 * 统计原粹树脂数量
* @returns {number} 原粹树脂数量 * @returns {number} 原粹树脂数量
*/ */
async function countOriginalResin(tryOriginalMode,opToMainUi) { async function countOriginalResin(tryOriginalMode,opToMainUi,openMap) {
if (tryOriginalMode) { if (tryOriginalMode) {
log.info("尝试使用原始模式"); log.info("尝试使用原始模式");
return await countOriginalResinBackup() return await countOriginalResinBackup()
} else { } else {
let ocrPhysical = await physical.ocrPhysical(opToMainUi); log.info('尝试使用优化模式');
let ocrPhysical = await physical.ocrPhysical(opToMainUi,openMap);
await sleep(600) await sleep(600)
if (ocrPhysical && ocrPhysical.ok) { if (ocrPhysical && ocrPhysical.ok) {
return ocrPhysical.remainder; return ocrPhysical.remainder;
} else { } else {
log.error(`ocrPhysical error`);
throw new Error("ocrPhysical error"); throw new Error("ocrPhysical error");
} }
} }
@@ -457,43 +459,47 @@ this.countAllResin = async function () {
setGameMetrics(1920, 1080, 1); setGameMetrics(1920, 1080, 1);
log.info("开始统计树脂数量"); log.info("开始统计树脂数量");
// 返回主界面 await genshin.returnMainUi();
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 sleep(CONFIG.UI_DELAY); await sleep(CONFIG.UI_DELAY);
// 打开地图界面统计原粹/浓缩树脂 // 打开地图界面统计原粹/浓缩树脂
await openMap(); await openMap();
await sleep(CONFIG.UI_DELAY); 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("开始统计地图界面中的树脂"); log.info("开始统计地图界面中的树脂");
if (!tryPass){ if (!tryPass){
// 如果第一次尝试失败,则切换到蒙德 // 如果第一次尝试失败,则切换到蒙德
await switchtoCountrySelection(CONFIG.COORDINATES.MONDSTADT.x, CONFIG.COORDINATES.MONDSTADT.y) await switchtoCountrySelection(CONFIG.COORDINATES.MONDSTADT.x, CONFIG.COORDINATES.MONDSTADT.y)
resinCounts.original = await countOriginalResin(!tryPass); resinCounts.original = await countOriginalResin(!tryPass);
} }
resinCounts.condensed = await countCondensedResin(); resinCounts.condensed = await countCondensedResin();
if (!tryPass) {
// 打开补充树脂界面统计须臾/脆弱树脂
await openReplenishResinUi();
await sleep(CONFIG.UI_DELAY);
// 打开补充树脂界面统计须臾/脆弱树脂 // 点击避免选中效果影响统计
await openReplenishResinUi(); click(CONFIG.COORDINATES.AVOID_SELECTION.x, CONFIG.COORDINATES.AVOID_SELECTION.y);
await sleep(CONFIG.UI_DELAY); await sleep(500);
// 点击避免选中效果影响统计
click(CONFIG.COORDINATES.AVOID_SELECTION.x, CONFIG.COORDINATES.AVOID_SELECTION.y);
await sleep(500);
log.info("开始统计补充树脂界面中的树脂");
resinCounts.transient = await countTransientResin();
resinCounts.fragile = await countFragileResin();
log.info("开始统计补充树脂界面中的树脂");
resinCounts.transient = await countTransientResin();
resinCounts.fragile = await countFragileResin();
}
// 显示结果 // 显示结果
displayResults(resinCounts); displayResults(resinCounts);

View File

@@ -62,7 +62,7 @@ async function saveOnlyNumber(str) {
* - min {number}: 最小可执行体力值 * - min {number}: 最小可执行体力值
* - remainder {number}: 当前剩余体力值 * - remainder {number}: 当前剩余体力值
*/ */
async function ocrPhysical(opToMainUi = false) { async function ocrPhysical(opToMainUi = false,openMap=false) {
// 检查是否启用体力识别功能,如果未启用则直接返回默认结果 // 检查是否启用体力识别功能,如果未启用则直接返回默认结果
if (!settings.isResinExhaustionMode) { if (!settings.isResinExhaustionMode) {
log.info(`===未启用===`) log.info(`===未启用===`)
@@ -79,8 +79,10 @@ async function ocrPhysical(opToMainUi = false) {
} }
//设置最小可执行体力值 //设置最小可执行体力值
let minPhysical = MinPhysical let minPhysical = MinPhysical
//打开地图界面 if (openMap){
await keyPress('M') //打开地图界面
await keyPress('M')
}
await sleep(ms) await sleep(ms)
log.debug(`===[点击+]===`) log.debug(`===[点击+]===`)
//点击+ 按钮 x=1264,y=39,width=18,height=19 //点击+ 按钮 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 templateMatchAddButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(`${add_objJson.path}`), add_objJson.x, add_objJson.y, add_objJson.width, add_objJson.height);
let regionA = captureGameRegion() let regionA = captureGameRegion()
// let buttonA = captureGameRegion().find(templateMatchAddButtonRo); // let buttonA = captureGameRegion().find(templateMatchAddButtonRo);
let buttonA = region.find(templateMatchAddButtonRo); let buttonA = regionA.find(templateMatchAddButtonRo);
regionA.Dispose() regionA.Dispose()
await sleep(ms) await sleep(ms)
@@ -178,7 +180,7 @@ async function ocrPhysical(opToMainUi = false) {
let execute = (remainder - minPhysical) >= 0 let execute = (remainder - minPhysical) >= 0
log.info(`最小可执行原粹树脂:{min},原粹树脂:{key}`, minPhysical, remainder,) log.info(`最小可执行原粹树脂:{min},原粹树脂:{key}`, minPhysical, remainder,)
await keyPress('VK_ESCAPE') // await keyPress('VK_ESCAPE')
return { return {
ok: execute, ok: execute,
min: minPhysical, min: minPhysical,
@@ -187,6 +189,7 @@ async function ocrPhysical(opToMainUi = false) {
} catch (e) { } catch (e) {
throwError(`识别失败,err:${e.message}`) throwError(`识别失败,err:${e.message}`)
} finally { } finally {
//返回地图操作
if (opToMainUi) { if (opToMainUi) {
await toMainUi(); // 切换到主界面 await toMainUi(); // 切换到主界面
} }