diff --git a/repo/js/切换武器 OCR/assets/combat_avatar.json b/repo/js/切换武器 OCR/assets/combat_avatar.json new file mode 100644 index 00000000..dfe0ad16 --- /dev/null +++ b/repo/js/切换武器 OCR/assets/combat_avatar.json @@ -0,0 +1,1817 @@ +[ + { + "alias": [ + "旅行者", + "主角", + "卑鄙的外乡人", + "荣誉骑士", + "爷", + "主", + "履刑者", + "抽卡不歪真君" + ], + "id": "20000000", + "name": "旅行者", + "nameEn": "Traveler", + "weapon": "1" + }, + { + "alias": [ + "荧", + "女主", + "女主角", + "莹", + "萤", + "黄毛阿姨", + "荧妹", + "女爷", + "包包", + "宴宁" + ], + "id": "10000007", + "name": "荧", + "nameEn": "PlayerGirl", + "weapon": "1" + }, + { + "alias": [ + "空", + "男主", + "男主角", + "龙哥", + "空哥", + "男爷" + ], + "id": "10000005", + "name": "空", + "nameEn": "PlayerBoy", + "weapon": "1" + }, + { + "alias": [ + "神里绫华", + "Kamisato Ayaka", + "Ayaka", + "神里", + "绫华", + "神里凌华", + "凌华", + "白鹭公主", + "神里大小姐", + "龟", + "龟龟", + "乌龟" + ], + "burstCD": 20, + "id": "10000002", + "name": "神里绫华", + "nameEn": "Ayaka", + "skillCD": 10, + "weapon": "1" + }, + { + "alias": [ + "琴", + "Jean", + "团长", + "代理团长", + "琴团长", + "蒲公英骑士" + ], + "burstCD": 20, + "id": "10000003", + "name": "琴", + "nameEn": "Qin", + "skillCD": 6, + "weapon": "1" + }, + { + "alias": [ + "丽莎", + "Lisa", + "图书管理员", + "图书馆管理员", + "蔷薇魔女", + "阿姨" + ], + "burstCD": 20, + "id": "10000006", + "name": "丽莎", + "nameEn": "Lisa", + "skillCD": 1, + "skillHoldCD": 16, + "weapon": "10" + }, + { + "alias": [ + "芭芭拉", + "Barbara", + "巴巴拉", + "内鬼", + "加湿器", + "肉身解咒", + "肉身解咒真君", + "闪耀偶像", + "偶像" + ], + "burstCD": 20, + "id": "10000014", + "name": "芭芭拉", + "nameEn": "Barbara", + "skillCD": 32, + "weapon": "10" + }, + { + "alias": [ + "凯亚", + "Kaeya", + "盖亚", + "凯子哥", + "凯鸭", + "矿工", + "矿工头子", + "骑兵队长", + "凯子", + "凝冰渡海真君" + ], + "burstCD": 15, + "id": "10000015", + "name": "凯亚", + "nameEn": "Kaeya", + "skillCD": 6, + "weapon": "1" + }, + { + "alias": [ + "迪卢克", + "Diluc", + "卢姥爷", + "姥爷", + "卢老爷", + "卢锅巴", + "正义人", + "正e人", + "正E人", + "卢本伟", + "暗夜英雄", + "卢卢伯爵", + "落魄了", + "落魄了家人们" + ], + "burstCD": 12, + "id": "10000016", + "name": "迪卢克", + "nameEn": "Diluc", + "skillCD": 10, + "weapon": "11" + }, + { + "alias": [ + "雷泽", + "Razor", + "狼少年", + "狼崽子", + "狼崽", + "卢皮卡", + "小狼", + "小狼狗", + "狼孩" + ], + "burstCD": 20, + "id": "10000020", + "name": "雷泽", + "nameEn": "Razor", + "skillCD": 6, + "skillHoldCD": 10, + "weapon": "11" + }, + { + "alias": [ + "安柏", + "Amber", + "安伯", + "兔兔伯爵", + "飞行冠军", + "侦查骑士", + "点火姬", + "点火机", + "打火机", + "打火姬" + ], + "burstCD": 12, + "id": "10000021", + "name": "安柏", + "nameEn": "Ambor", + "skillCD": 15, + "weapon": "12" + }, + { + "alias": [ + "温迪", + "Venti", + "温蒂", + "风神", + "卖唱的", + "巴巴托斯", + "巴巴脱丝", + "芭芭托斯", + "芭芭脱丝", + "干点正事", + "不干正事", + "吟游诗人", + "诶嘿", + "唉嘿", + "摸鱼" + ], + "burstCD": 15, + "id": "10000022", + "name": "温迪", + "nameEn": "Venti", + "skillCD": 6, + "skillHoldCD": 15, + "weapon": "12" + }, + { + "alias": [ + "香菱", + "Xiangling", + "香玲", + "锅巴", + "厨师", + "万民堂厨师", + "香师傅" + ], + "burstCD": 20, + "id": "10000023", + "name": "香菱", + "nameEn": "Xiangling", + "skillCD": 12, + "weapon": "13" + }, + { + "alias": [ + "北斗", + "Beidou", + "大姐头", + "大姐", + "无冕的龙王" + ], + "burstCD": 20, + "id": "10000024", + "name": "北斗", + "nameEn": "Beidou", + "skillCD": 7.5, + "weapon": "11" + }, + { + "alias": [ + "行秋", + "Xingqiu", + "秋秋人", + "秋妹妹", + "书呆子", + "枕玉", + "飞云商会二少爷" + ], + "burstCD": 20, + "id": "10000025", + "name": "行秋", + "nameEn": "Xingqiu", + "skillCD": 21, + "weapon": "1" + }, + { + "alias": [ + "魈", + "Xiao", + "打桩机", + "插秧", + "三眼五显仙人", + "三眼五显真人", + "降魔大圣", + "护法夜叉", + "快乐风男", + "无聊", + "靖妖傩舞", + "矮子仙人", + "三点五尺仙人", + "跳跳虎", + "风夜叉" + ], + "burstCD": 18, + "id": "10000026", + "name": "魈", + "nameEn": "Xiao", + "skillCD": 10, + "weapon": "13" + }, + { + "alias": [ + "凝光", + "Ningguang", + "富婆", + "天权星", + "天权" + ], + "burstCD": 12, + "id": "10000027", + "name": "凝光", + "nameEn": "Ningguang", + "skillCD": 12, + "weapon": "10" + }, + { + "alias": [ + "可莉", + "逃跑的太阳", + "Klee", + "嘟嘟可", + "火花骑士", + "蹦蹦炸弹", + "炸鱼", + "放火烧山", + "放火烧山真君", + "蒙德最强战力", + "逃跑的太阳", + "啦啦啦", + "哒哒哒", + "炸弹人", + "禁闭室", + "太阳", + "小太阳" + ], + "burstCD": 15, + "id": "10000029", + "name": "可莉", + "nameEn": "Klee", + "skillCD": 20, + "weapon": "10" + }, + { + "alias": [ + "钟离", + "Zhongli", + "摩拉克斯", + "岩王爷", + "岩神", + "钟师傅", + "天动万象", + "岩王帝君", + "未来可期", + "帝君", + "拒收病婿" + ], + "burstCD": 12, + "id": "10000030", + "name": "钟离", + "nameEn": "Zhongli", + "skillCD": 4, + "skillHoldCD": 12, + "weapon": "13" + }, + { + "alias": [ + "菲谢尔", + "Fischl", + "皇女", + "小艾米", + "小艾咪", + "奥兹", + "断罪皇女", + "中二病", + "中二少女", + "中二皇女", + "奥兹发射器" + ], + "burstCD": 15, + "id": "10000031", + "name": "菲谢尔", + "nameEn": "Fischl", + "skillCD": 25, + "weapon": "12" + }, + { + "alias": [ + "班尼特", + "Bennett", + "点赞哥", + "点赞", + "倒霉少年", + "倒霉蛋", + "霹雳闪雷真君", + "班神", + "班爷", + "倒霉", + "蒙德火神", + "六星真神" + ], + "burstCD": 15, + "id": "10000032", + "name": "班尼特", + "nameEn": "Bennett", + "skillCD": 5, + "weapon": "1" + }, + { + "alias": [ + "达达利亚", + "Tartaglia", + "Childe", + "Ajax", + "达达鸭", + "达达利鸭", + "公子", + "玩具销售员", + "玩具推销员", + "钱包", + "鸭鸭", + "愚人众末席" + ], + "burstCD": 15, + "id": "10000033", + "name": "达达利亚", + "nameEn": "Tartaglia", + "skillCD": 6, + "skillHoldCD": 45, + "weapon": "12" + }, + { + "alias": [ + "诺艾尔", + "Noelle", + "女仆", + "高达", + "岩王帝姬" + ], + "burstCD": 15, + "id": "10000034", + "name": "诺艾尔", + "nameEn": "Noel", + "skillCD": 24, + "weapon": "11" + }, + { + "alias": [ + "七七", + "Qiqi", + "僵尸", + "肚饿真君", + "度厄真君", + "77" + ], + "burstCD": 20, + "id": "10000035", + "name": "七七", + "nameEn": "Qiqi", + "skillCD": 30, + "weapon": "1" + }, + { + "alias": [ + "重云", + "Chongyun", + "纯阳之体", + "冰棍" + ], + "burstCD": 12, + "id": "10000036", + "name": "重云", + "nameEn": "Chongyun", + "skillCD": 15, + "weapon": "11" + }, + { + "alias": [ + "甘雨", + "Ganyu", + "椰羊", + "椰奶", + "王小美" + ], + "burstCD": 15, + "id": "10000037", + "name": "甘雨", + "nameEn": "Ganyu", + "skillCD": 10, + "weapon": "12" + }, + { + "alias": [ + "阿贝多", + "Albedo", + "可莉哥哥", + "升降机", + "升降台", + "电梯", + "白垩之子", + "贝爷", + "白垩", + "阿贝少", + "花呗多", + "阿贝夕", + "阿师傅" + ], + "burstCD": 12, + "id": "10000038", + "name": "阿贝多", + "nameEn": "Albedo", + "skillCD": 4, + "weapon": "1" + }, + { + "alias": [ + "迪奥娜", + "Diona", + "迪欧娜", + "dio娜", + "冰猫", + "猫猫", + "猫娘", + "喵喵", + "调酒师" + ], + "burstCD": 20, + "id": "10000039", + "name": "迪奥娜", + "nameEn": "Diona", + "skillCD": 6, + "skillHoldCD": 15, + "weapon": "12" + }, + { + "alias": [ + "莫娜", + "Mona", + "穷鬼", + "穷光蛋", + "穷", + "莫纳", + "占星术士", + "占星师", + "讨龙真君", + "半部讨龙真君", + "阿斯托洛吉斯·莫娜·梅姬斯图斯", + "梅姬斯图斯", + "梅姬斯图斯姬" + ], + "burstCD": 15, + "id": "10000041", + "name": "莫娜", + "nameEn": "Mona", + "skillCD": 12, + "weapon": "10" + }, + { + "alias": [ + "刻晴", + "Keqing", + "刻情", + "氪晴", + "刻师傅", + "刻师父", + "牛杂", + "牛杂师傅", + "斩尽牛杂", + "免疫", + "免疫免疫", + "屁斜剑法", + "玉衡星", + "阿晴", + "啊晴", + "璃月雷神" + ], + "burstCD": 12, + "id": "10000042", + "name": "刻晴", + "nameEn": "Keqing", + "skillCD": 7.5, + "weapon": "1" + }, + { + "alias": [ + "砂糖", + "Sucrose", + "sucrose" + ], + "burstCD": 20, + "id": "10000043", + "name": "砂糖", + "nameEn": "Sucrose", + "skillCD": 15, + "weapon": "10" + }, + { + "alias": [ + "辛焱", + "Xinyan", + "辛炎", + "黑妹", + "摇滚" + ], + "burstCD": 15, + "id": "10000044", + "name": "辛焱", + "nameEn": "Xinyan", + "skillCD": 18, + "weapon": "11" + }, + { + "alias": [ + "罗莎莉亚", + "Rosaria", + "罗莎莉娅", + "白色史莱姆", + "白史莱姆", + "修女", + "罗莎利亚", + "罗莎利娅", + "罗沙莉亚", + "罗沙莉娅", + "罗沙利亚", + "罗沙利娅", + "萝莎莉亚", + "萝莎莉娅", + "萝莎利亚", + "萝莎利娅", + "萝沙莉亚", + "萝沙莉娅", + "萝沙利亚", + "萝沙利娅" + ], + "burstCD": 15, + "id": "10000045", + "name": "罗莎莉亚", + "nameEn": "Rosaria", + "skillCD": 6, + "weapon": "13" + }, + { + "alias": [ + "胡桃", + "Hu Tao", + "HuTao", + "Hutao", + "胡淘", + "往生堂堂主", + "火化", + "抬棺的", + "蝴蝶", + "核桃", + "堂主", + "胡堂主", + "雪霁梅香", + "桃子", + "桃" + ], + "burstCD": 15, + "id": "10000046", + "name": "胡桃", + "nameEn": "Hutao", + "skillCD": 16, + "weapon": "13" + }, + { + "alias": [ + "枫原万叶", + "Kaedehara Kazuha", + "Kazuha", + "万叶", + "叶天帝", + "天帝", + "叶师傅" + ], + "burstCD": 15, + "id": "10000047", + "name": "枫原万叶", + "nameEn": "Kazuha", + "skillCD": 6, + "skillHoldCD": 9, + "weapon": "1" + }, + { + "alias": [ + "烟绯", + "Yanfei", + "烟老师", + "律师", + "罗翔" + ], + "burstCD": 20, + "id": "10000048", + "name": "烟绯", + "nameEn": "Feiyan", + "skillCD": 9, + "weapon": "10" + }, + { + "alias": [ + "宵宫", + "Yoimiya", + "霄宫", + "烟花", + "肖宫", + "肖工", + "绷带女孩" + ], + "burstCD": 15, + "id": "10000049", + "name": "宵宫", + "nameEn": "Yoimiya", + "skillCD": 18, + "weapon": "12" + }, + { + "alias": [ + "托马", + "Thoma", + "家政官", + "太郎丸", + "地头蛇", + "男仆", + "拖马" + ], + "burstCD": 20, + "id": "10000050", + "name": "托马", + "nameEn": "Tohma", + "skillCD": 15, + "weapon": "13" + }, + { + "alias": [ + "优菈", + "Eula", + "优拉", + "尤拉", + "尤菈", + "浪花骑士", + "记仇", + "劳伦斯" + ], + "burstCD": 20, + "id": "10000051", + "name": "优菈", + "nameEn": "Eula", + "skillCD": 4, + "skillHoldCD": 10, + "weapon": "11" + }, + { + "alias": [ + "雷电将军", + "Raiden Shogun", + "Raiden", + "雷神", + "将军", + "雷军", + "巴尔", + "阿影", + "影", + "巴尔泽布", + "煮饭婆", + "奶香一刀", + "无想一刀", + "宅女" + ], + "burstCD": 18, + "id": "10000052", + "name": "雷电将军", + "nameEn": "Shougun", + "skillCD": 10, + "weapon": "13" + }, + { + "alias": [ + "早柚", + "Sayu", + "小狸猫", + "狸猫", + "忍者", + "貉" + ], + "burstCD": 20, + "id": "10000053", + "name": "早柚", + "nameEn": "Sayu", + "skillCD": 6, + "weapon": "11" + }, + { + "alias": [ + "珊瑚宫心海", + "Sangonomiya Kokomi", + "Kokomi", + "心海", + "军师", + "珊瑚宫", + "书记", + "观赏鱼", + "水母", + "鱼", + "美人鱼" + ], + "burstCD": 18, + "id": "10000054", + "name": "珊瑚宫心海", + "nameEn": "Kokomi", + "skillCD": 20, + "weapon": "10" + }, + { + "alias": [ + "五郎", + "Gorou", + "柴犬", + "土狗", + "希娜", + "希娜小姐" + ], + "burstCD": 20, + "id": "10000055", + "name": "五郎", + "nameEn": "Gorou", + "skillCD": 10, + "weapon": "12" + }, + { + "alias": [ + "九条裟罗", + "Kujou Sara", + "Sara", + "九条", + "九条沙罗", + "裟罗", + "沙罗", + "天狗" + ], + "burstCD": 20, + "id": "10000056", + "name": "九条裟罗", + "nameEn": "Sara", + "skillCD": 10, + "weapon": "12" + }, + { + "alias": [ + "荒泷一斗", + "Arataki Itto", + "Itto", + "荒龙一斗", + "荒泷天下第一斗", + "一斗", + "一抖", + "荒泷", + "1斗", + "牛牛", + "斗子哥", + "牛子哥", + "牛子", + "孩子王", + "斗虫", + "巧乐兹", + "放牛的" + ], + "burstCD": 18, + "id": "10000057", + "name": "荒泷一斗", + "nameEn": "Itto", + "skillCD": 10, + "weapon": "11" + }, + { + "alias": [ + "八重神子", + "Yae Miko", + "Miko", + "八重", + "神子", + "狐狸", + "想得美哦", + "巫女", + "屑狐狸", + "骚狐狸", + "八重宫司", + "婶子", + "小八", + "八重寄子", + "寄子", + "八神虫子", + "八神重子" + ], + "burstCD": 22, + "id": "10000058", + "name": "八重神子", + "nameEn": "Yae", + "skillCD": 4, + "weapon": "10" + }, + { + "alias": [ + "鹿野院平藏", + "shikanoin heizou", + "Heizou", + "鹿野苑", + "鹿野院", + "平藏", + "鹿野苑平藏", + "小鹿" + ], + "burstCD": 12, + "id": "10000059", + "name": "鹿野院平藏", + "nameEn": "Heizo", + "skillCD": 10, + "weapon": "10" + }, + { + "alias": [ + "夜兰", + "Yelan", + "夜阑", + "叶澜", + "腋兰", + "夜天后" + ], + "burstCD": 18, + "id": "10000060", + "name": "夜兰", + "nameEn": "Yelan", + "skillCD": 10, + "weapon": "12" + }, + { + "alias": [ + "绮良良", + "Kirara", + "大猫猫", + "大喵喵", + "稻妻猫猫", + "绮娘娘", + "琦良良", + "良良", + "快递员", + "草猫", + "草猫猫", + "草喵", + "草喵喵", + "猫又" + ], + "burstCD": 15, + "id": "10000061", + "name": "绮良良", + "nameEn": "Momoka", + "skillCD": 8, + "weapon": "1" + }, + { + "alias": [ + "埃洛伊", + "Aloy" + ], + "burstCD": 12, + "id": "10000062", + "name": "埃洛伊", + "nameEn": "Aloy", + "skillCD": 20, + "weapon": "12" + }, + { + "alias": [ + "申鹤", + "Shenhe", + "神鹤", + "小姨", + "小姨子", + "审鹤" + ], + "burstCD": 20, + "id": "10000063", + "name": "申鹤", + "nameEn": "Shenhe", + "skillCD": 10, + "skillHoldCD": 15, + "weapon": "13" + }, + { + "alias": [ + "云堇", + "Yun Jin", + "yun jin", + "云瑾", + "云先生", + "云锦", + "神女劈观" + ], + "burstCD": 15, + "id": "10000064", + "name": "云堇", + "nameEn": "Yunjin", + "skillCD": 9, + "weapon": "13" + }, + { + "alias": [ + "久岐忍", + "Kuki Shinobu", + "Kuki", + "Shinobu", + "97忍", + "小忍", + "久歧忍", + "97", + "茄忍", + "茄子", + "紫茄子", + "阿忍", + "忍姐" + ], + "burstCD": 15, + "id": "10000065", + "name": "久岐忍", + "nameEn": "Shinobu", + "skillCD": 15, + "weapon": "1" + }, + { + "alias": [ + "神里绫人", + "Kamisato Ayato", + "Ayato", + "绫人", + "神里凌人", + "凌人", + "0人", + "神人", + "零人", + "大舅哥" + ], + "burstCD": 20, + "id": "10000066", + "name": "神里绫人", + "nameEn": "Ayato", + "skillCD": 12, + "weapon": "1" + }, + { + "alias": [ + "柯莱", + "Collei", + "柯来", + "科莱", + "科来", + "小天使", + "须弥安柏", + "草安柏", + "须弥飞行冠军" + ], + "burstCD": 15, + "id": "10000067", + "name": "柯莱", + "nameEn": "Collei", + "skillCD": 12, + "weapon": "12" + }, + { + "alias": [ + "多莉", + "Dori", + "多利", + "多力", + "奸商" + ], + "burstCD": 20, + "id": "10000068", + "name": "多莉", + "nameEn": "Dori", + "skillCD": 9, + "weapon": "11" + }, + { + "alias": [ + "提纳里", + "Tighnari", + "提那里", + "小提", + "驴" + ], + "burstCD": 12, + "id": "10000069", + "name": "提纳里", + "nameEn": "Tighnari", + "skillCD": 12, + "weapon": "12" + }, + { + "alias": [ + "妮露", + "Nilou", + "尼露", + "妮璐", + "舞娘", + "红牛" + ], + "burstCD": 18, + "id": "10000070", + "name": "妮露", + "nameEn": "Nilou", + "skillCD": 18, + "weapon": "1" + }, + { + "alias": [ + "赛诺", + "Cyno", + "塞诺", + "胡狼", + "大风纪官", + "大风机关" + ], + "burstCD": 20, + "id": "10000071", + "name": "赛诺", + "nameEn": "Cyno", + "skillCD": 7.5, + "skillHoldCD": 3, + "weapon": "13" + }, + { + "alias": [ + "坎蒂丝", + "Candace", + "坎迪斯" + ], + "burstCD": 15, + "id": "10000072", + "name": "坎蒂丝", + "nameEn": "Candace", + "skillCD": 6, + "skillHoldCD": 9, + "weapon": "13" + }, + { + "alias": [ + "纳西妲", + "Nahida", + "草神", + "小吉祥", + "大吉祥", + "小草神", + "大慈树王", + "小吉祥草王", + "草萝莉", + "羽毛球", + "摩诃善法大吉祥智慧主", + "智慧主", + "智慧之神", + "布耶尔" + ], + "burstCD": 13.5, + "id": "10000073", + "name": "纳西妲", + "nameEn": "Nahida", + "skillCD": 5, + "skillHoldCD": 6, + "weapon": "10" + }, + { + "alias": [ + "莱依拉", + "Layla", + "莱依菈", + "来依菈", + "来依拉" + ], + "burstCD": 12, + "id": "10000074", + "name": "莱依拉", + "nameEn": "Layla", + "skillCD": 12, + "weapon": "1" + }, + { + "alias": [ + "流浪者", + "Wanderer", + "散兵", + "国崩", + "雷电国崩", + "大炮", + "雷电大炮", + "雷大炮", + "伞兵", + "斯卡拉姆齐" + ], + "burstCD": 15, + "id": "10000075", + "name": "流浪者", + "nameEn": "Wanderer", + "skillCD": 6, + "weapon": "10" + }, + { + "alias": [ + "珐露珊", + "Faruzan", + "法露珊", + "法璐珊", + "法露姗", + "法璐姗", + "珐露姗", + "珐璐姗", + "百岁珊", + "百岁山", + "前辈", + "仙贝" + ], + "burstCD": 20, + "id": "10000076", + "name": "珐露珊", + "nameEn": "Faruzan", + "skillCD": 6, + "weapon": "12" + }, + { + "alias": [ + "瑶瑶", + "Yaoyao", + "遥遥", + "萝卜", + "月桂" + ], + "burstCD": 20, + "id": "10000077", + "name": "瑶瑶", + "nameEn": "Yaoyao", + "skillCD": 15, + "weapon": "13" + }, + { + "alias": [ + "艾尔海森", + "Alhaitham", + "海哥", + "埃尔海森", + "海森", + "海参", + "书记官" + ], + "burstCD": 18, + "id": "10000078", + "name": "艾尔海森", + "nameEn": "Alhatham", + "skillCD": 18, + "weapon": "1" + }, + { + "alias": [ + "迪希雅", + "Dehya", + "迪希亚", + "迪希娅", + "迪西雅", + "迪西亚" + ], + "burstCD": 18, + "id": "10000079", + "name": "迪希雅", + "nameEn": "Dehya", + "skillCD": 20, + "weapon": "11" + }, + { + "alias": [ + "米卡", + "Mika", + "鹦鹉", + "凤头", + "凤头鹦鹉" + ], + "burstCD": 18, + "id": "10000080", + "name": "米卡", + "nameEn": "Mika", + "skillCD": 15, + "weapon": "13" + }, + { + "alias": [ + "卡维", + "Kaveh", + "艾尔海森室友" + ], + "burstCD": 20, + "id": "10000081", + "name": "卡维", + "nameEn": "Kaveh", + "skillCD": 6, + "weapon": "11" + }, + { + "alias": [ + "白术", + "Baizhu", + "长生", + "白医生" + ], + "burstCD": 20, + "id": "10000082", + "name": "白术", + "nameEn": "Baizhuer", + "skillCD": 10, + "weapon": "10" + }, + { + "alias": [ + "琳妮特", + "Lynette", + "林妮特", + "林尼特", + "琳尼特", + "女魔术师", + "魔术猫", + "魔术喵", + "登登" + ], + "burstCD": 18, + "id": "10000083", + "name": "琳妮特", + "nameEn": "Linette", + "skillCD": 12, + "weapon": "1" + }, + { + "alias": [ + "林尼", + "Lyney", + "林妮", + "琳尼", + "琳妮", + "男魔术师", + "魔术师" + ], + "burstCD": 15, + "id": "10000084", + "name": "林尼", + "nameEn": "Liney", + "skillCD": 15, + "weapon": "12" + }, + { + "alias": [ + "菲米尼", + "Freminet", + "非米尼", + "潜水员" + ], + "burstCD": 15, + "id": "10000085", + "name": "菲米尼", + "nameEn": "Freminet", + "skillCD": 10, + "weapon": "11" + }, + { + "alias": [ + "莱欧斯利", + "Wriothesley", + "莱欧", + "枫丹桑博", + "公爵" + ], + "burstCD": 15, + "id": "10000086", + "name": "莱欧斯利", + "nameEn": "Wriothesley", + "skillCD": 16, + "weapon": "10" + }, + { + "alias": [ + "那维莱特", + "Neuvillette", + "那维", + "水龙王", + "水龙", + "审判官", + "海獭", + "龙王", + "最高审判官", + "水之龙王" + ], + "burstCD": 18, + "id": "10000087", + "name": "那维莱特", + "nameEn": "Neuvillette", + "skillCD": 12, + "weapon": "10" + }, + { + "alias": [ + "夏洛蒂", + "Charlotte", + "夏洛", + "夏洛帝", + "记者", + "小记者", + "佳能400D", + "400D" + ], + "burstCD": 20, + "id": "10000088", + "name": "夏洛蒂", + "nameEn": "Charlotte", + "skillCD": 12, + "skillHoldCD": 18, + "weapon": "10" + }, + { + "alias": [ + "芙宁娜", + "Furina", + "Focalors", + "水神", + "芙芙", + "芙卡洛斯", + "傻芙芙" + ], + "burstCD": 15, + "id": "10000089", + "name": "芙宁娜", + "nameEn": "Furina", + "skillCD": 20, + "weapon": "1" + }, + { + "alias": [ + "夏沃蕾", + "chevreuse", + "夏沃雷" + ], + "burstCD": 15, + "id": "10000090", + "name": "夏沃蕾", + "nameEn": "Chevreuse", + "skillCD": 15, + "weapon": "13" + }, + { + "alias": [ + "娜维娅", + "navia", + "大小姐", + "刺玫会", + "黄豆", + "流汗黄豆", + "黄豆姐", + "娜薇娅", + "娜薇雅", + "娜维雅" + ], + "burstCD": 15, + "id": "10000091", + "name": "娜维娅", + "nameEn": "Navia", + "skillCD": 9, + "weapon": "11" + }, + { + "alias": [ + "嘉明", + "Gaming", + "jiaming", + "佳明", + "嘉铭", + "家明", + "镖师", + "舞狮少年", + "舞狮" + ], + "burstCD": 15, + "id": "10000092", + "name": "嘉明", + "nameEn": "Gaming", + "skillCD": 6, + "weapon": "11" + }, + { + "alias": [ + "闲云", + "Xianyun", + "流云", + "刘云", + "留云", + "野鹤", + "那个女人", + "留云借风", + "留云借风真君", + "很会聊天", + "很会聊天真君" + ], + "burstCD": 18, + "id": "10000093", + "name": "闲云", + "nameEn": "Liuyun", + "skillCD": 12, + "weapon": "10" + }, + { + "alias": [ + "千织", + "Chiori", + "千只", + "设计师", + "裁缝", + "千织屋老板" + ], + "burstCD": 13.5, + "id": "10000094", + "name": "千织", + "nameEn": "Chiori", + "skillCD": 16, + "weapon": "1" + }, + { + "alias": [ + "希格雯", + "Sigewinne", + "希格文", + "护士", + "护士长" + ], + "burstCD": 18, + "id": "10000095", + "name": "希格雯", + "nameEn": "Sigewinne", + "skillCD": 18, + "weapon": "12" + }, + { + "alias": [ + "阿蕾奇诺", + "Arlecchino", + "阿雷奇诺", + "仆人", + "黑优菈", + "黑暗优菈", + "父亲", + "佩露薇利" + ], + "burstCD": 15, + "id": "10000096", + "name": "阿蕾奇诺", + "nameEn": "Arlecchino", + "skillCD": 30, + "weapon": "13" + }, + { + "alias": [ + "赛索斯", + "Sethos", + "塞索斯", + "塞索思", + "赛索思" + ], + "burstCD": 15, + "id": "10000097", + "name": "赛索斯", + "nameEn": "Sethos", + "skillCD": 8, + "weapon": "12" + }, + { + "alias": [ + "克洛琳德", + "Clorinde", + "琳德", + "科洛琳德", + "克洛林德", + "克罗林德", + "苹果姐" + ], + "burstCD": 15, + "id": "10000098", + "name": "克洛琳德", + "nameEn": "Clorinde", + "skillCD": 16, + "weapon": "1" + }, + { + "alias": [ + "艾梅莉埃", + "Emilie", + "调香师", + "艾梅", + "香水设计师", + "现场清理人" + ], + "burstCD": 13.5, + "id": "10000099", + "name": "艾梅莉埃", + "nameEn": "Emilie", + "skillCD": 10, + "skillHoldCD": 14, + "weapon": "13" + }, + { + "alias": [ + "卡齐娜", + "Kachina", + "卡奇娜", + "卡齐纳", + "卡齐那", + "卡其那", + "冲天钻钻", + "岩莉莉" + ], + "burstCD": 18, + "id": "10000100", + "name": "卡齐娜", + "nameEn": "Kachina", + "skillCD": 20, + "weapon": "13" + }, + { + "alias": [ + "基尼奇", + "Kinich", + "基哥", + "基尼齐", + "蜘蛛侠" + ], + "burstCD": 18, + "id": "10000101", + "name": "基尼奇", + "nameEn": "Kinich", + "skillCD": 18, + "weapon": "11" + }, + { + "alias": [ + "玛拉妮", + "Mualani", + "马拉尼", + "鲨鱼妹", + "海豹妹", + "海豹", + "纳塔鲨" + ], + "burstCD": 15, + "id": "10000102", + "name": "玛拉妮", + "nameEn": "Mualani", + "skillCD": 1.8, + "skillHoldCD": 6, + "weapon": "10" + }, + { + "alias": [ + "希诺宁", + "Xilonen", + "豹女", + "岩大猫", + "大岩猫", + "岩猫", + "岩猫猫", + "西诺宁" + ], + "burstCD": 15, + "id": "10000103", + "name": "希诺宁", + "nameEn": "Xilonen", + "skillCD": 7, + "weapon": "1" + }, + { + "alias": [ + "恰斯卡", + "Chasca", + "武卡", + "调停人", + "鸟人" + ], + "burstCD": 15, + "id": "10000104", + "name": "恰斯卡", + "nameEn": "Chasca", + "skillCD": 6.5, + "weapon": "12" + }, + { + "alias": [ + "欧洛伦", + "Ororon", + "庇笛", + "孙子", + "大孙子", + "蝙蝠侠" + ], + "burstCD": 15, + "id": "10000105", + "name": "欧洛伦", + "nameEn": "Olorun", + "skillCD": 15, + "weapon": "12" + }, + { + "alias": [ + "玛薇卡", + "Mavuika", + "火神", + "马薇卡", + "玛维卡", + "马维卡" + ], + "burstCD": 18, + "id": "10000106", + "name": "玛薇卡", + "nameEn": "Mavuika", + "skillCD": 15, + "weapon": "11" + }, + { + "alias": [ + "茜特菈莉", + "Citlali", + "西特菈莉", + "西特拉莉", + "茜特拉莉", + "西特拉利", + "黑曜石奶奶", + "黑曜石", + "奶奶", + "老伴" + ], + "burstCD": 15, + "id": "10000107", + "name": "茜特菈莉", + "nameEn": "Citlali", + "skillCD": 16, + "weapon": "10" + }, + { + "alias": [ + "蓝砚", + "蓝燕", + "兰砚", + "兰燕" + ], + "burstCD": 15, + "id": "10000108", + "name": "蓝砚", + "nameEn": "Lanyan", + "skillCD": 16, + "weapon": "10" + }, + { + "alias": [ + "梦见月瑞希", + "Yumemizuki", + "Mizuki", + "梦见", + "梦见月", + "瑞希", + "瑞幸", + "木更", + "梗小姐", + "食梦貘", + "心理医生", + "心理诊疗师" + ], + "burstCD": 15, + "id": "10000109", + "name": "梦见月瑞希", + "nameEn": "Mizuki", + "skillCD": 15, + "weapon": "10" + }, + { + "alias": [ + "伊安珊", + "Iansan", + "123" + ], + "burstCD": 18, + "id": "10000110", + "name": "伊安珊", + "nameEn": "Iansan", + "skillCD": 16, + "weapon": "13" + }, + { + "alias": [ + "瓦雷莎", + "Varesa", + "瓦雷沙", + "牛头人", + "牛战士", + "奶牛", + "奶牛妹" + ], + "burstCD": 18, + "id": "10000111", + "name": "瓦雷莎", + "nameEn": "Varesa", + "skillCD": 9, + "weapon": "10" + } +] \ No newline at end of file diff --git a/repo/js/切换武器 OCR/assets/weaponName.json b/repo/js/切换武器 OCR/assets/weaponName.json new file mode 100644 index 00000000..6c945b77 --- /dev/null +++ b/repo/js/切换武器 OCR/assets/weaponName.json @@ -0,0 +1,23 @@ +[ + { + "单手剑": ["无锋剑", "银剑", "冷刃", "黎明神剑", "旅行剑", "吃虎鱼刀", "飞天御剑", "暗铁剑", "笛剑", "西风剑", "匣里龙吟", "铁蜂刺", "试作斩岩", "祭礼剑", "宗室长剑", "黑岩长剑", "黑剑", "腐殖之剑", "降临之剑", "暗巷闪光", "天目影打刀", "东花坊时雨", "辰砂之纺锤", "原木刀", "西福斯的月光", "笼钓瓶一心", "狼牙", "海渊终曲", "船坞长剑", "灰河渡手", "息燧之笛", "弥坚骨", "厄水之祸", "斫峰之刃", "风鹰剑", "天空之刃", "磐岩结绿", "雾切之回光", "苍古自由之誓", "波乱月白经津", "圣显之钥", "裁叶萃光", "静水流涌之辉", "有乐御簾切", "赦罪", "岩峰巡歌"] + }, + { + "双手剑": ["训练大剑", "佣兵重剑", "以理服人", "铁影阔剑", "飞天大御剑", "白铁大剑", "沐浴龙血的剑", "祭礼大剑", "西风大剑", "钟剑", "试作古华", "黑岩斩刀", "宗室大剑", "白影剑", "雨裁", "螭骨剑", "雪葬的星银", "桂木斩长正", "衔珠海皇", "千岩古剑", "恶王丸", "玛海拉的水色", "饰铁之花", "聊聊棒", "森林王器", "浪影阔剑", "便携动力锯", "「究极霸王超级魔剑」", "撼地者", "硕果钩", "松籁响起之时", "狼的末路", "天空之傲", "赤角石溃杵", "无工之剑", "裁断", "山王长牙", "苇海信标", "焚曜干阳"] + }, + { + "长枪": ["新手长枪", "铁尖枪", "黑缨枪", "钺矛", "白缨枪", "匣里灭辰", "试作星镰", "决斗之枪", "流月针", "黑岩刺枪", "干岩长枪", "喜多院十文字", "西风长枪", "宗室猎枪", "龙脊长枪", "断浪长鳍", "风信之锋", "「渔获」", "贯月矢", "峡湾长歌", "沙中伟贤的对答", "勘探钻机", "虹的行迹", "公义的酬报", "镇山之钉", "且住亭御咄", "和璞鸢", "天空之脊", "贯虹之槊", "护摩之杖", "薙草之稻光", "息灾", "赤月之形", "柔灯挽歌", "赤沙之杖"] + }, + { + "弓箭": ["猎弓", "历练的猎弓", "鸦羽弓", "神射手之誓", "信使", "反曲弓", "弹弓", "绝弦", "西风猎弓", "弓藏", "试作澹月", "祭礼弓", "宗室长弓", "钢轮弓", "风花之颂", "幽夜华尔兹", "黑岩战弓", "暗巷猎手", "苍翠猎弓", "曚云之月", "破魔之弓", "落霞", "王下近侍", "竭泽", "烈阳之嗣", "测距规", "静谧之曲", "鹦穿之喙", "筑云", "缀花之翎", "碎链", "天空之翼", "阿莫斯之弓", "终末嗟叹之诗", "冬极白星", "猎人之径", "飞雷之弦振", "若水", "白雨心弦", "最初的大魔术", "星鹫赤羽"] + }, + { + "法器": ["学徒笔记", "口袋魔导书", "魔导绪论", "讨龙英杰谭", "翡玉法球", "甲级宝珏", "异世界行记", "西风秘典", "流浪乐章", "祭礼残章", "宗室秘法录", "匣里日月", "万国诸海图谱", "黑岩绯玉", "昭心", "试作金珀", "暗巷的酒与诗", "白辰之环", "忍冬之果", "嘟嘟可故事集", "证誓之明瞳", "盈满之实", "流浪的晚星", "纯水流华", "无垠蔚蓝之歌", "遗祀玉珑", "苍纹角杯", "木棉之环", "乘浪的回旋", "天空之卷", "四风原典", "不灭月华", "千夜浮梦", "尘世之锁", "神乐之真意", "图莱杜拉的回忆", "金流监督", "碧落之珑", "冲浪时光", "万世流涌大典", "鹤鸣余音", "寝正月初睛", "溢彩心念", "祭星者之望"] + }, + { + "低星": [ "无锋剑", "训练大剑", "学徒笔记", "新手长枪", "猎弓", "口袋魔导书", "银剑", "佣兵重剑", "铁尖枪", "历练的猎弓"] + }, + { + "三星": [ "冷刃", "飞天御剑", "黎明神剑", "旅行剑", "暗铁剑", "以理服人", "铁影阔剑", "白铁大剑", "钺矛", "魔导绪论", "黑缨枪", "讨龙英杰谭", "翡玉法球", "异世界行记", "鸦羽弓", "甲级宝珏", "神射手之誓", "信使", "反曲弓", "弹弓"] + } +] diff --git a/repo/js/切换武器 OCR/main.js b/repo/js/切换武器 OCR/main.js index be69ce1d..e896c6cd 100644 --- a/repo/js/切换武器 OCR/main.js +++ b/repo/js/切换武器 OCR/main.js @@ -1,30 +1,114 @@ (async function () { + // 初始化游戏窗口大小和返回主界面 setGameMetrics(1920, 1080, 1); await genshin.returnMainUi(); - const Character = settings.Character || "纳西妲"; - const Element = settings.Element || "物"; - const Weapon = settings.Weapon || "试作金珀"; - const pageScrollCount = Math.min(99, Math.max(0, Math.floor(Number(settings.pageScrollCount) || 2))); - const ocrRegion = { x: 1463, y: 135, width: 256, height: 32 }; - const replacementMap = { "监": "盐", "卵": "卯" }; - const elements = ["火", "水", "草", "雷", "风", "冰", "岩", "物"]; + // 获取角色、元素、武器等设置信息 + const Character = settings.Character || "纳西妲"; // 默认角色 + const Element = settings.Element || "物"; // 默认元素 + const Weapon = settings.Weapon || "试作金珀"; // 默认武器 + const pageScrollCount = Math.min(99, Math.max(0, Math.floor(Number(settings.pageScrollCount) || 2))); // 页面滚动次数 + const ocrRegion = { x: 1463, y: 135, width: 256, height: 32 }; // OCR识别区域 + const replacementMap = { "卵": "卯", "姐": "妲", "去": "云", "日": "甘", "螨": "螭", "知": "矢", "钱": "钺", "础": "咄", "厘": "匣", "排": "绯", "朦": "曚", "矿": "斫", "镰": "簾", "廉": "簾", "救": "赦", "塑": "槊", "雍": "薙" }; // OCR替换映射表 + const elements = [ "火", "水", "草", "雷", "风", "冰", "岩", "物"]; // 元素列表 + const weaponTypeMap = { + "1": "单手剑", + "11": "双手剑", + "12": "弓箭", + "10": "法器", + "13": "长枪" + }; // 武器类型映射表 - // OCR 识别函数 - async function recognizeText(targetText, ocrRegion, timeout = 5000, retryInterval = 20) { + // 加载角色数据 + const filePath = "assets/combat_avatar.json"; + const { aliasToNameMap, nameToWeaponMap } = await loadCombatAvatarData(filePath); + if (!aliasToNameMap || !nameToWeaponMap) { + log.error("无法加载角色数据,OCR 识别无法进行。"); + return; + } + + // 加载武器名称数据 + const weaponNamesMap = await loadWeaponNames("assets/weaponName.json"); + if (!weaponNamesMap) { + log.error("无法加载武器名称数据"); + return; + } + + // 开始执行角色路径 + await CharacterPath(); + + // 加载角色数据 + async function loadCombatAvatarData(filePath) { + try { + const jsonData = file.readTextSync(filePath); + const combatAvatarData = JSON.parse(jsonData); + const aliasToNameMap = {}; // 用于存储别名到正式名称的映射 + const nameToWeaponMap = {}; // 用于存储正式名称到武器属性的映射 + + combatAvatarData.forEach(character => { + aliasToNameMap[character.name] = character.name; // 存储正式名称 + nameToWeaponMap[character.name] = character.weapon; // 存储武器属性 + character.alias.forEach(alias => { + aliasToNameMap[alias] = character.name; // 存储别名到正式名称的映射 + }); + }); + + return { aliasToNameMap, nameToWeaponMap }; + } catch (error) { + log.error(`加载或解析 JSON 文件失败: ${error}`); + return null; + } + } + + // 加载武器名称数据 + async function loadWeaponNames(filePath) { + try { + const jsonData = file.readTextSync(filePath); + const weaponNamesData = JSON.parse(jsonData); + const weaponNamesMap = {}; + + // 将武器名称数据存储到一个对象中,键为武器类型,值为武器名称数组 + weaponNamesData.forEach(item => { + for (const [weaponType, weaponNames] of Object.entries(item)) { + weaponNamesMap[weaponType] = weaponNames; + } + }); + + // log.info(`角色别名映射表: ${JSON.stringify(aliasToNameMap)}`); + // log.info(`角色武器映射表: ${JSON.stringify(nameToWeaponMap)}`); + + return weaponNamesMap; + } catch (error) { + log.error(`加载武器名称文件失败: ${error}`); + return null; + } + } + + // OCR识别文本 + async function recognizeText(targetText, ocrRegion, aliasToNameMap, timeout = 10000, retryInterval = 20, maxAttempts = 5) { let startTime = Date.now(); let retryCount = 0; + const targetFormalName = aliasToNameMap ? aliasToNameMap[targetText] || targetText : targetText; - while (Date.now() - startTime < timeout) { + while (Date.now() - startTime < timeout && retryCount < maxAttempts) { try { - let resList = captureGameRegion().findMulti(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); + let captureRegion = captureGameRegion(); + let ocrObject = RecognitionObject.Ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height); + ocrObject.threshold = 0.8; + let resList = captureRegion.findMulti(ocrObject); + for (let res of resList) { let correctedText = res.text; for (let [wrongChar, correctChar] of Object.entries(replacementMap)) { correctedText = correctedText.replace(new RegExp(wrongChar, 'g'), correctChar); } - if (correctedText.includes(targetText)) { - return { success: true, text: correctedText, x: res.x, y: res.y }; + // log.info(`识别结果: ${correctedText}, 原始坐标: x=${res.x}, y=${res.y}`); + + let recognizedFormalName = aliasToNameMap ? aliasToNameMap[correctedText] || correctedText : correctedText; + recognizedFormalName = fuzzyMatch(correctedText, Object.values(aliasToNameMap)) || recognizedFormalName; + + if (recognizedFormalName === targetFormalName) { + return { success: true, text: recognizedFormalName, x: res.x, y: res.y }; } } } catch (error) { @@ -36,12 +120,75 @@ return { success: false }; } - // 滑动页面函数 + // 模糊匹配文本 + function fuzzyMatch(target, candidates, weightThreshold = 0.6) { + function levenshteinDistance(a, b) { + const m = a.length + 1; + const n = b.length + 1; + const d = Array(m).fill(null).map(() => Array(n).fill(0)); + for (let i = 0; i < m; i++) d[i][0] = i; + for (let j = 0; j < n; j++) d[0][j] = j; + for (let i = 1; i < m; i++) { + for (let j = 1; j < n; j++) { + const cost = a[i - 1] === b[j - 1] ? 0 : 1; + d[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost); + } + } + return d[m - 1][n - 1]; + } + + let bestMatch = null; + let bestWeight = 0; + + for (const candidate of candidates) { + const distance = levenshteinDistance(target, candidate); + const keywordWeight = 0.8; + const lengthWeight = 0.2; + const keywordMatch = candidate.includes(target); + const weight = (keywordMatch ? keywordWeight : 0) + (1 - distance / Math.max(target.length, candidate.length)) * lengthWeight; + + if (weight >= weightThreshold) { + return candidate; + } + + if (weight > bestWeight) { + bestWeight = weight; + bestMatch = candidate; + } + } + return bestMatch; + } + + // 合并OCR识别结果 + function combineResults(results) { + const frequencyMap = {}; + results.forEach(result => { + if (!frequencyMap[result]) { + frequencyMap[result] = 0; + } + frequencyMap[result]++; + }); + + const sortedResults = Object.keys(frequencyMap).sort((a, b) => frequencyMap[b] - frequencyMap[a]); + + for (let result of sortedResults) { + if (result.length === 2) { + return result; + } + } + + if (sortedResults.length >= 2) { + return sortedResults[0] + sortedResults[1]; + } + + return sortedResults[0] || ""; + } + + // 滚动页面 async function scrollPage(totalDistance, stepDistance = 10, delayMs = 10) { moveMouseTo(525, 920); await sleep(500); leftButtonDown(); - const steps = Math.ceil(totalDistance / stepDistance); for (let j = 0; j < steps; j++) { const remainingDistance = totalDistance - j * stepDistance; @@ -49,138 +196,216 @@ moveMouseBy(0, -moveDistance); await sleep(delayMs); } - await sleep(700); leftButtonUp(); await sleep(100); } - // 角色选择函数 + // 选择角色 async function selectCharacter(characterName) { - if (!/^[\u4e00-\u9fa5]+$/.test(characterName)) { - log.error(`Character 设置值无效,必须为纯中文字符。当前值: ${characterName}`); - return false; - } - - const SwitchingSteps = 99; + const SwitchingSteps = 99; // 最大切换次数 for (let i = 0; i < SwitchingSteps; i++) { - let result = await recognizeText(characterName, ocrRegion, 100); + let result = await recognizeText(characterName, ocrRegion, aliasToNameMap, 200); if (result.success) { - log.info(`找到 ${characterName},识别结果: ${result.text},坐标: x=${result.x}, y=${result.y}`); + // log.info(`找到 ${characterName},识别结果: ${result.text},坐标: x=${result.x}, y=${result.y}`); return true; } await click(1840, 540); // 点击切换角色 await sleep(200); } - log.warn(`扫描完成,未找到 ${characterName}`); return false; } - // 元素选择函数 + // 选择元素 async function selectElement(element) { - if (element === "物") return; // 如果元素是“物”,不需要切换 - - const ElementClickX = Math.round(787 + elements.indexOf(element) * 57.5); // 计算点击的X坐标 - await click(960, 45); // 移动鼠标到元素选择区域 + if (element === "物") return; // 如果是物理属性,无需切换 + const ElementClickX = Math.round(787 + elements.indexOf(element) * 57.5); // 计算点击位置 + await click(960, 45); // 点击元素切换按钮 await sleep(100); - leftButtonDown(); // 按住鼠标左键 - const steps = 10; // 分成若干步移动 - const stepDistance = 15; // 每步移动的距离 - + leftButtonDown(); + const steps = 10; + const stepDistance = 15; for (let j = 0; j < steps; j++) { - moveMouseBy(stepDistance, 0); // 每次移动 stepDistance 像素 - await sleep(10); // 每次移动后延迟10毫秒 + moveMouseBy(stepDistance, 0); // 拖动鼠标选择元素 + await sleep(10); } - await sleep(500); - leftButtonUp(); // 释放鼠标左键 + leftButtonUp(); await sleep(500); - await click(ElementClickX, 130); // 点击目标元素 + await click(ElementClickX, 130); // 点击选择元素 await sleep(500); - // 执行一系列鼠标点击操作 - await click(540, 45); + await click(540, 45); // 点击确认 await sleep(200); - } - // 武器扫描函数 - async function scanWeapons(weaponName) { - const startX = 99.5; - const startY = 213.5; - const rowHeight = 167; - const columnWidth = 141; - const maxRows = 4; - const maxColumns = 4; - - for (let scroll = 0; scroll <= pageScrollCount; scroll++) { - for (let row = 0; row < maxRows; row++) { - for (let column = 0; column < maxColumns; column++) { - const clickX = Math.round(startX + column * columnWidth); - const clickY = Math.round(startY + row * rowHeight); - await click(clickX, clickY); - await sleep(50); - - let result = await recognizeText(weaponName, ocrRegion, 100); - if (result.success) { - log.info(`找到 ${weaponName},识别结果: ${result.text},坐标: x=${clickX}, y=${clickY}`); - await click(1600, 1005); - await sleep(1000); - await click(1320, 755); - await sleep(1000); - return true; + // 识别并组合武器名称 + async function recognizeAndCombineWeaponName(ocrRegion, maxAttempts = 5) { + const allResults = []; + for (let i = 0; i < maxAttempts; i++) { + try { + let captureRegion = captureGameRegion(); + let ocrObject = RecognitionObject.Ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height); + ocrObject.threshold = 0.8; + let resList = captureRegion.findMulti(ocrObject); + for (let res of resList) { + let correctedText = res.text; + for (let [wrongChar, correctChar] of Object.entries(replacementMap)) { + correctedText = correctedText.replace(new RegExp(wrongChar, 'g'), correctChar); } + // log.info(`OCR 识别结果: ${correctedText}, 原始坐标: x=${res.x}, y=${res.y}`); + allResults.push(correctedText); } + } catch (error) { + log.warn(`OCR 识别失败,正在进行第 ${i + 1} 次重试...`); } - - if (scroll < pageScrollCount) { - await scrollPage(673, 10, 10); - } + await sleep(20); } + const combinedResult = combineResults(allResults); + // log.info(`组合后的识别结果: ${combinedResult}`); + return combinedResult; + } + + // 扫描武器 + async function scanWeapons(settingsWeapon) { + // 获取角色的正式名称 + const characterName = aliasToNameMap[Character] || Character; + log.info(`寻找到角色 ${Character} 正式名称 ${characterName}`); + if (!characterName) { + log.error(`未找到角色 ${Character} 的正式名称`); return false; } - // 主流程函数 + // 获取角色的武器类型 + const characterWeaponType = nameToWeaponMap[characterName]; + log.info(`寻找到角色 ${Character} 的武器类型为 ${characterWeaponType}`); + if (!characterWeaponType) { + log.warn(`未找到角色 ${characterName} 的武器类型,将直接匹配 目标武器名 和 当前武器名 `); + } + + // 获取对应的武器名称列表 + const weaponType = weaponTypeMap[characterWeaponType]; + const weaponNames = weaponNamesMap[weaponType] || []; + + // 如果武器名称列表为空,则将 settingsWeapon 添加到列表中,以便后续匹配 + if (!weaponNames.length) { + log.warn(`未找到武器类型 ${weaponType} 的武器名称列表,将使用原始武器名 ${settingsWeapon}`); + weaponNames.push(settingsWeapon); + } + + let weaponName1 = fuzzyMatch(settingsWeapon, weaponNames, 0.9); + log.info(`寻找到 目标武器 正式名称 ${weaponName1}`); + + if (!weaponName1) { + log.warn(`未找到与 ${settingsWeapon} 匹配的武器名,使用原始名称作为 目标武器名`); + weaponName1 = settingsWeapon; + } + + const startX = 99.5; + const startY = 213.5; + const rowHeight = 167; + const columnWidth = 141; + const maxRows = 4; + const maxColumns = 4; + + for (let scroll = 0; scroll <= pageScrollCount; scroll++) { + for (let row = 0; row < maxRows; row++) { + for (let column = 0; column < maxColumns; column++) { + const clickX = Math.round(startX + column * columnWidth); + const clickY = Math.round(startY + row * rowHeight); + await click(clickX, clickY); // 点击武器 + await sleep(50); + + const combinedWeaponName2 = await recognizeAndCombineWeaponName(ocrRegion); + + if (!combinedWeaponName2) { + log.warn("OCR 识别失败,未找到任何武器名"); + continue; + } + + // 尝试模糊匹配武器名称 + let weaponName2 = fuzzyMatch(combinedWeaponName2, weaponNames, 1); + + // 如果未匹配到已知武器名称,则将 OCR 识别结果直接作为武器名称使用 + if (!weaponName2) { + log.warn(`未找到与 ${combinedWeaponName2} 匹配的已知武器名,将使用 OCR 识别结果作为 当前武器名`); + weaponName2 = combinedWeaponName2; + } + + // 计算匹配占比,排除干扰词 + const matchRatio = calculateMatchRatio(weaponName1, weaponName2); + if (matchRatio >= 0.8) { // 如果匹配占比大于等于 80%,则认为匹配成功 + log.info(`成功匹配武器:${weaponName1},匹配占比 ${matchRatio.toFixed(2)}`); + await click(1600, 1005); // 点击确认 + await sleep(1000); + await click(1320, 755); // 点击确认 + await sleep(1000); + return true; + } else { + log.warn(` 目标武器名 (${weaponName1}) 和 当前武器名 (${weaponName2}) 不匹配,匹配占比 ${matchRatio.toFixed(2)}`); + } + } + } + + if (scroll < pageScrollCount) { + await scrollPage(673, 10, 10); // 滚动页面 + } + } + + log.warn(`扫描完成,未找到 ${settingsWeapon}`); + return false; +} + +// 计算匹配占比 +function calculateMatchRatio(target, candidate) { + const ignoreWords = ["剑", "之", "弓", "枪", "长", "大", "典", "章"]; // 需要排除的干扰词 + const targetClean = target.split('').filter(char => !ignoreWords.includes(char)).join(''); + const candidateClean = candidate.split('').filter(char => !ignoreWords.includes(char)).join(''); + + const commonChars = targetClean.split('').filter(char => candidateClean.includes(char)).length; + const totalChars = targetClean.length; + + return commonChars / totalChars; +} + + // 执行角色路径 async function CharacterPath() { log.info("开始寻找"); - await genshin.returnMainUi(); - keyPress("1"); + await genshin.returnMainUi(); // 返回主界面 + keyPress("1"); // 按键操作 await sleep(500); - keyPress("C"); + keyPress("C"); // 打开角色界面 await sleep(1000); - await selectElement(Element); + await selectElement(Element); // 选择元素属性 - if (!await selectCharacter(Character)) { + if (!await selectCharacter(Character)) { // 选择角色 log.error("角色筛选失败,退出脚本"); return; } - await click(125, 225); // 点击武器选项 + await click(125, 225); // 点击武器详情 await sleep(1000); - await click(1600, 1005); // 点击替换当前武器 + await click(1600, 1005); // 点击替换武器 await sleep(1000); - await click(500, 1005); // 使用等级顺序排列 + await click(500, 1005); // 点击武器排序 await sleep(200); - await click(500, 905); // 使用等级顺序排列 + await click(500, 905); // 点击排序类型 await sleep(200); - await click(605, 137); // 初始化滑条 - await moveMouseTo(605, 140); - await sleep(200); // 初始化滑条 - leftButtonDown(); - await sleep(500); + await click(605, 137); // 点击武器排序 + await moveMouseTo(605, 140); // 移动鼠标至滑条顶端 + await sleep(200); + leftButtonDown(); // 长按左键重置武器滑条 + await sleep(300); leftButtonUp(); await sleep(200); - if (!await scanWeapons(Weapon)) { - log.warn(`扫描完成,未找到 ${Weapon}`); + if (!await scanWeapons(Weapon)) { // 未找到指定武器 + log.warn(` ${pageScrollCount+1} 页扫描完,未找到 ${Weapon}`); } - await genshin.returnMainUi(); + await genshin.returnMainUi(); // 返回主界面 } - - // 调用主流程 - await CharacterPath(); })(); diff --git a/repo/js/切换武器 OCR/manifest.json b/repo/js/切换武器 OCR/manifest.json index e277f093..34e4a960 100644 --- a/repo/js/切换武器 OCR/manifest.json +++ b/repo/js/切换武器 OCR/manifest.json @@ -1,8 +1,8 @@ { "manifest_version": 1, "name": "选择角色和武器 ", - "version": "2.01", - "description": "OCR。默认四行为一页", + "version": "2.22", + "description": "OCR。默认四行为一页;v2.1增加模糊匹配,增加别名匹配。v2.22兼容未知角色、未知武器", "authors": [ { "name": "吉吉喵" diff --git a/repo/js/切换武器 OCR/settings.json b/repo/js/切换武器 OCR/settings.json index becdeda7..ea992cc7 100644 --- a/repo/js/切换武器 OCR/settings.json +++ b/repo/js/切换武器 OCR/settings.json @@ -2,17 +2,17 @@ { "name": "Character", "type": "input-text", - "label": "角色名称(默认 纳西妲)" + "label": "角色(如 草神、奶奶)" }, { "name": "Weapon", "type": "input-text", - "label": "武器名称(默认 试作金珀)" + "label": "武器(如 金珀、祭礼)" }, { "name": "Element", "type": "select", - "label": "=============\n\n选元素缩范围 非必填\n元素(默认'物'=不选)", + "label": "=============\n选元素缩范围 非必填\n元素(默认'物'=不选)", "options": [ "物", "火",