diff --git a/repo/js/自动购买每天&3天&每周刷新商品/README.md b/repo/js/自动购买商品/README.md similarity index 97% rename from repo/js/自动购买每天&3天&每周刷新商品/README.md rename to repo/js/自动购买商品/README.md index c71c636b5..8af4177bc 100644 --- a/repo/js/自动购买每天&3天&每周刷新商品/README.md +++ b/repo/js/自动购买商品/README.md @@ -1,265 +1,266 @@ -# 自动购买每天&3天&每周刷新商品 - 使用说明 - -## 📝 功能说明 - -这个脚本可以自动购买原神游戏中各个商品的商品,支持三种刷新周期: -- **每天刷新商品**:每天凌晨4点刷新 -- **3天刷新商品**:每3天刷新一次 -- **每周刷新商品**:每周刷新,可指定购买日 -- **记录系统**:避免重复购买,只购买刷新后的商品 -- **标签系统**:支持按标签批量禁用商人 - -## ⚡ 快速开始 - -### 1. 准备工作 & 注意事项 -1. **游戏分辨率**:1920×1080 解析度** -2. **游戏时间**:脚本会自动调整白天/晚上时间 -3. **背包空间**:确保有足够空间购买商品 -4. **摩拉**:确保有足够的摩拉 -5. **记录系统**:购买记录保存在 `record/账号名/` 目录下 -6. **多人模式**:脚本只能在单人模式下运行 -7. **刷新时间**:基于游戏服务器时间(GMT+8),每天4点刷新 - - -### 2. 首次使用 -1. 打开脚本设置界面 -2. 输入要购买的商品 -3. 设置每周商品购买模式 -4. 设置要禁用的商人或标签 -5. 保存设置 -6. 在主界面运行脚本 - - - -## ⚙️ 设置说明 -1. **账号名**:填写账号名,用于区分不同账号的购买记录(为空则读取uid作为自定义CD记录标识) -2. **要购买的商品**:输入商品名称,用空格分隔(支援的商人与商品请查看下方表格) - - 建议直接复制商品名称贴上输入栏 - - 输入标签后会购买具有该标签的商人的所有商品 - ``` - 示例:盐 胡椒 螃蟹 圣水 松茸 沉玉仙茗 蟹黄 稀少商品 - ``` -3. **每周商品购买方式**: - - 0:跟随游戏系统周期自动判断 - - 1-7:指定周几购买(1=周一,7=周日) - - **适用范围**:包含所有每周刷新的商品 - - 周一刷新商品 - - 周四刷新商品 - - **每月1号刷新商品**:不受此设置影响,刷新即购买 -4. **禁用标签功能**:可以输入要禁用的标签(空格分隔),如: - ``` - 示例:黑心商人 挪德卡莱 卡琵莉亚 - ``` - 禁用后,脚本会跳过这些商人或带有指定标签的商人,不会前往购买。 - - 可以使用国家/地区(如"蒙德"、"璃月")或其他标签(如商人信息总览中的标签) -5. **是否跳过调整时间动画**:开启后会啟用时瞬跳过调整时间动画 -6. **无视购买记录强制购买**:开启后会忽略购买记录,重新购买所有商品 -7. **调试模式**:开启后显示详细执行日志 - -### 购买记录系统说明 -脚本会自动记录购买时间,避免重复购买: -1. **每天刷新商品** - 每天凌晨4点刷新 -2. **3天刷新商品** - 每3天刷新一次 -3. **每周刷新商品** - 每周固定週一购买 - - 周一刷新商品:按设置决定是否购买 - - 周四刷新商品(狗粮商人):同样受设置控制 -4. **每月1号刷新商品** - 每月1号凌晨4点刷新 - - -购买记录保存在:`record/你填的账号名/records.json` -- 下次执行时只购买已刷新商品 -- 可通过"无视购买记录强制购买"选项重置 - - -## 📋 商人与商品支持表 - -### 如何查看支持的商品? -- **查看本文件下方表格**:包含所有支持的商人与商品 - -| 所在地 | 商人名 | 每天刷新商品 | 3天刷新商品 | 每周刷新商品 | 标签 | -|--------|--------|-------------|------------|-------------|------| -| 蒙德-风起地 | 克罗丽丝 | - | 金鱼草、薄荷、钩钩果、落落莓、慕风蘑菇 | - | 移动 | -| 蒙德-清泉镇 | 神奇的霍普金斯 | 圣水 | - | - | 稀少商品 | -| 蒙德-清泉镇 | 杜拉夫 | 兽肉、禽肉、鸟蛋 | - | - | | -| 蒙德-蒙德城 | 布兰琪 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦 | - | - | | -| 蒙德-蒙德城 | 莎拉 | - | - | 面粉、奶油、熏禽肉、黄油、火腿、糖、蟹黄、果酱、奶酪、培根、香肠 | | -| 蒙德-蒙德城 | 芙萝拉 | - | 甜甜花、风车菊、塞西莉亚花、小灯草、嘟嘟莲 | - | | -| 蒙德-蒙德城 | 石榴 | - | - | 冒险家金杯、冒险家尾羽、冒险家头带、冒险家之花、冒险家怀表 | 狗粮商人 | -| 蒙德-蒙德城-天使的馈赠 | 查尔斯 | 冰钩钩果汁、树莓薄荷饮、苹果酿、气泡酸莓汁 | - | - | 独立地图、稀少商品 | -| 璃月-璃月港 | 阿山婆 | 霄灯 | - | - | | -| 璃月-璃月港 | 石头 | 铁块、白铁块、夜泊石 | - | - | | -| 璃月-璃月港 | 东升 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦、稻米、虾仁、豆腐、杏仁 | - | - | | -| 璃月-璃月港 | 卯师父 | 鱼肉、螃蟹 | 竹笋、莲蓬、松茸、蘑菇、胡萝卜、白萝卜、绝云椒椒 | 面粉、糖、香肠、火腿 | | -| 璃月-璃月港 | 老孙 | 鱼肉、螃蟹、虾仁 | - | - | | -| 璃月-璃月港 | 老高 | 鱼肉、鱼肉2 | - | - | | -| 璃月-璃月港 | 长顺 | 土豆 | 石珀、电气水晶 | 糖、奶酪 | | -| 璃月-璃月港 | 琳琅 | - | - | 游医的药壶、游医的枭羽、游医的方巾、游医的银莲、游医的怀钟 | 狗粮商人 | -| 璃月-璃月港 | 张顺 | - | - | 幸运儿之杯、幸运儿鹰羽、幸运儿银冠、幸运儿绿花、幸运儿沙漏 | 狗粮商人 | -| 璃月-璃月港 | 博来 | - | 苹果、日落果、鱼肉、星螺 | - | | -| 璃月-璃月港 | 阿桂 | - | 清心、琉璃袋、马尾、莲蓬、冰雾花花朵、烈焰花花蕊 | - | | -| 璃月-琼玑野 | 朱老板 | 大碗茶 | - | - | 稀少商品 | -| 璃月-望舒客栈 | 菲尔戈黛特 | - | 松茸、霓裳花、琉璃袋 | 黄油、香肠 | | -| 璃月-石门 | 老周叔 | 大碗茶 | - | - | 稀少商品 | -| 璃月-轻策庄 | 小白 | - | 豆腐、杏仁、霓裳花 | 琉璃百合(每月刷新) | | -| 璃月-轻策庄 | 凯叔 | 大碗茶 | - | - | 稀少商品 | -| 璃月-遗珑埠 | 丰泰 | 稻米、豆腐 | 清水玉、石珀、夜泊石、琉璃袋、霓裳花、绝云椒椒、沉玉仙茗 | 蟹黄 | | -| 璃月-遗珑埠 | 连芳 | - | 沉玉仙茗 | - | | -| 稻妻-离岛 | 小畑 | 螃蟹、鱼肉、虾仁 | 海灵芝 | - | | -| 稻妻-离岛 | 秋月 | 铁块、白铁块、电气水晶 | - | - | | -| 稻妻-离岛 | 山城健太 | 鳗肉 | 珊瑚真珠 | 幸运儿之杯、幸运儿鹰羽、幸运儿绿花、幸运儿银冠、幸运儿沙漏 | 狗粮商人 | -| 稻妻-离岛 | 卡琵莉亚 | - | 蒲公英籽 | - | | -| 稻妻-白狐之野 | 若紫 | - | - | 「四方八方之网」 | | -| 稻妻-稻妻城 | 葵 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦、稻米、虾仁、豆腐 | 鸣草 | - | | -| 稻妻-稻妻城 | 志村勘兵卫 | 鱼肉、螃蟹 | 海草、堇瓜、白萝卜 | 香肠、培根、面粉、糖 | | -| 稻妻-稻妻城 | 智树 | 团子牛奶 | - | - | 稀少商品 | -| 稻妻-稻妻城 | 木南杏奈 | 特制风味烤蘑菇披萨 | - | - | 稀少商品 | -| 稻妻-海祇岛 | 清子 | - | - | 牛奶、番茄、土豆、小麦、豆腐 | | -| 须弥-化城郭 | 阿什帕齐 | 兽肉、禽肉 | 鸟蛋、树王圣体菇 | 香辛料 | | -| 须弥-须弥城 | 朱特 | - | 香辛果、帕蒂沙兰 | 香辛料 | | -| 须弥-须弥城 | 阿夫辛 | - | - | 冒险家金杯、冒险家尾羽、冒险家头带、冒险家之花、冒险家怀表 | 狗粮商人 | -| 须弥-须弥城 | 珀姆 | 鱼肉、螃蟹、虾仁 | 海草 | - | | -| 须弥-须弥城 | 哈马维 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦、稻米、豆腐、虾仁 | 香辛果、墩墩桃 | - | | -| 须弥-须弥城-兰巴德酒馆 | 兰巴德 | 鱼肉、螃蟹、秃秃豆 | 星蕈 | 面粉、香肠、培根、香辛料、糖 | 独立地图 | -| 须弥-须弥城-普斯帕咖啡馆 | 恩忒卡 | 咖啡豆 | - | - | 独立地图 | -| 须弥-奥摩斯港 | 拉玛 | 盐、胡椒 | - | 香辛料、糖、黄油、奶酪 | | -| 须弥-奥摩斯港 | 布特罗斯 | 鱼肉、螃蟹、虾仁 | - | - | | -| 须弥-奥摩斯港 | 秋蔚 | - | 水晶块、石珀、夜泊石、霓裳花 | - | | -| 须弥-奥摩斯港 | 巴巴克 | - | 慕风蘑菇、蒲公英籽、琉璃袋、清心、鸣草、珊瑚真珠 | - | | -| 须弥-桓那兰那(梦境) | 兰玛尼 | - | 日落果、香辛果、墩墩桃、树王圣体菇、劫波莲 | - | 桓那兰那(梦境) | -| 须弥-阿如村 | 阿扎莱 | 鱼肉、兽肉、秃秃豆 | 星蕈、枣椰、墩墩桃 | 面粉、香辛料、糖 | 黑心商人 | -| 枫丹-枫丹廷 | 布希柯 | 枫达、盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦、秃秃豆、杏仁、发酵果实汁 | 蘑菇、茉洁草 | - | | -| 枫丹-枫丹廷 | 阿鲁埃 | 枫达、咖啡豆 | - | - | | -| 枫丹-枫丹廷 | 路易 | 枫达 | - | - | | -| 枫丹-枫丹廷 | 欧仁妮 | 番茄、卷心菜 | 泡泡桔、茉洁草、日落果、墩墩桃、枣椰、落落莓、虹彩蔷薇 | - | | -| 枫丹-枫丹廷-德波大饭店 | 桑格内蒂 | 枫达 | - | 面粉、奶油、黄油、火腿、糖、蟹黄、果酱、奶酪、培根、香肠 | 独立地图 | -| 枫丹-枫丹廷-灰河 | 克洛莎 | - | - | 幸运儿之杯、幸运儿鹰羽、幸运儿银冠、幸运儿绿花、幸运儿沙漏 | 狗粮商人 | -| 枫丹-白淞镇 | 安特曼 | 鱼肉、螃蟹、虾仁 | 海露花、汐藻、苍晶螺 | - | | -| 枫丹-锈舵酒馆 | 皮托 | 牛奶 | - | 培根、火腿、香肠、奶酪 | 黑心商人 | -| 纳塔-圣火竞技场 | 钦特利 | 土豆 | 烛伞蘑菇、颗粒果、苦种、烬芯花、青蜜莓、肉龙掌 | - | | -| 纳塔-圣火竞技场 | 艾库瓦 | - | - | 幸运儿之杯、幸运儿鹰羽、幸运儿银冠、幸运儿绿花、幸运儿沙漏 | 狗粮商人 | -| 纳塔-圣火竞技场 | 布纳马 | 盐、胡椒、小麦、洋葱、牛奶、番茄、卷心菜、土豆、秃秃豆 | 蘑菇 | - | | -| 纳塔-圣火竞技场 | 夏安卡 | - | - | 面粉、奶油、黄油、火腿、糖、蟹黄、果酱、奶酪、培根、香肠 | | -| 纳塔-坚岩隘谷 | 伊蜜 | - | 铁块、白铁块、水晶块、萃凝晶、澄晶实 | - | | -| 纳塔-悠悠度假村 | 穆托莉娜 | - | 灼灼彩菊、肉龙掌、云岩裂叶、浪沫羽鳃 | - | | -| 挪德卡莱-那夏镇 | 采若 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦、黑麦 | - | - | | -| 挪德卡莱-那夏镇 | 丽切娅 | - | 甜甜花、宿影花、霜盏花 | - | | -| 挪德卡莱-那夏镇 | 卡嘉 | - | - | 面粉、奶油、熏禽肉、黄油、火腿、糖、蟹黄、果酱、奶酪、培根、香肠 | | -| 挪德卡莱-那夏镇 | 雷科 | - | - | 幸运儿之杯、幸运儿鹰羽、幸运儿银冠、幸运儿绿花、幸运儿沙漏 | 狗粮商人 | -| 挪德卡莱-皮拉米达城 | 科菲策 | 牛奶、咖啡豆 | 微光角菌、琉鳞石 | - | 黑心商人 | - -### **以下为有效标签** -- **国家**:蒙德、璃月、稻妻、须弥、枫丹、纳塔、挪德卡莱 -- **地区**:风起地、清泉镇、蒙德城、璃月港、离岛、稻妻城、海祇岛等 -- **小地图**:天使的馈赠、兰巴德酒馆、德波大饭店、灰河、锈舵酒馆等 -- **商人**:克罗丽丝、神奇的霍普金斯、杜拉夫等(所有商人名) -- **移动**:指商人会移动,有机会购买失败 -- **稀少商品**:指稀少商品 -- **独立地图**:指需要进入独立空间的特殊地图,这些地图部份路径无法使用地图追踪功能,使用简易脚本到商人位置、有机会购买失败 -- **黑心商人**:指没有折扣的商人,价格较贵的商人 -- **狗粮商人**:指每周四刷新商品的狗粮商人 - -### **欢迎补充商人与商品与标签** - -## 🔧 添加新商品 - -### 1. 添加商品图片 -1. 截图商品图标,尺寸建议 90×90 像素 -2. 保存为 PNG 格式,放在 `assets/images/` 目录下 -3. 文件名建议使用中文,如:`新商品.png` - -### 2. 添加到商人 -在 `assets/npcs.json` 中找到对应商人,添加到相应的商品列表中: - -```json -"_1d_foods": ["新商品"] // 每天刷新商品 -"_3d_foods": ["新商品"] // 3天刷新商品 -"_7d_foods": ["新商品"] // 每周刷新商品 -``` - -### 3. 更新商人与商品支持表 -将新商品添加到本文件的商人与商品支持表中,方便其他用户查看。 - -## 🆕 添加新商人 - -### 1. 录制路径 -1. 使用路径录制工具录制前往商人的路径 -2. 保存为 JSON 文件,命名格式:`地区-位置-商人名.json` -3. 放在 `assets/path/` 目录下 - -### 2. 添加商人数据 -在 `assets/data/npcs.json` 中添加: - -```json -"new_npc": { - "name": "新商人名", - "enable": true, - "page": 2, // 商店总页数 - "time": "any", // any/day/night - "path": "assets/path/地区-位置-新商人名.json", - "_1d_foods": ["商品1", "商品2"], // 每天刷新 - "_3d_foods": ["商品3"], // 3天刷新 - "_7d_foods": ["商品4"], // 每周刷新 - "tags": ["地区", "黑心商人"] // 商人标签 -} -``` - -### 3. 参数说明 -- `page`: 商店的总页数 -- `time`: 商人出现时间 - - `any`: 全天出现 - - `day`: - - `night`: -- `path`: 路径文件位置 - -### 4. 更新商人与商品支持表 -将新商人添加到本文件的商人与商品支持表中。 - -## ❓ 常见问题 - -### Q: 脚本不购买任何商品? -A: 检查: -1. 是否在设置中填写了要购买的商品 -2. 商品名称是否正确(参考上方表格) -3. 游戏分辨率是否为 1920×1080 -4. 角色是否在单人模式 -5. 是否有购买记录导致商品未刷新 - -### Q: 如何知道支持哪些商品名称? -A: 查看: -1. 本文件中的"商人与商品支持表" -2. `assets/data/foods.json` 文件中的 `name` 字段 -3. 运行脚本时的日志输出会显示"用户启用了以下商品" - -### Q: 为什么跳过某些商人? -A: 可能原因: -1. 该商人没有你要购买的商品 -2. 商人在禁用列表中 -3. 购买记录显示商品还未到刷新时间 - -### Q: 如何重置购买记录? -A: 有几种方法: -1. 启用"无视购买记录强制购买"选项 -2. 删除 `record/你的账号名/records.json` 文件 -3. 等待商品自然刷新 - -### Q: 每天什么时候刷新? -A: 游戏内的刷新时间是**每天凌晨4点**。脚本会考虑这个时间点: -- 如果当前时间在4点前,视为前一天 -- 购买记录基于4点刷新时间计算 - -## 🤝 贡献指南 - -欢迎提交新的商人和商品配置! - -1. **提交新的商人**:包含路径文件和商人数据 -2. **提交新的商品**:包含图片和商品数据 -3. **更新文档**:记得更新本README中的商人信息表 -4. **标签补充**:欢迎为现有商人添加合适的标签 -5. **问题反馈**:提供详细的重现步骤和日志 - ---- - -> 注意:本脚本仅供学习与研究使用,请遵守游戏使用条款。 - -`` +# 自动购买商品 - 使用说明 + +## 📝 功能说明 + +这个脚本可以自动购买原神游戏中各个商品的商品,支持三种刷新周期: +- **每天刷新商品**:每天凌晨4点刷新 +- **3天刷新商品**:每3天刷新一次 +- **每周刷新商品**:每周刷新,可指定购买日 +- **记录系统**:避免重复购买,只购买刷新后的商品 +- **标签系统**:支持按标签批量禁用商人 + +## ⚡ 快速开始 + +### 1. 准备工作 & 注意事项 +1. **游戏分辨率**:1920×1080 解析度** +2. **游戏时间**:脚本会自动调整白天/晚上时间 +3. **背包空间**:确保有足够空间购买商品 +4. **摩拉**:确保有足够的摩拉 +5. **记录系统**:购买记录保存在 `record/账号名/` 目录下 +6. **多人模式**:脚本只能在单人模式下运行 +7. **刷新时间**:基于游戏服务器时间(GMT+8),每天4点刷新 + + +### 2. 首次使用 +1. 打开脚本设置界面 +2. 输入要购买的商品 +3. 设置每周商品购买模式 +4. 设置要禁用的商人或标签 +5. 保存设置 +6. 在主界面运行脚本 + + + +## ⚙️ 设置说明 +1. **账号名**:填写账号名,用于区分不同账号的购买记录(为空则读取uid作为自定义CD记录标识) +2. **要购买的商品**:输入商品名称,用空格分隔(支援的商人与商品请查看下方表格) + - 建议直接复制商品名称贴上输入栏 + - 输入标签后会购买具有该标签的商人的所有商品 + ``` + 示例:盐 胡椒 螃蟹 圣水 松茸 沉玉仙茗 蟹黄 稀少商品 + ``` +3. **每周商品购买方式**: + - 0:跟随游戏系统周期自动判断 + - 1-7:指定周几购买(1=周一,7=周日) + - **适用范围**:包含所有每周刷新的商品 + - 周一刷新商品 + - 周四刷新商品 + - **每月1号刷新商品**:不受此设置影响,刷新即购买 +4. **禁用标签功能**:可以输入要禁用的标签(空格分隔),如: + ``` + 示例:黑心商人 挪德卡莱 卡琵莉亚 + ``` + 禁用后,脚本会跳过这些商人或带有指定标签的商人,不会前往购买。 + + 可以使用国家/地区(如"蒙德"、"璃月")或其他标签(如商人信息总览中的标签) +5. **是否跳过调整时间动画**:开启后会啟用时瞬跳过调整时间动画 +6. **无视购买记录强制购买**:开启后会忽略购买记录,重新购买所有商品 +7. **调试模式**:开启后显示详细执行日志 + +### 购买记录系统说明 +脚本会自动记录购买时间,避免重复购买: +1. **每天刷新商品** - 每天凌晨4点刷新 +2. **3天刷新商品** - 每3天刷新一次 +3. **每周刷新商品** - 每周固定週一购买 + - 周一刷新商品:按设置决定是否购买 + - 周四刷新商品(狗粮商人):同样受设置控制 +4. **每月1号刷新商品** - 每月1号凌晨4点刷新 + + +购买记录保存在:`record/你填的账号名/records.json` +- 下次执行时只购买已刷新商品 +- 可通过"无视购买记录强制购买"选项重置 + + +## 📋 商人与商品支持表 + +### 如何查看支持的商品? +- **查看本文件下方表格**:包含所有支持的商人与商品 + +| 所在地 | 商人名 | 每天刷新商品 | 3天刷新商品 | 每周刷新商品 | 标签 | +|--------|--------|-------------|------------|-------------|------| +| 蒙德-风起地 | 克罗丽丝 | - | 金鱼草、薄荷、钩钩果、落落莓、慕风蘑菇 | - | 移动 | +| 蒙德-清泉镇 | 神奇的霍普金斯 | 圣水 | - | - | 稀少商品 | +| 蒙德-清泉镇 | 杜拉夫 | 兽肉、禽肉、鸟蛋 | - | - | | +| 蒙德-蒙德城 | 布兰琪 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦 | - | - | | +| 蒙德-蒙德城 | 莎拉 | - | - | 面粉、奶油、熏禽肉、黄油、火腿、糖、蟹黄、果酱、奶酪、培根、香肠 | | +| 蒙德-蒙德城 | 芙萝拉 | - | 甜甜花、风车菊、塞西莉亚花、小灯草、嘟嘟莲 | - | | +| 蒙德-蒙德城 | 石榴 | - | - | 冒险家金杯、冒险家尾羽、冒险家头带、冒险家之花、冒险家怀表 | 狗粮商人 | +| 蒙德-蒙德城-天使的馈赠 | 查尔斯 | 冰钩钩果汁、树莓薄荷饮、苹果酿、气泡酸莓汁 | - | - | 独立地图、稀少商品 | +| 璃月-璃月港 | 阿山婆 | 霄灯 | - | - | | +| 璃月-璃月港 | 石头 | 铁块、白铁块、夜泊石 | - | - | | +| 璃月-璃月港 | 东升 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦、稻米、虾仁、豆腐、杏仁 | - | - | | +| 璃月-璃月港 | 卯师父 | 鱼肉、螃蟹 | 竹笋、莲蓬、松茸、蘑菇、胡萝卜、白萝卜、绝云椒椒 | 面粉、糖、香肠、火腿 | | +| 璃月-璃月港 | 老孙 | 鱼肉、螃蟹、虾仁 | - | - | | +| 璃月-璃月港 | 老高 | 鱼肉、鱼肉2 | - | - | | +| 璃月-璃月港 | 长顺 | 土豆 | 石珀、电气水晶 | 糖、奶酪 | | +| 璃月-璃月港 | 琳琅 | - | - | 游医的药壶、游医的枭羽、游医的方巾、游医的银莲、游医的怀钟 | 狗粮商人 | +| 璃月-璃月港 | 张顺 | - | - | 幸运儿之杯、幸运儿鹰羽、幸运儿银冠、幸运儿绿花、幸运儿沙漏 | 狗粮商人 | +| 璃月-璃月港 | 博来 | - | 苹果、日落果、鱼肉、星螺 | - | | +| 璃月-璃月港 | 阿桂 | - | 清心、琉璃袋、马尾、莲蓬、冰雾花花朵、烈焰花花蕊 | - | | +| 璃月-琼玑野 | 朱老板 | 大碗茶 | - | - | 稀少商品 | +| 璃月-望舒客栈 | 菲尔戈黛特 | - | 松茸、霓裳花、琉璃袋 | 黄油、香肠 | | +| 璃月-石门 | 老周叔 | 大碗茶 | - | - | 稀少商品 | +| 璃月-轻策庄 | 小白 | - | 豆腐、杏仁、霓裳花 | 琉璃百合(每月刷新) | | +| 璃月-轻策庄 | 凯叔 | 大碗茶 | - | - | 稀少商品 | +| 璃月-遗珑埠 | 丰泰 | 稻米、豆腐 | 清水玉、石珀、夜泊石、琉璃袋、霓裳花、绝云椒椒、沉玉仙茗 | 蟹黄 | | +| 璃月-遗珑埠 | 连芳 | - | 沉玉仙茗 | - | | +| 稻妻-离岛 | 小畑 | 螃蟹、鱼肉、虾仁 | 海灵芝 | - | | +| 稻妻-离岛 | 秋月 | 铁块、白铁块、电气水晶 | - | - | | +| 稻妻-离岛 | 山城健太 | 鳗肉 | 珊瑚真珠 | 幸运儿之杯、幸运儿鹰羽、幸运儿绿花、幸运儿银冠、幸运儿沙漏 | 狗粮商人 | +| 稻妻-离岛 | 卡琵莉亚 | - | 蒲公英籽 | - | | +| 稻妻-白狐之野 | 若紫 | - | - | 「四方八方之网」 | | +| 稻妻-稻妻城 | 葵 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦、稻米、虾仁、豆腐 | 鸣草 | - | | +| 稻妻-稻妻城 | 志村勘兵卫 | 鱼肉、螃蟹 | 海草、堇瓜、白萝卜 | 香肠、培根、面粉、糖 | | +| 稻妻-稻妻城 | 智树 | 团子牛奶 | - | - | 稀少商品 | +| 稻妻-稻妻城 | 木南杏奈 | 特制风味烤蘑菇披萨 | - | - | 稀少商品 | +| 稻妻-海祇岛 | 清子 | - | - | 牛奶、番茄、土豆、小麦、豆腐 | | +| 须弥-化城郭 | 阿什帕齐 | 兽肉、禽肉 | 鸟蛋、树王圣体菇 | 香辛料 | | +| 须弥-须弥城 | 朱特 | - | 香辛果、帕蒂沙兰 | 香辛料 | | +| 须弥-须弥城 | 阿夫辛 | - | - | 冒险家金杯、冒险家尾羽、冒险家头带、冒险家之花、冒险家怀表 | 狗粮商人 | +| 须弥-须弥城 | 珀姆 | 鱼肉、螃蟹、虾仁 | 海草 | - | | +| 须弥-须弥城 | 哈马维 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦、稻米、豆腐、虾仁 | 香辛果、墩墩桃 | - | | +| 须弥-须弥城-兰巴德酒馆 | 兰巴德 | 鱼肉、螃蟹、秃秃豆 | 星蕈 | 面粉、香肠、培根、香辛料、糖 | 独立地图 | +| 须弥-须弥城-普斯帕咖啡馆 | 恩忒卡 | 咖啡豆 | - | - | 独立地图 | +| 须弥-奥摩斯港 | 拉玛 | 盐、胡椒 | - | 香辛料、糖、黄油、奶酪 | | +| 须弥-奥摩斯港 | 布特罗斯 | 鱼肉、螃蟹、虾仁 | - | - | | +| 须弥-奥摩斯港 | 秋蔚 | - | 水晶块、石珀、夜泊石、霓裳花 | - | | +| 须弥-奥摩斯港 | 巴巴克 | - | 慕风蘑菇、蒲公英籽、琉璃袋、清心、鸣草、珊瑚真珠 | - | | +| 须弥-桓那兰那(梦境) | 兰玛尼 | - | 日落果、香辛果、墩墩桃、树王圣体菇、劫波莲 | - | 桓那兰那(梦境) | +| 须弥-阿如村 | 阿扎莱 | 鱼肉、兽肉、秃秃豆 | 星蕈、枣椰、墩墩桃 | 面粉、香辛料、糖 | 黑心商人 | +| 枫丹-枫丹廷 | 布希柯 | 枫达、盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦、秃秃豆、杏仁、发酵果实汁 | 蘑菇、茉洁草 | - | | +| 枫丹-枫丹廷 | 阿鲁埃 | 枫达、咖啡豆 | - | - | | +| 枫丹-枫丹廷 | 路易 | 枫达 | - | - | | +| 枫丹-枫丹廷 | 欧仁妮 | 番茄、卷心菜 | 泡泡桔、茉洁草、日落果、墩墩桃、枣椰、落落莓、虹彩蔷薇 | - | | +| 枫丹-枫丹廷-德波大饭店 | 桑格内蒂 | 枫达 | - | 面粉、奶油、黄油、火腿、糖、蟹黄、果酱、奶酪、培根、香肠 | 独立地图 | +| 枫丹-枫丹廷-灰河 | 克洛莎 | - | - | 幸运儿之杯、幸运儿鹰羽、幸运儿银冠、幸运儿绿花、幸运儿沙漏 | 狗粮商人 | +| 枫丹-白淞镇 | 安特曼 | 鱼肉、螃蟹、虾仁 | 海露花、汐藻、苍晶螺 | - | | +| 枫丹-锈舵酒馆 | 皮托 | 牛奶 | - | 培根、火腿、香肠、奶酪 | 黑心商人 | +| 纳塔-圣火竞技场 | 钦特利 | 土豆 | 烛伞蘑菇、颗粒果、苦种、烬芯花、青蜜莓、肉龙掌 | - | | +| 纳塔-圣火竞技场 | 艾库瓦 | - | - | 幸运儿之杯、幸运儿鹰羽、幸运儿银冠、幸运儿绿花、幸运儿沙漏 | 狗粮商人 | +| 纳塔-圣火竞技场 | 布纳马 | 盐、胡椒、小麦、洋葱、牛奶、番茄、卷心菜、土豆、秃秃豆 | 蘑菇 | - | | +| 纳塔-圣火竞技场 | 夏安卡 | - | - | 面粉、奶油、黄油、火腿、糖、蟹黄、果酱、奶酪、培根、香肠 | | +| 纳塔-坚岩隘谷 | 伊蜜 | - | 铁块、白铁块、水晶块、萃凝晶、澄晶实 | - | | +| 纳塔-悠悠度假村 | 穆托莉娜 | - | 灼灼彩菊、肉龙掌、云岩裂叶、浪沫羽鳃 | - | | +| 挪德卡莱-那夏镇 | 采若 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦、黑麦 | - | - | | +| 挪德卡莱-那夏镇 | 丽切娅 | - | 甜甜花、宿影花、霜盏花 | - | | +| 挪德卡莱-那夏镇 | 卡嘉 | - | - | 面粉、奶油、熏禽肉、黄油、火腿、糖、蟹黄、果酱、奶酪、培根、香肠 | | +| 挪德卡莱-那夏镇 | 雷科 | - | - | 幸运儿之杯、幸运儿鹰羽、幸运儿银冠、幸运儿绿花、幸运儿沙漏 | 狗粮商人 | +| 挪德卡莱-那夏镇-旗舰 | 德米安 | 「皮拉米达的夜莺」、边陲之地、野浆果之路 | - | - | 稀少商品、独立地图 | +| 挪德卡莱-皮拉米达城 | 科菲策 | 牛奶、咖啡豆 | 微光角菌、琉鳞石 | - | 黑心商人 | + +### **以下为有效标签** +- **国家**:蒙德、璃月、稻妻、须弥、枫丹、纳塔、挪德卡莱 +- **地区**:风起地、清泉镇、蒙德城、璃月港、离岛、稻妻城、海祇岛等 +- **小地图**:天使的馈赠、兰巴德酒馆、德波大饭店、灰河、锈舵酒馆等 +- **商人**:克罗丽丝、神奇的霍普金斯、杜拉夫等(所有商人名) +- **移动**:指商人会移动,有机会购买失败 +- **稀少商品**:指稀少商品 +- **独立地图**:指需要进入独立空间的特殊地图,这些地图部份路径无法使用地图追踪功能,使用简易脚本到商人位置、有机会购买失败 +- **黑心商人**:指没有折扣的商人,价格较贵的商人 +- **狗粮商人**:指每周四刷新商品的狗粮商人 + +### **欢迎补充商人与商品与标签** + +## 🔧 添加新商品 + +### 1. 添加商品图片 +1. 截图商品图标,尺寸建议 90×90 像素 +2. 保存为 PNG 格式,放在 `assets/images/` 目录下 +3. 文件名建议使用中文,如:`新商品.png` + +### 2. 添加到商人 +在 `assets/npcs.json` 中找到对应商人,添加到相应的商品列表中: + +```json +"_1d_foods": ["新商品"] // 每天刷新商品 +"_3d_foods": ["新商品"] // 3天刷新商品 +"_7d_foods": ["新商品"] // 每周刷新商品 +``` + +### 3. 更新商人与商品支持表 +将新商品添加到本文件的商人与商品支持表中,方便其他用户查看。 + +## 🆕 添加新商人 + +### 1. 录制路径 +1. 使用路径录制工具录制前往商人的路径 +2. 保存为 JSON 文件,命名格式:`地区-位置-商人名.json` +3. 放在 `assets/path/` 目录下 + +### 2. 添加商人数据 +在 `assets/data/npcs.json` 中添加: + +```json +"new_npc": { + "name": "新商人名", + "enable": true, + "page": 2, // 商店总页数 + "time": "any", // any/day/night + "path": "assets/path/地区-位置-新商人名.json", + "_1d_foods": ["商品1", "商品2"], // 每天刷新 + "_3d_foods": ["商品3"], // 3天刷新 + "_7d_foods": ["商品4"], // 每周刷新 + "tags": ["地区", "黑心商人"] // 商人标签 +} +``` + +### 3. 参数说明 +- `page`: 商店的总页数 +- `time`: 商人出现时间 + - `any`: 全天出现 + - `day`: + - `night`: +- `path`: 路径文件位置 + +### 4. 更新商人与商品支持表 +将新商人添加到本文件的商人与商品支持表中。 + +## ❓ 常见问题 + +### Q: 脚本不购买任何商品? +A: 检查: +1. 是否在设置中填写了要购买的商品 +2. 商品名称是否正确(参考上方表格) +3. 游戏分辨率是否为 1920×1080 +4. 角色是否在单人模式 +5. 是否有购买记录导致商品未刷新 + +### Q: 如何知道支持哪些商品名称? +A: 查看: +1. 本文件中的"商人与商品支持表" +2. `assets/data/foods.json` 文件中的 `name` 字段 +3. 运行脚本时的日志输出会显示"用户启用了以下商品" + +### Q: 为什么跳过某些商人? +A: 可能原因: +1. 该商人没有你要购买的商品 +2. 商人在禁用列表中 +3. 购买记录显示商品还未到刷新时间 + +### Q: 如何重置购买记录? +A: 有几种方法: +1. 启用"无视购买记录强制购买"选项 +2. 删除 `record/你的账号名/records.json` 文件 +3. 等待商品自然刷新 + +### Q: 每天什么时候刷新? +A: 游戏内的刷新时间是**每天凌晨4点**。脚本会考虑这个时间点: +- 如果当前时间在4点前,视为前一天 +- 购买记录基于4点刷新时间计算 + +## 🤝 贡献指南 + +欢迎提交新的商人和商品配置! + +1. **提交新的商人**:包含路径文件和商人数据 +2. **提交新的商品**:包含图片和商品数据 +3. **更新文档**:记得更新本README中的商人信息表 +4. **标签补充**:欢迎为现有商人添加合适的标签 +5. **问题反馈**:提供详细的重现步骤和日志 + +--- + +> 注意:本脚本仅供学习与研究使用,请遵守游戏使用条款。 + +`` diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/Exit.png b/repo/js/自动购买商品/assets/images/Exit.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/Exit.png rename to repo/js/自动购买商品/assets/images/Exit.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/buyBtn.png b/repo/js/自动购买商品/assets/images/buyBtn.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/buyBtn.png rename to repo/js/自动购买商品/assets/images/buyBtn.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/「四方八方之网」.png b/repo/js/自动购买商品/assets/images/「四方八方之网」.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/「四方八方之网」.png rename to repo/js/自动购买商品/assets/images/「四方八方之网」.png diff --git a/repo/js/自动购买商品/assets/images/「皮拉米达的夜莺」.png b/repo/js/自动购买商品/assets/images/「皮拉米达的夜莺」.png new file mode 100644 index 000000000..ec9bd20c4 Binary files /dev/null and b/repo/js/自动购买商品/assets/images/「皮拉米达的夜莺」.png differ diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/云岩裂叶.png b/repo/js/自动购买商品/assets/images/云岩裂叶.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/云岩裂叶.png rename to repo/js/自动购买商品/assets/images/云岩裂叶.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/兽肉.png b/repo/js/自动购买商品/assets/images/兽肉.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/兽肉.png rename to repo/js/自动购买商品/assets/images/兽肉.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/冒险家之花.png b/repo/js/自动购买商品/assets/images/冒险家之花.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/冒险家之花.png rename to repo/js/自动购买商品/assets/images/冒险家之花.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/冒险家头带.png b/repo/js/自动购买商品/assets/images/冒险家头带.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/冒险家头带.png rename to repo/js/自动购买商品/assets/images/冒险家头带.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/冒险家尾羽.png b/repo/js/自动购买商品/assets/images/冒险家尾羽.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/冒险家尾羽.png rename to repo/js/自动购买商品/assets/images/冒险家尾羽.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/冒险家怀表.png b/repo/js/自动购买商品/assets/images/冒险家怀表.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/冒险家怀表.png rename to repo/js/自动购买商品/assets/images/冒险家怀表.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/冒险家金杯.png b/repo/js/自动购买商品/assets/images/冒险家金杯.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/冒险家金杯.png rename to repo/js/自动购买商品/assets/images/冒险家金杯.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/冰钩钩果汁.png b/repo/js/自动购买商品/assets/images/冰钩钩果汁.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/冰钩钩果汁.png rename to repo/js/自动购买商品/assets/images/冰钩钩果汁.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/冰雾花花朵.png b/repo/js/自动购买商品/assets/images/冰雾花花朵.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/冰雾花花朵.png rename to repo/js/自动购买商品/assets/images/冰雾花花朵.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/劫波莲.png b/repo/js/自动购买商品/assets/images/劫波莲.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/劫波莲.png rename to repo/js/自动购买商品/assets/images/劫波莲.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/卷心菜.png b/repo/js/自动购买商品/assets/images/卷心菜.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/卷心菜.png rename to repo/js/自动购买商品/assets/images/卷心菜.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/发酵果实汁.png b/repo/js/自动购买商品/assets/images/发酵果实汁.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/发酵果实汁.png rename to repo/js/自动购买商品/assets/images/发酵果实汁.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/咖啡豆.png b/repo/js/自动购买商品/assets/images/咖啡豆.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/咖啡豆.png rename to repo/js/自动购买商品/assets/images/咖啡豆.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/嘟嘟莲.png b/repo/js/自动购买商品/assets/images/嘟嘟莲.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/嘟嘟莲.png rename to repo/js/自动购买商品/assets/images/嘟嘟莲.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/团子牛奶.png b/repo/js/自动购买商品/assets/images/团子牛奶.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/团子牛奶.png rename to repo/js/自动购买商品/assets/images/团子牛奶.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/土豆.png b/repo/js/自动购买商品/assets/images/土豆.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/土豆.png rename to repo/js/自动购买商品/assets/images/土豆.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/圣水.png b/repo/js/自动购买商品/assets/images/圣水.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/圣水.png rename to repo/js/自动购买商品/assets/images/圣水.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/培根.png b/repo/js/自动购买商品/assets/images/培根.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/培根.png rename to repo/js/自动购买商品/assets/images/培根.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/堇瓜.png b/repo/js/自动购买商品/assets/images/堇瓜.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/堇瓜.png rename to repo/js/自动购买商品/assets/images/堇瓜.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/塞西莉亚花.png b/repo/js/自动购买商品/assets/images/塞西莉亚花.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/塞西莉亚花.png rename to repo/js/自动购买商品/assets/images/塞西莉亚花.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/墩墩桃.png b/repo/js/自动购买商品/assets/images/墩墩桃.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/墩墩桃.png rename to repo/js/自动购买商品/assets/images/墩墩桃.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/夜泊石.png b/repo/js/自动购买商品/assets/images/夜泊石.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/夜泊石.png rename to repo/js/自动购买商品/assets/images/夜泊石.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/大碗茶.png b/repo/js/自动购买商品/assets/images/大碗茶.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/大碗茶.png rename to repo/js/自动购买商品/assets/images/大碗茶.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/奶油.png b/repo/js/自动购买商品/assets/images/奶油.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/奶油.png rename to repo/js/自动购买商品/assets/images/奶油.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/奶酪.png b/repo/js/自动购买商品/assets/images/奶酪.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/奶酪.png rename to repo/js/自动购买商品/assets/images/奶酪.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/宿影花.png b/repo/js/自动购买商品/assets/images/宿影花.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/宿影花.png rename to repo/js/自动购买商品/assets/images/宿影花.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/小灯草.png b/repo/js/自动购买商品/assets/images/小灯草.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/小灯草.png rename to repo/js/自动购买商品/assets/images/小灯草.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/小麦.png b/repo/js/自动购买商品/assets/images/小麦.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/小麦.png rename to repo/js/自动购买商品/assets/images/小麦.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/帕蒂沙兰.png b/repo/js/自动购买商品/assets/images/帕蒂沙兰.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/帕蒂沙兰.png rename to repo/js/自动购买商品/assets/images/帕蒂沙兰.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/幸运儿之杯.png b/repo/js/自动购买商品/assets/images/幸运儿之杯.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/幸运儿之杯.png rename to repo/js/自动购买商品/assets/images/幸运儿之杯.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/幸运儿沙漏.png b/repo/js/自动购买商品/assets/images/幸运儿沙漏.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/幸运儿沙漏.png rename to repo/js/自动购买商品/assets/images/幸运儿沙漏.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/幸运儿绿花.png b/repo/js/自动购买商品/assets/images/幸运儿绿花.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/幸运儿绿花.png rename to repo/js/自动购买商品/assets/images/幸运儿绿花.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/幸运儿银冠.png b/repo/js/自动购买商品/assets/images/幸运儿银冠.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/幸运儿银冠.png rename to repo/js/自动购买商品/assets/images/幸运儿银冠.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/幸运儿鹰羽.png b/repo/js/自动购买商品/assets/images/幸运儿鹰羽.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/幸运儿鹰羽.png rename to repo/js/自动购买商品/assets/images/幸运儿鹰羽.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/微光角菌.png b/repo/js/自动购买商品/assets/images/微光角菌.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/微光角菌.png rename to repo/js/自动购买商品/assets/images/微光角菌.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/慕风蘑菇.png b/repo/js/自动购买商品/assets/images/慕风蘑菇.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/慕风蘑菇.png rename to repo/js/自动购买商品/assets/images/慕风蘑菇.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/日落果.png b/repo/js/自动购买商品/assets/images/日落果.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/日落果.png rename to repo/js/自动购买商品/assets/images/日落果.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/星蕈.png b/repo/js/自动购买商品/assets/images/星蕈.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/星蕈.png rename to repo/js/自动购买商品/assets/images/星蕈.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/星螺.png b/repo/js/自动购买商品/assets/images/星螺.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/星螺.png rename to repo/js/自动购买商品/assets/images/星螺.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/杏仁.png b/repo/js/自动购买商品/assets/images/杏仁.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/杏仁.png rename to repo/js/自动购买商品/assets/images/杏仁.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/松茸.png b/repo/js/自动购买商品/assets/images/松茸.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/松茸.png rename to repo/js/自动购买商品/assets/images/松茸.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/果酱.png b/repo/js/自动购买商品/assets/images/果酱.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/果酱.png rename to repo/js/自动购买商品/assets/images/果酱.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/枣椰.png b/repo/js/自动购买商品/assets/images/枣椰.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/枣椰.png rename to repo/js/自动购买商品/assets/images/枣椰.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/枫达.png b/repo/js/自动购买商品/assets/images/枫达.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/枫达.png rename to repo/js/自动购买商品/assets/images/枫达.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/树王圣体菇.png b/repo/js/自动购买商品/assets/images/树王圣体菇.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/树王圣体菇.png rename to repo/js/自动购买商品/assets/images/树王圣体菇.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/树莓薄荷饮.png b/repo/js/自动购买商品/assets/images/树莓薄荷饮.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/树莓薄荷饮.png rename to repo/js/自动购买商品/assets/images/树莓薄荷饮.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/气泡酸莓汁.png b/repo/js/自动购买商品/assets/images/气泡酸莓汁.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/气泡酸莓汁.png rename to repo/js/自动购买商品/assets/images/气泡酸莓汁.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/水晶块.png b/repo/js/自动购买商品/assets/images/水晶块.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/水晶块.png rename to repo/js/自动购买商品/assets/images/水晶块.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/汐藻.png b/repo/js/自动购买商品/assets/images/汐藻.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/汐藻.png rename to repo/js/自动购买商品/assets/images/汐藻.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/沉玉仙茗.png b/repo/js/自动购买商品/assets/images/沉玉仙茗.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/沉玉仙茗.png rename to repo/js/自动购买商品/assets/images/沉玉仙茗.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/泡泡桔.png b/repo/js/自动购买商品/assets/images/泡泡桔.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/泡泡桔.png rename to repo/js/自动购买商品/assets/images/泡泡桔.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/洋葱.png b/repo/js/自动购买商品/assets/images/洋葱.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/洋葱.png rename to repo/js/自动购买商品/assets/images/洋葱.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/浪沫羽鳃.png b/repo/js/自动购买商品/assets/images/浪沫羽鳃.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/浪沫羽鳃.png rename to repo/js/自动购买商品/assets/images/浪沫羽鳃.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/海灵芝.png b/repo/js/自动购买商品/assets/images/海灵芝.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/海灵芝.png rename to repo/js/自动购买商品/assets/images/海灵芝.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/海草.png b/repo/js/自动购买商品/assets/images/海草.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/海草.png rename to repo/js/自动购买商品/assets/images/海草.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/海露花.png b/repo/js/自动购买商品/assets/images/海露花.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/海露花.png rename to repo/js/自动购买商品/assets/images/海露花.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/清心.png b/repo/js/自动购买商品/assets/images/清心.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/清心.png rename to repo/js/自动购买商品/assets/images/清心.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/清水玉.png b/repo/js/自动购买商品/assets/images/清水玉.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/清水玉.png rename to repo/js/自动购买商品/assets/images/清水玉.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/游医的怀钟.png b/repo/js/自动购买商品/assets/images/游医的怀钟.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/游医的怀钟.png rename to repo/js/自动购买商品/assets/images/游医的怀钟.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/游医的方巾.png b/repo/js/自动购买商品/assets/images/游医的方巾.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/游医的方巾.png rename to repo/js/自动购买商品/assets/images/游医的方巾.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/游医的枭羽.png b/repo/js/自动购买商品/assets/images/游医的枭羽.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/游医的枭羽.png rename to repo/js/自动购买商品/assets/images/游医的枭羽.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/游医的药壶.png b/repo/js/自动购买商品/assets/images/游医的药壶.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/游医的药壶.png rename to repo/js/自动购买商品/assets/images/游医的药壶.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/游医的银莲.png b/repo/js/自动购买商品/assets/images/游医的银莲.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/游医的银莲.png rename to repo/js/自动购买商品/assets/images/游医的银莲.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/澄晶实.png b/repo/js/自动购买商品/assets/images/澄晶实.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/澄晶实.png rename to repo/js/自动购买商品/assets/images/澄晶实.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/火腿.png b/repo/js/自动购买商品/assets/images/火腿.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/火腿.png rename to repo/js/自动购买商品/assets/images/火腿.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/灼灼彩菊.png b/repo/js/自动购买商品/assets/images/灼灼彩菊.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/灼灼彩菊.png rename to repo/js/自动购买商品/assets/images/灼灼彩菊.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/烈焰花花蕊.png b/repo/js/自动购买商品/assets/images/烈焰花花蕊.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/烈焰花花蕊.png rename to repo/js/自动购买商品/assets/images/烈焰花花蕊.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/烛伞蘑菇.png b/repo/js/自动购买商品/assets/images/烛伞蘑菇.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/烛伞蘑菇.png rename to repo/js/自动购买商品/assets/images/烛伞蘑菇.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/烬芯花.png b/repo/js/自动购买商品/assets/images/烬芯花.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/烬芯花.png rename to repo/js/自动购买商品/assets/images/烬芯花.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/熏禽肉.png b/repo/js/自动购买商品/assets/images/熏禽肉.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/熏禽肉.png rename to repo/js/自动购买商品/assets/images/熏禽肉.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/牛奶.png b/repo/js/自动购买商品/assets/images/牛奶.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/牛奶.png rename to repo/js/自动购买商品/assets/images/牛奶.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/特制风味烤蘑菇披萨.png b/repo/js/自动购买商品/assets/images/特制风味烤蘑菇披萨.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/特制风味烤蘑菇披萨.png rename to repo/js/自动购买商品/assets/images/特制风味烤蘑菇披萨.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/珊瑚真珠.png b/repo/js/自动购买商品/assets/images/珊瑚真珠.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/珊瑚真珠.png rename to repo/js/自动购买商品/assets/images/珊瑚真珠.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/琉璃百合.png b/repo/js/自动购买商品/assets/images/琉璃百合.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/琉璃百合.png rename to repo/js/自动购买商品/assets/images/琉璃百合.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/琉璃袋.png b/repo/js/自动购买商品/assets/images/琉璃袋.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/琉璃袋.png rename to repo/js/自动购买商品/assets/images/琉璃袋.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/琉鳞石.png b/repo/js/自动购买商品/assets/images/琉鳞石.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/琉鳞石.png rename to repo/js/自动购买商品/assets/images/琉鳞石.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/甜甜花.png b/repo/js/自动购买商品/assets/images/甜甜花.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/甜甜花.png rename to repo/js/自动购买商品/assets/images/甜甜花.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/电气水晶.png b/repo/js/自动购买商品/assets/images/电气水晶.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/电气水晶.png rename to repo/js/自动购买商品/assets/images/电气水晶.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/番茄.png b/repo/js/自动购买商品/assets/images/番茄.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/番茄.png rename to repo/js/自动购买商品/assets/images/番茄.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/白萝卜.png b/repo/js/自动购买商品/assets/images/白萝卜.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/白萝卜.png rename to repo/js/自动购买商品/assets/images/白萝卜.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/白铁块.png b/repo/js/自动购买商品/assets/images/白铁块.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/白铁块.png rename to repo/js/自动购买商品/assets/images/白铁块.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/盐.png b/repo/js/自动购买商品/assets/images/盐.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/盐.png rename to repo/js/自动购买商品/assets/images/盐.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/石珀.png b/repo/js/自动购买商品/assets/images/石珀.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/石珀.png rename to repo/js/自动购买商品/assets/images/石珀.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/禽肉.png b/repo/js/自动购买商品/assets/images/禽肉.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/禽肉.png rename to repo/js/自动购买商品/assets/images/禽肉.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/秃秃豆.png b/repo/js/自动购买商品/assets/images/秃秃豆.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/秃秃豆.png rename to repo/js/自动购买商品/assets/images/秃秃豆.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/稻米.png b/repo/js/自动购买商品/assets/images/稻米.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/稻米.png rename to repo/js/自动购买商品/assets/images/稻米.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/竹笋.png b/repo/js/自动购买商品/assets/images/竹笋.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/竹笋.png rename to repo/js/自动购买商品/assets/images/竹笋.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/糖.png b/repo/js/自动购买商品/assets/images/糖.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/糖.png rename to repo/js/自动购买商品/assets/images/糖.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/绝云椒椒.png b/repo/js/自动购买商品/assets/images/绝云椒椒.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/绝云椒椒.png rename to repo/js/自动购买商品/assets/images/绝云椒椒.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/肉龙掌.png b/repo/js/自动购买商品/assets/images/肉龙掌.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/肉龙掌.png rename to repo/js/自动购买商品/assets/images/肉龙掌.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/胡椒.png b/repo/js/自动购买商品/assets/images/胡椒.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/胡椒.png rename to repo/js/自动购买商品/assets/images/胡椒.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/胡萝卜.png b/repo/js/自动购买商品/assets/images/胡萝卜.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/胡萝卜.png rename to repo/js/自动购买商品/assets/images/胡萝卜.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/苍晶螺.png b/repo/js/自动购买商品/assets/images/苍晶螺.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/苍晶螺.png rename to repo/js/自动购买商品/assets/images/苍晶螺.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/苦种.png b/repo/js/自动购买商品/assets/images/苦种.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/苦种.png rename to repo/js/自动购买商品/assets/images/苦种.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/苹果.png b/repo/js/自动购买商品/assets/images/苹果.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/苹果.png rename to repo/js/自动购买商品/assets/images/苹果.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/苹果酿.png b/repo/js/自动购买商品/assets/images/苹果酿.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/苹果酿.png rename to repo/js/自动购买商品/assets/images/苹果酿.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/茉洁草.png b/repo/js/自动购买商品/assets/images/茉洁草.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/茉洁草.png rename to repo/js/自动购买商品/assets/images/茉洁草.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/莲蓬.png b/repo/js/自动购买商品/assets/images/莲蓬.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/莲蓬.png rename to repo/js/自动购买商品/assets/images/莲蓬.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/萃凝晶.png b/repo/js/自动购买商品/assets/images/萃凝晶.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/萃凝晶.png rename to repo/js/自动购买商品/assets/images/萃凝晶.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/落落莓.png b/repo/js/自动购买商品/assets/images/落落莓.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/落落莓.png rename to repo/js/自动购买商品/assets/images/落落莓.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/蒲公英籽.png b/repo/js/自动购买商品/assets/images/蒲公英籽.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/蒲公英籽.png rename to repo/js/自动购买商品/assets/images/蒲公英籽.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/薄荷.png b/repo/js/自动购买商品/assets/images/薄荷.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/薄荷.png rename to repo/js/自动购买商品/assets/images/薄荷.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/蘑菇.png b/repo/js/自动购买商品/assets/images/蘑菇.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/蘑菇.png rename to repo/js/自动购买商品/assets/images/蘑菇.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/虹彩蔷薇.png b/repo/js/自动购买商品/assets/images/虹彩蔷薇.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/虹彩蔷薇.png rename to repo/js/自动购买商品/assets/images/虹彩蔷薇.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/虾仁.png b/repo/js/自动购买商品/assets/images/虾仁.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/虾仁.png rename to repo/js/自动购买商品/assets/images/虾仁.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/螃蟹.png b/repo/js/自动购买商品/assets/images/螃蟹.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/螃蟹.png rename to repo/js/自动购买商品/assets/images/螃蟹.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/蟹黄.png b/repo/js/自动购买商品/assets/images/蟹黄.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/蟹黄.png rename to repo/js/自动购买商品/assets/images/蟹黄.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/豆腐.png b/repo/js/自动购买商品/assets/images/豆腐.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/豆腐.png rename to repo/js/自动购买商品/assets/images/豆腐.png diff --git a/repo/js/自动购买商品/assets/images/边陲之地.png b/repo/js/自动购买商品/assets/images/边陲之地.png new file mode 100644 index 000000000..7a9882052 Binary files /dev/null and b/repo/js/自动购买商品/assets/images/边陲之地.png differ diff --git a/repo/js/自动购买商品/assets/images/野浆果之路.png b/repo/js/自动购买商品/assets/images/野浆果之路.png new file mode 100644 index 000000000..e0415c431 Binary files /dev/null and b/repo/js/自动购买商品/assets/images/野浆果之路.png differ diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/金鱼草.png b/repo/js/自动购买商品/assets/images/金鱼草.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/金鱼草.png rename to repo/js/自动购买商品/assets/images/金鱼草.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/钩钩果.png b/repo/js/自动购买商品/assets/images/钩钩果.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/钩钩果.png rename to repo/js/自动购买商品/assets/images/钩钩果.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/铁块.png b/repo/js/自动购买商品/assets/images/铁块.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/铁块.png rename to repo/js/自动购买商品/assets/images/铁块.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/霄灯.png b/repo/js/自动购买商品/assets/images/霄灯.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/霄灯.png rename to repo/js/自动购买商品/assets/images/霄灯.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/霓裳花.png b/repo/js/自动购买商品/assets/images/霓裳花.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/霓裳花.png rename to repo/js/自动购买商品/assets/images/霓裳花.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/霜盏花.png b/repo/js/自动购买商品/assets/images/霜盏花.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/霜盏花.png rename to repo/js/自动购买商品/assets/images/霜盏花.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/青蜜莓.png b/repo/js/自动购买商品/assets/images/青蜜莓.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/青蜜莓.png rename to repo/js/自动购买商品/assets/images/青蜜莓.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/面粉.png b/repo/js/自动购买商品/assets/images/面粉.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/面粉.png rename to repo/js/自动购买商品/assets/images/面粉.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/颗粒果.png b/repo/js/自动购买商品/assets/images/颗粒果.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/颗粒果.png rename to repo/js/自动购买商品/assets/images/颗粒果.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/风车菊.png b/repo/js/自动购买商品/assets/images/风车菊.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/风车菊.png rename to repo/js/自动购买商品/assets/images/风车菊.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/香肠.png b/repo/js/自动购买商品/assets/images/香肠.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/香肠.png rename to repo/js/自动购买商品/assets/images/香肠.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/香辛料.png b/repo/js/自动购买商品/assets/images/香辛料.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/香辛料.png rename to repo/js/自动购买商品/assets/images/香辛料.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/香辛果.png b/repo/js/自动购买商品/assets/images/香辛果.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/香辛果.png rename to repo/js/自动购买商品/assets/images/香辛果.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/马尾.png b/repo/js/自动购买商品/assets/images/马尾.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/马尾.png rename to repo/js/自动购买商品/assets/images/马尾.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/鱼肉.png b/repo/js/自动购买商品/assets/images/鱼肉.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/鱼肉.png rename to repo/js/自动购买商品/assets/images/鱼肉.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/鱼肉2.png b/repo/js/自动购买商品/assets/images/鱼肉2.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/鱼肉2.png rename to repo/js/自动购买商品/assets/images/鱼肉2.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/鳗肉.png b/repo/js/自动购买商品/assets/images/鳗肉.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/鳗肉.png rename to repo/js/自动购买商品/assets/images/鳗肉.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/鸟蛋.png b/repo/js/自动购买商品/assets/images/鸟蛋.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/鸟蛋.png rename to repo/js/自动购买商品/assets/images/鸟蛋.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/鸣草.png b/repo/js/自动购买商品/assets/images/鸣草.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/鸣草.png rename to repo/js/自动购买商品/assets/images/鸣草.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/黄油.png b/repo/js/自动购买商品/assets/images/黄油.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/黄油.png rename to repo/js/自动购买商品/assets/images/黄油.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/images/黑麦.png b/repo/js/自动购买商品/assets/images/黑麦.png similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/images/黑麦.png rename to repo/js/自动购买商品/assets/images/黑麦.png diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/npcs.json b/repo/js/自动购买商品/assets/npcs.json similarity index 98% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/npcs.json rename to repo/js/自动购买商品/assets/npcs.json index 2a9a64dc6..b1571768f 100644 --- a/repo/js/自动购买每天&3天&每周刷新商品/assets/npcs.json +++ b/repo/js/自动购买商品/assets/npcs.json @@ -632,6 +632,15 @@ "_thu_foods": ["幸运儿之杯", "幸运儿鹰羽", "幸运儿银冠", "幸运儿绿花", "幸运儿沙漏"], "tags": ["挪德卡莱", "那夏镇", "雷科", "狗粮商人"] }, + "德米安": { + "name": "德米安", + "enable": true, + "page": 1, + "time": "any", + "path": "assets/path/挪德卡莱-那夏镇-旗舰-德米安.json", + "_1d_foods": ["「皮拉米达的夜莺」", "边陲之地", "野浆果之路"], + "tags": ["挪德卡莱", "那夏镇", "旗舰", "德米安", "稀少商品", "独立地图"] + }, "科菲策": { "name": "科菲策", "enable": true, diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/挪德卡莱-皮拉米达城-科菲策.json b/repo/js/自动购买商品/assets/path/挪德卡莱-皮拉米达城-科菲策.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/挪德卡莱-皮拉米达城-科菲策.json rename to repo/js/自动购买商品/assets/path/挪德卡莱-皮拉米达城-科菲策.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/挪德卡莱-那夏镇-丽切娅.json b/repo/js/自动购买商品/assets/path/挪德卡莱-那夏镇-丽切娅.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/挪德卡莱-那夏镇-丽切娅.json rename to repo/js/自动购买商品/assets/path/挪德卡莱-那夏镇-丽切娅.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/挪德卡莱-那夏镇-卡嘉.json b/repo/js/自动购买商品/assets/path/挪德卡莱-那夏镇-卡嘉.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/挪德卡莱-那夏镇-卡嘉.json rename to repo/js/自动购买商品/assets/path/挪德卡莱-那夏镇-卡嘉.json diff --git a/repo/js/自动购买商品/assets/path/挪德卡莱-那夏镇-旗舰-德米安.json b/repo/js/自动购买商品/assets/path/挪德卡莱-那夏镇-旗舰-德米安.json new file mode 100644 index 000000000..17ff3231c --- /dev/null +++ b/repo/js/自动购买商品/assets/path/挪德卡莱-那夏镇-旗舰-德米安.json @@ -0,0 +1,67 @@ +{ + "info": { + "authors": [ + { + "links": "", + "name": "蜜柑魚" + } + ], + "bgi_version": "0.45.0", + "description": "", + "enable_monster_loot_split": false, + "last_modified_time": 1773665461435, + "map_match_method": "", + "map_name": "Teyvat", + "name": "挪德卡莱-那夏镇-旗舰-德米安", + "tags": [], + "type": "collect", + "version": "1.0" + }, + "positions": [ + { + "action": "", + "action_params": "", + "id": 1, + "move_mode": "walk", + "type": "teleport", + "x": 9452.8056640625, + "y": 1661.51123046875 + }, + { + "action": "", + "action_params": "", + "id": 2, + "move_mode": "run", + "type": "path", + "x": 9466.6640625, + "y": 1657.76513671875 + }, + { + "action": "", + "action_params": "", + "id": 3, + "move_mode": "run", + "type": "path", + "x": 9491.2451171875, + "y": 1609.6298828125 + }, + { + "action": "", + "action_params": "", + "id": 4, + "move_mode": "run", + "type": "path", + "x": 9465.5546875, + "y": 1596.20703125 + }, + { + "action": "combat_script", + "action_params": "wait(0.5),keypress(F),wait(0.2),keypress(F),wait(0.2),keypress(F),wait(7.5),w(1.5),wait(0.5),s(0.26),wait(0.5),d(0.2),wait(0.5),click(middle),wait(0.5),keydown(W),wait(1.3),keypress(SPACE),wait(1.55),keyup(W),wait(0.5),a(0.3),wait(0.5),click(middle),wait(0.5),keydown(W),keypress(SPACE),wait(0.5),keypress(SPACE),wait(0.5),keypress(SPACE),wait(0.5),keypress(SPACE),wait(0.5),keypress(SPACE),wait(0.5),keypress(SPACE),wait(0.5),keypress(SPACE),wait(0.5),keypress(SPACE),wait(0.5),keypress(SPACE),wait(0.5),keypress(SPACE),wait(0.5),keypress(SPACE),wait(0.5),keypress(SPACE),wait(0.5),keyup(W),wait(0.5),s(0.3),d(1.1),w(0.2),wait(0.6)", + "id": 5, + "move_mode": "walk", + "type": "target", + "x": 9461.2763671875, + "y": 1598.33837890625 + } + ] +} \ No newline at end of file diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/挪德卡莱-那夏镇-采若.json b/repo/js/自动购买商品/assets/path/挪德卡莱-那夏镇-采若.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/挪德卡莱-那夏镇-采若.json rename to repo/js/自动购买商品/assets/path/挪德卡莱-那夏镇-采若.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/挪德卡莱-那夏镇-雷科.json b/repo/js/自动购买商品/assets/path/挪德卡莱-那夏镇-雷科.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/挪德卡莱-那夏镇-雷科.json rename to repo/js/自动购买商品/assets/path/挪德卡莱-那夏镇-雷科.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-枫丹廷-布希柯.json b/repo/js/自动购买商品/assets/path/枫丹-枫丹廷-布希柯.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-枫丹廷-布希柯.json rename to repo/js/自动购买商品/assets/path/枫丹-枫丹廷-布希柯.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-枫丹廷-德波大饭店-桑格内蒂.json b/repo/js/自动购买商品/assets/path/枫丹-枫丹廷-德波大饭店-桑格内蒂.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-枫丹廷-德波大饭店-桑格内蒂.json rename to repo/js/自动购买商品/assets/path/枫丹-枫丹廷-德波大饭店-桑格内蒂.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-枫丹廷-欧仁妮.json b/repo/js/自动购买商品/assets/path/枫丹-枫丹廷-欧仁妮.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-枫丹廷-欧仁妮.json rename to repo/js/自动购买商品/assets/path/枫丹-枫丹廷-欧仁妮.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-枫丹廷-灰河-克洛莎.json b/repo/js/自动购买商品/assets/path/枫丹-枫丹廷-灰河-克洛莎.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-枫丹廷-灰河-克洛莎.json rename to repo/js/自动购买商品/assets/path/枫丹-枫丹廷-灰河-克洛莎.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-枫丹廷-路易.json b/repo/js/自动购买商品/assets/path/枫丹-枫丹廷-路易.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-枫丹廷-路易.json rename to repo/js/自动购买商品/assets/path/枫丹-枫丹廷-路易.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-枫丹廷-阿鲁埃.json b/repo/js/自动购买商品/assets/path/枫丹-枫丹廷-阿鲁埃.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-枫丹廷-阿鲁埃.json rename to repo/js/自动购买商品/assets/path/枫丹-枫丹廷-阿鲁埃.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-白淞镇-安特曼.json b/repo/js/自动购买商品/assets/path/枫丹-白淞镇-安特曼.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-白淞镇-安特曼.json rename to repo/js/自动购买商品/assets/path/枫丹-白淞镇-安特曼.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-锈舵酒馆-皮托.json b/repo/js/自动购买商品/assets/path/枫丹-锈舵酒馆-皮托.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/枫丹-锈舵酒馆-皮托.json rename to repo/js/自动购买商品/assets/path/枫丹-锈舵酒馆-皮托.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-望舒客栈-菲尔戈黛特.json b/repo/js/自动购买商品/assets/path/璃月-望舒客栈-菲尔戈黛特.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-望舒客栈-菲尔戈黛特.json rename to repo/js/自动购买商品/assets/path/璃月-望舒客栈-菲尔戈黛特.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-琼玑野-朱老板.json b/repo/js/自动购买商品/assets/path/璃月-琼玑野-朱老板.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-琼玑野-朱老板.json rename to repo/js/自动购买商品/assets/path/璃月-琼玑野-朱老板.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-东升.json b/repo/js/自动购买商品/assets/path/璃月-璃月港-东升.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-东升.json rename to repo/js/自动购买商品/assets/path/璃月-璃月港-东升.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-博来.json b/repo/js/自动购买商品/assets/path/璃月-璃月港-博来.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-博来.json rename to repo/js/自动购买商品/assets/path/璃月-璃月港-博来.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-卯师父.json b/repo/js/自动购买商品/assets/path/璃月-璃月港-卯师父.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-卯师父.json rename to repo/js/自动购买商品/assets/path/璃月-璃月港-卯师父.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-张顺.json b/repo/js/自动购买商品/assets/path/璃月-璃月港-张顺.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-张顺.json rename to repo/js/自动购买商品/assets/path/璃月-璃月港-张顺.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-琳琅.json b/repo/js/自动购买商品/assets/path/璃月-璃月港-琳琅.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-琳琅.json rename to repo/js/自动购买商品/assets/path/璃月-璃月港-琳琅.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-石头.json b/repo/js/自动购买商品/assets/path/璃月-璃月港-石头.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-石头.json rename to repo/js/自动购买商品/assets/path/璃月-璃月港-石头.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-老孙.json b/repo/js/自动购买商品/assets/path/璃月-璃月港-老孙.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-老孙.json rename to repo/js/自动购买商品/assets/path/璃月-璃月港-老孙.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-老高.json b/repo/js/自动购买商品/assets/path/璃月-璃月港-老高.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-老高.json rename to repo/js/自动购买商品/assets/path/璃月-璃月港-老高.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-长顺.json b/repo/js/自动购买商品/assets/path/璃月-璃月港-长顺.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-长顺.json rename to repo/js/自动购买商品/assets/path/璃月-璃月港-长顺.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-阿山婆.json b/repo/js/自动购买商品/assets/path/璃月-璃月港-阿山婆.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-阿山婆.json rename to repo/js/自动购买商品/assets/path/璃月-璃月港-阿山婆.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-阿桂.json b/repo/js/自动购买商品/assets/path/璃月-璃月港-阿桂.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-璃月港-阿桂.json rename to repo/js/自动购买商品/assets/path/璃月-璃月港-阿桂.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-石门-老周叔.json b/repo/js/自动购买商品/assets/path/璃月-石门-老周叔.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-石门-老周叔.json rename to repo/js/自动购买商品/assets/path/璃月-石门-老周叔.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-轻策庄-凯叔.json b/repo/js/自动购买商品/assets/path/璃月-轻策庄-凯叔.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-轻策庄-凯叔.json rename to repo/js/自动购买商品/assets/path/璃月-轻策庄-凯叔.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-遗珑埠-丰泰.json b/repo/js/自动购买商品/assets/path/璃月-遗珑埠-丰泰.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-遗珑埠-丰泰.json rename to repo/js/自动购买商品/assets/path/璃月-遗珑埠-丰泰.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-遗珑埠-连芳.json b/repo/js/自动购买商品/assets/path/璃月-遗珑埠-连芳.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/璃月-遗珑埠-连芳.json rename to repo/js/自动购买商品/assets/path/璃月-遗珑埠-连芳.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-海祇岛-清子.json b/repo/js/自动购买商品/assets/path/稻妻-海祇岛-清子.json similarity index 95% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-海祇岛-清子.json rename to repo/js/自动购买商品/assets/path/稻妻-海祇岛-清子.json index 9ea679fb6..01e02b3e4 100644 --- a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-海祇岛-清子.json +++ b/repo/js/自动购买商品/assets/path/稻妻-海祇岛-清子.json @@ -1,31 +1,31 @@ -{ - "info": { - "name": "稻妻-海祇岛-清子", - "type": "collect", - "author": "小鹰划船不用桨", - "version": "1.0", - "description": "稻妻海祇岛百货商人-清子", - "map_name": "Teyvat", - "bgi_version": "0.45.0" - }, - "positions": [ - { - "id": 1, - "action": "", - "move_mode": "walk", - "type": "teleport", - "x": -755.5869140625, - "y": -4001.095703125, - "action_params": "" - }, - { - "id": 2, - "x": -847.1787109375, - "y": -3967.7099609375, - "type": "path", - "move_mode": "fly", - "action": "stop_flying", - "action_params": "" - } - ] +{ + "info": { + "name": "稻妻-海祇岛-清子", + "type": "collect", + "author": "小鹰划船不用桨", + "version": "1.0", + "description": "稻妻海祇岛百货商人-清子", + "map_name": "Teyvat", + "bgi_version": "0.45.0" + }, + "positions": [ + { + "id": 1, + "action": "", + "move_mode": "walk", + "type": "teleport", + "x": -755.5869140625, + "y": -4001.095703125, + "action_params": "" + }, + { + "id": 2, + "x": -847.1787109375, + "y": -3967.7099609375, + "type": "path", + "move_mode": "fly", + "action": "stop_flying", + "action_params": "" + } + ] } \ No newline at end of file diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-白狐之野-若紫.json b/repo/js/自动购买商品/assets/path/稻妻-白狐之野-若紫.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-白狐之野-若紫.json rename to repo/js/自动购买商品/assets/path/稻妻-白狐之野-若紫.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-离岛-卡琵莉亚.json b/repo/js/自动购买商品/assets/path/稻妻-离岛-卡琵莉亚.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-离岛-卡琵莉亚.json rename to repo/js/自动购买商品/assets/path/稻妻-离岛-卡琵莉亚.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-离岛-小畑.json b/repo/js/自动购买商品/assets/path/稻妻-离岛-小畑.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-离岛-小畑.json rename to repo/js/自动购买商品/assets/path/稻妻-离岛-小畑.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-离岛-山城健太.json b/repo/js/自动购买商品/assets/path/稻妻-离岛-山城健太.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-离岛-山城健太.json rename to repo/js/自动购买商品/assets/path/稻妻-离岛-山城健太.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-离岛-秋月.json b/repo/js/自动购买商品/assets/path/稻妻-离岛-秋月.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-离岛-秋月.json rename to repo/js/自动购买商品/assets/path/稻妻-离岛-秋月.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-稻妻城-志村勘兵卫.json b/repo/js/自动购买商品/assets/path/稻妻-稻妻城-志村勘兵卫.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-稻妻城-志村勘兵卫.json rename to repo/js/自动购买商品/assets/path/稻妻-稻妻城-志村勘兵卫.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-稻妻城-智树.json b/repo/js/自动购买商品/assets/path/稻妻-稻妻城-智树.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-稻妻城-智树.json rename to repo/js/自动购买商品/assets/path/稻妻-稻妻城-智树.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-稻妻城-木南杏奈.json b/repo/js/自动购买商品/assets/path/稻妻-稻妻城-木南杏奈.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-稻妻城-木南杏奈.json rename to repo/js/自动购买商品/assets/path/稻妻-稻妻城-木南杏奈.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-稻妻城-葵.json b/repo/js/自动购买商品/assets/path/稻妻-稻妻城-葵.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/稻妻-稻妻城-葵.json rename to repo/js/自动购买商品/assets/path/稻妻-稻妻城-葵.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/纳塔-圣火竞技场-夏安卡.json b/repo/js/自动购买商品/assets/path/纳塔-圣火竞技场-夏安卡.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/纳塔-圣火竞技场-夏安卡.json rename to repo/js/自动购买商品/assets/path/纳塔-圣火竞技场-夏安卡.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/纳塔-圣火竞技场-布纳马.json b/repo/js/自动购买商品/assets/path/纳塔-圣火竞技场-布纳马.json similarity index 95% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/纳塔-圣火竞技场-布纳马.json rename to repo/js/自动购买商品/assets/path/纳塔-圣火竞技场-布纳马.json index 820debcff..ea3aca788 100644 --- a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/纳塔-圣火竞技场-布纳马.json +++ b/repo/js/自动购买商品/assets/path/纳塔-圣火竞技场-布纳马.json @@ -1,57 +1,57 @@ -{ - "info": { - "name": "布纳马", - "type": "collect", - "authors": [ - { - "name": "芝士贝果" - } - ], - "version": "1.0", - "description": "", - "map_name": "Teyvat", - "bgi_version": "0.47.3", - "tags": [], - "last_modified_time": 1754489424074, - "enable_monster_loot_split": false, - "map_match_method": "" - }, - "positions": [ - { - "id": 1, - "action": "", - "move_mode": "walk", - "type": "teleport", - "x": 9060.5419921875, - "y": -1847.5107421875, - "action_params": "" - }, - { - "id": 2, - "x": 9089.0361328125, - "y": -1852.42919921875, - "type": "path", - "move_mode": "walk", - "action": "", - "action_params": "" - }, - { - "id": 3, - "x": 9088.6552734375, - "y": -1856.89306640625, - "type": "target", - "move_mode": "walk", - "action": "", - "action_params": "" - }, - { - "id": 4, - "x": 9089.8935546875, - "y": -1857.2724609375, - "type": "target", - "move_mode": "walk", - "action": "", - "action_params": "" - } - ] +{ + "info": { + "name": "布纳马", + "type": "collect", + "authors": [ + { + "name": "芝士贝果" + } + ], + "version": "1.0", + "description": "", + "map_name": "Teyvat", + "bgi_version": "0.47.3", + "tags": [], + "last_modified_time": 1754489424074, + "enable_monster_loot_split": false, + "map_match_method": "" + }, + "positions": [ + { + "id": 1, + "action": "", + "move_mode": "walk", + "type": "teleport", + "x": 9060.5419921875, + "y": -1847.5107421875, + "action_params": "" + }, + { + "id": 2, + "x": 9089.0361328125, + "y": -1852.42919921875, + "type": "path", + "move_mode": "walk", + "action": "", + "action_params": "" + }, + { + "id": 3, + "x": 9088.6552734375, + "y": -1856.89306640625, + "type": "target", + "move_mode": "walk", + "action": "", + "action_params": "" + }, + { + "id": 4, + "x": 9089.8935546875, + "y": -1857.2724609375, + "type": "target", + "move_mode": "walk", + "action": "", + "action_params": "" + } + ] } \ No newline at end of file diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/纳塔-圣火竞技场-艾库瓦.json b/repo/js/自动购买商品/assets/path/纳塔-圣火竞技场-艾库瓦.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/纳塔-圣火竞技场-艾库瓦.json rename to repo/js/自动购买商品/assets/path/纳塔-圣火竞技场-艾库瓦.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/纳塔-圣火竞技场-钦特利.json b/repo/js/自动购买商品/assets/path/纳塔-圣火竞技场-钦特利.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/纳塔-圣火竞技场-钦特利.json rename to repo/js/自动购买商品/assets/path/纳塔-圣火竞技场-钦特利.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/纳塔-坚岩隘谷-伊蜜.json b/repo/js/自动购买商品/assets/path/纳塔-坚岩隘谷-伊蜜.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/纳塔-坚岩隘谷-伊蜜.json rename to repo/js/自动购买商品/assets/path/纳塔-坚岩隘谷-伊蜜.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/纳塔-悠悠度假村-穆托莉娜.json b/repo/js/自动购买商品/assets/path/纳塔-悠悠度假村-穆托莉娜.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/纳塔-悠悠度假村-穆托莉娜.json rename to repo/js/自动购买商品/assets/path/纳塔-悠悠度假村-穆托莉娜.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-清泉镇-杜拉夫.json b/repo/js/自动购买商品/assets/path/蒙德-清泉镇-杜拉夫.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-清泉镇-杜拉夫.json rename to repo/js/自动购买商品/assets/path/蒙德-清泉镇-杜拉夫.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-清泉镇-神奇的霍普金斯.json b/repo/js/自动购买商品/assets/path/蒙德-清泉镇-神奇的霍普金斯.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-清泉镇-神奇的霍普金斯.json rename to repo/js/自动购买商品/assets/path/蒙德-清泉镇-神奇的霍普金斯.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-蒙德城-天使的馈赠-查尔斯.json b/repo/js/自动购买商品/assets/path/蒙德-蒙德城-天使的馈赠-查尔斯.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-蒙德城-天使的馈赠-查尔斯.json rename to repo/js/自动购买商品/assets/path/蒙德-蒙德城-天使的馈赠-查尔斯.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-蒙德城-布兰琪.json b/repo/js/自动购买商品/assets/path/蒙德-蒙德城-布兰琪.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-蒙德城-布兰琪.json rename to repo/js/自动购买商品/assets/path/蒙德-蒙德城-布兰琪.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-蒙德城-石榴.json b/repo/js/自动购买商品/assets/path/蒙德-蒙德城-石榴.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-蒙德城-石榴.json rename to repo/js/自动购买商品/assets/path/蒙德-蒙德城-石榴.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-蒙德城-芙萝拉.json b/repo/js/自动购买商品/assets/path/蒙德-蒙德城-芙萝拉.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-蒙德城-芙萝拉.json rename to repo/js/自动购买商品/assets/path/蒙德-蒙德城-芙萝拉.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-蒙德城-莎拉.json b/repo/js/自动购买商品/assets/path/蒙德-蒙德城-莎拉.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-蒙德城-莎拉.json rename to repo/js/自动购买商品/assets/path/蒙德-蒙德城-莎拉.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-风起地-克罗丽丝.json b/repo/js/自动购买商品/assets/path/蒙德-风起地-克罗丽丝.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/蒙德-风起地-克罗丽丝.json rename to repo/js/自动购买商品/assets/path/蒙德-风起地-克罗丽丝.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-化城郭-阿什帕齐.json b/repo/js/自动购买商品/assets/path/须弥-化城郭-阿什帕齐.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-化城郭-阿什帕齐.json rename to repo/js/自动购买商品/assets/path/须弥-化城郭-阿什帕齐.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-奥摩斯港-巴巴克.json b/repo/js/自动购买商品/assets/path/须弥-奥摩斯港-巴巴克.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-奥摩斯港-巴巴克.json rename to repo/js/自动购买商品/assets/path/须弥-奥摩斯港-巴巴克.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-奥摩斯港-布特罗斯.json b/repo/js/自动购买商品/assets/path/须弥-奥摩斯港-布特罗斯.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-奥摩斯港-布特罗斯.json rename to repo/js/自动购买商品/assets/path/须弥-奥摩斯港-布特罗斯.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-奥摩斯港-拉玛.json b/repo/js/自动购买商品/assets/path/须弥-奥摩斯港-拉玛.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-奥摩斯港-拉玛.json rename to repo/js/自动购买商品/assets/path/须弥-奥摩斯港-拉玛.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-奥摩斯港-秋蔚.json b/repo/js/自动购买商品/assets/path/须弥-奥摩斯港-秋蔚.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-奥摩斯港-秋蔚.json rename to repo/js/自动购买商品/assets/path/须弥-奥摩斯港-秋蔚.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-桓那兰那(梦境)-兰玛尼.json b/repo/js/自动购买商品/assets/path/须弥-桓那兰那(梦境)-兰玛尼.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-桓那兰那(梦境)-兰玛尼.json rename to repo/js/自动购买商品/assets/path/须弥-桓那兰那(梦境)-兰玛尼.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-阿如村-阿扎莱.json b/repo/js/自动购买商品/assets/path/须弥-阿如村-阿扎莱.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-阿如村-阿扎莱.json rename to repo/js/自动购买商品/assets/path/须弥-阿如村-阿扎莱.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-须弥城-兰巴德酒馆-兰巴德.json b/repo/js/自动购买商品/assets/path/须弥-须弥城-兰巴德酒馆-兰巴德.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-须弥城-兰巴德酒馆-兰巴德.json rename to repo/js/自动购买商品/assets/path/须弥-须弥城-兰巴德酒馆-兰巴德.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-须弥城-哈马维.json b/repo/js/自动购买商品/assets/path/须弥-须弥城-哈马维.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-须弥城-哈马维.json rename to repo/js/自动购买商品/assets/path/须弥-须弥城-哈马维.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-须弥城-普斯帕咖啡馆-恩忒卡.json b/repo/js/自动购买商品/assets/path/须弥-须弥城-普斯帕咖啡馆-恩忒卡.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-须弥城-普斯帕咖啡馆-恩忒卡.json rename to repo/js/自动购买商品/assets/path/须弥-须弥城-普斯帕咖啡馆-恩忒卡.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-须弥城-朱特.json b/repo/js/自动购买商品/assets/path/须弥-须弥城-朱特.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-须弥城-朱特.json rename to repo/js/自动购买商品/assets/path/须弥-须弥城-朱特.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-须弥城-珀姆.json b/repo/js/自动购买商品/assets/path/须弥-须弥城-珀姆.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-须弥城-珀姆.json rename to repo/js/自动购买商品/assets/path/须弥-须弥城-珀姆.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-须弥城-阿夫辛.json b/repo/js/自动购买商品/assets/path/须弥-须弥城-阿夫辛.json similarity index 100% rename from repo/js/自动购买每天&3天&每周刷新商品/assets/path/须弥-须弥城-阿夫辛.json rename to repo/js/自动购买商品/assets/path/须弥-须弥城-阿夫辛.json diff --git a/repo/js/自动购买每天&3天&每周刷新商品/main.js b/repo/js/自动购买商品/main.js similarity index 97% rename from repo/js/自动购买每天&3天&每周刷新商品/main.js rename to repo/js/自动购买商品/main.js index 07576aaa1..fd8662783 100644 --- a/repo/js/自动购买每天&3天&每周刷新商品/main.js +++ b/repo/js/自动购买商品/main.js @@ -1,1186 +1,1186 @@ -// fakeLog 函数,使用方法:将本函数放在主函数前,调用时请务必使用await,否则可能出现v8白框报错 -// 在js开头处伪造该js结束运行的日志信息,如 await fakeLog("js脚本", true, true, 0); -// 在js结尾处伪造该js开始运行的日志信息,如 await fakeLog("js脚本", true, false, 2333); -// duration项目仅在伪造结束信息时有效,且无实际作用,可以任意填写,当你需要在日志中输出特定值时才需要,单位为毫秒 -// 在调用地图追踪前伪造该地图追踪开始运行的日志信息,如 await fakeLog(`地图追踪.json`, false, true, 0); -// 在调用地图追踪后伪造该地图追踪结束运行的日志信息,如 await fakeLog(`地图追踪.json`, false, false, 0); -// 如此便可以在js运行过程中伪造地图追踪的日志信息,可以在日志分析等中查看 -// name: 字符串,表示脚本或地图追踪的名称 -// isJs: 布尔值,true表示脚本,false表示地图追踪 -// isStart: 布尔值,true表示开始日志,false表示结束日志 -// duration: 整数,表示脚本或地图追踪的运行时间(仅在结束日志时使用),单位为毫秒_基本填0即可 -// 示例: -// JS脚本开始 -// await fakeLog("js脚本名", true, true, 0); -// JS脚本结束 -// await fakeLog("js脚本名", true, false, 0); -// 地图追踪开始 -// await fakeLog("地图追踪名", false, true, 0); -// 地图追踪结束 -// await fakeLog("地图追踪名", false, false, 0); -// 交互或拾取:"XXXX" -// await fakeLog("XXXX", false, false, 23333); -async function fakeLog(name, isJs, isStart, duration) { - await sleep(10); - const currentTime = Date.now(); - // 参数检查 - if (typeof name !== 'string') { - log.error("参数 'name' 必须是字符串类型!"); - return; - } - if (typeof isJs !== 'boolean') { - log.error("参数 'isJs' 必须是布尔型!"); - return; - } - if (typeof isStart !== 'boolean') { - log.error("参数 'isStart' 必须是布尔型!"); - return; - } - if (typeof duration !== 'number' || !Number.isInteger(duration)) { - log.error("参数 'duration' 必须是整数!"); - return; - } - - // 将 currentTime 转换为 Date 对象并格式化为 HH:mm:ss.sss - const date = new Date(currentTime); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - const milliseconds = String(date.getMilliseconds()).padStart(3, '0'); - const formattedTime = `${hours}:${minutes}:${seconds}.${milliseconds}`; - - // 将 duration 转换为分钟和秒,并保留三位小数 - const durationInSeconds = duration / 1000; // 转换为秒 - const durationMinutes = Math.floor(durationInSeconds / 60); - const durationSeconds = (durationInSeconds % 60).toFixed(3); // 保留三位小数 - - // 使用四个独立的 if 语句处理四种情况 - if (isJs && isStart) { - // 处理 isJs = true 且 isStart = true 的情况 - const logMessage = `正在伪造js开始的日志记录\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `------------------------------\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `→ 开始执行JS脚本: "${name}"`; - log.debug(logMessage); - } - if (isJs && !isStart) { - // 处理 isJs = true 且 isStart = false 的情况 - const logMessage = `正在伪造js结束的日志记录\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `→ 脚本执行结束: "${name}", 耗时: ${durationMinutes}分${durationSeconds}秒\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `------------------------------`; - log.debug(logMessage); - } - if (!isJs && isStart) { - // 处理 isJs = false 且 isStart = true 的情况 - const logMessage = `正在伪造地图追踪开始的日志记录\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `------------------------------\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `→ 开始执行地图追踪任务: "${name}"`; - log.debug(logMessage); - } - if (!isJs && !isStart) { - // 处理 isJs = false 且 isStart = false 的情况 - const logMessage = `正在伪造地图追踪结束的日志记录\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `→ 脚本执行结束: "${name}", 耗时: ${durationMinutes}分${durationSeconds}秒\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `------------------------------`; - log.debug(logMessage); - } - // 交互或拾取:"XXXX" - if (duration == 23333) { - log.info(`交互或拾取:"${name}"`); - } -} - -// ==================== 日志辅助函数 ==================== -function logConditional(message) { - if (ignoreRecords || recordDebug) { - log.info(message); - } else { - log.debug(message); - } -} - -// ==================== 加载外部数据文件 ==================== -let npcData = {}; - -// 存储用户要购买的商品名称集合(中文名) -let userFoodsToBuy = new Set(); -let userTagsToBuy = new Set(); // 标签名 -let allTags = new Set(); // 所有可用标签(从 npcs.json 收集) -let requiredFoods = new Set(); // 所有需要加载图片的商品 - -async function loadExternalData() { - try { - // 加载商人数据 - const npcsContent = await file.readText("assets/npcs.json"); - 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 items = foodsInput.split(/[,\s、]+/).filter(item => item.trim() !== ""); - const enabledFoodsList = []; - 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(", ")}`); - } - if (enabledTagsList.length === 0 && enabledFoodsList.length === 0) { - log.warn("用户未启用任何标签或商品"); - } - } else { - 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}`); - return false; - } -} - -// ==================== 辅助函数:获取商人的所有商品 ==================== -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)) { - return []; - } - - return foodList.filter(food => { - // 直接检查商品名是否在用户要购买的商品集合中 - const shouldBuy = userFoodsToBuy.has(food); - if (recordDebug && shouldBuy) { - log.info(`[调试] 用户选择购买: ${food}`); - } - return shouldBuy; - }); -} - -// ==================== 辅助函数:获取调整后的星期几(1-7,周一为1) ==================== -function getAdjustedDayOfWeek() { - const now = new Date(); - let dayOfWeek = now.getDay(); // 0-6 (0是周日) - const hours = now.getHours(); - - // 如果时间在00:00~04:00之间,视为前一天 - if (hours < 4) { - dayOfWeek = dayOfWeek === 0 ? 6 : dayOfWeek - 1; // 前一天 - if (recordDebug) { - log.info(`[调试] 当前时间 ${now.getHours()}:${now.getMinutes()},视为前一天(周 ${dayOfWeek === 0 ? 7 : dayOfWeek})`); - } - } else if (recordDebug) { - log.info(`[调试] 当前时间 ${now.getHours()}:${now.getMinutes()},使用当天(周 ${dayOfWeek === 0 ? 7 : dayOfWeek})`); - } - - // 转换为1-7格式(7代表周日) - return dayOfWeek === 0 ? 7 : dayOfWeek; -} - -// ==================== 辅助函数:获取给定日期所在的周一日期 ==================== -function getMondayOfWeek(date) { - const d = new Date(date); - // 调整到4点刷新 - if (d.getHours() < 4) { - d.setDate(d.getDate() - 1); - } - const day = d.getDay(); - const diff = day === 0 ? 6 : day - 1; - d.setDate(d.getDate() - diff); - d.setHours(4, 0, 0, 0); - return d; -} - -// ==================== 辅助函数:获取给定日期所在的周四日期 ==================== -function getThursdayOfWeek(date) { - const d = new Date(date); - // 调整到4点刷新 - if (d.getHours() < 4) { - d.setDate(d.getDate() - 1); - } - const day = d.getDay(); // 0=周日, 1=周一, 2=周二, 3=周三, 4=周四, 5=周五, 6=周六 - // 目标周四:如果当前<=周四,则取本周四;否则取下周四 - let targetDay = 4; // 周四对应的getDay值为4 - if (day <= targetDay) { - d.setDate(d.getDate() + (targetDay - day)); - } else { - d.setDate(d.getDate() + (7 - day + targetDay)); - } - d.setHours(4, 0, 0, 0); - return d; -} - -// ==================== 辅助函数:获取下个月1号的日期 ==================== -function getNextMonthFirstDay(date) { - const d = new Date(date); - d.setMonth(d.getMonth() + 1); - d.setDate(1); - d.setHours(4, 0, 0, 0); - return d; -} - -// ==================== 账号管理功能 ==================== -let userName; - -// 清理账户名,防止路径非法字符 -function validateUserName(name) { - if (typeof name !== 'string' || name.trim() === '') return '默认账户'; - // 替换 Windows 路径非法字符,并去除首尾空格 - return name.trim().replace(/[\\/:*?"<>|]/g, '_'); -} - -async function getUidFromGame() { - // 设置脚本环境的游戏分辨率和DPI缩放 - setGameMetrics(3840, 2160, 1.5); - - // 确保回到主界面 - await genshin.returnMainUi(); - await sleep(1000); - - // 打开派蒙菜单 - keyPress("G"); - await sleep(500); - - // 加载退出按钮识别图(需要 assets/images/Exit.png 存在) - let imageExitRo; - try { - imageExitRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/images/Exit.png")); - imageExitRo.Threshold = 0.8; - } catch (e) { - log.warn("无法加载 assets/Exit.png,将使用固定延时等待菜单打开"); - } - - if (imageExitRo) { - // 等待退出按钮出现,最多5秒 - const startTime = Date.now(); - while (Date.now() - startTime < 5000) { - let capture = captureGameRegion(); - if (capture.Find(imageExitRo).isExist()) { - capture.dispose(); - break; - } - capture.dispose(); - await sleep(500); - } - } else { - await sleep(2000); // 无图片则直接等待2秒 - } - - // OCR识别UID - let gameRegion = captureGameRegion(); - let ocrResult = gameRegion.Find(RecognitionObject.Ocr(1679, 1048, 200, 28)); - gameRegion.dispose(); - - let uid = ""; - if (ocrResult.isExist() && ocrResult.text) { - uid = ocrResult.text.replace(/\D/g, ''); // 只保留数字 - } - - // 关闭派蒙菜单 - keyPress("ESCAPE"); - await sleep(500); - await genshin.returnMainUi(); - - if (uid && uid.length >= 5) { // UID通常9位,至少5位 - log.info(`从游戏获取到UID: ${uid}`); - return uid; - } else { - log.warn("无法从游戏获取UID"); - return null; - } -} - -// 确保设置变量存在 -const ignoreRecords = settings.ignoreRecords || false; -const recordDebug = settings.recordDebug || false; - -// 解析禁用的标签列表 -const disabledTags = (settings.disabledTags || "").split(/[,\s、]+/).filter(tag => tag.trim() !== ""); -if (disabledTags.length > 0) { - log.info(`已禁用标签: ${disabledTags.join(", ")}`); -} - -// 修改AKF设置处理 -const AKFValue = parseInt(settings.AKF) || 1; -let AFKDay = null; -let followSystem = false; - -if (AKFValue === 0) { - // 0 表示跟随系统判定 - followSystem = true; - log.info("每周商品购买: 跟随系统判定"); -} else { - AFKDay = AKFValue === 7 ? 0 : AKFValue; - log.info(`每周商品购买: 每周${AFKDay === 0 ? "日" : AFKDay}购买`); -} - -// 获取账号记录路径 -function getRecordPath(accountName) { - // 简单处理账户名,如果为空则使用默认账户 - if (!accountName || accountName.trim() === "") { - accountName = "默认账户"; - } - return `record/${accountName.trim()}/records.json`; -} - -// ==================== 新增函数:读取商人记录文件 ==================== -async function loadNpcRecords() { - const recordPath = getRecordPath(userName); - try { - const content = await file.readText(recordPath); - if (content.trim()) { - return JSON.parse(content); - } - } catch (error) { - // 文件不存在或格式错误,返回空数组 - } - return []; -} - -// ==================== 辅助函数:从路径中提取显示名称 ==================== -function getDisplayNameFromPath(path) { - try { - // 从路径中提取文件名(不带.json扩展名) - // 例如:assets/path/璃月-璃月港-阿桂.json → 璃月-璃月港-阿桂 - const fileName = path.split('/').pop(); // 获取最后一部分 - return fileName.replace('.json', ''); // 移除.json扩展名 - } catch (error) { - // 如果解析失败,返回原始路径或默认值 - return path || "未知位置"; - } -} - -// ==================== 保存商人记录 ==================== -async function saveNpcRecords(records) { - const recordPath = getRecordPath(userName); - try { - await file.writeText(recordPath, JSON.stringify(records, null, 2)); - return true; - } catch (error) { - log.error(`保存记录文件失败: ${error.message}`); - return false; - } -} - -// ==================== 获取商人记录 ==================== -function getNpcRecord(records, npcName) { - return records.find(record => record.npcname === npcName); -} - -// ==================== 更新商人记录 ==================== -function updateNpcRecord(records, npcName, refreshType, purchasedItems) { - // 如果没有购买任何商品,不更新记录 - if (!purchasedItems || purchasedItems.length === 0) { - return records; - } - - 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 - }; - records.push(record); - } - - const now = new Date(); - let refreshTime; - - if (refreshType === "1d") { - // 1天商品:下次刷新是购买日+1天 - refreshTime = new Date(now); - refreshTime.setHours(4, 0, 0, 0); - // 如果当前时间在4点前,刷新时间从昨天开始算 - if (now.getHours() < 4) { - refreshTime.setDate(refreshTime.getDate() - 1); - } - refreshTime.setDate(refreshTime.getDate() + 1); - } else if (refreshType === "3d") { - // 3天商品:基于基准日的3天周期计算 - // 基准时间:2025-08-09 04:00 GMT+8 (转换为本地时间) - const baseTime = new Date(2025, 7, 9, 4, 0, 0); // 2025-08-09 04:00 - - // 调整当前时间到4点基准 - const adjustedNow = new Date(now); - if (adjustedNow.getHours() < 4) { - adjustedNow.setDate(adjustedNow.getDate() - 1); - } - adjustedNow.setHours(4, 0, 0, 0); - - // 计算距离基准日的天数 - const timeDiff = adjustedNow.getTime() - baseTime.getTime(); - const daysDiff = Math.floor(timeDiff / (1000 * 60 * 60 * 24)); - - // 计算当前3天周期 - const currentPeriod = Math.floor(daysDiff / 3); - - // 下一个3天周期的开始时间 - const nextPeriod = currentPeriod + 1; - refreshTime = new Date(baseTime); - refreshTime.setDate(baseTime.getDate() + (nextPeriod * 3)); - - // 确保刷新时间是04:00 - refreshTime.setHours(4, 0, 0, 0); - } else if (refreshType === "7d") { - // 7天商品(周一刷新):下次刷新是下周一 - refreshTime = getMondayOfWeek(now); - refreshTime.setDate(refreshTime.getDate() + 7); - } 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); - - // 计算下次刷新日期 - if (recordDebug) { - const nextRefresh = new Date(refreshTime); - log.info(`${npcName} 下次${refreshType}刷新时间: ${formatDateToLocalISO(nextRefresh)}`); - } - - return records; -} - -// ==================== 计算3天刷新商品基准日周期 ==================== -function getBasePeriod(currentDate) { - // 基准时间:2025-08-08 20:00 UTC (对应2025-08-09 04:00 GMT+8) - const baseTime = Date.UTC(2025, 7, 8, 20, 0, 0); - - // 转换当前时间到UTC+8 - const utcNowMs = currentDate.getTime() + currentDate.getTimezoneOffset() * 60 * 1000; - const gmt8Ms = utcNowMs + 8 * 60 * 60 * 1000; - const gmt8Date = new Date(gmt8Ms); - - // 如果还没到凌晨4点,算作前一天 - if (gmt8Date.getHours() < 4) { - gmt8Date.setDate(gmt8Date.getDate() - 1); - } - - // 计算距离基准日的天数 - const daysDiff = Math.floor((gmt8Date.getTime() - baseTime) / (24 * 60 * 60 * 1000)); - - return { - day: gmt8Date, - daysDiff: daysDiff, - threeDayPeriod: Math.floor(daysDiff / 3), - sevenDayPeriod: Math.floor(daysDiff / 7) - }; -} - -// ==================== 判断是否需要购买 ==================== -function shouldBuyFoods(npc, npcRecord, currentPeriod, forceRefresh = false) { - const now = new Date(); - const foodsToBuy = { - "1d": [], - "3d": [], - "7d": [], - "thu": [], - "month": [] - }; - - // 首先检查禁用(此处假设之前已检查过,但为防止遗漏,可再加一道保险) - // 实际上禁用检查在更外层(initNpcData 和主循环)已经处理,这里可以省略 - - if (forceRefresh) { - // 强制刷新:决定使用完整列表还是具体商品列表 - // 先判断是否命中标签 - 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, 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 = candidateList.filter(food => !purchasedList.includes(food)); - - if (!npcRecord || !npcRecord[`${type}_time`]) { - return candidateList; // 从未买过,全部尝试 - } - - const nextRefreshTime = new Date(npcRecord[`${type}_time`]); - if (now >= nextRefreshTime) { - return candidateList; // 已刷新,全部尝试 - } else { - return notPurchased; // 未刷新,只尝试未购买过的 - } - } - - 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; -} - -const othrtRo = { - "buy": { - "name": "购买按钮", - "file": "assets/images/buyBtn.png" - } -} - -// 获取游戏内时间(考虑4点刷新) -function getGameTime() { - const now = new Date(); - const utcNowMs = now.getTime() + now.getTimezoneOffset() * 60 * 1000; - const gmt8Ms = utcNowMs + 8 * 60 * 60 * 1000; - const gmt8Date = new Date(gmt8Ms); - - // 如果还没到凌晨4点,算作前一天 - if (gmt8Date.getHours() < 4) { - gmt8Date.setDate(gmt8Date.getDate() - 1); - } - - return gmt8Date; -} - -// ==================== 新增函数:格式化为本地ISO时间 ==================== -function formatDateToLocalISO(date) { - // 将日期格式化为 "YYYY-MM-DDTHH:mm:ss+08:00" 格式 - const pad = (n) => n.toString().padStart(2, '0'); - - const year = date.getFullYear(); - const month = pad(date.getMonth() + 1); - const day = pad(date.getDate()); - const hours = pad(date.getHours()); - const minutes = pad(date.getMinutes()); - const seconds = pad(date.getSeconds()); - - return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}+08:00`; -} - -// 地图追踪 -async function autoPath(locationPath) { - try { - let filePath = locationPath; - await pathingScript.runFile(filePath); - await sleep(200); - - return true; - } catch (error) { - log.error(`执行路径时发生错误: ${error.message}`); - return false; - } -} - -// 平滑过渡函数(缓动效果) -function smoothStep(t) { - return t * t * (3 - 2 * t); -} - -// 模拟鼠标移动到指定位置(带曲线路径) -async function naturalMove(initX, initY, targetX, targetY, duration, wiggle = 30) { - - // 生成控制点(使路径形成曲线) - const controlX = (initX + targetX) / 2 + (Math.random() * wiggle * 2 - wiggle); - const controlY = (initY + targetY) / 2 + (Math.random() * wiggle * 2 - wiggle); - - const steps = Math.max(duration / 20, 10); // 计算步数 - - for (let i = 0; i <= steps; i++) { - const progress = i / steps; - const t = smoothStep(progress); // 使用平滑过渡 - - // 二次贝塞尔曲线计算 - const x = (1 - t) * (1 - t) * initX + 2 * (1 - t) * t * controlX + t * t * targetX; - const y = (1 - t) * (1 - t) * initY + 2 * (1 - t) * t * controlY + t * t * targetY; - - moveMouseTo(Math.trunc(x), Math.trunc(y)); - - // 随机延迟使移动更自然 - await sleep(Math.trunc(duration / steps * (0.8 + Math.random() * 0.4))); - } - - await sleep(200); - // 确保最终位置准确 - moveMouseTo(targetX, targetY); -} - -// 切换下一页商品 -async function nextFoodsPage() { - //设置脚本环境的游戏分辨率和DPI缩放 - setGameMetrics(3840, 2160, 1.5); - - let [initX, initY] = [1500, 1850]; - let [targetX, targetY] = [1800, 260]; - - moveMouseTo(initX, initY); - leftButtonDown(); - await naturalMove(initX, initY, targetX, targetY, 300); - - // 按住了, 防止弹太远 - await sleep(520); - leftButtonUp(); -} - -// 快速购买 -async function qucikBuy() { - //设置脚本环境的游戏分辨率和DPI缩放 - setGameMetrics(3840, 2160, 1.5); - - let [buyBtnX, buyBtnY] = [3200, 2045]; - let [confirmBtnX, confirmBtnY] = [2025, 1570]; - let [addNumX, addNumY] = [2060, 1208]; - - // 等待界面切换 - await sleep(200); - - try { - // 查找购买按钮 - let captureRegion = captureGameRegion(); - let buyBtn = captureRegion.Find(othrtRo.buy.ro); - captureRegion.dispose(); - - if (buyBtn.isEmpty()) { - log.warn("未找到购买按钮"); - return false; - } - - // 点击购买按钮 - click(buyBtn.x * 2 + buyBtn.width, buyBtn.y * 2 + buyBtn.height); - // 等待购买窗口弹出 - await sleep(300); - - // 增加数量至最大 - leftButtonDown(); - await naturalMove(addNumX, addNumY, addNumX + 666, addNumY - 233, 100); - leftButtonUp(); - - // 确保最终数量至最大 - await sleep(200); - click(2370, 1208); - await sleep(200); - - // 点击确认按钮 - click(confirmBtnX, confirmBtnY); - // 等待购买完成 - await sleep(1200); - // 点击空白关闭 - click(buyBtnX, buyBtnY); - await sleep(200); - - return true; - } catch (error) { - log.error(`快速购买失败: ${error.message}`); - return false; - } -} - -// 跳过对话 -async function spikChat(npcName) { - let count = 6; // 添加let声明 - await sleep(1000); - if (npcName == "布纳马" || npcName == "杜拉夫") { - // 设置脚本环境的游戏分辨率和DPI缩放 - setGameMetrics(1920, 1080, 1); - - // 交互 - let loop_count = 3; - if (npcName == "布纳马") { - loop_count = 3; - } else if (npcName == "杜拉夫") { - loop_count = 2; - } - - for (let i = 0; i < loop_count; i++) { - keyPress("VK_F"); - await sleep(1500); - } - - // 点击有什么卖的 - 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(); - } - } - - await sleep(1500); - keyPress("VK_F"); - await sleep(1500); - keyPress("VK_F"); - await sleep(1500); - } else { - for (let i = 0; i < count; i++) { - keyPress("VK_F"); - await sleep(1500); - } - } -} - -// ==================== 商品识别对象映射表 ==================== -let foodROMap = {}; // 键为商品名(中文),值为 RecognitionObject - -// 加载识别对象(只加载用户选择的商品) -async function initRo() { - try { - for (let foodName of requiredFoods) { - const imagePath = `assets/images/${foodName}.png`; - try { - const ro = RecognitionObject.TemplateMatch(file.ReadImageMatSync(imagePath)); - ro.Threshold = 0.75; - ro.Use3Channels = true; - foodROMap[foodName] = ro; - logConditional(`已启用商品: ${foodName}`); - } catch (e) { - 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(`总共启用了 ${requiredFoods.size} 种商品`); - return true; - } - catch (error) { - log.error("加载识别对象时发生错误: {error}", error.message); - throw error; - } -} - -// 主要购买逻辑 -async function buyFoods(npcName, npcRecords, currentPeriod) { - // 设置脚本环境的游戏分辨率和DPI缩放 - setGameMetrics(3840, 2160, 1.5); - - // 获取商人数据 - const npc = npcData[npcName]; - const npcRecord = getNpcRecord(npcRecords, npc.name); - - // 获取显示名称 - const displayName = getDisplayNameFromPath(npc.path); - - if (recordDebug) { - log.info(`[调试] 开始处理: ${displayName}`); - if (npcRecord) { - log.info(`[调试] 当前记录: 1d=${npcRecord["1d_time"] || "无"}, 3d=${npcRecord["3d_time"] || "无"}, 7d=${npcRecord["7d_time"] || "无"}, thu=${npcRecord["thu_time"] || "无"}, month=${npcRecord["month_time"] || "无"}`); - } - } - - // 判断需要购买的商品 - const foodsToBuy = shouldBuyFoods(npc, npcRecord, currentPeriod, ignoreRecords); - - if (recordDebug) { - log.info(`[调试] ${displayName} 购买判断结果:`); - log.info(`[调试] 1天商品: ${foodsToBuy["1d"].join(", ")}`); - log.info(`[调试] 3天商品: ${foodsToBuy["3d"].join(", ")}`); - log.info(`[调试] 7天商品: ${foodsToBuy["7d"].join(", ")}`); - log.info(`[调试] 周四商品: ${foodsToBuy["thu"].join(", ")}`); - log.info(`[调试] 每月商品: ${foodsToBuy["month"].join(", ")}`); - } - - // 合并所有要购买的食物 - const allFoodsToBuy = []; - if (foodsToBuy["1d"]) allFoodsToBuy.push(...foodsToBuy["1d"]); - if (foodsToBuy["3d"]) allFoodsToBuy.push(...foodsToBuy["3d"]); - if (foodsToBuy["7d"]) allFoodsToBuy.push(...foodsToBuy["7d"]); - if (foodsToBuy["thu"]) allFoodsToBuy.push(...foodsToBuy["thu"]); - if (foodsToBuy["month"]) allFoodsToBuy.push(...foodsToBuy["month"]); - - if (allFoodsToBuy.length === 0) { - logConditional(`${displayName} 没有需要购买的商品`); - return { - purchased: [], - "1d": [], - "3d": [], - "7d": [], - "thu": [], - "month": [] - }; - } - - logConditional(`${displayName} 购买列表: ${allFoodsToBuy.join(", ")}`); - - let tempFoods = [...allFoodsToBuy]; - const purchasedFoods = []; - const purchasedByType = { - "1d": [], - "3d": [], - "7d": [], - "thu": [], - "month": [] - }; - - // 构建商品到刷新类型的映射 - const foodToRefreshType = {}; - for (const type of ["1d", "3d", "7d", "thu", "month"]) { - if (foodsToBuy[type]) { - for (const food of foodsToBuy[type]) { - foodToRefreshType[food] = type; - } - } - } - - // 多页购买 - for (let i = 0; i < npc.page; i++) { - await sleep(520); - // 获取一张截图 - let captureRegion = captureGameRegion(); - - // 记录已经购买的物品 - let boughtFoods = new Set([]); - - // 匹配商品 - for (let item of tempFoods) { - if (recordDebug) { - log.info(`[调试] 尝试购买: ${item}`); - } - - // 直接从映射表中获取识别对象 - const ro = foodROMap[item]; - if (!ro) { - log.warn(`商品 "${item}" 未启用或没有识别对象,跳过`); - continue; - } - - let resList = captureRegion.FindMulti(ro); - - for (let res of resList) { - if (recordDebug) { - log.info(`[调试] 找到物品: ${item} 位置(${res.x},${res.y},${res.width},${res.height})`); - } - // 移除已购买的物品 - 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); - - // 记录购买的商品 - purchasedFoods.push(item); - const refreshType = foodToRefreshType[item]; - if (refreshType) { - purchasedByType[refreshType].push(item); - - // 立即更新记录 - npcRecords = updateNpcRecord(npcRecords, npc.name, refreshType, purchasedByType[refreshType]); - await saveNpcRecords(npcRecords); - } - - await sleep(1500); - // 重新截图 - captureRegion = captureGameRegion(); - } - else { - log.info(`购买失败: ${item}, 背包已经满或商品已售罄`); - } - } - } - - captureRegion.dispose(); - // 从已购买物品中移除 - tempFoods = tempFoods.filter(item => !boughtFoods.has(item)); - - // 若不是最后一页且还有未购买的物品 - if (tempFoods.length > 0 && i !== npc.page - 1) { - logConditional("切换到下一页商品"); - await nextFoodsPage(); - - // 最后一次切换界面, 等待UI回弹 - if (i === npc.page - 2) { - logConditional("等待界面回弹"); - await sleep(520); - } - } - } - - if (purchasedFoods.length > 0) { - log.info(`${displayName} 购买完成,成功购买: ${purchasedFoods.join(", ")}`); - } else { - logConditional(`${displayName} 没有成功购买任何商品`); - } - - // 返回购买结果 - return { - purchased: purchasedFoods, - "1d": purchasedByType["1d"], - "3d": purchasedByType["3d"], - "7d": purchasedByType["7d"], - "thu": purchasedByType["thu"], - "month": purchasedByType["month"] - }; -} - -// 初始化商人商品 -async function initNpcData(records) { - for (let [key, npc] of Object.entries(npcData)) { - // 检查是否通过标签禁用 - if (npc.tags && Array.isArray(npc.tags)) { - const hasDisabledTag = npc.tags.some(tag => disabledTags.includes(tag)); - if (hasDisabledTag) { - npc.enable = false; - logConditional(`按标签禁用商人: ${npc.name} (标签: ${npc.tags.join(", ")})`); - continue; - } - } - - const npcRecord = getNpcRecord(records, npc.name); - - // 判断是否需要强制刷新 - const forceRefresh = ignoreRecords; - - // 判断需要购买的商品(这里只是检查是否有商品需要购买) - const gameTime = getGameTime(); - const currentPeriod = getBasePeriod(gameTime); - const foodsToBuy = shouldBuyFoods(npc, npcRecord, currentPeriod, forceRefresh); - - // 检查是否有需要购买的商品 - const hasFoodsToBuy = foodsToBuy["1d"].length > 0 || - foodsToBuy["3d"].length > 0 || - foodsToBuy["7d"].length > 0 || - foodsToBuy["thu"].length > 0 || - foodsToBuy["month"].length > 0; - - npc.enable = npc.enable && hasFoodsToBuy; - - if (recordDebug && !npc.enable && hasFoodsToBuy) { - const displayName = getDisplayNameFromPath(npc.path); - log.info(`${displayName} 有商品需要购买但商人被禁用`); - } - } -} - -(async function () { - try { - // ==================== 确定账号名 ==================== - let rawUserName = settings.userName ? settings.userName.trim() : ""; - if (!rawUserName) { - log.info("settings.userName 为空,尝试从游戏获取UID作为账户名..."); - const uid = await getUidFromGame(); - if (uid) { - userName = uid; - log.info(`使用UID作为账户名: ${userName}`); - } else { - userName = "默认账户"; - log.warn("无法获取UID,使用默认账户"); - } - } else { - userName = validateUserName(rawUserName); - if (userName !== rawUserName) { - log.info(`账户名已清理: ${userName}`); - settings.userName = userName; - } - } - - log.info(`当前账户: ${userName}`); - - // ==================== 加载外部数据 ==================== - if (!await loadExternalData()) { - log.error("商人数据加载失败,脚本终止"); - return; - } - const skip = settings.skip || false; - - // ==================== 初始化识别对象 ==================== - await initRo(); - - logConditional("识别对象初始化完成"); - - // ==================== 加载商人购买记录 ==================== - let npcRecords = await loadNpcRecords(); - - logConditional(`已加载 ${npcRecords.length} 个商人的购买记录`); - - if (recordDebug && npcRecords.length > 0) { - log.info("[调试] 当前商人记录:"); - npcRecords.forEach(record => { - log.info(`[调试] ${record.npcname}:`); - if (record["1d_time"]) log.info(`[调试] 1天刷新: ${record["1d_time"]}`); - if (record["3d_time"]) log.info(`[调试] 3天刷新: ${record["3d_time"]}`); - if (record["7d_time"]) log.info(`[调试] 7天刷新: ${record["7d_time"]}`); - if (record["thu_time"]) log.info(`[调试] 周四刷新: ${record["thu_time"]}`); - if (record["month_time"]) log.info(`[调试] 每月刷新: ${record["month_time"]}`); - }); - } - - // ==================== 初始化商人数据 ==================== - await initNpcData(npcRecords); - - logConditional("商人数据初始化完成"); - - // 统计启用的商人数量 - const enabledNpcs = Object.values(npcData).filter(npc => npc.enable); - log.info(`本次执行将处理 ${enabledNpcs.length} 个商人`); - - // ==================== 自动购买 ==================== - // 获取当前时间和周期 - const gameTime = getGameTime(); - const currentPeriod = getBasePeriod(gameTime); - - if (recordDebug) { - log.info(`[调试] 当前游戏时间: ${formatDateToLocalISO(gameTime)}`); - log.info(`[调试] 当前周期信息: 3天周期=${currentPeriod.threeDayPeriod}, 7天周期=${currentPeriod.sevenDayPeriod}`); - } - - let npcIndex = 0; - for (let [key, npc] of Object.entries(npcData)) { - if (npc.enable) { - npcIndex++; - // 获取显示名称(从路径中提取) - const displayName = getDisplayNameFromPath(npc.path); - log.info(`当前进度:${npcIndex}/${enabledNpcs.length}`); - log.info(`开始前往: ${displayName}`); // 修改这里 - - await genshin.returnMainUi(); - - // 地图追踪开始 - await fakeLog(displayName, false, true, 0); - - // 设置游戏时间 - if (npc.time === "night") { - // 设置为晚上8点 - await genshin.setTime(20, 0, skip); - } - else if (npc.time === "day") { - // 设置为早上8点 - await genshin.setTime(8, 0, skip); - } - - await autoPath(npc.path); - await spikChat(npc.name); - - // 购买商品,传入当前记录和周期 - const purchaseResult = await buyFoods(key, npcRecords, currentPeriod); - - // 返回主界面 - await genshin.returnMainUi(); - log.info(`完成: ${displayName}`); - - // 伪造日志任务结束 - await fakeLog(displayName, false, false, 0); - - // 商人之间等待 - if (npcIndex < enabledNpcs.length) { - logConditional("等待1.5秒后处理下一个商人"); - await sleep(1500); - } - } - else { - if (recordDebug) { - log.info(`[调试] 跳过未启用的商人: ${npc.name}`); - } - } - } - - log.info("=== 商品购买脚本执行完成 ==="); - - } catch (error) { - log.error(`执行时发生错误: ${error.message}`); - } - +// fakeLog 函数,使用方法:将本函数放在主函数前,调用时请务必使用await,否则可能出现v8白框报错 +// 在js开头处伪造该js结束运行的日志信息,如 await fakeLog("js脚本", true, true, 0); +// 在js结尾处伪造该js开始运行的日志信息,如 await fakeLog("js脚本", true, false, 2333); +// duration项目仅在伪造结束信息时有效,且无实际作用,可以任意填写,当你需要在日志中输出特定值时才需要,单位为毫秒 +// 在调用地图追踪前伪造该地图追踪开始运行的日志信息,如 await fakeLog(`地图追踪.json`, false, true, 0); +// 在调用地图追踪后伪造该地图追踪结束运行的日志信息,如 await fakeLog(`地图追踪.json`, false, false, 0); +// 如此便可以在js运行过程中伪造地图追踪的日志信息,可以在日志分析等中查看 +// name: 字符串,表示脚本或地图追踪的名称 +// isJs: 布尔值,true表示脚本,false表示地图追踪 +// isStart: 布尔值,true表示开始日志,false表示结束日志 +// duration: 整数,表示脚本或地图追踪的运行时间(仅在结束日志时使用),单位为毫秒_基本填0即可 +// 示例: +// JS脚本开始 +// await fakeLog("js脚本名", true, true, 0); +// JS脚本结束 +// await fakeLog("js脚本名", true, false, 0); +// 地图追踪开始 +// await fakeLog("地图追踪名", false, true, 0); +// 地图追踪结束 +// await fakeLog("地图追踪名", false, false, 0); +// 交互或拾取:"XXXX" +// await fakeLog("XXXX", false, false, 23333); +async function fakeLog(name, isJs, isStart, duration) { + await sleep(10); + const currentTime = Date.now(); + // 参数检查 + if (typeof name !== 'string') { + log.error("参数 'name' 必须是字符串类型!"); + return; + } + if (typeof isJs !== 'boolean') { + log.error("参数 'isJs' 必须是布尔型!"); + return; + } + if (typeof isStart !== 'boolean') { + log.error("参数 'isStart' 必须是布尔型!"); + return; + } + if (typeof duration !== 'number' || !Number.isInteger(duration)) { + log.error("参数 'duration' 必须是整数!"); + return; + } + + // 将 currentTime 转换为 Date 对象并格式化为 HH:mm:ss.sss + const date = new Date(currentTime); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + const milliseconds = String(date.getMilliseconds()).padStart(3, '0'); + const formattedTime = `${hours}:${minutes}:${seconds}.${milliseconds}`; + + // 将 duration 转换为分钟和秒,并保留三位小数 + const durationInSeconds = duration / 1000; // 转换为秒 + const durationMinutes = Math.floor(durationInSeconds / 60); + const durationSeconds = (durationInSeconds % 60).toFixed(3); // 保留三位小数 + + // 使用四个独立的 if 语句处理四种情况 + if (isJs && isStart) { + // 处理 isJs = true 且 isStart = true 的情况 + const logMessage = `正在伪造js开始的日志记录\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `------------------------------\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `→ 开始执行JS脚本: "${name}"`; + log.debug(logMessage); + } + if (isJs && !isStart) { + // 处理 isJs = true 且 isStart = false 的情况 + const logMessage = `正在伪造js结束的日志记录\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `→ 脚本执行结束: "${name}", 耗时: ${durationMinutes}分${durationSeconds}秒\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `------------------------------`; + log.debug(logMessage); + } + if (!isJs && isStart) { + // 处理 isJs = false 且 isStart = true 的情况 + const logMessage = `正在伪造地图追踪开始的日志记录\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `------------------------------\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `→ 开始执行地图追踪任务: "${name}"`; + log.debug(logMessage); + } + if (!isJs && !isStart) { + // 处理 isJs = false 且 isStart = false 的情况 + const logMessage = `正在伪造地图追踪结束的日志记录\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `→ 脚本执行结束: "${name}", 耗时: ${durationMinutes}分${durationSeconds}秒\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `------------------------------`; + log.debug(logMessage); + } + // 交互或拾取:"XXXX" + if (duration == 23333) { + log.info(`交互或拾取:"${name}"`); + } +} + +// ==================== 日志辅助函数 ==================== +function logConditional(message) { + if (ignoreRecords || recordDebug) { + log.info(message); + } else { + log.debug(message); + } +} + +// ==================== 加载外部数据文件 ==================== +let npcData = {}; + +// 存储用户要购买的商品名称集合(中文名) +let userFoodsToBuy = new Set(); +let userTagsToBuy = new Set(); // 标签名 +let allTags = new Set(); // 所有可用标签(从 npcs.json 收集) +let requiredFoods = new Set(); // 所有需要加载图片的商品 + +async function loadExternalData() { + try { + // 加载商人数据 + const npcsContent = await file.readText("assets/npcs.json"); + 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 items = foodsInput.split(/[,\s、]+/).filter(item => item.trim() !== ""); + const enabledFoodsList = []; + 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(", ")}`); + } + if (enabledTagsList.length === 0 && enabledFoodsList.length === 0) { + log.warn("用户未启用任何标签或商品"); + } + } else { + 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}`); + return false; + } +} + +// ==================== 辅助函数:获取商人的所有商品 ==================== +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)) { + return []; + } + + return foodList.filter(food => { + // 直接检查商品名是否在用户要购买的商品集合中 + const shouldBuy = userFoodsToBuy.has(food); + if (recordDebug && shouldBuy) { + log.info(`[调试] 用户选择购买: ${food}`); + } + return shouldBuy; + }); +} + +// ==================== 辅助函数:获取调整后的星期几(1-7,周一为1) ==================== +function getAdjustedDayOfWeek() { + const now = new Date(); + let dayOfWeek = now.getDay(); // 0-6 (0是周日) + const hours = now.getHours(); + + // 如果时间在00:00~04:00之间,视为前一天 + if (hours < 4) { + dayOfWeek = dayOfWeek === 0 ? 6 : dayOfWeek - 1; // 前一天 + if (recordDebug) { + log.info(`[调试] 当前时间 ${now.getHours()}:${now.getMinutes()},视为前一天(周 ${dayOfWeek === 0 ? 7 : dayOfWeek})`); + } + } else if (recordDebug) { + log.info(`[调试] 当前时间 ${now.getHours()}:${now.getMinutes()},使用当天(周 ${dayOfWeek === 0 ? 7 : dayOfWeek})`); + } + + // 转换为1-7格式(7代表周日) + return dayOfWeek === 0 ? 7 : dayOfWeek; +} + +// ==================== 辅助函数:获取给定日期所在的周一日期 ==================== +function getMondayOfWeek(date) { + const d = new Date(date); + // 调整到4点刷新 + if (d.getHours() < 4) { + d.setDate(d.getDate() - 1); + } + const day = d.getDay(); + const diff = day === 0 ? 6 : day - 1; + d.setDate(d.getDate() - diff); + d.setHours(4, 0, 0, 0); + return d; +} + +// ==================== 辅助函数:获取给定日期所在的周四日期 ==================== +function getThursdayOfWeek(date) { + const d = new Date(date); + // 调整到4点刷新 + if (d.getHours() < 4) { + d.setDate(d.getDate() - 1); + } + const day = d.getDay(); // 0=周日, 1=周一, 2=周二, 3=周三, 4=周四, 5=周五, 6=周六 + // 目标周四:如果当前<=周四,则取本周四;否则取下周四 + let targetDay = 4; // 周四对应的getDay值为4 + if (day <= targetDay) { + d.setDate(d.getDate() + (targetDay - day)); + } else { + d.setDate(d.getDate() + (7 - day + targetDay)); + } + d.setHours(4, 0, 0, 0); + return d; +} + +// ==================== 辅助函数:获取下个月1号的日期 ==================== +function getNextMonthFirstDay(date) { + const d = new Date(date); + d.setMonth(d.getMonth() + 1); + d.setDate(1); + d.setHours(4, 0, 0, 0); + return d; +} + +// ==================== 账号管理功能 ==================== +let userName; + +// 清理账户名,防止路径非法字符 +function validateUserName(name) { + if (typeof name !== 'string' || name.trim() === '') return '默认账户'; + // 替换 Windows 路径非法字符,并去除首尾空格 + return name.trim().replace(/[\\/:*?"<>|]/g, '_'); +} + +async function getUidFromGame() { + // 设置脚本环境的游戏分辨率和DPI缩放 + setGameMetrics(3840, 2160, 1.5); + + // 确保回到主界面 + await genshin.returnMainUi(); + await sleep(1000); + + // 打开派蒙菜单 + keyPress("G"); + await sleep(500); + + // 加载退出按钮识别图(需要 assets/images/Exit.png 存在) + let imageExitRo; + try { + imageExitRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/images/Exit.png")); + imageExitRo.Threshold = 0.8; + } catch (e) { + log.warn("无法加载 assets/Exit.png,将使用固定延时等待菜单打开"); + } + + if (imageExitRo) { + // 等待退出按钮出现,最多5秒 + const startTime = Date.now(); + while (Date.now() - startTime < 5000) { + let capture = captureGameRegion(); + if (capture.Find(imageExitRo).isExist()) { + capture.dispose(); + break; + } + capture.dispose(); + await sleep(500); + } + } else { + await sleep(2000); // 无图片则直接等待2秒 + } + + // OCR识别UID + let gameRegion = captureGameRegion(); + let ocrResult = gameRegion.Find(RecognitionObject.Ocr(1679, 1048, 200, 28)); + gameRegion.dispose(); + + let uid = ""; + if (ocrResult.isExist() && ocrResult.text) { + uid = ocrResult.text.replace(/\D/g, ''); // 只保留数字 + } + + // 关闭派蒙菜单 + keyPress("ESCAPE"); + await sleep(500); + await genshin.returnMainUi(); + + if (uid && uid.length >= 5) { // UID通常9位,至少5位 + log.info(`从游戏获取到UID: ${uid}`); + return uid; + } else { + log.warn("无法从游戏获取UID"); + return null; + } +} + +// 确保设置变量存在 +const ignoreRecords = settings.ignoreRecords || false; +const recordDebug = settings.recordDebug || false; + +// 解析禁用的标签列表 +const disabledTags = (settings.disabledTags || "").split(/[,\s、]+/).filter(tag => tag.trim() !== ""); +if (disabledTags.length > 0) { + log.info(`已禁用标签: ${disabledTags.join(", ")}`); +} + +// 修改AKF设置处理 +const AKFValue = parseInt(settings.AKF) || 1; +let AFKDay = null; +let followSystem = false; + +if (AKFValue === 0) { + // 0 表示跟随系统判定 + followSystem = true; + log.info("每周商品购买: 跟随系统判定"); +} else { + AFKDay = AKFValue === 7 ? 0 : AKFValue; + log.info(`每周商品购买: 每周${AFKDay === 0 ? "日" : AFKDay}购买`); +} + +// 获取账号记录路径 +function getRecordPath(accountName) { + // 简单处理账户名,如果为空则使用默认账户 + if (!accountName || accountName.trim() === "") { + accountName = "默认账户"; + } + return `record/${accountName.trim()}/records.json`; +} + +// ==================== 新增函数:读取商人记录文件 ==================== +async function loadNpcRecords() { + const recordPath = getRecordPath(userName); + try { + const content = await file.readText(recordPath); + if (content.trim()) { + return JSON.parse(content); + } + } catch (error) { + // 文件不存在或格式错误,返回空数组 + } + return []; +} + +// ==================== 辅助函数:从路径中提取显示名称 ==================== +function getDisplayNameFromPath(path) { + try { + // 从路径中提取文件名(不带.json扩展名) + // 例如:assets/path/璃月-璃月港-阿桂.json → 璃月-璃月港-阿桂 + const fileName = path.split('/').pop(); // 获取最后一部分 + return fileName.replace('.json', ''); // 移除.json扩展名 + } catch (error) { + // 如果解析失败,返回原始路径或默认值 + return path || "未知位置"; + } +} + +// ==================== 保存商人记录 ==================== +async function saveNpcRecords(records) { + const recordPath = getRecordPath(userName); + try { + await file.writeText(recordPath, JSON.stringify(records, null, 2)); + return true; + } catch (error) { + log.error(`保存记录文件失败: ${error.message}`); + return false; + } +} + +// ==================== 获取商人记录 ==================== +function getNpcRecord(records, npcName) { + return records.find(record => record.npcname === npcName); +} + +// ==================== 更新商人记录 ==================== +function updateNpcRecord(records, npcName, refreshType, purchasedItems) { + // 如果没有购买任何商品,不更新记录 + if (!purchasedItems || purchasedItems.length === 0) { + return records; + } + + 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 + }; + records.push(record); + } + + const now = new Date(); + let refreshTime; + + if (refreshType === "1d") { + // 1天商品:下次刷新是购买日+1天 + refreshTime = new Date(now); + refreshTime.setHours(4, 0, 0, 0); + // 如果当前时间在4点前,刷新时间从昨天开始算 + if (now.getHours() < 4) { + refreshTime.setDate(refreshTime.getDate() - 1); + } + refreshTime.setDate(refreshTime.getDate() + 1); + } else if (refreshType === "3d") { + // 3天商品:基于基准日的3天周期计算 + // 基准时间:2025-08-09 04:00 GMT+8 (转换为本地时间) + const baseTime = new Date(2025, 7, 9, 4, 0, 0); // 2025-08-09 04:00 + + // 调整当前时间到4点基准 + const adjustedNow = new Date(now); + if (adjustedNow.getHours() < 4) { + adjustedNow.setDate(adjustedNow.getDate() - 1); + } + adjustedNow.setHours(4, 0, 0, 0); + + // 计算距离基准日的天数 + const timeDiff = adjustedNow.getTime() - baseTime.getTime(); + const daysDiff = Math.floor(timeDiff / (1000 * 60 * 60 * 24)); + + // 计算当前3天周期 + const currentPeriod = Math.floor(daysDiff / 3); + + // 下一个3天周期的开始时间 + const nextPeriod = currentPeriod + 1; + refreshTime = new Date(baseTime); + refreshTime.setDate(baseTime.getDate() + (nextPeriod * 3)); + + // 确保刷新时间是04:00 + refreshTime.setHours(4, 0, 0, 0); + } else if (refreshType === "7d") { + // 7天商品(周一刷新):下次刷新是下周一 + refreshTime = getMondayOfWeek(now); + refreshTime.setDate(refreshTime.getDate() + 7); + } 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); + + // 计算下次刷新日期 + if (recordDebug) { + const nextRefresh = new Date(refreshTime); + log.info(`${npcName} 下次${refreshType}刷新时间: ${formatDateToLocalISO(nextRefresh)}`); + } + + return records; +} + +// ==================== 计算3天刷新商品基准日周期 ==================== +function getBasePeriod(currentDate) { + // 基准时间:2025-08-08 20:00 UTC (对应2025-08-09 04:00 GMT+8) + const baseTime = Date.UTC(2025, 7, 8, 20, 0, 0); + + // 转换当前时间到UTC+8 + const utcNowMs = currentDate.getTime() + currentDate.getTimezoneOffset() * 60 * 1000; + const gmt8Ms = utcNowMs + 8 * 60 * 60 * 1000; + const gmt8Date = new Date(gmt8Ms); + + // 如果还没到凌晨4点,算作前一天 + if (gmt8Date.getHours() < 4) { + gmt8Date.setDate(gmt8Date.getDate() - 1); + } + + // 计算距离基准日的天数 + const daysDiff = Math.floor((gmt8Date.getTime() - baseTime) / (24 * 60 * 60 * 1000)); + + return { + day: gmt8Date, + daysDiff: daysDiff, + threeDayPeriod: Math.floor(daysDiff / 3), + sevenDayPeriod: Math.floor(daysDiff / 7) + }; +} + +// ==================== 判断是否需要购买 ==================== +function shouldBuyFoods(npc, npcRecord, currentPeriod, forceRefresh = false) { + const now = new Date(); + const foodsToBuy = { + "1d": [], + "3d": [], + "7d": [], + "thu": [], + "month": [] + }; + + // 首先检查禁用(此处假设之前已检查过,但为防止遗漏,可再加一道保险) + // 实际上禁用检查在更外层(initNpcData 和主循环)已经处理,这里可以省略 + + if (forceRefresh) { + // 强制刷新:决定使用完整列表还是具体商品列表 + // 先判断是否命中标签 + 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, 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 = candidateList.filter(food => !purchasedList.includes(food)); + + if (!npcRecord || !npcRecord[`${type}_time`]) { + return candidateList; // 从未买过,全部尝试 + } + + const nextRefreshTime = new Date(npcRecord[`${type}_time`]); + if (now >= nextRefreshTime) { + return candidateList; // 已刷新,全部尝试 + } else { + return notPurchased; // 未刷新,只尝试未购买过的 + } + } + + 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; +} + +const othrtRo = { + "buy": { + "name": "购买按钮", + "file": "assets/images/buyBtn.png" + } +} + +// 获取游戏内时间(考虑4点刷新) +function getGameTime() { + const now = new Date(); + const utcNowMs = now.getTime() + now.getTimezoneOffset() * 60 * 1000; + const gmt8Ms = utcNowMs + 8 * 60 * 60 * 1000; + const gmt8Date = new Date(gmt8Ms); + + // 如果还没到凌晨4点,算作前一天 + if (gmt8Date.getHours() < 4) { + gmt8Date.setDate(gmt8Date.getDate() - 1); + } + + return gmt8Date; +} + +// ==================== 新增函数:格式化为本地ISO时间 ==================== +function formatDateToLocalISO(date) { + // 将日期格式化为 "YYYY-MM-DDTHH:mm:ss+08:00" 格式 + const pad = (n) => n.toString().padStart(2, '0'); + + const year = date.getFullYear(); + const month = pad(date.getMonth() + 1); + const day = pad(date.getDate()); + const hours = pad(date.getHours()); + const minutes = pad(date.getMinutes()); + const seconds = pad(date.getSeconds()); + + return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}+08:00`; +} + +// 地图追踪 +async function autoPath(locationPath) { + try { + let filePath = locationPath; + await pathingScript.runFile(filePath); + await sleep(200); + + return true; + } catch (error) { + log.error(`执行路径时发生错误: ${error.message}`); + return false; + } +} + +// 平滑过渡函数(缓动效果) +function smoothStep(t) { + return t * t * (3 - 2 * t); +} + +// 模拟鼠标移动到指定位置(带曲线路径) +async function naturalMove(initX, initY, targetX, targetY, duration, wiggle = 30) { + + // 生成控制点(使路径形成曲线) + const controlX = (initX + targetX) / 2 + (Math.random() * wiggle * 2 - wiggle); + const controlY = (initY + targetY) / 2 + (Math.random() * wiggle * 2 - wiggle); + + const steps = Math.max(duration / 20, 10); // 计算步数 + + for (let i = 0; i <= steps; i++) { + const progress = i / steps; + const t = smoothStep(progress); // 使用平滑过渡 + + // 二次贝塞尔曲线计算 + const x = (1 - t) * (1 - t) * initX + 2 * (1 - t) * t * controlX + t * t * targetX; + const y = (1 - t) * (1 - t) * initY + 2 * (1 - t) * t * controlY + t * t * targetY; + + moveMouseTo(Math.trunc(x), Math.trunc(y)); + + // 随机延迟使移动更自然 + await sleep(Math.trunc(duration / steps * (0.8 + Math.random() * 0.4))); + } + + await sleep(200); + // 确保最终位置准确 + moveMouseTo(targetX, targetY); +} + +// 切换下一页商品 +async function nextFoodsPage() { + //设置脚本环境的游戏分辨率和DPI缩放 + setGameMetrics(3840, 2160, 1.5); + + let [initX, initY] = [1500, 1850]; + let [targetX, targetY] = [1800, 260]; + + moveMouseTo(initX, initY); + leftButtonDown(); + await naturalMove(initX, initY, targetX, targetY, 300); + + // 按住了, 防止弹太远 + await sleep(520); + leftButtonUp(); +} + +// 快速购买 +async function qucikBuy() { + //设置脚本环境的游戏分辨率和DPI缩放 + setGameMetrics(3840, 2160, 1.5); + + let [buyBtnX, buyBtnY] = [3200, 2045]; + let [confirmBtnX, confirmBtnY] = [2025, 1570]; + let [addNumX, addNumY] = [2060, 1208]; + + // 等待界面切换 + await sleep(200); + + try { + // 查找购买按钮 + let captureRegion = captureGameRegion(); + let buyBtn = captureRegion.Find(othrtRo.buy.ro); + captureRegion.dispose(); + + if (buyBtn.isEmpty()) { + log.warn("未找到购买按钮"); + return false; + } + + // 点击购买按钮 + click(buyBtn.x * 2 + buyBtn.width, buyBtn.y * 2 + buyBtn.height); + // 等待购买窗口弹出 + await sleep(300); + + // 增加数量至最大 + leftButtonDown(); + await naturalMove(addNumX, addNumY, addNumX + 666, addNumY - 233, 100); + leftButtonUp(); + + // 确保最终数量至最大 + await sleep(200); + click(2370, 1208); + await sleep(200); + + // 点击确认按钮 + click(confirmBtnX, confirmBtnY); + // 等待购买完成 + await sleep(1200); + // 点击空白关闭 + click(buyBtnX, buyBtnY); + await sleep(200); + + return true; + } catch (error) { + log.error(`快速购买失败: ${error.message}`); + return false; + } +} + +// 跳过对话 +async function spikChat(npcName) { + let count = 6; // 添加let声明 + await sleep(1000); + if (npcName == "布纳马" || npcName == "杜拉夫") { + // 设置脚本环境的游戏分辨率和DPI缩放 + setGameMetrics(1920, 1080, 1); + + // 交互 + let loop_count = 3; + if (npcName == "布纳马") { + loop_count = 3; + } else if (npcName == "杜拉夫") { + loop_count = 2; + } + + for (let i = 0; i < loop_count; i++) { + keyPress("VK_F"); + await sleep(1500); + } + + // 点击有什么卖的 + 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(); + } + } + + await sleep(1500); + keyPress("VK_F"); + await sleep(1500); + keyPress("VK_F"); + await sleep(1500); + } else { + for (let i = 0; i < count; i++) { + keyPress("VK_F"); + await sleep(1500); + } + } +} + +// ==================== 商品识别对象映射表 ==================== +let foodROMap = {}; // 键为商品名(中文),值为 RecognitionObject + +// 加载识别对象(只加载用户选择的商品) +async function initRo() { + try { + for (let foodName of requiredFoods) { + const imagePath = `assets/images/${foodName}.png`; + try { + const ro = RecognitionObject.TemplateMatch(file.ReadImageMatSync(imagePath)); + ro.Threshold = 0.75; + ro.Use3Channels = true; + foodROMap[foodName] = ro; + logConditional(`已启用商品: ${foodName}`); + } catch (e) { + 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(`总共启用了 ${requiredFoods.size} 种商品`); + return true; + } + catch (error) { + log.error("加载识别对象时发生错误: {error}", error.message); + throw error; + } +} + +// 主要购买逻辑 +async function buyFoods(npcName, npcRecords, currentPeriod) { + // 设置脚本环境的游戏分辨率和DPI缩放 + setGameMetrics(3840, 2160, 1.5); + + // 获取商人数据 + const npc = npcData[npcName]; + const npcRecord = getNpcRecord(npcRecords, npc.name); + + // 获取显示名称 + const displayName = getDisplayNameFromPath(npc.path); + + if (recordDebug) { + log.info(`[调试] 开始处理: ${displayName}`); + if (npcRecord) { + log.info(`[调试] 当前记录: 1d=${npcRecord["1d_time"] || "无"}, 3d=${npcRecord["3d_time"] || "无"}, 7d=${npcRecord["7d_time"] || "无"}, thu=${npcRecord["thu_time"] || "无"}, month=${npcRecord["month_time"] || "无"}`); + } + } + + // 判断需要购买的商品 + const foodsToBuy = shouldBuyFoods(npc, npcRecord, currentPeriod, ignoreRecords); + + if (recordDebug) { + log.info(`[调试] ${displayName} 购买判断结果:`); + log.info(`[调试] 1天商品: ${foodsToBuy["1d"].join(", ")}`); + log.info(`[调试] 3天商品: ${foodsToBuy["3d"].join(", ")}`); + log.info(`[调试] 7天商品: ${foodsToBuy["7d"].join(", ")}`); + log.info(`[调试] 周四商品: ${foodsToBuy["thu"].join(", ")}`); + log.info(`[调试] 每月商品: ${foodsToBuy["month"].join(", ")}`); + } + + // 合并所有要购买的食物 + const allFoodsToBuy = []; + if (foodsToBuy["1d"]) allFoodsToBuy.push(...foodsToBuy["1d"]); + if (foodsToBuy["3d"]) allFoodsToBuy.push(...foodsToBuy["3d"]); + if (foodsToBuy["7d"]) allFoodsToBuy.push(...foodsToBuy["7d"]); + if (foodsToBuy["thu"]) allFoodsToBuy.push(...foodsToBuy["thu"]); + if (foodsToBuy["month"]) allFoodsToBuy.push(...foodsToBuy["month"]); + + if (allFoodsToBuy.length === 0) { + logConditional(`${displayName} 没有需要购买的商品`); + return { + purchased: [], + "1d": [], + "3d": [], + "7d": [], + "thu": [], + "month": [] + }; + } + + logConditional(`${displayName} 购买列表: ${allFoodsToBuy.join(", ")}`); + + let tempFoods = [...allFoodsToBuy]; + const purchasedFoods = []; + const purchasedByType = { + "1d": [], + "3d": [], + "7d": [], + "thu": [], + "month": [] + }; + + // 构建商品到刷新类型的映射 + const foodToRefreshType = {}; + for (const type of ["1d", "3d", "7d", "thu", "month"]) { + if (foodsToBuy[type]) { + for (const food of foodsToBuy[type]) { + foodToRefreshType[food] = type; + } + } + } + + // 多页购买 + for (let i = 0; i < npc.page; i++) { + await sleep(520); + // 获取一张截图 + let captureRegion = captureGameRegion(); + + // 记录已经购买的物品 + let boughtFoods = new Set([]); + + // 匹配商品 + for (let item of tempFoods) { + if (recordDebug) { + log.info(`[调试] 尝试购买: ${item}`); + } + + // 直接从映射表中获取识别对象 + const ro = foodROMap[item]; + if (!ro) { + log.warn(`商品 "${item}" 未启用或没有识别对象,跳过`); + continue; + } + + let resList = captureRegion.FindMulti(ro); + + for (let res of resList) { + if (recordDebug) { + log.info(`[调试] 找到物品: ${item} 位置(${res.x},${res.y},${res.width},${res.height})`); + } + // 移除已购买的物品 + 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); + + // 记录购买的商品 + purchasedFoods.push(item); + const refreshType = foodToRefreshType[item]; + if (refreshType) { + purchasedByType[refreshType].push(item); + + // 立即更新记录 + npcRecords = updateNpcRecord(npcRecords, npc.name, refreshType, purchasedByType[refreshType]); + await saveNpcRecords(npcRecords); + } + + await sleep(1500); + // 重新截图 + captureRegion = captureGameRegion(); + } + else { + log.info(`购买失败: ${item}, 背包已经满或商品已售罄`); + } + } + } + + captureRegion.dispose(); + // 从已购买物品中移除 + tempFoods = tempFoods.filter(item => !boughtFoods.has(item)); + + // 若不是最后一页且还有未购买的物品 + if (tempFoods.length > 0 && i !== npc.page - 1) { + logConditional("切换到下一页商品"); + await nextFoodsPage(); + + // 最后一次切换界面, 等待UI回弹 + if (i === npc.page - 2) { + logConditional("等待界面回弹"); + await sleep(520); + } + } + } + + if (purchasedFoods.length > 0) { + log.info(`${displayName} 购买完成,成功购买: ${purchasedFoods.join(", ")}`); + } else { + logConditional(`${displayName} 没有成功购买任何商品`); + } + + // 返回购买结果 + return { + purchased: purchasedFoods, + "1d": purchasedByType["1d"], + "3d": purchasedByType["3d"], + "7d": purchasedByType["7d"], + "thu": purchasedByType["thu"], + "month": purchasedByType["month"] + }; +} + +// 初始化商人商品 +async function initNpcData(records) { + for (let [key, npc] of Object.entries(npcData)) { + // 检查是否通过标签禁用 + if (npc.tags && Array.isArray(npc.tags)) { + const hasDisabledTag = npc.tags.some(tag => disabledTags.includes(tag)); + if (hasDisabledTag) { + npc.enable = false; + logConditional(`按标签禁用商人: ${npc.name} (标签: ${npc.tags.join(", ")})`); + continue; + } + } + + const npcRecord = getNpcRecord(records, npc.name); + + // 判断是否需要强制刷新 + const forceRefresh = ignoreRecords; + + // 判断需要购买的商品(这里只是检查是否有商品需要购买) + const gameTime = getGameTime(); + const currentPeriod = getBasePeriod(gameTime); + const foodsToBuy = shouldBuyFoods(npc, npcRecord, currentPeriod, forceRefresh); + + // 检查是否有需要购买的商品 + const hasFoodsToBuy = foodsToBuy["1d"].length > 0 || + foodsToBuy["3d"].length > 0 || + foodsToBuy["7d"].length > 0 || + foodsToBuy["thu"].length > 0 || + foodsToBuy["month"].length > 0; + + npc.enable = npc.enable && hasFoodsToBuy; + + if (recordDebug && !npc.enable && hasFoodsToBuy) { + const displayName = getDisplayNameFromPath(npc.path); + log.info(`${displayName} 有商品需要购买但商人被禁用`); + } + } +} + +(async function () { + try { + // ==================== 确定账号名 ==================== + let rawUserName = settings.userName ? settings.userName.trim() : ""; + if (!rawUserName) { + log.info("settings.userName 为空,尝试从游戏获取UID作为账户名..."); + const uid = await getUidFromGame(); + if (uid) { + userName = uid; + log.info(`使用UID作为账户名: ${userName}`); + } else { + userName = "默认账户"; + log.warn("无法获取UID,使用默认账户"); + } + } else { + userName = validateUserName(rawUserName); + if (userName !== rawUserName) { + log.info(`账户名已清理: ${userName}`); + settings.userName = userName; + } + } + + log.info(`当前账户: ${userName}`); + + // ==================== 加载外部数据 ==================== + if (!await loadExternalData()) { + log.error("商人数据加载失败,脚本终止"); + return; + } + const skip = settings.skip || false; + + // ==================== 初始化识别对象 ==================== + await initRo(); + + logConditional("识别对象初始化完成"); + + // ==================== 加载商人购买记录 ==================== + let npcRecords = await loadNpcRecords(); + + logConditional(`已加载 ${npcRecords.length} 个商人的购买记录`); + + if (recordDebug && npcRecords.length > 0) { + log.info("[调试] 当前商人记录:"); + npcRecords.forEach(record => { + log.info(`[调试] ${record.npcname}:`); + if (record["1d_time"]) log.info(`[调试] 1天刷新: ${record["1d_time"]}`); + if (record["3d_time"]) log.info(`[调试] 3天刷新: ${record["3d_time"]}`); + if (record["7d_time"]) log.info(`[调试] 7天刷新: ${record["7d_time"]}`); + if (record["thu_time"]) log.info(`[调试] 周四刷新: ${record["thu_time"]}`); + if (record["month_time"]) log.info(`[调试] 每月刷新: ${record["month_time"]}`); + }); + } + + // ==================== 初始化商人数据 ==================== + await initNpcData(npcRecords); + + logConditional("商人数据初始化完成"); + + // 统计启用的商人数量 + const enabledNpcs = Object.values(npcData).filter(npc => npc.enable); + log.info(`本次执行将处理 ${enabledNpcs.length} 个商人`); + + // ==================== 自动购买 ==================== + // 获取当前时间和周期 + const gameTime = getGameTime(); + const currentPeriod = getBasePeriod(gameTime); + + if (recordDebug) { + log.info(`[调试] 当前游戏时间: ${formatDateToLocalISO(gameTime)}`); + log.info(`[调试] 当前周期信息: 3天周期=${currentPeriod.threeDayPeriod}, 7天周期=${currentPeriod.sevenDayPeriod}`); + } + + let npcIndex = 0; + for (let [key, npc] of Object.entries(npcData)) { + if (npc.enable) { + npcIndex++; + // 获取显示名称(从路径中提取) + const displayName = getDisplayNameFromPath(npc.path); + log.info(`当前进度:${npcIndex}/${enabledNpcs.length}`); + log.info(`开始前往: ${displayName}`); // 修改这里 + + await genshin.returnMainUi(); + + // 地图追踪开始 + await fakeLog(displayName, false, true, 0); + + // 设置游戏时间 + if (npc.time === "night") { + // 设置为晚上8点 + await genshin.setTime(20, 0, skip); + } + else if (npc.time === "day") { + // 设置为早上8点 + await genshin.setTime(8, 0, skip); + } + + await autoPath(npc.path); + await spikChat(npc.name); + + // 购买商品,传入当前记录和周期 + const purchaseResult = await buyFoods(key, npcRecords, currentPeriod); + + // 返回主界面 + await genshin.returnMainUi(); + log.info(`完成: ${displayName}`); + + // 伪造日志任务结束 + await fakeLog(displayName, false, false, 0); + + // 商人之间等待 + if (npcIndex < enabledNpcs.length) { + logConditional("等待1.5秒后处理下一个商人"); + await sleep(1500); + } + } + else { + if (recordDebug) { + log.info(`[调试] 跳过未启用的商人: ${npc.name}`); + } + } + } + + log.info("=== 商品购买脚本执行完成 ==="); + + } catch (error) { + log.error(`执行时发生错误: ${error.message}`); + } + })(); \ No newline at end of file diff --git a/repo/js/自动购买商品/manifest.json b/repo/js/自动购买商品/manifest.json new file mode 100644 index 000000000..0f9ce2d20 --- /dev/null +++ b/repo/js/自动购买商品/manifest.json @@ -0,0 +1,25 @@ +{ + "manifest_version": 1, + "name": "自动购买商品", + "version": "3.2.7", + "description": "自动购买商品\n每天刷新商品:自动购买商品\n3天刷新商品:未到刷新日不购买该商品\n每周刷新商品:可指定每周购买商品", + "authors": [ + { + "name": "蜜柑魚", + "links": "https://github.com/this-Fish" + } + ], + "tags": [ + "自动购买", + "购买商品", + "模拟点击" + ], + "saved_files": [ + "record/" + ], + "settings_ui": "settings.json", + "main": "main.js" + +} + + diff --git a/repo/js/自动购买每天&3天&每周刷新商品/settings.json b/repo/js/自动购买商品/settings.json similarity index 96% rename from repo/js/自动购买每天&3天&每周刷新商品/settings.json rename to repo/js/自动购买商品/settings.json index e213f87ea..10e22c237 100644 --- a/repo/js/自动购买每天&3天&每周刷新商品/settings.json +++ b/repo/js/自动购买商品/settings.json @@ -1,55 +1,55 @@ -[ - { - "name": "userName", - "type": "input-text", - "label": "账号名(用于区分不同账户的记录)\n为空则读取uid作为自定义CD记录标识", - "default": "默认账户" - }, - { - "name": "foodsToBuy", - "type": "input-text", - "label": "要购买的商品(多个商品用空格分隔)\n示例:\"小麦 黑麦\"\n\n支援的 商人与商品详细 请前往 README.md 查看\n建议直接复制商品名称贴上输入栏", - "default": "小麦 黑麦" - }, - { - "name": "AKF", - "type": "select", - "label": "每周商品购买方式\n0=跟随系统周期自动判定\n1-7=指定星期几购买(1=周一,7=周日)", - "options": [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7" - ], - "default": "0" - }, - { - "name": "disabledTags", - "type": "input-text", - "label": "禁用标签\n(多个标签以空格分隔,如: 挪德卡莱 黑心商人 卡琵莉亚)", - "default": "卡琵莉亚" - }, - { - "name": "skip", - "type": "checkbox", - "label": "跳过调整时间动画", - "default": false - }, - { - "name": "ignoreRecords", - "type": "checkbox", - "label": "-----------------\n无视记录强制购买(不推荐)", - "default": false - }, - { - "name": "recordDebug", - "type": "checkbox", - "label": "调试模式(显示详细日志)", - "default": false - } - -] +[ + { + "name": "userName", + "type": "input-text", + "label": "账号名(用于区分不同账户的记录)\n为空则读取uid作为自定义CD记录标识", + "default": "默认账户" + }, + { + "name": "foodsToBuy", + "type": "input-text", + "label": "要购买的商品(多个商品用空格分隔)\n示例:\"小麦 黑麦\"\n\n支援的 商人与商品详细 请前往 README.md 查看\n建议直接复制商品名称贴上输入栏", + "default": "小麦 黑麦" + }, + { + "name": "AKF", + "type": "select", + "label": "每周商品购买方式\n0=跟随系统周期自动判定\n1-7=指定星期几购买(1=周一,7=周日)", + "options": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ], + "default": "0" + }, + { + "name": "disabledTags", + "type": "input-text", + "label": "禁用标签\n(多个标签以空格分隔,如: 挪德卡莱 黑心商人 卡琵莉亚)", + "default": "卡琵莉亚" + }, + { + "name": "skip", + "type": "checkbox", + "label": "跳过调整时间动画", + "default": false + }, + { + "name": "ignoreRecords", + "type": "checkbox", + "label": "-----------------\n无视记录强制购买(不推荐)", + "default": false + }, + { + "name": "recordDebug", + "type": "checkbox", + "label": "调试模式(显示详细日志)", + "default": false + } + +] diff --git a/repo/js/自动购买每天&3天&每周刷新商品/商人与商品支持表.md b/repo/js/自动购买商品/商人与商品支持表.md similarity index 98% rename from repo/js/自动购买每天&3天&每周刷新商品/商人与商品支持表.md rename to repo/js/自动购买商品/商人与商品支持表.md index 4c9343895..13a5c2efb 100644 --- a/repo/js/自动购买每天&3天&每周刷新商品/商人与商品支持表.md +++ b/repo/js/自动购买商品/商人与商品支持表.md @@ -73,6 +73,7 @@ | 挪德卡莱-那夏镇 | 丽切娅 | - | 甜甜花、宿影花、霜盏花 | - | | | 挪德卡莱-那夏镇 | 卡嘉 | - | - | 面粉、奶油、熏禽肉、黄油、火腿、糖、蟹黄、果酱、奶酪、培根、香肠 | | | 挪德卡莱-那夏镇 | 雷科 | - | - | 幸运儿之杯、幸运儿鹰羽、幸运儿银冠、幸运儿绿花、幸运儿沙漏 | 狗粮商人 | +| 挪德卡莱-那夏镇-旗舰 | 德米安 | 「皮拉米达的夜莺」、边陲之地、野浆果之路 | - | - | 稀少商品、独立地图 | | 挪德卡莱-皮拉米达城 | 科菲策 | 牛奶、咖啡豆 | 微光角菌、琉鳞石 | - | 黑心商人 | ### **以下为有效标签** diff --git a/repo/js/自动购买每天&3天&每周刷新商品/manifest.json b/repo/js/自动购买每天&3天&每周刷新商品/manifest.json deleted file mode 100644 index 821e40cc6..000000000 --- a/repo/js/自动购买每天&3天&每周刷新商品/manifest.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "manifest_version": 1, - "name": "自动购买每天&3天&每周刷新商品", - "version": "3.2.6", - "description": "自动购买每天&3天&每周刷新商品\n每天刷新商品:自动购买商品\n3天刷新商品:未到刷新日不购买该商品\n每周刷新商品:可指定每周购买商品", - "authors": [ - { - "name": "蜜柑魚", - "links": "https://github.com/this-Fish" - } - ], - "tags": [ - "购买商品", - "模拟点击" - ], - "saved_files": [ - "record/" - ], - "settings_ui": "settings.json", - "main": "main.js" - -} - -