✨ 初步完成一部分版本深渊
图片化 (#504)
@ -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):
|
||||
|
28
GenshinUID/genshinuid_guide/abyss_new_history.py
Normal 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'},
|
||||
}
|
147
GenshinUID/genshinuid_guide/get_new_abyss_data.py
Normal 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)
|
BIN
GenshinUID/genshinuid_guide/texture2d/bg/bg.jpg
Normal file
After Width: | Height: | Size: 151 KiB |
BIN
GenshinUID/genshinuid_guide/texture2d/lower_tag.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
GenshinUID/genshinuid_guide/texture2d/monster_bg.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
GenshinUID/genshinuid_guide/texture2d/monster_fg.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
GenshinUID/genshinuid_guide/texture2d/upper_tag.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
GenshinUID/genshinuid_guide/texture2d/wave_tag.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
@ -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:
|
||||
|
@ -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])
|
||||
|
14107
GenshinUID/utils/map/data/SpiralAbyssFloorConfig.json
Normal file
2583
GenshinUID/utils/map/data/monster_3.7.0.json
Normal 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)
|
||||
|
||||
|
BIN
GenshinUID/utils/resource/texture2d/icon.png
Normal file
After Width: | Height: | Size: 126 KiB |