From 256b38314a1ada2651cbc7aa865ea61bb72b80fe Mon Sep 17 00:00:00 2001 From: OvOAuto <44537598+OvOAuto@users.noreply.github.com> Date: Sat, 21 Feb 2026 03:00:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E4=BF=AE=E6=94=B9=E7=94=BB?= =?UTF-8?q?=E8=B4=A8v1.1=20(#2902)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Resolve merge conflicts: keep upstream versions * 恢复README和manifest.json * update version * v1.1: 新增极速模式 --- repo/js/AutoSwitchGraphicsSettings/README.md | 4 +- repo/js/AutoSwitchGraphicsSettings/main.js | 137 ++++++++++++++---- .../AutoSwitchGraphicsSettings/manifest.json | 4 +- .../AutoSwitchGraphicsSettings/settings.json | 6 + 4 files changed, 121 insertions(+), 30 deletions(-) diff --git a/repo/js/AutoSwitchGraphicsSettings/README.md b/repo/js/AutoSwitchGraphicsSettings/README.md index 7da02a7ac..b9f0cf02b 100644 --- a/repo/js/AutoSwitchGraphicsSettings/README.md +++ b/repo/js/AutoSwitchGraphicsSettings/README.md @@ -28,8 +28,10 @@ 预设设置的标签名称与选项名称皆与游戏内名称一致,如果您发现不同,请发 Issue。 +启用极速模式后,选择选项将不再依赖 OCR,而是直接点击硬编码的坐标(也就是盲点),且点击更为迅速,在没有默认选项的情况下耗时是普通模式的一半左右。极速模式可能在性能稍差的设备上不可用,因为 UI 动画速度可能过慢。如果您更追求稳定,不要勾选极速模式。 + 每项设置的第一个选项都是`默认`,在您选中它后本 JS 会**不修改**此选项。 注意,即使您预设`图像质量`选项不是`默认`或`自定义`,本 JS 依然会根据您的预设修改其余选项。所以如果您设置了图像质量预设,又修改了其余选项为非预设的值,则在 JS 运行结束后`图像质量`将是`自定义`。 -感谢您耐心读完此 README,请勾选自定义配置中的复选框。 \ No newline at end of file +感谢您耐心读完此 README,请勾选自定义配置中的复选框。 diff --git a/repo/js/AutoSwitchGraphicsSettings/main.js b/repo/js/AutoSwitchGraphicsSettings/main.js index 3d6f40174..6909cb487 100644 --- a/repo/js/AutoSwitchGraphicsSettings/main.js +++ b/repo/js/AutoSwitchGraphicsSettings/main.js @@ -1,5 +1,5 @@ // 模板数组,用于对比用户设置 -const settingsTemplate = [{"name":"check","type":"checkbox","label":"我已阅读 README.md","default":false},{"name":"图像质量","type":"select","label":"图像质量","options":["默认","极低","低","中","高","自定义"],"default":"默认"},{"name":"帧率","type":"select","label":"帧率","options":["默认","30","45","60"],"default":"默认"},{"name":"垂直同步","type":"select","label":"垂直同步","options":["默认","关闭","打开"],"default":"默认"},{"name":"渲染精度","type":"select","label":"渲染精度","options":["默认","0.6","0.8","0.9","1.0","1.1","1.2","1.3","1.4","1.5"],"default":"默认"},{"name":"阴影质量","type":"select","label":"阴影质量","options":["默认","极低","低","中","高"],"default":"默认"},{"name":"全局光照","type":"select","label":"全局光照","options":["默认","关闭","中","高","非常高"],"default":"默认"},{"name":"后期效果","type":"select","label":"后期效果","options":["默认","极低","低","中","高"],"default":"默认"},{"name":"特效质量","type":"select","label":"特效质量","options":["默认","极低","低","中","高"],"default":"默认"},{"name":"场景细节","type":"select","label":"场景细节","options":["默认","极低","低","中","高","极高"],"default":"默认"},{"name":"抗锯齿","type":"select","label":"抗锯齿","options":["默认","关闭","FSR 2","SMAA"],"default":"默认"},{"name":"体积雾","type":"select","label":"体积雾","options":["默认","关闭","打开"],"default":"默认"},{"name":"反射","type":"select","label":"反射","options":["默认","关闭","打开"],"default":"默认"},{"name":"动态模糊","type":"select","label":"动态模糊","options":["默认","关闭","低","高","非常高"],"default":"默认"},{"name":"Bloom","type":"select","label":"Bloom","options":["默认","关闭","打开"],"default":"默认"},{"name":"人群密度","type":"select","label":"人群密度","options":["默认","低","高"],"default":"默认"},{"name":"多人游戏队友特效","type":"select","label":"多人游戏队友特效","options":["默认","完全屏蔽","部分屏蔽","打开"],"default":"默认"},{"name":"次表面散射","type":"select","label":"次表面散射","options":["默认","关闭","中","高"],"default":"默认"},{"name":"各向异性采样","type":"select","label":"各向异性采样","options":["默认","1x","2x","4x","8x","16x"],"default":"默认"},{"name":"角色动态高精度","type":"select","label":"角色动态高精度","options":["默认","关闭","打开"],"default":"默认"}]; +const settingsTemplate = [{"name":"check","type":"checkbox","label":"我已阅读 README.md","default":false},{"name":"fast","type":"checkbox","label":"极速模式","default":false},{"name":"图像质量","type":"select","label":"图像质量","options":["默认","极低","低","中","高","自定义"],"default":"默认"},{"name":"帧率","type":"select","label":"帧率","options":["默认","30","45","60"],"default":"默认"},{"name":"垂直同步","type":"select","label":"垂直同步","options":["默认","关闭","打开"],"default":"默认"},{"name":"渲染精度","type":"select","label":"渲染精度","options":["默认","0.6","0.8","0.9","1.0","1.1","1.2","1.3","1.4","1.5"],"default":"默认"},{"name":"阴影质量","type":"select","label":"阴影质量","options":["默认","极低","低","中","高"],"default":"默认"},{"name":"全局光照","type":"select","label":"全局光照","options":["默认","关闭","中","高","非常高"],"default":"默认"},{"name":"后期效果","type":"select","label":"后期效果","options":["默认","极低","低","中","高"],"default":"默认"},{"name":"特效质量","type":"select","label":"特效质量","options":["默认","极低","低","中","高"],"default":"默认"},{"name":"场景细节","type":"select","label":"场景细节","options":["默认","极低","低","中","高","极高"],"default":"默认"},{"name":"抗锯齿","type":"select","label":"抗锯齿","options":["默认","关闭","FSR 2","SMAA"],"default":"默认"},{"name":"体积雾","type":"select","label":"体积雾","options":["默认","关闭","打开"],"default":"默认"},{"name":"反射","type":"select","label":"反射","options":["默认","关闭","打开"],"default":"默认"},{"name":"动态模糊","type":"select","label":"动态模糊","options":["默认","关闭","低","高","非常高"],"default":"默认"},{"name":"Bloom","type":"select","label":"Bloom","options":["默认","关闭","打开"],"default":"默认"},{"name":"人群密度","type":"select","label":"人群密度","options":["默认","低","高"],"default":"默认"},{"name":"多人游戏队友特效","type":"select","label":"多人游戏队友特效","options":["默认","完全屏蔽","部分屏蔽","打开"],"default":"默认"},{"name":"次表面散射","type":"select","label":"次表面散射","options":["默认","关闭","中","高"],"default":"默认"},{"name":"各向异性采样","type":"select","label":"各向异性采样","options":["默认","1x","2x","4x","8x","16x"],"default":"默认"},{"name":"角色动态高精度","type":"select","label":"角色动态高精度","options":["默认","关闭","打开"],"default":"默认"}]; // 用户设置数组,用 Array.from() 获取字面值 const settingsArr = Array.from(settings); @@ -9,46 +9,95 @@ const graphicsTextRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("as // 封装好的点击以上两个按钮操作 const findAndClick = async (object) => { - let res = captureGameRegion(); - if (!res) { + let gameRegion = captureGameRegion(); + if (!gameRegion) { log.error("截图失败"); return; } - let found = res.Find(object); + let found = gameRegion.Find(object); if (!found) { log.error("未能找到目标元素,请确认游戏界面状态"); return; } found.click(); found.click(); // 点两次是因为设置图标有的时候点一次无反应 - res.Dispose(); + gameRegion.Dispose(); }; -// 封装好的寻找选项功能 +// 封装好的 OCR 寻找选项功能 const findOption = async (optionName) => { - let pic = captureGameRegion(); - let ocrList = pic.findMulti(RecognitionObject.ocrThis); - pic.Dispose(); + let gameRegion = captureGameRegion(); + let ocrList = gameRegion.findMulti(RecognitionObject.ocrThis); + gameRegion.Dispose(); for(let i = 0;i < ocrList.count; i++) if(ocrList[i].Text === optionName) return ocrList[i]; }; +const buildOcrMap = () => { // 硬编码按钮坐标,用于极速模式 + let map = new Map([ + ["图像质量", { x: 1500, y: 176 }], + ["帧率", { x: 1500, y: 426 }], + ["垂直同步", { x: 1500, y: 502 }], + ["渲染精度", { x: 1500, y: 570 }], + ["阴影质量", { x: 1500, y: 638 }], + ["全局光照", { x: 1500, y: 704 }], + ["后期效果", { x: 1500, y: 772 }], + ["特效质量", { x: 1500, y: 98 }], + ["场景细节", { x: 1500, y: 164 }], + ["抗锯齿", { x: 1500, y: 226 }], + ["体积雾", { x: 1500, y: 294 }], + ["反射", { x: 1500, y: 354 }], + ["动态模糊", { x: 1500, y: 434 }], + ["Bloom", { x: 1500, y: 498 }], + ["人群密度", { x: 1500, y: 564 }], + ["多人游戏队友特效", { x: 1500, y: 638 }], + ["次表面散射", { x: 1500, y: 701 }], + ["各向异性采样", { x: 1500, y: 770 }], + ["角色动态高精度", { x: 1500, y: 840 }] +]); + return map; +}; + +// 普通模式点击选项 const chooseOption = async (optionName, order) => { if(order === 0) return; // 默认选项,跳过 let res = await findOption(optionName); let x = res.x, y = res.y; click(x + 1000, y + 25); // 点击选项的下拉栏,依赖选项名称的相对位置 - await sleep(20); + await sleep(100); click(x + 1000, y + 25 + order * 50); // 点击具体选项 await sleep(150); click(1000, 39); click(1000, 39); // 双击空白处,关闭可能弹出的“部分图像设置需要重启游戏后生效” }; +// 极速模式点击选项 +const chooseOptionFast = async (optionName, order, ocrMap) => { + if(order === 0) + return; // 默认选项,跳过 + let res = ocrMap.get(optionName); + if(!res) { + log.error("未能找到选项:{name}", optionName); + return; + } + let x = res.x, y = res.y; + click(x, y + 25); // 点击选项的下拉栏,依赖选项名称的相对位置 + await sleep(20); + click(x, y + 25 + order * 50); // 点击具体选项 + await sleep(150); + if((optionName === "图像质量") || (optionName === "场景细节")){ + click(1000, 39); + click(1000, 39); // 双击空白处,关闭可能弹出的“部分图像设置需要重启游戏后生效” + await sleep(500); + } + else + click(1000, 39); // 单击空白处取消关闭下拉菜单的后摇 +}; + (async function () { - if(settings.check === false) { + if(!settings.check) { log.error("请先阅读 README.md!"); return; } @@ -65,25 +114,59 @@ const chooseOption = async (optionName, order) => { await sleep(500); log.info("开始修改图像设置,请{highlight}", "不要操作"); - for(let i = 1; i < 8;++i) - for(let j = 0; j < Array.from(settingsTemplate[i].options).length;++j) - if(settingsArr[i].Value === Array.from(settingsTemplate[i].options)[j]) { - log.info("{name}选择{option}", settingsTemplate[i].name, settingsArr[i].Value); - await chooseOption(settingsTemplate[i].name, j); - } + if(settings.fast) { + /* ----------begin 极速模式----------*/ + log.info("已启用{highlight}", "极速模式"); + const ocrMap = buildOcrMap(); - moveMouseTo(1000, 500); - for(let i = 0;i < 50;++i) - verticalScroll(-1); - await sleep(500); - - for(let i = 8;i < settingsTemplate.length;++i) - for(let j = 0; j < Array.from(settingsTemplate[i].options).length;++j) - if(settingsArr[i].Value === Array.from(settingsTemplate[i].options)[j]) { + for(let i = 2; i < 9;++i) { + const options = settingsTemplate[i].options; + const idx = options.indexOf(settingsArr[i].Value); + if(idx > 0) { log.info("{name}选择{option}", settingsTemplate[i].name, settingsArr[i].Value); - await chooseOption(settingsTemplate[i].name, j); + await chooseOptionFast(settingsTemplate[i].name, idx, ocrMap); } - + } + + // 滚动页面 + moveMouseTo(1000, 500); + for(let i = 0;i < 50;++i) + verticalScroll(-1); + await sleep(100); + + for(let i = 9;i < settingsTemplate.length;++i) { + const options = settingsTemplate[i].options; + const idx = options.indexOf(settingsArr[i].Value); + if(idx > 0) { + log.info("{name}选择{option}", settingsTemplate[i].name, settingsArr[i].Value); + await chooseOptionFast(settingsTemplate[i].name, idx, ocrMap); + } + } + /* ----------end 极速模式----------*/ + } + else { + /* ----------begin 普通模式----------*/ + for(let i = 2; i < 9;++i) + for(let j = 0; j < Array.from(settingsTemplate[i].options).length;++j) + if(settingsArr[i].Value === Array.from(settingsTemplate[i].options)[j]) { + log.info("{name}选择{option}", settingsTemplate[i].name, settingsArr[i].Value); + await chooseOption(settingsTemplate[i].name, j); + } + + moveMouseTo(1000, 500); + for(let i = 0;i < 50;++i) + verticalScroll(-1); + await sleep(500); + + for(let i = 9;i < settingsTemplate.length;++i) + for(let j = 0; j < Array.from(settingsTemplate[i].options).length;++j) + if(settingsArr[i].Value === Array.from(settingsTemplate[i].options)[j]) { + log.info("{name}选择{option}", settingsTemplate[i].name, settingsArr[i].Value); + await chooseOption(settingsTemplate[i].name, j); + } + /* ----------end 普通模式----------*/ + } + log.info("修改图像设置完成,正在尝试回到主界面……"); await genshin.returnMainUi(); log.info("回到主界面成功"); diff --git a/repo/js/AutoSwitchGraphicsSettings/manifest.json b/repo/js/AutoSwitchGraphicsSettings/manifest.json index af26490ed..385d3527c 100644 --- a/repo/js/AutoSwitchGraphicsSettings/manifest.json +++ b/repo/js/AutoSwitchGraphicsSettings/manifest.json @@ -1,8 +1,8 @@ { "manifest_version": 1, "name": "自动修改画质", - "version": "1.0", - "bgi_version": "0.56.2", + "version": "1.1", + "bgi_version": "0.57.0", "description": "自动调整画质,用于便捷切换锄地省电画质和游戏体验画质", "authors": [ diff --git a/repo/js/AutoSwitchGraphicsSettings/settings.json b/repo/js/AutoSwitchGraphicsSettings/settings.json index bc81116a6..d15da405a 100644 --- a/repo/js/AutoSwitchGraphicsSettings/settings.json +++ b/repo/js/AutoSwitchGraphicsSettings/settings.json @@ -5,6 +5,12 @@ "label": "我已阅读 README.md", "default": false }, + { + "name": "fast", + "type": "checkbox", + "label": "极速模式", + "default": false + }, { "name": "图像质量", "type": "select",