Files
2025-07-24 11:55:05 +08:00

208 lines
7.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 识图资料
const confirmRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/confirm.png"));
const CondensedResin = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/Condensed_Resin.png"));
// 读取配置文件
const location = settings.location;
const settingsWeek = settings.week;
const everyDay = settings.everyDay;
// 执行路径
async function AutoPath(locationName) {
try {
let filePath = `assets/Pathing/${locationName}.json`;
await pathingScript.runFile(filePath);
return true;
} catch (error) {
log.error(`执行 ${locationName} 路径时发生错误`);
log.error(error.message);
}
return false;
}
// 合成浓缩树脂
async function condensedResin() {
let captureRegion = captureGameRegion();
// 记录是否找到合成台
let Alchemy = false;
let retryCount = 0;
const maxRetries = 2; // 最大重试次数
while (!Alchemy && retryCount <= maxRetries) {
// 对整个区域进行 OCR
let resList = captureRegion.findMulti(RecognitionObject.ocrThis);
for (let i = 0; i < resList.count; i++) {
if (resList[i].text.includes("合成")) {
// 找到合成台,点击合成台
log.info("寻找合成台成功,开始与合成台交互");
keyDown("VK_MENU");// Alt
await sleep(1000);
click(resList[i].x + 30, resList[i].y + 30); // 点击合成台选项
await sleep(1000);
click(resList[i].x + 30, resList[i].y + 30); // 跳过合成台对话
await sleep(1500);
keyUp("VK_MENU");// Alt
await sleep(1000);
// 图像识别浓缩树脂
let Resin = captureGameRegion().find(CondensedResin);
if (Resin.isExist()) {
Resin.click();
log.info("找到浓缩树脂,开始合成体力");
await sleep(750);
let confirm = captureGameRegion().find(confirmRo);
if (confirm.isExist()) {
confirm.click(); // 点击合成
await sleep(5000);
click(975, 900); // 点击确认,关闭合成成功资料
log.info("已完成合成浓缩树脂");
}
} else {
log.warn("未能识别到浓缩树脂,不合成");
}
await sleep(1000);
click(1845, 50); // 关闭页面
await sleep(2000);
Alchemy = true;
break; // 找到合成台后跳出循环
}
}
if (!Alchemy) {
retryCount++;
if (retryCount <= maxRetries) {
log.warn(`未找到合成台,进行第 (${retryCount}/${maxRetries}) 次重试`);
await sleep(1500);
// 重新尝试路径执行
try {
await AutoPath(location);
await sleep(1000);
captureRegion = captureGameRegion(); // 刷新捕获区域
} catch (error) {
log.error(`路径重试失败: ${error.message}`);
}
}
}
}
if (!Alchemy) {
log.error(`连续${maxRetries}次未能找到合成台,中止任务`);
}
return Alchemy;
}
(async function () {
function validateAndStoreNumbers(input) {
// 定义存储结果的数组
let storedNumbers = [];
// 使用正则表达式检测是否符合期望格式
const regex = /^(\b([1-9]|1[0-5])\b)(,(\b([1-9]|1[0-5])\b))*$/;
// 检测输入字符串是否符合正则表达式
if (regex.test(input)) {
// 将输入字符串按逗号分割成数组
const numbers = input.split(',');
// 将分割后的数字字符串转换为整数并存储到数组中
storedNumbers = numbers.map(Number);
return storedNumbers;
} else {
return false
}
}
// 获取调整后的星期几考虑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;
}
//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;
}
}
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脚本自定义配置.");
return;
}
//main/**======================================================================================
})();