From 69f3352b236bb99c1396460057303de3c5f03db5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BA=81=E5=8A=A8=E7=9A=84=E6=B0=A8=E6=B0=94?= <131591012+zaodonganqi@users.noreply.github.com> Date: Thu, 5 Feb 2026 14:08:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E5=87=BD=E6=95=B0=20(#2823)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build_release_branch.yml | 2 +- build/dev_deploy.js | 189 ++ packages/assets/files/combat_avatar.json | 2053 ++++++++++++++++++++ packages/assets/imgs/esc_settings.png | Bin 0 -> 2466 bytes packages/assets/imgs/girl_moon.png | Bin 0 -> 16126 bytes packages/assets/imgs/page_close_white.png | Bin 0 -> 1560 bytes packages/assets/imgs/paimon_menu.png | Bin 0 -> 2372 bytes packages/assets/imgs/primogem.png | Bin 0 -> 15382 bytes packages/assets/imgs/welkin_moon_logo.png | Bin 0 -> 8475 bytes packages/utils/tool.js | 561 ++++++ 10 files changed, 2804 insertions(+), 1 deletion(-) create mode 100644 build/dev_deploy.js create mode 100644 packages/assets/files/combat_avatar.json create mode 100644 packages/assets/imgs/esc_settings.png create mode 100644 packages/assets/imgs/girl_moon.png create mode 100644 packages/assets/imgs/page_close_white.png create mode 100644 packages/assets/imgs/paimon_menu.png create mode 100644 packages/assets/imgs/primogem.png create mode 100644 packages/assets/imgs/welkin_moon_logo.png create mode 100644 packages/utils/tool.js diff --git a/.github/workflows/build_release_branch.yml b/.github/workflows/build_release_branch.yml index a68b7b76d..73cbc94f0 100644 --- a/.github/workflows/build_release_branch.yml +++ b/.github/workflows/build_release_branch.yml @@ -64,7 +64,7 @@ jobs: git rm -rf . echo "📦 检出 main 分支的内容到工作区" - git checkout main -- repo .gitignore + git checkout main -- repo packages .gitignore echo "📋 复制生成的文件到 release 分支" cp ../repo.json . diff --git a/build/dev_deploy.js b/build/dev_deploy.js new file mode 100644 index 000000000..0cbf56692 --- /dev/null +++ b/build/dev_deploy.js @@ -0,0 +1,189 @@ +const fs = require('fs'); +const path = require('path'); + +// ================= 使用说明 ================= +// 1. 请确保你是以bettergi-script-list完整仓库的环境运行此脚本 +// 2. 请确保你本地配置了node.js环境 +// 3. 运行: node dev_deploy.js 脚本文件夹名 BGI目录。例:node build/dev_deploy.js test E:\BetterGIProject\BetterGI +// 4. 脚本自动导入,会删除原有packages后导入新的packages,其他文件覆盖式导入 +// =========================================== + +// 脚本名称(repo/js 下的文件夹名) +const SCRIPT_NAME = process.argv[2]; + +// BetterGI 软件根目录(包含 User 文件夹) +const BETTERGI_ROOT = process.argv[3]; + +if (!SCRIPT_NAME || !BETTERGI_ROOT) { + console.error('❌ 参数不足。'); + console.error('用法: node dev_deploy.js '); + process.exit(1); +} + +// 路径定义 +const REPO_ROOT = path.resolve(__dirname, '..'); +const SOURCE_SCRIPT_DIR = path.join(REPO_ROOT, 'repo', 'js', SCRIPT_NAME); +const TARGET_SCRIPT_DIR = path.join( + path.resolve(BETTERGI_ROOT), + 'User', + 'JsScript', + SCRIPT_NAME +); + +const PROCESSED_PACKAGES = new Set(); +const PROCESSED_FILES = new Set(); // 避免循环扫描 + +function main() { + console.log(`📂 源目录: ${SOURCE_SCRIPT_DIR}`); + console.log(`📂 目标目录: ${TARGET_SCRIPT_DIR}`); + + if (!fs.existsSync(SOURCE_SCRIPT_DIR)) { + console.error(`❌ 错误: 找不到本地脚本目录: ${SOURCE_SCRIPT_DIR}`); + process.exit(1); + } + + // 复制主脚本目录 + if (!fs.existsSync(TARGET_SCRIPT_DIR)) { + fs.mkdirSync(TARGET_SCRIPT_DIR, { recursive: true }); + } + + // 清理旧的 packages 目录,防止残留 + const targetPackagesDir = path.join(TARGET_SCRIPT_DIR, 'packages'); + if (fs.existsSync(targetPackagesDir)) { + console.log('🧹 清理旧依赖目录...'); + fs.rmSync(targetPackagesDir, { recursive: true, force: true }); + } + + copyDir(SOURCE_SCRIPT_DIR, TARGET_SCRIPT_DIR); + + // 解析依赖 + console.log('🔍 解析依赖并注入 packages...'); + resolveDependenciesRecursively(TARGET_SCRIPT_DIR); + + console.log('✅ 部署完成!可在 BetterGI 中运行测试。'); +} + +/** + * 递归扫描目录中的 JS 文件并处理依赖 + * @param {string} dir + */ +function resolveDependenciesRecursively(dir) { + const entries = fs.readdirSync(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + resolveDependenciesRecursively(fullPath); + } else if (entry.isFile() && entry.name.endsWith('.js')) { + processJsFile(fullPath); + } + } +} + +/** + * 处理单个 JS 文件 + * @param {string} filePath + */ +function processJsFile(filePath) { + if (PROCESSED_FILES.has(filePath)) return; + PROCESSED_FILES.add(filePath); + + let content = fs.readFileSync(filePath, 'utf-8'); + + // 匹配 import + const regex = /(import\s+(?:[\w\s{},*]*?from\s+)?['"]|require\s*\(\s*['"]|import\s+['"])([^'"]+)(['"])/g; + + let match; + while ((match = regex.exec(content)) !== null) { + const importPath = match[2]; // Group 2 is the path + + // 处理显式 packages/ 引用 + const packageIndex = importPath.indexOf('packages/'); + if (packageIndex >= 0) { + let packagePath = importPath.substring(packageIndex); + + // 复制且(如果是JS)递归处理 + copyPackageResource(packagePath); + } + else if (importPath.startsWith('.')) { + // 处理 packages 内部的相对引用 + const targetPackagesDir = path.join(TARGET_SCRIPT_DIR, 'packages'); + if (filePath.startsWith(targetPackagesDir)) { + const relToScript = path.relative(TARGET_SCRIPT_DIR, filePath); + const relDir = path.dirname(relToScript); + let depPackagePath = path.join(relDir, importPath); + depPackagePath = depPackagePath.split(path.sep).join('/'); + + if (depPackagePath.startsWith('packages/')) { + copyPackageResource(depPackagePath); + } + } + } + } +} + +/** + * 从源仓库复制 package 资源到目标位置 + * @param {string} packagePath 相对路径,如 "packages/utils/test" + */ +function copyPackageResource(packagePath) { + if (tryCopy(packagePath)) return; + if (!packagePath.endsWith('.js') && tryCopy(packagePath + '.js')) return; + console.warn(`⚠️ 警告: 未找到依赖资源 ${packagePath}`); +} + +/** + * 尝试复制文件或目录 + * @param {string} relPath + * @returns {boolean} + */ +function tryCopy(relPath) { + const src = path.join(REPO_ROOT, relPath); + + if (!fs.existsSync(src)) return false; + + if (PROCESSED_PACKAGES.has(relPath)) return true; + + const dest = path.join(TARGET_SCRIPT_DIR, relPath); + const destDir = path.dirname(dest); + + if (!fs.existsSync(destDir)) { + fs.mkdirSync(destDir, { recursive: true }); + } + + const stat = fs.statSync(src); + if (stat.isDirectory()) { + copyDir(src, dest); + resolveDependenciesRecursively(dest); + } else { + fs.copyFileSync(src, dest); + // 如果是 JS 文件,需要递归解析它的依赖 + if (dest.endsWith('.js')) { + processJsFile(dest); + } + } + + PROCESSED_PACKAGES.add(relPath); + return true; +} + +/** + * 递归复制目录 + * @param {string} src + * @param {string} dest + */ +function copyDir(src, dest) { + if (!fs.existsSync(dest)) fs.mkdirSync(dest, { recursive: true }); + const entries = fs.readdirSync(src, { withFileTypes: true }); + for (const entry of entries) { + const srcPath = path.join(src, entry.name); + const destPath = path.join(dest, entry.name); + if (entry.isDirectory()) { + copyDir(srcPath, destPath); + } else { + fs.copyFileSync(srcPath, destPath); + } + } +} + +main(); diff --git a/packages/assets/files/combat_avatar.json b/packages/assets/files/combat_avatar.json new file mode 100644 index 000000000..a5c84a795 --- /dev/null +++ b/packages/assets/files/combat_avatar.json @@ -0,0 +1,2053 @@ +[ + { + "alias": [ + "旅行者", + "主角", + "卑鄙的外乡人", + "荣誉骑士", + "爷", + "主", + "履刑者", + "抽卡不歪真君" + ], + "id": "20000000", + "name": "旅行者", + "nameEn": "Traveler", + "weapon": "1" + }, + { + "alias": [ + "荧", + "女主", + "女主角", + "莹", + "萤", + "黄毛阿姨", + "荧妹", + "女爷", + "包包", + "宴宁" + ], + "id": "10000007", + "name": "荧", + "nameEn": "PlayerGirl", + "weapon": "1" + }, + { + "alias": [ + "空", + "男主", + "男主角", + "龙哥", + "空哥", + "男爷" + ], + "id": "10000005", + "name": "空", + "nameEn": "PlayerBoy", + "weapon": "1" + }, + { + "alias": [ + "奇偶(男)", + "MannequinBoy" + ], + "id": "10000117", + "name": "奇偶(男)", + "nameEn": "MannequinBoy", + "weapon": "1" + }, + { + "alias": [ + "奇偶(女)", + "MannequinGirl" + ], + "id": "10000118", + "name": "奇偶(女)", + "nameEn": "MannequinGirl", + "weapon": "1" + }, + { + "alias": [ + "神里绫华", + "Kamisato Ayaka", + "Ayaka", + "神里", + "绫华", + "神里凌华", + "凌华", + "白鹭公主", + "神里大小姐", + "龟", + "龟龟", + "乌龟" + ], + "burstCD": 20, + "id": "10000002", + "name": "神里绫华", + "nameEn": "Ayaka", + "skillCD": 10, + "weapon": "1" + }, + { + "alias": [ + "琴", + "Jean", + "团长", + "代理团长", + "琴团长", + "蒲公英骑士" + ], + "burstCD": 20, + "id": "10000003", + "name": "琴", + "nameEn": "Qin", + "skillCD": 6, + "weapon": "1" + }, + { + "alias": [ + "丽莎", + "Lisa", + "图书管理员", + "图书馆管理员", + "蔷薇魔女", + "阿姨" + ], + "burstCD": 20, + "id": "10000006", + "name": "丽莎", + "nameEn": "Lisa", + "skillCD": 1, + "skillHoldCD": 16, + "weapon": "10" + }, + { + "alias": [ + "芭芭拉", + "Barbara", + "巴巴拉", + "内鬼", + "加湿器", + "肉身解咒", + "肉身解咒真君", + "闪耀偶像", + "偶像" + ], + "burstCD": 20, + "id": "10000014", + "name": "芭芭拉", + "nameEn": "Barbara", + "skillCD": 32, + "weapon": "10" + }, + { + "alias": [ + "凯亚", + "Kaeya", + "盖亚", + "凯子哥", + "凯鸭", + "矿工", + "矿工头子", + "骑兵队长", + "凯子", + "凝冰渡海真君" + ], + "burstCD": 15, + "id": "10000015", + "name": "凯亚", + "nameEn": "Kaeya", + "skillCD": 6, + "weapon": "1" + }, + { + "alias": [ + "迪卢克", + "Diluc", + "卢姥爷", + "姥爷", + "卢老爷", + "卢锅巴", + "正义人", + "正e人", + "正E人", + "卢本伟", + "暗夜英雄", + "卢卢伯爵", + "落魄了", + "落魄了家人们" + ], + "burstCD": 12, + "id": "10000016", + "name": "迪卢克", + "nameEn": "Diluc", + "skillCD": 10, + "weapon": "11" + }, + { + "alias": [ + "雷泽", + "Razor", + "狼少年", + "狼崽子", + "狼崽", + "卢皮卡", + "小狼", + "小狼狗", + "狼孩" + ], + "burstCD": 20, + "id": "10000020", + "name": "雷泽", + "nameEn": "Razor", + "skillCD": 6, + "skillHoldCD": 10, + "weapon": "11" + }, + { + "alias": [ + "安柏", + "Amber", + "安伯", + "兔兔伯爵", + "飞行冠军", + "侦查骑士", + "点火姬", + "点火机", + "打火机", + "打火姬" + ], + "burstCD": 12, + "id": "10000021", + "name": "安柏", + "nameEn": "Ambor", + "skillCD": 15, + "weapon": "12" + }, + { + "alias": [ + "温迪", + "Venti", + "温蒂", + "风神", + "卖唱的", + "巴巴托斯", + "巴巴脱丝", + "芭芭托斯", + "芭芭脱丝", + "干点正事", + "不干正事", + "吟游诗人", + "诶嘿", + "唉嘿", + "摸鱼" + ], + "burstCD": 15, + "id": "10000022", + "name": "温迪", + "nameEn": "Venti", + "skillCD": 6, + "skillHoldCD": 15, + "weapon": "12" + }, + { + "alias": [ + "香菱", + "Xiangling", + "香玲", + "锅巴", + "厨师", + "万民堂厨师", + "香师傅" + ], + "burstCD": 20, + "id": "10000023", + "name": "香菱", + "nameEn": "Xiangling", + "skillCD": 12, + "weapon": "13" + }, + { + "alias": [ + "北斗", + "Beidou", + "大姐头", + "大姐", + "无冕的龙王" + ], + "burstCD": 20, + "id": "10000024", + "name": "北斗", + "nameEn": "Beidou", + "skillCD": 7.5, + "weapon": "11" + }, + { + "alias": [ + "行秋", + "Xingqiu", + "秋秋人", + "秋妹妹", + "书呆子", + "枕玉", + "飞云商会二少爷" + ], + "burstCD": 20, + "id": "10000025", + "name": "行秋", + "nameEn": "Xingqiu", + "skillCD": 21, + "weapon": "1" + }, + { + "alias": [ + "魈", + "Xiao", + "打桩机", + "插秧", + "三眼五显仙人", + "三眼五显真人", + "降魔大圣", + "护法夜叉", + "快乐风男", + "无聊", + "靖妖傩舞", + "矮子仙人", + "三点五尺仙人", + "跳跳虎", + "风夜叉" + ], + "burstCD": 18, + "id": "10000026", + "name": "魈", + "nameEn": "Xiao", + "skillCD": 10, + "weapon": "13" + }, + { + "alias": [ + "凝光", + "Ningguang", + "富婆", + "天权星", + "天权" + ], + "burstCD": 12, + "id": "10000027", + "name": "凝光", + "nameEn": "Ningguang", + "skillCD": 12, + "weapon": "10" + }, + { + "alias": [ + "可莉", + "逃跑的太阳", + "Klee", + "嘟嘟可", + "火花骑士", + "蹦蹦炸弹", + "炸鱼", + "放火烧山", + "放火烧山真君", + "蒙德最强战力", + "逃跑的太阳", + "啦啦啦", + "哒哒哒", + "炸弹人", + "禁闭室", + "太阳", + "小太阳" + ], + "burstCD": 15, + "id": "10000029", + "name": "可莉", + "nameEn": "Klee", + "skillCD": 20, + "weapon": "10" + }, + { + "alias": [ + "钟离", + "Zhongli", + "摩拉克斯", + "岩王爷", + "岩神", + "钟师傅", + "天动万象", + "岩王帝君", + "未来可期", + "帝君", + "拒收病婿" + ], + "burstCD": 12, + "id": "10000030", + "name": "钟离", + "nameEn": "Zhongli", + "skillCD": 4, + "skillHoldCD": 12, + "weapon": "13" + }, + { + "alias": [ + "菲谢尔", + "Fischl", + "皇女", + "小艾米", + "小艾咪", + "奥兹", + "断罪皇女", + "中二病", + "中二少女", + "中二皇女", + "奥兹发射器" + ], + "burstCD": 15, + "id": "10000031", + "name": "菲谢尔", + "nameEn": "Fischl", + "skillCD": 25, + "weapon": "12" + }, + { + "alias": [ + "班尼特", + "Bennett", + "点赞哥", + "点赞", + "倒霉少年", + "倒霉蛋", + "霹雳闪雷真君", + "班神", + "班爷", + "倒霉", + "蒙德火神", + "六星真神" + ], + "burstCD": 15, + "id": "10000032", + "name": "班尼特", + "nameEn": "Bennett", + "skillCD": 5, + "weapon": "1" + }, + { + "alias": [ + "达达利亚", + "Tartaglia", + "Childe", + "Ajax", + "达达鸭", + "达达利鸭", + "公子", + "玩具销售员", + "玩具推销员", + "钱包", + "鸭鸭", + "愚人众末席" + ], + "burstCD": 15, + "id": "10000033", + "name": "达达利亚", + "nameEn": "Tartaglia", + "skillCD": 6, + "skillHoldCD": 45, + "weapon": "12" + }, + { + "alias": [ + "诺艾尔", + "Noelle", + "女仆", + "高达", + "岩王帝姬" + ], + "burstCD": 15, + "id": "10000034", + "name": "诺艾尔", + "nameEn": "Noel", + "skillCD": 24, + "weapon": "11" + }, + { + "alias": [ + "七七", + "Qiqi", + "僵尸", + "肚饿真君", + "度厄真君", + "77" + ], + "burstCD": 20, + "id": "10000035", + "name": "七七", + "nameEn": "Qiqi", + "skillCD": 30, + "weapon": "1" + }, + { + "alias": [ + "重云", + "Chongyun", + "纯阳之体", + "冰棍" + ], + "burstCD": 12, + "id": "10000036", + "name": "重云", + "nameEn": "Chongyun", + "skillCD": 15, + "weapon": "11" + }, + { + "alias": [ + "甘雨", + "Ganyu", + "椰羊", + "椰奶", + "王小美" + ], + "burstCD": 15, + "id": "10000037", + "name": "甘雨", + "nameEn": "Ganyu", + "skillCD": 10, + "weapon": "12" + }, + { + "alias": [ + "阿贝多", + "Albedo", + "可莉哥哥", + "升降机", + "升降台", + "电梯", + "白垩之子", + "贝爷", + "白垩", + "阿贝少", + "花呗多", + "阿贝夕", + "阿师傅" + ], + "burstCD": 12, + "id": "10000038", + "name": "阿贝多", + "nameEn": "Albedo", + "skillCD": 4, + "weapon": "1" + }, + { + "alias": [ + "迪奥娜", + "Diona", + "迪欧娜", + "dio娜", + "冰猫", + "猫猫", + "猫娘", + "喵喵", + "调酒师" + ], + "burstCD": 20, + "id": "10000039", + "name": "迪奥娜", + "nameEn": "Diona", + "skillCD": 6, + "skillHoldCD": 15, + "weapon": "12" + }, + { + "alias": [ + "莫娜", + "Mona", + "穷鬼", + "穷光蛋", + "穷", + "莫纳", + "占星术士", + "占星师", + "讨龙真君", + "半部讨龙真君", + "阿斯托洛吉斯·莫娜·梅姬斯图斯", + "梅姬斯图斯", + "梅姬斯图斯姬" + ], + "burstCD": 15, + "id": "10000041", + "name": "莫娜", + "nameEn": "Mona", + "skillCD": 12, + "weapon": "10" + }, + { + "alias": [ + "刻晴", + "Keqing", + "刻情", + "氪晴", + "刻师傅", + "刻师父", + "牛杂", + "牛杂师傅", + "斩尽牛杂", + "免疫", + "免疫免疫", + "屁斜剑法", + "玉衡星", + "阿晴", + "啊晴", + "璃月雷神" + ], + "burstCD": 12, + "id": "10000042", + "name": "刻晴", + "nameEn": "Keqing", + "skillCD": 7.5, + "weapon": "1" + }, + { + "alias": [ + "砂糖", + "Sucrose", + "sucrose" + ], + "burstCD": 20, + "id": "10000043", + "name": "砂糖", + "nameEn": "Sucrose", + "skillCD": 15, + "weapon": "10" + }, + { + "alias": [ + "辛焱", + "Xinyan", + "辛炎", + "黑妹", + "摇滚" + ], + "burstCD": 15, + "id": "10000044", + "name": "辛焱", + "nameEn": "Xinyan", + "skillCD": 18, + "weapon": "11" + }, + { + "alias": [ + "罗莎莉亚", + "Rosaria", + "罗莎莉娅", + "白色史莱姆", + "白史莱姆", + "修女", + "罗莎利亚", + "罗莎利娅", + "罗沙莉亚", + "罗沙莉娅", + "罗沙利亚", + "罗沙利娅", + "萝莎莉亚", + "萝莎莉娅", + "萝莎利亚", + "萝莎利娅", + "萝沙莉亚", + "萝沙莉娅", + "萝沙利亚", + "萝沙利娅" + ], + "burstCD": 15, + "id": "10000045", + "name": "罗莎莉亚", + "nameEn": "Rosaria", + "skillCD": 6, + "weapon": "13" + }, + { + "alias": [ + "胡桃", + "Hu Tao", + "HuTao", + "Hutao", + "胡淘", + "往生堂堂主", + "火化", + "抬棺的", + "蝴蝶", + "核桃", + "堂主", + "胡堂主", + "雪霁梅香", + "桃子", + "桃" + ], + "burstCD": 15, + "id": "10000046", + "name": "胡桃", + "nameEn": "Hutao", + "skillCD": 16, + "weapon": "13" + }, + { + "alias": [ + "枫原万叶", + "Kaedehara Kazuha", + "Kazuha", + "万叶", + "叶天帝", + "天帝", + "叶师傅" + ], + "burstCD": 15, + "id": "10000047", + "name": "枫原万叶", + "nameEn": "Kazuha", + "skillCD": 6, + "skillHoldCD": 9, + "weapon": "1" + }, + { + "alias": [ + "烟绯", + "Yanfei", + "烟老师", + "律师", + "罗翔" + ], + "burstCD": 20, + "id": "10000048", + "name": "烟绯", + "nameEn": "Feiyan", + "skillCD": 9, + "weapon": "10" + }, + { + "alias": [ + "宵宫", + "Yoimiya", + "霄宫", + "烟花", + "肖宫", + "肖工", + "绷带女孩" + ], + "burstCD": 15, + "id": "10000049", + "name": "宵宫", + "nameEn": "Yoimiya", + "skillCD": 18, + "weapon": "12" + }, + { + "alias": [ + "托马", + "Thoma", + "家政官", + "太郎丸", + "地头蛇", + "男仆", + "拖马" + ], + "burstCD": 20, + "id": "10000050", + "name": "托马", + "nameEn": "Tohma", + "skillCD": 15, + "weapon": "13" + }, + { + "alias": [ + "优菈", + "Eula", + "优拉", + "尤拉", + "尤菈", + "浪花骑士", + "记仇", + "劳伦斯" + ], + "burstCD": 20, + "id": "10000051", + "name": "优菈", + "nameEn": "Eula", + "skillCD": 4, + "skillHoldCD": 10, + "weapon": "11" + }, + { + "alias": [ + "雷电将军", + "Raiden Shogun", + "Raiden", + "雷神", + "将军", + "雷军", + "巴尔", + "阿影", + "影", + "巴尔泽布", + "煮饭婆", + "奶香一刀", + "无想一刀", + "宅女" + ], + "burstCD": 18, + "id": "10000052", + "name": "雷电将军", + "nameEn": "Shougun", + "skillCD": 10, + "weapon": "13" + }, + { + "alias": [ + "早柚", + "Sayu", + "小狸猫", + "狸猫", + "忍者", + "貉" + ], + "burstCD": 20, + "id": "10000053", + "name": "早柚", + "nameEn": "Sayu", + "skillCD": 6, + "weapon": "11" + }, + { + "alias": [ + "珊瑚宫心海", + "Sangonomiya Kokomi", + "Kokomi", + "心海", + "军师", + "珊瑚宫", + "书记", + "观赏鱼", + "水母", + "鱼", + "美人鱼" + ], + "burstCD": 18, + "id": "10000054", + "name": "珊瑚宫心海", + "nameEn": "Kokomi", + "skillCD": 20, + "weapon": "10" + }, + { + "alias": [ + "五郎", + "Gorou", + "柴犬", + "土狗", + "希娜", + "希娜小姐" + ], + "burstCD": 20, + "id": "10000055", + "name": "五郎", + "nameEn": "Gorou", + "skillCD": 10, + "weapon": "12" + }, + { + "alias": [ + "九条裟罗", + "Kujou Sara", + "Sara", + "九条", + "九条沙罗", + "裟罗", + "沙罗", + "天狗" + ], + "burstCD": 20, + "id": "10000056", + "name": "九条裟罗", + "nameEn": "Sara", + "skillCD": 10, + "weapon": "12" + }, + { + "alias": [ + "荒泷一斗", + "Arataki Itto", + "Itto", + "荒龙一斗", + "荒泷天下第一斗", + "一斗", + "一抖", + "荒泷", + "1斗", + "岩牛", + "岩牛牛", + "斗战岩牛", + "斗子哥", + "牛子哥", + "牛子", + "孩子王", + "斗虫", + "巧乐兹", + "放牛的" + ], + "burstCD": 18, + "id": "10000057", + "name": "荒泷一斗", + "nameEn": "Itto", + "skillCD": 10, + "weapon": "11" + }, + { + "alias": [ + "八重神子", + "Yae Miko", + "Miko", + "八重", + "神子", + "狐狸", + "想得美哦", + "巫女", + "屑狐狸", + "骚狐狸", + "八重宫司", + "婶子", + "小八", + "八重寄子", + "寄子", + "八神虫子", + "八神重子" + ], + "burstCD": 22, + "id": "10000058", + "name": "八重神子", + "nameEn": "Yae", + "skillCD": 4, + "weapon": "10" + }, + { + "alias": [ + "鹿野院平藏", + "shikanoin heizou", + "Heizou", + "鹿野苑", + "鹿野院", + "平藏", + "鹿野苑平藏", + "小鹿" + ], + "burstCD": 12, + "id": "10000059", + "name": "鹿野院平藏", + "nameEn": "Heizo", + "skillCD": 10, + "weapon": "10" + }, + { + "alias": [ + "夜兰", + "Yelan", + "夜阑", + "叶澜", + "腋兰", + "夜天后" + ], + "burstCD": 18, + "id": "10000060", + "name": "夜兰", + "nameEn": "Yelan", + "skillCD": 10, + "weapon": "12" + }, + { + "alias": [ + "绮良良", + "Kirara", + "大猫猫", + "大喵喵", + "稻妻猫猫", + "绮娘娘", + "琦良良", + "良良", + "快递员", + "草猫", + "草猫猫", + "草喵", + "草喵喵", + "猫又" + ], + "burstCD": 15, + "id": "10000061", + "name": "绮良良", + "nameEn": "Momoka", + "skillCD": 8, + "weapon": "1" + }, + { + "alias": [ + "埃洛伊", + "Aloy" + ], + "burstCD": 12, + "id": "10000062", + "name": "埃洛伊", + "nameEn": "Aloy", + "skillCD": 20, + "weapon": "12" + }, + { + "alias": [ + "申鹤", + "Shenhe", + "神鹤", + "小姨", + "小姨子", + "审鹤" + ], + "burstCD": 20, + "id": "10000063", + "name": "申鹤", + "nameEn": "Shenhe", + "skillCD": 10, + "skillHoldCD": 15, + "weapon": "13" + }, + { + "alias": [ + "云堇", + "Yun Jin", + "yun jin", + "云瑾", + "云先生", + "云锦", + "神女劈观" + ], + "burstCD": 15, + "id": "10000064", + "name": "云堇", + "nameEn": "Yunjin", + "skillCD": 9, + "weapon": "13" + }, + { + "alias": [ + "久岐忍", + "Kuki Shinobu", + "Kuki", + "Shinobu", + "97忍", + "小忍", + "久歧忍", + "97", + "茄忍", + "茄子", + "紫茄子", + "阿忍", + "忍姐" + ], + "burstCD": 15, + "id": "10000065", + "name": "久岐忍", + "nameEn": "Shinobu", + "skillCD": 15, + "weapon": "1" + }, + { + "alias": [ + "神里绫人", + "Kamisato Ayato", + "Ayato", + "绫人", + "神里凌人", + "凌人", + "0人", + "神人", + "零人", + "大舅哥" + ], + "burstCD": 20, + "id": "10000066", + "name": "神里绫人", + "nameEn": "Ayato", + "skillCD": 12, + "weapon": "1" + }, + { + "alias": [ + "柯莱", + "Collei", + "柯来", + "科莱", + "科来", + "小天使", + "须弥安柏", + "草安柏", + "须弥飞行冠军" + ], + "burstCD": 15, + "id": "10000067", + "name": "柯莱", + "nameEn": "Collei", + "skillCD": 12, + "weapon": "12" + }, + { + "alias": [ + "多莉", + "Dori", + "多利", + "多力", + "奸商" + ], + "burstCD": 20, + "id": "10000068", + "name": "多莉", + "nameEn": "Dori", + "skillCD": 9, + "weapon": "11" + }, + { + "alias": [ + "提纳里", + "Tighnari", + "提那里", + "小提", + "驴" + ], + "burstCD": 12, + "id": "10000069", + "name": "提纳里", + "nameEn": "Tighnari", + "skillCD": 12, + "weapon": "12" + }, + { + "alias": [ + "妮露", + "Nilou", + "尼露", + "妮璐", + "舞娘", + "红牛" + ], + "burstCD": 18, + "id": "10000070", + "name": "妮露", + "nameEn": "Nilou", + "skillCD": 18, + "weapon": "1" + }, + { + "alias": [ + "赛诺", + "Cyno", + "塞诺", + "胡狼", + "大风纪官", + "大风机关" + ], + "burstCD": 20, + "id": "10000071", + "name": "赛诺", + "nameEn": "Cyno", + "skillCD": 7.5, + "skillHoldCD": 3, + "weapon": "13" + }, + { + "alias": [ + "坎蒂丝", + "Candace", + "坎迪斯" + ], + "burstCD": 15, + "id": "10000072", + "name": "坎蒂丝", + "nameEn": "Candace", + "skillCD": 6, + "skillHoldCD": 9, + "weapon": "13" + }, + { + "alias": [ + "纳西妲", + "Nahida", + "草神", + "小吉祥", + "大吉祥", + "小草神", + "大慈树王", + "小吉祥草王", + "草萝莉", + "羽毛球", + "摩诃善法大吉祥智慧主", + "智慧主", + "智慧之神", + "布耶尔" + ], + "burstCD": 13.5, + "id": "10000073", + "name": "纳西妲", + "nameEn": "Nahida", + "skillCD": 5, + "skillHoldCD": 6, + "weapon": "10" + }, + { + "alias": [ + "莱依拉", + "Layla", + "莱依菈", + "来依菈", + "来依拉" + ], + "burstCD": 12, + "id": "10000074", + "name": "莱依拉", + "nameEn": "Layla", + "skillCD": 12, + "weapon": "1" + }, + { + "alias": [ + "流浪者", + "Wanderer", + "散兵", + "国崩", + "雷电国崩", + "大炮", + "雷电大炮", + "雷大炮", + "伞兵", + "斯卡拉姆齐" + ], + "burstCD": 15, + "id": "10000075", + "name": "流浪者", + "nameEn": "Wanderer", + "skillCD": 6, + "weapon": "10" + }, + { + "alias": [ + "珐露珊", + "Faruzan", + "法露珊", + "法璐珊", + "法露姗", + "法璐姗", + "珐露姗", + "珐璐姗", + "百岁珊", + "百岁山", + "前辈", + "仙贝" + ], + "burstCD": 20, + "id": "10000076", + "name": "珐露珊", + "nameEn": "Faruzan", + "skillCD": 6, + "weapon": "12" + }, + { + "alias": [ + "瑶瑶", + "Yaoyao", + "遥遥", + "萝卜", + "月桂" + ], + "burstCD": 20, + "id": "10000077", + "name": "瑶瑶", + "nameEn": "Yaoyao", + "skillCD": 15, + "weapon": "13" + }, + { + "alias": [ + "艾尔海森", + "Alhaitham", + "海哥", + "埃尔海森", + "海森", + "海参", + "书记官" + ], + "burstCD": 18, + "id": "10000078", + "name": "艾尔海森", + "nameEn": "Alhatham", + "skillCD": 18, + "weapon": "1" + }, + { + "alias": [ + "迪希雅", + "Dehya", + "迪希亚", + "迪希娅", + "迪西雅", + "迪西亚" + ], + "burstCD": 18, + "id": "10000079", + "name": "迪希雅", + "nameEn": "Dehya", + "skillCD": 20, + "weapon": "11" + }, + { + "alias": [ + "米卡", + "Mika", + "鹦鹉", + "凤头", + "凤头鹦鹉" + ], + "burstCD": 18, + "id": "10000080", + "name": "米卡", + "nameEn": "Mika", + "skillCD": 15, + "weapon": "13" + }, + { + "alias": [ + "卡维", + "Kaveh", + "艾尔海森室友" + ], + "burstCD": 20, + "id": "10000081", + "name": "卡维", + "nameEn": "Kaveh", + "skillCD": 6, + "weapon": "11" + }, + { + "alias": [ + "白术", + "Baizhu", + "长生", + "白医生" + ], + "burstCD": 20, + "id": "10000082", + "name": "白术", + "nameEn": "Baizhuer", + "skillCD": 10, + "weapon": "10" + }, + { + "alias": [ + "琳妮特", + "Lynette", + "林妮特", + "林尼特", + "琳尼特", + "女魔术师", + "魔术猫", + "魔术喵", + "登登" + ], + "burstCD": 18, + "id": "10000083", + "name": "琳妮特", + "nameEn": "Linette", + "skillCD": 12, + "weapon": "1" + }, + { + "alias": [ + "林尼", + "Lyney", + "林妮", + "琳尼", + "琳妮", + "男魔术师", + "魔术师" + ], + "burstCD": 15, + "id": "10000084", + "name": "林尼", + "nameEn": "Liney", + "skillCD": 15, + "weapon": "12" + }, + { + "alias": [ + "菲米尼", + "Freminet", + "非米尼", + "潜水员" + ], + "burstCD": 15, + "id": "10000085", + "name": "菲米尼", + "nameEn": "Freminet", + "skillCD": 10, + "weapon": "11" + }, + { + "alias": [ + "莱欧斯利", + "Wriothesley", + "莱欧", + "枫丹桑博", + "公爵", + "典狱长", + "牢大" + ], + "burstCD": 15, + "id": "10000086", + "name": "莱欧斯利", + "nameEn": "Wriothesley", + "skillCD": 16, + "weapon": "10" + }, + { + "alias": [ + "那维莱特", + "Neuvillette", + "那维", + "水龙王", + "水龙", + "审判官", + "海獭", + "龙王", + "最高审判官", + "水之龙王" + ], + "burstCD": 18, + "id": "10000087", + "name": "那维莱特", + "nameEn": "Neuvillette", + "skillCD": 12, + "weapon": "10" + }, + { + "alias": [ + "夏洛蒂", + "Charlotte", + "夏洛", + "夏洛帝", + "记者", + "小记者", + "佳能400D", + "400D" + ], + "burstCD": 20, + "id": "10000088", + "name": "夏洛蒂", + "nameEn": "Charlotte", + "skillCD": 12, + "skillHoldCD": 18, + "weapon": "10" + }, + { + "alias": [ + "芙宁娜", + "Furina", + "Focalors", + "水神", + "芙芙", + "芙卡洛斯", + "傻芙芙" + ], + "burstCD": 15, + "id": "10000089", + "name": "芙宁娜", + "nameEn": "Furina", + "skillCD": 20, + "weapon": "1" + }, + { + "alias": [ + "夏沃蕾", + "chevreuse", + "夏沃雷" + ], + "burstCD": 15, + "id": "10000090", + "name": "夏沃蕾", + "nameEn": "Chevreuse", + "skillCD": 15, + "weapon": "13" + }, + { + "alias": [ + "娜维娅", + "navia", + "大小姐", + "刺玫会", + "黄豆", + "流汗黄豆", + "黄豆姐", + "娜薇娅", + "娜薇雅", + "娜维雅" + ], + "burstCD": 15, + "id": "10000091", + "name": "娜维娅", + "nameEn": "Navia", + "skillCD": 9, + "weapon": "11" + }, + { + "alias": [ + "嘉明", + "Gaming", + "jiaming", + "佳明", + "嘉铭", + "家明", + "镖师", + "舞狮少年", + "舞狮" + ], + "burstCD": 15, + "id": "10000092", + "name": "嘉明", + "nameEn": "Gaming", + "skillCD": 6, + "weapon": "11" + }, + { + "alias": [ + "闲云", + "Xianyun", + "流云", + "刘云", + "留云", + "野鹤", + "那个女人", + "留云借风", + "留云借风真君", + "很会聊天", + "很会聊天真君" + ], + "burstCD": 18, + "id": "10000093", + "name": "闲云", + "nameEn": "Liuyun", + "skillCD": 12, + "weapon": "10" + }, + { + "alias": [ + "千织", + "Chiori", + "千只", + "设计师", + "裁缝", + "千织屋老板" + ], + "burstCD": 13.5, + "id": "10000094", + "name": "千织", + "nameEn": "Chiori", + "skillCD": 16, + "weapon": "1" + }, + { + "alias": [ + "希格雯", + "Sigewinne", + "希格文", + "护士", + "护士长" + ], + "burstCD": 18, + "id": "10000095", + "name": "希格雯", + "nameEn": "Sigewinne", + "skillCD": 18, + "weapon": "12" + }, + { + "alias": [ + "阿蕾奇诺", + "Arlecchino", + "阿雷奇诺", + "仆人", + "黑优菈", + "黑暗优菈", + "父亲", + "佩露薇利" + ], + "burstCD": 15, + "id": "10000096", + "name": "阿蕾奇诺", + "nameEn": "Arlecchino", + "skillCD": 30, + "weapon": "13" + }, + { + "alias": [ + "赛索斯", + "Sethos", + "塞索斯", + "塞索思", + "赛索思" + ], + "burstCD": 15, + "id": "10000097", + "name": "赛索斯", + "nameEn": "Sethos", + "skillCD": 8, + "weapon": "12" + }, + { + "alias": [ + "克洛琳德", + "Clorinde", + "琳德", + "科洛琳德", + "克洛林德", + "克罗林德", + "苹果姐" + ], + "burstCD": 15, + "id": "10000098", + "name": "克洛琳德", + "nameEn": "Clorinde", + "skillCD": 16, + "weapon": "1" + }, + { + "alias": [ + "艾梅莉埃", + "Emilie", + "调香师", + "艾梅", + "香水设计师", + "现场清理人" + ], + "burstCD": 13.5, + "id": "10000099", + "name": "艾梅莉埃", + "nameEn": "Emilie", + "skillCD": 10, + "skillHoldCD": 14, + "weapon": "13" + }, + { + "alias": [ + "卡齐娜", + "Kachina", + "卡奇娜", + "卡齐纳", + "卡齐那", + "卡其那", + "冲天钻钻", + "岩莉莉" + ], + "burstCD": 18, + "id": "10000100", + "name": "卡齐娜", + "nameEn": "Kachina", + "skillCD": 20, + "weapon": "13" + }, + { + "alias": [ + "基尼奇", + "Kinich", + "基哥", + "基尼齐", + "蜘蛛侠" + ], + "burstCD": 18, + "id": "10000101", + "name": "基尼奇", + "nameEn": "Kinich", + "skillCD": 18, + "weapon": "11" + }, + { + "alias": [ + "玛拉妮", + "Mualani", + "马拉尼", + "鲨鱼妹", + "海豹妹", + "海豹", + "纳塔鲨", + "逐浪客" + ], + "burstCD": 15, + "id": "10000102", + "name": "玛拉妮", + "nameEn": "Mualani", + "skillCD": 1.8, + "skillHoldCD": 6, + "weapon": "10" + }, + { + "alias": [ + "希诺宁", + "Xilonen", + "豹女", + "岩大猫", + "大岩猫", + "岩猫", + "岩猫猫", + "西诺宁" + ], + "burstCD": 15, + "id": "10000103", + "name": "希诺宁", + "nameEn": "Xilonen", + "skillCD": 7, + "weapon": "1" + }, + { + "alias": [ + "恰斯卡", + "Chasca", + "武卡", + "调停人", + "鸟人" + ], + "burstCD": 15, + "id": "10000104", + "name": "恰斯卡", + "nameEn": "Chasca", + "skillCD": 6.5, + "weapon": "12" + }, + { + "alias": [ + "欧洛伦", + "Ororon", + "庇笛", + "孙子", + "大孙子", + "蝙蝠侠" + ], + "burstCD": 15, + "id": "10000105", + "name": "欧洛伦", + "nameEn": "Olorun", + "skillCD": 15, + "weapon": "12" + }, + { + "alias": [ + "玛薇卡", + "Mavuika", + "火神", + "马薇卡", + "玛维卡", + "马维卡", + "马微卡", + "玛微卡" + ], + "burstCD": 18, + "id": "10000106", + "name": "玛薇卡", + "nameEn": "Mavuika", + "skillCD": 15, + "weapon": "11" + }, + { + "alias": [ + "茜特菈莉", + "Citlali", + "西特菈莉", + "西特拉莉", + "茜特拉莉", + "西特拉利", + "黑曜石奶奶", + "黑曜石", + "奶奶", + "老伴" + ], + "burstCD": 15, + "id": "10000107", + "name": "茜特菈莉", + "nameEn": "Citlali", + "skillCD": 16, + "weapon": "10" + }, + { + "alias": [ + "蓝砚", + "Lanyan", + "蓝燕", + "兰砚", + "兰燕", + "藤编师", + "风鹰侠", + "蓝研", + "蓝颜", + "兰颜" + ], + "burstCD": 15, + "id": "10000108", + "name": "蓝砚", + "nameEn": "Lanyan", + "skillCD": 16, + "weapon": "10" + }, + { + "alias": [ + "梦见月瑞希", + "Yumemizuki Mizuki", + "Mizuki", + "梦见", + "梦见月", + "瑞希", + "瑞幸", + "木更", + "梗小姐", + "食梦貘", + "梦魔", + "魅魔", + "心理医生", + "心理诊疗师" + ], + "burstCD": 15, + "id": "10000109", + "name": "梦见月瑞希", + "nameEn": "Mizuki", + "skillCD": 15, + "weapon": "10" + }, + { + "alias": [ + "伊安珊", + "Iansan", + "123", + "伊安姗", + "教练", + "依安珊" + ], + "burstCD": 18, + "id": "10000110", + "name": "伊安珊", + "nameEn": "Iansan", + "skillCD": 16, + "weapon": "13" + }, + { + "alias": [ + "瓦雷莎", + "Varesa", + "瓦蕾莎", + "瓦蕾沙", + "瓦蕾砂", + "瓦雷沙", + "牛头人", + "牛战士", + "牛牛", + "雷牛", + "雷牛牛", + "奶牛", + "粉牛" + ], + "burstCD": 18, + "id": "10000111", + "name": "瓦雷莎", + "nameEn": "Varesa", + "skillCD": 9, + "weapon": "10" + }, + { + "alias": [ + "爱可菲", + "Escoffier", + "厨师", + "爱可非", + "艾可菲", + "艾可非" + ], + "burstCD": 15, + "id": "10000112", + "name": "爱可菲", + "nameEn": "Escoffier", + "skillCD": 15, + "skillHoldCD": 6, + "weapon": "13" + }, + { + "alias": [ + "伊法", + "Ifa", + "哥们", + "医生" + ], + "burstCD": 15, + "id": "10000113", + "name": "伊法", + "nameEn": "Ifa", + "skillCD": 7.5, + "weapon": "10" + }, + { + "alias": [ + "丝柯克", + "Skirk", + "丝柯可", + "斯柯克" + ], + "burstCD": 15, + "id": "10000114", + "name": "丝柯克", + "nameEn": "SkirkNew", + "skillCD": 8, + "weapon": "1" + }, + { + "alias": [ + "塔利雅", + "Dahlia", + "塔利亚", + "塔丽雅", + "主祭", + "助祭" + ], + "burstCD": 15, + "id": "10000115", + "name": "塔利雅", + "nameEn": "Dahlia", + "skillCD": 9, + "weapon": "1" + }, + { + "alias": [ + "伊涅芙", + "Ineffa", + "机器人", + "机娘" + ], + "burstCD": 15, + "id": "10000116", + "name": "伊涅芙", + "nameEn": "Ineffa", + "skillCD": 16, + "weapon": "13" + }, + { + "alias": [ + "菈乌玛", + "Lauma" + ], + "burstCD": 15, + "id": "10000119", + "name": "菈乌玛", + "nameEn": "Lauma", + "skillCD": 12, + "weapon": "10" + }, + { + "alias": [ + "菲林斯", + "Flins" + ], + "burstCD": 20, + "id": "10000120", + "name": "菲林斯", + "nameEn": "Flins", + "skillCD": 6, + "skillHoldCD": 16, + "weapon": "13" + }, + { + "alias": [ + "爱诺", + "Aino" + ], + "burstCD": 13.5, + "id": "10000121", + "name": "爱诺", + "nameEn": "Aino", + "skillCD": 10, + "weapon": "11" + }, + { + "alias": [ + "奈芙尔", + "Nefer" + ], + "burstCD": 15, + "id": "10000122", + "name": "奈芙尔", + "nameEn": "Nefer", + "skillCD": 9, + "weapon": "10" + }, + { + "alias": [ + "杜林", + "Durin" + ], + "burstCD": 18, + "id": "10000123", + "name": "杜林", + "nameEn": "Durin", + "skillCD": 12, + "weapon": "10" + }, + { + "alias": [ + "雅珂达", + "Jahoda" + ], + "burstCD": 18, + "id": "10000124", + "name": "雅珂达", + "nameEn": "Jahoda", + "skillCD": 15, + "weapon": "10" + }, + { + "alias": [ + "哥伦比娅", + "Columbina", + "少女", + "库塔尔", + "月神", + "月之少女" + ], + "burstCD": 15, + "id": "10000125", + "name": "哥伦比娅", + "nameEn": "Columbina", + "skillCD": 17, + "weapon": "10" + }, + { + "alias": [ + "兹白", + "Zibai", + "白马仙人", + "白马" + ], + "burstCD": 15, + "id": "10000126", + "name": "兹白", + "nameEn": "Zibai", + "skillCD": 18, + "weapon": "10" + }, + { + "alias": [ + "叶洛亚", + "Illuga", + "少爷", + "小少爷" + ], + "burstCD": 15, + "id": "10000127", + "name": "叶洛亚", + "nameEn": "Illuga", + "skillCD": 15, + "weapon": "10" + } +] \ No newline at end of file diff --git a/packages/assets/imgs/esc_settings.png b/packages/assets/imgs/esc_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..6f1c6663a5de6b57409274930f2b4d02d19ad4f3 GIT binary patch literal 2466 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 literal 0 HcmV?d00001 diff --git a/packages/assets/imgs/girl_moon.png b/packages/assets/imgs/girl_moon.png new file mode 100644 index 0000000000000000000000000000000000000000..61af702f7df8cec120c77c4513f0de9fe04d9289 GIT binary patch literal 16126 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 literal 0 HcmV?d00001 diff --git a/packages/assets/imgs/page_close_white.png b/packages/assets/imgs/page_close_white.png new file mode 100644 index 0000000000000000000000000000000000000000..80dcd50d22ee9cab6961e48eeb718a9b03931778 GIT binary patch literal 1560 zcmV+z2Iu*SP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1+7U$K~z{r)mK?p zR7Vh=|CPi<5l}=>5m^OfM>a*-0wHW75KRIeI4lZzFr35hP1IC8tb`nsyRx>{#88R?_dLLYV(=LdbhPg zx{p>f?QPDHb;Cfr>$CKyW$u&EBvnAmMu}a^tPJbM66yA~O|&>WN}a7QsI{qqdb?U_ zsK1LwUUk#Vn?YKd8z=L^B$*ed7&~TzrelHaH3O|l>n%&uv}&4=xW{O6w4a6tx|p}S zqnTP>Jg2VqW?EmIAss@ZpBSRsg?B0NN&z_WRd-uwzu;@q1&Ml;*n^_bQbCY?4!>&<4a6FYt-#1nuKr))29--`< zLi*C_l8moT`p`Enest0;kX${2C@wLb1z?A2r%G%}q)#6G&YN*P8$?cS0ra(tFY|qI z!dvDqEiL1evw#IDOxPtpoH*rAp5Ebf{!#>a`9_l4xez+#5zG-X>R)pn)lQWFseWRR z1-rOkrn6q55>FI!0>_+v*iX%a8s=gFtHuectf=A-PNxId2+B`;29x{wD|AjWtg5P} ztu_6T1Z=MADeLf`#gzvZ%m5}gj zvXR=U5)g2|`T=tsclBd?Z~^{7ar}Rz6~!(KK;A&^ej$`UBJ{`~awY)f2w0b&Pcmbkt!N-<+B>{j)q-W&G#%kb*q1xd@ zZR>F{jCt`bFeILgGq!qS0r)XK+{eenSxNzRfPztz01)_XW1A3-|-sN90vcc`SKj9w4+(63TWK(Q7XPD;ji`7}P#$F_*xr<^1AIKtpX zUnu_JXFkrd000$^u&fy0a3P^E+nO7>A!(7Kz>p3cr^u_xnqdc0({s41f*-u-jOaUX z4!^Ph0Dn{hD*L2rjZH|?BuAsdadqSzQJNlqCDqu$J4X1l6Cj{mhyultxf-9U>BJFi z&IfqcN3i!80cq9Q>B!H?Fz^&HX*&;drXU7ncm>RQ1LU1a5 z0kQx%o1Gfw*#HKXyWt zfpkV!g#9QA4+Xg zvE5LLqlX~@p~CTk5scv&BE(p}U>H4A0KOY0hvcywwS;L16Bc;k9DaVOt=$)Zc|SM5 z*e+*S2r(GZ#KQ#7DI7bsQza0kXOACop}`K3M8gt}1ECKN_BKKM_x}6z$9^&rYEs-{3BAs>9#3{fz#t4Q92#-iq zDMD$|kMfv?Hz9x>YB?4_M-^+A=Epg@czccvbTcnnJ08JZ?M>2VCQ0{hXIUy7+vKA~ z__@Fvu^33VY@DR`yQ>mb2+^=^7#Uhd{{{B8<{0m{P4wZdnf?N3r(EUaVJ}Gl0000< KMNUMnLSTaCg2;*h literal 0 HcmV?d00001 diff --git a/packages/assets/imgs/paimon_menu.png b/packages/assets/imgs/paimon_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..c424325b17a4956f7802352e7609bfcff2721afa GIT binary patch literal 2372 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 AivR!s literal 0 HcmV?d00001 diff --git a/packages/assets/imgs/welkin_moon_logo.png b/packages/assets/imgs/welkin_moon_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..950203406bb4e278a7dc4378af0d62b76048350d GIT binary patch literal 8475 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 { + if (typeof p !== 'string' || !p) { + throw new Error(`getImgMat: path[${index}] 不是有效字符串`); + } + return file.readImageMatSync(p); + }); + } + + // 单个路径 + if (typeof path !== 'string') { + throw new Error('getImgMat: path 必须是字符串或字符串数组'); + } + + return file.readImageMatSync(path); +} + +/** + * 通用找图/找RO(支持图片文件路径、Mat) + * @param {string|Mat} target 图片路径或已构造的 Mat + * @param {number} [x=0] 识别区域左上角 X + * @param {number} [y=0] 识别区域左上角 Y + * @param {number} [w=1920] 识别区域宽度 + * @param {number} [h=1080] 识别区域高度 + * @param {number} [timeout=1000] 识别时间上限(毫秒) + * @param {number} [interval=50] 每次识别之间的等待间隔(毫秒) + * + * @returns + * - RecognitionResult | null + */ +async function findImg( + target, + x = 0, + y = 0, + w = 1920, + h = 1080, + timeout = 1000, + interval = 50 +) { + const ro = + typeof target === 'string' + ? RecognitionObject.TemplateMatch( + file.readImageMatSync(target), + x, y, w, h + ) + : RecognitionObject.TemplateMatch( + target, + x, y, w, h + ); + + const start = Date.now(); + + while (Date.now() - start <= timeout) { + const gameRegion = captureGameRegion(); + try { + const res = gameRegion.find(ro); + if (!res.isEmpty()) { + return res; + } + } catch (e) { + log.error(e.toString()); + } finally { + gameRegion.dispose(); + } + + await sleep(interval); + } + + return null; +} + +/** + * 通用找图并点击(支持图片文件路径、Mat) + * @param {string|Mat} target 图片路径或已构造的 Mat + * @param {number} [x=0] 识别区域左上角 X + * @param {number} [y=0] 识别区域左上角 Y + * @param {number} [w=1920] 识别区域宽度 + * @param {number} [h=1080] 识别区域高度 + * @param {number} [timeout=1000] 识别时间上限(毫秒) + * @param {number} [interval=50] 每次识别之间的等待间隔(毫秒) + * @param {number} [preClickDelay=50] 点击前等待时间(毫秒) + * @param {number} [postClickDelay=50] 点击后等待时间(毫秒) + * + * @returns + * - RecognitionResult | null + */ +async function findImgAndClick( + target, + x = 0, + y = 0, + w = 1920, + h = 1080, + timeout = 1000, + interval = 50, + preClickDelay = 50, + postClickDelay = 50 +) { + const ro = + typeof target === 'string' + ? RecognitionObject.TemplateMatch( + file.readImageMatSync(target), + x, y, w, h + ) + : RecognitionObject.TemplateMatch( + target, + x, y, w, h + ); + + const start = Date.now(); + + while (Date.now() - start <= timeout) { + const gameRegion = captureGameRegion(); + try { + const res = gameRegion.find(ro); + if (!res.isEmpty()) { + await sleep(preClickDelay); + res.click(); + await sleep(postClickDelay); + return res; + } + } finally { + gameRegion.dispose(); + } + + await sleep(interval); + } + + return null; +} + +/** + * 通用找文本(OCR) + * @param {string|string[]} text 目标文本(单个文本或文本列表,列表时需全部匹配) + * @param {number} [x=0] OCR 区域左上角 X + * @param {number} [y=0] OCR 区域左上角 Y + * @param {number} [w=1920] OCR 区域宽度 + * @param {number} [h=1080] OCR 区域高度 + * @param {number} [attempts=5] OCR 尝试次数 + * @param {number} [interval=50] 每次 OCR 之间的等待间隔(毫秒) + * + * @returns + * - RecognitionResult | null + */ +async function findText( + text, + x = 0, + y = 0, + w = 1920, + h = 1080, + attempts = 5, + interval = 50 +) { + const keywords = (Array.isArray(text) ? text : [text]) + .map(t => t.toLowerCase()); + + for (let i = 0; i < attempts; i++) { + const gameRegion = captureGameRegion(); + try { + const ro = RecognitionObject.Ocr(x, y, w, h); + const results = gameRegion.findMulti(ro); + + for (let j = 0; j < results.count; j++) { + const res = results[j]; + if (!res.isExist() || !res.text) continue; + + const ocrText = res.text.toLowerCase(); + const matched = keywords.every(k => ocrText.includes(k)); + if (matched) { + return res; + } + } + } finally { + gameRegion.dispose(); + } + + await sleep(interval); + } + + return null; +} + +/** + * 通用找文本并点击(OCR) + * @param {string|string[]} text 目标文本(单个文本或文本列表,列表时需全部匹配) + * @param {number} [x=0] OCR 区域左上角 X + * @param {number} [y=0] OCR 区域左上角 Y + * @param {number} [w=1920] OCR 区域宽度 + * @param {number} [h=1080] OCR 区域高度 + * @param {number} [attempts=5] OCR 尝试次数 + * @param {number} [interval=50] 每次 OCR 之间的等待间隔(毫秒) + * @param {number} [preClickDelay=50] 点击前等待时间(毫秒) + * @param {number} [postClickDelay=50] 点击后等待时间(毫秒) + * + * @returns + * - RecognitionResult | null + */ +async function findTextAndClick( + text, + x = 0, + y = 0, + w = 1920, + h = 1080, + attempts = 5, + interval = 50, + preClickDelay = 50, + postClickDelay = 50 +) { + const keyword = text.toLowerCase(); + + for (let i = 0; i < attempts; i++) { + const gameRegion = captureGameRegion(); + try { + const ro = RecognitionObject.Ocr(x, y, w, h); + const results = gameRegion.findMulti(ro); + + for (let j = 0; j < results.count; j++) { + const res = results[j]; + if ( + res.isExist() && + res.text && + res.text.toLowerCase().includes(keyword) + ) { + await sleep(preClickDelay); + res.click(); + await sleep(postClickDelay); + return res; + } + } + } finally { + gameRegion.dispose(); + } + + await sleep(interval); + } + + return null; +} + +/** + * 执行操作直到图片出现 + * @param {string|Mat} target 目标图片路径或 Mat + * @param {() => Promise} action 执行的操作函数 + * @param {number} [x=0] 识别区域左上角 X + * @param {number} [y=0] 识别区域左上角 Y + * @param {number} [w=1920] 识别区域宽度 + * @param {number} [h=1080] 识别区域高度 + * @param {number} [timeout=5000] 超时时间(毫秒) + * @param {number} [interval=50] 操作和识别间隔(毫秒) + * + * @returns + * - RecognitionResult | null + */ +async function waitUntilImgAppear( + target, + action, + x = 0, + y = 0, + w = 1920, + h = 1080, + timeout = 5000, + interval = 50 +) { + const start = Date.now(); + + while (Date.now() - start <= timeout) { + await action(); + const res = await findImg(target, x, y, w, h, interval); + if (res) return res; + await sleep(interval); + } + + return null; +} + +/** + * 执行操作直到图片消失 + * @param {string|Mat} target 目标图片路径或 Mat + * @param {() => Promise} action 执行的操作函数 + * @param {number} [x=0] 识别区域左上角 X + * @param {number} [y=0] 识别区域左上角 Y + * @param {number} [w=1920] 识别区域宽度 + * @param {number} [h=1080] 识别区域高度 + * @param {number} [timeout=5000] 超时时间(毫秒) + * @param {number} [interval=50] 操作和识别间隔(毫秒) + * + * @returns + * - true: 图片已消失, false: 超时 + */ +async function waitUntilImgDisappear( + target, + action, + x = 0, + y = 0, + w = 1920, + h = 1080, + timeout = 5000, + interval = 50 +) { + const start = Date.now(); + + while (Date.now() - start <= timeout) { + await action(); + const res = await findImg(target, x, y, w, h, interval); + if (!res) return true; + await sleep(interval); + } + + return false; +} + +/** + * 执行操作直到文本出现 + * @param {string|string[]} text 目标文本(单个文本或文本列表,列表时需全部匹配) + * @param {() => Promise} action 执行的操作函数 + * @param {number} [x=0] OCR 区域左上角 X + * @param {number} [y=0] OCR 区域左上角 Y + * @param {number} [w=1920] OCR 区域宽度 + * @param {number} [h=1080] OCR 区域高度 + * @param {number} [attempts=5] OCR 尝试次数 + * @param {number} [interval=50] 操作和识别间隔(毫秒) + * + * @returns + * - RecognitionResult | null + */ +async function waitUntilTextAppear( + text, + action, + x = 0, + y = 0, + w = 1920, + h = 1080, + attempts = 5, + interval = 50 +) { + const start = Date.now(); + + while (Date.now() - start <= attempts * interval) { + await action(); + + const res = await findText(text, x, y, w, h, 1, interval); + if (res) return res; + + await sleep(interval); + } + + return null; +} + +/** + * 执行操作直到文本消失 + * @param {string} text 目标文本 + * @param {() => Promise} action 执行的操作函数 + * @param {number} [x=0] OCR 区域左上角 X + * @param {number} [y=0] OCR 区域左上角 Y + * @param {number} [w=1920] OCR 区域宽度 + * @param {number} [h=1080] OCR 区域高度 + * @param {number} [attempts=5] OCR 尝试次数 + * @param {number} [interval=50] 操作和识别间隔(毫秒) + * + * @returns + * - true: 文本已消失, false: 超时 + */ +async function waitUntilTextDisappear( + text, + action, + x = 0, + y = 0, + w = 1920, + h = 1080, + attempts = 5, + interval = 50 +) { + const start = Date.now(); + + while (Date.now() - start <= attempts * interval) { + await action(); + const res = await findText(text, x, y, w, h, 1, interval); // 每次只试 1 次 OCR + if (!res) return true; + await sleep(interval); + } + + return false; +} + +/** + * 根据派蒙图标判断当前是否位于主页面 + * @return {Promise} + * - true: 位于主页面, false: 不在主页面 + */ +async function isInMainUI() { + try { + return !!(await findImg(paimon)); + } catch (e) { + log.error("判断是否位于主页面时出错", e); + return false; + } +} + +/** + * 启动一个后台任务,用于自动月卡点击 + * + * 使用示例: + * + * const watcher = startMonthCardWatcher(); + * + * // 执行你的操作 + * + * await watcher.cancel(); + * + * @return {function} cancel(): 取消监听方法,调用后可以停止检测事件运行(异步) + */ +function startMonthCardWatcher() { + let cancelled = false; + + const task = (async () => { + try { + while (!cancelled) { + const [girl, common] = await Promise.all([ + findImg(girl_moon), + findImg(welkin_moon_logo) + ]); + + if (girl || common) { + log.info("检测到月卡"); + await sleep(200); + click(100, 100); + await sleep(200); + } + + const stone = await findImg(primogem); + if (stone) { + log.info("点击原石"); + while (!cancelled) { + await sleep(200); + click(100, 100); + if (await isInMainUI()) { + log.info("已进入主页面"); + cancelled = true; + break; + } + } + } + + await sleep(1000); + } + } catch (e) { + log.error("月卡监听异常", e); + } finally { + log.info("月卡监听任务结束"); + } + })(); + + return { + cancel() { + cancelled = true; + return task; + } + }; +} + +/** + * 打开背包(检测过期物品) + */ +async function openBag() { + await genshin.returnMainUi(); + keyPress("B"); + await sleep(500); + const expiredText = await findText("物品过期", 870, 280, 170, 40, 2); + if (expiredText) { + log.info("检测到过期物品,关闭弹窗"); + await sleep(500); + click(980, 750); + } + await sleep(50); +} + +// /** +// * 修改分辨率为1080p(会导致截图器重启,任务全部清空,暂时无法使用,仅供参考) +// * @return {Promise} +// */ +// async function changeTo1080P() { +// await genshin.returnMainUi(); +// const settings_button = await waitUntilImgAppear( +// esc_settings, +// async () => { +// keyPress("ESCAPE"); +// await sleep(1500); +// } +// ); +// if (settings_button) { +// await sleep(500); +// await waitUntilImgAppear( +// page_close_white, +// async () => { +// settings_button.click(); +// await sleep(500); +// } +// ); +// await sleep(1000); +// } else { +// throw new Error("打开菜单超时"); +// } +// await findTextAndClick("图像", 100, 200, 200, 300, 10); +// const view_mode = await findText("显示模式", 450, 200, 200, 200, 10); +// await sleep(500); +// click(view_mode.x + 1100, view_mode.y + 20); +// await sleep(200); +// moveMouseBy(0, 100); +// await sleep(200); +// for (let count = 0; count < 20; count++) { +// verticalScroll(100); +// await sleep(50); +// } +// const text_1080p = await waitUntilTextAppear( +// ["1920", "1080"], +// () => { +// verticalScroll(-100); +// }, +// 1400, +// 300, +// 400, +// 600, +// 20, +// 1000 +// ); +// await sleep(200); +// log.info("已切换至1080P"); +// click(text_1080p.x + 100, text_1080p.y + 10); +// } + +export { + getImgMat, + findImg, + findImgAndClick, + findText, + findTextAndClick, + waitUntilImgAppear, + waitUntilImgDisappear, + waitUntilTextAppear, + waitUntilTextDisappear, + isInMainUI, + startMonthCardWatcher, + openBag +}; \ No newline at end of file