diff --git a/repo/js/铁匠铺/assets/枫丹铁匠铺.json b/repo/js/铁匠铺/assets/Pathing/枫丹铁匠铺.json similarity index 99% rename from repo/js/铁匠铺/assets/枫丹铁匠铺.json rename to repo/js/铁匠铺/assets/Pathing/枫丹铁匠铺.json index 62cbad267..632c8d4c5 100644 --- a/repo/js/铁匠铺/assets/枫丹铁匠铺.json +++ b/repo/js/铁匠铺/assets/Pathing/枫丹铁匠铺.json @@ -45,4 +45,4 @@ "action_params": "" } ] -} \ No newline at end of file +} diff --git a/repo/js/铁匠铺/assets/璃月铁匠铺.json b/repo/js/铁匠铺/assets/Pathing/璃月铁匠铺.json similarity index 99% rename from repo/js/铁匠铺/assets/璃月铁匠铺.json rename to repo/js/铁匠铺/assets/Pathing/璃月铁匠铺.json index 0bae697a4..738dca60e 100644 --- a/repo/js/铁匠铺/assets/璃月铁匠铺.json +++ b/repo/js/铁匠铺/assets/Pathing/璃月铁匠铺.json @@ -72,4 +72,4 @@ "action_params": "" } ] -} \ No newline at end of file +} diff --git a/repo/js/铁匠铺/assets/稻妻铁匠铺.json b/repo/js/铁匠铺/assets/Pathing/稻妻铁匠铺.json similarity index 100% rename from repo/js/铁匠铺/assets/稻妻铁匠铺.json rename to repo/js/铁匠铺/assets/Pathing/稻妻铁匠铺.json diff --git a/repo/js/铁匠铺/assets/蒙德铁匠铺.json b/repo/js/铁匠铺/assets/Pathing/蒙德铁匠铺.json similarity index 99% rename from repo/js/铁匠铺/assets/蒙德铁匠铺.json rename to repo/js/铁匠铺/assets/Pathing/蒙德铁匠铺.json index e3fb194a7..9480f11ad 100644 --- a/repo/js/铁匠铺/assets/蒙德铁匠铺.json +++ b/repo/js/铁匠铺/assets/Pathing/蒙德铁匠铺.json @@ -45,4 +45,4 @@ "action_params": "" } ] -} \ No newline at end of file +} diff --git a/repo/js/铁匠铺/assets/须弥铁匠铺.json b/repo/js/铁匠铺/assets/Pathing/须弥铁匠铺.json similarity index 99% rename from repo/js/铁匠铺/assets/须弥铁匠铺.json rename to repo/js/铁匠铺/assets/Pathing/须弥铁匠铺.json index 7cc19a222..14aff7853 100644 --- a/repo/js/铁匠铺/assets/须弥铁匠铺.json +++ b/repo/js/铁匠铺/assets/Pathing/须弥铁匠铺.json @@ -54,4 +54,4 @@ "action_params": "" } ] -} \ No newline at end of file +} diff --git a/repo/js/铁匠铺/assets/Picture/AmethystLump.png b/repo/js/铁匠铺/assets/Picture/AmethystLump.png new file mode 100644 index 000000000..ed65d9e7c Binary files /dev/null and b/repo/js/铁匠铺/assets/Picture/AmethystLump.png differ diff --git a/repo/js/铁匠铺/assets/Picture/CondessenceCrystal.png b/repo/js/铁匠铺/assets/Picture/CondessenceCrystal.png new file mode 100644 index 000000000..6f718d115 Binary files /dev/null and b/repo/js/铁匠铺/assets/Picture/CondessenceCrystal.png differ diff --git a/repo/js/铁匠铺/assets/Picture/CrystalChunk.png b/repo/js/铁匠铺/assets/Picture/CrystalChunk.png new file mode 100644 index 000000000..83b7ea1f8 Binary files /dev/null and b/repo/js/铁匠铺/assets/Picture/CrystalChunk.png differ diff --git a/repo/js/铁匠铺/assets/Picture/IronChunk.png b/repo/js/铁匠铺/assets/Picture/IronChunk.png new file mode 100644 index 000000000..54606019e Binary files /dev/null and b/repo/js/铁匠铺/assets/Picture/IronChunk.png differ diff --git a/repo/js/铁匠铺/assets/Picture/Starsilver.png b/repo/js/铁匠铺/assets/Picture/Starsilver.png new file mode 100644 index 000000000..879e86963 Binary files /dev/null and b/repo/js/铁匠铺/assets/Picture/Starsilver.png differ diff --git a/repo/js/铁匠铺/assets/Picture/WhiteIronChunk.png b/repo/js/铁匠铺/assets/Picture/WhiteIronChunk.png new file mode 100644 index 000000000..33e592a2c Binary files /dev/null and b/repo/js/铁匠铺/assets/Picture/WhiteIronChunk.png differ diff --git a/repo/js/铁匠铺/main.js b/repo/js/铁匠铺/main.js index e71e7d47c..19f4b245f 100644 --- a/repo/js/铁匠铺/main.js +++ b/repo/js/铁匠铺/main.js @@ -1,85 +1,172 @@ (async function () { - /// - // 读取用户配置 - /// - let smithyName = settings.smithyName != undefined ? settings.smithyName : "须弥铁匠铺"; - let ore = settings.ore != undefined ? settings.ore : ''; + // 设置游戏基础参数 + setGameMetrics(1920, 1080, 1.25); // 设置编写脚本环境的游戏分辨率和DPI缩放 + await genshin.returnMainUi(); // 返回主界面 - /// - // 定义函数 - /// - // 自动前往铁匠铺 - async function autoSmithy(smithyName) { - log.info(`自动前往 ${smithyName}`); - try { - let filePath = `assets/${smithyName}.json`; - await pathingScript.runFile(filePath); - } catch (error) { - log.error(`执行 ${smithyName} 路径时发生错误`); - log.error(error.toString()); - } + /// + // 读取用户配置 + /// + let smithyName = settings.smithyName || "枫丹铁匠铺"; + let ore = settings.ore || "水晶块"; + + // 定义矿物名称和图片文件名的映射表 + const ingredientImageMap = { + 萃凝晶: "assets/Picture/CondessenceCrystal.png", + + 紫晶块: "assets/Picture/AmethystLump.png", + 水晶块: "assets/Picture/CrystalChunk.png", + 星银矿石: "assets/Picture/Starsilver.png", + 白铁块: "assets/Picture/WhiteIronChunk.png", + 铁块: "assets/Picture/IronChunk.png", + }; + + // Ore 映射为中文 + const OreChineseMap = { + 萃凝晶: "萃凝晶", + 紫晶块: "紫晶块", + 水晶块: "水晶块", + 星银矿石: "星银矿石", + 白铁块: "白铁块", + 铁块: "铁块", + // 添加其他加工设置的中文映射 + }; + + // 获取中文描述和图像路径 + const processingKey = settings.ore || "水晶块"; + const chineseDescription = OreChineseMap[processingKey]; + const imagePath = ingredientImageMap[processingKey]; + + // 行列数的排列组合 + const rows = [1, 2, 3]; // 行数 + const cols = [1, 2, 3, 4, 5]; // 列数 + const gridCoordinates = []; + + // 计算每个行列组合的坐标 + for (const row of rows) { + for (const col of cols) { + const ProcessingX = Math.round(135 + (col - 1) * 145); + const ProcessingY = Math.round(245 + (row - 1) * 170); + gridCoordinates.push({ row, col, x: ProcessingX, y: ProcessingY }); } + } - //确认使用矿石 - function determineOre() { - if (ore == '水晶块') - {log.info("将使用 水晶块 锻造矿石");} - else if (ore == '紫晶块') - {log.info("将使用 紫晶块 锻造矿石");} - else if (ore == '萃凝晶') - {log.info("将使用 萃凝晶 锻造矿石");} - else - {log.info("无指定矿石,将使用 水晶块 锻造矿石");} + // 图像识别函数 + function recognizeImage(imagePath, x, y, searchWidth, searchHeight) { + try { + let template = file.ReadImageMatSync(imagePath); + let recognitionObject = RecognitionObject.TemplateMatch( + template, + x, + y, + searchWidth, + searchHeight + ); + + // 设置识别阈值和通道 + recognitionObject.threshold = 0.9; // 设置识别阈值为 0.9 + recognitionObject.Use3Channels = true; // 使用三通道匹配 + + let result = captureGameRegion().find(recognitionObject); + return result.isExist() ? result : null; + } catch (error) { + log.error(`图像识别失败,路径: ${imagePath}, 错误: ${error.message}`); + return null; } + } + // 自动前往铁匠铺 + async function autoSmithy(smithyName) { + log.info(`自动前往 ${smithyName}`); + try { + let filePath = `assets/Pathing/${smithyName}.json`; + await pathingScript.runFile(filePath); + } catch (error) { + log.error(`执行 ${smithyName} 路径时发生错误`); + log.error(error.toString()); + } + } - const forgeOre = async function (smithyName) { - await sleep(1000); - keyPress("F"); await sleep(1000); // 开始交互 - await click(960, 600); await sleep(1000); // 跳过第一个对话 - await click(960, 600); await sleep(1000); // 跳过第一个对话 - await click(1375, 500); await sleep(1000); - await click(960, 600); await sleep(1000); // 跳过第二个对话 - await click(960, 600); await sleep(1000); // 跳过第二个对话 - log.info("已进入锻造界面,开始锻造"); + // 确认使用矿石 + function determineOre() { + if (ore == "水晶块") { + log.info("将使用 水晶块 锻造矿石"); + } else if (ore == "紫晶块") { + log.info("将使用 紫晶块 锻造矿石"); + } else if (ore == "萃凝晶") { + log.info("将使用 萃凝晶 锻造矿石"); + } else { + log.info("无指定矿石,将使用 水晶块 锻造矿石"); + } + } + + // 锻造矿石操作 + const forgeOre = async function (smithyName) { + await sleep(1000); + keyPress("F"); + await sleep(1000); // 开始交互 + await click(960, 600); + await sleep(1000); // 跳过第一个对话 + await click(960, 600); + await sleep(1000); // 跳过第一个对话 + await click(1375, 500); + await sleep(1000); + await click(960, 600); + await sleep(1000); // 跳过第二个对话 + await click(960, 600); + await sleep(1000); // 跳过第二个对话 + + log.info("已进入锻造界面,准备锻造"); + // 锻造领取 + await click(520, 140); + await sleep(1000); // 选择锻造队列 + await click(170, 1010); + await sleep(1000); // 领取全部 + await click(960, 900); + await sleep(1000); // 确认 + + click(220, 150); + await sleep(1000); // 点击"配方" determineOre(); - await click(520, 140); await sleep(1000); // 选择锻造队列 - await click(170, 1010); await sleep(1000); // 领取全部 - await click(960, 900); await sleep(1000); // 确认 - click(220, 150);await sleep(1000);// 点击"配方" // 根据用户选择的矿石进行锻造 - if (ore == '水晶块') - {click(545, 290);} - else if (ore == '紫晶块') - {click(685, 290);} - else if (ore == '萃凝晶') - {click(120, 455);} - else { - // 无指定矿石,将使用 水晶块 锻造矿石 - click(545, 290); + if (!imagePath) { + log.error(`未找到矿石图像路径: ${chineseDescription}`); + } else { + log.info(`开始识别矿石: ${chineseDescription}`); + + // 左上角的偏移量 + const scanOffset = { x: -35, y: -35 }; + let foundIngredient = false; + for (const coordinate of gridCoordinates) { + const scanX = coordinate.x + scanOffset.x; + const scanY = coordinate.y + scanOffset.y; + + const imageResult = recognizeImage(imagePath, scanX, scanY, 70, 70); + if (imageResult) { + log.info(`通过图像识别找到矿石: ${chineseDescription}`); + imageResult.click(); + await sleep(2000); // 等待点击生效 + foundIngredient = true; + + // 点击“开始锻造”3次 + click(1645, 1015); + await sleep(3000); + click(1645, 1015); + await sleep(3000); + click(1645, 1015); + await sleep(3000); + break; // 找到矿石后退出循环 + } + } + if (!foundIngredient) { + log.error(`未能识别到矿石: ${chineseDescription}`); + } } - await sleep(1000); - // 按合成按钮3次 - click(1645, 1015); - await sleep(4000); - click(1645, 1015); - await sleep(4000); - click(1645, 1015); - await sleep(4000); - - log.info("锻造结束,退出界面"); // 退出锻造界面 - click(1845, 45); - await sleep(1000); -} - /// - // main - /// - setGameMetrics(1920, 1080, 1); - await autoSmithy(smithyName);// 设置游戏窗口大小和DPI - await forgeOre(smithyName); - - + log.info("锻造结束,退出界面"); + keyPress("ESCAPE"); + }; + await autoSmithy(smithyName); //寻路函数 + await forgeOre(smithyName); })(); diff --git a/repo/js/铁匠铺/manifest.json b/repo/js/铁匠铺/manifest.json index 5c61c3581..dc804ea21 100644 --- a/repo/js/铁匠铺/manifest.json +++ b/repo/js/铁匠铺/manifest.json @@ -1,13 +1,13 @@ { "manifest_version": 1, "name": "自动锻造魔矿", - "version": "1.0", - "description": "自动选择铁匠铺和使用矿物去锻造魔矿。\n注1:默认选择枫丹铁匠铺,可选择其他地区铁匠铺。由于地图追踪功能不支持室内定位,所以不支持纳塔铁匠铺;\n注2:可选使用水晶矿(默认)、紫晶矿、萃凝晶。\n注3:需要每种矿至少能合成一次。\n鸣谢:寒露,蜜柑魚", + "version": "1.1(2025.05.01版)", + "description": "自动选择铁匠铺和使用矿物去锻造魔矿。\n注1:默认选择枫丹铁匠铺,可选择其他地区铁匠铺。由于地图追踪功能不支持室内定位,所以不支持纳塔铁匠铺;\n注2:可选使用水晶矿(默认)、紫晶矿、萃凝晶。\n鸣谢:寒露,蜜柑魚", "authors": [ { - "name": "呱呱z", + "name": "呱呱z" } ], "settings_ui": "settings.json", "main": "main.js" -} \ No newline at end of file +} diff --git a/repo/js/铁匠铺/settings.json b/repo/js/铁匠铺/settings.json index 5c0623eff..b5c1596e1 100644 --- a/repo/js/铁匠铺/settings.json +++ b/repo/js/铁匠铺/settings.json @@ -14,10 +14,13 @@ { "name": "ore", "type": "select", - "label": "锻造用矿(默认:水晶矿)", + "label": "锻造用矿(默认:水晶块)", "options": [ - "水晶矿", + "水晶块", "紫晶块", + //"星银矿石", + //"白铁块", + //"铁块", "萃凝晶" ] }