🎨 优化sr强制刷新的返回图 (#1)

This commit is contained in:
Wuyi无疑 2024-02-11 12:51:25 +08:00 committed by GitHub
parent 6cf6809625
commit f63f95551e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 127 additions and 170 deletions

View File

@ -5,4 +5,4 @@
"ms-python.isort", "ms-python.isort",
"ms-python.black-formatter" "ms-python.black-formatter"
] ]
} }

23
.vscode/settings.json vendored
View File

@ -1,7 +1,11 @@
{ {
"python.languageServer": "Pylance", "python.languageServer": "Pylance",
"python.analysis.typeCheckingMode": "basic", "python.analysis.typeCheckingMode": "basic",
"cSpell.words": ["enka", "genshin", "genshinuid"], "cSpell.words": [
"enka",
"genshin",
"genshinuid"
],
"editor.formatOnSave": true, "editor.formatOnSave": true,
"[python]": { "[python]": {
"editor.defaultFormatter": "ms-python.black-formatter", "editor.defaultFormatter": "ms-python.black-formatter",
@ -10,11 +14,22 @@
"source.organizeImports": "explicit" "source.organizeImports": "explicit"
} }
}, },
"isort.args": ["--profile", "black"], "isort.args": [
"--profile",
"black"
],
"python.formatting.provider": "black", "python.formatting.provider": "black",
"python.linting.flake8Enabled": true, "python.linting.flake8Enabled": true,
"python.linting.flake8CategorySeverity.W": "Warning", "python.linting.flake8CategorySeverity.W": "Warning",
"python.linting.flake8CategorySeverity.F": "Warning", "python.linting.flake8CategorySeverity.F": "Warning",
"python.linting.flake8CategorySeverity.E": "Warning", "python.linting.flake8CategorySeverity.E": "Warning",
"python.analysis.extraPaths": ["${workspaceFolder}/../../../../"] "python.analysis.extraPaths": [
} "${workspaceFolder}/../../../"
],
"python.autoComplete.extraPaths": [
"${workspaceFolder}/../../../"
],
"python.analysis.include": [
"${workspaceFolder}/../../../"
]
}

View File

@ -2,20 +2,20 @@ import re
from pathlib import Path from pathlib import Path
from typing import Tuple, cast 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 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 starrail_damage_cal.map.SR_MAP_PATH import avatarId2Name
from .to_card import api_to_card
from ..utils.convert import get_uid from ..utils.convert import get_uid
from ..utils.sr_prefix import PREFIX
from ..utils.error_reply import UID_HINT 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.image.convert import convert_img
from ..utils.resource.RESOURCE_PATH import TEMP_PATH 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_char_info_config = SV('sr面板设置', pm=2)
sv_get_char_info = SV('sr面板查询', priority=10) sv_get_char_info = SV('sr面板查询', priority=10)

View File

