From d8f45e9bbdea19fb8a96780bf2b65d904dd134e8 Mon Sep 17 00:00:00 2001 From: OvOAuto <44537598+OvOAuto@users.noreply.github.com> Date: Sun, 22 Feb 2026 21:07:54 +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=A8=E4=B8=8E=E9=9F=B3=E9=87=8Fv1.2=20(#2911)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add JS AutoSwitchGraphicsSettings * fix: 修复manifest.json版本号 * 修复若干问题 * update v1.2 --- repo/js/AutoSwitchGraphicsSettings/README.md | 12 ++- .../assets/RecognitionObject/volume.png | Bin 0 -> 5514 bytes repo/js/AutoSwitchGraphicsSettings/main.js | 84 +++++++++++++++--- .../AutoSwitchGraphicsSettings/manifest.json | 6 +- .../AutoSwitchGraphicsSettings/settings.json | 62 +++++++++++++ 5 files changed, 147 insertions(+), 17 deletions(-) create mode 100644 repo/js/AutoSwitchGraphicsSettings/assets/RecognitionObject/volume.png diff --git a/repo/js/AutoSwitchGraphicsSettings/README.md b/repo/js/AutoSwitchGraphicsSettings/README.md index b9f0cf02b..a88829e1b 100644 --- a/repo/js/AutoSwitchGraphicsSettings/README.md +++ b/repo/js/AutoSwitchGraphicsSettings/README.md @@ -1,12 +1,14 @@ -# 自动修改画质 +# 自动修改画质与音量 ## 重要提醒 -为了保证您的良好体验,请务必在开始使用前阅读完本 README。 +- 为了保证您的良好体验,请务必在开始使用前阅读完本 README。 +- 如果您在更新本 JS 后遇到问题,请在所有配置组中移除并重新添加本 JS,这是为了重建自定义配置文件以匹配新的设置 UI。 +- 如果您发现运行此 JS 时失去焦点(也就是鼠标在操作别的窗口,而原神窗口在视觉上被覆盖),可以前往 BetterGI 主界面,点击左下角设置,找到通用功能设置,展开其他设置,找到失去焦点自动恢复,点击右侧开关启用此功能。 ## 作用说明 -本 JS 可以根据用户的预设自动修改图像设置,避免了繁琐的手动调整流程。在您使用 BetterGI 自动完成锄地等重复性任务前,可以运行本 JS,调低画质以降低功耗;同样地,在锄地结束后也可以运行本 JS,调回高画质保证游戏体验。您还可以根据自己的需求开发新的用法。 +本 JS 可以根据用户的预设自动修改图像和声音设置,避免了繁琐的手动调整流程。在您使用 BetterGI 自动完成锄地等重复性任务前,可以运行本 JS,调低画质并静音以降低功耗;同样地,在锄地结束后也可以运行本 JS,调回高画质保证游戏体验。您还可以根据自己的需求开发新的用法。 ## 兼容性 @@ -22,7 +24,7 @@ ## 使用方法 -在配置组中添加本 JS 后,右键本 JS,点击`修改JS脚本自定义配置`,即可在弹出的对话框中调整预设图像设置。 +在配置组中添加本 JS 后,右键本 JS,点击`修改JS脚本自定义配置`,即可在弹出的对话框中调整预设图像和声音设置。 ### 选项说明 @@ -34,4 +36,6 @@ 注意,即使您预设`图像质量`选项不是`默认`或`自定义`,本 JS 依然会根据您的预设修改其余选项。所以如果您设置了图像质量预设,又修改了其余选项为非预设的值,则在 JS 运行结束后`图像质量`将是`自定义`。 +音量设置只允许您设定不大于 10 的自然数,您可预设为 -1 以不修改对应的音量。Tips: 您还可直接在调度器中添加 Shell 指令以自动调整系统音量。 + 感谢您耐心读完此 README,请勾选自定义配置中的复选框。 diff --git a/repo/js/AutoSwitchGraphicsSettings/assets/RecognitionObject/volume.png b/repo/js/AutoSwitchGraphicsSettings/assets/RecognitionObject/volume.png new file mode 100644 index 0000000000000000000000000000000000000000..4b274a60e2be59e7c20889e35aeafb77128aafd5 GIT binary patch literal 5514 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 M07*qoM6N<$f?h|B@Bjb+ literal 0 HcmV?d00001 diff --git a/repo/js/AutoSwitchGraphicsSettings/main.js b/repo/js/AutoSwitchGraphicsSettings/main.js index 6909cb487..8629a1891 100644 --- a/repo/js/AutoSwitchGraphicsSettings/main.js +++ b/repo/js/AutoSwitchGraphicsSettings/main.js @@ -6,6 +6,7 @@ const settingsArr = Array.from(settings); // 载入设置图标和图像设置按钮 const settingsIconRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/gear.png")); const graphicsTextRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/graphics.png")); +const volumeTextRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/volume.png")); // 封装好的点击以上两个按钮操作 const findAndClick = async (object) => { @@ -24,15 +25,12 @@ const findAndClick = async (object) => { gameRegion.Dispose(); }; -// 封装好的 OCR 寻找选项功能 -const findOption = async (optionName) => { - 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 stringToInt = async (str) => { + if (!/^-?\d+$/.test(str)) + return NaN; + return Number(str); +} const buildOcrMap = () => { // 硬编码按钮坐标,用于极速模式 let map = new Map([ @@ -59,6 +57,16 @@ const buildOcrMap = () => { // 硬编码按钮坐标,用于极速模式 return map; }; +// 封装好的 OCR 寻找选项功能 +const findOption = async (optionName) => { + 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 chooseOption = async (optionName, order) => { if(order === 0) @@ -96,6 +104,18 @@ const chooseOptionFast = async (optionName, order, ocrMap) => { click(1000, 39); // 单击空白处取消关闭下拉菜单的后摇 }; +// 拖动音量条 +const dragOption = async (optionName, size) => { + if(size === -1) + return; // 默认选项,跳过 + if(Number.isNaN(size) || size < 0 || size > 10) + return; // 音量大小不合法,跳过 + let res = await findOption(optionName); + let x = res.x, y = res.y; + for(let i = 25;i <= 39;++i) // 鲁棒性 + click(x + 955 + 32 * size, y + i); +} + (async function () { if(!settings.check) { log.error("请先阅读 README.md!"); @@ -153,12 +173,13 @@ const chooseOptionFast = async (optionName, order, ocrMap) => { 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 i = 9;i < 21;++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); @@ -169,5 +190,48 @@ const chooseOptionFast = async (optionName, order, ocrMap) => { log.info("修改图像设置完成,正在尝试回到主界面……"); await genshin.returnMainUi(); + log.info("回到主界面成功,现在开始修改{highlight}", "音量设置"); + keyPress("ESCAPE"); + await sleep(1000); + await findAndClick(settingsIconRo); + log.info("进入设置界面成功,打开声音页"); + await sleep(1000); + await findAndClick(volumeTextRo); + await sleep(500); + + log.info("正在调整{highlight}", "主音量"); + await dragOption("音量", await stringToInt(settings.mainVolume)); + log.info("正在调整{highlight}", "音乐音量"); + await dragOption("音乐音量", await stringToInt(settings.musicVolume)); + log.info("正在调整{highlight}", "语音音量"); + await dragOption("语音音量", await stringToInt(settings.dialogueVolume)); + log.info("正在调整{highlight}", "音效音量"); + await dragOption("音效音量", await stringToInt(settings.sfxVolume)); + + let map = new Map(); + map.set("动态范围", ["默认", "完全", "有限"]); + map.set("输出设置", ["默认", "立体声", "环绕声"]); + map.set("最小化时静音", ["默认", "关闭", "打开"]); + + log.info("{name}选择{option}", "动态范围", settings.dynamicRange); + if(settings.dynamicRange !== "默认") + for(let i = 0;i < map.get("动态范围").length;++i) + if(map.get("动态范围")[i] === settings.dynamicRange) + await chooseOption("动态范围", i); + + log.info("{name}选择{option}", "输出设置", settings.outputSetting); + if(settings.outputSetting !== "默认") + for(let i = 0;i < map.get("输出设置").length;++i) + if(map.get("输出设置")[i] === settings.outputSetting) + await chooseOption("输出设置", i); + + log.info("{name}选择{option}", "最小化时静音", settings.muteWhenMinimized); + if(settings.muteWhenMinimized !== "默认") + for(let i = 0;i < map.get("最小化时静音").length;++i) + if(map.get("最小化时静音")[i] === settings.muteWhenMinimized) + await chooseOption("最小化时静音", i); + + log.info("修改音量设置完成,正在尝试回到主界面……"); + await genshin.returnMainUi(); log.info("回到主界面成功"); })(); diff --git a/repo/js/AutoSwitchGraphicsSettings/manifest.json b/repo/js/AutoSwitchGraphicsSettings/manifest.json index 385d3527c..2cd4f2743 100644 --- a/repo/js/AutoSwitchGraphicsSettings/manifest.json +++ b/repo/js/AutoSwitchGraphicsSettings/manifest.json @@ -1,9 +1,9 @@ { "manifest_version": 1, - "name": "自动修改画质", - "version": "1.1", + "name": "自动修改画质与音量", + "version": "1.2", "bgi_version": "0.57.0", - "description": "自动调整画质,用于便捷切换锄地省电画质和游戏体验画质", + "description": "自动调整画质和音量,用于便捷切换锄地省电画质和游戏体验画质", "authors": [ { diff --git a/repo/js/AutoSwitchGraphicsSettings/settings.json b/repo/js/AutoSwitchGraphicsSettings/settings.json index d15da405a..6e767ea5e 100644 --- a/repo/js/AutoSwitchGraphicsSettings/settings.json +++ b/repo/js/AutoSwitchGraphicsSettings/settings.json @@ -249,5 +249,67 @@ "打开" ], "default": "默认" + }, + { + "name": "separator", + "type": "separator", + "label": "音量设置 -1为默认 范围0-10" + }, + { + "name": "mainVolume", + "type": "input-text", + "label": "主音量", + "default": "-1" + }, + { + "name": "musicVolume", + "type": "input-text", + "label": "音乐音量", + "default": "-1" + }, + { + "name": "dialogueVolume", + "type": "input-text", + "label": "语音音量", + "default": "-1" + }, + { + "name": "sfxVolume", + "type": "input-text", + "label": "音效音量", + "default": "-1" + }, + { + "name": "dynamicRange", + "type": "select", + "label": "动态范围", + "options": [ + "默认", + "完全", + "有限" + ], + "default": "默认" + }, + { + "name": "outputSetting", + "type": "select", + "label": "输出设置", + "options": [ + "默认", + "立体声", + "环绕声" + ], + "default": "默认" + }, + { + "name": "muteWhenMinimized", + "type": "select", + "label": "最小化时静音", + "options": [ + "默认", + "关闭", + "打开" + ], + "default": "默认" } ]