diff --git a/repo/js/AutoSereniteaPot/main.js b/archive/js/AutoSereniteaPot/main.js similarity index 100% rename from repo/js/AutoSereniteaPot/main.js rename to archive/js/AutoSereniteaPot/main.js diff --git a/repo/js/AutoSereniteaPot/manifest.json b/archive/js/AutoSereniteaPot/manifest.json similarity index 90% rename from repo/js/AutoSereniteaPot/manifest.json rename to archive/js/AutoSereniteaPot/manifest.json index 740f9100..43f6ec2e 100644 --- a/repo/js/AutoSereniteaPot/manifest.json +++ b/archive/js/AutoSereniteaPot/manifest.json @@ -9,6 +9,10 @@ "links": "https://github.com/bling-yshs" } ], + "tags": [ + "尘歌壶", + "购买物品" + ], "settings_ui": "settings.json", "main": "main.js" } \ No newline at end of file diff --git a/repo/js/AutoSereniteaPot/settings.json b/archive/js/AutoSereniteaPot/settings.json similarity index 100% rename from repo/js/AutoSereniteaPot/settings.json rename to archive/js/AutoSereniteaPot/settings.json diff --git a/repo/js/AutoStygianOnslaught/README.md b/archive/js/AutoStygianOnslaught/README.md similarity index 97% rename from repo/js/AutoStygianOnslaught/README.md rename to archive/js/AutoStygianOnslaught/README.md index baef81a2..36a5913a 100644 --- a/repo/js/AutoStygianOnslaught/README.md +++ b/archive/js/AutoStygianOnslaught/README.md @@ -1,105 +1,105 @@ -# 自动幽境危战注意事项 - -## 零、前言 - -- 当前文档处于测试阶段,注意事项可能尚不完善,敬请谅解。 -- 如发现BUG,请通过QQ:119996800联系我们,您的反馈将非常受欢迎。 -- 本脚本基于地脉花和首领一条龙脚本进行改造。 -- 脚本仅供娱乐使用,请在下载后24小时内删除。 - -## 一、省流注意事项 - -1. **使用前准备**: - - 请在`<<幽境危战>>`中配置好战斗队伍。 -2. **黑名单建议**: - - 根目录下有文件内含建议加入`自动拾取黑名单`的名称,请检查并添加。 -3. **战斗实力**: - - 请确保队伍具备足够的战斗实力,当前版本在战斗失败或执行错误,只会重试`一次`。 -4. **自动拾取功能**: - - 为避免不必要的干扰,建议关闭自动拾取功能。 - -## 二、配置简介 - -1. **圣遗物奖励**: - - 默认设置下,脚本不会修改圣遗物奖励。 - -2. **Boss挑战关卡选择**: - - 必填项:请从上往下选择第几个Boss挑战关卡`(1至3)`,否则脚本将无法执行。 - -3. **挑战次数**: - - 默认设置为`15`次,期间若树脂耗尽,脚本将自动结束。 - -4. **树脂顺序设定**: - - 使用`/`隔开数字来设定树脂使用顺序,如`1/2`表示先使用浓缩树脂,再使用原粹树脂。 - - 树脂类型对应关系: - - 1 = 浓缩树脂 - - 2 = 原粹树脂 - - 3 = 脆弱树脂 - - 4 = 须臾树脂 - - 默认设置:`1/2`,表示先使用浓缩树脂,再使用原粹树脂,不填的不使用"。 - -5. **最长战斗超时时间**: - - 默认设置为`240`秒,一般情况下无需修改。 - -6. **开始战斗后的移动时间**: - - 默认设置为`1`秒(注意单位为`秒`),由于战斗开始位置离Boss较远,请根据实际情况设定,一般情况下默认设置即可。 - -## 三、更新说明 - -### v.1.0版本(20250627) - -- **功能**:脚本发布。 - -### v.1.1版本 - -- **备注**:此版本信息被省略。 - -### v.1.2版本(20250627) - -- **新增功能**: - 1. 添加圣遗物`奖励选择`功能。 - 2. 添加自动选择`难度`功能。 -- **优化**: - 1. 优化逻辑处理。 - 2. 加大战斗完成识别区域。 - -### v.1.3版本(20250628) - -- **新增功能**: - 1. 添加`自动重试`,战斗失败或执行错误会`重试一次`。 -- **优化**: - 2. 优化退出点击时序和逻辑。 - 3. 优化进入秘境后向前走的逻辑。 - 4. 优化LOG输出显示内容。 -- **修复** - 1. 修复默认状态下,选择长夜套的BUG。 - -### v.1.4版本(20250629) - -- **新增功能**: - 1. 添加领奖后的树脂识别,不足时退出秘境,防止多打一次。 -- **优化**: - 1. 优化`再次挑战`挑战的点击逻辑,添加重试。 - 2. 优化相关自动拾取代码。 - 3. 优化`难度选择`和`圣遗物选择`的识别范围。 - - ### v.1.5版本(20250630) - -- **新增功能**: - 1. 自动战斗失败原地`重试2次`,失败后再退出秘境重试。 -- **优化**: - 1. 优化`LOG`显示。 - 2. 优化`完全没有树脂`情况弹窗提示处理。 - 3. 优化删除拾取`黑名单`文件(0.47.0后不会乱触发了)。 - 4. 优化各种`异常状态`的退出处理方法。 - 5. 优化当有须臾树脂时,脆弱树脂不显示时的处理。 - - ### v.1.6版本:20250702 - -- **优化**: -1. 优化没找到地脉花领奖的超时退出处理。 -2. 优化树脂识别OCR区域。 -3. 优化LOG和代码写法和整理。 - - - +# 自动幽境危战注意事项 + +## 零、前言 + +- 当前文档处于测试阶段,注意事项可能尚不完善,敬请谅解。 +- 如发现BUG,请通过QQ:119996800联系我们,您的反馈将非常受欢迎。 +- 本脚本基于地脉花和首领一条龙脚本进行改造。 +- 脚本仅供娱乐使用,请在下载后24小时内删除。 + +## 一、省流注意事项 + +1. **使用前准备**: + - 请在`<<幽境危战>>`中配置好战斗队伍。 +2. **黑名单建议**: + - 根目录下有文件内含建议加入`自动拾取黑名单`的名称,请检查并添加。 +3. **战斗实力**: + - 请确保队伍具备足够的战斗实力,当前版本在战斗失败或执行错误,只会重试`一次`。 +4. **自动拾取功能**: + - 为避免不必要的干扰,建议关闭自动拾取功能。 + +## 二、配置简介 + +1. **圣遗物奖励**: + - 默认设置下,脚本不会修改圣遗物奖励。 + +2. **Boss挑战关卡选择**: + - 必填项:请从上往下选择第几个Boss挑战关卡`(1至3)`,否则脚本将无法执行。 + +3. **挑战次数**: + - 默认设置为`15`次,期间若树脂耗尽,脚本将自动结束。 + +4. **树脂顺序设定**: + - 使用`/`隔开数字来设定树脂使用顺序,如`1/2`表示先使用浓缩树脂,再使用原粹树脂。 + - 树脂类型对应关系: + - 1 = 浓缩树脂 + - 2 = 原粹树脂 + - 3 = 脆弱树脂 + - 4 = 须臾树脂 + - 默认设置:`1/2`,表示先使用浓缩树脂,再使用原粹树脂,不填的不使用"。 + +5. **最长战斗超时时间**: + - 默认设置为`240`秒,一般情况下无需修改。 + +6. **开始战斗后的移动时间**: + - 默认设置为`1`秒(注意单位为`秒`),由于战斗开始位置离Boss较远,请根据实际情况设定,一般情况下默认设置即可。 + +## 三、更新说明 + +### v.1.0版本(20250627) + +- **功能**:脚本发布。 + +### v.1.1版本 + +- **备注**:此版本信息被省略。 + +### v.1.2版本(20250627) + +- **新增功能**: + 1. 添加圣遗物`奖励选择`功能。 + 2. 添加自动选择`难度`功能。 +- **优化**: + 1. 优化逻辑处理。 + 2. 加大战斗完成识别区域。 + +### v.1.3版本(20250628) + +- **新增功能**: + 1. 添加`自动重试`,战斗失败或执行错误会`重试一次`。 +- **优化**: + 2. 优化退出点击时序和逻辑。 + 3. 优化进入秘境后向前走的逻辑。 + 4. 优化LOG输出显示内容。 +- **修复** + 1. 修复默认状态下,选择长夜套的BUG。 + +### v.1.4版本(20250629) + +- **新增功能**: + 1. 添加领奖后的树脂识别,不足时退出秘境,防止多打一次。 +- **优化**: + 1. 优化`再次挑战`挑战的点击逻辑,添加重试。 + 2. 优化相关自动拾取代码。 + 3. 优化`难度选择`和`圣遗物选择`的识别范围。 + + ### v.1.5版本(20250630) + +- **新增功能**: + 1. 自动战斗失败原地`重试2次`,失败后再退出秘境重试。 +- **优化**: + 1. 优化`LOG`显示。 + 2. 优化`完全没有树脂`情况弹窗提示处理。 + 3. 优化删除拾取`黑名单`文件(0.47.0后不会乱触发了)。 + 4. 优化各种`异常状态`的退出处理方法。 + 5. 优化当有须臾树脂时,脆弱树脂不显示时的处理。 + + ### v.1.6版本:20250702 + +- **优化**: +1. 优化没找到地脉花领奖的超时退出处理。 +2. 优化树脂识别OCR区域。 +3. 优化LOG和代码写法和整理。 + + + diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_1.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_1.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_1.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_1.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_10.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_10.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_10.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_10.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_10in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_10in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_10in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_10in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_11.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_11.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_11.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_11.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_11in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_11in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_11in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_11in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_12.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_12.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_12.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_12.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_12in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_12in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_12in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_12in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_13.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_13.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_13.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_13.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_13in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_13in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_13in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_13in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_14.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_14.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_14.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_14.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_14in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_14in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_14in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_14in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_15.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_15.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_15.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_15.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_15in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_15in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_15in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_15in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_16.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_16.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_16.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_16.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_16in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_16in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_16in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_16in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_17.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_17.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_17.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_17.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_17in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_17in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_17in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_17in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_18.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_18.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_18.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_18.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_18in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_18in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_18in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_18in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_1in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_1in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_1in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_1in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_2.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_2.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_2.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_2.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_2in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_2in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_2in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_2in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_3.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_3.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_3.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_3.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_3in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_3in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_3in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_3in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_4.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_4.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_4.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_4.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_4in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_4in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_4in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_4in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_5.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_5.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_5.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_5.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_5in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_5in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_5in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_5in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_6.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_6.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_6.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_6.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_6in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_6in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_6in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_6in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_7.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_7.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_7.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_7.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_7in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_7in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_7in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_7in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_8.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_8.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_8.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_8.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_8in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_8in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_8in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_8in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_9.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_9.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_9.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_9.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_9in.bmp b/archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_9in.bmp similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/Artifacts/artifact_9in.bmp rename to archive/js/AutoStygianOnslaught/assets/Artifacts/artifact_9in.bmp diff --git a/repo/js/AutoStygianOnslaught/assets/box.png b/archive/js/AutoStygianOnslaught/assets/box.png similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/box.png rename to archive/js/AutoStygianOnslaught/assets/box.png diff --git a/repo/js/AutoStygianOnslaught/assets/condensed_resin_count.png b/archive/js/AutoStygianOnslaught/assets/condensed_resin_count.png similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/condensed_resin_count.png rename to archive/js/AutoStygianOnslaught/assets/condensed_resin_count.png diff --git a/repo/js/AutoStygianOnslaught/assets/fragile_resin_count.png b/archive/js/AutoStygianOnslaught/assets/fragile_resin_count.png similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/fragile_resin_count.png rename to archive/js/AutoStygianOnslaught/assets/fragile_resin_count.png diff --git a/repo/js/AutoStygianOnslaught/assets/moment_resin_count.png b/archive/js/AutoStygianOnslaught/assets/moment_resin_count.png similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/moment_resin_count.png rename to archive/js/AutoStygianOnslaught/assets/moment_resin_count.png diff --git a/repo/js/AutoStygianOnslaught/assets/one.png b/archive/js/AutoStygianOnslaught/assets/one.png similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/one.png rename to archive/js/AutoStygianOnslaught/assets/one.png diff --git a/repo/js/AutoStygianOnslaught/assets/original_resin_count.png b/archive/js/AutoStygianOnslaught/assets/original_resin_count.png similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/original_resin_count.png rename to archive/js/AutoStygianOnslaught/assets/original_resin_count.png diff --git a/repo/js/AutoStygianOnslaught/assets/全自动幽境危战.json b/archive/js/AutoStygianOnslaught/assets/全自动幽境危战.json similarity index 100% rename from repo/js/AutoStygianOnslaught/assets/全自动幽境危战.json rename to archive/js/AutoStygianOnslaught/assets/全自动幽境危战.json diff --git a/repo/js/AutoStygianOnslaught/main.js b/archive/js/AutoStygianOnslaught/main.js similarity index 98% rename from repo/js/AutoStygianOnslaught/main.js rename to archive/js/AutoStygianOnslaught/main.js index f3524fd1..2306abf2 100644 --- a/repo/js/AutoStygianOnslaught/main.js +++ b/archive/js/AutoStygianOnslaught/main.js @@ -1,815 +1,815 @@ -(async function () { - - let challengeNum = settings.challengeNum;//挑战次数 - if (challengeNum === undefined || challengeNum === ""){challengeNum = 15; }//挑战次数 - let challengeName = settings.challengeName;//挑战BOSS - if (challengeName === undefined || challengeName === ""){throw new Error("挑战Boss未配置,请在JS配置中选择...")}//初始化处理 - let Startforward = settings.Startforward*1000 ? settings.Startforward*1000 : 1000;//开始战斗的前进时间 - var Fighttimeout = settings.timeout * 1000 ? settings.timeout * 1000 : 240000;//战斗超时时间,默认为240秒 - const ocrRegion1 = { x: 643, y: 58, width: 800, height: 800 }; // 上方挑战成功区域 - const ocrRegion2 = { x: 780, y: 406, width: 370, height: 135 }; // 中间挑战失败区域 - const ocrRo1 = RecognitionObject.ocr(ocrRegion1.x, ocrRegion1.y, ocrRegion1.width, ocrRegion1.height);//上方挑战成功区域OCR对象 - const ocrRo2 = RecognitionObject.ocr(ocrRegion2.x, ocrRegion2.y, ocrRegion2.width, ocrRegion2.height);//中间挑战失败区域OCR对象 - var Rewardsuse = settings.Rewardsuse ? settings.Rewardsuse : "1/2";//树脂使用类型,默认为1/2,即浓缩树脂和原粹树脂 - var resinTypes = Rewardsuse.split("/"); - var rewards = []; - var onerewards, secendrewards, threendrewards, fourdrewards; - for (var i = 0; i < resinTypes.length; i++) { - var resinType = parseInt(resinTypes[i]); - if (isNaN(resinType) || resinType < 1 || resinType > 4) { - throw new Error("设定的树脂类型无效或缺失,请重新配置"); - } - rewards.push(resinType); - } - const resinTypeMap = ["","使用1个浓缩树脂,获取2倍产出", "使用20个原粹树脂", "使用1个脆弱树脂,获取3倍产出", "使用1个须臾树脂,获取3倍产出"];//识别树脂领奖文字 - const golbalRewards = ["","浓缩树脂","原粹树脂","脆弱树脂","须臾树脂"]; // 对应四种树脂 - // 根据 rewards 数组长度,依次赋值给对应的变量 - if (rewards.length > 0) onerewards = golbalRewards[rewards[0]]; - if (rewards.length > 1) secendrewards = golbalRewards[rewards[1]]; - if (rewards.length > 2) threendrewards = golbalRewards[rewards[2]]; - if (rewards.length > 3) fourdrewards = golbalRewards[rewards[3]]; - const golbalRewardText = [onerewards, secendrewards, threendrewards, fourdrewards].filter(Boolean);//过滤树脂使用类型 - - var advanceNum = 0;//前进寻找地脉之花次数 - var verticalNum = 0;//重试寻找地脉之花次数 - var resinAgain = false;//是否重试标志 - - var Artifacts = settings.Artifacts ? settings.Artifacts : "保持圣遗物奖励不变"; - - //映射所有圣遗物对应需要识别的图片 - var artifactImageMap = { - "长夜之誓 / 深廊终曲": "assets/Artifacts/artifact_1.bmp", - "黑曜秘典 / 烬城勇者绘卷": "assets/Artifacts/artifact_2.bmp", - "谐律异想断章 / 未竟的遐思": "assets/Artifacts/artifact_3.bmp", - "回声之林夜话 / 昔时之歌": "assets/Artifacts/artifact_4.bmp", - "逐影猎人 / 黄金剧团": "assets/Artifacts/artifact_5.bmp", - "水仙之梦 / 花海甘露之光": "assets/Artifacts/artifact_6.bmp", - "乐园遗落之花 / 沙上楼阁史话": "assets/Artifacts/artifact_7.bmp", - "深林的记忆 / 饰金之梦": "assets/Artifacts/artifact_8.bmp", - "来歆余响 / 辰砂往生录": "assets/Artifacts/artifact_9.bmp", - "华馆梦醒形骸记 / 海染砗磲": "assets/Artifacts/artifact_10.bmp", - "绝缘之旗印 / 追忆之注连": "assets/Artifacts/artifact_11.bmp", - "昔日宗室之仪 / 染血的骑士道": "assets/Artifacts/artifact_12.bmp", - "渡过烈火的贤人 / 炽烈的炎之魔女": "assets/Artifacts/artifact_13.bmp", - "悠古的磐岩 / 逆飞的流星": "assets/Artifacts/artifact_14.bmp", - "千岩牢固 / 苍白之火": "assets/Artifacts/artifact_15.bmp", - "冰风迷途的勇士 / 沉沦之心": "assets/Artifacts/artifact_16.bmp", - "翠绿之影 / 被怜爱的少女": "assets/Artifacts/artifact_17.bmp", - "如雷的盛怒 / 平息鸣雷的尊者": "assets/Artifacts/artifact_18.bmp" - }; - - //树脂识别图片 - var condensedResin = "assets/condensed_resin_count.png"; - var originalResin = "assets/original_resin_count.png"; - var fragileResin = "assets/fragile_resin_count.png"; - var momentResin = "assets/moment_resin_count.png"; - var oneResin = "assets/one.png"; - - //文字识别封装函数 - async function Textocr(wenzi="空参数",chaotime=10,clickocr=0,debugcode=0,x=0,y=0,w=1920,h=1080) { - const startTime = new Date(); - for (let ii = 0; ii < 10; ii++) - { - // 获取一张截图 - let captureRegion = captureGameRegion(); - let res1 - // 对整个区域进行 OCR - let resList = captureRegion.findMulti(RecognitionObject.ocr(x,y,w,h)); - //log.info("OCR 全区域识别结果数量 {len}", resList.count); - for (let i = 0; i < resList.count; i++) - { // 遍历的是 C# 的 List 对象,所以要用 count,而不是 length - let res = resList[i]; - res1=res.text - if (res.text===wenzi) { - log.info(`识别到 ·${res1}·`); - if (debugcode===1){if (x===0 & y===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10);return result = { text: res.text, x: res.x, y: res.y, found: true }}}else{if (x===0 & y===0){log.info("文本OCR完成'{text}'", res.text);}} - if (clickocr===1){await sleep(1000);await click(res.x, res.y);}else{} - if (clickocr===2){await sleep(100);await keyPress("F");}else{} - return result = { text: res.text, x: res.x, y: res.y, found: true } - } - if (debugcode===2 && !res.isEmpty()){ - // log.info("({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10); - return result = { text: res.text, x: res.x, y: res.y, found: true } - } - } - const NowTime = new Date(); - if (Math.abs(NowTime - startTime)>chaotime*1000){if (x===0 & y===0){log.info(`${chaotime}秒超时退出,"${wenzi}"未找到`);}return result = {found: false };}else{ii=8;if (x !== 861){if(debugcode!==3){await keyPress("VK_W");}};} - await sleep(100); - } - } - - // 图片识别封装函数 - async function imageRecognition(imagefilePath="空参数",timeout=10,afterBehavior=0,debugmodel=0,xa=0,ya=0,wa=1920,ha=1080) { - const startTime = new Date(); - const Imagidentify = RecognitionObject.TemplateMatch(file.ReadImageMatSync(imagefilePath)); - for (let ii = 0; ii < 10; ii++) { - captureRegion = captureGameRegion(); // 获取一张截图 - res = captureRegion.DeriveCrop(xa, ya, wa, ha).Find(Imagidentify); - if (res.isEmpty()) { - if (debugmodel===1 & xa===0 & ya===0){log.info("未识别页面元素")}; - } else { - if (afterBehavior===1){if (xa===0 & ya===0){log.info("点击模式:开");}await sleep(1000);click(res.x+xa, res.y+ya);}else{if (debugmodel===1 & xa===0 & ya===0){log.info("点击模式:关")}} - if (afterBehavior===2){if (xa===0 & ya===0){log.info("F模式:开");}await sleep(1000);keyPress("F");}else{if (debugmodel===1 & xa===0 & ya===0){log.info("F模式:关")}} - if (debugmodel===1 & xa===0 & ya===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x+xa, res.y+ya, res.width, res.Height);}else{ log.info("识别到页面元素");} - - return result = { x: res.x+xa, y: res.y+ya, w:res.width,h:res.Height,found: true } - } - const NowTime = new Date(); - if ((NowTime - startTime)>timeout*1000){if (debugmodel===1 & xa===0 & ya===0){log.info(`${timeout}秒超时退出,未找到图片`);}return result = {found: false };}else{ii=8} - await sleep(200); - } - await sleep(1200); - } - - //树脂数量获取函数 - async function getRemainResinStatus() { - var condensedResinCount = 0; // 浓缩树脂 - var originalResinCount = 0; // 原粹树脂 - var fragileResinCount = 0; // 脆弱树脂 - var momentResinCount = 0; // 须臾树脂 - - var originalResinCountRa = await imageRecognition(originalResin,0.3, 0, 0,1500,0,200,90); - if (originalResinCountRa.found) { - // await moveMouseTo(originalResinCountRa.x,originalResinCountRa.y); - let countArea = await Textocr("",1, 0, 2,originalResinCountRa.x+originalResinCountRa.w,originalResinCountRa.y,originalResinCountRa.w*3,originalResinCountRa.h);// - if (countArea.found){ - log.info("原粹树脂识别数量结果:"+ countArea.text); - let match = countArea.text.match(/(\d+)\s*[/1]\s*(2|20|200)/); - if (match) { - originalResinCount = match[1]; - // log.info("脆弱树脂识别数量提取:"+ originalResinCount); - } - else{ - log.info("原粹树脂识别数量提取失败"); - } - } - else{ - log.info("原粹树脂识别数量结果::无"); - } - - } else { - log.info("未检测到原粹树脂图标"); - } - - // 浓缩树脂 - var condensedResinCountRa = await imageRecognition(condensedResin,0.1, 0, 0,960,0,800,100); - if (condensedResinCountRa.found) { - // await moveMouseTo(condensedResinCountRa.x,condensedResinCountRa.y); - let countArea = await Textocr("",0.5, 0, 2,condensedResinCountRa.x+condensedResinCountRa.w,condensedResinCountRa.y,condensedResinCountRa.w,condensedResinCountRa.h);// - if (countArea.found){ - // log.info("浓缩树脂识别数量结果: "+ countArea.text); - condensedResinCount = countArea.text - } - else{ - condensedResinCount = "1"; - log.info("浓缩树脂识别数量结果:1");//不知道为什么,1无法识别,0是不显示图标的,所以就当时1了,反正也没啥影响 - } - - } else { - log.info("未检测到浓缩树脂图标"); - } - - var momentResinCountRa = await imageRecognition(momentResin,0.1, 0, 1,1170,0,300,100); - if (momentResinCountRa.found) { - // await moveMouseTo(momentResinCountRa.x,momentResinCountRa.y); - let countArea = await Textocr("",0.5, 0, 2,momentResinCountRa.x+momentResinCountRa.w+20,momentResinCountRa.y-15,60,40);// - if (countArea.found){ - //log.info("须臾树脂识别数量结果:"+ countArea.text); - momentResinCount = countArea.text - } - else{ - var oneRa = await imageRecognition(oneResin,0.1, 0, 1,momentResinCountRa.x+momentResinCountRa.w+20,momentResinCountRa.y-15,60,40); - if (oneRa.found){ - momentResinCount = "1"; - }else{ - log.info("须臾树脂强制为 1 "); - momentResinCount = "1"; - } - } - log.info("脆弱树脂强制为 1 ");//须臾树脂出现,脆弱树脂不显示,强制设置为1,情况非常少,大不了打多一次 - fragileResinCount = "1"; - }else - { - var fragileResinCountRa = await imageRecognition(fragileResin,0.1, 0, 1,1170,0,300,100); - if (fragileResinCountRa.found) { - // await moveMouseTo(fragileResinCountRa.x+fragileResinCountRa.w+20,fragileResinCountRa.y-15); - let countArea = await Textocr("",0.5, 0, 2,fragileResinCountRa.x+fragileResinCountRa.w+20,fragileResinCountRa.y-15,60,40);// - if (countArea.found){ - // log.info("脆弱树脂识别数量结果:"+ countArea.text); - fragileResinCount = countArea.text - } - else{ - var oneRa = await imageRecognition(oneResin,0.1, 0, 1,fragileResinCountRa.x+fragileResinCountRa.w+20,fragileResinCountRa.y-15,60,40); - if (oneRa.found){ - fragileResinCount = "1"; - }else{ - fragileResinCount = "1"; - log.info("脆弱树脂识别强制为 1 ");//有图标说明至少为1 - } - } - } - else { - log.info("未检测到脆弱树脂图标"); - } - } - - log.info("树脂状态:浓缩{0} 原粹{1} 脆弱{2} 须臾{3}", condensedResinCount, originalResinCount, fragileResinCount,momentResinCount) - return {condensedResinCount,originalResinCount,fragileResinCount,momentResinCount} - } - - //征讨之花领奖寻找函数 - const autoNavigateToReward = async () => { - // 定义识别对象 - const boxIconRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/box.png")); - - advanceNum = 0;//前进次数 - //调整为俯视视野 - middleButtonClick(); - await sleep(800); - moveMouseBy(0, 1030); - await sleep(400); - moveMouseBy(0, 920); - await sleep(400); - moveMouseBy(0, 710); - log.info("开始领奖"); - - while (true) { - // 1. 优先检查是否已到达领奖点 - let captureRegion = captureGameRegion(); - let rewardTextArea = captureRegion.DeriveCrop(1210, 515, 200, 50); - let rewardResult = rewardTextArea.find(RecognitionObject.ocrThis); - // 检测到特点文字则结束!!! - if (rewardResult.text == "激活地脉之花") { - log.info("已到达领奖点,检测到文字: " + rewardResult.text); - return true; - } - else if(advanceNum > 40){ - await getOut(); - await await genshin.returnMainUi(); - throw new Error('前进时间超时'); - } - // 2. 未到达领奖点,则调整视野 - for(let i = 0; i < 100; i++){ - captureRegion = captureGameRegion(); - let iconRes = captureRegion.Find(boxIconRo); - let climbTextArea = captureRegion.DeriveCrop(1808, 1030, 25, 25); - let climbResult = climbTextArea.find(RecognitionObject.ocrThis); - // 检查是否处于攀爬状态 - if (climbResult.isEmpty()){ - let SHU = Textocr("地脉之花", 0.3, 1, 0, 840,225, 230, 125); - if (SHU.found){ - return true; - } - log.info("检侧到页面错误,尝试脱离"); - await keyDown("w"); - await keyPress("VK_ESCAPE"); - await sleep(500); - await keyDown("w"); - await sleep(5000); - await keyUp("w"); - } - - if (iconRes.x >= 920 && iconRes.x <= 980 && iconRes.y <= 540) { - advanceNum++; - log.info(`视野已调正,前进第${advanceNum}次`); - break; - } else { - // 小幅度调整 - if(iconRes.y >= 520) moveMouseBy(0, 920); - let adjustAmount = iconRes.x < 920 ? -20 : 20; - let distanceToCenter = Math.abs(iconRes.x - 920); // 计算与920的距离 - let scaleFactor = Math.max(1, Math.floor(distanceToCenter / 50)); // 根据距离缩放,最小为1 - let adjustAmount2 = iconRes.y < 540 ? scaleFactor : 10; - moveMouseBy(adjustAmount * adjustAmount2, 0); - await sleep(100); - } - - if(i > 97) { - if (verticalNum >= 2) { - verticalNum = 0; - await getOut(); - await await genshin.returnMainUi(); - throw new Error('领取超时'); - } - log.info("领取超时,重新尝试1次"); - await sleep(1000); - return false; - } - } - // 3. 前进一小步 - keyDown("w"); - await sleep(600); - keyUp("w"); - await sleep(100); // 等待角色移动稳定 - let earthlyVeins = await Textocr("地脉之花", 0.1, 0, 0, 840,225, 230, 125) - if (earthlyVeins.found) { - return true; - } - } - } - - //向前寻找钥匙函数 - async function readyFightIn(){ - var startTime = new Date(); - await sleep(500); - var NowTime = new Date(); - keyDown("w"); - while ((NowTime - startTime)<15*1000){ - const result = await Textocr("战斗准备",0,0,3,1198,492,150,80); - const result2 = await Textocr("开始挑战",0,0,3,1554,970,360, 105); - if (result.found || result2.found) { - keyPress("F");keyPress("F");keyPress("F");keyPress("F"); - keyUp("w"); - return true; - } - keyDown("w"); - keyPress("F"); - NowTime = new Date(); - } - await keyUp("w"); - return false - } - - //异步检测战斗执行函数,来自D捣蛋&秋云佬的全自动地脉花的代码 - async function autoFight(timeout) { - const cts = new CancellationTokenSource(); - log.info("开始战斗"); - dispatcher.RunTask(new SoloTask("AutoFight"), cts); - let fightResult = await recognizeTextInRegion(timeout); - logFightResult = fightResult ? "成功" : "失败"; - log.info(`战斗结束,战斗结果:${logFightResult}`); - cts.cancel(); - return fightResult; - } - - //异步检测战斗结果函数 - async function recognizeTextInRegion(timeout) { - return new Promise((resolve, reject) => { - (async () => { - try { - let startTime = Date.now(); - const successKeywords = ["挑战完成","战斗完成"]; - const failureKeywords = ["战斗失败","挑战失败"]; - - // 循环检测直到超时 - while (Date.now() - startTime < timeout) { - try { - let captureRegion = captureGameRegion(); - let result = captureRegion.find(ocrRo1); - let result2 = captureRegion.find(ocrRo2); - let text = result.text; - let text2 = result2.text; - - // 检查成功关键词 - for (let keyword of successKeywords) { - if (text.includes(keyword)) { - log.info("检测到战斗成功关键词: {0}", keyword); - resolve(true); - return; - } - } - - // 检查失败关键词-- - for (let keyword of failureKeywords) { - if (text2.includes(keyword)) { - log.warn("检测到战斗失败关键词: {0}", keyword); - resolve(false); - return; - } - } - } - catch (error) { - log.error("OCR过程中出错: {0}", error); - } - - await sleep(1000); // 检查间隔 - } - - log.warn("在超时时间内未检测到战斗结果"); - resolve(false); - } catch (error) { - reject(error); - } - })(); - }); - } - - //圣遗物奖励更换函数 - async function selectionHolyRelics() { - - let artifactImagePath = artifactImageMap[Artifacts]; - // 检查artifactImagePath是否存在 - if (!artifactImagePath) { - throw new Error(`未找到与Artifacts值'${Artifacts}'对应的图片路径`); - } - let modifiedPath = artifactImagePath.slice(0, -4); - let newImagePath = modifiedPath + "in.bmp"; - - await sleep(500); - await click(116,980) // 领取奖励切换按钮 - await sleep(100); - await click(116,980) // 领取奖励切换按钮 - await sleep(100); - - let rewardSettings = await Textocr("奖励设置",15,0,0,882,34,161,52);//这个时候有人申请进入世界会遮住,真是尴尬啊,不过不影响大局。 - if (!rewardSettings.found) {await genshin.returnMainUi();return false;} - await click(1642,159); - await sleep(100); - await click(1642,159); - await sleep(100); - - let YOffset = 0; // Y轴偏移量,根据需要调整 - - //滚轮预操作 - await moveMouseTo(1642,159); - await sleep(100); - await leftButtonDown(); - await sleep(100); - await moveMouseTo(1642,155); - - const maxRetries = 9; // 最大重试次数 - let retries = 0; // 当前重试次数 - while (retries < maxRetries) { - let result1 = await imageRecognition(newImagePath,1, 0, 0,1166,141,210,857);// - if (result1.found) { - await leftButtonUp(); - await sleep(500); - await click(result.x-500,result.y); - await sleep(1000); - await keyPress("VK_ESCAPE"); - return true - } - retries++; // 重试次数加1 - //滚轮操作 - YOffset += 100; - if (retries === maxRetries || retries+YOffset > 1080) { - await leftButtonUp(); - await sleep(100); - await keyPress("VK_ESCAPE"); - await genshin.returnMainUi(); - return false; - } - await moveMouseTo(1642,155+YOffset); - await sleep(500); - } - - return true; - } - - // 领取奖励函数 - async function claimRewards() { - // log.info(`尝试领取奖励,优先${onerewards}'`); - let SHUN01 = await Textocr("激活地脉之花",0.6,2,0,1188,358,200,400); - let SHUN02 = await Textocr("地脉之花", 0.2, 1, 0, 840,225, 230, 125); - if (SHUN01.found || SHUN02.found) { - log.info("找到地脉之花,开始领取奖励..."); - } - else - { - log.warn("未找到地脉之花,尝试向前寻找...") - await keyDown("W");await sleep(300);await keyUp("W"); - await keyPress("F"); - await sleep(1000); - } - - await sleep(300); - - for (let j = 0;j < 2;j++) { - - for (let i = 0;i < rewards.length;i++) { - let SHU = await Textocr(resinTypeMap[rewards[i]],0.3,0,0,510,380,640,600); - if (SHU.found){ - if (resinTypeMap[rewards[i]] == "使用20个原粹树脂") - { - let BUC = await Textocr("补充",0.2,0,0,1150,440,210,130); - if (BUC.found) {continue;} - } - await sleep(100); - await click(SHU.x+550,SHU.y) - await sleep(100); - await click(SHU.x+550,SHU.y) - await sleep(300); - log.info(`${resinTypeMap[rewards[i]]} 获取奖励...`); - - await Textocr("锁定辅助",10,0,0,1768,0,115,90); - let { condensedResinCount, originalResinCount, fragileResinCount , momentResinCount} = await getRemainResinStatus(); - let shouldExit = true; - - if (resinTypes.includes("1")) - { - shouldExit &= (parseInt(condensedResinCount, 10) == 0); - } - if (resinTypes.includes("2")) - { - shouldExit &= (parseInt(originalResinCount, 10) < 20); - } - if (resinTypes.includes("3")) - { - shouldExit &= (parseInt(fragileResinCount, 10) == 0); - } - if (resinTypes.includes("4")) - { - shouldExit &= (parseInt(momentResinCount, 10) == 0); - } - - if (shouldExit) - { - await sleep(1000); - await keyPress("VK_ESCAPE"); - await sleep(1000); - return false; - } - log.warn("还有树脂..."); - return true; - } - } - await sleep(500); - } - log.warn("未找到树脂,结束领取奖励..."); - await sleep(1000); - await keyPress("VK_ESCAPE"); - await sleep(1000); - return false; - } - - // 进入秘境入口函数 - async function VeinEntrance() { - for (let i = 0;i < 2;i++) { - let JIECHU = await Textocr("F",2,2,0,1098,519,35,32); - if (JIECHU.found) - { - await keyPress("F"); - await keyPress("F"); - break; - } - else - { - if(i == 1){ - log.warn("没找入口,尝试强制转圈寻找..."); - await keyDown("W");keyPress("F");await sleep(500);keyPress("F");await keyUp("W"); - await keyDown("D");keyPress("F");await sleep(500);keyPress("F");await keyUp("D"); - await keyDown("S");keyPress("F");await sleep(500);keyPress("F");await keyUp("S"); - await keyDown("A");keyPress("F");await sleep(500);keyPress("F");await keyUp("A"); - await keyDown("W");keyPress("F");await sleep(500);keyPress("F");await keyUp("W"); - break; - } - } - } - } - - //秘境内退出函数 - async function getOut() { - - for (let i = 0;i < 2;i++){ - log.info("尝试退出挑战..."); - await keyPress("VK_ESCAPE"); - await sleep(1000); - let exitChallenge0 = await Textocr("退出挑战",0.5,1,0,866,719,274,86); - await sleep(1000); - await keyPress("VK_ESCAPE"); - await sleep(1000); - let exitChallenge1 = await Textocr("退出挑战",0.5,1,0,866,719,274,86); - await sleep(1000); - await keyPress("VK_ESCAPE"); - await sleep(1000); - let exitChallenge2 = await Textocr("退出挑战",0.5,1,0,866,719,274,86); - if (!exitChallenge2.found){break} - } - - } - - log.warn("自动幽境危战版本:v1.6"); - log.warn("请保证队伍战斗实力,战斗失败或执行错误,会重试两次..."); - log.warn("使用前请在 <<幽境危战>> 中配置好战斗队伍..."); - log.info("使用树脂类型数量:{0} ", rewards.length) - log.info(`使用树脂顺序:${golbalRewardText.join(" ->")}`); - log.info("圣遗物奖励选择:{0} ", Artifacts) - - //重试两次 - for (let j = 0;j < 2;j++) { - - resinAgain = false; //重试标志 - - try{ - //1.导航进入页面 - await genshin.returnMainUi(); - await pathingScript.runFile(`assets/全自动幽境危战.json`); - await VeinEntrance(); - - //2.难度确认和选择 - let intoAction = await Textocr("单人挑战",10,0,0,1554,970,360, 105); - if (!intoAction.found){ - await genshin.returnMainUi(); - throw new Error("未进入挑战页面,停止执行...") - } - let adjustmentType = await Textocr("至危挑战", 1, 0, 0,797,144,223,84); - if (adjustmentType.found) { - log.warn("找到至危挑战,尝试切换...") - await sleep(500); - await click(adjustmentType.x,adjustmentType.y) - await sleep(500); - } - let hardMode = await Textocr("困难", 0.3, 0, 0,1049,157,72,47); - let hardMode2 = await Textocr("困难", 0.2, 0, 0,805,156,83,47); - if (hardMode.found || hardMode2.found) { - log.warn("确认困难模式...") - } - else{ - log.warn("未找到困难模式,尝试切换...") - await sleep(500); - await click(1096,186); - await sleep(500); - await click(1093,399); - } - - //3.圣遗物奖励选择 - if (Artifacts != "保持圣遗物奖励不变"){ - let artifact = await imageRecognition(artifactImageMap[Artifacts],0.2,0,0,186,972,71,71); - if (!artifact.found) { - log.warn("圣遗物奖励和设定不一致,尝试切换...") - if (!await selectionHolyRelics()){await genshin.returnMainUi();throw new Error("圣遗物奖励设置错误,停止执行...")} - } - else{ - log.warn("圣遗物奖励一致,无需切换 {0} ", Artifacts) - } - } - - //4.进入秘境 - await sleep(500); - await click(intoAction.x,intoAction.y) - await sleep(1000); - await click(intoAction.x,intoAction.y) - let enter = await Textocr("Enter",15,0,0,18,990,156,71,71); - if (!enter.found){ - await genshin.returnMainUi(); - throw new Error("未进入秘境,停止执行...") - } - - //5.向前走进入挑战 - if (!(await readyFightIn())){ - await getOut(); - await genshin.returnMainUi(); - throw new Error("未进入准备战斗,停止执行...") - } - await sleep(1000); - - //6.选择挑战boss - log.info("选择挑战Boss:'{0}' 挑战次数:'{1}'", challengeName,challengeNum) - log.info(`期间树脂耗尽会自动退出秘境...`); - const clickCoordinates = [ { x: 207, y: 349 }, { x: 239, y: 531 }, { x: 227, y: 713 } ]; // Boss坐标1~3 - await click(clickCoordinates[challengeName - 1].x, clickCoordinates[challengeName - 1].y); - - //6.5选择队员-苏婷老师-待写 - //log.warn("队伍选择功能等伟大的苏苏老师考完试做...") - - //7.开始挑战 - await Textocr("开始挑战",1,1,0,1554,970,360, 105); - var resinexhaustion = false; // 条件1:树脂耗尽 - - //8.战斗循环 - for (let i = 0;i < challengeNum; i++) { - - log.info("进入战斗环境,开始第 {0} 次战斗", i+1) - - //8.1自动战斗 - for (let fightCount = 0; fightCount < 3; fightCount++) { - - let battleBegins = await Textocr("战斗开始",20,0,0,877,235,164,50); - if (!battleBegins.found){ - await getOut(); - throw new Error("未进入战斗环境,停止执行...") - } - - try { - await keyDown("w"); - await sleep(Startforward); - await keyUp("w"); - - if(!await autoFight(Fighttimeout)){ - - resinAgain = true; - - if (fightCount >= 2){ - await sleep(1000); - await keyPress("VK_ESCAPE"); - await sleep(1000); - break; - } - else - { - let Again = await Textocr("再次挑战",10,1,0,1059,920,177,65); - if (!Again.found)break; - await sleep(1000); - log.warn("战斗失败,第 {0} 次重试...", fightCount+1) - throw new Error(`战斗失败,第 ${fightCount+1} 次重试...`) - } - - }else - { - resinAgain= false; - break; - } - } catch (error) { - if (fightCount < 2)continue; - else break; - } - } - - //8.2领取奖励 - if (resinAgain != true) { - - await sleep(1000); - await keyPress("VK_ESCAPE"); - await sleep(1000); - - while((await Textocr("Enter",5,0,0,18,990,156,80).found) == false) - { - await keyPress("VK_ESCAPE"); - await sleep(1000); - } - - log.info("幽境危战:第 {0} 次领奖...", i+1) - - if(!(await autoNavigateToReward())){verticalNum++;continue;} - - await sleep(1000); - - if (!(await claimRewards())) { - resinexhaustion = true; - } - else - { - if (challengeNum != i+1) - { - let challengeAgian = await Textocr("再次挑战",10,0,0,1094,958,200,70); - if (!challengeAgian.found){ - await getOut(); - throw new Error("未找到·再次挑战·按键,停止执行...") - } - for (let retry = 0; retry < 5 && challengeAgian.found; retry++) { - challengeAgian = await Textocr("再次挑战",0.2,0,0,1094,958,200,70); - if (challengeAgian.found){ - await sleep(500); - await click(challengeAgian.x, challengeAgian.y); - await sleep(1000); - } - await sleep(200); - } - let resinTips = await Textocr("提示",2,0,0,840,225, 230, 125); - if (resinTips.found){ - await sleep(1000); - await keyPress("VK_ESCAPE"); - await sleep(200); - log.info(`树脂提示已耗尽,...`); - resinexhaustion = true; - } - } - } - } - - //8.3判断继续或退出 - if (challengeNum == i+1 || resinexhaustion == true || resinAgain == true ){ - log.info(resinAgain ? "累计战斗失败 3 次,退出秘境..." - : (challengeNum == i+1) ? `完成 ${i+1}/${challengeNum} 次战斗,退出挑战...`: `树脂耗尽,退出挑战...`); - await sleep(1000); - await keyPress("VK_ESCAPE"); - await sleep(1000); - - var exitTimeout = 0; - while(exitTimeout < 20) { - let exitChallenge = await Textocr("退出挑战",0.3,0,0,866,719,274,86); - if (exitChallenge.found) { - await sleep(1000); - await click(exitChallenge.x, exitChallenge.y); - await sleep(1000); - break; - } - let exitChallenge2 = await Textocr("退出挑战",0.3,1,0,866,719,274,86); - log.info("尝试退出挑战..."); - await sleep(1000); - await keyPress("VK_ESCAPE"); - await sleep(1000); - exitTimeout++; - } - await genshin.returnMainUi(); - if (resinAgain == true){throw new Error("执行重试错误...")} - return true; - } - - await sleep(500); - } - } - catch (error) { - //9.执行错误,重试处理 - log.error(`执行过程中发生错误:${error.message}`); - resinAgain = true; - await genshin.returnMainUi(); - continue; - }finally{ - //10.结束脚本 - await genshin.returnMainUi(); - if (resinAgain == false) log.info(`Auto自动幽境危战结束...`); - } - } - -})(); +(async function () { + + let challengeNum = settings.challengeNum;//挑战次数 + if (challengeNum === undefined || challengeNum === ""){challengeNum = 15; }//挑战次数 + let challengeName = settings.challengeName;//挑战BOSS + if (challengeName === undefined || challengeName === ""){throw new Error("挑战Boss未配置,请在JS配置中选择...")}//初始化处理 + let Startforward = settings.Startforward*1000 ? settings.Startforward*1000 : 1000;//开始战斗的前进时间 + var Fighttimeout = settings.timeout * 1000 ? settings.timeout * 1000 : 240000;//战斗超时时间,默认为240秒 + const ocrRegion1 = { x: 643, y: 58, width: 800, height: 800 }; // 上方挑战成功区域 + const ocrRegion2 = { x: 780, y: 406, width: 370, height: 135 }; // 中间挑战失败区域 + const ocrRo1 = RecognitionObject.ocr(ocrRegion1.x, ocrRegion1.y, ocrRegion1.width, ocrRegion1.height);//上方挑战成功区域OCR对象 + const ocrRo2 = RecognitionObject.ocr(ocrRegion2.x, ocrRegion2.y, ocrRegion2.width, ocrRegion2.height);//中间挑战失败区域OCR对象 + var Rewardsuse = settings.Rewardsuse ? settings.Rewardsuse : "1/2";//树脂使用类型,默认为1/2,即浓缩树脂和原粹树脂 + var resinTypes = Rewardsuse.split("/"); + var rewards = []; + var onerewards, secendrewards, threendrewards, fourdrewards; + for (var i = 0; i < resinTypes.length; i++) { + var resinType = parseInt(resinTypes[i]); + if (isNaN(resinType) || resinType < 1 || resinType > 4) { + throw new Error("设定的树脂类型无效或缺失,请重新配置"); + } + rewards.push(resinType); + } + const resinTypeMap = ["","使用1个浓缩树脂,获取2倍产出", "使用20个原粹树脂", "使用1个脆弱树脂,获取3倍产出", "使用1个须臾树脂,获取3倍产出"];//识别树脂领奖文字 + const golbalRewards = ["","浓缩树脂","原粹树脂","脆弱树脂","须臾树脂"]; // 对应四种树脂 + // 根据 rewards 数组长度,依次赋值给对应的变量 + if (rewards.length > 0) onerewards = golbalRewards[rewards[0]]; + if (rewards.length > 1) secendrewards = golbalRewards[rewards[1]]; + if (rewards.length > 2) threendrewards = golbalRewards[rewards[2]]; + if (rewards.length > 3) fourdrewards = golbalRewards[rewards[3]]; + const golbalRewardText = [onerewards, secendrewards, threendrewards, fourdrewards].filter(Boolean);//过滤树脂使用类型 + + var advanceNum = 0;//前进寻找地脉之花次数 + var verticalNum = 0;//重试寻找地脉之花次数 + var resinAgain = false;//是否重试标志 + + var Artifacts = settings.Artifacts ? settings.Artifacts : "保持圣遗物奖励不变"; + + //映射所有圣遗物对应需要识别的图片 + var artifactImageMap = { + "长夜之誓 / 深廊终曲": "assets/Artifacts/artifact_1.bmp", + "黑曜秘典 / 烬城勇者绘卷": "assets/Artifacts/artifact_2.bmp", + "谐律异想断章 / 未竟的遐思": "assets/Artifacts/artifact_3.bmp", + "回声之林夜话 / 昔时之歌": "assets/Artifacts/artifact_4.bmp", + "逐影猎人 / 黄金剧团": "assets/Artifacts/artifact_5.bmp", + "水仙之梦 / 花海甘露之光": "assets/Artifacts/artifact_6.bmp", + "乐园遗落之花 / 沙上楼阁史话": "assets/Artifacts/artifact_7.bmp", + "深林的记忆 / 饰金之梦": "assets/Artifacts/artifact_8.bmp", + "来歆余响 / 辰砂往生录": "assets/Artifacts/artifact_9.bmp", + "华馆梦醒形骸记 / 海染砗磲": "assets/Artifacts/artifact_10.bmp", + "绝缘之旗印 / 追忆之注连": "assets/Artifacts/artifact_11.bmp", + "昔日宗室之仪 / 染血的骑士道": "assets/Artifacts/artifact_12.bmp", + "渡过烈火的贤人 / 炽烈的炎之魔女": "assets/Artifacts/artifact_13.bmp", + "悠古的磐岩 / 逆飞的流星": "assets/Artifacts/artifact_14.bmp", + "千岩牢固 / 苍白之火": "assets/Artifacts/artifact_15.bmp", + "冰风迷途的勇士 / 沉沦之心": "assets/Artifacts/artifact_16.bmp", + "翠绿之影 / 被怜爱的少女": "assets/Artifacts/artifact_17.bmp", + "如雷的盛怒 / 平息鸣雷的尊者": "assets/Artifacts/artifact_18.bmp" + }; + + //树脂识别图片 + var condensedResin = "assets/condensed_resin_count.png"; + var originalResin = "assets/original_resin_count.png"; + var fragileResin = "assets/fragile_resin_count.png"; + var momentResin = "assets/moment_resin_count.png"; + var oneResin = "assets/one.png"; + + //文字识别封装函数 + async function Textocr(wenzi="空参数",chaotime=10,clickocr=0,debugcode=0,x=0,y=0,w=1920,h=1080) { + const startTime = new Date(); + for (let ii = 0; ii < 10; ii++) + { + // 获取一张截图 + let captureRegion = captureGameRegion(); + let res1 + // 对整个区域进行 OCR + let resList = captureRegion.findMulti(RecognitionObject.ocr(x,y,w,h)); + //log.info("OCR 全区域识别结果数量 {len}", resList.count); + for (let i = 0; i < resList.count; i++) + { // 遍历的是 C# 的 List 对象,所以要用 count,而不是 length + let res = resList[i]; + res1=res.text + if (res.text===wenzi) { + log.info(`识别到 ·${res1}·`); + if (debugcode===1){if (x===0 & y===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10);return result = { text: res.text, x: res.x, y: res.y, found: true }}}else{if (x===0 & y===0){log.info("文本OCR完成'{text}'", res.text);}} + if (clickocr===1){await sleep(1000);await click(res.x, res.y);}else{} + if (clickocr===2){await sleep(100);await keyPress("F");}else{} + return result = { text: res.text, x: res.x, y: res.y, found: true } + } + if (debugcode===2 && !res.isEmpty()){ + // log.info("({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10); + return result = { text: res.text, x: res.x, y: res.y, found: true } + } + } + const NowTime = new Date(); + if (Math.abs(NowTime - startTime)>chaotime*1000){if (x===0 & y===0){log.info(`${chaotime}秒超时退出,"${wenzi}"未找到`);}return result = {found: false };}else{ii=8;if (x !== 861){if(debugcode!==3){await keyPress("VK_W");}};} + await sleep(100); + } + } + + // 图片识别封装函数 + async function imageRecognition(imagefilePath="空参数",timeout=10,afterBehavior=0,debugmodel=0,xa=0,ya=0,wa=1920,ha=1080) { + const startTime = new Date(); + const Imagidentify = RecognitionObject.TemplateMatch(file.ReadImageMatSync(imagefilePath)); + for (let ii = 0; ii < 10; ii++) { + captureRegion = captureGameRegion(); // 获取一张截图 + res = captureRegion.DeriveCrop(xa, ya, wa, ha).Find(Imagidentify); + if (res.isEmpty()) { + if (debugmodel===1 & xa===0 & ya===0){log.info("未识别页面元素")}; + } else { + if (afterBehavior===1){if (xa===0 & ya===0){log.info("点击模式:开");}await sleep(1000);click(res.x+xa, res.y+ya);}else{if (debugmodel===1 & xa===0 & ya===0){log.info("点击模式:关")}} + if (afterBehavior===2){if (xa===0 & ya===0){log.info("F模式:开");}await sleep(1000);keyPress("F");}else{if (debugmodel===1 & xa===0 & ya===0){log.info("F模式:关")}} + if (debugmodel===1 & xa===0 & ya===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x+xa, res.y+ya, res.width, res.Height);}else{ log.info("识别到页面元素");} + + return result = { x: res.x+xa, y: res.y+ya, w:res.width,h:res.Height,found: true } + } + const NowTime = new Date(); + if ((NowTime - startTime)>timeout*1000){if (debugmodel===1 & xa===0 & ya===0){log.info(`${timeout}秒超时退出,未找到图片`);}return result = {found: false };}else{ii=8} + await sleep(200); + } + await sleep(1200); + } + + //树脂数量获取函数 + async function getRemainResinStatus() { + var condensedResinCount = 0; // 浓缩树脂 + var originalResinCount = 0; // 原粹树脂 + var fragileResinCount = 0; // 脆弱树脂 + var momentResinCount = 0; // 须臾树脂 + + var originalResinCountRa = await imageRecognition(originalResin,0.3, 0, 0,1500,0,200,90); + if (originalResinCountRa.found) { + // await moveMouseTo(originalResinCountRa.x,originalResinCountRa.y); + let countArea = await Textocr("",1, 0, 2,originalResinCountRa.x+originalResinCountRa.w,originalResinCountRa.y,originalResinCountRa.w*3,originalResinCountRa.h);// + if (countArea.found){ + log.info("原粹树脂识别数量结果:"+ countArea.text); + let match = countArea.text.match(/(\d+)\s*[/1]\s*(2|20|200)/); + if (match) { + originalResinCount = match[1]; + // log.info("脆弱树脂识别数量提取:"+ originalResinCount); + } + else{ + log.info("原粹树脂识别数量提取失败"); + } + } + else{ + log.info("原粹树脂识别数量结果::无"); + } + + } else { + log.info("未检测到原粹树脂图标"); + } + + // 浓缩树脂 + var condensedResinCountRa = await imageRecognition(condensedResin,0.1, 0, 0,960,0,800,100); + if (condensedResinCountRa.found) { + // await moveMouseTo(condensedResinCountRa.x,condensedResinCountRa.y); + let countArea = await Textocr("",0.5, 0, 2,condensedResinCountRa.x+condensedResinCountRa.w,condensedResinCountRa.y,condensedResinCountRa.w,condensedResinCountRa.h);// + if (countArea.found){ + // log.info("浓缩树脂识别数量结果: "+ countArea.text); + condensedResinCount = countArea.text + } + else{ + condensedResinCount = "1"; + log.info("浓缩树脂识别数量结果:1");//不知道为什么,1无法识别,0是不显示图标的,所以就当时1了,反正也没啥影响 + } + + } else { + log.info("未检测到浓缩树脂图标"); + } + + var momentResinCountRa = await imageRecognition(momentResin,0.1, 0, 1,1170,0,300,100); + if (momentResinCountRa.found) { + // await moveMouseTo(momentResinCountRa.x,momentResinCountRa.y); + let countArea = await Textocr("",0.5, 0, 2,momentResinCountRa.x+momentResinCountRa.w+20,momentResinCountRa.y-15,60,40);// + if (countArea.found){ + //log.info("须臾树脂识别数量结果:"+ countArea.text); + momentResinCount = countArea.text + } + else{ + var oneRa = await imageRecognition(oneResin,0.1, 0, 1,momentResinCountRa.x+momentResinCountRa.w+20,momentResinCountRa.y-15,60,40); + if (oneRa.found){ + momentResinCount = "1"; + }else{ + log.info("须臾树脂强制为 1 "); + momentResinCount = "1"; + } + } + log.info("脆弱树脂强制为 1 ");//须臾树脂出现,脆弱树脂不显示,强制设置为1,情况非常少,大不了打多一次 + fragileResinCount = "1"; + }else + { + var fragileResinCountRa = await imageRecognition(fragileResin,0.1, 0, 1,1170,0,300,100); + if (fragileResinCountRa.found) { + // await moveMouseTo(fragileResinCountRa.x+fragileResinCountRa.w+20,fragileResinCountRa.y-15); + let countArea = await Textocr("",0.5, 0, 2,fragileResinCountRa.x+fragileResinCountRa.w+20,fragileResinCountRa.y-15,60,40);// + if (countArea.found){ + // log.info("脆弱树脂识别数量结果:"+ countArea.text); + fragileResinCount = countArea.text + } + else{ + var oneRa = await imageRecognition(oneResin,0.1, 0, 1,fragileResinCountRa.x+fragileResinCountRa.w+20,fragileResinCountRa.y-15,60,40); + if (oneRa.found){ + fragileResinCount = "1"; + }else{ + fragileResinCount = "1"; + log.info("脆弱树脂识别强制为 1 ");//有图标说明至少为1 + } + } + } + else { + log.info("未检测到脆弱树脂图标"); + } + } + + log.info("树脂状态:浓缩{0} 原粹{1} 脆弱{2} 须臾{3}", condensedResinCount, originalResinCount, fragileResinCount,momentResinCount) + return {condensedResinCount,originalResinCount,fragileResinCount,momentResinCount} + } + + //征讨之花领奖寻找函数 + const autoNavigateToReward = async () => { + // 定义识别对象 + const boxIconRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/box.png")); + + advanceNum = 0;//前进次数 + //调整为俯视视野 + middleButtonClick(); + await sleep(800); + moveMouseBy(0, 1030); + await sleep(400); + moveMouseBy(0, 920); + await sleep(400); + moveMouseBy(0, 710); + log.info("开始领奖"); + + while (true) { + // 1. 优先检查是否已到达领奖点 + let captureRegion = captureGameRegion(); + let rewardTextArea = captureRegion.DeriveCrop(1210, 515, 200, 50); + let rewardResult = rewardTextArea.find(RecognitionObject.ocrThis); + // 检测到特点文字则结束!!! + if (rewardResult.text == "激活地脉之花") { + log.info("已到达领奖点,检测到文字: " + rewardResult.text); + return true; + } + else if(advanceNum > 40){ + await getOut(); + await await genshin.returnMainUi(); + throw new Error('前进时间超时'); + } + // 2. 未到达领奖点,则调整视野 + for(let i = 0; i < 100; i++){ + captureRegion = captureGameRegion(); + let iconRes = captureRegion.Find(boxIconRo); + let climbTextArea = captureRegion.DeriveCrop(1808, 1030, 25, 25); + let climbResult = climbTextArea.find(RecognitionObject.ocrThis); + // 检查是否处于攀爬状态 + if (climbResult.isEmpty()){ + let SHU = Textocr("地脉之花", 0.3, 1, 0, 840,225, 230, 125); + if (SHU.found){ + return true; + } + log.info("检侧到页面错误,尝试脱离"); + await keyDown("w"); + await keyPress("VK_ESCAPE"); + await sleep(500); + await keyDown("w"); + await sleep(5000); + await keyUp("w"); + } + + if (iconRes.x >= 920 && iconRes.x <= 980 && iconRes.y <= 540) { + advanceNum++; + log.info(`视野已调正,前进第${advanceNum}次`); + break; + } else { + // 小幅度调整 + if(iconRes.y >= 520) moveMouseBy(0, 920); + let adjustAmount = iconRes.x < 920 ? -20 : 20; + let distanceToCenter = Math.abs(iconRes.x - 920); // 计算与920的距离 + let scaleFactor = Math.max(1, Math.floor(distanceToCenter / 50)); // 根据距离缩放,最小为1 + let adjustAmount2 = iconRes.y < 540 ? scaleFactor : 10; + moveMouseBy(adjustAmount * adjustAmount2, 0); + await sleep(100); + } + + if(i > 97) { + if (verticalNum >= 2) { + verticalNum = 0; + await getOut(); + await await genshin.returnMainUi(); + throw new Error('领取超时'); + } + log.info("领取超时,重新尝试1次"); + await sleep(1000); + return false; + } + } + // 3. 前进一小步 + keyDown("w"); + await sleep(600); + keyUp("w"); + await sleep(100); // 等待角色移动稳定 + let earthlyVeins = await Textocr("地脉之花", 0.1, 0, 0, 840,225, 230, 125) + if (earthlyVeins.found) { + return true; + } + } + } + + //向前寻找钥匙函数 + async function readyFightIn(){ + var startTime = new Date(); + await sleep(500); + var NowTime = new Date(); + keyDown("w"); + while ((NowTime - startTime)<15*1000){ + const result = await Textocr("战斗准备",0,0,3,1198,492,150,80); + const result2 = await Textocr("开始挑战",0,0,3,1554,970,360, 105); + if (result.found || result2.found) { + keyPress("F");keyPress("F");keyPress("F");keyPress("F"); + keyUp("w"); + return true; + } + keyDown("w"); + keyPress("F"); + NowTime = new Date(); + } + await keyUp("w"); + return false + } + + //异步检测战斗执行函数,来自D捣蛋&秋云佬的全自动地脉花的代码 + async function autoFight(timeout) { + const cts = new CancellationTokenSource(); + log.info("开始战斗"); + dispatcher.RunTask(new SoloTask("AutoFight"), cts); + let fightResult = await recognizeTextInRegion(timeout); + logFightResult = fightResult ? "成功" : "失败"; + log.info(`战斗结束,战斗结果:${logFightResult}`); + cts.cancel(); + return fightResult; + } + + //异步检测战斗结果函数 + async function recognizeTextInRegion(timeout) { + return new Promise((resolve, reject) => { + (async () => { + try { + let startTime = Date.now(); + const successKeywords = ["挑战完成","战斗完成"]; + const failureKeywords = ["战斗失败","挑战失败"]; + + // 循环检测直到超时 + while (Date.now() - startTime < timeout) { + try { + let captureRegion = captureGameRegion(); + let result = captureRegion.find(ocrRo1); + let result2 = captureRegion.find(ocrRo2); + let text = result.text; + let text2 = result2.text; + + // 检查成功关键词 + for (let keyword of successKeywords) { + if (text.includes(keyword)) { + log.info("检测到战斗成功关键词: {0}", keyword); + resolve(true); + return; + } + } + + // 检查失败关键词-- + for (let keyword of failureKeywords) { + if (text2.includes(keyword)) { + log.warn("检测到战斗失败关键词: {0}", keyword); + resolve(false); + return; + } + } + } + catch (error) { + log.error("OCR过程中出错: {0}", error); + } + + await sleep(1000); // 检查间隔 + } + + log.warn("在超时时间内未检测到战斗结果"); + resolve(false); + } catch (error) { + reject(error); + } + })(); + }); + } + + //圣遗物奖励更换函数 + async function selectionHolyRelics() { + + let artifactImagePath = artifactImageMap[Artifacts]; + // 检查artifactImagePath是否存在 + if (!artifactImagePath) { + throw new Error(`未找到与Artifacts值'${Artifacts}'对应的图片路径`); + } + let modifiedPath = artifactImagePath.slice(0, -4); + let newImagePath = modifiedPath + "in.bmp"; + + await sleep(500); + await click(116,980) // 领取奖励切换按钮 + await sleep(100); + await click(116,980) // 领取奖励切换按钮 + await sleep(100); + + let rewardSettings = await Textocr("奖励设置",15,0,0,882,34,161,52);//这个时候有人申请进入世界会遮住,真是尴尬啊,不过不影响大局。 + if (!rewardSettings.found) {await genshin.returnMainUi();return false;} + await click(1642,159); + await sleep(100); + await click(1642,159); + await sleep(100); + + let YOffset = 0; // Y轴偏移量,根据需要调整 + + //滚轮预操作 + await moveMouseTo(1642,159); + await sleep(100); + await leftButtonDown(); + await sleep(100); + await moveMouseTo(1642,155); + + const maxRetries = 9; // 最大重试次数 + let retries = 0; // 当前重试次数 + while (retries < maxRetries) { + let result1 = await imageRecognition(newImagePath,1, 0, 0,1166,141,210,857);// + if (result1.found) { + await leftButtonUp(); + await sleep(500); + await click(result.x-500,result.y); + await sleep(1000); + await keyPress("VK_ESCAPE"); + return true + } + retries++; // 重试次数加1 + //滚轮操作 + YOffset += 100; + if (retries === maxRetries || retries+YOffset > 1080) { + await leftButtonUp(); + await sleep(100); + await keyPress("VK_ESCAPE"); + await genshin.returnMainUi(); + return false; + } + await moveMouseTo(1642,155+YOffset); + await sleep(500); + } + + return true; + } + + // 领取奖励函数 + async function claimRewards() { + // log.info(`尝试领取奖励,优先${onerewards}'`); + let SHUN01 = await Textocr("激活地脉之花",0.6,2,0,1188,358,200,400); + let SHUN02 = await Textocr("地脉之花", 0.2, 1, 0, 840,225, 230, 125); + if (SHUN01.found || SHUN02.found) { + log.info("找到地脉之花,开始领取奖励..."); + } + else + { + log.warn("未找到地脉之花,尝试向前寻找...") + await keyDown("W");await sleep(300);await keyUp("W"); + await keyPress("F"); + await sleep(1000); + } + + await sleep(300); + + for (let j = 0;j < 2;j++) { + + for (let i = 0;i < rewards.length;i++) { + let SHU = await Textocr(resinTypeMap[rewards[i]],0.3,0,0,510,380,640,600); + if (SHU.found){ + if (resinTypeMap[rewards[i]] == "使用20个原粹树脂") + { + let BUC = await Textocr("补充",0.2,0,0,1150,440,210,130); + if (BUC.found) {continue;} + } + await sleep(100); + await click(SHU.x+550,SHU.y) + await sleep(100); + await click(SHU.x+550,SHU.y) + await sleep(300); + log.info(`${resinTypeMap[rewards[i]]} 获取奖励...`); + + await Textocr("锁定辅助",10,0,0,1768,0,115,90); + let { condensedResinCount, originalResinCount, fragileResinCount , momentResinCount} = await getRemainResinStatus(); + let shouldExit = true; + + if (resinTypes.includes("1")) + { + shouldExit &= (parseInt(condensedResinCount, 10) == 0); + } + if (resinTypes.includes("2")) + { + shouldExit &= (parseInt(originalResinCount, 10) < 20); + } + if (resinTypes.includes("3")) + { + shouldExit &= (parseInt(fragileResinCount, 10) == 0); + } + if (resinTypes.includes("4")) + { + shouldExit &= (parseInt(momentResinCount, 10) == 0); + } + + if (shouldExit) + { + await sleep(1000); + await keyPress("VK_ESCAPE"); + await sleep(1000); + return false; + } + log.warn("还有树脂..."); + return true; + } + } + await sleep(500); + } + log.warn("未找到树脂,结束领取奖励..."); + await sleep(1000); + await keyPress("VK_ESCAPE"); + await sleep(1000); + return false; + } + + // 进入秘境入口函数 + async function VeinEntrance() { + for (let i = 0;i < 2;i++) { + let JIECHU = await Textocr("F",2,2,0,1098,519,35,32); + if (JIECHU.found) + { + await keyPress("F"); + await keyPress("F"); + break; + } + else + { + if(i == 1){ + log.warn("没找入口,尝试强制转圈寻找..."); + await keyDown("W");keyPress("F");await sleep(500);keyPress("F");await keyUp("W"); + await keyDown("D");keyPress("F");await sleep(500);keyPress("F");await keyUp("D"); + await keyDown("S");keyPress("F");await sleep(500);keyPress("F");await keyUp("S"); + await keyDown("A");keyPress("F");await sleep(500);keyPress("F");await keyUp("A"); + await keyDown("W");keyPress("F");await sleep(500);keyPress("F");await keyUp("W"); + break; + } + } + } + } + + //秘境内退出函数 + async function getOut() { + + for (let i = 0;i < 2;i++){ + log.info("尝试退出挑战..."); + await keyPress("VK_ESCAPE"); + await sleep(1000); + let exitChallenge0 = await Textocr("退出挑战",0.5,1,0,866,719,274,86); + await sleep(1000); + await keyPress("VK_ESCAPE"); + await sleep(1000); + let exitChallenge1 = await Textocr("退出挑战",0.5,1,0,866,719,274,86); + await sleep(1000); + await keyPress("VK_ESCAPE"); + await sleep(1000); + let exitChallenge2 = await Textocr("退出挑战",0.5,1,0,866,719,274,86); + if (!exitChallenge2.found){break} + } + + } + + log.warn("自动幽境危战版本:v1.6"); + log.warn("请保证队伍战斗实力,战斗失败或执行错误,会重试两次..."); + log.warn("使用前请在 <<幽境危战>> 中配置好战斗队伍..."); + log.info("使用树脂类型数量:{0} ", rewards.length) + log.info(`使用树脂顺序:${golbalRewardText.join(" ->")}`); + log.info("圣遗物奖励选择:{0} ", Artifacts) + + //重试两次 + for (let j = 0;j < 2;j++) { + + resinAgain = false; //重试标志 + + try{ + //1.导航进入页面 + await genshin.returnMainUi(); + await pathingScript.runFile(`assets/全自动幽境危战.json`); + await VeinEntrance(); + + //2.难度确认和选择 + let intoAction = await Textocr("单人挑战",10,0,0,1554,970,360, 105); + if (!intoAction.found){ + await genshin.returnMainUi(); + throw new Error("未进入挑战页面,停止执行...") + } + let adjustmentType = await Textocr("至危挑战", 1, 0, 0,797,144,223,84); + if (adjustmentType.found) { + log.warn("找到至危挑战,尝试切换...") + await sleep(500); + await click(adjustmentType.x,adjustmentType.y) + await sleep(500); + } + let hardMode = await Textocr("困难", 0.3, 0, 0,1049,157,72,47); + let hardMode2 = await Textocr("困难", 0.2, 0, 0,805,156,83,47); + if (hardMode.found || hardMode2.found) { + log.warn("确认困难模式...") + } + else{ + log.warn("未找到困难模式,尝试切换...") + await sleep(500); + await click(1096,186); + await sleep(500); + await click(1093,399); + } + + //3.圣遗物奖励选择 + if (Artifacts != "保持圣遗物奖励不变"){ + let artifact = await imageRecognition(artifactImageMap[Artifacts],0.2,0,0,186,972,71,71); + if (!artifact.found) { + log.warn("圣遗物奖励和设定不一致,尝试切换...") + if (!await selectionHolyRelics()){await genshin.returnMainUi();throw new Error("圣遗物奖励设置错误,停止执行...")} + } + else{ + log.warn("圣遗物奖励一致,无需切换 {0} ", Artifacts) + } + } + + //4.进入秘境 + await sleep(500); + await click(intoAction.x,intoAction.y) + await sleep(1000); + await click(intoAction.x,intoAction.y) + let enter = await Textocr("Enter",15,0,0,18,990,156,71,71); + if (!enter.found){ + await genshin.returnMainUi(); + throw new Error("未进入秘境,停止执行...") + } + + //5.向前走进入挑战 + if (!(await readyFightIn())){ + await getOut(); + await genshin.returnMainUi(); + throw new Error("未进入准备战斗,停止执行...") + } + await sleep(1000); + + //6.选择挑战boss + log.info("选择挑战Boss:'{0}' 挑战次数:'{1}'", challengeName,challengeNum) + log.info(`期间树脂耗尽会自动退出秘境...`); + const clickCoordinates = [ { x: 207, y: 349 }, { x: 239, y: 531 }, { x: 227, y: 713 } ]; // Boss坐标1~3 + await click(clickCoordinates[challengeName - 1].x, clickCoordinates[challengeName - 1].y); + + //6.5选择队员-苏婷老师-待写 + //log.warn("队伍选择功能等伟大的苏苏老师考完试做...") + + //7.开始挑战 + await Textocr("开始挑战",1,1,0,1554,970,360, 105); + var resinexhaustion = false; // 条件1:树脂耗尽 + + //8.战斗循环 + for (let i = 0;i < challengeNum; i++) { + + log.info("进入战斗环境,开始第 {0} 次战斗", i+1) + + //8.1自动战斗 + for (let fightCount = 0; fightCount < 3; fightCount++) { + + let battleBegins = await Textocr("战斗开始",20,0,0,877,235,164,50); + if (!battleBegins.found){ + await getOut(); + throw new Error("未进入战斗环境,停止执行...") + } + + try { + await keyDown("w"); + await sleep(Startforward); + await keyUp("w"); + + if(!await autoFight(Fighttimeout)){ + + resinAgain = true; + + if (fightCount >= 2){ + await sleep(1000); + await keyPress("VK_ESCAPE"); + await sleep(1000); + break; + } + else + { + let Again = await Textocr("再次挑战",10,1,0,1059,920,177,65); + if (!Again.found)break; + await sleep(1000); + log.warn("战斗失败,第 {0} 次重试...", fightCount+1) + throw new Error(`战斗失败,第 ${fightCount+1} 次重试...`) + } + + }else + { + resinAgain= false; + break; + } + } catch (error) { + if (fightCount < 2)continue; + else break; + } + } + + //8.2领取奖励 + if (resinAgain != true) { + + await sleep(1000); + await keyPress("VK_ESCAPE"); + await sleep(1000); + + while((await Textocr("Enter",5,0,0,18,990,156,80).found) == false) + { + await keyPress("VK_ESCAPE"); + await sleep(1000); + } + + log.info("幽境危战:第 {0} 次领奖...", i+1) + + if(!(await autoNavigateToReward())){verticalNum++;continue;} + + await sleep(1000); + + if (!(await claimRewards())) { + resinexhaustion = true; + } + else + { + if (challengeNum != i+1) + { + let challengeAgian = await Textocr("再次挑战",10,0,0,1094,958,200,70); + if (!challengeAgian.found){ + await getOut(); + throw new Error("未找到·再次挑战·按键,停止执行...") + } + for (let retry = 0; retry < 5 && challengeAgian.found; retry++) { + challengeAgian = await Textocr("再次挑战",0.2,0,0,1094,958,200,70); + if (challengeAgian.found){ + await sleep(500); + await click(challengeAgian.x, challengeAgian.y); + await sleep(1000); + } + await sleep(200); + } + let resinTips = await Textocr("提示",2,0,0,840,225, 230, 125); + if (resinTips.found){ + await sleep(1000); + await keyPress("VK_ESCAPE"); + await sleep(200); + log.info(`树脂提示已耗尽,...`); + resinexhaustion = true; + } + } + } + } + + //8.3判断继续或退出 + if (challengeNum == i+1 || resinexhaustion == true || resinAgain == true ){ + log.info(resinAgain ? "累计战斗失败 3 次,退出秘境..." + : (challengeNum == i+1) ? `完成 ${i+1}/${challengeNum} 次战斗,退出挑战...`: `树脂耗尽,退出挑战...`); + await sleep(1000); + await keyPress("VK_ESCAPE"); + await sleep(1000); + + var exitTimeout = 0; + while(exitTimeout < 20) { + let exitChallenge = await Textocr("退出挑战",0.3,0,0,866,719,274,86); + if (exitChallenge.found) { + await sleep(1000); + await click(exitChallenge.x, exitChallenge.y); + await sleep(1000); + break; + } + let exitChallenge2 = await Textocr("退出挑战",0.3,1,0,866,719,274,86); + log.info("尝试退出挑战..."); + await sleep(1000); + await keyPress("VK_ESCAPE"); + await sleep(1000); + exitTimeout++; + } + await genshin.returnMainUi(); + if (resinAgain == true){throw new Error("执行重试错误...")} + return true; + } + + await sleep(500); + } + } + catch (error) { + //9.执行错误,重试处理 + log.error(`执行过程中发生错误:${error.message}`); + resinAgain = true; + await genshin.returnMainUi(); + continue; + }finally{ + //10.结束脚本 + await genshin.returnMainUi(); + if (resinAgain == false) log.info(`Auto自动幽境危战结束...`); + } + } + +})(); diff --git a/repo/js/AutoStygianOnslaught/manifest.json b/archive/js/AutoStygianOnslaught/manifest.json similarity index 100% rename from repo/js/AutoStygianOnslaught/manifest.json rename to archive/js/AutoStygianOnslaught/manifest.json diff --git a/repo/js/AutoStygianOnslaught/settings.json b/archive/js/AutoStygianOnslaught/settings.json similarity index 100% rename from repo/js/AutoStygianOnslaught/settings.json rename to archive/js/AutoStygianOnslaught/settings.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/tp/桃椰子木12个tp.json b/archive/js/AutoWoodcutting/assets/AutoPath/tp/桃椰子木12个tp.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/tp/桃椰子木12个tp.json rename to archive/js/AutoWoodcutting/assets/AutoPath/tp/桃椰子木12个tp.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/tp/炬木15个tp.json b/archive/js/AutoWoodcutting/assets/AutoPath/tp/炬木15个tp.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/tp/炬木15个tp.json rename to archive/js/AutoWoodcutting/assets/AutoPath/tp/炬木15个tp.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/业果木15个(辉木15个).json b/archive/js/AutoWoodcutting/assets/AutoPath/业果木15个(辉木15个).json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/业果木15个(辉木15个).json rename to archive/js/AutoWoodcutting/assets/AutoPath/业果木15个(辉木15个).json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/刺葵木6个.json b/archive/js/AutoWoodcutting/assets/AutoPath/刺葵木6个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/刺葵木6个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/刺葵木6个.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/却砂木12个.json b/archive/js/AutoWoodcutting/assets/AutoPath/却砂木12个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/却砂木12个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/却砂木12个.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/垂香木15个.json b/archive/js/AutoWoodcutting/assets/AutoPath/垂香木15个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/垂香木15个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/垂香木15个.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/御伽木9个(孔雀木6个).json b/archive/js/AutoWoodcutting/assets/AutoPath/御伽木9个(孔雀木6个).json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/御伽木9个(孔雀木6个).json rename to archive/js/AutoWoodcutting/assets/AutoPath/御伽木9个(孔雀木6个).json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/悬铃木18个.json b/archive/js/AutoWoodcutting/assets/AutoPath/悬铃木18个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/悬铃木18个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/悬铃木18个.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/杉木12个.json b/archive/js/AutoWoodcutting/assets/AutoPath/杉木12个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/杉木12个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/杉木12个.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/松木24个.json b/archive/js/AutoWoodcutting/assets/AutoPath/松木24个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/松木24个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/松木24个.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/枫木9个.json b/archive/js/AutoWoodcutting/assets/AutoPath/枫木9个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/枫木9个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/枫木9个.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/柽木15个.json b/archive/js/AutoWoodcutting/assets/AutoPath/柽木15个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/柽木15个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/柽木15个.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/桦木15个.json b/archive/js/AutoWoodcutting/assets/AutoPath/桦木15个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/桦木15个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/桦木15个.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/梦见木12个.json b/archive/js/AutoWoodcutting/assets/AutoPath/梦见木12个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/梦见木12个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/梦见木12个.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/椴木9个(悬铃木9个).json b/archive/js/AutoWoodcutting/assets/AutoPath/椴木9个(悬铃木9个).json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/椴木9个(悬铃木9个).json rename to archive/js/AutoWoodcutting/assets/AutoPath/椴木9个(悬铃木9个).json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/椴木9个.json b/archive/js/AutoWoodcutting/assets/AutoPath/椴木9个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/椴木9个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/椴木9个.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/灰灰楼木6个.json b/archive/js/AutoWoodcutting/assets/AutoPath/灰灰楼木6个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/灰灰楼木6个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/灰灰楼木6个.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/燃爆木15个.json b/archive/js/AutoWoodcutting/assets/AutoPath/燃爆木15个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/燃爆木15个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/燃爆木15个.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/燃爆木6个(白栗栎木6个).json b/archive/js/AutoWoodcutting/assets/AutoPath/燃爆木6个(白栗栎木6个).json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/燃爆木6个(白栗栎木6个).json rename to archive/js/AutoWoodcutting/assets/AutoPath/燃爆木6个(白栗栎木6个).json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/白梣木15个.json b/archive/js/AutoWoodcutting/assets/AutoPath/白梣木15个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/白梣木15个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/白梣木15个.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/竹节30个.json b/archive/js/AutoWoodcutting/assets/AutoPath/竹节30个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/竹节30个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/竹节30个.json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/萃华木6个(垂香木3个).json b/archive/js/AutoWoodcutting/assets/AutoPath/萃华木6个(垂香木3个).json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/萃华木6个(垂香木3个).json rename to archive/js/AutoWoodcutting/assets/AutoPath/萃华木6个(垂香木3个).json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/证悟木15个(业果木6个).json b/archive/js/AutoWoodcutting/assets/AutoPath/证悟木15个(业果木6个).json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/证悟木15个(业果木6个).json rename to archive/js/AutoWoodcutting/assets/AutoPath/证悟木15个(业果木6个).json diff --git a/repo/js/AutoWoodcutting/assets/AutoPath/香柏木27个.json b/archive/js/AutoWoodcutting/assets/AutoPath/香柏木27个.json similarity index 100% rename from repo/js/AutoWoodcutting/assets/AutoPath/香柏木27个.json rename to archive/js/AutoWoodcutting/assets/AutoPath/香柏木27个.json diff --git a/repo/js/AutoWoodcutting/assets/KeyMouse/桃椰子木12个.json b/archive/js/AutoWoodcutting/assets/KeyMouse/桃椰子木12个.json similarity index 95% rename from repo/js/AutoWoodcutting/assets/KeyMouse/桃椰子木12个.json rename to archive/js/AutoWoodcutting/assets/KeyMouse/桃椰子木12个.json index e56ff333..759cc8bd 100644 --- a/repo/js/AutoWoodcutting/assets/KeyMouse/桃椰子木12个.json +++ b/archive/js/AutoWoodcutting/assets/KeyMouse/桃椰子木12个.json @@ -1,279 +1,279 @@ -{ - "macroEvents": [ - { - "type": 0, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 0.0000 - }, - { - "type": 1, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 11127.9408 - }, - { - "type": 0, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 13119.9760 - }, - { - "type": 1, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 17400.0108 - }, - { - "type": 0, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 18504.0088 - }, - { - "type": 1, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 27312.0632 - }, - { - "type": 0, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 28128.0973 - }, - { - "type": 1, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 29240.0663 - }, - { - "type": 0, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 29912.0759 - }, - { - "type": 1, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 31736.1294 - }, - { - "type": 0, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 31904.0885 - }, - { - "type": 1, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 32144.0983 - }, - { - "type": 0, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 32864.1012 - }, - { - "type": 0, - "keyCode": 32, - "mouseX": 0, - "mouseY": 0, - "time": 33288.1407 - }, - { - "type": 1, - "keyCode": 32, - "mouseX": 0, - "mouseY": 0, - "time": 33432.1196 - }, - { - "type": 0, - "keyCode": 32, - "mouseX": 0, - "mouseY": 0, - "time": 33616.1026 - }, - { - "type": 1, - "keyCode": 32, - "mouseX": 0, - "mouseY": 0, - "time": 33736.1158 - }, - { - "type": 1, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 40600.1535 - }, - { - "type": 0, - "keyCode": 84, - "mouseX": 0, - "mouseY": 0, - "time": 43000.0000 - }, - { - "type": 1, - "keyCode": 84, - "mouseX": 0, - "mouseY": 0, - "time": 43071.8735 - }, - { - "type": 0, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 46591.9060 - }, - { - "type": 1, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 47047.9336 - }, - { - "type": 0, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 47615.9255 - }, - { - "type": 1, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 50271.9249 - }, - { - "type": 0, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 51143.9303 - }, - { - "type": 1, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 51839.9301 - }, - { - "type": 0, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 52239.9472 - }, - { - "type": 1, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 53279.9313 - }, - { - "type": 0, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 64328.0135 - }, - { - "type": 1, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 67096.0170 - }, - { - "type": 0, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 67448.0209 - }, - { - "type": 1, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 75544.7151 - }, - { - "type": 0, - "keyCode": 81, - "mouseX": 0, - "mouseY": 0, - "time": 77153.2237 - }, - { - "type": 1, - "keyCode": 81, - "mouseX": 0, - "mouseY": 0, - "time": 78120.1226 - }, - { - "type": 0, - "keyCode": 68, - "mouseX": 0, - "mouseY": 0, - "time": 80768.1293 - }, - { - "type": 1, - "keyCode": 68, - "mouseX": 0, - "mouseY": 0, - "time": 81536.1748 - }, - { - "type": 0, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 82560.1130 - }, - { - "type": 1, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 85536.1748 - } - ], - "info": { - "name": "", - "description": "", - "x": 0, - "y": 0, - "width": 1920, - "height": 1080, - "recordDpi": 1 - } +{ + "macroEvents": [ + { + "type": 0, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 0.0000 + }, + { + "type": 1, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 11127.9408 + }, + { + "type": 0, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 13119.9760 + }, + { + "type": 1, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 17400.0108 + }, + { + "type": 0, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 18504.0088 + }, + { + "type": 1, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 27312.0632 + }, + { + "type": 0, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 28128.0973 + }, + { + "type": 1, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 29240.0663 + }, + { + "type": 0, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 29912.0759 + }, + { + "type": 1, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 31736.1294 + }, + { + "type": 0, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 31904.0885 + }, + { + "type": 1, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 32144.0983 + }, + { + "type": 0, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 32864.1012 + }, + { + "type": 0, + "keyCode": 32, + "mouseX": 0, + "mouseY": 0, + "time": 33288.1407 + }, + { + "type": 1, + "keyCode": 32, + "mouseX": 0, + "mouseY": 0, + "time": 33432.1196 + }, + { + "type": 0, + "keyCode": 32, + "mouseX": 0, + "mouseY": 0, + "time": 33616.1026 + }, + { + "type": 1, + "keyCode": 32, + "mouseX": 0, + "mouseY": 0, + "time": 33736.1158 + }, + { + "type": 1, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 40600.1535 + }, + { + "type": 0, + "keyCode": 84, + "mouseX": 0, + "mouseY": 0, + "time": 43000.0000 + }, + { + "type": 1, + "keyCode": 84, + "mouseX": 0, + "mouseY": 0, + "time": 43071.8735 + }, + { + "type": 0, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 46591.9060 + }, + { + "type": 1, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 47047.9336 + }, + { + "type": 0, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 47615.9255 + }, + { + "type": 1, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 50271.9249 + }, + { + "type": 0, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 51143.9303 + }, + { + "type": 1, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 51839.9301 + }, + { + "type": 0, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 52239.9472 + }, + { + "type": 1, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 53279.9313 + }, + { + "type": 0, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 64328.0135 + }, + { + "type": 1, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 67096.0170 + }, + { + "type": 0, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 67448.0209 + }, + { + "type": 1, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 75544.7151 + }, + { + "type": 0, + "keyCode": 81, + "mouseX": 0, + "mouseY": 0, + "time": 77153.2237 + }, + { + "type": 1, + "keyCode": 81, + "mouseX": 0, + "mouseY": 0, + "time": 78120.1226 + }, + { + "type": 0, + "keyCode": 68, + "mouseX": 0, + "mouseY": 0, + "time": 80768.1293 + }, + { + "type": 1, + "keyCode": 68, + "mouseX": 0, + "mouseY": 0, + "time": 81536.1748 + }, + { + "type": 0, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 82560.1130 + }, + { + "type": 1, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 85536.1748 + } + ], + "info": { + "name": "", + "description": "", + "x": 0, + "y": 0, + "width": 1920, + "height": 1080, + "recordDpi": 1 + } } \ No newline at end of file diff --git a/repo/js/AutoWoodcutting/assets/KeyMouse/炬木15个.json b/archive/js/AutoWoodcutting/assets/KeyMouse/炬木15个.json similarity index 95% rename from repo/js/AutoWoodcutting/assets/KeyMouse/炬木15个.json rename to archive/js/AutoWoodcutting/assets/KeyMouse/炬木15个.json index b1dcdf8c..a62c32dd 100644 --- a/repo/js/AutoWoodcutting/assets/KeyMouse/炬木15个.json +++ b/archive/js/AutoWoodcutting/assets/KeyMouse/炬木15个.json @@ -1,69 +1,69 @@ -{ - "macroEvents": [ - { - "type": 0, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 1619.1371 - }, - { - "type": 1, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 4843.0322 - }, - { - "type": 0, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 5555.1643 - }, - { - "type": 1, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 8195.0398 - }, - { - "type": 0, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 8939.0689 - }, - { - "type": 1, - "keyCode": 65, - "mouseX": 0, - "mouseY": 0, - "time": 10259.1104 - }, - { - "type": 0, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 11155.0806 - }, - { - "type": 1, - "keyCode": 87, - "mouseX": 0, - "mouseY": 0, - "time": 11655.0806 - } - ], - "info": { - "name": "", - "description": "", - "x": 0, - "y": 0, - "width": 1920, - "height": 1080, - "recordDpi": 1 - } +{ + "macroEvents": [ + { + "type": 0, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 1619.1371 + }, + { + "type": 1, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 4843.0322 + }, + { + "type": 0, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 5555.1643 + }, + { + "type": 1, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 8195.0398 + }, + { + "type": 0, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 8939.0689 + }, + { + "type": 1, + "keyCode": 65, + "mouseX": 0, + "mouseY": 0, + "time": 10259.1104 + }, + { + "type": 0, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 11155.0806 + }, + { + "type": 1, + "keyCode": 87, + "mouseX": 0, + "mouseY": 0, + "time": 11655.0806 + } + ], + "info": { + "name": "", + "description": "", + "x": 0, + "y": 0, + "width": 1920, + "height": 1080, + "recordDpi": 1 + } } \ No newline at end of file diff --git a/repo/js/AutoWoodcutting/main.js b/archive/js/AutoWoodcutting/main.js similarity index 97% rename from repo/js/AutoWoodcutting/main.js rename to archive/js/AutoWoodcutting/main.js index 7b1c9f1e..13b53655 100644 --- a/repo/js/AutoWoodcutting/main.js +++ b/archive/js/AutoWoodcutting/main.js @@ -1,172 +1,172 @@ -(async function () { - const defaultExitDelay = 10000; - const defaultLoadingDelay = 13000; - const seen = new Set(); - - function validateAndSetDefaults(exitDelay, loadingDelay) { - if (isNaN(exitDelay) || exitDelay <= 0) { - log.warn("你没有设置退出延迟,将使用默认值"); - exitDelay = defaultExitDelay; - } - if (isNaN(loadingDelay) || loadingDelay <= 0) { - log.warn("你没有设置加载延迟,将使用默认值"); - loadingDelay = defaultLoadingDelay; - } - return { exitDelay, loadingDelay }; - } - - async function runGameActionsMultipleTimes(times, locationName) { - for (let i = 0; i < times; i++) { - await sleep(1000); - keyPress("ESCAPE"); - await sleep(1000); - click(50, 1030); - await sleep(1000); - click(1000, 750); - await sleep(validatedExitDelay); - click(1000, 550); - await sleep(validatedLoadingDelay); - keyPress("z"); - log.info(`${locationName} 循环次数:${i + 1}/${times}`); - } - } - - async function resetMap() { - log.info("重置地图大小..."); - await sleep(1000); - keyPress("M"); - await sleep(1000); - click(1840, 1010); - await sleep(1000); - click(1450, 460); - await sleep(1000); - click(1840, 1010); - await sleep(1000); - click(1450, 140); - await sleep(1000); - keyPress("M"); - log.info("重置地图大小完成"); - } - - async function KeyMouse(locationNameEx) { - log.info(`前往 ${locationNameEx}`); - let tpPath = `assets/AutoPath/tp/${locationNameEx}tp.json`; - let filePath = `assets/KeyMouse/${locationNameEx}.json`; - - try { - await pathingScript.runFile(tpPath); - await sleep(1000); - await keyMouseScript.runFile(filePath); - } catch (error) { - log.error(`执行 ${locationNameEx} 脚本时发生错误: ${error}`); - } - await sleep(1000); - } - - async function woodcutting(locationName) { - log.info(`砍伐 ${locationName}`); - if (!map[locationName]) { - log.info(`未找到 ${locationName} 对应的木材`); - return; - } - - const { description, available, times } = map[locationName]; - if (description === 'NULL' || !description) { - log.info(`${locationName} 暂不支持`); - return; - } - - if (Array.from(seen).some(item => item.includes(locationName))) { - log.info(`${locationName} 已经砍伐过,将执行下一个`); - return; - } - - log.info(`前往 ${description}`); - await sleep(1000); - - try { - if (locationName === "炬木" || locationName === "桃椰子木") { - await KeyMouse(description); - } else { - const filePath = `assets/AutoPath/${description}.json`; - await pathingScript.runFile(filePath); - } - - await sleep(1000); - - if (!available) { - await runGameActionsMultipleTimes(times, description); - } else { - await dispatcher.runTask(new SoloTask("AutoWood")); - } - - seen.add(map[locationName].description); - log.info(`${locationName} 伐木完成,将执行下一个`); - log.info(`已运行木材: ${[...seen].join(", ")}`); - } catch (error) { - log.error(`在砍伐 ${locationName} 时发生错误: ${error}`); - } - } - - // Set game environment settings - setGameMetrics(1920, 1080, 1); - - const map = { - '桦木': { description: '桦木15个', available: true, times: 134 }, - '萃华木': { description: '萃华木6个(垂香木3个)', available: true, times: 334 }, - '松木': { description: '松木24个', available: true, times: 84 }, - '却砂木': { description: '却砂木12个', available: true, times: 167 }, - '竹节': { description: '竹节30个', available: true, times: 67 }, - '垂香木': { description: '垂香木15个', available: true, times: 134 }, - '杉木': { description: '杉木12个', available: true, times: 167 }, - '梦见木': { description: '梦见木12个', available: true, times: 167 }, - '枫木': { description: '枫木9个', available: true, times: 223 }, - '孔雀木': { description: '御伽木9个(孔雀木6个)', available: false, times: 334 },//利用手动重置仇恨 - '御伽木': { description: '御伽木9个(孔雀木6个)', available: false, times: 334 },//利用手动重置仇恨 - '辉木': { description: '业果木15个(辉木15个)', available: true, times: 134 }, - '业果木': { description: '业果木15个(辉木15个)', available: true, times: 134 }, - '证悟木': { description: '证悟木15个(业果木6个)', available: true, times: 334 }, - '刺葵木': { description: '刺葵木6个', available: true, times: 334 }, - '柽木': { description: '柽木15个', available: false, times: 134 }, - '悬铃木': { description: '悬铃木18个', available: true, times: 112 }, - '椴木': { description: '椴木9个', available: true, times: 223 }, - '白梣木': { description: '白梣木15个', available: true, times: 134 }, - '香柏木': { description: '香柏木27个', available: true, times: 75 }, - '炬木': { description: '炬木15个', available: true, times: 134 }, - '白栗栎木': { description: '燃爆木6个(白栗栎木6个)', available: false, times: 334 }, - '灰灰楼林木': { description: '灰灰楼木6个', available: false, times: 334 }, - '燃爆木': { description: '燃爆木15个', available: false, times: 134 }, - '桃椰子木': { description: '桃椰子木12个', available: false, times: 167 } - }; - - let exitdelay = Number(settings.exitdelay); - let loadingdelay = Number(settings.loadingdelay); - const { exitDelay: validatedExitDelay, loadingDelay: validatedLoadingDelay } = validateAndSetDefaults(exitdelay, loadingdelay); - - const messages = [ - '确保装备有[王树瑞佑]', - '确保使用小道具快捷键为Z键', - '确保开启了BGI独立任务中自动伐木的“启用OCR伐木数量限制”', - '若要运行炬木或桃椰子木:', - '运行时是琳妮特前台且拥有双风共鸣', - '元素共鸣需要四个角色组队触发,仅两个风系角色无效', - '不要带其他有移速加成的角色' - ]; - for (let message of messages) { - log.info(message); - await sleep(1000); - } - - log.info('自动伐木开始...'); - log.info(`退出延迟: ${validatedExitDelay}毫秒, 加载延迟: ${validatedLoadingDelay}毫秒`); - - let woodsArray = settings.woods.split(" "); - await resetMap(); - for (const wood of woodsArray) { - if (wood.trim()) { - await woodcutting(wood); - } else { - log.info('请在自定义选项输入木材名,用空格隔开'); - } - } -})(); +(async function () { + const defaultExitDelay = 10000; + const defaultLoadingDelay = 13000; + const seen = new Set(); + + function validateAndSetDefaults(exitDelay, loadingDelay) { + if (isNaN(exitDelay) || exitDelay <= 0) { + log.warn("你没有设置退出延迟,将使用默认值"); + exitDelay = defaultExitDelay; + } + if (isNaN(loadingDelay) || loadingDelay <= 0) { + log.warn("你没有设置加载延迟,将使用默认值"); + loadingDelay = defaultLoadingDelay; + } + return { exitDelay, loadingDelay }; + } + + async function runGameActionsMultipleTimes(times, locationName) { + for (let i = 0; i < times; i++) { + await sleep(1000); + keyPress("ESCAPE"); + await sleep(1000); + click(50, 1030); + await sleep(1000); + click(1000, 750); + await sleep(validatedExitDelay); + click(1000, 550); + await sleep(validatedLoadingDelay); + keyPress("z"); + log.info(`${locationName} 循环次数:${i + 1}/${times}`); + } + } + + async function resetMap() { + log.info("重置地图大小..."); + await sleep(1000); + keyPress("M"); + await sleep(1000); + click(1840, 1010); + await sleep(1000); + click(1450, 460); + await sleep(1000); + click(1840, 1010); + await sleep(1000); + click(1450, 140); + await sleep(1000); + keyPress("M"); + log.info("重置地图大小完成"); + } + + async function KeyMouse(locationNameEx) { + log.info(`前往 ${locationNameEx}`); + let tpPath = `assets/AutoPath/tp/${locationNameEx}tp.json`; + let filePath = `assets/KeyMouse/${locationNameEx}.json`; + + try { + await pathingScript.runFile(tpPath); + await sleep(1000); + await keyMouseScript.runFile(filePath); + } catch (error) { + log.error(`执行 ${locationNameEx} 脚本时发生错误: ${error}`); + } + await sleep(1000); + } + + async function woodcutting(locationName) { + log.info(`砍伐 ${locationName}`); + if (!map[locationName]) { + log.info(`未找到 ${locationName} 对应的木材`); + return; + } + + const { description, available, times } = map[locationName]; + if (description === 'NULL' || !description) { + log.info(`${locationName} 暂不支持`); + return; + } + + if (Array.from(seen).some(item => item.includes(locationName))) { + log.info(`${locationName} 已经砍伐过,将执行下一个`); + return; + } + + log.info(`前往 ${description}`); + await sleep(1000); + + try { + if (locationName === "炬木" || locationName === "桃椰子木") { + await KeyMouse(description); + } else { + const filePath = `assets/AutoPath/${description}.json`; + await pathingScript.runFile(filePath); + } + + await sleep(1000); + + if (!available) { + await runGameActionsMultipleTimes(times, description); + } else { + await dispatcher.runTask(new SoloTask("AutoWood")); + } + + seen.add(map[locationName].description); + log.info(`${locationName} 伐木完成,将执行下一个`); + log.info(`已运行木材: ${[...seen].join(", ")}`); + } catch (error) { + log.error(`在砍伐 ${locationName} 时发生错误: ${error}`); + } + } + + // Set game environment settings + setGameMetrics(1920, 1080, 1); + + const map = { + '桦木': { description: '桦木15个', available: true, times: 134 }, + '萃华木': { description: '萃华木6个(垂香木3个)', available: true, times: 334 }, + '松木': { description: '松木24个', available: true, times: 84 }, + '却砂木': { description: '却砂木12个', available: true, times: 167 }, + '竹节': { description: '竹节30个', available: true, times: 67 }, + '垂香木': { description: '垂香木15个', available: true, times: 134 }, + '杉木': { description: '杉木12个', available: true, times: 167 }, + '梦见木': { description: '梦见木12个', available: true, times: 167 }, + '枫木': { description: '枫木9个', available: true, times: 223 }, + '孔雀木': { description: '御伽木9个(孔雀木6个)', available: false, times: 334 },//利用手动重置仇恨 + '御伽木': { description: '御伽木9个(孔雀木6个)', available: false, times: 334 },//利用手动重置仇恨 + '辉木': { description: '业果木15个(辉木15个)', available: true, times: 134 }, + '业果木': { description: '业果木15个(辉木15个)', available: true, times: 134 }, + '证悟木': { description: '证悟木15个(业果木6个)', available: true, times: 334 }, + '刺葵木': { description: '刺葵木6个', available: true, times: 334 }, + '柽木': { description: '柽木15个', available: false, times: 134 }, + '悬铃木': { description: '悬铃木18个', available: true, times: 112 }, + '椴木': { description: '椴木9个', available: true, times: 223 }, + '白梣木': { description: '白梣木15个', available: true, times: 134 }, + '香柏木': { description: '香柏木27个', available: true, times: 75 }, + '炬木': { description: '炬木15个', available: true, times: 134 }, + '白栗栎木': { description: '燃爆木6个(白栗栎木6个)', available: false, times: 334 }, + '灰灰楼林木': { description: '灰灰楼木6个', available: false, times: 334 }, + '燃爆木': { description: '燃爆木15个', available: false, times: 134 }, + '桃椰子木': { description: '桃椰子木12个', available: false, times: 167 } + }; + + let exitdelay = Number(settings.exitdelay); + let loadingdelay = Number(settings.loadingdelay); + const { exitDelay: validatedExitDelay, loadingDelay: validatedLoadingDelay } = validateAndSetDefaults(exitdelay, loadingdelay); + + const messages = [ + '确保装备有[王树瑞佑]', + '确保使用小道具快捷键为Z键', + '确保开启了BGI独立任务中自动伐木的“启用OCR伐木数量限制”', + '若要运行炬木或桃椰子木:', + '运行时是琳妮特前台且拥有双风共鸣', + '元素共鸣需要四个角色组队触发,仅两个风系角色无效', + '不要带其他有移速加成的角色' + ]; + for (let message of messages) { + log.info(message); + await sleep(1000); + } + + log.info('自动伐木开始...'); + log.info(`退出延迟: ${validatedExitDelay}毫秒, 加载延迟: ${validatedLoadingDelay}毫秒`); + + let woodsArray = settings.woods.split(" "); + await resetMap(); + for (const wood of woodsArray) { + if (wood.trim()) { + await woodcutting(wood); + } else { + log.info('请在自定义选项输入木材名,用空格隔开'); + } + } +})(); diff --git a/repo/js/AutoWoodcutting/manifest.json b/archive/js/AutoWoodcutting/manifest.json similarity index 100% rename from repo/js/AutoWoodcutting/manifest.json rename to archive/js/AutoWoodcutting/manifest.json diff --git a/repo/js/AutoWoodcutting/settings.json b/archive/js/AutoWoodcutting/settings.json similarity index 95% rename from repo/js/AutoWoodcutting/settings.json rename to archive/js/AutoWoodcutting/settings.json index 3652103d..147bd2c7 100644 --- a/repo/js/AutoWoodcutting/settings.json +++ b/archive/js/AutoWoodcutting/settings.json @@ -1,138 +1,138 @@ -[ - { - "name": "woods", - "type": "input-text", - "label": "木材种类:使用空格分隔" - }, - { - "name": "exitdelay", - "type": "input-text", - "label": "退出延迟(毫秒)(选填)" - }, - { - "name": "loadingdelay", - "type": "input-text", - "label": "加载延迟(毫秒)(选填)" - } - // { - // "name": "桦木", - // "type": "checkbox", - // "label": "桦木" - // }, - // { - // "name": "萃华木", - // "type": "checkbox", - // "label": "萃华木" - // }, - // { - // "name": "松木", - // "type": "checkbox", - // "label": "松木" - // }, - // { - // "name": "却砂木", - // "type": "checkbox", - // "label": "却砂木" - // }, - // { - // "name": "竹节", - // "type": "checkbox", - // "label": "竹节" - // }, - // { - // "name": "垂香木", - // "type": "checkbox", - // "label": "垂香木" - // }, - // { - // "name": "杉木", - // "type": "checkbox", - // "label": "杉木" - // }, - // { - // "name": "梦见木", - // "type": "checkbox", - // "label": "梦见木" - // }, - // { - // "name": "枫木", - // "type": "checkbox", - // "label": "枫木" - // }, - // { - // "name": "孔雀木", - // "type": "checkbox", - // "label": "孔雀木" - // }, - // { - // "name": "御伽木", - // "type": "checkbox", - // "label": "御伽木" - // }, - // { - // "name": "辉木", - // "type": "checkbox", - // "label": "辉木" - // }, - // { - // "name": "业果木", - // "type": "checkbox", - // "label": "业果木" - // }, - // { - // "name": "证悟木", - // "type": "checkbox", - // "label": "证悟木" - // }, - // { - // "name": "刺葵木", - // "type": "checkbox", - // "label": "刺葵木" - // }, - // { - // "name": "柽木", - // "type": "checkbox", - // "label": "柽木" - // }, - // { - // "name": "悬铃木", - // "type": "checkbox", - // "label": "悬铃木" - // }, - // { - // "name": "椴木", - // "type": "checkbox", - // "label": "椴木" - // }, - // { - // "name": "白梣木", - // "type": "checkbox", - // "label": "白梣木" - // }, - // { - // "name": "香柏木", - // "type": "checkbox", - // "label": "香柏木" - // }, - // { - // "name": "炬木", - // "type": "checkbox", - // "label": "炬木" - // }, - // { - // "name": "白栗栎木", - // "type": "checkbox", - // "label": "白栗栎木" - // }, - // { - // "name": "灰灰楼林木", - // "type": "checkbox", - // "label": "灰灰楼林木" - // }, - // { - // "name": "燃爆木", - // "type": "checkbox", - // "label": "燃爆木" - // } - +[ + { + "name": "woods", + "type": "input-text", + "label": "木材种类:使用空格分隔" + }, + { + "name": "exitdelay", + "type": "input-text", + "label": "退出延迟(毫秒)(选填)" + }, + { + "name": "loadingdelay", + "type": "input-text", + "label": "加载延迟(毫秒)(选填)" + } + // { + // "name": "桦木", + // "type": "checkbox", + // "label": "桦木" + // }, + // { + // "name": "萃华木", + // "type": "checkbox", + // "label": "萃华木" + // }, + // { + // "name": "松木", + // "type": "checkbox", + // "label": "松木" + // }, + // { + // "name": "却砂木", + // "type": "checkbox", + // "label": "却砂木" + // }, + // { + // "name": "竹节", + // "type": "checkbox", + // "label": "竹节" + // }, + // { + // "name": "垂香木", + // "type": "checkbox", + // "label": "垂香木" + // }, + // { + // "name": "杉木", + // "type": "checkbox", + // "label": "杉木" + // }, + // { + // "name": "梦见木", + // "type": "checkbox", + // "label": "梦见木" + // }, + // { + // "name": "枫木", + // "type": "checkbox", + // "label": "枫木" + // }, + // { + // "name": "孔雀木", + // "type": "checkbox", + // "label": "孔雀木" + // }, + // { + // "name": "御伽木", + // "type": "checkbox", + // "label": "御伽木" + // }, + // { + // "name": "辉木", + // "type": "checkbox", + // "label": "辉木" + // }, + // { + // "name": "业果木", + // "type": "checkbox", + // "label": "业果木" + // }, + // { + // "name": "证悟木", + // "type": "checkbox", + // "label": "证悟木" + // }, + // { + // "name": "刺葵木", + // "type": "checkbox", + // "label": "刺葵木" + // }, + // { + // "name": "柽木", + // "type": "checkbox", + // "label": "柽木" + // }, + // { + // "name": "悬铃木", + // "type": "checkbox", + // "label": "悬铃木" + // }, + // { + // "name": "椴木", + // "type": "checkbox", + // "label": "椴木" + // }, + // { + // "name": "白梣木", + // "type": "checkbox", + // "label": "白梣木" + // }, + // { + // "name": "香柏木", + // "type": "checkbox", + // "label": "香柏木" + // }, + // { + // "name": "炬木", + // "type": "checkbox", + // "label": "炬木" + // }, + // { + // "name": "白栗栎木", + // "type": "checkbox", + // "label": "白栗栎木" + // }, + // { + // "name": "灰灰楼林木", + // "type": "checkbox", + // "label": "灰灰楼林木" + // }, + // { + // "name": "燃爆木", + // "type": "checkbox", + // "label": "燃爆木" + // } + ] \ No newline at end of file diff --git a/repo/js/AutoWoodcutting/全部木材.txt b/archive/js/AutoWoodcutting/全部木材.txt similarity index 99% rename from repo/js/AutoWoodcutting/全部木材.txt rename to archive/js/AutoWoodcutting/全部木材.txt index c858d6cd..b93a06d2 100644 --- a/repo/js/AutoWoodcutting/全部木材.txt +++ b/archive/js/AutoWoodcutting/全部木材.txt @@ -1,4 +1,4 @@ -全部木材: -桦木 萃华木 松木 却砂木 竹节 垂香木 杉木 梦见木 枫木 孔雀木 御伽木 辉木 业果木 证悟木 刺葵木 柽木 悬铃木 椴木 白梣木 香柏木 炬木 白栗栎木 灰灰楼林木 燃爆木 桃椰子木 - +全部木材: +桦木 萃华木 松木 却砂木 竹节 垂香木 杉木 梦见木 枫木 孔雀木 御伽木 辉木 业果木 证悟木 刺葵木 柽木 悬铃木 椴木 白梣木 香柏木 炬木 白栗栎木 灰灰楼林木 燃爆木 桃椰子木 + 涉及炬木、桃椰子木的队伍要求:双风共鸣且琳妮特前台 \ No newline at end of file diff --git a/repo/js/Collect Dongtian Xuyu Resin/main.js b/archive/js/Collect Dongtian Xuyu Resin/main.js similarity index 96% rename from repo/js/Collect Dongtian Xuyu Resin/main.js rename to archive/js/Collect Dongtian Xuyu Resin/main.js index 823f5f4d..45a34df8 100644 --- a/repo/js/Collect Dongtian Xuyu Resin/main.js +++ b/archive/js/Collect Dongtian Xuyu Resin/main.js @@ -1,21 +1,21 @@ -(async function () { - setGameMetrics(1920, 1080, 2); // 设置游戏窗口大小和DPI - await sleep(3000); - keyPress("F"); - await sleep(5000); - click(1370, 655); - await sleep(3000); - click(1370, 655); - await sleep(3000); - click(680,300); - await sleep(3000); - click(1760, 1020); - await sleep(3000); - click(1160, 780); - await sleep(3000); - click(1160, 780); - await sleep(3000); - click(1865, 44); - await sleep(3000); - log.info("已领取洞天宝钱和好感"); +(async function () { + setGameMetrics(1920, 1080, 2); // 设置游戏窗口大小和DPI + await sleep(3000); + keyPress("F"); + await sleep(5000); + click(1370, 655); + await sleep(3000); + click(1370, 655); + await sleep(3000); + click(680,300); + await sleep(3000); + click(1760, 1020); + await sleep(3000); + click(1160, 780); + await sleep(3000); + click(1160, 780); + await sleep(3000); + click(1865, 44); + await sleep(3000); + log.info("已领取洞天宝钱和好感"); })(); \ No newline at end of file diff --git a/repo/js/Collect Dongtian Xuyu Resin/manifest.json b/archive/js/Collect Dongtian Xuyu Resin/manifest.json similarity index 96% rename from repo/js/Collect Dongtian Xuyu Resin/manifest.json rename to archive/js/Collect Dongtian Xuyu Resin/manifest.json index 178d9c3d..e457e4b3 100644 --- a/repo/js/Collect Dongtian Xuyu Resin/manifest.json +++ b/archive/js/Collect Dongtian Xuyu Resin/manifest.json @@ -1,13 +1,13 @@ -{ - "manifest_version": 1, - "name": "领取洞天百宝须臾树脂,只领取须臾树脂,前面是领取洞天宝钱和好感", - "version": "1.0", - "description": "领取洞天须臾树脂", - "authors": [ - { - "name": "风埠", - "links": "https://github.com/jhkif" - } - ], - "main": "main.js" +{ + "manifest_version": 1, + "name": "领取洞天百宝须臾树脂,只领取须臾树脂,前面是领取洞天宝钱和好感", + "version": "1.0", + "description": "领取洞天须臾树脂", + "authors": [ + { + "name": "风埠", + "links": "https://github.com/jhkif" + } + ], + "main": "main.js" } \ No newline at end of file diff --git a/repo/js/Condensed Resin/main.js b/archive/js/Condensed Resin/main.js similarity index 96% rename from repo/js/Condensed Resin/main.js rename to archive/js/Condensed Resin/main.js index 8fb9ffba..c93b4be5 100644 --- a/repo/js/Condensed Resin/main.js +++ b/archive/js/Condensed Resin/main.js @@ -1,21 +1,21 @@ -(async function () { - setGameMetrics(1920, 1080, 2); // 设置游戏窗口大小和DPI - keyPress("F"); - await sleep(1000); - keyPress("F"); - await sleep(1500); - click(960, 540); - await sleep(1000); - click(1750, 1010); - await sleep(5000); - click(975, 900); - await sleep(1000); - click(1356, 804); //再见 - log.info("点击再见1"); - await sleep(2000); - click(1356, 804); //再见 - log.info("点击再见2"); - keyPress("Escape"); - log.info("已完成合成浓缩树脂"); - +(async function () { + setGameMetrics(1920, 1080, 2); // 设置游戏窗口大小和DPI + keyPress("F"); + await sleep(1000); + keyPress("F"); + await sleep(1500); + click(960, 540); + await sleep(1000); + click(1750, 1010); + await sleep(5000); + click(975, 900); + await sleep(1000); + click(1356, 804); //再见 + log.info("点击再见1"); + await sleep(2000); + click(1356, 804); //再见 + log.info("点击再见2"); + keyPress("Escape"); + log.info("已完成合成浓缩树脂"); + })(); \ No newline at end of file diff --git a/repo/js/Condensed Resin/manifest.json b/archive/js/Condensed Resin/manifest.json similarity index 94% rename from repo/js/Condensed Resin/manifest.json rename to archive/js/Condensed Resin/manifest.json index e72fd060..ade0f3d9 100644 --- a/repo/js/Condensed Resin/manifest.json +++ b/archive/js/Condensed Resin/manifest.json @@ -1,12 +1,12 @@ -{ - "manifest_version": 1, - "name": "合成浓缩树脂", - "version": "1.1", - "description": "用于合成浓缩树脂", - "authors": [ - { - "name": "鹤望兰" - } - ], - "main": "main.js" +{ + "manifest_version": 1, + "name": "合成浓缩树脂", + "version": "1.1", + "description": "用于合成浓缩树脂", + "authors": [ + { + "name": "鹤望兰" + } + ], + "main": "main.js" } \ No newline at end of file diff --git a/repo/js/买菜/NPC_list.json b/archive/js/买菜/NPC_list.json similarity index 100% rename from repo/js/买菜/NPC_list.json rename to archive/js/买菜/NPC_list.json diff --git a/repo/js/买菜/assets/AutoPath/东升.json b/archive/js/买菜/assets/AutoPath/东升.json similarity index 100% rename from repo/js/买菜/assets/AutoPath/东升.json rename to archive/js/买菜/assets/AutoPath/东升.json diff --git a/repo/js/买菜/assets/AutoPath/卯师父.json b/archive/js/买菜/assets/AutoPath/卯师父.json similarity index 100% rename from repo/js/买菜/assets/AutoPath/卯师父.json rename to archive/js/买菜/assets/AutoPath/卯师父.json diff --git a/repo/js/买菜/assets/AutoPath/哈马维.json b/archive/js/买菜/assets/AutoPath/哈马维.json similarity index 100% rename from repo/js/买菜/assets/AutoPath/哈马维.json rename to archive/js/买菜/assets/AutoPath/哈马维.json diff --git a/repo/js/买菜/assets/AutoPath/小畑.json b/archive/js/买菜/assets/AutoPath/小畑.json similarity index 100% rename from repo/js/买菜/assets/AutoPath/小畑.json rename to archive/js/买菜/assets/AutoPath/小畑.json diff --git a/repo/js/买菜/assets/AutoPath/布兰琪.json b/archive/js/买菜/assets/AutoPath/布兰琪.json similarity index 100% rename from repo/js/买菜/assets/AutoPath/布兰琪.json rename to archive/js/买菜/assets/AutoPath/布兰琪.json diff --git a/repo/js/买菜/assets/AutoPath/布希柯.json b/archive/js/买菜/assets/AutoPath/布希柯.json similarity index 100% rename from repo/js/买菜/assets/AutoPath/布希柯.json rename to archive/js/买菜/assets/AutoPath/布希柯.json diff --git a/repo/js/买菜/assets/AutoPath/布特罗斯.json b/archive/js/买菜/assets/AutoPath/布特罗斯.json similarity index 100% rename from repo/js/买菜/assets/AutoPath/布特罗斯.json rename to archive/js/买菜/assets/AutoPath/布特罗斯.json diff --git a/repo/js/买菜/assets/AutoPath/志村勘兵卫.json b/archive/js/买菜/assets/AutoPath/志村勘兵卫.json similarity index 100% rename from repo/js/买菜/assets/AutoPath/志村勘兵卫.json rename to archive/js/买菜/assets/AutoPath/志村勘兵卫.json diff --git a/repo/js/买菜/assets/AutoPath/珀姆.json b/archive/js/买菜/assets/AutoPath/珀姆.json similarity index 100% rename from repo/js/买菜/assets/AutoPath/珀姆.json rename to archive/js/买菜/assets/AutoPath/珀姆.json diff --git a/repo/js/买菜/assets/AutoPath/老孙.json b/archive/js/买菜/assets/AutoPath/老孙.json similarity index 100% rename from repo/js/买菜/assets/AutoPath/老孙.json rename to archive/js/买菜/assets/AutoPath/老孙.json diff --git a/repo/js/买菜/assets/AutoPath/老高.json b/archive/js/买菜/assets/AutoPath/老高.json similarity index 100% rename from repo/js/买菜/assets/AutoPath/老高.json rename to archive/js/买菜/assets/AutoPath/老高.json diff --git a/repo/js/买菜/assets/AutoPath/莎拉.json b/archive/js/买菜/assets/AutoPath/莎拉.json similarity index 100% rename from repo/js/买菜/assets/AutoPath/莎拉.json rename to archive/js/买菜/assets/AutoPath/莎拉.json diff --git a/repo/js/买菜/assets/AutoPath/葵.json b/archive/js/买菜/assets/AutoPath/葵.json similarity index 100% rename from repo/js/买菜/assets/AutoPath/葵.json rename to archive/js/买菜/assets/AutoPath/葵.json diff --git a/repo/js/买菜/assets/AutoPath/阿扎莱.json b/archive/js/买菜/assets/AutoPath/阿扎莱.json similarity index 100% rename from repo/js/买菜/assets/AutoPath/阿扎莱.json rename to archive/js/买菜/assets/AutoPath/阿扎莱.json diff --git a/repo/js/买菜/assets/AutoPath/阿鲁埃.json b/archive/js/买菜/assets/AutoPath/阿鲁埃.json similarity index 100% rename from repo/js/买菜/assets/AutoPath/阿鲁埃.json rename to archive/js/买菜/assets/AutoPath/阿鲁埃.json diff --git a/repo/js/买菜/main.js b/archive/js/买菜/main.js similarity index 100% rename from repo/js/买菜/main.js rename to archive/js/买菜/main.js diff --git a/repo/js/买菜/manifest.json b/archive/js/买菜/manifest.json similarity index 84% rename from repo/js/买菜/manifest.json rename to archive/js/买菜/manifest.json index 704655a1..95e29845 100644 --- a/repo/js/买菜/manifest.json +++ b/archive/js/买菜/manifest.json @@ -1,6 +1,6 @@ { "manifest_version": 1, - "name": "购买食材-自动购物", + "name": "指定NPC购买食材", "version": "1.0.3", "description": "一个自动买菜脚本, 目前只添加了15个NPC. 一些NPC商人的信息作者可能不知道, 白淞镇、离岛、竞技场NPC无法识别坐标信息.", "authors": [ @@ -9,6 +9,9 @@ "links": "https://github.com/TingYu-lulumi" } ], + "tags": [ + "购买食材" + ], "settings_ui": "settings.json", "main": "main.js" } \ No newline at end of file diff --git a/repo/js/买菜/settings.json b/archive/js/买菜/settings.json similarity index 100% rename from repo/js/买菜/settings.json rename to archive/js/买菜/settings.json