File diff suppressed because it is too large
Load Diff
@@ -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); // 点击自动烹饪
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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 @@
|
||||
"温迪",
|
||||
"砂糖",
|
||||
"雷泽",
|
||||
"香菱",
|
||||
"琴",
|
||||
"香菱",
|
||||
"菲谢尔",
|
||||
"七七",
|
||||
"迪卢克",
|
||||
"芭芭拉",
|
||||
"诺艾尔",
|
||||
"重云",
|
||||
"丽莎",
|
||||
"行秋",
|
||||
"丽莎",
|
||||
"莫娜",
|
||||
"可莉",
|
||||
"凝光",
|
||||
"安柏",
|
||||
"北斗",
|
||||
"班尼特",
|
||||
"凯亚",
|
||||
"刻晴"
|
||||
"凝光",
|
||||
"刻晴",
|
||||
"凯亚"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user