JS脚本:一只爱可菲(厨娘版)【更新】 (#1159)

* 适应性更新

* 修复了已知问题(无法制作特色料理)
This commit is contained in:
提瓦特钓鱼玳师
2025-06-21 22:08:20 +08:00
committed by GitHub
parent 5752f63db3
commit ccc85a254b
4 changed files with 986 additions and 881 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -46,6 +46,54 @@
// 食物数据
const food_dic = JSON.parse(file.readTextSync("assets/food_dic.json"));
/**
* 供 findClosestMatch 调用
*/
function levenshteinDistance(a, b) {
const matrix = [];
for (let i = 0; i <= b.length; i++) {
matrix[i] = [i];
}
for (let j = 0; j <= a.length; j++) {
matrix[0][j] = j;
}
for (let i = 1; i <= b.length; i++) {
for (let j = 1; j <= a.length; j++) {
if (b.charAt(i - 1) === a.charAt(j - 1)) {
matrix[i][j] = matrix[i - 1][j - 1];
} else {
matrix[i][j] = Math.min(
matrix[i - 1][j - 1] + 1, // 替换
matrix[i][j - 1] + 1, // 插入
matrix[i - 1][j] + 1 // 删除
);
}
}
}
return matrix[b.length][a.length];
}
/**
*
* 查找最相似的字符串用于查找料理最大限度避免OCR偏差导致的异常
*
* @param target 目标字符串
* @param candidates 字符串数组
* @returns {null}
*/
function findClosestMatch(target, candidates) {
let closest = null;
let minDistance = Infinity;
for (const candidate of candidates) {
const distance = levenshteinDistance(target, candidate);
if (distance < minDistance) {
minDistance = distance;
closest = candidate;
}
}
return closest;
}
/**
*
* 解析food_dic的食物数据
@@ -316,7 +364,10 @@
let ocr = captureGameRegion().FindMulti(ocrRo); // 当前页面OCR
if (ocr.count !== 0) {
for (let i = 0; i < ocr.count; i++) {
if (ocr[i].text === food_name) {
let food_name_deal = await Promise.all(
Object.keys(food_dic).map(async (x) => await deal_string(x))
);
if (findClosestMatch(ocr[i].text, food_name_deal) === food_name) { // 【DEBUG】
log.info(`找到了 ${food_name} `);
ocr[i].Click();
return true;
@@ -821,7 +872,7 @@
"food_character_num": food_character_num,
"select_cooking_mode": select_cooking_mode,
"extra_time": extraTime,
"check_quality": check_quality,
"check_quality": false, // 【DEBUG】禁用料理结果识别
"prime_cooking": prime_cooking
}
}
@@ -846,6 +897,8 @@
for (let i = 0; i < name_can_make.length; i++) {
task_dic["cooking"][name_can_make[i]] = setting_dic["food_num"];
}
} else if (setting_dic["food_choice_single_select"] === "无(默认)") {
task_dic["cooking"] = {};
} else {
task_dic["cooking"][setting_dic["food_choice_single_select"]] = setting_dic["food_num"];
}
@@ -983,12 +1036,12 @@
task_dic["character"] = {};
} else if (setting_dic["food_character_select"] === "全部角色") {
for (let i = 0; i < name_character_food.length; i++) {
task_dic["character"][name_character_food[i]] = setting_dic["food_character_num"];
task_dic["cooking"][name_character_food[i]] = setting_dic["food_character_num"];
}
} else {
for (const [name, detail] of Object.entries(food_dic)) {
if (detail["character"] === setting_dic["food_character_select"]) {
task_dic["character"][name] = setting_dic["food_character_num"];
task_dic["cooking"][name] = setting_dic["food_character_num"];
}
}
}
@@ -1009,7 +1062,7 @@
let all_character = Object.keys(character_detail_dic);
for (const [name, detail] of Object.entries(food_dic)) {
if (all_character.includes(detail["character"])) {
task_dic["character"][name] = character_detail_dic[detail["character"]];
task_dic["cooking"][name] = character_detail_dic[detail["character"]];
}
}
}
@@ -1152,10 +1205,16 @@
* @returns {Promise<boolean>} 成功返回true否则false
*/
async function auto_cooking(food_name, setting_dic) {
let current_item_name = await recognize_item_name();
food_name = findClosestMatch(food_name, Object.keys(food_dic)); // 【DEBUG】
let current_item_name = findClosestMatch(await recognize_item_name(), Object.keys(food_dic));
if (typeof(setting_dic["cooking"][food_name]) === "undefined") {
log.error(`请确保JS脚本配置中输入了正确的料理名称: ${food_name} 匹配错误`);
log.info(`${Object.keys(setting_dic["cooking"]).join("|")}`);
return false;
}
// 检测界面
if (!is_food_page()) return false;
// 二次验证食材名
// 二次验证食材名【DEBUG】经过先前的字符串距离筛选此处理应不可能找不到
if (!Object.keys(food_dic).includes(food_name)) {
log.warn(`food_dic内未找到名为-${food_name}-的料理,料理名称传入错误或料理数据需要更新`);
return false;
@@ -1308,8 +1367,8 @@
unlock = await is_unlock(); // 检测当前食材是否已经解锁
}
if (unlock_flag) {
const loop_time = Math.floor(cook_num / 99) + 1; // 总计循环数一次最大99
let cook_num = setting_dic["cooking"][food_name] + 0; // 设定的数量
const loop_time = Math.floor(cook_num / 99) + 1; // 总计循环数一次最大99
for (let i = 0; i < loop_time; i++) {
let cook_time = i !== loop_time - 1 ? 99: cook_num - i * 99; // 本次烹饪数
await click(890, 1016); // 点击自动烹饪

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "一只爱可菲(厨娘版)",
"version": "1.2.4",
"version": "1.3",
"bgi_version": "0.45.0",
"description": "脚本名称:一只爱可菲(厨娘版)\n功能描述专精料理制作的爱可菲(自动烹饪及解锁、特殊料理)\n核心功能------------------------------>\n1.自动烹饪:支持手动烹饪和自动烹饪,支持只刷满熟练度\n2.自动特殊料理:支持根据菜名和角色名自动进行单/多个特殊料理的烹饪(可以调节预期数量)\n3.其他料理获取:除了烹饪以外的部分料理的获取[仅有数据,未实装]\n注意事项------------------------------>\n1.请确保原神分辨率是1920x1080\n2.请尽量确保食材充足,如果食材不充足会自动跳过\n---------------------------------------->\n作者提瓦特钓鱼玳师\n脚本反馈邮箱hijiwos@hotmail.com",
"authors": [

View File

@@ -253,8 +253,8 @@
"金玉满堂",
"「普茹斯蒂司」",
"致水神",
"炽金之锅",
"镀金锅",
"炽金之锅",
"绯樱虾仙贝"
]
},
@@ -286,8 +286,9 @@
"无(默认)",
"全部料理",
"丰稔之赐",
"纵声欢唱",
"乌乌黑蛋",
"奇瑰之汤",
"纵声欢唱",
"温泉时光",
"咚咚嘭嘭",
"宝石闪闪",
@@ -308,6 +309,7 @@
"options": [
"无(默认)",
"全部料理",
"「欢夜畅谈」",
"沃陆果饮",
"夹心土豆泥",
"齐齐整整",
@@ -323,37 +325,37 @@
"得闲饮茶",
"咖啡芭芭露",
"杏仁鳟鱼",
"白淞鲜汤",
"「海鸟的驻足」",
"白淞鲜汤",
"浮露白霜",
"朝气盒饭",
"安眠奢想",
"蔷薇奶糊",
"安眠奢想",
"决斗之魂",
"米圆塔",
"奶酱鲜鱼",
"树莓水馒头",
"荞麦面",
"「暖意」",
"荞麦面",
"活力喵饭",
"日落鲷鱼烧",
"团子牛奶",
"特制风味烤蘑菇披萨",
"头晕回避术·改",
"饭团",
"头晕回避术·改",
"味噌汤",
"干炒鱼河",
"鲜虾脆薯盏",
"文火慢炖腌笃鲜",
"腌笃鲜",
"水煮黑背鲈",
"万民堂水煮鱼",
"烤蘑菇披萨",
"提神醒脑披萨",
"魔法肉酱面",
"水晶虾",
"水煮黑背鲈",
"万民堂水煮鱼",
"火火肉酱面",
"江湖百味",
"魔法肉酱面",
"水晶虾",
"苹果酿",
"萝卜时蔬汤",
"大碗茶"
@@ -378,8 +380,8 @@
"多彩之森",
"玉纹茶叶蛋",
"港湾牛肚",
"鱼鱼咏唱派",
"果果仙酪",
"鱼鱼咏唱派",
"奶油蘑菇汤",
"脆饼珐提",
"悉心一作",
@@ -392,33 +394,33 @@
"乌冬面",
"福内乌冬",
"强者之道",
"永恒的信仰",
"甜虾寿司",
"永恒的信仰",
"绯樱饼",
"「红炉一点雪」",
"绀田煮",
"绯樱饼",
"什锦炒面",
"鸟蛋烧",
"「自有方圆」",
"蟹黄豆腐",
"明月蛋",
"素鲍鱼",
"幽幽大行军",
"素鲍鱼",
"金丝虾球",
"绝对不是下酒菜",
"蟹黄火腿焗时蔬",
"伍玖叁式营养餐",
"厚云朵松饼",
"庄园烤松饼",
"侦察骑士烤肉!",
"蒙德烤鱼",
"炝炒肉片",
"提瓦特焦蛋",
"摩拉肉",
"爆炒肉片",
"乾坤摩拉肉",
"提瓦特煎蛋",
"烤肉排",
"侦察骑士烤肉!",
"蒙德烤鱼",
"炝炒肉片",
"提瓦特焦蛋"
"烤肉排"
]
},
{
@@ -433,6 +435,7 @@
"options": [
"无(默认)",
"全部料理",
"「暗渊之获」",
"雾凇秋分",
"粒果膨膨棒",
"乌乌黑蛋",
@@ -445,29 +448,29 @@
"肉满满寿司",
"茶好月圆",
"茶熏乳鸽",
"秘烤肋排",
"香烤肋排",
"生肉塔塔",
"秘烤肋排",
"肉酱千层面",
"生肉塔塔",
"塔塞斯杂烩",
"油封鸭腿",
"秘香肉团",
"萨布兹炖肉",
"「理想情况」",
"秘香肉团",
"萨巴桑炸角",
"奶香菌菇脆塔",
"憧憬",
"口袋饼",
"奶香菌菇脆塔",
"咖喱虾",
"兰巴德鱼卷",
"常胜传说",
"蒲烧鳗肉",
"「奇策」",
"饱腹感凝胶",
"鸟蛋寿司",
"「奇策」",
"兽骨拉面",
"夏祭游鱼",
"三彩团子",
"兽骨拉面",
"金枪鱼寿司",
"干烧香鱼",
"雨奇晴好",
@@ -476,18 +479,18 @@
"审判的晚宴",
"薄荷果冻",
"海灯节特色烤吃虎鱼",
"四方和平",
"盛世太平",
"四方和平",
"北地苹果焖肉",
"爪爪土豆饼",
"松鼠鱼",
"蒙德土豆饼",
"甜甜花酿鸡",
"爪爪土豆饼",
"松茸酿肉卷",
"甜甜花酿鸡",
"绝境求生烤鱼",
"果香串烤",
"野菇鸡肉串",
"烤吃虎鱼",
"绝境求生烤鱼"
"烤吃虎鱼"
]
},
{
@@ -510,8 +513,8 @@
"「簇火赞歌」",
"炎岩之颂",
"苹果金条条",
"火焰炖肉",
"猎龙者的犒赏",
"火焰炖肉",
"「强水」",
"繁弦急管",
"油爆双脆",
@@ -525,8 +528,8 @@
"水乡肉冻",
"超级至尊披萨",
"千层酥酥",
"唐杜尔烤鸡",
"肉肉烤蘑菇披萨",
"唐杜尔烤鸡",
"马萨拉芝士球",
"丰年有余",
"鲜鱼炖萝卜",
@@ -541,10 +544,10 @@
"摇·滚·鸡!",
"仙跳墙",
"翡玉什锦袋",
"「堆高高」",
"来来菜",
"没有未来菜",
"「蒙德往事」",
"「堆高高」",
"香嫩椒椒鸡",
"满足沙拉",
"至高的智慧(生活)",
@@ -565,24 +568,24 @@
"全部料理",
"「一梦治愈」",
"钱汤馒头",
"玉剪着花",
"清心花饼",
"玉剪着花",
"果味奶糖",
"串烤牛心",
"巧克力",
"「猎获」",
"桔香鸭胸肉",
"「猎获」",
"独家秘闻·美食专栏",
"炸鱼薯条",
"关怀备至",
"阿如拌饭",
"关怀备至",
"五宝腌菜",
"文心豆腐",
"米饭布丁",
"文心豆腐",
"海灯节特色热卤面",
"山珍凉卤面",
"北地烟熏鸡",
"山珍热卤面"
"山珍热卤面",
"山珍凉卤面"
]
},
{
@@ -622,13 +625,13 @@
"骇浪派",
"海灯节特色白玉汤",
"月亮派",
"莲花酥",
"极致一钓",
"莲花酥",
"黄金蟹",
"嘟嘟莲海鲜羹",
"鱼香吐司",
"珍珠翡翠白玉汤",
"渔人吐司",
"鱼香吐司"
"渔人吐司"
]
},
{
@@ -645,13 +648,13 @@
"全部料理",
"梅落雪间醉",
"膨膨冰淇淋",
"罪恶·非必要处理型",
"圈圈圆圆",
"罪恶·非必要处理型",
"羊杂哈吉斯",
"晶螺糕",
"午后闲茶",
"清热降火汤",
"琼玉果汤",
"清热降火汤",
"真味茶泡饭",
"假日果酿",
"兽米香香",
@@ -673,8 +676,8 @@
"无(默认)",
"全部料理",
"白浪拂沙",
"山与海与天空",
"歇止一刻",
"山与海与天空",
"酥酥羊角包",
"「选你喜欢的!」",
"缤纷马卡龙",
@@ -692,13 +695,13 @@
"蛋包饭",
"兽肉薄荷卷",
"海灯节特色禽蛋羹",
"风神杂烩菜",
"真·风神杂烩菜",
"中原杂碎",
"蜜酱胡萝卜煎肉",
"风神杂烩菜",
"白汁时蔬烩肉",
"莲子禽蛋羹",
"辣味时蔬烩肉",
"白汁时蔬烩肉"
"辣味时蔬烩肉"
]
},
{
@@ -733,11 +736,11 @@
"测绘员蛋堡",
"轻策家常菜",
"鳄鱼肉干",
"唐杜尔烤鸡",
"肉肉烤蘑菇披萨",
"黄油鸡",
"唐杜尔烤鸡",
"日落莓莓茶",
"摩拉急速来",
"黄油鸡",
"烤肉卷",
"唯一的真相",
"炸肉排三明治",
@@ -756,10 +759,10 @@
"冒险家蛋堡",
"仙跳墙",
"翡玉什锦袋",
"轻策农家菜",
"黄油松茸",
"杏仁豆腐",
"轻策农家菜",
"炸萝卜丸子",
"杏仁豆腐",
"冰钩钩果汁"
]
},
@@ -809,12 +812,12 @@
"韦西鸡",
"膨膨泡芙",
"超级至尊披萨",
"多多烧",
"红烩兽肉",
"多多烧",
"绝云锅巴",
"天枢肉",
"冷肉拼盘",
"祝圣交响乐"
"祝圣交响乐",
"冷肉拼盘"
]
},
{
@@ -895,6 +898,8 @@
"options": [
"无(默认)",
"全部角色",
"塔利雅",
"丝柯克",
"爱可菲",
"伊法",
"伊安珊",
@@ -954,8 +959,8 @@
"荒泷一斗",
"托马",
"九条裟罗",
"珊瑚宫心海",
"埃洛伊",
"珊瑚宫心海",
"神里绫华",
"宵宫",
"早柚",
@@ -974,24 +979,24 @@
"温迪",
"砂糖",
"雷泽",
"香菱",
"琴",
"香菱",
"菲谢尔",
"七七",
"迪卢克",
"芭芭拉",
"诺艾尔",
"重云",
"丽莎",
"行秋",
"丽莎",
"莫娜",
"可莉",
"凝光",
"安柏",
"北斗",
"班尼特",
"凯亚",
"刻晴"
"凝光",
"刻晴",
"凯亚"
]
},
{