208 lines
7.5 KiB
JavaScript
208 lines
7.5 KiB
JavaScript
// 识图资料
|
||
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/**======================================================================================
|
||
|
||
})(); |