fix excel load

This commit is contained in:
qwerdvd 2023-12-05 08:46:14 +08:00
parent 7653a3b705
commit 451f0c5f5d
No known key found for this signature in database
GPG Key ID: A3AF89C783404769
6 changed files with 260 additions and 14 deletions

View File

@ -1,8 +1,13 @@
import asyncio
import re
from pathlib import Path
from gsuid_core.bot import Bot
from gsuid_core.data_store import get_res_path
from gsuid_core.models import Event
from gsuid_core.plugins.ArknightsUID.ArknightsUID.arknightsuid_resource.memoryStore import store
from gsuid_core.plugins.ArknightsUID.ArknightsUID.arknightsuid_wiki.draw_wiki_img import (
# draw_wiki,
get_equip_info,
get_wiki_info,
)
@ -32,6 +37,15 @@ async def text2pic(text: str, max_size: int = 800, font_size: int = 20):
async def send_role_wiki_pic(bot: Bot, ev: Event):
char_name = ' '.join(re.findall('[\u4e00-\u9fa5]+', ev.text))
try:
CHARACTER_TABLE = Excel.CHARATER_TABLE
except AttributeError:
TASK = []
for file_path in Path(get_res_path(['ArknightsUID', 'resource', 'gamedata'])).glob('*.json'):
TASK.append(store.get_file(file_path))
asyncio.gather(*TASK)
await Excel.preload_table()
CHARACTER_TABLE = Excel.CHARATER_TABLE
char_id = None
@ -43,6 +57,7 @@ async def send_role_wiki_pic(bot: Bot, ev: Event):
await bot.send('未找到该干员')
return
await bot.logger.info(f'开始获取{char_name}图鉴')
# img = await draw_wiki(char_id=char_id)
img = await get_wiki_info(char_id=char_id)
await bot.send(await text2pic(img))
@ -51,6 +66,15 @@ async def send_role_wiki_pic(bot: Bot, ev: Event):
async def send_equip_wiki_pic(bot: Bot, ev: Event):
char_name = ' '.join(re.findall('[\u4e00-\u9fa5]+', ev.text))
try:
CHARACTER_TABLE = Excel.CHARATER_TABLE
except AttributeError:
TASK = []
for file_path in Path(get_res_path(['ArknightsUID', 'resource', 'gamedata'])).glob('*.json'):
TASK.append(store.get_file(file_path))
asyncio.gather(*TASK)
await Excel.preload_table()
CHARACTER_TABLE = Excel.CHARATER_TABLE
char_id = None

View File