@ -5,16 +5,29 @@ import textwrap
from pathlib import Path from pathlib import Path
from typing import Dict, Union from typing import Dict, Union
from PIL import Image, ImageDraw
from gsuid_core.logger import logger 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.convert import convert_img
from gsuid_core.utils.image.image_tools import draw_text_by_line 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_info, cal_char_info
from starrail_damage_cal.cal_damage import cal_char_info, cal_info
from starrail_damage_cal.to_data import api_to_dict
from ..utils.error_reply import CHAR_HINT 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.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 ( from ..utils.fonts.starrail_fonts import (
sr_font_18, sr_font_18,
sr_font_20, sr_font_20,
@ -25,19 +38,6 @@ from ..utils.fonts.starrail_fonts import (
sr_font_34, sr_font_34,
sr_font_38, 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 Excel_path = Path(__file__).parent
with Path.open(Excel_path / 'Excel' / 'SkillData.json', encoding='utf-8') as f: 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): if isinstance(char_data, str):
return char_data return char_data
char = await cal_char_info(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 = ImageDraw.Draw(char_info)
char_img_draw.text( char_img_draw.text((620, 207), char.char_name, (255, 255, 255), sr_font_38, 'lm')
(620, 207), char.char_name, (255, 255, 255), sr_font_38, 'lm'
)
if hasattr(sr_font_38, 'getsize'): if hasattr(sr_font_38, 'getsize'):
char_name_len = sr_font_38.getsize(char.char_name)[0] # type: ignore char_name_len = sr_font_38.getsize(char.char_name)[0] # type: ignore
else: 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')) hp = int(char.base_attributes.get('hp'))
add_hp = int( add_hp = int(
char.add_attr.get('HPDelta', 0) char.add_attr.get('HPDelta', 0)
+ hp * char.add_attr.get('HPAddedRatio', 0) + hp
) * char.add_attr.get(
attr_bg_draw.text( 'HPAddedRatio',
(413, 31), f'{hp + add_hp}', white_color, sr_font_26, 'rm' 0,
)
) )
attr_bg_draw.text((413, 31), f'{hp + add_hp}', white_color, sr_font_26, 'rm')
attr_bg_draw.text( attr_bg_draw.text(
(428, 31), (428, 31),
f'(+{round(add_hp)!s})', f'(+{round(add_hp)!s})',
@ -275,9 +275,7 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str):
'rm', 'rm',
) )
# 效果命中 # 效果命中
status_probability_base = ( status_probability_base = char.add_attr.get('StatusProbabilityBase', 0) * 100
char.add_attr.get('StatusProbabilityBase', 0) * 100
)
attr_bg_draw.text( attr_bg_draw.text(
(500, 31 + 48 * 6), (500, 31 + 48 * 6),
f'{status_probability_base:.1f}%', 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) weapon_bg.paste(rank_img, (weapon_name_len + 330, 2), rank_img)
rarity_img = Image.open( rarity_img = Image.open(
TEXT_PATH TEXT_PATH / f'LightCore_Rarity{char.equipment["equipmentRarity"]}.png'
/ f'LightCore_Rarity{char.equipment["equipmentRarity"]}.png'
).resize((306, 72)) ).resize((306, 72))
weapon_bg.paste(rarity_img, (223, 55), rarity_img) weapon_bg.paste(rarity_img, (223, 55), rarity_img)
weapon_bg_draw.text( 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 = light_cone_ranks[str(char.equipment['equipmentID'])]['desc']
desc_params = light_cone_ranks[str(char.equipment['equipmentID'])][ desc_params = light_cone_ranks[str(char.equipment['equipmentID'])]['params'][
'params' char.equipment['equipmentRank'] - 1
][char.equipment['equipmentRank'] - 1] ]
for i in range(len(desc_params)): for i in range(len(desc_params)):
temp = math.floor(desc_params[i] * 1000) / 10 temp = math.floor(desc_params[i] * 1000) / 10
desc = desc.replace(f'#{i + 1}[i]%', f'{temp!s}%') 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', anchor='rm',
) )
char_info.paste( char_info.paste(relic_img, RELIC_POS[str(relic['Type'])], relic_img)
relic_img, RELIC_POS[str(relic['Type'])], relic_img
)
relic_score += single_relic_score relic_score += single_relic_score
if relic_score > 210: if relic_score > 210:
relic_value_level = Image.open(TEXT_PATH / 'CommonIconSSS.png') 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') damage_img = Image.open(TEXT_PATH / 'attack_1.png')
else: else:
damage_img = Image.open(TEXT_PATH / 'attack_2.png') damage_img = Image.open(TEXT_PATH / 'attack_2.png')
char_info.paste( char_info.paste(damage_img, (0, 2028 + damage_num * 48), damage_img)
damage_img, (0, 2028 + damage_num * 48), damage_img
)
char_img_draw.text( char_img_draw.text(
(55, 2048 + damage_num * 48), (55, 2048 + damage_num * 48),
f'{damage_info["name"]}', 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 add_value = subValue * 0.3 * 0.5 * weight_dict['AttackDelta'] * 1.0
relic_score += add_value relic_score += add_value
if subProperty == 'DefenceDelta': if subProperty == 'DefenceDelta':
add_value = ( add_value = subValue * 0.3 * 0.5 * weight_dict['DefenceDelta'] * 1.0
subValue * 0.3 * 0.5 * weight_dict['DefenceDelta'] * 1.0
)
relic_score += add_value relic_score += add_value
if subProperty == 'HPDelta': if subProperty == 'HPDelta':
add_value = subValue * 0.158 * 0.5 * weight_dict['HPDelta'] * 1.0 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 add_value = subValue * 1.5 * weight_dict['AttackAddedRatio'] * 100
relic_score += add_value relic_score += add_value
if subProperty == 'DefenceAddedRatio': if subProperty == 'DefenceAddedRatio':
add_value = ( add_value = subValue * 1.19 * weight_dict['DefenceAddedRatio'] * 100
subValue * 1.19 * weight_dict['DefenceAddedRatio'] * 100
)
relic_score += add_value relic_score += add_value
if subProperty == 'HPAddedRatio': if subProperty == 'HPAddedRatio':
add_value = subValue * 1.5 * weight_dict['HPAddedRatio'] * 100 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'] add_value = subValue * 2.53 * weight_dict['SpeedDelta']
relic_score += add_value relic_score += add_value
if subProperty == 'BreakDamageAddedRatioBase': if subProperty == 'BreakDamageAddedRatioBase':
add_value = ( add_value = subValue * 1.0 * weight_dict['BreakDamageAddedRatioBase'] * 100
subValue * 1.0 * weight_dict['BreakDamageAddedRatioBase'] * 100
)
relic_score += add_value relic_score += add_value
if subProperty == 'StatusProbabilityBase': if subProperty == 'StatusProbabilityBase':
add_value = ( add_value = subValue * 1.49 * weight_dict['StatusProbabilityBase'] * 100
subValue * 1.49 * weight_dict['StatusProbabilityBase'] * 100
)
relic_score += add_value relic_score += add_value
if subProperty == 'StatusResistanceBase': if subProperty == 'StatusResistanceBase':
add_value = ( add_value = subValue * 1.49 * weight_dict['StatusResistanceBase'] * 100
subValue * 1.49 * weight_dict['StatusResistanceBase'] * 100
)
relic_score += add_value relic_score += add_value
return relic_score return relic_score

View File

@ -133,17 +133,13 @@ async def get_char_args(
if isinstance(char_data, str): if isinstance(char_data, str):
return char_data return char_data
else: else:
for i, s in enumerate( for i, s in enumerate(['头部', '手部', '躯干', '腿部', '位面球', '连结绳']):
['头部', '手部', '躯干', '腿部', '位面球', '连结绳']
):
if '赤沙' in part: if '赤沙' in part:
continue continue
if part[-1] in PieceName_ilst[i]: if part[-1] in PieceName_ilst[i]:
if isinstance(char_data, str): if isinstance(char_data, str):
return char_data return char_data
char_data = await change_equip( char_data = await change_equip(changeuid, char_data, part, s, i)
changeuid, char_data, part, s, i
)
if not char_data: if not char_data:
change_name = part.replace(part[-1], '') change_name = part.replace(part[-1], '')
return f'要替换的{change_name}{s}遗器不存在噢~' return f'要替换的{change_name}{s}遗器不存在噢~'
@ -154,9 +150,7 @@ async def get_char_args(
return char_data, weapon, weapon_affix, talent_num return char_data, weapon, weapon_affix, talent_num
async def change_equip( async def change_equip(uid: str, char_data: Dict, part: str, s: str, i: int) -> Dict:
uid: str, char_data: Dict, part: str, s: str, i: int
) -> Dict:
char_name = part.replace(part[-1], '').replace(uid, '') char_name = part.replace(part[-1], '').replace(uid, '')
fake_data = await get_char_data(uid, char_name) fake_data = await get_char_data(uid, char_name)
if isinstance(fake_data, str): if isinstance(fake_data, str):
@ -265,28 +259,18 @@ async def make_new_charinfo(
char_id = await name_to_avatar_id(fake_name) char_id = await name_to_avatar_id(fake_name)
char_data['avatarId'] = int(char_id) char_data['avatarId'] = int(char_id)
char_data['avatarName'] = fake_name char_data['avatarName'] = fake_name
char_data['avatarElement'] = avatarId2DamageType[ char_data['avatarElement'] = avatarId2DamageType[str(char_data['avatarId'])]
str(char_data['avatarId']) char_data['avatarRarity'] = str(avatarId2Rarity[str(char_data['avatarId'])])
]
char_data['avatarRarity'] = str(
avatarId2Rarity[str(char_data['avatarId'])]
)
char_data['avatarPromotion'] = 6 char_data['avatarPromotion'] = 6
char_data['avatarLevel'] = 80 char_data['avatarLevel'] = 80
char_data['avatarSkill'] = await get_skill_list(char_data['avatarId']) char_data['avatarSkill'] = await get_skill_list(char_data['avatarId'])
char_data['avatarExtraAbility'] = await get_extra_list( char_data['avatarExtraAbility'] = await get_extra_list(char_data['avatarId'])
char_data['avatarId'] char_data['avatarAttributeBonus'] = await get_attribute_list(char_data['avatarId'])
)
char_data['avatarAttributeBonus'] = await get_attribute_list(
char_data['avatarId']
)
char_data['RelicInfo'] = [] char_data['RelicInfo'] = []
char_data['avatarEnName'] = avatarId2EnName[str(char_data['avatarId'])] char_data['avatarEnName'] = avatarId2EnName[str(char_data['avatarId'])]
char_data['rank'] = 0 char_data['rank'] = 0
char_data['rankList'] = [] char_data['rankList'] = []
char_data['baseAttributes'] = await get_baseAttributes( char_data['baseAttributes'] = await get_baseAttributes(char_data['avatarId'])
char_data['avatarId']
)
char_data['equipmentInfo'] = {} char_data['equipmentInfo'] = {}
return char_data return char_data
@ -316,13 +300,9 @@ async def get_baseAttributes(
# 速度 # 速度
base_attributes['speed'] = avatar_promotion_base.SpeedBase.Value base_attributes['speed'] = avatar_promotion_base.SpeedBase.Value
# 暴击率 # 暴击率
base_attributes[ base_attributes['CriticalChanceBase'] = avatar_promotion_base.CriticalChance.Value
'CriticalChanceBase'
] = avatar_promotion_base.CriticalChance.Value
# 暴击伤害 # 暴击伤害
base_attributes[ base_attributes['CriticalDamageBase'] = avatar_promotion_base.CriticalDamage.Value
'CriticalDamageBase'
] = avatar_promotion_base.CriticalDamage.Value
# 嘲讽 # 嘲讽
base_attributes['BaseAggro'] = avatar_promotion_base.BaseAggro.Value base_attributes['BaseAggro'] = avatar_promotion_base.BaseAggro.Value
return base_attributes return base_attributes
@ -342,9 +322,7 @@ async def get_attribute_list(
attribute_bonus_temp['statusAdd'] = {} attribute_bonus_temp['statusAdd'] = {}
if status_add: if status_add:
for property_ in status_add: for property_ in status_add:
attribute_bonus_temp['statusAdd']['property'] = property_[ attribute_bonus_temp['statusAdd']['property'] = property_['type']
'type'
]
attribute_bonus_temp['statusAdd']['name'] = Property2Name[ attribute_bonus_temp['statusAdd']['name'] = Property2Name[
property_['type'] property_['type']
] ]
@ -374,9 +352,7 @@ async def get_skill_list(
skill_temp['skillId'] = char_id * 100 + skillid skill_temp['skillId'] = char_id * 100 + skillid
skill_temp['skillName'] = skillId2Name[str(skill_temp['skillId'])] skill_temp['skillName'] = skillId2Name[str(skill_temp['skillId'])]
skill_temp['skillEffect'] = skillId2Effect[str(skill_temp['skillId'])] skill_temp['skillEffect'] = skillId2Effect[str(skill_temp['skillId'])]
skill_temp['skillAttackType'] = skillId2AttackType[ skill_temp['skillAttackType'] = skillId2AttackType[str(skill_temp['skillId'])]
str(skill_temp['skillId'])
]
skilllevel = 10 skilllevel = 10
if skillid == 1: if skillid == 1:
skilllevel = 6 skilllevel = 6
@ -429,9 +405,7 @@ async def get_char(
skill_id = item['id'] skill_id = item['id']
skill_up_num = item['num'] skill_up_num = item['num']
# 查找skill_id在不在avatarSkill中 # 查找skill_id在不在avatarSkill中
for index, skill_item in enumerate( for index, skill_item in enumerate(char_data['avatarSkill']):
char_data['avatarSkill']
):
if str(skill_id) == str(skill_item['skillId']): if str(skill_id) == str(skill_item['skillId']):
if skill_id[-1] == 1: if skill_id[-1] == 1:
skilllevel_max = 7 skilllevel_max = 7
@ -439,9 +413,7 @@ async def get_char(
skilllevel_max = 12 skilllevel_max = 12
skilllevel = min( skilllevel = min(
skilllevel_max, skilllevel_max,
char_data['avatarSkill'][index][ char_data['avatarSkill'][index]['skillLevel']
'skillLevel'
]
+ skill_up_num, + skill_up_num,
) )
char_data['avatarSkill'][index][ char_data['avatarSkill'][index][
@ -462,13 +434,11 @@ async def get_char(
equipment_info['equipmentLevel'] = 80 equipment_info['equipmentLevel'] = 80
equipment_info['equipmentPromotion'] = 6 equipment_info['equipmentPromotion'] = 6
equipment_info['equipmentRank'] = weapon_affix equipment_info['equipmentRank'] = weapon_affix
equipment_info['equipmentRarity'] = EquipmentID2Rarity[ equipment_info['equipmentRarity'] = EquipmentID2Rarity[str(equipmentid)]
str(equipmentid)
]
equipment_base_attributes = {} equipment_base_attributes = {}
equipment_promotion_base = EquipmentPromotionConfig.Equipment[ equipment_promotion_base = EquipmentPromotionConfig.Equipment[str(equipmentid)][
str(equipmentid) '6'
]['6'] ]
# 生命值 # 生命值
equipment_base_attributes['hp'] = ( equipment_base_attributes['hp'] = (

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

View File

@ -2,19 +2,16 @@ import asyncio
from pathlib import Path from pathlib import Path
from typing import Dict, List, Tuple, Union 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 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 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) half_color = (255, 255, 255, 120)
first_color = (29, 29, 29) first_color = (29, 29, 29)
@ -23,7 +20,7 @@ white_color = (247, 247, 247)
gray_color = (175, 175, 175) gray_color = (175, 175, 175)
TEXT_PATH = Path(__file__).parent / 'texture2D' 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') char_bg_mask = Image.open(TEXT_PATH / 'char_bg_mask.png')
tag = Image.open(TEXT_PATH / 'tag.png') tag = Image.open(TEXT_PATH / 'tag.png')
footbar = Image.open(TEXT_PATH / 'footbar.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))) return await convert_img(Image.new('RGBA', (0, 1), (255, 255, 255)))
else: else:
line1 = f'UID {uid} 刷新成功' line1 = f'UID {uid} 刷新成功'
line2 = ( line2 = f'可以使用 sr查询{char_data_list[0]["avatarName"]} 查询详情角色面板'
f'可以使用 sr查询{char_data_list[0]["avatarName"]} 查询详情角色面板'
)
char_num = len(char_data_list) char_num = len(char_data_list)
if char_num <= 4: if char_num <= 4:
based_w, based_h = 1380, 926 based_w, based_h = 1380, 926
show_type = 1 show_type = 1
else: else:
show_type = 0 show_type = 0
based_w, based_h = 1380, 660 + (char_num - 5) // 5 * 110 based_w, based_h = 1380, 310 + (((char_num - 1) // 4) + 1) * 320
if (char_num - 5) % 5 >= 4:
based_h += 110
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.paste(tag, (0, 0), tag)
img_draw = ImageDraw.Draw(img, 'RGBA') img_draw = ImageDraw.Draw(img, 'RGBA')
# 写底层文字 # 写底层文字
img_draw.text( img_draw.text(
(690, based_h - 16), (690, based_h - 26),
'--Created by qwerdvd-Designed By Wuyi-Thank for mihomo.me--', '--Created by qwerdvd-Designed By Wuyi-Thank for mihomo.me--',
(0, 0, 255), (22, 22, 22),
fw_font_28, fw_font_28,
'mm', '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): async def draw_enka_char(index: int, img: Image.Image, char_data: Dict):
char_id = char_data['avatarId'] char_id = char_data['avatarId']
char_star = await avatar_id_to_char_star(str(char_id)) char_star = await avatar_id_to_char_star(str(char_id))
char_card = Image.open(TEXT_PATH / f'char_card_{char_star}.png') char_card = Image.open(TEXT_PATH / f'ring_{char_star}.png')
char_img = ( _path = CHAR_PREVIEW_PATH / f'{char_id}.png'
Image.open(str(CHAR_ICON_PATH / f'{char_id}.png')) char_img = Image.open(_path).convert('RGBA')
.convert('RGBA') char_img = char_img.resize(
.resize((204, 204)) (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_temp = Image.new('RGBA', (300, 400))
char_card, card_temp = Image.new('RGBA', (300, 400))
(x, 187 + (index // 4) * 220), char_temp.paste(char_img, (19, 57), char_img)
char_card, card_temp.paste(char_temp, (0, 0), char_mask)
)
elif index <= 12: char_draw = ImageDraw.Draw(card_temp)
img.paste( char_draw.text(
char_card, (144, 285),
(50 + (index % 8) * 220, 296), char_data['avatarName'],
char_card, 'white',
) sr_font_30,
else: 'mm',
_i = index - 13 )
x, y = 50 + (_i % 9) * 220, 512 + (_i // 9) * 220
if _i % 9 >= 5: img.paste(
y += 110 char_card,
x = 160 + ((_i - 5) % 9) * 220 (113 + (index % 4) * 289, 152 + (index // 4) * 336),
img.paste( char_card,
char_card, )
(x, y),
char_card, img.paste(
) card_temp,
(113 + (index % 4) * 289, 152 + (index // 4) * 336),
card_temp,
)