mirror of
https://github.com/Genshin-bots/gsuid_core.git
synced 2025-05-12 06:55:49 +08:00
🔥 删除插件GenshinUID
文件夹
This commit is contained in:
parent
eb8789c823
commit
3a6c9f70f6
@ -1,19 +0,0 @@
|
|||||||
from gsuid_core.sv import SV
|
|
||||||
from gsuid_core.server import Bot
|
|
||||||
from gsuid_core.models import MessageContent
|
|
||||||
|
|
||||||
from .get_achi_desc import get_achi, get_daily_achi
|
|
||||||
|
|
||||||
|
|
||||||
@SV('成就委托查询').on_prefix('查委托')
|
|
||||||
async def send_task_info(bot: Bot, msg: MessageContent):
|
|
||||||
await bot.logger.info(f'[查委托] 参数:{msg.text}')
|
|
||||||
im = await get_daily_achi(msg.text)
|
|
||||||
await bot.send(im)
|
|
||||||
|
|
||||||
|
|
||||||
@SV('成就委托查询').on_prefix('查成就')
|
|
||||||
async def send_achi_info(bot: Bot, msg: MessageContent):
|
|
||||||
await bot.logger.info(f'[查成就] 参数:{msg.text}')
|
|
||||||
im = await get_achi(msg.text)
|
|
||||||
await bot.send(im)
|
|
File diff suppressed because it is too large
Load Diff
@ -1,542 +0,0 @@
|
|||||||
{
|
|
||||||
"语言交流": {
|
|
||||||
"achievement": "…Odomu?",
|
|
||||||
"desc": "在「语言交流」中与丘丘人交流成功。",
|
|
||||||
"guide": "《语言交流》:注意 1、不要攻击附近的丘丘人;2、注意雷雨天小心落雷击中丘丘人导致任务失败",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"诗歌交流": {
|
|
||||||
"achievement": "Yo dala?",
|
|
||||||
"desc": "在「诗歌交流」中与丘丘人交流成功。",
|
|
||||||
"guide": "《诗歌交流》:选择这 3 项即可【Celi dada,mimi nunu!】、【Ye dada!】、【Muhe ye!】其余同上",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"来自冬天的故事": {
|
|
||||||
"achievement": "有一说一",
|
|
||||||
"desc": "在「来自冬天的故事」中探听到所有关于至冬国的情报。",
|
|
||||||
"guide": "《来自冬天的故事》:愚人众、邪眼、女皇陛下,三个选项各选 1 次,也就是至少要做 3 次\n*2.4新增后续维克托回至冬(向冬日回归)\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1Xt4y1z7qw?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"说到做到": {
|
|
||||||
"achievement": "追求极致",
|
|
||||||
"desc": "在「说到做到!」中完美完成查耶维奇的所有委托。",
|
|
||||||
"guide": "《说到做到!》至少 3 次“完美”且不重复地完成委托才能拿到成就。\n山顶(按照顺序击杀:火斧、木盾、丘丘人萨满);山腰(不能损坏货物,可以拉怪出来);\n山底(需要 1 分钟内完成,跑图时间也算,可以提前放个口袋锚点,打怪前保留角色大招)\n*详解地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1m64y1y7rk?"
|
|
||||||
},
|
|
||||||
"岩游记": {
|
|
||||||
"achievement": "帝君故事",
|
|
||||||
"desc": "搜集到「岩游记」中所有有关岩王帝君的故事。",
|
|
||||||
"guide": "《岩游记》需要做 4 次,给 4 次不同的道具:财神(必须是琉璃百合);开拓之神(野外采集物:琉璃袋 清心 绝云辣椒 霓裳花等);炉灶之神(各类矿石:夜泊石 铁矿 石珀 等等);历史之神(璃月菜品:翡翠什锦袋 水煮黑背鲈 等等)。\n*当“财神”和“历史之神”共同存在任务道具会被回收,当“炉灶之神”和“开拓之神”共同存在任务道具会被回收,注意记录。\n*视频地址及道具回收演示",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1s64y1m718?p=1"
|
|
||||||
},
|
|
||||||
"且听下回分解": {
|
|
||||||
"achievement": "且听我一言。",
|
|
||||||
"desc": "在「且听下回分解」中听完《海山履云记》。",
|
|
||||||
"guide": null,
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"璃月港,有海盗!": {
|
|
||||||
"achievement": "哎呀!海盗!",
|
|
||||||
"desc": "陪璐璐、阿飞与小蒙各玩一次海盗游戏。",
|
|
||||||
"guide": "《璃月港,有海盗!》;1.5 版本更新后在这三人附近挂机很容易刷到;2.4后又新增后续\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1q44y1N7Dn?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"好兆头": {
|
|
||||||
"achievement": "「…而尽人事。」",
|
|
||||||
"desc": "破坏了四种爱情运来临的征兆。",
|
|
||||||
"guide": "在《好兆头》中捕鱼、风吹或者火烧落叶、杀鸽子、看到狗要赶走。人为干涉所有的征兆。\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV11r4y127Rw?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"愿风带走思念": {
|
|
||||||
"achievement": "过量的思念",
|
|
||||||
"desc": "完成五次「愿风带走思念」。",
|
|
||||||
"guide": "《愿风带走思念》做 5 次。1.0版本(2020年11月11日之前)有BUG会做1次=5次的情况,拿到成就后不会重置。如果进度不为5次会重置为0。从1.1后后重新计算。\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1xu41167hS?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"勿言勿笑": {
|
|
||||||
"achievement": "厨子与渔夫",
|
|
||||||
"desc": "完成「独钓江雪」与「勿言勿笑」。",
|
|
||||||
"guide": "正常完成 2 个任务即可",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"独钓江雪": {
|
|
||||||
"achievement": "厨子与渔夫",
|
|
||||||
"desc": "完成「独钓江雪」与「勿言勿笑」。",
|
|
||||||
"guide": "正常完成 2 个任务即可",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"望舒须筑阶": {
|
|
||||||
"achievement": "更上一层楼",
|
|
||||||
"desc": "帮助淮安修复望舒客栈的断桥。",
|
|
||||||
"guide": "正常完成《望舒须筑阶》2次任务即可",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"鸽子、鸭子、小孩子": {
|
|
||||||
"achievement": "略表歉意",
|
|
||||||
"desc": "向提米道歉。",
|
|
||||||
"guide": "《鸽子、鸭子、小孩子》里投食鸭子后故意杀掉鸭子,第二天刷《提米,对不起》",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"提米,对不起!": {
|
|
||||||
"achievement": "略表歉意",
|
|
||||||
"desc": "向提米道歉。",
|
|
||||||
"guide": "《鸽子、鸭子、小孩子》里投食鸭子后故意杀掉鸭子,第二天刷《提米,对不起》",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"鸽子习惯一去不回": {
|
|
||||||
"achievement": "「您好,亲爱的爸爸…」",
|
|
||||||
"desc": "了解提米的故事。",
|
|
||||||
"guide": "水银的讲解视频点此;\n每日委托《鸽子习惯一去不回》有三个支线,第一种:正常赶走鸽子,做完没有后续;\n第二种:赶鸽子的时候玩家杀了鸽子,被杜拉夫要求让旅行者亲自去送信,做完后也没有后续;\n第三种:赶鸽子的时候发现任务提示点的地上一团金光,跑过去发现丘丘人把鸽子抓走烧了吃了,打死丘丘人完成任务,没有后续;\n第三种丘丘人支线又分成两种情况,一是地上有一封信,捡到信的话解锁后续每日委托《一个男孩的去信》,做完这个委托后可以拿到成就\n建议在另外一个每日委托《鸽子、鸭子、小孩子》里不要杀死提米要你喂的鸽子,这样更有可能进入掉信的支线\n至于提米那个略表歉意的成就可以在另外一次刷到鸽子鸭子小孩子以后再做",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1xR4y1E7PR"
|
|
||||||
},
|
|
||||||
"一个男孩的去信": {
|
|
||||||
"achievement": "「您好,亲爱的爸爸…」",
|
|
||||||
"desc": "了解提米的故事。",
|
|
||||||
"guide": "水银的讲解视频点此;\n每日委托《鸽子习惯一去不回》有三个支线,第一种:正常赶走鸽子,做完没有后续;\n第二种:赶鸽子的时候玩家杀了鸽子,被杜拉夫要求让旅行者亲自去送信,做完后也没有后续;\n第三种:赶鸽子的时候发现任务提示点的地上一团金光,跑过去发现丘丘人把鸽子抓走烧了吃了,打死丘丘人完成任务,没有后续;\n第三种丘丘人支线又分成两种情况,一是地上有一封信,捡到信的话解锁后续每日委托《一个男孩的去信》,做完这个委托后可以拿到成就\n建议在另外一个每日委托《鸽子、鸭子、小孩子》里不要杀死提米要你喂的鸽子,这样更有可能进入掉信的支线\n至于提米那个略表歉意的成就可以在另外一次刷到鸽子鸭子小孩子以后再做",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1xR4y1E7PR"
|
|
||||||
},
|
|
||||||
"奇药庐中来": {
|
|
||||||
"achievement": "妙手怪医",
|
|
||||||
"desc": "治好安娜的病。",
|
|
||||||
"guide": "《奇药庐中来》要做 3 次,之后解锁《大病初愈》后续任务;第一次做完《大病初愈》后给成就。\n成就拿完后《大病初愈》可能还会反复刷,安娜会出现在三个位置(风车顶上、教堂顶上、风神像手上)\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1Hw411Z7zp?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"大病初愈": {
|
|
||||||
"achievement": "妙手怪医",
|
|
||||||
"desc": "治好安娜的病。",
|
|
||||||
"guide": "《奇药庐中来》要做 3 次,之后解锁《大病初愈》后续任务;第一次做完《大病初愈》后给成就。\n成就拿完后《大病初愈》可能还会反复刷,安娜会出现在三个位置(风车顶上、教堂顶上、风神像手上)\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1Hw411Z7zp?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"餐品订单": {
|
|
||||||
"achievement": "这不是应急食品",
|
|
||||||
"desc": "在「餐品订单」任务中吃掉了餐品…?",
|
|
||||||
"guide": "成就是刷到任务以后吃掉任务菜品就可以拿,但是蟹黄火腿焗时蔬的食谱是不一定给的(送餐给活跃的欧琳的支线才会给,途中要打史莱姆)(触发哪条支线是随机的)",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"惊喜大礼": {
|
|
||||||
"achievement": "西风佑我",
|
|
||||||
"desc": "见证吉丽安娜的故事。",
|
|
||||||
"guide": "《惊喜大礼》要做 4 次不同路线(莎拉店、纪念品店、坤恩水果摊、芙萝拉花店)\n最后触发最终剧情(此任务还有后续,盗宝团来复仇,触发“那位先生的委托”)\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1Ew411f74K?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"「冒险家」的能力极限": {
|
|
||||||
"achievement": "凑合…也能用",
|
|
||||||
"desc": "只带给赫尔曼木桩的材料。",
|
|
||||||
"guide": "《「冒险家」的能力极限》木桩一定要打坏带回",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"冒险家测验·作战方式": {
|
|
||||||
"achievement": "安娜冒险记",
|
|
||||||
"desc": "帮助安娜成为一名冒险家。",
|
|
||||||
"guide": "《冒险家,安娜!》\n拿到成就的过程和给安娜治病差不多,且需要先给安娜治好病,也就是完成每日委托成就《妙手怪医》,之后完成前置任务:《冒险家测验·作战方式》、《冒险家测验·冒险诀窍》、《冒险家测验·起飞方式》,最后接到后续《冒险家,安娜!》,第一次完成任务后拿到成就\n(做完成就后还有后续支线,其中一条支线有“彩蛋”级内容,但没成就)\n*前置很阴间主要是情商选项,后续这4个也很阴间不按套路出牌\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1Bu411r7Kb?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"冒险家测验·冒险诀窍": {
|
|
||||||
"achievement": "安娜冒险记",
|
|
||||||
"desc": "帮助安娜成为一名冒险家。",
|
|
||||||
"guide": "《冒险家,安娜!》\n拿到成就的过程和给安娜治病差不多,且需要先给安娜治好病,也就是完成每日委托成就《妙手怪医》,之后完成前置任务:《冒险家测验·作战方式》、《冒险家测验·冒险诀窍》、《冒险家测验·起飞方式》,最后接到后续《冒险家,安娜!》,第一次完成任务后拿到成就\n(做完成就后还有后续支线,其中一条支线有“彩蛋”级内容,但没成就)\n*前置很阴间主要是情商选项,后续这4个也很阴间不按套路出牌\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1Bu411r7Kb?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"冒险家测验·起飞方式": {
|
|
||||||
"achievement": "安娜冒险记",
|
|
||||||
"desc": "帮助安娜成为一名冒险家。",
|
|
||||||
"guide": "《冒险家,安娜!》\n拿到成就的过程和给安娜治病差不多,且需要先给安娜治好病,也就是完成每日委托成就《妙手怪医》,之后完成前置任务:《冒险家测验·作战方式》、《冒险家测验·冒险诀窍》、《冒险家测验·起飞方式》,最后接到后续《冒险家,安娜!》,第一次完成任务后拿到成就\n(做完成就后还有后续支线,其中一条支线有“彩蛋”级内容,但没成就)\n*前置很阴间主要是情商选项,后续这4个也很阴间不按套路出牌\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1Bu411r7Kb?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"冒险家,安娜!": {
|
|
||||||
"achievement": "安娜冒险记",
|
|
||||||
"desc": "帮助安娜成为一名冒险家。",
|
|
||||||
"guide": "《冒险家,安娜!》\n拿到成就的过程和给安娜治病差不多,且需要先给安娜治好病,也就是完成每日委托成就《妙手怪医》,之后完成前置任务:《冒险家测验·作战方式》、《冒险家测验·冒险诀窍》、《冒险家测验·起飞方式》,最后接到后续《冒险家,安娜!》,第一次完成任务后拿到成就\n(做完成就后还有后续支线,其中一条支线有“彩蛋”级内容,但没成就)\n*前置很阴间主要是情商选项,后续这4个也很阴间不按套路出牌\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1Bu411r7Kb?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"『遗落』的文物": {
|
|
||||||
"achievement": "学者与「学者」",
|
|
||||||
"desc": "完成「『遗落』的文物」与「『夺宝』小行动」。",
|
|
||||||
"guide": "《遗落的文物》至少要做 3 次,剧情进展到解救学者索拉雅以后有才有几率刷出《夺宝小行动》",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"『夺宝』小行动": {
|
|
||||||
"achievement": "学者与「学者」",
|
|
||||||
"desc": "完成「『遗落』的文物」与「『夺宝』小行动」。",
|
|
||||||
"guide": "《遗落的文物》至少要做 3 次,剧情进展到解救学者索拉雅以后有才有几率刷出《夺宝小行动》",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"港口驶过几艘船,二四六七八": {
|
|
||||||
"achievement": "梦想与工作,诗与面包",
|
|
||||||
"desc": "完成「所谓『工作』」,并获得霖铃的诗集。",
|
|
||||||
"guide": "完成《港口驶过几艘船,二四六七八》时故意告诉霖铃错误的数量(注意船有驶入和驶出的区别),大概率第二天刷《所谓工作》;如果第二天没刷,可能过一阵子才会刷",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"所谓「工作」": {
|
|
||||||
"achievement": "梦想与工作,诗与面包",
|
|
||||||
"desc": "完成「所谓『工作』」,并获得霖铃的诗集。",
|
|
||||||
"guide": "完成《港口驶过几艘船,二四六七八》时故意告诉霖铃错误的数量(注意船有驶入和驶出的区别),大概率第二天刷《所谓工作》;如果第二天没刷,可能过一阵子才会刷",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"点石成…什么": {
|
|
||||||
"achievement": "时也运也",
|
|
||||||
"desc": "一次就选中了最高价值的璞石。",
|
|
||||||
"guide": "《点石成…什么》:正确方法是选最亮的石头。\n不放心的话可以卡视角来透视璞石内部,有完整的石珀就可以选。\n注意并不是 100% 有石珀,纯随机,同理“餐品订单”任务\n外观最亮的,通过透视可以看到里面发光、纹路有完整条纹的即可。\n",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"这本小说真厉害": {
|
|
||||||
"achievement": "这本小说真厉害!",
|
|
||||||
"desc": "偷看常九爷的书稿。",
|
|
||||||
"guide": "《这本小说真厉害!》,交书稿前派蒙会问你是否偷看,选择偷看即可",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"久久望故人": {
|
|
||||||
"achievement": "故人久未归",
|
|
||||||
"desc": "完成「久久望故人」任务。",
|
|
||||||
"guide": "《久久望故人》:一定要先做过世界任务的小九九,否则可能做完没成就。\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV11U4y137Tr?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"哎呀!海盗想长大!": {
|
|
||||||
"achievement": "远大前程",
|
|
||||||
"desc": "一位少年即将启程远行…",
|
|
||||||
"guide": "《小海盗,要出海!》\n前置《哎呀!海盗想长大!》、《随水而来的烦恼》\n后续《小小的远行》系列 3 个(没成就)\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1q44y1N7Dn?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"随水而来的烦恼": {
|
|
||||||
"achievement": "远大前程",
|
|
||||||
"desc": "一位少年即将启程远行…",
|
|
||||||
"guide": "《小海盗,要出海!》\n前置《哎呀!海盗想长大!》、《随水而来的烦恼》\n后续《小小的远行》系列 3 个(没成就)\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1q44y1N7Dn?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"小海盗,要出海!": {
|
|
||||||
"achievement": "远大前程",
|
|
||||||
"desc": "一位少年即将启程远行…",
|
|
||||||
"guide": "《小海盗,要出海!》\n前置《哎呀!海盗想长大!》、《随水而来的烦恼》\n后续《小小的远行》系列 3 个(没成就)\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1q44y1N7Dn?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"试问,藏锋何处?": {
|
|
||||||
"achievement": "四方求剑",
|
|
||||||
"desc": "见证岚姐与「藏锋」的故事。",
|
|
||||||
"guide": null,
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"剑去之日": {
|
|
||||||
"achievement": "行万里路…?",
|
|
||||||
"desc": "见证孙宇的故事。",
|
|
||||||
"guide": null,
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"万端珊瑚事件簿": {
|
|
||||||
"achievement": "瞳孔中的伪装者",
|
|
||||||
"desc": "帮助珊瑚和龙二破获案件。",
|
|
||||||
"guide": "完成《万端珊瑚事件簿·结案时刻》后解锁成就,需要先完成前置任务,推测的顺序是:\n万端珊瑚事件簿 → 搜索工作x3次 → 合适的身份 → 迷惑行动x3次 → 结案时刻→收尾工作\n第二和四环节有 3 个分支地点(随机给其中 1 个):稻妻城附近、甘金岛附近、神里屋敷附近\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1i3411K7YD?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"万端珊瑚事件簿·搜索工作": {
|
|
||||||
"achievement": "瞳孔中的伪装者",
|
|
||||||
"desc": "帮助珊瑚和龙二破获案件。",
|
|
||||||
"guide": "完成《万端珊瑚事件簿·结案时刻》后解锁成就,需要先完成前置任务,推测的顺序是:\n万端珊瑚事件簿 → 搜索工作x3次 → 合适的身份 → 迷惑行动x3次 → 结案时刻→收尾工作\n第二和四环节有 3 个分支地点(随机给其中 1 个):稻妻城附近、甘金岛附近、神里屋敷附近\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1i3411K7YD?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"万端珊瑚事件簿·迷惑行动": {
|
|
||||||
"achievement": "瞳孔中的伪装者",
|
|
||||||
"desc": "帮助珊瑚和龙二破获案件。",
|
|
||||||
"guide": "完成《万端珊瑚事件簿·结案时刻》后解锁成就,需要先完成前置任务,推测的顺序是:\n万端珊瑚事件簿 → 搜索工作x3次 → 合适的身份 → 迷惑行动x3次 → 结案时刻→收尾工作\n第二和四环节有 3 个分支地点(随机给其中 1 个):稻妻城附近、甘金岛附近、神里屋敷附近\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1i3411K7YD?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"万端珊瑚事件簿·合适的身份": {
|
|
||||||
"achievement": "瞳孔中的伪装者",
|
|
||||||
"desc": "帮助珊瑚和龙二破获案件。",
|
|
||||||
"guide": "完成《万端珊瑚事件簿·结案时刻》后解锁成就,需要先完成前置任务,推测的顺序是:\n万端珊瑚事件簿 → 搜索工作x3次 → 合适的身份 → 迷惑行动x3次 → 结案时刻→收尾工作\n第二和四环节有 3 个分支地点(随机给其中 1 个):稻妻城附近、甘金岛附近、神里屋敷附近\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1i3411K7YD?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"万端珊瑚事件簿·结案时刻": {
|
|
||||||
"achievement": "瞳孔中的伪装者",
|
|
||||||
"desc": "帮助珊瑚和龙二破获案件。",
|
|
||||||
"guide": "完成《万端珊瑚事件簿·结案时刻》后解锁成就,需要先完成前置任务,推测的顺序是:\n万端珊瑚事件簿 → 搜索工作x3次 → 合适的身份 → 迷惑行动x3次 → 结案时刻→收尾工作\n第二和四环节有 3 个分支地点(随机给其中 1 个):稻妻城附近、甘金岛附近、神里屋敷附近\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1i3411K7YD?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"万端珊瑚事件簿·收尾工作": {
|
|
||||||
"achievement": "真相只有一个…?",
|
|
||||||
"desc": "见证龙二的故事。",
|
|
||||||
"guide": "做完《万端珊瑚事件簿·结案时刻》后解锁《万端珊瑚事件簿·收尾工作》,新登场大和田剧情。\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1i3411K7YD?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"家乡之味": {
|
|
||||||
"achievement": "璃月一番",
|
|
||||||
"desc": "用美味的料理治愈汤雯。",
|
|
||||||
"guide": "前置任务每日委托《家乡之味》交付奇怪的料理(无论哪种料理的奇怪的版本都行)给汤雯,汤雯拿到以后会说味道很微妙。\n正确完成前置任务后,再接到后续每日委托《绝对独特的美味》 (非强制触发,最快第二天可以接到,最慢1个月后),三个选项 (绝云锅巴、腌笃鲜、烤吃虎鱼) 选哪种都可以,交付美味的料理即可解锁成就\n*.2.5版本后在再做一次该任务,汤雯会回璃月\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV12f4y157fC?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"绝对独特的美味": {
|
|
||||||
"achievement": "璃月一番",
|
|
||||||
"desc": "用美味的料理治愈汤雯。",
|
|
||||||
"guide": "前置任务每日委托《家乡之味》交付奇怪的料理(无论哪种料理的奇怪的版本都行)给汤雯,汤雯拿到以后会说味道很微妙。\n正确完成前置任务后,再接到后续每日委托《绝对独特的美味》 (非强制触发,最快第二天可以接到,最慢1个月后),三个选项 (绝云锅巴、腌笃鲜、烤吃虎鱼) 选哪种都可以,交付美味的料理即可解锁成就\n*.2.5版本后在再做一次该任务,汤雯会回璃月\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV12f4y157fC?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"全能美食队·突破性思维": {
|
|
||||||
"achievement": "噼咔,为什么又是噼咔",
|
|
||||||
"desc": "向香菱请教到特别的烹饪手法。",
|
|
||||||
"guide": "《全能美食队·突破性思维》\n剧情里旭东会让旅行者去璃月的万民堂找卯师傅,卯师傅会给你 2 个选项,选择“也许香菱知道怎么解决他的问题…”这个选项,卯师傅说香菱去轻策庄了,让你找点绝云椒椒和禽肉。这时候你可以不管卯师傅要的东西,自己传送到轻策庄去找香菱对话,最后回去找旭东\n香菱在轻策庄西南的传送点(刚传送过去就会被野猪撞的那个)附近\n此外只要自己去找香菱对话,最后交付道具时交付香菱给的就行了,对话选哪个选项其实无所谓\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1zv411g7VE?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"全能美食队·烹饪对决": {
|
|
||||||
"achievement": "双人餐行",
|
|
||||||
"desc": "帮助旭东和龟井宗久各完成一次烹饪。",
|
|
||||||
"guide": "《全能美食队·烹饪对决》:双方各胜利 1 次即可。\n灭火BUG已经修护,如实正常做任务即可\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1zv411g7VE?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"全能美食队·美食小问答": {
|
|
||||||
"achievement": "饮食问题",
|
|
||||||
"desc": "帮助芭尔瓦涅校对全部食谱。",
|
|
||||||
"guide": "《全能美食队·美食小问答》正确答案如下:\n北地苹果焖肉——胡椒 ;天枢肉———清心\n腌笃鲜—————竹笋 ;串串三味——鸟蛋 ;水煮黑背鲈——盐\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1zv411g7VE?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"全能美食队·厨道的极意": {
|
|
||||||
"achievement": "武士饭",
|
|
||||||
"desc": "帮助龟井宗久搜集过全部两侧营地的食材。",
|
|
||||||
"guide": "《全能美食队·厨道的极意》:左右两边各要做 1 次\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1zv411g7VE?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"稻妻销售员": {
|
|
||||||
"achievement": "「给您添蘑菇了!」",
|
|
||||||
"desc": "在「售后服务」中收到顾客绀田传助的抱怨。",
|
|
||||||
"guide": "前置任务《稻妻销售员》中,告诉绀田传助错误的化肥使用方法\n任务里有三个选项,选择错误的选项\n每次刷到这个任务时,瓦希德告诉你的方法的顺序可能是不一样的,没有固定答案,需要你自己判断哪个选项是错误的(类似璃月港数船)\n教错了的话,绀田传助会说感觉不对劲\n之后解锁每日委托《售后服务》(解锁代表有机会刷到,但不是第二天一定就刷),为绀田传助摘除田地里的蘑菇时,注意要把全部的蘑菇都摘除、摘了一部分时派蒙会说“这下应该差不多了”,同时系统提示可以找绀田传助交任务了;此时不要理会,继续摘蘑菇,全部摘完以后派蒙会说“这下就全部摘干净了”,这时再去找绀田传助交任务,任务完成后解锁成就",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"售后服务": {
|
|
||||||
"achievement": "「给您添蘑菇了!」",
|
|
||||||
"desc": "在「售后服务」中收到顾客绀田传助的抱怨。",
|
|
||||||
"guide": "前置任务《稻妻销售员》中,告诉绀田传助错误的化肥使用方法\n任务里有三个选项,选择错误的选项\n每次刷到这个任务时,瓦希德告诉你的方法的顺序可能是不一样的,没有固定答案,需要你自己判断哪个选项是错误的(类似璃月港数船)\n教错了的话,绀田传助会说感觉不对劲\n之后解锁每日委托《售后服务》(解锁代表有机会刷到,但不是第二天一定就刷),为绀田传助摘除田地里的蘑菇时,注意要把全部的蘑菇都摘除、摘了一部分时派蒙会说“这下应该差不多了”,同时系统提示可以找绀田传助交任务了;此时不要理会,继续摘蘑菇,全部摘完以后派蒙会说“这下就全部摘干净了”,这时再去找绀田传助交任务,任务完成后解锁成就",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"这本小说…厉害吗?": {
|
|
||||||
"achievement": "编辑部的一己之见",
|
|
||||||
"desc": "帮助阿茂和顺吉回到正确的创作轨道。",
|
|
||||||
"guide": "一阶段:《这本小说…厉害吗?》(支线:天目锻冶屋、九十九物、观察同心们的工作)\n二阶段支线 A:《这本小说…有问题?》\n二阶段支线 B:《这本小说…好像看过?》(按顺序123依次交书即可)\n从剧情逻辑上来看,在一阶段支持编辑阿茂解锁刷到《这本小说…好像看过》的可能性,支持作家顺吉解锁刷到《这本小说…有问题》的可能性\n需要这三个每日都做完,且在 B 支线交付\n*视频成就",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1tu411C7jN?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"这本小说…有问题?": {
|
|
||||||
"achievement": "编辑部的一己之见",
|
|
||||||
"desc": "帮助阿茂和顺吉回到正确的创作轨道。",
|
|
||||||
"guide": "一阶段:《这本小说…厉害吗?》(支线:天目锻冶屋、九十九物、观察同心们的工作)\n二阶段支线 A:《这本小说…有问题?》\n二阶段支线 B:《这本小说…好像看过?》(按顺序123依次交书即可)\n从剧情逻辑上来看,在一阶段支持编辑阿茂解锁刷到《这本小说…好像看过》的可能性,支持作家顺吉解锁刷到《这本小说…有问题》的可能性\n需要这三个每日都做完,且在 B 支线交付\n*视频成就",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1tu411C7jN?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"这本小说…好像看过?": {
|
|
||||||
"achievement": "编辑部的一己之见",
|
|
||||||
"desc": "帮助阿茂和顺吉回到正确的创作轨道。",
|
|
||||||
"guide": "一阶段:《这本小说…厉害吗?》(支线:天目锻冶屋、九十九物、观察同心们的工作)\n二阶段支线 A:《这本小说…有问题?》\n二阶段支线 B:《这本小说…好像看过?》(按顺序123依次交书即可)\n从剧情逻辑上来看,在一阶段支持编辑阿茂解锁刷到《这本小说…好像看过》的可能性,支持作家顺吉解锁刷到《这本小说…有问题》的可能性\n需要这三个每日都做完,且在 B 支线交付\n*视频成就",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1tu411C7jN?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"必须精进的武艺": {
|
|
||||||
"achievement": "同心训练家?",
|
|
||||||
"desc": "协助朝仓进行5次训练。",
|
|
||||||
"guide": "做 4 次每日委托《必须精进的武艺》后解锁世界任务《洗刷耻辱的一战》,完成世界任务后有机会刷到每日委托《永不停歇的修炼》,《必须精进的武艺》+《永不停歇的修炼》合计 5 次即可",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"永不停歇的修炼": {
|
|
||||||
"achievement": "同心训练家?",
|
|
||||||
"desc": "协助朝仓进行5次训练。",
|
|
||||||
"guide": "做 4 次每日委托《必须精进的武艺》后解锁世界任务《洗刷耻辱的一战》,完成世界任务后有机会刷到每日委托《永不停歇的修炼》,《必须精进的武艺》+《永不停歇的修炼》合计 5 次即可",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"每日委托《这本小说…有问题?》": {
|
|
||||||
"achievement": "至少有了个结局",
|
|
||||||
"desc": "听顺吉讲述完他所构思的故事。",
|
|
||||||
"guide": "需要在 2.1 版本后(2.0 版本做过的不算)重做《这本小说…有问题?》和《这本小说…好像看过?》才能解锁世界任务《故事构思法》 ,做完世界任务后得到成\n*视频成就",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1tu411C7jN?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"每日委托《这本小说…好像看过?》": {
|
|
||||||
"achievement": "至少有了个结局",
|
|
||||||
"desc": "听顺吉讲述完他所构思的故事。",
|
|
||||||
"guide": "需要在 2.1 版本后(2.0 版本做过的不算)重做《这本小说…有问题?》和《这本小说…好像看过?》才能解锁世界任务《故事构思法》 ,做完世界任务后得到成\n*视频成就",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1tu411C7jN?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"世界任务《故事构思法》": {
|
|
||||||
"achievement": "至少有了个结局",
|
|
||||||
"desc": "听顺吉讲述完他所构思的故事。",
|
|
||||||
"guide": "需要在 2.1 版本后(2.0 版本做过的不算)重做《这本小说…有问题?》和《这本小说…好像看过?》才能解锁世界任务《故事构思法》 ,做完世界任务后得到成\n*视频成就",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1tu411C7jN?spm_id_from=333.999.0.0"
|
|
||||||
},
|
|
||||||
"每日委托《神社大扫除》": {
|
|
||||||
"achievement": "她和她的猫",
|
|
||||||
"desc": "陪寝子前往影向山,寻找「阿响」的痕迹。",
|
|
||||||
"guide": "做完寝子系列的世界任务后,累积做 4 个寝子相关每日委托(指《神社大扫除》、《鱼之味》、《猫之迹》,大岛纯平那三个不算)后解锁世界任务《鸣神寻踪》,完成世界任务后解锁成就\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1T3411m7kJ"
|
|
||||||
},
|
|
||||||
"每日委托《鱼之味》": {
|
|
||||||
"achievement": "她和她的猫",
|
|
||||||
"desc": "陪寝子前往影向山,寻找「阿响」的痕迹。",
|
|
||||||
"guide": "做完寝子系列的世界任务后,累积做 4 个寝子相关每日委托(指《神社大扫除》、《鱼之味》、《猫之迹》,大岛纯平那三个不算)后解锁世界任务《鸣神寻踪》,完成世界任务后解锁成就\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1T3411m7kJ"
|
|
||||||
},
|
|
||||||
"每日委托《猫之迹》": {
|
|
||||||
"achievement": "她和她的猫",
|
|
||||||
"desc": "陪寝子前往影向山,寻找「阿响」的痕迹。",
|
|
||||||
"guide": "做完寝子系列的世界任务后,累积做 4 个寝子相关每日委托(指《神社大扫除》、《鱼之味》、《猫之迹》,大岛纯平那三个不算)后解锁世界任务《鸣神寻踪》,完成世界任务后解锁成就\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1T3411m7kJ"
|
|
||||||
},
|
|
||||||
"世界任务《鸣神寻踪》": {
|
|
||||||
"achievement": "她和她的猫",
|
|
||||||
"desc": "陪寝子前往影向山,寻找「阿响」的痕迹。",
|
|
||||||
"guide": "做完寝子系列的世界任务后,累积做 4 个寝子相关每日委托(指《神社大扫除》、《鱼之味》、《猫之迹》,大岛纯平那三个不算)后解锁世界任务《鸣神寻踪》,完成世界任务后解锁成就\n*视频地址",
|
|
||||||
"link": "https://www.bilibili.com/video/BV1T3411m7kJ"
|
|
||||||
},
|
|
||||||
"每日委托《鱼钩上的绝景?》": {
|
|
||||||
"achievement": "啊哈…什么上钩了?",
|
|
||||||
"desc": "与凯万一起钓起奇怪的东西…",
|
|
||||||
"guide": "累积做 3 次前置每日委托《鱼钩上的绝景?》,有墩墩桃、鸟蛋、蘑菇三种支线(注意是累积3次),第二天4点后解锁世界任务《鱼钩的物尽其用》,做完世界任务拿到成就。\n任务还有后续,但是无成就(可能未来版本会加后续成就)。\n做完世界任务以后有机会接到每日委托《鱼钩的奇异时光?》,和前边的也差不多,有帕蒂沙兰、香辛果、甜甜花三种支线",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"世界任务《鱼钩的物尽其用》": {
|
|
||||||
"achievement": "啊哈…什么上钩了?",
|
|
||||||
"desc": "与凯万一起钓起奇怪的东西…",
|
|
||||||
"guide": "累积做 3 次前置每日委托《鱼钩上的绝景?》,有墩墩桃、鸟蛋、蘑菇三种支线(注意是累积3次),第二天4点后解锁世界任务《鱼钩的物尽其用》,做完世界任务拿到成就。\n任务还有后续,但是无成就(可能未来版本会加后续成就)。\n做完世界任务以后有机会接到每日委托《鱼钩的奇异时光?》,和前边的也差不多,有帕蒂沙兰、香辛果、甜甜花三种支线",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"每日委托《鱼钩的奇异时光?》": {
|
|
||||||
"achievement": "啊哈…什么上钩了?",
|
|
||||||
"desc": "与凯万一起钓起奇怪的东西…",
|
|
||||||
"guide": "累积做 3 次前置每日委托《鱼钩上的绝景?》,有墩墩桃、鸟蛋、蘑菇三种支线(注意是累积3次),第二天4点后解锁世界任务《鱼钩的物尽其用》,做完世界任务拿到成就。\n任务还有后续,但是无成就(可能未来版本会加后续成就)。\n做完世界任务以后有机会接到每日委托《鱼钩的奇异时光?》,和前边的也差不多,有帕蒂沙兰、香辛果、甜甜花三种支线",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"吞金和蓄财": {
|
|
||||||
"achievement": "卡里米之蕈兽",
|
|
||||||
"desc": "见证哈特姆在「期货交易」大赚一笔!",
|
|
||||||
"guide": "全随机后续,正常需要做5次拿到2成就,最速欧皇可以3次拿2成就。\n2022/9/5更新:\n「吞金料理」中有3种料理:摩拉肉,黄油鸡和「堆高高」。\n建议选择美味的堆高高。\n2022/9/16更新:\n现在发现变成了随机后续,给任何料理都会触发任意成就,原本应该给2次料理2个成就的,也可以1次料理2成就。",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"喵…喵喵?喵!喵。": {
|
|
||||||
"achievement": "捉猫记",
|
|
||||||
"desc": "帮莎莉寻找过所有小猫。",
|
|
||||||
"guide": "至少要做 3 次,正确完成寻找 3 只不同小猫的支线\n「黑白色」的猫「拉勒」:【喵,喵喵喵,喵——】\n「深灰色」的猫「纳尔吉斯」:【喵!喵喵,喵】\n「灰黑条纹」的猫「萝赞」:【喵喵喵,喵喵喵】",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"世界任务《加尔恰的赞歌》": {
|
|
||||||
"achievement": "推分算数原理",
|
|
||||||
"desc": "帮助加尔恰完善他的机器。",
|
|
||||||
"guide": "推测需要先完后璃月望舒客栈的世界任务《加尔恰的赞歌》后才能在须弥接到这系列每日委托。\n《举手之劳》里,正确选项:【二次入炉的时候,燃料记得加多点。】【从内向外敲打。】\n做完《某人的回响》后应该可以拿到成就,同时解锁后续世界任务",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"每日委托《加尔恰的赞歌·关键物品》": {
|
|
||||||
"achievement": "推分算数原理",
|
|
||||||
"desc": "帮助加尔恰完善他的机器。",
|
|
||||||
"guide": "推测需要先完后璃月望舒客栈的世界任务《加尔恰的赞歌》后才能在须弥接到这系列每日委托。\n《举手之劳》里,正确选项:【二次入炉的时候,燃料记得加多点。】【从内向外敲打。】\n做完《某人的回响》后应该可以拿到成就,同时解锁后续世界任务",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"每日委托《加尔恰的赞歌·替代物》": {
|
|
||||||
"achievement": "推分算数原理",
|
|
||||||
"desc": "帮助加尔恰完善他的机器。",
|
|
||||||
"guide": "推测需要先完后璃月望舒客栈的世界任务《加尔恰的赞歌》后才能在须弥接到这系列每日委托。\n《举手之劳》里,正确选项:【二次入炉的时候,燃料记得加多点。】【从内向外敲打。】\n做完《某人的回响》后应该可以拿到成就,同时解锁后续世界任务",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"每日委托《加尔恰的赞歌·轴承在上》": {
|
|
||||||
"achievement": "推分算数原理",
|
|
||||||
"desc": "帮助加尔恰完善他的机器。",
|
|
||||||
"guide": "推测需要先完后璃月望舒客栈的世界任务《加尔恰的赞歌》后才能在须弥接到这系列每日委托。\n《举手之劳》里,正确选项:【二次入炉的时候,燃料记得加多点。】【从内向外敲打。】\n做完《某人的回响》后应该可以拿到成就,同时解锁后续世界任务",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"每日委托《加尔恰的赞歌·举手之劳》": {
|
|
||||||
"achievement": "推分算数原理",
|
|
||||||
"desc": "帮助加尔恰完善他的机器。",
|
|
||||||
"guide": "推测需要先完后璃月望舒客栈的世界任务《加尔恰的赞歌》后才能在须弥接到这系列每日委托。\n《举手之劳》里,正确选项:【二次入炉的时候,燃料记得加多点。】【从内向外敲打。】\n做完《某人的回响》后应该可以拿到成就,同时解锁后续世界任务",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"每日委托《加尔恰的赞歌·某人的回响》": {
|
|
||||||
"achievement": "推分算数原理",
|
|
||||||
"desc": "帮助加尔恰完善他的机器。",
|
|
||||||
"guide": "推测需要先完后璃月望舒客栈的世界任务《加尔恰的赞歌》后才能在须弥接到这系列每日委托。\n《举手之劳》里,正确选项:【二次入炉的时候,燃料记得加多点。】【从内向外敲打。】\n做完《某人的回响》后应该可以拿到成就,同时解锁后续世界任务",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"世界任务《加尔恰的赞歌·适配性赠礼》": {
|
|
||||||
"achievement": "推分算数原理",
|
|
||||||
"desc": "帮助加尔恰完善他的机器。",
|
|
||||||
"guide": "推测需要先完后璃月望舒客栈的世界任务《加尔恰的赞歌》后才能在须弥接到这系列每日委托。\n《举手之劳》里,正确选项:【二次入炉的时候,燃料记得加多点。】【从内向外敲打。】\n做完《某人的回响》后应该可以拿到成就,同时解锁后续世界任务",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"御用在他乡": {
|
|
||||||
"achievement": "「为了工作。」",
|
|
||||||
"desc": "为范兵卫采到更多的蘑菇。",
|
|
||||||
"guide": "每日委托《御用在他乡》\n√完结!\n可以一次性拿到成就 :要求采5个蘑菇,但可以采7个给成就\n推测需要先做完稻妻的世界任务《踏鞴物语》系列才能在须弥接到这个委托。\n做完第一次以后他以后还会让你摘蘑菇,对话内容会有些变化",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"谨遵医嘱": {
|
|
||||||
"achievement": "放松疗法",
|
|
||||||
"desc": "满足三个病人的愿望。",
|
|
||||||
"guide": "《洁净与健康》不是前置任务,可以直接刷到了《谨遵医嘱》\n《谨遵医嘱》这个任务是你和病人对话完成就可以回去交差了的,但这样拿不到成就。你需要:\n细节:① 主动为古尔根清理田里的杂草,清理完以后再次与古尔根对话;② 阿兹拉说药太苦,和她对话,送给她【糖】;③ 阿夫塔想吃肉,给他【美味的烤肉排】。\n满足病人的愿望以后再回去交差。其中阿兹拉和阿夫塔不会主动问你要东西,需要你听完他们的话以后再次与他们对话来交付道具",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"生不出的花": {
|
|
||||||
"achievement": "斩花除根",
|
|
||||||
"desc": "找到并打倒逃走的骗骗花。",
|
|
||||||
"guide": "前置累积3次《生不出的花》后,后续出《花开之时》,\n随机后续1,有骗骗花的支线才有成就,追击并干掉骗骗花后获得成就。\n随机后续2,无骗骗花,寄了,再来3次……\n细节:前置有 2 个支线,一个是提供肥料,另一个是浇水。",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"花开之时": {
|
|
||||||
"achievement": "斩花除根",
|
|
||||||
"desc": "找到并打倒逃走的骗骗花。",
|
|
||||||
"guide": "前置累积3次《生不出的花》后,后续出《花开之时》,\n随机后续1,有骗骗花的支线才有成就,追击并干掉骗骗花后获得成就。\n随机后续2,无骗骗花,寄了,再来3次……\n细节:前置有 2 个支线,一个是提供肥料,另一个是浇水。",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"衡量世界之人!": {
|
|
||||||
"achievement": "天有多高,地有多…",
|
|
||||||
"desc": "协助法伽尼进行测量工作。",
|
|
||||||
"guide": "1和2分支都是随机给的,其中分支1还有3种怪:丘丘人、蕈兽、遗迹蛇\n至少做 3 次,分别是:① 打怪;② 设置信标;③ 回收信标+打怪。",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"宝贝计划": {
|
|
||||||
"achievement": "非必要需求",
|
|
||||||
"desc": "找到古拉布吉尔给小蛇制作的所有道具。",
|
|
||||||
"guide": "帮古拉布吉尔找宠物蛇口粮,有 5 个支线。任务是你找到【古拉布吉尔的特制宠物蛇口粮】交给 NPC 就可以完成,但是做成就需要你额外找到 3 个东西:【奇怪的珠子】、【奇怪的小型帽子】、【破旧的架子】。\n每次随机给1个隐藏道具,但是也可能没有。",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"问题的转化": {
|
|
||||||
"achievement": "船说了算",
|
|
||||||
"desc": "与拉菲克成功地测试了船体强度。",
|
|
||||||
"guide": "目前第三段就可以拿到成就,但是还有后续,可能未来版本还有成就。\n(类似稻妻八重堂作家和编辑《小说有问题》在后续版本上线新成就。)\n细节:在《问题的转化·理论强度》中拿5块木头,这样在《问题的转化·负载问题》中可以成功拿到成就,失败的支线可能会退回到第二阶段。",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"问题的转化·理论强度": {
|
|
||||||
"achievement": "船说了算",
|
|
||||||
"desc": "与拉菲克成功地测试了船体强度。",
|
|
||||||
"guide": "目前第三段就可以拿到成就,但是还有后续,可能未来版本还有成就。\n(类似稻妻八重堂作家和编辑《小说有问题》在后续版本上线新成就。)\n细节:在《问题的转化·理论强度》中拿5块木头,这样在《问题的转化·负载问题》中可以成功拿到成就,失败的支线可能会退回到第二阶段。",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"问题的转化·负载问题": {
|
|
||||||
"achievement": "船说了算",
|
|
||||||
"desc": "与拉菲克成功地测试了船体强度。",
|
|
||||||
"guide": "目前第三段就可以拿到成就,但是还有后续,可能未来版本还有成就。\n(类似稻妻八重堂作家和编辑《小说有问题》在后续版本上线新成就。)\n细节:在《问题的转化·理论强度》中拿5块木头,这样在《问题的转化·负载问题》中可以成功拿到成就,失败的支线可能会退回到第二阶段。",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"问题的转化·关键在何?": {
|
|
||||||
"achievement": "船说了算",
|
|
||||||
"desc": "与拉菲克成功地测试了船体强度。",
|
|
||||||
"guide": "目前第三段就可以拿到成就,但是还有后续,可能未来版本还有成就。\n(类似稻妻八重堂作家和编辑《小说有问题》在后续版本上线新成就。)\n细节:在《问题的转化·理论强度》中拿5块木头,这样在《问题的转化·负载问题》中可以成功拿到成就,失败的支线可能会退回到第二阶段。",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"食与学": {
|
|
||||||
"achievement": "问题何在?",
|
|
||||||
"desc": "享受三道贾法尔制作的料理。",
|
|
||||||
"guide": "每次随机给一个。\n完成 3 个支线:薄荷豆汤、绿汁脆球、烤肉卷",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"教令院,小问题": {
|
|
||||||
"achievement": "须弥博学者",
|
|
||||||
"desc": "答对六道不同的问题。",
|
|
||||||
"guide": "总共 6 道题,每次抽 3 道,正确答案分别是:1、阿弥利多学院;2、悉般多摩学院;3、圣树;4、防沙壁;5、驮兽;6、蕈兽",
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"跑,希尔米,跑": {
|
|
||||||
"achievement": "一步之遥",
|
|
||||||
"desc": "在与希尔米的赛跑中大意落败…",
|
|
||||||
"guide": null,
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"良药难求": {
|
|
||||||
"achievement": "医用笔迹",
|
|
||||||
"desc": "帮助马鲁夫正确地解析药方。",
|
|
||||||
"guide": null,
|
|
||||||
"link": ""
|
|
||||||
},
|
|
||||||
"沙上花·余香": {
|
|
||||||
"achievement": "手有余香",
|
|
||||||
"desc": "见证内尔敏的故事。",
|
|
||||||
"guide": null,
|
|
||||||
"link": ""
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,62 +0,0 @@
|
|||||||
import re
|
|
||||||
|
|
||||||
from .template import all_achi, daily_achi, achi_template, daily_template
|
|
||||||
|
|
||||||
|
|
||||||
async def get_daily_achi(task: str) -> str:
|
|
||||||
_similarity = 0
|
|
||||||
detail = {}
|
|
||||||
if task in daily_achi:
|
|
||||||
detail = daily_achi[task]
|
|
||||||
else:
|
|
||||||
for _task in daily_achi:
|
|
||||||
__task = ''.join(re.findall('[\u4e00-\u9fa5]', _task))
|
|
||||||
__task = __task.replace('每日委托', '').replace('世界任务', '')
|
|
||||||
similarity = len(set(__task) & set(task))
|
|
||||||
if similarity >= len(__task) / 2:
|
|
||||||
if similarity > _similarity:
|
|
||||||
_similarity = similarity
|
|
||||||
detail = daily_achi[_task]
|
|
||||||
task = _task
|
|
||||||
else:
|
|
||||||
if detail == {}:
|
|
||||||
return '该委托暂无成就...'
|
|
||||||
|
|
||||||
achi = detail['achievement']
|
|
||||||
desc = detail['desc']
|
|
||||||
guide = detail['guide']
|
|
||||||
link = detail['link']
|
|
||||||
|
|
||||||
im = daily_template.format(task, achi, desc, guide)
|
|
||||||
im = f'{im}\n{link}' if link else im
|
|
||||||
return im
|
|
||||||
|
|
||||||
|
|
||||||
async def get_achi(achi: str) -> str:
|
|
||||||
_similarity = 0
|
|
||||||
detail = {}
|
|
||||||
if achi in all_achi:
|
|
||||||
detail = all_achi[achi]
|
|
||||||
else:
|
|
||||||
for _achi in all_achi:
|
|
||||||
__achi = ''.join(re.findall('[\u4e00-\u9fa5]', _achi))
|
|
||||||
__achi = __achi.replace('每日委托', '').replace('世界任务', '')
|
|
||||||
similarity = len(set(__achi) & set(achi))
|
|
||||||
if similarity >= len(__achi) / 2:
|
|
||||||
if similarity > _similarity:
|
|
||||||
_similarity = similarity
|
|
||||||
detail = all_achi[_achi]
|
|
||||||
achi = _achi
|
|
||||||
else:
|
|
||||||
if detail == {}:
|
|
||||||
return '暂无该成就...'
|
|
||||||
|
|
||||||
book = detail['book']
|
|
||||||
desc = detail['desc']
|
|
||||||
guide = detail['guide']
|
|
||||||
link = detail['link']
|
|
||||||
|
|
||||||
im = achi_template.format(book, achi, desc)
|
|
||||||
im = f'{im}\n{guide}' if guide else im
|
|
||||||
im = f'{im}\n{link}' if link else im
|
|
||||||
return im
|
|
@ -1,20 +0,0 @@
|
|||||||
import json
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
path = Path(__file__).parent
|
|
||||||
with open(path / 'all_achi.json', "r", encoding='UTF-8') as f:
|
|
||||||
all_achi = json.load(f)
|
|
||||||
|
|
||||||
with open(path / 'daily_achi.json', "r", encoding='UTF-8') as f:
|
|
||||||
daily_achi = json.load(f)
|
|
||||||
|
|
||||||
daily_template = '''任务:【{}】
|
|
||||||
成就:【{}】
|
|
||||||
描述:【{}】
|
|
||||||
攻略:【{}】
|
|
||||||
'''
|
|
||||||
|
|
||||||
achi_template = '''合辑:【{}】
|
|
||||||
成就:【{}】
|
|
||||||
描述:【{}】
|
|
||||||
'''
|
|
@ -1,15 +0,0 @@
|
|||||||
from gsuid_core.sv import SV
|
|
||||||
from gsuid_core.server import Bot
|
|
||||||
from gsuid_core.models import MessageContent
|
|
||||||
|
|
||||||
from .get_adv import char_adv, weapon_adv
|
|
||||||
|
|
||||||
|
|
||||||
@SV('文字推荐').on_suffix(('用什么', '能用啥', '怎么养'))
|
|
||||||
async def send_char_adv(bot: Bot, msg: MessageContent):
|
|
||||||
await bot.send(await char_adv(msg.text))
|
|
||||||
|
|
||||||
|
|
||||||
@SV('文字推荐').on_suffix(('能给谁', '谁能用'))
|
|
||||||
async def send_weapon_adv(bot: Bot, msg: MessageContent):
|
|
||||||
await bot.send(await weapon_adv(msg.text))
|
|
File diff suppressed because it is too large
Load Diff
@ -1,75 +0,0 @@
|
|||||||
import json
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
with open(
|
|
||||||
Path(__file__).parent / 'char_adv_list.json', "r", encoding='UTF-8'
|
|
||||||
) as f:
|
|
||||||
adv_lst = json.load(f)
|
|
||||||
|
|
||||||
|
|
||||||
async def weapon_adv(name):
|
|
||||||
weapons = {}
|
|
||||||
artifacts = {}
|
|
||||||
for char, info in adv_lst.items():
|
|
||||||
char_weapons = []
|
|
||||||
char_artifacts = []
|
|
||||||
|
|
||||||
for i in info['weapon'].values(): # 3 stars, 4 stars, 5 stars
|
|
||||||
char_weapons.extend(i)
|
|
||||||
for i in info['artifact']:
|
|
||||||
char_artifacts.extend(i)
|
|
||||||
# char_artifacts = list(set(char_artifacts))
|
|
||||||
|
|
||||||
for weapon_name in char_weapons:
|
|
||||||
if name in weapon_name: # fuzzy search
|
|
||||||
char_weapon = weapons.get(weapon_name, [])
|
|
||||||
char_weapon.append(char)
|
|
||||||
weapons[weapon_name] = char_weapon
|
|
||||||
for artifact_name in char_artifacts:
|
|
||||||
if name in artifact_name: # fuzzy search
|
|
||||||
char_artifact = artifacts.get(artifact_name, [])
|
|
||||||
char_artifact.append(char)
|
|
||||||
char_artifact = list(set(char_artifact))
|
|
||||||
artifacts[artifact_name] = char_artifact
|
|
||||||
|
|
||||||
im = []
|
|
||||||
if weapons:
|
|
||||||
im.append('✨武器:')
|
|
||||||
for k, v in weapons.items():
|
|
||||||
im.append(f'{"、".join(v)} 可能会用到【{k}】')
|
|
||||||
if artifacts:
|
|
||||||
im.append('✨圣遗物:')
|
|
||||||
for k, v in artifacts.items():
|
|
||||||
im.append(f'{"、".join(v)} 可能会用到【{k}】')
|
|
||||||
if im == []:
|
|
||||||
im = '没有角色能使用【{}】'.format(name)
|
|
||||||
else:
|
|
||||||
im = '\n'.join(im)
|
|
||||||
return im
|
|
||||||
|
|
||||||
|
|
||||||
async def char_adv(name):
|
|
||||||
for char, info in adv_lst.items():
|
|
||||||
if name in char:
|
|
||||||
im = [f'「{char}」', '-=-=-=-=-=-=-=-=-=-']
|
|
||||||
if weapon_5 := info['weapon']['5']:
|
|
||||||
im.append(f'推荐5★武器:{"、".join(weapon_5)}')
|
|
||||||
if weapon_4 := info['weapon']['4']:
|
|
||||||
im.append(f'推荐4★武器:{"、".join(weapon_4)}')
|
|
||||||
if weapon_3 := info['weapon']['3']:
|
|
||||||
im.append(f'推荐3★武器:{"、".join(weapon_3)}')
|
|
||||||
if artifacts := info['artifact']:
|
|
||||||
im.append('推荐圣遗物搭配:')
|
|
||||||
for arti in artifacts:
|
|
||||||
if len(arti) > 1:
|
|
||||||
im.append(f'[{arti[0]}]两件套 + [{arti[1]}]两件套')
|
|
||||||
else:
|
|
||||||
im.append(f'[{arti[0]}]四件套')
|
|
||||||
if remark := info['remark']:
|
|
||||||
im.append('-=-=-=-=-=-=-=-=-=-')
|
|
||||||
im.append('备注:')
|
|
||||||
mark = "\n".join(remark)
|
|
||||||
im.append(f'{mark}')
|
|
||||||
return '\n'.join(im)
|
|
||||||
|
|
||||||
return '没有找到角色信息'
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,261 +0,0 @@
|
|||||||
import sys
|
|
||||||
import json
|
|
||||||
import asyncio
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
import httpx
|
|
||||||
|
|
||||||
sys.path.append(str(Path(__file__).parents[1]))
|
|
||||||
from version import Genshin_version # noqa: E402
|
|
||||||
from utils.ambr_api.convert_ambr_data import ( # noqa: E402
|
|
||||||
convert_ambr_to_minigg,
|
|
||||||
)
|
|
||||||
|
|
||||||
R_PATH = Path(__file__).parents[0]
|
|
||||||
MAP_PATH = Path(__file__).parents[1] / 'utils' / 'enka_api' / 'map'
|
|
||||||
DATA_PATH = R_PATH / 'gs_data'
|
|
||||||
WEAPON_TYPE = {
|
|
||||||
"WEAPON_POLE": "长柄武器",
|
|
||||||
"WEAPON_BOW": "弓",
|
|
||||||
"WEAPON_SWORD_ONE_HAND": "单手剑",
|
|
||||||
"WEAPON_CLAYMORE": "双手剑",
|
|
||||||
"WEAPON_CATALYST": "法器",
|
|
||||||
}
|
|
||||||
|
|
||||||
version = Genshin_version
|
|
||||||
|
|
||||||
avatarName2Element_fileName = f'avatarName2Element_mapping_{version}.json'
|
|
||||||
weaponHash2Name_fileName = f'weaponHash2Name_mapping_{version}.json'
|
|
||||||
weaponHash2Type_fileName = f'weaponHash2Type_mapping_{version}.json'
|
|
||||||
skillId2Name_fileName = f'skillId2Name_mapping_{version}.json'
|
|
||||||
talentId2Name_fileName = f'talentId2Name_mapping_{version}.json'
|
|
||||||
avatarId2Name_fileName = f'avatarId2Name_mapping_{version}.json'
|
|
||||||
enName2Id_fileName = f'enName2AvatarID_mapping_{version}.json'
|
|
||||||
avatarId2Star_fileName = f'avatarId2Star_mapping_{version}.json'
|
|
||||||
avatarName2Weapon_fileName = f'avatarName2Weapon_mapping_{version}.json'
|
|
||||||
|
|
||||||
artifact2attr_fileName = f'artifact2attr_mapping_{version}.json'
|
|
||||||
icon2Name_fileName = f'icon2Name_mapping_{version}.json'
|
|
||||||
|
|
||||||
try:
|
|
||||||
with open(DATA_PATH / 'textMap.json', "r", encoding='UTF-8') as f:
|
|
||||||
raw_data = json.load(f)
|
|
||||||
except FileNotFoundError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
BETA_CHAR = {
|
|
||||||
'10000078': '艾尔海森',
|
|
||||||
'10000077': '瑶瑶',
|
|
||||||
'10000079': '迪希雅',
|
|
||||||
'10000080': '米卡',
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
async def avatarId2NameJson() -> None:
|
|
||||||
with open(
|
|
||||||
DATA_PATH / 'AvatarExcelConfigData.json', "r", encoding='UTF-8'
|
|
||||||
) as f:
|
|
||||||
avatar_data = json.load(f)
|
|
||||||
|
|
||||||
temp = {}
|
|
||||||
for i in avatar_data:
|
|
||||||
temp[str(i['id'])] = raw_data[str(i['nameTextMapHash'])]
|
|
||||||
|
|
||||||
for _id in BETA_CHAR:
|
|
||||||
temp[_id] = BETA_CHAR[_id]
|
|
||||||
|
|
||||||
result = {}
|
|
||||||
for _id in temp:
|
|
||||||
if int(_id) >= 11000000:
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
result[_id] = temp[_id]
|
|
||||||
|
|
||||||
with open(
|
|
||||||
MAP_PATH / avatarId2Name_fileName, 'w', encoding='UTF-8'
|
|
||||||
) as file:
|
|
||||||
json.dump(result, file, ensure_ascii=False)
|
|
||||||
|
|
||||||
|
|
||||||
async def avatarName2ElementJson() -> None:
|
|
||||||
with open(MAP_PATH / avatarId2Name_fileName, "r", encoding='UTF-8') as f:
|
|
||||||
avatarId2Name = json.load(f)
|
|
||||||
|
|
||||||
temp = {}
|
|
||||||
enName2Id_result = {}
|
|
||||||
avatarId2Star_result = {}
|
|
||||||
avatarName2Weapon_result = {}
|
|
||||||
elementMap = {
|
|
||||||
'风': 'Anemo',
|
|
||||||
'岩': 'Geo',
|
|
||||||
'草': 'Dendro',
|
|
||||||
'火': 'Pyro',
|
|
||||||
'水': 'Hydro',
|
|
||||||
'冰': 'Cryo',
|
|
||||||
'雷': 'Electro',
|
|
||||||
}
|
|
||||||
for _id in avatarId2Name:
|
|
||||||
print(_id)
|
|
||||||
if _id in ['10000005', '10000007'] or int(_id) >= 11000000:
|
|
||||||
continue
|
|
||||||
name = avatarId2Name[_id]
|
|
||||||
data = httpx.get(
|
|
||||||
f'https://info.minigg.cn/characters?query={name}'
|
|
||||||
).json()
|
|
||||||
if 'errcode' in data:
|
|
||||||
data = await convert_ambr_to_minigg(_id)
|
|
||||||
if data is not None and 'code' not in data:
|
|
||||||
temp[name] = elementMap[data['element']]
|
|
||||||
enName = data['images']['namesideicon'].split('_')[-1]
|
|
||||||
enName2Id_result[enName] = _id
|
|
||||||
avatarId2Star_result[int(_id)] = str(data['rarity'])
|
|
||||||
avatarName2Weapon_result[data['name']] = data['weapontype']
|
|
||||||
|
|
||||||
avatarId2Star_result['10000005'] = '5'
|
|
||||||
avatarId2Star_result['10000007'] = '5'
|
|
||||||
avatarName2Weapon_result['旅行者'] = '单手剑'
|
|
||||||
|
|
||||||
with open(MAP_PATH / enName2Id_fileName, 'w', encoding='UTF-8') as file:
|
|
||||||
json.dump(enName2Id_result, file, ensure_ascii=False)
|
|
||||||
|
|
||||||
with open(
|
|
||||||
MAP_PATH / avatarId2Star_fileName, 'w', encoding='UTF-8'
|
|
||||||
) as file:
|
|
||||||
json.dump(avatarId2Star_result, file, ensure_ascii=False)
|
|
||||||
|
|
||||||
with open(
|
|
||||||
MAP_PATH / avatarName2Element_fileName, 'w', encoding='UTF-8'
|
|
||||||
) as file:
|
|
||||||
json.dump(temp, file, ensure_ascii=False)
|
|
||||||
|
|
||||||
with open(
|
|
||||||
MAP_PATH / avatarName2Weapon_fileName, 'w', encoding='UTF-8'
|
|
||||||
) as file:
|
|
||||||
json.dump(avatarName2Weapon_result, file, ensure_ascii=False)
|
|
||||||
|
|
||||||
|
|
||||||
async def weaponHash2NameJson() -> None:
|
|
||||||
with open(
|
|
||||||
DATA_PATH / 'WeaponExcelConfigData.json', "r", encoding='UTF-8'
|
|
||||||
) as f:
|
|
||||||
weapon_data = json.load(f)
|
|
||||||
temp = {
|
|
||||||
str(i['nameTextMapHash']): raw_data[str(i['nameTextMapHash'])]
|
|
||||||
for i in weapon_data
|
|
||||||
if str(i['nameTextMapHash']) in raw_data
|
|
||||||
}
|
|
||||||
|
|
||||||
with open(
|
|
||||||
MAP_PATH / weaponHash2Name_fileName, 'w', encoding='UTF-8'
|
|
||||||
) as file:
|
|
||||||
json.dump(temp, file, ensure_ascii=False)
|
|
||||||
|
|
||||||
|
|
||||||
async def weaponHash2TypeJson() -> None:
|
|
||||||
with open(
|
|
||||||
DATA_PATH / 'WeaponExcelConfigData.json', "r", encoding='UTF-8'
|
|
||||||
) as f:
|
|
||||||
weapon_data = json.load(f)
|
|
||||||
temp = {
|
|
||||||
str(i['nameTextMapHash']): WEAPON_TYPE.get(i['weaponType'], "")
|
|
||||||
for i in weapon_data
|
|
||||||
}
|
|
||||||
|
|
||||||
with open(
|
|
||||||
MAP_PATH / weaponHash2Type_fileName, 'w', encoding='UTF-8'
|
|
||||||
) as file:
|
|
||||||
json.dump(temp, file, ensure_ascii=False)
|
|
||||||
|
|
||||||
|
|
||||||
async def skillId2NameJson() -> None:
|
|
||||||
with open(
|
|
||||||
DATA_PATH / 'AvatarSkillExcelConfigData.json', "r", encoding='UTF-8'
|
|
||||||
) as f:
|
|
||||||
skill_data = json.load(f)
|
|
||||||
|
|
||||||
temp = {'Name': {}, 'Icon': {}}
|
|
||||||
for i in skill_data:
|
|
||||||
if str(i['nameTextMapHash']) in raw_data:
|
|
||||||
temp['Name'][str(i['id'])] = raw_data[str(i['nameTextMapHash'])]
|
|
||||||
temp['Icon'][str(i['id'])] = i['skillIcon']
|
|
||||||
|
|
||||||
with open(MAP_PATH / skillId2Name_fileName, 'w', encoding='UTF-8') as file:
|
|
||||||
json.dump(temp, file, ensure_ascii=False)
|
|
||||||
|
|
||||||
|
|
||||||
async def talentId2NameJson() -> None:
|
|
||||||
with open(
|
|
||||||
DATA_PATH / 'AvatarTalentExcelConfigData.json', "r", encoding='UTF-8'
|
|
||||||
) as f:
|
|
||||||
talent_data = json.load(f)
|
|
||||||
|
|
||||||
temp = {'Name': {}, 'Icon': {}}
|
|
||||||
for i in talent_data:
|
|
||||||
temp['Name'][str(i['talentId'])] = raw_data[str(i['nameTextMapHash'])]
|
|
||||||
temp['Icon'][str(i['talentId'])] = i['icon']
|
|
||||||
|
|
||||||
with open(
|
|
||||||
MAP_PATH / talentId2Name_fileName, 'w', encoding='UTF-8'
|
|
||||||
) as file:
|
|
||||||
json.dump(temp, file, ensure_ascii=False)
|
|
||||||
|
|
||||||
|
|
||||||
async def artifact2attrJson() -> None:
|
|
||||||
with open(
|
|
||||||
DATA_PATH / 'ReliquaryExcelConfigData.json', "r", encoding='UTF-8'
|
|
||||||
) as f:
|
|
||||||
reliquary_data = json.load(f)
|
|
||||||
|
|
||||||
with open(
|
|
||||||
DATA_PATH / 'DisplayItemExcelConfigData.json', "r", encoding='UTF-8'
|
|
||||||
) as f:
|
|
||||||
Display_data = json.load(f)
|
|
||||||
|
|
||||||
temp = {}
|
|
||||||
for i in reliquary_data:
|
|
||||||
temp[str(i['icon'])] = raw_data[str(i['nameTextMapHash'])]
|
|
||||||
|
|
||||||
temp['UI_RelicIcon_10001_1'] = '异国之盏'
|
|
||||||
temp['UI_RelicIcon_10001_2'] = '归乡之羽'
|
|
||||||
temp['UI_RelicIcon_10001_3'] = '感别之冠'
|
|
||||||
temp['UI_RelicIcon_10001_4'] = '故人之心'
|
|
||||||
temp['UI_RelicIcon_10001_5'] = '逐光之石'
|
|
||||||
with open(MAP_PATH / icon2Name_fileName, 'w', encoding='UTF-8') as file:
|
|
||||||
json.dump(temp, file, ensure_ascii=False)
|
|
||||||
|
|
||||||
temp2 = {}
|
|
||||||
for i in Display_data:
|
|
||||||
if i['icon'].startswith('UI_RelicIcon'):
|
|
||||||
temp2[raw_data[str(i['nameTextMapHash'])]] = '_'.join(
|
|
||||||
i['icon'].split('_')[:-1]
|
|
||||||
)
|
|
||||||
|
|
||||||
temp3 = {}
|
|
||||||
for i in temp:
|
|
||||||
for k in temp2:
|
|
||||||
if i.startswith(temp2[k]):
|
|
||||||
temp3[temp[i]] = k
|
|
||||||
|
|
||||||
temp3['异国之盏'] = '行者之心'
|
|
||||||
temp3['归乡之羽'] = '行者之心'
|
|
||||||
temp3['感别之冠'] = '行者之心'
|
|
||||||
temp3['故人之心'] = '行者之心'
|
|
||||||
temp3['逐光之石'] = '行者之心'
|
|
||||||
|
|
||||||
with open(
|
|
||||||
MAP_PATH / artifact2attr_fileName, 'w', encoding='UTF-8'
|
|
||||||
) as file:
|
|
||||||
json.dump(temp3, file, ensure_ascii=False)
|
|
||||||
|
|
||||||
|
|
||||||
async def main():
|
|
||||||
await avatarId2NameJson()
|
|
||||||
await avatarName2ElementJson()
|
|
||||||
await weaponHash2NameJson()
|
|
||||||
await skillId2NameJson()
|
|
||||||
await talentId2NameJson()
|
|
||||||
await weaponHash2TypeJson()
|
|
||||||
await artifact2attrJson()
|
|
||||||
|
|
||||||
|
|
||||||
asyncio.run(main())
|
|
@ -1,44 +0,0 @@
|
|||||||
from pathlib import Path
|
|
||||||
|
|
||||||
import httpx
|
|
||||||
|
|
||||||
char_list = ['Dehya', 'Mika']
|
|
||||||
title = 'https://api.ambr.top/assets/UI/{}'
|
|
||||||
# title = 'https://enka.network/ui/{}'
|
|
||||||
icon_list = [
|
|
||||||
'Skill_E_{}_01.png',
|
|
||||||
'Skill_E_{}_02.png',
|
|
||||||
'Skill_S_{}_01.png',
|
|
||||||
'Skill_S_{}_02.png',
|
|
||||||
'UI_Talent_S_{}_01.png',
|
|
||||||
'UI_Talent_S_{}_02.png',
|
|
||||||
'UI_Talent_S_{}_03.png',
|
|
||||||
'UI_Talent_S_{}_04.png',
|
|
||||||
'UI_Talent_S_{}_05.png',
|
|
||||||
'UI_Talent_S_{}_06.png',
|
|
||||||
'UI_Talent_S_{}_07.png',
|
|
||||||
'UI_Talent_U_{}_01.png',
|
|
||||||
'UI_Talent_U_{}_02.png',
|
|
||||||
'UI_Talent_C_{}_01.png',
|
|
||||||
'UI_Talent_C_{}_02.png',
|
|
||||||
'UI_Gacha_AvatarImg_{}.png',
|
|
||||||
]
|
|
||||||
is_download = True
|
|
||||||
|
|
||||||
for char in char_list:
|
|
||||||
for icon in icon_list:
|
|
||||||
icon_name = icon.format(char)
|
|
||||||
url = title.format(icon_name)
|
|
||||||
print(url)
|
|
||||||
if is_download:
|
|
||||||
print(f'正在下载{icon_name}')
|
|
||||||
char_data = httpx.get(url, follow_redirects=True, timeout=80)
|
|
||||||
if char_data.headers['Content-Type'] == 'image/png':
|
|
||||||
char_bytes = char_data.content
|
|
||||||
else:
|
|
||||||
print(f'{icon_name}不存在,跳过!')
|
|
||||||
continue
|
|
||||||
img_data = httpx.get(url).content
|
|
||||||
with open(Path(__file__).parent / icon_name, '+wb') as handler:
|
|
||||||
handler.write(char_bytes)
|
|
||||||
print('下载成功!')
|
|
@ -1,50 +0,0 @@
|
|||||||
import copy
|
|
||||||
import json
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from openpyxl import load_workbook
|
|
||||||
|
|
||||||
sample = {
|
|
||||||
'weapon': {'5': [], '4': [], '3': []},
|
|
||||||
'artifact': [], # list[list[str,Optional[str]]] 四件套 / 2+2
|
|
||||||
'remark': [],
|
|
||||||
}
|
|
||||||
|
|
||||||
char_json = {}
|
|
||||||
|
|
||||||
path = Path(__file__).parents[1] / 'genshinuid_adv'
|
|
||||||
|
|
||||||
wb = load_workbook(str(path / 'Genshin All Char.xlsx'))
|
|
||||||
ws = wb.active
|
|
||||||
for char_i in range(2, 336, 5): # 角色行
|
|
||||||
char = ws.cell(char_i, 1).value
|
|
||||||
if not isinstance(char, str):
|
|
||||||
continue
|
|
||||||
char_name = char.replace('\n', '')
|
|
||||||
char_sample = copy.deepcopy(sample)
|
|
||||||
for i in range(5):
|
|
||||||
row = i + char_i
|
|
||||||
|
|
||||||
if star_5 := ws.cell(row, 2).value:
|
|
||||||
char_sample['weapon']['5'].append(star_5)
|
|
||||||
if star_4 := ws.cell(row, 3).value:
|
|
||||||
char_sample['weapon']['4'].append(star_4)
|
|
||||||
if star_3 := ws.cell(row, 4).value:
|
|
||||||
char_sample['weapon']['3'].append(star_3)
|
|
||||||
|
|
||||||
artifact = []
|
|
||||||
if arti_1 := ws.cell(row, 5).value:
|
|
||||||
artifact.append(arti_1)
|
|
||||||
if arti_2 := ws.cell(row, 6).value:
|
|
||||||
artifact.append(arti_2)
|
|
||||||
if artifact:
|
|
||||||
char_sample['artifact'].append(artifact)
|
|
||||||
|
|
||||||
if remark := ws.cell(row, 7).value:
|
|
||||||
if row > 7:
|
|
||||||
char_sample['remark'].append(remark)
|
|
||||||
|
|
||||||
char_json[char_name] = char_sample
|
|
||||||
|
|
||||||
with open(str(path / 'char_adv_list.json'), 'w', encoding='utf-8') as f:
|
|
||||||
json.dump(char_json, f, indent=2, ensure_ascii=False)
|
|
@ -1,29 +0,0 @@
|
|||||||
import json
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from openpyxl import load_workbook
|
|
||||||
from openpyxl.worksheet.worksheet import Worksheet
|
|
||||||
|
|
||||||
R_PATH = Path(__file__).parent
|
|
||||||
DATA_PATH = R_PATH / 'blue_data'
|
|
||||||
CURVE_PATH = Path(__file__).parents[1] / 'genshinuid_enka' / 'curveCalc'
|
|
||||||
|
|
||||||
wb = load_workbook(str(DATA_PATH / '曲线素材.xlsx'), data_only=True)
|
|
||||||
ws: Worksheet = wb['曲线素材'] # type: ignore
|
|
||||||
|
|
||||||
result = {}
|
|
||||||
for col in range(1, 45):
|
|
||||||
if not ws.cell(1, col).value:
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
title = ws.cell(1, col).column_letter # type: ignore
|
|
||||||
|
|
||||||
temp = []
|
|
||||||
for row in range(2, 302):
|
|
||||||
val = ws.cell(row, col).value
|
|
||||||
temp.append(val)
|
|
||||||
|
|
||||||
result[title] = temp
|
|
||||||
|
|
||||||
with open(str(CURVE_PATH / 'curve.json'), 'w', encoding='utf-8') as f:
|
|
||||||
json.dump(result, f, indent=2, ensure_ascii=False)
|
|
@ -1,67 +0,0 @@
|
|||||||
import copy
|
|
||||||
import json
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from openpyxl import load_workbook
|
|
||||||
|
|
||||||
sample = {
|
|
||||||
'name': '',
|
|
||||||
'desc': '',
|
|
||||||
'eg': '',
|
|
||||||
'need_ck': False,
|
|
||||||
'need_sk': False,
|
|
||||||
'need_admin': False,
|
|
||||||
}
|
|
||||||
|
|
||||||
result = {}
|
|
||||||
|
|
||||||
R_PATH = Path(__file__).parent
|
|
||||||
DATA_PATH = R_PATH / 'help_data'
|
|
||||||
HELP_PATH = Path(__file__).parents[1] / 'genshinuid_help'
|
|
||||||
|
|
||||||
# 表格地址: https://kdocs.cn/l/ccpc6z0bZx6u
|
|
||||||
wb = load_workbook(str(DATA_PATH / 'GenshinUID Help.xlsx'))
|
|
||||||
ws = wb.active
|
|
||||||
|
|
||||||
module_name_str = ''
|
|
||||||
for row in range(2, 999):
|
|
||||||
# 跳过空白行
|
|
||||||
if not ws.cell(row, 2).value:
|
|
||||||
continue
|
|
||||||
|
|
||||||
_sample = copy.deepcopy(sample)
|
|
||||||
|
|
||||||
# 将第一列读取为模块名
|
|
||||||
if ws.cell(row, 1):
|
|
||||||
if ws.cell(row, 1).value is not None:
|
|
||||||
module_name_str = ws.cell(row, 1).value
|
|
||||||
|
|
||||||
# if module_name_str is None and not isinstance(module_name_str, str):
|
|
||||||
# continue
|
|
||||||
|
|
||||||
# 第二列为功能名
|
|
||||||
_sample['name'] = ws.cell(row, 2).value
|
|
||||||
# 第三列为详细信息
|
|
||||||
_sample['desc'] = ws.cell(row, 3).value
|
|
||||||
# 第四列为使用例
|
|
||||||
_sample['eg'] = ws.cell(row, 4).value
|
|
||||||
|
|
||||||
if ws.cell(row, 5).value == '是':
|
|
||||||
_sample['need_ck'] = True
|
|
||||||
|
|
||||||
if ws.cell(row, 6).value == '是':
|
|
||||||
_sample['need_sk'] = True
|
|
||||||
|
|
||||||
if ws.cell(row, 7).value == '是':
|
|
||||||
_sample['need_admin'] = True
|
|
||||||
|
|
||||||
if isinstance(module_name_str, str):
|
|
||||||
module_name = module_name_str.split(' | ')[0]
|
|
||||||
module_desc = module_name_str.split(' | ')[1]
|
|
||||||
if module_name not in result:
|
|
||||||
result[module_name] = {'desc': module_desc, 'data': []}
|
|
||||||
|
|
||||||
result[module_name]['data'].append(_sample)
|
|
||||||
|
|
||||||
with open(str(HELP_PATH / 'help.json'), 'w', encoding='utf-8') as f:
|
|
||||||
json.dump(result, f, indent=2, ensure_ascii=False)
|
|
@ -1,92 +0,0 @@
|
|||||||
import json
|
|
||||||
import warnings
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from openpyxl import Workbook, load_workbook
|
|
||||||
from openpyxl.worksheet.worksheet import Worksheet
|
|
||||||
|
|
||||||
warnings.filterwarnings('ignore', category=UserWarning, module='openpyxl')
|
|
||||||
import_path = Path(__file__).parent / 'achievement_data' / '成就汇总.xlsx'
|
|
||||||
export_path = Path(__file__).parents[1] / 'genshinuid_achievement'
|
|
||||||
|
|
||||||
wb: Workbook = load_workbook(str(import_path))
|
|
||||||
ws_daily: Worksheet = wb['成就相关每日委托']
|
|
||||||
ws_all: Worksheet = wb['正式服成就汇总']
|
|
||||||
ws_32: Worksheet = wb['3.2 新增成就']
|
|
||||||
ws_33: Worksheet = wb['3.3 新增成就']
|
|
||||||
ws_34: Worksheet = wb['3.4 新增成就']
|
|
||||||
|
|
||||||
result_achi = {}
|
|
||||||
result_all = {}
|
|
||||||
|
|
||||||
is_first = False
|
|
||||||
for row in range(3, 100):
|
|
||||||
task = ws_daily.cell(row, 3).value
|
|
||||||
achi = ws_daily.cell(row, 4).value
|
|
||||||
desc = ws_daily.cell(row, 5).value
|
|
||||||
guide = ws_daily.cell(row, 6).value
|
|
||||||
hyper_link = ws_daily.cell(row, 6).hyperlink
|
|
||||||
hyper_link = '' if hyper_link is None else hyper_link.target
|
|
||||||
if not task:
|
|
||||||
if is_first:
|
|
||||||
break
|
|
||||||
is_first = True
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
is_first = False
|
|
||||||
task_list = task.split('\n')
|
|
||||||
for t in task_list:
|
|
||||||
if t.startswith('('):
|
|
||||||
continue
|
|
||||||
result_achi[t] = {
|
|
||||||
'achievement': achi,
|
|
||||||
'desc': desc,
|
|
||||||
'guide': guide,
|
|
||||||
'link': hyper_link,
|
|
||||||
}
|
|
||||||
|
|
||||||
for row in range(3, 1000):
|
|
||||||
book = ws_all.cell(row, 5).value
|
|
||||||
achi = ws_all.cell(row, 6).value
|
|
||||||
desc = ws_all.cell(row, 7).value
|
|
||||||
guide = ws_all.cell(row, 11).value
|
|
||||||
hyper_link = ws_all.cell(row, 11).hyperlink
|
|
||||||
hyper_link = '' if hyper_link is None else hyper_link.target
|
|
||||||
if not book:
|
|
||||||
break
|
|
||||||
result_all[achi] = {
|
|
||||||
'book': book,
|
|
||||||
'desc': desc,
|
|
||||||
'guide': guide,
|
|
||||||
'link': hyper_link,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def get_book(_book: Worksheet, loop: int, bn: int, an: int, dn: int, gn: int):
|
|
||||||
for row in range(3, loop):
|
|
||||||
book = _book.cell(row, bn).value
|
|
||||||
achi = _book.cell(row, an).value
|
|
||||||
desc = _book.cell(row, dn).value
|
|
||||||
guide = _book.cell(row, gn).value
|
|
||||||
hyper_link = _book.cell(row, gn).hyperlink
|
|
||||||
hyper_link = '' if hyper_link is None else hyper_link.target
|
|
||||||
if not book:
|
|
||||||
break
|
|
||||||
result_all[achi] = {
|
|
||||||
'book': book,
|
|
||||||
'desc': desc,
|
|
||||||
'guide': guide,
|
|
||||||
'link': hyper_link,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
get_book(ws_32, 50, 4, 5, 6, 9)
|
|
||||||
get_book(ws_33, 50, 5, 6, 7, 10)
|
|
||||||
get_book(ws_34, 50, 5, 6, 7, 10)
|
|
||||||
|
|
||||||
|
|
||||||
with open(str(export_path / 'daily_achi.json'), 'w', encoding='utf-8') as f:
|
|
||||||
json.dump(result_achi, f, indent=2, ensure_ascii=False)
|
|
||||||
|
|
||||||
with open(str(export_path / 'all_achi.json'), 'w', encoding='utf-8') as f:
|
|
||||||
json.dump(result_all, f, indent=2, ensure_ascii=False)
|
|
@ -1,355 +0,0 @@
|
|||||||
import re
|
|
||||||
import sys
|
|
||||||
import json
|
|
||||||
import asyncio
|
|
||||||
from typing import List
|
|
||||||
from pathlib import Path
|
|
||||||
from copy import deepcopy
|
|
||||||
|
|
||||||
import httpx
|
|
||||||
|
|
||||||
sys.path.append(str(Path(__file__).parents[1]))
|
|
||||||
from version import Genshin_version # noqa: E402
|
|
||||||
from utils.ambr_api.convert_ambr_data import ( # noqa: E402
|
|
||||||
convert_ambr_to_talent,
|
|
||||||
)
|
|
||||||
|
|
||||||
path = (
|
|
||||||
Path(__file__).parents[1]
|
|
||||||
/ 'utils'
|
|
||||||
/ 'enka_api'
|
|
||||||
/ 'map'
|
|
||||||
/ f'avatarId2Name_mapping_{Genshin_version}.json'
|
|
||||||
)
|
|
||||||
element_path = (
|
|
||||||
Path(__file__).parents[1]
|
|
||||||
/ 'utils'
|
|
||||||
/ 'enka_api'
|
|
||||||
/ 'map'
|
|
||||||
/ f'avatarName2Element_mapping_{Genshin_version}.json'
|
|
||||||
)
|
|
||||||
with open(path, 'r', encoding='utf-8') as f:
|
|
||||||
char_id_list = json.load(f)
|
|
||||||
|
|
||||||
with open(element_path, 'r', encoding='utf-8') as f:
|
|
||||||
char_element_list = json.load(f)
|
|
||||||
|
|
||||||
char_list: List[str] = []
|
|
||||||
char_action = {}
|
|
||||||
INDEX_MAP = ['', 'A', 'E', 'Q']
|
|
||||||
attack_type_list = {'普通攻击': 'A', '重击': 'B', '下落攻击': 'C', '战技': 'E', '爆发': 'Q'}
|
|
||||||
label_type_list = {
|
|
||||||
'普通攻击': 'A',
|
|
||||||
'重击': 'B',
|
|
||||||
'下落攻击': 'C',
|
|
||||||
'攻击': 'attack',
|
|
||||||
'充能效率': 'ce',
|
|
||||||
'生命值': 'hp',
|
|
||||||
'防御': 'defense',
|
|
||||||
'暴击率': 'critrate',
|
|
||||||
'暴击伤害': 'critDmg',
|
|
||||||
'元素精通': 'em',
|
|
||||||
}
|
|
||||||
extra = {
|
|
||||||
'烟绯': {'A重击伤害': '蒸发'},
|
|
||||||
'胡桃': {'A重击伤害': '蒸发', 'Q低血量时技能伤害': '蒸发'},
|
|
||||||
'安柏': {'A满蓄力瞄准射击': ['融化', '蒸发']},
|
|
||||||
'香菱': {'E喷火伤害': '蒸发', 'Q旋火轮伤害': '蒸发'},
|
|
||||||
'达达利亚': {'A满蓄力瞄准射击': '蒸发', 'Q技能伤害·近战': '蒸发', 'Q技能伤害·远程': '蒸发'},
|
|
||||||
'重云': {'Q技能伤害': '融化'},
|
|
||||||
'雷电将军': {
|
|
||||||
'E协同攻击伤害': '超激化',
|
|
||||||
'Q梦想一刀基础伤害': '满愿力',
|
|
||||||
'Q一段伤害': '满愿力',
|
|
||||||
'Q重击伤害': '满愿力',
|
|
||||||
},
|
|
||||||
'班尼特': {'Q技能伤害': '蒸发'},
|
|
||||||
'甘雨': {'A霜华矢命中伤害': '融化', 'A霜华矢·霜华绽发伤害': '融化'},
|
|
||||||
'可莉': {'A重击伤害': '蒸发'},
|
|
||||||
'优菈': {'Q光降之剑基础伤害': ['13层', '24层']},
|
|
||||||
'行秋': {'E技能伤害': '蒸发'},
|
|
||||||
'莫娜': {'A重击伤害': '蒸发', 'Q泡影破裂伤害': '蒸发'},
|
|
||||||
'迪卢克': {'Q斩击伤害': '蒸发'},
|
|
||||||
'芭芭拉': {'A重击伤害': '蒸发'},
|
|
||||||
'七七': {'Q技能伤害': '融化'},
|
|
||||||
'八重神子': {
|
|
||||||
'Q伤害': '超激化',
|
|
||||||
'Q天狐霆雷伤害': '超激化',
|
|
||||||
'E杀生樱伤害·叁阶': '超激化',
|
|
||||||
'E杀生樱伤害·肆阶': '超激化',
|
|
||||||
},
|
|
||||||
'菲谢尔': {'E奥兹攻击伤害': '超激化'},
|
|
||||||
'久岐忍': {'Q单次伤害': '超激化'},
|
|
||||||
'柯莱': {'Q跃动伤害': '蔓激化', 'E技能伤害': '蔓激化'},
|
|
||||||
'提纳里': {
|
|
||||||
'A藏蕴花矢伤害': '蔓激化',
|
|
||||||
'E技能伤害': '蔓激化',
|
|
||||||
'Q缠藤箭伤害': '蔓激化',
|
|
||||||
'Q次级缠藤箭伤害': '蔓激化',
|
|
||||||
},
|
|
||||||
'刻晴': {
|
|
||||||
'A重击伤害': '超激化',
|
|
||||||
'E雷楔伤害': '超激化',
|
|
||||||
'E斩击伤害': '超激化',
|
|
||||||
'Q技能伤害': '超激化',
|
|
||||||
'Q连斩伤害': '超激化*2',
|
|
||||||
'Q最后一击伤害': '超激化',
|
|
||||||
},
|
|
||||||
'北斗': {'Q闪雷伤害': '超激化'},
|
|
||||||
'赛诺': {'E冥祭伤害': '超激化', 'Q一段伤害': '超激化', 'Q重击伤害': '超激化'},
|
|
||||||
'纳西妲': {'E长按伤害': '蔓激化', 'E灭净三业伤害': ['蔓激化', '蔓激化·前台']},
|
|
||||||
'旅行者(草)': {'Q草灯莲攻击伤害': '蔓激化'},
|
|
||||||
'夜兰': {'E伤害': '蒸发'},
|
|
||||||
'艾尔海森': {'Q单次伤害': '蔓激化', 'E突进攻击伤害': '蔓激化', 'E1枚光幕攻击伤害': '蔓激化'},
|
|
||||||
'迪希雅': {
|
|
||||||
'E净焰昂藏伤害': '蒸发',
|
|
||||||
'E剑域炽焰伤害': '蒸发',
|
|
||||||
'E领域伤害': '蒸发',
|
|
||||||
'Q炽鬃拳伤害': '蒸发',
|
|
||||||
'Q焚落踢伤害': '蒸发',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
template = {'A重击伤害': {'name': 'A重击伤害', 'type': '', 'plus': 1, 'value': []}}
|
|
||||||
|
|
||||||
|
|
||||||
def fill_label(label_name: str, index: int) -> str:
|
|
||||||
label_name = INDEX_MAP[index] + label_name
|
|
||||||
return label_name
|
|
||||||
|
|
||||||
|
|
||||||
def from_type_to_value(value_type: str, para):
|
|
||||||
value = ''
|
|
||||||
if value_type == 'F1P':
|
|
||||||
value = '%.1f%%' % (para * 100)
|
|
||||||
elif value_type == 'F2P':
|
|
||||||
value = '%.2f%%' % (para * 100)
|
|
||||||
elif value_type == 'F1':
|
|
||||||
value = '%.1f' % (para)
|
|
||||||
elif value_type == 'F2':
|
|
||||||
value = '%.2f' % (para)
|
|
||||||
elif value_type == 'P':
|
|
||||||
value = str(round(para * 100)) + '%'
|
|
||||||
elif value_type == 'I':
|
|
||||||
value = '%.2f' % para
|
|
||||||
return value
|
|
||||||
|
|
||||||
|
|
||||||
def find_tag(labels: List, index: int, char: str, parameters: dict) -> dict:
|
|
||||||
result = {}
|
|
||||||
for label in labels:
|
|
||||||
if '旅行者' not in char:
|
|
||||||
if char_element_list[char] == 'Anemo':
|
|
||||||
if 'A扩散伤害' not in result:
|
|
||||||
result['A扩散伤害'] = {
|
|
||||||
'name': 'A扩散伤害',
|
|
||||||
'type': '扩散',
|
|
||||||
'plus': 0,
|
|
||||||
'value': [str(i) for i in range(1, 11)],
|
|
||||||
}
|
|
||||||
if char == '妮露':
|
|
||||||
if 'A丰穰之核(绽放)' not in result:
|
|
||||||
result['A丰穰之核(绽放)'] = {
|
|
||||||
'name': 'A丰穰之核(绽放)',
|
|
||||||
'type': '绽放',
|
|
||||||
'plus': 0,
|
|
||||||
'value': [str(i) for i in range(1, 11)],
|
|
||||||
}
|
|
||||||
if char == '久岐忍':
|
|
||||||
if 'A元素反应(超绽放)' not in result:
|
|
||||||
result['A元素反应(超绽放)'] = {
|
|
||||||
'name': 'A元素反应(超绽放)',
|
|
||||||
'type': '扩散',
|
|
||||||
'plus': 0,
|
|
||||||
'value': [str(i) for i in range(1, 11)],
|
|
||||||
}
|
|
||||||
if char == '托马':
|
|
||||||
if 'A元素反应(烈绽放)' not in result:
|
|
||||||
result['A元素反应(烈绽放)'] = {
|
|
||||||
'name': 'A元素反应(烈绽放)',
|
|
||||||
'type': '扩散',
|
|
||||||
'plus': 0,
|
|
||||||
'value': [str(i) for i in range(1, 11)],
|
|
||||||
}
|
|
||||||
# 拿到形如{param1:F1P}的字典
|
|
||||||
label_split = label.split('|')[-1]
|
|
||||||
# 拿到单个标签的名称,形如一段伤害
|
|
||||||
label_name = label.split('|')[0]
|
|
||||||
# 寻找label中带*的倍数倍率,比如 攻击力*3
|
|
||||||
label_plus = 1
|
|
||||||
if '*' in label_split:
|
|
||||||
label_plus = label_split.split('*')[-1]
|
|
||||||
label_plus = int(re.findall(r'[0-9]+', label_plus)[0])
|
|
||||||
# 如果在label_split内拿到了形如每秒{param2:F2P}生命值上限+{param3:I},获取汉字转换类型
|
|
||||||
laber_kanji_list = re.findall(r'[\u4e00-\u9fa5]+', label_split)
|
|
||||||
# 如果label_split中有汉字,则获取汉字的类型
|
|
||||||
laber_kanji_list_str = ''.join(laber_kanji_list).replace('每秒', '')
|
|
||||||
for type in label_type_list:
|
|
||||||
if type in laber_kanji_list_str:
|
|
||||||
label_kanji = type
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
label_kanji = '攻击力'
|
|
||||||
# 找到标签{param1:F1P}的List
|
|
||||||
label_attr = re.findall(r'{[a-zA-Z0-9]+:[a-zA-Z0-9]+}', label_split)
|
|
||||||
# 例如"持续治疗|每秒{param2:F2P}生命值上限+{param3:I}",
|
|
||||||
# 对单个标签内多个param进行处理,处理成形如['{param2:F2P}', '{param3:I}']
|
|
||||||
value_type = ''
|
|
||||||
temp_value = []
|
|
||||||
temp_temp = []
|
|
||||||
for indexA, k in enumerate(label_attr):
|
|
||||||
# 去除多多余字符 变成 param2:F2P
|
|
||||||
k_deal = k.replace('{', '').replace('}', '')
|
|
||||||
value_type = k_deal.split(':')[-1] # F2P
|
|
||||||
value_index = k_deal.split(':')[0] # param2
|
|
||||||
temp = [
|
|
||||||
from_type_to_value(value_type, parameter)
|
|
||||||
for parameter in parameters[value_index]
|
|
||||||
]
|
|
||||||
if indexA == 0:
|
|
||||||
temp_value = temp
|
|
||||||
# 只采用高空坠地的倍率
|
|
||||||
elif indexA == 1 and '低空/高空坠地' in label:
|
|
||||||
temp_value = temp
|
|
||||||
# 阿忍仅计算50%血量以下伤害
|
|
||||||
elif indexA == 1 and char == '久岐忍' and label_name == '总伤害':
|
|
||||||
temp_value = temp
|
|
||||||
# 埃洛伊特殊值
|
|
||||||
elif indexA == 2 and char == '埃洛伊':
|
|
||||||
temp_value = temp
|
|
||||||
# 烟绯满层丹火印
|
|
||||||
elif indexA == 4 and char == '烟绯':
|
|
||||||
temp_value = temp
|
|
||||||
# 无例外情况倍率全部相加
|
|
||||||
else:
|
|
||||||
temp_value = [f'{i}+{j}' for i, j in zip(temp_temp, temp)]
|
|
||||||
# 读入缓存
|
|
||||||
temp_temp = temp
|
|
||||||
# 制作倍率单元素
|
|
||||||
parameter_list = {
|
|
||||||
'name': '',
|
|
||||||
'type': label_kanji,
|
|
||||||
'plus': label_plus,
|
|
||||||
'value': temp_value,
|
|
||||||
}
|
|
||||||
|
|
||||||
# 特殊化处理
|
|
||||||
if '心海' in char:
|
|
||||||
label_name = label_name.replace('提升', '提高')
|
|
||||||
label_name = label_name.replace('低空/高空坠地冲击伤害', '高空下落伤害')
|
|
||||||
label_name = label_name.replace('技能', '')
|
|
||||||
|
|
||||||
# 提升指提升百分比 例如 E:dmgBouns+50%
|
|
||||||
# 提高指提高固定值 例如 Q:addDmg+40%defense
|
|
||||||
|
|
||||||
label_keyword_hurt_list = ['一段', '壹阶', '贰阶', '叁阶', '肆阶']
|
|
||||||
|
|
||||||
if '炽焰箭' in label_name:
|
|
||||||
continue
|
|
||||||
elif char == '珊瑚宫心海' and '提高' in label_name:
|
|
||||||
continue
|
|
||||||
elif '元素爆发伤害提高' in label_name and char == '雷电将军':
|
|
||||||
continue
|
|
||||||
elif '持续时间' in label_name:
|
|
||||||
continue
|
|
||||||
elif '提升' in label_name:
|
|
||||||
# 云瑾和申鹤
|
|
||||||
if '伤害值提升' in label_name:
|
|
||||||
parameter_list['name'] = fill_label(label_name, index)
|
|
||||||
result[fill_label(label_name, index)] = parameter_list
|
|
||||||
else:
|
|
||||||
continue
|
|
||||||
elif '伤害' in label_name:
|
|
||||||
if '段' in label_name or '阶' in label_name:
|
|
||||||
for label_keyword in label_keyword_hurt_list:
|
|
||||||
if label_keyword in label_name:
|
|
||||||
parameter_list['name'] = fill_label(label_name, index)
|
|
||||||
result[fill_label(label_name, index)] = parameter_list
|
|
||||||
elif '低空/高空坠地冲击伤害' in label_name and char not in ['魈']:
|
|
||||||
continue
|
|
||||||
elif '下坠期间伤害' in label_name:
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
parameter_list['name'] = fill_label(label_name, index)
|
|
||||||
result[fill_label(label_name, index)] = parameter_list
|
|
||||||
elif '治疗' in label_name or '回复' in label_name:
|
|
||||||
parameter_list['name'] = fill_label(label_name, index)
|
|
||||||
result[fill_label(label_name, index)] = parameter_list
|
|
||||||
elif '护盾' in label_name:
|
|
||||||
parameter_list['name'] = fill_label(label_name, index)
|
|
||||||
result[fill_label(label_name, index)] = parameter_list
|
|
||||||
elif '满蓄力瞄准射击' in label_name:
|
|
||||||
parameter_list['name'] = fill_label(label_name, index)
|
|
||||||
result[fill_label(label_name, index)] = parameter_list
|
|
||||||
|
|
||||||
if char in extra:
|
|
||||||
for extra_name in extra[char]:
|
|
||||||
temp_name = extra_name.replace('技能', '')
|
|
||||||
if fill_label(label_name, index) == temp_name:
|
|
||||||
if isinstance(extra[char][extra_name], List):
|
|
||||||
for extra_tag in extra[char][extra_name]:
|
|
||||||
new_parameter_list = deepcopy(parameter_list)
|
|
||||||
new_parameter_list['name'] = (
|
|
||||||
fill_label(label_name, index)
|
|
||||||
+ f'({extra_tag})'
|
|
||||||
)
|
|
||||||
result[
|
|
||||||
fill_label(label_name, index)
|
|
||||||
+ f'({extra_tag})'
|
|
||||||
] = new_parameter_list
|
|
||||||
else:
|
|
||||||
new_parameter_list = deepcopy(parameter_list)
|
|
||||||
new_parameter_list['name'] = (
|
|
||||||
fill_label(label_name, index)
|
|
||||||
+ f'({extra[char][extra_name]})'
|
|
||||||
)
|
|
||||||
result[
|
|
||||||
fill_label(label_name, index)
|
|
||||||
+ f'({extra[char][extra_name]})'
|
|
||||||
] = new_parameter_list
|
|
||||||
|
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
async def main():
|
|
||||||
for char_id in char_id_list:
|
|
||||||
char_list.append(char_id_list[char_id])
|
|
||||||
char_list.extend(['旅行者(风)', '旅行者(雷)', '旅行者(岩)', '旅行者(草)'])
|
|
||||||
for char in char_list:
|
|
||||||
print(char)
|
|
||||||
talent_data = httpx.get(
|
|
||||||
f'https://info.minigg.cn/talents?query={char}'
|
|
||||||
).json()
|
|
||||||
if 'errcode' in talent_data:
|
|
||||||
for _id in char_id_list:
|
|
||||||
if char_id_list[_id] == char:
|
|
||||||
char_id = _id
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
continue
|
|
||||||
if int(char_id) >= 11000000:
|
|
||||||
continue
|
|
||||||
talent_data = await convert_ambr_to_talent(char_id)
|
|
||||||
if talent_data is None:
|
|
||||||
continue
|
|
||||||
result = {}
|
|
||||||
for i in range(1, 4):
|
|
||||||
skill = talent_data['combat{}'.format(str(i))]
|
|
||||||
labels = skill['attributes']['labels']
|
|
||||||
parameters = skill['attributes']['parameters']
|
|
||||||
result = dict(result, **find_tag(labels, i, char, parameters))
|
|
||||||
char_action[char] = result
|
|
||||||
|
|
||||||
with open(
|
|
||||||
str(
|
|
||||||
Path(__file__).parents[1]
|
|
||||||
/ 'genshinuid_enka'
|
|
||||||
/ 'effect'
|
|
||||||
/ 'char_action.json'
|
|
||||||
),
|
|
||||||
'w',
|
|
||||||
encoding='UTF-8',
|
|
||||||
) as file:
|
|
||||||
json.dump(char_action, file, ensure_ascii=False)
|
|
||||||
|
|
||||||
|
|
||||||
asyncio.run(main())
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -1,26 +0,0 @@
|
|||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from PIL import Image
|
|
||||||
|
|
||||||
target = Path(__file__).parent / 'support'
|
|
||||||
img = Path(__file__).parent / '图.png'
|
|
||||||
image = Image.open(img)
|
|
||||||
# 设置要裁剪的图块的宽度和高度
|
|
||||||
width = 1750
|
|
||||||
height = 1045
|
|
||||||
|
|
||||||
# 设置要裁剪的图块的位置
|
|
||||||
positions = [
|
|
||||||
(120 + width * x, 11540 + height * y) for x in range(2) for y in range(1)
|
|
||||||
]
|
|
||||||
|
|
||||||
# 循环裁剪每个图块
|
|
||||||
for i, position in enumerate(positions):
|
|
||||||
# 获取起始位置
|
|
||||||
x, y = position
|
|
||||||
|
|
||||||
# 裁剪图片
|
|
||||||
cropped_image = image.crop((x, y, x + width, y + height))
|
|
||||||
|
|
||||||
# 保存裁剪后的图片
|
|
||||||
cropped_image.save(target / "cropped_image_{}.png".format(i + 1))
|
|
@ -1,219 +0,0 @@
|
|||||||
import json
|
|
||||||
import asyncio
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
import httpx
|
|
||||||
import openpyxl
|
|
||||||
|
|
||||||
R_PATH = Path(__file__).parent
|
|
||||||
DATA_PATH = R_PATH / 'blue_data'
|
|
||||||
ETC_PATH = Path(__file__).parents[1] / 'genshinuid_enka' / 'effect'
|
|
||||||
|
|
||||||
|
|
||||||
SAMPLE = {
|
|
||||||
'神里绫华': 'Q切割伤害',
|
|
||||||
'琴': 'Q领域发动治疗量',
|
|
||||||
'丽莎': ['E三层引雷长按伤害', 'Q放电伤害'],
|
|
||||||
'芭芭拉': 'Q治疗量',
|
|
||||||
'凯亚': 'Q伤害',
|
|
||||||
'迪卢克': 'Q斩击伤害(蒸发)',
|
|
||||||
'雷泽': 'A一段伤害',
|
|
||||||
'安柏': ['Q箭雨总伤害', 'A满蓄力瞄准射击'],
|
|
||||||
'温迪': 'A扩散伤害',
|
|
||||||
'香菱': 'Q旋火轮伤害(蒸发)',
|
|
||||||
'北斗': 'Q闪雷伤害',
|
|
||||||
'行秋': 'Q剑雨伤害',
|
|
||||||
'魈': 'A高空下落伤害',
|
|
||||||
'凝光': 'Q宝石伤害',
|
|
||||||
'可莉': 'A重击伤害(蒸发)',
|
|
||||||
'钟离': ['E总护盾量', 'Q伤害'],
|
|
||||||
'菲谢尔': 'E奥兹攻击伤害',
|
|
||||||
'班尼特': ['Q伤害(蒸发)', 'Q持续治疗'],
|
|
||||||
'达达利亚': 'Q伤害·近战(蒸发)',
|
|
||||||
'诺艾尔': 'A一段伤害',
|
|
||||||
'七七': 'Q治疗量',
|
|
||||||
'重云': 'Q伤害',
|
|
||||||
'甘雨': ['A霜华矢·霜华绽发伤害', 'A霜华矢·霜华绽发伤害(融化)'],
|
|
||||||
'阿贝多': 'E刹那之花伤害',
|
|
||||||
'迪奥娜': 'E护盾基础吸收量',
|
|
||||||
'莫娜': ['Q泡影破裂伤害(蒸发)', 'Q泡影破裂伤害'],
|
|
||||||
'刻晴': 'A重击伤害',
|
|
||||||
'砂糖': 'A扩散伤害',
|
|
||||||
'辛焱': ['Q伤害', 'E三级护盾吸收量'],
|
|
||||||
'罗莎莉亚': 'Q冰枪持续伤害',
|
|
||||||
'胡桃': 'A重击伤害(蒸发)',
|
|
||||||
'枫原万叶': 'A扩散伤害',
|
|
||||||
'烟绯': 'A重击伤害(蒸发)',
|
|
||||||
'宵宫': 'A一段伤害',
|
|
||||||
'托马': 'E护盾吸收量上限',
|
|
||||||
'优菈': 'Q光降之剑基础伤害(13层)',
|
|
||||||
'雷电将军': 'Q梦想一刀基础伤害(满愿力)',
|
|
||||||
'早柚': 'Q不倒貉貉治疗量',
|
|
||||||
'珊瑚宫心海': ['A一段伤害', 'E治疗量'],
|
|
||||||
'五郎': 'def',
|
|
||||||
'九条裟罗': 'Q天狗咒雷·金刚坏 伤害',
|
|
||||||
'荒泷一斗': 'A荒泷逆袈裟连斩伤害',
|
|
||||||
'八重神子': 'E杀生樱伤害·叁阶',
|
|
||||||
'鹿野院平藏': 'E伤害',
|
|
||||||
'夜兰': 'Q玄掷玲珑伤害',
|
|
||||||
'埃洛伊': 'Q伤害',
|
|
||||||
'申鹤': 'atk',
|
|
||||||
'云堇': 'def',
|
|
||||||
'久岐忍': 'E越祓草轮治疗量',
|
|
||||||
'神里绫人': 'E一段瞬水剑伤害',
|
|
||||||
'柯莱': 'Q跃动伤害(蔓激化)',
|
|
||||||
'多莉': 'Q持续治疗量',
|
|
||||||
'提纳里': 'A藏蕴花矢伤害(蔓激化)',
|
|
||||||
'妮露': 'A丰穰之核(绽放)',
|
|
||||||
'赛诺': 'E渡荒之雷(超激化)',
|
|
||||||
'坎蒂丝': 'Q水波冲击伤害',
|
|
||||||
'纳西妲': 'E灭净三业伤害(蔓激化)',
|
|
||||||
'莱依拉': 'E护盾基础吸收量',
|
|
||||||
'旅行者(草)': 'Q草灯莲攻击伤害(蔓激化)',
|
|
||||||
'旅行者(岩)': 'Q地震波单次伤害',
|
|
||||||
'旅行者(风)': 'A扩散伤害',
|
|
||||||
'流浪者': 'E空居·不生断伤害',
|
|
||||||
'珐露珊': 'Q伤害',
|
|
||||||
'艾尔海森': 'E1枚光幕攻击伤害(蔓激化)',
|
|
||||||
'瑶瑶': 'E白玉萝卜治疗量',
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
async def get_misc_info(mode: str, name: str):
|
|
||||||
'''
|
|
||||||
:说明:
|
|
||||||
一些杂项信息。
|
|
||||||
:参数:
|
|
||||||
* name (str): 'enemies', 'foods', 'artifacts'。
|
|
||||||
* name (str): 参数。
|
|
||||||
:返回:
|
|
||||||
* data (str): 获取数据信息。
|
|
||||||
'''
|
|
||||||
url = 'https://info.minigg.cn/{}'.format(mode)
|
|
||||||
req = httpx.get(url=url, params={'query': name})
|
|
||||||
return req.json()
|
|
||||||
|
|
||||||
|
|
||||||
async def getEquipName(name: str) -> str:
|
|
||||||
if name == '花神':
|
|
||||||
name = '乐园遗落之花'
|
|
||||||
elif name == '饰金':
|
|
||||||
name = '饰金之梦'
|
|
||||||
elif name == '追忆':
|
|
||||||
name = '追忆之注连'
|
|
||||||
print(name)
|
|
||||||
r = await get_misc_info('artifacts', name)
|
|
||||||
re = r['name']
|
|
||||||
print(re)
|
|
||||||
return re
|
|
||||||
|
|
||||||
|
|
||||||
async def panle2Json() -> None:
|
|
||||||
'''
|
|
||||||
:说明:
|
|
||||||
访问DATA_PATH并转换数据为dmgMap.json。
|
|
||||||
'''
|
|
||||||
wb = openpyxl.load_workbook(
|
|
||||||
str(DATA_PATH / '参考面板3.4.xlsx'), data_only=True
|
|
||||||
)
|
|
||||||
sheet = wb.active
|
|
||||||
|
|
||||||
result = {}
|
|
||||||
char_result = []
|
|
||||||
char_temp = ''
|
|
||||||
skill_temp = ''
|
|
||||||
skill_count = -1
|
|
||||||
title = 0
|
|
||||||
for row in range(9, 400):
|
|
||||||
temp = {}
|
|
||||||
char_name = sheet.cell(row, 1).value
|
|
||||||
skill = sheet.cell(row, 19).value
|
|
||||||
if char_name and char_name != '角色' and isinstance(char_name, str):
|
|
||||||
weapon = str(sheet.cell(row, 2).value)
|
|
||||||
equip_set = str(sheet.cell(row, 3).value)
|
|
||||||
if '4' in equip_set:
|
|
||||||
equip_set = equip_set.replace('4', '')
|
|
||||||
equip_set = await getEquipName(equip_set)
|
|
||||||
elif '2' in equip_set:
|
|
||||||
equip_set_list = equip_set[1:].split('2')
|
|
||||||
equip_set = ''
|
|
||||||
for i in equip_set_list:
|
|
||||||
equip_set += await getEquipName(i)
|
|
||||||
else:
|
|
||||||
print('error')
|
|
||||||
|
|
||||||
equip_main = str(sheet.cell(row, 4).value)
|
|
||||||
g_atk = sheet.cell(row, 8).value
|
|
||||||
other = {}
|
|
||||||
for i in [9, 10]:
|
|
||||||
if sheet.cell(title, i).value is not None:
|
|
||||||
n = str(sheet.cell(title, i).value)
|
|
||||||
n = n.replace('力', '')
|
|
||||||
if '加成' in n:
|
|
||||||
continue
|
|
||||||
if sheet.cell(row, i).value is not None:
|
|
||||||
v = float(str(sheet.cell(row, i).value))
|
|
||||||
if v:
|
|
||||||
other[n] = v
|
|
||||||
crit_rate = sheet.cell(row, 13).value
|
|
||||||
crit_dmg = sheet.cell(row, 14).value
|
|
||||||
|
|
||||||
weapon = weapon.replace('试做', '试作')
|
|
||||||
char_name = (
|
|
||||||
char_name.replace('空/荧', '旅行者')
|
|
||||||
.replace('(', '(')
|
|
||||||
.replace(')', ')')
|
|
||||||
)
|
|
||||||
if char_name != char_temp:
|
|
||||||
skill_temp = ''
|
|
||||||
skill_count = -1
|
|
||||||
if char_name in SAMPLE:
|
|
||||||
if isinstance(SAMPLE[char_name], str):
|
|
||||||
temp['skill'] = SAMPLE[char_name]
|
|
||||||
else:
|
|
||||||
if skill != skill_temp:
|
|
||||||
skill_count += 1
|
|
||||||
skill_temp = skill
|
|
||||||
temp['skill'] = SAMPLE[char_name][skill_count]
|
|
||||||
value = (
|
|
||||||
str(sheet.cell(row, 20).value)
|
|
||||||
if sheet.cell(row, 20).value
|
|
||||||
else ''
|
|
||||||
)
|
|
||||||
if '.' in value:
|
|
||||||
value = float(value)
|
|
||||||
else:
|
|
||||||
value = 0
|
|
||||||
temp['value'] = value
|
|
||||||
else:
|
|
||||||
temp['skill'] = ''
|
|
||||||
temp['seq'] = '{}|{}|{}'.format(weapon, equip_set, equip_main)
|
|
||||||
temp['critRate'] = crit_rate
|
|
||||||
temp['critDmg'] = crit_dmg
|
|
||||||
temp['atk'] = g_atk
|
|
||||||
temp['other'] = other
|
|
||||||
|
|
||||||
if char_temp:
|
|
||||||
if char_name == char_temp:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
result[char_temp] = char_result
|
|
||||||
char_result = []
|
|
||||||
char_temp = char_name
|
|
||||||
else:
|
|
||||||
char_temp = char_name
|
|
||||||
char_result.append(temp)
|
|
||||||
if row == 344:
|
|
||||||
print('ok!')
|
|
||||||
result[char_temp] = char_result
|
|
||||||
else:
|
|
||||||
title = row
|
|
||||||
with open(ETC_PATH / 'dmg_map.json', 'w', encoding='UTF-8') as file:
|
|
||||||
json.dump(result, file, ensure_ascii=False)
|
|
||||||
|
|
||||||
|
|
||||||
async def main():
|
|
||||||
await panle2Json()
|
|
||||||
|
|
||||||
|
|
||||||
asyncio.run(main())
|
|
Loading…
x
Reference in New Issue
Block a user