From 37104f52575240d67280641309a3a982c41a7686 Mon Sep 17 00:00:00 2001 From: this-Fish Date: Mon, 18 May 2026 22:31:05 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=B4=AD=E4=B9=B0=E5=95=86?= =?UTF-8?q?=E5=93=81=203.3.6=20(#3217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove update_settings.py and generate settings.json for automated item purchasing configuration * feat: 在快速购买中添加容量上限日志记录 * 自动购买商品 3.3.6 * chore: 更新版本号至 3.3.6 * fix: 修复周四商品刷新时间计算错误及购买记录覆盖问题 --- repo/js/自动购买商品/README.md | 24 + repo/js/自动购买商品/assets/images/堇瓜..png | Bin 9188 -> 0 bytes repo/js/自动购买商品/assets/images/堇瓜.png | Bin 10251 -> 9188 bytes .../assets/path/璃月-璃月港-张顺.json | 11 +- .../assets/path/蒙德-清泉镇-神奇的霍普金斯.json | 50 +- repo/js/自动购买商品/main.js | 237 ++++-- repo/js/自动购买商品/manifest.json | 7 +- .../自动购买商品/record/默认账户/records.json | 1 - repo/js/自动购买商品/settings.json | 283 +------ repo/js/自动购买商品/update_settings.py | 750 ------------------ 10 files changed, 247 insertions(+), 1116 deletions(-) delete mode 100644 repo/js/自动购买商品/assets/images/堇瓜..png delete mode 100644 repo/js/自动购买商品/record/默认账户/records.json delete mode 100644 repo/js/自动购买商品/update_settings.py diff --git a/repo/js/自动购买商品/README.md b/repo/js/自动购买商品/README.md index 6463ecbe3..5498f01f8 100644 --- a/repo/js/自动购买商品/README.md +++ b/repo/js/自动购买商品/README.md @@ -8,6 +8,7 @@ - **每周刷新商品**:每周刷新,可指定购买日 - **记录系统**:避免重复购买,只购买刷新后的商品 - **标签系统**:支持按标签批量禁用商人 +- **智能容量限制处理**(v3.3.4):当某个商品因“背包内容量已达上限”而购买失败时,脚本会自动记录该商品,**本次运行后续所有商人**都不会再尝试购买该商品,避免反复无效操作。 ## ⚡ 快速开始 @@ -252,6 +253,29 @@ A: 游戏内的刷新时间是**每天凌晨4点**。脚本会考虑这个时间 - 如果当前时间在4点前,视为前一天 - 购买记录基于4点刷新时间计算 +## 📅 更新日志 +
+ +- **修复**:周四刷新商品(狗粮商人)刷新时间计算错误 + - 之前周一至周三尝试购买周四商品时,刷新时间会被错误记录到下周四 + - 现在正确记录为本周四,购买成功后更新为下周四 +- **修复**:购买记录被覆盖的问题 + - 同类型商品的购买记录现在改为合并去重,不再覆盖原有记录 + +### v3.3.5 +- **新增**:已售罄商品识别与记录。 + - 自动识别售罄商品,会当作正常购买,正常记录 CD。 + - 即使运行前手动购买过,脚本也能正确识别并跳过,避免重复尝试购买。 +- **回退**:移除多选商品项目、回退至手动输入商品名称 + +### v3.3.4 +- **新增**:背包容量上限智能处理机制。 + - 当购买某商品时出现"当前物品在背包内的容量已达上限",脚本会自动将该商品加入黑名单。 + - 黑名单商品在**本次脚本运行的后续所有商人**中均会被跳过,不再尝试购买。 + - 该机制可避免因背包满而反复卡住,大幅提升执行效率。 + +
+ ## 🤝 贡献指南 欢迎提交新的商人和商品配置! diff --git a/repo/js/自动购买商品/assets/images/堇瓜..png b/repo/js/自动购买商品/assets/images/堇瓜..png deleted file mode 100644 index f93a570807819965be81cb44935627cbee63ce30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9188 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 item.trim() !== ""); - } else if (settings.foodsToBuy) { - items = Array.from(settings.foodsToBuy); - } - - if (items.length > 0) { + const foodsInput = (settings.foodsToBuy || "").trim(); + if (foodsInput) { + const items = foodsInput.split(/[,\s、]+/).filter(item => item.trim() !== ""); const enabledFoodsList = []; const enabledTagsList = []; @@ -221,6 +215,50 @@ function filterUserFoods(foodList) { }); } +// ==================== 辅助函数:检查容量上限消息 ==================== +async function checkCapacityLimitMessage() { + let captureRegion = null; + let returnValue = false; + try { + await sleep(100); + captureRegion = captureGameRegion(); + // 在指定区域进行 OCR 识别 + let ocrObject = RecognitionObject.Ocr(1305, 860, 500, 100); + let ocrResult = captureRegion.Find(ocrObject); + if (ocrResult.isExist() && ocrResult.text.includes("当前物品在背包内的容量已达上限")) { + returnValue = true; + } + } catch (e) { + log.warn(`检查容量上限消息时出错: ${e.message}`); + returnValue = false; + } finally { + if (captureRegion) captureRegion.dispose(); + } + return returnValue; +} + +// ==================== 辅助函数:检查“已售罄”消息 ==================== +async function checkSoldOutMessage() { + let captureRegion = null; + let returnValue = false; + try { + await sleep(100); + captureRegion = captureGameRegion(); + // 在指定区域进行 OCR 识别(与容量上限提示区域相同,也可根据需要调整) + let ocrObject = RecognitionObject.Ocr(1305, 860, 500, 100); + let ocrResult = captureRegion.Find(ocrObject); + if (ocrResult.isExist() && (ocrResult.text.includes("售罄"))) { + returnValue = true; + } + } catch (e) { + log.warn(`检查已售罄消息时出错: ${e.message}`); + returnValue = false; + } finally { + if (captureRegion) captureRegion.dispose(); + } + return returnValue; +} + // ==================== 辅助函数:获取调整后的星期几(1-7,周一为1) ==================== function getAdjustedDayOfWeek() { const now = new Date(); @@ -263,12 +301,16 @@ function getThursdayOfWeek(date) { d.setDate(d.getDate() - 1); } const day = d.getDay(); // 0=周日, 1=周一, 2=周二, 3=周三, 4=周四, 5=周五, 6=周六 - // 目标周四:如果当前<=周四,则取本周四;否则取下周四 - let targetDay = 4; // 周四对应的getDay值为4 - if (day <= targetDay) { + let targetDay = 4; + if (day < targetDay) { + // 本周四 d.setDate(d.getDate() + (targetDay - day)); - } else { + } else if (day > targetDay) { + // 下周四 d.setDate(d.getDate() + (7 - day + targetDay)); + } else { + // 当天是周四,已经过了4点,返回下周四 + d.setDate(d.getDate() + 7); } d.setHours(4, 0, 0, 0); return d; @@ -359,15 +401,7 @@ const ignoreRecords = settings.ignoreRecords || false; const recordDebug = settings.recordDebug || false; // 解析禁用的标签列表 -let disabledTags = []; -if (settings.disabledTagsList) { - disabledTags = Array.from(settings.disabledTagsList); -} else if (typeof settings.disabledTags === 'string') { - disabledTags = (settings.disabledTags || "").split(/[,\s、]+/).filter(tag => tag.trim() !== ""); -} else if (settings.disabledTags) { - disabledTags = Array.from(settings.disabledTags); -} - +const disabledTags = (settings.disabledTags || "").split(/[,\s、]+/).filter(tag => tag.trim() !== ""); if (disabledTags.length > 0) { log.info(`已禁用标签: ${disabledTags.join(", ")}`); } @@ -447,24 +481,16 @@ function updateNpcRecord(records, npcName, refreshType, purchasedItems) { } let record = getNpcRecord(records, npcName); - if (!record) { - record = { - npcname: npcName, - "1d": [], - "1d_time": null, - "3d": [], - "3d_time": null, - "7d": [], - "7d_time": null, - "thu": [], - "thu_time": null, - "month": [], - "month_time": null - }; + record = { npcname: npcName }; records.push(record); } + // 合并已购商品(去重),而非覆盖 + const existing = record[refreshType] || []; + const merged = [...new Set([...existing, ...purchasedItems])]; + record[refreshType] = merged; + const now = new Date(); let refreshTime; @@ -510,14 +536,11 @@ function updateNpcRecord(records, npcName, refreshType, purchasedItems) { } else if (refreshType === "thu") { // 周四刷新商品:下次刷新是下周四 refreshTime = getThursdayOfWeek(now); - refreshTime.setDate(refreshTime.getDate() + 7); } else if (refreshType === "month") { // 每月1号刷新商品:下次刷新是下个月1号 refreshTime = getNextMonthFirstDay(now); } - // 只更新实际购买的商品 - record[refreshType] = purchasedItems; record[`${refreshType}_time`] = formatDateToLocalISO(refreshTime); // 计算下次刷新日期 @@ -568,7 +591,6 @@ function shouldBuyFoods(npc, npcRecord, currentPeriod, forceRefresh = false) { // 首先检查禁用(此处假设之前已检查过,但为防止遗漏,可再加一道保险) // 实际上禁用检查在更外层(initNpcData 和主循环)已经处理,这里可以省略 - if (forceRefresh) { // 强制刷新:决定使用完整列表还是具体商品列表 // 先判断是否命中标签 @@ -576,20 +598,24 @@ function shouldBuyFoods(npc, npcRecord, currentPeriod, forceRefresh = false) { if (npc.tags && Array.isArray(npc.tags)) { useAll = npc.tags.some(tag => userTagsToBuy.has(tag)); } + + // 定义过滤函数 + const filterCapacity = (list) => (list || []).filter(food => !capacityLimitedFoods.has(food)); + if (useAll) { // 标签商人:购买所有商品 - if (npc._1d_foods) foodsToBuy["1d"] = npc._1d_foods; - if (npc._3d_foods) foodsToBuy["3d"] = npc._3d_foods; - if (npc._7d_foods) foodsToBuy["7d"] = npc._7d_foods; - if (npc._thu_foods) foodsToBuy["thu"] = npc._thu_foods; - if (npc._month_foods) foodsToBuy["month"] = npc._month_foods; + if (npc._1d_foods) foodsToBuy["1d"] = filterCapacity(npc._1d_foods); + if (npc._3d_foods) foodsToBuy["3d"] = filterCapacity(npc._3d_foods); + if (npc._7d_foods) foodsToBuy["7d"] = filterCapacity(npc._7d_foods); + if (npc._thu_foods) foodsToBuy["thu"] = filterCapacity(npc._thu_foods); + if (npc._month_foods) foodsToBuy["month"] = filterCapacity(npc._month_foods); } else { // 非标签商人:只购买用户明确指定的商品 - if (npc._1d_foods) foodsToBuy["1d"] = filterUserFoods(npc._1d_foods); - if (npc._3d_foods) foodsToBuy["3d"] = filterUserFoods(npc._3d_foods); - if (npc._7d_foods) foodsToBuy["7d"] = filterUserFoods(npc._7d_foods); - if (npc._thu_foods) foodsToBuy["thu"] = filterUserFoods(npc._thu_foods); - if (npc._month_foods) foodsToBuy["month"] = filterUserFoods(npc._month_foods); + if (npc._1d_foods) foodsToBuy["1d"] = filterCapacity(filterUserFoods(npc._1d_foods)); + if (npc._3d_foods) foodsToBuy["3d"] = filterCapacity(filterUserFoods(npc._3d_foods)); + if (npc._7d_foods) foodsToBuy["7d"] = filterCapacity(filterUserFoods(npc._7d_foods)); + if (npc._thu_foods) foodsToBuy["thu"] = filterCapacity(filterUserFoods(npc._thu_foods)); + if (npc._month_foods) foodsToBuy["month"] = filterCapacity(filterUserFoods(npc._month_foods)); } return foodsToBuy; } @@ -607,6 +633,8 @@ function shouldBuyFoods(npc, npcRecord, currentPeriod, forceRefresh = false) { // 确定要购买的候选商品列表 let candidateList = useAll ? fullList : filterUserFoods(fullList); + // 过滤掉已标记容量上限的商品 + candidateList = candidateList.filter(food => !capacityLimitedFoods.has(food)); if (candidateList.length === 0) return []; // 获取已购买列表 @@ -737,7 +765,7 @@ async function nextFoodsPage() { } // 快速购买 -async function qucikBuy() { +async function quickBuy(itemName) { //设置脚本环境的游戏分辨率和DPI缩放 setGameMetrics(3840, 2160, 1.5); @@ -755,8 +783,22 @@ async function qucikBuy() { captureRegion.dispose(); if (buyBtn.isEmpty()) { - log.warn("未找到购买按钮"); - return false; + // 未找到购买按钮 -> 可能容量已满或售罄 + let isCapacityFull = await checkCapacityLimitMessage(); + if (isCapacityFull) { + capacityLimitedFoods.add(itemName); + log.info(`[容量上限] 商品 "${itemName}" 触发背包容量已达上限,后续将不再购买。`); + // 交互或拾取:"XXXX" + await fakeLog(`${itemName} 已达上限`, false, false, 23333); + return 'capacity'; + } + // 非容量问题,可能售罄导致按钮消失?仍尝试检测售罄消息 + let isSoldOut = await checkSoldOutMessage(); + if (isSoldOut) { + log.info(`[已售罄] 商品 "${itemName}" 已售罄`); + return 'sold_out'; + } + return 'error'; } // 点击购买按钮 @@ -785,10 +827,10 @@ async function qucikBuy() { click(buyBtnX, buyBtnY); await sleep(200); - return true; + return 'success'; } catch (error) { log.error(`快速购买失败: ${error.message}`); - return false; + return 'error'; } } @@ -815,16 +857,18 @@ async function spikChat(npcName) { // 点击有什么卖的 let captureRegion = captureGameRegion() - let resList = captureRegion.findMulti(RecognitionObject.ocrThis); - for (let i = 0; i < resList.count; i++) { - if (resList[i].text.includes("有什么卖的") || resList[i].text.includes("可以卖一些")) { - await sleep(500); - click(resList[i].x + 30, resList[i].y + 30); // 点击有什么卖的 - await sleep(500); - - // 使用完后释放资源 - captureRegion.dispose(); + try { + let resList = captureRegion.findMulti(RecognitionObject.ocrThis); + for (let i = 0; i < resList.count; i++) { + if (resList[i].text.includes("有什么卖的") || resList[i].text.includes("可以卖一些")) { + await sleep(500); + click(resList[i].x + 30, resList[i].y + 30); + await sleep(500); + break; // 找到后跳出循环 + } } + } finally { + captureRegion.dispose(); } await sleep(1500); @@ -955,6 +999,11 @@ async function buyFoods(npcName, npcRecords, currentPeriod) { // 匹配商品 for (let item of tempFoods) { + if (capacityLimitedFoods.has(item)) { + if (recordDebug) log.info(`[调试] 跳过已容量上限的商品: ${item}`); + continue; + } + if (recordDebug) { log.info(`[调试] 尝试购买: ${item}`); } @@ -976,10 +1025,22 @@ async function buyFoods(npcName, npcRecords, currentPeriod) { boughtFoods.add(item); // 点击商品 click(res.x * 2 + res.width, res.y * 2 + res.height); - if (await qucikBuy()) { - log.info(`购买成功: ${item}`); - // 交互或拾取:"XXXX" - await fakeLog(item, false, false, 23333); + let buyResult = await quickBuy(item); + if (buyResult === 'success' || buyResult === 'sold_out') { + if (buyResult === 'success') { + log.info(`购买成功: ${item}`); + } else { + log.info(`商品已售罄,已记录CD: ${item}`); + } + // 交互或拾取提示(售罄时已在 quickBuy 中调用 fakeLog,此处避免重复) + if (buyResult === 'success') { + // 交互或拾取:"XXXX" + await fakeLog(item, false, false, 23333); + } else if (buyResult === 'sold_out') { + // 交互或拾取:"XXXX 已销售" + await fakeLog(`${item} 已销售`, false, false, 23333); + } + // 记录购买的商品 purchasedFoods.push(item); @@ -994,10 +1055,19 @@ async function buyFoods(npcName, npcRecords, currentPeriod) { await sleep(1500); // 重新截图 - captureRegion = captureGameRegion(); + captureRegion.dispose(); // 释放旧截图 + captureRegion = captureGameRegion(); // 重新截图 } - else { + else if (buyResult === 'capacity') { log.info(`购买失败: ${item}, 背包已经满或商品已售罄`); + // 如果失败是因为容量上限(quickBuy 内部已加入黑名单),立即从临时列表中移除 + if (capacityLimitedFoods.has(item)) { + tempFoods = tempFoods.filter(f => f !== item); + // 因为数组改变了,需要重新截图并跳出本次循环重新开始 + captureRegion.dispose(); // 释放旧截图 + captureRegion = captureGameRegion(); // 重新截图 + break; + } } } } @@ -1020,9 +1090,9 @@ async function buyFoods(npcName, npcRecords, currentPeriod) { } if (purchasedFoods.length > 0) { - log.info(`${displayName} 购买完成,成功购买: ${purchasedFoods.join(", ")}`); + log.info(`${displayName} 购买完成,已购买: ${purchasedFoods.join(", ")}`); } else { - logConditional(`${displayName} 没有成功购买任何商品`); + logConditional(`${displayName} 没有购买任何商品`); } // 返回购买结果 @@ -1076,6 +1146,8 @@ async function initNpcData(records) { } (async function () { + // 重置容量限制集合 + capacityLimitedFoods.clear(); try { // ==================== 确定账号名 ==================== let rawUserName = settings.userName ? settings.userName.trim() : ""; @@ -1150,6 +1222,21 @@ async function initNpcData(records) { let npcIndex = 0; for (let [key, npc] of Object.entries(npcData)) { if (npc.enable) { + + // 动态检查:考虑当前黑名单后,是否还有商品需要购买 + const npcRecord = getNpcRecord(npcRecords, npc.name); + const foodsToBuyNow = shouldBuyFoods(npc, npcRecord, currentPeriod, ignoreRecords); + const hasAnyToBuy = foodsToBuyNow["1d"].length > 0 || + foodsToBuyNow["3d"].length > 0 || + foodsToBuyNow["7d"].length > 0 || + foodsToBuyNow["thu"].length > 0 || + foodsToBuyNow["month"].length > 0; + + if (!hasAnyToBuy) { + logConditional(`跳过商人 ${getDisplayNameFromPath(npc.path)}:所有需要购买的商品均已被容量上限限制`); + continue; + } + npcIndex++; // 获取显示名称(从路径中提取) const displayName = getDisplayNameFromPath(npc.path); diff --git a/repo/js/自动购买商品/manifest.json b/repo/js/自动购买商品/manifest.json index cb84a7bb3..67c23ba65 100644 --- a/repo/js/自动购买商品/manifest.json +++ b/repo/js/自动购买商品/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "自动购买商品", - "version": "3.3.3", + "version": "3.3.6", "bgi_version": "0.60.1", "description": "自动购买商品\n每天刷新商品:自动购买商品\n3天刷新商品:未到刷新日不购买该商品\n每周刷新商品:可指定每周购买商品", "authors": [ @@ -20,7 +20,4 @@ ], "settings_ui": "settings.json", "main": "main.js" - -} - - +} \ No newline at end of file diff --git a/repo/js/自动购买商品/record/默认账户/records.json b/repo/js/自动购买商品/record/默认账户/records.json deleted file mode 100644 index 8b1378917..000000000 --- a/repo/js/自动购买商品/record/默认账户/records.json +++ /dev/null @@ -1 +0,0 @@ - diff --git a/repo/js/自动购买商品/settings.json b/repo/js/自动购买商品/settings.json index 87480b434..151f851e3 100644 --- a/repo/js/自动购买商品/settings.json +++ b/repo/js/自动购买商品/settings.json @@ -2,157 +2,22 @@ { "name": "userName", "type": "input-text", - "label": "账号名(用于区分不同账户的记录)\\n为空则读取uid作为自定义CD记录标识", + "label": "账号名(用于区分不同账户的记录)\n为空则读取uid作为自定义CD记录标识", "default": "默认账户" }, { - "name": "foodsToBuyList", - "type": "multi-checkbox", - "label": "要购买的商品", - "options": [ - "「四方八方之网」", - "「皮拉米达的夜莺」", - "云岩裂叶", - "兽肉", - "冒险家之花", - "冒险家头带", - "冒险家尾羽", - "冒险家怀表", - "冒险家金杯", - "冰钩钩果汁", - "冰雾花花朵", - "劫波莲", - "卷心菜", - "发酵果实汁", - "咖啡豆", - "嘟嘟莲", - "团子牛奶", - "土豆", - "圣水", - "培根", - "堇瓜", - "塞西莉亚花", - "墩墩桃", - "夜泊石", - "大碗茶", - "奶油", - "奶酪", - "宿影花", - "小灯草", - "小麦", - "帕蒂沙兰", - "幸运儿之杯", - "幸运儿沙漏", - "幸运儿绿花", - "幸运儿银冠", - "幸运儿鹰羽", - "微光角菌", - "慕风蘑菇", - "日落果", - "星蕈", - "星螺", - "杏仁", - "松茸", - "果酱", - "枣椰", - "枫达", - "树王圣体菇", - "树莓薄荷饮", - "气泡酸莓汁", - "水晶块", - "汐藻", - "沉玉仙茗", - "泡泡桔", - "洋葱", - "浪沫羽鳃", - "海灵芝", - "海草", - "海露花", - "清心", - "清水玉", - "游医的怀钟", - "游医的方巾", - "游医的枭羽", - "游医的药壶", - "游医的银莲", - "澄晶实", - "火腿", - "灼灼彩菊", - "烈焰花花蕊", - "烛伞蘑菇", - "烬芯花", - "熏禽肉", - "牛奶", - "特制风味烤蘑菇披萨", - "珊瑚真珠", - "琉璃百合", - "琉璃袋", - "琉鳞石", - "甜甜花", - "电气水晶", - "番茄", - "白萝卜", - "白铁块", - "盐", - "石珀", - "禽肉", - "秃秃豆", - "稻米", - "竹笋", - "糖", - "绝云椒椒", - "肉龙掌", - "胡椒", - "胡萝卜", - "苍晶螺", - "苦种", - "苹果", - "苹果酿", - "茉洁草", - "莲蓬", - "萃凝晶", - "落落莓", - "蒲公英籽", - "薄荷", - "蘑菇", - "虹彩蔷薇", - "虾仁", - "螃蟹", - "蟹黄", - "豆腐", - "边陲之地", - "野浆果之路", - "金鱼草", - "钩钩果", - "铁块", - "霄灯", - "霓裳花", - "霜盏花", - "青蜜莓", - "面粉", - "颗粒果", - "风车菊", - "香肠", - "香辛料", - "香辛果", - "马尾", - "鱼肉", - "鱼肉2", - "鳗肉", - "鸟蛋", - "鸣草", - "黄油", - "黑麦" - ], - "default": [ - "小麦", - "黑麦" - ] + "type": "separator" + }, + { + "name": "foodsToBuy", + "type": "input-text", + "label": "支援的 商人与商品详细 请前往 README.md 查看\n建议直接复制商品名称贴上输入栏\n\n要购买的商品(多个商品用空格分隔)\n示例:\"小麦 黑麦\"", + "default": "小麦 黑麦" }, { "name": "AKF", "type": "select", - "label": "每周商品购买方式\\n0=跟随系统周期自动判定\\n1-7=指定星期几购买(1=周一,7=周日)", + "label": "每周商品购买方式\n0=跟随系统周期自动判定\n1-7=指定星期几购买(1=周一,7=周日)", "options": [ "0", "1", @@ -166,127 +31,13 @@ "default": "0" }, { - "name": "disabledTagsList", - "type": "multi-checkbox", - "label": "禁用标签", - "options": [ - "东升", - "丰泰", - "丽切娅", - "伊蜜", - "克洛莎", - "克罗丽丝", - "兰巴德", - "兰巴德酒馆", - "兰玛尼", - "凯叔", - "化城郭", - "博来", - "卡嘉", - "卡琵莉亚", - "卯师父", - "哈马维", - "圣火竞技场", - "坚岩隘谷", - "夏安卡", - "天使的馈赠", - "奥摩斯港", - "安特曼", - "小畑", - "小白", - "山城健太", - "巴巴克", - "布兰琪", - "布希柯", - "布特罗斯", - "布纳马", - "张顺", - "德波大饭店", - "德米安", - "志村勘兵卫", - "恩忒卡", - "悠悠度假村", - "拉玛", - "挪德卡莱", - "旗舰", - "普斯帕咖啡馆", - "智树", - "望舒客栈", - "木南杏奈", - "朱特", - "朱老板", - "杜拉夫", - "枫丹", - "枫丹廷", - "查尔斯", - "桑格内蒂", - "桓那兰那(梦境)", - "欧仁妮", - "海祇岛", - "清子", - "清泉镇", - "灰河", - "狗粮商人", - "独立地图", - "珀姆", - "琳琅", - "琼玑野", - "璃月", - "璃月港", - "白淞镇", - "白狐之野", - "皮托", - "皮拉米达城", - "石头", - "石榴", - "石门", - "神奇的霍普金斯", - "离岛", - "秋月", - "秋蔚", - "科菲策", - "移动", - "稀少商品", - "稻妻", - "稻妻城", - "穆托莉娜", - "纳塔", - "老周叔", - "老孙", - "老高", - "艾库瓦", - "芙萝拉", - "若紫", - "莎拉", - "菲尔戈黛特", - "葵", - "蒙德", - "蒙德城", - "路易", - "轻策庄", - "连芳", - "遗珑埠", - "那夏镇", - "采若", - "钦特利", - "锈舵酒馆", - "长顺", - "阿什帕齐", - "阿夫辛", - "阿如村", - "阿山婆", - "阿扎莱", - "阿桂", - "阿鲁埃", - "雷科", - "须弥", - "须弥城", - "风起地", - "黑心商人" - ], - "default": [ - "卡琵莉亚" - ] + "name": "disabledTags", + "type": "input-text", + "label": "禁用标签\n(多个标签以空格分隔,如: 挪德卡莱 黑心商人 卡琵莉亚)", + "default": "卡琵莉亚" + }, + { + "type": "separator" }, { "name": "skip", @@ -297,7 +48,7 @@ { "name": "ignoreRecords", "type": "checkbox", - "label": "-----------------\\n无视记录强制购买(不推荐)", + "label": "无视记录强制购买(不推荐)", "default": false }, { diff --git a/repo/js/自动购买商品/update_settings.py b/repo/js/自动购买商品/update_settings.py deleted file mode 100644 index ff3ea7aa6..000000000 --- a/repo/js/自动购买商品/update_settings.py +++ /dev/null @@ -1,750 +0,0 @@ -import json -import os - -# Content of npcs.json -npcs_content = """ -{ - "克罗丽丝": { - "name": "克罗丽丝", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/蒙德-风起地-克罗丽丝.json", - "_3d_foods": ["金鱼草", "薄荷", "钩钩果","落落莓","慕风蘑菇"], - "tags": ["蒙德", "风起地", "克罗丽丝", "移动"] - }, - "神奇的霍普金斯": { - "name": "神奇的霍普金斯", - "enable": true, - "page": 2, - "time": "day", - "path": "assets/path/蒙德-清泉镇-神奇的霍普金斯.json", - "_1d_foods": ["圣水"], - "tags": ["蒙德", "清泉镇", "神奇的霍普金斯", "稀少商品"] - }, - "杜拉夫": { - "name": "杜拉夫", - "enable": true, - "page": 1, - "time": "day", - "path": "assets/path/蒙德-清泉镇-杜拉夫.json", - "_1d_foods": ["兽肉", "禽肉", "鸟蛋"], - "tags": ["蒙德", "清泉镇", "杜拉夫"] - }, - "Blanche": { - "name": "布兰琪", - "enable": true, - "page": 2, - "time": "night", - "path": "assets/path/蒙德-蒙德城-布兰琪.json", - "_1d_foods": ["盐", "胡椒", "洋葱", "牛奶", "番茄", "卷心菜", "土豆", "小麦"], - "tags": ["蒙德", "蒙德城", "布兰琪"] - }, - "莎拉": { - "name": "莎拉", - "enable": true, - "page": 4, - "time": "night", - "path": "assets/path/蒙德-蒙德城-莎拉.json", - "_7d_foods": ["面粉","奶油","熏禽肉","黄油","火腿","糖","蟹黄","果酱","奶酪","培根","香肠"], - "tags": ["蒙德", "蒙德城", "莎拉"] - }, - "芙萝拉": { - "name": "芙萝拉", - "enable": true, - "page": 1, - "time": "day", - "path": "assets/path/蒙德-蒙德城-芙萝拉.json", - "_3d_foods": ["甜甜花", "风车菊", "塞西莉亚花", "小灯草", "嘟嘟莲"], - "tags": ["蒙德", "蒙德城", "芙萝拉"] - }, - "石榴": { - "name": "石榴", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/蒙德-蒙德城-石榴.json", - "_thu_foods": ["冒险家金杯", "冒险家尾羽", "冒险家头带", "冒险家之花", "冒险家怀表"], - "tags": ["蒙德", "蒙德城", "石榴", "狗粮商人"] - }, - "查尔斯": { - "name": "查尔斯", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/蒙德-蒙德城-天使的馈赠-查尔斯.json", - "_1d_foods": ["冰钩钩果汁", "树莓薄荷饮", "苹果酿", "气泡酸莓汁"], - "tags": ["蒙德", "蒙德城", "天使的馈赠", "查尔斯", "独立地图", "稀少商品"] - }, - "阿山婆": { - "name": "阿山婆", - "enable": true, - "page": 2, - "time": "any", - "path": "assets/path/璃月-璃月港-阿山婆.json", - "_1d_foods": ["霄灯"], - "tags": ["璃月", "璃月港", "阿山婆"] - }, - "石头": { - "name": "石头", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/璃月-璃月港-石头.json", - "_1d_foods": ["铁块", "白铁块", "夜泊石"], - "tags": ["璃月", "璃月港", "石头"] - }, - "DongSheng": { - "name": "东升", - "enable": true, - "page": 2, - "time": "any", - "path": "assets/path/璃月-璃月港-东升.json", - "_1d_foods": ["盐", "胡椒", "洋葱", "牛奶", "番茄", "卷心菜", "土豆", "小麦", "稻米", "虾仁", "豆腐", "杏仁" ], - "tags": ["璃月", "璃月港", "东升"] - }, - "ChefMao": { - "name": "卯师父", - "enable": true, - "page": 5, - "time": "any", - "path": "assets/path/璃月-璃月港-卯师父.json", - "_1d_foods": ["鱼肉", "螃蟹"], - "_3d_foods": ["竹笋", "莲蓬", "松茸", "蘑菇", "胡萝卜", "白萝卜", "绝云椒椒"], - "_7d_foods": ["面粉","糖","香肠","火腿"], - "tags": ["璃月", "璃月港", "卯师父"] - }, - "UncleSun": { - "name": "老孙", - "enable": true, - "page": 1, - "time": "day", - "path": "assets/path/璃月-璃月港-老孙.json", - "_1d_foods": ["鱼肉", "螃蟹", "虾仁"], - "tags": ["璃月", "璃月港", "老孙"] - }, - "UncleGao": { - "name": "老高", - "enable": true, - "page": 1, - "time": "day", - "path": "assets/path/璃月-璃月港-老高.json", - "_1d_foods": ["鱼肉","鱼肉2"], - "tags": ["璃月", "璃月港", "老高"] - }, - "长顺": { - "name": "长顺", - "enable": true, - "page": 1, - "time": "day", - "path": "assets/path/璃月-璃月港-长顺.json", - "_1d_foods": ["土豆"], - "_3d_foods": ["石珀", "电气水晶"], - "_7d_foods": ["糖", "奶酪"], - "tags": ["璃月", "璃月港", "长顺"] - }, - "琳琅": { - "name": "琳琅", - "enable": true, - "page": 1, - "time": "night", - "path": "assets/path/璃月-璃月港-琳琅.json", - "_thu_foods": ["游医的药壶" ,"游医的枭羽" ,"游医的方巾" ,"游医的银莲" ,"游医的怀钟"], - "tags": ["璃月", "璃月港", "琳琅", "狗粮商人"] - }, - "张顺": { - "name": "张顺", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/璃月-璃月港-张顺.json", - "_thu_foods": ["幸运儿之杯", "幸运儿鹰羽", "幸运儿银冠", "幸运儿绿花", "幸运儿沙漏"], - "tags": ["璃月", "璃月港", "张顺", "狗粮商人"] - }, - "博来": { - "name": "博来", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/璃月-璃月港-博来.json", - "_3d_foods": ["苹果", "日落果", "鱼肉", "星螺"], - "tags": ["璃月", "璃月港", "博来"] - }, - "阿桂": { - "name": "阿桂", - "enable": true, - "page": 2, - "time": "night", - "path": "assets/path/璃月-璃月港-阿桂.json", - "_3d_foods": ["清心", "琉璃袋", "马尾", "莲蓬", "冰雾花花朵", "烈焰花花蕊"], - "tags": ["璃月", "璃月港", "阿桂"] - }, - "朱老板": { - "name": "朱老板", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/璃月-琼玑野-朱老板.json", - "_1d_foods": ["大碗茶"], - "tags": ["璃月", "琼玑野", "朱老板", "稀少商品"] - }, - "菲尔戈黛特": { - "name": "菲尔戈黛特", - "enable": true, - "page": 2, - "time": "any", - "path": "assets/path/璃月-望舒客栈-菲尔戈黛特.json", - "_3d_foods": ["松茸","霓裳花", "琉璃袋"], - "_7d_foods": ["黄油", "香肠"], - "tags": ["璃月", "望舒客栈", "菲尔戈黛特"] - }, - "老周叔": { - "name": "老周叔", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/璃月-石门-老周叔.json", - "_1d_foods": ["大碗茶"], - "tags": ["璃月", "石门", "老周叔", "稀少商品"] - }, - "小白": { - "name": "小白", - "enable": true, - "page": 2, - "time": "any", - "path": "assets/path/璃月-轻策庄-小白.json", - "_3d_foods": ["豆腐", "杏仁", "霓裳花"], - "_month_foods": ["琉璃百合"], - "tags": ["璃月", "轻策庄", "小白"] - }, - "凯叔": { - "name": "凯叔", - "enable": true, - "page": 1, - "time": "day", - "path": "assets/path/璃月-轻策庄-凯叔.json", - "_1d_foods": ["大碗茶"], - "tags": ["璃月", "轻策庄", "凯叔", "稀少商品"] - }, - "丰泰": { - "name": "丰泰", - "enable": true, - "page": 2, - "time": "any", - "path": "assets/path/璃月-遗珑埠-丰泰.json", - "_1d_foods": ["稻米","豆腐"], - "_3d_foods": [ "清水玉","石珀","夜泊石","琉璃袋", "霓裳花", "绝云椒椒","沉玉仙茗"], - "_7d_foods": ["蟹黄"], - "tags": ["璃月", "遗珑埠", "丰泰"] - }, - "连芳": { - "name": "连芳", - "enable": true, - "page": 2, - "time": "any", - "path": "assets/path/璃月-遗珑埠-连芳.json", - "_3d_foods": ["沉玉仙茗"], - "tags": ["璃月", "遗珑埠", "连芳"] - }, - "Obata": { - "name": "小畑", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/稻妻-离岛-小畑.json", - "_1d_foods": ["螃蟹","鱼肉", "虾仁"], - "_3d_foods": ["海灵芝"], - "tags": ["稻妻", "离岛", "小畑"] - }, - "秋月": { - "name": "秋月", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/稻妻-离岛-秋月.json", - "_1d_foods": ["铁块", "白铁块", "电气水晶"], - "tags": ["稻妻", "离岛", "秋月"] - }, - "山城健太": { - "name": "山城健太", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/稻妻-离岛-山城健太.json", - "_1d_foods": ["鳗肉"], - "_3d_foods": ["珊瑚真珠"], - "_thu_foods": ["幸运儿之杯", "幸运儿鹰羽", "幸运儿银冠", "幸运儿绿花", "幸运儿沙漏"], - "tags": ["稻妻", "离岛", "山城健太", "狗粮商人"] - }, - "卡琵莉亚": { - "name": "卡琵莉亚", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/稻妻-离岛-卡琵莉亚.json", - "_3d_foods": ["蒲公英籽"], - "tags": ["稻妻", "离岛", "卡琵莉亚"] - }, - "若紫": { - "name": "若紫", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/稻妻-白狐之野-若紫.json", - "_7d_foods": ["「四方八方之网」"], - "tags": ["稻妻", "白狐之野", "若紫"] - }, - "Aoi": { - "name": "葵", - "enable": true, - "page": 2, - "time": "any", - "path": "assets/path/稻妻-稻妻城-葵.json", - "_1d_foods": ["盐", "胡椒", "洋葱", "牛奶", "番茄", "卷心菜", "土豆", "小麦", "稻米", "虾仁", "豆腐"], - "_3d_foods": ["鸣草"], - "tags": ["稻妻", "稻妻城", "葵"] - }, - "ShimuraKanbei": { - "name": "志村勘兵卫", - "enable": true, - "page": 4, - "time": "any", - "path": "assets/path/稻妻-稻妻城-志村勘兵卫.json", - "_1d_foods": ["鱼肉", "螃蟹"], - "_3d_foods": ["海草", "堇瓜", "白萝卜"], - "_7d_foods": ["香肠", "培根", "面粉", "糖"], - "tags": ["稻妻", "稻妻城", "志村勘兵卫"] - }, - "智树": { - "name": "智树", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/稻妻-稻妻城-智树.json", - "_1d_foods": ["团子牛奶"], - "tags": ["稻妻", "稻妻城", "智树", "稀少商品"] - }, - "木南杏奈": { - "name": "木南杏奈", - "enable": true, - "page": 2, - "time": "any", - "path": "assets/path/稻妻-稻妻城-木南杏奈.json", - "_1d_foods": ["特制风味烤蘑菇披萨"], - "tags": ["稻妻", "稻妻城", "木南杏奈", "稀少商品"] - }, - "清子": { - "name": "清子", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/稻妻-海祇岛-清子.json", - "_7d_foods": ["牛奶", "番茄", "土豆", "小麦", "豆腐"], - "tags": ["稻妻", "海祇岛", "清子"] - }, - "阿什帕齐": { - "name": "阿什帕齐", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/须弥-化城郭-阿什帕齐.json", - "_1d_foods": ["兽肉", "禽肉"], - "_3d_foods": ["鸟蛋", "树王圣体菇"], - "_7d_foods": ["香辛料"], - "tags": ["须弥", "化城郭", "阿什帕齐"] - }, - "Zhute": { - "name": "朱特", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/须弥-须弥城-朱特.json", - "_3d_foods": ["香辛果", "帕蒂沙兰"], - "_7d_foods": ["香辛料"], - "tags": ["须弥", "须弥城", "朱特"] - }, - "阿夫辛": { - "name": "阿夫辛", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/须弥-须弥城-阿夫辛.json", - "_thu_foods": ["冒险家金杯", "冒险家尾羽", "冒险家头带", "冒险家之花", "冒险家怀表"], - "tags": ["须弥", "须弥城", "阿夫辛", "狗粮商人"] - }, - "Pam": { - "name": "珀姆", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/须弥-须弥城-珀姆.json", - "_1d_foods": ["鱼肉", "螃蟹", "虾仁"], - "_3d_foods": ["海草"], - "tags": ["须弥", "须弥城", "珀姆"] - }, - "Hamawi": { - "name": "哈马维", - "enable": true, - "page": 2, - "time": "any", - "path": "assets/path/须弥-须弥城-哈马维.json", - "_1d_foods": ["盐", "胡椒", "洋葱", "牛奶", "番茄", "卷心菜", "土豆", "小麦", "稻米", "豆腐", "虾仁"], - "_3d_foods": ["香辛果", "墩墩桃"], - "tags": ["须弥", "须弥城", "哈马维"] - }, - "Lambad": { - "name": "兰巴德", - "enable": true, - "page": 3, - "time": "any", - "path": "assets/path/须弥-须弥城-兰巴德酒馆-兰巴德.json", - "_1d_foods": ["鱼肉", "螃蟹", "秃秃豆"], - "_3d_foods": ["星蕈"], - "_7d_foods": ["面粉", "香肠", "培根", "香辛料", "糖"], - "tags": ["须弥", "须弥城", "兰巴德酒馆", "兰巴德", "独立地图"] - }, - "Enteka": { - "name": "恩忒卡", - "enable": true, - "page": 2, - "time": "any", - "path": "assets/path/须弥-须弥城-普斯帕咖啡馆-恩忒卡.json", - "_1d_foods": ["咖啡豆"], - "tags": ["须弥", "须弥城", "普斯帕咖啡馆", "恩忒卡", "独立地图"] - }, - "拉玛": { - "name": "拉玛", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/须弥-奥摩斯港-拉玛.json", - "_1d_foods": ["盐", "胡椒"], - "_7d_foods": ["香辛料", "糖", "黄油", "奶酪"], - "tags": ["须弥", "奥摩斯港", "拉玛"] - }, - "Butrus": { - "name": "布特罗斯", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/须弥-奥摩斯港-布特罗斯.json", - "_1d_foods": ["鱼肉", "螃蟹", "虾仁"], - "tags": ["须弥", "奥摩斯港", "布特罗斯"] - }, - "秋蔚": { - "name": "秋蔚", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/须弥-奥摩斯港-秋蔚.json", - "_3d_foods": ["水晶块", "石珀", "夜泊石", "霓裳花"], - "tags": ["须弥", "奥摩斯港", "秋蔚"] - }, - "巴巴克": { - "name": "巴巴克", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/须弥-奥摩斯港-巴巴克.json", - "_3d_foods": ["慕风蘑菇" ,"蒲公英籽" ,"琉璃袋", "清心", "鸣草", "珊瑚真珠"], - "tags": ["须弥", "奥摩斯港", "巴巴克"] - }, - "兰玛尼": { - "name": "兰玛尼", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/须弥-桓那兰那(梦境)-兰玛尼.json", - "_3d_foods": ["日落果", "香辛果", "墩墩桃", "树王圣体菇", "劫波莲"], - "tags": ["须弥", "桓那兰那(梦境)", "兰玛尼", "桓那兰那(梦境)"] - }, - "Azalai": { - "name": "阿扎莱", - "enable": true, - "page": 2, - "time": "night", - "path": "assets/path/须弥-阿如村-阿扎莱.json", - "_1d_foods": ["鱼肉", "兽肉", "秃秃豆"], - "_3d_foods": ["星蕈", "枣椰", "墩墩桃"], - "_7d_foods": ["面粉", "香辛料", "糖"], - "tags": ["须弥", "阿如村", "阿扎莱", "黑心商人"] - }, - "Boucicaut": { - "name": "布希柯", - "enable": true, - "page": 2, - "time": "any", - "path": "assets/path/枫丹-枫丹廷-布希柯.json", - "_1d_foods": ["枫达", "盐", "胡椒", "洋葱", "牛奶", "番茄", "卷心菜", "土豆", "小麦", "秃秃豆", "杏仁", "发酵果实汁"], - "_3d_foods": ["蘑菇", "茉洁草"], - "tags": ["枫丹", "枫丹廷", "布希柯"] - }, - "Arouet": { - "name": "阿鲁埃", - "enable": true, - "page": 2, - "time": "any", - "path": "assets/path/枫丹-枫丹廷-阿鲁埃.json", - "_1d_foods": ["枫达", "咖啡豆"], - "tags": ["枫丹", "枫丹廷", "阿鲁埃"] - }, - "路易": { - "name": "路易", - "enable": true, - "page": 2, - "time": "any", - "path": "assets/path/枫丹-枫丹廷-路易.json", - "_1d_foods": ["枫达"], - "tags": ["枫丹", "枫丹廷", "路易"] - }, - "欧仁妮": { - "name": "欧仁妮", - "enable": true, - "page": 2, - "time": "any", - "path": "assets/path/枫丹-枫丹廷-欧仁妮.json", - "_1d_foods": ["番茄", "卷心菜"], - "_3d_foods": ["泡泡桔", "茉洁草", "日落果", "墩墩桃", "枣椰", "落落莓", "虹彩蔷薇"], - "tags": ["枫丹", "枫丹廷", "欧仁妮"] - }, - "桑格内蒂": { - "name": "桑格内蒂", - "enable": true, - "page": 5, - "time": "any", - "path": "assets/path/枫丹-枫丹廷-德波大饭店-桑格内蒂.json", - "_1d_foods": ["枫达"], - "_7d_foods": ["面粉","奶油","黄油","火腿","糖","蟹黄","果酱","奶酪","培根","香肠"], - "tags": ["枫丹", "枫丹廷", "德波大饭店", "桑格内蒂", "独立地图"] - }, - "克洛莎": { - "name": "克洛莎", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/枫丹-枫丹廷-灰河-克洛莎.json", - "_thu_foods": ["幸运儿之杯", "幸运儿鹰羽", "幸运儿银冠", "幸运儿绿花", "幸运儿沙漏"], - "tags": ["枫丹", "枫丹廷", "灰河", "克洛莎", "狗粮商人"] - }, - "Antman": { - "name": "安特曼", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/枫丹-白淞镇-安特曼.json", - "_1d_foods": ["鱼肉", "螃蟹", "虾仁"], - "_3d_foods": ["海露花", "汐藻", "苍晶螺"], - "tags": ["枫丹", "白淞镇", "安特曼"] - }, - "皮托": { - "name": "皮托", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/枫丹-锈舵酒馆-皮托.json", - "_1d_foods": ["牛奶"], - "_7d_foods": ["培根", "火腿", "香肠", "奶酪"], - "tags": ["枫丹", "锈舵酒馆", "皮托", "黑心商人"] - }, - "艾库瓦": { - "name": "艾库瓦", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/纳塔-圣火竞技场-艾库瓦.json", - "_thu_foods": ["幸运儿之杯", "幸运儿鹰羽", "幸运儿银冠", "幸运儿绿花", "幸运儿沙漏"], - "tags": ["纳塔", "圣火竞技场", "艾库瓦", "狗粮商人"] - }, - "钦特利": { - "name": "钦特利", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/纳塔-圣火竞技场-钦特利.json", - "_1d_foods": ["土豆"], - "_3d_foods": ["烛伞蘑菇", "颗粒果", "苦种", "烬芯花", "青蜜莓", "肉龙掌"], - "tags": ["纳塔", "圣火竞技场", "钦特利"] - }, - "Bunama": { - "name": "布纳马", - "enable": true, - "page": 2, - "time": "any", - "path": "assets/path/纳塔-圣火竞技场-布纳马.json", - "_1d_foods": ["盐", "胡椒", "小麦", "洋葱", "牛奶", "番茄", "卷心菜", "土豆", "秃秃豆"], - "tags": ["纳塔", "圣火竞技场", "布纳马"] - }, - "夏安卡": { - "name": "夏安卡", - "enable": true, - "page": 3, - "time": "any", - "path": "assets/path/纳塔-圣火竞技场-夏安卡.json", - "_7d_foods": ["面粉", "奶油", "黄油", "火腿", "糖", "蟹黄", "果酱", "奶酪", "培根", "香肠"], - "tags": ["纳塔", "圣火竞技场", "夏安卡"] - }, - "伊蜜": { - "name": "伊蜜", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/纳塔-坚岩隘谷-伊蜜.json", - "_3d_foods": ["铁块", "白铁块", "水晶块", "萃凝晶", "澄晶实"], - "tags": ["纳塔", "坚岩隘谷", "伊蜜"] - }, - "穆托莉娜": { - "name": "穆托莉娜", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/纳塔-悠悠度假村-穆托莉娜.json", - "_3d_foods": ["灼灼彩菊", "肉龙掌", "云岩裂叶", "浪沫羽鳃"], - "tags": ["纳塔", "悠悠度假村", "穆托莉娜"] - }, - "采若": { - "name": "采若", - "enable": true, - "page": 3, - "time": "any", - "path": "assets/path/挪德卡莱-那夏镇-采若.json", - "_1d_foods": ["盐", "胡椒", "洋葱", "牛奶", "番茄", "卷心菜", "土豆", "小麦", "黑麦"], - "tags": ["挪德卡莱", "那夏镇", "采若"] - }, - "丽切娅": { - "name": "丽切娅", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/挪德卡莱-那夏镇-丽切娅.json", - "_3d_foods": ["甜甜花", "宿影花", "霜盏花"], - "tags": ["挪德卡莱", "那夏镇", "丽切娅"] - }, - "卡嘉": { - "name": "卡嘉", - "enable": true, - "page": 4, - "time": "any", - "path": "assets/path/挪德卡莱-那夏镇-卡嘉.json", - "_7d_foods": ["面粉", "奶油", "熏禽肉", "黄油", "火腿", "糖", "蟹黄", "果酱", "奶酪", "培根", "香肠"], - "tags": ["挪德卡莱", "那夏镇", "卡嘉"] - }, - "雷科": { - "name": "雷科", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/挪德卡莱-那夏镇-雷科.json", - "_thu_foods": ["幸运儿之杯", "幸运儿鹰羽", "幸运儿银冠", "幸运儿绿花", "幸运儿沙漏"], - "tags": ["挪德卡莱", "那夏镇", "雷科", "狗粮商人"] - }, - "德米安": { - "name": "德米安", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/挪德卡莱-那夏镇-旗舰-德米安.json", - "_1d_foods": ["「皮拉米达的夜莺」", "边陲之地", "野浆果之路"], - "tags": ["挪德卡莱", "那夏镇", "旗舰", "德米安", "稀少商品", "独立地图"] - }, - "科菲策": { - "name": "科菲策", - "enable": true, - "page": 1, - "time": "any", - "path": "assets/path/挪德卡莱-皮拉米达城-科菲策.json", - "_1d_foods": ["牛奶", "咖啡豆"], - "_3d_foods": ["微光角菌", "琉鳞石"], - "tags": ["挪德卡莱", "皮拉米达城", "科菲策", "黑心商人"] - } -} -""" - -data = json.loads(npcs_content) - -all_foods = set() -all_tags = set() - -for npc in data.values(): - if "_1d_foods" in npc: - for food in npc["_1d_foods"]: - all_foods.add(food) - if "_3d_foods" in npc: - for food in npc["_3d_foods"]: - all_foods.add(food) - if "_7d_foods" in npc: - for food in npc["_7d_foods"]: - all_foods.add(food) - if "_thu_foods" in npc: - for food in npc["_thu_foods"]: - all_foods.add(food) - if "_month_foods" in npc: - for food in npc["_month_foods"]: - all_foods.add(food) - - if "tags" in npc: - for tag in npc["tags"]: - all_tags.add(tag) - -# Sort lists -sorted_foods = sorted(list(all_foods)) -sorted_tags = sorted(list(all_tags)) - -settings = [ - { - "name": "userName", - "type": "input-text", - "label": "账号名(用于区分不同账户的记录)\\n为空则读取uid作为自定义CD记录标识", - "default": "默认账户" - }, - { - "name": "foodsToBuyList", - "type": "multi-checkbox", - "label": "要购买的商品", - "options": sorted_foods, - "default": ["小麦", "黑麦"] - }, - { - "name": "AKF", - "type": "select", - "label": "每周商品购买方式\\n0=跟随系统周期自动判定\\n1-7=指定星期几购买(1=周一,7=周日)", - "options": [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7" - ], - "default": "0" - }, - { - "name": "disabledTagsList", - "type": "multi-checkbox", - "label": "禁用标签", - "options": sorted_tags, - "default": ["卡琵莉亚"] - }, - { - "name": "skip", - "type": "checkbox", - "label": "跳过调整时间动画", - "default": False - }, - { - "name": "ignoreRecords", - "type": "checkbox", - "label": "-----------------\\n无视记录强制购买(不推荐)", - "default": False - }, - { - "name": "recordDebug", - "type": "checkbox", - "label": "调试模式(显示详细日志)", - "default": False - } -] - -with open('repo/js/自动购买商品/settings.json', 'w', encoding='utf-8') as f: - json.dump(settings, f, indent=4, ensure_ascii=False)