From 32b60ee9f28fd4717d0f33566bc98e55114826de Mon Sep 17 00:00:00 2001 From: yan Date: Tue, 10 Feb 2026 02:35:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(game):=20=E6=B7=BB=E5=8A=A0=E5=8E=9F?= =?UTF-8?q?=E7=B2=B9=E6=A0=91=E8=84=82=E8=AF=86=E5=88=AB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 physical.js 工具模块,实现原粹树脂识别逻辑 - 在配置文件中添加用户体力相关配置项 - 集成体力识别流程到初始化过程 - 添加图像模板匹配资源管理 - 实现主界面导航和返回功能 - 增加错误处理和异常捕获机制 --- repo/js/AutoPlanDomain/assets/200.png | Bin 0 -> 4624 bytes repo/js/AutoPlanDomain/assets/add_button.jpg | Bin 0 -> 835 bytes repo/js/AutoPlanDomain/assets/paimon_menu.png | Bin 0 -> 2372 bytes repo/js/AutoPlanDomain/assets/yue.png | Bin 0 -> 2345 bytes repo/js/AutoPlanDomain/config/config.js | 11 +- repo/js/AutoPlanDomain/utils/physical.js | 156 ++++++++++++++++++ repo/js/AutoPlanDomain/utils/tool.js | 85 +++++++++- 7 files changed, 250 insertions(+), 2 deletions(-) create mode 100644 repo/js/AutoPlanDomain/assets/200.png create mode 100644 repo/js/AutoPlanDomain/assets/add_button.jpg create mode 100644 repo/js/AutoPlanDomain/assets/paimon_menu.png create mode 100644 repo/js/AutoPlanDomain/assets/yue.png create mode 100644 repo/js/AutoPlanDomain/utils/physical.js diff --git a/repo/js/AutoPlanDomain/assets/200.png b/repo/js/AutoPlanDomain/assets/200.png new file mode 100644 index 0000000000000000000000000000000000000000..5fdf7d70be64b5d16a1f2c015edeff6d0c45013a GIT binary patch literal 4624 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 CT`(2^ literal 0 HcmV?d00001 diff --git a/repo/js/AutoPlanDomain/assets/paimon_menu.png b/repo/js/AutoPlanDomain/assets/paimon_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..c424325b17a4956f7802352e7609bfcff2721afa GIT binary patch literal 2372 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 P00000NkvXXu0mjf4hW1q literal 0 HcmV?d00001 diff --git a/repo/js/AutoPlanDomain/config/config.js b/repo/js/AutoPlanDomain/config/config.js index f43705077..01af38466 100644 --- a/repo/js/AutoPlanDomain/config/config.js +++ b/repo/js/AutoPlanDomain/config/config.js @@ -1,4 +1,5 @@ import {ocrUid} from "../utils/uid"; +import {ocrPhysical} from "../utils/physical"; const config = { //setting设置放在这个json @@ -21,6 +22,10 @@ const config = { }, user: { uid: undefined, + physical: { + min: 20,//最小体力 + current: 0,//当前体力 + } }, // path: { @@ -162,6 +167,11 @@ async function initConfig() { throw new Error("密钥不匹配!") } } + //流程->返回主页 打开地图 返回主页 + const physical = await ocrPhysical(true, true) + config.user.physical.current = physical.current + config.user.physical.min = physical.min + // 初始化uid config.user.uid = await ocrUid() config.bgi_tools.api.httpPullJsonConfig = settings.bgi_tools_http_pull_json_config config.bgi_tools.api.httpPushAllJsonConfig = settings.bgi_tools_http_push_all_json_config @@ -226,7 +236,6 @@ async function initConfig() { } - export { config, LoadType, LoadMap, checkKey, diff --git a/repo/js/AutoPlanDomain/utils/physical.js b/repo/js/AutoPlanDomain/utils/physical.js new file mode 100644 index 000000000..018e685cf --- /dev/null +++ b/repo/js/AutoPlanDomain/utils/physical.js @@ -0,0 +1,156 @@ +import { getJsonPath } from "../utils/tool"; +//==================================================== +const genshinJson = { + width: 1920,//genshin.width, + height: 1080,//genshin.height, +} +// const MinPhysical = settings.minPhysical?parseInt(settings.minPhysical+''):parseInt(20+'') +// const OpenModeCountMin = settings.openModeCountMin +// let AlreadyRunsCount=0 +// let NeedRunsCount=0 +const TemplateOrcJson={x: 1568, y: 16, width: 225, height: 60,} +//==================================================== + + +/** + * 从字符串中提取数字并组合成一个整数 + * @param {string} str - 包含数字的字符串 + * @returns {number} - 由字符串中所有数字组合而成的整数 + */ +async function saveOnlyNumber(str) { + // 使用正则表达式匹配字符串中的所有数字 + // \d+ 匹配一个或多个数字 + // .join('') 将匹配到的数字数组连接成一个字符串 + // parseInt 将连接后的字符串转换为整数 + return parseInt(str.match(/\d+/g).join('')); +} + +/** + * 识别原粹树脂(体力)的函数 + * @param {boolean} [opToMainUi=false] - 是否操作到主界面 + * @param {boolean} [openMap=false] - 是否打开地图界面 + * @param {number} [minPhysical=20] - 最小可执行体力值 + * @param {boolean} [isResinExhaustionMode=ture] - 是否启用体力识别功能 + * @returns {Promise} 返回一个包含识别结果的Promise对象 + * - ok {boolean}: 是否可执行(体力是否足够) + * - min {number}: 最小可执行体力值 + * - remainder {number}: 当前剩余体力值 + */ +async function ocrPhysical(opToMainUi = false,openMap=false,minPhysical=20,isResinExhaustionMode=true) { + // 检查是否启用体力识别功能,如果未启用则直接返回默认结果 + if (!isResinExhaustionMode) { + log.info(`===未启用===`) + return { + ok: true, + min: 0, + current: 0, + } + } + log.debug(`===开始识别原粹树脂===`) + let ms = 1000 // 定义操作延迟时间(毫秒) + if (opToMainUi) { + await toMainUi(); // 切换到主界面 + } + + if (openMap){ + //打开地图界面 + await keyPress('M') + } + await sleep(ms) + log.debug(`===[点击+]===`) + //点击+ 按钮 x=1264,y=39,width=18,height=19 + let add_buttonJSON = getJsonPath('add_button'); + let add_objJson = { + path: `${add_buttonJSON.path}${add_buttonJSON.name}${add_buttonJSON.type}`, + x: 1242, + y: 21, + width: 54, + height: 51, + } + let templateMatchAddButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(`${add_objJson.path}`), add_objJson.x, add_objJson.y, add_objJson.width, add_objJson.height); + let regionA = captureGameRegion() + try { + let buttonA = regionA.find(templateMatchAddButtonRo); + + await sleep(ms) + if (!buttonA.isExist()) { + log.error(`${add_objJson.path}匹配异常`) + throwError(`${add_objJson.path}匹配异常`) + } + await buttonA.click() + }finally { + regionA.Dispose() + } + + await sleep(ms) + + log.debug(`===[定位原粹树脂]===`) + //定位月亮 + let jsonPath = getJsonPath('yue'); + let tmJson = { + path: `${jsonPath.path}${jsonPath.name}${jsonPath.type}`, + x: TemplateOrcJson.x, + y: TemplateOrcJson.y, + width: TemplateOrcJson.width, + height: TemplateOrcJson.height, + } + let templateMatchButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(`${tmJson.path}`), tmJson.x, tmJson.y, tmJson.width, tmJson.height); + let region =captureGameRegion() + let button = region.find(templateMatchButtonRo); + try { + await sleep(ms) + if (!button.isExist()) { + log.error(`${tmJson.path} 匹配异常`) + throwError(`${tmJson.path} 匹配异常`) + } + }finally { + region.Dispose() + } + + + log.debug(`===[识别原粹树脂]===`) + //识别体力 x=1625,y=31,width=79,height=30 / x=1689,y=35,width=15,height=26 + let ocr_obj = { + // x: 1623, + x: button.x + button.width, + // y: 32, + y: button.y, + // width: 61, + width: Math.abs(genshinJson.width - button.x - button.width), + height: 26 + } + + log.debug(`ocr_obj: x={x},y={y},width={width},height={height}`, ocr_obj.x, ocr_obj.y, ocr_obj.width, ocr_obj.height) + let region3 = captureGameRegion() + + try { + let recognitionObjectOcr = RecognitionObject.Ocr(ocr_obj.x, ocr_obj.y, ocr_obj.width, ocr_obj.height); + let res = region3.find(recognitionObjectOcr); + + log.debug(`[OCR原粹树脂]识别结果: ${res.text}, 原始坐标: x=${res.x}, y=${res.y},width:${res.width},height:${res.height}`); + let text=res.text.split('/')[0] + let current = await saveOnlyNumber(text) + let execute = (current - minPhysical) >= 0 + log.debug(`最小可执行原粹树脂:{min},原粹树脂:{key}`, minPhysical, current,) + + // await keyPress('VK_ESCAPE') + return { + ok: execute, + min: minPhysical, + current: current, + } + } catch (e) { + throwError(`识别失败,err:${e.message}`) + } finally { + region3.Dispose() + //返回地图操作 + if (opToMainUi) { + await toMainUi(); // 切换到主界面 + } + } + +} + +export { + ocrPhysical, +} \ No newline at end of file diff --git a/repo/js/AutoPlanDomain/utils/tool.js b/repo/js/AutoPlanDomain/utils/tool.js index be35ab548..7f3e40fcf 100644 --- a/repo/js/AutoPlanDomain/utils/tool.js +++ b/repo/js/AutoPlanDomain/utils/tool.js @@ -49,8 +49,91 @@ async function getDayOfWeek() { dayOfWeek: weekDay } } +const commonPath = 'assets/' +const commonMap = new Map([ + ['main_ui', { + path: `${commonPath}`, + name: 'paimon_menu', + type: '.png', + }], + ['yue', { + path: `${commonPath}`, + name: 'yue', + type: '.png', + }], + ['200', { + path: `${commonPath}`, + name: '200', + type: '.png', + }], + ['add_button', { + path: `${commonPath}`, + name: 'add_button', + type: '.jpg', + }], +]) +/** + * 根据键值获取JSON路径 + * @param {string} key - 要查找的键值 + * @returns {any} 返回与键值对应的JSON路径值 + */ +function getJsonPath(key) { + return commonMap.get(key); // 通过commonMap的get方法获取指定键对应的值 +} + +// 判断是否在主界面的函数 +const isInMainUI = () => { + // let name = '主界面' + let main_ui = getJsonPath('main_ui'); + // 定义识别对象 + let paimonMenuRo = RecognitionObject.TemplateMatch( + file.ReadImageMatSync(`${main_ui.path}${main_ui.name}${main_ui.type}`), + 0, + 0, + genshinJson.width / 3.0, + genshinJson.width / 5.0 + ); + let captureRegion = captureGameRegion(); + let res = captureRegion.find(paimonMenuRo); + captureRegion.Dispose() + return !res.isEmpty(); +}; + +async function toMainUi() { + let ms = 300 + let index = 1 + await sleep(ms); + while (!isInMainUI()) { + await sleep(ms); + await genshin.returnMainUi(); // 如果未启用,则返回游戏主界面 + await sleep(ms); + if (index > 3) { + throwError(`多次尝试返回主界面失败`); + } + index += 1 + } + +} +/** + * 抛出错误函数 + * 该函数用于显示错误通知并抛出错误对象 + * @param {string} msg - 错误信息,将用于通知和错误对象 + */ +function throwError(msg,isNotification=false) { + // 使用notification组件显示错误通知 + // notification.error(`${msg}`); + if (isNotification) { + notification.error(`${msg}`); + } + // 抛出一个包含错误信息的Error对象 + throw new Error(`${msg}`); +} export { ocrRegion, - getDayOfWeek + getDayOfWeek, + getJsonPath, + isInMainUI, + toMainUi, + throwError, } \ No newline at end of file