From 5c1f27cce482ff44423fcce4d7bba5e9ab1648a5 Mon Sep 17 00:00:00 2001 From: ddaodan <40017293+ddaodan@users.noreply.github.com> Date: Fri, 2 May 2025 21:56:23 +0800 Subject: [PATCH] =?UTF-8?q?js:=20=E5=9C=B0=E8=84=89=E8=8A=B13.0=EF=BC=9A?= =?UTF-8?q?=E5=9C=B0=E8=84=89=E8=8A=B1=E5=AF=BB=E6=89=BE=E5=92=8C=E6=88=98?= =?UTF-8?q?=E6=96=97=E6=9B=B4=E6=96=B0=20(#633)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 地脉花寻找和战斗更新 (#2) * 初版,只改了蒙德1 * 添加纳塔7-烟谜主的路径和战斗超时设置,更新相关配置文件 * 优化寻找地脉花与开始战斗 (#1) * fix bug --------- Co-authored-by: 秋云 * fix typos. (#3) * fix:交叉循环递归导致retryCount不自增 * refactor(AutoLeyLineOutcrop): 优化地脉花处理逻辑并更新配置文件 - 将 `errorThreshold` 从 100 调整为 50,提高位置判断的精确度 - 更新 `manifest.json` 的版本号和描述,适配 BetterGI 0.44.7 - 修复 `processLeyLineOutcrop` 函数中出现的重复调用 - 移除 `openOutcrop` 函数中的无用代码 * add: 稻妻2-海祇岛 路线 * fix locate&find LeyLineOutcrop * fix retryCount导致index取值异常 * add: 璃月2-地中之盐 璃月3-瑶光滩 线路 * fix: 开启地脉花后的OCR识别逻辑 * feat: 增加两处导航领奖 1. 领取脚本运行前就已完成但未领奖励的本条线路中的第一个地脉花 2. attemptReward方法中,切换队伍后超出距离,导致无法按领奖按钮 * feat: 双倍产出支持 * feat: 非路线起始地脉花支持 * 更新 readme * add: 踏鞴砂和药蝶谷 * add: 纳塔2-流晶支脉 线路 * fix: dobuleReward is not defined * add: target json file. * feat: create_LeyLinePositions_json * 更新地脉花数量和怪物详情 * fix typos. * 新的数据结构 * refactor: 移除强制运行模式,更新README - 移除强制运行模式及其相关配置和逻辑 - 更新README,添加更新日志 * feat: 纳塔9-翘枝崖 * add: 纳塔10 * fix typos. * Update config.json * Update readme.md * add: 八酝岛,彩石顶全部路线 * Update config.json * add: 枫丹神像,容错改为40 * add: 纳塔8-花羽会 线路 * fix: 误触发领取,导致无法切换队伍 * fix: 前进超时时先挪远点角色再调整视野 * fix typos. * add: 稻妻:鸣神岛 * add: 稻妻5-清籁岛 路径 * add: 稻妻5-清籁岛 路径 * style: 校验已有路径 * fix: 稻妻2-踏鞴砂 线路缺失 * Refactor: 调整函数顺序并补充变量说明,无功能变更 * refactor: 优化好感队切换逻辑,优化标记开关,更新README * add: 蒙德最后一朵 * fix: 掉落物品导致前进的死循环;调整视野导致的鼠标移出屏幕外 * fix: 树脂耗尽时无法判断误触发领取页面 * add: 轻策庄、奥摩斯港、阿如村、荼诃落谷 * add: 无郁稠林 * feat: 支持非传送起点的路线,支持选择执行次数 * fix: typos. --------- Co-authored-by: 秋云 Co-authored-by: 起个名字好难 <25520958+MisakaAldrich@users.noreply.github.com> --- .../LeyLineOutcropData.json | 3858 +++++++++++++++++ repo/js/AutoLeyLineOutcrop/README.md | 674 ++- .../assets/archive/rerun/纳塔8-花羽会-3.json | 102 + .../js/AutoLeyLineOutcrop/assets/icon/box.png | Bin 0 -> 1018 bytes .../assets/icon/paimon_menu.png | Bin 0 -> 2372 bytes .../assets/mapPositions.json | 38 + .../rerun/枫丹1-秋分山西侧-1-rerun.json | 66 +- .../rerun/枫丹1-秋分山西侧-2-rerun.json | 70 +- .../rerun/枫丹1-秋分山西侧-3-rerun.json | 72 +- .../rerun/枫丹1-秋分山西侧-4-rerun.json | 66 +- .../rerun/枫丹1-秋分山西侧-5-rerun.json | 62 +- .../rerun/枫丹2-芒索斯山东麓-1-rerun.json | 62 +- .../rerun/枫丹2-芒索斯山东麓-2-rerun.json | 58 +- .../rerun/枫丹2-芒索斯山东麓-3-rerun.json | 63 +- .../rerun/枫丹2-芒索斯山东麓-4-rerun.json | 73 +- .../rerun/枫丹3-新枫丹科学院-1-rerun.json | 69 +- .../rerun/枫丹3-新枫丹科学院-2-rerun.json | 69 +- .../rerun/枫丹3-新枫丹科学院-3-rerun.json | 52 +- .../rerun/枫丹3-新枫丹科学院-4-rerun.json | 69 +- .../pathing/rerun/枫丹4-柔灯港-1-rerun.json | 73 +- .../pathing/rerun/枫丹4-柔灯港-2-rerun.json | 68 +- .../pathing/rerun/枫丹4-柔灯港-3-rerun.json | 73 +- .../pathing/rerun/枫丹4-柔灯港-4-rerun.json | 74 +- .../rerun/枫丹5-秋分山东侧-1-rerun.json | 62 +- .../rerun/枫丹5-秋分山东侧-2-rerun.json | 62 +- .../rerun/枫丹5-秋分山东侧-3-rerun.json | 72 +- .../rerun/枫丹5-秋分山东侧-4-rerun.json | 70 +- .../pathing/rerun/枫丹6-厄里那斯-1-rerun.json | 64 +- .../pathing/rerun/枫丹6-厄里那斯-2-rerun.json | 64 +- .../pathing/rerun/枫丹6-厄里那斯-3-rerun.json | 70 +- .../pathing/rerun/枫丹6-厄里那斯-4-rerun.json | 72 +- .../pathing/rerun/枫丹6-厄里那斯-5-rerun.json | 70 +- .../pathing/rerun/枫丹6-厄里那斯-6-rerun.json | 64 +- .../pathing/rerun/璃月2-地中之盐-1-rerun.json | 30 + .../pathing/rerun/璃月2-地中之盐-2-rerun.json | 57 + .../pathing/rerun/璃月2-地中之盐-3-rerun.json | 48 + .../pathing/rerun/璃月2-地中之盐-4-rerun.json | 39 + .../pathing/rerun/璃月3-瑶光滩-1-rerun.json | 31 + .../pathing/rerun/璃月3-瑶光滩-2-rerun.json | 93 + .../pathing/rerun/璃月3-瑶光滩-3-rerun.json | 48 + .../pathing/rerun/璃月3-瑶光滩-4-rerun.json | 39 + .../pathing/rerun/璃月3-瑶光滩-5-rerun.json | 57 + .../pathing/rerun/稻妻1-鸣神岛-1-rerun.json | 39 + .../pathing/rerun/稻妻1-鸣神岛-2-rerun.json | 57 + .../pathing/rerun/稻妻1-鸣神岛-3-rerun.json | 48 + .../pathing/rerun/稻妻1-鸣神岛-4-rerun.json | 66 + .../pathing/rerun/稻妻5-清籁岛-1-rerun.json | 48 + .../pathing/rerun/稻妻5-清籁岛-2-rerun.json | 57 + .../pathing/rerun/稻妻5-清籁岛-3-rerun.json | 39 + .../pathing/rerun/稻妻5-清籁岛-4-rerun.json | 39 + .../pathing/rerun/稻妻5-清籁岛-5-rerun.json | 57 + .../pathing/rerun/纳塔1-隆崛坡-4-rerun.json | 33 +- .../pathing/rerun/纳塔10-溶水域-1-rerun.json | 48 + .../pathing/rerun/纳塔10-溶水域-2-rerun.json | 48 + .../pathing/rerun/纳塔10-溶水域-3-rerun.json | 66 + .../pathing/rerun/纳塔10-溶水域-4-rerun.json | 75 + .../pathing/rerun/纳塔2-硫晶支脉-1-rerun.json | 39 + .../pathing/rerun/纳塔2-硫晶支脉-2-rerun.json | 30 + .../pathing/rerun/纳塔2-硫晶支脉-3-rerun.json | 30 + .../pathing/rerun/纳塔2-硫晶支脉-4-rerun.json | 39 + .../pathing/rerun/纳塔7-烟谜主-1-rerun.json | 49 + .../pathing/rerun/纳塔7-烟谜主-2-rerun.json | 48 + .../pathing/rerun/纳塔7-烟谜主-3-rerun.json | 57 + .../pathing/rerun/纳塔8-花羽会-1-rerun.json | 48 + .../pathing/rerun/纳塔8-花羽会-2-rerun.json | 39 + .../pathing/rerun/纳塔8-花羽会-3-rerun.json | 57 + .../pathing/rerun/纳塔9-翘枝崖-1-rerun.json | 39 + .../pathing/rerun/纳塔9-翘枝崖-2-rerun.json | 57 + .../pathing/rerun/纳塔9-翘枝崖-3-rerun.json | 75 + .../pathing/rerun/纳塔9-翘枝崖-4-rerun.json | 39 + .../pathing/rerun/须弥1-无郁稠林-4-rerun.json | 66 + .../rerun/须弥2-奥摩斯港西-1-rerun.json | 48 + .../rerun/须弥2-奥摩斯港西-2-rerun.json | 48 + .../rerun/须弥2-奥摩斯港西-3-rerun.json | 39 + .../rerun/须弥2-奥摩斯港西-4-rerun.json | 57 + .../rerun/须弥2-奥摩斯港西-5-rerun.json | 66 + .../pathing/rerun/须弥5-阿如村-1-rerun.json | 66 + .../pathing/rerun/须弥5-阿如村-2-rerun.json | 84 + .../pathing/rerun/须弥5-阿如村-3-rerun.json | 149 + .../pathing/rerun/须弥5-阿如村-4-rerun.json | 187 + .../pathing/rerun/须弥5-阿如村-5-rerun.json | 214 + .../pathing/target/枫丹1-秋分山西侧-1.json | 22 + .../pathing/target/枫丹1-秋分山西侧-2.json | 21 + .../pathing/target/枫丹1-秋分山西侧-3.json | 21 + .../pathing/target/枫丹1-秋分山西侧-4.json | 21 + .../pathing/target/枫丹1-秋分山西侧-5.json | 21 + .../pathing/target/枫丹2-芒索斯山东麓-1.json | 21 + .../pathing/target/枫丹2-芒索斯山东麓-2.json | 21 + .../pathing/target/枫丹2-芒索斯山东麓-3.json | 22 + .../pathing/target/枫丹2-芒索斯山东麓-4.json | 22 + .../pathing/target/枫丹3-新枫丹科学院-1.json | 22 + .../pathing/target/枫丹3-新枫丹科学院-2.json | 22 + .../pathing/target/枫丹3-新枫丹科学院-3.json | 21 + .../pathing/target/枫丹3-新枫丹科学院-4.json | 22 + .../assets/pathing/target/枫丹4-柔灯港-1.json | 22 + .../assets/pathing/target/枫丹4-柔灯港-2.json | 21 + .../assets/pathing/target/枫丹4-柔灯港-3.json | 22 + .../assets/pathing/target/枫丹4-柔灯港-4.json | 22 + .../pathing/target/枫丹5-秋分山东侧-1.json | 21 + .../pathing/target/枫丹5-秋分山东侧-2.json | 21 + .../pathing/target/枫丹5-秋分山东侧-3.json | 21 + .../pathing/target/枫丹5-秋分山东侧-4.json | 22 + .../pathing/target/枫丹6-厄里那斯-1.json | 21 + .../pathing/target/枫丹6-厄里那斯-2.json | 21 + .../pathing/target/枫丹6-厄里那斯-3.json | 21 + .../pathing/target/枫丹6-厄里那斯-4.json | 21 + .../pathing/target/枫丹6-厄里那斯-5.json | 21 + .../pathing/target/枫丹6-厄里那斯-6.json | 21 + .../assets/pathing/target/璃月1-石门-1.json | 22 + .../assets/pathing/target/璃月1-石门-2.json | 22 + .../assets/pathing/target/璃月1-石门-3.json | 22 + .../assets/pathing/target/璃月1-石门-4.json | 22 + .../pathing/target/璃月11-轻策庄-1.json | 20 + .../pathing/target/璃月11-轻策庄-2.json | 21 + .../pathing/target/璃月11-轻策庄-3.json | 21 + .../pathing/target/璃月11-轻策庄-4.json | 21 + .../pathing/target/璃月11-轻策庄-5.json | 21 + .../pathing/target/璃月11-轻策庄-6.json | 21 + .../pathing/target/璃月14-药蝶谷-1.json | 21 + .../pathing/target/璃月14-药蝶谷-2.json | 21 + .../pathing/target/璃月14-药蝶谷-3.json | 21 + .../pathing/target/璃月14-药蝶谷-4.json | 21 + .../pathing/target/璃月2-地中之盐-1.json | 21 + .../pathing/target/璃月2-地中之盐-2.json | 21 + .../pathing/target/璃月2-地中之盐-3.json | 21 + .../pathing/target/璃月2-地中之盐-4.json | 21 + .../assets/pathing/target/璃月3-瑶光滩-1.json | 22 + .../assets/pathing/target/璃月3-瑶光滩-2.json | 21 + .../assets/pathing/target/璃月3-瑶光滩-3.json | 21 + .../assets/pathing/target/璃月3-瑶光滩-4.json | 21 + .../assets/pathing/target/璃月3-瑶光滩-5.json | 21 + .../assets/pathing/target/稻妻1-鸣神岛-1.json | 21 + .../assets/pathing/target/稻妻1-鸣神岛-2.json | 21 + .../assets/pathing/target/稻妻1-鸣神岛-3.json | 21 + .../assets/pathing/target/稻妻1-鸣神岛-4.json | 21 + .../assets/pathing/target/稻妻2-踏鞴砂-1.json | 21 + .../assets/pathing/target/稻妻2-踏鞴砂-2.json | 21 + .../assets/pathing/target/稻妻2-踏鞴砂-3.json | 21 + .../assets/pathing/target/稻妻2-踏鞴砂-4.json | 21 + .../assets/pathing/target/稻妻2-踏鞴砂-5.json | 21 + .../assets/pathing/target/稻妻3-八酝岛-1.json | 21 + .../assets/pathing/target/稻妻3-八酝岛-2.json | 21 + .../assets/pathing/target/稻妻3-八酝岛-3.json | 21 + .../assets/pathing/target/稻妻3-八酝岛-4.json | 21 + .../assets/pathing/target/稻妻4-海祇岛-1.json | 21 + .../assets/pathing/target/稻妻4-海祇岛-2.json | 21 + .../assets/pathing/target/稻妻4-海祇岛-3.json | 21 + .../assets/pathing/target/稻妻4-海祇岛-4.json | 21 + .../assets/pathing/target/稻妻5-清籁岛-1.json | 21 + .../assets/pathing/target/稻妻5-清籁岛-2.json | 21 + .../assets/pathing/target/稻妻5-清籁岛-3.json | 21 + .../assets/pathing/target/稻妻5-清籁岛-4.json | 21 + .../assets/pathing/target/稻妻5-清籁岛-5.json | 21 + .../assets/pathing/target/纳塔1-隆崛坡-1.json | 22 + .../assets/pathing/target/纳塔1-隆崛坡-2.json | 22 + .../assets/pathing/target/纳塔1-隆崛坡-3.json | 22 + .../assets/pathing/target/纳塔1-隆崛坡-4.json | 22 + .../pathing/target/纳塔10-溶水域-1.json | 21 + .../pathing/target/纳塔10-溶水域-2.json | 21 + .../pathing/target/纳塔10-溶水域-3.json | 21 + .../pathing/target/纳塔10-溶水域-4.json | 21 + .../pathing/target/纳塔2-硫晶支脉-1.json | 21 + .../pathing/target/纳塔2-硫晶支脉-2.json | 21 + .../pathing/target/纳塔2-硫晶支脉-3.json | 21 + .../pathing/target/纳塔2-硫晶支脉-4.json | 21 + .../assets/pathing/target/纳塔3-彩石顶-1.json | 21 + .../assets/pathing/target/纳塔3-彩石顶-2.json | 21 + .../assets/pathing/target/纳塔3-彩石顶-3.json | 21 + .../assets/pathing/target/纳塔3-彩石顶-4.json | 21 + .../assets/pathing/target/纳塔4-溶水域-1.json | 22 + .../assets/pathing/target/纳塔4-溶水域-2.json | 22 + .../pathing/target/纳塔5-安饶之野-1.json | 22 + .../pathing/target/纳塔5-安饶之野-2.json | 22 + .../pathing/target/纳塔5-安饶之野-3.json | 22 + .../pathing/target/纳塔6-圣火竞技场-1.json | 22 + .../pathing/target/纳塔6-圣火竞技场-2.json | 22 + .../pathing/target/纳塔6-圣火竞技场-3.json | 22 + .../pathing/target/纳塔6-圣火竞技场-4.json | 22 + .../assets/pathing/target/纳塔7-烟谜主-1.json | 21 + .../assets/pathing/target/纳塔7-烟谜主-2.json | 21 + .../assets/pathing/target/纳塔7-烟谜主-3.json | 21 + .../assets/pathing/target/纳塔8-花羽会-1.json | 21 + .../assets/pathing/target/纳塔8-花羽会-2.json | 21 + .../assets/pathing/target/纳塔8-花羽会-3.json | 21 + .../assets/pathing/target/纳塔9-翘枝崖-1.json | 21 + .../assets/pathing/target/纳塔9-翘枝崖-2.json | 21 + .../assets/pathing/target/纳塔9-翘枝崖-3.json | 21 + .../assets/pathing/target/纳塔9-翘枝崖-4.json | 21 + .../assets/pathing/target/蒙德1-风起地-1.json | 21 + .../assets/pathing/target/蒙德1-风起地-2.json | 22 + .../assets/pathing/target/蒙德1-风起地-3.json | 22 + .../assets/pathing/target/蒙德1-风起地-4.json | 21 + .../assets/pathing/target/蒙德1-风起地-5.json | 21 + .../assets/pathing/target/蒙德2-清泉镇-1.json | 22 + .../assets/pathing/target/蒙德2-清泉镇-2.json | 22 + .../assets/pathing/target/蒙德2-清泉镇-3.json | 22 + .../assets/pathing/target/蒙德2-清泉镇-4.json | 22 + .../assets/pathing/target/蒙德3-奔狼领-1.json | 22 + .../assets/pathing/target/蒙德3-奔狼领-2.json | 22 + .../assets/pathing/target/蒙德3-奔狼领-3.json | 22 + .../assets/pathing/target/蒙德3-奔狼领-4.json | 22 + .../pathing/target/蒙德4-风龙废墟-1.json | 22 + .../pathing/target/蒙德4-风龙废墟-2.json | 22 + .../pathing/target/蒙德4-风龙废墟-3.json | 22 + .../pathing/target/蒙德4-风龙废墟-4.json | 22 + .../pathing/target/蒙德5-千风神殿-1.json | 22 + .../pathing/target/蒙德5-千风神殿-2.json | 22 + .../pathing/target/蒙德5-千风神殿-3.json | 22 + .../pathing/target/蒙德5-千风神殿-4.json | 22 + .../pathing/target/蒙德5-千风神殿-5.json | 22 + .../pathing/target/蒙德6-望风山地-1.json | 21 + .../pathing/target/蒙德6-望风山地-2.json | 22 + .../pathing/target/蒙德6-望风山地-3.json | 22 + .../pathing/target/蒙德6-望风山地-4.json | 22 + .../pathing/target/蒙德7-达达乌帕谷-1.json | 22 + .../pathing/target/蒙德7-达达乌帕谷-2.json | 22 + .../pathing/target/蒙德7-达达乌帕谷-3.json | 22 + .../pathing/target/蒙德7-达达乌帕谷-4.json | 22 + .../pathing/target/蒙德7-达达乌帕谷-5.json | 22 + .../pathing/target/蒙德7-达达乌帕谷-6.json | 21 + .../pathing/target/须弥1-无郁稠林-1.json | 21 + .../pathing/target/须弥1-无郁稠林-2.json | 21 + .../pathing/target/须弥1-无郁稠林-3.json | 21 + .../pathing/target/须弥1-无郁稠林-4.json | 21 + .../pathing/target/须弥1-无郁稠林-5.json | 21 + .../pathing/target/须弥2-奥摩斯港西-1.json | 21 + .../pathing/target/须弥2-奥摩斯港西-2.json | 21 + .../pathing/target/须弥2-奥摩斯港西-3.json | 21 + .../pathing/target/须弥2-奥摩斯港西-4.json | 21 + .../pathing/target/须弥2-奥摩斯港西-5.json | 21 + .../assets/pathing/target/须弥5-阿如村-1.json | 21 + .../assets/pathing/target/须弥5-阿如村-2.json | 21 + .../assets/pathing/target/须弥5-阿如村-3.json | 21 + .../assets/pathing/target/须弥5-阿如村-4.json | 21 + .../assets/pathing/target/须弥5-阿如村-5.json | 21 + .../pathing/target/须弥6-荼诃落谷-1.json | 21 + .../pathing/target/须弥6-荼诃落谷-2.json | 21 + .../pathing/target/须弥6-荼诃落谷-3.json | 21 + .../pathing/target/须弥6-荼诃落谷-4.json | 21 + .../assets/pathing/枫丹1-秋分山西侧-1.json | 64 +- .../assets/pathing/枫丹1-秋分山西侧-2.json | 68 +- .../assets/pathing/枫丹1-秋分山西侧-3.json | 70 +- .../assets/pathing/枫丹1-秋分山西侧-4.json | 64 +- .../assets/pathing/枫丹1-秋分山西侧-5.json | 60 +- .../assets/pathing/枫丹2-芒索斯山东麓-1.json | 60 +- .../assets/pathing/枫丹2-芒索斯山东麓-2.json | 56 +- .../assets/pathing/枫丹2-芒索斯山东麓-3.json | 61 +- .../assets/pathing/枫丹2-芒索斯山东麓-4.json | 71 +- .../assets/pathing/枫丹3-新枫丹科学院-1.json | 67 +- .../assets/pathing/枫丹3-新枫丹科学院-2.json | 67 +- .../assets/pathing/枫丹3-新枫丹科学院-3.json | 50 +- .../assets/pathing/枫丹3-新枫丹科学院-4.json | 67 +- .../assets/pathing/枫丹4-柔灯港-1.json | 71 +- .../assets/pathing/枫丹4-柔灯港-2.json | 66 +- .../assets/pathing/枫丹4-柔灯港-3.json | 71 +- .../assets/pathing/枫丹4-柔灯港-4.json | 72 +- .../assets/pathing/枫丹5-秋分山东侧-1.json | 60 +- .../assets/pathing/枫丹5-秋分山东侧-2.json | 60 +- .../assets/pathing/枫丹5-秋分山东侧-3.json | 70 +- .../assets/pathing/枫丹5-秋分山东侧-4.json | 68 +- .../assets/pathing/枫丹6-厄里那斯-1.json | 62 +- .../assets/pathing/枫丹6-厄里那斯-2.json | 62 +- .../assets/pathing/枫丹6-厄里那斯-3.json | 68 +- .../assets/pathing/枫丹6-厄里那斯-4.json | 70 +- .../assets/pathing/枫丹6-厄里那斯-5.json | 68 +- .../assets/pathing/枫丹6-厄里那斯-6.json | 62 +- .../assets/pathing/璃月1-石门-1.json | 45 +- .../assets/pathing/璃月1-石门-2.json | 53 +- .../assets/pathing/璃月1-石门-3.json | 45 +- .../assets/pathing/璃月1-石门-4.json | 37 +- .../assets/pathing/璃月11-轻策庄-1.json | 44 + .../assets/pathing/璃月11-轻策庄-2.json | 48 + .../assets/pathing/璃月11-轻策庄-3.json | 39 + .../assets/pathing/璃月11-轻策庄-4.json | 39 + .../assets/pathing/璃月11-轻策庄-5.json | 30 + .../assets/pathing/璃月11-轻策庄-6.json | 57 + .../assets/pathing/璃月14-药蝶谷-1.json | 57 + .../assets/pathing/璃月14-药蝶谷-2.json | 21 + .../assets/pathing/璃月14-药蝶谷-3.json | 21 + .../assets/pathing/璃月14-药蝶谷-4.json | 30 + .../assets/pathing/璃月2-地中之盐-1.json | 30 + .../assets/pathing/璃月2-地中之盐-2.json | 57 + .../assets/pathing/璃月2-地中之盐-3.json | 48 + .../assets/pathing/璃月2-地中之盐-4.json | 39 + .../assets/pathing/璃月3-瑶光滩-1.json | 28 +- .../assets/pathing/璃月3-瑶光滩-2.json | 93 + .../assets/pathing/璃月3-瑶光滩-3.json | 48 + .../assets/pathing/璃月3-瑶光滩-4.json | 39 + .../assets/pathing/璃月3-瑶光滩-5.json | 57 + .../assets/pathing/稻妻1-鸣神岛-1.json | 39 + .../assets/pathing/稻妻1-鸣神岛-2.json | 57 + .../assets/pathing/稻妻1-鸣神岛-3.json | 48 + .../assets/pathing/稻妻1-鸣神岛-4.json | 30 + .../assets/pathing/稻妻2-踏鞴砂-1.json | 39 + .../assets/pathing/稻妻2-踏鞴砂-2.json | 39 + .../assets/pathing/稻妻2-踏鞴砂-3.json | 30 + .../assets/pathing/稻妻2-踏鞴砂-4.json | 39 + .../assets/pathing/稻妻2-踏鞴砂-5.json | 57 + .../assets/pathing/稻妻3-八酝岛-1.json | 47 +- .../assets/pathing/稻妻3-八酝岛-2.json | 39 + .../assets/pathing/稻妻3-八酝岛-3.json | 57 + .../assets/pathing/稻妻3-八酝岛-4.json | 30 + .../assets/pathing/稻妻4-海祇岛-1.json | 30 + .../assets/pathing/稻妻4-海祇岛-2.json | 30 + .../assets/pathing/稻妻4-海祇岛-3.json | 21 + .../assets/pathing/稻妻4-海祇岛-4.json | 30 + .../assets/pathing/稻妻5-清籁岛-1.json | 48 + .../assets/pathing/稻妻5-清籁岛-2.json | 30 + .../assets/pathing/稻妻5-清籁岛-3.json | 39 + .../assets/pathing/稻妻5-清籁岛-4.json | 39 + .../assets/pathing/稻妻5-清籁岛-5.json | 39 + .../assets/pathing/纳塔1-隆崛坡-1.json | 39 +- .../assets/pathing/纳塔1-隆崛坡-2.json | 35 +- .../assets/pathing/纳塔1-隆崛坡-3.json | 35 +- .../assets/pathing/纳塔1-隆崛坡-4.json | 33 +- .../assets/pathing/纳塔10-溶水域-1.json | 48 + .../assets/pathing/纳塔10-溶水域-2.json | 39 + .../assets/pathing/纳塔10-溶水域-3.json | 39 + .../assets/pathing/纳塔10-溶水域-4.json | 75 + .../assets/pathing/纳塔2-硫晶支脉-1.json | 39 + .../assets/pathing/纳塔2-硫晶支脉-2.json | 30 + .../assets/pathing/纳塔2-硫晶支脉-3.json | 30 + .../assets/pathing/纳塔2-硫晶支脉-4.json | 39 + .../assets/pathing/纳塔3-彩石顶-1.json | 30 + .../assets/pathing/纳塔3-彩石顶-2.json | 57 + .../assets/pathing/纳塔3-彩石顶-3.json | 39 + .../assets/pathing/纳塔3-彩石顶-4.json | 84 + .../assets/pathing/纳塔4-溶水域-1.json | 41 +- .../assets/pathing/纳塔4-溶水域-2.json | 25 +- .../assets/pathing/纳塔5-安饶之野-1.json | 43 +- .../assets/pathing/纳塔5-安饶之野-2.json | 33 +- .../assets/pathing/纳塔5-安饶之野-3.json | 29 +- .../assets/pathing/纳塔6-圣火竞技场-1.json | 49 +- .../assets/pathing/纳塔6-圣火竞技场-2.json | 45 +- .../assets/pathing/纳塔6-圣火竞技场-3.json | 43 +- .../assets/pathing/纳塔6-圣火竞技场-4.json | 39 +- .../assets/pathing/纳塔7-烟谜主-1.json | 49 + .../assets/pathing/纳塔7-烟谜主-2.json | 39 + .../assets/pathing/纳塔7-烟谜主-3.json | 48 + .../assets/pathing/纳塔8-花羽会-1.json | 48 + .../assets/pathing/纳塔8-花羽会-2.json | 39 + .../assets/pathing/纳塔8-花羽会-3.json | 57 + .../assets/pathing/纳塔9-翘枝崖-1.json | 39 + .../assets/pathing/纳塔9-翘枝崖-2.json | 39 + .../assets/pathing/纳塔9-翘枝崖-3.json | 48 + .../assets/pathing/纳塔9-翘枝崖-4.json | 30 + .../assets/pathing/蒙德1-风起地-1.json | 53 +- .../assets/pathing/蒙德1-风起地-2.json | 29 +- .../assets/pathing/蒙德1-风起地-3.json | 35 +- .../assets/pathing/蒙德1-风起地-4.json | 48 +- .../assets/pathing/蒙德1-风起地-5.json | 39 + .../assets/pathing/蒙德2-清泉镇-1.json | 39 +- .../assets/pathing/蒙德2-清泉镇-2.json | 35 +- .../assets/pathing/蒙德2-清泉镇-3.json | 43 +- .../assets/pathing/蒙德2-清泉镇-4.json | 55 +- .../assets/pathing/蒙德3-奔狼领-1.json | 47 +- .../assets/pathing/蒙德3-奔狼领-2.json | 39 +- .../assets/pathing/蒙德3-奔狼领-3.json | 35 +- .../assets/pathing/蒙德3-奔狼领-4.json | 51 +- .../assets/pathing/蒙德4-风龙废墟-1.json | 47 +- .../assets/pathing/蒙德4-风龙废墟-2.json | 43 +- .../assets/pathing/蒙德4-风龙废墟-3.json | 29 +- .../assets/pathing/蒙德4-风龙废墟-4.json | 43 +- .../assets/pathing/蒙德5-千风神殿-1.json | 38 +- .../assets/pathing/蒙德5-千风神殿-2.json | 39 +- .../assets/pathing/蒙德5-千风神殿-3.json | 51 +- .../assets/pathing/蒙德5-千风神殿-4.json | 39 +- .../assets/pathing/蒙德5-千风神殿-5.json | 33 +- .../assets/pathing/蒙德6-望风山地-1.json | 52 +- .../assets/pathing/蒙德6-望风山地-2.json | 39 +- .../assets/pathing/蒙德6-望风山地-3.json | 29 +- .../assets/pathing/蒙德6-望风山地-4.json | 37 +- .../assets/pathing/蒙德7-达达乌帕谷-1.json | 47 +- .../assets/pathing/蒙德7-达达乌帕谷-2.json | 43 +- .../assets/pathing/蒙德7-达达乌帕谷-3.json | 39 +- .../assets/pathing/蒙德7-达达乌帕谷-4.json | 39 +- .../assets/pathing/蒙德7-达达乌帕谷-5.json | 47 +- .../assets/pathing/蒙德7-达达乌帕谷-6.json | 39 + .../assets/pathing/路线修改进度.md | 77 + .../assets/pathing/须弥1-无郁稠林-1.json | 77 + .../assets/pathing/须弥1-无郁稠林-2.json | 39 + .../assets/pathing/须弥1-无郁稠林-3.json | 58 + .../assets/pathing/须弥1-无郁稠林-4.json | 39 + .../assets/pathing/须弥1-无郁稠林-5.json | 57 + .../assets/pathing/须弥2-奥摩斯港西-1.json | 48 + .../assets/pathing/须弥2-奥摩斯港西-2.json | 48 + .../assets/pathing/须弥2-奥摩斯港西-3.json | 48 + .../assets/pathing/须弥2-奥摩斯港西-4.json | 48 + .../assets/pathing/须弥2-奥摩斯港西-5.json | 39 + .../assets/pathing/须弥5-阿如村-1.json | 66 + .../assets/pathing/须弥5-阿如村-2.json | 39 + .../assets/pathing/须弥5-阿如村-3.json | 77 + .../assets/pathing/须弥5-阿如村-4.json | 59 + .../assets/pathing/须弥5-阿如村-5.json | 39 + .../assets/pathing/须弥6-荼诃落谷-1.json | 66 + .../assets/pathing/须弥6-荼诃落谷-2.json | 75 + .../assets/pathing/须弥6-荼诃落谷-3.json | 57 + .../assets/pathing/须弥6-荼诃落谷-4.json | 48 + repo/js/AutoLeyLineOutcrop/config.json | 1242 ++++++ .../create_LeyLinePositions_json.py | 74 + .../AutoLeyLineOutcrop/create_target_jsons.py | 77 + .../generate_ley_line_data.py | 400 ++ repo/js/AutoLeyLineOutcrop/main.js | 1616 ++++--- repo/js/AutoLeyLineOutcrop/manifest.json | 14 +- repo/js/AutoLeyLineOutcrop/settings.json | 36 +- 405 files changed, 18502 insertions(+), 5158 deletions(-) create mode 100644 repo/js/AutoLeyLineOutcrop/LeyLineOutcropData.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/archive/rerun/纳塔8-花羽会-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/icon/box.png create mode 100644 repo/js/AutoLeyLineOutcrop/assets/icon/paimon_menu.png create mode 100644 repo/js/AutoLeyLineOutcrop/assets/mapPositions.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/璃月2-地中之盐-1-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/璃月2-地中之盐-2-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/璃月2-地中之盐-3-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/璃月2-地中之盐-4-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/璃月3-瑶光滩-1-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/璃月3-瑶光滩-2-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/璃月3-瑶光滩-3-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/璃月3-瑶光滩-4-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/璃月3-瑶光滩-5-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/稻妻1-鸣神岛-1-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/稻妻1-鸣神岛-2-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/稻妻1-鸣神岛-3-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/稻妻1-鸣神岛-4-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/稻妻5-清籁岛-1-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/稻妻5-清籁岛-2-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/稻妻5-清籁岛-3-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/稻妻5-清籁岛-4-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/稻妻5-清籁岛-5-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔10-溶水域-1-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔10-溶水域-2-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔10-溶水域-3-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔10-溶水域-4-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔2-硫晶支脉-1-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔2-硫晶支脉-2-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔2-硫晶支脉-3-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔2-硫晶支脉-4-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔7-烟谜主-1-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔7-烟谜主-2-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔7-烟谜主-3-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔8-花羽会-1-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔8-花羽会-2-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔8-花羽会-3-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔9-翘枝崖-1-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔9-翘枝崖-2-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔9-翘枝崖-3-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/纳塔9-翘枝崖-4-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/须弥1-无郁稠林-4-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/须弥2-奥摩斯港西-1-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/须弥2-奥摩斯港西-2-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/须弥2-奥摩斯港西-3-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/须弥2-奥摩斯港西-4-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/须弥2-奥摩斯港西-5-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/须弥5-阿如村-1-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/须弥5-阿如村-2-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/须弥5-阿如村-3-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/须弥5-阿如村-4-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/rerun/须弥5-阿如村-5-rerun.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹1-秋分山西侧-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹1-秋分山西侧-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹1-秋分山西侧-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹1-秋分山西侧-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹1-秋分山西侧-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹2-芒索斯山东麓-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹2-芒索斯山东麓-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹2-芒索斯山东麓-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹2-芒索斯山东麓-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹3-新枫丹科学院-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹3-新枫丹科学院-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹3-新枫丹科学院-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹3-新枫丹科学院-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹4-柔灯港-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹4-柔灯港-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹4-柔灯港-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹4-柔灯港-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹5-秋分山东侧-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹5-秋分山东侧-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹5-秋分山东侧-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹5-秋分山东侧-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹6-厄里那斯-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹6-厄里那斯-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹6-厄里那斯-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹6-厄里那斯-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹6-厄里那斯-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/枫丹6-厄里那斯-6.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月1-石门-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月1-石门-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月1-石门-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月1-石门-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月11-轻策庄-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月11-轻策庄-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月11-轻策庄-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月11-轻策庄-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月11-轻策庄-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月11-轻策庄-6.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月14-药蝶谷-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月14-药蝶谷-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月14-药蝶谷-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月14-药蝶谷-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月2-地中之盐-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月2-地中之盐-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月2-地中之盐-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月2-地中之盐-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月3-瑶光滩-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月3-瑶光滩-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月3-瑶光滩-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月3-瑶光滩-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/璃月3-瑶光滩-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻1-鸣神岛-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻1-鸣神岛-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻1-鸣神岛-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻1-鸣神岛-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻2-踏鞴砂-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻2-踏鞴砂-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻2-踏鞴砂-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻2-踏鞴砂-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻2-踏鞴砂-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻3-八酝岛-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻3-八酝岛-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻3-八酝岛-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻3-八酝岛-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻4-海祇岛-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻4-海祇岛-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻4-海祇岛-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻4-海祇岛-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻5-清籁岛-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻5-清籁岛-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻5-清籁岛-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻5-清籁岛-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/稻妻5-清籁岛-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔1-隆崛坡-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔1-隆崛坡-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔1-隆崛坡-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔1-隆崛坡-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔10-溶水域-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔10-溶水域-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔10-溶水域-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔10-溶水域-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔2-硫晶支脉-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔2-硫晶支脉-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔2-硫晶支脉-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔2-硫晶支脉-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔3-彩石顶-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔3-彩石顶-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔3-彩石顶-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔3-彩石顶-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔4-溶水域-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔4-溶水域-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔5-安饶之野-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔5-安饶之野-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔5-安饶之野-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔6-圣火竞技场-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔6-圣火竞技场-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔6-圣火竞技场-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔6-圣火竞技场-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔7-烟谜主-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔7-烟谜主-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔7-烟谜主-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔8-花羽会-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔8-花羽会-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔8-花羽会-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔9-翘枝崖-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔9-翘枝崖-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔9-翘枝崖-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/纳塔9-翘枝崖-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德1-风起地-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德1-风起地-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德1-风起地-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德1-风起地-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德1-风起地-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德2-清泉镇-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德2-清泉镇-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德2-清泉镇-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德2-清泉镇-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德3-奔狼领-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德3-奔狼领-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德3-奔狼领-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德3-奔狼领-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德4-风龙废墟-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德4-风龙废墟-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德4-风龙废墟-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德4-风龙废墟-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德5-千风神殿-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德5-千风神殿-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德5-千风神殿-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德5-千风神殿-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德5-千风神殿-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德6-望风山地-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德6-望风山地-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德6-望风山地-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德6-望风山地-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德7-达达乌帕谷-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德7-达达乌帕谷-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德7-达达乌帕谷-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德7-达达乌帕谷-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德7-达达乌帕谷-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/蒙德7-达达乌帕谷-6.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥1-无郁稠林-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥1-无郁稠林-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥1-无郁稠林-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥1-无郁稠林-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥1-无郁稠林-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥2-奥摩斯港西-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥2-奥摩斯港西-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥2-奥摩斯港西-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥2-奥摩斯港西-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥2-奥摩斯港西-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥5-阿如村-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥5-阿如村-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥5-阿如村-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥5-阿如村-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥5-阿如村-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥6-荼诃落谷-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥6-荼诃落谷-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥6-荼诃落谷-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/target/须弥6-荼诃落谷-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月11-轻策庄-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月11-轻策庄-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月11-轻策庄-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月11-轻策庄-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月11-轻策庄-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月11-轻策庄-6.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月14-药蝶谷-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月14-药蝶谷-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月14-药蝶谷-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月14-药蝶谷-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月2-地中之盐-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月2-地中之盐-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月2-地中之盐-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月2-地中之盐-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月3-瑶光滩-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月3-瑶光滩-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月3-瑶光滩-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/璃月3-瑶光滩-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻1-鸣神岛-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻1-鸣神岛-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻1-鸣神岛-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻1-鸣神岛-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻2-踏鞴砂-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻2-踏鞴砂-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻2-踏鞴砂-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻2-踏鞴砂-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻2-踏鞴砂-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻3-八酝岛-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻3-八酝岛-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻3-八酝岛-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻4-海祇岛-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻4-海祇岛-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻4-海祇岛-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻4-海祇岛-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻5-清籁岛-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻5-清籁岛-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻5-清籁岛-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻5-清籁岛-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/稻妻5-清籁岛-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔10-溶水域-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔10-溶水域-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔10-溶水域-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔10-溶水域-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔2-硫晶支脉-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔2-硫晶支脉-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔2-硫晶支脉-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔2-硫晶支脉-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔3-彩石顶-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔3-彩石顶-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔3-彩石顶-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔3-彩石顶-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔7-烟谜主-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔7-烟谜主-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔7-烟谜主-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔8-花羽会-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔8-花羽会-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔8-花羽会-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔9-翘枝崖-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔9-翘枝崖-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔9-翘枝崖-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/纳塔9-翘枝崖-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/蒙德1-风起地-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/蒙德7-达达乌帕谷-6.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/路线修改进度.md create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥1-无郁稠林-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥1-无郁稠林-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥1-无郁稠林-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥1-无郁稠林-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥1-无郁稠林-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥2-奥摩斯港西-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥2-奥摩斯港西-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥2-奥摩斯港西-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥2-奥摩斯港西-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥2-奥摩斯港西-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥5-阿如村-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥5-阿如村-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥5-阿如村-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥5-阿如村-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥5-阿如村-5.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥6-荼诃落谷-1.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥6-荼诃落谷-2.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥6-荼诃落谷-3.json create mode 100644 repo/js/AutoLeyLineOutcrop/assets/pathing/须弥6-荼诃落谷-4.json create mode 100644 repo/js/AutoLeyLineOutcrop/config.json create mode 100644 repo/js/AutoLeyLineOutcrop/create_LeyLinePositions_json.py create mode 100644 repo/js/AutoLeyLineOutcrop/create_target_jsons.py create mode 100644 repo/js/AutoLeyLineOutcrop/generate_ley_line_data.py diff --git a/repo/js/AutoLeyLineOutcrop/LeyLineOutcropData.json b/repo/js/AutoLeyLineOutcrop/LeyLineOutcropData.json new file mode 100644 index 00000000..9eb59c0e --- /dev/null +++ b/repo/js/AutoLeyLineOutcrop/LeyLineOutcropData.json @@ -0,0 +1,3858 @@ +{ + "node": [ + { + "id": 1, + "type": "teleport", + "region": "枫丹1", + "position": { + "x": 4146.91, + "y": 2606.27 + }, + "prev": [], + "next": [ + { + "target": 71, + "route": "assets/pathing/枫丹1-秋分山西侧-1.json" + }, + { + "target": 72, + "route": "assets/pathing/枫丹1-秋分山西侧-2.json" + }, + { + "target": 88, + "route": "assets/pathing/枫丹5-秋分山东侧-1.json" + } + ] + }, + { + "id": 2, + "type": "teleport", + "region": "枫丹1", + "position": { + "x": 4375.5, + "y": 2280.05 + }, + "prev": [], + "next": [ + { + "target": 73, + "route": "assets/pathing/枫丹1-秋分山西侧-3.json" + }, + { + "target": 74, + "route": "assets/pathing/枫丹1-秋分山西侧-4.json" + }, + { + "target": 75, + "route": "assets/pathing/枫丹1-秋分山西侧-5.json" + } + ] + }, + { + "id": 3, + "type": "teleport", + "region": "枫丹2", + "position": { + "x": 4984.79, + "y": 4462.98 + }, + "prev": [], + "next": [ + { + "target": 76, + "route": "assets/pathing/枫丹2-芒索斯山东麓-1.json" + }, + { + "target": 77, + "route": "assets/pathing/枫丹2-芒索斯山东麓-2.json" + }, + { + "target": 78, + "route": "assets/pathing/枫丹2-芒索斯山东麓-3.json" + }, + { + "target": 79, + "route": "assets/pathing/枫丹2-芒索斯山东麓-4.json" + } + ] + }, + { + "id": 4, + "type": "teleport", + "region": "枫丹3", + "position": { + "x": 4498.18, + "y": 4710.79 + }, + "prev": [], + "next": [ + { + "target": 80, + "route": "assets/pathing/枫丹3-新枫丹科学院-1.json" + }, + { + "target": 81, + "route": "assets/pathing/枫丹3-新枫丹科学院-2.json" + } + ] + }, + { + "id": 5, + "type": "teleport", + "region": "枫丹3", + "position": { + "x": 4624.36, + "y": 4951.78 + }, + "prev": [], + "next": [ + { + "target": 82, + "route": "assets/pathing/枫丹3-新枫丹科学院-3.json" + }, + { + "target": 83, + "route": "assets/pathing/枫丹3-新枫丹科学院-4.json" + } + ] + }, + { + "id": 6, + "type": "teleport", + "region": "枫丹4", + "position": { + "x": 2873.54, + "y": 3512.04 + }, + "prev": [], + "next": [ + { + "target": 84, + "route": "assets/pathing/枫丹4-柔灯港-1.json" + } + ] + }, + { + "id": 7, + "type": "teleport", + "region": "枫丹4", + "position": { + "x": 3032.66, + "y": 3732.42 + }, + "prev": [], + "next": [ + { + "target": 85, + "route": "assets/pathing/枫丹4-柔灯港-2.json" + }, + { + "target": 86, + "route": "assets/pathing/枫丹4-柔灯港-3.json" + }, + { + "target": 87, + "route": "assets/pathing/枫丹4-柔灯港-4.json" + } + ] + }, + { + "id": 8, + "type": "teleport", + "region": "枫丹5", + "position": { + "x": 3917.29, + "y": 2576.43 + }, + "prev": [], + "next": [ + { + "target": 89, + "route": "assets/pathing/枫丹5-秋分山东侧-3.json" + }, + { + "target": 90, + "route": "assets/pathing/枫丹5-秋分山东侧-4.json" + } + ] + }, + { + "id": 9, + "type": "teleport", + "region": "枫丹6", + "position": { + "x": 4749.59, + "y": 2636.21 + }, + "prev": [], + "next": [ + { + "target": 91, + "route": "assets/pathing/枫丹6-厄里那斯-1.json" + } + ] + }, + { + "id": 10, + "type": "teleport", + "region": "枫丹6", + "position": { + "x": 4689.61, + "y": 2429.43 + }, + "prev": [], + "next": [ + { + "target": 92, + "route": "assets/pathing/枫丹6-厄里那斯-2.json" + }, + { + "target": 93, + "route": "assets/pathing/枫丹6-厄里那斯-3.json" + }, + { + "target": 94, + "route": "assets/pathing/枫丹6-厄里那斯-4.json" + }, + { + "target": 96, + "route": "assets/pathing/枫丹6-厄里那斯-6.json" + } + ] + }, + { + "id": 11, + "type": "teleport", + "region": "枫丹6", + "position": { + "x": 4626.1, + "y": 2182.3 + }, + "prev": [], + "next": [ + { + "target": 95, + "route": "assets/pathing/枫丹6-厄里那斯-5.json" + } + ] + }, + { + "id": 12, + "type": "teleport", + "region": "璃月1", + "position": { + "x": 207.48, + "y": 1573.01 + }, + "prev": [], + "next": [ + { + "target": 97, + "route": "assets/pathing/璃月1-石门-1.json" + } + ] + }, + { + "id": 13, + "type": "teleport", + "region": "璃月1", + "position": { + "x": -321.55, + "y": 1473.33 + }, + "prev": [], + "next": [ + { + "target": 98, + "route": "assets/pathing/璃月1-石门-2.json" + } + ] + }, + { + "id": 14, + "type": "teleport", + "region": "璃月11", + "position": { + "x": 839.82, + "y": 1532.39 + }, + "prev": [], + "next": [ + { + "target": 101, + "route": "assets/pathing/璃月11-轻策庄-1.json" + } + ] + }, + { + "id": 15, + "type": "teleport", + "region": "璃月11", + "position": { + "x": 489.8, + "y": 1435.14 + }, + "prev": [], + "next": [ + { + "target": 105, + "route": "assets/pathing/璃月11-轻策庄-5.json" + } + ] + }, + { + "id": 16, + "type": "teleport", + "region": "璃月11", + "position": { + "x": 253.05, + "y": 1284.9 + }, + "prev": [], + "next": [ + { + "target": 106, + "route": "assets/pathing/璃月11-轻策庄-6.json" + } + ] + }, + { + "id": 17, + "type": "teleport", + "region": "璃月14", + "position": { + "x": 1433.37, + "y": 1288.0 + }, + "prev": [], + "next": [ + { + "target": 107, + "route": "assets/pathing/璃月14-药蝶谷-1.json" + } + ] + }, + { + "id": 18, + "type": "teleport", + "region": "璃月2", + "position": { + "x": -164.59, + "y": 1182.45 + }, + "prev": [], + "next": [ + { + "target": 109, + "route": "assets/pathing/璃月2-地中之盐-1.json" + }, + { + "target": 110, + "route": "assets/pathing/璃月2-地中之盐-2.json" + } + ] + }, + { + "id": 19, + "type": "teleport", + "region": "璃月2", + "position": { + "x": -188.52, + "y": 972.43 + }, + "prev": [], + "next": [ + { + "target": 111, + "route": "assets/pathing/璃月2-地中之盐-3.json" + } + ] + }, + { + "id": 20, + "type": "teleport", + "region": "璃月2", + "position": { + "x": -57.41, + "y": 656.93 + }, + "prev": [], + "next": [ + { + "target": 112, + "route": "assets/pathing/璃月2-地中之盐-4.json" + }, + { + "target": 113, + "route": "assets/pathing/璃月3-瑶光滩-1.json" + }, + { + "target": 114, + "route": "assets/pathing/璃月3-瑶光滩-2.json" + } + ] + }, + { + "id": 21, + "type": "teleport", + "region": "璃月3", + "position": { + "x": 341.27, + "y": 548.27 + }, + "prev": [], + "next": [ + { + "target": 115, + "route": "assets/pathing/璃月3-瑶光滩-3.json" + }, + { + "target": 116, + "route": "assets/pathing/璃月3-瑶光滩-4.json" + }, + { + "target": 117, + "route": "assets/pathing/璃月3-瑶光滩-5.json" + } + ] + }, + { + "id": 22, + "type": "teleport", + "region": "稻妻1", + "position": { + "x": -4217.89, + "y": -2397.87 + }, + "prev": [], + "next": [ + { + "target": 118, + "route": "assets/pathing/稻妻1-鸣神岛-1.json" + }, + { + "target": 119, + "route": "assets/pathing/稻妻1-鸣神岛-2.json" + } + ] + }, + { + "id": 23, + "type": "teleport", + "region": "稻妻1", + "position": { + "x": -4408.91, + "y": -2395.34 + }, + "prev": [], + "next": [ + { + "target": 120, + "route": "assets/pathing/稻妻1-鸣神岛-3.json" + } + ] + }, + { + "id": 24, + "type": "teleport", + "region": "稻妻1", + "position": { + "x": -4545.01, + "y": -2393.6 + }, + "prev": [], + "next": [ + { + "target": 121, + "route": "assets/pathing/稻妻1-鸣神岛-4.json" + } + ] + }, + { + "id": 25, + "type": "teleport", + "region": "稻妻2", + "position": { + "x": -3016.79, + "y": -3623.7 + }, + "prev": [], + "next": [ + { + "target": 122, + "route": "assets/pathing/稻妻2-踏鞴砂-1.json" + } + ] + }, + { + "id": 26, + "type": "teleport", + "region": "稻妻2", + "position": { + "x": -3233.21, + "y": -3534.22 + }, + "prev": [], + "next": [ + { + "target": 123, + "route": "assets/pathing/稻妻2-踏鞴砂-2.json" + } + ] + }, + { + "id": 27, + "type": "teleport", + "region": "稻妻2", + "position": { + "x": -3393.16, + "y": -3555.99 + }, + "prev": [], + "next": [ + { + "target": 124, + "route": "assets/pathing/稻妻2-踏鞴砂-3.json" + } + ] + }, + { + "id": 28, + "type": "teleport", + "region": "稻妻2", + "position": { + "x": -3437.06, + "y": -3319.78 + }, + "prev": [], + "next": [ + { + "target": 125, + "route": "assets/pathing/稻妻2-踏鞴砂-4.json" + }, + { + "target": 126, + "route": "assets/pathing/稻妻2-踏鞴砂-5.json" + } + ] + }, + { + "id": 29, + "type": "teleport", + "region": "稻妻3", + "position": { + "x": -2224.14, + "y": -4004.16 + }, + "prev": [], + "next": [ + { + "target": 127, + "route": "assets/pathing/稻妻3-八酝岛-1.json" + }, + { + "target": 129, + "route": "assets/pathing/稻妻3-八酝岛-3.json" + }, + { + "target": 130, + "route": "assets/pathing/稻妻3-八酝岛-4.json" + } + ] + }, + { + "id": 30, + "type": "teleport", + "region": "稻妻4", + "position": { + "x": -1058.01, + "y": -3948.66 + }, + "prev": [], + "next": [ + { + "target": 131, + "route": "assets/pathing/稻妻4-海祇岛-1.json" + } + ] + }, + { + "id": 31, + "type": "teleport", + "region": "稻妻4", + "position": { + "x": -1315.93, + "y": -3774.25 + }, + "prev": [], + "next": [ + { + "target": 133, + "route": "assets/pathing/稻妻4-海祇岛-4.json" + } + ] + }, + { + "id": 32, + "type": "teleport", + "region": "稻妻5", + "position": { + "x": -3891.55, + "y": -4389.92 + }, + "prev": [], + "next": [ + { + "target": 134, + "route": "assets/pathing/稻妻5-清籁岛-1.json" + } + ] + }, + { + "id": 33, + "type": "teleport", + "region": "稻妻5", + "position": { + "x": -3684.76, + "y": -4278.4 + }, + "prev": [], + "next": [ + { + "target": 137, + "route": "assets/pathing/稻妻5-清籁岛-4.json" + } + ] + }, + { + "id": 34, + "type": "teleport", + "region": "纳塔1", + "position": { + "x": 7796.08, + "y": -1873.18 + }, + "prev": [], + "next": [ + { + "target": 139, + "route": "assets/pathing/纳塔1-隆崛坡-1.json" + } + ] + }, + { + "id": 35, + "type": "teleport", + "region": "纳塔1", + "position": { + "x": 7857.47, + "y": -1751.25 + }, + "prev": [], + "next": [ + { + "target": 140, + "route": "assets/pathing/纳塔1-隆崛坡-2.json" + }, + { + "target": 141, + "route": "assets/pathing/纳塔1-隆崛坡-3.json" + } + ] + }, + { + "id": 36, + "type": "teleport", + "region": "纳塔10", + "position": { + "x": 8291.35, + "y": -2922.46 + }, + "prev": [], + "next": [ + { + "target": 143, + "route": "assets/pathing/纳塔10-溶水域-1.json" + } + ] + }, + { + "id": 37, + "type": "teleport", + "region": "纳塔10", + "position": { + "x": 8744.65, + "y": -3009.56 + }, + "prev": [], + "next": [ + { + "target": 146, + "route": "assets/pathing/纳塔10-溶水域-4.json" + } + ] + }, + { + "id": 38, + "type": "teleport", + "region": "纳塔2", + "position": { + "x": 8706.46, + "y": -1575.02 + }, + "prev": [], + "next": [ + { + "target": 147, + "route": "assets/pathing/纳塔2-硫晶支脉-1.json" + }, + { + "target": 148, + "route": "assets/pathing/纳塔2-硫晶支脉-2.json" + }, + { + "target": 149, + "route": "assets/pathing/纳塔2-硫晶支脉-3.json" + } + ] + }, + { + "id": 39, + "type": "teleport", + "region": "纳塔2", + "position": { + "x": 8670.84, + "y": -1269.72 + }, + "prev": [], + "next": [ + { + "target": 150, + "route": "assets/pathing/纳塔2-硫晶支脉-4.json" + } + ] + }, + { + "id": 40, + "type": "teleport", + "region": "纳塔3", + "position": { + "x": 8201.95, + "y": -2288.75 + }, + "prev": [], + "next": [ + { + "target": 151, + "route": "assets/pathing/纳塔3-彩石顶-1.json" + } + ] + }, + { + "id": 41, + "type": "teleport", + "region": "纳塔3", + "position": { + "x": 8372.19, + "y": -2196.26 + }, + "prev": [], + "next": [ + { + "target": 152, + "route": "assets/pathing/纳塔3-彩石顶-2.json" + }, + { + "target": 153, + "route": "assets/pathing/纳塔3-彩石顶-3.json" + } + ] + }, + { + "id": 42, + "type": "teleport", + "region": "纳塔4", + "position": { + "x": 9038.74, + "y": -2429.33 + }, + "prev": [], + "next": [ + { + "target": 155, + "route": "assets/pathing/纳塔4-溶水域-1.json" + } + ] + }, + { + "id": 43, + "type": "teleport", + "region": "纳塔5", + "position": { + "x": 9812.76, + "y": -2852.58 + }, + "prev": [], + "next": [ + { + "target": 156, + "route": "assets/pathing/纳塔5-安饶之野-1.json" + }, + { + "target": 157, + "route": "assets/pathing/纳塔5-安饶之野-2.json" + }, + { + "target": 158, + "route": "assets/pathing/纳塔5-安饶之野-3.json" + } + ] + }, + { + "id": 44, + "type": "teleport", + "region": "纳塔6", + "position": { + "x": 9282.7, + "y": -2163.58 + }, + "prev": [], + "next": [ + { + "target": 159, + "route": "assets/pathing/纳塔6-圣火竞技场-1.json" + }, + { + "target": 160, + "route": "assets/pathing/纳塔6-圣火竞技场-2.json" + } + ] + }, + { + "id": 45, + "type": "teleport", + "region": "纳塔7", + "position": { + "x": 9989.5, + "y": -1607.82 + }, + "prev": [], + "next": [ + { + "target": 163, + "route": "assets/pathing/纳塔7-烟谜主-1.json" + } + ] + }, + { + "id": 46, + "type": "teleport", + "region": "纳塔8", + "position": { + "x": 9548.24, + "y": -1116.54 + }, + "prev": [], + "next": [ + { + "target": 165, + "route": "assets/pathing/纳塔8-花羽会-1.json" + }, + { + "target": 166, + "route": "assets/pathing/纳塔8-花羽会-2.json" + } + ] + }, + { + "id": 47, + "type": "teleport", + "region": "纳塔8", + "position": { + "x": 9719.22, + "y": -851.99 + }, + "prev": [], + "next": [ + { + "target": 167, + "route": "assets/pathing/纳塔8-花羽会-3.json" + } + ] + }, + { + "id": 48, + "type": "teleport", + "region": "纳塔9", + "position": { + "x": 9839.57, + "y": -1290.01 + }, + "prev": [], + "next": [ + { + "target": 168, + "route": "assets/pathing/纳塔9-翘枝崖-1.json" + } + ] + }, + { + "id": 49, + "type": "teleport", + "region": "蒙德1", + "position": { + "x": -1166.84, + "y": 2132.83 + }, + "prev": [], + "next": [ + { + "target": 172, + "route": "assets/pathing/蒙德1-风起地-1.json" + } + ] + }, + { + "id": 50, + "type": "teleport", + "region": "蒙德1", + "position": { + "x": -1266.59, + "y": 1933.52 + }, + "prev": [], + "next": [ + { + "target": 173, + "route": "assets/pathing/蒙德1-风起地-2.json" + } + ] + }, + { + "id": 51, + "type": "teleport", + "region": "蒙德1", + "position": { + "x": -914.82, + "y": 1795.51 + }, + "prev": [], + "next": [ + { + "target": 176, + "route": "assets/pathing/蒙德1-风起地-5.json" + } + ] + }, + { + "id": 52, + "type": "teleport", + "region": "蒙德2", + "position": { + "x": -663.61, + "y": 1709.65 + }, + "prev": [], + "next": [ + { + "target": 177, + "route": "assets/pathing/蒙德2-清泉镇-1.json" + } + ] + }, + { + "id": 53, + "type": "teleport", + "region": "蒙德2", + "position": { + "x": -578.76, + "y": 1853.42 + }, + "prev": [], + "next": [ + { + "target": 178, + "route": "assets/pathing/蒙德2-清泉镇-2.json" + } + ] + }, + { + "id": 54, + "type": "teleport", + "region": "蒙德3", + "position": { + "x": -385.84, + "y": 2297.22 + }, + "prev": [], + "next": [ + { + "target": 181, + "route": "assets/pathing/蒙德3-奔狼领-1.json" + } + ] + }, + { + "id": 55, + "type": "teleport", + "region": "蒙德3", + "position": { + "x": -440.09, + "y": 2580.75 + }, + "prev": [], + "next": [ + { + "target": 184, + "route": "assets/pathing/蒙德3-奔狼领-4.json" + } + ] + }, + { + "id": 56, + "type": "teleport", + "region": "蒙德4", + "position": { + "x": 177.18, + "y": 2647.07 + }, + "prev": [], + "next": [ + { + "target": 185, + "route": "assets/pathing/蒙德4-风龙废墟-1.json" + } + ] + }, + { + "id": 57, + "type": "teleport", + "region": "蒙德4", + "position": { + "x": 265.6, + "y": 2915.02 + }, + "prev": [], + "next": [ + { + "target": 187, + "route": "assets/pathing/蒙德4-风龙废墟-3.json" + } + ] + }, + { + "id": 58, + "type": "teleport", + "region": "蒙德5", + "position": { + "x": -1505.87, + "y": 2296.26 + }, + "prev": [], + "next": [ + { + "target": 189, + "route": "assets/pathing/蒙德5-千风神殿-1.json" + } + ] + }, + { + "id": 59, + "type": "teleport", + "region": "蒙德5", + "position": { + "x": -1330.15, + "y": 2563.86 + }, + "prev": [], + "next": [ + { + "target": 192, + "route": "assets/pathing/蒙德5-千风神殿-4.json" + } + ] + }, + { + "id": 60, + "type": "teleport", + "region": "蒙德5", + "position": { + "x": -1273.84, + "y": 2721.72 + }, + "prev": [], + "next": [ + { + "target": 193, + "route": "assets/pathing/蒙德5-千风神殿-5.json" + }, + { + "target": 194, + "route": "assets/pathing/蒙德6-望风山地-1.json" + } + ] + }, + { + "id": 61, + "type": "teleport", + "region": "蒙德6", + "position": { + "x": -1629.44, + "y": 2834.36 + }, + "prev": [], + "next": [ + { + "target": 196, + "route": "assets/pathing/蒙德6-望风山地-3.json" + } + ] + }, + { + "id": 62, + "type": "teleport", + "region": "蒙德7", + "position": { + "x": -1867.21, + "y": 1331.21 + }, + "prev": [], + "next": [ + { + "target": 198, + "route": "assets/pathing/蒙德7-达达乌帕谷-1.json" + } + ] + }, + { + "id": 63, + "type": "teleport", + "region": "蒙德7", + "position": { + "x": -1432.63, + "y": 1464.61 + }, + "prev": [], + "next": [ + { + "target": 199, + "route": "assets/pathing/蒙德7-达达乌帕谷-2.json" + }, + { + "target": 200, + "route": "assets/pathing/蒙德7-达达乌帕谷-3.json" + } + ] + }, + { + "id": 64, + "type": "teleport", + "region": "须弥1", + "position": { + "x": 2342.31, + "y": -4.68 + }, + "prev": [], + "next": [ + { + "target": 203, + "route": "assets/pathing/须弥1-无郁稠林-1.json" + } + ] + }, + { + "id": 65, + "type": "teleport", + "region": "须弥2", + "position": { + "x": 2806.54, + "y": -1790.45 + }, + "prev": [], + "next": [ + { + "target": 208, + "route": "assets/pathing/须弥2-奥摩斯港西-1.json" + } + ] + }, + { + "id": 66, + "type": "teleport", + "region": "须弥2", + "position": { + "x": 2980.23, + "y": -1758.59 + }, + "prev": [], + "next": [ + { + "target": 210, + "route": "assets/pathing/须弥2-奥摩斯港西-3.json" + } + ] + }, + { + "id": 67, + "type": "teleport", + "region": "须弥5", + "position": { + "x": 4409.72, + "y": -1874.67 + }, + "prev": [], + "next": [ + { + "target": 213, + "route": "assets/pathing/须弥5-阿如村-1.json" + } + ] + }, + { + "id": 68, + "type": "teleport", + "region": "须弥6", + "position": { + "x": 4470.72, + "y": -2915.3 + }, + "prev": [], + "next": [ + { + "target": 217, + "route": "assets/pathing/须弥6-荼诃落谷-1.json" + } + ] + }, + { + "id": 69, + "type": "teleport", + "region": "须弥6", + "position": { + "x": 4790.78, + "y": -3182.65 + }, + "prev": [], + "next": [ + { + "target": 218, + "route": "assets/pathing/须弥6-荼诃落谷-2.json" + } + ] + }, + { + "id": 70, + "type": "teleport", + "region": "须弥6", + "position": { + "x": 4810.42, + "y": -2732.88 + }, + "prev": [], + "next": [ + { + "target": 220, + "route": "assets/pathing/须弥6-荼诃落谷-4.json" + } + ] + }, + { + "id": 71, + "type": "blossom", + "region": "枫丹1", + "position": { + "x": 4183.27, + "y": 2502.37 + }, + "prev": [ + 1 + ], + "next": [ + { + "target": 72, + "route": "assets/pathing/枫丹1-秋分山西侧-2.json" + } + ] + }, + { + "id": 72, + "type": "blossom", + "region": "枫丹1", + "position": { + "x": 4190.03, + "y": 2426.41 + }, + "prev": [ + 1, + 71 + ], + "next": [ + { + "target": 73, + "route": "assets/pathing/枫丹1-秋分山西侧-3.json" + } + ] + }, + { + "id": 73, + "type": "blossom", + "region": "枫丹1", + "position": { + "x": 4246.28, + "y": 2374.05 + }, + "prev": [ + 2, + 72 + ], + "next": [ + { + "target": 74, + "route": "assets/pathing/枫丹1-秋分山西侧-4.json" + } + ] + }, + { + "id": 74, + "type": "blossom", + "region": "枫丹1", + "position": { + "x": 4299.75, + "y": 2232.59 + }, + "prev": [ + 2, + 73 + ], + "next": [ + { + "target": 75, + "route": "assets/pathing/枫丹1-秋分山西侧-5.json" + } + ] + }, + { + "id": 75, + "type": "blossom", + "region": "枫丹1", + "position": { + "x": 4402.53, + "y": 2253.27 + }, + "prev": [ + 2, + 74 + ], + "next": [] + }, + { + "id": 76, + "type": "blossom", + "region": "枫丹2", + "position": { + "x": 4962.82, + "y": 4395.81 + }, + "prev": [ + 3 + ], + "next": [ + { + "target": 77, + "route": "assets/pathing/枫丹2-芒索斯山东麓-2.json" + } + ] + }, + { + "id": 77, + "type": "blossom", + "region": "枫丹2", + "position": { + "x": 4952.04, + "y": 4468.84 + }, + "prev": [ + 3, + 76 + ], + "next": [ + { + "target": 78, + "route": "assets/pathing/枫丹2-芒索斯山东麓-3.json" + } + ] + }, + { + "id": 78, + "type": "blossom", + "region": "枫丹2", + "position": { + "x": 5043.36, + "y": 4479.99 + }, + "prev": [ + 3, + 77 + ], + "next": [ + { + "target": 79, + "route": "assets/pathing/枫丹2-芒索斯山东麓-4.json" + } + ] + }, + { + "id": 79, + "type": "blossom", + "region": "枫丹2", + "position": { + "x": 5087.02, + "y": 4573.27 + }, + "prev": [ + 3, + 78 + ], + "next": [] + }, + { + "id": 80, + "type": "blossom", + "region": "枫丹3", + "position": { + "x": 4556.1, + "y": 4762.42 + }, + "prev": [ + 4 + ], + "next": [ + { + "target": 81, + "route": "assets/pathing/枫丹3-新枫丹科学院-2.json" + } + ] + }, + { + "id": 81, + "type": "blossom", + "region": "枫丹3", + "position": { + "x": 4517.81, + "y": 4866.48 + }, + "prev": [ + 4, + 80 + ], + "next": [ + { + "target": 82, + "route": "assets/pathing/枫丹3-新枫丹科学院-3.json" + } + ] + }, + { + "id": 82, + "type": "blossom", + "region": "枫丹3", + "position": { + "x": 4578.63, + "y": 4913.28 + }, + "prev": [ + 5, + 81 + ], + "next": [ + { + "target": 83, + "route": "assets/pathing/枫丹3-新枫丹科学院-4.json" + } + ] + }, + { + "id": 83, + "type": "blossom", + "region": "枫丹3", + "position": { + "x": 4679.47, + "y": 4977.83 + }, + "prev": [ + 5, + 82 + ], + "next": [] + }, + { + "id": 84, + "type": "blossom", + "region": "枫丹4", + "position": { + "x": 2932.47, + "y": 3583.9 + }, + "prev": [ + 6 + ], + "next": [ + { + "target": 85, + "route": "assets/pathing/枫丹4-柔灯港-2.json" + } + ] + }, + { + "id": 85, + "type": "blossom", + "region": "枫丹4", + "position": { + "x": 3008.4, + "y": 3602.59 + }, + "prev": [ + 7, + 84 + ], + "next": [ + { + "target": 86, + "route": "assets/pathing/枫丹4-柔灯港-3.json" + } + ] + }, + { + "id": 86, + "type": "blossom", + "region": "枫丹4", + "position": { + "x": 3077.19, + "y": 3602.84 + }, + "prev": [ + 7, + 85 + ], + "next": [ + { + "target": 87, + "route": "assets/pathing/枫丹4-柔灯港-4.json" + } + ] + }, + { + "id": 87, + "type": "blossom", + "region": "枫丹4", + "position": { + "x": 3091.8, + "y": 3654.75 + }, + "prev": [ + 7, + 86 + ], + "next": [] + }, + { + "id": 88, + "type": "blossom", + "region": "枫丹5", + "position": { + "x": 4098.63, + "y": 2584.16 + }, + "prev": [ + 1, + 88 + ], + "next": [ + { + "target": 88, + "route": "assets/pathing/枫丹5-秋分山东侧-2.json" + }, + { + "target": 89, + "route": "assets/pathing/枫丹5-秋分山东侧-3.json" + } + ] + }, + { + "id": 89, + "type": "blossom", + "region": "枫丹5", + "position": { + "x": 3999.66, + "y": 2613.18 + }, + "prev": [ + 8, + 88 + ], + "next": [ + { + "target": 90, + "route": "assets/pathing/枫丹5-秋分山东侧-4.json" + } + ] + }, + { + "id": 90, + "type": "blossom", + "region": "枫丹5", + "position": { + "x": 3921.35, + "y": 2617.81 + }, + "prev": [ + 8, + 89 + ], + "next": [] + }, + { + "id": 91, + "type": "blossom", + "region": "枫丹6", + "position": { + "x": 4760.8, + "y": 2574.52 + }, + "prev": [ + 9 + ], + "next": [ + { + "target": 92, + "route": "assets/pathing/枫丹6-厄里那斯-2.json" + } + ] + }, + { + "id": 92, + "type": "blossom", + "region": "枫丹6", + "position": { + "x": 4653.67, + "y": 2531.89 + }, + "prev": [ + 10, + 91 + ], + "next": [ + { + "target": 93, + "route": "assets/pathing/枫丹6-厄里那斯-3.json" + } + ] + }, + { + "id": 93, + "type": "blossom", + "region": "枫丹6", + "position": { + "x": 4568.49, + "y": 2433.23 + }, + "prev": [ + 10, + 92 + ], + "next": [ + { + "target": 94, + "route": "assets/pathing/枫丹6-厄里那斯-4.json" + } + ] + }, + { + "id": 94, + "type": "blossom", + "region": "枫丹6", + "position": { + "x": 4553.51, + "y": 2358.49 + }, + "prev": [ + 10, + 93 + ], + "next": [ + { + "target": 95, + "route": "assets/pathing/枫丹6-厄里那斯-5.json" + } + ] + }, + { + "id": 95, + "type": "blossom", + "region": "枫丹6", + "position": { + "x": 4607.46, + "y": 2316.58 + }, + "prev": [ + 11, + 94 + ], + "next": [ + { + "target": 96, + "route": "assets/pathing/枫丹6-厄里那斯-6.json" + } + ] + }, + { + "id": 96, + "type": "blossom", + "region": "枫丹6", + "position": { + "x": 4700.14, + "y": 2393.35 + }, + "prev": [ + 10, + 95 + ], + "next": [] + }, + { + "id": 97, + "type": "blossom", + "region": "璃月1", + "position": { + "x": 73.73, + "y": 1496.59 + }, + "prev": [ + 12 + ], + "next": [ + { + "target": 98, + "route": "assets/pathing/璃月1-石门-2.json" + } + ] + }, + { + "id": 98, + "type": "blossom", + "region": "璃月1", + "position": { + "x": -12.62, + "y": 1566.51 + }, + "prev": [ + 13, + 97 + ], + "next": [ + { + "target": 99, + "route": "assets/pathing/璃月1-石门-3.json" + } + ] + }, + { + "id": 99, + "type": "blossom", + "region": "璃月1", + "position": { + "x": -81.76, + "y": 1534.73 + }, + "prev": [ + 98 + ], + "next": [ + { + "target": 100, + "route": "assets/pathing/璃月1-石门-4.json" + } + ] + }, + { + "id": 100, + "type": "blossom", + "region": "璃月1", + "position": { + "x": -28.76, + "y": 1417.37 + }, + "prev": [ + 99 + ], + "next": [] + }, + { + "id": 101, + "type": "blossom", + "region": "璃月11", + "position": { + "x": 802.19, + "y": 1634.03 + }, + "prev": [ + 14 + ], + "next": [ + { + "target": 102, + "route": "assets/pathing/璃月11-轻策庄-2.json" + } + ] + }, + { + "id": 102, + "type": "blossom", + "region": "璃月11", + "position": { + "x": 697.31, + "y": 1551.84 + }, + "prev": [ + 101 + ], + "next": [ + { + "target": 103, + "route": "assets/pathing/璃月11-轻策庄-3.json" + } + ] + }, + { + "id": 103, + "type": "blossom", + "region": "璃月11", + "position": { + "x": 646.5, + "y": 1421.98 + }, + "prev": [ + 102 + ], + "next": [ + { + "target": 104, + "route": "assets/pathing/璃月11-轻策庄-4.json" + } + ] + }, + { + "id": 104, + "type": "blossom", + "region": "璃月11", + "position": { + "x": 632.03, + "y": 1331.15 + }, + "prev": [ + 103 + ], + "next": [ + { + "target": 105, + "route": "assets/pathing/璃月11-轻策庄-5.json" + } + ] + }, + { + "id": 105, + "type": "blossom", + "region": "璃月11", + "position": { + "x": 558.31, + "y": 1437.82 + }, + "prev": [ + 15, + 104 + ], + "next": [ + { + "target": 106, + "route": "assets/pathing/璃月11-轻策庄-6.json" + } + ] + }, + { + "id": 106, + "type": "blossom", + "region": "璃月11", + "position": { + "x": 285.79, + "y": 1457.93 + }, + "prev": [ + 16, + 105 + ], + "next": [] + }, + { + "id": 107, + "type": "blossom", + "region": "璃月14", + "position": { + "x": 1614.21, + "y": 1382.09 + }, + "prev": [ + 17 + ], + "next": [ + { + "target": 108, + "route": "assets/pathing/璃月14-药蝶谷-4.json" + } + ] + }, + { + "id": 108, + "type": "blossom", + "region": "璃月14", + "position": { + "x": 1525.0, + "y": 1549.17 + }, + "prev": [ + 107 + ], + "next": [] + }, + { + "id": 109, + "type": "blossom", + "region": "璃月2", + "position": { + "x": -194.85, + "y": 1163.89 + }, + "prev": [ + 18 + ], + "next": [ + { + "target": 110, + "route": "assets/pathing/璃月2-地中之盐-2.json" + } + ] + }, + { + "id": 110, + "type": "blossom", + "region": "璃月2", + "position": { + "x": 32.81, + "y": 1118.31 + }, + "prev": [ + 18, + 109 + ], + "next": [ + { + "target": 111, + "route": "assets/pathing/璃月2-地中之盐-3.json" + } + ] + }, + { + "id": 111, + "type": "blossom", + "region": "璃月2", + "position": { + "x": -24.14, + "y": 931.71 + }, + "prev": [ + 19, + 110 + ], + "next": [ + { + "target": 112, + "route": "assets/pathing/璃月2-地中之盐-4.json" + } + ] + }, + { + "id": 112, + "type": "blossom", + "region": "璃月2", + "position": { + "x": -10.67, + "y": 683.67 + }, + "prev": [ + 20, + 111 + ], + "next": [] + }, + { + "id": 113, + "type": "blossom", + "region": "璃月3", + "position": { + "x": -55.27, + "y": 603.84 + }, + "prev": [ + 20 + ], + "next": [ + { + "target": 114, + "route": "assets/pathing/璃月3-瑶光滩-2.json" + } + ] + }, + { + "id": 114, + "type": "blossom", + "region": "璃月3", + "position": { + "x": 139.9, + "y": 685.26 + }, + "prev": [ + 20, + 113 + ], + "next": [ + { + "target": 115, + "route": "assets/pathing/璃月3-瑶光滩-3.json" + } + ] + }, + { + "id": 115, + "type": "blossom", + "region": "璃月3", + "position": { + "x": 284.12, + "y": 620.66 + }, + "prev": [ + 21, + 114 + ], + "next": [ + { + "target": 116, + "route": "assets/pathing/璃月3-瑶光滩-4.json" + } + ] + }, + { + "id": 116, + "type": "blossom", + "region": "璃月3", + "position": { + "x": 276.12, + "y": 542.51 + }, + "prev": [ + 21, + 115 + ], + "next": [ + { + "target": 117, + "route": "assets/pathing/璃月3-瑶光滩-5.json" + } + ] + }, + { + "id": 117, + "type": "blossom", + "region": "璃月3", + "position": { + "x": 456.0, + "y": 546.29 + }, + "prev": [ + 21, + 116 + ], + "next": [] + }, + { + "id": 118, + "type": "blossom", + "region": "稻妻1", + "position": { + "x": -4309.58, + "y": -2288.5 + }, + "prev": [ + 22 + ], + "next": [ + { + "target": 119, + "route": "assets/pathing/稻妻1-鸣神岛-2.json" + } + ] + }, + { + "id": 119, + "type": "blossom", + "region": "稻妻1", + "position": { + "x": -4401.19, + "y": -2226.96 + }, + "prev": [ + 22, + 118 + ], + "next": [ + { + "target": 120, + "route": "assets/pathing/稻妻1-鸣神岛-3.json" + } + ] + }, + { + "id": 120, + "type": "blossom", + "region": "稻妻1", + "position": { + "x": -4509.57, + "y": -2332.11 + }, + "prev": [ + 23, + 119 + ], + "next": [ + { + "target": 121, + "route": "assets/pathing/稻妻1-鸣神岛-4.json" + } + ] + }, + { + "id": 121, + "type": "blossom", + "region": "稻妻1", + "position": { + "x": -4549.68, + "y": -2399.67 + }, + "prev": [ + 24, + 120 + ], + "next": [] + }, + { + "id": 122, + "type": "blossom", + "region": "稻妻2", + "position": { + "x": -3007.64, + "y": -3515.28 + }, + "prev": [ + 25 + ], + "next": [ + { + "target": 123, + "route": "assets/pathing/稻妻2-踏鞴砂-2.json" + } + ] + }, + { + "id": 123, + "type": "blossom", + "region": "稻妻2", + "position": { + "x": -3153.03, + "y": -3485.5 + }, + "prev": [ + 26, + 122 + ], + "next": [ + { + "target": 124, + "route": "assets/pathing/稻妻2-踏鞴砂-3.json" + } + ] + }, + { + "id": 124, + "type": "blossom", + "region": "稻妻2", + "position": { + "x": -3328.99, + "y": -3561.28 + }, + "prev": [ + 27, + 123 + ], + "next": [ + { + "target": 125, + "route": "assets/pathing/稻妻2-踏鞴砂-4.json" + } + ] + }, + { + "id": 125, + "type": "blossom", + "region": "稻妻2", + "position": { + "x": -3429.72, + "y": -3419.55 + }, + "prev": [ + 28, + 124 + ], + "next": [ + { + "target": 126, + "route": "assets/pathing/稻妻2-踏鞴砂-5.json" + } + ] + }, + { + "id": 126, + "type": "blossom", + "region": "稻妻2", + "position": { + "x": -3340.38, + "y": -3237.16 + }, + "prev": [ + 28, + 125 + ], + "next": [] + }, + { + "id": 127, + "type": "blossom", + "region": "稻妻3", + "position": { + "x": -2269.86, + "y": -4068.62 + }, + "prev": [ + 29 + ], + "next": [ + { + "target": 128, + "route": "assets/pathing/稻妻3-八酝岛-2.json" + } + ] + }, + { + "id": 128, + "type": "blossom", + "region": "稻妻3", + "position": { + "x": -2280.61, + "y": -4171.18 + }, + "prev": [ + 127 + ], + "next": [ + { + "target": 129, + "route": "assets/pathing/稻妻3-八酝岛-3.json" + } + ] + }, + { + "id": 129, + "type": "blossom", + "region": "稻妻3", + "position": { + "x": -2169.62, + "y": -4076.36 + }, + "prev": [ + 29, + 128 + ], + "next": [ + { + "target": 130, + "route": "assets/pathing/稻妻3-八酝岛-4.json" + } + ] + }, + { + "id": 130, + "type": "blossom", + "region": "稻妻3", + "position": { + "x": -2211.44, + "y": -4033.62 + }, + "prev": [ + 29, + 129 + ], + "next": [] + }, + { + "id": 131, + "type": "blossom", + "region": "稻妻4", + "position": { + "x": -1120.06, + "y": -3962.66 + }, + "prev": [ + 30 + ], + "next": [ + { + "target": 132, + "route": "assets/pathing/稻妻4-海祇岛-2.json" + } + ] + }, + { + "id": 132, + "type": "blossom", + "region": "稻妻4", + "position": { + "x": -1190.51, + "y": -3902.08 + }, + "prev": [ + 131 + ], + "next": [ + { + "target": 133, + "route": "assets/pathing/稻妻4-海祇岛-4.json" + } + ] + }, + { + "id": 133, + "type": "blossom", + "region": "稻妻4", + "position": { + "x": -1322.41, + "y": -3815.69 + }, + "prev": [ + 31, + 132 + ], + "next": [] + }, + { + "id": 134, + "type": "blossom", + "region": "稻妻5", + "position": { + "x": -3908.27, + "y": -4290.55 + }, + "prev": [ + 32 + ], + "next": [ + { + "target": 135, + "route": "assets/pathing/稻妻5-清籁岛-2.json" + } + ] + }, + { + "id": 135, + "type": "blossom", + "region": "稻妻5", + "position": { + "x": -3850.61, + "y": -4241.9 + }, + "prev": [ + 134 + ], + "next": [ + { + "target": 136, + "route": "assets/pathing/稻妻5-清籁岛-3.json" + } + ] + }, + { + "id": 136, + "type": "blossom", + "region": "稻妻5", + "position": { + "x": -3763.54, + "y": -4259.14 + }, + "prev": [ + 135 + ], + "next": [ + { + "target": 137, + "route": "assets/pathing/稻妻5-清籁岛-4.json" + } + ] + }, + { + "id": 137, + "type": "blossom", + "region": "稻妻5", + "position": { + "x": -3703.34, + "y": -4343.16 + }, + "prev": [ + 33, + 136 + ], + "next": [ + { + "target": 138, + "route": "assets/pathing/稻妻5-清籁岛-5.json" + } + ] + }, + { + "id": 138, + "type": "blossom", + "region": "稻妻5", + "position": { + "x": -3671.61, + "y": -4414.03 + }, + "prev": [ + 137 + ], + "next": [] + }, + { + "id": 139, + "type": "blossom", + "region": "纳塔1", + "position": { + "x": 7864.95, + "y": -1823.96 + }, + "prev": [ + 34 + ], + "next": [ + { + "target": 140, + "route": "assets/pathing/纳塔1-隆崛坡-2.json" + } + ] + }, + { + "id": 140, + "type": "blossom", + "region": "纳塔1", + "position": { + "x": 7945.72, + "y": -1744.08 + }, + "prev": [ + 35, + 139 + ], + "next": [ + { + "target": 141, + "route": "assets/pathing/纳塔1-隆崛坡-3.json" + } + ] + }, + { + "id": 141, + "type": "blossom", + "region": "纳塔1", + "position": { + "x": 7932.2, + "y": -1616.37 + }, + "prev": [ + 35, + 140 + ], + "next": [ + { + "target": 142, + "route": "assets/pathing/纳塔1-隆崛坡-4.json" + } + ] + }, + { + "id": 142, + "type": "blossom", + "region": "纳塔1", + "position": { + "x": 7853.72, + "y": -1554.26 + }, + "prev": [ + 141 + ], + "next": [] + }, + { + "id": 143, + "type": "blossom", + "region": "纳塔10", + "position": { + "x": 8361.82, + "y": -2993.79 + }, + "prev": [ + 36 + ], + "next": [ + { + "target": 144, + "route": "assets/pathing/纳塔10-溶水域-2.json" + } + ] + }, + { + "id": 144, + "type": "blossom", + "region": "纳塔10", + "position": { + "x": 8495.87, + "y": -3019.42 + }, + "prev": [ + 143 + ], + "next": [ + { + "target": 145, + "route": "assets/pathing/纳塔10-溶水域-3.json" + } + ] + }, + { + "id": 145, + "type": "blossom", + "region": "纳塔10", + "position": { + "x": 8587.99, + "y": -3022.4 + }, + "prev": [ + 144 + ], + "next": [ + { + "target": 146, + "route": "assets/pathing/纳塔10-溶水域-4.json" + } + ] + }, + { + "id": 146, + "type": "blossom", + "region": "纳塔10", + "position": { + "x": 8879.8, + "y": -3059.26 + }, + "prev": [ + 37, + 145 + ], + "next": [] + }, + { + "id": 147, + "type": "blossom", + "region": "纳塔2", + "position": { + "x": 8604.22, + "y": -1635.22 + }, + "prev": [ + 38 + ], + "next": [ + { + "target": 148, + "route": "assets/pathing/纳塔2-硫晶支脉-2.json" + } + ] + }, + { + "id": 148, + "type": "blossom", + "region": "纳塔2", + "position": { + "x": 8657.57, + "y": -1501.26 + }, + "prev": [ + 38, + 147 + ], + "next": [ + { + "target": 149, + "route": "assets/pathing/纳塔2-硫晶支脉-3.json" + } + ] + }, + { + "id": 149, + "type": "blossom", + "region": "纳塔2", + "position": { + "x": 8733.62, + "y": -1528.95 + }, + "prev": [ + 38, + 148 + ], + "next": [ + { + "target": 150, + "route": "assets/pathing/纳塔2-硫晶支脉-4.json" + } + ] + }, + { + "id": 150, + "type": "blossom", + "region": "纳塔2", + "position": { + "x": 8588.9, + "y": -1373.62 + }, + "prev": [ + 39, + 149 + ], + "next": [] + }, + { + "id": 151, + "type": "blossom", + "region": "纳塔3", + "position": { + "x": 8312.07, + "y": -2344.44 + }, + "prev": [ + 40 + ], + "next": [ + { + "target": 152, + "route": "assets/pathing/纳塔3-彩石顶-2.json" + } + ] + }, + { + "id": 152, + "type": "blossom", + "region": "纳塔3", + "position": { + "x": 8429.86, + "y": -2328.47 + }, + "prev": [ + 41, + 151 + ], + "next": [ + { + "target": 153, + "route": "assets/pathing/纳塔3-彩石顶-3.json" + } + ] + }, + { + "id": 153, + "type": "blossom", + "region": "纳塔3", + "position": { + "x": 8291.29, + "y": -2096.67 + }, + "prev": [ + 41, + 152 + ], + "next": [ + { + "target": 154, + "route": "assets/pathing/纳塔3-彩石顶-4.json" + } + ] + }, + { + "id": 154, + "type": "blossom", + "region": "纳塔3", + "position": { + "x": 8088.21, + "y": -2053.56 + }, + "prev": [ + 153 + ], + "next": [] + }, + { + "id": 155, + "type": "blossom", + "region": "纳塔4", + "position": { + "x": 9028.67, + "y": -2342.6 + }, + "prev": [ + 42 + ], + "next": [] + }, + { + "id": 156, + "type": "blossom", + "region": "纳塔5", + "position": { + "x": 9687.15, + "y": -2898.19 + }, + "prev": [ + 43 + ], + "next": [ + { + "target": 157, + "route": "assets/pathing/纳塔5-安饶之野-2.json" + } + ] + }, + { + "id": 157, + "type": "blossom", + "region": "纳塔5", + "position": { + "x": 9754.7, + "y": -2904.43 + }, + "prev": [ + 43, + 156 + ], + "next": [ + { + "target": 158, + "route": "assets/pathing/纳塔5-安饶之野-3.json" + } + ] + }, + { + "id": 158, + "type": "blossom", + "region": "纳塔5", + "position": { + "x": 9778.7, + "y": -2856.31 + }, + "prev": [ + 43, + 157 + ], + "next": [] + }, + { + "id": 159, + "type": "blossom", + "region": "纳塔6", + "position": { + "x": 9231.08, + "y": -2154.74 + }, + "prev": [ + 44 + ], + "next": [ + { + "target": 160, + "route": "assets/pathing/纳塔6-圣火竞技场-2.json" + } + ] + }, + { + "id": 160, + "type": "blossom", + "region": "纳塔6", + "position": { + "x": 9110.86, + "y": -2222.48 + }, + "prev": [ + 44, + 159 + ], + "next": [ + { + "target": 161, + "route": "assets/pathing/纳塔6-圣火竞技场-3.json" + } + ] + }, + { + "id": 161, + "type": "blossom", + "region": "纳塔6", + "position": { + "x": 8945.55, + "y": -2138.43 + }, + "prev": [ + 160 + ], + "next": [ + { + "target": 162, + "route": "assets/pathing/纳塔6-圣火竞技场-4.json" + } + ] + }, + { + "id": 162, + "type": "blossom", + "region": "纳塔6", + "position": { + "x": 8810.08, + "y": -2077.83 + }, + "prev": [ + 161 + ], + "next": [] + }, + { + "id": 163, + "type": "blossom", + "region": "纳塔7", + "position": { + "x": 9999.51, + "y": -1570.23 + }, + "prev": [ + 45 + ], + "next": [ + { + "target": 164, + "route": "assets/pathing/纳塔7-烟谜主-3.json" + } + ] + }, + { + "id": 164, + "type": "blossom", + "region": "纳塔7", + "position": { + "x": 9907.78, + "y": -1424.0 + }, + "prev": [ + 163 + ], + "next": [] + }, + { + "id": 165, + "type": "blossom", + "region": "纳塔8", + "position": { + "x": 9636.29, + "y": -1038.41 + }, + "prev": [ + 46 + ], + "next": [ + { + "target": 166, + "route": "assets/pathing/纳塔8-花羽会-2.json" + } + ] + }, + { + "id": 166, + "type": "blossom", + "region": "纳塔8", + "position": { + "x": 9517.92, + "y": -1029.8 + }, + "prev": [ + 46, + 165 + ], + "next": [ + { + "target": 167, + "route": "assets/pathing/纳塔8-花羽会-3.json" + } + ] + }, + { + "id": 167, + "type": "blossom", + "region": "纳塔8", + "position": { + "x": 9472.28, + "y": -771.8 + }, + "prev": [ + 47, + 166 + ], + "next": [] + }, + { + "id": 168, + "type": "blossom", + "region": "纳塔9", + "position": { + "x": 9920.8, + "y": -1196.25 + }, + "prev": [ + 48 + ], + "next": [ + { + "target": 169, + "route": "assets/pathing/纳塔9-翘枝崖-2.json" + } + ] + }, + { + "id": 169, + "type": "blossom", + "region": "纳塔9", + "position": { + "x": 9888.22, + "y": -1046.55 + }, + "prev": [ + 168 + ], + "next": [ + { + "target": 170, + "route": "assets/pathing/纳塔9-翘枝崖-3.json" + } + ] + }, + { + "id": 170, + "type": "blossom", + "region": "纳塔9", + "position": { + "x": 9938.82, + "y": -933.87 + }, + "prev": [ + 169 + ], + "next": [ + { + "target": 171, + "route": "assets/pathing/纳塔9-翘枝崖-4.json" + } + ] + }, + { + "id": 171, + "type": "blossom", + "region": "纳塔9", + "position": { + "x": 9984.24, + "y": -876.43 + }, + "prev": [ + 170 + ], + "next": [] + }, + { + "id": 172, + "type": "blossom", + "region": "蒙德1", + "position": { + "x": -1298.03, + "y": 2172.37 + }, + "prev": [ + 49 + ], + "next": [ + { + "target": 173, + "route": "assets/pathing/蒙德1-风起地-2.json" + } + ] + }, + { + "id": 173, + "type": "blossom", + "region": "蒙德1", + "position": { + "x": -1223.18, + "y": 2032.04 + }, + "prev": [ + 50, + 172 + ], + "next": [ + { + "target": 174, + "route": "assets/pathing/蒙德1-风起地-3.json" + } + ] + }, + { + "id": 174, + "type": "blossom", + "region": "蒙德1", + "position": { + "x": -1113.87, + "y": 1971.9 + }, + "prev": [ + 173 + ], + "next": [ + { + "target": 175, + "route": "assets/pathing/蒙德1-风起地-4.json" + } + ] + }, + { + "id": 175, + "type": "blossom", + "region": "蒙德1", + "position": { + "x": -1041.91, + "y": 1927.07 + }, + "prev": [ + 174 + ], + "next": [ + { + "target": 176, + "route": "assets/pathing/蒙德1-风起地-5.json" + } + ] + }, + { + "id": 176, + "type": "blossom", + "region": "蒙德1", + "position": { + "x": -895.08, + "y": 1833.84 + }, + "prev": [ + 51, + 175, + 202 + ], + "next": [] + }, + { + "id": 177, + "type": "blossom", + "region": "蒙德2", + "position": { + "x": -717.83, + "y": 1802.77 + }, + "prev": [ + 52 + ], + "next": [ + { + "target": 178, + "route": "assets/pathing/蒙德2-清泉镇-2.json" + } + ] + }, + { + "id": 178, + "type": "blossom", + "region": "蒙德2", + "position": { + "x": -523.76, + "y": 1813.84 + }, + "prev": [ + 53, + 177 + ], + "next": [ + { + "target": 179, + "route": "assets/pathing/蒙德2-清泉镇-3.json" + } + ] + }, + { + "id": 179, + "type": "blossom", + "region": "蒙德2", + "position": { + "x": -420.36, + "y": 1998.11 + }, + "prev": [ + 178 + ], + "next": [ + { + "target": 180, + "route": "assets/pathing/蒙德2-清泉镇-4.json" + } + ] + }, + { + "id": 180, + "type": "blossom", + "region": "蒙德2", + "position": { + "x": -319.46, + "y": 2156.93 + }, + "prev": [ + 179 + ], + "next": [] + }, + { + "id": 181, + "type": "blossom", + "region": "蒙德3", + "position": { + "x": -281.79, + "y": 2310.78 + }, + "prev": [ + 54 + ], + "next": [ + { + "target": 182, + "route": "assets/pathing/蒙德3-奔狼领-2.json" + } + ] + }, + { + "id": 182, + "type": "blossom", + "region": "蒙德3", + "position": { + "x": -205.49, + "y": 2429.07 + }, + "prev": [ + 181 + ], + "next": [ + { + "target": 183, + "route": "assets/pathing/蒙德3-奔狼领-3.json" + } + ] + }, + { + "id": 183, + "type": "blossom", + "region": "蒙德3", + "position": { + "x": -327.03, + "y": 2410.43 + }, + "prev": [ + 182 + ], + "next": [ + { + "target": 184, + "route": "assets/pathing/蒙德3-奔狼领-4.json" + } + ] + }, + { + "id": 184, + "type": "blossom", + "region": "蒙德3", + "position": { + "x": -336.15, + "y": 2562.91 + }, + "prev": [ + 55, + 183 + ], + "next": [] + }, + { + "id": 185, + "type": "blossom", + "region": "蒙德4", + "position": { + "x": 241.41, + "y": 2703.08 + }, + "prev": [ + 56 + ], + "next": [ + { + "target": 186, + "route": "assets/pathing/蒙德4-风龙废墟-2.json" + } + ] + }, + { + "id": 186, + "type": "blossom", + "region": "蒙德4", + "position": { + "x": 124.61, + "y": 2817.24 + }, + "prev": [ + 185 + ], + "next": [ + { + "target": 187, + "route": "assets/pathing/蒙德4-风龙废墟-3.json" + } + ] + }, + { + "id": 187, + "type": "blossom", + "region": "蒙德4", + "position": { + "x": 152.71, + "y": 2963.33 + }, + "prev": [ + 57, + 186 + ], + "next": [ + { + "target": 188, + "route": "assets/pathing/蒙德4-风龙废墟-4.json" + } + ] + }, + { + "id": 188, + "type": "blossom", + "region": "蒙德4", + "position": { + "x": -27.99, + "y": 2919.59 + }, + "prev": [ + 187 + ], + "next": [] + }, + { + "id": 189, + "type": "blossom", + "region": "蒙德5", + "position": { + "x": -1453.46, + "y": 2282.88 + }, + "prev": [ + 58 + ], + "next": [ + { + "target": 190, + "route": "assets/pathing/蒙德5-千风神殿-2.json" + } + ] + }, + { + "id": 190, + "type": "blossom", + "region": "蒙德5", + "position": { + "x": -1367.78, + "y": 2411.31 + }, + "prev": [ + 189 + ], + "next": [ + { + "target": 191, + "route": "assets/pathing/蒙德5-千风神殿-3.json" + } + ] + }, + { + "id": 191, + "type": "blossom", + "region": "蒙德5", + "position": { + "x": -1474.91, + "y": 2520.0 + }, + "prev": [ + 190 + ], + "next": [ + { + "target": 192, + "route": "assets/pathing/蒙德5-千风神殿-4.json" + } + ] + }, + { + "id": 192, + "type": "blossom", + "region": "蒙德5", + "position": { + "x": -1394.83, + "y": 2569.65 + }, + "prev": [ + 59, + 191 + ], + "next": [ + { + "target": 193, + "route": "assets/pathing/蒙德5-千风神殿-5.json" + } + ] + }, + { + "id": 193, + "type": "blossom", + "region": "蒙德5", + "position": { + "x": -1316.21, + "y": 2734.67 + }, + "prev": [ + 60, + 192 + ], + "next": [] + }, + { + "id": 194, + "type": "blossom", + "region": "蒙德6", + "position": { + "x": -1512.81, + "y": 2774.26 + }, + "prev": [ + 60 + ], + "next": [ + { + "target": 195, + "route": "assets/pathing/蒙德6-望风山地-2.json" + } + ] + }, + { + "id": 195, + "type": "blossom", + "region": "蒙德6", + "position": { + "x": -1518.71, + "y": 2877.4 + }, + "prev": [ + 194 + ], + "next": [ + { + "target": 196, + "route": "assets/pathing/蒙德6-望风山地-3.json" + } + ] + }, + { + "id": 196, + "type": "blossom", + "region": "蒙德6", + "position": { + "x": -1603.95, + "y": 2865.65 + }, + "prev": [ + 61, + 195 + ], + "next": [ + { + "target": 197, + "route": "assets/pathing/蒙德6-望风山地-4.json" + } + ] + }, + { + "id": 197, + "type": "blossom", + "region": "蒙德6", + "position": { + "x": -1710.73, + "y": 2983.29 + }, + "prev": [ + 196 + ], + "next": [] + }, + { + "id": 198, + "type": "blossom", + "region": "蒙德7", + "position": { + "x": -1660.63, + "y": 1392.87 + }, + "prev": [ + 62 + ], + "next": [ + { + "target": 199, + "route": "assets/pathing/蒙德7-达达乌帕谷-2.json" + } + ] + }, + { + "id": 199, + "type": "blossom", + "region": "蒙德7", + "position": { + "x": -1517.07, + "y": 1513.97 + }, + "prev": [ + 63, + 198 + ], + "next": [ + { + "target": 200, + "route": "assets/pathing/蒙德7-达达乌帕谷-3.json" + } + ] + }, + { + "id": 200, + "type": "blossom", + "region": "蒙德7", + "position": { + "x": -1331.96, + "y": 1560.15 + }, + "prev": [ + 63, + 199 + ], + "next": [ + { + "target": 201, + "route": "assets/pathing/蒙德7-达达乌帕谷-4.json" + } + ] + }, + { + "id": 201, + "type": "blossom", + "region": "蒙德7", + "position": { + "x": -1318.63, + "y": 1692.63 + }, + "prev": [ + 200 + ], + "next": [ + { + "target": 202, + "route": "assets/pathing/蒙德7-达达乌帕谷-5.json" + } + ] + }, + { + "id": 202, + "type": "blossom", + "region": "蒙德7", + "position": { + "x": -1138.22, + "y": 1789.79 + }, + "prev": [ + 201 + ], + "next": [ + { + "target": 176, + "route": "assets/pathing/蒙德7-达达乌帕谷-6.json" + } + ] + }, + { + "id": 203, + "type": "blossom", + "region": "须弥1", + "position": { + "x": 2368.79, + "y": -92.11 + }, + "prev": [ + 64 + ], + "next": [ + { + "target": 204, + "route": "assets/pathing/须弥1-无郁稠林-2.json" + } + ] + }, + { + "id": 204, + "type": "blossom", + "region": "须弥1", + "position": { + "x": 2317.29, + "y": -115.35 + }, + "prev": [ + 203 + ], + "next": [ + { + "target": 205, + "route": "assets/pathing/须弥1-无郁稠林-3.json" + } + ] + }, + { + "id": 205, + "type": "blossom", + "region": "须弥1", + "position": { + "x": 2212.83, + "y": -83.02 + }, + "prev": [ + 204 + ], + "next": [ + { + "target": 206, + "route": "assets/pathing/须弥1-无郁稠林-4.json" + } + ] + }, + { + "id": 206, + "type": "blossom", + "region": "须弥1", + "position": { + "x": 2233.8, + "y": -160.88 + }, + "prev": [ + 205 + ], + "next": [ + { + "target": 207, + "route": "assets/pathing/须弥1-无郁稠林-5.json" + } + ] + }, + { + "id": 207, + "type": "blossom", + "region": "须弥1", + "position": { + "x": 2269.0, + "y": -251.14 + }, + "prev": [ + 206 + ], + "next": [] + }, + { + "id": 208, + "type": "blossom", + "region": "须弥2", + "position": { + "x": 2910.46, + "y": -1818.57 + }, + "prev": [ + 65 + ], + "next": [ + { + "target": 209, + "route": "assets/pathing/须弥2-奥摩斯港西-2.json" + } + ] + }, + { + "id": 209, + "type": "blossom", + "region": "须弥2", + "position": { + "x": 2980.38, + "y": -1758.57 + }, + "prev": [ + 208 + ], + "next": [ + { + "target": 210, + "route": "assets/pathing/须弥2-奥摩斯港西-3.json" + } + ] + }, + { + "id": 210, + "type": "blossom", + "region": "须弥2", + "position": { + "x": 3013.06, + "y": -1700.54 + }, + "prev": [ + 66, + 209 + ], + "next": [ + { + "target": 211, + "route": "assets/pathing/须弥2-奥摩斯港西-4.json" + } + ] + }, + { + "id": 211, + "type": "blossom", + "region": "须弥2", + "position": { + "x": 2981.92, + "y": -1641.54 + }, + "prev": [ + 210 + ], + "next": [ + { + "target": 212, + "route": "assets/pathing/须弥2-奥摩斯港西-5.json" + } + ] + }, + { + "id": 212, + "type": "blossom", + "region": "须弥2", + "position": { + "x": 2963.07, + "y": -1586.92 + }, + "prev": [ + 211 + ], + "next": [] + }, + { + "id": 213, + "type": "blossom", + "region": "须弥5", + "position": { + "x": 4345.77, + "y": -1793.67 + }, + "prev": [ + 67 + ], + "next": [ + { + "target": 214, + "route": "assets/pathing/须弥5-阿如村-2.json" + } + ] + }, + { + "id": 214, + "type": "blossom", + "region": "须弥5", + "position": { + "x": 4257.86, + "y": -1903.31 + }, + "prev": [ + 213 + ], + "next": [ + { + "target": 215, + "route": "assets/pathing/须弥5-阿如村-3.json" + } + ] + }, + { + "id": 215, + "type": "blossom", + "region": "须弥5", + "position": { + "x": 4144.29, + "y": -2014.19 + }, + "prev": [ + 214, + 215 + ], + "next": [ + { + "target": 215, + "route": "assets/pathing/须弥5-阿如村-4.json" + }, + { + "target": 216, + "route": "assets/pathing/须弥5-阿如村-5.json" + } + ] + }, + { + "id": 216, + "type": "blossom", + "region": "须弥5", + "position": { + "x": 4211.01, + "y": -2165.65 + }, + "prev": [ + 215 + ], + "next": [] + }, + { + "id": 217, + "type": "blossom", + "region": "须弥6", + "position": { + "x": 4552.75, + "y": -2945.07 + }, + "prev": [ + 68 + ], + "next": [ + { + "target": 218, + "route": "assets/pathing/须弥6-荼诃落谷-2.json" + } + ] + }, + { + "id": 218, + "type": "blossom", + "region": "须弥6", + "position": { + "x": 4696.5, + "y": -3055.9 + }, + "prev": [ + 69, + 217 + ], + "next": [ + { + "target": 219, + "route": "assets/pathing/须弥6-荼诃落谷-3.json" + } + ] + }, + { + "id": 219, + "type": "blossom", + "region": "须弥6", + "position": { + "x": 4886.54, + "y": -2940.45 + }, + "prev": [ + 218 + ], + "next": [ + { + "target": 220, + "route": "assets/pathing/须弥6-荼诃落谷-4.json" + } + ] + }, + { + "id": 220, + "type": "blossom", + "region": "须弥6", + "position": { + "x": 4756.03, + "y": -2742.32 + }, + "prev": [ + 70, + 219 + ], + "next": [] + } + ] +} \ No newline at end of file diff --git a/repo/js/AutoLeyLineOutcrop/README.md b/repo/js/AutoLeyLineOutcrop/README.md index 2be4603c..12af6673 100644 --- a/repo/js/AutoLeyLineOutcrop/README.md +++ b/repo/js/AutoLeyLineOutcrop/README.md @@ -1,21 +1,20 @@ # BGI全自动地脉花脚本使用手册 -仅支持BetterGI 0.44.3 及以上版本! +仅支持BetterGI 0.44.7 及以上版本! 仅支持Bitblt截图方式! ## 配置 使用前需要对脚本以及战斗策略进行配置 在调度器新建一个配置组,将脚本添加进来 右键脚本选择修改js脚本自定义配置,根据你的需要对脚本进行配置。 目前刷取次数设置没有实际效果 -配置战斗策略,点击配置组设置,打开地图追踪设置,开启在js中使用和覆盖js战斗策略,并打开战斗策略配置,根据你的队伍进行配置。 +### 配置地图追踪策略和战斗策略 +点击配置组设置,打开地图追踪设置,**关闭自动拾取**,**开启允许在js中使用**和**覆盖js中的自动战斗策略** +开启战斗策略配置,**关闭自动检测战斗结束**,其他的根据你的队伍进行配置 +### 七天神像 在bgi设置内,关闭就近七天神像,指定一个七天神像,如无特殊要求推荐选择须弥道成林。 -## 强制运行模式 -启用后,该脚本将按照既定路线运行,不再于大地图上搜寻地脉花。 -即便无法领取地脉花奖励,脚本仍将继续运行。 -此模式适用于以下场景:地脉花并非首个目标,或全自动运行过程中因特定原因中断后需要继续恢复运行。 ## 特色介绍 - **全自动运行**:配置好之后,只需要点击运行,就可以全部打完,无需任何其他操作。 -- **自动寻找地脉花**:由于地脉花出现的第一个位置是固定的,脚本以此来寻找地脉花,并执行后续的路线。 -- **自动开启地脉花奖励,优先使用浓缩树脂**:领取奖励时优先选择浓缩树脂。后续会加入优先选择双倍奖励。- +- **自动寻找地脉花**:通过大地图定位地脉花位置的方式来寻找地脉花,并执行后续的路线。 +- **自动开启地脉花奖励,优先使用浓缩树脂**:领取奖励时优先选择浓缩树脂,当存在双倍奖励活动(地脉移涌或星之归还)时会优先选择双倍奖励。 - **好感队领取奖励**:领取奖励前切换到好感队,还可以领取到好感度。 - **树脂不足时自动停止**:如果领取奖励时树脂不够了,脚本会直接停止,不会使用脆弱树脂。 ## 常见问题 @@ -28,17 +27,23 @@ wgc的bug,请使用bitblt截图方式,脚本只支持这个 如果一定要用wgc,请自行修改所有地图追踪文件的坐标 如果后续bgi没有修复这个bug的打算,可能会出一个wgc专版 -### 明明设置了刷经验花/摩拉花,但是会打另一种花 +### 路线中途跳过了一个点位 当地脉花打完后,下一个点位已经存在另一类型的地脉花,则下一朵地脉花将跳过这个点,刷新在下一个位置。 -例如这里,摩拉花刷新在经验花的下一个位置上 -目前没有很好的解决方法 +脚本会跳过这个被占用的点位。 ### 跑完后大地图所有自定义的标点都没了 打开大地图,点击左下角设置,开启自定义标记。 -脚本正常结束运行时会打开的。 -### 强制运行模式报错 Could not find file 'xxx.json'. -代码写的不够优雅,实际上到这里脚本也该结束了。 -除了最后可能无法开启自定义标记外不影响正常运行。 +脚本非正常结束运行时会出现该问题。 ## 更新日志 +### 3.0 +**本次更新内容很多,详情可以到[GitHub](https://github.com/babalae/bettergi-scripts-list/pull/633)上查看** +- 新增路线:地中之盐 瑶光滩 药蝶谷 踏鞴砂 海祇岛 硫晶支脉 翘枝崖 溶水域 八酝岛 彩石顶 花羽会 鸣神岛 清籁岛 +稻妻与纳塔的路线已全部补全 +- 优化战斗相关逻辑,通过识别挑战结果来判断战斗是否结束 +- **全地脉花识别** +- 移除强制运行模式 +- 优化地脉花寻找逻辑 +- 优化地脉开启和领取奖励相关逻辑 +- 新增优先使用双倍奖励(地脉移涌和星之归还) ### 2.1 - 重构寻找地脉花位置的方式为获取地脉花在游戏内的坐标 理论上会减少找不到地脉花的情况 @@ -51,36 +56,625 @@ wgc的bug,请使用bitblt截图方式,脚本只支持这个 ### 1.0 - 脚本发布 -## 路线制作进度 +## 路线 打钩的代表已制作完成 带🏃‍的代表可重跑 ### 蒙德 -- [x] 风起地 -- [x] 清泉镇 -- [x] 奔狼领 -- [x] 风龙废墟 -- [x] 千风神殿 -- [x] 望风山地 -- [x] 达达乌帕谷 +- [x] 1. 风起地 + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:丘丘人x3
第二波:丘丘人x1、雷箭丘丘人x2、水深渊法师x1 +2 | 第一波:大型雷史莱姆x1、变异雷史莱姆x1、雷箭丘丘人x1
第二波:大型雷史莱姆x1、变异雷史莱姆x1、水丘丘萨满x1、冰箭丘丘人x2 +3 | 第一波:盗宝团·斥候x2、盗宝团·掘墓者x1、盗宝团·雷之药剂师x1
第二波:盗宝团·神射手x1、盗宝团·杂工x1、盗宝团·雷之药剂师x1、盗宝团·粉碎者x1 +4 | 第一波:木盾丘丘人x3、爆弹丘丘人x1、火史莱姆x2
第二波:冲锋丘丘人x4 +5 | 第一波:大型水史莱姆x2、冰霜骗骗花x1
第二波:雷史莱姆x3、冰霜骗骗花x1 + +- [x] 2. 清泉镇 + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:大型火史莱姆x1、雷史莱姆x2
第二波:炽热骗骗花x1、雷史莱姆x3 +2 | 第一波:大型火史莱姆x1、火史莱姆x4
第二波:炽热骗骗花x2 +3 | 第一波:火箭丘丘人x2、风丘丘萨满x1、大型火史莱姆x1
第二波:爆弹丘丘人x2、风丘丘萨满x1、大型火史莱姆x1 +4 | 第一波:火史莱姆x2、爆弹丘丘人x2
第二波:雷箭丘丘人x3、火深渊法师x1 +5 | 第一波:狂风之核x1 + +注意:路线 4 可能会跳过 + +- [x] 3. 奔狼领 (特征点少,有概率失败) + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:盗宝团·斥候x3
第二波:盗宝团·杂工x2、盗宝团·神射手x2 +2 | 第一波:遗迹守卫x1 +3 | 第一波:火箭丘丘人x2、木盾丘丘人x2
第二波:火斧丘丘人x1、风丘丘萨满x1、爆弹丘丘人x3 +4 | 第一波:木盾丘丘人x2、雷箭丘丘人x2、爆弹丘丘人x2
第二波:火深渊法师x2 + +- [x] 4. 风龙废墟 + +**地脉花总数:4/5** + +顺序 | 怪物 +--- | --- +1 | 第一波:盗宝团·斥候x2、盗宝团·杂工x1、盗宝团·神射手x1
第二波:盗宝团·斥候x2、盗宝团·粉碎者x1、盗宝团·火之药剂师x1、盗宝团·雷之药剂师x1 +2 | 第一波:遗迹猎者x1 +3 | 第一波:遗迹守卫x1 +4 | 第一波:愚人众先遣队·雷锤前锋军x1、愚人众先遣队·风拳前锋军x1
第二波:愚人众先遣队·火铳游击兵x2、愚人众先遣队·水锤重卫士x1 +5(蓝花) | 第一波:木盾丘丘人x2、爆弹丘丘人x2
第二波:爆弹丘丘人x2、风丘丘萨满x1、草丘丘萨满x1 + +- [x] 5. 千风神殿 + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:木盾丘丘人x2、雷箭丘丘人x1、冰箭丘丘人x1
第二波:雷箭丘丘人x1、冰箭丘丘人x1、水丘丘萨满x1、木盾丘丘人x1、木盾丘丘暴徒x1 +2 | 第一波:木盾丘丘人x2、冲锋丘丘人x2
第二波:冲锋丘丘人x3、草丘丘萨满x1 +3 | 第一波:盗宝团·斥候x4、盗宝团·神射手x1
第二波:盗宝团·火之药剂师x2、盗宝团·拳术家x1、盗宝团·粉碎者x1 +4 | 第一波:雷史莱姆x2、冲锋丘丘人x2、木盾丘丘人x1
第二波:雷史莱姆x2、爆弹丘丘人x2、火斧丘丘暴徒x1 +5 | 第一波:木盾丘丘人x2、爆弹丘丘人x2
第二波:爆弹丘丘人x2、风丘丘萨满x1、草丘丘萨满x1 + +- [x] 6. 望风山地 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:大型冰史莱姆x2、大型水史莱姆x2
第二波:冰箭丘丘人x2、水深渊法师x1 +2 | 第一波:爆弹丘丘人x2、风丘丘萨满x2
第二波:雷箭丘丘人x2、爆弹丘丘人x1、火斧丘丘暴徒x1 +3 | 第一波:炽热骗骗花x2
第二波:雷箭丘丘人x3、火深渊法师x1 +4 | 第一波:冲锋丘丘人x3
第二波:木盾丘丘暴徒x2、水丘丘萨满x2 + +- [x] 7. 达达乌帕谷 + +**地脉花总数:6** + +顺序 | 怪物 +--- | --- +1 | 第一波:木盾丘丘人x2、射手丘丘人x2
第二波:水深渊法师x1、冰箭丘丘人x2 +2 | 第一波:打手丘丘人x3、爆弹丘丘人x1
第二波:冲锋丘丘人x3、火斧丘丘暴徒x1 +3 | 第一波:打手丘丘人x2、木盾丘丘人x2、火箭丘丘人x1
第二波:火斧丘丘暴徒x2 +4 | 第一波:雷箭丘丘人x2、火斧丘丘暴徒x1
第二波:火箭丘丘人x3、草丘丘萨满x1 +5 | 第一波:木盾丘丘人x2、水丘丘萨满x1
第二波:木盾丘丘人x2、雷箭丘丘人x1、水深渊法师x1 +6 | 第一波:大型水史莱姆x2、冰霜骗骗花x1
第二波:雷史莱姆x3、冰霜骗骗花x1 + ### 璃月 -- [x] 石门 +- [x] 1. 石门 + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:盗宝团·神射手x2、盗宝团·斥候x1、盗宝团·粉碎者x1
第二波:盗宝团·掘墓者x1、盗宝团·火之药剂师x1、盗宝团·斥候x1、盗宝团·神射手x1 +2 | 第一波:大型岩史莱姆x1、岩史莱姆x3
第二波:大型岩史莱姆x2、岩史莱姆x2 +3 | 第一波:火深渊法师x1、雷箭丘丘人x2
第二波:火斧丘丘人暴徒x1、冰箭丘丘人x2、水丘丘人萨满x1 +4 | 第一波:木盾丘丘暴徒x2
第二波:岩盾丘丘暴徒x2 +5 | 第一波:岩丘丘人萨满x2、爆弹丘丘人投手x2
第二波:岩盾丘丘人暴徒x2 + +- [x] 2. 🏃地中之盐 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:冲锋丘丘人x2、爆弹丘丘人x1、草丘丘人萨满x1
第二波:雷箭丘丘人x2、火深渊法师x1 +2 | 第一波:水萤x3、大型冰史莱姆x1、冰史莱姆x1
第二波:雷萤术士x1 +3 | 第一波:岩盔丘丘王x1 +4 | 第一波:火箭丘丘人x2、冲锋丘丘人x1、岩丘丘人萨满x1
第二波:雷箭丘丘人x4、岩丘丘人萨满x1 + +- [x] 3. 🏃瑶光滩 + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:水史莱姆x2、冰霜骗骗花x1
第二波:水萤x3、雷萤术士x1 +2 | 第一波:遗迹守卫x1 +3 | 第一波:盗宝团·拳术师x1、盗宝团·神射手x2、盗宝团·火之药剂师x1
第二波:盗宝团·斥候x1、盗宝团·杂工x1、盗宝团·神射手x1、盗宝团·海上男儿x1 +4 | 第一波:冰箭丘丘人x2、雷箭丘丘人x1
第二波:冰深渊法师x1、雷箭丘丘人x1、水丘丘人萨满x1 +5 | 第一波:大型火史莱姆x2、火史莱姆x3
第二波:炽热骗骗花x2 + + +- [ ] 4. 璃月港 + +**地脉花总数:7** + +顺序 | 怪物 +--- | --- +1 | 第一波:幼岩龙蜥x2
第二波:幼岩龙蜥x2 +2 | 第一波:岩盔丘丘王x1 +3 | 第一波:愚人众先遣队·水铳重卫士x1、愚人众先遣队·冰铳重卫士x1
第二波:愚人众先遣队·风拳前锋军x1、愚人众先遣队·雷锤前锋军x1 +4 | 第一波:大型岩史莱姆x1、岩史莱姆x4
第二波:大型岩史莱姆x3 +5 | 第一波:遗迹守卫x1 +6 | 第一波:冰箭丘丘人x2、雷箭丘丘人x1
第二波:冰深渊法师x1、雷箭丘丘人x1、水丘丘人萨满x1 +7 | 第一波:大型火史莱姆x2、火史莱姆x3
第二波:炽热骗骗花x2 + +- [ ] 5. 天衡山 + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:遗迹猎者x1 +2 | 第一波:大型雷史莱姆x1、变异雷史莱姆x1
第二波:大型冰史莱姆x1、冰史莱姆x3 +3 | 第一波:水深渊法师x1、冰史莱姆x2
第二波:冰深渊法师x1、雷箭丘丘人x2 +4 | 第一波:岩盾丘丘人x4
第二波:岩盾丘丘人暴徒x2 +5 | 第一波:火斧丘丘暴徒x2
第二波:岩盾丘丘暴徒x1、岩丘丘萨满x1、爆弹丘丘人x2 + +- [ ] 6. 奥藏山 + +**地脉花总数:7/9** + +顺序 | 怪物 +--- | --- +1 | 第一波:火史莱姆x3、炽热骗骗花x1
第二波:冰史莱姆x3、冰霜骗骗花x1 +2 | 第一波:愚人众·火之债务处理人x1 +3 | 第一波:雷史莱姆x4、炽热骗骗花x1
第二波:大型岩史莱姆x2、炽热骗骗花x1 +4 | 第一波:雷史莱姆x3、冲锋丘丘人x2、岩盾丘丘人x1
第二波:火史莱姆x2、爆弹丘丘人x2、岩盾丘丘人x2 +分支线路1:| +5 | 第一波:愚人众先遣队·雷锤前锋军x1、愚人众先遣队·冰铳重卫士x1
第二波:愚人众先遣队·雷锤前锋军x1、愚人众先遣队·火铳游击兵x1、愚人众先遣队·岩使游击兵x1 +6 | 第一波:岩盔丘丘王x1 +7 | 第一波:雷萤术士x1、雷萤x3 +分支线路2:| +5 | 第一波:雷萤x2、愚人众·火之债务处理人x1 +6 | 第一波:岩盾丘丘人x1、火箭丘丘人x3
第二波:火斧丘丘人暴徒x1、爆弹丘丘人投手x2 +7 | 第一波:大型雷史莱姆x1、雷史莱姆x3、水史莱姆x2
第二波:大型雷史莱姆x1、变异雷史莱姆x1、雷史莱姆x3、大型水史莱姆x2 +8 | 第一波:大型冰史莱姆x2
第二波:大型水史莱姆x3 +9 | 第一波:大型火史莱姆x2、火史莱姆x3
第二波:炽热骗骗花x2 + +- [ ] 7. 遁玉陵 + +**地脉花总数:7** + +顺序 | 怪物 +--- | --- +1 | 第一波:雷萤x3、水萤x3
第二波:雷萤术士x1 +2 | 第一波:盗宝团·雷之药剂师x1、盗宝团·火之药剂师x1、盗宝团·神射手x1、盗宝团·拳术师x1
第二波:盗宝团·拳术师x1、盗宝团·杂工x1、盗宝团·雷之药剂师x1、盗宝团·火之药剂师x1 +3 | 第一波:大型冰史莱姆x2
第二波:冰霜骗骗花x1、大型水史莱姆x2 +4 | 第一波:火深渊法师x1、雷箭丘丘人x2
第二波:冰深渊法师x1、雷箭丘丘人x3 +5 | 第一波:大型冰史莱姆x2
第二波:大型水史莱姆x3 +6 | 第一波:大型火史莱姆x2、火史莱姆x3
第二波:炽热骗骗花x2 + +- [ ] 8. 南天门南 + +**地脉花总数:7** + +顺序 | 怪物 +--- | --- +1 | 第一波:遗迹守卫x2 +2 | 第一波:岩盔丘丘王x1 +3 | 第一波:火斧丘丘人暴徒x2
第二波:火深渊法师x1、冲锋丘丘人x3 +4 | 第一波:大型雷史莱姆x1、雷史莱姆x4
第二波:炽热骗骗花x1、雷史莱姆x4 +5 | 第一波:火深渊法师x1、雷箭丘丘人x2
第二波:冰深渊法师x1、雷箭丘丘人x3 +6 | 第一波:大型冰史莱姆x2
第二波:大型水史莱姆x3 +7 | 植物:烈焰花x4
第一波:大型火史莱姆x2、火史莱姆x3
第二波:炽热骗骗花x2 + +- [ ] 9. 南天门东 + +**地脉花总数:2** + +顺序 | 怪物 +--- | --- +1 | 第一波:炽热骗骗花x1、火史莱姆x3
第二波:岩史莱姆x4
第三波:大型岩史莱姆x1、岩史莱姆x2 +2 | 第一波:愚人众·火之债务处理人x1 + +- [ ] 10. 绝云间 + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:岩盾丘丘人x4、爆弹丘丘人投手x1
第二波:水丘丘人萨满x2、冰深渊法师x1 +2 | 第一波:岩盾丘丘人x1、火箭丘丘人x3
第二波:火斧丘丘人暴徒x1、爆弹丘丘人投手x2 +3 | 第一波:大型雷史莱姆x1、雷史莱姆x3、水史莱姆x2
第二波:大型雷史莱姆x1、变异雷史莱姆x1、雷史莱姆x3、大型水史莱姆x2 +4 | 第一波:大型冰史莱姆x2
第二波:大型水史莱姆x3 +5 | 第一波:大型火史莱姆x2、火史莱姆x3
第二波:炽热骗骗花x2 + +- [x] 11. 轻策庄 + +**地脉花总数:6** + +顺序 | 怪物 +--- | --- +1 | 第一波:大型冰史莱姆x1、大型水史莱姆x2
第二波:大型雷史莱姆x1、变异雷史莱姆x1、大型火史莱姆x1 +2 | 第一波:盗宝团·神射手x1、盗宝团·杂工x1、盗宝团·火之药剂师x1、盗宝团·斥候x1
第二波:盗宝团·斥候x1、盗宝团·掘墓者x1、盗宝团·粉碎者x1 +3 | 第一波:岩盾丘丘人x1、雷箭丘丘人x1、冰箭丘丘人x2
第二波:雷箭丘丘人x2、冰深渊法师x1 +4 | 第一波:愚人众先遣队·雷锤前锋军x1、愚人众先遣队·冰铳重卫士x1
第二波:愚人众先遣队·雷锤前锋军x1、愚人众先遣队·火铳游击兵x1、愚人众先遣队·岩使游击兵x1 +5 | 第一波:岩盔丘丘王x1 +6 | 第一波:雷萤术士x1、雷萤x3 + +- [ ] 12. 孤云阁(特征点少,录制困难) + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:大型冰史莱姆x2、冰史莱姆x3
第二波:冰霜骗骗花x2 +2 | 第一波:岩盔丘丘王x1 +3 | 第一波:愚人众先遣队·水铳重卫士x1、愚人众先遣队·冰铳重卫士x1、愚人众先遣队·风拳前锋军x1
第二波:愚人众·火之债务处理人x1 +4 | 第一波:水深渊法师x1、冰箭丘丘人x3
第二波:冰深渊法师x1、雷箭丘丘人x2 + +- [ ] 13. 悬练山 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:丘丘人x3、火斧丘丘暴徒x1
第二波:岩盾丘丘暴徒x2 +2 | 第一波:雷史莱姆x2、大型雷史莱姆x2
第二波:大型水史莱姆x2 +3 | 第一波:玄文兽x2
第二波:玄文兽x2 +4 | 第一波:丘丘人x2、岩盾丘丘人x1、冲锋丘丘人x1、爆弹丘丘人x1
第二波:火斧丘丘暴徒x2 + +- [x] 14. 药蝶谷 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:遗迹守卫x2
第二波:遗迹猎者x1 +2 | 第一波:玄文兽x2
第二波:玄文兽x2 +3 | 第一波:丘丘人x3、火斧丘丘暴徒x1
第二波:岩盾丘丘暴徒x2 +4 | 第一波:玄文兽x2
第二波:玄文兽x2 + ### 稻妻 +- [x] 1. 🏃鸣神岛 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:遗迹巡弋者x2
第二波:遗迹歼击者x2 +2 | 第一波:水史莱姆x5
第二波:大型水史莱姆x2 +3 | 第一波:野伏·机巧番x1、野伏·火付番x1、野伏·阵刀番x1 +4 | 第一波:海乱鬼·炎威x1、海乱鬼·雷腾x1 + +- [x] 2. 踏鞴砂 + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:愚人众·雷萤术士x1、愚人众·藏镜仕女x1
第二波:愚人众·冰萤术士x1、愚人众·藏镜仕女x1 +2 | 第一波:愚人众先遣队·岩使游击兵x1、愚人众先遣队·风拳前锋军x1
第二波:愚人众·火之债务处理人x1、愚人众·藏镜仕女x1 +3 | 第一波:盗宝团·水之药剂师x2、盗宝团·海上男儿x2
第二波:盗宝团·掘墓者x1、盗宝团·粉碎者x1 +4 | 第一波:遗迹侦察者x1、遗迹防卫者x1
第二波:遗迹歼击者x1、遗迹巡弋者x1 +5 | 第一波:海乱鬼·雷腾x1、野伏·阵刀番x1、盗宝团·冰之药剂师x1、盗宝团·水之药剂师x1
第二波:海乱鬼·雷腾x1、盗宝团·海上男儿x1 + +- [x] 3. 八酝岛 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:海乱鬼·炎威x1、海乱鬼·雷腾x1 +2 | 第一波:遗迹歼击者x3 +3 | 第一波:野伏·机巧番x1、野伏·火付番x1、野伏·阵刀番x1
第二波:野伏·机巧番x1、野伏·火付番x1、野伏·阵刀番x1 +4 | 第一波:遗迹歼击者x3 + + +- [x] 4. 海祇岛 + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:雷丘丘萨满x1、雷弹丘丘人x3
第二波:雷深渊法师x2 +2 | 第一波:风飘浮灵x3、大型风史莱姆x1
第二波:水飘浮灵x3、大型水史莱姆x1 +3 | 第一波:野伏·火付番x1、野伏·阵刀番x2
第二波:海乱鬼·炎威x1、海乱鬼·雷腾x1 +4 | 第一波:愚人众先遣队·冰铳重卫士x1、愚人众先遣队·水铳重卫士x1
第二波:愚人众·雷萤术士x1、愚人众·冰萤术士x1 +5 | 第一波:愚人众先遣队·冰铳重卫士x1、愚人众先遣队·雷锤前锋军x1
第二波:愚人众先遣队·风拳前锋军x1、愚人众先遣队·水铳重卫士x1、愚人众先遣队·岩使游击兵x1 + +- [x] 5. 🏃清籁岛 + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:雷丘丘萨满x1、雷弹丘丘人x3
第二波:雷深渊法师x2 +2 | 第一波:风飘浮灵x3、大型风史莱姆x1
第二波:水飘浮灵x3、大型水史莱姆x1 +3 | 第一波:野伏·火付番x1、野伏·阵刀番x2
第二波:海乱鬼·炎威x1、海乱鬼·雷腾x1 +4 | 第一波:愚人众先遣队·冰铳重卫士x1、愚人众先遣队·水铳重卫士x1
第二波:愚人众·雷萤术士x1、愚人众·冰萤术士x1 +5 | 第一波:愚人众先遣队·冰铳重卫士x1、愚人众先遣队·雷锤前锋军x1
第二波:愚人众先遣队·风拳前锋军x1、愚人众先遣队·水铳重卫士x1、愚人众先遣队·岩使游击兵x1 + + ### 须弥 +- [x] 1. 无郁稠林 + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:水史莱姆x2、旋转冰蕈兽x2
第二波:有翼冰本真蕈x1 +2 | 第一波:冰史莱姆x4
第二波:大型风史莱姆x2 +3 | 遗迹龙兽·空巡x1 +4 | 第一波:镀金旅团·机弩兵x2、镀金旅团·破阵者x1、镀金旅团·鸦喙戟手x1
第二波:镀金旅团·机弩兵x1、镀金旅团·阵前斧手x1 +5 | 第一波:冲锋丘丘人x2
第二波:冲锋丘丘人x2、草丘丘萨满x1 + +- [x] 2. 奥摩斯港 + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:有翼冰本真蕈x1、旋转冰蕈兽x2、伸缩风蕈兽x1
第二波:陆行水本真蕈x2 +2 | 第一波:有翼草本真蕈x1、伸缩火蕈兽x2、伸缩岩蕈兽x1
第二波:有翼冰本真蕈x2 +3 | 第一波:有翼草本真蕈x1、浮游水蕈兽x2、旋转雷蕈兽x1
第二波:有翼冰本真蕈x2 +4 | 第一波:镀金旅团·阵前斧手x2、镀金旅团·破阵者x1
第二波:镀金旅团·破阵者x1、镀金旅团·刀舞者x1 +5 | 第一波:镀金旅团·机弩兵x1、镀金旅团·刀舞者x1、镀金旅团·鸦喙戟手x1
第二波:镀金旅团·机弩兵x2 + +- [ ] 3. 禅那园 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:遗迹龙兽·地巡x1
第二波:遗迹龙兽·空巡x1 +2 | 第一波:有翼冰本真蕈x1、浮游草蕈兽x2
第二波:有翼草本真蕈x1、陆行水本真蕈x1 +3 | 第一波:镀金旅团·破阵者x1、镀金旅团·阵前斧手x1、镀金旅团·鸦喙戟手x1
第二波:镀金旅团·机弩兵x2、镀金旅团·破阵者x1、镀金旅团·刀舞者x1 +4 | 第一波:伸缩火蕈兽x4
第二波:大型火史莱姆x1、伸缩火蕈兽x2、旋转雷蕈兽x2 + +- [ ] 4. 水天丛林 + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:浮游水蕈兽x3、伸缩风蕈兽x1
第二波:有翼冰本真蕈x1 +2 | 第一波:浮游水蕈兽x2、浮游草蕈兽x2
第二波:有翼草本真蕈x1 +3 | 第一波:镀金旅团·破阵者x1、镀金旅团·机弩兵x1、镀金旅团·鸦喙戟手x1
第二波:镀金旅团·刀舞者x1、镀金旅团·阵前斧手x1、镀金旅团·鸦喙戟手x1 +4 | 第一波:镀金旅团·白日鸣雷x1
第二波:镀金旅团·炽阳凝冰x1 +5 | 第一波:镀金旅团·破阵者x1、镀金旅团·机弩兵x1、镀金旅团·阵前斧手x1
第二波:镀金旅团·刀舞者x1、镀金旅团·鸦喙戟手x1 + +- [x] 5. 阿如村 + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:镀金旅团·机弩兵x1、盗宝团·火之药剂师x1、盗宝团·神射手x1
第二波:镀金旅团·鸦喙戟手x1、镀金旅团·阵前斧手x1、盗宝团·神射手x1 +2 | 第一波:伸缩雷蕈兽x1、旋转雷蕈兽x1、伸缩岩蕈兽x1
第二波:陆行岩本真蕈x1、伸缩风蕈兽x1 +3 | 第一波:镀金旅团·破阵者x1、镀金旅团·刀舞者x1、镀金旅团·阵前斧手x1、镀金旅团·机弩兵x1
第二波:镀金旅团·炽阳凝冰x1、镀金旅团·鸦喙戟手x1 +4 | 第一波:伸缩火蕈兽x1、伸缩岩蕈兽x1、旋转火蕈兽x1
第二波:陆行岩本真蕈x2、伸缩岩蕈兽x1 +5 | 第一波:镀金旅团·沙中净水x1
第二波:镀金旅团·白日鸣雷x1、镀金旅团·炽阳凝冰x1 + +- [x] 6. 荼诃落谷 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:旋转火蕈兽x2、旋转雷蕈兽x2
第二波:陆行岩本真蕈x1、旋转火蕈兽x2 +2 | 第一波:镀金旅团·鸦喙戟手x2、镀金旅团·阵前斧手x1
第二波:镀金旅团·炽阳凝冰x1、盗宝团·火之药剂师x1 +3 | 第一波:镀金旅团·刀舞者x1、镀金旅团·鸦喙戟手x1、镀金旅团·破阵者x1
第二波:镀金旅团·白日鸣雷x1、镀金旅团·鸦喙戟手x2 +4 | 第一波:镀金旅团·阵前斧手x1、镀金旅团·鸦喙戟手x1、盗宝团·火之药剂师x1、盗宝团·雷之药剂师x1
第二波:镀金旅团·沙中净水x1、镀金旅团·机弩兵x2 + +- [ ] 7. 赤王陵 (特征点少,录制困难) + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:愚人众·火之债务处理人x1、愚人众·岩使游击兵x1、愚人众·火铳游击兵x1
第二波:愚人众·雷锤前锋军x1、愚人众·风拳前锋军x1 +2 | 第一波:伸缩岩蕈兽x3、伸缩火蕈兽x1
第二波:陆行岩本真蕈x1、旋转火蕈兽x2 +3 | 第一波:元能构装体·力场发生器x1
第二波:元能构装体·勘探机x1 +4 | 第一波:镀金旅团·破阵者x1、镀金旅团·鸦喙戟手x1、镀金旅团·机弩兵x1、镀金旅团·阵前斧手x1
第二波:镀金旅团·灵风猎手x1 +5 | 第一波:镀金旅团·魔岩役使x1、镀金旅团·白日鸣雷x1
第二波:镀金旅团·灵风猎手x1、镀金旅团·沙中净水x1 + +- [ ] 8. 折胫谷 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:陆行岩本真蕈x1、伸缩岩蕈兽x1
第二波:有翼草本真蕈x1、浮游草蕈兽x1 +2 | 第一波:元能构装体·勘探机x1
第二波:元能构装体·重塑仪x1、元能构装体·力场发生器x1 +3 | 第一波:镀金旅团·沙中净水x1、镀金旅团·白日鸣雷x1
第二波:镀金旅团·炽阳凝冰x1、镀金旅团·炽沙叙事人x1 +4 | 第一波:飞蛇x3
第二波:飞蛇x1、圣骸飞蛇x1 + +- [ ] 9. 镔铁沙丘 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:元能构装体·力场发生器x1
第二波:元能构装体·重塑仪x1、元能构装体·勘探机x1 +2 | 第一波:遗迹龙兽·地巡
第二波:遗迹龙兽·空巡 +3 | 第一波:陆行岩本真蕈x1、旋转火蕈兽x1
第二波:陆行水本真蕈x1、浮游风蕈兽x1、浮游草蕈兽x1 +4 | 第一波:镀金旅团·灵风猎手x1
第二波:镀金旅团·炽阳凝冰x1、镀金旅团·叶轮舞者x1 + +- [ ] 10. 荼泥黑渊 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 圣骸毒蝎x1 +2 | 镀金旅团·炽沙叙事人x1 +3 | 第一波:丘丘风行游侠x1、火箭丘丘人x2、水丘丘萨满x1
第二波:丘丘水行游侠x1、火斧丘丘暴徒x1 +4 | 圣骸赤鹫x1 + + + ### 枫丹 -- [x] 🏃‍秋分山西侧 -- [x] 🏃‍芒索斯山东麓 -- [x] 🏃‍新枫丹科学院 -- [x] 🏃‍柔灯港 -- [x] 🏃‍秋分山东侧 -- [x] 🏃‍厄里那斯 +- [x] 1. 🏃‍秋分山西侧 + +**地脉花总数:5** + +顺序 | 怪物 +--- | --- +1 | 第一波:机关•侦察记录型(荒)x4
第二波:压制特化型机关(荒)x2 +2 | 第一波:机关•地质勘探型(荒)x2、机关•灵活采集型(荒)x2
第二波:攻坚特化型机关(荒)x2 +3 | 第一波:盗宝团•杂工x1、盗宝团•海上男儿x1、盗宝团•斥候x2
第二波:盗宝团•火之药剂师x2、盗宝团•雷之药剂师x1 +4 | 第一波:坚盾重甲蟹x1、重甲蟹x3
第二波:坚盾重甲蟹x2 +5 | 第一波:浊水粉碎幻灵x2
第二波:浊水粉碎幻灵x1、浊水喷吐幻灵x2 + +- [x] 2. 🏃‍芒索斯山东麓 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:侦察记录型·荒x1,压制特化型·荒(火)x1
第二波:侦察记录型·荒x1,歼灭特化型·荒(水)x1 +2 | 第一波:风拳x1,霜役人x1
第二波:火枪x1,风役人x1 +3 | 第一波:算力增幅器·芒x1,建造特化型·芒(火)x1
第二波:算力增幅器·芒x1,攻坚特化型·芒(火)x1 +4 | 第一波:火枪x1,雷莹x1
第二波:风役人x1,霜役人x1 + +- [x] 3. 🏃‍新枫丹科学院 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:灵活采集型·荒x2,压制特化型·荒(火)x1
第二波:攻坚特化型·荒(雷)x1 +2 | 第一波:地质勘探型·芒x2,歼灭特化型·芒(雷)x1
第二波:歼灭特化型·芒(雷)x1 +3 | 第一波:歼灭特化型·芒(雷)x1,压制特化型·芒(草)x1
第二波:歼灭特化型·芒(雷)x1 +4 | 第一波:算力增幅型·荒x1,侦察记录型·荒x2
第二波:建造特化型·荒(冰)x1,灵活采集型·荒x1 + +- [x] 4. 🏃‍柔灯港 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:浊水粉碎幻灵x2
第二波:浊水粉碎幻灵x2 +2 | 第一波:浊水喷吐幻灵x2
第二波:浊水喷吐幻灵x2 +3 | 第一波:重甲蟹x5
第二波:坚盾重甲蟹x2 +4 | 第一波:大天使海兔x2
第二波: 大天使海兔x2 + +- [x] 5. 🏃‍秋分山东侧 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:风役人x1,霜役人x1
第二波:风役人x1,霜役人x1 +2 | 第一波:侦察记录型·芒x3
第二波:灵活采集型·芒x2 +3 | 第一波:地质勘探型·芒x2
第二波:歼灭特化型·芒(雷)x2 +4 | 第一波:灵活采集型·荒x2
第二波:攻坚特化型·荒(雷)x2 + +- [x] 6. 🏃‍厄里那斯 + +**地脉花总数:6** + +顺序 | 怪物 +--- | --- +1 | 第一波:火斧丘丘暴徒x1、打手丘丘人x2
第二波:丘丘风行游侠x1、雷丘丘萨满x1、 +2 | 第一波:机关•地质勘探型x2
第二波:建造特化型机关x1、机关•灵活采集型x1 +3 | 第一波:坚盾重甲蟹x1、重甲蟹(红)x2、重甲蟹(绿)x1
第二波:坚盾重甲蟹x2 +4 | 第一波:浊水粉碎幻灵x2
第二波:浊水粉碎幻灵x2 +5 | 第一波:盗宝团•海上男儿x1、盗宝团•斥候x2、盗宝团•雷之药剂师x1
第二波:盗宝团•掘墓者x1、盗宝团•海上男儿x1 +6 | 第一波:攻坚特化型机关x1、机关•侦察记录型x1
第二波:歼灭特化型机关x1、机关•侦察记录型x1 + ### 纳塔 -- [x] 🏃‍隆崛坡 -- [ ] 彩石顶 -- [ ] 硫晶支脉 -- [ ] 溶水域 -- [x] 安饶之野 -- [x] 圣火竞技场 -- [ ] 烟谜主 -- [ ] 花羽会 -- [ ] 翘枝崖 -- [ ] 流泉之众 \ No newline at end of file +- [x] 1. 🏃隆崛坡 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:铸砂勇士·叩问人x1、铸砂勇士·碎盾者x3、幼嵴锋龙x1
第二波:嵴锋龙武士·碎晶打者x1、嵴锋龙武士·破岩锐刃x1 +2 | 第一波:盗宝团·斥候x1、盗宝团·火之药剂师x1、盗宝团·水之药剂师x1
第二波:盗宝团·斥候x3、盗宝团·火之药剂师x1、盗宝团·水之药剂师x1 +3 | 第一波:幼匿叶龙x2、疾讯勇士·引索客x1、疾讯勇士·荡风斥候x1
第二波:匿叶龙武士·旋锯飞叶x2 +4 | 第一波:铸砂勇士·叩问人x3、铸砂勇士·碎盾者x1、铸砂勇士·投矛手x1
第二波:嵴锋龙武士·碎晶打者x1、嵴锋龙武士·破岩锐刃x1 + + +- [x] 2. 🏃硫晶支脉 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:幼匿叶龙x1、疾讯勇士·荡风斥候x1、疾讯勇士·重刃讯使x1、匿叶龙武士·流火鸣空x1
第二波:疾讯勇士·引索客x1、匿叶龙武士·旋锯飞叶x1 +2 | 第一波:疾讯勇士·引索客x3、幼匿叶龙x2
第二波:匿叶龙武士·流火鸣空x1、匿叶龙武士·旋锯飞叶x1 +3 | 第一波:愚人众先遣队·火铳游击兵x1、愚人众先遣队·雷锤前锋军x1
第二波:愚人众先遣队·火铳游击兵x1、愚人众先遣队·雷锤前锋军x1、愚人众先遣队·冰铳重卫士x1 +4 | 第一波:幼匿叶龙x2、疾讯勇士·引索客x1、疾讯勇士·荡风斥候x1
第二波:匿叶龙武士·旋锯飞叶x1、匿叶龙武士·流火鸣空x1 + +- [x] 3. 彩石顶 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:熔岩游像·蚀土者x2
第二波:熔岩游像·蚀土者x2 +2 | 第一波:幼嵴锋龙x1、嵴锋龙x1、铸砂勇士·投矛手x1
第二波:嵴锋龙x2、铸砂勇士·碎盾者x1、铸砂勇士·叩问人x1 +3 | 第一波:幼匿叶龙x1、匿叶龙x1、匿叶龙武士·流火鸣空x1
第二波:幼匿叶龙x1、匿叶龙x2、疾讯勇士·引索客x1 +4 | 第一波:幼嵴锋龙x2、铸砂勇士·投矛手x1、嵴锋龙武士·破岩锐刃x1
第二波:幼嵴锋龙x3、嵴锋龙x2、嵴锋龙武士·碎晶打者x1 + +- [x] 4. 溶水域 + +**地脉花总数:2** + +顺序 | 怪物 +--- | --- +1 | 第一波:幼鳍游龙x3、流刃勇士·游击人x2
第二波:鳍游龙武士·穿浪之梭x1、鳍游龙武士·裂礁之涛x1 +2 | 第一波:流刃勇士·游击人x1、流刃勇士·锯脂者x1、流刃勇士·掷叉猎手x2
第二波:鳍游龙武士·穿浪之梭x1、鳍游龙武士·裂礁之涛x1 + +- [x] 5. 安饶之野 + +**地脉花总数:2** + +顺序 | 怪物 +--- | --- +1 | 第一波:幼突角龙x4、横蛮勇士·冲撞手x1
第二波:幼突角龙x2、突角龙x2、横蛮勇士·抓扑人x1 +2 | 炉壳山鼬x1 +3 | 第一波:幼突角龙x3、突角龙x1、横蛮勇士·冲撞手x1
第二波:幼突角龙x3、突角龙x2 + +- [x] 6. 圣火竞技场 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:秘源机兵·寻捕械x1
第二波:秘源机兵·寻捕械x1 +2 | 第一波:幼匿叶龙x1、匿叶龙x1、疾讯勇士·重刃讯使x1、匿叶龙武士·旋锯飞叶x1
第二波:幼匿叶龙x2、匿叶龙x1、疾讯勇士·重刃讯使x1 +3 | 第一波:幼匿叶龙x2、疾讯勇士·引索客x1、匿叶龙武士·流火鸣空x1
第二波:幼匿叶龙x2、匿叶龙x1、匿叶龙武士·旋锯飞叶x1 +4 | 第一波:幼匿叶龙x2、匿叶龙x1、匿叶龙武士·旋锯飞叶x1
第二波:幼匿叶龙x1、匿叶龙x2、匿叶龙武士·旋锯飞叶x1 + +- [x] 7. 🏃烟谜主 + +**地脉花总数:3** + +顺序 | 怪物 +--- | --- +1 | 第一波:灵觉勇士·冥思者x1、灵觉勇士·执意师x1、幼暝视龙x1
第二波:灵觉勇士·冥思者x1、灵觉勇士·执意师x1、幼暝视龙x1、暝视龙武士·冰晶炮手x1 +2 | 第一波:灵觉勇士·冥思者x1、灵觉勇士·控念师x1、幼暝视龙x1
第二波:灵觉勇士·冥思者x3、暝视龙武士·冰晶炮手x1 +3 | 第一波:秘源机兵·寻捕械x1 + +- [x] 8. 🏃花羽会 + +**地脉花总数:3** + +顺序 | 怪物 +--- | --- +1 | 第一波:焚然·大灵显化身x1 +2 | 第一波:幼绒翼龙x2、结羽勇士·削羽人x1、结羽勇士·腾空士x1
第二波:幼绒翼龙x1、结羽勇士·腾空士x1、结羽勇士·驭空客x1、绒翼龙武士·膛星之锤x1 +3 | 第一波:幼绒翼龙x1、结羽勇士·驭空客x1、绒翼龙武士·长空明焰x1
第二波:幼绒翼龙x1、结羽勇士·驭空客x1、结羽勇士·削羽人x1、结羽勇士·腾空士x1、绒翼龙武士·长空明焰x1 + +- [x] 9. 🏃翘枝崖 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:幼鳍游龙x3、鳍游龙x1、流刃勇士·游击人x1
第二波:幼鳍游龙x1、鳍游龙x2、流刃勇士·游击人x1 +2 | 第一波:幼绒翼龙x3、绒翼龙x1、结羽勇士·驭空客x1
第二波:幼绒翼龙x2、绒翼龙x2、结羽勇士·驭空客x1 +3 | 第一波:幼鳍游龙x3、鳍游龙x1、流刃勇士·锯脂者x1
第二波:幼鳍游龙x2、鳍游龙x2、流刃勇士·游击人x1 +4 | 第一波:深邃拟态·嵴锋龙x1、深邃拟态·匿叶龙x1、深邃拟态·鳍游龙x1
第二波:深邃拟态·嵴锋龙x1、深邃拟态·匿叶龙x1、深邃拟态·鳍游龙x1 + +- [x] 10. 🏃溶水域 + +**地脉花总数:4** + +顺序 | 怪物 +--- | --- +1 | 第一波:幼鳍游龙x3、鳍游龙x1、鳍游龙武士·裂礁之涛x1
第二波:幼鳍游龙x2、鳍游龙x2、鳍游龙武士·穿浪之梭x1 +2 | 第一波:溯流·大灵显化身
第二波:溯流·大灵显化身 +3 | 第一波:幼鳍游龙x3、鳍游龙x1、流刃勇士·掷叉猎手x1、流刃勇士·游击人x1
第二波:鳍游龙x2、流刃勇士·掷叉猎手x1、鳍游龙武士·裂礁之涛x1 +4 | 第一波:幼鳍游龙x3、鳍游龙x1、鳍游龙武士·穿浪之梭x1
第二波:幼鳍游龙x2、鳍游龙x1、流刃勇士·掷叉猎手x1、流刃勇士·游击人x1 \ No newline at end of file diff --git a/repo/js/AutoLeyLineOutcrop/assets/archive/rerun/纳塔8-花羽会-3.json b/repo/js/AutoLeyLineOutcrop/assets/archive/rerun/纳塔8-花羽会-3.json new file mode 100644 index 00000000..93026d61 --- /dev/null +++ b/repo/js/AutoLeyLineOutcrop/assets/archive/rerun/纳塔8-花羽会-3.json @@ -0,0 +1,102 @@ +{ + "info": { + "name": "纳塔8-花羽会-3", + "type": "collect", + "author": "起个名字好难的喵", + "version": "1.0", + "description": "", + "bgiVersion": "0.42.3" + }, + "positions": [ + { + "id": 1, + "action": "", + "move_mode": "walk", + "type": "teleport", + "x": 9757.9, + "y": -613.62, + "action_params": "" + }, + { + "id": 2, + "x": 9769.34, + "y": -602.86, + "type": "path", + "move_mode": "walk", + "action": "", + "action_params": "" + }, + { + "id": 3, + "x": 9796.48, + "y": -634.59, + "type": "path", + "move_mode": "fly", + "action": "stop_flying", + "action_params": "2500" + }, + { + "id": 4, + "x": 9728.62, + "y": -679.69, + "type": "path", + "move_mode": "dash", + "action": "", + "action_params": "" + }, + { + "id": 5, + "x": 9672.39, + "y": -672.02, + "type": "path", + "move_mode": "dash", + "action": "", + "action_params": "" + }, + { + "id": 6, + "x": 9571.02, + "y": -752.78, + "type": "path", + "move_mode": "dash", + "action": "", + "action_params": "" + }, + { + "id": 7, + "x": 9573.41, + "y": -764.08, + "type": "path", + "move_mode": "dash", + "action": "", + "action_params": "" + }, + { + "id": 8, + "x": 9549.43, + "y": -774.26, + "type": "path", + "move_mode": "dash", + "action": "", + "action_params": "" + }, + { + "id": 9, + "x": 9511.7, + "y": -768.36, + "type": "path", + "move_mode": "dash", + "action": "", + "action_params": "" + }, + { + "id": 10, + "x": 9471.3, + "y": -771.79, + "type": "target", + "move_mode": "dash", + "action": "", + "action_params": "" + } + ] +} \ No newline at end of file diff --git a/repo/js/AutoLeyLineOutcrop/assets/icon/box.png b/repo/js/AutoLeyLineOutcrop/assets/icon/box.png new file mode 100644 index 0000000000000000000000000000000000000000..521895c43c191135dbfba35c3e03ec5709755e40 GIT binary patch literal 1018 zcmVP000#T0ssI2JW0||00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1CL2WK~y+Tg_8Sk z6jc<*&z+flgo4}B-EIvcCWMy2iAiqw7dF*~!5dG5UKJ^nE5YoWEq9}Tv=ZlSbNm8j;T-P zjO7c(g`a+wBzd<^Jx^7&a=BufCbndG9@RA6&<#yD0s~_#m(PDbK5;E|V|r#*mdinj zGHRHHVHmb;2jWf^^<39+T{mc+F;*xP)0v4M=6_uKH+Sc|yWh^v1*eRNj^o<4O(_FH znzDQ|rQ0XM7+YW8NToCL_ZI*#9`Baq^4B-NnVh;A?2b{&7z-{}BP$#V0YXraB>A({ zjrscvJkOmSIP?D4yZwE~CLSzt8N7&4c<~_*x4E5dERy1-~agYdU||mIg5yd5K0*Wa)b~< z5Fi?f2v0wA)V2&jL`23YBD$`-C6;)OQ&hE5t#);F0statx~{0IM`_2teFqNg=LiSe zLkB`Q6e2_{NrJ%pir;MAs?W^c8K0O$#J=Z`eemAsbI%_A{@#2loyix9k0+B?E)TzQ z@+8mm!N>?l7(?Q?Zb%Rs0|Y=sRaGaaZlyC59;L@$=zHnJ@w@ltSO0!^_|T!T(UG$Q zr~Ls1P{t6E)M`pB_So)%kD@4FPEKXM_{wpea4770Uc9?|Y;@$p`Ex?^zk{sC{c0f= ziwzGAzWK&bBpj(*Rw5pM=k3eq&%L%c2mk;6uNNWuM0HV?8Q%8;Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2-!(QK~z{rt(SRF zR96@7{OrIrs3OB6ST- zP@DTTKA&cd-_x`4ifbQ;v^!UEWYd=r=ft5o>jaWdZ$#*F1Dp=`Lw#i>UdiRG$$NWQ zlS!qJbxWbLunJ)v#?D#+4Ko*L&U1#Kww~+hpIblw8}X6L@I3V>qTOd=&jwpmmE@tP zN6PlU71k%NS0-b{sVwYPN+w3?*E%@$g9jWc1ShNWOUqVas)}Z=D&g zor^(ddmGo&$7^Bli&I(H`jA5yHPeBFc|eOy)65lLn65z7v3Rt#cd}#T%%3oS_UaWY zP8XsoYg`}%_!_r5rlgw?!gfco5(B+3n1mL!af6==BzpXu8{&uT3qW6mS~El zkk8E=nsSFID@2ckOt;?zeTP8kFWU_L<(r{v?++`_P}J1FJ zrGzD=Wn-M71IC)Hz~luUn6cEC1O>prF&HzQw!v`aH!xiFElga#ftK|K6j!LeQ~fcd zu+pkpT)duyod@HvcufdKo4P~8+8;*FJ6JPb9Y(ejI`+W`*mDLlI_jSS1!4JxCG0UD zjGX)uI0x;=R2zR7yM)5TEgZ8vA~DL$8>v}OxltdFg0S1arJ|~;ihCNEj?QkRP&zVj z41%F+IE+Xf^I2P(TeuM)kAkquN&(Ks|A_jR&0Ndi6qZ$E%2INE=P)evj^tWD4GO}l zs|660<>Kz0L`bDQTlvJ_ zd*fhAC$o!g1)mB9VKP}S5-webP*{r6(tI2{eg@gOg$bAczCL=vv$<53XC zkeQu}q9VFy$(tdpeg^M=ojCvFHMF#d*ud8xObT(KlbXT*a1qj;9&~keb5F|ifiUJp zNhv9icK(5G$#b-d>yYrnMFa##prLW#L-Bw@#s88sxTm*NR@Wfn@W}xeH4txvNhA_- zcq#jW+`Iw^Y1d>OFVNK}fV`&#XU@hWEkpUF{2C@MnmesS7C)bBQI0pl_)qhZ`REaH zbDpBOT!@R8ZXho^3q6ur^t9F?BQ1rEbE?8D^!SPMuy^t0T9ku#bS|6c^{Bu}MgWpb_a$GGT7-OE0cORWTp;=~E8}W|#CW zR${z~Eqp`wL7jee<~rcixt~x{E}+8X!^F>HL`^VR!V1gg=di+jLJq*rB>)Q@{g7Lj zN99xl$_gIiNnRc|O*L9+cNVVl#e~`R*dBe9y@5R87vNS>8Xjb1<5}5<`I$FqjvfA{ zJ{#fD2dJ13WAB0QFoW(@F(=Q`N}ACvu7 z94CBkV1wTuWpOIxN6it998EI_F8V*b>3*K`Kbcg3(3`{ZXAAT4bR7q)3 zi8tS63pzXdYS4k;sTtc~=+|VZ=M}SYR<;_3-Qba3-?kI z@t^~J`z(Eg++aT0lFm2#AOF&x$eXiTPDp7 z;rzyS?wDrzH8d>N!Q5>Jw(UO$fv{#+$=c8<2qR6M$*06z3(!p0ZLKAKm_<8f>KcaW zD?;EHxOd1!^DJDqu(_;R)XLV2!$I8I4&R6q7;oW)^}CL8txPKF!PbNS!W0rV$88s8 zyGKB6kw0#xq;n$%hBwJN2#F7dP7#9<6del#`#`8ISPy>D+c2;{HUVl@8(`$M2PW>3 z7-Q~*9Wn7r`7O`VI~H~U2hk!@J|r+OaV_~#E-csV!lVV>RK9J;^`s2e1q2j4nK*SX zGZ)dZKfxvV0K9gdz}34C(5Yl$!kg!F3Wgp>VC)%%!qQ5vd2ljv^5GwL7@MQMN9={` zxc~SmS}1mjByBi&DgoNon-Ca%l1BE@0_1GH$rL%t!bs "蒙德3")""" + parts = filename.split('-') + if len(parts) < 2: + return None + return parts[0] + + +def extract_route_number(filename): + """Extract route number and area from filename (e.g., "蒙德3-奔狼领-2.json" -> ("蒙德3", "奔狼领", 2))""" + parts = filename.split('-') + if len(parts) < 3: + return None, None, None + + region = parts[0] + area = parts[1] + + # Extract number from last part (remove .json) + num_part = parts[2].split('.')[0] + try: + num = int(num_part) + return region, area, num + except ValueError: + return region, area, None + + +def read_pathing_file(file_path): + """Read a pathing file and return its data""" + try: + with open(file_path, 'r', encoding='utf-8') as f: + return json.load(f) + except Exception as e: + print(f"Error reading {file_path}: {e}") + return None + + +def get_first_and_last_positions(path_data): + """Extract first and last positions from pathing data""" + if not path_data or "positions" not in path_data: + return None, None + + positions = path_data["positions"] + if not positions or len(positions) < 2: + return None, None + + return positions[0], positions[-1] + + +def generate_relative_path(file_path, script_dir): + """Generate the appropriate relative path for routes""" + # Get the path relative to the script directory + relative_path = os.path.relpath(file_path, os.path.dirname(script_dir)) + # Standardize path separator + relative_path = relative_path.replace("\\", "/") + + # Remove the "AutoLeyLineOutcrop/" prefix if present + if relative_path.startswith("AutoLeyLineOutcrop/"): + relative_path = relative_path[len("AutoLeyLineOutcrop/"):] + + return relative_path + + +def generate_ley_line_data(): + """Process pathing files and generate LeyLineOutcropData.json""" + # Path to the directory containing pathing files + script_dir = os.path.dirname(os.path.abspath(__file__)) + pathing_dir = os.path.join(script_dir, "assets", "pathing") + + print(f"Looking for pathing files in: {pathing_dir}") + + # Initialize data structures + nodes = [] + node_map = {} # Map to track nodes by ID + next_node_id = 1 + + # Used to group files by region and area + region_area_files = {} + file_data = {} # Store file data for each path + + # Get all pathing JSON files (excluding rerun files and target directory) + pathing_files = [] + for root, _, files in os.walk(pathing_dir): + # Skip target directory + if "target" in root.split(os.path.sep): + continue + + for file in files: + if file.endswith('.json') and 'rerun' not in file and 'rerun' not in root: + file_path = os.path.join(root, file) + pathing_files.append(file_path) + + # Read and store file data + path_data = read_pathing_file(file_path) + if path_data: + file_data[file_path] = path_data + + # Group files by region and area + region, area, num = extract_route_number(file) + if region and area and num: + key = f"{region}-{area}" + if key not in region_area_files: + region_area_files[key] = [] + region_area_files[key].append((num, file_path)) + + # Sort files within each group by route number + for key in region_area_files: + region_area_files[key].sort() # Sort by route number + + print(f"Found {len(pathing_files)} pathing files (excluding rerun and target files)") + + # First pass: Process teleport points (routes that start with teleport) + for file_path, path_data in file_data.items(): + first_pos, _ = get_first_and_last_positions(path_data) + if not first_pos: + continue + + # Extract region from filename + file_name = os.path.basename(file_path) + region = parse_region_from_filename(file_name) + if not region: + continue + + # Process teleport points + if first_pos.get("type") == "teleport": + x = format_coord(float(first_pos["x"])) + y = format_coord(float(first_pos["y"])) + + # Check if we already have a nearby teleport node + teleport_node = find_nearby_node(nodes, x, y, "teleport") + + if not teleport_node: + # Create new teleport node + teleport_node = { + "id": next_node_id, + "type": "teleport", + "region": region, + "position": {"x": x, "y": y}, + "prev": [], + "next": [] + } + nodes.append(teleport_node) + node_map[next_node_id] = teleport_node + next_node_id += 1 + + # Store teleport node in node_map + node_map[teleport_node["id"]] = teleport_node + + # Build a map of first positions for path-type routes + # This will help us connect path routes to each other + path_first_positions = {} + for file_path, path_data in file_data.items(): + first_pos, _ = get_first_and_last_positions(path_data) + if not first_pos or first_pos.get("type") != "path": + continue + + file_name = os.path.basename(file_path) + region, area, num = extract_route_number(file_name) + if not region or not area or not num: + continue + + key = f"{region}-{area}-{num}" + path_first_positions[key] = { + "x": format_coord(float(first_pos["x"])), + "y": format_coord(float(first_pos["y"])), + "file_path": file_path + } + + # Second pass: Process all target points to create blossom nodes + # Also maintain a map from file info to target nodes + region_area_num_to_target = {} + + for file_path, path_data in file_data.items(): + _, last_pos = get_first_and_last_positions(path_data) + if not last_pos or last_pos.get("type") != "target": + continue + + # Extract region from filename + file_name = os.path.basename(file_path) + region = parse_region_from_filename(file_name) + if not region: + continue + + region, area, num = extract_route_number(file_name) + if not region or not area or not num: + continue + + # Process target points as blossom nodes + target_x = format_coord(float(last_pos["x"])) + target_y = format_coord(float(last_pos["y"])) + + # Check if we already have a nearby blossom node + blossom_node = find_nearby_node(nodes, target_x, target_y, "blossom") + + if not blossom_node: + # Create new blossom node + blossom_node = { + "id": next_node_id, + "type": "blossom", + "region": region, + "position": {"x": target_x, "y": target_y}, + "prev": [], + "next": [] + } + nodes.append(blossom_node) + node_map[next_node_id] = blossom_node + next_node_id += 1 + + # Store the blossom node in our region-area-num map + key = f"{region}-{area}" + if key not in region_area_num_to_target: + region_area_num_to_target[key] = {} + region_area_num_to_target[key][num] = { + "node": blossom_node, + "file_path": file_path + } + + # Third pass: Connect teleport points to their target blossoms + for file_path, path_data in file_data.items(): + first_pos, last_pos = get_first_and_last_positions(path_data) + if not first_pos or not last_pos: + continue + + # Skip if this isn't a valid target + if last_pos.get("type") != "target": + continue + + # Extract file info + file_name = os.path.basename(file_path) + region, area, num = extract_route_number(file_name) + + # Skip if we can't parse the file name + if not region or not area or not num: + continue + + # For teleport source type, connect to target + if first_pos.get("type") == "teleport": + # Find teleport node + x = format_coord(float(first_pos["x"])) + y = format_coord(float(first_pos["y"])) + teleport_node = find_nearby_node(nodes, x, y, "teleport") + + # Find target blossom node + target_x = format_coord(float(last_pos["x"])) + target_y = format_coord(float(last_pos["y"])) + target_node = find_nearby_node(nodes, target_x, target_y, "blossom") + + if teleport_node and target_node: + # Add connection + relative_path = generate_relative_path(file_path, script_dir) + + # Add target to teleport's next array if not already there + route_exists = False + for route in teleport_node["next"]: + if route["target"] == target_node["id"]: + route_exists = True + break + + if not route_exists: + teleport_node["next"].append({ + "target": target_node["id"], + "route": relative_path + }) + + # Add teleport to target's prev array if not already there + if teleport_node["id"] not in target_node["prev"]: + target_node["prev"].append(teleport_node["id"]) + + # Fourth pass: Connect nodes based on numerical sequence + for region_area, num_to_target in region_area_num_to_target.items(): + route_numbers = sorted(num_to_target.keys()) + + # Connect each route to the next numerically + for i in range(len(route_numbers) - 1): + current_num = route_numbers[i] + next_num = route_numbers[i + 1] + + current_info = num_to_target[current_num] + next_info = num_to_target[next_num] + + current_node = current_info["node"] + next_node = next_info["node"] + next_file_path = next_info["file_path"] + + # Create the connection + relative_path = generate_relative_path(next_file_path, script_dir) + + # Add next node to current's next array if not already there + route_exists = False + for route in current_node["next"]: + if route["target"] == next_node["id"]: + route_exists = True + break + + if not route_exists: + current_node["next"].append({ + "target": next_node["id"], + "route": relative_path + }) + + # Add current node to next's prev array if not already there + if current_node["id"] not in next_node["prev"]: + next_node["prev"].append(current_node["id"]) + + # Fifth pass: Connect "path" type sources to their targets + for file_path, path_data in file_data.items(): + first_pos, last_pos = get_first_and_last_positions(path_data) + if not first_pos or not last_pos: + continue + + # Skip if not a path type or not a valid target + if first_pos.get("type") != "path" or last_pos.get("type") != "target": + continue + + # Extract file info + file_name = os.path.basename(file_path) + region, area, num = extract_route_number(file_name) + + # Skip if we can't parse the file name + if not region or not area or not num: + continue + + # Try to find the source in previous route target + prev_num = num - 1 + key = f"{region}-{area}" + if key in region_area_num_to_target and prev_num in region_area_num_to_target[key]: + prev_info = region_area_num_to_target[key][prev_num] + prev_node = prev_info["node"] + + # Find the current target node + target_x = format_coord(float(last_pos["x"])) + target_y = format_coord(float(last_pos["y"])) + target_node = find_nearby_node(nodes, target_x, target_y, "blossom") + + if prev_node and target_node: + # Add connection from previous target to current target + relative_path = generate_relative_path(file_path, script_dir) + + # Add target to previous node's next array if not already there + route_exists = False + for route in prev_node["next"]: + if route["target"] == target_node["id"]: + route_exists = True + break + + if not route_exists: + prev_node["next"].append({ + "target": target_node["id"], + "route": relative_path + }) + + # Add previous node to target's prev array if not already there + if prev_node["id"] not in target_node["prev"]: + target_node["prev"].append(prev_node["id"]) + + # Save to JSON file + ley_line_data = {"node": nodes} + output_path = os.path.join(script_dir, "LeyLineOutcropData.json") + + with open(output_path, 'w', encoding='utf-8') as f: + json.dump(ley_line_data, f, ensure_ascii=False, indent=4) + + print(f"Generated LeyLineOutcropData.json with {len(nodes)} nodes") + return ley_line_data + + +if __name__ == "__main__": + generate_ley_line_data() \ No newline at end of file diff --git a/repo/js/AutoLeyLineOutcrop/main.js b/repo/js/AutoLeyLineOutcrop/main.js index 222b1648..315604fd 100644 --- a/repo/js/AutoLeyLineOutcrop/main.js +++ b/repo/js/AutoLeyLineOutcrop/main.js @@ -1,427 +1,829 @@ -/* - 中文 - 英文: - 地脉之花 - Ley Line Outcrop - 地脉 - Ley Line - 启示之花 - Blossom of Revelation - 藏金之花 - Blossom of Wealth +/** + * 原神地脉花自动化脚本 (Genshin Impact Ley Line Outcrop Automation Script) + * + * 功能:自动寻找并完成地脉花挑战,领取奖励 + * + * 术语对照表: + * 中文 - 英文: + * 地脉之花 - Ley Line Outcrop + * 地脉 - Ley Line + * 启示之花 - Blossom of Revelation (蓝花,产出经验书) + * 藏金之花 - Blossom of Wealth (黄花,产出摩拉) + */ - 蓝花=启示之花,产出经验书 - 黄花=藏金之花,产出摩拉 - -*/ +// 全局变量 +let leyLineX = 0; // 地脉花X坐标 +let leyLineY = 0; // 地脉花Y坐标 +let currentFlower = null; // 当前花的引用 +let strategyName = ""; // 任务策略名称 +let retryCount = 0; // 重试次数 +let marksStatus = true; // 自定义标记状态 +let currentRunTimes = 0; // 当前运行次数 +/** + * 主函数 - 脚本入口点 + */ (async function () { + dispatcher.addTimer(new RealtimeTimer("AutoPick")); try { + await runLeyLineOutcropScript(); + } catch (error) { + log.error("出错了! {error}", error.message); + if (!marksStatus) { + await openCustomMarks(); + } + } +})(); + +/** + * 运行地脉花脚本的主要逻辑 + * @returns {Promise} + */ +async function runLeyLineOutcropScript() { + // 初始化 + await initializeGame(); + + // 加载配置和设置并校验 + const config = await loadConfig(); + const settings = loadSettings(); + retryCount = 0; + + // 显示设置信息 + logSettings(settings); + + // 开局准备 + await prepareForLeyLineRun(settings); + + // 执行地脉花挑战 + await runLeyLineChallenges(config, settings); + + // 完成后恢复自定义标记 + if (!marksStatus) { + await openCustomMarks(); + } +} + +/** + * 初始化游戏状态 + * @returns {Promise} + */ +async function initializeGame() { + await genshin.returnMainUi(); + setGameMetrics(1920, 1080, 1); +} + +/** + * 记录设置信息到日志 + * @param {Object} settings - 用户设置对象 + */ +function logSettings(settings) { + log.info(`地脉花类型:${settings.leyLineOutcropType}`); + log.info(`国家:${settings.country}`); + + if (settings.friendshipTeam) { + log.info(`好感队:${settings.friendshipTeam}`); + } + + log.info(`刷取次数:${settings.timesValue}`); + + if (settings.reRun) { + log.info("已开启可重跑模式,将选择可重跑路线"); + } +} + +/** + * 执行地脉花挑战前的准备工作 + * @param {Object} settings - 用户设置对象 + * @returns {Promise} + */ +async function prepareForLeyLineRun(settings) { + // 开局传送到七天神像 + await genshin.tpToStatueOfTheSeven(); + + // 切换战斗队伍 + if (settings.team) { + log.info(`切换至队伍 ${settings.team}`); + await genshin.switchParty(settings.team); + } +} + +/** + * 执行地脉花挑战的主要逻辑 + * @param {Object} config - 配置对象 + * @param {Object} settings - 用户设置对象 + * @returns {Promise} + */ +async function runLeyLineChallenges(config, settings) { + + + while (currentRunTimes < settings.timesValue) { + // 寻找地脉花位置 + await findLeyLineOutcrop(settings.country, settings.leyLineOutcropType); + + // 查找并执行对应的策略 + const foundStrategy = await executeMatchingStrategy(config, settings); + + // 未找到策略的错误处理 + if (!foundStrategy) { + handleNoStrategyFound(); + return; + } + + currentRunTimes++; + } +} + +/** + * 执行匹配的地脉花策略 + * @param {Object} config - 配置对象 + * @param {Object} settings - 用户设置对象 + * @returns {Promise} 是否找到并执行了策略 + */ +async function executeMatchingStrategy(config, settings) { + let foundStrategy = false; + + // 从配置中查找匹配的位置和策略 + if (config.leyLinePositions[settings.country]) { + const positions = config.leyLinePositions[settings.country]; + + for (const position of positions) { + if (isNearPosition(leyLineX, leyLineY, position.x, position.y, config.errorThreshold)) { + foundStrategy = true; + strategyName = position.strategy; + order = position.order; + log.info(`找到匹配的地脉花策略:${strategyName},次序:${order}`); + + // 使用 LeyLineOutcropData.json 数据处理路径 + await executePathsUsingNodeData(position, settings); + break; + } + } + } + + return foundStrategy; +} + +/** + * 使用节点数据执行路径 + * @param {Object} position - 位置对象 + * @param {Object} settings - 用户设置对象 + * @returns {Promise} + */ +async function executePathsUsingNodeData(position, settings) { + try { + const nodeData = await loadNodeData(); + let currentNodePosition = position; + const targetNode = findTargetNodeByPosition(nodeData, currentNodePosition.x, currentNodePosition.y); + + if (!targetNode) { + log.error(`未找到与坐标(${currentNodePosition.x}, ${currentNodePosition.y})匹配的目标节点`); + return; + } + log.info(`找到目标节点: ID ${targetNode.id}, 位置(${targetNode.position.x}, ${targetNode.position.y})`); + const paths = findPathsToTarget(nodeData, targetNode); + + if (paths.length === 0) { + log.error(`未找到通向目标节点(ID: ${targetNode.id})的路径`); + return; + } + + // 选择最短的路径执行 + const optimalPath = selectOptimalPath(paths); + log.info(`选择了含有 ${optimalPath.routes.length} 个路径点的最优路径`); + + // 执行路径 + await executePath(optimalPath, settings); + currentRunTimes++; + + // 如果达到刷取次数上限,退出循环 + if (currentRunTimes >= settings.timesValue) { + return; + } + + // 循环检查并执行当前节点的单一next路径,直到遇到没有next或有多个next的情况 + let currentNode = targetNode; + + while (currentNode.next && currentNode.next.length === 1 && currentRunTimes < settings.timesValue) { + // 获取下一个节点的ID 和 路径,并在节点数据中找到下一个节点 + const nextNodeId = currentNode.next[0].target; + const nextRoute = currentNode.next[0].route; + const nextNode = nodeData.node.find(node => node.id === nextNodeId); + + if (!nextNode) { + return; + } + + // 创建一个适合executePath函数的路径对象 + const pathObject = { + startNode: currentNode, + targetNode: nextNode, + routes: [nextRoute] + }; + + log.info(`直接执行下一个节点路径: ${nextRoute}`); + await executePath(pathObject, settings); + + currentRunTimes++; + + log.info(`完成节点 ID ${nextNodeId}, 已执行 ${currentRunTimes}/${settings.timesValue} 次`); + + // 如果达到刷取次数上限,退出循环 + if (currentRunTimes >= settings.timesValue) { + return; + } + + // 更新当前节点为下一个节点,继续检查 + currentNode = nextNode; + currentNodePosition = { x: nextNode.position.x, y: nextNode.position.y }; + } + } catch (error) { + log.error(`执行路径时出错: ${error.message}`); + throw error; + } +} + +/** + * 加载节点数据 + * @returns {Promise} 节点数据对象 + */ +async function loadNodeData() { + try { + const nodeDataText = await file.readText("LeyLineOutcropData.json"); + return JSON.parse(nodeDataText); + } catch (error) { + log.error(`加载节点数据失败: ${error.message}`); + throw new Error("无法加载 LeyLineOutcropData.json 文件"); + } +} + +/** + * 根据位置找到对应的目标节点 + * @param {Object} nodeData - 节点数据 + * @param {number} x - 目标X坐标 + * @param {number} y - 目标Y坐标 + * @returns {Object|null} 找到的节点或null + */ +function findTargetNodeByPosition(nodeData, x, y) { + const errorThreshold = 50; // 坐标匹配误差范围 + + for (const node of nodeData.node) { + if (node.type === "blossom" && + Math.abs(node.position.x - x) <= errorThreshold && + Math.abs(node.position.y - y) <= errorThreshold) { + return node; + } + } + + return null; +} + +/** + * 查找到达目标节点的所有可能路径 + * @param {Object} nodeData - 节点数据 + * @param {Object} targetNode - 目标节点 + * @returns {Array} 可行路径数组 + */ +function findPathsToTarget(nodeData, targetNode) { + // 构建节点映射表 + const nodeMap = {}; + nodeData.node.forEach(node => { + nodeMap[node.id] = node; + }); + + log.info(`目标节点ID: ${targetNode.id}, 类型: ${targetNode.type}, 区域: ${targetNode.region}`); + + // 采用广度优先搜索查找所有可能路径 + return breadthFirstPathSearch(nodeData, targetNode, nodeMap); +} + +/** + * 使用广度优先搜索算法查找从传送点到目标的所有路径 + * @param {Object} nodeData - 节点数据 + * @param {Object} targetNode - 目标节点 + * @param {Object} nodeMap - 节点映射 + * @returns {Array} 找到的所有可行路径 + */ +function breadthFirstPathSearch(nodeData, targetNode, nodeMap) { + // 存储找到的所有有效路径 + const validPaths = []; + + // 获取所有传送点作为起点 + const teleportNodes = nodeData.node.filter(node => node.type === "teleport"); + log.info(`找到 ${teleportNodes.length} 个传送点作为可能的起点`); + + // 对每个传送点,尝试查找到目标的路径 + for (const startNode of teleportNodes) { + // 初始化队列,每个元素包含 [当前节点, 路径信息] + const queue = [[startNode, { + startNode: startNode, + routes: [], + visitedNodes: new Set([startNode.id]) + }]]; + + // 广度优先搜索 + while (queue.length > 0) { + const [currentNode, pathInfo] = queue.shift(); + + // 如果已经到达目标节点 + if (currentNode.id === targetNode.id) { + validPaths.push({ + startNode: pathInfo.startNode, + targetNode: targetNode, + routes: [...pathInfo.routes] + }); + continue; // 找到一条路径,继续搜索其他可能路径 + } + + // 检查当前节点的下一个连接 + if (currentNode.next && currentNode.next.length > 0) { + for (const nextRoute of currentNode.next) { + const nextNodeId = nextRoute.target; + + // 避免循环 + if (pathInfo.visitedNodes.has(nextNodeId)) { + continue; + } + + const nextNode = nodeMap[nextNodeId]; + if (!nextNode) { + continue; + } + + // 创建新的路径信息 + const newPathInfo = { + startNode: pathInfo.startNode, + routes: [...pathInfo.routes, nextRoute.route], + visitedNodes: new Set([...pathInfo.visitedNodes, nextNodeId]) + }; + + // 加入队列 + queue.push([nextNode, newPathInfo]); + } + } + } + } + + // 检查是否存在反向路径 + const reversePaths = findReversePathsIfNeeded(nodeData, targetNode, nodeMap, validPaths); + validPaths.push(...reversePaths); + + log.info(`共找到 ${validPaths.length} 条有效路径`); + return validPaths; +} + +/** + * 如果需要,尝试查找反向路径(从目标节点的前置节点到传送点再到目标) + * @param {Object} nodeData - 节点数据 + * @param {Object} targetNode - 目标节点 + * @param {Object} nodeMap - 节点映射 + * @param {Array} existingPaths - 已找到的路径 + * @returns {Array} 找到的反向路径 + */ +function findReversePathsIfNeeded(nodeData, targetNode, nodeMap, existingPaths) { + // 如果已经找到路径,或者目标节点没有前置节点,则不需要查找反向路径 + if (existingPaths.length > 0 || !targetNode.prev || targetNode.prev.length === 0) { + return []; + } + + const reversePaths = []; + + // 检查每个前置节点 + for (const prevNodeId of targetNode.prev) { + const prevNode = nodeMap[prevNodeId]; + if (!prevNode) continue; + + // 找到从前置节点到传送点的路径 + const pathsToPrevNode = []; + + // 获取所有能从这个前置节点到达的传送点 + const teleportNodes = nodeData.node.filter(node => + node.type === "teleport" && node.next.some(route => route.target === prevNode.id) + ); + + for (const teleportNode of teleportNodes) { + // 寻找传送点到前置节点的路径 + const route = teleportNode.next.find(r => r.target === prevNode.id); + if (route) { + // 找到路径从前置节点到目标 + const nextRoute = prevNode.next.find(r => r.target === targetNode.id); + if (nextRoute) { + reversePaths.push({ + startNode: teleportNode, + targetNode: targetNode, + routes: [route.route, nextRoute.route] + }); + } + } + } + } + + return reversePaths; +} + +/** + * 从多个可行路径中选择最优的一条 + * @param {Array} paths - 路径数组 + * @returns {Object} 最优路径 + */ +function selectOptimalPath(paths) { + if (!paths || paths.length === 0) { + throw new Error("没有可用路径"); + } + + // 按路径段数从少到多排序 + paths.sort((a, b) => a.routes.length - b.routes.length); + + // 记录路径选择日志 + for (let i = 0; i < Math.min(paths.length, 3); i++) { + log.info(`路径选项 ${i+1}: 起点ID ${paths[i].startNode.id}, ${paths[i].routes.length} 段路径`); + for (let j = 0; j < paths[i].routes.length; j++) { + log.info(` - 路径 ${j+1}: ${paths[i].routes[j]}`); + } + } + + return paths[0]; // 返回路径段最少的路径 +} + +/** + * 执行路径 + * @param {Object} path - 路径对象 + * @param {Object} settings - 用户设置对象 + * @returns {Promise} + */ +async function executePath(path, settings) { + log.info(`开始执行路径,起始点ID: ${path.startNode.id}, 目标点ID: ${path.targetNode.id}`); + log.info(`路径包含 ${path.routes.length} 个路径段`); + + // 依次执行每个路径段 + for (let i = 0; i < path.routes.length; i++) { + const routePath = path.routes[i]; + log.info(`执行路径 ${i+1}/${path.routes.length}: ${routePath}`); + + try { + // 运行路径文件 + await pathingScript.runFile(routePath); + } catch (error) { + log.error(`执行路径段 ${i+1} 时出错: ${error.message}`); + throw error; + } + } + const routePath = path.routes[path.routes.length - 1]; + const targetPath = routePath.replace('assets/pathing/', 'assets/pathing/target/').replace('-rerun', ''); + // 处理地脉花 + log.info(`处理地脉花: ${targetPath}`); + await processLeyLineOutcrop(settings.timeout, targetPath); + await switchToFriendshipTeamIfNeeded(settings); + await attemptReward(settings); +} + +/** + * 如果需要,切换到好感队 + * @param {Object} settings - 用户设置对象 + * @returns {Promise} + */ +async function switchToFriendshipTeamIfNeeded(settings) { + if (!settings.friendshipTeam) { + return; + } + + log.info(`切换至队伍 ${settings.friendshipTeam}`); + + try { + await genshin.switchParty(settings.friendshipTeam); + } catch (error) { + // 切换失败时的恢复策略 + keyPress("ESCAPE"); + await sleep(500); + keyPress("ESCAPE"); + await sleep(500); await genshin.returnMainUi(); - setGameMetrics(1920, 1080, 1) + log.info(`重新切换至队伍 ${settings.friendshipTeam}`); + await genshin.switchParty(settings.friendshipTeam); + } +} - // 读取配置文件 - let start = settings.start - let type = settings.leyLineOutcropType - let country = settings.country - let team = settings.team - let reRun = settings.reRun - let friendshipTeam = settings.friendshipteam - let count = settings.count ? settings.count : "6"; - let forceRun = settings.forceRun - let forceRunPath = settings.forceRunPath - retry = false; - retryCount = 0; +/** + * 处理未找到策略的情况 + */ +function handleNoStrategyFound() { + log.error("未找到对应的地脉花策略,请再次运行脚本"); + log.error("如果仍然不行,请截图{1}游戏界面,并反馈给作者!", "*完整的*"); + log.error("完整的游戏界面!完整的游戏界面!完整的游戏界面!"); +} - if (!start) { +/** + * 配置相关函数 + */ + +/** + * 加载配置文件 + * @returns {Object} 配置对象 + */ +async function loadConfig() { + try { + const configData = JSON.parse(await file.readText("config.json")); + return configData; + } catch (error) { + log.error(`加载配置文件失败: ${error.message}`); + throw new Error("配置文件加载失败,请检查config.json文件是否存在"); + } +} + +/** + * 加载并验证用户设置 + * @returns {Object} 处理过的设置对象 + */ +function loadSettings() { + try { + // 从全局settings加载用户设置 + const settingsData = { + start: settings.start, + leyLineOutcropType: settings.leyLineOutcropType, + country: settings.country, + team: settings.team, + reRun: settings.reRun, + friendshipTeam: settings.friendshipTeam, + timeout: settings.timeout * 1000 ? settings.timeout * 1000 : 120000, + count: settings.count ? settings.count : "6" + }; + + // 验证必要的设置 + if (!settingsData.start) { throw new Error("请仔细阅读脚本介绍,并在调度器内进行配置,如果你是直接运行的脚本,请将脚本加入调度器内运行!"); } - // 读取地脉花类型 - if (!type) { - log.error("请在游戏中确认地脉花的类型,然后在js设置中选择地脉花的类型。"); - log.error("请在配置组内右键脚本,选择\"修改JS脚本自定义配置\",根据提示修改配置。"); - return; + if (!settingsData.leyLineOutcropType) { + throw new Error("请在游戏中确认地脉花的类型,然后在js设置中选择地脉花的类型。"); } - log.info(`地脉花类型:${type}`); - // 读取点位 - if (!country) { - log.error("请在游戏中确认地脉花的第一个点的位置,然后在js设置中选择地脉花所在的国家。"); - log.error("请在配置组内右键脚本,选择\"修改JS脚本自定义配置\",根据提示修改配置。"); - return; + + if (!settingsData.country) { + throw new Error("请在游戏中确认地脉花的第一个点的位置,然后在js设置中选择地脉花所在的国家。"); } - log.info(`国家:${country}`); - // 切换队伍 - if (team) { - console.log(`切换至队伍 ${team}`); - await genshin.switchParty(team); + + if (settingsData.friendshipTeam && !settingsData.team) { + throw new Error("未配置战斗队伍!当配置了好感队时必须配置战斗队伍!"); } - // 读取好感队 - if (friendshipTeam) { - if (!team) { - log.error("未配置战斗队伍!当配置了好感队时必须配置战斗队伍!"); - log.error("请在配置组内右键脚本,选择\"修改JS脚本自定义配置\",根据提示修改配置。"); - return; - } - log.info(`好感队:${friendshipTeam}`); - } - // 读取次数 - let timesValue; - if (!/^-?\d+\.?\d*$/.test(count)) { - log.warn(`刷取次数 ${count} 不是数字,使用默认次数6次`); - let count = 6 + + // 处理刷取次数 + if (!/^-?\d+\.?\d*$/.test(settingsData.count)) { + log.warn(`刷取次数 ${settingsData.count} 不是数字,使用默认次数6次`); + settingsData.timesValue = 6; } else { // 转换为数字 - const num = parseFloat(count); + const num = parseFloat(settingsData.count); // 范围检查 if (num < 1) { - timesValue = 1; + settingsData.timesValue = 1; log.info(`⚠️ 次数 ${num} 小于1,已调整为1`); } else if (num > 6) { - timesValue = 6; + settingsData.timesValue = 6; log.info(`⚠️ 次数 ${num} 大于6,已调整为6`); } else { // 处理小数 if (!Number.isInteger(num)) { - timesValue = Math.floor(num); - log.info(`⚠️ 次数 ${num} 不是整数,已向下取整为 ${timesValue}`); + settingsData.timesValue = Math.floor(num); + log.info(`⚠️ 次数 ${num} 不是整数,已向下取整为 ${settingsData.timesValue}`); } else { - timesValue = num; + settingsData.timesValue = num; } } } - log.info(`刷取次数:${timesValue}`); - // 可重跑模式 - if (reRun == true) { - log.info("已开启可重跑模式,将选择可重跑路线"); - } - - // 强制运行 - if (forceRun == true) { - log.info("已开启强制运行,不再识别地脉花位置"); - log.info(`执行策略:${forceRunPath}`); - try { - for (let i = 1; i <= 6; i++) { - await pathingScript.runFile(`assets/pathing/${forceRunPath}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } catch (error) { - log.info(error.message); - } - return; - } - - // 寻找地脉花位置 - await findLeyLineOutcrop(country, type, retry, retryCount); - - // 分配对应的策略 - // 使用实际坐标LeyLineOutcropX和LeyLineOutcropY进行比较 - let foundStrategy = false; - - if (country == "蒙德") { - if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, -1298, 2172)) { - foundStrategy = true; - task = "蒙德1-风起地"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 4; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, -718, 1803)) { - foundStrategy = true; - task = "蒙德2-清泉镇"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 4; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, -282, 2311)) { - foundStrategy = true; - task = "蒙德3-奔狼领"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 4; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, 241, 2703)) { - foundStrategy = true; - task = "蒙德4-风龙废墟"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 4; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, -1453, 2283)) { - foundStrategy = true; - task = "蒙德5-千风神殿"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 5; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, -1513, 2774)) { - foundStrategy = true; - task = "蒙德6-望风山地"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 4; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, -1660, 1393)) { - foundStrategy = true; - task = "蒙德7-达达乌帕谷"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 5; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } - } else if (country == "璃月") { - if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, 73, 1496)) { - foundStrategy = true; - task = "璃月1-石门"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 4; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, -55, 604)) { - foundStrategy = true; - task = "璃月3-瑶光滩"; - log.info(`执行策略:${task}`); - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (country == "稻妻") { - if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, -2270, -4068)) { - foundStrategy = true; - task = "稻妻3-八酝岛"; - log.info(`执行策略:${task}`); - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (country == "枫丹") { - if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, 4183, 2502)) { - foundStrategy = true; - task = "枫丹1-秋分山西侧"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 5; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, 4963, 4396)) { - foundStrategy = true; - task = "枫丹2-芒索斯山东麓"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 4; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, 4556, 4762)) { - foundStrategy = true; - task = "枫丹3-新枫丹科学院"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 4; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, 2932, 3584)) { - foundStrategy = true; - task = "枫丹4-柔灯港"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 4; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, 4098, 2584)) { - foundStrategy = true; - task = "枫丹5-秋分山东侧"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 4; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, 4761, 2574)) { - foundStrategy = true; - task = "枫丹6-厄里那斯"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 6; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } - } else if (country == "纳塔") { - if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, 7865, -1824)) { - foundStrategy = true; - task = "纳塔1-隆崛坡"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 4; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, 9029, -2343)) { - foundStrategy = true; - task = "纳塔4-溶水域"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 2; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, 9687, -2898)) { - foundStrategy = true; - task = "纳塔5-安饶之野"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 3; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } else if (isNearPosition(LeyLineOutcropX, LeyLineOutcropY, 9231, -2155)) { - foundStrategy = true; - task = "纳塔6-圣火竞技场"; - log.info(`执行策略:${task}`); - for (let i = 1; i <= 4; i++) { - if (reRun == true) { - await pathingScript.runFile(`assets/pathing/rerun/${task}-${i}-rerun.json`); - await attemptReward(forceRun, retryCount); - } else { - await pathingScript.runFile(`assets/pathing/${task}-${i}.json`); - await attemptReward(forceRun, retryCount); - } - } - } - } - if (!foundStrategy) { - log.error("未找到对应的地脉花策略,请再次运行脚本"); - log.error("如果仍然不行,请截图*完整的*游戏界面,并反馈给作者!"); - log.error("完整的游戏界面!完整的游戏界面!完整的游戏界面!"); - return; - } - await openCustomMarks(); - } catch (e) { - log.error("出错了! {error}", e.message); - await openCustomMarks(); + return settingsData; + } catch (error) { + log.error(`加载设置失败: ${error.message}`); + throw error; } -})(); +} + +/** + * 地脉花寻找和定位相关函数 + */ + +/** + * 查找地脉花位置 + * @param {string} country - 国家名称 + * @param {string} type - 地脉花类型 + * @returns {Promise} + */ +async function findLeyLineOutcrop(country, type) { + const config = await loadConfig(); + const maxRetries = 6; + + log.info("开始寻找地脉花"); + + if (!config.mapPositions[country] || config.mapPositions[country].length === 0) { + throw new Error(`未找到国家 ${country} 的位置信息`); + } + + const defaultPos = config.mapPositions[country][0]; + await genshin.moveMapTo(defaultPos.x, defaultPos.y, country); + await sleep(1000); // 移动完等地图稳定 + + currentFlower = null; + + for (let retryCount = 0; retryCount < maxRetries; retryCount++) { + log.info(`第 ${retryCount + 1} 次尝试定位地脉花`); + + const found = await locateLeyLineOutcrop(type); + + if (found) { + // log.info("成功找到地脉花!"); + return; // 找到就直接结束 + } + + // 第一次失败,执行特殊操作 + if (retryCount === 0) { + log.warn("未找到地脉花,关闭自定义标记并继续尝试"); + await closeCustomMarks(); + } + + // 如果 shouldMoveMap 建议移动地图,就移动一下 + if (shouldMoveMap(country, retryCount)) { + const position = await getMapPosition(country, retryCount, config); + log.info(`移动到特定位置:(${position.x},${position.y}), ${position.name}`); + await genshin.moveMapTo(position.x, position.y); + await sleep(1000); // 移动后也等一下 + } + + await sleep(1000); // 每次循环结束也等一下,防止太快 + } + + // 如果到这里还没找到 + throw new Error("寻找地脉花失败,已达最大重试次数"); +} + + +/** + * 在地图上定位地脉花 + * @param {string} type - 地脉花类型 + * @returns {Promise} 是否找到地脉花 + */ +async function locateLeyLineOutcrop(type) { + await sleep(500); // 确保画面稳定 + await genshin.setBigMapZoomLevel(3.0); + + const iconPath = type === "蓝花(经验书)" + ? "assets/icon/Blossom_of_Revelation.png" + : "assets/icon/Blossom_of_Wealth.png"; + + const flowerList = captureGameRegion().findMulti(RecognitionObject.TemplateMatch(file.ReadImageMatSync(iconPath))); + + if (flowerList && flowerList.count > 0) { + currentFlower = flowerList[0]; + const flowerType = type === "蓝花(经验书)" ? "经验" : "摩拉"; + + log.info(`找到${flowerType}地脉花,位置:(${currentFlower.x},${currentFlower.y})`); + + const center = genshin.getPositionFromBigMap(); + const mapZoomLevel = genshin.getBigMapZoomLevel(); + const mapScaleFactor = 2.361; + + leyLineX = (960 - currentFlower.x - 25) * mapZoomLevel / mapScaleFactor + center.x; + leyLineY = (540 - currentFlower.y - 25) * mapZoomLevel / mapScaleFactor + center.y; + + log.info(`地脉花的实际坐标:(${leyLineX},${leyLineY})`); + return true; + } else { + log.warn("未找到地脉花"); + return false; + } +} + + +/** + * 判断是否需要移动地图 + * @param {string} country - 国家名称 + * @param {number} retryCount - 重试次数 + * @returns {boolean} 是否需要移动地图 + */ +function shouldMoveMap(country, retryCount) { + if (retryCount == 0) return false; + + // 不同国家的重试策略 + const countryRetryMap = { + "蒙德": [0, 1, 2], + "璃月": [0, 1, 2, 3], + "稻妻": [0, 1, 2, 3, 4], + "枫丹": [0, 1, 2], + "纳塔": [0, 1, 2, 3, 4] + }; + + return countryRetryMap[country] && countryRetryMap[country].includes(retryCount); +} + +/** + * 获取地图移动位置 + * @param {string} country - 国家名称 + * @param {number} retryCount - 重试次数 + * @param {Object} config - 配置对象 + * @returns {Object} 包含x,y坐标的位置对象 + */ +async function getMapPosition(country, retryCount, config) { + // 从配置文件获取位置 + if (config.mapPositions[country]) { + const positions = config.mapPositions[country]; + // 确保retryCount不超过位置数量 + let index = Math.min(retryCount, positions.length - 1); + log.warn(`retryCount:${retryCount}`); + log.warn(`countryIndex:${index}`); + return positions[index]; + } + + // 默认返回 + log.warn(`未找到国家 ${country} 的位置信息`); + return { x: 0, y: 0, name: "默认位置" }; +} + +/** + * 判断坐标是否在指定位置附近(误差范围内) + * @param {number} x - 当前X坐标 + * @param {number} y - 当前Y坐标 + * @param {number} targetX - 目标X坐标 + * @param {number} targetY - 目标Y坐标 + * @param {number} threshold - 误差阈值 + * @returns {boolean} 是否在指定范围内 + */ +function isNearPosition(x, y, targetX, targetY, threshold) { + // 使用配置中的阈值或默认值50 + const errorThreshold = threshold || 50; + return Math.abs(x - targetX) <= errorThreshold && Math.abs(y - targetY) <= errorThreshold; +} + +/** + * 奖励和战斗相关函数 + */ + +/** + * 判断是否为地脉花并处理 + * @param {number} timeout - 超时时间 + * @param {string} targetPath - 目标路径 + * @param {number} [retries=0] - 当前函数内重试次数 + * @returns {Promise} + */ +async function processLeyLineOutcrop(timeout, targetPath, retries = 0) { + // 设置最大重试次数,防止死循环 + const MAX_RETRIES = 3; + + // 如果超过最大重试次数,记录错误并返回,避免死循环 + if (retries >= MAX_RETRIES) { + log.error(`打开地脉花失败,已重试${MAX_RETRIES}次,终止处理`); + log.error("我辣么大一个地脉花哪去了?"); + throw new Error("打开地脉花失败"); + } + + let ocr = captureGameRegion().find(RecognitionObject.ocrThis); + if (ocr && ocr.text.includes("地脉溢口")) { + log.info("识别到地脉溢口"); + // await openOutcrop(targetPath); + keyPress("F"); + await autoFight(timeout); + await autoNavigateToReward(); + } else if (ocr && ocr.text.includes("打倒所有敌人")) { + log.info("地脉花已经打开,直接战斗"); + await autoFight(timeout); + await autoNavigateToReward(); + } else if (ocr && ocr.text.includes("地脉之花")) { + log.info("识别到地脉之花"); + } else { + log.warn(`未识别到地脉花文本,当前重试次数: ${retries + 1}/${MAX_RETRIES}`); + try { + await pathingScript.runFile(targetPath); + await processLeyLineOutcrop(timeout, targetPath, retries + 1); + } catch (error) { + throw new Error(`打开地脉花失败: ${error.message}`); + } + } +} + +/** + * 尝试领取地脉花奖励 + * @param {Object} settings - 设置对象,包含friendshipTeam + * @returns {Promise} + */ +async function attemptReward(settings) { + const MAX_RETRY = 5; -async function attemptReward(forceRun, retryCount) { // 超时处理 - if (retryCount >= 5 && forceRun == false) { + if (retryCount >= MAX_RETRY) { retryCount = 0; throw new Error("超过最大重试次数,领取奖励失败"); - } else if (retryCount >= 5 && forceRun == true) { - retryCount = 0; - log.error("超过最大重试次数,领取奖励失败"); - log.info("强制运行模式,继续执行后续路线"); - await genshin.returnMainUi(); - return; - } - // 切换好感队 - if (friendshipTeam) { - log.info(`切换至队伍 ${friendshipTeam}`); - await genshin.switchParty(friendshipTeam); } + log.info("领取奖励,优先使用浓缩树脂"); keyPress("F"); await sleep(500); + // 识别是否为地脉之花界面 let resList = captureGameRegion().findMulti(RecognitionObject.ocrThis); let isValid = false; let condensedResin = null; let originalResin = null; let isResinEmpty = false; + let dobuleReward = false; if (resList && resList.count > 0) { + // 分析识别到的文本 for (let i = 0; i < resList.count; i++) { let res = resList[i]; if (res.text.includes("使用浓缩树脂")) { @@ -433,23 +835,35 @@ async function attemptReward(forceRun, retryCount) { } else if (res.text.includes("补充原粹树脂")) { isValid = true; isResinEmpty = true; + } else if (res.text.includes("产出")) { + isValid = true; + dobuleReward = true; } } - if (condensedResin) { + // 处理不同的树脂情况 + if (originalResin && dobuleReward == true) { + log.info("选择使用原粹树脂,获得双倍产出"); + click(Math.round(originalResin.x + originalResin.width / 2), Math.round(originalResin.y + originalResin.height / 2)); + if (settings.friendshipTeam) { + log.info("切换回战斗队伍"); + await genshin.switchParty(settings.team); + } + return; + } else if (condensedResin) { log.info("选择使用浓缩树脂"); click(Math.round(condensedResin.x + condensedResin.width / 2), Math.round(condensedResin.y + condensedResin.height / 2)); - if (friendshipTeam) { + if (settings.friendshipTeam) { log.info("切换回战斗队伍"); - await genshin.switchParty(team); + await genshin.switchParty(settings.team); } return; } else if (originalResin) { log.info("选择使用原粹树脂"); click(Math.round(originalResin.x + originalResin.width / 2), Math.round(originalResin.y + originalResin.height / 2)); - if (friendshipTeam) { + if (settings.friendshipTeam) { log.info("切换回战斗队伍"); - await genshin.switchParty(team); + await genshin.switchParty(settings.team); } return; } else if (isResinEmpty) { @@ -459,199 +873,319 @@ async function attemptReward(forceRun, retryCount) { } } - // 重试 + // 界面不正确,尝试重试 if (!isValid) { log.info("当前界面不是地脉之花界面,重试"); await genshin.returnMainUi(); await sleep(1000); retryCount++; - await attemptReward(forceRun, retryCount); + await autoNavigateToReward(); + await attemptReward(settings); } } + +/** + * 开启地脉花 + * @param {string} targetPath - 目标路径 + * @returns {Promise} 区域是否出现地脉任务 + */ +async function openOutcrop(targetPath) { + let ocrRegion1 = { x: 800, y: 200, width: 300, height: 100 }; // 中心区域 + let ocrRegion2 = { x: 0, y: 200, width: 300, height: 300 }; // 追踪任务区域 + let startTime = Date.now(); + let recognized = false; + + keyPress("F"); + + // 前5秒识别中心区域弹出的横幅任务提示 + while (Date.now() - startTime < 5000) { + if (recognizeFightText(ocrRegion1)) { + recognized = true; + break; + } + keyPress("F"); + await sleep(500); + } + + // 如果5秒内没有识别成功,再追加识别追踪任务区域及尝试重新开启地脉花 + if (!recognized) { + let secondStartTime = Date.now(); + while (Date.now() - secondStartTime < 60000) { + if (recognizeFightText(ocrRegion1) || recognizeFightText(ocrRegion2)) { + recognized = true; + break; + } + await pathingScript.runFile(targetPath); + keyPress("F"); + await sleep(500); + } + } +} + +/** + * 识别地脉开启进入战斗文本 + * @param {Object} ocrRegion - OCR识别区域 + * @returns {Promise} 区域是否出现战斗文本 + */ +function recognizeFightText(ocrRegion) { + try { + let result = captureGameRegion().find(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); + let text = result.text; + keywords = ["打倒", "所有", "敌人"]; + for (let keyword of keywords) { + if (text.includes(keyword)) { + return true; + } + } + return false; + } catch (error) { + log.error("OCR过程中出错: {0}", error); + } +} + +/** + * 自动战斗 + * @param {number} timeout - 超时时间 + * @returns {Promise} + */ +async function autoFight(timeout) { + const cts = new CancellationTokenSource(); + try { + const ocrRegionX = 850; + const ocrRegionY = 230; + const ocrRegionWidth = 1040 - ocrRegionX; + const ocrRegionHeight = 300 - ocrRegionY; + let ocrRegion = { x: ocrRegionX, y: ocrRegionY, width: ocrRegionWidth, height: ocrRegionHeight }; + + log.info("开始战斗"); + dispatcher.RunTask(new SoloTask("AutoFight"), cts); + let fightResult = await recognizeTextInRegion(ocrRegion, timeout) ? "成功" : "失败"; + log.info(`战斗结束,战斗结果:${fightResult}`); + cts.cancel(); + } catch (error) { + log.error(`执行过程中出错: ${error}`); + } +} + +/** + * 识别战斗结果 + * @param {Object} ocrRegion - OCR识别区域 + * @param {number} timeout - 超时时间 + * @returns {Promise} 战斗是否成功 + */ +async function recognizeTextInRegion(ocrRegion, timeout) { + let startTime = Date.now(); + const successKeywords = ["挑战达成", "战斗胜利", "挑战成功"]; + const failureKeywords = ["挑战失败"]; + + // 循环检测直到超时 + while (Date.now() - startTime < timeout) { + try { + let result = captureGameRegion().find(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); + let text = result.text; + + // 检查成功关键词 + for (let keyword of successKeywords) { + if (text.includes(keyword)) { + log.info("检测到战斗成功关键词: {0}", keyword); + return true; + } + } + + // 检查失败关键词 + for (let keyword of failureKeywords) { + if (text.includes(keyword)) { + log.warn("检测到战斗失败关键词: {0}", keyword); + return false; + } + } + } + catch (error) { + log.error("OCR过程中出错: {0}", error); + } + await sleep(1000); // 检查间隔 + } + + log.warn("在超时时间内未检测到战斗结果"); + return false; +} + +/** + * 地图标记相关函数 + */ + +/** + * 关闭自定义标记,使用前确保在地图界面 + * @returns {Promise} + */ async function closeCustomMarks() { - await genshin.returnMainUi(); - keyPress("M"); + // await genshin.returnMainUi(); + // keyPress("M"); await sleep(600); click(60, 1020); await sleep(600); + let button = captureGameRegion().find(RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/open.png"),)); if (button) { + marksStatus = false; log.info("关闭自定义标记"); click(Math.round(button.x + button.width / 2), Math.round(button.y + button.height / 2)); await sleep(600); + keyPress("ESCAPE"); } else { log.error("未找到开关按钮"); } - await genshin.returnMainUi(); } -async function findLeyLineOutcrop(country, type, retry, retryCount) { - if (retryCount >= 5) { - retryCount = 0; - throw new Error("寻找地脉花位置失败"); - } - log.info("寻找地脉花位置"); - keyPress("M"); - await sleep(600); - if (country == "蒙德") { - await genshin.moveMapTo(-876, 2278, "蒙德"); - } else if (country == "璃月") { - await genshin.moveMapTo(270, -666, "璃月"); - } else if (country == "稻妻") { - await genshin.moveMapTo(-4400, -3050, "稻妻"); - } else if (country == "须弥") { - await genshin.moveMapTo(2877, -374, "须弥"); - } else if (country == "枫丹") { - await genshin.moveMapTo(4029, 3054, "枫丹"); //吞星之鲸周本 - } else if (country == "纳塔") { - await genshin.moveMapTo(9541, -1782, "纳塔"); //镜璧山七天神像 - // } else if (country == "至冬") { - // await genshin.moveMapTo(12288, 6144, "至冬"); - } else { - throw new Error(`未知国家: ${country}`); - } - // 识别地脉花位置 - lanhua = null; - huanghua = null; - - // 修改:检查locateLeyLineOutcrop的返回值 - const found = await locateLeyLineOutcrop(country, type, retry, retryCount); - - if (!found) { - // 增加重试次数并再次尝试 - retry = true; - retryCount++; - - if (retryCount == 1) { - log.warn("传送到七天神像并关闭自定义标记以避免地脉花图标被遮挡导致找不到地脉花"); - await genshin.tpToStatueOfTheSeven(); - await closeCustomMarks(); - } - - await findLeyLineOutcrop(country, type, retry, retryCount); - } -} - -async function locateLeyLineOutcrop(country, type, retry, retryCount) { - await sleep(200); - await genshin.setBigMapZoomLevel(3.0); - const iconPath = type == "蓝花(经验书)" - ? "assets/icon/Blossom_of_Revelation.png" - : "assets/icon/Blossom_of_Wealth.png"; - - // 查找地脉花 - const flowerList = captureGameRegion().findMulti(RecognitionObject.TemplateMatch(file.ReadImageMatSync(iconPath))); - - if (flowerList && flowerList.count > 0) { - // 找到地脉花,记录位置并计算坐标 - const flower = flowerList[0]; - const flowerType = type == "蓝花(经验书)" ? "经验" : "摩拉"; - - if (type == "蓝花(经验书)") { - lanhua = flower; - } else { - huanghua = flower; - } - - log.info(`找到${flowerType}地脉花,位置:(${flower.x},${flower.y})`); - - // 计算地脉花的实际坐标 - const center = genshin.getPositionFromBigMap(); - const mapZoomLevel = genshin.getBigMapZoomLevel(); - log.info(`地图缩放级别:${mapZoomLevel}`); - - const mapScaleFactor = 2.35; // 地图缩放因子,固定值 - LeyLineOutcropX = (960 - flower.x - 25) * mapZoomLevel / mapScaleFactor + center.x; - LeyLineOutcropY = (540 - flower.y - 25) * mapZoomLevel / mapScaleFactor + center.y; - - log.info(`地脉花的实际坐标:(${LeyLineOutcropX},${LeyLineOutcropY})`); - return true; // 修改:返回true表示找到了地脉花 - } else { - // 未找到地脉花,尝试移动地图或重试 - if (shouldMoveMap(country, retry, retryCount)) { - // 移动到特定位置再次尝试 - retry = false; - const position = getMapPosition(country, retryCount); - log.info(`移动到特定位置:(${position.x},${position.y})`); - await genshin.moveMapTo(position.x, position.y); - return await locateLeyLineOutcrop(country, type, retry, retryCount); // 修改:返回递归调用的结果 - } - - log.warn("未找到地脉花"); - return false; // 修改:返回false表示未找到地脉花 - } -} - -// 判断是否需要移动地图 -function shouldMoveMap(country, retry, retryCount) { - if (!retry) return false; - - const countryRetryMap = { - "蒙德": [0, 1, 2], - "璃月": [0, 1, 2], - "稻妻": [0, 1], - "枫丹": [0, 1], - "纳塔": [0, 1, 2] - }; - - return countryRetryMap[country] && countryRetryMap[country].includes(retryCount); -} - -// 获取地图移动位置 -function getMapPosition(country, retryCount) { - const positionMap = { - "蒙德": [ - { x: -386, y: 2298, name: "奔狼领上方锚点" }, - { x: -1427, y: 1662, name: "南风之狮的庙宇" } - ], - "璃月": [ - { x: 253, y: 1285, name: "碧水原七天神像" }, - { x: 342, y: 548, name: "归离原字左边的锚点" } - ], - "稻妻": [ - { x: -3233, y: -3533, name: "踏鞴砂七天神像" } - ], - "枫丹": [ - { x: 4301, y: 4765, name: "新枫丹科学院锚点" } - ], - "纳塔": [ - { x: 9040, y: -2428, name: "虹灵的净土" }, - { x: 8258, y: -1744, name: "硫晶支脉下方锚点" } - ] - }; - - // 根据国家和重试次数获取对应位置 - const positions = positionMap[country] || []; - if (positions.length === 0) { - log.warn(`未找到国家 ${country} 的位置信息`); - return { x: 0, y: 0, name: "默认位置" }; - } - - const index = Math.min(retryCount, positions.length - 1); - return positions[index]; -} +/** + * 打开自定义标记,使用前确保在地图界面 + * @returns {Promise} + */ async function openCustomMarks() { - await genshin.returnMainUi(); - keyPress("M"); await sleep(600); click(60, 1020); await sleep(600); + let button = captureGameRegion().findMulti(RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/close.png"),)); if (button) { for (let i = 0; i < button.count; i++) { - b = button[i]; + let b = button[i]; if (b.y > 280 && b.y < 350) { log.info("打开自定义标记"); + marksStatus = true; click(Math.round(b.x + b.width / 2), Math.round(b.y + b.height / 2)); } } } else { log.error("未找到开关按钮"); } - await genshin.returnMainUi(); } -// 判断坐标是否在指定位置附近(误差范围内) -function isNearPosition(x, y, targetX, targetY) { - return Math.abs(x - targetX) <= 100 && Math.abs(y - targetY) <= 100; +/** + * 自动导航到地脉花奖励点 + * @returns {Promise} + */ +async function autoNavigateToReward() { + // 定义识别对象 + const boxIconRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/box.png")); + const rewardTextRo = RecognitionObject.Ocr(1210, 515, 200, 50); // 领奖区域检测 + let advanceNum = 0; // 前进次数 + + // 调整初始视角为俯视角 + log.info("调整为俯视视角..."); + middleButtonClick(); + await sleep(1000); + moveMouseBy(0, 1030); + await sleep(500); + moveMouseBy(0, 920); + await sleep(500); + moveMouseBy(0, 710); + await sleep(500); + + log.info("开始自动导航到地脉花..."); + while (true) { + // 1. 优先检查是否已到达领奖点 + let captureRegion = captureGameRegion(); + let rewardTextArea = captureRegion.DeriveCrop(1210, 515, 200, 50); + let ocrResults = rewardTextArea.findMulti(RecognitionObject.ocrThis); + + + if (advanceNum % 15 == 0 && advanceNum >= 10) { + log.warn("前进又超时15次啦,先往旁边挪挪再继续试试") + keyDown("s"); + await sleep(500); + keyUp("s"); + middleButtonClick(); + await sleep(1000); + keyDown("w"); + await sleep(1000); + keyUp("w"); + } + else if (advanceNum > 45) { + throw new Error('前进时间超时'); + } + // 检测到地脉之花文字则结束 + else if (ocrResults.count > 0 && ocrResults[0].text.trim().length > 0) { + for (let i = 0; i < ocrResults.count; i++) { + if (ocrResults[i].text.includes("地脉之花")) { + log.info("已到达领奖点,检测到文字: " + ocrResults[i].text); + return; + } + } + } + + // 2. 未到达领奖点,则调整视野 + await adjustViewForReward(boxIconRo, advanceNum); + + // 3. 前进一小步 + keyDown("w"); + await sleep(900); + keyUp("w"); + await sleep(100); // 等待角色移动稳定 + advanceNum++; + } +} + +/** + * 调整视野直到图标位于正前方 + * @param {Object} boxIconRo - 宝箱图标识别对象 + * @param {number} advanceNum - 当前前进次数 + * @returns {Promise} + */ +async function adjustViewForReward(boxIconRo, advanceNum) { + for (let i = 0; i < 100; i++) { + + // 每10次执行一轮异常页面检查 + if (i % 10 == 0) { + // 识别误触发领取导致超时的情况 + let resList = captureGameRegion().findMulti(RecognitionObject.ocrThis); + if (resList && resList.count > 0) { + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + if (res.text.includes("原粹树脂")) { + log.info("误触发领取页面,尝试关闭页面") + keyPress("ESCAPE"); + await sleep(500); + keyPress("ESCAPE"); + await sleep(500); + await genshin.returnMainUi(); + } + } + } + // 识别误触发其他页面导致超时的情况 + const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/paimon_menu.png"), 0, 0, genshin.width / 3.0, genshin.width / 5.0); + let res = captureGameRegion().Find(paimonMenuRo); + if (res.isEmpty()) { + log.info("误触发其他页面,尝试关闭页面") + click(960, 800); + keyPress("ESCAPE"); + await sleep(500); + keyPress("ESCAPE"); + await sleep(500); + await genshin.returnMainUi(); + } + } + + let captureRegion = captureGameRegion(); + let iconRes = captureRegion.Find(boxIconRo); + + if (!iconRes) { + // 未找到图标,小幅度转动视角 + moveMouseBy(20, 0); + await sleep(100); + continue; + } + + if (iconRes.x >= 920 && iconRes.x <= 980 && iconRes.y <= 540) { + log.info(`视野已调正,前进第 ${advanceNum} 次`); + return; + } else { + // 小幅度调整 + let adjustAmount = iconRes.x < 920 ? -20 : 20; + let adjustAmount2 = iconRes.y < 540 ? 1 : 10; + moveMouseBy(adjustAmount * adjustAmount2, 0); + await sleep(100); + } + } + // throw new Error('视野调整超时'); } diff --git a/repo/js/AutoLeyLineOutcrop/manifest.json b/repo/js/AutoLeyLineOutcrop/manifest.json index b7102bc9..452436e8 100644 --- a/repo/js/AutoLeyLineOutcrop/manifest.json +++ b/repo/js/AutoLeyLineOutcrop/manifest.json @@ -1,9 +1,9 @@ { "manifest_version": 1, "name": "全自动地脉花", - "version": "2.1", - "bgi_version": "0.44.3", - "description": "基于OCR图像识别的全自动刷取地脉花。\n💡更多信息请查看在线手册:https://hcnsvf0s8d0s.feishu.cn/wiki/Tb1twpThLi7UlykqcYOcuccTnjJ \n\n----------注意事项----------\n●仅支持BetterGI 0.44.3 及以上版本!\n●脚本仍未完成,没有出现的路线还未制作,请耐心等待。目前只有蒙德是全部路线,其他国家请使用强制运行模式。\n●目前脚本能力有限,暂时不支持识别地脉花是否已经开启,请确保队伍的练度足够,中途出现角色血量过低或倒下会无法继续,届时需要在重新运行时手动关闭领取地脉花奖励的界面。\n●脚本还提供了强行运行的功能,当无法识别地脉花位置时可以指定线路,脚本将不再对地脉花进行识别,即使没有领取到奖励也会继续运行,适用于路线重跑以及开发调试。\n●运行时会传送到七天神像设置中设置的七天神像,可能需要关闭七天神像设置中的“是否就近七天神像恢复血量”,并指定七天神像。\n●战斗策略注意调度器设置中地图追踪行走配置里的“允许在JsSpript中使用”和“覆盖JS中的自动战斗配置”,只有在都打开的情况下脚本才会使用下面的战斗配置,否则会使用独立任务中的战斗策略。", + "version": "3.0", + "bgi_version": "0.44.7", + "description": "基于OCR图像识别的全自动刷取地脉花。\n💡更多信息请查看在线手册:https://hcnsvf0s8d0s.feishu.cn/wiki/Tb1twpThLi7UlykqcYOcuccTnjJ \n\n----------注意事项----------\n●仅支持BetterGI 0.44.7 及以上版本!\n●脚本仍未完成,没有出现的路线还未制作,请耐心等待。目前只有蒙德是全部路线,其他国家请使用强制运行模式。\n●目前脚本能力有限,暂时不支持识别地脉花是否已经开启,请确保队伍的练度足够,中途出现角色血量过低或倒下会无法继续,届时需要在重新运行时手动关闭领取地脉花奖励的界面。\n●脚本还提供了强行运行的功能,当无法识别地脉花位置时可以指定线路,脚本将不再对地脉花进行识别,即使没有领取到奖励也会继续运行,适用于路线重跑以及开发调试。\n●运行时会传送到七天神像设置中设置的七天神像,可能需要关闭七天神像设置中的“是否就近七天神像恢复血量”,并指定七天神像。\n●战斗策略注意调度器设置中地图追踪行走配置里的“允许在JsSpript中使用”和“覆盖JS中的自动战斗配置”,只有在都打开的情况下脚本才会使用下面的战斗配置,否则会使用独立任务中的战斗策略。", "authors": [ { "name": "ddaodan", @@ -12,6 +12,14 @@ { "name": "平面镜", "link": "https://github.com/Flatmirrr" + }, + { + "name": "秋云", + "link": "https://github.com/physligl" + }, + { + "name": "起个名字好难的喵", + "link": "https://github.com/MisakaAldrich" } ], "settings_ui": "settings.json", diff --git a/repo/js/AutoLeyLineOutcrop/settings.json b/repo/js/AutoLeyLineOutcrop/settings.json index db18bd21..0cd15f44 100644 --- a/repo/js/AutoLeyLineOutcrop/settings.json +++ b/repo/js/AutoLeyLineOutcrop/settings.json @@ -20,7 +20,7 @@ "options": [ "蒙德", "璃月", - //"稻妻", + "稻妻", //"须弥", "枫丹", "纳塔" @@ -47,37 +47,9 @@ "label": "好感队名称,不填表示不切换好感队" }, { - "name": "forceRun", - "type": "checkbox", - "label": "强制运行,适用于中途停止等特殊情况\n开启后将无视地脉花的实际位置" - }, - { - "name": "forceRunPath", - "type": "select", - "label": "强制运行的路线,勾选上方选项后生效", - "options": [ - "蒙德1-风起地", - "蒙德2-清泉镇", - "蒙德3-奔狼领", - "蒙德4-风龙废墟", - "蒙德5-千风神殿", - "蒙德6-望风山地", - "蒙德7-达达乌帕谷", - "璃月1-石门", - //"(WIP)璃月3-瑶光滩", - //"(WIP)稻妻3-八酝岛", - //"(WIP)须弥", - "枫丹1-秋分山西侧", - "枫丹2-芒索斯山东麓", - "枫丹3-新枫丹科学院", - "枫丹4-柔灯港", - "枫丹5-秋分山东侧", - "枫丹6-厄里那斯", - "纳塔1-隆崛坡", - "纳塔4-溶水域", - "纳塔5-安饶之野", - "纳塔6-圣火竞技场" - ] + "name": "timeout", + "type": "input-text", + "label": "战斗超时时间,单位秒,默认120秒" } ] \ No newline at end of file