From 69706bf7111b6ac42295c11180c9435e94968dce Mon Sep 17 00:00:00 2001 From: this-Fish Date: Wed, 28 Jan 2026 15:34:38 +0800 Subject: [PATCH] =?UTF-8?q?=E9=83=A8=E4=BB=BD=E8=85=B3=E6=9C=AC-=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=8C=87=E5=AE=9A=E6=98=9F=E6=9C=9F=E5=87=A0=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=20(#2796)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 尘歌壶一条龙-增加指定星期几运行 * -增加指定星期几运行(多選) * 纪行周常-10个boss一条龙-增加指定星期几运行 * 纪行周常-10个boss一条龙-增加指定星期几运行 --- .../js/AutoRefinedCondensationResin/README.md | 20 +- repo/js/AutoRefinedCondensationResin/main.js | 159 +++--- .../manifest.json | 6 +- .../settings.json | 31 +- repo/js/尘歌壶一条龙/README.md | 12 +- repo/js/尘歌壶一条龙/main.js | 458 +++++++++--------- repo/js/尘歌壶一条龙/manifest.json | 3 +- repo/js/尘歌壶一条龙/settings.json | 44 +- repo/js/纪行周常-10个boss一条龙/main.js | 52 ++ repo/js/纪行周常-10个boss一条龙/manifest.json | 3 +- repo/js/纪行周常-10个boss一条龙/settings.json | 93 ++-- repo/js/纪行周常-10次秘境一条龙/main.js | 52 ++ repo/js/纪行周常-10次秘境一条龙/manifest.json | 3 +- repo/js/纪行周常-10次秘境一条龙/settings.json | 16 + 14 files changed, 529 insertions(+), 423 deletions(-) diff --git a/repo/js/AutoRefinedCondensationResin/README.md b/repo/js/AutoRefinedCondensationResin/README.md index a95a7d43b..8f969840e 100644 --- a/repo/js/AutoRefinedCondensationResin/README.md +++ b/repo/js/AutoRefinedCondensationResin/README.md @@ -7,26 +7,10 @@ - 自动适应游戏内时间机制 3. **灵活执行设置**: - 支持每日自动执行 - - 可指定每周特定日期执行 -4. **精准识别技术**: - - 使用OCR确保操作准确性 - - 仅支持中文游戏界面 + - 可指定每星期特定星期几执行 ## 参数说明 | 参数名 | 类型 | 说明 | |------------|------------|----------------------------------------------------------------------| | **合成台位置** | 下拉选择 | 可选:蒙德/璃月/稻妻/枫丹
默认:璃月合成台 | -| **每日执行开关** | 复选框 | 开启后无视星期设置,每日自动执行 | -| **指定执行星期** | 文本输入 | 格式:逗号分隔数字(1=周一,7=周日)
例:`2,3,4,5,6,7` | - - -### 更新日志 -### 1.3 -1. 更改默认合成台為蒙德合成台 -### 1.2 -1. 合成树脂前先解除筛选状态 -### 1.1 -1. 修正指定执行星期只输入1个数字时执行错误 -### 1.0 - -1. 初始版本发布 +| **指定执行星期** | 勾选 | 勾选星期一~星期日 | diff --git a/repo/js/AutoRefinedCondensationResin/main.js b/repo/js/AutoRefinedCondensationResin/main.js index d86babce9..f1d657920 100644 --- a/repo/js/AutoRefinedCondensationResin/main.js +++ b/repo/js/AutoRefinedCondensationResin/main.js @@ -4,8 +4,44 @@ const CondensedResin = RecognitionObject.TemplateMatch(file.ReadImageMatSync("as const Clear = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/Clear.png")); // 读取配置文件 let location = settings.location; -const settingsWeek = settings.week; -const everyDay = settings.everyDay; + +/** + * 根据星期配置判断是否运行脚本 + * @param {Array} weekSelection - 用户选择的星期数组 + * @returns {boolean} 是否符合运行条件 + */ +function shouldRunByWeekConfig(weekSelection) { + const weekDays = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]; + + // 检查配置是否为空 + if (!Array.isArray(weekSelection) || weekSelection.length === 0) { + return false; + } + + // 取得调整后的星期(0-6,0=星期日) + const getAdjustedDayOfWeek = () => { + const now = new Date(); + let dayOfWeek = now.getDay(); // 0-6 + const hours = now.getHours(); + + // 凌晨 00:00~04:00 视为前一天 + if (hours < 4) { + dayOfWeek = dayOfWeek === 0 ? 6 : dayOfWeek - 1; + log.info(`当前时间 ${now.getHours()}:${now.getMinutes()},视为前一天(${weekDays[dayOfWeek]})`); + } else { + log.info(`当前时间 ${now.getHours()}:${now.getMinutes()},使用当天(${weekDays[dayOfWeek]})`); + } + + return dayOfWeek; + }; + + const adjustedDayOfWeek = getAdjustedDayOfWeek(); + const currentChineseDay = weekDays[adjustedDayOfWeek]; + + // 检查是否在允许的星期范围内 + const shouldRun = weekSelection.includes(currentChineseDay); + return shouldRun; +} // 执行路径 async function AutoPath(locationName) { @@ -110,110 +146,37 @@ async function condensedResin() { } (async function () { - // 获取 - function validateAndStoreNumbers(input) { - // 去除所有空格 - const cleanedInput = input.replace(/\s/g, ''); - - // 使用正则表达式检测是否符合期望格式 - const regex = /^([1-7])(,([1-7]))*$/; - - // 检测输入字符串是否符合正则表达式 - if (regex.test(cleanedInput)) { - // 将输入字符串按逗号分割成数组 - const numbers = cleanedInput.split(','); - return numbers.map(Number); - } else { - return false; - } + // 检查配置是否存在 + if (!Object.keys(settings).includes("execute_Week")) { + log.error("首次运行前请编辑JS脚本自定义配置"); + return; } - // 获取调整后的星期几(考虑00:00~04:00视为前一天) - function getAdjustedDayOfWeek() { - const now = new Date(); - let dayOfWeek = now.getDay(); // 0-6 (0是周日) - const hours = now.getHours(); - - // 如果时间在00:00~04:00之间,视为前一天 - if (hours < 4) { - dayOfWeek = dayOfWeek === 0 ? 6 : dayOfWeek - 1; // 前一天 - log.info(`当前时间 ${now.getHours()}:${now.getMinutes()},视为前一天(星期 ${dayOfWeek === 0 ? 7 : dayOfWeek})`); - } else { - log.info(`当前时间 ${now.getHours()}:${now.getMinutes()},使用当天(星期 ${dayOfWeek === 0 ? 7 : dayOfWeek})`); - } - - // 转换为1-7格式(7代表周日) - return dayOfWeek === 0 ? 7 : dayOfWeek; + // 检查是否应该运行 + const executeWeek = Array.from(settings.execute_Week || []); + if (!shouldRunByWeekConfig(executeWeek)) { + log.info(`交互或拾取:"不运行"`); + return; } //main/====================================================================================== setGameMetrics(1920, 1080, 1) await genshin.returnMainUi(); - - // 判断设置合法性 - var items = []; - - // 每天都合成体力,开启后无视星期设定,运行完直接return跳出 - if (everyDay) { - log.info("已开启每天都合成体力,无视星期设置"); - try { - if (!location) { - location = "蒙德合成台"; - log.info(`未设置传送位置,默认前往 ${location}...`); - } - log.info(`正在前往 ${location} 合成浓缩树脂`); - await AutoPath(location); - await sleep(1000); - log.info("寻找合成台"); - await condensedResin(); - await sleep(1000); - await genshin.returnMainUi(); - return; - } catch (e) { - log.error("传送失败,请检查设置"); - return; + try { + if (!location) { + location = "蒙德合成台"; + log.info(`未设置传送位置,默认前往 ${location}...`); } - } - - if (settingsWeek && !everyDay) { - items = validateAndStoreNumbers(settingsWeek); - if (!items) { - log.error("星期设置格式错误,请使用类似'1,3,5,7'的格式"); - return; - } - - // 获取调整后的星期几(考虑00:00~04:00视为前一天) - const dayOfWeek = getAdjustedDayOfWeek(); - - // 检查当前星期是否在用户设置的范围内 - if (items.includes(dayOfWeek)) { - try { - // 读取配置文件 - if (!location) { - location = "璃月合成台"; - log.info(`未设置传送位置,默认前往 ${location}...`); - } - log.info(`今天是星期 ${dayOfWeek},正在前往 ${location} 合成浓缩树脂`); - await AutoPath(location); - await sleep(1000); - log.info("寻找合成台"); - await condensedResin(); - await sleep(1000); - await genshin.returnMainUi(); - } catch (e) { - log.error("传送失败,请检查设置"); - return; - } - } else { - log.info(`今天是星期 ${dayOfWeek},不需要合成体力`); - return; - } - } else if (!everyDay) { - log.error("还没有设置需要在星期几合成体力呢"); - log.error("请在调试器里添加本脚本->右键JS脚本->修改JS脚本自定义配置."); + log.info(`正在前往 ${location} 合成浓缩树脂`); + await AutoPath(location); + await sleep(1000); + log.info("寻找合成台"); + await condensedResin(); + await sleep(1000); + await genshin.returnMainUi(); + return; + } catch (e) { + log.error("传送失败,请检查设置"); return; } - - //main/**====================================================================================== - })(); \ No newline at end of file diff --git a/repo/js/AutoRefinedCondensationResin/manifest.json b/repo/js/AutoRefinedCondensationResin/manifest.json index 0b97447d2..bf06bd059 100644 --- a/repo/js/AutoRefinedCondensationResin/manifest.json +++ b/repo/js/AutoRefinedCondensationResin/manifest.json @@ -1,9 +1,9 @@ { "manifest_version": 1, "name": "自动合成浓缩树脂", - "version": "1.3", - "bgi_version": "0.47.0", - "description": "\n可前往多国合成台自动合成浓缩树脂(仅支持中文语言)。\n通过OCR技术确保准确进入合成台并完成合成操作。\n可设置特定星期执行任务(例:输入\"1,3,5,7\"在周一/三/五/日执行)。\n特殊时间处理:00:00~04:00视为前一天。", + "version": "1.4", + "bgi_version": "0.55.0", + "description": "\n可前往多国合成台自动合成浓缩树脂(仅支持中文语言)。\n可设置特定星期几执行任务。\n特殊时间处理:00:00~04:00视为前一天。", "tags": [ "OCR", "合成树脂" diff --git a/repo/js/AutoRefinedCondensationResin/settings.json b/repo/js/AutoRefinedCondensationResin/settings.json index 7a0a403d5..dff03613b 100644 --- a/repo/js/AutoRefinedCondensationResin/settings.json +++ b/repo/js/AutoRefinedCondensationResin/settings.json @@ -14,15 +14,26 @@ "default": "蒙德合成台" }, { - "name": "everyDay", - "type": "checkbox", - "label": "每日合成开关(开启后无视下方设定)", - "default": true - }, - { - "name": "week", - "type": "input-text", - "label": "指定执行星期\n(使用\",\"分割多个星期几)\n例:输入\"2,3,4,5,6,7\",会在星期2,3,4,5,6,日才合成体力", - "default": "2,3,4,5,6,7" + "name": "execute_Week", + "type": "multi-checkbox", + "label": "指定星期几运行", + "default": [ + "星期一", + "星期二", + "星期三", + "星期四", + "星期五", + "星期六", + "星期日" + ], + "options": [ + "星期一", + "星期二", + "星期三", + "星期四", + "星期五", + "星期六", + "星期日" + ] } ] \ No newline at end of file diff --git a/repo/js/尘歌壶一条龙/README.md b/repo/js/尘歌壶一条龙/README.md index dbfd63527..742e6424e 100644 --- a/repo/js/尘歌壶一条龙/README.md +++ b/repo/js/尘歌壶一条龙/README.md @@ -5,7 +5,6 @@ - 自动找阿圆领取奖励(宝钱+好感) - 自动购买物品 - 自动做饭、锻造 -- 智能安排执行时间 ## ⚙️ 设置说明 @@ -24,7 +23,7 @@ **格式同上** - 锻造路径示例:`D 2000` - 烹饪路径示例:`W 1000` -- 只在指定日期执行 +- 只在指定星期几执行 ### 4. 奖励领取设置 - ✅ 不领取角色好感 @@ -32,13 +31,8 @@ - 勾选=跳过,不勾选=领取 ### 5. 执行时间设置 -- **周几执行尘歌壶**:默认`1,3,6`(周一、三、六) - - 输入0=每天,输入1-7=周一到周日 - - 7代表周日 - -- **周几购买物品/做饭/锻造**:默认`1`(仅周一) - - 输入0=每天执行 - - 可设置多天:`1,3,5`(周一、三、五) +- 勾选星期几执行尘歌壶 +- 勾选星期几购买物品/做饭/锻造 ## 🚀 快速开始 1. 游戏分辨率设为:1920×1080 diff --git a/repo/js/尘歌壶一条龙/main.js b/repo/js/尘歌壶一条龙/main.js index d75c49a2b..e31d94aa5 100644 --- a/repo/js/尘歌壶一条龙/main.js +++ b/repo/js/尘歌壶一条龙/main.js @@ -1,43 +1,33 @@ +// 尘歌壶一条龙-领取洞天宝钱、角色好感和购买物品 async function main() { setGameMetrics(1920, 1080, 1); - // 获取调整后的周几 - const dayOfWeek = getAdjustedDayOfWeek(); - - // 检查是否需要跳过整个尘歌壶流程 - if (settings.week) { - const weekArray = validateAndStoreNumbers(settings.week); - - if (!weekArray) { - log.error("周设置格式错误,请使用类似'0,1,3,5,7'的格式(0表示每天运行),将跳过周检查"); - } else if (weekArray.length > 0) { - // 如果设置了0,表示每天运行,跳过周检查 - if (weekArray.includes(0)) { - log.info("周设置中包含0,每天运行尘歌壶流程"); - } else if (!weekArray.includes(dayOfWeek)) { - log.info(`今天是周 ${dayOfWeek},不在设置的周 ${settings.week} 中,跳过尘歌壶流程`); - return; - } - } + // 检查配置是否存在 + if (!Object.keys(settings).includes("execute_Week")) { + log.error("首次运行前请编辑JS脚本自定义配置"); + return; } - // 解析exchangeWeek设置,判断今天是否兑换物品 - let exchangeWeekArray = [1]; // 默认周一 - if (settings.exchangeWeek) { - const result = validateAndStoreNumbers(settings.exchangeWeek); - if (result) { - exchangeWeekArray = result; - } else { - log.error("exchangeWeek设置格式错误,将使用默认值(周一)"); - } + // 检查是否应该运行 + const executeWeek = Array.from(settings.execute_Week || []); + if (!shouldRunByWeekConfig(executeWeek)) { + log.info(`交互或拾取:"不运行"`); + return; } - + + // 检查是否应该执行 购买物品、锻造、烹饪 let shouldExchange = false; - if (exchangeWeekArray.includes(0)) { - shouldExchange = true; - log.info("exchangeWeek设置为0,每天兑换物品"); - } else if (exchangeWeekArray.includes(dayOfWeek)) { - shouldExchange = true; + const exchange_Week = Array.from(settings.exchange_Week || []); + + // 先检查配置是否为空 + if (exchange_Week.length === 0) { + log.info("额外流程未选择任何星期,不执行购买物品、烹饪、锻造"); + shouldExchange = false; + } else { + shouldExchange = shouldRunByWeekConfig(exchange_Week); + if (shouldExchange) { + log.info("额外流程执行日,将执行购买物品、锻造、烹饪"); + } } // 检查配置 @@ -66,9 +56,8 @@ async function main() { // 领取好感度以及洞天宝钱 await collectRewards(); - + if (shouldExchange) { - log.info(`今天是周 ${dayOfWeek},兑换物品`); // 兑换物品 await exchangeItems(); } @@ -79,11 +68,205 @@ async function main() { await sleep(1000); click(960, 540); - // 周N执行锻造任务和烹饪任务 +/** + * 根据星期配置判断是否运行脚本 + * @param {Array} weekSelection - 用户选择的星期数组(中文格式) + * @returns {boolean} 是否符合运行条件 + */ +function shouldRunByWeekConfig(weekSelection) { + const weekDays = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]; + + // 检查配置是否为空 + if (!Array.isArray(weekSelection) || weekSelection.length === 0) { + return false; + } + + // 取得调整后的星期(0-6,0=星期日) + const getAdjustedDayOfWeek = () => { + const now = new Date(); + let dayOfWeek = now.getDay(); // 0-6 + const hours = now.getHours(); + + // 凌晨 00:00~04:00 视为前一天 + if (hours < 4) { + dayOfWeek = dayOfWeek === 0 ? 6 : dayOfWeek - 1; + log.info(`当前时间 ${now.getHours()}:${now.getMinutes()},视为前一天(${weekDays[dayOfWeek]})`); + } else { + log.info(`当前时间 ${now.getHours()}:${now.getMinutes()},使用当天(${weekDays[dayOfWeek]})`); + } + + return dayOfWeek; + }; + + const adjustedDayOfWeek = getAdjustedDayOfWeek(); + const currentChineseDay = weekDays[adjustedDayOfWeek]; + + // 检查是否在允许的星期范围内 + const shouldRun = weekSelection.includes(currentChineseDay); + return shouldRun; +} + +// 检查配置 +function checkSettings() { + if (!settings.route) { + log.warn("当前未配置进入尘歌壶以后的路线,脚本可能无法正常运行"); + } + + // 记录是否跳过领取角色好感和洞天宝钱 + if (settings.skipCharacterReward) { + log.info("当前配置:不领取角色好感"); + } + + if (settings.skipTreasureReward) { + log.info("当前配置:不领取洞天宝钱"); + } +} + +// 打开背包并切换到小道具 +async function openBackpack() { + keyPress("B"); + await sleep(1000); + click(1048, 50); + await sleep(1000); +} + +// 查找并使用尘歌壶 +async function findAndUseSereniteaPot() { + await findSereniteaPot(); + await sleep(1000); + keyPress("F"); +} + +// 等待进入尘歌壶 +async function waitForEnteringSereniteaPot() { + // 先等待5秒,应该不会比这快 + await sleep(5000); + + // 等待传送完成 + let isEntering = true; + while (isEntering) { + let screen = captureGameRegion(); + let targetRegion = screen.DeriveCrop(85, 1025, 69, 28); + let ocrRo = RecognitionObject.Ocr(0, 0, targetRegion.Width, targetRegion.Height); + let ocrResult = targetRegion.find(ocrRo); + screen.dispose(); + targetRegion.dispose(); + if (ocrResult.Text.toLowerCase().includes("enter")) { + isEntering = false; + } + await sleep(1000); + } + + // 进入尘歌壶以后,等待1秒 + await sleep(1000); +} + +// 移动到阿圆并领取奖励 +async function collectRewards() { + log.info("开始领取好感度以及洞天宝钱"); + + click(1370, 432); + await sleep(1000); + + // 领取好感度 + if (!settings.skipCharacterReward) { + log.info("领取角色好感度"); + click(1810, 715); + log.info(`交互或拾取:"好感"`); + await sleep(1000); + + // 关闭洞天赠礼弹窗 + click(1346, 300); + await sleep(1000); + } else { + log.info("根据自定义配置,跳过领取角色好感度"); + } + + // 领取洞天宝钱 + if (!settings.skipTreasureReward) { + log.info("领取洞天宝钱"); + click(1080, 929); + log.info(`交互或拾取:"洞天宝钱"`); + await sleep(1000); + + // 关闭洞天财瓮弹窗 + click(1346, 300); + await sleep(1000); + } else { + log.info("根据自定义配置,跳过领取洞天宝钱"); + } + + // 关闭对话 + click(1864, 47); + await sleep(3000); +} + +async function findSereniteaPot() { + let currentX = 178; // 起始X坐标 + let searchCount = 0; // 添加查找次数计数器 + const MAX_SEARCH_COUNT = 5; // 最大查找次数 + + while (searchCount < MAX_SEARCH_COUNT) { + searchCount++; + // 点击当前坐标的小道具 + click(currentX, 188); + await sleep(1000); + + // 获取游戏区域截图 + let screen = captureGameRegion(); + + // 根据指定区域进行剪裁 + let targetRegion = screen.DeriveCrop(1307, 119, 493, 55); + + // 使用OCR识别 + let ocrRo = RecognitionObject.Ocr(0, 0, targetRegion.Width, targetRegion.Height); + let ocrResult = targetRegion.find(ocrRo); + screen.dispose(); + targetRegion.dispose(); + + if (!ocrResult.isEmpty() && ocrResult.Text.includes("尘歌壶")) { + // 点击指定坐标 + click(1690, 1020); + await sleep(1000); + // 检查一下背包页面是否退出了,有可能当前角色状态没法放置尘歌壶,直接再判断一次截图区域文本是不是尘歌壶就行 + let screen2 = captureGameRegion(); + // 根据指定区域进行剪裁 + let targetRegion2 = screen2.DeriveCrop(1307, 119, 493, 55); + let ocrRo2 = RecognitionObject.Ocr(0, 0, targetRegion2.Width, targetRegion2.Height); + let ocrResult2 = targetRegion2.find(ocrRo2); + screen2.dispose(); + targetRegion2.dispose(); + if (!ocrResult2.isEmpty() && ocrResult2.Text.includes("尘歌壶")) { + throw new Error("当前无法放置尘歌壶,请检查具体原因"); + } + return; + } else { + currentX += 145; // 向右移动145像素,查找下一个格子的小道具 + await sleep(100); + } + } + + throw new Error(`查找尘歌壶次数超过${MAX_SEARCH_COUNT}次,请检查背包是否存在尘歌壶`); +} + +async function moveToTarget(routeConfig) { + if (!routeConfig) return; + + const routes = routeConfig.split(',').map(r => r.trim()); + for (const route of routes) { + const [direction, time] = route.split(' '); + if (!direction || !time) continue; + + keyDown(direction); + await sleep(parseInt(time)); + keyUp(direction); + await sleep(500); + } +} + + // 星期几N执行锻造任务和烹饪任务 if (shouldExchange) { - log.info(`今天是周 ${dayOfWeek},执行锻造任务`); if (settings.forgingRoute) await handleForging(); - log.info(`今天是周 ${dayOfWeek},执行烹饪任务`); if (settings.cookingRoute) await handleCooking(); keyDown("a"); await sleep(2000); @@ -147,44 +330,6 @@ async function handleForging() { } } -// 获取当前周(考虑00:00~04:00视为前一天) - function getAdjustedDayOfWeek() { - const now = new Date(); - let dayOfWeek = now.getDay(); // 0-6 (0是周日) - const hours = now.getHours(); - - // 如果时间在00:00~04:00之间,视为前一天 - if (hours < 4) { - dayOfWeek = dayOfWeek === 0 ? 6 : dayOfWeek - 1; // 前一天 - log.info(`当前时间 ${now.getHours()}:${now.getMinutes()},视为前一天(周 ${dayOfWeek === 0 ? 7 : dayOfWeek})`); - } else { - log.info(`当前时间 ${now.getHours()}:${now.getMinutes()},使用当天(周 ${dayOfWeek === 0 ? 7 : dayOfWeek})`); - } - - // 转换为1-7格式(7代表周日) - return dayOfWeek === 0 ? 7 : dayOfWeek; - } - - // 验证周设置格式 - function validateAndStoreNumbers(input) { - if (!input) return false; - - // 去除所有空格 - const cleanedInput = input.replace(/\s/g, ''); - - // 使用正则表达式检测是否符合期望格式 - const regex = /^([0-7])(,([0-7]))*$/; - - // 检测输入字符串是否符合正则表达式 - if (regex.test(cleanedInput)) { - // 将输入字符串按逗号分割成数组 - const numbers = cleanedInput.split(','); - return numbers.map(Number); - } else { - return false; - } - } - async function exchangeItems() { if (!settings.itemsToBuy) { log.warn("未配置要购买的物品"); @@ -276,7 +421,7 @@ async function exchangeItems() { log.info(`开始购买物品: ${itemName}`); - // 执行购买流程 + // 运行购买流程 // 1. 鼠标移动到起始位置 moveMouseTo(1448, 693); await sleep(300); @@ -302,6 +447,7 @@ async function exchangeItems() { await sleep(1000); log.info(`成功购买物品: ${itemName}`); + log.info(`交互或拾取:"${itemName}"`); // 检查是否已找到所有物品 if (foundItems.length === itemsToBuy.length) { @@ -329,160 +475,4 @@ async function exchangeItems() { } -// 检查配置 -function checkSettings() { - if (!settings.route) { - log.warn("当前未配置进入尘歌壶以后的路线,脚本可能无法正常运行"); - } - - // 记录是否跳过领取角色好感和洞天宝钱 - if (settings.skipCharacterReward) { - log.info("当前配置:不领取角色好感"); - } - - if (settings.skipTreasureReward) { - log.info("当前配置:不领取洞天宝钱"); - } -} - -// 打开背包并切换到小道具 -async function openBackpack() { - keyPress("B"); - await sleep(1000); - click(1048, 50); - await sleep(1000); -} - -// 查找并使用尘歌壶 -async function findAndUseSereniteaPot() { - await findSereniteaPot(); - await sleep(1000); - keyPress("F"); -} - -// 等待进入尘歌壶 -async function waitForEnteringSereniteaPot() { - // 先等待5秒,应该不会比这快 - await sleep(5000); - - // 等待传送完成 - let isEntering = true; - while (isEntering) { - let screen = captureGameRegion(); - let targetRegion = screen.DeriveCrop(85, 1025, 69, 28); - let ocrRo = RecognitionObject.Ocr(0, 0, targetRegion.Width, targetRegion.Height); - let ocrResult = targetRegion.find(ocrRo); - screen.dispose(); - targetRegion.dispose(); - if (ocrResult.Text.toLowerCase().includes("enter")) { - isEntering = false; - } - await sleep(1000); - } - - // 进入尘歌壶以后,等待1秒 - await sleep(1000); -} - -// 移动到阿圆并领取奖励 -async function collectRewards() { - log.info("开始领取好感度以及洞天宝钱"); - - click(1370, 432); - await sleep(1000); - - // 领取好感度 - if (!settings.skipCharacterReward) { - log.info("领取角色好感度"); - click(1810, 715); - await sleep(1000); - - // 关闭洞天赠礼弹窗 - click(1346, 300); - await sleep(1000); - } else { - log.info("根据自定义配置,跳过领取角色好感度"); - } - - // 领取洞天宝钱 - if (!settings.skipTreasureReward) { - log.info("领取洞天宝钱"); - click(1080, 929); - await sleep(1000); - - // 关闭洞天财瓮弹窗 - click(1346, 300); - await sleep(1000); - } else { - log.info("根据自定义配置,跳过领取洞天宝钱"); - } - - // 关闭对话 - click(1864, 47); - await sleep(3000); -} - -async function findSereniteaPot() { - let currentX = 178; // 起始X坐标 - let searchCount = 0; // 添加查找次数计数器 - const MAX_SEARCH_COUNT = 5; // 最大查找次数 - - while (searchCount < MAX_SEARCH_COUNT) { - searchCount++; - // 点击当前坐标的小道具 - click(currentX, 188); - await sleep(1000); - - // 获取游戏区域截图 - let screen = captureGameRegion(); - - // 根据指定区域进行剪裁 - let targetRegion = screen.DeriveCrop(1307, 119, 493, 55); - - // 使用OCR识别 - let ocrRo = RecognitionObject.Ocr(0, 0, targetRegion.Width, targetRegion.Height); - let ocrResult = targetRegion.find(ocrRo); - screen.dispose(); - targetRegion.dispose(); - - if (!ocrResult.isEmpty() && ocrResult.Text.includes("尘歌壶")) { - // 点击指定坐标 - click(1690, 1020); - await sleep(1000); - // 检查一下背包页面是否退出了,有可能当前角色状态没法放置尘歌壶,直接再判断一次截图区域文本是不是尘歌壶就行 - let screen2 = captureGameRegion(); - // 根据指定区域进行剪裁 - let targetRegion2 = screen2.DeriveCrop(1307, 119, 493, 55); - let ocrRo2 = RecognitionObject.Ocr(0, 0, targetRegion2.Width, targetRegion2.Height); - let ocrResult2 = targetRegion2.find(ocrRo2); - screen2.dispose(); - targetRegion2.dispose(); - if (!ocrResult2.isEmpty() && ocrResult2.Text.includes("尘歌壶")) { - throw new Error("当前无法放置尘歌壶,请检查具体原因"); - } - return; - } else { - currentX += 145; // 向右移动145像素,查找下一个格子的小道具 - await sleep(100); - } - } - - throw new Error(`查找尘歌壶次数超过${MAX_SEARCH_COUNT}次,请检查背包是否存在尘歌壶`); -} - -async function moveToTarget(routeConfig) { - if (!routeConfig) return; - - const routes = routeConfig.split(',').map(r => r.trim()); - for (const route of routes) { - const [direction, time] = route.split(' '); - if (!direction || !time) continue; - - keyDown(direction); - await sleep(parseInt(time)); - keyUp(direction); - await sleep(500); - } -} - -main(); +main(); \ No newline at end of file diff --git a/repo/js/尘歌壶一条龙/manifest.json b/repo/js/尘歌壶一条龙/manifest.json index 441e1ebf1..81e5cf39a 100644 --- a/repo/js/尘歌壶一条龙/manifest.json +++ b/repo/js/尘歌壶一条龙/manifest.json @@ -1,7 +1,8 @@ { "manifest_version": 1, "name": "尘歌壶一条龙", - "version": "1.2", + "version": "1.3", + "bgi_version": "0.55.0", "description": "自动放置并进入尘歌壶,寻找阿圆,领取洞天宝钱和好感,做饭,锻造(需要配置进入尘歌壶以后的路线),支持自动购买指定物品。推荐洞天摹数81708444664", "tags": ["尘歌壶","模拟点击","周计划"], "authors": [ diff --git a/repo/js/尘歌壶一条龙/settings.json b/repo/js/尘歌壶一条龙/settings.json index fd78e6b25..f2eec6982 100644 --- a/repo/js/尘歌壶一条龙/settings.json +++ b/repo/js/尘歌壶一条龙/settings.json @@ -12,12 +12,12 @@ { "name": "forgingRoute", "type": "input-text", - "label": "锻造路径(格式同上),示例:D 2000\n周一自动执行" + "label": "锻造路径(格式同上),示例:D 2000" }, { "name": "cookingRoute", "type": "input-text", - "label": "烹饪路径(格式同上),示例:W 1000\n周一自动执行" + "label": "烹饪路径(格式同上),示例:W 1000" }, { "name": "skipCharacterReward", @@ -30,15 +30,39 @@ "label": "不领取洞天宝钱(注意是不领取)" }, { - "name": "week", - "type": "input-text", - "label": "指定周几执行\n(使用\",\"分割多个周几)\n例:输入\"2,3,4,5,6,7\",会在周2,3,4,5,6,日才运行尘歌壶流程", - "default": "1,3,6" + "name": "execute_Week", + "type": "multi-checkbox", + "label": "指定星期几运行", + "default": [ + "星期一", + "星期三", + "星期六" + ], + "options": [ + "星期一", + "星期二", + "星期三", + "星期四", + "星期五", + "星期六", + "星期日" + ] }, { - "name": "exchangeWeek", - "type": "input-text", - "label": "指定在周几购买物品、烹饪、锻造\n(使用\",\"分割多个周几,0表示每天)\n例:输入\"1,3,5\",会在周一、三、五购买物品、烹饪、锻造\n默认:1(周一)", - "default": "1" + "name": "exchange_Week", + "type": "multi-checkbox", + "label": "额外流程\n指定在星期几 购买物品、烹饪、锻造", + "default": [ + "星期一" + ], + "options": [ + "星期一", + "星期二", + "星期三", + "星期四", + "星期五", + "星期六", + "星期日" + ] } ] diff --git a/repo/js/纪行周常-10个boss一条龙/main.js b/repo/js/纪行周常-10个boss一条龙/main.js index 8f1ad0e52..66bfcf897 100644 --- a/repo/js/纪行周常-10个boss一条龙/main.js +++ b/repo/js/纪行周常-10个boss一条龙/main.js @@ -1,4 +1,56 @@ +/** + * 根据星期配置判断是否运行脚本 + * @param {Array} weekSelection - 用户选择的星期数组 + * @returns {boolean} 是否符合运行条件 + */ +function shouldRunByWeekConfig(weekSelection) { + const weekDays = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]; + + // 检查配置是否为空 + if (!Array.isArray(weekSelection) || weekSelection.length === 0) { + return false; + } + + // 取得调整后的星期(0-6,0=星期日) + const getAdjustedDayOfWeek = () => { + const now = new Date(); + let dayOfWeek = now.getDay(); // 0-6 + const hours = now.getHours(); + + // 凌晨 00:00~04:00 视为前一天 + if (hours < 4) { + dayOfWeek = dayOfWeek === 0 ? 6 : dayOfWeek - 1; + log.info(`当前时间 ${now.getHours()}:${now.getMinutes()},视为前一天(${weekDays[dayOfWeek]})`); + } else { + log.info(`当前时间 ${now.getHours()}:${now.getMinutes()},使用当天(${weekDays[dayOfWeek]})`); + } + + return dayOfWeek; + }; + + const adjustedDayOfWeek = getAdjustedDayOfWeek(); + const currentChineseDay = weekDays[adjustedDayOfWeek]; + + // 检查是否在允许的星期范围内 + const shouldRun = weekSelection.includes(currentChineseDay); + return shouldRun; +} + (async function () { + // 检查配置是否存在 + if (!Object.keys(settings).includes("execute_Week")) { + log.error("首次运行前请编辑JS脚本自定义配置"); + return; + } + + // 检查是否应该运行 + const executeWeek = Array.from(settings.execute_Week || []); + if (!shouldRunByWeekConfig(executeWeek)) { + log.info(`交互或拾取:"不运行"`); + return; + } + // ------------------------------------ + try { log.info(`请设置较长的战斗超时时间,否则超时后判定为战斗结束`); await sleep(1000); diff --git a/repo/js/纪行周常-10个boss一条龙/manifest.json b/repo/js/纪行周常-10个boss一条龙/manifest.json index 46afa8be8..df3bce7cd 100644 --- a/repo/js/纪行周常-10个boss一条龙/manifest.json +++ b/repo/js/纪行周常-10个boss一条龙/manifest.json @@ -1,7 +1,8 @@ { "manifest_version": 1, "name": "纪行周常-10个boss一条龙", - "version": "6.1", + "version": "6.1.1", + "bgi_version": "0.55.0", "description": "请看一看readme文件", "authors": [ { diff --git a/repo/js/纪行周常-10个boss一条龙/settings.json b/repo/js/纪行周常-10个boss一条龙/settings.json index 12dc530a8..2310446c2 100644 --- a/repo/js/纪行周常-10个boss一条龙/settings.json +++ b/repo/js/纪行周常-10个boss一条龙/settings.json @@ -1,4 +1,21 @@ [ + { + "name": "execute_Week", + "type": "multi-checkbox", + "label": "指定星期几运行", + "default": [ + "星期一" + ], + "options": [ + "星期一", + "星期二", + "星期三", + "星期四", + "星期五", + "星期六", + "星期日" + ] + }, { "name": "switchPartyName", "type": "input-text", @@ -16,44 +33,44 @@ "type": "select", "label": "选择讨伐BOSS(挂机打不过概不负责)", "options": [ - "爆炎树", - "半永恒统辖矩阵", - "掣电树", - "纯水精灵", - "翠翎恐蕈", - "深罪浸礼者", - "深邃摹结株", - "风蚀沙虫", - "冰风组曲-歌裴莉娅的葬送", - "冰风组曲-科培琉司的劫罚", - "古岩龙蜥", - "恒常机关阵列", - "急冻树", - "金焰绒翼龙暴君", - "雷音权现", - "灵觉隐修的迷者", - "魔像督军", - "秘源机兵·统御械", - "秘源机兵·构型械", - "魔偶剑鬼", - "千年珍珠骏麟", - "熔岩辉龙像", - "贪食匿叶龙山王", - "铁甲熔火帝皇", - "无相之草", - "无相之火", - "无相之雷", - "无相之水", - "无相之岩", - "水形幻人", - "实验性场力发生装置", - "霜夜巡天灵主", - "遗迹巨蛇", - "隐山猊兽", - "蕴光月幻蝶", - "兆载永劫龙兽", - "重拳出击鸭" - ] + "爆炎树", + "半永恒统辖矩阵", + "掣电树", + "纯水精灵", + "翠翎恐蕈", + "深罪浸礼者", + "深邃摹结株", + "风蚀沙虫", + "冰风组曲-歌裴莉娅的葬送", + "冰风组曲-科培琉司的劫罚", + "古岩龙蜥", + "恒常机关阵列", + "急冻树", + "金焰绒翼龙暴君", + "雷音权现", + "灵觉隐修的迷者", + "魔像督军", + "秘源机兵·统御械", + "秘源机兵·构型械", + "魔偶剑鬼", + "千年珍珠骏麟", + "熔岩辉龙像", + "贪食匿叶龙山王", + "铁甲熔火帝皇", + "无相之草", + "无相之火", + "无相之雷", + "无相之水", + "无相之岩", + "水形幻人", + "实验性场力发生装置", + "霜夜巡天灵主", + "遗迹巨蛇", + "隐山猊兽", + "蕴光月幻蝶", + "兆载永劫龙兽", + "重拳出击鸭" + ] }, { "name": "rounds", diff --git a/repo/js/纪行周常-10次秘境一条龙/main.js b/repo/js/纪行周常-10次秘境一条龙/main.js index f58dda72e..a99d523a3 100644 --- a/repo/js/纪行周常-10次秘境一条龙/main.js +++ b/repo/js/纪行周常-10次秘境一条龙/main.js @@ -1,4 +1,56 @@ +/** + * 根据星期配置判断是否运行脚本 + * @param {Array} weekSelection - 用户选择的星期数组 + * @returns {boolean} 是否符合运行条件 + */ +function shouldRunByWeekConfig(weekSelection) { + const weekDays = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]; + + // 检查配置是否为空 + if (!Array.isArray(weekSelection) || weekSelection.length === 0) { + return false; + } + + // 取得调整后的星期(0-6,0=星期日) + const getAdjustedDayOfWeek = () => { + const now = new Date(); + let dayOfWeek = now.getDay(); // 0-6 + const hours = now.getHours(); + + // 凌晨 00:00~04:00 视为前一天 + if (hours < 4) { + dayOfWeek = dayOfWeek === 0 ? 6 : dayOfWeek - 1; + log.info(`当前时间 ${now.getHours()}:${now.getMinutes()},视为前一天(${weekDays[dayOfWeek]})`); + } else { + log.info(`当前时间 ${now.getHours()}:${now.getMinutes()},使用当天(${weekDays[dayOfWeek]})`); + } + + return dayOfWeek; + }; + + const adjustedDayOfWeek = getAdjustedDayOfWeek(); + const currentChineseDay = weekDays[adjustedDayOfWeek]; + + // 检查是否在允许的星期范围内 + const shouldRun = weekSelection.includes(currentChineseDay); + return shouldRun; +} + (async function () { + // 检查配置是否存在 + if (!Object.keys(settings).includes("execute_Week")) { + log.error("首次运行前请编辑JS脚本自定义配置"); + return; + } + + // 检查是否应该运行 + const executeWeek = Array.from(settings.execute_Week || []); + if (!shouldRunByWeekConfig(executeWeek)) { + log.info(`交互或拾取:"不运行"`); + return; + } + // ------------------------------------ + // 1. 基础设置 setGameMetrics(1920, 1080, 1); diff --git a/repo/js/纪行周常-10次秘境一条龙/manifest.json b/repo/js/纪行周常-10次秘境一条龙/manifest.json index 7df5c35f9..bb8dc5098 100644 --- a/repo/js/纪行周常-10次秘境一条龙/manifest.json +++ b/repo/js/纪行周常-10次秘境一条龙/manifest.json @@ -1,7 +1,8 @@ { "manifest_version": 1, "name": "纪行周常-10次秘境一条龙", - "version": "1.4", + "version": "1.5", + "bgi_version": "0.55.0", "description": "", "authors": [ { diff --git a/repo/js/纪行周常-10次秘境一条龙/settings.json b/repo/js/纪行周常-10次秘境一条龙/settings.json index 18714e2d7..27023544c 100644 --- a/repo/js/纪行周常-10次秘境一条龙/settings.json +++ b/repo/js/纪行周常-10次秘境一条龙/settings.json @@ -1,5 +1,21 @@ [ { + "name": "execute_Week", + "type": "multi-checkbox", + "label": "指定星期几运行", + "default": [ + "星期一" + ], + "options": [ + "星期一", + "星期二", + "星期三", + "星期四", + "星期五", + "星期六", + "星期日" + ] + },{ "name": "partyName", "type": "input-text", "label": "队伍名称(默认不切换)"