铁匠铺1.40521新增矿石不足时自动选用备用选项 (#894)

* Delete repo/js/铁匠铺/readme(25.05.20).md

* 铁匠铺1.40521新增矿石不足时自动选用备用选项
This commit is contained in:
呱呱z
2025-05-21 07:42:23 +08:00
committed by GitHub
parent e37e84394e
commit c08078cf51
5 changed files with 216 additions and 165 deletions

View File

@@ -2,20 +2,18 @@
// 设置通知状态
let notice = settings.notice ?? false;
// 设置游戏基础参数/初始化
setGameMetrics(1920, 1080, 1.25); // 设置编写脚本环境的游戏分辨率和DPI缩放
await genshin.returnMainUi(); // 返回主界面
setGameMetrics(1920, 1080, 1.25);
await genshin.returnMainUi();
if (notice) {
notification.send("自动锻造矿石脚本开始");
}
///
// 读取用户配置
///
let smithyName = settings.smithyName || "枫丹铁匠铺";
let ore = settings.ore || "水晶块";
let primaryOre = settings.ore || "水晶块";
let secondaryOre = settings.secondaryOre || "萃凝晶"; // 新增备选矿物2
let tertiaryOre = settings.tertiaryOre || "紫晶块"; // 新增备选矿物3
// 定义矿物名称和图片文件名的映射表
const ingredientImageMap = {
@@ -35,20 +33,13 @@
星银矿石: "星银矿石",
白铁块: "白铁块",
铁块: "铁块",
// 添加其他加工设置的中文映射
};
// 获取中文描述和图像路径
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 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(150 + (col - 1) * 145);
@@ -62,11 +53,8 @@
try {
let template = file.ReadImageMatSync(imagePath);
let recognitionObject = RecognitionObject.TemplateMatch(template, x, y, searchWidth, searchHeight);
// 设置识别阈值和通道
recognitionObject.threshold = 0.85; // 设置识别阈值
recognitionObject.Use3Channels = true; // 使用三通道匹配
recognitionObject.threshold = 0.85;
recognitionObject.Use3Channels = true;
let result = captureGameRegion().find(recognitionObject);
return result.isExist() ? result : null;
} catch (error) {
@@ -81,9 +69,7 @@
// 自动前往铁匠铺
async function autoSmithy(smithyName) {
log.info(`自动前往 ${smithyName}`);
try {
let filePath = `assets/Pathing/${smithyName}.json`;
await pathingScript.runFile(filePath);
@@ -102,102 +88,131 @@
}
// 确认使用矿石
function determineOre() {
let message;
if (ore === "水晶块") {
message = "将使用 水晶块 锻造矿石";
} else if (ore === "紫晶块") {
message = "将使用 紫晶块 锻造矿石";
} else if (ore === "萃凝晶") {
message = "将使用 萃凝晶 锻造矿石";
} else {
message = "无指定矿石,将使用 水晶块 锻造矿石";
}
function determineOre(oreType) {
let message = `将使用 ${OreChineseMap[oreType]} 锻造矿石`;
log.info(message);
return message;
}
// 检查是否需要跳过备选矿物
function shouldSkipOre(targetOre, compareOres) {
return compareOres.includes(targetOre);
}
// 尝试识别并锻造矿石
async function tryForgeOre(oreType, skipCheckOres = []) {
if (shouldSkipOre(oreType, skipCheckOres)) {
if (notice) {
notification.send(`跳过 ${OreChineseMap[oreType]},因为已存在于优先选择中`);
}
return false;
}
const imagePath = ingredientImageMap[oreType];
if (!imagePath) {
if (notice) {
notification.error(`未找到矿石图像路径: ${OreChineseMap[oreType]}`);
} else {
log.error(`未找到矿石图像路径: ${OreChineseMap[oreType]}`);
}
return false;
}
log.info(`开始识别矿石: ${OreChineseMap[oreType]}`);
const scanOffset = { x: -35, y: -35 };
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) {
imageResult.click();
await sleep(2000);
if (notice) {
notification.send(`通过图像识别找到矿石: ${OreChineseMap[oreType]}`);
} else {
log.info(`通过图像识别找到矿石: ${OreChineseMap[oreType]}`);
}
determineOre(oreType);
// 点击"开始锻造"3次
for (let i = 0; i < 3; i++) {
await sleep(1000);
click(1645, 1015);
}
return true;
}
}
if (notice) {
notification.error(`未能识别到矿石: ${OreChineseMap[oreType]}`);
} else {
log.error(`未能识别到矿石: ${OreChineseMap[oreType]}`);
}
return false;
}
// 锻造矿石操作
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); // 跳过第二个对话
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); // 点击"配方"
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();
// 按优先级尝试识别矿石
let forgeSuccess = false;
// 根据用户选择的矿石进行锻造
if (!imagePath) {
// 尝试主选矿石
if (!forgeSuccess) {
forgeSuccess = await tryForgeOre(primaryOre, []);
}
// 如果主选矿石识别失败尝试备选矿石2跳过与主选相同的
if (!forgeSuccess) {
forgeSuccess = await tryForgeOre(secondaryOre, [primaryOre]);
}
// 如果备选矿石2也识别失败尝试备选矿石3跳过与主选和备选2相同的
if (!forgeSuccess) {
forgeSuccess = await tryForgeOre(tertiaryOre, [primaryOre, secondaryOre]);
}
// 如果所有矿石都识别失败
if (!forgeSuccess) {
if (notice) {
notification.error(`未找到矿石图像路径: ${chineseDescription}`);
notification.error("所有备选矿石都未能识别,结束锻造");
} else {
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) {
imageResult.click();
await sleep(2000); // 等待点击生效
if (notice) {
notification.send(`通过图像识别找到矿石: ${chineseDescription}`);
} else {
log.info(`通过图像识别找到矿石: ${chineseDescription}`);
}
foundIngredient = true;
// 点击“开始锻造”3次
{
await sleep(1000); click(1645, 1015);
await sleep(1000); click(1645, 1015);
await sleep(1000); click(1645, 1015);}
break; // 找到矿石后退出循环
}
}
if (!foundIngredient) {
if (notice) {
notification.error(`未能识别到矿石: ${chineseDescription}`);
} else {
log.error(`未能识别到矿石: ${chineseDescription}`);
}
log.error("所有备选矿石都未能识别,结束锻造");
}
}
// 退出锻造界面
await click(520, 140); await sleep(1000); // 选择锻造队列
await click(520, 140); await sleep(1000);
if (notice) {
notification.send("锻造结束,退出界面");
} else {
log.info("锻造结束,退出界面");
}
keyPress("ESCAPE");
await genshin.returnMainUi();
};
await autoSmithy(smithyName); // 寻路函数
await forgeOre(smithyName); // 锻造函数
await genshin.returnMainUi(); // 返回主界面
{ keyDown("S"); await sleep(1000); keyUp("S"); await sleep(1000); } // 后退两步
await autoSmithy(smithyName);
await forgeOre(smithyName);
await genshin.returnMainUi();
{ keyDown("S"); await sleep(1000); keyUp("S"); await sleep(1000); }
if (notice) {
notification.send("自动锻造矿石脚本结束");
}
})();
})();