From a71f476773b7dc6482f89e674e3ace88b7a6e67d Mon Sep 17 00:00:00 2001 From: qwerdvd <2450899274@qq.com> Date: Sat, 13 May 2023 11:57:21 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- StarRailUID/starrailuid_charinfo/__init__.py | 4 - .../starrailuid_charinfo/draw_char_img.py | 465 ++- .../starrailuid_charinfo/mono/Character.py | 2 +- .../texture2D/LightCore_Rarity1.png | Bin 0 -> 3093 bytes .../texture2D/LightCore_Rarity2.png | Bin 0 -> 5160 bytes .../texture2D/LightCore_Rarity3.png | Bin 0 -> 6867 bytes .../texture2D/LightCore_Rarity4.png | Bin 0 -> 7094 bytes .../texture2D/LightCore_Rarity5.png | Bin 0 -> 8877 bytes .../texture2D/icon_lock.png | Bin 0 -> 639 bytes StarRailUID/starrailuid_charinfo/to_data.py | 19 +- StarRailUID/utils/excel/light_cone_ranks.json | 3148 +++++++++++++++++ StarRailUID/utils/excel/read_excel.py | 3 + StarRailUID/utils/fonts/starrail_fonts.py | 1 + StarRailUID/utils/image/image_tools.py | 47 +- StarRailUID/utils/map/SR_MAP_PATH.py | 18 +- .../EquipmentID2Rarity_mapping_1.0.5.json | 1 + .../map/data/ItemId2Name_mapping_1.0.5.json | 1 + .../data/RelicId2Rarity_mapping_1.0.5.json | 1 + .../skillId2AttackType_mapping_1.0.5.json | 1 + StarRailUID/utils/resource/RESOURCE_PATH.py | 2 + 20 files changed, 3697 insertions(+), 16 deletions(-) create mode 100644 StarRailUID/starrailuid_charinfo/texture2D/LightCore_Rarity1.png create mode 100644 StarRailUID/starrailuid_charinfo/texture2D/LightCore_Rarity2.png create mode 100644 StarRailUID/starrailuid_charinfo/texture2D/LightCore_Rarity3.png create mode 100644 StarRailUID/starrailuid_charinfo/texture2D/LightCore_Rarity4.png create mode 100644 StarRailUID/starrailuid_charinfo/texture2D/LightCore_Rarity5.png create mode 100644 StarRailUID/starrailuid_charinfo/texture2D/icon_lock.png create mode 100644 StarRailUID/utils/excel/light_cone_ranks.json create mode 100644 StarRailUID/utils/map/data/EquipmentID2Rarity_mapping_1.0.5.json create mode 100644 StarRailUID/utils/map/data/ItemId2Name_mapping_1.0.5.json create mode 100644 StarRailUID/utils/map/data/RelicId2Rarity_mapping_1.0.5.json create mode 100644 StarRailUID/utils/map/data/skillId2AttackType_mapping_1.0.5.json diff --git a/StarRailUID/starrailuid_charinfo/__init__.py b/StarRailUID/starrailuid_charinfo/__init__.py index 9dd28f8..3030ca1 100644 --- a/StarRailUID/starrailuid_charinfo/__init__.py +++ b/StarRailUID/starrailuid_charinfo/__init__.py @@ -13,10 +13,6 @@ from ..utils.convert import get_uid from ..utils.error_reply import UID_HINT from ..utils.image.convert import convert_img from .draw_char_img import draw_char_info_img - -# from ..utils.map.GS_MAP_PATH import alias_data -# from .draw_char_rank import draw_cahrcard_list -# from .get_enka_img import draw_enka_img, get_full_char from ..utils.resource.RESOURCE_PATH import TEMP_PATH sv_char_info_config = SV('sr面板设置', pm=2) diff --git a/StarRailUID/starrailuid_charinfo/draw_char_img.py b/StarRailUID/starrailuid_charinfo/draw_char_img.py index af3492b..76404ed 100644 --- a/StarRailUID/starrailuid_charinfo/draw_char_img.py +++ b/StarRailUID/starrailuid_charinfo/draw_char_img.py @@ -1,12 +1,80 @@ import re import json +from pathlib import Path from typing import Dict, Union, Optional +from mpmath import mp, nstr +from PIL import Image, ImageDraw +from gsuid_core.logger import logger from gsuid_core.utils.error_reply import CHAR_HINT +from gsuid_core.utils.image.convert import convert_img +from gsuid_core.utils.image.image_tools import draw_text_by_line from .mono.Character import Character -from ..utils.resource.RESOURCE_PATH import PLAYER_PATH +from ..utils.map.SR_MAP_PATH import RelicId2Rarity +from ..utils.excel.read_excel import light_cone_ranks from ..utils.map.name_covert import name_to_avatar_id, alias_to_char_name +from ..utils.resource.RESOURCE_PATH import ( + RELIC_PATH, + SKILL_PATH, + PLAYER_PATH, + WEAPON_PATH, + CHAR_PORTRAIT, +) +from ..utils.fonts.starrail_fonts import ( + sr_font_20, + sr_font_23, + sr_font_24, + sr_font_26, + sr_font_28, + sr_font_34, + sr_font_38, +) + +mp.dps = 14 + +TEXT_PATH = Path(__file__).parent / 'texture2D' + +bg_img = Image.open(TEXT_PATH / "bg.png") +white_color = (213, 213, 213) + +NUM_MAP = { + 0: '零', + 1: '一', + 2: '二', + 3: '三', + 4: '四', + 5: '五', + 6: '六', +} + +RANK_MAP = { + 1: '_rank1.png', + 2: '_rank2.png', + 3: '_ultimate.png', + 4: '_rank4.png', + 5: '_skill.png', + 6: '_rank6.png', +} + +skill_type_map = { + 'Normal': ('普攻', 'basic_atk'), + 'BPSkill': ('战技', 'skill'), + 'Ultra': ('终结技', 'ultimate'), + '': ('天赋', 'talent'), + 'MazeNormal': 'dev_连携', + 'Maze': ('秘技', 'technique'), +} + + +RELIC_POS = { + '1': (26, 1162), + '2': (367, 1162), + '3': (700, 1162), + '4': (26, 1593), + '5': (367, 1593), + '6': (700, 1593), +} async def draw_char_info_img(raw_mes: str, sr_uid: str, url: Optional[str]): @@ -14,8 +82,396 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str, url: Optional[str]): char_name = ' '.join(re.findall('[\u4e00-\u9fa5]+', raw_mes)) char_data = await get_char_data(sr_uid, char_name) - print(char_data) - await cal_char_info(char_data) + char = await cal_char_info(char_data) + + # 放角色立绘 + char_info = bg_img.copy() + char_img = Image.open(CHAR_PORTRAIT / f'{char.char_id}.png').resize( + (1050, 1050) + ) + char_info.paste(char_img, (-140, -100), char_img) + + # 放属性图标 + attr_img = Image.open(TEXT_PATH / f'IconAttribute{char.char_element}.png') + char_info.paste(attr_img, (580, 131), attr_img) + + # 放角色名 + char_img_draw = ImageDraw.Draw(char_info) + char_img_draw.text( + (690, 175), char.char_name, white_color, sr_font_38, 'mm' + ) + + # 放等级 + char_img_draw.text( + (765, 183), f'LV.{str(char.char_level)}', white_color, sr_font_20, 'mm' + ) + + # 放星级 + rarity_img = Image.open( + TEXT_PATH / f'LightCore_Rarity{char.char_rarity}.png' + ).resize((306, 72)) + char_info.paste(rarity_img, (540, 198), rarity_img) + + # 放命座 + rank_img = Image.open(TEXT_PATH / 'ImgNewBg.png') + rank_img_draw = ImageDraw.Draw(rank_img) + rank_img_draw.text( + (70, 44), f'{NUM_MAP[char.char_rank]} 命', white_color, sr_font_28, 'mm' + ) + char_info.paste(rank_img, (772, 190), rank_img) + + # 放属性列表 + attr_bg = Image.open(TEXT_PATH / 'attr_bg.png') + attr_bg_draw = ImageDraw.Draw(attr_bg) + # 生命值 + hp = mp.mpf(char.base_attributes.get('hp')) + add_hp = mp.mpf( + char.add_attr['HPDelta'] if char.add_attr.get('HPDelta') else 0 + ) + hp * mp.mpf( + char.add_attr['HPAddedRatio'] + if char.add_attr.get('HPAddedRatio') + else 0 + ) + hp = int(mp.floor(hp)) + add_hp = int(mp.floor(add_hp)) + attr_bg_draw.text( + (500, 31), f'{hp + add_hp} (+{add_hp})', white_color, sr_font_26, 'rm' + ) + # 攻击力 + attack = mp.mpf(char.base_attributes['attack']) + add_attack = mp.mpf( + char.add_attr['AttackDelta'] if char.add_attr.get('AttackDelta') else 0 + ) + attack * mp.mpf( + char.add_attr['AttackAddedRatio'] + if char.add_attr.get('AttackAddedRatio') + else 0 + ) + atk = int(mp.floor(attack)) + add_attack = int(mp.floor(add_attack)) + attr_bg_draw.text( + (500, 31 + 48), + f'{atk + add_attack} (+{add_attack})', + white_color, + sr_font_26, + 'rm', + ) + # 防御力 + defence = mp.mpf(char.base_attributes['defence']) + add_defence = mp.mpf( + char.add_attr.get('DefenceDelta') + if char.add_attr.get('DefenceDelta') + else 0 + ) + defence * mp.mpf( + char.add_attr.get('DefenceAddedRatio') + if char.add_attr.get('DefenceAddedRatio') + else 0 + ) + defence = int(mp.floor(defence)) + add_defence = int(mp.floor(add_defence)) + attr_bg_draw.text( + (500, 31 + 48 * 2), + f'{defence + add_defence} (+{add_defence})', + white_color, + sr_font_26, + 'rm', + ) + # 速度 + speed = mp.mpf(char.base_attributes['speed']) + add_speed = mp.mpf( + char.add_attr['SpeedDelta'] if char.add_attr.get('SpeedDelta') else 0 + ) + speed = int(mp.floor(speed)) + add_speed = int(mp.floor(add_speed)) + attr_bg_draw.text( + (500, 31 + 48 * 3), + f'{speed + add_speed} (+{add_speed})', + white_color, + sr_font_26, + 'rm', + ) + # 暴击率 + critical_chance = mp.mpf(char.base_attributes['CriticalChance']) + critical_chance_base = mp.mpf( + char.add_attr['CriticalChanceBase'] + if char.add_attr.get('CriticalChanceBase') + else 0 + ) + critical_chance = (critical_chance + critical_chance_base) * 100 + critical_chance = nstr(critical_chance, 3) + attr_bg_draw.text( + (500, 31 + 48 * 4), + f'{critical_chance}%', + white_color, + sr_font_26, + 'rm', + ) + # 暴击伤害 + critical_damage = mp.mpf(char.base_attributes['CriticalDamage']) + critical_damage_base = mp.mpf( + char.add_attr['CriticalDamageBase'] + if char.add_attr.get('CriticalDamageBase') + else 0 + ) + critical_damage = (critical_damage + critical_damage_base) * 100 + critical_damage = nstr(critical_damage, 4) + attr_bg_draw.text( + (500, 31 + 48 * 5), + f'{critical_damage}%', + white_color, + sr_font_26, + 'rm', + ) + # 效果命中 + status_probability_base = ( + mp.mpf( + char.add_attr.get('StatusProbabilityBase') + if char.add_attr.get('StatusProbabilityBase') + else 0 + ) + * 100 + ) + status_probability = nstr(status_probability_base, 3) + attr_bg_draw.text( + (500, 31 + 48 * 6), + f'{status_probability}%', + white_color, + sr_font_26, + 'rm', + ) + # 效果抵抗 + status_resistance_base = ( + mp.mpf( + char.add_attr['StatusResistanceBase'] + if char.add_attr.get('StatusResistanceBase') + else 0 + ) + * 100 + ) + status_resistance = nstr(status_resistance_base, 3) + attr_bg_draw.text( + (500, 31 + 48 * 7), + f'{status_resistance}%', + white_color, + sr_font_26, + 'rm', + ) + char_info.paste(attr_bg, (517, 265), attr_bg) + + # 命座 + lock_img = Image.open(TEXT_PATH / 'icon_lock.png').resize((50, 50)) + for rank in range(0, 6): + rank_bg = Image.open(TEXT_PATH / 'mz_bg.png') + if rank < char.char_rank: + rank_img = Image.open( + SKILL_PATH / f'{char.char_id}{RANK_MAP[rank + 1]}' + ).resize((50, 50)) + rank_bg.paste(rank_img, (19, 19), rank_img) + char_info.paste(rank_bg, (20 + rank * 80, 630), rank_bg) + else: + rank_img = Image.open( + SKILL_PATH / f'{char.char_id}{RANK_MAP[rank + 1]}' + ).resize((50, 50)) + rank_bg.paste(rank_img, (19, 19), rank_img) + rank_bg.paste(lock_img, (19, 19), lock_img) + char_info.paste(rank_bg, (20 + rank * 80, 630), rank_bg) + + # 技能 + skill_bg = Image.open(TEXT_PATH / 'skill_bg.png') + i = 0 + for skill in char.char_skill: + skill_attr_img = Image.open(TEXT_PATH / 'skill_attr4.png') + skill_panel_img = Image.open(TEXT_PATH / 'skill_panel.png') + skill_img = Image.open( + SKILL_PATH / f'{char.char_id}_' + f'{skill_type_map[skill["skillAttackType"]][1]}.png' + ).resize((55, 55)) + skill_panel_img.paste(skill_img, (18, 15), skill_img) + skill_panel_img.paste(skill_attr_img, (80, 10), skill_attr_img) + skill_panel_img_draw = ImageDraw.Draw(skill_panel_img) + skill_panel_img_draw.text( + (108, 25), + f'{skill_type_map[skill["skillAttackType"]][0]}', + white_color, + sr_font_26, + 'lm', + ) + skill_panel_img_draw.text( + (89, 55), + f'Lv.{skill["skillLevel"]}', + white_color, + sr_font_26, + 'lm', + ) + skill_panel_img_draw.text( + (60, 88), + f'{skill["skillName"]}', + (105, 105, 105), + sr_font_20, + 'lm', + ) + skill_bg.paste(skill_panel_img, (50 + 187 * i, 35), skill_panel_img) + i += 1 + char_info.paste(skill_bg, (0, 710), skill_bg) + + # 武器 + weapon_bg = Image.open(TEXT_PATH / 'weapon_bg.png') + weapon_id = char.equipment['equipmentID'] + weapon_img = Image.open(WEAPON_PATH / f'{weapon_id}.png').resize( + (240, 240) + ) + weapon_bg.paste(weapon_img, (-10, 50), weapon_img) + weapon_bg_draw = ImageDraw.Draw(weapon_bg) + weapon_bg_draw.text( + (370, 47), + f'{char.equipment["equipmentName"]}', + white_color, + sr_font_34, + 'mm', + ) + weapon_bg_draw.text( + (536, 47), + f'{NUM_MAP[char.equipment["equipmentRank"]]} 阶', + white_color, + sr_font_28, + 'mm', + ) + rarity_img = Image.open( + TEXT_PATH / f'LightCore_Rarity{char.equipment["equipmentRank"]}.png' + ).resize((306, 72)) + weapon_bg.paste(rarity_img, (160, 55), rarity_img) + weapon_bg_draw.text( + (430, 90), + f'Lv.{char.equipment["equipmentLevel"]}', + white_color, + sr_font_28, + 'mm', + ) + + # 武器技能 + desc = light_cone_ranks[str(char.equipment['equipmentID'])]['desc'] + desc_params = light_cone_ranks[str(char.equipment['equipmentID'])][ + 'params' + ][char.equipment['equipmentRank']] + for i in range(0, len(desc_params)): + desc = desc.replace(f'#{i + 1}[i]%', f'{str(desc_params[i] * 100)}%') + for i in range(0, len(desc_params)): + desc = desc.replace(f'#{i + 1}[i]', str(desc_params[i])) + draw_text_by_line(weapon_bg, (220, 115), desc, sr_font_24, '#F9F9F9', 372) + char_info.paste(weapon_bg, (22, 870), weapon_bg) + + # 遗器 + weapon_rank_bg = Image.open(TEXT_PATH / 'rank_bg.png') + char_info.paste(weapon_rank_bg, (690, 880), weapon_rank_bg) + + for relic in char.char_relic: + relic_img = Image.open(TEXT_PATH / 'yq_bg3.png') + if str(relic["SetId"])[0] == '3': + relic_piece_img = Image.open( + RELIC_PATH / f'{relic["SetId"]}_{relic["Type"] - 5}.png' + ) + else: + relic_piece_img = Image.open( + RELIC_PATH / f'{relic["SetId"]}_{relic["Type"] - 1}.png' + ) + relic_piece_new_img = relic_piece_img.resize( + (105, 105), Image.Resampling.LANCZOS + ).convert("RGBA") + relic_img.paste(relic_piece_new_img, (200, 90), relic_piece_new_img) + rarity_img = Image.open( + TEXT_PATH + / f'LightCore_Rarity{RelicId2Rarity[str(relic["relicId"])]}.png' + ).resize((200, 48)) + relic_img.paste(rarity_img, (-20, 80), rarity_img) + relic_img_draw = ImageDraw.Draw(relic_img) + # if len(relic['name']) <= 5: + # main_name = relic['relicName'] + # else: + # main_name = ( + # relic['relicName'][:2] + relic['relicName'][4:] + # ) + if len(relic['name']) <= 5: + main_name = relic['name'] + else: + main_name = relic['name'][:2] + relic['name'][4:] + relic_img_draw.text( + (30, 70), + main_name, + (255, 255, 255), + sr_font_34, + anchor='lm', + ) + + # 主属性 + main_value = mp.mpf(relic['MainAffix']['Value']) + main_name: str = relic['MainAffix']['Name'] + main_level: int = relic['Level'] + + if main_name in ['攻击力', '生命值', '防御力', '速度']: + mainValueStr = nstr(main_value, 3) + else: + mainValueStr = nstr(main_value * 100, 3) + '%' + + mainNameNew = ( + main_name.replace('百分比', '') + .replace('伤害加成', '伤加成') + .replace('属性伤害', '伤害') + ) + + relic_img_draw.text( + (35, 150), + mainNameNew, + (255, 255, 255), + sr_font_28, + anchor='lm', + ) + relic_img_draw.text( + (35, 195), + '+{}'.format(mainValueStr), + (255, 255, 255), + sr_font_28, + anchor='lm', + ) + relic_img_draw.text( + (230, 60), + '+{}'.format(str(main_level)), + (255, 255, 255), + sr_font_23, + anchor='mm', + ) + + # relicScore = 0 + for index, i in enumerate(relic['SubAffixList']): + subName: str = i['Name'] + subValue = mp.mpf(i['Value']) + if subName in ['攻击力', '生命值', '防御力', '速度']: + subValueStr = nstr(subValue, 3) + else: + subValueStr = nstr(subValue * 100, 3) + '%' + subNameStr = subName.replace('百分比', '').replace('元素', '') + # 副词条文字颜色 + relic_color = (255, 255, 255) + + relic_img_draw.text( + (47, 237 + index * 47), + '{}'.format(subNameStr), + relic_color, + sr_font_26, + anchor='lm', + ) + relic_img_draw.text( + (290, 237 + index * 47), + '{}'.format(subValueStr), + relic_color, + sr_font_26, + anchor='rm', + ) + + char_info.paste(relic_img, RELIC_POS[str(relic["Type"])], relic_img) + + # 发送图片 + res = await convert_img(char_info) + logger.info('[sr面板]绘图已完成,等待发送!') + return res async def cal_char_info(char_data: dict): @@ -23,6 +479,7 @@ async def cal_char_info(char_data: dict): await char.get_equipment_info() await char.get_char_attribute_bonus() await char.get_relic_info() + return char async def get_char_data( @@ -30,9 +487,7 @@ async def get_char_data( ) -> Union[Dict, str]: player_path = PLAYER_PATH / str(sr_uid) SELF_PATH = player_path / 'SELF' - print(char_name) char_id = await name_to_avatar_id(char_name) - print(char_id) if '开拓者' in char_name: char_name = '开拓者' else: diff --git a/StarRailUID/starrailuid_charinfo/mono/Character.py b/StarRailUID/starrailuid_charinfo/mono/Character.py index c785fb1..8935ad9 100644 --- a/StarRailUID/starrailuid_charinfo/mono/Character.py +++ b/StarRailUID/starrailuid_charinfo/mono/Character.py @@ -18,6 +18,7 @@ class Character: self.char_id: str = card_prop['avatarId'] self.char_name: str = card_prop['avatarName'] self.char_rank = card_prop['rank'] if card_prop.get('rank') else 0 + self.char_rarity = card_prop['avatarRarity'] self.char_element = card_prop['avatarElement'] self.char_promotion = card_prop['avatarPromotion'] self.char_skill = card_prop['avatarSkill'] @@ -81,7 +82,6 @@ class Character: # 计算圣遗物效果 set_id_list = [] for relic in self.char_relic: - print(json.dumps(relic, ensure_ascii=False)) set_id_list.append(relic['SetId']) # 处理主属性 relic_property = relic['MainAffix']['Property'] diff --git a/StarRailUID/starrailuid_charinfo/texture2D/LightCore_Rarity1.png b/StarRailUID/starrailuid_charinfo/texture2D/LightCore_Rarity1.png new file mode 100644 index 0000000000000000000000000000000000000000..91d52554334e2371de53c2bff8f39cce030bce80 GIT binary patch literal 3093 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 literal 0 HcmV?d00001 diff --git a/StarRailUID/starrailuid_charinfo/texture2D/LightCore_Rarity2.png b/StarRailUID/starrailuid_charinfo/texture2D/LightCore_Rarity2.png new file mode 100644 index 0000000000000000000000000000000000000000..628aa690331bf45e3879ff9eec045a567043478e GIT binary patch literal 5160 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 IaF?k60cJ;x5&!@I literal 0 HcmV?d00001 diff --git a/StarRailUID/starrailuid_charinfo/texture2D/LightCore_Rarity3.png b/StarRailUID/starrailuid_charinfo/texture2D/LightCore_Rarity3.png new file mode 100644 index 0000000000000000000000000000000000000000..cbadf889052b3388f3c4338d3a22dc7cc9b71477 GIT binary patch literal 6867 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 literal 0 HcmV?d00001 diff --git a/StarRailUID/starrailuid_charinfo/texture2D/icon_lock.png b/StarRailUID/starrailuid_charinfo/texture2D/icon_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..cf1c4277e20a5d5c280f60d8bce1bd7f288aef41 GIT binary patch literal 639 zcmV-_0)YLAP)Px#1ZP1_K>z@;j|==^1poj7DM>^@RA@u(na@iUVH}57llCC&NzlkH8RQ{6`Qs>s zr#hAh9s*Bwk}h8R1G;pm5IpEX5D^mbP*BHCsYpS`3?d9l@vvdBiRJU%_Y1DWy7RvC z&W;1V4?KM49T|2%&dj^>?iK=p!1Gc`)3QYSHrx9|pD!vDC9Yxo+M%jNQ4GBr{w zLV=6KV|;||vabPOaEda^X6R2UMJUlltl&^}hds}6l0tIEytts57)q3gH#kt;;l?0# z6pO`Il}g3zNr-n5-oy*yju|CF%6z5B2Qy5D*QLeD=p!~U`VWyyWe#WYGs^vQ9Vc)c zqx{5cTw=e>&>i0*PYJoXqm1#UmUR0B9CMdg#J1{=V;*qKjBY#As+p8w&03aDD Image.Image: diff --git a/StarRailUID/utils/map/SR_MAP_PATH.py b/StarRailUID/utils/map/SR_MAP_PATH.py index 80cde92..8fdb427 100644 --- a/StarRailUID/utils/map/SR_MAP_PATH.py +++ b/StarRailUID/utils/map/SR_MAP_PATH.py @@ -26,6 +26,10 @@ EquipmentID2AbilityProperty_fileName = ( f'EquipmentID2AbilityProperty_mapping_{version}.json' ) RelicSetSkill_fileName = f'RelicSetSkill_mapping_{version}.json' +skillId2AttackType_fileName = f'skillId2AttackType_mapping_{version}.json' +EquipmentID2Rarity_fileName = f'EquipmentID2Rarity_mapping_{version}.json' +RelicId2Rarity_fileName = f'RelicId2Rarity_mapping_{version}.json' +ItemId2Name_fileName = f'ItemId2Name_mapping_{version}.json' class TS(TypedDict): @@ -49,7 +53,7 @@ with open(MAP / skillId2Name_fileName, 'r', encoding='UTF-8') as f: skillId2Name = msgjson.decode(f.read(), type=Dict[str, str]) with open(MAP / skillId2Type_fileName, 'r', encoding='UTF-8') as f: - skillId2Type = msgjson.decode(f.read(), type=Dict[str, str]) + skillId2Effect = msgjson.decode(f.read(), type=Dict[str, str]) with open(MAP / Property2Name_fileName, 'r', encoding='UTF-8') as f: Property2Name = msgjson.decode(f.read(), type=Dict[str, str]) @@ -84,3 +88,15 @@ with open( with open(MAP / RelicSetSkill_fileName, 'r', encoding='UTF-8') as f: RelicSetSkill = msgjson.decode(f.read(), type=Dict[str, dict]) + +with open(MAP / skillId2AttackType_fileName, 'r', encoding='UTF-8') as f: + skillId2AttackType = msgjson.decode(f.read(), type=Dict[str, str]) + +with open(MAP / EquipmentID2Rarity_fileName, 'r', encoding='UTF-8') as f: + EquipmentID2Rarity = msgjson.decode(f.read(), type=Dict[str, int]) + +with open(MAP / RelicId2Rarity_fileName, 'r', encoding='UTF-8') as f: + RelicId2Rarity = msgjson.decode(f.read(), type=Dict[str, int]) + +with open(MAP / ItemId2Name_fileName, 'r', encoding='UTF-8') as f: + ItemId2Name = msgjson.decode(f.read(), type=Dict[str, str]) diff --git a/StarRailUID/utils/map/data/EquipmentID2Rarity_mapping_1.0.5.json b/StarRailUID/utils/map/data/EquipmentID2Rarity_mapping_1.0.5.json new file mode 100644 index 0000000..8a1661f --- /dev/null +++ b/StarRailUID/utils/map/data/EquipmentID2Rarity_mapping_1.0.5.json @@ -0,0 +1 @@ +{"20000": 3, "20001": 3, "20002": 3, "20003": 3, "20004": 3, "20005": 3, "20006": 3, "20007": 3, "20008": 3, "20009": 3, "20010": 3, "20011": 3, "20012": 3, "20013": 3, "20014": 3, "20015": 3, "20016": 3, "20017": 3, "20018": 3, "20019": 3, "20020": 3, "21000": 4, "21001": 4, "21002": 4, "21003": 4, "21004": 4, "21005": 4, "21006": 4, "21007": 4, "21008": 4, "21009": 4, "21010": 4, "21011": 4, "21012": 4, "21013": 4, "21014": 4, "21015": 4, "21016": 4, "21017": 4, "21018": 4, "21019": 4, "21020": 4, "21021": 4, "21022": 4, "21023": 4, "21024": 4, "21025": 4, "21026": 4, "21027": 4, "21028": 4, "21029": 4, "21030": 4, "21031": 4, "21032": 4, "21033": 4, "21034": 4, "23000": 5, "23001": 5, "23002": 5, "23003": 5, "23004": 5, "23005": 5, "23010": 5, "23012": 5, "23013": 5, "24000": 5, "24001": 5, "24002": 5, "29000": 3} diff --git a/StarRailUID/utils/map/data/ItemId2Name_mapping_1.0.5.json b/StarRailUID/utils/map/data/ItemId2Name_mapping_1.0.5.json new file mode 100644 index 0000000..ac1e70e --- /dev/null +++ b/StarRailUID/utils/map/data/ItemId2Name_mapping_1.0.5.json @@ -0,0 +1 @@ +{"31011": "过客的逢春木簪", "41011": "过客的逢春木簪", "51011": "过客的逢春木簪", "61011": "过客的逢春木簪", "31012": "过客的游龙臂鞲", "41012": "过客的游龙臂鞲", "51012": "过客的游龙臂鞲", "61012": "过客的游龙臂鞲", "31013": "过客的残绣风衣", "41013": "过客的残绣风衣", "51013": "过客的残绣风衣", "61013": "过客的残绣风衣", "31014": "过客的冥途游履", "41014": "过客的冥途游履", "51014": "过客的冥途游履", "61014": "过客的冥途游履", "31021": "快枪手的野穗毡帽", "41021": "快枪手的野穗毡帽", "51021": "快枪手的野穗毡帽", "61021": "快枪手的野穗毡帽", "31022": "快枪手的粗革手套", "41022": "快枪手的粗革手套", "51022": "快枪手的粗革手套", "61022": "快枪手的粗革手套", "31023": "快枪手的猎风披肩", "41023": "快枪手的猎风披肩", "51023": "快枪手的猎风披肩", "61023": "快枪手的猎风披肩", "31024": "快枪手的铆钉马靴", "41024": "快枪手的铆钉马靴", "51024": "快枪手的铆钉马靴", "61024": "快枪手的铆钉马靴", "31031": "圣骑的宽恕盔面", "41031": "圣骑的宽恕盔面", "51031": "圣骑的宽恕盔面", "61031": "圣骑的宽恕盔面", "31032": "圣骑的沉默誓环", "41032": "圣骑的沉默誓环", "51032": "圣骑的沉默誓环", "61032": "圣骑的沉默誓环", "31033": "圣骑的肃穆胸甲", "41033": "圣骑的肃穆胸甲", "51033": "圣骑的肃穆胸甲", "61033": "圣骑的肃穆胸甲", "31034": "圣骑的秩序铁靴", "41034": "圣骑的秩序铁靴", "51034": "圣骑的秩序铁靴", "61034": "圣骑的秩序铁靴", "31041": "雪猎的荒神兜帽", "41041": "雪猎的荒神兜帽", "51041": "雪猎的荒神兜帽", "61041": "雪猎的荒神兜帽", "31042": "雪猎的巨蜥手套", "41042": "雪猎的巨蜥手套", "51042": "雪猎的巨蜥手套", "61042": "雪猎的巨蜥手套", "31043": "雪猎的冰龙披风", "41043": "雪猎的冰龙披风", "51043": "雪猎的冰龙披风", "61043": "雪猎的冰龙披风", "31044": "雪猎的鹿皮软靴", "41044": "雪猎的鹿皮软靴", "51044": "雪猎的鹿皮软靴", "61044": "雪猎的鹿皮软靴", "31051": "拳王的冠军护头", "41051": "拳王的冠军护头", "51051": "拳王的冠军护头", "61051": "拳王的冠军护头", "31052": "拳王的重炮拳套", "41052": "拳王的重炮拳套", "51052": "拳王的重炮拳套", "61052": "拳王的重炮拳套", "31053": "拳王的贴身护胸", "41053": "拳王的贴身护胸", "51053": "拳王的贴身护胸", "61053": "拳王的贴身护胸", "31054": "拳王的弧步战靴", "41054": "拳王的弧步战靴", "51054": "拳王的弧步战靴", "61054": "拳王的弧步战靴", "31061": "铁卫的铸铁面盔", "41061": "铁卫的铸铁面盔", "51061": "铁卫的铸铁面盔", "61061": "铁卫的铸铁面盔", "31062": "铁卫的银鳞手甲", "41062": "铁卫的银鳞手甲", "51062": "铁卫的银鳞手甲", "61062": "铁卫的银鳞手甲", "31063": "铁卫的旧制军服", "41063": "铁卫的旧制军服", "51063": "铁卫的旧制军服", "61063": "铁卫的旧制军服", "31064": "铁卫的白银护胫", "41064": "铁卫的白银护胫", "51064": "铁卫的白银护胫", "61064": "铁卫的白银护胫", "31071": "火匠的黑曜目镜", "41071": "火匠的黑曜目镜", "51071": "火匠的黑曜目镜", "61071": "火匠的黑曜目镜", "31072": "火匠的御火戒指", "41072": "火匠的御火戒指", "51072": "火匠的御火戒指", "61072": "火匠的御火戒指", "31073": "火匠的阻燃围裙", "41073": "火匠的阻燃围裙", "51073": "火匠的阻燃围裙", "61073": "火匠的阻燃围裙", "31074": "火匠的合金义肢", "41074": "火匠的合金义肢", "51074": "火匠的合金义肢", "61074": "火匠的合金义肢", "31081": "天才的超距遥感", "41081": "天才的超距遥感", "51081": "天才的超距遥感", "61081": "天才的超距遥感", "31082": "天才的频变捕手", "41082": "天才的频变捕手", "51082": "天才的频变捕手", "61082": "天才的频变捕手", "31083": "天才的元域深潜", "41083": "天才的元域深潜", "51083": "天才的元域深潜", "61083": "天才的元域深潜", "31084": "天才的引力漫步", "41084": "天才的引力漫步", "51084": "天才的引力漫步", "61084": "天才的引力漫步", "31091": "乐队的偏光墨镜", "41091": "乐队的偏光墨镜", "51091": "乐队的偏光墨镜", "61091": "乐队的偏光墨镜", "31092": "乐队的巡演手绳", "41092": "乐队的巡演手绳", "51092": "乐队的巡演手绳", "61092": "乐队的巡演手绳", "31093": "乐队的钉刺皮衣", "41093": "乐队的钉刺皮衣", "51093": "乐队的钉刺皮衣", "61093": "乐队的钉刺皮衣", "31094": "乐队的铆钉短靴", "41094": "乐队的铆钉短靴", "51094": "乐队的铆钉短靴", "61094": "乐队的铆钉短靴", "31101": "翔鹰的长喙头盔", "41101": "翔鹰的长喙头盔", "51101": "翔鹰的长喙头盔", "61101": "翔鹰的长喙头盔", "31102": "翔鹰的鹰击指环", "41102": "翔鹰的鹰击指环", "51102": "翔鹰的鹰击指环", "61102": "翔鹰的鹰击指环", "31103": "翔鹰的翼装束带", "41103": "翔鹰的翼装束带", "51103": "翔鹰的翼装束带", "61103": "翔鹰的翼装束带", "31104": "翔鹰的绒羽绑带", "41104": "翔鹰的绒羽绑带", "51104": "翔鹰的绒羽绑带", "61104": "翔鹰的绒羽绑带", "31111": "怪盗的千人假面", "41111": "怪盗的千人假面", "51111": "怪盗的千人假面", "61111": "怪盗的千人假面", "31112": "怪盗的绘纹手套", "41112": "怪盗的绘纹手套", "51112": "怪盗的绘纹手套", "61112": "怪盗的绘纹手套", "31113": "怪盗的纤钢爪钩", "41113": "怪盗的纤钢爪钩", "51113": "怪盗的纤钢爪钩", "61113": "怪盗的纤钢爪钩", "31114": "怪盗的流星快靴", "41114": "怪盗的流星快靴", "51114": "怪盗的流星快靴", "61114": "怪盗的流星快靴", "31121": "废土客的呼吸面罩", "41121": "废土客的呼吸面罩", "51121": "废土客的呼吸面罩", "61121": "废土客的呼吸面罩", "31122": "废土客的荒漠终端", "41122": "废土客的荒漠终端", "51122": "废土客的荒漠终端", "61122": "废土客的荒漠终端", "31123": "废土客的修士长袍", "41123": "废土客的修士长袍", "51123": "废土客的修士长袍", "61123": "废土客的修士长袍", "31124": "废土客的动力腿甲", "41124": "废土客的动力腿甲", "51124": "废土客的动力腿甲", "61124": "废土客的动力腿甲", "33015": "「黑塔」的空间站点", "43015": "「黑塔」的空间站点", "53015": "「黑塔」的空间站点", "63015": "「黑塔」的空间站点", "33016": "「黑塔」的漫历轨迹", "43016": "「黑塔」的漫历轨迹", "53016": "「黑塔」的漫历轨迹", "63016": "「黑塔」的漫历轨迹", "33025": "罗浮仙舟的天外楼船", "43025": "罗浮仙舟的天外楼船", "53025": "罗浮仙舟的天外楼船", "63025": "罗浮仙舟的天外楼船", "33026": "罗浮仙舟的建木枝蔓", "43026": "罗浮仙舟的建木枝蔓", "53026": "罗浮仙舟的建木枝蔓", "63026": "罗浮仙舟的建木枝蔓", "33035": "公司的巨构总部", "43035": "公司的巨构总部", "53035": "公司的巨构总部", "63035": "公司的巨构总部", "33036": "公司的贸易航道", "43036": "公司的贸易航道", "53036": "公司的贸易航道", "63036": "公司的贸易航道", "33045": "贝洛伯格的存护堡垒", "43045": "贝洛伯格的存护堡垒", "53045": "贝洛伯格的存护堡垒", "63045": "贝洛伯格的存护堡垒", "33046": "贝洛伯格的铁卫防线", "43046": "贝洛伯格的铁卫防线", "53046": "贝洛伯格的铁卫防线", "63046": "贝洛伯格的铁卫防线", "33055": "螺丝星的机械烈阳", "43055": "螺丝星的机械烈阳", "53055": "螺丝星的机械烈阳", "63055": "螺丝星的机械烈阳", "33056": "螺丝星的环星孔带", "43056": "螺丝星的环星孔带", "53056": "螺丝星的环星孔带", "63056": "螺丝星的环星孔带", "33065": "萨尔索图的移动城市", "43065": "萨尔索图的移动城市", "53065": "萨尔索图的移动城市", "63065": "萨尔索图的移动城市", "33066": "萨尔索图的晨昏界线", "43066": "萨尔索图的晨昏界线", "53066": "萨尔索图的晨昏界线", "63066": "萨尔索图的晨昏界线", "33075": "塔利亚的钉壳小镇", "43075": "塔利亚的钉壳小镇", "53075": "塔利亚的钉壳小镇", "63075": "塔利亚的钉壳小镇", "33076": "塔利亚的裸皮电线", "43076": "塔利亚的裸皮电线", "53076": "塔利亚的裸皮电线", "63076": "塔利亚的裸皮电线", "33085": "翁瓦克的诞生之岛", "43085": "翁瓦克的诞生之岛", "53085": "翁瓦克的诞生之岛", "63085": "翁瓦克的诞生之岛", "33086": "翁瓦克的环岛海岸", "43086": "翁瓦克的环岛海岸", "53086": "翁瓦克的环岛海岸", "63086": "翁瓦克的环岛海岸", "55001": "过客的残绣风衣", "55002": "过客的冥途游履", "55003": "快枪手的猎风披肩", "55004": "圣骑的肃穆胸甲", "55005": "圣骑的秩序铁靴", "55006": "拳王的贴身护胸"} diff --git a/StarRailUID/utils/map/data/RelicId2Rarity_mapping_1.0.5.json b/StarRailUID/utils/map/data/RelicId2Rarity_mapping_1.0.5.json new file mode 100644 index 0000000..8088bcf --- /dev/null +++ b/StarRailUID/utils/map/data/RelicId2Rarity_mapping_1.0.5.json @@ -0,0 +1 @@ +{"31011": 2, "31012": 2, "31013": 2, "31014": 2, "31021": 2, "31022": 2, "31023": 2, "31024": 2, "31031": 2, "31032": 2, "31033": 2, "31034": 2, "31041": 2, "31042": 2, "31043": 2, "31044": 2, "31051": 2, "31052": 2, "31053": 2, "31054": 2, "31061": 2, "31062": 2, "31063": 2, "31064": 2, "31071": 2, "31072": 2, "31073": 2, "31074": 2, "31081": 2, "31082": 2, "31083": 2, "31084": 2, "31091": 2, "31092": 2, "31093": 2, "31094": 2, "31101": 2, "31102": 2, "31103": 2, "31104": 2, "31111": 2, "31112": 2, "31113": 2, "31114": 2, "31121": 2, "31122": 2, "31123": 2, "31124": 2, "33015": 2, "33016": 2, "33025": 2, "33026": 2, "33035": 2, "33036": 2, "33045": 2, "33046": 2, "33055": 2, "33056": 2, "33065": 2, "33066": 2, "33075": 2, "33076": 2, "33085": 2, "33086": 2, "41011": 3, "41012": 3, "41013": 3, "41014": 3, "41021": 3, "41022": 3, "41023": 3, "41024": 3, "41031": 3, "41032": 3, "41033": 3, "41034": 3, "41041": 3, "41042": 3, "41043": 3, "41044": 3, "41051": 3, "41052": 3, "41053": 3, "41054": 3, "41061": 3, "41062": 3, "41063": 3, "41064": 3, "41071": 3, "41072": 3, "41073": 3, "41074": 3, "41081": 3, "41082": 3, "41083": 3, "41084": 3, "41091": 3, "41092": 3, "41093": 3, "41094": 3, "41101": 3, "41102": 3, "41103": 3, "41104": 3, "41111": 3, "41112": 3, "41113": 3, "41114": 3, "41121": 3, "41122": 3, "41123": 3, "41124": 3, "43015": 3, "43016": 3, "43025": 3, "43026": 3, "43035": 3, "43036": 3, "43045": 3, "43046": 3, "43055": 3, "43056": 3, "43065": 3, "43066": 3, "43075": 3, "43076": 3, "43085": 3, "43086": 3, "51011": 4, "51012": 4, "51013": 4, "51014": 4, "51021": 4, "51022": 4, "51023": 4, "51024": 4, "51031": 4, "51032": 4, "51033": 4, "51034": 4, "51041": 4, "51042": 4, "51043": 4, "51044": 4, "51051": 4, "51052": 4, "51053": 4, "51054": 4, "51061": 4, "51062": 4, "51063": 4, "51064": 4, "51071": 4, "51072": 4, "51073": 4, "51074": 4, "51081": 4, "51082": 4, "51083": 4, "51084": 4, "51091": 4, "51092": 4, "51093": 4, "51094": 4, "51101": 4, "51102": 4, "51103": 4, "51104": 4, "51111": 4, "51112": 4, "51113": 4, "51114": 4, "51121": 4, "51122": 4, "51123": 4, "51124": 4, "53015": 4, "53016": 4, "53025": 4, "53026": 4, "53035": 4, "53036": 4, "53045": 4, "53046": 4, "53055": 4, "53056": 4, "53065": 4, "53066": 4, "53075": 4, "53076": 4, "53085": 4, "53086": 4, "55001": 4, "55002": 4, "55003": 4, "55004": 4, "55005": 4, "55006": 4, "61011": 5, "61012": 5, "61013": 5, "61014": 5, "61021": 5, "61022": 5, "61023": 5, "61024": 5, "61031": 5, "61032": 5, "61033": 5, "61034": 5, "61041": 5, "61042": 5, "61043": 5, "61044": 5, "61051": 5, "61052": 5, "61053": 5, "61054": 5, "61061": 5, "61062": 5, "61063": 5, "61064": 5, "61071": 5, "61072": 5, "61073": 5, "61074": 5, "61081": 5, "61082": 5, "61083": 5, "61084": 5, "61091": 5, "61092": 5, "61093": 5, "61094": 5, "61101": 5, "61102": 5, "61103": 5, "61104": 5, "61111": 5, "61112": 5, "61113": 5, "61114": 5, "61121": 5, "61122": 5, "61123": 5, "61124": 5, "63015": 5, "63016": 5, "63025": 5, "63026": 5, "63035": 5, "63036": 5, "63045": 5, "63046": 5, "63055": 5, "63056": 5, "63065": 5, "63066": 5, "63075": 5, "63076": 5, "63085": 5, "63086": 5} diff --git a/StarRailUID/utils/map/data/skillId2AttackType_mapping_1.0.5.json b/StarRailUID/utils/map/data/skillId2AttackType_mapping_1.0.5.json new file mode 100644 index 0000000..64fa72f --- /dev/null +++ b/StarRailUID/utils/map/data/skillId2AttackType_mapping_1.0.5.json @@ -0,0 +1 @@ +{"100101": "Normal", "100103": "Ultra", "100104": "", "100106": "MazeNormal", "100107": "Maze", "100201": "Normal", "100202": "BPSkill", "100203": "Ultra", "100204": "", "100206": "MazeNormal", "100207": "Maze", "100302": "BPSkill", "100306": "MazeNormal", "100307": "Maze", "100401": "Normal", "100402": "BPSkill", "100404": "", "100406": "MazeNormal", "100501": "Normal", "100502": "BPSkill", "100503": "Ultra", "100504": "", "100506": "MazeNormal", "100507": "Maze", "100801": "Normal", "100802": "BPSkill", "100803": "Ultra", "100804": "", "100806": "MazeNormal", "100807": "Maze", "100901": "Normal", "100902": "BPSkill", "100903": "Ultra", "100904": "", "100906": "MazeNormal", "100907": "Maze", "101301": "Normal", "101302": "BPSkill", "101303": "Ultra", "101304": "", "101306": "MazeNormal", "101307": "Maze", "110101": "Normal", "110102": "BPSkill", "110103": "Ultra", "110104": "", "110106": "MazeNormal", "110107": "Maze", "110203": "Ultra", "110206": "MazeNormal", "110207": "Maze", "110301": "Normal", "110302": "BPSkill", "110303": "Ultra", "110304": "", "110306": "MazeNormal", "110307": "Maze", "110401": "Normal", "110402": "BPSkill", "110403": "Ultra", "110404": "", "110406": "MazeNormal", "110407": "Maze", "110501": "Normal", "110502": "BPSkill", "110503": "Ultra", "110506": "MazeNormal", "110601": "Normal", "110602": "BPSkill", "110604": "", "110606": "MazeNormal", "110607": "Maze", "110801": "Normal", "110802": "BPSkill", "110803": "Ultra", "110806": "MazeNormal", "110807": "Maze", "110901": "Normal", "110902": "BPSkill", "110903": "Ultra", "110904": "", "110906": "MazeNormal", "110907": "Maze", "110909": "BPSkill", "120101": "Normal", "120108": "Normal", "120103": "Ultra", "120104": "", "120106": "MazeNormal", "120107": "Maze", "120201": "Normal", "120206": "MazeNormal", "120207": "Maze", "120301": "Normal", "120302": "BPSkill", "120303": "Ultra", "120304": "", "120306": "MazeNormal", "120307": "Maze", "120601": "Normal", "120602": "BPSkill", "120603": "Ultra", "120604": "", "120606": "MazeNormal", "120607": "Maze", "120901": "Normal", "120902": "BPSkill", "120903": "Ultra", "120904": "", "120906": "MazeNormal", "120907": "Maze", "121101": "Normal", "121102": "BPSkill", "121103": "Ultra", "121106": "MazeNormal", "121107": "Maze", "800101": "Normal", "800102": "BPSkill", "800103": "Ultra", "800104": "", "800106": "MazeNormal", "800107": "Maze", "800108": "Ultra", "800109": "Ultra", "800201": "Normal", "800202": "BPSkill", "800203": "Ultra", "800204": "", "800206": "MazeNormal", "800207": "Maze", "800208": "Ultra", "800209": "Ultra", "800301": "Normal", "800308": "Normal", "800303": "Ultra", "800304": "", "800306": "MazeNormal", "800307": "Maze", "800401": "Normal", "800408": "Normal", "800403": "Ultra", "800404": "", "800406": "MazeNormal", "800407": "Maze", "100601": "Normal", "100602": "BPSkill", "100603": "Ultra", "100604": "", "100606": "MazeNormal", "100607": "Maze", "120401": "Normal", "120402": "BPSkill", "120403": "Ultra", "120404": "", "120406": "MazeNormal", "909807": "Maze", "110603": "Ultra", "110507": "Maze", "800402": "BPSkill", "800302": "BPSkill", "120202": "BPSkill", "120204": "", "110804": "", "110504": "", "110202": "BPSkill", "110204": "", "100301": "Normal", "100304": "", "100303": "Ultra", "110701": "Normal", "110702": "BPSkill", "110703": "Ultra", "110704": "", "110706": "MazeNormal", "110707": "Maze", "110201": "Normal", "121104": "", "120407": "Maze", "100407": "Maze", "120102": "BPSkill", "100102": "BPSkill", "120203": "Ultra", "100403": "Ultra"} diff --git a/StarRailUID/utils/resource/RESOURCE_PATH.py b/StarRailUID/utils/resource/RESOURCE_PATH.py index 0113139..f977119 100644 --- a/StarRailUID/utils/resource/RESOURCE_PATH.py +++ b/StarRailUID/utils/resource/RESOURCE_PATH.py @@ -14,6 +14,7 @@ CHAR_ICON_PATH = RESOURCE_PATH / 'character' WEAPON_PATH = RESOURCE_PATH / 'light_cone' CHAR_PORTRAIT = RESOURCE_PATH / 'character_portrait' SKILL_PATH = RESOURCE_PATH / 'skill' +RELIC_PATH = RESOURCE_PATH / 'relic' TEXT2D_PATH = Path(__file__).parent / 'texture2d' @@ -29,6 +30,7 @@ def init_dir(): TEMP_PATH, CHAR_PORTRAIT, SKILL_PATH, + RELIC_PATH, ]: i.mkdir(parents=True, exist_ok=True)