js,新增中文材料名映射 (#598)

烹饪增加菜名搜索
This commit is contained in:
JJMdzh
2025-04-19 01:27:40 +08:00
committed by GitHub
parent c9b87db984
commit 1bf9db141b
3 changed files with 94 additions and 100 deletions

View File

@@ -7,31 +7,6 @@
let CookingClickX; // 烹饪点击坐标 X let CookingClickX; // 烹饪点击坐标 X
const CookingClickY = 45; // 烹饪点击坐标 Y假设固定为 45 const CookingClickY = 45; // 烹饪点击坐标 Y假设固定为 45
/**加工区**/ /**加工区**/
// 解析 加工数量PrepCount 的值,逗号分隔的数字序列
const PrepCountArray = (settings.PrepCount || "")
.split(",")
.filter(Boolean) // 过滤掉空字符串
.map((num) => Math.max(0, Number(num) || 0)); // 转换为非负整数数组
// 提取所有 ProcessingXX 的键名,并过滤出值为 true 的项
const enabledProcessingKeys = Object.keys(settings)
.filter(key => key.startsWith("Processing"))
.filter(key => settings[key]); // 确保值为 true
log.info(`启用的 Processing 设置: ${enabledProcessingKeys.join(", ")}`);
if (enabledProcessingKeys.length === 0) {
log.error("未找到启用的 Processing 设置");
// 如果没有启用的 Processing 设置,假设所有 Processing 设置都为 true
for (let i = 1; i <= 4; i++) {
for (let j = 1; j <= 8; j++) {
const processingKey = `Processing${i}${j}`;
settings[processingKey] = false; // 如果没有启用的 ProcessingXX则设置所有 ProcessingXX都为 false
// enabledProcessingKeys.push(processingKey);// 如果没有启用的 ProcessingXX则所有 ProcessingXX都为 true
}
}
}
// 食材图像映射 // 食材图像映射
const ingredientImageMap = { const ingredientImageMap = {
"Processing11": "assets/Picture/Flour.png", "Processing11": "assets/Picture/Flour.png",
@@ -52,6 +27,56 @@
// 添加其他食材的图像映射 // 添加其他食材的图像映射
}; };
// processingKey 映射为中文
const processingKeyChineseMap = {
"Processing11": "面粉",
"Processing12": "兽肉",
"Processing13": "鱼",
"Processing14": "神秘的肉",
"Processing15": "黄油",
"Processing16": "熏禽肉",
"Processing17": "黄油",
"Processing18": "火腿",
"Processing21": "糖",
"Processing22": "辛香料",
"Processing23": "蟹黄",
"Processing24": "果酱",
"Processing25": "奶酪",
"Processing26": "培根",
"Processing27": "香肠",
// 添加其他加工设置的中文映射
};
// 解析 加工数量PrepCount 的值,逗号分隔的数字序列
const PrepCountArray = (settings.PrepCount || "")
.split(",")
.filter(Boolean) // 过滤掉空字符串
.map((num) => Math.max(0, Number(num) || 0)); // 转换为非负整数数组
// 提取所有 ProcessingXX 的键名,并过滤出值为 true 的项
const enabledProcessingKeys = Object.keys(settings)
.filter(key => key.startsWith("Processing"))
.filter(key => settings[key]); // 确保值为 true
// log.info(`启用的加工项: ${enabledProcessingKeys.join(", ")}`);
// 将 enabledProcessingKeys 映射为中文描述
const enabledProcessingKeysChinese = enabledProcessingKeys.map(key => processingKeyChineseMap[key] || "未知食材");
log.info(`启用的加工项: ${enabledProcessingKeysChinese.join(", ")}`);
if (enabledProcessingKeys.length === 0) {
log.error("未找到启用的 Processing 设置");
// 如果没有启用的 Processing 设置,假设所有 Processing 设置都为 true
for (let i = 1; i <= 4; i++) {
for (let j = 1; j <= 8; j++) {
const processingKey = `Processing${i}${j}`;
settings[processingKey] = false; // 如果没有启用的 ProcessingXX则设置所有 ProcessingXX都为 false
// enabledProcessingKeys.push(processingKey);// 如果没有启用的 ProcessingXX则所有 ProcessingXX都为 true
}
}
}
// 行列数的排列组合 // 行列数的排列组合
const rows = [1, 2];// [1, 2, 3, 4];三、四行 暂时用不上 const rows = [1, 2];// [1, 2, 3, 4];三、四行 暂时用不上
const cols = [1, 2, 3, 4, 5, 6, 7, 8]; const cols = [1, 2, 3, 4, 5, 6, 7, 8];
@@ -74,7 +99,7 @@
let template = file.ReadImageMatSync(imagePath); let template = file.ReadImageMatSync(imagePath);
let recognitionObject = RecognitionObject.TemplateMatch(template, x, y, searchWidth, searchHeight); let recognitionObject = RecognitionObject.TemplateMatch(template, x, y, searchWidth, searchHeight);
// 设置识别阈值和通道 // 设置识别阈值和通道
recognitionObject.threshold = 0.85; // 设置识别阈值为 0.85 recognitionObject.threshold = 0.95; // 设置识别阈值为 0.85
recognitionObject.Use3Channels = true; // 使用三通道匹配 recognitionObject.Use3Channels = true; // 使用三通道匹配
let result = captureGameRegion().find(recognitionObject); let result = captureGameRegion().find(recognitionObject);
@@ -98,7 +123,7 @@
// 执行 PrepCount 操作 // 执行 PrepCount 操作
async function performPrepCountActions(PrepCount) { async function performPrepCountActions(PrepCount) {
log.info(`执行 PrepCount 操作: ${PrepCount}`); log.info(`加工数量: ${PrepCount}`);
if (PrepCount < 99) { if (PrepCount < 99) {
click(965, 455); // 输入数量 click(965, 455); // 输入数量
await sleep(1000); await sleep(1000);
@@ -119,44 +144,35 @@
/**烹饪区**/ /**烹饪区**/
// 检查 CookingTimes 是否为正整数 // 检查 CookingTimes 是否为正整数
const CookingTimes = Math.max(0, Number(settings.CookingTimes) || 0); const CookingTimes = Math.max(0, Number(settings.CookingTimes) || 0);
const pageScrollCount = Math.max(0, Number(settings.pageScrollCount) || 0); // 滑页次数 const Cooking = settings.Cooking
const rightOffset = Math.max(0, Number(settings.rightOffset) - 1 || 2); // 右偏移 const rightOffset = 0; // 右偏移
const downOffset = Math.max(0, Number(settings.downOffset) - 1 || 0); // 下偏移 const downOffset = 0; // 下偏移
if (CookingTimes > 0 && Number.isInteger(CookingTimes)) { if (CookingTimes > 0 && Number.isInteger(CookingTimes)) {
CookingClickX = 910; // 设置 CookingClickX CookingClickX = 910; // 设置 CookingClickX
log.info("CookingTimes 是正整数。设置 CookingClickX 为 910。"); log.info("烹饪次数为正整数,有效");
} else { } else {
log.info("CookingTimes 不是正整数。跳过烹饪操作。"); log.info("烹饪次数不对,跳过烹饪操作。");
} }
// 烹饪操作函数 // 烹饪操作函数
async function performCookingOperations(CookingClickX, CookingClickY, pageScrollCount, rightOffset, downOffset, CookingTimes) { async function performCookingOperations(CookingClickX, CookingClickY, rightOffset, downOffset, CookingTimes) {
log.info("执行烹饪操作..."); log.info("执行烹饪操作...");
click(CookingClickX, CookingClickY); click(CookingClickX, CookingClickY);
await sleep(500); await sleep(500);
click(CookingClickX, CookingClickY); // 点击菜单 click(CookingClickX, CookingClickY); // 点击菜单
await sleep(500); await sleep(500);
for (let i = 0; i < pageScrollCount; ++i) { click(145, 1015); // 点击筛选
click(1200, 920); await sleep(500);
await sleep(500); click(79, 1020); // 重置输入框
leftButtonDown(); await sleep(500);
await sleep(100); click(160, 115); // 点击输入框
await sleep(500);
// 根据条件选择运行的 JSON 文件 inputText(`${Cooking}`); // 输入 Cooking 的值
let filePath; await sleep(500);
if (pageScrollCount >= 10 && (i + 1) % 10 === 0) { click(375, 1020); // 确认筛选
filePath = `assets/pageScroll2.json`; // 每 10 次运行一次 pageScroll2.json await sleep(500);
} else {
filePath = `assets/pageScroll.json`; // 其他情况下运行 pageScroll.json
}
await keyMouseScript.runFile(filePath); // 平滑移动鼠标
await sleep(600);
leftButtonUp();
await sleep(100);
}
// 点击动态坐标 // 点击动态坐标
const rightClickX = Math.round(178.5 + rightOffset * 147); const rightClickX = Math.round(178.5 + rightOffset * 147);
@@ -221,7 +237,7 @@ async function recognizeFIcon() {
await simulateKeyOperations("S", 200); // 后退 200 毫秒 await simulateKeyOperations("S", 200); // 后退 200 毫秒
log.info("执行后退操作"); log.info("执行后退操作");
await sleep(200); await sleep(200);
await simulateKeyOperations("W", 800); // 前进 800 毫秒 await simulateKeyOperations("W", 600); // 前进 600 毫秒
log.info("执行前进操作"); log.info("执行前进操作");
} else if (f_attempts === 3) { } else if (f_attempts === 3) {
// 第二次未找到 F 图标 // 第二次未找到 F 图标
@@ -272,10 +288,10 @@ async function recognizeCookingIcon(centerYF) {
let cookingRes = ra.find(cookingRo); let cookingRes = ra.find(cookingRo);
if (cookingRes.isExist()) { if (cookingRes.isExist()) {
log.info("找到 Cooking 图标"); log.info("找到 灶台 图标");
return cookingRes; return cookingRes;
} else { } else {
log.info("未找到 Cooking 图标"); log.info("未找到 灶台 图标");
return null; return null;
} }
} }
@@ -285,37 +301,37 @@ async function main() {
// 识别 F 图标 // 识别 F 图标
let fRes = await recognizeFIcon(); let fRes = await recognizeFIcon();
if (!fRes) { if (!fRes) {
log.error("未能识别 F 图标,退出任务"); log.error("未能识别 F 图标,退出任务");
return; return;
} }
// 获取 F 图标的中心点 Y 坐标 // 获取 F 图标的中心点 Y 坐标
let centerYF = fRes.y + fRes.height / 2; let centerYF = Math.round(fRes.y + fRes.height / 2);
const maxScrollAttempts = 5; // 最大滚轮操作次数限制 const maxScrollAttempts = 5; // 最大滚轮操作次数限制
let scrollAttempts = 0; let scrollAttempts = 0;
while (scrollAttempts < maxScrollAttempts) { while (scrollAttempts < maxScrollAttempts) {
// 识别 Cooking 图标 // 识别 灶台 图标
let cookingRes = await recognizeCookingIcon(centerYF); let cookingRes = await recognizeCookingIcon(centerYF);
if (cookingRes) { if (cookingRes) {
// log.info("找到 Cooking 图标"); // log.info("找到 灶台 图标");
return cookingRes; // 识别成功,返回结果 return cookingRes; // 识别成功,返回结果
} }
// 如果未找到 Cooking 图标,执行滚轮操作 // 如果未找到 Cooking 图标,执行滚轮操作
log.info(`执行滚轮操作,当前尝试次数:${scrollAttempts + 1}`); log.info(`未找到 Cooking 图标,执行滚轮操作,当前尝试次数:${scrollAttempts + 1}`);
await keyMouseScript.runFile(`assets/滚轮下翻.json`); await keyMouseScript.runFile(`assets/滚轮下翻.json`);
await sleep(1000); await sleep(1000);
// 重新识别 F 图标,获取最新的中心点 // 重新识别 F 图标,获取最新的中心点
fRes = await recognizeFIcon(); fRes = await recognizeFIcon();
if (!fRes) { if (!fRes) {
log.error("滚轮操作后,未能重新识别 F 图标,退出任务"); log.error("滚轮操作后,未能重新识别 F 图标,退出任务");
return; return;
} }
centerYF = fRes.y + fRes.height / 2; // 更新 F 图标的中心点 Y 坐标 centerYF = Math.round(fRes.y + fRes.height / 2); // 更新 F 图标的中心点 Y 坐标
// 增加尝试次数 // 增加尝试次数
scrollAttempts++; scrollAttempts++;
@@ -351,7 +367,7 @@ async function AutoPath() {
// 识别 Cooking 图标 // 识别 Cooking 图标
const cookingRes = await main(); const cookingRes = await main();
if (!cookingRes) { if (!cookingRes) {
log.error("未能识别到 Cooking 图标,退出任务"); log.error("未能识别 灶台 图标,退出任务");
return; return;
} }
@@ -371,13 +387,17 @@ async function AutoPath() {
// 遍历启用的 Processing 设置,进行图像识别 // 遍历启用的 Processing 设置,进行图像识别
for (const processingKey of enabledProcessingKeys) { for (const processingKey of enabledProcessingKeys) {
// 获取 processingKey 的中文描述
const chineseDescription = processingKeyChineseMap[processingKey] || "未知食材";
const imagePath = ingredientImageMap[processingKey]; const imagePath = ingredientImageMap[processingKey];
if (!imagePath) { if (!imagePath) {
log.error(`未找到食材图像路径: ${processingKey}`); log.error(`未找到食材图像路径: ${chineseDescription}`);
continue; continue;
} }
log.info(`开始识别食材: ${processingKey}, 图像路径: ${imagePath}`); // log.info(`开始识别食材: ${chineseDescription}, 图像路径: ${imagePath}`);
log.info(`开始识别食材: ${chineseDescription}`);
// 左上角的偏移量 // 左上角的偏移量
const scanOffset = { x: -35, y: -35 }; const scanOffset = { x: -35, y: -35 };
@@ -389,7 +409,8 @@ async function AutoPath() {
const imageResult = recognizeImage(imagePath, scanX, scanY, 70, 70); const imageResult = recognizeImage(imagePath, scanX, scanY, 70, 70);
if (imageResult) { if (imageResult) {
log.info(`通过图像识别找到食材: ${processingKey} 在坐标 X=${scanX}, Y=${scanY}`); // log.info(`通过图像识别找到食材: ${chineseDescription} 在坐标 X=${scanX}, Y=${scanY}`);
log.info(`通过图像识别找到食材: ${chineseDescription}`);
imageResult.click(); imageResult.click();
await sleep(1000); // 等待1秒以确保点击生效 await sleep(1000); // 等待1秒以确保点击生效
foundIngredient = true; foundIngredient = true;
@@ -411,12 +432,12 @@ async function AutoPath() {
} }
if (!foundIngredient) { if (!foundIngredient) {
log.error(`未能识别到食材: ${processingKey}`); log.error(`未能识别到食材: ${chineseDescription}`);
} }
} }
// 如果 CookingClickX 被设置,执行烹饪操作 // 如果 CookingClickX 被设置,执行烹饪操作
if (CookingClickX === 910) { if (CookingClickX === 910) {
await performCookingOperations(CookingClickX, CookingClickY, pageScrollCount, rightOffset, downOffset, CookingTimes); await performCookingOperations(CookingClickX, CookingClickY, rightOffset, downOffset, CookingTimes);
} }
await genshin.returnMainUi(); await genshin.returnMainUi();
keyDown("S"); await sleep(1000); keyDown("S"); await sleep(1000);

View File

@@ -1,8 +1,8 @@
{ {
"manifest_version": 1, "manifest_version": 1,
"name": "选择加工 食材", "name": "选择加工 食材",
"version": "1.01", "version": "2.1",
"description": "食材加工 识图 复选框。修复交互失败不能尝试方案的bug。", "description": "食材加工 识图 复选框。",
"authors": [ "authors": [
{ {
"name": "吉吉喵" "name": "吉吉喵"

View File

@@ -5,36 +5,9 @@
"label": "【料理制作】:\n\n烹饪次数默认0即跳过", "label": "【料理制作】:\n\n烹饪次数默认0即跳过",
}, },
{ {
"name": "pageScrollCount", "name": "Cooking",
"type": "input-text", "type": "input-text",
"label": "滑页次数默认04行1页", "label": "输入料理名",
},
{
"name": "downOffset",
"type": "select",
"label": "在第几行默认0",
"options": [
"1",
"2",
"3",
"4",
"5",
]
},
{
"name": "rightOffset",
"type": "select",
"label": "在第几列默认2",
"options": [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
]
}, },
{ {
"name": "PrepCount", "name": "PrepCount",