From 0898beb0a696f4921ab6a701c653b1d2048585c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E7=AB=AF=E5=AE=A2?= <107686912+Kirito520Asuna@users.noreply.github.com> Date: Tue, 26 Aug 2025 14:13:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A3=E9=81=97=E7=89=A9=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=BC=BA=E5=8C=96=20(=E4=BD=9C=E8=80=85=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=BAgithub=20=E5=B1=95=E7=A4=BA=E5=90=8D?= =?UTF-8?q?=E7=A7=B0)=20(#1717)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 添加原神初露之源水下采集脚本(init) * feat: 初露之源添加<自体自身之塔>上部、中部、下部区域采集功能(补齐完整) * feat: 添加队伍切换功能 * feat: 添加返回主界面功能JS(方便扩展调度器使用) * feat: 添加活动页面切换功能 * docs: 添加活动切换脚本说明文档及代码优化 * docs: 更新活动切换脚本说明文档 * refactor: (用于提交PR)移除废弃的队伍切换和采集脚本-并修正切换活动页面的默认值 * refactor: 调整分页和OCR计数相关参数 * refactor: (版本升为1.1.0)优化鼠标移动逻辑并调整默认参数 * json 命名错误替换 * fix: 添加活动识别完成判断并优化代码格式 * feat: 添加圣遗物强化功能模块(初始化)单个强化已完成 * refactor: 重构圣遗物强化功能,优化OCR识别和代码结构 * feat: 添加圣遗物状态筛选功能 * refactor: 添加日志函数并统一日志输出格式 * feat: 添加圣遗物筛选排序功能 * refactor: 优化圣遗物筛选和排序流程 * refactor: 优化代码等待时间并改进圣遗物处理逻辑 * refactor: 添加配置对象统一管理圣遗物升级设置 * refactor: 重构圣遗物强化系统代码,优化操作流程和界面交互 * fix: 修复圣遗物强化素材选择逻辑问题 * refactor: 将日志函数改为异步处理 * refactor: 优化异步函数为同步函数并改进错误处理 * refactor: 优化圣遗物强化逻辑和操作处理流程 * feat: 添加圣遗物批量强化个数限制功能 * feat: 添加圣遗物强化脚本及文档说明 * feat: 添加圣遗物强化批量处理及优化点击逻辑 * fix: 优化圣遗物强化流程中的坐标计算和等待时间 * feat: 添加圣遗物筛选功能并优化OCR识别 * feat: 添加圣遗物降序排序和批量强化功能 * fix: 圣遗物强化满级处理逻辑优化 * feat: 优化圣遗物排序功能并更新文档 * refactor: 移除冗余代码并简化主函数逻辑 1.0.0 版本完成 * fix: 修正游戏界面宽度计算的分母错误 * feat: 添加圣遗物属性排序功能 * refactor: 移除废弃函数并优化圣遗物筛选逻辑 * refactor: 使用config.log_off统一替换硬编码的日志开关参数 * refactor: 使用config.log_off统一替换硬编码的日志开关参数 * feat: 添加圣遗物套装筛选功能(原神对应功能一适配完成) * fix: 修复关键词匹配逻辑并添加完成条件判断 * refactor: 优化圣遗物筛选功能,移除不必要的异步调用 * refactor: 优化圣遗物排序逻辑和滚动功能 * refactor: 优化圣遗物排序逻辑和滚动功能 * refactor: 优化属性排序选择逻辑 * feat: 添加圣遗物特殊属性排序功能 * refactor: 优化主流程逻辑和等待时间,提升性能 * refactor: 添加captureRegion资源释放调用 * refactor: 优化圣遗物强化代码结构和性能(还有个别bug) * fix: 修复圣遗物强化功能的升级次数计算和排序逻辑 * fix: 优化圣遗物强化流程中的OCR识别和点击逻辑 * fix: 优化圣遗物强化逻辑与识别准确性 * fix: 修复元素点击前存在性检查 * refactor: 优化圣遗物强化逻辑并新增页面滚动处理 * refactor: 优化圣遗物强化逻辑和点击时序 * refactor: 优化圣遗物批量强化流程和配置选项 * update * docs: 添加圣遗物批量强化脚本文档 * docs: 修正README中格式说明的引号 * refactor: 模板匹配 规范化 * docs: 删除圣遗物批量强化脚本的README文档 * refactor: 优化日志控制逻辑和代码格式 * refactor: 增强info函数参数,添加强制日志输出功能 * refactor: 将Math.ceil替换为Math.floor以优化数值计算 * feat: 优化日志输出功能,添加条件控制参数 * fix: 修复圣遗物排序和强化功能的日志显示问题 * refactor: 优化圣遗物筛选滚动逻辑与参数 * refactor: 优化圣遗物筛选滚动逻辑与参数 * refactor: 优化页面滚动逻辑并注释元素充能效率选项 * refactor: 重命名圣遗物强化相关函数提升代码可读性 * style: 更新确认提示文本 * style: 更新确认提示文本 * fix: 优化圣遗物强化逻辑和错误处理 * refactor: 优化圣遗物强化逻辑与操作流程 * feat: 添加圣遗物页面滑动功能及优化模板匹配算法 * refactor: 移除冗余代码并优化圣遗物强化逻辑 * fix: 调整圣遗物强化区域宽度及优化点击确认逻辑 * refactor: 调整目标区域宽度计算参数 * fix: 修正圣遗物强化日志中的模板名称变量 * perf: 优化圣遗物强化流程中的等待时间 * style: 优化日志输出格式和注释 * refactor: 优化等待函数和延时参数 * refactor: 优化圣遗物强化功能代码结构和等待时间 * refactor: 统一使用wait()函数替换具体等待时间 * refactor: 优化圣遗物相关函数的异步处理和代码结构 * refactor: 优化圣遗物翻页逻辑和次数 * refactor: 优化圣遗物强化逻辑和滚动性能 * refactor: 优化圣遗物筛选UI的等待时间和逻辑处理 * refactor: 统一圣遗物相关操作的等待时间 * fix: 调整操作延时参数提升稳定性 * refactor: 优化圣遗物素材条件选择逻辑 * docs: 更新素材功能问题描述 * docs: 作者名修改为github的名字 * fix: 强化系统数值处理与日志记录优化 * fix: 优化圣遗物强化逻辑和错误处理 * refactor: 优化游戏OCR识别和强化操作逻辑 * refactor: 优化圣遗物强化流程和新增检查函数 * docs: 更新README文档作者信息 * refactor: 移除setGameMetrics函数的await调用 * docs: 更新分辨率建议并添加分辨率检查 * fix: 修改分辨率检查逻辑为与判断 * fix: 修改分辨率检查逻辑为与判断 * docs: 调整README中注意事项顺序 * docs: 调整README中注意事项顺序 --- repo/js/ActivitySwitch/READEME.md | 2 +- repo/js/ActivitySwitch/manifest.json | 2 +- repo/js/HolyRelicsUp/README.md | 163 ++ repo/js/HolyRelicsUp/assets/main/exp.jpg | Bin 0 -> 965 bytes .../assets/main/slide_bar_main_down.png | Bin 0 -> 215 bytes .../assets/main/slide_bar_main_up.png | Bin 0 -> 219 bytes repo/js/HolyRelicsUp/assets/main/sort/1.jpg | Bin 0 -> 1158 bytes repo/js/HolyRelicsUp/assets/main/sort/2.jpg | Bin 0 -> 1151 bytes repo/js/HolyRelicsUp/assets/main/sort/3.jpg | Bin 0 -> 1099 bytes repo/js/HolyRelicsUp/assets/main/主界面.png | Bin 0 -> 2323 bytes repo/js/HolyRelicsUp/assets/main/五星.jpg | Bin 0 -> 2084 bytes repo/js/HolyRelicsUp/assets/main/关闭设置.jpg | Bin 0 -> 1089 bytes repo/js/HolyRelicsUp/assets/main/删除键.jpg | Bin 0 -> 970 bytes repo/js/HolyRelicsUp/assets/main/包裹.jpg | Bin 0 -> 1227 bytes repo/js/HolyRelicsUp/assets/main/升序.jpg | Bin 0 -> 1218 bytes repo/js/HolyRelicsUp/assets/main/圣遗物.jpg | Bin 0 -> 1471 bytes .../HolyRelicsUp/assets/main/属性排序规则.jpg | Bin 0 -> 2270 bytes repo/js/HolyRelicsUp/assets/main/已经筛选.jpg | Bin 0 -> 1208 bytes .../assets/main/已选中圣遗物背包.jpg | Bin 0 -> 1623 bytes .../assets/main/开启阶段放入功能.jpg | Bin 0 -> 2844 bytes repo/js/HolyRelicsUp/assets/main/强化.jpg | Bin 0 -> 1605 bytes repo/js/HolyRelicsUp/assets/main/快捷放入.jpg | Bin 0 -> 1970 bytes repo/js/HolyRelicsUp/assets/main/排序.jpg | Bin 0 -> 1037 bytes .../assets/main/排序进度条底部箭头.jpg | Bin 0 -> 663 bytes repo/js/HolyRelicsUp/assets/main/摩拉不足.jpg | Bin 0 -> 2137 bytes .../HolyRelicsUp/assets/main/未选中升序1.jpg | Bin 0 -> 1057 bytes repo/js/HolyRelicsUp/assets/main/点击关闭.jpg | Bin 0 -> 809 bytes repo/js/HolyRelicsUp/assets/main/点击开启.jpg | Bin 0 -> 785 bytes repo/js/HolyRelicsUp/assets/main/确认.jpg | Bin 0 -> 1225 bytes repo/js/HolyRelicsUp/assets/main/祝圣油膏.jpg | Bin 0 -> 14816 bytes repo/js/HolyRelicsUp/assets/main/祝圣精华.jpg | Bin 0 -> 16678 bytes .../HolyRelicsUp/assets/main/等级顺序排序.jpg | Bin 0 -> 1737 bytes repo/js/HolyRelicsUp/assets/main/筛选.jpg | Bin 0 -> 932 bytes .../assets/main/筛选圣遗物套装.jpg | Bin 0 -> 976 bytes .../HolyRelicsUp/assets/main/筛选未满级.jpg | Bin 0 -> 1586 bytes repo/js/HolyRelicsUp/assets/main/背包.jpg | Bin 0 -> 1695 bytes repo/js/HolyRelicsUp/assets/main/设置按键.jpg | Bin 0 -> 1245 bytes repo/js/HolyRelicsUp/assets/main/详情.jpg | Bin 0 -> 1452 bytes .../assets/main/请选择升级材料.jpg | Bin 0 -> 3608 bytes repo/js/HolyRelicsUp/assets/main/返回键.jpg | Bin 0 -> 983 bytes .../assets/main/进入筛选圣遗物界面.jpg | Bin 0 -> 881 bytes repo/js/HolyRelicsUp/assets/main/进度条.jpg | Bin 0 -> 661 bytes .../HolyRelicsUp/assets/main/进度条底部.jpg | Bin 0 -> 669 bytes .../HolyRelicsUp/assets/main/进度条顶部.jpg | Bin 0 -> 749 bytes .../assets/main/进度条顶部箭头.jpg | Bin 0 -> 671 bytes .../assets/main/选择素材条件按键.jpg | Bin 0 -> 777 bytes repo/js/HolyRelicsUp/assets/main/重置.jpg | Bin 0 -> 1255 bytes repo/js/HolyRelicsUp/assets/main/阶段放入.jpg | Bin 0 -> 1926 bytes repo/js/HolyRelicsUp/assets/main/需要摩拉.jpg | Bin 0 -> 1771 bytes repo/js/HolyRelicsUp/main.js | 2453 +++++++++++++++++ repo/js/HolyRelicsUp/manifest.json | 14 + repo/js/HolyRelicsUp/settings.json | 171 ++ 52 files changed, 2803 insertions(+), 2 deletions(-) create mode 100644 repo/js/HolyRelicsUp/README.md create mode 100644 repo/js/HolyRelicsUp/assets/main/exp.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/slide_bar_main_down.png create mode 100644 repo/js/HolyRelicsUp/assets/main/slide_bar_main_up.png create mode 100644 repo/js/HolyRelicsUp/assets/main/sort/1.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/sort/2.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/sort/3.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/主界面.png create mode 100644 repo/js/HolyRelicsUp/assets/main/五星.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/关闭设置.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/删除键.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/包裹.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/升序.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/圣遗物.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/属性排序规则.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/已经筛选.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/已选中圣遗物背包.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/开启阶段放入功能.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/强化.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/快捷放入.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/排序.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/排序进度条底部箭头.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/摩拉不足.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/未选中升序1.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/点击关闭.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/点击开启.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/确认.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/祝圣油膏.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/祝圣精华.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/等级顺序排序.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/筛选.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/筛选圣遗物套装.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/筛选未满级.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/背包.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/设置按键.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/详情.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/请选择升级材料.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/返回键.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/进入筛选圣遗物界面.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/进度条.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/进度条底部.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/进度条顶部.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/进度条顶部箭头.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/选择素材条件按键.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/重置.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/阶段放入.jpg create mode 100644 repo/js/HolyRelicsUp/assets/main/需要摩拉.jpg create mode 100644 repo/js/HolyRelicsUp/main.js create mode 100644 repo/js/HolyRelicsUp/manifest.json create mode 100644 repo/js/HolyRelicsUp/settings.json diff --git a/repo/js/ActivitySwitch/READEME.md b/repo/js/ActivitySwitch/READEME.md index 34f449573..c3941a155 100644 --- a/repo/js/ActivitySwitch/READEME.md +++ b/repo/js/ActivitySwitch/READEME.md @@ -17,5 +17,5 @@ ## 其它 -作者:Kirito520Asuna +作者:云端客 脚本反馈邮箱:doutianmianxia@qq.com \ No newline at end of file diff --git a/repo/js/ActivitySwitch/manifest.json b/repo/js/ActivitySwitch/manifest.json index 479f1418c..8d7be276c 100644 --- a/repo/js/ActivitySwitch/manifest.json +++ b/repo/js/ActivitySwitch/manifest.json @@ -6,7 +6,7 @@ "main": "main.js", "authors": [ { - "name": "Kirito520Asuna", + "name": "云端客", "link": "https://github.com/Kirito520Asuna" } ], diff --git a/repo/js/HolyRelicsUp/README.md b/repo/js/HolyRelicsUp/README.md new file mode 100644 index 000000000..9902301f4 --- /dev/null +++ b/repo/js/HolyRelicsUp/README.md @@ -0,0 +1,163 @@ +# 脚本名称:圣遗物批量强化 + +功能描述:打开背包页面、按照未满级和等级升序排列后对首个圣遗物进行循环强化直到达到你设置的最大等级后继续执行下一个。还可以设置强化多少个圣遗物。 + +## 注意事项 + +1. **分辨率建议**:请尽量确保原神游戏分辨率为1920x1080(尽量在1K下运行)。虽然脚本已兼容其他分辨率,但其他分辨率未经过充分测试。 +2. **筛选问题**:圣遗物筛选时选择“全选”可能导致失败,此问题暂时无法解决。 + +## 核心功能 + +1. **批量强化圣遗物**:支持对圣遗物进行批量强化,自动循环强化直到达到指定等级。 +2. **素材放入方式的选择和自识别**:支持选择素材放入方式(默认:自动识别)。注意:当最大强化等级设置为4、8、16时,强制使用“阶段放入”方式。 +3. **最大强化等级**:可设置强化目标等级(默认:4)。当材料不足时,强化会停止(例如:目标+20,但材料仅够+17,若选择阶段放入,会停在+16)。 +4. **最大圣遗物强化个数**:支持设置需要强化的圣遗物数量。 +5. **属性排序**:支持按属性排序,使用简称,格式使用`|`分隔。支持的简称如下: + +| 简称 | 全称 | 简称 | 全称 | +|:----:|:----:|:---:|:----:| +| % | 百分比 | 物伤 | 物理伤害加成 | +| 生命 | 生命值 | 风伤 | 风元素伤害加成 | +| 防御 | 防御力 | 水伤 | 水元素伤害加成 | +| 攻击 | 攻击力 | 雷伤 | 雷元素伤害加成 | +| 治疗 | 治疗加成 | 岩伤 | 岩元素伤害加成 | +| 精通 | 元素精通 | 草伤 | 草元素伤害加成 | +| 暴率 | 暴击率 | 冰伤 | 冰元素伤害加成 | +| 爆率 | 暴击率 | 火伤 | 火元素伤害加成 | +| 暴伤 | 暴击伤害 | 充能 | 元素充能效率 | +| 爆伤 | 暴击伤害 | ~~无~~ | ~~无~~ | + +**示例**:`生命%` 等价于 `生命值%`,均表示生命值百分比。 +**注意**: +- `生命%|防御%|攻击%|治疗` 只生效前三个(`生命%|防御%|攻击%`)。 +- 重复属性(如 `生命%|生命%|攻击%`)会自动去重,仅保留 `生命%|攻击%`。 +- 顺序为 `1|2|3` + +6. **圣遗物套装筛选**:支持按圣遗物套装筛选(如:`如雷|苍白`),使用模糊匹配,无次数限制。 + +## 配置说明 + +以下为脚本的配置项(基于 `settings.json`),可在脚本运行前调整: + +1. **启用自动进入背包** (`toBag`) + - 类型:复选框 + - 描述:是否自动打开背包页面。 + - 默认:启用 + +2. **启用批量强化** (`enableBatchUp`) + - 类型:复选框 + - 描述:启用批量强化功能。单独使用时,请确保圣遗物背包已筛选为未满级状态。 + - 默认:禁用 + +3. **自动启用放入方式** (`enableInsertionMethod`) + - 类型:复选框 + - 描述:自动选择素材放入方式(快捷放入/阶段放入)。 + - 默认:禁用 + +4. **放入方式** (`insertionMethod`) + - 类型:下拉菜单 + - 描述:选择素材放入方式(默认:自动识别)。当最大强化等级为4、8、16时,强制使用“阶段放入”。 + - 选项:`默认`、`快捷放入`、`阶段放入` + - 默认:`默认` + +5. **选择素材** (`material`) + - 类型:下拉菜单 + - 描述:选择强化使用的素材(默认:自动识别)。**注:此功能存在问题消失太快无法识别,禁用**。 + - 选项:`默认`、`1星素材`、`2星及以下素材`、`3星及以下素材`、`4星及以下素材` + - 默认:`默认` + +6. **最大圣遗物强化个数** (`upMaxCount`) + - 类型:文本输入 + - 描述:设置需要强化的圣遗物数量。 + - 默认:空 + +7. **最大强化等级** (`upMax`) + - 类型:下拉菜单 + - 描述:设置圣遗物强化的目标等级。 + - 选项:`4`、`8`、`16`、`20` + - 默认:`4` + +8. **启用自动排序** (`toSort`) + - 类型:复选框 + - 描述:是否启用自动排序功能。若禁用,以下排序相关配置无效。 + - 默认:启用 + +9. **属性排序** (`sortAttribute`) + - 类型:文本输入 + - 描述:设置排序属性,使用“|”分隔,支持简称(如:`生命%|雷伤|充能`)。 + - 默认:空 + +10. **主排序** (`sortMain`) + - 类型:下拉菜单 + - 描述:设置主排序方式。 + - 选项:`升序`、`降序` + - 默认:`升序` + +11. **辅助排序** (`sortAuxiliary`) + - 类型:下拉菜单 + - 描述:设置辅助排序方式。 + - 选项:`等级顺序`、`品质顺序` + - 默认:`等级顺序` + +12. **启用筛选圣遗物开关** (`toSift`) + - 类型:复选框 + - 描述:是否启用圣遗物筛选功能。若禁用,以下筛选相关配置无效。 + - 默认:启用 + +13. **圣遗物筛选** (`suit`) + - 类型:文本输入 + - 描述:按圣遗物套装筛选,使用`|`分隔,支持模糊匹配(如:`如雷|苍白`)。 + - 默认:空 + +14. **筛选圣遗物界面最大翻页次数** (`countMaxByHoly`) + - 类型:下拉菜单 + - 描述:设置筛选圣遗物时的最大翻页次数。 + - 选项:`1`、`2`、`3`、`4`、`5`、`6`、`7`、`8` + - 默认:`4` + +15. **圣遗物筛选:锁定状态(标记)** (`holyRelicsLockMark`) + - 类型:复选框 + - 描述:筛选带有标记的圣遗物。 + - 默认:禁用 + +16. **圣遗物筛选:仅锁定** (`holyRelicsLockY`) + - 类型:复选框 + - 描述:筛选已锁定的圣遗物。 + - 默认:禁用 + +17. **圣遗物筛选:未锁定** (`holyRelicsLockN`) + - 类型:复选框 + - 描述:筛选未锁定的圣遗物。 + - 默认:禁用 + +18. **圣遗物筛选:已装备** (`holyRelicsEquipY`) + - 类型:复选框 + - 描述:筛选已装备的圣遗物。 + - 默认:禁用 + +19. **圣遗物筛选:未装备** (`holyRelicsEquipN`) + - 类型:复选框 + - 描述:筛选未装备的圣遗物。 + - 默认:禁用 + +20. **圣遗物筛选:来源(祝圣之霜定义)** (`holyRelicsSourceFrostSaint`) + - 类型:复选框 + - 描述:筛选来源为“祝圣之霜定义”的圣遗物。 + - 默认:禁用 + +21. **打开背包按键** (`knapsackKey`) + - 类型:文本输入 + - 描述:设置打开背包的快捷键。 + - 默认:`B` + +22. **日志开关** (`log_off`) + - 类型:复选框 + - 描述:启用日志记录,用于开发者调试。 + - 默认:禁用 + + +## 其他 + +- **作者**:云端客 +- **脚本反馈邮箱**:doutianmianxia@qq.com \ No newline at end of file diff --git a/repo/js/HolyRelicsUp/assets/main/exp.jpg b/repo/js/HolyRelicsUp/assets/main/exp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d67574d91be963429b8622a8993e377d1ba63465 GIT binary patch literal 965 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydCA`A-5jDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>*~mxnwovL)%0E4wejG}n5fu0QCpWDy7^h5XOhQPnNM2RI8AO< z3%*smoOR^dud>yJrLwE`E;_FwS9k1$*1kU!vpr9t7>lS7tFs<1Nc_m6(|J9@tEZk~A+>z(?4Z^>Eb^X*(-R;;?*37G+)&JzX7P)C>XrdVcY24>87G}PXp zkF|;c+;JRhnN0%(b!rRWU*AOWJG_>l$S2tiRgf%BDe~iA;*exiWr;j)cUIwox~hKW zK2F)LH;Ak7MYz@t^B|0bGzjw0a zZb?&3HdDUqS+hPdClcM;z~2 zS5NCuU^;4|o~in3itE`mTvICz6U!rt_sL{fv|ndsTYWsiCSm8i>8rQgepqEK)W+C! zeA{KS+kd&9$3zBf3Ox31$3i)l8xJ*<^NwAum#_LeWrbv*@w3@~N>-`=XV}9ywMpGy TI!<;r(6tPnu6{1-oD!M<7ED%V literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/sort/1.jpg b/repo/js/HolyRelicsUp/assets/main/sort/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..560db58f976ee33fdd1c5d3ccffebee091a58b9d GIT binary patch literal 1158 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydCt_+6EjDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>mT2(mw)cVxsoA(x#q|{;etEWA)k-Wp7yKj)i>D?1E4}hm_`G&B`n2mpWH%KG-@5z ztU46jyI5OT<<_P$BOPYFm0NFYlw`Ty*ccRX+Vk$K!odAouiRe0#QG4>qPFY*Y_EU( zS8`z11XhOR$o~u{68Ei*w{88;P*-o}Zzu9xLoa=`*VR75+1{&KLj7u>Vuee}<1H)%phC<^cne z+fM%%WBrqx{}~=-e2YtbYt#HstS0^o(|?AOoBuN$x%g(!;aipLe{_EAf5G~nVRHI^ lhR($|E8Dkx;{Or(vHk-0e+ISl{~3hcH+|;Md{Y1aCIA&9)RzDN literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/sort/2.jpg b/repo/js/HolyRelicsUp/assets/main/sort/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c98840e0cc1bfdd3a5b1e02943b334d2d729b85e GIT binary patch literal 1151 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydCjtnNujDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>+4_IKIOF8S@XZx?ootTaiy@YJ`;+7fWkfi7SWVz9f)|NTFMvjh9B lh5!CDyvShq9b$j~FE4|9R{QV&3=0={5z$0q;) literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/sort/3.jpg b/repo/js/HolyRelicsUp/assets/main/sort/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9429573024d11d2fac8bfe4b2a5d9c3964000d52 GIT binary patch literal 1099 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydC_6+*WjDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>7?Ch{_pm|4(vA*|2=<|!SGwh{?1=t2Km(X-}6^4V1BdVKSS|X6Nae&499o< zvp?6MwuI4vl|h6dfW>V8$9MbtKQCjs(y+X|CUI(Fm%Wkmtv!GI3@^=E&RS{AHMKHc zD?G(La2|VLDMP^BgKOmMwrZ-ziTU*BYV5C-VrUC+SNNoT&DXS~RM&MGvU%%O1XX%V zpH7?To_uX*R^W0@t8aTI&RHn(^XZu!q}UjI*31OK-9Kc50U5Wx8D@_z=K{U2X3*xjmsKK-Aq1N&|NKc9fnvV!^l FO#oa*t!n@P literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/主界面.png b/repo/js/HolyRelicsUp/assets/main/主界面.png new file mode 100644 index 0000000000000000000000000000000000000000..94c6172f52808ec6da7ed24af87012479b0b4b0a GIT binary patch literal 2323 zcmV+u3GDWXP)iS%?h{}lT zQmkFA)z!M9w15gIK|_$2ya@?Liae6=ObGG2_xE!}^5Yd~KQm`Cb6>yjy*c-sdsrAF z;-(g8E&URo&a=ZWxjejM4q%Y;;1*8r{2bDPB(&zAL*~UDh*)oei&24StgXd6m5Mf1 zUmtBsg#t>s0xaf2qfsLiW9p&}(6Qt|cbOXm4UNnpYTW5a+oNhqpVR zuA&INy$ZVjqp83|h4{{>Rw#w6_9A0J{0@h|O{v+~BGb%7|W z6fu_=m40!=G!n)yt0qqF4xMG2F>kdmEyRcjneVg{#?B!yUbhRz>vzG>DG0Vc5fC-L zWiBx$G!mAP!^1RFXG~>p!0Z)XSggxp%R2AakgLEhqy#u?3B|WDAQo=h$Od^qDTUZP@{(Eu!Y%*lB z_JQ5Qvgb$=EXd95k-tyOzXxi0)c+S(*^;2R1mg>cAC&EpT=grc_>Jw0+} z^Qa6GMlF<)l?6rjuaL`Lqg^US>bKVr92SkH=HV~J6A~)^o0-RKMs2+a(WlN2yQ$&m z7bcU*h{G%B1qzEwAS9=z?0SQqW&u>aZMc-2f}A|flkx|sxM=0N75V&PX4i=H3*)~m z2KU)B6c)Thd9@JNuHQuwFCV?K2K2Uzk(ZN2$GNdWZ8YKB6*zGMm|Y{nx_LJpon75% zCc&}wO*OG9@VSq`&CMjg+34$TL?1c1iefJArDZYaYeYV|KofMAz}au_i0&{D)?_0a zSi5XP>W#Z7Dd0jyM4+28F;wzqhy)dAsIP#qijTDPM`QLC3V}$B*=&3K)o?k?tkxkZ z^(JH;oy=isuqNn#fobNe@rMa>aqFj_P+ne$<`yBj1kK2O!G)Dm09m*eb>)0KCV%yK zpiarydLyQ@9S{(46x!t1V5u`MT>c&v)dEtO3{LzkO4JPY8d?~SUqB1<4?hk^PB2!w z1fsCCh?G-Js497m7ez(P`5MtqPG{w&0L)nIgne;m=oiQfehKbpBqO+oMA5WW02Ac43X* z*D!Go!a|o|Xj^)qsJwTCv=`xHg5 zDw%VJrI*AfJC9x96}?hx7mAx;L;|(h#=XS$L7Rl5oY90)Cq@Y~TIPs}x{Gn;Y6|th z!lSHo{QEy?qgG7=5sH7sY<&wn$Wadm1w`n4=TMltQT1myDgXSzBh}VOux7AVW4gI5 zbV&4{W$A-Y7P#WjiFo{QFM~L(X7BzF+Jg<9!gbR``+fZ6EGrMYnA#vx)$Ud?G6Q=(7$7@wKuud tF0k-A3L}>Yq~|`T9{tSkj!F-){{eg$|8ZWO>bU>_002ovPDHLkV1nYwY6JiP literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/五星.jpg b/repo/js/HolyRelicsUp/assets/main/五星.jpg new file mode 100644 index 0000000000000000000000000000000000000000..33a251e8fa70c95122b30ee7befcdabe1d37013b GIT binary patch literal 2084 zcmbW%c~sKr8VB(ACm@REl8{*55fKZwirgjF3I)prGuLZ@l1qgfYT9i=bI3@YL~+ZS zOek<%a>tTemXx-NT4UCfiI!Q@Vzk-fWoGV~bN{^ee&6%H|2)ro&igs$FS1s1;nQ-2nlmBHY!5^&61To^k!jgiS=E#3!(0EI;AAhl6CIy!nNl%4_B z$Y9A5gTG;x8Dp(1tO9bJ^3 z5zvBQFfBL?fq=s`o%=O405?V~wIum!n}jlu_;mET{IYr-E5EjW3|;w};KvTihlr=7Pd8fTSR13bbJD9XJS%vN+u^OJ7;fh-oe5j zc!!D(^9AJy8iCr@Xe&Apj_tA6+X!^ckx5P<#3(VTyR{==hzLt1b+437NW18L=GHq01~uq0_O z^$kTb(oOK|@^#RDW%X_Sx>k<#*BEAo619xr^w|2%@1#FO{~f5{{}TNL`pdI80rX*z z=EGpdz#FvkCq2Q*_?oDgU0R}Syx8f^u!Ive6^ zI{>U`-3dF%QzuS|^Q+aveTjo%RZKUpJN?B2SA;I*A8JHa*-3kU49YG`wJh$Y5GEXp zIo?l4WbF@V)RA(vlk_{uMa8}dl70yMeRp}>=C+N6)AQ+Yv-^``S>lz zh$FovO|BRpBD@YNr*`(3DU&8rtCFo^DI0=ZgzJqiJY9%5R5I{(E6s4zr`jtXDa>E* zT~8$Y%+Lv`tGmiSFZzmCDJ*MY8%4Kstnde@fF&9nvHQo=tHJ$jAZ`?ze zF7ey@0|W*=M`^aLYDschhpnBe@$9WldEw7&&!)4lq-W=Ne72Ld?io;~c^KtM)vZ;{ zl&y)^tr{JiIgw2~)-I2VY~?Xdcy4u$nT}_$JP*6xzR@e^)R)1!=K7oU#JS66VP$1y zacY5}W37kWF|>5S9-(V%Sc43fyl*|GV2CNvb2Un{Sb3}%e0qzG$aQZoe%bXTW%PL7{B*?F z+!l)MbY*RqShc(4+67j6!S}-ByRD;b=c5fAH_x<88OLqGn%fs6N1fFi>zlMSgHHq< zc*Sn3hT#+BJq|N9m+S(9B0r;Eljg$hB#OU}&z=#nudjW+EsPew6#bN!&OLBj&RCC0 z@~^3vDyk=5>~nTW{WRP7XmlY$T6InBaIa?UWATfKT2ZB1Kfby z$cN?Bmzrru9K;p)nir6_cGh-ajB8bb?Nv0}chEeb77y7|I6?9*=0cych5N3l7eOCjbBd literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/关闭设置.jpg b/repo/js/HolyRelicsUp/assets/main/关闭设置.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13c6d47355da9c0eb57e3f13997c5dc07238284b GIT binary patch literal 1089 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydCS`1pujDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>aQx8G0@=tH)l_{mPv-vFo@_vXb-PtjF3y zSI==*AKfc@g1x!<;Mz0inh*W55zonco?6@9@%OK9x@EM}qP`Ov5)TS5Z8Q;^AX4fZ zWUFWKWTLnBwtH4xTcta9%go#Th|`qK>_e&o`^T(nh8y|9<(F54WuF$C7xrmp`@8G1 zbz3ZNHg(Qt`94eb=Yz!y4{N?Sv~sD6Zs4^WKPGX%?ojZ!8Rt-*zQDA*wL56%)_}mX zKX$53e{+&2S53N*%Q)&lr^K(Y>Gt1RjQo?eU8Hq)NNxL~s=No7upWf5wOc+~Ew<~^ zEbg#Lj^F3H=X+h^J91KDR_xZR+g9hC&DYY}uR3j=uZil;`{9-gl4dkDa4~2|Bm^-m I;QxOU0HVOCSO5S3 literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/删除键.jpg b/repo/js/HolyRelicsUp/assets/main/删除键.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2002d63db6eeed471bb0134ce4ac381bf76ec31c GIT binary patch literal 970 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydC@(jw%jDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>D_8D6{FZm=} zAAGd(6n~-0#T!3D|M=uDle%tD8Lw&a`=w$LH0Z9r*gRW z{^YAM{JShK{qw#{Nyk3-BuKs4zc*QLy1xI?j;(L?j>N`Dyw`m^@!aPL(U!-b2A^G= znCmzH0N2IXY_VtVrCp(+_iq0CnjXHe@Ksr9XG*#J$G7^w+kXbMRPwq1QBX)pe|x{Z2QLpECW+&$@5> q#OJ)=!|^uucA+P=8`sTxuu>;D&v1V6>&SC8M^%%nMOo$l-vj_{frKLf literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/包裹.jpg b/repo/js/HolyRelicsUp/assets/main/包裹.jpg new file mode 100644 index 0000000000000000000000000000000000000000..40764b1b2db675019918edbfaf1177815a3b2b11 GIT binary patch literal 1227 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 VTS7ANgA`(()~y3IWL++E@ptms7XAPL literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/已经筛选.jpg b/repo/js/HolyRelicsUp/assets/main/已经筛选.jpg new file mode 100644 index 0000000000000000000000000000000000000000..918050c5f8f18769569f6da82684b4d2fc105f88 GIT binary patch literal 1208 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydC(hO$IjDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>#x0@CVOq4 zTV(Q|7AjA(Wpzm|Pm1hKeRR@hx%X{Ln;ZV`yLedS9&IW4&GlI4Ph|14H@i1Xn0fAX zsp~=QA72+_Jo&pTHAJH&)@FPqo{Hug8f;1RME0)2a6Ykg*&_|T4Th&V$HFn zAFI+fZ{EJAHTb+|(`uu(0}9V2e{t=q+RZs5w_uY0D$}QrU0Cl=TO(YltmE|8LVjvy z?iwYIugbP}7QGLinY2A2aq>x)zqKnr-OOls@m2fuZ(Tm=-Qiu2O#4gL8(1b3HZlCV z7U+5EOq$7L@65ber!&hwxvF?Ds<)mG5Z|tHZQB0bg#sDx%Xz;ZU6i@)^H~kyx5eK> z8r&DKe)XG#yvBUz?~lS<`h(REqntr@UL9q?DM>T=0q^>!_5mk*NQp8-AA?fN8 z6?2(OsHrGwsV&SoMY*nXv_#6WqdKo%=g)J_=Xrgff1c-$=l%LhUr1j9iY`tBCjbNi z09+|Rx(uw_O^zT(kr?FQje+qS_eX@$NOT5SIt-)%NH`n;hanLNggg={k5W}cDJY=S zl~vHH+M2pL7)^|p-X=>EJ*+ua3$w-E)Z7YhV`HOh>_~9f?rgck1`i_T4pVcu7j7pJ1s;pC8|AVfc zz5&+I++v$0&dS=sahKC>XM)TA0|!05ybt*V1(PWup<&^4Ms!SUTzo=mTKb8MlczG7 zdHDr}taC-|i4!~DX>#ZMpr`Nmo4-$4KHtiVATC=>#PfAN4au`3UPhRSN0!q(V(z)6ux zn61YVYj@_B-|CXnHY3g|2S)LcDmvz`bl-g;eHHyXP|E)jeFuH_NQZz`5OC$gAZWlA z7&D(VGB!?&ZK4P;wgRZhW72WAy;m-BP3sd%Vdby<^<5>)gV%dh^U10{g`P|Hn44K) z4?~yrvP*(mbu+ryjCt6f(HXu!nT-=7_5}%H_gxDu3K40ppnBJYi77o zO?H`SqZf}{O3)V8;Dl!l#}m>jdp~I-r-!I`R#UTsS_Q55nCH~h+A~98gDmqI`D1-= zBP+TnC!G>IT{SO2*ry0J1$VGJ2492<1u#+Qd~!^k*TOGuRk;-!#avA{YT;#aa%?$& zy-9jFQP7}{=dHpd1yWaU9urIM=8JIC9fGP7vU`AU9@Z)8aL6RvGml=~SQKl{LcNYR z^HtMYBv?JRy%I*GdyG5oG>xjaHnP!e;IyD!W`~FT+V)6(Q|;O~n>?l7SsRaUNE#9! z=Ir4YjdyS*p59MAG!mPS4x&UKI^B~S5T2GNN_~7i@&(ke5+(Mo_jUBHu z59;uuZ;nXh{?7ar6-RdSKFh-`$%Z@}=zT-ih#w7V<*_D~i_wc-NhZhD>OU6gXNdop zxcz=^N-LZC^SSljVE^u9&cS>lrzK4(V)E@=yv4J2ea|)yH7VodAiebrL(^xpqH=h| zr_^+!qpjCcbGD$DysQ0|q$CIS`t!Bfx$1y!MsP=%=>F_T%2Z3+f>227)?hp5z(n3T zcHKuj{rDc4qW+R2n{J!atzBuRG&K?H-B_H-!fxGgdb^>XCDk#+lV3jI);} z4t~~;My+$P(0au0FHXCjH9{HPKZ>8hkx%e-9I3^1$j6F4Kb{x#SAc&9!~=%#^6^6j1cgKZ9uOGJ z0|E2$LLmE_(fcz1BFZbKtZ&IDe%_N`B}Bp?HlqZpdaCY~q{G-ZHAAn^I|71Ihoog> z)in-l9ytm}7#Sl?j$56!Mxkvmwig_ooLyYq+`WD9zJ6B-{$b(QBZxO5qwdDV-@BiX zn3S27os*mQFu&kQY1z|qQpL09^$nCpYEyGdYgczqZ(skw;1F$`KEe2nIXN}={=-Mk z{HM=f7M535zpt%t{Mg(A0pPzm`~7dwe|YxcARY(=4B`LN1L7g>Kd>l-S6QD=%_@3x@4>&N67C8*G@$#=$iCrD_TQ4sz<=JBI0W7CIK(^ANt5xO?(&ZS=*39m1 z%?}zU`hK_@L=Pfj`BBtHa4LRBHn8-fN04ZZLuCQM=xc17m^-^SGEkvMxYdNuade_6 z)-*AU80ZUXDMng_>%8=hD`e`V=WeX$U3H$CKa!M^{s5*)Aa{Mqa9g0dY=~P1>P0Fc zLmp(a-6s;^!{ThKK*fBsL9v)fCTNR>X}{-~)+37>8dKlV9(wxVAOPF^;xw$&)vA%^ zLE{7`#(;d00CN6;3sWb#-lh&kGwG@rL~?Be*JV?yN!QksO-^TgtPXiVpfF~O`X(2s z?r~Y_Rqwn{vV3M!WMu<_&vNc%{nS;4hx|tAFC4=Cu=^xOBtGZld0vzStuo3k53|of z3_aAVbj`?(sxsc6HQjH!E=WzK*0XV#4x?EkeQbHr!`!ll5rr4J@Hb*`8DH~w0S{;( zLe6gSQX}rnPuk*bknqJ`qk@RbMLm=W?Q3N0NP8FMD9i3~Hu%Trd&cbo{I8ZW@<}Jp z(W}01f2L`DOr1E(frX3+G}gk4KOLGYGPG;!q&qAjCsorEx{dS5`yaQmo=Hl8Ebu*X@_&7Em3v+LmCLoka4N-x6=;&%!l8(r>b50qck8iPnFA};2KsMHo|Tie49b_1nqmU5Qm$oV zmz#`5p){L;!Nc_Ra`H%X5x4H=J-{}puiq|{W=bG6UG~#&y?3p@9ii0}g78VbB=PQ& zFwZfRP+}G9_Gsnx!6j>JcuSRIO~AwTnrmfDxk79d2JhKU7KvV0Eg>tg8cqk&p8=iY zlz^LySnTM#k;YP|U0t%VpBAFlKWFT7YxIjT*IvojeFUC4cG`=8{DtpEIQdIy$0%I$ zKxZ05vsz)eLFKm19351O8YYZhdP10U_NPY+}Q&!{AqMkiBZZ4G|ba=z>Lg z%%iLkYjb>rBgNTZ=lB+vzVan_0dtjl1*xa?i)0wbo%wLaYyQQq%INn!fNE4H-yMAM z$)pQeb7gR3E~S6<8ICP%{x`~1bN8*9_F zX|@TaExmZV_bp*ly*N9$8)m_|i()Ehzxx1S*p%hS3Ksj3LOza^>sfX)A2rfr8+O@j zy0sfRX|2pW)4KW7{m2U3m-V!eFs0L$Go7{7;e`>1D0xPH+3FkSDm{2+4Dq@p9gX(&SjMmPmk*Mv#D~r4J}6ae z_wuvy#ukSt*H4@_y7ny%IIB|mU_poDN$SNxvt_1p;$hP#I`pe<%aV1q-+UkYu=TD( zZmvD$kEEJtohGKdx+sSMM_5%Gt!=kIbC`}>M|sI~&Z*TKG|tb;DH5^D@(i)M8 zjI^_p$pmE?-ZkiqN6Sx@5iN&^qBmDs+V=)=rmb!;-c;#g)ep*Ck3ifJ)@1&>;j zbHp`bh3pS(gbiO;6V0|#{!+X{EG?{ceYyugeT(Z&`^|@BVDg*!+MUyHpSn=IIHY#}_d3$7u=#F{H(T+X|C1>uR>O|qpKDb2Qh~G52et{FDH2`~kU%Aa{mB(Y++(0_)6>cO$vd~*gVk`9eQK2c=seMBl)HwfVlIBb5x^B^!nn2u z9KLER-TTVTjJylQ^O1t!dW{oDKhYkW=iJT1<#>O?SD7+|Pi;xFGrcjvokNc)(eXn; XQ!H!00EHJ?RAe7e#cFFo?@j&-HDopC literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/强化.jpg b/repo/js/HolyRelicsUp/assets/main/强化.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b583b211005b1d8273503dd396e99368c5eefc1e GIT binary patch literal 1605 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 b`J8I~So2a`Hg_JPz~)Md*!(OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydCatzAMjDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>%x4D0=;G41L5&)_$yvgC!z&e+XHOphfF zu95pCr7V3kDz@uK-LD5xPO3NO{$_jgqA7_^_xf!&4wr6EpVheS zSD0?(jVTlo2I{ixGa-dZW+ant&&rRV8F)g>1m)2gRJviSm>#mc8q1 vYN^XS6=>Zd?uY*wetxn4e$_rx;i=o#y?e^8y<~CDax++bAuM-F{r{T)5P_T% literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/排序进度条底部箭头.jpg b/repo/js/HolyRelicsUp/assets/main/排序进度条底部箭头.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52f58289a9a39e0dbfec6cd1155ffded7df2353f GIT binary patch literal 663 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydC91J|njDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>v0G!k7ga>=_;}u22cs%)7Mm b)c3Wr*N#;Qo-|1NDHvMKyJ(hU@&B6uha%o~ literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/摩拉不足.jpg b/repo/js/HolyRelicsUp/assets/main/摩拉不足.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4bf1b0edfdefdb5843bebf78227e2b3afc204be2 GIT binary patch literal 2137 zcmbW%XHb*b8VB(AB_YHh2ucK5Y7$yjTB2t&W3kWDBQUnDe z3?SVob_t*Y(n27pfD~a3(jp3Ma#{Dz&Yihm?%n^H^E@BUnK|b-XXfx({AobU&dSyb z06_o%_Xfb{0g~1M7Xre4A_M#td}9<&Um%D2L_`Mg*+2?_5E6n5!4PmbTo{267L^hc z6%i4YMIIKHLdz>*Q1U26090J?prVF3>=4062o)xwnUq%vM_V*MMLG|yVzhk2llLJG zOG+J)R#H|`Rl{oQ=<4Yk7+T`+R@OGQcBfs=xDrWj?tcCOfkEfU!4Z)cqoOaxT>d#F zH7z|OGb_K~+V#Ss;u31rt=rW#wX{2REv;?s9i8{+_n$p~(aq@T?Rz;qGCIZ_XH87b z%zl`gUs(LOw7j;yvB~|i_4V5}2tfYi?A1R(|KZt#g91<}1S<502Na0jn-FoRprQus zpgBRvC+rYPGYKwXkyqLLbRSyFc@^m!K7=@o(VkIS`-Ajd^uK|U|CZ=4&|e<@B(NU> z?mZYp954kowx?dJ3UF4kX-mx2!I+?<;!eDV($KejpaC<&iaJ+qkAEP7TU4 z_WK<}dvYXhoD8*_zf_e^c2>FM21VKi8ZJMCa-4t|#ow4Fl`Se4yNk4_u)FxwWuj>3C^;!HaEQ z!!+0Xzao9ETFsnRFJ>;*YnF659lH?%%a+l=wqgpqYZMy8kDD=Ukb}bu5A8PIFH@R& zD*JSkKbrVwbLNgp$bg+udKAodD0#wt_QAtnAIru}#+OB0=)sZZ@#{mBiDOd!0>skL z1Up)AH_ChOG*8!&eoFj^*DJ*DRR>exbp1t{VH(SVA(E3mv4p!vtIKT$g$Gc}R%yZaw{#)s=R_Q~iM$V_2}FobT;Vp_j*Vxatx1`OjvD zU+T{(6lUq}KOXTmw>tP{0bSIgOyyZew58)?1!CE<7Y zxCN`Ps7p0<*R48<5185{psCJZNzBDs?_j;KuZ2tJXNuuRpf&G$`ZvN86FFUST2GM4 zc9T?ZXPbt0SWBG6$yXmxFG)YKT%6kODoJ9>N;u_ZOXOJa^`&uF`r-4+EnWFP7NVuI zTk0&>q5E+%KQm%5u2*q=)W@RQ9NmFQH%`0G1Nyxr>2qho=D5@AF#~u9s|kWl<#d09 z!>Ep|B`&A$==sl8FOH|H_d5T8;VQ-Ofy9wgccO$l%L&4+5LuGuHAUStu9pIgCk%7D zv$9k^YbP5j4+y+__u1u<82iPRq*k+$i+{7R1EtC;w(M>5NW2WI_2tmJe{R&AXg45% zpPWJ#;!BzC{of>SI~H_5LUq1b*&KV+nln4RZs1pe6;}ObcsVCV_Uk4sB_tN9;+MK+ znu2ccxQE>GNx!pC!P$L zbEs#eEi>t>e86+`qC*5Bd70-yL)mvP`0cQSl9mY0Y8d^F3FN!EER^z_3V2!389>`W-;i?_kyc+nRv_Q+d5B^l&i#6>Ns>L~(|0--lmhz=ZG<*76 zbyr8GQqT|Tr%wfG2Ba%)Jg9M!yG|t*rv9UMn(K`u1xIOml!@KS+o8*C+n#7$24~v| z=!aUks(Q(k5FxIG2EBjI&Ei zgXD|Q!!>rUt(LA+3o9p%_~^WD$(16XH7e|(cKP#xhs1%ML$4Mh+!sn<1@Y=PN6(Ie hW(<<3%b{|u0-l4X*N{4?zfSD??OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydCDh&3_jDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>|v5hG`X zSCce@?3o?-{O>wHs~48h-)f+!GI>%_hJd!HB|BS#>U6$t4GHzOUl)wDSjy|zGW7J{ zuF12pWn|?v4|4Iecp@`TTk>u7EcXi=i&wrDw=-$>%iy}wDw(VZbcaSG#w?VXoSyZ$?Kac%F4sqVMb)6Pti`}0jy zW_x++=ggGUO!3ppUVYoXuJsxx^Hlc9UCY+3@hVI07s}RNpB;36iJEEwLr{^MrfXzG W?%kQCF0BkA48Ry*1ySt(Zvp^s>WR$& literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/点击关闭.jpg b/repo/js/HolyRelicsUp/assets/main/点击关闭.jpg new file mode 100644 index 0000000000000000000000000000000000000000..951313e00e8c61183db4aca332f4a2f04f31f28c GIT binary patch literal 809 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydCLJVTejDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>Cg4~?{44nVkIxMdAYu{yAFJ8DUYUTM9{!-q|$Cb1f%B<#Tb}Fl4 bmgmV7(U`bsk;Z{g38uDpM>LlN{=W$TNGm3f literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/点击开启.jpg b/repo/js/HolyRelicsUp/assets/main/点击开启.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9739bb244a55f9b63e617f461bd2c5dfa7a5409d GIT binary patch literal 785 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydCA`BwTjDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>7ObwaVu;Bel(~VOXvgPlopBkf|>p6A(LeZ~> z+$DQfq$OVX_I>3_m8tEb{IBX7r-jKalU-HHQI=vMeC-O?qcT@7 z7F(n2EPX;Hg?0MEC68wBc=t`_#U@2}N%pN~lf#ny4!H_BH3}qf33)~`m)rlp2>?B* B7V-c9 literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/确认.jpg b/repo/js/HolyRelicsUp/assets/main/确认.jpg new file mode 100644 index 0000000000000000000000000000000000000000..07334c01ea78808ac15e5c68face9764d6216894 GIT binary patch literal 1225 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 Pz5O}PnUXYo{_%eS?5WEA literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/祝圣精华.jpg b/repo/js/HolyRelicsUp/assets/main/祝圣精华.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d946fb62e7c3f6a30366e0c1abde5ec58063509b GIT binary patch literal 16678 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 literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/筛选未满级.jpg b/repo/js/HolyRelicsUp/assets/main/筛选未满级.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aae8e2cfa16123c244e0c816e27d081c6b91c633 GIT binary patch literal 1586 zcmbW!c{tR090%~*zb<9V!O(1>;A7^#)BltRWa@kk-m z)4D2@P0lu2#x*gM`$~@^QFP2swNKCfxx4Sr^Zoww{rvHHeZG7Se;U9!*ivl)5Ci~F zPyqikAZfoNf2ECwr&!^xYe z6V%QAbNG(|JPMEpBA_51fZ#zW9^`j{6@ua6;MV|u2ZTUja0C)1gcimD5D*H5z@TtA z3?}GI7Q6v4JX}mk*9swi#2-nBlF&=Zy^d10uJ4d^8`@CO4~RY|gqD()*(a;2c2HeI zlW1UQWNczeIb>sNXHRu-KYGl=^SGCHU=S@hB=iJ5CiYZZd_p24H7z|OGwb|?y!@*L z%)+ALl8PHQE32w+)zmgLHZ|Y7|DdJyNoQAgPjBDTKiI<~qhsTo7ZWqHbMp&}OUo;- zHs5T$-QIckes>Q9px-!x`y1#V9swMLz+g}q@{0$A#0w4-4}&Y|BE+nYApN7n33@3g z3G3YJ^&LXW`feMN0ntNfDHY<3>gE^HSJA%%o%>&+@1XA<{sbTb1qB}l#RHbW^z21L zuN*w1gxeSOV6uyjOV$eo#4~4)iIB)0<%nmBOk3>HHyFT_oOpBQJF_YeCKT8Jjeew~c6bopP-iV^xE z+h`t38wPah>%&gc+8@nm$u}s8VRht2M0bBoX_+hOQ@2iV>20Y&?pf#x#irpJeW$`p zwX;9?6E}4zVb%TldcALLx2W`cPnV%Jl`w4wE`g96u2Ot8f2!IcGCwJ;BG=Dpqu)It z!pVBxF(M?K>DoO;;m)yH%zI+qzRe-iJUu7q2agY4d4sl-YLt^M%-xl-eAc5p?6I(d zhm@Hx1;xWn?e|Az7j!1)G1$)g3XI{4thnEdU&wE5hRY~+Q4NBw41#3w5W`dw3-YT{ zIhN(zu+cd|Sy~;BEoYqoY!T0D?ewxYY)vTMyn4aZp`X1$(jotZX2Oz7~HIOjR5s2;nYlLzQ@&dXF?}Xn3hmU@=0w%Lvazx`l2u_b zziq&B%cb`%ubF$@vYM_V`TS|ynm4^h87j1l-(Mh~UDCZ}=DT<*aE2H6(#e+XUo{2i zsoqYVzrqI^>=@1cO+jWP=bV86Ht{TmgLGFNm>5tKb>;&zuG`@S4TnnZUeda4@FCkN zd&ei5ZC@F`ukvvZNq5ycl|H=?tbcq&?a>CD$J=g_YV_^9nHV8jq~FndN66cQJk=WT zr1j{AkC$&k#@-H9Leq!xh9G7t=4@O$o+RwNIGv!y2O6smZ#S`tIh$IJTUu5!4RJ&>O=$Z!S8 Im-#RL0#$FSIRF3v literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/背包.jpg b/repo/js/HolyRelicsUp/assets/main/背包.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ccb1ec41733cff7bab7c0923c7348d15e18f790b GIT binary patch literal 1695 zcmbW%dpy%?90%~{x8G*7MW&IiuFK}qVbqMM8C$C;w~AE9m^Ko*OgNoGL@iz1yGR+9 zr70qGk1puAhL9AiP;snC7tYSA^Xhf}Jm-9#*YiAoJkKA``*~j9N71c#4m8#<*-QXI z06@wH6n}!bEbcCDxL+hUK#von=dp_)<`)skRXhPn0ES}80 zi?p=yI)=JLBLiIn{UxTI*eA z7TS>vNOu1@irWB>0c!vghVTG^hhRLUxC@Dthetu*0{#w!fRQK_G)5JR(*Otvh7m{@ zg+d~gJNGKr01}VV)VHLo%yIKW8|)@f64LT9hK^--wA|aqjjTA~`&6;ob9Ls;CoVB2 zkxi_ZEvMShY#C0@Ox9}l8V^sejhi-m`}hZN19$NFK@pKrg6KUlv586hlT!{H6sBin zW@YCbKXFo2P*@~BS1dVSez~IZN>z2u)!Mqd_wGNaZ)j|P)X~}XxVxu!U{Lnr<*T9L zk=OEf?* z`q(<<4KG{KKBnzVA2_VxFd(L%nF^Y@@a0gt{h^R^-WHHl|K|djq;5hh>JvC`Wzipn znsE>GIO52?UO-QlxM_a6>(m?}PkzPyNPVp2UhJ?;^Ee8G?y<$OD~J2X0#co*XCva9 zdTZor#XP=?>Fe0@&8d_{n8{hD56e2pCss9Z;h6#F`1oz7zcg|XVY>DTP+O9@$xPKV zb>FS2R>`IN6~hH)!v!6eM7Lv%h0;;;%1<}%QPvX9(7MA3d7>LWYSlsEE=2QL!oCC& ze0JRRjCTGY%6m|gHDB9=wYan8Kt`&ywYapoEm8qy*In?X8!c}rH?rHBg3NB&URzyr z-bNhC>kF`D9+hl=`T%&nyYklJ7URgx)BKudvaheCyeG%&*l%14MEWwd#etz)yof4z zAamnQGahqF__j+=ou`LV^1Tf?>ss=dv>|!PP_C#~OLSa*j%W48t&XsKY!>lS5v7)H1KEL@0+YwfSzF6s6M?cVJ5B6cl=@sGexp3A&mRUE7reX zRJol`uwi6fE-sB=WXh?@Ilf(^4b_%`2pivtl`~n9?b5e{6IQvj6Do-V&TYT27VIr< zbTWGuy*TmnBgvM$1z3xhX=!p3y=8~^XgR&*Rq#&3DQ~SR8g%llrFOjSvy_ubg5C>P z$~A8B)@Nq)2};*_ZaLf}vELazH9zD=Q+;*F2x;r7G-0~EX#%^*UvSWTr>LUezt4w} z9mru9zUU@$V$-t5cKTh5jG>l@1?85=9a8rU#~@iq#hWUI6u|s`WZvcy_!#{T!5ZyX82o50 z=ipMQS$HWO^+kr9_YDHQ}<=H+*C(>EI0 zZ9hA0LT-0?Dk?Ik(kN>+*+zMVkNpm0D$AVZ1EQ1_zu{|bew)OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydCDhw*jjDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>A=MKr#2LHm#3}r%_)d8|Jb{3ZI;Ph>*Aw(OeRfixbcGF z*MA1BSIgPv-fUS~%Qa8dxayzBdPrsUgav6EO|Sw85${&}ssT#8R@ zfArvm_3vB)MayLt}3_j4!)GXrMqA0*WHJCN514Qe38A;)3zsS zn6BiMVz0s5BU8%<5Hd!AG`cfVk$_al*SHtV=M-!2u3KK0SV%E*xY%eranQoJkc z>njew-5z|#-QV%N(?D>Zk#;Z=*>v~la@2hr6YLK4##Eja3(`_7~<{)pAT#p!Fj^YbOKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydC8VugdjDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>XH&A-Yr%Un+1Fp1df?dZ%lT_U zquyQ0V4kBnk?Z;AWvnp)Oc&T=7v1`?-q|ffr{;8;^gK;juZgcLA5Cj;T~;yQYg22K zFPGX5zO&C3FiWa@D4b{9rK7xl_tmu}ZzW4FCUM8Aq#k-;$Ya6s{iuS4Z+XP!(um}~ z)1KazHD}K%HBS5Xpz12){mg4-Rw2_3qYtcDbkBUMyLJEB*I!mLi*Y1{Rc?9lb=syK zM>gutuFRCQuSl49|I!TU^2GlP8x@XJEzDULCeBoN@b_{1xe6BRMIFm7IGaygr6V|b z$9;l+Jji|N*>UWmslGr&X5r!VMcf^n zI-5-RZf}0a%TOl%{niva*|t~r4tQ6bl&mh67Fg0hBYC|@!=tUU&qjTUj$Rw?k)2(g z$(S@@Qxm78r24HDeC>yKEzTCoE??@U-O91#?^Uh?K}^$IO}_5=@MgM^?VI%?YgUSw z>&#?eZZKjmc4m69vFL!TeiXyJ{dq6{GxP_r>G$Ovo2|M=;7-hzqLpcp>FF#@hF31M z6@?s#awwn2Jn!0V=PN2Z=b5_Jo?G%sJU{;UQXZbjn$#7J#>bagY~LJa=i_E-9sX(2 zfzny~HdbdoI34Sz>2&9$jO&aQmO6|!B}@w##{awfrz{_red6<^^O^4ZTA55#Sr-|4YVx5E950=j_RX$NUg_Pf%k?d`$6T=L zd0zFr3`RQ@1M_X(^IUv9{$w~?oMOwrpj~zHc#>NXE!yDO;q+Hns@EAV~_3EF%gbQ(_uZWE;cS z8Ife)%9!kp>^t=+$8*l_bzZ+e&pDs#b>H_N*Zs%!zVD;YN7KMbOLK%d00IF3=(vER z-+&<8JIFiKJZ+cT*OHfzR5MZ6(t{Zp8Of-aAubwN=o%WqK;Qxh#3kx>Hxhu9{vRAp8@_aASPz;2^I(|8#~8IfC*Eucv>}?2^N9q&84K6HN^8Xg%P8~^-eVrF)3 ze&HKq@%z%|*7nZs-u}UlpCEwwU!3FpU!eczIfjFnz+h%D#q%`d|_&q`g*#)GvW@I-1CjC?NpMf6yPojT={_Q!M063XJ z#~;QF1&o1dK&kB-FQS#XDG243kzFzR{mC4>+T$6f%h~u3j48 zCJn2u&t+eR=@Be0Xb26E`wcJ`%z+bl9`!7 zRR2zIn>3MLh;7BtY7H#Obb{{rF?jk(2Ce|kgh%MQe_69IP%W|ppPpES8YQbhQ)|XMT1TC`?NL}smH90Mc*q+ zi^7%XGK#(iQ?2qt$R$#gXbFoOR{t%o*06+KnX%|F`o1CIYX1d%^8Mhn63m2bCBsH3r z&dVK7(B0bKY;2H;CEpQP!{mwXSADIY?0r)oBdnu(P%r;LyqN*{SZH5D<^qEKAd z7%4AhnFtLO!RR+XndxP+2n?g8P>Gi7G8NK7MS3=+pO>*;8JmgEa}mX9#;4r;Di-w( za*V{H7jb7j?pshlh&ZOk^}8R~B}d#zo1lqDgzG%}Es0ldF!B>!l z)ioIp7ZZjETn{JxMT^K+uEbnjQkmY2nny)bTcMoqnX@Rn1$3i_%)yEL4r3-ieXe74siz$LPF;O*h_8 z1vEm|yTo_jVjLxutu4mG-YVvw4${_}O*b8WxwSGw%2(_9IP=kJ3`aVd>QF*|R}~ z&6kO?sgvEQQkQDM1mZMLiB@6nA6f4LBhOfE41YzIEXD>Yv;Vj?E=1c#$91_WpcbkX z^M`{K!4-5BeOP1(yx^2UySrpqLP z6K&XG!|D>1k&D%tOV3TO<tU4IEM~i6N9m8rLk=T4FWy#^IM)m zzWY1neBDa**70=w)5b(&b?W1;&=O-c#`E7bsS&7juK@q+H`1~Ok`-+wvmlxQp&e8E z-Ll(6WXpj&$!B>YrqPJAdE_NRdCf!NB$e2spPmc13mL$vUs3&9kvGtLU|;eTL9`|` zQEN&aR=z`x70A1cU2S{2n)fU>HjJuE>C3tf!+pk8rS@A^{`^-WMJiuh9j}ou&UrRV z?>PcCGW`YJ*hgyu^lFj(w6bc}wvOm=QO_4o_lXOx-RkrS21i6hREd9m_z{rO(d(yh z63=h@1!Q=?|Epn_6y84*QIfHQ5my==>uH_vTwDq)Q*nmck7z1IN^_(8nW~c;3qIaP zvXSI>($LQ8-Lo8NUO%kv^`HaEN?vzqn1m0%NtWLO-QVhXE!8i)%dGwW`r!5I8m~Er zw{r7h8~wq<(8mCSfVWHAHw~g+L7QzRQt&RX3kW?z=1&yLPI@?}xxU1eW}U;X&q9*R z4-I8f^}|Z4EZ+^SU6|wq9Rbx2*JkmQP>fhnWX{#54X)pnT1i3E+d66&fL3tG!BB{$ z1DO6U>Q`SadbY`-Q#oi;BH^Zct|zlc>?oF>IbiwOr2CvX{JH63f^F{PT)ti`+; zDhSzOnOKwcOP5<7!%Yl4OJZ*a2#N~{`xHd+J=%jM(L^-fxI~cIei>?-@#m-^=$~mD zt8{ESkrruf?VbBFVWHt!#1pJh<8L9R*NB==ouq;723pErH_y2B;4@W?rZlJtoS}Wx z!nvkfWj#c(Fhl>nDJP>d7J=H@NTkiZgU)!%=}_>WJxVO_~=HaI`3h?0Li1*(55`q{r^Y?T+gK2fRyNt7E+MN&OXUr$AZ= z#ro{dc}SUzU~dSy6cu^9V*;K);;$pu>I&C%G@!VH1=P@OJ5syLLvL(D@0lW{{cbKb z3y!VaO*%9QFQ!pcWuDc-E}wc*P=t&2N=6_I6DK@;_w#fTnA->k^tng05cA4O&E*fX ziTQM2#S5tnB13 zmVX%gDO^kwo^@qB#_be4bF_T{x2&Yr(>u^ zx`dJ=K=S#!oeQNkD5I9L$%BXXnZFtAE(>Omc-sMhq9rWbI&Bs0kGY2L#5Un&7Y+H&3_WqIEQ5!;du3N8<^CSse{VKh_dsPn-K z(>x4WUmKTCh*y?}{;0Nsm~mk>*VlVdvw!7;xz=s6B&%NSxRbhEGFA1^$DJGF0vb@4 zT4(;bBgUoTxbd=n5^tQe(<0ced}#WreUt4k!yN_7`_}Z3@iPo;=nq#62Z8crh9f`5 zxKju1I{C__eT}m;xNf3VJO=%96zL}26}s0lOL@5|UapcBB81&|^$Rb^XnzS-#DI?g z2}|`s*TCh%!s&)|&c$k#@{o7u>(riR(x?Bh$7(*%Y`|Onz-5cxs?np)vXvQFN0ojC z^JrC(P-cCt^V{h*Tz);_DC90>;O2603l%2RLb9)s3LDZWr93^O-ZzJZ+o0ENiq^AY z!{%j1wb|l$r(EkioD#E=q@O<-A0t&sG8|`rIdrbKi=QFYHemf`5)4MnyRFPYkb!U2 a5B#kthS2v8#U}thzy@^TKRZB2U;Y7*V7}r2 literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/返回键.jpg b/repo/js/HolyRelicsUp/assets/main/返回键.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de9c4783f7943639595c9c73b3004d380ad4783e GIT binary patch literal 983 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydCvJCRfjDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>B7-8$-7@~|dlDr-vYuPI=G^Ihwi8=}oO-@6ZJT0yTS;W=ZtL0n z!Wp+_cf8Gil*#XsKV|;;wFwVZcV;fjx-zBWe5VO-y3el4ud>&<-u`EhSD428^~;~^ zbwb@YjxO77^k&QJyRJ8N)~4=Al}wbH+_mk}o!K#^_hzriJR-f@y1V9!kz2UEQ>NOy z!<*d~*VujJxixpqtlB$mo@ zls4U1Jn!Njon2!4ZO_j9&)_^yCr5os&X@0^OO~INHq^K|+iH#3=9lG$_q1m4E E0crk+D*ylh literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/进入筛选圣遗物界面.jpg b/repo/js/HolyRelicsUp/assets/main/进入筛选圣遗物界面.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1abe4e95881e99bc7ea9ce02e65579a9b51ab458 GIT binary patch literal 881 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydC+6*SljDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>%RHtuoIB`NdzPUjPW6ND^R}F%-8*(QrB3qK7i^wT;9tMgC2h%@n8nGn zRx5yYiHaAmn%pxdt-;odzx7s%@o}wJmkr%`*u>{Z9lo{i*qx4-HU1A@*9%3sW)~NI zdo8ob;dGxL$8r0pb4E{7J!3xCOZ+f8f4HhdJnZ_V7?a7BsWE(Poag1e?gGr=}>pzRww)F@6*!Z78>Fx5rwf%n?SI?XFY^#~gyj?s_Ft5m5vi|!$ R?fA;G3}!GPxF`SL1OR<{JnR4f literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/进度条.jpg b/repo/js/HolyRelicsUp/assets/main/进度条.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9aa38e99af957a8df73d84b85fb1487940168a54 GIT binary patch literal 661 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydC{0!{OjDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>vz~sOKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydCLJS|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>m^qda}7R! k-ZbUreT(Byy{FzOzi{f-{%V`LtxNA6+QfWqh5P@T04uQOJOBUy literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/进度条顶部.jpg b/repo/js/HolyRelicsUp/assets/main/进度条顶部.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0920bea7f11a6ad126c2236bde8288f47aaefbcd GIT binary patch literal 749 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydCA`INjjDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>(ck(#x61?$Fn|fiRy=ys z)sxp(_3rMP_iEdUBo`I6^tH2X^LzDV?)T>UC-MHjUi@b`w^O^uZQ_kbrRRV0#rOKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydCoD96ojDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>Q;X(ia literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/选择素材条件按键.jpg b/repo/js/HolyRelicsUp/assets/main/选择素材条件按键.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba8c8a3a4acb517580894e6a922ab5e62a9e1b0b GIT binary patch literal 777 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydCA`BwTjDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>ReKmY&$ literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/重置.jpg b/repo/js/HolyRelicsUp/assets/main/重置.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4c1699fc897edd63b69e853c348972ee45d657c GIT binary patch literal 1255 zcmex=OKUqj zJ5@awPiGqsb6Y!WMlNn{K3+Z<0Rb6n4J8e0lEME241ydCY7DB(jDieIf{e_9jQ@`? zE&@89l@SaWpn#EynT3^&or9B$TY!Oyk(rr^g_)I=g$1ax7AVKSBFHMFXz0i$9GJ+i zR48K9IB_9|veU+cqCpows2C>|HF0u@iAzXIsj8`KXlj|5nweWzS~We&gn?hmRgVdHU@6i$mSee*R)) zV1{@HNJ2b>?mgkNKtlt_NIIyDMXS*W>;X#^m`cSI*4}xxQC%g;%ta^={8K zc~Q5X*-l!{vwY(Ln}4MtuiTb|EZ(ft`%KOf7W^~aQ~r|3w*xS zvd3)w$TnT}>w+9}e))>qJ4|Q0#(c0iGF^Dp`m-v%$10!9|G0W`V0V5}Q0|MWt9`3e zmrCarZN@o+?~%`P>skIOO#1an*~G{v%JqEU zK2w zs2}eOLL%u|Hyr4j;O`eP^#% z-{MbZHkuD+&lkAmTjJ5Dny@0~arrv!rMo3>yx$Z1;IzM>;?CaIy|46t-6?obmLI>? zCpBr7P0_cjZ}OgOov_-bzGA)CmT6CJG%tTTE6M6T+Yg>4|uyMY|<;=zJ06j e&k|>kueY-!a^5Cy-P)Vjrr7E#!_{>D|4jhvwGRsb literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/阶段放入.jpg b/repo/js/HolyRelicsUp/assets/main/阶段放入.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a53cd0fa3e58e8cdfe0d63d66db5eac6ae57fd50 GIT binary patch literal 1926 zcmbW1c{tnI8pnUXED{MRN~nnvO9X%$I{j$&-F z)7qC-hgzztQ(IB{(o#kZN_9*}CS9J+{CV$v&vVZEyyyG=aX#mLo-cQtI|m5aTG?0u zAP4{;ZvotWK>V1`d7qGTVLsk6o{=(6=cyOYg@*ZXCxLhXg+L$?d?+LmiAJH&7zrVa zpddy{3@a=lC#@haD=mvBsOYK_h$JFjR^zB9N#DTO*jPc$!p7XtTGzKr<8+1|Y&9R2bxTfd#zB!@*AhdX@~StrPi_vx}>nyO+0*ub)3PAT;bEJv<^Z>WBD*tN%$% zy2iShp25z%^}tj;Fr^O+z|5&8AM^_N%IPuACW#0{dYiD{x71hKwo*d6Mz5|_pbi_Kf^+M!Y0Lsllv78*ZWreY;O7Q**6$ z89DzOnT~b8FWHzl)|i^y6RvjIe^Tl|o9Du!iq>$e9t9hu>v%=|&Fw13z^j=+lEkCr zWbb#?NrVRnb^KaL^j&vObz6n%pL?AGDWka_T`B@KhEZTjdi71)&Y88>mki3EM9!Z& z&5!-{WK%N2?Yb9DvCJsqSyUgbzG1wyjimo4HYkSt+;5ZbHr4;o&!NiVc-J}HT=t%G zt%F?#t9p8XHM<&>ne_6xY8AdYNLi?smhuda7|{1(tcz7-SR#}C4Z*>>1ng4l|v=*AI#+)TMInOyBiY6 zbyE;|9YyBd5;_PUK>JB z(k~vyinAYxGukX4vrLBtJJW70ny_Oe`{*IHY6bxplDu9<*h^UwatOJ*ec)M?3w8N$ zi`XEeuZKRg^ejm=HQ~2qim^~*YfgTwjLF4j#P+^#!GWB>filKDsp^E192JX(TD@sp zjIqi6NRu+1XNr*?gDP@}?#z(YF^7midjn3!4<2_{Br%cuF_~4=;~~|)77c@9mBN<} zEnKZjV-~NX3|m|`DveHzFyCJ*`J;EX9KK%HR2^!X_s=f}coi}5Th^@q7(H#VKZ{^F zbwSILOv&<$DpZ~|zjt?I4f~GiF8JNCS2~YzJw@4Rw42G>6(RO6jDvxAHA6L-jY|`% zan9`TM7D6jLG7$)JyGJ!rGEXeS`uFxD^YpTBNfW zivQkWkzXECPV~#$DD|E^v0IaC1otTBsN_<~*>``vnal9rJWjTAY0kEz&RdS0IbC(xAv{$1`%|gPX$LHJcS&uW`o!OZ zTNEDLzT@tCyrjF-?Dak8nI%ht#hJO3__zTskd|FAy@q9ohecz@tm4>GL&x#cq^*!G zX-BH9y}51I1p7y7g5@NRGN^{_4+ rOf^GDln`=DZAbxR(a+xW#iIUBD8NzEl%MBakXYzf2m35bb6@-g2|6mX literal 0 HcmV?d00001 diff --git a/repo/js/HolyRelicsUp/assets/main/需要摩拉.jpg b/repo/js/HolyRelicsUp/assets/main/需要摩拉.jpg new file mode 100644 index 0000000000000000000000000000000000000000..41c618d5544800c5fe8b48871d3dcb69bafc4b93 GIT binary patch literal 1771 zcmbW1c~sI_6vux*KtV)DT&XBUkpw3f#7r$qb4fEDaf_BIG)yrmH_R+^DKj(oEo^XU z)XXxS1eX>|tuRGf)LhyW!zE3zMe8&&XmdLA=gfTXdH39N-uvTy?z`_R?U%j*R9qaL z9RUyo08kcybP>>UVz3xt^a#cQ9lvNDPgc+odUymwIs}{okZ?ExE{{YY5Q<2oqB2HB zSxHHGwT31dqo=Kp*VWd=5ezMi2}BAJr)y$sO0l%Iv9ZxNvUlFPaht^^8*31$sHm)@ zj8##=S{vvZSpR29?*eE9U;yMnK{NnCgHSXmZ39bXmzM*V1^g`#0)@%R!x0KdMHK)7 zLZJ{CR89^Clbt*v+XG-|IaQpgt-P8C9j+UyPL9tkLFn1l-qWBynZ=v=g(WB;HMKA+ zR_YVh8W2eo^Ys=REUmWMJ2*ORb9V9c^7irFN!#UrfDv#oFo+o*5y_4^8htGB)aj%% z$!AltvU76t@(V6-N-zChR$g(r^2#4K>UjM6hQ_9r*0%c(9tzqYJ$=^G+xNVGU~qUu zH2PLNHa;;anfvhZ)93kxFJD0b`W;7>zXSb)M+Oc;U@#~QzQhAUqGSt-hRNYfC8Ff~}FYF0Y6Hgh|mnr z(ZFUvAdFsHyrLLN0RrMsk3kMheG0Nv$>-$`|LMM~gEo|{dXZAiF8=1eucg`~hldmD zxt)YCXAL^}sqPM{=pxn@jnv6!iMR?|TdN5XWtUjk$ZS*0RJ7yjblf5Td{ehm>Ucsv5 z?4r&T5Ysf>WY2%joV-7GlP!l?(^Br>RD1m}t3`sldCv7q4qqT@Eh=Z8ZQhS={cL@f zJ#q6=Hk03->FA_1#s{X;#l_2>xq$g+Di!1hx9~4%da*?~A1> zn2!iI=AZ(Jy^3ZKci5O+>VVaJc!Rr+G3VEPlZo>e9%L9^ZAou?(Jh2;W`6@CC$Bwe1vSsP`}jKS;+FS&!FvG$hYH)R~dvD zuag2}af8=hmr-&=F-)z{gW8ok!k_&2bG^eJ zyaV?4x_f$!Mr{NsS`D{?s9o>xi@HYccx+^M-v<1GJt;%0XNnsP=T0T>Hz<9JXQ*+q z&ZjHxeHdKXg^df~MNnf@9q4;)+zYO;(;j@FrM;wkC-YiRrHPLuDWYF$nOe>Mx-)y4 zZmpqpy%?Rw8drzTxb>Nzr=;9)d;iV^e)Kpu4Bqg${9OH34#%A=j)pts3cfjCw>89v zr3wM|*TxTbvB7Pn7i5=hKTr6sjA0e6G-F-wz1$0kN2!SmT;d*f z&yK^?`kon_>EWH3c6s#feJ-mS9B68TlYBN3ZFHEWaQ2#;JOe(ExmBb%U&(5wi|?eb5CC5hRRe3qjzjsIe&T8F zpe0p#v4ZBqn1#74dsgh6NZj4b3++iKjM*R5JVXn$V2$HQY3@e*uJ_f5sXTF4#x8b9Od_N6&Y0Da;;eoBaVVj!V^{Ww@3X1V znnwQa4oj;xVO@GjRqE7LK@RJ^bM#1Lh{;3~Bc*?+{&m~wfo8QG-P`d} + */ +async function main(log_off = config.log_off) { + /* let x = Math.floor(genshinJson.width * 1300 / 1920) + let y = Math.floor(genshinJson.height * 760 / 1080) + await downClick(x, y) + await wait(600) + let template = await templateMatch(`${path_base_main}4行.jpg`) + await logInfoTemplate(template)*/ + + /* await openSelectTheClipCondition() + + return*/ + + /* let template = await templateMatch(`${path_base_main}test.jpg`) + await logInfoTemplate(template) + return*/ + + let ms = 600 + setGameMetrics(1920, 1080, 1); // 设置游戏窗口大小和DPI + + + if(genshinJson.width!= 1920 && genshinJson.height != 1080){ + warn(`分辨率不是1920x1080,请修改分辨率后运行!`,must) + return + } + + if (config.enableBatchUp) { // 检查是否启用 + if (config.toBag) { + await wait(ms); + await toMainUi() + await wait(ms); + //打开背包 + await openKnapsack(); + await wait(ms); + await openHolyRelicsKnapsack(); + } + + if (config.toSort || config.toSift) { + await wait(ms); + //排序 + await openPrerequisitesAll(log_off); + } + + if (!config.toSift) { + let template = await templateMatch(`${path_base_main}已经筛选.jpg`) + if (isExist(template)) { + config.toSift = true + } + } + + await wait(ms); + await bathClickUpLv1(config.insertionMethod) + } else { + throwError(`未启用批量强化请去浏览文档后开启!`) + } +} + +//========================以下为原有封装============================== +function info(msg, must = false) { + if (config.log_off || must) { + log.info(msg) + } +} + +function warn(msg, must = false) { + if (config.log_off || must) { + log.warn(msg) + } +} + +function debug(msg, must = false) { + if (config.log_off || must) { + log.debug(msg) + } +} + +function error(msg, must = false) { + if (config.log_off || must) { + log.error(msg) + } +} + +function throwError(msg) { + notification.error(`${msg}`); +} + +function openCaptureGameRegion() { + return captureGameRegion() +} + +function closeCaptureGameRegion(region) { + region.Dispose() +} + +function findByCaptureGameRegion(region, templateMatchObject) { + return region.find(templateMatchObject) +} + +function findMultiByCaptureGameRegion(region, templateMatchObject) { + return region.findMulti(templateMatchObject) +} + +function mTo(x, y) { + moveMouseTo(x, y); +} + +function recognitionObjectOcr(x, y, width, height) { + return RecognitionObject.Ocr(x, y, width, height) +} + +function downLeftButton() { + leftButtonDown(); +} + +function upLeftButton() { + leftButtonUp(); +} + +function moveByMouse(x, y) { + moveMouseBy(x, y); +} + +async function wait(ms = 1000) { + // 等待300毫秒,确保按下操作生效 + await sleep(ms); +} + +function downClick(x, y) { + click(x, y); +} + +/** + * 检查资源是否存在 + * @param {Object} res - 需要检查的资源对象 + * @returns {Boolean} 返回资源是否存在的结果 + * true表示资源存在,false表示资源不存在 + */ +function isExist(res) { + return res.isExist() // 调用资源对象的isExist方法获取存在状态 +} + +//========================以上为原有封装============================== +//========================以下为基本配置============================== + +function siftAll() { + //筛选条件 + let baseSiftArray = new Array('未满级') + if (settings.holyRelicsLockMark) { + baseSiftArray.push('标记') + } + if (settings.holyRelicsLockY) { + baseSiftArray.push('仅锁定') + } + if (settings.holyRelicsLockN) { + baseSiftArray.push('未锁定') + } + if (settings.holyRelicsEquipY) { + baseSiftArray.push('已装备') + } + if (settings.holyRelicsEquipN) { + baseSiftArray.push('未装备') + } + if (settings.holyRelicsSourceFrostSaint) { + baseSiftArray.push('祝圣之霜定义') + } + return baseSiftArray +} + +function sortAll() { + //筛选条件 + let baseSortArray = new Array() + if (settings.sortMain === '降序') { + baseSortArray.push(settings.sortMain) + } + if (settings.sortAuxiliary === '品质顺序') { + baseSortArray.push(settings.sortAuxiliary) + } + return baseSortArray +} + +const must = true +const config = { + suit: settings.suit, + log_off: settings.log_off, + countMaxByHoly: Math.floor(settings.countMaxByHoly),//筛选圣遗物界面最大翻页次数 + enableBatchUp: settings.enableBatchUp,//启用批量强化 + toBag: settings.toBag,//启用自动进入背包 + enableInsertionMethod: settings.enableInsertionMethod,//是否开启插入方式 + insertionMethod: settings.insertionMethod,//插入方式 + material: settings.material,//材料 + upMax: parseInt(settings.upMax + ''),//升级次数 + upMaxCount: settings.upMaxCount + '',//设置升级圣遗物个数 + knapsackKey: settings.knapsackKey,//背包快捷键 + toSort: settings.toSort, + sortAuxiliary: settings.sortAuxiliary,//辅助排序 + sortMain: settings.sortMain,//主排序 + sortAttribute: settings.sortAttribute,//属性条件 + sortArray: (sortAll()), + toSift: settings.toSift, + siftArray: (siftAll())//筛选条件 + +} +const genshinJson = { + width: genshin.width, + height: genshin.height, +} +const attributeMap = new Map([ + ['%', '百分比'], + ['生命', '生命值'], + ['防御', '防御力'], + ['攻击', '攻击力'], + ['暴率', '暴击率'], + ['爆率', '暴击率'], + ['暴伤', '暴击伤害'], + ['爆伤', '暴击伤害'], + ['物伤', '物理伤害加成'], + ['风伤', '风元素伤害加成'], + ['水伤', '水元素伤害加成'], + ['雷伤', '雷元素伤害加成'], + ['岩伤', '岩元素伤害加成'], + ['草伤', '草元素伤害加成'], + ['冰伤', '冰元素伤害加成'], + ['火伤', '火元素伤害加成'], + ['治疗', '治疗加成'], + ['精通', '元素精通'], + ['充能', '元素充能效率'], +]); +const attributeList = [ + '物理伤害加成' + , '风元素伤害加成' + , '水元素伤害加成' + , '雷元素伤害加成' + , '岩元素伤害加成' + , '草元素伤害加成' + , '冰元素伤害加成' + , '火元素伤害加成' + , '治疗加成' + // , '元素精通' + // , '元素充能效率' +] + +/** + * 属性值替换函数 + * @param value + * @returns {string} + */ +function attributeReplacement(value) { + value = value.trim() + if (value.includes('%')) { + value = value.replace('%', '') + let s = attributeMap.get(value); + value = (s === null || !s ? value : s) + attributeMap.get('%') + } else { + let s = attributeMap.get(value); + value = (s === null || !s ? value : s) + } + return value +} + +//基础目录 +const path_base_main = `assets/main/` +const path_base_sort = `${path_base_main}sort/` +//========================以上为基本配置============================== +//========================以下为基本操作============================== +function infoLog(msg, source = '默认', log_off = config.log_off) { + if (log_off) { + info(`[${source}] msg: ${msg}`); + } +} + +function logInfoTemplateBase(res, source = '默认', log_off = config.log_off) { + if (log_off) { + info(`[${source}]识别结果: ${res.text}, 原始坐标: x=${res.x}, y=${res.y},width:${res.width},height:${res.height}`); + } +} + +/** + * + * @param res + * @returns {Promise} + */ +function logInfoTemplate(res, source = '默认',) { + logInfoTemplateBase(res, source) +} + +/** + * 通过圣遗物页面滑动功能 + * @param isUp 是否向上滑动,默认为false(向下滑动) + * @param onTopOrDown 处于顶部or底部 + * @returns {Promise} + */ +async function scrollPagesByHolyRelicsSelect(isUp = false, onTopOrDown = false) { + let isSelect = config.toSift || config.toSort; + mTo(genshinJson.width / 2, genshinJson.height / 2) + if (!isSelect) { + //未开启筛选或排序的滑动操作' + //80 18次滑动偏移量 46次测试未发现偏移 + await scrollPage(Math.floor(genshinJson.height * 80 / 1080), onTopOrDown ? isUp : !isUp, 6, 18) + } else { + await scrollPage(Math.floor(genshinJson.height * 89 / 1080), onTopOrDown ? isUp : !isUp, 1, 10, 100) + } +} + +/** + * 通过圣遗物页面滑动功能 + * @param {boolean} isUp - 是否向上滑动,默认为false(向下滑动) + * @param {number} pages - 滑动页数,默认为1 + * @returns {Promise} + */ +async function scrollPagesByHolyRelics(isUp = false, pages = 1) { + let ms = 600 + let direction = "down" // 默认滑动方向为向下 + if (isUp) { + direction = "up" // 如果isUp为true,则设置滑动方向为向上 + } + + // 计算模板匹配的坐标和尺寸,基于屏幕分辨率进行自适应 + let templateMatch_x = Math.floor(genshinJson.width * 1282 / 1920) + let templateMatch_y = Math.floor(genshinJson.height * 112 / 1080) + let templateMatch_width = Math.floor(genshinJson.width * 13 / 1920) + let templateMatch_height = Math.floor(genshinJson.height * 840 / 1080) + + // 计算底部和顶部的Y坐标边界 + let bottom_y = Math.floor(genshinJson.height * 920 / 1080) + let top_y = Math.floor(genshinJson.height * 125 / 1080) + + // 计算点击位置的X坐标和页面滑动距离 + let click_x = Math.floor(genshinJson.width * 1289 / 1920) + let page_distance = Math.floor(genshinJson.height * 15 / 1080) + let threshold = 0.6 // 模板匹配的阈值 + + // 循环执行滑动操作,次数由pages参数决定 + for (let i = 0; i < pages; i++) { + moveByMouse(genshinJson.width / 2, genshinJson.height / 2); // 移走鼠标,防止干扰识别 + await wait(ms) + + // 查找向上和向下的滑块 + let slide_bar_up = await templateMatchFind(`${path_base_main}slide_bar_main_up.png`, templateMatch_x, templateMatch_y, templateMatch_width, templateMatch_height, threshold); + let slide_bar_down = await templateMatchFind(`${path_base_main}slide_bar_main_down.png`, templateMatch_x, templateMatch_y, templateMatch_width, templateMatch_height, threshold); + + // closeCaptureGameRegion(gameRegion) + if (isExist(slide_bar_up) && isExist(slide_bar_down)) { + info(`定位到滑块...(${slide_bar_up.x}, ${slide_bar_up.y})-滑动方向: ${direction}`); + downClick(click_x, direction === "down" ? slide_bar_down.y + page_distance : slide_bar_up.y - page_distance); // 向上下滑动(点击) + + if (slide_bar_down.y > bottom_y && direction === "down") { + await wait(ms); + await scrollPagesByHolyRelicsSelect(isUp, true) + info(`滑块已经滑动到底部...`); + return true; + } else if (slide_bar_up.y < top_y && direction === "up") { + await wait(ms); + await scrollPagesByHolyRelicsSelect(isUp, true) + info(`滑块已经滑动到顶部...`); + return true; + } + //反方向拉动 保证定位 + await wait(ms); + mTo(genshinJson.width / 2, genshinJson.height / 2) + await scrollPagesByHolyRelicsSelect(isUp, false) + await wait(ms); + } else { + throwError("未找到滑块,无法执行页面滑动操作!"); + return false; + } + } + return false; +} + +// 滚动页面函数 +/** + * 滚动页面的异步函数 + * @param {number} totalDistance - 总滚动距离 + * @param {boolean} [isUp=false] - 是否向上滚动,默认为false(向下滚动) + * @param {number} [waitCount=6] - 每隔多少步等待一次 + * @param {number} [stepDistance=30] - 每步滚动的距离 + * @param {number} [delayMs=1] - 等待的延迟时间(毫秒) + */ +async function scrollPage(totalDistance, isUp = false, waitCount = 6, stepDistance = 30, delayMs = 1000) { + let ms = 600 + await wait(ms); + downLeftButton(); // 按下左键 + await wait(ms); + // 计算总步数 + let steps = Math.floor(totalDistance / stepDistance); + // 开始循环滚动 + for (let j = 0; j < steps; j++) { + // 计算剩余距离 + let remainingDistance = totalDistance - j * stepDistance; + // 确定本次移动距离 + let moveDistance = remainingDistance < stepDistance ? remainingDistance : stepDistance; + // 如果是向上滚动,则移动距离取反 + if (isUp) { + //向上活动 + moveDistance = -moveDistance + } + // 执行鼠标移动 + moveByMouse(0, -moveDistance); + // 取消注释后会在每一步后等待 + // await wait(delayMs); + // 每隔waitCount步等待一次 + if (j % waitCount === 0) { + await wait(delayMs); + } + } + // 滚动完成后释放左键 + await wait(ms); + upLeftButton(); + await wait(ms); +} + + +/** + * + + * 该函数用于在指定路径的图像上执行模板操作 + * @param path {string} - 图像文件的路径 + * @param x {number} - 识别区域的起始x坐标 + * @param y {number} - 识别区域的起始y坐标 + * @param width {number} - 识别区域的宽度 + * @param height {number} - 识别区域的高度 + * @param threshold {number} + * @returns {Promise<*>} - 返回一个Promise对象,解析为识别结果 + */ +function templateMatchFind(path, x, y, width, height, threshold = undefined) { + // 使用模板匹配方法创建识别对象 + // 从指定路径读取图像矩阵并进行模板匹配 + let templateMatchButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(`${path}`), x, y, width, height); + if (threshold) { + templateMatchButtonRo.threshold = threshold; + } + // 捕获游戏区域并查找匹配的识别对象 + let region = openCaptureGameRegion() + let button = region.find(templateMatchButtonRo); + closeCaptureGameRegion(region) + // 返回查找到的按钮对象 + return button +} + + +/** + * 模板匹配函数,用于在指定路径下进行图像模板匹配 + * @param {string} path - 模板图像的路径 + * @returns {Object} - 返回模板匹配的结果 + */ +function templateMatch(path) { + // 调用基础模板匹配函数,传入路径、初始坐标(0,0)以及目标图像的宽高 + return templateMatchFind(`${path}`, 0, 0, genshinJson.width, genshinJson.height) +} + + +/** + * 模板匹配点击函数 + * @param {string} path - 模板匹配的路径 + * @param {string} log_msg - 日志信息 + * @param {string} [source='templateMatchClick'] - 日志来源,默认为'templateMatchClick' + * @param {boolean} [log_off=config.log_off] - 是否关闭日志记录,默认为配置中的log_off值 + * @returns {HTMLElement} 返回匹配到的按钮元素对象 + */ +function templateMatchClick(path, log_msg, source = 'templateMatchClick', log_off = config.log_off) { + let button = templateMatch(path); + // 检查按钮元素是否存在 + if (isExist(button)) { + // 如果未关闭日志记录功能 + if (log_off) { + // 记录操作日志信息 + info(`log_msg==>${log_msg}`) + info(`templateMatchPath==>${path}`) + // 记录OCR识别到的按钮详细信息 + logInfoTemplate(button, source) + info(`日志==>${path}`) + } + // 点击按钮元素 + button.click(); + } + // 返回按钮对象 + return button +} + +//========================以上为基本操作============================== +//========================以下为实际操作============================== + +/** + * 打开背包 + * @returns {Promise} + * <前置条件:处于主界面|测试通过:v> + */ +async function openKnapsack() { + let ms = 600 + let templateJson = { + "text": "背包", + "x": 0, + "y": 0, + "width": genshinJson.width / 3.0, + "height": genshinJson.width / 5.0 + } + let knapsack = await templateMatchFind(`${path_base_main}${templateJson.text}.jpg`, templateJson.x, templateJson.y, templateJson.width, templateJson.height) + // 如果背包不存在(即背包未打开) + let exist = isExist(knapsack); + if (!exist) { + // 设置默认的背包快捷键为'B' + let knapsackKey = 'B' + // 如果设置中配置了自定义的背包快捷键,则使用自定义快捷键 + if (config.knapsackKey) { + knapsackKey = config.knapsackKey; + } + // 记录日志,显示尝试按下的快捷键 + await info(`尝试按下${knapsackKey}键打开背包`) + // 打开背包 + await keyPress(knapsackKey); + await wait(ms); + exist = true + } + return exist +} + +/** + * 模板匹配圣遗物背包区域的函数 + * 该函数通过模板匹配游戏界面中的圣遗物背包区域 + * @returns {Promise} 返回一个Promise对象,解析为OCR识别结果 + */ +async function templateMatchHolyRelicsKnapsack() { + let ms = 600 + let templateJson = { + "text": "已选中圣遗物背包", // 要识别的文本内容,即"圣遗物"三个字 + "x": 0, // 识别区域的起始x坐标,设为0表示从屏幕最左侧开始 + "y": 0, // 识别区域的起始y坐标,设为0表示从屏幕最顶部开始 + "width": genshinJson.width, // 识别区域的宽度(屏幕宽度的一半) + "height": genshinJson.height / 5.0 // 识别区域的高度(屏幕宽度的五分之一) + } + let holyRelicsKnapsack = templateMatchFind(`${path_base_main}${templateJson.text}.jpg`, templateJson.x, templateJson.y, templateJson.width, templateJson.height, 0.6) + await wait(ms) + if (!isExist(holyRelicsKnapsack)) { + templateJson.text = "圣遗物" + holyRelicsKnapsack = templateMatchFind(`${path_base_main}${templateJson.text}.jpg`, templateJson.x, templateJson.y, templateJson.width, templateJson.height, 0.6) + } + return holyRelicsKnapsack +} + +/** + * 打开圣遗物背包 + * @returns {Promise} + * <前置条件:处于背包界面|测试通过:v> + */ +async function openHolyRelicsKnapsack() { + let ms = 600 + let re = false; + await wait(ms); + warn(``) + let holyRelicsKnapsack = await templateMatchHolyRelicsKnapsack() + // 检查圣遗物背包图标是否存在 + if (isExist(holyRelicsKnapsack)) { + // 打开圣遗物背包 + await info('打开圣遗物背包'); // 记录日志信息 + await holyRelicsKnapsack.click(); // 点击圣遗物背包图标 + await wait(ms); // + re = true + } else { + throwError(`未找到圣遗物背包图标`) + } + + return re +} + + +/** + * 重置筛选功能 + * 该函数用于在游戏界面中重置当前的筛选条件 + * 首先检查是否存在筛选按钮,如果存在则点击打开筛选面板 + * 然后检查是否存在重置按钮,如果存在则点击进行重置操作 + * 每次操作后都有短暂的延迟以确保界面响应 + * @returns {Promise} - 返回一个Promise,表示异步操作的完成 + * <前置条件:处于圣遗物背包 筛选界面|测试通过:v> + */ +async function resetSift() { + let ms = 600 + let templateMatchJson = { + "text": "筛选", + "x": 0, + "y": 0, + "width": genshinJson.width / 3.0, + "height": genshinJson.height + } + // 查找筛选按钮元素 + let sift = templateMatchFind(`${path_base_main}${templateMatchJson.text}.jpg`, templateMatchJson.x, templateMatchJson.y, templateMatchJson.width, templateMatchJson.height) + await wait(ms); + // 判断筛选按钮是否存在 + let exist = isExist(sift); + let exist1 = false + if (exist) { + await info('打开筛选'); // 记录日志:打开筛选 + await sift.click(); // 点击筛选按钮 + await wait(ms); + + // const resetRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("${path_base_main}重置.jpg"), 0, 0, genshinJson.width / 3.0, genshinJson.height); + // // 查找重置按钮元素 + // let reset = captureGameRegion().find(resetRo); + let templateResetJson = { + "text": "重置", + "x": 0, + "y": 0, + "width": genshinJson.width / 3.0, + "height": genshinJson.height + } + // 查找重置按钮元素 + let reset = await templateMatchFind(`${path_base_main}${templateResetJson.text}.jpg`, templateResetJson.x, templateResetJson.y, templateResetJson.width, templateResetJson.height) + await wait(ms); + // 判断重置按钮是否存在 + exist1 = isExist(reset); + if (exist1) { + await info('重置'); // 记录日志:重置 + await reset.click(); // 点击重置按钮 + await wait(ms); + } + } + return exist && exist1 +} + +/** + * 进入筛选圣遗物界面 开始筛选圣遗物套装<1.0.1已修> + * @param keyword + * @param log_off + * @returns {Promise} + */ +async function openSiftHolyRelicsSuitUI_Start(keyword = config.suit, source = 'HolyRelicsSuitUI', log_off = config.log_off) { + let ms = 600 + if (!keyword) { + info('无套装筛选') + return + } + let keywords = keyword.trim().split('|'); + if (keywords.length <= 0) { + info('无套装筛选') + return + } + info('开始筛选圣遗物套装请稍后...', must) + let keywordsOk = new Array() + //1.open + let siftSiftHolyRelicsSuitUIJson = { + "text": "进入筛选圣遗物界面", // 按钮显示的文本内容 + "x": 0, // 按钮的x坐标 + "y": 0, // 按钮的y坐标 + "width": genshinJson.width / 3.0, // 按钮的宽度为屏幕宽度的1/3 + "height": genshinJson.height // 按钮的高度为整个屏幕高度 + } + info('筛选:' + keywords.join(','), must) + let sift = await templateMatchFind(`${path_base_main}${siftSiftHolyRelicsSuitUIJson.text}.jpg`, siftSiftHolyRelicsSuitUIJson.x, siftSiftHolyRelicsSuitUIJson.y, siftSiftHolyRelicsSuitUIJson.width, siftSiftHolyRelicsSuitUIJson.height) + await wait(ms) + let exist = isExist(sift); + + if (exist) { + await logInfoTemplateBase(sift, 'HolyRelicsSuitUI', log_off) + // await mTo(siftState.x, siftState.y) + sift.click() + if (log_off) { + await info(`已${siftSiftHolyRelicsSuitUIJson.text}`) + } + await wait(ms) + //2.start + let last = { + name_one: null, + name_two: null, + x: genshinJson.width / 2, + y: genshinJson.height * 2 / 3, + } + + let x = genshinJson.width * 140 / 1920 + let y = genshinJson.height * 100 / 1080 + + let x1 = genshinJson.width * 800 / 1920 + let y1 = genshinJson.height * 1100 / 1080 + + let height = (940 - 100) * genshinJson.height / 1080 + let width = (440 - 140) * genshinJson.width / 1920 + + for (let i = 1; i <= config.countMaxByHoly; i++) { + info('开始识别左边画面') + let captureRegion = openCaptureGameRegion(); + let templateMatchObject = recognitionObjectOcr(x, y, width, height); + // await mTo(width, 0) + // templateMatchObject.threshold = 1.0; + let opJsons = new Array() + let resList = findMultiByCaptureGameRegion(captureRegion, templateMatchObject); + await wait(ms) + for (let res of resList) { + + await logInfoTemplate(res, source) + if (i % 2 !== 0) { + last.name_one = res.text + } else { + last.name_two = res.text + } + + // last.y = res.y + if (keywordsOk.indexOf(res.text) < 0 && keywords.find(function (value) { + return res.text.includes(value.trim()) + }) && (opJsons.length === 0 || opJsons.find(function (value) { + return !value.text.includes(res.text) + }))) { + await wait(ms) + opJsons.push({ + text: res.text, x: res.x, y: res.y, sort: i + }) + res.click() + keywordsOk.push(res.text) + if (keywords.length <= opJsons.length) { + break + } + } + + if (keywords.length === keywordsOk.length) { + break + } + } + + //画面拆为二分别识别 + await info('开始识别右边画面') + await wait(ms) + templateMatchObject = await recognitionObjectOcr(x1, y, width, height); + // await mTo(width, 0) + // templateMatchObject.threshold = 1.0; + resList = findMultiByCaptureGameRegion(captureRegion, templateMatchObject); + closeCaptureGameRegion(captureRegion) + await wait(ms) + for (let res of resList) { + + await logInfoTemplate(res, source) + + last.y = res.y + if (keywordsOk.indexOf(res.text) < 0 && keywords.find(function (value) { + return res.text.includes(value.trim()) + }) && (opJsons.length === 0 || opJsons.find(function (value) { + return !value.text.includes(res.text) + }))) { + await wait(ms) + opJsons.push({ + text: res.text, x: res.x, y: res.y, sort: i + }) + res.click() + keywordsOk.push(res.text) + if (keywords.length <= opJsons.length) { + break + } + } + + if (keywords.length === keywordsOk.length) { + break + } + } + /* await info(`选中 ${opJsons.map(value => value.text).join(",")}`) + //实际点击 + for (let op of opJsons) { + wait(100) + downClick(op.x, op.y) + } + opJsons.sort((a, b) => { + return a.sort - b.sort + }) + await info(`选中 ${opJsons.map(value => value.text).join(",")}`) + for (let op of opJsons) { + if ( + keywordsOk.length === 0 || keywordsOk.find(function (value) { + return !value.includes(op.text) + }) + ) { + await info(`sort:${op.sort},text:${op.text},x:${op.x},y:${op.y}`) + await wait(100) + // await downClick(op.x, op.y) + keywordsOk.push(op.text) + } + + }*/ + if (keywords.length <= opJsons.length) { + // await info(`已选中 ${opJsons.map(value => value.text).join(",")}`, must) + break + } + + await wait(ms) + await mTo(genshinJson.width / 2, Math.floor(genshinJson.height * 3 / 4)) + await wait(ms) + + if (keywords.length === keywordsOk.length) { + break + } + + // await dragBase(0, -Math.floor( genshinJson.height *40 / 1080 ), Math.floor( genshinJson.height *10 / 1080 ), config.log_off) + await scrollPage(Math.floor(genshinJson.height * 400 / 1080), false, 6, 30) + await wait(ms) + + if (last.name_one != null && last.name_one === last.name_two) { + await info('已达底部') + break + } + if (keywords.length === keywordsOk.length) { + await info(`已选中 ${keywordsOk.join(",")}`) + break + } + } + if (keywordsOk.length > 0) { + await info(`筛选圣遗物已选中 ${keywordsOk.join(",")}`, must) + } + await wait(ms) + await confirm(`${source} 点击确认`, source) + return + } +} + +/** + * 筛选圣遗物 所有选项 + * @param log_off - 是否记录日志的开关参数 + * @returns {Promise} - 返回一个空Promise,表示异步操作的完成 + * <前置条件:处于圣遗物背包界面|测试通过:v> + */ + +async function openSiftAll(log_off = config.log_off) { + let ms = 600 + // 调用重置筛选函数,恢复筛选条件到初始状态 + await info(`筛选中`) + let reOk = await resetSift(); + let op = false + if (reOk) { + await wait(ms) + // await siftState(log_off) + // await wait(1) + let width = Math.floor(450 * genshinJson.width / 1080); + let captureRegion = openCaptureGameRegion(); + const templateMatchObject = recognitionObjectOcr(0, 0, width, genshinJson.height); + // await mTo(width, 0) + // templateMatchObject.threshold = 1.0; + let resList = findMultiByCaptureGameRegion(captureRegion, templateMatchObject); + closeCaptureGameRegion(captureRegion) + for (let res of resList) { + // await wait(1) + await logInfoTemplateBase(res, 'SiftAll', log_off) + // await wait(1) + // await mTo(res.x, res.y) + if (config.siftArray.find(function (value) { + return value === res.text + })) { + await info(`筛选${res.text}`) + // await wait(1) + // await downClick(res.x, res.y) + await res.click() + } + } + await wait(ms) + await openSiftHolyRelicsSuitUI_Start(config.suit) + await wait(ms) + //确认 + let ok = await confirm() + if (isExist(ok)) { + await info(`筛选完成`) + op = true + } + } + return reOk && op +} + +/** + * 打开排序 + * @param log_off + * @returns {Promise} + * <前置条件:处于圣遗物背包界面|测试通过:v> + */ +async function openSort(log_off = config.log_off) { + let up_name = '排序' + // 计算按钮宽度为屏幕宽度的三分之一 + let width = Math.floor(genshinJson.width / 3.0); + // 获取屏幕高度 + let height = Math.floor(genshinJson.height); + // 使用模板指定区域的图像 + let templateMatch = await templateMatchFind(`${path_base_main}${up_name}.jpg`, 0, 0, width, height) + // 检查模板结果是否存在(即升序按钮是否可见) + if (isExist(templateMatch)) { + await logInfoTemplate(templateMatch, 'openSort') + templateMatch.click() + } + return templateMatch +} + +/** + * 切换升序排列的函数 + * 该函数通过模板和点击操作来切换或确认升序排列状态 + * <前置条件:处于圣遗物背包排序界面最底部|测试通过:v> + */ +async function openUpSort() { + // 定义未选中状态下的升序按钮名称 + let up_name = '未选中升序1' + // 计算按钮宽度为屏幕宽度的三分之一 + let width = Math.floor(genshinJson.width / 3.0); + // 获取屏幕高度 + let height = Math.floor(genshinJson.height); + let templateMatch = await templateMatchFind(`${path_base_main}${up_name}.jpg`, 0, 0, width, height) + await wait() + // 检查OCR识别结果是否存在(即升序按钮是否可见) + if (isExist(templateMatch)) { + // 更新按钮名称为选中状态 + up_name = '升序' + // 点击升序按钮 + templateMatch.click() + // 记录切换成功的日志信息 + await info(`切换为${up_name}`) + } else { + // 如果按钮不存在,说明已处于升序状态,记录相应日志 + await info(`已处于升序`) + } + +} + +/** + * 切换等级排列的函数 + * 该函数通过模板和点击操作来切换或确认升序排列状态 + * <前置条件:处于圣遗物背包排序界面最底部|测试通过:v> + * @returns {Promise} + */ +async function openLvSort() { + // 定义未选中状态下的升序按钮名称 + let up_name = '等级顺序排序' + // 计算按钮宽度为屏幕宽度的三分之一 + let width = Math.floor(genshinJson.width / 3.0); + // 获取屏幕高度 + let height = Math.floor(genshinJson.height); + // 使用OCR识别指定区域的图像 + let templateMatch = await templateMatchFind(`${path_base_main}${up_name}.jpg`, 0, 0, width, height) + // await wait(100) + if (isExist(templateMatch)) { + // 更新按钮名称为选中状态 + up_name = '等级顺序排序' + // 点击升序按钮 + templateMatch.click() + // 记录切换成功的日志信息 + await info(`切换为${up_name}`) + } else { + // 如果按钮不存在,说明已处于升序状态,记录相应日志 + await info(`已处于等级顺序排序`) + } +} + +/** + * 异步函数unchecked,用于执行一系列模板匹配点击操作 + * @param {boolean} log_off - 是否记录日志的标志 + * @returns {Promise} - 返回一个Promise,表示异步操作的完成 + * <前置条件:处于圣遗物背包排序界面(需要和拖动配合)|测试通过:v> + */ +async function unchecked(log_off) { + let source = 'unchecked' + // 执行第一次模板匹配点击,点击"取消选择1"按钮,并等待1秒 + await templateMatchClick(`${path_base_sort}1.jpg`, "取消选择1", source, log_off) + await wait() + // 执行第二次模板匹配点击,点击"取消选择2"按钮,并等待1秒 + await templateMatchClick(`${path_base_sort}2.jpg`, "取消选择2", source, log_off) + await wait() + // 执行第三次模板匹配点击,点击"取消选择3"按钮,并等待1秒 + await templateMatchClick(`${path_base_sort}3.jpg`, "取消选择3", source, log_off) + await wait() +} + + +/** + * 初始化页面并根据属性排序进行滚动 + * 该函数会按照特定比例计算滚动高度并执行滚动操作 + * @returns {Promise} 异步函数,返回一个Promise + */ +async function scrollPageByAttributeSortInit() { + // 计算滚动高度:页面总高度的1/5加上1/25 + // 然后执行滚动操作,true表示平滑滚动,6表示滚动速度 + await scrollPage(Math.floor(genshinJson.height * (1 / 5 + 1 / 25)), true, 6) + await info('拖动到看不见辅助排序规则(影响OCR)') +} + +/** + * 根据属性排序点击后的页面滚动函数 + * 该函数使用异步方式执行页面滚动操作 + * @returns {Promise} 返回一个Promise,表示滚动操作的完成 + */ +async function scrollPageByAttributeSortClick() { + // 调用scrollPage函数执行页面滚动 + // 参数说明: + // 1. Math.floor(genshinJson.height * 2 / 3) - 计算滚动的高度,为页面高度的2/3并向下取整 + // 2. true - 表示是否使用平滑滚动 + // 3. 6 - 可能是滚动的延迟时间或步长参数 + await scrollPage(Math.floor(genshinJson.height * 2 / 3), true, 6, 30, 600) +} + +//重置属性排序 +/** + * 重置属性排序的异步函数<1.0.1已修> + * @param {any} x - 辅助排序的x,用于指定第一个属性 + * @param {any} y - 辅助排序的y,用于指定第二个属性 + * @param {any} h - 参数h,用于指定高度或层级 + * @param {boolean} log_off - 日志开关参数,用于控制是否记录日志 + * @returns {Promise} - 不返回任何值的Promise + * <前置条件:处于圣遗物排序最底部界面|测试通过:v> + */ +async function resetAttributeSort(log_off = config.log_off) { + + let x = Math.floor(genshinJson.width * 200 / 1920) + let y = Math.floor(genshinJson.height * 300 / 1080) + let h = Math.floor(genshinJson.height * 10 / 1080) + let width = Math.floor(genshinJson.width * 450 / 1920); + //拖动到看不见辅助排序规则 + await mTo(x, y) + await scrollPageByAttributeSortInit() + await wait() + let template_name = '属性排序规则' + for (let index = 1; index <= 5; index++) { + await unchecked(log_off) + await mTo(x, y) + await scrollPageByAttributeSortClick() + + let templateMatch = await templateMatchFind(`${path_base_main}${template_name}.jpg`, 0, 0, width, genshinJson.height) + if (isExist(templateMatch)) { + await unchecked(log_off) + await info(`已到顶`) + break + } else if (index == 5) { + throwError(`未找到${template_name}`) + } + } + +} + +/** + * 属性排序支持 <1.0.1已修> + * @param keyword + * @param log_off + * @returns {Promise} + * <前置条件:处于圣遗物排序界面 使得辅助排序规则处于最下方不可被OCR识别到|测试通过:v> + */ +async function attributeSort(keyword = config.sortAttribute, source = 'attributeSort', log_off = config.log_off) { + if (!keyword) { + await info('无属性排序规则', must) + return + } + let split = keyword.trim().split('|'); + if (split.length === 0) { + await info('无属性排序规则', must) + return + } + let ms = 600 + let specialKey = '' + let attributeKeys = new Array(); + // warn(split.join(','), must) + for (let i = 0; i < split.length; i++) { + if (i >= 3) { + break + } + let value = attributeReplacement(split[i], log_off) + if (attributeList.indexOf(value) > 0 && i == 2) { + specialKey = value + } else { + attributeKeys.push(value) + } + } + info('筛选:' + attributeKeys.join(','), must) + let attributeKeysOk = new Array(); + let x = Math.floor(genshinJson.height * 200 / 1920) + let y = Math.floor(300 * genshinJson.height / 1080) + let h = Math.floor(genshinJson.height * 10 / 1080) + await mTo(x, y) + await wait(ms) + // await dragBase(0, Math.floor(26 * genshinJson.height / 1080 ), h, log_off) + await scrollPageByAttributeSortInit() + // await wait(100) + let template_name = '属性排序规则' + + let sort = new Array() + let templateMatch_y = Math.floor(60 * genshinJson.height / 1080) + for (let index = 1; index <= 10; index++) { + let width = Math.floor(450 * genshinJson.width / 1920); + let captureRegion = openCaptureGameRegion(); + + let templateMatchObject = recognitionObjectOcr(0, templateMatch_y, width, genshinJson.height - templateMatch_y); + // await mTo(width, 0) + // templateMatchObject.threshold = 1.0; + let resList = findMultiByCaptureGameRegion(captureRegion, templateMatchObject); + closeCaptureGameRegion(captureRegion) + + for (let res of resList) { + await logInfoTemplate(res, source) + if (attributeKeys.indexOf(res.text) >= 0 && attributeKeysOk.indexOf(res.text) < 0) { + // await wait(1) + // res.click() + // attributeKeysOk.push(res.text) + sort.push({index: attributeKeys.indexOf(res.text), text: res.text, x: res.x, y: res.y}) + // await wait(10) + } + } + + sort.sort((a, b) => (a.index - b.index)) + for (let one of sort) { + await info(`[Sort]{index: ${one.index}, text: ${one.text}, x: ${one.x}, y: ${one.y}}`) + if (attributeKeysOk.indexOf(one.text) < 0) { + await wait(ms) + await downClick(one.x, one.y) + attributeKeysOk.push(one.text) + await info(`[Sort] 选中 {index: ${one.index}, text: ${one.text}, x: ${one.x}, y: ${one.y}}`) + } + } + await wait(ms) + await mTo(x, y) + await scrollPageByAttributeSortClick() + await wait(ms) + + let templateMatch = templateMatchFind(`${path_base_main}${template_name}.jpg`, 0, 0, width, genshinJson.height) + if (isExist(templateMatch)) { + + let captureRegion = openCaptureGameRegion(); + let templateMatchObject = recognitionObjectOcr(0, templateMatch_y, width, genshinJson.height - templateMatch_y); + // await mTo(width, 0) + // templateMatchObject.threshold = 1.0; + let resList = findMultiByCaptureGameRegion(captureRegion, templateMatchObject); + closeCaptureGameRegion(captureRegion) + + + for (let res of resList) { + await logInfoTemplate(res, source) + if (attributeKeys.indexOf(res.text) >= 0 && attributeKeysOk.indexOf(res.text) < 0) { + await wait(ms) + // res.click() + // attributeKeysOk.push(res.text) + sort.push({index: attributeKeys.indexOf(res.text), text: res.text, x: res.x, y: res.y}) + } + } + + sort.sort((a, b) => (a.index - b.index)) + for (let one of sort) { + await info(`[已到顶]{index: ${one.index}, text: ${one.text}, x: ${one.x}, y: ${one.y}}`) + if (attributeKeysOk.indexOf(one.text) < 0) { + await info(`选中 ${one.index}`) + await wait(ms) + await downClick(one.x, one.y) + attributeKeysOk.push(one.text) + await info(`[已到顶] 选中 {index: ${one.index}, text: ${one.text}, x: ${one.x}, y: ${one.y}}`) + } + } + + + if (specialKey !== '') { + //特殊排序处理 + await wait(ms) + await clickProgressBarDownBySort() + await wait(ms) + await mTo(x, y) + await scrollPage(Math.floor(genshinJson.height * 1 / 5 + genshinJson.height * 1 / 6), true, 6) + + let captureRegion = openCaptureGameRegion(); + let templateMatchObject = recognitionObjectOcr(0, 0, width, genshinJson.height); + // await mTo(width, 0) + // templateMatchObject.threshold = 1.0; + let resList = findMultiByCaptureGameRegion(captureRegion, templateMatchObject); + closeCaptureGameRegion(captureRegion) + + for (let res of resList) { + await logInfoTemplate(res, source) + if (res.text.includes(specialKey) && attributeKeysOk.indexOf(res.text) < 0) { + await wait(ms) + res.click() + attributeKeysOk.push(res.text) + break + } + } + } + + await info(`已到顶`) + break + } else if (index == 10) { + throwError(`未找到${template_name}`) + } + } + if (attributeKeysOk.length > 0) { + await info(`已选中 ${attributeKeysOk.join(',')}`) + } +} + +/** + * 打开排序并选择所有 + * @param log_off - 日志关闭标志,用于控制是否在操作过程中记录日志 + * @returns {Promise} - 返回一个Promise,表示异步操作的完成 + * 该函数用于执行打开排序并选择所有项目的操作 + * <前置条件:处于圣遗物背包界面|测试通过:v> + */ +async function openSortAll(log_off = config.log_off) { + let ms = 600 + await wait(ms) + // 首先调用openSort函数,传入log_off参数 + let open = await openSort(log_off) + let exist = isExist(open); + if (exist) { + await wait(ms) + await clickProgressBarDownBySort() + //升序 + await openUpSort() + //等级 + await openLvSort() + await wait(ms) + // todo: 可扩展 + await info(`排序中...`, must) + if (config.sortArray.length > 0) { + let width = Math.floor(genshinJson.width * 450 / 1920); + let captureRegion = openCaptureGameRegion(); + let y = Math.floor(genshinJson.height / 2); + let templateMatchObject = recognitionObjectOcr(0, y, width, y); + // await mTo(width, 0) + // templateMatchObject.threshold = 1.0; + let resList = findMultiByCaptureGameRegion(captureRegion, templateMatchObject); + closeCaptureGameRegion(captureRegion) + for (let res of resList) { + // await wait(1) + await logInfoTemplateBase(res, 'SortAll', log_off) + // await wait(1) + // await mTo(res.x, res.y) + if (config.sortArray.find(function (value) { + return value === res.text + })) { + await info(`排序筛选==>${res.text}<==`) + // await wait(1) + // await downClick(res.x, res.y) + await res.click() + } + } + await wait(ms) + } + await info(`[重置排序]操作中耗时长请稍后...`, must) + await resetAttributeSort(log_off) + await wait(ms) + await clickProgressBarDownBySort() + await info(`[筛选排序]开始属性排序`, must) + await attributeSort(config.sortAttribute, log_off) + await wait(ms) + //确认 + await confirm() + await wait(ms) + await info(`筛选完成`) + } else { + let msg = `未找到排序按钮`; + await error(msg) + throwError(msg) + } + return exist +} + +/** + * 打开所有先决条件的异步函数 + * @param {boolean} log_off - 用于控制是否记录关闭操作的标志位 + * @returns {Promise} - 返回一个Promise,表示异步操作的完成 + * 当Promise完成时,表示所有先决条件已成功打开 + * <前置条件:处于圣遗物背包界面|测试通过:v> + */ +async function openPrerequisitesAll(log_off = config.log_off) { + let re = true; + let ms = 600 + await wait(ms) + if (config.toSift) { + // 首先执行 openSiftAll 函数,传入 log_off 参数 + let siftOk = await openSiftAll(log_off); + if (!siftOk) { + throw new Error(`筛选失败`) + re = false; + } + // 然后执行 openSortAll 函数,同样传入 log_off 参数 + await wait(ms) + } + if (config.toSort) { + // 使用 await 确保两个函数按顺序执行 + let sortOk = await openSortAll(log_off); + if (!sortOk) { + throw new Error(`排序失败`) + re = false; + } + } + await wait(ms) + return re +} + +/** + * 点击进度条的异步函数 + * @param {number} x - 点击的x坐标 + * @param {number} y - 点击的y坐标 + * @returns {Promise} 返回一个Promise,表示异步操作完成 + */ +async function clickProgressBar(x, y) { + await mTo(x, y); // 将鼠标移动到指定坐标(x, y) + await downLeftButton() // 模拟按下鼠标左键 + await wait() // 等待1000毫秒(1秒) + await upLeftButton() // 模拟释放鼠标左键 +} + +/** + * 点击进度条顶部的箭头(圣遗物界面) + * 该函数用于定位并点击游戏界面中进度条顶部的箭头按钮 + * <前置条件:处于圣遗物背包界面|测试通过:v> + */ +async function clickProgressBarTopByHolyRelics() { + // // 定义进度条顶部箭头的名称 + // let up_name = '进度条顶部箭头' + // // 计算屏幕宽度的一半 + // // 1300,170 + // let width = Math.floor(genshinJson.width / 2 ); + // // 获取屏幕总高度 + // let height = Math.floor(genshinJson.height ); + // // 设置起始点的x坐标为屏幕宽度的一半 + // var x1 = Math.floor(genshinJson.width / 2 ); + // // 设置起始点的y坐标为0(顶部) + // var y1 = 0; + // // 构建进度条顶部箭头图片的完整路径 + // var path = `${path_base_main}${up_name}.jpg`; + // await wait(10) + // // 使用OCR识别图片在屏幕上的位置和大小 + // let templateMatch = await templateMatch(path, x1, y1, width, height) + // // 记录OCR识别结果 + // await logInfoTemplate(templateMatch) + // // 计算点击位置的x坐标(OCR识别区域的中心点) + // let x = templateMatch.x + Math.floor(templateMatch.width / 2 ); + // // 计算点击位置的y坐标(OCR识别区域的底部) + // let y = templateMatch.y + Math.floor(templateMatch.height ); + // // 输出点击坐标信息 + // await info(`x:${x},y:${y}`) + + + /* await wait(10) + let x = Math.floor(genshinJson.width * 1289 / 1920) + let y = Math.floor(genshinJson.height * 177 / 1080) + // 移动鼠标到计算的位置 + await clickProgressBar(x, y)*/ + let ms = 600 + // await openSiftAll() + await wait(ms) + // await confirm('强制拉到顶') + + + let templateMatchJson = { + "text": "筛选", + "x": 0, + "y": 0, + "width": genshinJson.width / 3.0, + "height": genshinJson.height + } + // 查找筛选按钮元素 + let sift = templateMatchFind(`${path_base_main}${templateMatchJson.text}.jpg`, templateMatchJson.x, templateMatchJson.y, templateMatchJson.width, templateMatchJson.height) + // let templateMatch = await templateMatch(`${path_base_main}确认.jpg`, 0, 0, Math.floor(genshinJson.width / 2), Math.floor(genshinJson.height / 2)) + // logInfoTemplate(templateMatch) + if (isExist(sift)) { + sift.click() + await wait(ms) + await confirm('强制拉到顶') + } else { + throwError(`OCR识别失败未找到确认按钮`) + } + await info('强制拉到顶') +} + +/** + * 点击进度条进度的箭头(排序界面) + * 该函数用于定位并点击游戏界面中进度条顶部的箭头按钮 + * <前置条件:处于圣遗物背包排序界面|测试通过:v> + */ +async function clickProgressBarDownBySort() { + // // 定义进度条顶部箭头的名称 + // let up_name = '排序进度条底部箭头' + // // 计算屏幕宽度的一半 + // let width = Math.floor(genshinJson.width / 2); + // // 获取屏幕总高度 + // let height = Math.floor(genshinJson.height); + // // 设置起始点的x坐标为屏幕宽度的一半 + // let x1 = 0; + // // 设置起始点的y坐标为0(顶部) + // let y1 = 0; + // // 构建进度条顶部箭头图片的完整路径 + // let path = `${path_base_main}${up_name}.jpg`; + // // 使用OCR识别图片在屏幕上的位置和大小 + // let templateMatch = await templateMatch(path, x1, y1, width, height) + // // 记录OCR识别结果 + // await logInfoTemplate(templateMatch) + // await mTo(templateMatch.x, templateMatch.y) + // + // // 计算点击位置的x坐标(OCR识别区域的中心点) + // let x = templateMatch.x + Math.floor(templateMatch.width / 2); + // // 计算点击位置的y坐标(OCR识别区域的底部) + // let y = templateMatch.y - Math.floor(templateMatch.height); + // // 输出点击坐标信息 + // await info(`x:${x},y:${y}`) + // await mTo(x, y) + let x = Math.floor(genshinJson.width * 607 / 1920) + let y = Math.floor(genshinJson.height * 938 / 1080) + // 移动鼠标到计算的位置 + await clickProgressBar(x, y) +} + + +/** + * 点击第一个圣遗物的函数 + * <前置条件:处于圣遗物背包界面|测试通过:v> + */ +async function downClickFirstHolyRelics() { + let ms = 600 + let x = Math.floor(genshinJson.width * 200 / 1920) + let y = Math.floor(genshinJson.height * 250 / 1080) + // await mTo(200,300) + await wait(ms) + await downClick(x, y) + await wait(ms) + await confirm('点击第一个圣遗物', 'downClickFirstHolyRelics') + await wait(ms) + //避免多次点击 + await mTo(x, y) + await wait(ms) + await info('点击第一个圣遗物') + // await openAggrandizement() + // await wait(300) + // let material = config.material + // await openSelectTheClipCondition(material) +} + + +// 判断是否在主界面的函数 +const isInMainUI = () => { + let name = '主界面' + // 定义识别对象 + let paimonMenuRo = RecognitionObject.TemplateMatch( + file.ReadImageMatSync(`${path_base_main}${name}.png`), + 0, + 0, + genshin.width / 3.0, + genshin.width / 5.0 + ); + let captureRegion = openCaptureGameRegion(); + let res = findByCaptureGameRegion(captureRegion, paimonMenuRo); + closeCaptureGameRegion(captureRegion) + return !res.isEmpty(); +}; + +/** + * 打开强化界面的函数 + * + * 该函数会查找游戏中的强化按钮,如果存在则点击它 + * @returns {Promise} - 返回一个Promise,表示异步操作的完成 + * <前置条件:处于圣遗物详情界面|测试通过:v> + */ +async function openAggrandizement() { + let ms = 600 + // 注释掉的代码:使用模板匹配方法查找强化按钮 + // const aggrandizementRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("${path_base_main}强化.jpg"), 0, 0, genshinJson.width / 3.0, genshinJson.height); + // // 捕获游戏区域并查找强化按钮 + // let aggrandizement = captureGameRegion().find(aggrandizementRo); + // 定义OCR识别的JSON对象,包含文本和位置信息 + let templateJson = { + "text": "强化", // 要识别的文本内容 + "x": 0, // 识别区域的左上角x坐标 + "y": 0, // 识别区域的左上角y坐标 + "width": genshinJson.width, // 识别区域的宽度 + "height": genshinJson.height // 识别区域的高度 + } + // 使用模板匹配方法查找强化按钮 + let aggrandizement = templateMatchFind(`${path_base_main}${templateJson.text}.jpg`, templateJson.x, templateJson.y, templateJson.width, templateJson.height) + await logInfoTemplate(aggrandizement, 'openAggrandizement') + + // 检查强化按钮是否存在 + if (isExist(aggrandizement)) { + await wait(ms); + // 输出日志信息,表示正在打开强化界面 + await info('打开强化'); + // 点击强化按钮 + await aggrandizement.click(); + // 等待500毫秒以确保界面完全打开 + mTo(genshinJson.width / 2, genshinJson.height / 2) + } else { + throwError(`识别失败未找到强化按钮`) + } + +} + + +// const confirmRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("${path_base_main}确认.jpg"), 0, 0, genshinJson.width, genshinJson.height); +/** + * 确认 + * @returns {Promise} + */ +async function confirm(log_msg = '点击确认', source = 'confirm') { + return await templateMatchClick(`${path_base_main}确认.jpg`, log_msg, source, config.log_off) +} + +/** + * 清空选中的狗粮 + * @returns {Promise} + */ +async function clear(source = 'clear') { + // 通过OCR识别并点击"详情"按钮 + await templateMatchClick(`${path_base_main}详情.jpg`, "点击详情", source, config.log_off) + await wait(600) + // 通过OCR识别并点击"强化"按钮 + await templateMatchClick(`${path_base_main}强化.jpg`, "点击强化", source, config.log_off) +} + +/** + * 操作方式处理函数 + * @param operate - 操作类型参数 + + * @param log_off - 日志开关参数 + * @returns {Promise} - 返回处理后的操作类型 + */ +async function operateDispose(operate, enableInsertionMethod, source = 'operateDispose', log_off) { + let ms = 600 + let templateMatch_name = '阶段放入' // 默认使用"阶段放入"进行OCR识别 + //自动识别界面元素 + let templateMatch1 = await templateMatch(`${path_base_main}${templateMatch_name}.jpg`) + // 如果默认元素不存在,则切换为"快捷放入" + let exist = isExist(templateMatch1); + if (!exist) { + templateMatch_name = '快捷放入' + } + info(`operateDispose`) + // 如果操作方式为"默认"或未指定,则进行自动识别 + if (operate === '默认' || (!operate)) { + // 更新操作方式为识别到的名称 + operate = templateMatch_name + info(`更新操作方式为识别到的名称:${operate}`) + } else if (config.enableInsertionMethod || enableInsertionMethod) { + info(`如果操作方式为"阶段放入"或"快捷放入",则进行模板匹配`) // 如果操作方式为"阶段放入"或"快捷放入",则进行模板匹配 + // 如果默认元素不存在,则切换为"快捷放入" + if (exist) { + return templateMatch_name + } + //和自动识别互斥 自启动 阶段放入||快捷放入 + await info(`${operate} 未打开`) + + let name = '设置按键' + await templateMatchClick(`${path_base_main}${name}.jpg`, `点击${name}`, source, log_off) + await mTo(genshinJson.width / 2, genshinJson.height / 2) + await wait(ms) + let name4 = `点击关闭` + if (operate !== '快捷放入') { + name4 = `点击开启` + } + await templateMatchClick(`${path_base_main}${name4}.jpg`, `${name4}`, source, log_off) + let name5 = `关闭设置` + await templateMatchClick(`${path_base_main}${name5}.jpg`, `${name5}`, source, log_off) + mTo(0, 0) + } + info(`[放入方式]==>${operate}<==[end]`) + if (isExist(templateMatch1)) { + await wait(ms) + templateMatch1.click() + } else { + throwError(`[放入方式]-${operate} 未打开`) + } + info(`[放入方式]-[click]`) + return operate +} + + +/** + * 模板匹配识别圣遗物强化次数的异步函数 + * 该函数通过截图和OCR技术识别游戏中圣遗物的强化次数 + * @returns {Promise<{sumLevel: number, level: number}>} 返回识别到的强化次数,如果未识别到则返回0 + */ +async function templateMatchHolyRelicsUpFrequency(source = 'HolyRelicsUpFrequency', log_off) { + /* + // // 定义OCR识别的初始坐标和区域大小 + let templateMatch_x = Math.floor(genshinJson.width / 2); // OCR识别区域的x坐标,设置为屏幕宽度的一半 + let templateMatch_y = 0; // OCR识别区域的y坐标,设置为0(屏幕顶部) + let width = Math.floor(genshinJson.width / 2); // OCR识别区域的宽度,设置为屏幕宽度的一半 + let height = Math.floor(genshinJson.height); // OCR识别区域的高度,设置为整个屏幕高度 + + // 定义并执行第一次OCR识别,用于识别经验值图标 + let up_name = 'exp' // 识别对象名称为经验值图标 + let templateMatch1 = await templateMatch(`${path_base_main}${up_name}.jpg`, templateMatch_x, templateMatch_y, width, height) // 执行OCR识别 + if (log_off) { + await logInfoTemplate(templateMatch1, source + '-' + up_name) // 记录OCR识别结果 + } + + // 定义并执行第二次OCR识别,用于识别返回键 + let up_name1 = '返回键' // 识别对象名称为返回键 + let templateMatch2 = await templateMatch(`${path_base_main}${up_name1}.jpg`, templateMatch_x, templateMatch_y, width, height) // 执行OCR识别 + + if (log_off) { + await logInfoTemplate(templateMatch2, source + '-' + up_name1) // 记录OCR识别结果 + } + //todo :bug + // 计算OCR识别的目标区域 + let x = Math.min(templateMatch1.x, templateMatch1.x) // 目标区域的左上角x坐标 + let y = Math.min(templateMatch1.y, templateMatch2.y) // 目标区域的左上角y坐标 + let w = Math.floor(Math.abs(templateMatch1.x - templateMatch2.x) / 2) // 目标区域的宽度 + let h = Math.abs(templateMatch1.y - templateMatch2.y) // 目标区域的高度 + + // let x = Math.floor(genshinJson.width * 1173 / 1920)// 目标区域的左上角x坐标 + // let y = Math.floor(genshinJson.height * 34 / 1080)// 目标区域的左上角y坐标 + // let w = Math.floor(genshinJson.width * 329 / 1920)// 目标区域的宽度 + // let h = Math.floor(genshinJson.height * 145 / 1080)// 目标区域的高度 + await wait(300) + await infoLog(`{x:${x},y:${y},w:${w},h:${h}}`, source) // 记录OCR识别结果*/ + // 截取游戏画面并进行OCR识别 + let ms = 600 + //x=1172, y=134,width:124,height:41 + let all = { + x: Math.floor(genshinJson.width * 1172 / 1920), + y: Math.floor(genshinJson.height * 134 / 1080), + width: Math.ceil(genshinJson.width * 124 / 1920), + height: Math.ceil(genshinJson.height * 41 / 1080) + } + await wait(ms) + let captureRegion = openCaptureGameRegion(); // 截取游戏画面 + const templateMatchObject = await recognitionObjectOcr(all.x, all.y, all.width, all.height); // 创建OCR识别对象 + let res = findByCaptureGameRegion(captureRegion, templateMatchObject); // 执行OCR识别 + closeCaptureGameRegion(captureRegion) + await wait(ms) + if (log_off) { + await logInfoTemplate(res, source) // 记录OCR识别结果 + } + + let levelJson = { + sumLevel: -1,//预估可提升至等级 + level: -1//实际等级 + } + + function keepBeforeThirdPlus(str) { + // 查找第三个 '+' 的索引 + let count = 0; + let index = -1; + let first = 0; + + for (let i = 0; i < str.length; i++) { + if (str[i] === '+') { + count++; + if (count === 3) { + first = i; + } + if (count === 3) { + index = i; + break; + } + } + } + + // 如果找到第三个 '+',返回其之前的内容;否则返回原字符串 + return count >= 3 ? str.substring(first, index) : str; + } + + + if (res.text.includes('+')) { + //保留数字和+ + let va = res.text.replace(/[^+\d]/g, "").replaceAll('++', '+') + va = keepBeforeThirdPlus(va) + // 如果最后不是数字,去掉末尾的 + + va = va.replace(/\+$/g, ""); + let str = "0" + va; + let level = parseInt(str.split("+")[1])//实际等级 + //16识别成166 + if (level > 20) { + warn(`异常识别修正`) + let t_level = Math.floor(level / 10) + va = va.replace(`+${level}`, `+${t_level}`) + level = t_level + } + + str = "0" + va; + + await infoLog(res.text, source + '==处理前') // 记录OCR识别结果 + await infoLog(str, source + '处理过') // 记录OCR识别结果 + let result = new Function(`return ${str}`)() + ""; + await infoLog(result, source) // 记录OCR识别结果 + let sumLevel = parseInt(result)//计算等级 + await info(`圣遗物预估可提升至等级: ${sumLevel}`); // 20 + + await info(`圣遗物实际等级: ${level}`) + levelJson.sumLevel = sumLevel + levelJson.level = level + await wait(ms) + } else { + throwError(`识别异常==>${res.text}<==`) + } + + await warn(`[OCR]-level:${levelJson.level}-sumLevel:${levelJson.sumLevel}`) + return levelJson +} + +/** + * 单次点击强化功能 + * @param operate - 操作参数 + + * @param log_off - 日志开关 + * @returns {Promise<{sumLevel: number, level: number, ok: boolean,start: boolean,okMsg: string, errorMsg: string}>} - 返回一个Promise对象,表示异步操作的完成 + */ +async function upOperate(operate, source = 'upOperate', log_off) { + let ms = 800 + let upJson = { + sumLevel: 0,//预估可提升至等级 + level: 0,//实际等级 + ok: false, // 是否强化成功的标志 + errorMsg: '', // 强化失败的错误信息 + okMsg: '', // 强化失败的错误信息 + start: true // 强化过 + } + + await wait(ms) + //点击operate按钮 + await templateMatchClick(`${path_base_main}${operate}.jpg`, `点击${operate}`, source, log_off) // 调用模板匹配识别并点击指定按钮 + await wait(ms) + + let templateMatchHolyRelics = await templateMatchHolyRelicsUpFrequency(); + await wait(ms) + upJson.level = templateMatchHolyRelics.level + upJson.sumLevel = templateMatchHolyRelics.sumLevel + // 输出当前圣遗物等级的日志信息 + await info(`当前圣遗物等级: ${templateMatchHolyRelics.level}`) + // 检查圣遗物是否已达到满级(20级) + if (templateMatchHolyRelics.level === 20 || templateMatchHolyRelics.level >= config.upMax) { + upJson.start = false + // 记录圣遗物已满级的日志信息 + let op = templateMatchHolyRelics === 20 ? '已满级' : `已达到设置上限${config.upMax}` + let msg1 = `圣遗物${op}`; + await warn(msg1) + // // reJson.errorMsg = msg1 + // // 检查是否启用了批量强化功能 + // if (config.enableBatchUp) { + // //批量强化已开启,执行满级退出强化页面的操作 + // //满级退出强化页面 到圣遗物背包界面 + // await wait(10) + // let up_name = '返回键' + // let logMsg = `${op}退出强化页面 到圣遗物背包界面`; + // await templateMatchClick(`${path_base_main}${up_name}.jpg`, logMsg, source, log_off) + // } else { + // } + return upJson + + } + + await confirm(`[upOperate]点击确认`) // 确认操作 + await mTo(0, 0) + await wait(ms) + // 定义错误信息为"摩拉不足" + let err = '摩拉不足' + // 检查强化是否成功 + let upOk = await templateMatchClick(`${path_base_main}${err}.jpg`, `确认强化是否成功`, log_off) + // 如果识别到错误信息 + if (isExist(upOk)) { + error(`${err}!`); // 输出错误信息 + upJson.errorMsg = err; // 设置强化失败的错误信息 + throwError(err) + return upJson + } else { + upJson.ok = true; // 设置强化成功的标志 + } + //等待时间过短导致识别不上 + await wait(1600) + + let levelJson = await templateMatchHolyRelicsUpFrequency(); + upJson.sumLevel = levelJson.sumLevel + upJson.level = levelJson.level + + if ((!upJson.start) && templateMatchHolyRelics.level === levelJson.level) { + //真实强化过 + upJson.errorMsg = '强化失败:狗粮不足' + upJson.ok = false; + throwError(upJson.errorMsg) + return upJson + } + + warn(`[upOperate] {level: ${upJson.level},sumLevel ,${upJson.sumLevel}}`) + // upJson.upOk = upJson.level !== 0 && upJson.level === upJson.sumLevel + return upJson +} + + +/** + * 单次强化函数 + * + * 该函数用于执行一次强化操作,通过调用operateDispose处理操作参数,然后调用upOperate执行实际强化 + * @param operate - 操作参数对象,包含强化所需的相关配置信息 + * @param log_off - 是否记录日志的布尔值,用于控制是否输出操作日志 + * @returns {Promise<{sumLevel: number, level: number, await errorMsg: string}>} - 返回一个Promise,表示异步操作的完成,无返回值 + */ +async function UpClick(operate, source = 'UpClick', log_off = config.log_off, isFirst = true) { + let ms = 600 + let reJson = { + sumLevel: 0,//预估可提升至等级 + level: 0,//实际等级 + errorMsg: null, // 失败的错误信息 + ok: false, + okMsg: '', + start: true + } + let count = 1 + let upMax = config.upMax + + // operate = await operateDispose(operate, false, log_off) + // await wait(50) // 等待500毫秒,确保界面响应 + + if (isFirst) { + // 调用operateDispose函数处理操作参数,处理后的结果重新赋值给operate变量 + warn(`首次操作`) + + if (upMax < 20) { + //强制使用阶段放入 + operate = '阶段放入' + warn(`强制使用阶段放入`) + + operate = await operateDispose(operate, true, log_off) + await wait(ms) + } + + } + warn(`执行`) + if (operate === '阶段放入') { + count = upMax / 4; + } + + for (let i = 0; i < count; i++) { + operate = await operateDispose(operate, false, log_off) + await wait(ms) // 等待500毫秒,确保界面响应 + // 调用upOperate函数执行实际的强化操作,传入处理后的operate参数和日志控制参数 + let up = await upOperate(operate, source, log_off) + reJson.start = up.start + reJson.ok = up.ok + reJson.errorMsg = up.errorMsg + reJson.okMsg = up.okMsg + reJson.level = up.level + reJson.sumLevel = up.sumLevel + warn(`单个圣遗物第${i + 1}次强化`) + if (up.start && !up.ok) { + //实际强化过 + // 如果强化失败,记录错误信息 + // throw new Error(`${up.errorMsg}`); + throwError(up.errorMsg) + } else if (!up.start) { + //已达到要求的圣遗物 + warn(`该圣遗物已符合要求${reJson.okMsg}==>{level:${up.level},sumLevel:${up.sumLevel}}`) + break + } else if ((!up.ok) && up.sumLevel % 4 != 0) { + let msg2 = `圣遗物预估可提升至等级: ${up.sumLevel},未达到下一阶段等级,退出强化`; + await info(msg2) + await warn(msg2, must) + reJson.errorMsg = msg2 + reJson.okMsg = msg2 + // throwError(msg2) + break + } else { + await info(`强化成功`) + reJson.ok = true + reJson.start = false + reJson.okMsg = '强化成功' + } + } + warn(`[UpClick] {level: ${reJson.level},sumLevel ,${reJson.sumLevel}}`) + warn(`执行完成`) + return reJson +} + +async function ocrTest() { + // let t = await templateMatch(`${path_base_main}test/+16.jpg`) + // await logInfoTemplate(t, "测试") + // let key = await templateMatch(`${path_base_main}test/key.jpg`) + // await logInfoTemplate(key, "key") + /* mTo(Math.ceil(genshinJson.width *3/4), Math.ceil(genshinJson.height * 0.5)) + await scrollPage(200,true) + let key = await templateMatch(`${path_base_main}test/+17.jpg`) + await logInfoTemplate(key, "key")*/ + // return + // await templateMatchHolyRelicsUpFrequency() + + let captureRegion = openCaptureGameRegion(); // 截取游戏画面 + + let f = { + x: 1347, + y: 430, + width: 39, + height: 23 + } + let fTemplate = await recognitionObjectOcr(f.x, f.y, f.width, f.height); // 创建OCR识别对象 + let fRes = findByCaptureGameRegion(captureRegion, fTemplate); // 执行OCR识别 + await logInfoTemplate(fRes, "f") + + //x=1172, y=134,width:124,height:41 + let all = { + x: 1172, + y: 134, + width: 124, + height: 41 + } + let allTemplate = await recognitionObjectOcr(all.x, all.y, all.width, all.height); // 创建OCR识别对象 + let allRes = findByCaptureGameRegion(captureRegion, allTemplate); // 执行OCR识别 + await logInfoTemplate(allRes, "ALL") + //当前x 1175 y 138 width 68 height 35 + let current = { + x: 1175, + y: 138, + width: 68, + height: 35 + } + + let currentTemplate = await recognitionObjectOcr(current.x, current.y, current.width, current.height); // 创建OCR识别对象 + let currentRes = findByCaptureGameRegion(captureRegion, currentTemplate); // 执行OCR识别 + await logInfoTemplate(currentRes, "当前等级") + //预估加x 1242 y 141 width 52 height 28 + let estimate = { + x: 1259, + y: 141, + width: 32, + height: 29 + } + let estimateTemplate = await recognitionObjectOcr(estimate.x, estimate.y, estimate.width, estimate.height); // 创建OCR识别对象 + let estimateRes = findByCaptureGameRegion(captureRegion, estimateTemplate); // 执行OCR识别 + await logInfoTemplate(estimateRes, "+等级") + + return +} + +async function test() { + let isDown = false + let base_x = Math.floor(genshinJson.width * 178 / 1920) + let base_y = Math.floor(genshinJson.height * 200 / 1080) + let base_width = Math.floor(genshinJson.width * 145 / 1920) + let base_height = Math.floor(genshinJson.height * 189 / 1080) + let line = 8 + let page = line * 4 + let startPage = 20//开始页数 + let pageNumber = 20//开始页数后每多少页偏移一次 + await clickProgressBarTopByHolyRelics() + for (let i = 0; i < page * 200; i++) { + + + //从10页开始偏移一次后 每20页偏移一次 + if ((!isDown) && (((i + 1) / page === startPage && (i + 1) % page === 0) || (Math.floor((i + 1) / page) > startPage && (i + 1 - startPage) % (pageNumber * page) === 0))) { + warn(`第${i < startPage ? 1 : (i + 1 - startPage) / (pageNumber * page)}次加滑动修偏移运行`, must) + await scrollPagesByHolyRelicsSelect() + await wait(300) + } + + let bool = i >= (page) && i % (page) === 0; + if (bool) { + warn(`第${Math.floor((i + 1) / (page))}次运行`, must) + await info(`滑动一页`, must) + /*for (let j = 0; j < page / line; j++) { + await wait(1) + let line = Math.floor(genshinJson.height * 175 / 1080) + mTo(Math.floor(genshinJson.width / 2), Math.floor(genshinJson.height * 2 / 3)) + await scrollPage(line, false, 6) + }*/ + if (isDown) { + info(`已滑动到底部`, must) + break + } + isDown = await scrollPagesByHolyRelics(); + await wait(300) + + } + + if (isDown) { + // base_x= + base_y = Math.floor(genshinJson.height * 270 / 1080) + } + + let base_count_x = Math.floor(i % line) + let base_count_y = (i % page) < line ? 0 : Math.floor((i % page) / line); + let x = base_x + base_count_x * base_width; + let y = base_y + base_count_y * base_height; + + // await mTo(x, y) + //测试等待值调低 + await wait(150) + await downClick(x, y) + } +} + +/** + * @returns {Promise<{err: boolean, cont: boolean, msg: string}>} - 返回一个Promise,表示异步操作的完成,无返回值 + */ +async function examine() { + let ms = 600 + let reJson = { + err: false, + cont: false, + msg: '' + } + //检查 + let template_name = '祝圣精华' + let template = await templateMatch(`${path_base_main}${template_name}.jpg`) + if (isExist(template)) { + // error(`[匹配到${template_name}-退出强化]圣遗物强化+${config.upMax} 数量:${actualCount}`, must) + reJson.err = true + reJson.msg = `[匹配到${template_name}-退出强化]` + return reJson + } + await wait(ms) + template_name = '祝圣油膏' + template = await templateMatch(`${path_base_main}${template_name}.jpg`) + if (isExist(template)) { + // error(`[匹配到${template_name}-退出强化]圣遗物强化+${config.upMax} 数量:${actualCount}`, must) + reJson.err = true + reJson.msg = `[匹配到${template_name}-退出强化]` + return reJson + } + let teJson = { + x: Math.ceil(genshinJson.width * 1314 / 1920), + y: Math.ceil(genshinJson.height * 128 / 1080), + width: Math.floor(genshinJson.width * 475 / 1920), + height: Math.floor(genshinJson.height * 762 / 1080) + } + await mTo(Math.floor(teJson.x + teJson.width / 2), Math.floor(teJson.y + teJson.height / 2)) + await wait(ms) + await scrollPage(100, true, 6, 30, 1) + //检查 + let te_name = '五星' + let te = await templateMatchFind(`${path_base_main}${te_name}.jpg`, teJson.x, teJson.y, teJson.width, teJson.height) + if (!isExist(te)) { + // warn(`[匹配到非${te_name}-跳过]`, must) + reJson.cont = true + reJson.msg = `[匹配到非${te_name}-跳过]` + } + return reJson +} + +async function bathClickUpLv1(operate, source = 'bathClickUpLv1', log_off = config.log_off) { + let ms = 600 + // let index = 0 + let upMaxCount = 0 + if (config.upMaxCount) { + upMaxCount = parseInt(config.upMaxCount) + } + if (upMaxCount === null || upMaxCount <= 0) { + throwError(`圣遗物强化个数 必须大于0`) + return + } + //实际强化次数 + let actualCount = 0 + + //点击圣遗物次数 + let i = 0 + //预留 + let lastJson = { + t_x: 0,//当前临时x + t_y: 0,//当前临时y + x: 0, + y: 0, + lastLevel: 0, + t_level: 0, + } + + let isDown = false + + let base_x = Math.floor(genshinJson.width * 178 / 1920) + let base_y = Math.floor(genshinJson.height * 200 / 1080) + let base_width = Math.floor(genshinJson.width * 145 / 1920) + let base_height = Math.floor(genshinJson.height * 189 / 1080) + let line = 8 + let page = line * 4 + let startPage = 20//开始页数 + let pageNumber = 20//开始页数后每多少页偏移一次 +// await clickProgressBarTopByHolyRelics() + + info(`圣遗物${config.sortMain}强化操作`, must) + let isFirst = false + for (let i = 0; upMaxCount > actualCount; i++) { + if (upMaxCount === actualCount) { + info(`强化次数已达到:${upMaxCount}`, must) + break + } + + if (config.sortMain.includes('降序') && isDown) { + base_y = Math.floor(genshinJson.height * 270 / 1080) + } + + let base_count_x = Math.floor(i % line) + let base_count_y = (i % page) < line ? 0 : Math.floor((i % page) / line); + let x = base_x + base_count_x * base_width; + let y = base_y + base_count_y * base_height; + warn(`i:${i},base_count_x:${base_count_x},base_count_y:${base_count_y},x:${x},y:${y}`) + lastJson.t_y = y + lastJson.t_x = x + let isBool = config.sortMain.includes('降序') && config.upMax < 20; + if (isBool) { + if (i < 1) { + //强制拉到顶 + await clickProgressBarTopByHolyRelics() + await wait(ms); + } + + //从10页开始偏移一次后 每20页偏移一次 + if ((!isDown) && (((i + 1) / page === startPage && (i + 1) % page === 0) || (Math.floor((i + 1) / page) > startPage && (i + 1 - startPage) % (pageNumber * page) === 0))) { + warn(`第${i < startPage ? 1 : (i + 1 - startPage) / (pageNumber * page)}次加滑动修偏移运行`) + await scrollPagesByHolyRelicsSelect() + await wait(ms) + } + + let bool = i >= (page) && i % (page) === 0; + if (bool) { + await info(`滑动一页`, must) + /*for (let j = 0; j < page / line; j++) { + await wait(1) + let line = Math.floor(genshinJson.height * 175 / 1080) + mTo(Math.floor(genshinJson.width / 2), Math.floor(genshinJson.height * 2 / 3)) + await scrollPage(line, false, 6) + }*/ + if (isDown) { + info(`已滑动到底部`, must) + break + } + isDown = await scrollPagesByHolyRelics(); + await wait(ms) + } + + // warn(`x:${x},y:${y}`) + // await mTo(x, y) + await wait(ms) + await downClick(x, y) + warn(`点击确认x:${x},y:${y}`) + // await wait(10) + // await confirm('降序强化点击确认') + // await wait() + // //打开强化界面 + // await openAggrandizement() + } else { + //强制拉到顶 + await clickProgressBarTopByHolyRelics() + await wait(ms); + // 调用点击第一个圣物遗物的函数,并等待其完成 + await downClickFirstHolyRelics() + // await wait(); + } + let ex = await examine() + if (ex.err) { + await error(ex.msg, must) + break + } else if (ex.cont) { + await warn(ex.msg, must) + continue + } + let log_msg = isBool ? '降序强化点击确认' : '点击第一个圣遗物' + await confirm(log_msg, isBool ? '降序confirm' : 'downClickFirstHolyRelics') + // await wait(ms) + //避免多次点击 + await mTo(genshinJson.width / 2, genshinJson.height / 2) + await wait(ms) + await info(log_msg) + + // await wait(ms) + // //避免多次点击 + // await mTo(x, y) + await openAggrandizement() + await wait(ms) // 等待500毫秒,确保界面响应 + + let re = await UpClick(operate, source, log_off, i === 0 ? true : isFirst); + warn(`第${i}次强化结果:{sumLevel: ${re.sumLevel},level: ${re.level},errorMsg: ${re.errorMsg},ok: ${re.ok},okMsg: ${re.okMsg},start: ${re.start}}`) + if (re.ok) { + lastJson.t_level = re.level + } + + //放入方式的判断 + if (i === 0 && re.start && (!isFirst) && !re.ok) { + //只要一次 + isFirst = true + } + + if (i !== 0 && isFirst) { + //也只会执行一次 需求 true 变false 一次 中for中 以到达放入方式值操作一次开关 + isFirst = isFirst && !re.ok + } + + if (re.ok || !re.start) { + actualCount++ + // 如果强化成功,则继续下一个圣遗物 + await info(((!re.ok) && !re.start) ? `需求:+${config.upMax},实际:+${re.level},符合要求` : `需求:+${re.level} 强化成功`, must) + await wait(ms) + let up_name = '返回键' + await templateMatchClick(`${path_base_main}${up_name}.jpg`, `圣遗物已经强化到+${config.upMax}退出强化页面 到圣遗物背包界面`, source, log_off) + //返回圣遗物背包 + if (!re.start) { + continue + } + } else { + // 如果强化失败,则退出循环 + await infoLog(`强化失败:${re.errorMsg}`, source) + break + } + + + lastJson.y = lastJson.t_y + lastJson.x = lastJson.t_x + if (re.ok) { + lastJson.lastLevel = lastJson.t_level + } + + if (upMaxCount !== null && i === upMaxCount - 1) { + info(`${upMaxCount}个圣遗物已经强化到+${config.upMax}终止运行`) + await toMainUi() + await wait(ms) + break + } + warn(`当前强化次数:${actualCount} 总强化次数:${upMaxCount}`) + } + info(`圣遗物强化+${config.upMax} 数量:${actualCount}`, must) + +} + + +async function toMainUi() { + let ms = 300 + let index = 1 + await wait(); + while (!isInMainUI()) { + await wait(); + await genshin.returnMainUi(); // 如果未启用,则返回游戏主界面 + await wait(); + if (index > 3) { + throwError(`多次尝试返回主界面失败`); + } + index += 1 + } + +} + + +(async function () { + await main() +})(); + +//=========弃用以下========= + +/** + * 批量强化函数(已经升级) + * @param operate - 操作参数对象 + * @param log_off - 是否注销标志 + * @returns {Promise} - 返回一个空Promise,表示异步操作完成 + */ +async function bathClickUp(operate, source = 'bathClickUp', log_off = config.log_off) { + let ms = 600 + // let index = 0 + let upMaxCount = 0 + if (config.upMaxCount) { + upMaxCount = Math.floor(config.upMaxCount) + } + if (upMaxCount === null || upMaxCount <= 0) { + throwError(`圣遗物强化个数 必须大于0`) + return + } + info("强化开始") + // while (true) { + + for (let i = 1; i <= upMaxCount; i++) { + + if (config.sortMain === '降序' && upMaxCount < 20) { + if (i === 1) { + //强制拉到顶 + await clickProgressBarTopByHolyRelics() + await wait(ms); + } + //每行8个 + // throwError(`降序排序功能暂未实现自动强化`) + let line = 8 + let base_x = Math.floor(genshinJson.height * 200 / 1920) + let base_y = Math.floor(genshinJson.height * 250 / 1080) + let base_width = Math.floor(genshinJson.width * 145 / 1920) + let base_height = Math.floor(genshinJson.height * 189 / 1080) + let base_count_x = Math.floor(i % line) + let x = base_x + base_count_x * base_width; + let y = base_y; + if (i % 8 === 1) { + await wait(ms) + } + let bool = i >= (line) && i % (line) === 0; + if (bool) { + await info(`滑动一行`) + await wait(ms) + // await dragBase(0, -9, base_height / 9, config.log_off) + await scrollPage(200, true, 6) + await wait(ms) + } + // info(`x:${x},y:${y}`) + await mTo(x, y) + // await wait() + await downClick(x, y) + await openAggrandizement() + } else { + //强制拉到顶 + await clickProgressBarTopByHolyRelics() + await wait(ms); + // 调用点击第一个圣物遗物的函数,并等待其完成 + await downClickFirstHolyRelics() + await wait(ms); + } + //打开强化界面 + await openAggrandizement() + await wait(ms) // 等待500毫秒,确保界面响应 + let re = await UpClick(operate, source, log_off, i === 1); + if (!re.errorMsg) { + // 如果强化成功,则继续下一个圣遗物 + await info(`强化成功`) + await wait(ms) + let up_name = '返回键' + await templateMatchClick(`${path_base_main}${up_name}.jpg`, `圣遗物已经强化到+${config.upMax}退出强化页面 到圣遗物背包界面`, source, log_off) + //返回圣遗物背包 + } else { + // 如果强化失败,则退出循环 + await info(`强化失败`) + break + } + info(`圣遗物强化+${config.upMax} 数量:${i}`) + + if (upMaxCount !== null && i === upMaxCount) { + info(`${upMaxCount}个圣遗物已经强化到+${config.upMax}终止运行`) + await toMainUi() + await wait(ms) + break + } + } + // } + await wait(ms) + await toMainUi() +} + + +/** + * 打开选择素材条件 弃用 + * 该函数用于打开游戏中的素材选择界面,并根据传入的条件自动选择对应的素材 + * @param {string} condition - 需要选择的素材条件文本 + * @returns {Promise} 异步函数,无返回值 + * todo:<前置条件:处于圣遗物强化界面|测试通过:x> 出现问题:执行完成后会自动点击按键 任务结束后也会出现 执行下其他脚本后消失 + */ +async function openSelectTheClipCondition(condition = config.material) { + let ms = 100 + // 检查是否传入了有效的素材条件 + await info(condition) + if (condition === null || condition === '默认') { + await info(`使用默认素材`) + } else { + let captureRegion = openCaptureGameRegion(); + let tmJson = { + x: Math.floor(genshinJson.width * 1300 / 1920), + y: Math.floor(genshinJson.height * 760 / 1080), + width: Math.floor(genshinJson.width * 162 / 1920), + height: Math.floor(genshinJson.height * 173 / 1080) + } + // 创建OCR识别对象 + let tm = await recognitionObjectOcr(tmJson.x, tmJson.y, tmJson.width, tmJson.height); + let res = findByCaptureGameRegion(captureRegion, tm); + + if (isExist(res) && condition === res.text) { + closeCaptureGameRegion(captureRegion) + return + } + + let x = Math.floor(genshinJson.width * 1300 / 1920) + let y = Math.floor(genshinJson.height * 760 / 1080) + await downClick(x, y) + await wait(ms) + await mTo(genshinJson.width / 2, genshinJson.height / 2) + // await wait(ms) + + //x: 1194, y: 803,width: 162, height: 173 + let templateMatch = { + x: Math.floor(genshinJson.width * 1194 / 1920), + y: Math.floor(genshinJson.height * 803 / 1080), + width: Math.floor(genshinJson.width * 162 / 1920), + height: Math.floor(genshinJson.height * 173 / 1080) + } + + // 创建OCR识别对象 + let templateMatchObject = await recognitionObjectOcr(templateMatch.x, templateMatch.y, templateMatch.width, templateMatch.height); + // 捕获游戏界面并执行OCR识别 + + let resList = findMultiByCaptureGameRegion(captureRegion, templateMatchObject); + closeCaptureGameRegion(captureRegion) + + let index = 0; + // 遍历OCR识别结果 + for (let res of resList) { + await info(`[==]${index}识别结果: ${res.text}, 原始坐标: x=${res.x}, y=${res.y}`); + // 跳过第一个结果(可能是标题),查找匹配条件的选项 + if (index !== 0 && res.text.includes(condition)) { + await info(`点击${res.text}`) + // await wait(ms); + res.click(); + // await downClick(res.x, res.y); + await mTo(genshinJson.width / 2, genshinJson.height / 2) + await info('[break]') + break; + } + index++ + } + + return + /* // const selectTheClipConditionButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(`${path_base_main}选择素材条件按键.jpg`), 0, 0, genshinJson.width, genshinJson.height); + + // 捕获游戏界面并查找"选择素材条件"按钮 + // let buttonObject = captureGameRegion().find(selectTheClipConditionButtonRo); + let buttonObject = await templateMatchFind(`${path_base_main}选择素材条件按键.jpg`, 0, 0, genshinJson.width, genshinJson.height) + await wait(ms) + // 检查按钮是否存在 + if (isExist(buttonObject)) { + await info('打开选择素材条件') + await wait(ms); + // 点击按钮并等待界面加载 + // await buttonObject.click(); + let x = Math.floor(genshinJson.width * 1524 / 1920) + let y = Math.floor(genshinJson.height * 758 / 1080) + downClick(x, y) + await wait(ms); + + await info(`素材条件==>x:${buttonObject.x},y:${buttonObject.y}`) + + let needMoLa = await templateMatchFind(`${path_base_main}需要摩拉.jpg`, 0, 0, genshinJson.width, genshinJson.height) + await wait(ms) + // 检查是否能定位到"需要摩拉"文本区域 + if (!isExist(needMoLa)) { + let msg = `无法定位识别!` + await error(msg) + throwError(msg) + } else { + // 计算OCR识别区域的坐标和尺寸 + // let templateMatch_x = Math.min(needMoLa.x, buttonObject.x) + // let templateMatch_y = Math.min(needMoLa.y, buttonObject.y) + // let templateMatch_width = Math.abs(needMoLa.x - buttonObject.x) + // let templateMatch_height = Math.abs(needMoLa.y - buttonObject.y) + await info(`OCR==>x:${templateMatch_x},y:${templateMatch_y},width:${templateMatch_width},height:${templateMatch_height}`) + //x:1170,y:758,width:354,height:243 + let templateMatch_x = Math.floor(genshinJson.width * 1170 / 1920) + let templateMatch_y = Math.floor(genshinJson.height * 758 / 1080) + let templateMatch_width = Math.floor(genshinJson.width * 354 / 1920) + let templateMatch_height = Math.floor(genshinJson.height * 243 / 1080) + // 以下代码被注释,可能是用于调试的鼠标移动 + // await mTo(templateMatch_x, templateMatch_y) + // 创建OCR识别对象 + let templateMatchObject = await recognitionObjectOcr(templateMatch_x, templateMatch_y, templateMatch_width, templateMatch_height); + // 捕获游戏界面并执行OCR识别 + let captureRegion = openCaptureGameRegion(); + let resList = findMultiByCaptureGameRegion(captureRegion, templateMatchObject); + closeCaptureGameRegion(captureRegion) + let index = 0; + // 遍历OCR识别结果 + for (let res of resList) { + await info(`[==]${index}识别结果: ${res.text}, 原始坐标: x=${res.x}, y=${res.y}`); + // 跳过第一个结果(可能是标题),查找匹配条件的选项 + if (index !== 0 && res.text.includes(condition)) { + await info(`点击${res.text}`) + await wait(ms); + res.click(); + // await downClick(res.x, res.y); + await mTo(genshinJson.width / 2, genshinJson.height / 2) + await info('[break]') + break; + } + index++ + } + } + + }*/ + } + +} + diff --git a/repo/js/HolyRelicsUp/manifest.json b/repo/js/HolyRelicsUp/manifest.json new file mode 100644 index 000000000..149634bce --- /dev/null +++ b/repo/js/HolyRelicsUp/manifest.json @@ -0,0 +1,14 @@ +{ + "name": "圣遗物批量强化", + "version": "1.1.0", + "description": "一个批量强化圣遗物的脚本", + "settings_ui": "settings.json", + "main": "main.js", + "authors": [ + { + "name": "云端客", + "link": "https://github.com/Kirito520Asuna" + } + ], + "dependencies": [] +} \ No newline at end of file diff --git a/repo/js/HolyRelicsUp/settings.json b/repo/js/HolyRelicsUp/settings.json new file mode 100644 index 000000000..0e534db7b --- /dev/null +++ b/repo/js/HolyRelicsUp/settings.json @@ -0,0 +1,171 @@ +[ + { + "name": "toBag", + "type": "checkbox", + "label": "启用自动进入背包", + "default": true + }, + { + "name": "enableBatchUp", + "type": "checkbox", + "label": "启用批量强化(注:可单独使用单独使用时\n请处于圣遗物背包筛选未满级状态后)", + "default": false + }, + { + "name": "enableInsertionMethod", + "type": "checkbox", + "label": "自动启用放入方式 快捷放入/阶段放入(优先级高)", + "default": false + }, + { + "name": "insertionMethod", + "type": "select", + "label": "放入方式(默认:自动识别,\n注意:最大强化等级设置为4,8,16时\n强制使用放入方式为阶段放入)", + "options": [ + "默认", + "快捷放入", + "阶段放入" + ], + "default": "默认" + }, + { + "name": "material", + "type": "select", + "label": "选择素材(默认:自动识别)\n(消失太快无法识别禁用)", + "options": [ + "默认", + "1星素材", + "2星及以下素材", + "3星及以下素材", + "4星及以下素材" + ], + "default": "默认" + }, + { + "name": "upMaxCount", + "type": "input-text", + "label": "最大圣遗物强化个数", + "default": "" + }, + { + "name": "upMax", + "type": "select", + "label": "最大强化等级(默认4)", + "options": [ + "4", + "8", + "16", + "20" + ], + "default": "4" + }, + + { + "name": "toSort", + "type": "checkbox", + "label": "启用自动排序(未启用时以下配置 排序 均无效)", + "default": true + }, + { + "name": "sortAttribute", + "type": "input-text", + "label": "属性排序(使用|分割)\n可使用简称如: 生命%|雷伤|充能", + "default": "" + }, + { + "name": "sortMain", + "type": "select", + "label": "主排序", + "options": [ + "升序", + "降序", + ], + "default": "升序" + }, + { + "name": "sortAuxiliary", + "type": "select", + "label": "辅助排序", + "options": [ + "等级顺序", + "品质顺序", + ], + "default": "等级顺序" + }, + { + "name": "toSift", + "type": "checkbox", + "label": "启用筛选圣遗物开关(未启用时以下配置 圣遗物筛选 均无效)", + "default": true + }, + { + "name": "suit", + "type": "input-text", + "label": "圣遗物筛选(使用|分割 的模糊匹配 <无个数限制>如: 如雷|苍白|...)", + "default": "" + }, + { + "name": "countMaxByHoly", + "type": "select", + "label": "筛选圣遗物界面最大翻页次数 (默认4)", + "options": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + ], + "default": "4" + }, + { + "name": "holyRelicsLockMark", + "type": "checkbox", + "label": "圣遗物筛选:(锁定状态)|标记", + "default": false + }, + { + "name": "holyRelicsLockY", + "type": "checkbox", + "label": "圣遗物筛选:(锁定状态)|仅锁定", + "default": false + }, + { + "name": "holyRelicsLockN", + "type": "checkbox", + "label": "圣遗物筛选:(锁定状态)|未锁定", + "default": false + }, + { + "name": "holyRelicsEquipY", + "type": "checkbox", + "label": "圣遗物筛选:(装备状态)|已装备", + "default": false + }, + { + "name": "holyRelicsEquipN", + "type": "checkbox", + "label": "圣遗物筛选:(装备状态)|未装备", + "default": false + }, + { + "name": "holyRelicsSourceFrostSaint", + "type": "checkbox", + "label": "圣遗物筛选:(来源)|祝圣之霜定义", + "default": false + }, + { + "name": "knapsackKey", + "type": "input-text", + "label": "打开背包按键(不填,默认:B)", + "default": "B" + }, + { + "name": "log_off", + "type": "checkbox", + "label": "日志开关(用于开发者调试)", + "default": false + } +]