From 214acfd90bdb71f83164120b8a5f019f986a11ab Mon Sep 17 00:00:00 2001 From: qwerdvd <2450899274@qq.com> Date: Sat, 13 May 2023 18:16:24 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A8=E4=BF=AE=E5=A4=8D=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starrailuid_charinfo/draw_char_img.py | 314 ++++++++++-------- .../starrailuid_charinfo/mono/Character.py | 55 +-- .../texture2D/skill_attr1.png | Bin 1468 -> 1150 bytes .../texture2D/skill_attr2.png | Bin 1688 -> 1207 bytes .../texture2D/skill_attr3.png | Bin 1709 -> 1226 bytes .../texture2D/skill_attr4.png | Bin 1289 -> 907 bytes .../texture2D/skill_attr5.png | Bin 0 -> 1289 bytes StarRailUID/utils/fonts/FirstWorld.ttf | Bin 0 -> 52656 bytes StarRailUID/utils/fonts/first_world.py | 13 + 9 files changed, 214 insertions(+), 168 deletions(-) create mode 100644 StarRailUID/starrailuid_charinfo/texture2D/skill_attr5.png create mode 100644 StarRailUID/utils/fonts/FirstWorld.ttf create mode 100644 StarRailUID/utils/fonts/first_world.py diff --git a/StarRailUID/starrailuid_charinfo/draw_char_img.py b/StarRailUID/starrailuid_charinfo/draw_char_img.py index a0da66a..29842f3 100644 --- a/StarRailUID/starrailuid_charinfo/draw_char_img.py +++ b/StarRailUID/starrailuid_charinfo/draw_char_img.py @@ -12,6 +12,7 @@ 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.fonts.first_world import fw_font_120 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 @@ -292,7 +293,6 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str, url: Optional[str]): 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: @@ -302,18 +302,23 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str, url: Optional[str]): 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_img = ( + Image.open(SKILL_PATH / f'{char.char_id}{RANK_MAP[rank + 1]}') + .resize((50, 50)) + .convert("RGBA") + ) + alpha = rank_img.getchannel('A') + alpha = alpha.point(lambda i: i // 2) + rank_img.putalpha(alpha) rank_bg.paste(rank_img, (19, 19), rank_img) - rank_bg.paste(lock_img, (19, 19), lock_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_attr_img = Image.open(TEXT_PATH / f'skill_attr{i + 1}.png') skill_panel_img = Image.open(TEXT_PATH / 'skill_panel.png') skill_img = Image.open( SKILL_PATH / f'{char.char_id}_' @@ -348,157 +353,182 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str, url: Optional[str]): 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["equipmentRarity"]}.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'] - 1] - for i in range(0, len(desc_params)): - temp = math.floor(desc_params[i] * 1000) / 10 - desc = desc.replace(f'#{i + 1}[i]%', f'{str(temp)}%') - 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) + if char.equipment != {}: + 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{RelicId2Rarity[str(relic["relicId"])]}.png' - ).resize((200, 48)) - relic_img.paste(rarity_img, (-10, 80), rarity_img) - relic_img_draw = ImageDraw.Draw(relic_img) - if len(relic['relicName']) <= 5: - main_name = relic['relicName'] - else: - main_name = relic['relicName'][:2] + relic['relicName'][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 = str(math.floor(main_value * 1000) / 10) + '%' - - mainNameNew = ( - main_name.replace('百分比', '') - .replace('伤害加成', '伤加成') - .replace('属性伤害', '伤害') - ) - - relic_img_draw.text( - (35, 150), - mainNameNew, - (255, 255, 255), + / f'LightCore_Rarity{char.equipment["equipmentRarity"]}.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, - anchor='lm', - ) - relic_img_draw.text( - (35, 195), - '+{}'.format(mainValueStr), - (255, 255, 255), - sr_font_28, - anchor='lm', - ) - relic_img_draw.text( - (180, 105), - '+{}'.format(str(main_level)), - (255, 255, 255), - sr_font_23, - anchor='mm', + '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) + # 武器技能 + desc = light_cone_ranks[str(char.equipment['equipmentID'])]['desc'] + desc_params = light_cone_ranks[str(char.equipment['equipmentID'])][ + 'params' + ][char.equipment['equipmentRank'] - 1] + for i in range(0, len(desc_params)): + temp = math.floor(desc_params[i] * 1000) / 10 + desc = desc.replace(f'#{i + 1}[i]%', f'{str(temp)}%') + 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) + else: + char_img_draw.text( + (525, 1005), + 'No light cone!', + white_color, + fw_font_120, + 'mm', + ) + + # 遗器 + if char.char_relic: + 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: - subValueStr = nstr(subValue * 100, 3) + '%' - subNameStr = subName.replace('百分比', '').replace('元素', '') - # 副词条文字颜色 - relic_color = (255, 255, 255) + 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' + f'{RelicId2Rarity[str(relic["relicId"])]}.png' + ).resize((200, 48)) + relic_img.paste(rarity_img, (-10, 80), rarity_img) + relic_img_draw = ImageDraw.Draw(relic_img) + if len(relic['relicName']) <= 5: + main_name = relic['relicName'] + else: + main_name = relic['relicName'][:2] + relic['relicName'][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 = str(math.floor(main_value * 1000) / 10) + '%' + + mainNameNew = ( + main_name.replace('百分比', '') + .replace('伤害加成', '伤加成') + .replace('属性伤害', '伤害') + ) relic_img_draw.text( - (47, 237 + index * 47), - '{}'.format(subNameStr), - relic_color, - sr_font_26, + (35, 150), + mainNameNew, + (255, 255, 255), + sr_font_28, anchor='lm', ) relic_img_draw.text( - (290, 237 + index * 47), - '{}'.format(subValueStr), - relic_color, - sr_font_26, - anchor='rm', + (35, 195), + '+{}'.format(mainValueStr), + (255, 255, 255), + sr_font_28, + anchor='lm', + ) + relic_img_draw.text( + (180, 105), + '+{}'.format(str(main_level)), + (255, 255, 255), + sr_font_23, + anchor='mm', ) - char_info.paste(relic_img, RELIC_POS[str(relic["Type"])], relic_img) + # 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 + ) + else: + char_img_draw.text( + (525, 1565), + 'No relic!', + white_color, + fw_font_120, + 'mm', + ) # 发送图片 - # char_info.show() + char_info.show() res = await convert_img(char_info) logger.info('[sr面板]绘图已完成,等待发送!') return res diff --git a/StarRailUID/starrailuid_charinfo/mono/Character.py b/StarRailUID/starrailuid_charinfo/mono/Character.py index 8935ad9..021bb78 100644 --- a/StarRailUID/starrailuid_charinfo/mono/Character.py +++ b/StarRailUID/starrailuid_charinfo/mono/Character.py @@ -37,35 +37,38 @@ class Character: self.seq_str: str = '无匹配' async def get_equipment_info(self): - base_attr = self.base_attributes - equip = self.equipment - ability_property = EquipmentID2AbilityProperty[ - str(equip['equipmentID']) - ] - equip_rank = equip['equipmentRank'] + if self.equipment == {}: + return + else: + base_attr = self.base_attributes + equip = self.equipment + ability_property = EquipmentID2AbilityProperty[ + str(equip['equipmentID']) + ] + equip_rank = equip['equipmentRank'] - equip_ability_property = ability_property[str(equip_rank)] + equip_ability_property = ability_property[str(equip_rank)] - equip_add_base_attr = equip['baseAttributes'] - hp = mp.mpf(base_attr['hp']) + mp.mpf(equip_add_base_attr['hp']) - attack = mp.mpf(base_attr['attack']) + mp.mpf( - equip_add_base_attr['attack'] - ) - defence = mp.mpf(base_attr['defence']) + mp.mpf( - equip_add_base_attr['defence'] - ) - base_attr['hp'] = str(hp) - base_attr['attack'] = str(attack) - base_attr['defence'] = str(defence) - self.base_attributes = base_attr + equip_add_base_attr = equip['baseAttributes'] + hp = mp.mpf(base_attr['hp']) + mp.mpf(equip_add_base_attr['hp']) + attack = mp.mpf(base_attr['attack']) + mp.mpf( + equip_add_base_attr['attack'] + ) + defence = mp.mpf(base_attr['defence']) + mp.mpf( + equip_add_base_attr['defence'] + ) + base_attr['hp'] = str(hp) + base_attr['attack'] = str(attack) + base_attr['defence'] = str(defence) + self.base_attributes = base_attr - for equip_ability in equip_ability_property: - property_type = equip_ability['PropertyType'] - value = equip_ability['Value']['Value'] - if property_type in self.add_attr: - self.add_attr[property_type] += value - else: - self.add_attr[property_type] = value + for equip_ability in equip_ability_property: + property_type = equip_ability['PropertyType'] + value = equip_ability['Value']['Value'] + if property_type in self.add_attr: + self.add_attr[property_type] += value + else: + self.add_attr[property_type] = value async def get_char_attribute_bonus(self): attribute_bonus = self.attribute_bonus diff --git a/StarRailUID/starrailuid_charinfo/texture2D/skill_attr1.png b/StarRailUID/starrailuid_charinfo/texture2D/skill_attr1.png index 4e05968a09f6d0a71c224503d261cc95e16338e3..fc515ca4e12f04f29e347a4a894bc10e58d6f978 100644 GIT binary patch delta 1101 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 Y07f&Nea3Z>$p8QV07*qoM6N<$f;W0RL;wH) delta 1643 zcmV-x29)`?378F#Kz{~8NklsY&Xj+MRGWNdSg$pA%% z4jf^TKh%VWOhAZ;fFwr4e-48%L5&0x1vR*!L{XGSFn}O9*kFJ>rpUyN&B4m(d$+x7 zd#~rzq8n?)k@z3K_T=V%-#OmHCcV6nUF@)# zsJLnn@p%$PB;f#~PDPjm`io)gdi+5N>jsk0FzN^f9jASHu6A=(1;3~; zn}0aNq8;V&(YpLhX5q?bw3RGL#Kv09l&04!XF6SUPt^ot^~@=n<+U~1HPb4%XTLuw z9c;eXyEiuJZ6q{|VJOyppOvkdSjuGPjij=}VaPmuN`J~+zf3>XB2YTq2ZsRVgBY93 zSP!0((hGCg^4c2JqiJSRxZED~e7Mv1x?hw!ao^iXnn#|adK-U|j>}Pyo6beL>OSyZ ztb1O6e~y(-!TO6=Bk=j5V63l>Be?oyLfQTw#p?}wf)_ynrRhTd6_O+_#5yD(smCbX zXgF_I^M6#%+AZGJRkO8um8D!3suTiyx^`Otnp^v!Y61@&O@Ki|s!B$)Lj5-X&jFDT z&t2|6-Ro9%#^y;tQo|UXnirbROL=P+>&M(Oihi)GF$9;o`k^GB0~8ggDB`dfP+e&z z6mh0aI|9FUT#KG)zvepr*Gxl6YB)XBm|d8~ynj%?OkY_%im~1@dh|j+)HnE`Zm9t# zm$I;FhaaRcz}RdiX56GD)m0Uo?fOlb?)9)8DT1mik=H{Ek1!eqhfOng;Y`hj6;Ep) zNfRh7mPb+h26-+AX)hi;RIby4jXWJy|`GpFedRS2RK()u>4DAI`T&V9U26gq0|) zoUMl(`{4EVdKGx*Ge2~6$}s;4HB1`A0u?XYzJ8_u$XV&P-N&Tu=i0*CJFdIhuzX-u zn=NM2VKtMfIyJ$@EXKLq83w023ZrZcn12mJH-cV6Ku!h?K}ms2SHmDh{uzv-LR(WP zqdkps$O_ow;(t8GpreoQi^|C29A?4X>8d%CiZ~ncEoMm!EAakTeelCiAy~i40J%0g zHU@k9%DZmRFeJP>PY)KnFl-mi+|Gpy&VcLy9Vq zt$TuJ)^78^*5!<@>+ErNp(Axb43ktfT7cr~3w3(@?6tj(A$w^7E2Ih}3MfE976U#J zV1IKEZn$M|-jHDpGK#ix43{X2%YWbYH6A<_`nYMy4gL7<@SLtpCyg{%QpyM`tRNJU>wo+DsNF&FEPJ$-S5w|}uXpEJC= zKs&B42;||DVnbgD@A9D}^*A7gh4LbHGC=}4V=|ZfRF%fQa-;W@(ABD4Ty}2;h|ZT>e`kIVdqC*i!DdbNKJh~ z<@lBEi1J7opG%_!;ex~A|9^O2@a%zR>0@s|_O<*R@dWx5%3-Iqs1|OvwEB<4ryNAW z9N?P+&ynlZD)3yt5jnszWGfN}e(!cE=qMe#dcN+984vQ=*xO&aBCaLtJWJcUT-)(D z1Rsvb4vmU@2z}uu`U25KXj~sw+!1_TK`r*py&bF@UtnH&z9Bo*{$yotbas{H(~;>W zHm)87>dT>)PpkuOz@G-=Qk)%GKEnV2002ovPDHLkV1oT7EG_^5 diff --git a/StarRailUID/starrailuid_charinfo/texture2D/skill_attr3.png b/StarRailUID/starrailuid_charinfo/texture2D/skill_attr3.png index 1108bcf156ccafb9d0b6c355089a9a564550f46f..de510366d6552f2ccc8ef78866c12e0f2365ff95 100644 GIT binary patch delta 1178 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 diff --git a/StarRailUID/starrailuid_charinfo/texture2D/skill_attr4.png b/StarRailUID/starrailuid_charinfo/texture2D/skill_attr4.png index ba943319d0e92bb383f5e8da9559e2482a646a2a..fb1d0201e49cd670df88870f42b57475e3386b59 100644 GIT binary patch delta 856 zcmV-e1E>6n3X2DjKz{=@NklGHAK)E-(a4K*<= z(~MG5A~5<_{ID3qZ7iyoK-CI)5}Mo^KDvZc;<;&V=?+uiHl&fQLb zggNh({_qb!a5?Av&f|N(KYr)HHrs4D6bgj|eNsH+4S`$U5Pt!}TtXO_kB7Vw;FcH2 zsVF+9;5i`-2pnsBQD`=s?Rbhan{q55$@A*$lj-WL6Ni!W3pmUR61SX@%jLS*Q$@9r zhRir&aEO?pJsSI%sf(hhS-gZ3yo6DT!({Qgy2MLYk0C*laeF|f)hjJSMzz4U^44y* zui~W}!dV!JDu1Orqw7+tZk%DAPIkV5<*{LqYjuP&IW=aXzgt7PoLyYSISDJ|a{Z13 zomW&OQ%G%dGw|y}Cs2!K2#wZ&Bupt(rKH6#jST9+X8q13?S6%kOL0(e$i>+F;@ZTr ziY(SCE86#<0d%Eh5T;LpzK0E<(CWP6k%o)}RBRc}sef^|SR^tc_ilXD8vc2mkYErY z6y~Y3^U6`>8l+KbnaAmX$@d*#F%5wBYzYLZBE4&Ev(qrx{1jwy382o*0a7Fa+sxF` zWasNo6CJIMw9EMlUAHyqU++3Gz%WkQ?RGLA59137*lXnNF$@kNd|k#jhi%Xv4~_P^ z*fZFnFMs+sejgCzJWxQ8#WA^s*WwFHQb@5xXrG@$slEqEWmiBT5TH~y!oJJp5ELE( z9tY(bX?fN=+SXi;e)tJ;>cB^>fz!){ic1?BtG#)k;(CEt9u~}s|7?2X-K;%V>J@cZ z%&R?jZ?`U)jMe7FMWb)$`f#dhJ4KlZhrNBi_kXimm71nSg%s$tE`wO6fbislUePag zHBHv>;VL9Lj<@-RlQ0XaP%40Szq1VX?};*G?hTEJB||m40j1Ra_0FvpBwC45JCB!d z2xnmyR-B-0Jv2=p4c~ug7eNNV@XN>D(;qu4xjOv=FJTro?XKy`6;;ZS#&k-8DSYZ- zf=C7@XqaANn3w*5{(amEPq@eEEY@D*Vo_o#-ZZk;yV~$|z5VVNQgl!d+E3V$n5K16u7@1eA@)6>((2L}hg zV4kkuY-nhxLstn(RCL9|nh>-g;Y;E@Jw5$!`y%?Gm6et6rlzL8$z(D~BvRDc+WKxZ z8l`KwwH>>{W`eLMwULx~UQtm|qNb*XC5@)j>81Jk`MJEjyu{Yl*3Xy=B@&6(o12@P z(ET@2AAg(_Tycq-Ah^A+=I7_PXS3O-OG``Nx3#ss(%akn{_O1R#M#-|I$Xya8yoN9 zIOJHOHhpmpY}n#TAOg4Xs;a6xoI5!=c?99V;QkioU%-6r`ue&#>v%kVqqDQKL(h3s zEW+-)_%k=gX8EyVm%kDxe+An z|BR6cTFZBp3%JqO%F4=0S65emg8Ng>C6meDH#RmNBRSr7x{6>=H(LLP0VLEKLhcwNdWD=WK~mzPJ6kB=W=eSdm-dIU#t59=>uoJCcB zn4FyaER{+fV|)fa^{8JjlT0pQiC=-UD1?>^3k(0ok3t{BpF^o%LPBGUi;KVY_xFE* zwJz+<;Da(eIy(9(#Ghcyib(jGpU5yinSZWRz6$2^=#d|VIA0gs*z5Q_e#8$3J{*Vm zEq;PaR*m)S-rnBVEKXVC1g%ADt00000NkvXXu0mjf DeV21Q diff --git a/StarRailUID/starrailuid_charinfo/texture2D/skill_attr5.png b/StarRailUID/starrailuid_charinfo/texture2D/skill_attr5.png new file mode 100644 index 0000000000000000000000000000000000000000..ba943319d0e92bb383f5e8da9559e2482a646a2a GIT binary patch literal 1289 zcmV+k1@`)hP)Px#1ZP1_K>z@;j|==^1poj9vq?ljR7gvWR@+OZRUAE+@#xVbY7Sly92Kvbm&SBT zf+>9JVS-2oCuo>nVwjiyfc}B%G3v31o}{Fr2zn6|lS-IGA7s=pM!YLt&UiUT$8%b1 z`>l`dp6^r(7W?}B)^Gjx{=Rd;fktdAm42)7E9FE*WdTXq2l7=I~ZT%nm0#ETyaDLx{f$ywm0!1 zWlmuu-rnAR9d2);Z(bL;zS`2#@(%hER)uU~nIa98g}vYkD^NZ}c((7Mw6W9E)5iw~ z2ftvRuHS5EXsAP12})FS#lxBqv>@S2;ypb*{c!st`k|GTmG7peroPE!GD##-)Y{tm zZZsODYq_-@yTWFIuqU;Vlz3iIQBk6%riLYrrqk)A`T6;|yu7@`*4Ea~m-)_%k=gX8EyVm%kDxe+An z|BR6cTFZBp3%JqO%F4=0S65emg8Ng>C6meDH#RmNBRSr7x{6>=H(LLP0VLEKLn~%RMOA*7 zoSghDl}a6Bd-q+*f<6q((Kg9S1OnGDiO2QYX7@@NeRTh=$49?RtGc$kg?CgAjaTe#E z@I*rpo1U1M_zEq{o6D(U8%UVQDGD-J8cg9cIfC>16@3FZ-(6T(_yq5F5<@w(g^fc{ zqNb&=1PN`j#TkU6M)>gX@Br`a$Ed(Q#@XH7-On-RMRUuV%dsIZ7g}?%T-bAZz$65* zeO$B|xP3S_Huf!A35u!~X`5jT0~6f)P1Yq->wl-6R%=SkPY9GtyVaWZh46kIF1jJ0@XTznqq9kx8inbZC#2F#AeUZ4f2w|GnjdJ_5u^iMf4} z@Pm4^g#twhJ?tZgxc0eYfq~Tq(iRPcLZN>EKXVC1g%ADt00000NkvXXu0mjfl)iZv literal 0 HcmV?d00001 diff --git a/StarRailUID/utils/fonts/FirstWorld.ttf b/StarRailUID/utils/fonts/FirstWorld.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a73147b2caba09c1eb9cbe5d6cf029f7b47d0ecb GIT binary patch literal 52656 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 W!6&a*bhlw;ZaS_X!mX($_J08*$wPDi literal 0 HcmV?d00001 diff --git a/StarRailUID/utils/fonts/first_world.py b/StarRailUID/utils/fonts/first_world.py new file mode 100644 index 0000000..b003dbd --- /dev/null +++ b/StarRailUID/utils/fonts/first_world.py @@ -0,0 +1,13 @@ +from pathlib import Path + +from PIL import ImageFont + +FONT_ORIGIN_PATH = Path(__file__).parent / 'FirstWorld.ttf' + + +def first_word_origin(size: int) -> ImageFont.FreeTypeFont: + return ImageFont.truetype(str(FONT_ORIGIN_PATH), size=size) + + +fw_font_12 = first_word_origin(12) +fw_font_120 = first_word_origin(34)