mirror of
https://github.com/babalae/bettergi-scripts-list.git
synced 2026-03-15 03:23:22 +08:00
部份腳本-增加指定星期几运行 (#2796)
* 尘歌壶一条龙-增加指定星期几运行 * -增加指定星期几运行(多選) * 纪行周常-10个boss一条龙-增加指定星期几运行 * 纪行周常-10个boss一条龙-增加指定星期几运行
This commit is contained in:
@@ -7,26 +7,10 @@
|
||||
- 自动适应游戏内时间机制
|
||||
3. **灵活执行设置**:
|
||||
- 支持每日自动执行
|
||||
- 可指定每周特定日期执行
|
||||
4. **精准识别技术**:
|
||||
- 使用OCR确保操作准确性
|
||||
- 仅支持中文游戏界面
|
||||
- 可指定每星期特定星期几执行
|
||||
|
||||
## 参数说明
|
||||
| 参数名 | 类型 | 说明 |
|
||||
|------------|------------|----------------------------------------------------------------------|
|
||||
| **合成台位置** | 下拉选择 | 可选:蒙德/璃月/稻妻/枫丹<br>默认:璃月合成台 |
|
||||
| **每日执行开关** | 复选框 | 开启后无视星期设置,每日自动执行 |
|
||||
| **指定执行星期** | 文本输入 | 格式:逗号分隔数字(1=周一,7=周日)<br>例:`2,3,4,5,6,7` |
|
||||
|
||||
|
||||
### 更新日志
|
||||
### 1.3
|
||||
1. 更改默认合成台為蒙德合成台
|
||||
### 1.2
|
||||
1. 合成树脂前先解除筛选状态
|
||||
### 1.1
|
||||
1. 修正指定执行星期只输入1个数字时执行错误
|
||||
### 1.0
|
||||
|
||||
1. 初始版本发布
|
||||
| **指定执行星期** | 勾选 | 勾选星期一~星期日 |
|
||||
|
||||
@@ -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/**======================================================================================
|
||||
|
||||
})();
|
||||
@@ -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",
|
||||
"合成树脂"
|
||||
|
||||
@@ -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": [
|
||||
"星期一",
|
||||
"星期二",
|
||||
"星期三",
|
||||
"星期四",
|
||||
"星期五",
|
||||
"星期六",
|
||||
"星期日"
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -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
|
||||
|
||||
@@ -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("额外流程执行日,将执行购买物品、锻造、烹饪");
|
||||
}
|
||||
}
|
||||
|
||||
// 检查配置
|
||||
@@ -68,7 +58,6 @@ 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();
|
||||
@@ -1,7 +1,8 @@
|
||||
{
|
||||
"manifest_version": 1,
|
||||
"name": "尘歌壶一条龙",
|
||||
"version": "1.2",
|
||||
"version": "1.3",
|
||||
"bgi_version": "0.55.0",
|
||||
"description": "自动放置并进入尘歌壶,寻找阿圆,领取洞天宝钱和好感,做饭,锻造(需要配置进入尘歌壶以后的路线),支持自动购买指定物品。推荐洞天摹数81708444664",
|
||||
"tags": ["尘歌壶","模拟点击","周计划"],
|
||||
"authors": [
|
||||
|
||||
@@ -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": [
|
||||
"星期一",
|
||||
"星期二",
|
||||
"星期三",
|
||||
"星期四",
|
||||
"星期五",
|
||||
"星期六",
|
||||
"星期日"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
{
|
||||
"manifest_version": 1,
|
||||
"name": "纪行周常-10次秘境一条龙",
|
||||
"version": "1.4",
|
||||
"version": "1.5",
|
||||
"bgi_version": "0.55.0",
|
||||
"description": "",
|
||||
"authors": [
|
||||
{
|
||||
|
||||
@@ -1,5 +1,21 @@
|
||||
[
|
||||
{
|
||||
"name": "execute_Week",
|
||||
"type": "multi-checkbox",
|
||||
"label": "指定星期几运行",
|
||||
"default": [
|
||||
"星期一"
|
||||
],
|
||||
"options": [
|
||||
"星期一",
|
||||
"星期二",
|
||||
"星期三",
|
||||
"星期四",
|
||||
"星期五",
|
||||
"星期六",
|
||||
"星期日"
|
||||
]
|
||||
},{
|
||||
"name": "partyName",
|
||||
"type": "input-text",
|
||||
"label": "队伍名称(默认不切换)"
|
||||
|
||||
Reference in New Issue
Block a user