🎨 优化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.black-formatter"
]
}
}

23
.vscode/settings.json vendored
View File

@ -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}/../../../"
]
}

View File

@ -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)

View File

@ -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

View File

@ -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'] = (

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 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,
)