初步完成一部分版本深渊图片化 (#504)

This commit is contained in:
Wuyi无疑 2023-07-17 02:52:51 +08:00
parent 41070c6978
commit 6e9e762046
15 changed files with 16886 additions and 4 deletions

View File

@ -9,6 +9,8 @@ from .get_guide import get_gs_guide
from ..version import Genshin_version
from .get_abyss_data import get_review
from ..utils.image.convert import convert_img
from .get_new_abyss_data import get_review_data
from ..genshinuid_config.gs_config import gsconfig
from ..utils.resource.RESOURCE_PATH import REF_PATH
from ..utils.map.name_covert import alias_to_char_name
@ -49,9 +51,14 @@ async def send_abyss_review(bot: Bot, ev: Event):
else:
version = ev.text
im = await get_review(version)
if gsconfig.get_config('PicWiki').data:
im = await get_review_data(version)
else:
im = await get_review(version)
if isinstance(im, List):
if isinstance(im, bytes):
await bot.send(im)
elif isinstance(im, List):
mes = [MessageSegment.text(msg) for msg in im]
await bot.send(MessageSegment.node(mes))
elif isinstance(im, str):

View File

@ -0,0 +1,28 @@
history_data = {
'4.0': {'9': '57', '10': '58', '11': '59', '12': '60'},
'3.8': {'9': '37', '10': '38', '11': '55', '12': '56'},
'3.7': {'9': '37', '10': '38', '11': '53', '12': '54'},
'3.6': {'9': '37', '10': '38', '11': '51', '12': '52'},
'3.5': {'9': '37', '10': '38', '11': '49', '12': '50'},
'3.4': {'9': '37', '10': '38', '11': '47', '12': '48'},
'3.3': {'9': '37', '10': '38', '11': '45', '12': '46'},
'3.2': {'9': '37', '10': '38', '11': '43', '12': '44'},
'3.1': {'9': '37', '10': '38', '11': '41', '12': '42'},
'3.0': {'9': '37', '10': '38', '11': '39', '12': '40'},
'2.8': {'9': '17', '10': '18', '11': '35', '12': '36'},
'2.7': {'9': '17', '10': '18', '11': '33', '12': '34'},
'2.6': {'9': '17', '10': '18', '11': '31', '12': '32'},
'2.5': {'9': '17', '10': '18', '11': '29', '12': '30'},
'2.4': {'9': '17', '10': '18', '11': '27', '12': '28'},
'2.3': {'9': '17', '10': '18', '11': '25', '12': '26'},
'2.2': {'9': '17', '10': '18', '11': '23', '12': '24'},
'2.1': {'9': '17', '10': '18', '11': '21', '12': '22'},
'2.0': {'9': '17', '10': '18', '11': '19', '12': '20'},
'1.6': {'9': '13', '10': '14', '11': '25', '15': '16'},
'1.5': {'9': '6', '10': '5', '11': '11', '12': '12'},
'1.4': {'9': '6', '10': '5', '11': '9', '12': '10'},
'1.3': {'9': '6', '10': '5', '11': '7', '12': '8'},
'1.2': {'9': '1', '10': '2', '11': '3', '12': '4'},
'1.1': {'9': '1', '10': '2', '11': '3', '12': '4'},
'1.0': {'9': '1', '10': '2', '11': '3', '12': '4'},
}

View File

@ -0,0 +1,147 @@
from pathlib import Path
from typing import List, Literal
from PIL import Image, ImageDraw
from gsuid_core.utils.image.convert import convert_img
from gsuid_core.utils.api.ambr.request import get_ambr_icon
from gsuid_core.utils.image.image_tools import get_color_bg
from ..version import Genshin_version
from .abyss_new_history import history_data
from ..utils.map.GS_MAP_PATH import abyss_data, monster_data
from ..utils.resource.RESOURCE_PATH import TEXT2D_PATH, MONSTER_ICON_PATH
from ..utils.fonts.genshin_fonts import (
gs_font_24,
gs_font_28,
gs_font_36,
gs_font_84,
)
TEXT_PATH = Path(__file__).parent / 'texture2d'
monster_fg = Image.open(TEXT_PATH / 'monster_fg.png')
upper_tag = Image.open(TEXT_PATH / 'upper_tag.png')
lower_tag = Image.open(TEXT_PATH / 'lower_tag.png')
async def get_half_img(data: List, half: Literal['Upper', 'Lower']):
half_img = Image.new('RGBA', (1100, 3000), (0, 0, 0, 0))
upper_h = 60
temp = 0
for index, wave in enumerate(data):
if 'ExtraDesc' in wave:
pass
# ExtraDesc = wave['ExtraDesc']['CH']
monsters = wave['Monsters']
wave_monster_uh = (((len(monsters) - 1) // 3) + 1) * 125 + 40
upper_h += wave_monster_uh
wave_tag = Image.open(TEXT_PATH / 'wave_tag.png')
wave_tag_draw = ImageDraw.Draw(wave_tag)
wave_tag_draw.text(
(36, 20), f'{index+1}', (210, 210, 210), gs_font_24, 'lm'
)
half_img.paste(wave_tag, (53, 45 + temp), wave_tag)
for m_index, monster in enumerate(monsters):
monster_id = monster['ID']
real_id = str(monster_id)
while len(real_id) < 5:
real_id = '0' + real_id
real_id = '2' + real_id + '01'
monster_num = monster['Num']
monster_name = monster_data[real_id]['name']
icon_name = monster_data[real_id]['icon']
monster_icon = await get_ambr_icon(
'monster', icon_name, MONSTER_ICON_PATH
)
monster_icon = monster_icon.resize((89, 89))
monster_img = Image.open(TEXT_PATH / 'monster_bg.png')
monster_img.paste(monster_icon, (31, 19), monster_icon)
monster_img.paste(monster_fg, (0, 0), monster_fg)
monster_draw = ImageDraw.Draw(monster_img)
monster_draw.text(
(137, 52), monster_name[:8], 'white', gs_font_24, 'lm'
)
monster_draw.text(
(137, 82),
f'x{monster_num}',
(210, 210, 210),
gs_font_24,
'lm',
)
half_img.paste(
monster_img,
(5 + (m_index % 3) * 360, 83 + (m_index // 3) * 110 + temp),
monster_img,
)
temp = wave_monster_uh
tag = upper_tag if half == 'Upper' else lower_tag
half_img.paste(tag, (0, 0), tag)
upper_bg = Image.new('RGBA', (1100, upper_h), (0, 0, 0, 0))
upper_bg_draw = ImageDraw.Draw(upper_bg)
upper_bg_draw.rounded_rectangle(
(20, 30, 1080, upper_h - 20), 10, (16, 13, 13, 120)
)
half_img = half_img.crop((0, 0, 1100, upper_h))
upper_bg.paste(half_img, (0, 0), half_img)
return half_img
async def get_review_data(
version: str = Genshin_version[:3], floor: str = '12'
):
floor_data = history_data[version][floor]
data = abyss_data[floor_data]
# floor_buff = data['Disorder']['CH']
floor_monster = data['Chambers']
icon = Image.open(TEXT2D_PATH / 'icon.png')
img = await get_color_bg(1100, 6000, TEXT_PATH / 'bg', True)
img_draw = ImageDraw.Draw(img)
img_draw.rounded_rectangle((421, 272, 548, 310), 10, (144, 0, 0))
img_draw.text((430, 175), f'深境螺旋 {floor}', 'white', gs_font_84, 'lm')
img_draw.text((485, 291), f'版本{version}', 'white', gs_font_28, 'mm')
img.paste(icon, (45, 80), icon)
level_h = 456
temp = 0
for f_index, level in enumerate(floor_monster):
level_monster_lv = level['Level'] # 72
level_name = level['Name'] # '12-1'
upper = level['Upper']
lower = level['Lower']
upper_img = await get_half_img(upper, 'Upper')
lower_img = await get_half_img(lower, 'Lower')
upper_h = upper_img.height
lower_h = lower_img.height
level_img = Image.new(
'RGBA', (1100, upper_h + lower_h + 70), (0, 0, 0, 0)
)
level_draw = ImageDraw.Draw(level_img)
level_draw.rounded_rectangle((320, 20, 780, 72), 10, (16, 13, 13, 120))
level_draw.text(
(550, 46),
f'{level_name} · 怪物等级 Lv{level_monster_lv}',
'white',
gs_font_36,
'mm',
)
level_img.paste(upper_img, (0, 60), upper_img)
level_img.paste(lower_img, (0, 50 + upper_h), lower_img)
level_h += upper_h + lower_h + 70
img.paste(level_img, (0, 456 + temp), level_img)
temp += level_img.height
img = img.crop((0, 0, 1100, level_h))
# 最后生成图片
all_black = Image.new('RGBA', img.size, (0, 0, 0))
img = Image.alpha_composite(all_black, img)
return await convert_img(img)

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -8,7 +8,7 @@ from ..genshinuid_resource import startup
from ..genshinuid_xkdata import draw_xk_abyss_img
# from ..genshinuid_enka.start import check_artifacts_list
from ..genshinuid_guide.get_abyss_data import generate_data
# from ..genshinuid_guide.get_abyss_data import generate_data
from ..utils.resource.generate_char_card import create_all_char_card
from ..genshinuid_xkdata.get_all_char_data import (
save_all_char_info,
@ -23,7 +23,7 @@ async def all_start():
# await check_artifacts_list()
await create_all_char_card()
await draw_xk_abyss_img()
await generate_data()
# await generate_data()
await save_all_char_info()
await save_all_abyss_rank()
except Exception as e:

View File

@ -20,6 +20,8 @@ artifact2attr_fileName = f'artifact2attr_mapping_{version}.json'
enName2Id_fileName = f'enName2AvatarID_mapping_{version}.json'
icon2Name_fileName = f'icon2Name_mapping_{version}.json'
avatarName2Weapon_fileName = f'avatarName2Weapon_mapping_{version}.json'
monster_fileName = f'monster_{version}.json'
SAConfig_fileName = 'SpiralAbyssFloorConfig.json'
class TS(TypedDict):
@ -71,3 +73,9 @@ with open(MAP / avatarId2Star_fileName, 'r', encoding='utf8') as f:
with open(MAP / enName2Id_fileName, 'r', encoding='utf8') as f:
enName_to_avatarId_data = msgjson.decode(f.read(), type=Dict[str, str])
with open(MAP / monster_fileName, 'r', encoding='utf8') as f:
monster_data = msgjson.decode(f.read(), type=Dict[str, Dict])
with open(MAP / SAConfig_fileName, 'r', encoding='utf8') as f:
abyss_data = msgjson.decode(f.read(), type=Dict[str, Dict])

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -22,6 +22,7 @@ REL_PATH = RESOURCE_PATH / 'reliquaries'
ICON_PATH = RESOURCE_PATH / 'icon'
TEMP_PATH = RESOURCE_PATH / 'temp'
CARD_PATH = RESOURCE_PATH / 'card'
MONSTER_ICON_PATH = RESOURCE_PATH / 'monster_icon'
GUIDE_PATH = WIKI_PATH / 'guide'
REF_PATH = WIKI_PATH / 'ref'
WIKI_REL_PATH = WIKI_PATH / 'artifacts'
@ -71,6 +72,7 @@ def init_dir():
WIKI_COST_WEAPON_PATH,
DATA_PATH,
CHAR_SIDE_TEMP_PATH,
MONSTER_ICON_PATH,
]:
i.mkdir(parents=True, exist_ok=True)

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB