From bd88d115f674e375cad546c721779c5b0b7d8e95 Mon Sep 17 00:00:00 2001 From: this-Fish Date: Tue, 17 Feb 2026 16:00:16 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=B4=AD=E4=B9=B0=E6=AF=8F?= =?UTF-8?q?=E5=A4=A9&3=E5=A4=A9&=E6=AF=8F=E5=91=A8=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E5=95=86=E5=93=813.2.3=20(#2892)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 自动购买每天&3天&每周刷新商品3.2.2 * 回退购买商人標籤 * 回退 * 補充商品信息 * 修復BUG * 自动购买每天&3天&每周刷新商品3.2.3-tags支援 --- .../自动购买每天&3天&每周刷新商品/README.md | 25 ++- .../assets/images/清水玉.png | Bin 0 -> 10166 bytes .../assets/npcs.json | 3 +- .../assets/path/蒙德-蒙德城-天使的馈赠-查尔斯.json | 23 ++- repo/js/自动购买每天&3天&每周刷新商品/main.js | 172 +++++++++++------- .../manifest.json | 2 +- .../settings.json | 10 +- .../商人与商品支持表.md | 11 +- 8 files changed, 149 insertions(+), 97 deletions(-) create mode 100644 repo/js/自动购买每天&3天&每周刷新商品/assets/images/清水玉.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/README.md b/repo/js/自动购买每天&3天&每周刷新商品/README.md index ba1b4e215..ddbaa4481 100644 --- a/repo/js/自动购买每天&3天&每周刷新商品/README.md +++ b/repo/js/自动购买每天&3天&每周刷新商品/README.md @@ -45,20 +45,16 @@ - 周一刷新商品 - 周四刷新商品 - **每月1号刷新商品**:不受此设置影响,刷新即购买 -4. **要禁用的商人**:不想购买的商人,用空格分隔 +4. **禁用标签功能**:可以输入要禁用的标签(空格分隔),如: ``` - 示例:阿扎莱 皮托 - ``` -5. **禁用标签功能**:可以输入要禁用的标签(空格分隔),如: - ``` - 示例:黑心商人 挪德卡莱 + 示例:黑心商人 挪德卡莱 卡琵莉亚 ``` 禁用后,脚本会跳过这些商人或带有指定标签的商人,不会前往购买。 可以使用国家/地区(如"蒙德"、"璃月")或其他标签(如商人信息总览中的标签) -6. **是否跳过调整时间动画**:开启后会啟用时瞬跳过调整时间动画 -7. **无视购买记录强制购买**:开启后会忽略购买记录,重新购买所有商品 -8. **调试模式**:开启后显示详细执行日志 +5. **是否跳过调整时间动画**:开启后会啟用时瞬跳过调整时间动画 +6. **无视购买记录强制购买**:开启后会忽略购买记录,重新购买所有商品 +7. **调试模式**:开启后显示详细执行日志 ### 购买记录系统说明 脚本会自动记录购买时间,避免重复购买: @@ -106,7 +102,7 @@ | 璃月-石门 | 老周叔 | 大碗茶 | - | - | 稀少商品 | | 璃月-轻策庄 | 小白 | - | 豆腐、杏仁、霓裳花 | - | 琉璃百合(每月刷新) | | 璃月-轻策庄 | 凯叔 | 大碗茶 | - | - | 稀少商品 | -| 璃月-遗珑埠 | 丰泰 | - | 沉玉仙茗、琉璃袋、绝云椒椒 | 蟹黄 | | +| 璃月-遗珑埠 | 丰泰 | 稻米、豆腐 | 清水玉、石珀、夜泊石、琉璃袋、霓裳花、绝云椒椒、沉玉仙茗 | 蟹黄 | | | 璃月-遗珑埠 | 连芳 | - | 沉玉仙茗 | - | | | 稻妻-离岛 | 小畑 | 螃蟹、鱼肉、虾仁 | 海灵芝 | - | | | 稻妻-离岛 | 秋月 | 铁块、白铁块、电气水晶 | - | - | | @@ -151,10 +147,11 @@ | 挪德卡莱-那夏镇 | 雷科 | - | - | 幸运儿之杯、幸运儿鹰羽、幸运儿银冠、幸运儿绿花、幸运儿沙漏 | 狗粮商人 | | 挪德卡莱-皮拉米达城 | 科菲策 | 牛奶、咖啡豆 | 微光角菌、琉鳞石 | - | 黑心商人 | -- **国家标签**:蒙德、璃月、稻妻、须弥、枫丹、纳塔、挪德卡莱 -- **地区标签**:风起地、清泉镇、蒙德城、璃月港、离岛、稻妻城、海祇岛等 -- **小地图标签**:天使的馈赠、兰巴德酒馆、德波大饭店、灰河、锈舵酒馆等 -- **商人标签**:克罗丽丝、神奇的霍普金斯、杜拉夫等(所有商人名) +### **以下为有效标签** +- **国家**:蒙德、璃月、稻妻、须弥、枫丹、纳塔、挪德卡莱 +- **地区**:风起地、清泉镇、蒙德城、璃月港、离岛、稻妻城、海祇岛等 +- **小地图**:天使的馈赠、兰巴德酒馆、德波大饭店、灰河、锈舵酒馆等 +- **商人**:克罗丽丝、神奇的霍普金斯、杜拉夫等(所有商人名) - **移动**:指商人会移动,有机会购买失败 - **稀少商品**:指稀少商品 - **独立地图**:指需要进入独立空间的特殊地图,这些地图部份路径无法使用地图追踪功能 diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/清水玉.png b/repo/js/自动购买每天&3天&每周刷新商品/assets/images/清水玉.png new file mode 100644 index 0000000000000000000000000000000000000000..c2a65f6b343dc6a02de626fa93ceb6ff24bbcf2a GIT binary patch literal 10166 zcmV;nCrQ|eP)PyA07*naRCr#+daIzH`$gftG7{^qUq)K)6eermvhf8Gm>D- z@gvX7z4x5+|L^~P?fw39m5+Vm(*Xbk0sRZ0C<^@v`k{dT9)Nx1f)94KqOfbS>qf3g zZ~1|b!1tjjDpZy3rU0r6Rg57}Xi(z*Gz33jW8{~mi}CS=N5J2&9j}~6qY3aa%6H^E z`L#I~;+_H?#1`N8*}p3A+2{G9Ho9koE8%UWz0|z0;ACh_lF{LUf9w;VVb_i_yy2unx-}Te z0_>_C2^#>TjbIP^Sy^pvl1gZj+*SxM<}ZYq2s0P-lR(o1qK+eCD0P6yPoB%sGz9Fn zJ3bR|ENWnCWRDTzNj6qYt>XI@D<6%f7nMOv zvx`uz!MJ!DQU8VnxYpz<1Fj?lEHc(iPF`2#5h@H)Avg`4SOZYP>k5)Y?$Zc7MfzM? z2MJiC8Ac~vA3-CAT!W7Mvk?R9{ZqXGh$-^iP`u4^ME-}2j_fy)-^tg*bH#abl+o)f zz`ZaSHF}?i9|G)CcZch;P~LSuU{!%DmV8lg8r&=dM5&COt$2iO#K9_4l!@`eHdr

(tw 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 literal 0 HcmV?d00001 diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/npcs.json b/repo/js/自动购买每天&3天&每周刷新商品/assets/npcs.json index ca3899e3e..2a9a64dc6 100644 --- a/repo/js/自动购买每天&3天&每周刷新商品/assets/npcs.json +++ b/repo/js/自动购买每天&3天&每周刷新商品/assets/npcs.json @@ -227,7 +227,8 @@ "page": 2, "time": "any", "path": "assets/path/璃月-遗珑埠-丰泰.json", - "_3d_foods": ["沉玉仙茗", "琉璃袋", "绝云椒椒"], + "_1d_foods": ["稻米","豆腐"], + "_3d_foods": [ "清水玉","石珀","夜泊石","琉璃袋", "霓裳花", "绝云椒椒","沉玉仙茗"], "_7d_foods": ["蟹黄"], "tags": ["璃月", "遗珑埠", "丰泰"] }, diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-蒙德城-天使的馈赠-查尔斯.json b/repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-蒙德城-天使的馈赠-查尔斯.json index 31cfb3f40..d0846c479 100644 --- a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-蒙德城-天使的馈赠-查尔斯.json +++ b/repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-蒙德城-天使的馈赠-查尔斯.json @@ -9,7 +9,7 @@ "bgi_version": "0.45.0", "description": "", "enable_monster_loot_split": false, - "last_modified_time": 1771248205039, + "last_modified_time": 1771299801495, "map_match_method": "", "map_name": "Teyvat", "name": "蒙德-蒙德城-天使的馈赠-查尔斯", @@ -49,6 +49,15 @@ "action": "", "action_params": "", "id": 4, + "move_mode": "walk", + "type": "path", + "x": -894.005859375, + "y": 2319.78125 + }, + { + "action": "", + "action_params": "", + "id": 5, "move_mode": "run", "type": "path", "x": -908.830078125, @@ -57,7 +66,7 @@ { "action": "", "action_params": "", - "id": 5, + "id": 6, "move_mode": "dash", "type": "path", "x": -921.044921875, @@ -66,7 +75,7 @@ { "action": "", "action_params": "", - "id": 6, + "id": 7, "move_mode": "walk", "type": "path", "x": -923.63671875, @@ -75,7 +84,7 @@ { "action": "", "action_params": "", - "id": 7, + "id": 8, "move_mode": "dash", "type": "path", "x": -930.8125, @@ -84,7 +93,7 @@ { "action": "", "action_params": "", - "id": 8, + "id": 9, "move_mode": "walk", "type": "path", "x": -934.296875, @@ -93,7 +102,7 @@ { "action": "", "action_params": "", - "id": 9, + "id": 10, "move_mode": "walk", "type": "path", "x": -933.291015625, @@ -102,7 +111,7 @@ { "action": "combat_script", "action_params": "wait(0.5),keypress(F),wait(0.2),keypress(F),wait(0.2),keypress(F),wait(7.5),keydown(a),keypress(SPACE),wait(0.5),keypress(SPACE),wait(0.5),keypress(SPACE),wait(0.5),keypress(SPACE),wait(0.5),keyup(a),wait(0.5),s(0.5),wait(0.5),d(2),wait(0.5),w(0.8),wait(0.5),a(0.5),wait(1.5)", - "id": 10, + "id": 11, "move_mode": "walk", "type": "target", "x": -929.392578125, diff --git a/repo/js/自动购买每天&3天&每周刷新商品/main.js b/repo/js/自动购买每天&3天&每周刷新商品/main.js index ec9e185ad..c17a947dd 100644 --- a/repo/js/自动购买每天&3天&每周刷新商品/main.js +++ b/repo/js/自动购买每天&3天&每周刷新商品/main.js @@ -111,6 +111,9 @@ let npcData = {}; // 存储用户要购买的商品名称集合(中文名) let userFoodsToBuy = new Set(); +let userTagsToBuy = new Set(); // 标签名 +let allTags = new Set(); // 所有可用标签(从 npcs.json 收集) +let requiredFoods = new Set(); // 所有需要加载图片的商品 async function loadExternalData() { try { @@ -119,26 +122,62 @@ async function loadExternalData() { npcData = JSON.parse(npcsContent); logConditional(`已加载商人数据: ${Object.keys(npcData).length} 个商人`); - // 解析用户要购买的商品列表(中文商品名,空格分隔) + // ========== 收集所有标签 ========== + for (let key in npcData) { + let npc = npcData[key]; + if (npc.tags && Array.isArray(npc.tags)) { + npc.tags.forEach(tag => allTags.add(tag)); + } + } + logConditional(`共收集到 ${allTags.size} 个标签`); + + // ========== 解析用户输入 ========== const foodsInput = (settings.foodsToBuy || "").trim(); if (foodsInput) { - const foodNames = foodsInput.split(/[,\s、]+/).filter(name => name.trim() !== ""); + const items = foodsInput.split(/[,\s、]+/).filter(item => item.trim() !== ""); const enabledFoodsList = []; - for (const foodName of foodNames) { - // 直接使用用户输入的商品名,不需要验证是否存在(由用户自行确保) - userFoodsToBuy.add(foodName); - enabledFoodsList.push(foodName); + const enabledTagsList = []; + + for (const item of items) { + if (allTags.has(item)) { + // 是标签 + userTagsToBuy.add(item); + enabledTagsList.push(item); + } else { + // 视为商品名 + userFoodsToBuy.add(item); + enabledFoodsList.push(item); + } + } + + // 输出用户启用的标签和商品 + if (enabledTagsList.length > 0) { + log.info(`用户启用了以下标签: ${enabledTagsList.join(", ")}`); } - // 输出用户启用的商品列表 if (enabledFoodsList.length > 0) { - log.info(`用户启用了下列商品: ${enabledFoodsList.join(", ")}`); - } else { - log.warn("用户未启用任何商品"); + log.info(`用户启用了以下商品: ${enabledFoodsList.join(", ")}`); + } + if (enabledTagsList.length === 0 && enabledFoodsList.length === 0) { + log.warn("用户未启用任何标签或商品"); } } else { - log.warn("用户未指定要购买的商品"); + log.warn("用户未指定要购买的商品或标签"); } + // 计算所有需要加载图片的商品 + requiredFoods = new Set(userFoodsToBuy); + for (let key in npcData) { + let npc = npcData[key]; + if (npc.tags && Array.isArray(npc.tags) && npc.tags.some(tag => userTagsToBuy.has(tag))) { + if (npc._1d_foods) npc._1d_foods.forEach(food => requiredFoods.add(food)); + if (npc._3d_foods) npc._3d_foods.forEach(food => requiredFoods.add(food)); + if (npc._7d_foods) npc._7d_foods.forEach(food => requiredFoods.add(food)); + if (npc._thu_foods) npc._thu_foods.forEach(food => requiredFoods.add(food)); + if (npc._month_foods) npc._month_foods.forEach(food => requiredFoods.add(food)); + } + } + logConditional(`需要加载图片的商品总数: ${requiredFoods.size}`); + return true; } catch (error) { log.error(`加载外部数据失败: ${error.message}`); @@ -146,6 +185,17 @@ async function loadExternalData() { } } +// ==================== 辅助函数:获取商人的所有商品 ==================== +function getAllNpcFoods(npc) { + const all = []; + if (npc._1d_foods) all.push(...npc._1d_foods); + if (npc._3d_foods) all.push(...npc._3d_foods); + if (npc._7d_foods) all.push(...npc._7d_foods); + if (npc._thu_foods) all.push(...npc._thu_foods); + if (npc._month_foods) all.push(...npc._month_foods); + return all; +} + // ==================== 辅助函数:过滤用户要购买的商品 ==================== function filterUserFoods(foodList) { if (!foodList || !Array.isArray(foodList)) { @@ -231,12 +281,6 @@ let userName = settings.userName || "默认账户"; const ignoreRecords = settings.ignoreRecords || false; const recordDebug = settings.recordDebug || false; -// 解析禁用的商人列表 -const disabledNpcs = (settings.disabledNpcs || "").split(/[,\s、]+/).filter(npc => npc.trim() !== ""); -if (disabledNpcs.length > 0) { - log.info(`已禁用商人: ${disabledNpcs.join(", ")}`); -} - // 解析禁用的标签列表 const disabledTags = (settings.disabledTags || "").split(/[,\s、]+/).filter(tag => tag.trim() !== ""); if (disabledTags.length > 0) { @@ -457,54 +501,71 @@ function shouldBuyFoods(npc, npcRecord, currentPeriod, forceRefresh = false) { "month": [] }; + // 首先检查禁用(此处假设之前已检查过,但为防止遗漏,可再加一道保险) + // 实际上禁用检查在更外层(initNpcData 和主循环)已经处理,这里可以省略 + if (forceRefresh) { - // 强制刷新:所有启用商品都尝试 - 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); + // 强制刷新:决定使用完整列表还是具体商品列表 + // 先判断是否命中标签 + let useAll = false; + if (npc.tags && Array.isArray(npc.tags)) { + useAll = npc.tags.some(tag => userTagsToBuy.has(tag)); + } + 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; + } 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); + } return foodsToBuy; } - // 辅助函数:处理单个刷新类型 - function processType(type, enabledFoods, refreshLogic) { - if (!enabledFoods || enabledFoods.length === 0) return []; + // 辅助函数:处理单个类型,根据是否命中标签决定使用完整列表还是过滤列表 + function processType(type, fullList) { + if (!fullList || fullList.length === 0) return []; - // 获取已购买列表(如果记录存在) + // 判断该商人是否命中用户标签(只需判断一次,可在外层缓存结果) + // 此处简单处理:每次调用都判断,但实际可优化 + let useAll = false; + if (npc.tags && Array.isArray(npc.tags)) { + useAll = npc.tags.some(tag => userTagsToBuy.has(tag)); + } + + // 确定要购买的候选商品列表 + let candidateList = useAll ? fullList : filterUserFoods(fullList); + if (candidateList.length === 0) return []; + + // 获取已购买列表 const purchasedList = npcRecord && npcRecord[type] ? npcRecord[type] : []; // 找出未购买的商品 - const notPurchased = enabledFoods.filter(food => !purchasedList.includes(food)); + const notPurchased = candidateList.filter(food => !purchasedList.includes(food)); - // 如果没有记录或没有刷新时间,说明从未买过,全部尝试 if (!npcRecord || !npcRecord[`${type}_time`]) { - return enabledFoods; + return candidateList; // 从未买过,全部尝试 } const nextRefreshTime = new Date(npcRecord[`${type}_time`]); if (now >= nextRefreshTime) { - // 已到刷新时间:所有商品都应重新尝试(已购买和未购买的都可能再次出现) - return enabledFoods; + return candidateList; // 已刷新,全部尝试 } else { - // 未到刷新时间:只尝试从未购买过的商品 - return notPurchased; + return notPurchased; // 未刷新,只尝试未购买过的 } } - // 处理每天刷新商品 - foodsToBuy["1d"] = processType("1d", filterUserFoods(npc._1d_foods)); - - // 处理3天刷新商品 - foodsToBuy["3d"] = processType("3d", filterUserFoods(npc._3d_foods)); - - // 处理7天刷新商品(周一刷新) - foodsToBuy["7d"] = processType("7d", filterUserFoods(npc._7d_foods)); - - // 处理周四刷新商品 - foodsToBuy["thu"] = processType("thu", filterUserFoods(npc._thu_foods)); - - // 处理每月刷新商品 - foodsToBuy["month"] = processType("month", filterUserFoods(npc._month_foods)); + foodsToBuy["1d"] = processType("1d", npc._1d_foods); + foodsToBuy["3d"] = processType("3d", npc._3d_foods); + foodsToBuy["7d"] = processType("7d", npc._7d_foods); + foodsToBuy["thu"] = processType("thu", npc._thu_foods); + foodsToBuy["month"] = processType("month", npc._month_foods); return foodsToBuy; } @@ -719,8 +780,7 @@ let foodROMap = {}; // 键为商品名(中文),值为 RecognitionObject // 加载识别对象(只加载用户选择的商品) async function initRo() { try { - for (let foodName of userFoodsToBuy) { - // 图片文件路径:assets/images/商品名.png + for (let foodName of requiredFoods) { const imagePath = `assets/images/${foodName}.png`; try { const ro = RecognitionObject.TemplateMatch(file.ReadImageMatSync(imagePath)); @@ -732,13 +792,11 @@ async function initRo() { log.error(`加载商品图片失败: ${imagePath},请确保图片存在`); } } - // 加载其他识别对象(购买按钮等) for (let [key, item] of Object.entries(othrtRo)) { item.ro = RecognitionObject.TemplateMatch(file.ReadImageMatSync(item.file)); item.ro.Threshold = 0.85; } - - logConditional(`总共启用了 ${userFoodsToBuy.size} 种商品`); + logConditional(`总共启用了 ${requiredFoods.size} 种商品`); return true; } catch (error) { @@ -915,14 +973,6 @@ async function buyFoods(npcName, npcRecords, currentPeriod) { // 初始化商人商品 async function initNpcData(records) { for (let [key, npc] of Object.entries(npcData)) { - // 检查是否在禁用列表中 - if (disabledNpcs.includes(npc.name)) { - npc.enable = false; - const displayName = getDisplayNameFromPath(npc.path); - logConditional(`已禁用: ${displayName}`); - continue; - } - // 检查是否通过标签禁用 if (npc.tags && Array.isArray(npc.tags)) { const hasDisabledTag = npc.tags.some(tag => disabledTags.includes(tag)); diff --git a/repo/js/自动购买每天&3天&每周刷新商品/manifest.json b/repo/js/自动购买每天&3天&每周刷新商品/manifest.json index b16fa4ffc..e6ef9131a 100644 --- a/repo/js/自动购买每天&3天&每周刷新商品/manifest.json +++ b/repo/js/自动购买每天&3天&每周刷新商品/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "自动购买每天&3天&每周刷新商品", - "version": "3.2.2", + "version": "3.2.3", "description": "自动购买每天&3天&每周刷新商品\n每天刷新商品:自动购买商品\n3天刷新商品:未到刷新日不购买该商品\n每周刷新商品:可指定每周购买商品", "authors": [ { diff --git a/repo/js/自动购买每天&3天&每周刷新商品/settings.json b/repo/js/自动购买每天&3天&每周刷新商品/settings.json index 64c7ac100..9d68d2473 100644 --- a/repo/js/自动购买每天&3天&每周刷新商品/settings.json +++ b/repo/js/自动购买每天&3天&每周刷新商品/settings.json @@ -27,17 +27,11 @@ ], "default": "0" }, - { - "name": "disabledNpcs", - "type": "input-text", - "label": "要禁用的商人\n(多个商人用空格分隔)\n示例:阿扎莱 皮托", - "default": "阿扎莱 皮托" - }, { "name": "disabledTags", "type": "input-text", - "label": "禁用标签\n(多个标签以空格分隔,如:黑心商人 挪德卡莱)", - "default": "" + "label": "禁用标签\n(多个标签以空格分隔,如: 挪德卡莱 黑心商人 卡琵莉亚)", + "default": "卡琵莉亚" }, { "name": "skip", diff --git a/repo/js/自动购买每天&3天&每周刷新商品/商人与商品支持表.md b/repo/js/自动购买每天&3天&每周刷新商品/商人与商品支持表.md index 95b42762d..08bdd294f 100644 --- a/repo/js/自动购买每天&3天&每周刷新商品/商人与商品支持表.md +++ b/repo/js/自动购买每天&3天&每周刷新商品/商人与商品支持表.md @@ -29,7 +29,7 @@ | 璃月-石门 | 老周叔 | 大碗茶 | - | - | 稀少商品 | | 璃月-轻策庄 | 小白 | - | 豆腐、杏仁、霓裳花 | - | 琉璃百合(每月刷新) | | 璃月-轻策庄 | 凯叔 | 大碗茶 | - | - | 稀少商品 | -| 璃月-遗珑埠 | 丰泰 | - | 沉玉仙茗、琉璃袋、绝云椒椒 | 蟹黄 | | +| 璃月-遗珑埠 | 丰泰 | 稻米、豆腐 | 清水玉、石珀、夜泊石、琉璃袋、霓裳花、绝云椒椒、沉玉仙茗 | 蟹黄 | | | 璃月-遗珑埠 | 连芳 | - | 沉玉仙茗 | - | | | 稻妻-离岛 | 小畑 | 螃蟹、鱼肉、虾仁 | 海灵芝 | - | | | 稻妻-离岛 | 秋月 | 铁块、白铁块、电气水晶 | - | - | | @@ -74,10 +74,11 @@ | 挪德卡莱-那夏镇 | 雷科 | - | - | 幸运儿之杯、幸运儿鹰羽、幸运儿银冠、幸运儿绿花、幸运儿沙漏 | 狗粮商人 | | 挪德卡莱-皮拉米达城 | 科菲策 | 牛奶、咖啡豆 | 微光角菌、琉鳞石 | - | 黑心商人 | -- **国家标签**:蒙德、璃月、稻妻、须弥、枫丹、纳塔、挪德卡莱 -- **地区标签**:风起地、清泉镇、蒙德城、璃月港、离岛、稻妻城、海祇岛等 -- **小地图标签**:天使的馈赠、兰巴德酒馆、德波大饭店、灰河、锈舵酒馆等 -- **商人标签**:克罗丽丝、神奇的霍普金斯、杜拉夫等(所有商人名) +### **以下为有效标签** +- **国家**:蒙德、璃月、稻妻、须弥、枫丹、纳塔、挪德卡莱 +- **地区**:风起地、清泉镇、蒙德城、璃月港、离岛、稻妻城、海祇岛等 +- **小地图**:天使的馈赠、兰巴德酒馆、德波大饭店、灰河、锈舵酒馆等 +- **商人**:克罗丽丝、神奇的霍普金斯、杜拉夫等(所有商人名) - **移动**:指商人会移动,有机会购买失败 - **稀少商品**:指稀少商品 - **独立地图**:指需要进入独立空间的特殊地图,这些地图部份路径无法使用地图追踪功能