mirror of
https://github.com/KimigaiiWuyi/GenshinUID.git
synced 2025-05-07 12:43:26 +08:00
✨ 新增圣遗物排名 双爆
等类似用法 (#493)
This commit is contained in:
parent
3fffd97ab3
commit
5979715c4c
@ -19,6 +19,7 @@ from .draw_artifacts_lib import draw_lib
|
||||
from .draw_rank_list import draw_rank_img
|
||||
from ..utils.image.convert import convert_img
|
||||
from ..utils.map.GS_MAP_PATH import alias_data
|
||||
from .draw_arti_rank import draw_arti_rank_img
|
||||
from .draw_char_rank import draw_cahrcard_list
|
||||
from .draw_role_rank import draw_role_rank_img
|
||||
from .get_enka_img import draw_enka_img, get_full_char
|
||||
@ -62,6 +63,14 @@ async def sned_role_rank_pic(bot: Bot, ev: Event):
|
||||
await bot.send(await draw_role_rank_img(msg))
|
||||
|
||||
|
||||
@sv_akasha.on_command('圣遗物排名')
|
||||
async def sned_arti_rank_pic(bot: Bot, ev: Event):
|
||||
# 获取排序名
|
||||
msg = ''.join(re.findall('[\u4e00-\u9fa5 ]', ev.text))
|
||||
logger.info(f'[圣遗物排名]排序: {msg}')
|
||||
await bot.send(await draw_arti_rank_img(msg))
|
||||
|
||||
|
||||
@sv_enka_admin.on_fullmatch('刷新全部圣遗物仓库')
|
||||
async def sned_fresh_all_list(bot: Bot, ev: Event):
|
||||
await bot.send('开始执行...可能时间较久, 执行完成会有提示, 请勿重复执行!')
|
||||
|
134
GenshinUID/genshinuid_enka/draw_arti_rank.py
Normal file
134
GenshinUID/genshinuid_enka/draw_arti_rank.py
Normal file
@ -0,0 +1,134 @@
|
||||
from typing import Union
|
||||
|
||||
from PIL import Image, ImageDraw
|
||||
from gsuid_core.utils.image.convert import convert_img
|
||||
|
||||
from .draw_rank_list import RANK_TEXT
|
||||
from ..utils.api.cv.request import _CvApi
|
||||
from .draw_role_rank import REGION_MAP, grey
|
||||
from ..genshinuid_config.gs_config import gsconfig
|
||||
from ..utils.map.GS_MAP_PATH import icon2Name, artifact2attr
|
||||
from .draw_normal import get_artifact_score_data, _get_single_artifact_img
|
||||
from ..utils.fonts.genshin_fonts import (
|
||||
gs_font_15,
|
||||
gs_font_18,
|
||||
gs_font_24,
|
||||
gs_font_26,
|
||||
)
|
||||
|
||||
is_enable_akasha = gsconfig.get_config('EnableAkasha').data
|
||||
|
||||
EQUIP_MAP = {
|
||||
'EQUIP_BRACER': '生之花',
|
||||
'EQUIP_NECKLACE': '死之羽',
|
||||
'EQUIP_SHOES': '时之沙',
|
||||
'EQUIP_RING': '空之杯',
|
||||
'EQUIP_DRESS': '理之冠',
|
||||
}
|
||||
|
||||
SUBSTAT_MAP = {
|
||||
'Flat ATK': '攻击力',
|
||||
'Flat HP': '血量',
|
||||
'Flat DEF': '防御力',
|
||||
'ATK%': '百分比攻击力',
|
||||
'HP%': '百分比血量',
|
||||
'DEF%': '百分比防御',
|
||||
'Elemental Mastery': '元素精通',
|
||||
'Energy Recharge': '元素充能效率',
|
||||
'Crit RATE': '暴击率',
|
||||
'Crit DMG': '暴击伤害',
|
||||
'Cryo DMG Bonus': '冰元素伤害加成',
|
||||
'Pyro DMG Bonus': '火元素伤害加成',
|
||||
'Hydro DMG Bonus': '水元素伤害加成',
|
||||
'Electro DMG Bonus': '雷元素伤害加成',
|
||||
'Anemo DMG Bonus': '风元素伤害加成',
|
||||
'Geo DMG Bonus': '岩元素伤害加成',
|
||||
'Dendro DMG Bonus': '草元素伤害加成',
|
||||
'Healing Bonus': '治疗加成',
|
||||
'Physical Bonus': '物理伤害加成',
|
||||
}
|
||||
|
||||
|
||||
async def draw_arti_rank_img(sort_by: str) -> Union[str, bytes]:
|
||||
if not is_enable_akasha:
|
||||
return '未开启排名系统...'
|
||||
cv_api = _CvApi()
|
||||
|
||||
sort_by = sort_by.strip()
|
||||
if not sort_by:
|
||||
sort_by = '双爆'
|
||||
|
||||
raw_data = await cv_api.get_artifacts_list(sort_by)
|
||||
if raw_data is None:
|
||||
return '输入的排序值错误...'
|
||||
|
||||
img = Image.open(RANK_TEXT / 'star.jpg')
|
||||
|
||||
for index, arti in enumerate(raw_data):
|
||||
arti_img = Image.open(RANK_TEXT / 'arti_bg.png')
|
||||
region: str = arti['owner']['region']
|
||||
nickname: str = arti['owner']['nickname']
|
||||
uid: str = arti['uid']
|
||||
|
||||
icon_url: str = arti['icon']
|
||||
name = icon2Name[icon_url.split('/')[-1].split('.')[0]]
|
||||
# rel_img = Image.open(REL_PATH / f'{name}.png')
|
||||
|
||||
aritifact = {
|
||||
'aritifactName': name,
|
||||
'aritifactSetsName': artifact2attr[name],
|
||||
'aritifactPieceName': EQUIP_MAP[arti['equipType']],
|
||||
'aritifactStar': arti['stars'],
|
||||
'aritifactLevel': arti['level'] - 1,
|
||||
'reliquaryMainstat': {
|
||||
'statValue': int(arti['mainStatValue']),
|
||||
'statName': SUBSTAT_MAP[arti['mainStatKey']],
|
||||
},
|
||||
'reliquarySubstats': [],
|
||||
}
|
||||
|
||||
for sub in arti['substats']:
|
||||
aritifact['reliquarySubstats'].append(
|
||||
{
|
||||
'statValue': round(arti['substats'][sub], 1),
|
||||
'statName': SUBSTAT_MAP[sub],
|
||||
}
|
||||
)
|
||||
|
||||
if region in REGION_MAP:
|
||||
region_color = REGION_MAP[region]
|
||||
else:
|
||||
region_color = (128, 128, 128)
|
||||
|
||||
new_aritifact = await get_artifact_score_data(aritifact, None, '无疑')
|
||||
_arti_img = await _get_single_artifact_img(new_aritifact)
|
||||
|
||||
arti_img.paste(_arti_img, (0, 0), _arti_img)
|
||||
arti_draw = ImageDraw.Draw(arti_img)
|
||||
|
||||
arti_draw.rounded_rectangle((27, 366, 112, 396), 20, region_color)
|
||||
arti_draw.text((70, 381), region, 'white', gs_font_24, 'mm')
|
||||
arti_draw.text((120, 381), nickname, 'white', gs_font_24, 'lm')
|
||||
arti_draw.text((155, 333), f'UID {uid}', grey, gs_font_15, 'mm')
|
||||
|
||||
img.paste(
|
||||
arti_img,
|
||||
(15 + 318 * (index % 4), 468 + 410 * (index // 4)),
|
||||
arti_img,
|
||||
)
|
||||
img_draw = ImageDraw.Draw(img)
|
||||
img_draw.text(
|
||||
(650, 425), f'前20 / 当前排序 {sort_by}', 'white', gs_font_26, 'mm'
|
||||
)
|
||||
img_draw.text(
|
||||
(650, img.size[1] - 35),
|
||||
'Power by Wuyi无疑 & '
|
||||
'Data by AKS & CV '
|
||||
'Created by GsCore & GenshinUID',
|
||||
(200, 200, 200),
|
||||
gs_font_18,
|
||||
anchor='mm',
|
||||
)
|
||||
await cv_api.close()
|
||||
|
||||
return await convert_img(img)
|
@ -619,13 +619,17 @@ async def _get_single_artifact_img(aritifact: Dict) -> Image.Image:
|
||||
return artifactimg_bg
|
||||
|
||||
|
||||
async def get_artifact_score_data(aritifact: Dict, char: Character) -> Dict:
|
||||
async def get_artifact_score_data(
|
||||
aritifact: Dict,
|
||||
char: Optional[Character] = None,
|
||||
char_name: Optional[str] = None,
|
||||
) -> Dict:
|
||||
all_value_score = 0
|
||||
all_cv_score = 0
|
||||
for i in aritifact['reliquarySubstats']:
|
||||
subName: str = i['statName']
|
||||
subValue: float = i['statValue']
|
||||
if not hasattr(char, 'baseAtk'):
|
||||
if char is not None and not hasattr(char, 'baseAtk'):
|
||||
await char.new()
|
||||
cv_score = 0
|
||||
|
||||
@ -634,13 +638,26 @@ async def get_artifact_score_data(aritifact: Dict, char: Character) -> Dict:
|
||||
elif subName == '暴击伤害':
|
||||
cv_score += subValue
|
||||
|
||||
if char is None:
|
||||
_atk = 750
|
||||
_hp = 12000
|
||||
_def = 700
|
||||
if char_name is None:
|
||||
return {}
|
||||
_char_name = char_name
|
||||
else:
|
||||
_atk = char.baseAtk
|
||||
_hp = char.baseHp
|
||||
_def = char.baseDef
|
||||
_char_name = char.char_name
|
||||
|
||||
value_temp = await get_artifacts_value(
|
||||
subName,
|
||||
subValue,
|
||||
char.baseAtk,
|
||||
char.baseHp,
|
||||
char.baseDef,
|
||||
char.char_name,
|
||||
_atk,
|
||||
_hp,
|
||||
_def,
|
||||
_char_name,
|
||||
)
|
||||
|
||||
i['value_score'] = value_temp
|
||||
|
@ -32,12 +32,15 @@ CV_MAP = {
|
||||
|
||||
REGION_MAP = {
|
||||
'CN': (255, 58, 58),
|
||||
'ASIA': (255, 255, 127),
|
||||
'ASIA': (169, 109, 57),
|
||||
'NA': (255, 165, 0),
|
||||
'EU': (80, 98, 255),
|
||||
'TW': (37, 37, 37),
|
||||
'B': (128, 35, 151),
|
||||
}
|
||||
|
||||
grey = (170, 170, 170)
|
||||
|
||||
|
||||
async def _get_color(
|
||||
cmap: Dict[int, str], value: float
|
||||
@ -117,9 +120,8 @@ async def draw_role_rank_img(char_name: str) -> Union[str, bytes]:
|
||||
icon_list.append(icon_img.resize((51, 51)))
|
||||
|
||||
bar_draw.rounded_rectangle((47, 30, 150, 70), 10, region_color)
|
||||
bar_draw.text((99, 50), region, 'black', gs_font_30, 'mm')
|
||||
bar_draw.text((99, 50), region, 'white', gs_font_30, 'mm')
|
||||
|
||||
grey = (170, 170, 170)
|
||||
bar_draw.text((162, 41), nickname, 'white', gs_font_26, 'lm')
|
||||
bar_draw.text((162, 66), f'UID {uid}', grey, gs_font_20, 'lm')
|
||||
bar_draw.text((398, 42), f'{cr}: {cd}', 'white', gs_font_26, 'lm')
|
||||
|
@ -6,6 +6,15 @@
|
||||
"暴击伤害",
|
||||
"元素精通"
|
||||
],
|
||||
"无疑": [
|
||||
"血量",
|
||||
"攻击力",
|
||||
"暴击率",
|
||||
"暴击伤害",
|
||||
"元素精通",
|
||||
"防御力",
|
||||
"元素充能效率"
|
||||
],
|
||||
"八重神子": [
|
||||
"攻击力",
|
||||
"暴击率",
|
||||
|
BIN
GenshinUID/genshinuid_enka/texture2D/rank_img/arti_bg.png
Normal file
BIN
GenshinUID/genshinuid_enka/texture2D/rank_img/arti_bg.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
BIN
GenshinUID/genshinuid_enka/texture2D/rank_img/star.jpg
Normal file
BIN
GenshinUID/genshinuid_enka/texture2D/rank_img/star.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 367 KiB |
@ -16,12 +16,13 @@ from .api import (
|
||||
|
||||
SUBSTAT_MAP = {
|
||||
'双爆': 'critValue',
|
||||
'攻击力': 'substats.Flat ATK',
|
||||
'血量': 'substats.Flat HP',
|
||||
'防御力': 'substats.Flat DEF',
|
||||
'百分比攻击力': 'substats.ATK%',
|
||||
'百分比血量': 'substats.HP%',
|
||||
'百分比防御': 'substats.DEF%',
|
||||
'固定攻击力': 'substats.Flat ATK',
|
||||
'固定血量': 'substats.Flat HP',
|
||||
'固定生命': 'substats.Flat HP',
|
||||
'固定防御力': 'substats.Flat DEF',
|
||||
'元素精通': 'substats.Elemental Mastery',
|
||||
'元素充能效率': 'substats.Energy Recharge',
|
||||
'暴击率': 'substats.Crit RATE',
|
||||
@ -56,8 +57,11 @@ class _CvApi:
|
||||
'substats.Crit DMG',
|
||||
],
|
||||
str,
|
||||
None,
|
||||
] = 'critValue',
|
||||
) -> Optional[List[Dict]]:
|
||||
if sort_by is None or not sort_by:
|
||||
sort_by = 'critValue'
|
||||
if not sort_by.startswith(('c', 's')):
|
||||
for i in SUBSTAT_MAP:
|
||||
if sort_by in i:
|
||||
|
Loading…
x
Reference in New Issue
Block a user