mirror of
https://github.com/baiqwerdvd/StarRailUID.git
synced 2025-05-06 11:43:44 +08:00
🎨 优化sr强制刷新
的返回图 (#1)
This commit is contained in:
parent
6cf6809625
commit
f63f95551e
2
.vscode/extensions.json
vendored
2
.vscode/extensions.json
vendored
@ -5,4 +5,4 @@
|
|||||||
"ms-python.isort",
|
"ms-python.isort",
|
||||||
"ms-python.black-formatter"
|
"ms-python.black-formatter"
|
||||||
]
|
]
|
||||||
}
|
}
|
23
.vscode/settings.json
vendored
23
.vscode/settings.json
vendored
@ -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}/../../../"
|
||||||
|
]
|
||||||
|
}
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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'] = (
|
||||||
|
BIN
StarRailUID/starrailuid_charinfo/texture2D/ring_4.png
Normal file
BIN
StarRailUID/starrailuid_charinfo/texture2D/ring_4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 50 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/ring_5.png
Normal file
BIN
StarRailUID/starrailuid_charinfo/texture2D/ring_5.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 49 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/ring_mask.png
Normal file
BIN
StarRailUID/starrailuid_charinfo/texture2D/ring_mask.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 13 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/shin.jpg
Normal file
BIN
StarRailUID/starrailuid_charinfo/texture2D/shin.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 88 KiB |
@ -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,
|
||||||
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user