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} 原粹树脂数量
*/
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);

View File

@@ -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(); // 切换到主界面
}