JS : 自动合成浓缩树脂 (#1395)

This commit is contained in:
this-Fish
2025-07-24 11:55:05 +08:00
committed by GitHub
parent dbce1989bc
commit b6823e0062
10 changed files with 418 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
# 自动合成浓缩树脂脚本
## 功能特点
1. **多国合成台支持**:可前往蒙德/璃月/稻妻/枫丹合成台
2. **智能时间判定**
- 00:00~04:00 视为前一天
- 自动适应游戏内时间机制
3. **灵活执行设置**
- 支持每日自动执行
- 可指定每周特定日期执行
4. **精准识别技术**
- 使用OCR确保操作准确性
- 仅支持中文游戏界面
## 参数说明
| 参数名 | 类型 | 说明 |
|------------|------------|----------------------------------------------------------------------|
| location | 下拉选择 | **合成台位置**<br>可选:蒙德/璃月/稻妻/枫丹<br>默认:璃月合成台 |
| everyDay | 复选框 | **每日执行开关**<br>开启后无视星期设置,每日自动执行 |
| week | 文本输入 | **指定执行星期**<br>格式逗号分隔数字1=周一,7=周日)<br>例:`2,3,4,5,6,7` |

View File

@@ -0,0 +1,30 @@
{
"info": {
"name": "枫丹合成台",
"type": "collect",
"author": "naralan",
"version": "1.0",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"action": "",
"move_mode": "walk",
"type": "teleport",
"x": 4509.25,
"y": 3624.5,
"action_params": ""
},
{
"id": 2,
"action": "",
"move_mode": "walk",
"type": "path",
"x": 4479.5,
"y": 3627.8,
"action_params": ""
}
]
}

View File

@@ -0,0 +1,39 @@
{
"info": {
"name": "璃月合成台",
"type": "collect",
"author": "naralan",
"version": "1.0",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 281.5,
"y": -674,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "teleport"
},
{
"id": 2,
"x": 264,
"y": -660,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "path"
},
{
"id": 3,
"x": 267.8,
"y": -652.5,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "path"
}
]
}

View File

@@ -0,0 +1,39 @@
{
"info": {
"name": "稻妻合成台",
"type": "collect",
"author": "naralan",
"version": "1.0",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"action": "",
"move_mode": "walk",
"type": "teleport",
"x": -4399.5,
"y": -3053,
"action_params": ""
},
{
"id": 3,
"action": "",
"move_mode": "walk",
"type": "path",
"x": -4416.5,
"y": -3076.7,
"action_params": ""
},
{
"id": 4,
"action": "",
"move_mode": "walk",
"type": "path",
"x": -4434,
"y": -3093.2,
"action_params": ""
}
]
}

View File

@@ -0,0 +1,39 @@
{
"info": {
"name": "蒙德合成台",
"type": "collect",
"author": "naralan",
"version": "1.0",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"action": "",
"move_mode": "walk",
"type": "teleport",
"x": -872.75,
"y": 2275.5,
"action_params": ""
},
{
"id": 2,
"action": "",
"move_mode": "walk",
"type": "path",
"x": -886,
"y": 2267,
"action_params": ""
},
{
"id": 2,
"action": "",
"move_mode": "walk",
"type": "path",
"x": -889.8,
"y": 2267.5,
"action_params": ""
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,208 @@
// 识图资料
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/**======================================================================================
})();

View File

@@ -0,0 +1,15 @@
{
"manifest_version": 1,
"name": "自动合成浓缩树脂",
"version": "1.0",
"bgi_version": "0.47.0",
"description": "\n可前往多国合成台自动合成浓缩树脂仅支持中文语言。\n通过OCR技术确保准确进入合成台并完成合成操作。\n可设置特定星期执行任务输入\"1,3,5,7\"在周一/三/五/日执行)。\n特殊时间处理00:00~04:00视为前一天。",
"tags": [],
"authors": [
{
"name": "蜜柑魚"
}
],
"settings_ui": "settings.json",
"main": "main.js"
}

View File

@@ -0,0 +1,28 @@
[
{
"name": "location",
"type": "select",
"label": "合成台位置(默认:璃月合成台)",
"options": [
"蒙德合成台",
"璃月合成台",
"稻妻合成台",
//"须弥合成台",
//"纳塔合成台",
"枫丹合成台"
],
"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"
}
]