@ -1,17 +1,23 @@
import asyncio
import re
from pathlib import Path
from typing import Union
from pprint import pformat
from typing import Any, Dict, Union
from colorama import Fore, Style
from gsuid_core.utils.colortext.ColorText import ColorTextGroup, split_ctg
from gsuid_core.utils.image.image_tools import draw_text_by_line
from jinja2 import Template
from PIL import Image, ImageDraw
from ..arknightsuid_resource.constants import Excel
from ..utils.fonts.source_han_sans import (
# sans_font_18,
# sans_font_26,
# sans_font_34,
# sans_font_50,
sans_font_18,
sans_font_20,
sans_font_24,
sans_font_26,
sans_font_34,
sans_font_50,
sans_font_120,
)
@ -80,7 +86,18 @@ potential_id_to_cn = {
}
def render_template(template_str, data):
def test_ctg(length: int, *params):
print(
f'{Fore.GREEN}> running split_ctg(){Style.RESET_ALL}\
\n length: {length}\
\n texts: {params}'
)
groups_ = ColorTextGroup(list(params))
f_ = pformat(split_ctg(groups_, length)).split('\n')
print(Fore.CYAN, '\t', f_[0], '\n\t'.join(f_[0:]))
def render_template(template_str: str, data: Dict[str, Union[float, int]]):
matches = re.finditer(r'\{([^}:]+)\}', template_str)
matches_1 = re.finditer(r'\{([^{}]+):([^{}]+)\}', template_str)
@ -91,8 +108,13 @@ def render_template(template_str, data):
placeholder_data[placeholder[0]] = (formatting_option, data.get(placeholder[0], ''))
for match in matches_1:
placeholder, formatting_option = match.groups()
placeholder_data[placeholder] = (formatting_option, data.get(placeholder.replace('-', ''), ''))
value = data.get(placeholder.replace('-', ''), '')
# 可以在下列状态和初始状态间切换:\n攻击范围缩小防御力+{def:0%}
# 每秒恢复最大生命的{HP_RECOVERY_PER_SEC_BY_MAX_HP_RATIO:0.0%}
# {'def': 1, 'hp_recovery_per_sec_by_max_hp_ratio': 0.06}
if value == '':
value = data.get(placeholder.replace('-', '_').lower(), '')
placeholder_data[placeholder] = (formatting_option, value)
for placeholder, (formatting_option, value) in placeholder_data.items():
if formatting_option == '':
@ -367,18 +389,19 @@ async def draw_wiki(char_id: str):
CHARACTER_TABLE = Excel.CHARATER_TABLE
SKILL_TABLE = Excel.SKILL_TABLE
UNIEQUIP_TABLE = Excel.UNIEQUIP_TABLE
RANGE_TABLE = Excel.RANGE_TABLE
img = Image.new('RGBA', (1500, 2800), (255, 255, 255, 0))
draw = ImageDraw.Draw(img)
img.paste(bg_img, (0, 0))
img.paste(vvan_img, (-700, -100), vvan_img)
img.paste(title_img, (0, 0), title_img)
img.paste(title_img, (0, -50), title_img)
character_data = CHARACTER_TABLE[char_id]
char_name = character_data.name
draw.text(
(80, 145),
(144, 85),
char_name,
font=sans_font_120,
fill=black_color,
@ -387,24 +410,202 @@ async def draw_wiki(char_id: str):
char_rarity = character_data.rarity
rarity_img = Image.open(TEXTURE2D_PATH / f'rarity_yellow_{char_rarity}.png')
img.paste(rarity_img, (800, 300), rarity_img)
img.paste(rarity_img, (960, 120), rarity_img)
profession = character_data.profession
profession_img = Image.open(TEXTURE2D_PATH / f'icon_{profession.lower()}.png')
img.paste(profession_img, (1000, 500), profession_img)
img.paste(profession_img, (1100, 7050), profession_img)
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (290, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
char_position = character_data.position
char_position_cn = char_position_en_to_cn[char_position]
bar_img_draw.text(
(160, 100),
char_position_cn,
font=sans_font_34,
fill=white_color,
anchor='lm',
)
sub_profession_id = character_data.subProfessionId
sub_profession = UNIEQUIP_TABLE.subProfDict[sub_profession_id].subProfessionName
bar_img_draw.text(
(360, 100),
sub_profession,
font=sans_font_34,
fill=white_color,
anchor='lm',
)
img.paste(bar_img, (40, 110), bar_img)
nation_id = character_data.nationId
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (290, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text(
(155, 100),
'势力',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
bar_img_draw.text(
(355, 100),
nation_id if nation_id else '未知',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
img.paste(bar_img, (940, 180 - 50), bar_img)
group_id = character_data.groupId
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (290, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text(
(155, 100),
'阵营',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
bar_img_draw.text(
(355, 100),
group_id if group_id else '未知',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
img.paste(bar_img, (940, 188 + 20), bar_img)
team_id = character_data.teamId
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (290, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text(
(155, 100),
'队伍',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
bar_img_draw.text(
(355, 100),
team_id if team_id else '未知',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
img.paste(bar_img, (940, 196 + 90), bar_img)
char_phases_data = character_data.phases[-1]
char_max_phase = len(character_data.phases)
char_max_level = char_phases_data.maxLevel
char_attributes_key_frame = char_phases_data.attributesKeyFrames[-1].data
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (320, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text(
(140, 100),
'生命上限',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
bar_img_draw.text(
(420, 100),
str(char_attributes_key_frame.maxHp),
font=sans_font_34,
fill=white_color,
anchor='mm',
)
img.paste(bar_img, (940, 380), bar_img)
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (320, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text(
(140, 100),
'攻击力',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
bar_img_draw.text(
(420, 100),
str(char_attributes_key_frame.atk),
font=sans_font_34,
fill=white_color,
anchor='mm',
)
img.paste(bar_img, (940, 380 + 78), bar_img)
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (320, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text(
(140, 100),
'防御力',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
bar_img_draw.text(
(420, 100),
str(char_attributes_key_frame.def_),
font=sans_font_34,
fill=white_color,
anchor='mm',
)
img.paste(bar_img, (940, 380 + 78 * 2), bar_img)
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (320, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text(
(140, 100),
'法抗',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
bar_img_draw.text(
(420, 100),
str(char_attributes_key_frame.magicResistance),
font=sans_font_34,
fill=white_color,
anchor='mm',
)
img.paste(bar_img, (940, 380 + 78 * 3), bar_img)
# 攻击范围
range_id = char_phases_data.rangeId
attack_area_img = Image.open(TEXTURE2D_PATH / 'attack_area.png')
if range_id:
range_data = RANGE_TABLE.range_[range_id]
grids = range_data.grids
area_0 = Image.open(TEXTURE2D_PATH / 'area_0.png').resize((58, 58))
area_1 = Image.open(TEXTURE2D_PATH / 'area_1.png')
for grid in grids:
col = grid.col
row = grid.row
if col == 1 and row == 1:
attack_area_img.paste(area_1, (90, 105), area_1)
attack_area_img.paste(area_0, (105 + col * 56, 120 + row * 56), area_0)
img.paste(attack_area_img, (915, 730), attack_area_img)
char_potential_data = character_data.potentialRanks
potential_add_dict: dict[int, tuple[int, float]] = {}
for potential_id, potential in enumerate(char_potential_data):
@ -441,6 +642,9 @@ async def draw_wiki(char_id: str):
skill_id_list.append(skill.skillId)
for skill in skill_id_list:
skill_bg = Image.open(TEXTURE2D_PATH / 'skill_bg.png')
skill3_bar_bg = Image.open(TEXTURE2D_PATH / 'skill3_bar.png')
skill_data = SKILL_TABLE.skills[skill]
skill_level_data = skill_data.levels[-1]
skill_name = skill_level_data.name
@ -453,8 +657,26 @@ async def draw_wiki(char_id: str):
black_board_dict[black_board.key] = black_board.value
if skill_description:
skill_description = re.sub(r'<[^>]+>', '', skill_description)
skill_description = skill_description.format(**black_board_dict)
skill_description = re.sub(r'.000000', '', skill_description)
skill_description = render_template(skill_description, black_board_dict).replace('--', '-')
last_skill_description = re.sub(r'.000000', '', skill_description)
print(last_skill_description)
if '{' in last_skill_description:
raise NotImplementedError
# 匹配 -70% +200% 这种格式的数字
c = re.sub(r'(\d+)%', r'\1%', last_skill_description)
print(c)
print(test_ctg(30, last_skill_description))
draw_text_by_line(
img=skill_bg,
pos=(70, 20),
text=last_skill_description,
font=sans_font_24,
fill='#3b4354',
max_length=400,
)
# skill_bg.show()
# img.show()
return img

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB