diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 6021329..54fc7aa 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -5,4 +5,4 @@ "ms-python.isort", "ms-python.black-formatter" ] -} +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 3d68bd1..badf942 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,11 @@ { "python.languageServer": "Pylance", "python.analysis.typeCheckingMode": "basic", - "cSpell.words": ["enka", "genshin", "genshinuid"], + "cSpell.words": [ + "enka", + "genshin", + "genshinuid" + ], "editor.formatOnSave": true, "[python]": { "editor.defaultFormatter": "ms-python.black-formatter", @@ -10,11 +14,22 @@ "source.organizeImports": "explicit" } }, - "isort.args": ["--profile", "black"], + "isort.args": [ + "--profile", + "black" + ], "python.formatting.provider": "black", "python.linting.flake8Enabled": true, "python.linting.flake8CategorySeverity.W": "Warning", "python.linting.flake8CategorySeverity.F": "Warning", "python.linting.flake8CategorySeverity.E": "Warning", - "python.analysis.extraPaths": ["${workspaceFolder}/../../../../"] -} + "python.analysis.extraPaths": [ + "${workspaceFolder}/../../../" + ], + "python.autoComplete.extraPaths": [ + "${workspaceFolder}/../../../" + ], + "python.analysis.include": [ + "${workspaceFolder}/../../../" + ] +} \ No newline at end of file diff --git a/StarRailUID/starrailuid_charinfo/__init__.py b/StarRailUID/starrailuid_charinfo/__init__.py index 1b41588..6339585 100644 --- a/StarRailUID/starrailuid_charinfo/__init__.py +++ b/StarRailUID/starrailuid_charinfo/__init__.py @@ -2,20 +2,20 @@ import re from pathlib import Path from typing import Tuple, cast -from gsuid_core.bot import Bot -from gsuid_core.message_models import Button -from gsuid_core.models import Event -from gsuid_core.sv import SV from PIL import Image +from gsuid_core.sv import SV +from gsuid_core.bot import Bot +from gsuid_core.models import Event +from gsuid_core.message_models import Button from starrail_damage_cal.map.SR_MAP_PATH import avatarId2Name +from .to_card import api_to_card from ..utils.convert import get_uid +from ..utils.sr_prefix import PREFIX from ..utils.error_reply import UID_HINT +from .get_char_img import draw_char_info_img from ..utils.image.convert import convert_img from ..utils.resource.RESOURCE_PATH import TEMP_PATH -from ..utils.sr_prefix import PREFIX -from .get_char_img import draw_char_info_img -from .to_card import api_to_card sv_char_info_config = SV('sr面板设置', pm=2) sv_get_char_info = SV('sr面板查询', priority=10) diff --git a/StarRailUID/starrailuid_charinfo/draw_char_img.py b/StarRailUID/starrailuid_charinfo/draw_char_img.py index eafe271..99f7f89 100644 --- a/StarRailUID/starrailuid_charinfo/draw_char_img.py +++ b/StarRailUID/starrailuid_charinfo/draw_char_img.py @@ -5,16 +5,29 @@ import textwrap from pathlib import Path from typing import Dict, Union +from PIL import Image, ImageDraw from gsuid_core.logger import logger +from starrail_damage_cal.to_data import api_to_dict from gsuid_core.utils.image.convert import convert_img from gsuid_core.utils.image.image_tools import draw_text_by_line -from PIL import Image, ImageDraw -from starrail_damage_cal.cal_damage import cal_char_info, cal_info -from starrail_damage_cal.to_data import api_to_dict +from starrail_damage_cal.cal_damage import cal_info, cal_char_info from ..utils.error_reply import CHAR_HINT -from ..utils.excel.read_excel import light_cone_ranks from ..utils.fonts.first_world import fw_font_28 +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.map.SR_MAP_PATH import ( + RelicId2Rarity, + AvatarRelicScore, + avatarId2Name, +) +from ..utils.resource.RESOURCE_PATH import ( + RELIC_PATH, + SKILL_PATH, + PLAYER_PATH, + WEAPON_PATH, + CHAR_PORTRAIT_PATH, +) from ..utils.fonts.starrail_fonts import ( sr_font_18, sr_font_20, @@ -25,19 +38,6 @@ from ..utils.fonts.starrail_fonts import ( sr_font_34, sr_font_38, ) -from ..utils.map.name_covert import alias_to_char_name, name_to_avatar_id -from ..utils.map.SR_MAP_PATH import ( - AvatarRelicScore, - RelicId2Rarity, - avatarId2Name, -) -from ..utils.resource.RESOURCE_PATH import ( - CHAR_PORTRAIT_PATH, - PLAYER_PATH, - RELIC_PATH, - SKILL_PATH, - WEAPON_PATH, -) Excel_path = Path(__file__).parent with Path.open(Excel_path / 'Excel' / 'SkillData.json', encoding='utf-8') as f: @@ -95,7 +95,7 @@ RELIC_CNT = { } -async def draw_char_img(char_data: Dict, sr_uid: str, msg: str): +async def draw_char_img(char_data: Dict, sr_uid: str, msg: str) -> Union[bytes, str]: if isinstance(char_data, str): return char_data char = await cal_char_info(char_data) @@ -132,9 +132,7 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str): # 放角色名 char_img_draw = ImageDraw.Draw(char_info) - char_img_draw.text( - (620, 207), char.char_name, (255, 255, 255), sr_font_38, 'lm' - ) + char_img_draw.text((620, 207), char.char_name, (255, 255, 255), sr_font_38, 'lm') if hasattr(sr_font_38, 'getsize'): char_name_len = sr_font_38.getsize(char.char_name)[0] # type: ignore else: @@ -180,11 +178,13 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str): hp = int(char.base_attributes.get('hp')) add_hp = int( char.add_attr.get('HPDelta', 0) - + hp * char.add_attr.get('HPAddedRatio', 0) - ) - attr_bg_draw.text( - (413, 31), f'{hp + add_hp}', white_color, sr_font_26, 'rm' + + hp + * char.add_attr.get( + 'HPAddedRatio', + 0, + ) ) + attr_bg_draw.text((413, 31), f'{hp + add_hp}', white_color, sr_font_26, 'rm') attr_bg_draw.text( (428, 31), f'(+{round(add_hp)!s})', @@ -275,9 +275,7 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str): 'rm', ) # 效果命中 - status_probability_base = ( - char.add_attr.get('StatusProbabilityBase', 0) * 100 - ) + status_probability_base = char.add_attr.get('StatusProbabilityBase', 0) * 100 attr_bg_draw.text( (500, 31 + 48 * 6), f'{status_probability_base:.1f}%', @@ -402,8 +400,7 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str): weapon_bg.paste(rank_img, (weapon_name_len + 330, 2), rank_img) rarity_img = Image.open( - TEXT_PATH - / f'LightCore_Rarity{char.equipment["equipmentRarity"]}.png' + TEXT_PATH / f'LightCore_Rarity{char.equipment["equipmentRarity"]}.png' ).resize((306, 72)) weapon_bg.paste(rarity_img, (223, 55), rarity_img) weapon_bg_draw.text( @@ -416,9 +413,9 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str): # 武器技能 desc = light_cone_ranks[str(char.equipment['equipmentID'])]['desc'] - desc_params = light_cone_ranks[str(char.equipment['equipmentID'])][ - 'params' - ][char.equipment['equipmentRank'] - 1] + desc_params = light_cone_ranks[str(char.equipment['equipmentID'])]['params'][ + char.equipment['equipmentRank'] - 1 + ] for i in range(len(desc_params)): temp = math.floor(desc_params[i] * 1000) / 10 desc = desc.replace(f'#{i + 1}[i]%', f'{temp!s}%') @@ -588,9 +585,7 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str): anchor='rm', ) - char_info.paste( - relic_img, RELIC_POS[str(relic['Type'])], relic_img - ) + char_info.paste(relic_img, RELIC_POS[str(relic['Type'])], relic_img) relic_score += single_relic_score if relic_score > 210: relic_value_level = Image.open(TEXT_PATH / 'CommonIconSSS.png') @@ -662,9 +657,7 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str): damage_img = Image.open(TEXT_PATH / 'attack_1.png') else: damage_img = Image.open(TEXT_PATH / 'attack_2.png') - char_info.paste( - damage_img, (0, 2028 + damage_num * 48), damage_img - ) + char_info.paste(damage_img, (0, 2028 + damage_num * 48), damage_img) char_img_draw.text( (55, 2048 + damage_num * 48), f'{damage_info["name"]}', @@ -819,9 +812,7 @@ async def get_relic_score( add_value = subValue * 0.3 * 0.5 * weight_dict['AttackDelta'] * 1.0 relic_score += add_value if subProperty == 'DefenceDelta': - add_value = ( - subValue * 0.3 * 0.5 * weight_dict['DefenceDelta'] * 1.0 - ) + add_value = subValue * 0.3 * 0.5 * weight_dict['DefenceDelta'] * 1.0 relic_score += add_value if subProperty == 'HPDelta': add_value = subValue * 0.158 * 0.5 * weight_dict['HPDelta'] * 1.0 @@ -830,9 +821,7 @@ async def get_relic_score( add_value = subValue * 1.5 * weight_dict['AttackAddedRatio'] * 100 relic_score += add_value if subProperty == 'DefenceAddedRatio': - add_value = ( - subValue * 1.19 * weight_dict['DefenceAddedRatio'] * 100 - ) + add_value = subValue * 1.19 * weight_dict['DefenceAddedRatio'] * 100 relic_score += add_value if subProperty == 'HPAddedRatio': add_value = subValue * 1.5 * weight_dict['HPAddedRatio'] * 100 @@ -841,18 +830,12 @@ async def get_relic_score( add_value = subValue * 2.53 * weight_dict['SpeedDelta'] relic_score += add_value if subProperty == 'BreakDamageAddedRatioBase': - add_value = ( - subValue * 1.0 * weight_dict['BreakDamageAddedRatioBase'] * 100 - ) + add_value = subValue * 1.0 * weight_dict['BreakDamageAddedRatioBase'] * 100 relic_score += add_value if subProperty == 'StatusProbabilityBase': - add_value = ( - subValue * 1.49 * weight_dict['StatusProbabilityBase'] * 100 - ) + add_value = subValue * 1.49 * weight_dict['StatusProbabilityBase'] * 100 relic_score += add_value if subProperty == 'StatusResistanceBase': - add_value = ( - subValue * 1.49 * weight_dict['StatusResistanceBase'] * 100 - ) + add_value = subValue * 1.49 * weight_dict['StatusResistanceBase'] * 100 relic_score += add_value return relic_score diff --git a/StarRailUID/starrailuid_charinfo/get_char_img.py b/StarRailUID/starrailuid_charinfo/get_char_img.py index bca9eb7..976e698 100644 --- a/StarRailUID/starrailuid_charinfo/get_char_img.py +++ b/StarRailUID/starrailuid_charinfo/get_char_img.py @@ -133,17 +133,13 @@ async def get_char_args( if isinstance(char_data, str): return char_data else: - for i, s in enumerate( - ['头部', '手部', '躯干', '腿部', '位面球', '连结绳'] - ): + for i, s in enumerate(['头部', '手部', '躯干', '腿部', '位面球', '连结绳']): if '赤沙' in part: continue if part[-1] in PieceName_ilst[i]: if isinstance(char_data, str): return char_data - char_data = await change_equip( - changeuid, char_data, part, s, i - ) + char_data = await change_equip(changeuid, char_data, part, s, i) if not char_data: change_name = part.replace(part[-1], '') return f'要替换的{change_name}的{s}遗器不存在噢~' @@ -154,9 +150,7 @@ async def get_char_args( return char_data, weapon, weapon_affix, talent_num -async def change_equip( - uid: str, char_data: Dict, part: str, s: str, i: int -) -> Dict: +async def change_equip(uid: str, char_data: Dict, part: str, s: str, i: int) -> Dict: char_name = part.replace(part[-1], '').replace(uid, '') fake_data = await get_char_data(uid, char_name) if isinstance(fake_data, str): @@ -265,28 +259,18 @@ async def make_new_charinfo( char_id = await name_to_avatar_id(fake_name) char_data['avatarId'] = int(char_id) char_data['avatarName'] = fake_name - char_data['avatarElement'] = avatarId2DamageType[ - str(char_data['avatarId']) - ] - char_data['avatarRarity'] = str( - avatarId2Rarity[str(char_data['avatarId'])] - ) + char_data['avatarElement'] = avatarId2DamageType[str(char_data['avatarId'])] + char_data['avatarRarity'] = str(avatarId2Rarity[str(char_data['avatarId'])]) char_data['avatarPromotion'] = 6 char_data['avatarLevel'] = 80 char_data['avatarSkill'] = await get_skill_list(char_data['avatarId']) - char_data['avatarExtraAbility'] = await get_extra_list( - char_data['avatarId'] - ) - char_data['avatarAttributeBonus'] = await get_attribute_list( - char_data['avatarId'] - ) + char_data['avatarExtraAbility'] = await get_extra_list(char_data['avatarId']) + char_data['avatarAttributeBonus'] = await get_attribute_list(char_data['avatarId']) char_data['RelicInfo'] = [] char_data['avatarEnName'] = avatarId2EnName[str(char_data['avatarId'])] char_data['rank'] = 0 char_data['rankList'] = [] - char_data['baseAttributes'] = await get_baseAttributes( - char_data['avatarId'] - ) + char_data['baseAttributes'] = await get_baseAttributes(char_data['avatarId']) char_data['equipmentInfo'] = {} return char_data @@ -316,13 +300,9 @@ async def get_baseAttributes( # 速度 base_attributes['speed'] = avatar_promotion_base.SpeedBase.Value # 暴击率 - base_attributes[ - 'CriticalChanceBase' - ] = avatar_promotion_base.CriticalChance.Value + base_attributes['CriticalChanceBase'] = avatar_promotion_base.CriticalChance.Value # 暴击伤害 - base_attributes[ - 'CriticalDamageBase' - ] = avatar_promotion_base.CriticalDamage.Value + base_attributes['CriticalDamageBase'] = avatar_promotion_base.CriticalDamage.Value # 嘲讽 base_attributes['BaseAggro'] = avatar_promotion_base.BaseAggro.Value return base_attributes @@ -342,9 +322,7 @@ async def get_attribute_list( attribute_bonus_temp['statusAdd'] = {} if status_add: for property_ in status_add: - attribute_bonus_temp['statusAdd']['property'] = property_[ - 'type' - ] + attribute_bonus_temp['statusAdd']['property'] = property_['type'] attribute_bonus_temp['statusAdd']['name'] = Property2Name[ property_['type'] ] @@ -374,9 +352,7 @@ async def get_skill_list( skill_temp['skillId'] = char_id * 100 + skillid skill_temp['skillName'] = skillId2Name[str(skill_temp['skillId'])] skill_temp['skillEffect'] = skillId2Effect[str(skill_temp['skillId'])] - skill_temp['skillAttackType'] = skillId2AttackType[ - str(skill_temp['skillId']) - ] + skill_temp['skillAttackType'] = skillId2AttackType[str(skill_temp['skillId'])] skilllevel = 10 if skillid == 1: skilllevel = 6 @@ -429,9 +405,7 @@ async def get_char( skill_id = item['id'] skill_up_num = item['num'] # 查找skill_id在不在avatarSkill中 - for index, skill_item in enumerate( - char_data['avatarSkill'] - ): + for index, skill_item in enumerate(char_data['avatarSkill']): if str(skill_id) == str(skill_item['skillId']): if skill_id[-1] == 1: skilllevel_max = 7 @@ -439,9 +413,7 @@ async def get_char( skilllevel_max = 12 skilllevel = min( skilllevel_max, - char_data['avatarSkill'][index][ - 'skillLevel' - ] + char_data['avatarSkill'][index]['skillLevel'] + skill_up_num, ) char_data['avatarSkill'][index][ @@ -462,13 +434,11 @@ async def get_char( equipment_info['equipmentLevel'] = 80 equipment_info['equipmentPromotion'] = 6 equipment_info['equipmentRank'] = weapon_affix - equipment_info['equipmentRarity'] = EquipmentID2Rarity[ - str(equipmentid) - ] + equipment_info['equipmentRarity'] = EquipmentID2Rarity[str(equipmentid)] equipment_base_attributes = {} - equipment_promotion_base = EquipmentPromotionConfig.Equipment[ - str(equipmentid) - ]['6'] + equipment_promotion_base = EquipmentPromotionConfig.Equipment[str(equipmentid)][ + '6' + ] # 生命值 equipment_base_attributes['hp'] = ( diff --git a/StarRailUID/starrailuid_charinfo/texture2D/ring_4.png b/StarRailUID/starrailuid_charinfo/texture2D/ring_4.png new file mode 100644 index 0000000..d37964d Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/ring_4.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/ring_5.png b/StarRailUID/starrailuid_charinfo/texture2D/ring_5.png new file mode 100644 index 0000000..79264e1 Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/ring_5.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/ring_mask.png b/StarRailUID/starrailuid_charinfo/texture2D/ring_mask.png new file mode 100644 index 0000000..0f0e764 Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/ring_mask.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/shin.jpg b/StarRailUID/starrailuid_charinfo/texture2D/shin.jpg new file mode 100644 index 0000000..36d1792 Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/shin.jpg differ diff --git a/StarRailUID/starrailuid_charinfo/to_card.py b/StarRailUID/starrailuid_charinfo/to_card.py index a47ca6c..3a305dd 100644 --- a/StarRailUID/starrailuid_charinfo/to_card.py +++ b/StarRailUID/starrailuid_charinfo/to_card.py @@ -2,19 +2,16 @@ import asyncio from pathlib import Path from typing import Dict, List, Tuple, Union -from ..utils.fonts.first_world import fw_font_28 -from ..utils.fonts.starrail_fonts import sr_font_24, sr_font_30, sr_font_58 -from ..utils.image.convert import convert_img -from ..utils.map.name_covert import avatar_id_to_char_star -from ..utils.resource.RESOURCE_PATH import ( - CHAR_ICON_PATH, - CHAR_PREVIEW_PATH, - PLAYER_PATH, -) - from PIL import Image, ImageDraw -from starrail_damage_cal.map.SR_MAP_PATH import avatarId2Name from starrail_damage_cal.to_data import api_to_dict +from gsuid_core.utils.image.convert import convert_img +from starrail_damage_cal.map.SR_MAP_PATH import avatarId2Name +from gsuid_core.utils.image.image_tools import crop_center_img + +from ..utils.fonts.first_world import fw_font_28 +from ..utils.map.name_covert import avatar_id_to_char_star +from ..utils.resource.RESOURCE_PATH import PLAYER_PATH, CHAR_PREVIEW_PATH +from ..utils.fonts.starrail_fonts import sr_font_24, sr_font_30, sr_font_58 half_color = (255, 255, 255, 120) first_color = (29, 29, 29) @@ -23,7 +20,7 @@ white_color = (247, 247, 247) gray_color = (175, 175, 175) TEXT_PATH = Path(__file__).parent / 'texture2D' -char_mask = Image.open(TEXT_PATH / 'char_mask.png') +char_mask = Image.open(TEXT_PATH / 'ring_mask.png') char_bg_mask = Image.open(TEXT_PATH / 'char_bg_mask.png') tag = Image.open(TEXT_PATH / 'tag.png') footbar = Image.open(TEXT_PATH / 'footbar.png') @@ -65,29 +62,26 @@ async def draw_enka_card(uid: str, char_list: List, showfrom: int = 0): return await convert_img(Image.new('RGBA', (0, 1), (255, 255, 255))) else: line1 = f'UID {uid} 刷新成功' - line2 = ( - f'可以使用 sr查询{char_data_list[0]["avatarName"]} 查询详情角色面板' - ) + line2 = f'可以使用 sr查询{char_data_list[0]["avatarName"]} 查询详情角色面板' char_num = len(char_data_list) if char_num <= 4: based_w, based_h = 1380, 926 show_type = 1 else: show_type = 0 - based_w, based_h = 1380, 660 + (char_num - 5) // 5 * 110 - if (char_num - 5) % 5 >= 4: - based_h += 110 + based_w, based_h = 1380, 310 + (((char_num - 1) // 4) + 1) * 320 - img = Image.open(TEXT_PATH / 'shin-w.jpg').resize((based_w, based_h)) + img = Image.open(TEXT_PATH / 'shin.jpg') + img = crop_center_img(img, based_w, based_h) img.paste(tag, (0, 0), tag) img_draw = ImageDraw.Draw(img, 'RGBA') # 写底层文字 img_draw.text( - (690, based_h - 16), + (690, based_h - 26), '--Created by qwerdvd-Designed By Wuyi-Thank for mihomo.me--', - (0, 0, 255), + (22, 22, 22), fw_font_28, 'mm', ) @@ -151,40 +145,35 @@ async def draw_mihomo_char(index: int, img: Image.Image, char_data: Dict): async def draw_enka_char(index: int, img: Image.Image, char_data: Dict): char_id = char_data['avatarId'] char_star = await avatar_id_to_char_star(str(char_id)) - char_card = Image.open(TEXT_PATH / f'char_card_{char_star}.png') - char_img = ( - Image.open(str(CHAR_ICON_PATH / f'{char_id}.png')) - .convert('RGBA') - .resize((204, 204)) + char_card = Image.open(TEXT_PATH / f'ring_{char_star}.png') + _path = CHAR_PREVIEW_PATH / f'{char_id}.png' + char_img = Image.open(_path).convert('RGBA') + char_img = char_img.resize( + (int(char_img.size[0] * 0.76), int(char_img.size[1] * 0.76)) ) - char_temp = Image.new('RGBA', (220, 220)) - char_temp.paste(char_img, (8, 8), char_img) - char_card.paste(char_temp, (0, 0), char_mask) - if index <= 7: - if img.size[0] <= 1100: - x = 60 + (index % 4) * 220 - else: - x = 160 + (index % 4) * 220 - img.paste( - char_card, - (x, 187 + (index // 4) * 220), - char_card, - ) - elif index <= 12: - img.paste( - char_card, - (50 + (index % 8) * 220, 296), - char_card, - ) - else: - _i = index - 13 - x, y = 50 + (_i % 9) * 220, 512 + (_i // 9) * 220 - if _i % 9 >= 5: - y += 110 - x = 160 + ((_i - 5) % 9) * 220 - img.paste( - char_card, - (x, y), - char_card, - ) + char_temp = Image.new('RGBA', (300, 400)) + card_temp = Image.new('RGBA', (300, 400)) + char_temp.paste(char_img, (19, 57), char_img) + card_temp.paste(char_temp, (0, 0), char_mask) + + char_draw = ImageDraw.Draw(card_temp) + char_draw.text( + (144, 285), + char_data['avatarName'], + 'white', + sr_font_30, + 'mm', + ) + + img.paste( + char_card, + (113 + (index % 4) * 289, 152 + (index // 4) * 336), + char_card, + ) + + img.paste( + card_temp, + (113 + (index % 4) * 289, 152 + (index // 4) * 336), + card_temp, + )