支持版本深渊4.2, 同步新数据源

This commit is contained in:
KimigaiiWuyi 2023-10-25 04:15:16 +08:00
parent 5979715c4c
commit 5843d52b04
8 changed files with 39650 additions and 16647 deletions

View File

@ -1,5 +1,6 @@
import json
from pathlib import Path from pathlib import Path
from typing import List, Literal from typing import Dict, List, Literal
import httpx import httpx
import aiofiles import aiofiles
@ -9,9 +10,12 @@ from gsuid_core.utils.api.ambr.request import get_ambr_icon
from gsuid_core.utils.image.image_tools import get_color_bg from gsuid_core.utils.image.image_tools import get_color_bg
from ..version import Genshin_version from ..version import Genshin_version
from .abyss_new_history import history_data from ..utils.map.GS_MAP_PATH import ex_monster_data, monster2entry_data
from ..utils.resource.RESOURCE_PATH import TEXT2D_PATH, MONSTER_ICON_PATH from ..utils.resource.RESOURCE_PATH import (
from ..utils.map.GS_MAP_PATH import abyss_data, monster_data, ex_monster_data ABYSS_PATH,
TEXT2D_PATH,
MONSTER_ICON_PATH,
)
from ..utils.fonts.genshin_fonts import ( from ..utils.fonts.genshin_fonts import (
gs_font_24, gs_font_24,
gs_font_26, gs_font_26,
@ -25,6 +29,8 @@ monster_fg = Image.open(TEXT_PATH / 'monster_fg.png')
upper_tag = Image.open(TEXT_PATH / 'upper_tag.png') upper_tag = Image.open(TEXT_PATH / 'upper_tag.png')
lower_tag = Image.open(TEXT_PATH / 'lower_tag.png') lower_tag = Image.open(TEXT_PATH / 'lower_tag.png')
schedule_path = ABYSS_PATH / 'schedule.json'
async def download_Oceanid(): async def download_Oceanid():
path = MONSTER_ICON_PATH / 'UI_MonsterIcon_Oceanid_Underling.png' path = MONSTER_ICON_PATH / 'UI_MonsterIcon_Oceanid_Underling.png'
@ -43,7 +49,19 @@ async def get_half_img(data: List, half: Literal['Upper', 'Lower']):
half_draw = ImageDraw.Draw(half_img) half_draw = ImageDraw.Draw(half_img)
upper_h = 60 upper_h = 60
temp = 0 temp = 0
ver = None
for up in data:
if 'Vers' not in up:
break
if (ver is None) or (ver and up['Vers'][0] >= ver):
ver = up['Vers'][0]
continue
for index, wave in enumerate(data): for index, wave in enumerate(data):
if ver is not None and wave['Vers'][0] != ver:
continue
monsters = wave['Monsters'] monsters = wave['Monsters']
wave_monster_uh = (((len(monsters) - 1) // 3) + 1) * 125 + 40 wave_monster_uh = (((len(monsters) - 1) // 3) + 1) * 125 + 40
upper_h += wave_monster_uh upper_h += wave_monster_uh
@ -64,18 +82,41 @@ async def get_half_img(data: List, half: Literal['Upper', 'Lower']):
half_img.paste(wave_tag, (53, 45 + temp), wave_tag) half_img.paste(wave_tag, (53, 45 + temp), wave_tag)
for m_index, monster in enumerate(monsters): for m_index, monster in enumerate(monsters):
monster_id = monster['ID'] monster_id = monster['ID']
real_id = str(monster_id) real_id = str(monster_id)
while len(real_id) < 5: while len(real_id) < 5:
real_id = '0' + real_id real_id = '0' + real_id
real_id2 = '2' + real_id + '02'
real_id = '2' + real_id + '01' real_id = '2' + real_id + '01'
monster_num = monster['Num'] monster_num = monster['Num']
if real_id not in monster_data: if wave['WaveDesc'] > 1000:
wave_desc = str(int(real_id) - 400)
else:
wave_desc = str(wave['WaveDesc'])
if real_id in monster2entry_data:
monster_name = monster2entry_data[real_id]['name']
icon_name = monster2entry_data[real_id]['icon']
elif 'Name' in monster:
monster_name = monster['Name']['CH']
if wave_desc in monster2entry_data:
icon_name = monster2entry_data[wave_desc]['icon']
else:
icon_name = 'UI_AnimalIcon_Inu_Tanuki_01'
elif real_id in ex_monster_data:
monster_name = ex_monster_data[real_id]['name'] monster_name = ex_monster_data[real_id]['name']
icon_name = ex_monster_data[real_id]['icon'] icon_name = ex_monster_data[real_id]['icon']
elif wave_desc in monster2entry_data:
monster_name = monster2entry_data[wave_desc]['name']
icon_name = monster2entry_data[wave_desc]['icon']
elif real_id2 in monster2entry_data:
monster_name = monster2entry_data[real_id2]['name']
icon_name = monster2entry_data[real_id2]['icon']
else: else:
monster_name = monster_data[real_id]['name'] monster_name = '未知怪物'
icon_name = monster_data[real_id]['icon'] icon_name = 'UI_AnimalIcon_Inu_Tanuki_01'
if 'Mark' in monster: if 'Mark' in monster:
if monster['Mark']: if monster['Mark']:
@ -84,7 +125,7 @@ async def get_half_img(data: List, half: Literal['Upper', 'Lower']):
monster_icon = await get_ambr_icon( monster_icon = await get_ambr_icon(
'monster', icon_name, MONSTER_ICON_PATH 'monster', icon_name, MONSTER_ICON_PATH
) )
monster_icon = monster_icon.resize((89, 89)) monster_icon = monster_icon.resize((89, 89)).convert('RGBA')
monster_img = Image.open(TEXT_PATH / 'monster_bg.png') monster_img = Image.open(TEXT_PATH / 'monster_bg.png')
monster_img.paste(monster_icon, (31, 19), monster_icon) monster_img.paste(monster_icon, (31, 19), monster_icon)
monster_img.paste(monster_fg, (0, 0), monster_fg) monster_img.paste(monster_fg, (0, 0), monster_fg)
@ -119,11 +160,45 @@ async def get_half_img(data: List, half: Literal['Upper', 'Lower']):
return half_img return half_img
async def _get_data_from_url(url: str, path: Path) -> Dict:
if not path.exists():
async with httpx.AsyncClient() as client:
response = await client.get(url)
data = response.json()
async with aiofiles.open(path, 'w', encoding='UTF-8') as file:
await file.write(
json.dumps(data, indent=4, ensure_ascii=False)
)
else:
async with aiofiles.open(path, 'r', encoding='UTF-8') as file:
data = json.loads(await file.read())
return data
async def get_review_data( async def get_review_data(
version: str = Genshin_version[:3], floor: str = '12' version: str = Genshin_version[:3], floor: str = '12'
): ):
floor_data = history_data[version][floor] schedule_data = await _get_data_from_url(
data = abyss_data[floor_data] 'http://www.yuhengcup.top/api/get_DatabaseSchedule', schedule_path
)
schedule: List = schedule_data['SpiralAbyssSchedule']
for i in schedule:
if version in i['Name']:
floors_data = i
break
else:
return None
floor_id = floors_data['Floors'][int(floor) - 9]
floor_data_path = ABYSS_PATH / f'{floor_id}.json'
floor_data = await _get_data_from_url(
f'http://www.yuhengcup.top/api/get_Floor?_id={floor_id}',
floor_data_path,
)
data = floor_data['_data']
floor_buff = data['Disorder']['CH'].replace('<b>', '').replace('</b>', '') floor_buff = data['Disorder']['CH'].replace('<b>', '').replace('</b>', '')
floor_monster = data['Chambers'] floor_monster = data['Chambers']

View File

@ -7,7 +7,13 @@ import httpx
sys.path.append(str(Path(__file__).parents[5])) sys.path.append(str(Path(__file__).parents[5]))
sys.path.append(str(Path(__file__).parents[2])) sys.path.append(str(Path(__file__).parents[2]))
__package__ = 'GenshinUID.tools' __package__ = 'GenshinUID.tools'
from gsuid_core.utils.api.ambr.request import ( # noqa: E402
get_ambr_monster_data,
get_ambr_monster_list,
)
from ..version import Genshin_version # noqa: E402 from ..version import Genshin_version # noqa: E402
from ..utils.ambr_to_minigg import convert_ambr_to_minigg # noqa: E402 from ..utils.ambr_to_minigg import convert_ambr_to_minigg # noqa: E402
@ -35,6 +41,8 @@ enName2Id_fileName = f'enName2AvatarID_mapping_{version}.json'
avatarId2Star_fileName = f'avatarId2Star_mapping_{version}.json' avatarId2Star_fileName = f'avatarId2Star_mapping_{version}.json'
avatarName2Weapon_fileName = f'avatarName2Weapon_mapping_{version}.json' avatarName2Weapon_fileName = f'avatarName2Weapon_mapping_{version}.json'
monster2entry_fileName = f'monster2entry_mapping_{version}.json'
artifact2attr_fileName = f'artifact2attr_mapping_{version}.json' artifact2attr_fileName = f'artifact2attr_mapping_{version}.json'
icon2Name_fileName = f'icon2Name_mapping_{version}.json' icon2Name_fileName = f'icon2Name_mapping_{version}.json'
@ -57,6 +65,24 @@ BETA_CHAR = {
} }
async def monster2map():
monster_list = await get_ambr_monster_list()
result = {}
if monster_list:
for monster_main_id in monster_list['items']:
if not monster_main_id.startswith('28'):
data = await get_ambr_monster_data(monster_main_id)
if data:
for entry_id in data['entries']:
entry: dict = data['entries'][entry_id] # type: ignore
entry['name'] = data['name']
entry['route'] = data['route']
entry['icon'] = data['icon']
result[entry_id] = entry
with open(MAP_PATH / monster2entry_fileName, 'w', encoding='UTF-8') as f:
json.dump(result, f, indent=4, ensure_ascii=False)
async def download_new_file(): async def download_new_file():
base_url = 'https://gitlab.com/Dimbreath/AnimeGameData/-/raw/master' base_url = 'https://gitlab.com/Dimbreath/AnimeGameData/-/raw/master'
url_list = [ url_list = [
@ -293,6 +319,8 @@ async def artifact2attrJson() -> None:
async def main(): async def main():
await monster2map()
'''
await download_new_file() await download_new_file()
global raw_data global raw_data
try: try:
@ -307,6 +335,7 @@ async def main():
await talentId2NameJson() await talentId2NameJson()
await weaponHash2TypeJson() await weaponHash2TypeJson()
await artifact2attrJson() await artifact2attrJson()
'''
asyncio.run(main()) asyncio.run(main())

View File

@ -20,8 +20,7 @@ artifact2attr_fileName = f'artifact2attr_mapping_{version}.json'
enName2Id_fileName = f'enName2AvatarID_mapping_{version}.json' enName2Id_fileName = f'enName2AvatarID_mapping_{version}.json'
icon2Name_fileName = f'icon2Name_mapping_{version}.json' icon2Name_fileName = f'icon2Name_mapping_{version}.json'
avatarName2Weapon_fileName = f'avatarName2Weapon_mapping_{version}.json' avatarName2Weapon_fileName = f'avatarName2Weapon_mapping_{version}.json'
monster_fileName = f'monster_{version}.json' monster2entry_fileName = f'monster2entry_mapping_{version}.json'
SAConfig_fileName = 'SpiralAbyssFloorConfig.json'
EXMonster_fileName = 'ExtraMonster.json' EXMonster_fileName = 'ExtraMonster.json'
@ -75,11 +74,8 @@ with open(MAP / avatarId2Star_fileName, 'r', encoding='utf8') as f:
with open(MAP / enName2Id_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]) 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])
with open(MAP / EXMonster_fileName, 'r', encoding='utf8') as f: with open(MAP / EXMonster_fileName, 'r', encoding='utf8') as f:
ex_monster_data = msgjson.decode(f.read(), type=Dict[str, Dict]) ex_monster_data = msgjson.decode(f.read(), type=Dict[str, Dict])
with open(MAP / monster2entry_fileName, 'r', encoding='utf8') as f:
monster2entry_data = msgjson.decode(f.read(), type=Dict[str, Dict])

View File

@ -299,5 +299,19 @@
"type": "BEAST", "type": "BEAST",
"icon": "UI_MonsterIcon_MachinaIustitia_Nutcracker", "icon": "UI_MonsterIcon_MachinaIustitia_Nutcracker",
"route": "Suppression Specialist Mek" "route": "Suppression Specialist Mek"
},
"20510201": {
"id": 20510201,
"name": "历经百战的浊水粉碎幻灵",
"type": "MONSTER_ORDINARY",
"route": "Tainted Water-Spouting Phantasm",
"icon": "UI_MonsterIcon_Necalevia_Big"
},
"20511201": {
"id": 20511201,
"name": "历经百战的浊水喷吐幻灵",
"type": "MONSTER_ORDINARY",
"route": "Tainted Water-Spouting Phantasm",
"icon": "UI_MonsterIcon_Necalevia_Big"
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -23,6 +23,7 @@ ICON_PATH = RESOURCE_PATH / 'icon'
TEMP_PATH = RESOURCE_PATH / 'temp' TEMP_PATH = RESOURCE_PATH / 'temp'
CARD_PATH = RESOURCE_PATH / 'card' CARD_PATH = RESOURCE_PATH / 'card'
MONSTER_ICON_PATH = RESOURCE_PATH / 'monster_icon' MONSTER_ICON_PATH = RESOURCE_PATH / 'monster_icon'
ABYSS_PATH = WIKI_PATH / 'abyss_review'
GUIDE_PATH = WIKI_PATH / 'guide' GUIDE_PATH = WIKI_PATH / 'guide'
REF_PATH = WIKI_PATH / 'ref' REF_PATH = WIKI_PATH / 'ref'
WIKI_REL_PATH = WIKI_PATH / 'artifacts' WIKI_REL_PATH = WIKI_PATH / 'artifacts'
@ -73,6 +74,7 @@ def init_dir():
DATA_PATH, DATA_PATH,
CHAR_SIDE_TEMP_PATH, CHAR_SIDE_TEMP_PATH,
MONSTER_ICON_PATH, MONSTER_ICON_PATH,
ABYSS_PATH,
]: ]:
i.mkdir(parents=True, exist_ok=True) i.mkdir(parents=True, exist_ok=True)