diff --git a/repo/js/RoleExperienceCalculation/README.md b/repo/js/RoleExperienceCalculation/README.md new file mode 100644 index 000000000..0e41c7ff9 --- /dev/null +++ b/repo/js/RoleExperienceCalculation/README.md @@ -0,0 +1,73 @@ +# 《原神角色经验计算脚本》使用说明 +## 一、注意事项 +* 联机状态无法运行 +* ocr识别会小概率出现偏差,重新运行即可 +* 脚本生成的报告文件仅供作为参考,实际请按游戏为准 + +## 二、脚本概述 +1. 自动识别指定角色的当前等级和经验值 +2. 计算升级到目标等级所需的总经验值 +3. 可选:结合背包经验书进行统合计算 +4. 自动生成经验计算报告并保存为文本文件 + +## 三、使用方法和配置参数说明 +1. 需在调度器的配置组中点击 “+添加 → JS脚本” ,找到本JS脚本后加入配置组。 +2. 加入配置组后鼠标右键脚本, 修改JS脚本自定义配置。 +3. 脚本运行完成无异常后,会在脚本根目录下的 “test” 文件夹内创建文本文件, +文件名为exp_result_YYYYMMDD_HHMMDD,即exp_result_年月日_时分秒。 + +脚本的"js自定义配置"设置: + + 1. 目标角色 (必填): + - 格式:单个角色名,或多个角色用逗号分隔(中英文皆可),支持使用别名 + - 示例:"刻晴,甘雨,帝君" + 2. 目标等级 (必填): + - 格式:整数,表示目标等级 + - 示例:90 (范围:2-90) + 3. 结合当前背包拥有的经验书计算 (可选): + - 将扫描背包内经验书并统合计算 + +## 四、脚本文件结构 +* main.js:主要的脚本文件 +* manifest.json:脚本配置文件 +* settings.json:用户配置文件 +* test/:存放脚本运行后保存的文本文件 +* lib/:存放脚本依赖的JS模板文件 +* assets/:存放模板图片 + +## 五、关于脚本运行后保存的文本文件 +以下是示例文本内容: + + === 原神角色升级所需的经验记录 [2026/1/1 16:05:06] === + + ===【角色数据】=== + 【雅珂达】 + 当前等级:1级 + 当前经验:0 + 升级至90级所需经验:8362650 + + ===【经验书数据】=== + 大英雄的经验: + 数量:300 + 总经验值:6000000 + + 冒险家的经验: + 数量:561 + 总经验值:2805000 + + 流浪者的经验: + 数量:100 + 总经验值:100000 + + === 记录结束 === + 总计角色数:1 | 所有角色升至90级总计所需经验:8362650 + 背包经验书种类数:3 | 总计经验值:8905000 + 经验盈余:542350(超出需求) + + 当前世界等级:9 + 单次启示之花奖励(20原粹树脂): + 大英雄的经验:4~5本 + 冒险家的经验:6~7本 + + ================ 计算结果 ================ + 当前背包内经验书已满足经验需求,无需刷取 \ No newline at end of file diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/Bagpack.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/Bagpack.png new file mode 100644 index 000000000..361984014 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/Bagpack.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/Confirm.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/Confirm.png new file mode 100644 index 000000000..ab89e6410 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/Confirm.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/ReturnIcon.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/ReturnIcon.png new file mode 100644 index 000000000..b2139e2c3 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/ReturnIcon.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/SwipeBarIcon.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/SwipeBarIcon.png new file mode 100644 index 000000000..77ff48320 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/SwipeBarIcon.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/closeIcon.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/closeIcon.png new file mode 100644 index 000000000..ba4986402 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/closeIcon.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/paimon_menu.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/paimon_menu.png new file mode 100644 index 000000000..c424325b1 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/paimon_menu.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/冒险家的经验.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/冒险家的经验.png new file mode 100644 index 000000000..aeed80c6b Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/冒险家的经验.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/大英雄的经验.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/大英雄的经验.png new file mode 100644 index 000000000..ad0a5f374 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/大英雄的经验.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/流浪者的经验.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/流浪者的经验.png new file mode 100644 index 000000000..790052a17 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/流浪者的经验.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/SliderBottom.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/SliderBottom.png new file mode 100644 index 000000000..177706e26 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/SliderBottom.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/attribute.txt b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/attribute.txt new file mode 100644 index 000000000..bfdf17724 --- /dev/null +++ b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/attribute.txt @@ -0,0 +1,107 @@ +旅行者,,单手剑 +安柏,火,弓 +凯亚,冰,单手剑 +丽莎,雷,法器 +芭芭拉,水,法器 +雷泽,雷,大剑 +香菱,火,长枪 +北斗,雷,大剑 +行秋,水,单手剑 +凝光,岩,法器 +菲谢尔,雷,弓 +班尼特,火,单手剑 +诺艾尔,岩,大剑 +重云,冰,大剑 +砂糖,风,法器 +琴,风,单手剑 +迪卢克,火,大剑 +七七,冰,单手剑 +莫娜,水,法器 +温迪,风,弓 +可莉,火,法器 +迪奥娜,冰,弓 +达达利亚,水,弓 +辛焱,火,大剑 +钟离,岩,长枪 +阿贝多,岩,单手剑 +甘雨,冰,弓 +魈,风,长枪 +胡桃,火,长枪 +罗莎莉亚,冰,长枪 +烟绯,火,法器 +优菈,冰,大剑 +枫原万叶,风,单手剑 +神里绫华,冰,单手剑 +早柚,风,大剑 +宵宫,火,弓 +埃洛伊,冰,弓 +九条裟罗,雷,弓 +雷电将军,雷,长枪 +珊瑚宫心海,水,法器 +托马,火,长枪 +五郎,岩,弓箭 +荒泷一斗,岩,大剑 +云堇,岩,长枪 +申鹤,冰,长枪 +八重神子,雷,法器 +神里绫人,水,单手剑 +夜兰,水,弓 +久岐忍,雷,单手剑 +鹿野院平藏,风,法器 +柯莱,草,弓 +提纳里,草,弓 +多莉,雷,大剑 +坎蒂丝,水,长枪 +赛诺,雷,长枪 +妮露,水,单手剑 +纳西妲,草,法器 +莱依拉,冰,单手剑 +珐露珊,风,弓 +流浪者,风,法器 +瑶瑶,草,长枪 +艾尔海森,草,单手剑 +迪希雅,火,大剑 +米卡,冰,长枪 +卡维,草,大剑 +白术,草,法器 +绮良良,草,单手剑 +琳妮特,风,单手剑 +林尼,火,弓 +菲米尼,冰,大剑 +那维莱特,水,法器 +莱欧斯利,冰,法器 +夏洛蒂,冰,法器 +芙宁娜,水,单手剑 +娜维娅,岩,大剑 +夏沃蕾,火,长枪 +嘉明,火,大剑 +闲云,风,法器 +千织,岩,单手剑 +阿蕾奇诺,火,长枪 +赛索斯,雷,弓 +克洛琳德,雷,单手剑 +希格雯,水,弓 +艾梅莉埃,草,长枪 +卡齐娜,岩,长枪 +玛拉妮,水,法器 +基尼奇,草,大剑 +希诺宁,岩,单手剑 +欧洛伦,雷,弓 +恰斯卡,风,弓 +茜特菈莉,冰,法器 +玛薇卡,火,大剑 +蓝砚,风,法器 +梦见月瑞希,风,法器 +伊安珊,雷,长枪 +瓦蕾莎,雷,法器 +伊法,风,法器 +爱可菲,冰,长枪 +塔利雅,水,单手剑 +丝柯克,冰,单手剑 +伊涅芙,雷,长枪 +菈乌玛,草,法器 +爱诺,水,大剑 +菲林斯,雷,长枪 +奈芙尔,草,法器 +雅珂达,风,弓 +杜林,火,单手剑 diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/clearFilter.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/clearFilter.png new file mode 100644 index 000000000..b4ee3a5a7 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/clearFilter.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/冰.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/冰.png new file mode 100644 index 000000000..784c64e27 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/冰.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/单手剑.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/单手剑.png new file mode 100644 index 000000000..6081652d2 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/单手剑.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/大剑.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/大剑.png new file mode 100644 index 000000000..7e836b6d6 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/大剑.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/岩.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/岩.png new file mode 100644 index 000000000..fead3956b Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/岩.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/弓.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/弓.png new file mode 100644 index 000000000..53b6daa0c Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/弓.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/暂无筛选结果.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/暂无筛选结果.png new file mode 100644 index 000000000..cbbd67fc3 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/暂无筛选结果.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/水.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/水.png new file mode 100644 index 000000000..46e8c31c2 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/水.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/法器.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/法器.png new file mode 100644 index 000000000..c731a656e Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/法器.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/火.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/火.png new file mode 100644 index 000000000..3afda2e7f Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/火.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/确认筛选.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/确认筛选.png new file mode 100644 index 000000000..3535031e7 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/确认筛选.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/筛选.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/筛选.png new file mode 100644 index 000000000..88dcb21b3 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/筛选.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/草.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/草.png new file mode 100644 index 000000000..4fcd7c1b3 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/草.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/长枪.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/长枪.png new file mode 100644 index 000000000..5c6317667 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/长枪.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/雷.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/雷.png new file mode 100644 index 000000000..af1e97c83 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/雷.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/风.png b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/风.png new file mode 100644 index 000000000..bf4e40b71 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/RecognitionObject/角色筛选/风.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/七七01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/七七01.png new file mode 100644 index 000000000..d3b89b43b Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/七七01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/丝柯克01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/丝柯克01.png new file mode 100644 index 000000000..84bafdb8c Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/丝柯克01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/丽莎01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/丽莎01.png new file mode 100644 index 000000000..a12772010 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/丽莎01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/丽莎02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/丽莎02.png new file mode 100644 index 000000000..c12618ffe Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/丽莎02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/久岐忍01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/久岐忍01.png new file mode 100644 index 000000000..ccdb944f7 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/久岐忍01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/九条裟罗01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/九条裟罗01.png new file mode 100644 index 000000000..529fc029a Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/九条裟罗01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/云堇01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/云堇01.png new file mode 100644 index 000000000..83bf97d54 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/云堇01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/五郎01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/五郎01.png new file mode 100644 index 000000000..12395bf6c Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/五郎01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/伊安珊01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/伊安珊01.png new file mode 100644 index 000000000..e8033af32 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/伊安珊01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/伊法01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/伊法01.png new file mode 100644 index 000000000..271ddf019 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/伊法01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/伊涅芙01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/伊涅芙01.png new file mode 100644 index 000000000..32306bb79 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/伊涅芙01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/优菈01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/优菈01.png new file mode 100644 index 000000000..aa063015a Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/优菈01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/克洛琳德01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/克洛琳德01.png new file mode 100644 index 000000000..73a4a2e09 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/克洛琳德01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/八重神子01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/八重神子01.png new file mode 100644 index 000000000..68f0ec6b6 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/八重神子01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/凝光01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/凝光01.png new file mode 100644 index 000000000..676779aaa Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/凝光01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/凯亚01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/凯亚01.png new file mode 100644 index 000000000..024d2bc16 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/凯亚01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/凯亚02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/凯亚02.png new file mode 100644 index 000000000..fabdb4b58 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/凯亚02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/刻晴01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/刻晴01.png new file mode 100644 index 000000000..2d9a8f0dc Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/刻晴01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/刻晴02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/刻晴02.png new file mode 100644 index 000000000..190f2fba7 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/刻晴02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/北斗01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/北斗01.png new file mode 100644 index 000000000..ff70d2c91 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/北斗01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/千织01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/千织01.png new file mode 100644 index 000000000..ae0807253 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/千织01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/卡维01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/卡维01.png new file mode 100644 index 000000000..284be4c5b Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/卡维01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/卡齐娜01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/卡齐娜01.png new file mode 100644 index 000000000..f7751bc3b Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/卡齐娜01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/可莉01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/可莉01.png new file mode 100644 index 000000000..93e1b25bd Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/可莉01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/可莉02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/可莉02.png new file mode 100644 index 000000000..5366d67ec Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/可莉02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/嘉明01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/嘉明01.png new file mode 100644 index 000000000..ee8384260 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/嘉明01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/坎蒂丝01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/坎蒂丝01.png new file mode 100644 index 000000000..bb23aade6 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/坎蒂丝01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/埃洛伊01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/埃洛伊01.png new file mode 100644 index 000000000..996bc9c85 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/埃洛伊01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/基尼奇01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/基尼奇01.png new file mode 100644 index 000000000..2c9a6238c Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/基尼奇01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/塔利雅01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/塔利雅01.png new file mode 100644 index 000000000..5b4c5dbd3 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/塔利雅01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/夏沃蕾01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/夏沃蕾01.png new file mode 100644 index 000000000..6d211603a Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/夏沃蕾01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/夏洛蒂01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/夏洛蒂01.png new file mode 100644 index 000000000..b07648934 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/夏洛蒂01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/多莉01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/多莉01.png new file mode 100644 index 000000000..7d9928fa6 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/多莉01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/夜兰01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/夜兰01.png new file mode 100644 index 000000000..13baa88c5 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/夜兰01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/夜兰02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/夜兰02.png new file mode 100644 index 000000000..aedad1d9e Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/夜兰02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/奈芙尔01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/奈芙尔01.png new file mode 100644 index 000000000..a4bbb1c59 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/奈芙尔01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/妮露01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/妮露01.png new file mode 100644 index 000000000..57c67f5b9 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/妮露01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/妮露02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/妮露02.png new file mode 100644 index 000000000..f02f58d5a Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/妮露02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/娜维娅01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/娜维娅01.png new file mode 100644 index 000000000..3134b09ff Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/娜维娅01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/安柏01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/安柏01.png new file mode 100644 index 000000000..b4ef9f282 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/安柏01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/安柏02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/安柏02.png new file mode 100644 index 000000000..18f8631eb Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/安柏02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/宵宫01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/宵宫01.png new file mode 100644 index 000000000..24897c5e7 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/宵宫01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/希格雯01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/希格雯01.png new file mode 100644 index 000000000..f1489e35a Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/希格雯01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/希诺宁01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/希诺宁01.png new file mode 100644 index 000000000..00222705c Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/希诺宁01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/恰斯卡01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/恰斯卡01.png new file mode 100644 index 000000000..f1585e65d Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/恰斯卡01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/托马01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/托马01.png new file mode 100644 index 000000000..99c812e46 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/托马01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/提纳里01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/提纳里01.png new file mode 100644 index 000000000..2e3b06fa6 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/提纳里01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/旅行者01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/旅行者01.png new file mode 100644 index 000000000..f9939c21a Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/旅行者01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/旅行者02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/旅行者02.png new file mode 100644 index 000000000..453614aa6 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/旅行者02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/早柚01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/早柚01.png new file mode 100644 index 000000000..9e5898a67 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/早柚01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/杜林01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/杜林01.png new file mode 100644 index 000000000..9db112c9a Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/杜林01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/林尼01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/林尼01.png new file mode 100644 index 000000000..ecde77083 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/林尼01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/枫原万叶01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/枫原万叶01.png new file mode 100644 index 000000000..a12a17fd2 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/枫原万叶01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/柯莱01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/柯莱01.png new file mode 100644 index 000000000..6254c5004 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/柯莱01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/梦见月瑞希01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/梦见月瑞希01.png new file mode 100644 index 000000000..bf50041b3 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/梦见月瑞希01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/欧洛伦01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/欧洛伦01.png new file mode 100644 index 000000000..a5595d59a Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/欧洛伦01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/流浪者01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/流浪者01.png new file mode 100644 index 000000000..b07eeb1d0 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/流浪者01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/温迪01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/温迪01.png new file mode 100644 index 000000000..fe6e589da Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/温迪01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/烟绯01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/烟绯01.png new file mode 100644 index 000000000..26b469cf8 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/烟绯01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/爱可菲01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/爱可菲01.png new file mode 100644 index 000000000..7c152e4c6 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/爱可菲01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/爱诺01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/爱诺01.png new file mode 100644 index 000000000..f6c77083f Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/爱诺01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/玛拉妮01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/玛拉妮01.png new file mode 100644 index 000000000..f09d8e257 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/玛拉妮01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/玛薇卡01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/玛薇卡01.png new file mode 100644 index 000000000..6b3c4ac6e Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/玛薇卡01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/珊瑚宫心海01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/珊瑚宫心海01.png new file mode 100644 index 000000000..40b77c33a Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/珊瑚宫心海01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/珐露珊01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/珐露珊01.png new file mode 100644 index 000000000..a979e7286 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/珐露珊01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/班尼特01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/班尼特01.png new file mode 100644 index 000000000..f7f6a1c1b Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/班尼特01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/班尼特02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/班尼特02.png new file mode 100644 index 000000000..d50ac037c Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/班尼特02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/琳妮特01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/琳妮特01.png new file mode 100644 index 000000000..8880297d3 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/琳妮特01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/琴01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/琴01.png new file mode 100644 index 000000000..59ab7a359 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/琴01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/琴02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/琴02.png new file mode 100644 index 000000000..3170bcec5 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/琴02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/琴03.png b/repo/js/RoleExperienceCalculation/assets/characterimage/琴03.png new file mode 100644 index 000000000..78d38cbd0 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/琴03.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/瑶瑶01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/瑶瑶01.png new file mode 100644 index 000000000..530fd59d0 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/瑶瑶01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/瓦蕾莎01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/瓦蕾莎01.png new file mode 100644 index 000000000..583dce425 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/瓦蕾莎01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/甘雨01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/甘雨01.png new file mode 100644 index 000000000..036d60280 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/甘雨01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/甘雨02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/甘雨02.png new file mode 100644 index 000000000..6650371de Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/甘雨02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/申鹤01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/申鹤01.png new file mode 100644 index 000000000..d13500221 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/申鹤01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/申鹤02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/申鹤02.png new file mode 100644 index 000000000..bae52f9ce Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/申鹤02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/白术01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/白术01.png new file mode 100644 index 000000000..1487c983c Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/白术01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/砂糖01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/砂糖01.png new file mode 100644 index 000000000..d9cfd3b96 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/砂糖01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/神里绫人01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/神里绫人01.png new file mode 100644 index 000000000..9c0ca675a Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/神里绫人01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/神里绫华01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/神里绫华01.png new file mode 100644 index 000000000..2cf15a1ba Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/神里绫华01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/神里绫华02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/神里绫华02.png new file mode 100644 index 000000000..3209de661 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/神里绫华02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/空01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/空01.png new file mode 100644 index 000000000..453614aa6 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/空01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/米卡01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/米卡01.png new file mode 100644 index 000000000..ceb717153 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/米卡01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/纳西妲01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/纳西妲01.png new file mode 100644 index 000000000..6f41ab8cc Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/纳西妲01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/绮良良01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/绮良良01.png new file mode 100644 index 000000000..796041ab5 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/绮良良01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/绮良良02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/绮良良02.png new file mode 100644 index 000000000..f229e770a Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/绮良良02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/罗莎莉亚01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/罗莎莉亚01.png new file mode 100644 index 000000000..6b7df9c65 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/罗莎莉亚01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/罗莎莉亚02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/罗莎莉亚02.png new file mode 100644 index 000000000..829802cf2 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/罗莎莉亚02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/胡桃01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/胡桃01.png new file mode 100644 index 000000000..520b8d1b7 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/胡桃01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/胡桃02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/胡桃02.png new file mode 100644 index 000000000..83d0fbd0d Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/胡桃02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/艾尔海森01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/艾尔海森01.png new file mode 100644 index 000000000..be4e3a756 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/艾尔海森01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/艾梅莉埃01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/艾梅莉埃01.png new file mode 100644 index 000000000..a72063105 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/艾梅莉埃01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/芙宁娜01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/芙宁娜01.png new file mode 100644 index 000000000..031a73ddc Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/芙宁娜01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/芭芭拉01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/芭芭拉01.png new file mode 100644 index 000000000..043d56724 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/芭芭拉01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/芭芭拉02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/芭芭拉02.png new file mode 100644 index 000000000..218d57f07 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/芭芭拉02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/茜特菈莉01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/茜特菈莉01.png new file mode 100644 index 000000000..ea8a1d02d Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/茜特菈莉01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/荒泷一斗01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/荒泷一斗01.png new file mode 100644 index 000000000..22341926e Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/荒泷一斗01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/荧01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/荧01.png new file mode 100644 index 000000000..f9939c21a Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/荧01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/莫娜01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/莫娜01.png new file mode 100644 index 000000000..e6ea0e894 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/莫娜01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/莫娜02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/莫娜02.png new file mode 100644 index 000000000..a8ba47fe7 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/莫娜02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/莱依拉01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/莱依拉01.png new file mode 100644 index 000000000..95c181626 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/莱依拉01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/莱欧斯利01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/莱欧斯利01.png new file mode 100644 index 000000000..9fff0b47e Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/莱欧斯利01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/菈乌玛01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/菈乌玛01.png new file mode 100644 index 000000000..1ef13ad30 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/菈乌玛01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/菲林斯01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/菲林斯01.png new file mode 100644 index 000000000..2c72bdfe4 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/菲林斯01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/菲米尼01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/菲米尼01.png new file mode 100644 index 000000000..e682123f1 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/菲米尼01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/菲谢尔01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/菲谢尔01.png new file mode 100644 index 000000000..3986e65a6 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/菲谢尔01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/菲谢尔02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/菲谢尔02.png new file mode 100644 index 000000000..104fbd2ae Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/菲谢尔02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/蓝砚01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/蓝砚01.png new file mode 100644 index 000000000..2827eab3b Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/蓝砚01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/行秋01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/行秋01.png new file mode 100644 index 000000000..f666902e5 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/行秋01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/诺艾尔01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/诺艾尔01.png new file mode 100644 index 000000000..c5dce37e4 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/诺艾尔01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/赛索斯01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/赛索斯01.png new file mode 100644 index 000000000..b582f2106 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/赛索斯01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/赛诺01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/赛诺01.png new file mode 100644 index 000000000..5b28184bb Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/赛诺01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/辛焱01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/辛焱01.png new file mode 100644 index 000000000..f9ff090ea Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/辛焱01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/达达利亚01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/达达利亚01.png new file mode 100644 index 000000000..7770acd38 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/达达利亚01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/迪卢克01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/迪卢克01.png new file mode 100644 index 000000000..b55e39cc3 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/迪卢克01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/迪卢克02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/迪卢克02.png new file mode 100644 index 000000000..8386c618a Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/迪卢克02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/迪奥娜01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/迪奥娜01.png new file mode 100644 index 000000000..9e1ac5504 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/迪奥娜01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/迪希雅01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/迪希雅01.png new file mode 100644 index 000000000..349b64fc7 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/迪希雅01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/那维莱特01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/那维莱特01.png new file mode 100644 index 000000000..3493d8f30 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/那维莱特01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/重云01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/重云01.png new file mode 100644 index 000000000..9d7bd6a2a Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/重云01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/钟离01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/钟离01.png new file mode 100644 index 000000000..380d60a75 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/钟离01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/闲云01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/闲云01.png new file mode 100644 index 000000000..e65cc6485 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/闲云01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/阿蕾奇诺01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/阿蕾奇诺01.png new file mode 100644 index 000000000..6a521137c Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/阿蕾奇诺01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/阿贝多01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/阿贝多01.png new file mode 100644 index 000000000..bcd3f0235 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/阿贝多01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/雅珂达01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/雅珂达01.png new file mode 100644 index 000000000..6e20d23c2 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/雅珂达01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/雷泽01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/雷泽01.png new file mode 100644 index 000000000..b8b20c87d Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/雷泽01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/雷电将军01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/雷电将军01.png new file mode 100644 index 000000000..d371dbd31 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/雷电将军01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/香菱01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/香菱01.png new file mode 100644 index 000000000..b56d6ff29 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/香菱01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/香菱02.png b/repo/js/RoleExperienceCalculation/assets/characterimage/香菱02.png new file mode 100644 index 000000000..f6c41a318 Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/香菱02.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/魈01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/魈01.png new file mode 100644 index 000000000..9a9a44bbc Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/魈01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/characterimage/鹿野院平藏01.png b/repo/js/RoleExperienceCalculation/assets/characterimage/鹿野院平藏01.png new file mode 100644 index 000000000..acdf1397d Binary files /dev/null and b/repo/js/RoleExperienceCalculation/assets/characterimage/鹿野院平藏01.png differ diff --git a/repo/js/RoleExperienceCalculation/assets/combat_avatar.json b/repo/js/RoleExperienceCalculation/assets/combat_avatar.json new file mode 100644 index 000000000..825d1bc2c --- /dev/null +++ b/repo/js/RoleExperienceCalculation/assets/combat_avatar.json @@ -0,0 +1,1433 @@ +[ + { + "name": "旅行者", + "alias": [ + "旅行者", + "主角", + "卑鄙的外乡人", + "荣誉骑士", + "爷", + "主", + "履刑者", + "抽卡不歪真君" + ] + }, + { + "name": "荧", + "alias": [ + "荧", + "女主", + "女主角", + "莹", + "萤", + "黄毛阿姨", + "荧妹", + "女爷", + "包包", + "宴宁" + ] + }, + { + "name": "空", + "alias": [ + "空", + "男主", + "男主角", + "龙哥", + "空哥", + "男爷" + ] + }, + { + "name": "神里绫华", + "alias": [ + "神里绫华", + "Kamisato Ayaka", + "Ayaka", + "神里", + "绫华", + "神里凌华", + "凌华", + "白鹭公主", + "神里大小姐", + "龟", + "龟龟", + "乌龟" + ] + }, + { + "name": "琴", + "alias": [ + "琴", + "Jean", + "团长", + "代理团长", + "琴团长", + "蒲公英骑士" + ] + }, + { + "name": "丽莎", + "alias": [ + "丽莎", + "Lisa", + "图书管理员", + "图书馆管理员", + "蔷薇魔女", + "阿姨" + ] + }, + { + "name": "芭芭拉", + "alias": [ + "芭芭拉", + "Barbara", + "巴巴拉", + "内鬼", + "加湿器", + "肉身解咒", + "肉身解咒真君", + "闪耀偶像", + "偶像" + ] + }, + { + "name": "凯亚", + "alias": [ + "凯亚", + "Kaeya", + "盖亚", + "凯子哥", + "凯鸭", + "矿工", + "矿工头子", + "骑兵队长", + "凯子", + "凝冰渡海真君" + ] + }, + { + "name": "迪卢克", + "alias": [ + "迪卢克", + "Diluc", + "卢姥爷", + "姥爷", + "卢老爷", + "卢锅巴", + "正义人", + "正e人", + "正E人", + "卢本伟", + "暗夜英雄", + "卢卢伯爵", + "落魄了", + "落魄了家人们" + ] + }, + { + "name": "雷泽", + "alias": [ + "雷泽", + "Razor", + "狼少年", + "狼崽子", + "狼崽", + "卢皮卡", + "小狼", + "小狼狗", + "狼孩" + ] + }, + { + "name": "安柏", + "alias": [ + "安柏", + "Amber", + "安伯", + "兔兔伯爵", + "飞行冠军", + "侦查骑士", + "点火姬", + "点火机", + "打火机", + "打火姬" + ] + }, + { + "name": "温迪", + "alias": [ + "温迪", + "Venti", + "温蒂", + "风神", + "卖唱的", + "巴巴托斯", + "巴巴脱丝", + "芭芭托斯", + "芭芭脱丝", + "干点正事", + "不干正事", + "吟游诗人", + "诶嘿", + "唉嘿", + "摸鱼" + ] + }, + { + "name": "香菱", + "alias": [ + "香菱", + "Xiangling", + "香玲", + "锅巴", + "厨师", + "万民堂厨师", + "香师傅" + ] + }, + { + "name": "北斗", + "alias": [ + "北斗", + "Beidou", + "大姐头", + "大姐", + "无冕的龙王" + ] + }, + { + "name": "行秋", + "alias": [ + "行秋", + "Xingqiu", + "秋秋人", + "秋妹妹", + "书呆子", + "枕玉", + "飞云商会二少爷" + ] + }, + { + "name": "魈", + "alias": [ + "魈", + "Xiao", + "打桩机", + "插秧", + "三眼五显仙人", + "三眼五显真人", + "降魔大圣", + "护法夜叉", + "快乐风男", + "无聊", + "靖妖傩舞", + "矮子仙人", + "三点五尺仙人", + "跳跳虎", + "风夜叉" + ] + }, + { + "name": "凝光", + "alias": [ + "凝光", + "Ningguang", + "富婆", + "天权星", + "天权" + ] + }, + { + "name": "可莉", + "alias": [ + "可莉", + "逃跑的太阳", + "Klee", + "嘟嘟可", + "火花骑士", + "蹦蹦炸弹", + "炸鱼", + "放火烧山", + "放火烧山真君", + "蒙德最强战力", + "逃跑的太阳", + "啦啦啦", + "哒哒哒", + "炸弹人", + "禁闭室", + "太阳", + "小太阳" + ] + }, + { + "name": "钟离", + "alias": [ + "钟离", + "Zhongli", + "摩拉克斯", + "岩王爷", + "岩神", + "钟师傅", + "天动万象", + "岩王帝君", + "未来可期", + "帝君", + "拒收病婿" + ] + }, + { + "name": "菲谢尔", + "alias": [ + "菲谢尔", + "Fischl", + "皇女", + "小艾米", + "小艾咪", + "奥兹", + "断罪皇女", + "中二病", + "中二少女", + "中二皇女", + "奥兹发射器" + ] + }, + { + "name": "班尼特", + "alias": [ + "班尼特", + "Bennett", + "点赞哥", + "点赞", + "倒霉少年", + "倒霉蛋", + "霹雳闪雷真君", + "班神", + "班爷", + "倒霉", + "蒙德火神", + "六星真神" + ] + }, + { + "name": "达达利亚", + "alias": [ + "达达利亚", + "Tartaglia", + "Childe", + "Ajax", + "达达鸭", + "达达利鸭", + "公子", + "玩具销售员", + "玩具推销员", + "钱包", + "鸭鸭", + "愚人众末席" + ] + }, + { + "name": "诺艾尔", + "alias": [ + "诺艾尔", + "Noelle", + "女仆", + "高达", + "岩王帝姬" + ] + }, + { + "name": "七七", + "alias": [ + "七七", + "Qiqi", + "僵尸", + "肚饿真君", + "度厄真君", + "77" + ] + }, + { + "name": "重云", + "alias": [ + "重云", + "Chongyun", + "纯阳之体", + "冰棍" + ] + }, + { + "name": "甘雨", + "alias": [ + "甘雨", + "Ganyu", + "椰羊", + "椰奶", + "王小美" + ] + }, + { + "name": "阿贝多", + "alias": [ + "阿贝多", + "Albedo", + "可莉哥哥", + "升降机", + "升降台", + "电梯", + "白垩之子", + "贝爷", + "白垩", + "阿贝少", + "花呗多", + "阿贝夕", + "阿师傅" + ] + }, + { + "name": "迪奥娜", + "alias": [ + "迪奥娜", + "Diona", + "迪欧娜", + "dio娜", + "冰猫", + "猫猫", + "猫娘", + "喵喵", + "调酒师" + ] + }, + { + "name": "莫娜", + "alias": [ + "莫娜", + "Mona", + "穷鬼", + "穷光蛋", + "穷", + "莫纳", + "占星术士", + "占星师", + "讨龙真君", + "半部讨龙真君", + "阿斯托洛吉斯·莫娜·梅姬斯图斯", + "梅姬斯图斯", + "梅姬斯图斯姬" + ] + }, + { + "name": "刻晴", + "alias": [ + "刻晴", + "Keqing", + "刻情", + "氪晴", + "刻师傅", + "刻师父", + "牛杂", + "牛杂师傅", + "斩尽牛杂", + "免疫", + "免疫免疫", + "屁斜剑法", + "玉衡星", + "阿晴", + "啊晴", + "璃月雷神" + ] + }, + { + "name": "砂糖", + "alias": [ + "砂糖", + "Sucrose", + "sucrose" + ] + }, + { + "name": "辛焱", + "alias": [ + "辛焱", + "Xinyan", + "辛炎", + "黑妹", + "摇滚" + ] + }, + { + "name": "罗莎莉亚", + "alias": [ + "罗莎莉亚", + "Rosaria", + "罗莎莉娅", + "白色史莱姆", + "白史莱姆", + "修女", + "罗莎利亚", + "罗莎利娅", + "罗沙莉亚", + "罗沙莉娅", + "罗沙利亚", + "罗沙利娅", + "萝莎莉亚", + "萝莎莉娅", + "萝莎利亚", + "萝莎利娅", + "萝沙莉亚", + "萝沙莉娅", + "萝沙利亚", + "萝沙利娅" + ] + }, + { + "name": "胡桃", + "alias": [ + "胡桃", + "Hu Tao", + "HuTao", + "Hutao", + "胡淘", + "往生堂堂主", + "火化", + "抬棺的", + "蝴蝶", + "核桃", + "堂主", + "胡堂主", + "雪霁梅香", + "桃子", + "桃" + ] + }, + { + "name": "枫原万叶", + "alias": [ + "枫原万叶", + "Kaedehara Kazuha", + "Kazuha", + "万叶", + "叶天帝", + "天帝", + "叶师傅" + ] + }, + { + "name": "烟绯", + "alias": [ + "烟绯", + "Yanfei", + "烟老师", + "律师", + "罗翔" + ] + }, + { + "name": "宵宫", + "alias": [ + "宵宫", + "Yoimiya", + "霄宫", + "烟花", + "肖宫", + "肖工", + "绷带女孩" + ] + }, + { + "name": "托马", + "alias": [ + "托马", + "Thoma", + "家政官", + "太郎丸", + "地头蛇", + "男仆", + "拖马" + ] + }, + { + "name": "优菈", + "alias": [ + "优菈", + "Eula", + "优拉", + "尤拉", + "尤菈", + "浪花骑士", + "记仇", + "劳伦斯" + ] + }, + { + "name": "雷电将军", + "alias": [ + "雷电将军", + "Raiden Shogun", + "Raiden", + "雷神", + "将军", + "雷军", + "巴尔", + "阿影", + "影", + "巴尔泽布", + "煮饭婆", + "奶香一刀", + "无想一刀", + "宅女" + ] + }, + { + "name": "早柚", + "alias": [ + "早柚", + "Sayu", + "小狸猫", + "狸猫", + "忍者", + "貉" + ] + }, + { + "name": "珊瑚宫心海", + "alias": [ + "珊瑚宫心海", + "Sangonomiya Kokomi", + "Kokomi", + "心海", + "军师", + "珊瑚宫", + "书记", + "观赏鱼", + "水母", + "鱼", + "美人鱼" + ] + }, + { + "name": "五郎", + "alias": [ + "五郎", + "Gorou", + "柴犬", + "土狗", + "希娜", + "希娜小姐" + ] + }, + { + "name": "九条裟罗", + "alias": [ + "九条裟罗", + "Kujou Sara", + "Sara", + "九条", + "九条沙罗", + "裟罗", + "沙罗", + "天狗" + ] + }, + { + "name": "荒泷一斗", + "alias": [ + "荒泷一斗", + "Arataki Itto", + "Itto", + "荒龙一斗", + "荒泷天下第一斗", + "一斗", + "一抖", + "荒泷", + "1斗", + "岩牛", + "岩牛牛", + "斗战岩牛", + "斗子哥", + "牛子哥", + "牛子", + "孩子王", + "斗虫", + "巧乐兹", + "放牛的" + ] + }, + { + "name": "八重神子", + "alias": [ + "八重神子", + "Yae Miko", + "Miko", + "八重", + "神子", + "狐狸", + "想得美哦", + "巫女", + "屑狐狸", + "骚狐狸", + "八重宫司", + "婶子", + "小八", + "八重寄子", + "寄子", + "八神虫子", + "八神重子" + ] + }, + { + "name": "鹿野院平藏", + "alias": [ + "鹿野院平藏", + "shikanoin heizou", + "Heizou", + "鹿野苑", + "鹿野院", + "平藏", + "鹿野苑平藏", + "小鹿" + ] + }, + { + "name": "夜兰", + "alias": [ + "夜兰", + "Yelan", + "夜阑", + "叶澜", + "腋兰", + "夜天后" + ] + }, + { + "name": "绮良良", + "alias": [ + "绮良良", + "Kirara", + "大猫猫", + "大喵喵", + "稻妻猫猫", + "绮娘娘", + "琦良良", + "良良", + "快递员", + "草猫", + "草猫猫", + "草喵", + "草喵喵", + "猫又" + ] + }, + { + "name": "埃洛伊", + "alias": [ + "埃洛伊", + "Aloy" + ] + }, + { + "name": "申鹤", + "alias": [ + "申鹤", + "Shenhe", + "神鹤", + "小姨", + "小姨子", + "审鹤" + ] + }, + { + "name": "云堇", + "alias": [ + "云堇", + "Yun Jin", + "yun jin", + "云瑾", + "云先生", + "云锦", + "神女劈观" + ] + }, + { + "name": "久岐忍", + "alias": [ + "久岐忍", + "Kuki Shinobu", + "Kuki", + "Shinobu", + "97忍", + "小忍", + "久歧忍", + "97", + "茄忍", + "茄子", + "紫茄子", + "阿忍", + "忍姐" + ] + }, + { + "name": "神里绫人", + "alias": [ + "神里绫人", + "Kamisato Ayato", + "Ayato", + "绫人", + "神里凌人", + "凌人", + "0人", + "神人", + "零人", + "大舅哥" + ] + }, + { + "name": "柯莱", + "alias": [ + "柯莱", + "Collei", + "柯来", + "科莱", + "科来", + "小天使", + "须弥安柏", + "草安柏", + "须弥飞行冠军" + ] + }, + { + "name": "多莉", + "alias": [ + "多莉", + "Dori", + "多利", + "多力", + "奸商" + ] + }, + { + "name": "提纳里", + "alias": [ + "提纳里", + "Tighnari", + "提那里", + "小提", + "驴" + ] + }, + { + "name": "妮露", + "alias": [ + "妮露", + "Nilou", + "尼露", + "妮璐", + "舞娘", + "红牛" + ] + }, + { + "name": "赛诺", + "alias": [ + "赛诺", + "Cyno", + "塞诺", + "胡狼", + "大风纪官", + "大风机关" + ] + }, + { + "name": "坎蒂丝", + "alias": [ + "坎蒂丝", + "Candace", + "坎迪斯" + ] + }, + { + "name": "纳西妲", + "alias": [ + "纳西妲", + "Nahida", + "草神", + "小吉祥", + "大吉祥", + "小草神", + "大慈树王", + "小吉祥草王", + "草萝莉", + "羽毛球", + "摩诃善法大吉祥智慧主", + "智慧主", + "智慧之神", + "布耶尔" + ] + }, + { + "name": "莱依拉", + "alias": [ + "莱依拉", + "Layla", + "莱依菈", + "来依菈", + "来依拉" + ] + }, + { + "name": "流浪者", + "alias": [ + "流浪者", + "Wanderer", + "散兵", + "国崩", + "雷电国崩", + "大炮", + "雷电大炮", + "雷大炮", + "伞兵", + "斯卡拉姆齐" + ] + }, + { + "name": "珐露珊", + "alias": [ + "珐露珊", + "Faruzan", + "法露珊", + "法璐珊", + "法露姗", + "法璐姗", + "珐露姗", + "珐璐姗", + "百岁珊", + "百岁山", + "前辈", + "仙贝" + ] + }, + { + "name": "瑶瑶", + "alias": [ + "瑶瑶", + "Yaoyao", + "遥遥", + "萝卜", + "月桂" + ] + }, + { + "name": "艾尔海森", + "alias": [ + "艾尔海森", + "Alhaitham", + "海哥", + "埃尔海森", + "海森", + "海参", + "书记官" + ] + }, + { + "name": "迪希雅", + "alias": [ + "迪希雅", + "Dehya", + "迪希亚", + "迪希娅", + "迪西雅", + "迪西亚" + ] + }, + { + "name": "米卡", + "alias": [ + "米卡", + "Mika", + "鹦鹉", + "凤头", + "凤头鹦鹉" + ] + }, + { + "name": "卡维", + "alias": [ + "卡维", + "Kaveh", + "艾尔海森室友" + ] + }, + { + "name": "白术", + "alias": [ + "白术", + "Baizhu", + "长生", + "白医生" + ] + }, + { + "name": "琳妮特", + "alias": [ + "琳妮特", + "Lynette", + "林妮特", + "林尼特", + "琳尼特", + "女魔术师", + "魔术猫", + "魔术喵", + "登登" + ] + }, + { + "name": "林尼", + "alias": [ + "林尼", + "Lyney", + "林妮", + "琳尼", + "琳妮", + "男魔术师", + "魔术师" + ] + }, + { + "name": "菲米尼", + "alias": [ + "菲米尼", + "Freminet", + "非米尼", + "潜水员" + ] + }, + { + "name": "莱欧斯利", + "alias": [ + "莱欧斯利", + "Wriothesley", + "莱欧", + "枫丹桑博", + "公爵", + "典狱长", + "牢大" + ] + }, + { + "name": "那维莱特", + "alias": [ + "那维莱特", + "Neuvillette", + "那维", + "水龙王", + "水龙", + "审判官", + "海獭", + "龙王", + "最高审判官", + "水之龙王" + ] + }, + { + "name": "夏洛蒂", + "alias": [ + "夏洛蒂", + "Charlotte", + "夏洛", + "夏洛帝", + "记者", + "小记者", + "佳能400D", + "400D" + ] + }, + { + "name": "芙宁娜", + "alias": [ + "芙宁娜", + "Furina", + "Focalors", + "水神", + "芙芙", + "芙卡洛斯", + "傻芙芙" + ] + }, + { + "name": "夏沃蕾", + "alias": [ + "夏沃蕾", + "chevreuse", + "夏沃雷" + ] + }, + { + "name": "娜维娅", + "alias": [ + "娜维娅", + "navia", + "大小姐", + "刺玫会", + "黄豆", + "流汗黄豆", + "黄豆姐", + "娜薇娅", + "娜薇雅", + "娜维雅" + ] + }, + { + "name": "嘉明", + "alias": [ + "嘉明", + "Gaming", + "jiaming", + "佳明", + "嘉铭", + "家明", + "镖师", + "舞狮少年", + "舞狮" + ] + }, + { + "name": "闲云", + "alias": [ + "闲云", + "Xianyun", + "流云", + "刘云", + "留云", + "野鹤", + "那个女人", + "留云借风", + "留云借风真君", + "很会聊天", + "很会聊天真君" + ] + }, + { + "name": "千织", + "alias": [ + "千织", + "Chiori", + "千只", + "设计师", + "裁缝", + "千织屋老板" + ] + }, + { + "name": "希格雯", + "alias": [ + "希格雯", + "Sigewinne", + "希格文", + "护士", + "护士长" + ] + }, + { + "name": "阿蕾奇诺", + "alias": [ + "阿蕾奇诺", + "Arlecchino", + "阿雷奇诺", + "仆人", + "黑优菈", + "黑暗优菈", + "父亲", + "佩露薇利" + ] + }, + { + "name": "赛索斯", + "alias": [ + "赛索斯", + "Sethos", + "塞索斯", + "塞索思", + "赛索思" + ] + }, + { + "name": "克洛琳德", + "alias": [ + "克洛琳德", + "Clorinde", + "琳德", + "科洛琳德", + "克洛林德", + "克罗林德", + "苹果姐" + ] + }, + { + "name": "艾梅莉埃", + "alias": [ + "艾梅莉埃", + "Emilie", + "调香师", + "艾梅", + "香水设计师", + "现场清理人" + ] + }, + { + "name": "卡齐娜", + "alias": [ + "卡齐娜", + "Kachina", + "卡奇娜", + "卡齐纳", + "卡齐那", + "卡其那", + "冲天钻钻", + "岩莉莉" + ] + }, + { + "name": "基尼奇", + "alias": [ + "基尼奇", + "Kinich", + "基哥", + "基尼齐", + "蜘蛛侠" + ] + }, + { + "name": "玛拉妮", + "alias": [ + "玛拉妮", + "Mualani", + "马拉尼", + "鲨鱼妹", + "海豹妹", + "海豹", + "纳塔鲨", + "逐浪客" + ] + }, + { + "name": "希诺宁", + "alias": [ + "希诺宁", + "Xilonen", + "豹女", + "岩大猫", + "大岩猫", + "岩猫", + "岩猫猫", + "西诺宁" + ] + }, + { + "name": "恰斯卡", + "alias": [ + "恰斯卡", + "Chasca", + "武卡", + "调停人", + "鸟人" + ] + }, + { + "name": "欧洛伦", + "alias": [ + "欧洛伦", + "Ororon", + "庇笛", + "孙子", + "大孙子", + "蝙蝠侠" + ] + }, + { + "name": "玛薇卡", + "alias": [ + "玛薇卡", + "Mavuika", + "火神", + "马薇卡", + "玛维卡", + "马维卡", + "马微卡", + "玛微卡" + ] + }, + { + "name": "茜特菈莉", + "alias": [ + "茜特菈莉", + "Citlali", + "西特菈莉", + "西特拉莉", + "茜特拉莉", + "西特拉利", + "黑曜石奶奶", + "黑曜石", + "奶奶", + "老伴" + ] + }, + { + "name": "蓝砚", + "alias": [ + "蓝砚", + "Lanyan", + "蓝燕", + "兰砚", + "兰燕", + "藤编师", + "风鹰侠", + "蓝研", + "蓝颜", + "兰颜" + ] + }, + { + "name": "梦见月瑞希", + "alias": [ + "梦见月瑞希", + "Yumemizuki Mizuki", + "Mizuki", + "梦见", + "梦见月", + "瑞希", + "瑞幸", + "木更", + "梗小姐", + "食梦貘", + "梦魔", + "魅魔", + "心理医生", + "心理诊疗师" + ] + }, + { + "name": "伊安珊", + "alias": [ + "伊安珊", + "Iansan", + "123", + "伊安姗", + "教练", + "依安珊" + ] + }, + { + "name": "瓦雷莎", + "alias": [ + "瓦雷莎", + "Varesa", + "瓦蕾莎", + "瓦蕾沙", + "瓦蕾砂", + "瓦雷沙", + "牛头人", + "牛战士", + "牛牛", + "雷牛", + "雷牛牛", + "奶牛", + "粉牛" + ] + }, + { + "name": "爱可菲", + "alias": [ + "爱可菲", + "Escoffier", + "厨师", + "爱可非", + "艾可菲", + "艾可非" + ] + }, + { + "name": "伊法", + "alias": [ + "伊法", + "Ifa", + "哥们", + "医生" + ] + }, + { + "name": "丝柯克", + "alias": [ + "丝柯克", + "Skirk", + "丝柯可", + "斯柯克" + ] + }, + { + "name": "塔利雅", + "alias": [ + "塔利雅", + "Dahlia", + "塔利亚", + "塔丽雅", + "主祭", + "助祭" + ] + }, + { + "name": "伊涅芙", + "alias": [ + "伊涅芙", + "Ineffa", + "机器人", + "机娘" + ] + }, + { + "name": "菈乌玛", + "alias": [ + "菈乌玛", + "Lauma", + "鹿女" + ] + }, + { + "name": "菲林斯", + "alias": [ + "菲林斯", + "Flins", + "执灯人" + ] + }, + { + "name": "爱诺", + "alias": [ + "爱诺", + "Aino" + ] + }, + { + "name": "奈芙尔", + "alias": [ + "奈芙尔", + "Nefer", + "蛇女" + ] + }, + { + "name": "雅珂达", + "alias": [ + "雅珂达", + "Agata" + ] + }, + { + "name": "杜林", + "alias": [ + "杜林", + "Durin", + "小杜林", + "魔龙" + ] + } +] \ No newline at end of file diff --git a/repo/js/RoleExperienceCalculation/lib/calculator.js b/repo/js/RoleExperienceCalculation/lib/calculator.js new file mode 100644 index 000000000..3c1744c84 --- /dev/null +++ b/repo/js/RoleExperienceCalculation/lib/calculator.js @@ -0,0 +1,270 @@ +// 角色经验计算 - 计算模块 + +// 经验 +var expCalculator= { + // 核心数据:1-90级每级升级所需经验值 (来源: 原神WIKI)[citation:5] + LEVEL_EXP_REQUIREMENTS: [ + 0, // Lv1 之前为0 + 1000, 1325, 1700, 2150, 2625, // Lv1-5 + 3150, 3725, 4350, 5000, 5700, // Lv6-10 + 6450, 7225, 8050, 8925, 9825, // Lv11-15 + 10750, 11725, 12725, 13775, 14875, // Lv16-20 + 16800, 18000, 19250, 20550, 21875, // Lv21-25 + 23250, 24650, 26100, 27575, 29100, // Lv26-30 + 30650, 32250, 33875, 35550, 37250, // Lv31-35 + 38975, 40750, 42575, 44425, 46300, // Lv36-40 + 50625, 52700, 54775, 56900, 59075, // Lv41-45 + 61275, 63525, 65800, 68125, 70475, // Lv46-50 + 76500, 79050, 81650, 84275, 86950, // Lv51-55 + 89650, 92400, 95175, 98000, 100875, // Lv56-60 + 108950, 112050, 115175, 118325, 121525, // Lv61-65 + 124775, 128075, 131400, 134775, 138175, // Lv66-70 + 148700, 152375, 156075, 159825, 163600, // Lv71-75 + 167425, 171300, 175225, 179175, 183175, // Lv76-80 + 216225, 243025, 273100, 306800, 344600, // Lv81-85 + 386950, 434425, 487625, 547200, 0 // Lv86-90 (90级为满级) + ], + + // 经验书定义[citation:2] + EXP_BOOKS: { + PURPLE: {name: '大英雄的经验', experience: 20000}, + BLUE: {name: '冒险家的经验', experience: 5000}, + GREEN: {name: '流浪者的经验', experience: 1000} + }, + + /** + * 计算从当前等级/经验升级到目标等级所需的总经验值。 + * @param {number} currentLevel - 当前等级 (1-89) + * @param {number} currentExp - 当前等级下已累积的经验值 + * @param {number} targetLevel - 目标等级 (2-90) + * @returns {number} 所需总经验值,如果输入无效返回 -1 + */ + calculateExpRequired: function (currentLevel, currentExp, targetLevel) { + // 参数校验 + if (currentLevel < 1 || currentLevel >= 90 || + targetLevel <= currentLevel || targetLevel > 90 || + currentExp < 0) { + console.error('Invalid input parameters.'); + return -1; + } + + let totalExpNeeded = 0; + + // 1. 减去当前等级已积累的经验 + totalExpNeeded -= currentExp; + + // 2. 累加从当前等级到目标等级-1所需的每一级经验 + for (let lvl = currentLevel; lvl < targetLevel; lvl++) { + totalExpNeeded += expCalculator.LEVEL_EXP_REQUIREMENTS[lvl]; + } + + return totalExpNeeded; + }, + + /** + * 将经验值转换为所需的各种经验书数量(优先使用高等级书籍)。 + * @param {number} expRequired - 所需总经验值 + * @returns {Object} 包含三种经验书所需数量的对象 + */ + convertExpToBooks: function (expRequired) { + let remainingExp = expRequired; + + const purpleBooks = Math.floor(remainingExp / expCalculator.EXP_BOOKS.PURPLE.experience); + remainingExp %= expCalculator.EXP_BOOKS.PURPLE.experience; + + const blueBooks = Math.floor(remainingExp / expCalculator.EXP_BOOKS.BLUE.experience); + remainingExp %= expCalculator.EXP_BOOKS.BLUE.experience; + + const greenBooks = Math.ceil(remainingExp / expCalculator.EXP_BOOKS.GREEN.experience); // 向上取整,因为无法提供不足1000的经验 + + return { + purple: purpleBooks, + blue: blueBooks, + green: greenBooks, + // 返回一个详细的文本摘要,方便直接使用 + summary: `共需: ${purpleBooks}本[${expCalculator.EXP_BOOKS.PURPLE.name}] + ${blueBooks}本[${expCalculator.EXP_BOOKS.BLUE.name}] + ${greenBooks}本[${expCalculator.EXP_BOOKS.GREEN.name}]` + }; + } +} + +// 树脂 +var resinCalculation = { + // 世界等级掉落配置:每种经验书的 [最小数量, 最大数量] + WORLD_LEVEL_DROP_CONFIG : { + 0: { '流浪者的经验': [7, 8], '冒险家的经验': [3, 4] }, + 1: { '流浪者的经验': [10, 12], '冒险家的经验': [5, 6] }, + 2: { '冒险家的经验': [10, 11] }, + 3: { '冒险家的经验': [13, 14] }, + 4: { '大英雄的经验': [2, 3], '冒险家的经验': [6, 7] }, + 5: { '大英雄的经验': [3, 4], '冒险家的经验': [6, 7] }, + 6: { '大英雄的经验': [4, 5], '冒险家的经验': [6, 7] }, + 7: { '大英雄的经验': [4, 5], '冒险家的经验': [6, 7] }, + 8: { '大英雄的经验': [4, 5], '冒险家的经验': [6, 7] }, + 9: { '大英雄的经验': [4, 5], '冒险家的经验': [6, 7] } + }, + + /** + * 计算单次刷取的期望经验值和概率分布 + * @param {string|boolean} worldLevel - 世界等级 + * @returns {Object} {expectedExp, minExp, distribution} + */ + calculateSingleRunExp: function(worldLevel) { + // 添加中文到英文的映射 + const BOOK_NAME_MAPPING = { + '流浪者的经验': 'GREEN', + '冒险家的经验': 'BLUE', + '大英雄的经验': 'PURPLE' + }; + + const config = this.WORLD_LEVEL_DROP_CONFIG[worldLevel]; + if (!config || Object.keys(config).length === 0) { + return { expectedExp: 0, minExp: 0, distribution: [] }; + } + + let outcomeDetails = []; + for (const [chineseBookName, range] of Object.entries(config)) { + const englishKey = BOOK_NAME_MAPPING[chineseBookName]; + + // 检查映射是否成功 + if (!englishKey) { + console.warn(`未找到对应的英文键名: ${chineseBookName}`); + continue; + } + + const [min, max] = range; + const possibilities = []; + + // 使用英文键名访问 EXP_BOOKS + const bookConfig = expCalculator.EXP_BOOKS[englishKey]; + if (!bookConfig) { + console.warn(`在 EXP_BOOKS 中未找到: ${englishKey}`); + continue; + } + + for (let qty = min; qty <= max; qty++) { + possibilities.push({ + bookKey: englishKey, + chineseName: chineseBookName, // 可选:保留中文名 + qty, + experience: bookConfig.experience * qty + }); + } + outcomeDetails.push(possibilities); + } + + // 如果 outcomeDetails 为空,返回默认值 + if (outcomeDetails.length === 0) { + console.error('没有有效的掉落配置'); + return { expectedExp: 0, minExp: 0, distribution: [] }; + } + + // 计算所有组合的概率分布(假设每种数量概率相等) + const distributionMap = new Map(); + + function dfs(index, currentExp, probability) { + if (index === outcomeDetails.length) { + distributionMap.set(currentExp, (distributionMap.get(currentExp) || 0) + probability); + return; + } + for (const outcome of outcomeDetails[index]) { + dfs(index + 1, currentExp + outcome.experience, probability / outcomeDetails[index].length); + } + } + + dfs(0, 0, 1.0); + + // 转换为排序后的数组并计算期望值 + let distribution = []; + let expectedExp = 0; + let minExp = Infinity; + + for (const [experience, prob] of distributionMap.entries()) { + distribution.push({ experience, probability: prob }); + expectedExp += experience * prob; + if (experience < minExp) minExp = experience; + } + + distribution.sort((a, b) => a.experience - b.experience); + + return { + expectedExp: Math.round(expectedExp), + minExp: minExp, + distribution + }; + }, + + /** + * 主计算函数:分别计算使用浓缩树脂和原粹树脂的刷取次数 + * @param {number} requiredExp - 所需经验值 + * @param {string|boolean} worldLevel - 世界等级 (0-9) + * @param {{}} options - 计算选项 + * @param {boolean} options.useExpected - true:使用期望值计算(平均情况), false:使用保底值计算(最非情况) + * @param {number} options.resinPerCondensed - 合成一个浓缩树脂所需的原粹树脂,默认为60 + * @returns {Object} 计算结果 + */ + calculateExpBookRequirements: function(requiredExp, worldLevel, options = {}) { + const { + useExpected = true, + resinPerCondensed = 60 + } = options; + + // 获取单次刷取的经验数据 + const { expectedExp, minExp, distribution } = this.calculateSingleRunExp(worldLevel); + + if (expectedExp === 0) { + return { + error: `世界等级 ${worldLevel} 的掉落配置不完整,无法计算。请补充 WORLD_LEVEL_DROP_CONFIG 中的数据。` + }; + } + + // 选择计算基准:期望值(平均)或保底值(最小) + const expPerRun = useExpected ? expectedExp : minExp; + const calcMode = useExpected ? '期望值(平均)' : '保底值(最小)'; + + // 计算总刷取次数 + const totalRuns = Math.ceil(requiredExp / expPerRun); + + // 计算浓缩树脂相关次数 + const condensedRuns = Math.ceil(totalRuns / (resinPerCondensed / 20)); // 全部使用浓缩树脂的次数 + // 原粹树脂需要刷取的次数(如果没有浓缩树脂) + const originalResinRuns = totalRuns; // 全部使用原粹树脂的次数 + + // 计算原粹树脂总消耗量 + const totalOriginalResin = totalRuns * 20; // 每次副本固定消耗20原粹树脂 + + // 计算需要合成的浓缩树脂数量 + const condensedResinNeeded = Math.ceil(totalOriginalResin / resinPerCondensed); + + return { + // 计算基准信息 + calcMode, + expPerRunUsed: expPerRun, + singleRunStats: { + expectedExp, + minExp, + possibleExpRange: distribution.length > 0 ? + `${distribution[0].experience} ~ ${distribution[distribution.length - 1].experience}` : 'N/A' + }, + + // 核心结果:分别输出两种树脂的刷取次数 + runs: { + // 使用浓缩树脂需要刷取的次数 + usingCondensedResin: condensedRuns, + // 使用原粹树脂需要刷取的次数 + usingOriginalResin: originalResinRuns, + // 总副本挑战次数(两种方式相同) + totalChallenges: totalRuns + }, + + // 资源消耗 + resinCost: { + // 原粹树脂总消耗量 + totalOriginalResin, + // 需要合成的浓缩树脂数量 + condensedResinNeeded, + // 合成浓缩树脂所需原粹树脂总量 + resinForCondensed: condensedResinNeeded * resinPerCondensed + }, + }; + }, +} diff --git a/repo/js/RoleExperienceCalculation/lib/file_utils.js b/repo/js/RoleExperienceCalculation/lib/file_utils.js new file mode 100644 index 000000000..ace04ad3b --- /dev/null +++ b/repo/js/RoleExperienceCalculation/lib/file_utils.js @@ -0,0 +1,290 @@ +// 角色经验计算 - 文件读写工具 +var FileUtils = { + // 读取别名文件 (照搬脚本:AutoSwitchRoles(Tool_tingsu)) + readAliases: function (path) { + const combatText = file.readTextSync(path); + const combatData = JSON.parse(combatText); + const aliases = {}; + for (const character of combatData) { + if (character.alias && character.name) { + for (const alias of character.alias) { + aliases[alias] = character.name; + } + } + } + return aliases; + }, + + /** + * 生成简洁的文件名:前缀_日期_时间(精确到秒) + * @param {string} prefix 文件名前缀 + * @param {string} suffix 文件后缀(不带点,默认:"txt",可选) + * @returns {string} 最终文件名 + */ + generateSimpleFileName: function (prefix, suffix = 'txt') { + const now = new Date(); + // 日期:YYYYMMDD + const date = now.getFullYear() + + String(now.getMonth() + 1).padStart(2, '0') + + String(now.getDate()).padStart(2, '0'); + // 时间:HHmmss(精确到秒) + const time = String(now.getHours()).padStart(2, '0') + + String(now.getMinutes()).padStart(2, '0') + + String(now.getSeconds()).padStart(2, '0'); + // 拼接核心部分 + let fileName = `${prefix}_${date}_${time}`; + // 追加后缀(自动补点) + if (suffix) fileName += `.${suffix.replace(/^\./, '')}`; + return fileName; + }, + + /** + * 创建文件并写入内容 + * @param {string} filePath 文件根目录 + * @param {string} content 写入内容 + * @param {string} fileName 文件名(需加文件后缀) + * @return {Promise} + */ + fileReadWrite: async function (filePath, content, fileName) { + try { + const path = `${filePath}/${fileName}`; + const success = await file.writeText(path, content); + if (success) { + log.info(`${fileName}已保存`); + return true; + } else { + log.error(`${fileName}保存失败`); + return false; + } + } catch (error) { + log.error(`${fileName}保存失败: ${error}`); + return false; + } + }, + + // 定义名称变体映射 + nameMapping : { + // 大英雄的经验 - 紫色 + '大英雄的经验': 'PURPLE', + + // 冒险家的经验 - 蓝色 + '冒险家的经验': 'BLUE', + + // 流浪者的经验 - 绿色 + '流浪者的经验': 'GREEN', + }, + + /** + * 将任意格式的经验书数据转换为标准格式 + * @param {{[key: string]: number}|null} rawData - 原始数据 + * @returns {Object} 标准化的经验书数量对象 + */ + normalizeBookData: function (rawData) { + // 如果数据为null或空对象,返回空对象 + if (!rawData || Object.keys(rawData).length === 0) { + return {}; + } + + const result = { + PURPLE: 0, + BLUE: 0, + GREEN: 0 + }; + + // 遍历原始数据的所有键 + Object.keys(rawData).forEach(key => { + const value = rawData[key]; + + // 查找映射 + const normalizedKey = this.nameMapping[key]; + + if (normalizedKey) { + result[normalizedKey] += value; + } else { + console.warn(`无法识别的经验书类型: ${key}`); + } + }); + + return result; + }, + + /** + * 经验书数据接口 - 提供经验书数据 + * @param {{[key: string]: number}} rawBookData - 原始经验书数据 + * @param {boolean} includeTotal - 是否包含总计行 + * @returns {Array} 经验书数据数组 + */ + getExpBookData: function (rawBookData, includeTotal = false) { + // 标准化数据 + const normalizedData = this.normalizeBookData(rawBookData); + + const result = []; + let totalExp = 0; + let totalCount = 0; + + // 生成经验书数据 + Object.keys(normalizedData).forEach(bookType => { + const quantity = normalizedData[bookType]; + + if (quantity > 0) { + const bookInfo = expCalculator.EXP_BOOKS[bookType]; + const expValue = bookInfo.experience * quantity; + + result.push({ + bookName: bookInfo.name, + quantity: quantity, + totalExp: expValue + }); + + totalExp += expValue; + totalCount += quantity; + } + }); + + // 按总经验值降序排序 + result.sort((a, b) => b.totalExp - a.totalExp); + + // 如果需要总计行,添加到数组末尾 + if (includeTotal && result.length > 0) { + result.push({ + bookName: '总计', + quantity: totalCount, + totalExp: totalExp + }); + } + + return result; + }, + + /** + * 生成角色经验记录的文本内容并输出核心数据 + * @param {object} roleData - 角色经验数据 + * @param {number} targetRoleLevel - 目标等级 + * @param {Object} expBookData - 经验书数据数组(可选) + * @returns {Object} - {text:格式化后的文本, + * totalRoleExperienceRequired:总需经验, + * additionalExperienceRequirements:还需经验, + * totalBackpackExperience:背包经验书可提供的经验} + */ + generateExpText: function (roleData, targetRoleLevel, expBookData = []) { + // 1. 头部:标题 + 时间戳 + const now = new Date(); + const timeStr = now.toLocaleString('zh-CN'); // 本地时间 + let text = `=== 原神角色升级所需的经验记录 [${timeStr}] ===\n\n`; + + // 2. 角色区块 + const roleNames = Object.keys(roleData); + let totalRoleExperienceRequired = 0; + + if (roleNames.length > 0) { + text += `===【角色数据】===\n`; + + roleNames.forEach(roleName => { + const records = roleData[roleName]; + if (!Array.isArray(records) || records.length === 0) return; + + // 角色标题 + text += `【${roleName}】\n`; + + // 遍历该角色的每条记录 + records.forEach((record, index) => { + text += `\t当前等级:${record.currentLevel}级\n`; + text += `\t当前经验:${record.currentExp}\n`; + text += `\t升级至${targetRoleLevel}级所需经验:${record.requiredExperience}\n`; + totalRoleExperienceRequired += record.requiredExperience; + + // 记录间空行(除了最后一条) + if (index < records.length - 1) { + text += '\n'; + } + }); + + // 角色间空行分隔 + if (roleNames.indexOf(roleName) < roleNames.length - 1) { + text += '\n'; + } + }); + + text += '\n'; // 区块间空行 + } + + // 3. 经验书区块 + let totalBookExperience = 0; + let totalBookCount = 0; // 初始化为数字0,避免字符串拼接 + let bookItems = []; + + if (expBookData && expBookData.length > 0) { + // 如果是完整数据(包含总计行),需要先过滤掉总计行 + const hasTotalRow = expBookData.some(book => book.bookName === '总计'); + + if (hasTotalRow) { + bookItems = expBookData.filter(book => book.bookName !== '总计'); + } else { + bookItems = expBookData; + } + + if (bookItems.length > 0) { + text += `===【经验书数据】===\n`; + + // 计算总计 + bookItems.forEach((book) => { + // 确保累加的是数字(避免字符串拼接) + totalBookExperience += Number(book.totalExp || 0); + totalBookCount += Number(book.quantity || 0); // 转数字后累加 + }); + + // 显示每种经验书 + bookItems.forEach((book, index) => { + text += `\t${book.bookName}:\n`; + // 去除数量前置0:转数字再转字符串 + text += `\t数量:${Number(book.quantity || 0)}\n`; + // 经验值也确保是数字(可选,防止前置0) + text += `\t总经验值:${Number(book.totalExp || 0)}\n`; + + // 经验书间空行(除了最后一条) + if (index < bookItems.length - 1) { + text += '\n'; + } + }); + } + } + + // 4. 尾部:统计信息 + text += `\n=== 记录结束 ===\n`; + + // 角色统计 + if (roleNames.length > 0) { + text += `总计角色数:${roleNames.length} | 所有角色升至${targetRoleLevel}级总计所需经验:${totalRoleExperienceRequired}\n`; + } + + // 经验书统计 + if (bookItems.length > 0) { + text += `背包经验书种类数:${bookItems.length} | 总计经验值:${totalBookExperience}\n`; + } else { + const finalRequiredExperienceBook = expCalculator.convertExpToBooks(totalRoleExperienceRequired) + text += `换算经验书:${finalRequiredExperienceBook.summary}\n`; + } + + // 综合统计 + let deficit + if (roleNames.length > 0 && bookItems.length > 0) { + deficit = totalRoleExperienceRequired - totalBookExperience; + if (deficit > 0) { + text += `经验缺口:${deficit}(还需获取),`; + const finalRequiredExperienceBook = expCalculator.convertExpToBooks(deficit) + text += `换算经验书:${finalRequiredExperienceBook.summary}\n`; + } else if (deficit < 0) { + text += `经验盈余:${-deficit}(超出需求)\n`; + } else { + text += `经验平衡:恰好足够\n`; + } + } + + return { + text:text, + totalRoleExperienceRequired: totalRoleExperienceRequired, + additionalExperienceRequirements: deficit, + totalBackpackExperience:totalBookExperience + } + } +} \ No newline at end of file diff --git a/repo/js/RoleExperienceCalculation/lib/image_recognition.js b/repo/js/RoleExperienceCalculation/lib/image_recognition.js new file mode 100644 index 000000000..ff1abb4c1 --- /dev/null +++ b/repo/js/RoleExperienceCalculation/lib/image_recognition.js @@ -0,0 +1,340 @@ +var ImageRecognition = { + /** + * 识别角色 + * @param Role + * @return {Promise} + */ + roleRecognition: async function (Role) { + let currentPage = 0; + let found = false; + + while (currentPage < 5) { + // 遍历该角色的所有模板 + for (let num = 1; ; num++) { + const paddedNum = num.toString().padStart(2, "0"); + const characterFileName = `${Role}${paddedNum}`; + try { + const templatePath = `assets/characterimage/${characterFileName}.png`; + const template = RecognitionObject.TemplateMatch(file.readImageMatSync(templatePath), + 0, 0, 1920, 1080) + + // 捕获当前屏幕 + const screenRO = captureGameRegion(); + const result = screenRO.find(template); + screenRO.dispose(); // 释放屏幕捕获资源 + + if (result.isExist()) { + log.info(`找到角色【${Role}】`); + // 点击角色 + result.click(); + return true; + } + } catch (error) { + // 模板文件不存在,跳出循环 + break; + } + } + } + // 如果没找到,滚动到下一页 + if (currentPage < 5) { + log.info("当前页面没有目标角色,滚动页面"); + await UI.scrollPageFlexible(200); + await sleep(800); // 等待页面稳定 + } + currentPage++; + + if (!found) { + log.error(`未找到角色【${Role}】`); + return false; + } + }, + + /** + * OCR识别函数 + * @param {number} timeout - 超时时间(毫秒) + * @param {Object} Region - 识别区域(包含X/Y/Width/Height) + * @returns {string | null} - 返回清理后的识别文字(无特殊符号,仅保留/) + */ + ocrRecognize: function (timeout = 5000, Region) { + let startTime = Date.now(); + let attemptCount = 0; + + while (Date.now() - startTime < timeout) { + attemptCount++; + try { + // 捕获整个游戏区域 + const gameCaptureRegion = captureGameRegion(); + + // 裁剪出识别区域 + const croppedRegion = gameCaptureRegion.deriveCrop( + Region.X, + Region.Y, + Region.Width, + Region.Height + ); + + let results = croppedRegion.findMulti(RecognitionObject.ocrThis); + + // 释放资源 + gameCaptureRegion.dispose(); + croppedRegion.dispose(); + + if (results && results.count > 0) { + let text = ""; + for (let i = 0; i < results.count; i++) { + if (results[i].text && results[i].text.trim()) { + text += results[i].text + " "; + } + } + + // 清理特殊字符后再返回 + const cleanedText = ImageRecognition.cleanOcrText(text); + if (cleanedText) { + return cleanedText; + } + } else { + // 每100次重试输出日志 + if (attemptCount % 100 === 0) { + log.debug(`OCR识别第${attemptCount}次重试:未识别到文本`); + } + } + + } catch (error) { + if (attemptCount % 100 === 0) { + log.warn(`OCR识别发生错误: ${error.message}`); + } + } + } + // 超时未识别到有效内容,返回null + return null; + }, + + /** + * 清理Ocr识别文本:仅保留中文、数字、字母、白名单符号(/),去除所有其他标点/特殊符号 + * @param {string} text - 原始识别文本 + * @returns {string} 清理后的文本 + */ + cleanOcrText: function (text) { + if (!text || typeof text !== 'string') return ''; + // 正则说明: + // [\u4e00-\u9fa5] 匹配中文 + // [0-9a-zA-Z] 匹配数字、大小写字母 + // \/ 匹配白名单符号 /(需转义) + // + 匹配1个及以上符合规则的字符 + const validCharRegex = /[\u4e00-\u9fa50-9a-zA-Z\/]+/g; + // 提取所有有效字符片段,拼接后去重空格(避免多个/连续) + const validParts = text.match(validCharRegex) || []; + return validParts.join('').replace(/\s+/g, ' ').trim(); + }, + + /** + * 识别背包内经验书数量 + * @return {Promise<{[key: string]: number}|null>} 返回经验书名称和数量的对象,失败返回null + */ + IdentifyExperienceBook: async function() { + let screenRO = null; + let result = null; + + try { + // 定义经验书模板 + const EXP_BOOKS_TEMPLATE = { + '大英雄的经验': RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/RecognitionObject/大英雄的经验.png"), + 0, 0, 1920, 1080 + ), + '冒险家的经验': RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/RecognitionObject/冒险家的经验.png"), + 0, 0, 1920, 1080 + ), + '流浪者的经验': RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/RecognitionObject/流浪者的经验.png"), + 0, 0, 1920, 1080 + ) + }; + + // 预定义划动条模板 + const DownSwipeBarIcon = RecognitionObject.TemplateMatch( + file.ReadImageMatSync('assets/RecognitionObject/SwipeBarIcon.png'), + 1270, 900, 30, 100 + ) + DownSwipeBarIcon.threshold = 0.7 + + let ExpBookInformation = {}; + + // 导航到背包界面 + await genshin.returnMainUi(); + await UiNavigation.BackpackUiNavigation(); + + if (!UI.UIUtils.isInBackpack()) { + // 可能存在过期物品 + if (UI.UIUtils.isExpiredItem()) { + log.info("检测到过期物品,点击确认") + click(810,755) + }else { + throw new Error("未成功进入背包界面"); + } + } + + log.info("进入背包成功,开始扫描经验书"); + + // 遍历每种经验书模板 + for (const [bookName, templateMat] of Object.entries(EXP_BOOKS_TEMPLATE)) { + log.info(`正在扫描【${bookName}】的数量`); + + // 扫描前页面点至最上 + click(1285, 122) + await sleep(50) + click(1285, 122) + await sleep(50) + click(1285, 122) + await sleep(50) // 受不了了,多点它几次 + click(1285, 122) + await sleep(50) // 受不了了,多点它几次 + click(1285, 122) + await sleep(50) // 受不了了,多点它几次 + + let found = false; + let currentPage = 0; + const MAX_PAGE_TRIES = 20; // 最多划动20次 + + // 扫描当前页并翻页查找 + while (!found && currentPage < MAX_PAGE_TRIES) { + screenRO = captureGameRegion(); + result = screenRO.find(templateMat); + + if (result && result.isExist()) { + log.info(`找到道具【${bookName}】,开始识别数量`); + + // 扩展识别区域 + const croppedRegion = screenRO.deriveCrop( + result.X - 30, + result.Y + result.Height - 20, + result.Width + 30, + result.Height + 70 + ); + + // OCR识别数字 + let ocrResult = ImageRecognition.ocrRecognize(2000, croppedRegion); + + // 数字校正 + ocrResult = OcrNumberCorrector.correct(ocrResult); + + log.info(`识别结果:【${bookName}】数量为 ${ocrResult}`); + ExpBookInformation[bookName] = ocrResult; + + // 清理资源 + croppedRegion.dispose(); + found = true; + } + + if (found) { + break; + } + + if (!found && currentPage < MAX_PAGE_TRIES) { + log.info("当前页面未找到,尝试翻页"); + await UI.scrollPageFlexible(250); + await sleep(800); // 等待页面稳定 + + // 识别到划动条停止划动(已划至最下) + const ro = captureGameRegion() + const res = ro.find(DownSwipeBarIcon); + if (res.isExist()) { + await UI.scrollPageFlexible(250); // 以防过早识别 + currentPage = MAX_PAGE_TRIES + } + currentPage++; + } + + // 清理当前循环的资源 + if (result) { + result.dispose(); + result = null; + } + if (screenRO) { + screenRO.dispose(); + screenRO = null; + } + } + + if (!found) { + log.warn(`未找到【${bookName}】,可能已遍历所有页面或背包中不存在`); + ExpBookInformation[bookName] = 0; + } + } + + return ExpBookInformation; + + } catch (error) { + log.error(`识别经验书失败:${error.message}`); + return null; + + } finally { + // 确保资源被释放 + if (result) result.dispose(); + if (screenRO) screenRO.dispose(); + } + }, + + /** + * 识别世界等级 + * @return {Promise} + * @constructor + */ + WorldLevelRecognition: async function(){ + await genshin.returnMainUi(); + await sleep(800); + keyPress("VK_ESCAPE") + await sleep(800); + click(720,65) + await sleep(800); + click(980,60) + await sleep(800); + + let worldLevel = this.ocrRecognize(2000,{X:830, Y:485, Width:65, Height:45}) + if (worldLevel){ + worldLevel = OcrNumberCorrector.correct(worldLevel); + log.info(`识别到世界等级为:${worldLevel}`); + return worldLevel; + } else {return false} + } +} + +var OcrNumberCorrector = { + // OCR识别错误映射表:覆盖大小写形似字符 + errorMap: new Map([ + ['o', '0'], ['O', '0'], + ['l', '1'], ['I', '1'], ['|', '1'], ['i', '1'], + ['z', '2'], ['Z', '2'], + ['s', '5'], ['S', '5'], + ['B', '8'], + ['g', '9'], ['G', '9'], ['q', '9'], ['Q', '9'], + ['b', '6'], ['B', '8'], ['p', '9'], + ['d', '0'], ['D', '0'], + ['e', '3'], ['E', '3'], + ['f', '7'], ['F', '7'], + ['t', '7'], ['T', '7'], + ['y', '4'], ['Y', '4'] +]), + + // 白名单字符集合:数字 + / + whitelist : new Set(['/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']), + + /** + * 校正OCR识别的字符串 + * @param {string} rawStr - OCR识别的原始字符串 + * @returns {string} 校正后的结果(仅含数字和/) + */ + correct: function(rawStr) { + if (typeof rawStr !== 'string') return ''; + + return rawStr.split('') + .map(char => { + return this.errorMap.has(char) ? this.errorMap.get(char) : char; + }) + .filter(char => { + return this.whitelist.has(char); + }) + .join(''); + } +} \ No newline at end of file diff --git a/repo/js/RoleExperienceCalculation/lib/ui_navigator.js b/repo/js/RoleExperienceCalculation/lib/ui_navigator.js new file mode 100644 index 000000000..daa0afad2 --- /dev/null +++ b/repo/js/RoleExperienceCalculation/lib/ui_navigator.js @@ -0,0 +1,406 @@ +// UI交互功能模块 +var UI = { + // 进入角色列表界面 + enterRoleListInterface : async function() { + //log.info("正在进入角色界面..."); + try { + // 尝试按下L键进入角色配对界面 + log.info("尝试进入配对界面"); + keyPress("VK_L"); + await sleep(3500) + + // 点击角色 + click(450, 500); + await sleep(100); + return true; + } catch (error) { + log.error("进入界面失败: {error}", error); + return false; + } + }, + + // 进入背包 - 养成道具 + backpackDevelopmentProps : async function() { + //log.info("打开背包,选择养成道具"); + + try { + // 尝试按下B键打开背包 + log.info("按下B键打开背包"); + keyPress("VK_B"); + //选择养成道具界面 + log.debug("选择养成道具界面"); + await sleep(1000); + click(765, 50); + await sleep(100); + return true; + + } catch (error) { + log.error("进入界面失败: {error}", error); + return false; + } + }, + + /** + * 界面滚动页面函数 + * @param {number} totalDistance - 滚动的总距离(像素) + * 正数:向上滚动; + * 负数:向下滚动 + * @param {number}stepDistance - 每次移动的步长(像素),默认10 + * @param {number}delayMs - 每次移动后的延迟时间(毫秒),默认5ms + * @param {Object}startPosition - (可选)自定义起始位置,接受X,Y坐标 + * @returns {Promise} + */ + scrollPageFlexible: async function(totalDistance, stepDistance = 10, delayMs = 5, startPosition = null) { + try { + // 默认起始位置配置 + const defaultStartPositions = { + up: { x: 400, y: 750 }, // 向上滚动起始位置 + down: { x: 400, y: 130 } // 向下滚动起始位置 + }; + + // 确定滚动方向 + const isUpward = totalDistance > 0; + const direction = isUpward ? -1 : 1; + const absoluteDistance = Math.abs(totalDistance); + + // 选择起始位置 + let startPos; + if (startPosition) { + // 使用传入的起始位置 + startPos = startPosition; + } else { + // 使用默认位置 + startPos = isUpward ? defaultStartPositions.up : defaultStartPositions.down; + } + + // 移动到起始位置 + moveMouseTo(startPos.x, startPos.y); + await sleep(50); + + // 按下鼠标开始拖动 + leftButtonDown(); + + // 执行滚动 + const stepCount = Math.ceil(absoluteDistance / stepDistance); + for (let i = 0; i < stepCount; i++) { + const remaining = absoluteDistance - i * stepDistance; + const currentStep = Math.min(stepDistance, remaining); + + moveMouseBy(0, direction * currentStep); + await sleep(delayMs); + } + + // 释放鼠标 + await sleep(700); + leftButtonUp(); + await sleep(500); + + return true; + } catch (error) { + log.error("滚动页面时发生错误: {error}", error.message); + return false; + } + }, + + // UI工具模块 - 处理UI检测 + UIUtils: { + // 检测是否位于角色界面 + isInRoleUI: function() { + const rolesListUI = RecognitionObject.TemplateMatch( + file.readImageMatSync("assets/RecognitionObject/ReturnIcon.png"), + 0, + 0, + 1920, + 1080 + ); + + const ro = captureGameRegion(); + const res = ro.find(rolesListUI); + ro.dispose(); + return !res.isEmpty(); + }, + + // 检测是否在背包界面 + isInBackpack: function() { + const BackpackIcon = RecognitionObject.TemplateMatch( + file.readImageMatSync("assets/RecognitionObject/Bagpack.png"), + 0, + 0, + 640, + 216 + ); + + const ro = captureGameRegion(); + const res = ro.find(BackpackIcon); + ro.dispose(); + return !res.isEmpty(); + }, + + // 检测背包是否有过期物品 + isExpiredItem: function() { + const BackpackIcon = RecognitionObject.TemplateMatch( + file.readImageMatSync("assets/RecognitionObject/Confirm.png"), + 760, + 700, + 90, + 90 + ); + + const ro = captureGameRegion(); + const res = ro.find(BackpackIcon); + ro.dispose(); + return !res.isEmpty(); + } + } +} + +// 游戏ui导航 +var UiNavigation = { + /** + * 进入角色界面选项 + * 回到主界面 → 进入角色配对界面 → 验证游戏界面 + * @param {number} maxRetries - 最大重试次数(默认3次,最小1次) + * @param {number} delay - 重试间隔(毫秒,默认1000ms,最小100ms) + * @returns {Promise} 成功返回true,失败抛出错误 + */ + roleUiNavigation: async function(maxRetries = 3, delay = 1000) { + // 1. 参数合法性校验,避免无效配置 + const validMaxRetries = Math.max(1, parseInt(maxRetries, 10) || 3); + const validDelay = Math.max(100, parseInt(delay, 10) || 1000); + + // 记录当前重试次数 + let currentRetry = 0; + + // 定义递归执行函数 + async function attempt() { + // 检测并回到主界面 + await genshin.returnMainUi(); + log.info("已回到游戏主界面"); + + try { + await sleep(1000); // 等待界面加载 + + // 进入角色界面 + const enterResult = await UI.enterRoleListInterface(); + if (!enterResult) { + throw new Error("进入角色界面失败(按钮未响应/点击坐标错误)"); + } + log.info("操作完成,开始界面检测…"); + + // 检测是否成功进入角色界面 + await sleep(1000); // 等待界面加载 + const isInRoleUI = UI.UIUtils.isInRoleUI(); + if (!isInRoleUI) { + throw new Error("角色UI检测失败(界面未正确加载/识别区域错误)"); + } + log.info("成功进入角色界面"); + return true; + + } catch (error) { + // 重试次数+1 + currentRetry++; + log.warn(`执行失败,错误:${error.message},正在进行第 ${currentRetry} 次重试...`); + + // 判断是否达到最大重试次数 + if (currentRetry >= validMaxRetries) { + throw new Error(`达到最大重试次数(${validMaxRetries}次),任务执行失败:${error.message}`); + } + + // 等待指定延迟后,递归重试 + await sleep(validDelay); + return attempt(); + } + } + + // 启动第一次尝试 + log.info(`开始尝试进入角色界面,最大重试次数:${validMaxRetries},重试间隔:${validDelay}ms`); + return attempt(); + }, + + /** + * 进入背包 - 养成道具 + * 回到主界面 → 进入背包界面 → 验证游戏界面 + * @param {number} maxRetries - 最大重试次数(默认3次,最小1次) + * @param {number} delay - 重试间隔(毫秒,默认1000ms,最小100ms) + * @returns {Promise} 成功返回true,失败抛出错误 + */ + BackpackUiNavigation: async function(maxRetries = 3, delay = 1000) { + // 参数合法性校验,避免无效配置 + const validMaxRetries = Math.max(1, parseInt(maxRetries, 10) || 3); + const validDelay = Math.max(100, parseInt(delay, 10) || 1000); + + // 记录当前重试次数 + let currentRetry = 0; + + // 定义递归执行函数 + async function attempt() { + try { + // 检测并回到主界面 + await genshin.returnMainUi(); + log.info("已回到游戏主界面"); + + await sleep(1000); + + // 进入背包界面 + const enterBackpack = await UI.backpackDevelopmentProps(); + if (!enterBackpack) { + throw new Error("打开背包失败(按钮未响应/点击坐标错误)"); + } + log.info("操作完成,开始界面检测…"); + + // 检测是否成功进入角色UI + await sleep(1000); // 等待界面加载 + const isInBackpack = UI.UIUtils.isInBackpack(); + if (!isInBackpack) { + throw new Error("角色UI检测失败(界面未正确加载/识别区域错误)"); + } + log.info("成功打开背包"); + return true; + + } catch (error) { + // 重试次数+1 + currentRetry++; + log.warn(`执行失败,错误:${error.message},正在进行第 ${currentRetry} 次重试...`); + + // 判断是否达到最大重试次数 + if (currentRetry >= validMaxRetries) { + throw new Error(`达到最大重试次数(${validMaxRetries}次),任务执行失败:${error.message}`); + } + + // 等待指定延迟后,递归重试 + await sleep(validDelay); + return attempt(); + } + } + + // 启动第一次尝试 + log.info(`开始尝试打开背包,最大重试次数:${validMaxRetries},重试间隔:${validDelay}ms`); + return attempt(); + }, + + // 角色筛选(照搬脚本:AutoSwitchRoles(Tool_tingsu)) + FilterRoles: async function(roleName) { + // 执行筛选前清除筛选信息 + await sleep(300); + click(730,940) + + const filterConfig = {}; + try { + const filterContent = file.readTextSync('assets/RecognitionObject/角色筛选/attribute.txt'); + const lines = filterContent.split('\n'); + lines.forEach(line => { + // 使用中文逗号分割,并去除可能的空格 + const [name, element, weapon] = line.trim().split(/,\s*/).map(item => item || null); + if (name) { // 只要角色名存在就记录,元素和武器可为空 + filterConfig[name] = { element, weapon }; + } + }); + } catch (error) { + log.error(`读取筛选配置失败: ${error}`); + } + + // 预加载"暂无筛选结果"模板 + let noResultTemplate; + try { + noResultTemplate = file.readImageMatSync('assets/RecognitionObject/角色筛选/暂无筛选结果.png'); + } catch (error) { + log.error(`加载"暂无筛选结果"模板失败: ${error}`); + } + + await sleep(1000); + + // 执行筛选操作 + const filterInfo = filterConfig[roleName]; + // let hasNoFilterResult = false; // 标记是否存在无筛选结果状态 + if (filterInfo && noResultTemplate) { + try { + log.info(`对角色【${roleName}】执行筛选: 元素=${filterInfo.element || '空'}, 武器=${filterInfo.weapon || '空'}`); + + // 点击筛选按钮 + const ro1 = captureGameRegion(); + const filterBtn = ro1.find(RecognitionObject.TemplateMatch( + file.readImageMatSync('assets/RecognitionObject/角色筛选/筛选.png'), 0, 0, 1920, 1080 + )); + ro1.dispose(); + if (filterBtn.isExist()) { + filterBtn.click(); + await sleep(200); + + // 元素不为空才执行元素筛选 + if (filterInfo.element) { + const ro2 = captureGameRegion(); + const elementBtn = ro2.find(RecognitionObject.TemplateMatch( + file.readImageMatSync(`assets/RecognitionObject/角色筛选/${filterInfo.element}.png`), 0, 0, 1920, 1080 + )); + ro2.dispose(); + if (elementBtn.isExist()) { + elementBtn.click(); + await sleep(200); + } else { + log.warn(`未找到元素筛选图标: assets/RecognitionObject/角色筛选/${filterInfo.element}.png`); + } + } else { + log.info(`元素为空,跳过元素筛选`); + } + + // 武器不为空才执行武器筛选 + if (filterInfo.weapon) { + const ro3 = captureGameRegion(); + const weaponBtn = ro3.find(RecognitionObject.TemplateMatch( + file.readImageMatSync(`assets/RecognitionObject/角色筛选/${filterInfo.weapon}.png`), 0, 0, 1920, 1080 + )); + ro3.dispose(); + if (weaponBtn.isExist()) { + weaponBtn.click(); + await sleep(200); + } else { + log.warn(`未找到武器筛选图标: assets/RecognitionObject/角色筛选/${filterInfo.weapon}.png`); + } + } else { + log.info(`武器为空,跳过武器筛选`); + } + + // 点击确认筛选(无论元素/武器是否为空都需要确认) + const ro4 = captureGameRegion(); + const confirmFilterBtn = ro4.find(RecognitionObject.TemplateMatch( + file.readImageMatSync('assets/RecognitionObject/角色筛选/确认筛选.png'), 0, 0, 1920, 1080 + )); + ro4.dispose(); + if (confirmFilterBtn.isExist()) { + confirmFilterBtn.click(); + await sleep(50); // 等待筛选结果显示 + + // 识别是否有"暂无筛选结果"提示 + const noResultRo = RecognitionObject.TemplateMatch(noResultTemplate, 0, 0, 1920, 1080); + const ro5 = captureGameRegion(); + const noResult = ro5.find(noResultRo); + ro5.dispose(); + if (noResult.isExist()) { + log.warn(`筛选后无结果,跳过角色`); + return false; + /** + // 关闭筛选面板(如果需要) + keyPress("VK_ESCAPE"); + await sleep(200); + keyPress("VK_ESCAPE"); + await sleep(200); + keyPress("VK_ESCAPE"); + await sleep(200); + */ + } else { + return true; + } + } else { + log.warn('未找到确认筛选图标: assets/RecognitionObject/角色筛选/确认筛选.png'); + } + } else { + log.warn('未找到筛选图标: assets/RecognitionObject/角色筛选/筛选.png'); + } + } catch (error) { + log.error(`筛选操作失败: ${error}`); + } + + } + } +} + diff --git a/repo/js/RoleExperienceCalculation/main.js b/repo/js/RoleExperienceCalculation/main.js new file mode 100644 index 000000000..c3088a32a --- /dev/null +++ b/repo/js/RoleExperienceCalculation/main.js @@ -0,0 +1,322 @@ +// 角色经验计算 - 主文件 + +// 加载模块 +eval(file.readTextSync("lib/ui_navigator.js")); +eval(file.readTextSync("lib/calculator.js")); +eval(file.readTextSync("lib/image_recognition.js")); +eval(file.readTextSync("lib/file_utils.js")); + +// 配置常量 +const CONFIG = { + OCR_REGION: { + ROLE_NAME: { X: 1450, Y: 125, Width: 290, Height: 50 }, + ROLE_LEVEL: { X: 1450, Y: 200, Width: 290, Height: 40 }, + ROLE_EXP: { X: 1700, Y: 215, Width: 100, Height: 30 } + }, + UI_COORDINATES: { + DETAIL_BUTTON: { X: 1770, Y: 1015 } // 角色详情按钮 + }, + DELAY: { + SHORT: 500, // 短延迟 + MEDIUM: 1000, // 中等延迟 + LONG: 1500 // 长延迟 + } +}; + +// 主逻辑 +(async function () { + // 设置分辨率 + setGameMetrics(1920, 1080, 1); + + try { + // 1. 读取并验证设置 + const { targetRoleNames, targetRoleLevel, experienceBookCalculation } = readAndValidateSettings(); + + // 2. 处理角色名 + const roleNames = processRoleNames(targetRoleNames); + log.info(`已检测到 ${roleNames.length} 个角色: ${roleNames.join(', ')}`); + + if (roleNames.length === 0) { + throw new Error("未检测到有效的角色名"); + } + + // 3. 进入角色界面 + await UiNavigation.roleUiNavigation(); + await sleep(CONFIG.DELAY.MEDIUM); + + // 4. 识别所有角色信息 + const roleRecognitionResults = {}; + + for (let i = 0; i < roleNames.length; i++) { + const roleName = roleNames[i]; + log.info(`处理角色【${roleName}】(${i + 1}/${roleNames.length})`); + + // 筛选角色 + const filterResult = await UiNavigation.FilterRoles(roleName); + if (!filterResult) { + log.warn(`角色【${roleName}】筛选后无结果,跳过`); + continue; + } + + // 识别角色列表 + const identifiedRoles = await ImageRecognition.roleRecognition(roleName); + if (!identifiedRoles) { + log.warn(`角色【${roleName}】识别失败,跳过`); + continue; + } + + await sleep(CONFIG.DELAY.SHORT); + + // 识别角色详细信息 + const roleInfo = await recognizeRoleInfo(roleName); + + // 保存结果 + if (!roleRecognitionResults[roleName]) { + roleRecognitionResults[roleName] = []; + } + + roleRecognitionResults[roleName].push({ + roleName: roleInfo.roleName || roleName, + roleLevel: roleInfo.level, + roleExp: roleInfo.exp + }); + + log.info(`角色【${roleName}】识别完成: 等级${roleInfo.level}, 经验${roleInfo.exp}`); + } + + // 5. 返回主界面 + await genshin.returnMainUi(); + + // 6. 计算所需经验 + if (Object.keys(roleRecognitionResults).length === 0) { + throw new Error('未成功识别任何角色信息'); + } + + const roleRequiredExperiences = calculateRoleRequiredExp(roleRecognitionResults, targetRoleLevel); + + // 7. 获取经验书数据 + let expBookData = null; + if (experienceBookCalculation) { + expBookData = await getExperienceBookData(); + } + + // 8. 获取世界等级并计算 + const worldLevel = await getWorldLevel(); + const experienceRecord = FileUtils.generateExpText(roleRequiredExperiences, targetRoleLevel, expBookData); + + // 9. 计算树脂需求 + const calculationResults = { + average: resinCalculation.calculateExpBookRequirements( + experienceRecord.additionalExperienceRequirements, + worldLevel, + { useExpected: true } + ), + minimumGuarantee: resinCalculation.calculateExpBookRequirements( + experienceRecord.additionalExperienceRequirements, + worldLevel, + { useExpected: false } + ) + }; + + // 10. 生成并导出结果 + const resultText = generateResultText( + experienceRecord, + targetRoleLevel, + expBookData, + worldLevel, + calculationResults + ); + + const fileName = FileUtils.generateSimpleFileName('exp_result'); + await FileUtils.fileReadWrite("test", resultText, fileName); + + await genshin.returnMainUi(); + + log.info(`计算结果已保存到: ${fileName}`); + + } catch (error) { + log.error(`程序执行失败: ${error.message}`); + log.error(`错误堆栈: ${error.stack}`); + + // 尝试返回主界面 + try { + await genshin.returnMainUi(); + } catch (uiError) { + log.warn(`返回主界面失败: ${uiError.message}`); + } + + // 重新抛出错误 + throw error; + } +})(); + +// 读取并验证配置 +function readAndValidateSettings() { + const targetRoleNames = settings.targetRoleName; + const targetRoleLevel = Number(settings.targetRoleLevel); + const experienceBookCalculation = Boolean(settings.experienceBookCalculation); + + if (!targetRoleNames || typeof targetRoleNames !== 'string') { + throw new Error("未输入目标角色名,请在js自定义配置中输入"); + } + + if (isNaN(targetRoleLevel) || targetRoleLevel <= 0 || targetRoleLevel > 90) { + throw new Error("非法输入或未输入目标角色等级,请输入1-90之间的有效数字"); + } + + return { targetRoleNames, targetRoleLevel, experienceBookCalculation }; +} + +// 处理角色名,转换为标准名称 +function processRoleNames(inputNames) { + const aliases = FileUtils.readAliases('assets/combat_avatar.json'); + + return String(inputNames) + .split(/[,,]/) + .map(name => name.trim()) + .filter(name => name.length > 0) + .map(input => aliases[input] || input) + .filter(name => name && name.length > 0); +} + +// 识别角色信息 +async function recognizeRoleInfo(roleName) { + log.info(`识别角色【${roleName}】信息`); + + // 进入角色详情页面 + click(CONFIG.UI_COORDINATES.DETAIL_BUTTON.X, CONFIG.UI_COORDINATES.DETAIL_BUTTON.Y); + await sleep(CONFIG.DELAY.MEDIUM); + + // 并行识别所有OCR内容 + const [roleNameText, levelText, expText] = await Promise.all([ + ImageRecognition.ocrRecognize(2000, CONFIG.OCR_REGION.ROLE_NAME), + ImageRecognition.ocrRecognize(2000, CONFIG.OCR_REGION.ROLE_LEVEL), + ImageRecognition.ocrRecognize(2000, CONFIG.OCR_REGION.ROLE_EXP) + ]); + + // 返回角色界面 + keyPress("VK_ESCAPE"); + await sleep(CONFIG.DELAY.SHORT); + + return { + roleName: roleNameText, + level: levelText, + exp: expText + }; +} + +// 计算角色所需经验 +function calculateRoleRequiredExp(roleRecognitionResults, targetRoleLevel) { + const results = {}; + + for (const [roleName, roleList] of Object.entries(roleRecognitionResults)) { + if (!Array.isArray(roleList) || roleList.length === 0) { + log.warn(`角色【${roleName}】无有效识别记录,跳过计算`); + continue; + } + + results[roleName] = roleList.map(roleInfo => { + const currentLevel = getBeforeNumber(roleInfo.roleLevel) || 0; + const currentExp = getBeforeNumber(roleInfo.roleExp) || 0; + + let requiredExperience = 0; + if (currentLevel >= targetRoleLevel) { + log.info(`角色【${roleName}】当前等级${currentLevel}已达到目标等级${targetRoleLevel},无需经验`); + } else if (currentLevel > 0 && currentLevel < targetRoleLevel) { + requiredExperience = expCalculator.calculateExpRequired( + currentLevel, + currentExp, + targetRoleLevel + ); + log.info(`角色【${roleName}】当前等级${currentLevel}(经验${currentExp})距离等级${targetRoleLevel}还需经验${requiredExperience}`); + } else { + log.warn(`角色【${roleName}】等级解析失败:${roleInfo.roleLevel}`); + } + + return { + roleName: roleName, + currentLevel: currentLevel, + currentExp: currentExp, + requiredExperience: requiredExperience + }; + }).filter(record => record.requiredExperience > 0); + } + + return results; +} + +// 获取经验书数据 +async function getExperienceBookData() { + try { + const expBookInfo = await ImageRecognition.IdentifyExperienceBook(); + return expBookInfo ? FileUtils.getExpBookData(expBookInfo) : null; + } catch (error) { + log.warn(`识别经验书失败: ${error.message}`); + return null; + } +} + +// 获取世界等级 +async function getWorldLevel() { + try { + const worldLevel = await ImageRecognition.WorldLevelRecognition(); + if (!worldLevel) { + throw new Error("世界等级识别失败"); + } + return worldLevel; + } catch (error) { + log.error(`获取世界等级失败: ${error.message}`); + throw error; + } +} + +// 生成结果文本 +function generateResultText(experienceRecord, targetRoleLevel, expBookData, worldLevel, calculationResults) { + let text = experienceRecord.text || "经验计算结果\n"; + + // 添加世界等级信息 + text += `\n当前世界等级:${worldLevel}\n`; + text += "单次启示之花奖励(20原粹树脂):\n"; + + const dropConfig = resinCalculation.WORLD_LEVEL_DROP_CONFIG[worldLevel]; + if (dropConfig) { + Object.entries(dropConfig).forEach(([bookName, [min, max]]) => { + text += ` ${bookName}:${min}~${max}本\n`; + }); + } + + // 添加计算结果 + text += '\n================ 计算结果 ================\n'; + + if (experienceRecord.additionalExperienceRequirements < 0){ + text += '当前背包内经验书已满足经验需求,无需刷取\n' + } else { + // 保底计算 + text += '【保底计算(最非情况)】\n'; + text += `使用浓缩树脂需刷取次数: ${calculationResults.minimumGuarantee.runs.usingCondensedResin} 次\n`; + text += `使用原粹树脂需刷取次数: ${calculationResults.minimumGuarantee.runs.usingOriginalResin} 次\n`; + text += `原粹树脂总消耗: ${calculationResults.minimumGuarantee.resinCost.totalOriginalResin}\n`; + + // 期望计算 + text += '\n【期望计算(平均情况)】\n'; + text += `使用浓缩树脂需刷取次数: ${calculationResults.average.runs.usingCondensedResin} 次\n`; + text += `使用原粹树脂需刷取次数: ${calculationResults.average.runs.usingOriginalResin} 次\n`; + text += `原粹树脂总消耗: ${calculationResults.average.resinCost.totalOriginalResin}\n`; + } + return text; +} + +/** + * 只保留数字或符号“/”前的数字,否则为 0 + * @param {string} str + * @return {number} + */ +function getBeforeNumber (str) { + // 空值/非字符串兜底 + if (!str || typeof str !== 'string') return 0; + let val = str + .split('/')[0].trim() // 分割后取前缀 + .match(/\d+/g)?.join('') || ''; // 只保留数字 + const num = Number(val) // 转换数字 + return isNaN(num) ? 0 : num; // 兜底 NaN 为 0 +} \ No newline at end of file diff --git a/repo/js/RoleExperienceCalculation/manifest.json b/repo/js/RoleExperienceCalculation/manifest.json new file mode 100644 index 000000000..29ce22d87 --- /dev/null +++ b/repo/js/RoleExperienceCalculation/manifest.json @@ -0,0 +1,15 @@ +{ + "manifest_version": 1, + "name": "角色经验计算", + "version": "1.0", + "bgi_version": "0.54.0", + "description": "用于计算指定角色在当前等级到目标等级所需的经验", + "authors": [ + { + "name": "skr", + "link": "" + } + ], + "settings_ui": "settings.json", + "main": "main.js" +} diff --git a/repo/js/RoleExperienceCalculation/settings.json b/repo/js/RoleExperienceCalculation/settings.json new file mode 100644 index 000000000..a1b6edc70 --- /dev/null +++ b/repo/js/RoleExperienceCalculation/settings.json @@ -0,0 +1,20 @@ +[ + { + "name": "targetRoleName", + "type": "input-text", + "label": "目标角色名称", + "default": "" + }, + { + "name": "targetRoleLevel", + "type": "input-text", + "label": "目标角色等级(2-90)", + "default": "" + }, + { + "name": "experienceBookCalculation", + "type": "checkbox", + "label": "结合背包当前拥有的经验书计算", + "default": true + } +] \ No newline at end of file diff --git a/repo/js/RoleExperienceCalculation/test/exp_result_20260101_160507.txt b/repo/js/RoleExperienceCalculation/test/exp_result_20260101_160507.txt new file mode 100644 index 000000000..19d495c87 --- /dev/null +++ b/repo/js/RoleExperienceCalculation/test/exp_result_20260101_160507.txt @@ -0,0 +1,33 @@ +=== 原神角色升级所需的经验记录 [2026/1/1 16:05:06] === + +===【角色数据】=== +【雅珂达】 + 当前等级:1级 + 当前经验:0 + 升级至90级所需经验:8362650 + +===【经验书数据】=== + 大英雄的经验: + 数量:300 + 总经验值:6000000 + + 冒险家的经验: + 数量:561 + 总经验值:2805000 + + 流浪者的经验: + 数量:100 + 总经验值:100000 + +=== 记录结束 === +总计角色数:1 | 所有角色升至90级总计所需经验:8362650 +背包经验书种类数:3 | 总计经验值:8905000 +经验盈余:542350(超出需求) + +当前世界等级:9 +单次启示之花奖励(20原粹树脂): + 大英雄的经验:4~5本 + 冒险家的经验:6~7本 + +================ 计算结果 ================ +当前背包内经验书已满足经验需求,无需刷取