👽️ 适配新的MiniggAPI格式

This commit is contained in:
KimigaiiWuyi 2023-12-24 18:14:35 +08:00
parent fcea871857
commit 8c2a925fdd
13 changed files with 148 additions and 131 deletions

File diff suppressed because one or more lines are too long

View File

@ -170,11 +170,11 @@ class Character:
weapon_info['weaponStats'][0]['statValue'] = round( weapon_info['weaponStats'][0]['statValue'] = round(
weapon_level_data['attack'] weapon_level_data['attack']
) )
if weapon_raw_data['substat'] != '': if weapon_raw_data['mainStatText'] != '':
weapon_info['weaponStats'][1]['statName'] = weapon_raw_data[ weapon_info['weaponStats'][1]['statName'] = weapon_raw_data[
'substat' 'mainStatText'
] ]
if weapon_raw_data['substat'] == '元素精通': if weapon_raw_data['mainStatText'] == '元素精通':
fake_value = round(weapon_level_data['specialized']) fake_value = round(weapon_level_data['specialized'])
else: else:
fake_value = float( fake_value = float(
@ -189,7 +189,7 @@ class Character:
) )
else: else:
weapon_info['weaponEffect'] = '无特效。' weapon_info['weaponEffect'] = '无特效。'
weapon_info['weaponType'] = weapon_raw_data['weapontype'] weapon_info['weaponType'] = weapon_raw_data['weaponText']
self.card_prop['weaponInfo'] = weapon_info self.card_prop['weaponInfo'] = weapon_info
# 修改假命座: # 修改假命座:
@ -293,7 +293,7 @@ class Character:
# 计算突破加成 # 计算突破加成
if isinstance(char_raw, dict): if isinstance(char_raw, dict):
for attr in ATTR_MAP: for attr in ATTR_MAP:
if attr in char_raw['substat']: if attr in char_raw['substatText']:
sp = char_data['specialized'] sp = char_data['specialized']
if attr == '暴击伤害': if attr == '暴击伤害':
sp -= 0.5 sp -= 0.5

View File

@ -186,6 +186,8 @@ class Fight:
if char.char_name == '宵宫' and power_name == 'A一段伤害': if char.char_name == '宵宫' and power_name == 'A一段伤害':
power_plus = 1 power_plus = 1
elif char.char_name == '娜维娅' and '' in power_name:
power_plus = 2
power_plus += real_prop[f'{power_name[0]}_powerPlus'] - 1 power_plus += real_prop[f'{power_name[0]}_powerPlus'] - 1
@ -230,6 +232,9 @@ class Fight:
effect = f'a+{ex_add}' effect = f'a+{ex_add}'
effect_list.append(effect) effect_list.append(effect)
if char.char_name == '娜维娅' and '6层' in char.power_name:
effect_list.append('E:dmgBonus+45')
if effect_list: if effect_list:
char.real_prop = await char.get_effect_prop( char.real_prop = await char.get_effect_prop(
deepcopy(char.fight_prop), effect_list, char.char_name deepcopy(char.fight_prop), effect_list, char.char_name

View File

@ -292,27 +292,31 @@ async def enka_to_dict(
else: else:
weapon_info['weaponAffix'] = 1 weapon_info['weaponAffix'] = 1
weapon_info['weaponStats'] = [] weapon_info['weaponStats'] = []
for k in weapon_data['flat']['weaponStats']: for k in weapon_data['flat']['weaponStats']:
weapon_prop_temp = {} weapon_prop_temp = {}
weapon_prop_temp['appendPropId'] = k['appendPropId'] weapon_prop_temp['appendPropId'] = k['appendPropId']
weapon_prop_temp['statName'] = propId2Name[k['appendPropId']] weapon_prop_temp['statName'] = propId2Name[k['appendPropId']]
weapon_prop_temp['statValue'] = k['statValue'] weapon_prop_temp['statValue'] = k['statValue']
weapon_info['weaponStats'].append(weapon_prop_temp) weapon_info['weaponStats'].append(weapon_prop_temp)
# 武器特效须请求API # 武器特效须请求API
try: try:
effect_raw = await get_weapon_info(weapon_info['weaponName']) effect_raw = await get_weapon_info(weapon_info['weaponName'])
except ConnectTimeout: except ConnectTimeout:
effect_raw = await convert_ambr_to_weapon(weapon_info['itemId']) effect_raw = await convert_ambr_to_weapon(weapon_info['itemId'])
if not isinstance(effect_raw, List) and not isinstance(
effect_raw, int if (
not isinstance(effect_raw, List)
and not isinstance(effect_raw, int)
and effect_raw is not None
): ):
effect = effect_raw['effect'].format( # type:ignore effect = effect_raw[f'r{weapon_info["weaponAffix"]}'][
*effect_raw[ # type:ignore 'description'
'r{}'.format(str(weapon_info['weaponAffix'])) ]
]
)
else: else:
effect = '无特效。' effect = '无特效。'
weapon_info['weaponEffect'] = effect weapon_info['weaponEffect'] = effect
char_data['weaponInfo'] = weapon_info char_data['weaponInfo'] = weapon_info

View File

@ -65,7 +65,7 @@ async def draw_artifacts_wiki_img(data: Artifact) -> bytes:
""" """
pc2 = '' pc2 = ''
pc4 = '' pc4 = ''
for uchar in data['2pc']: for uchar in data['effect2Pc']:
code = ord(uchar) code = ord(uchar)
if 32 <= code <= 126: if 32 <= code <= 126:
code += 65248 code += 65248
@ -73,7 +73,7 @@ async def draw_artifacts_wiki_img(data: Artifact) -> bytes:
else: else:
new_char = uchar new_char = uchar
pc2 += new_char pc2 += new_char
for uchar in data['4pc']: for uchar in data['effect4Pc']:
code = ord(uchar) code = ord(uchar)
if 32 <= code <= 126: if 32 <= code <= 126:
code += 65248 code += 65248
@ -83,9 +83,9 @@ async def draw_artifacts_wiki_img(data: Artifact) -> bytes:
pc4 += new_char pc4 += new_char
""" """
if '1pc' in data: if 'effect1Pc' in data:
suitbar1 = Image.open(artifacts_suitbar1_path) suitbar1 = Image.open(artifacts_suitbar1_path)
pc1 = await str_lenth('    ' + data['1pc'], 22, 455) pc1 = await str_lenth('    ' + data['effect1Pc'], 22, 455)
# 计算长度 # 计算长度
img_draw = ImageDraw.Draw(img1) img_draw = ImageDraw.Draw(img1)
@ -97,8 +97,8 @@ async def draw_artifacts_wiki_img(data: Artifact) -> bytes:
else: else:
suitbar4 = Image.open(artifacts_suitbar4_path) suitbar4 = Image.open(artifacts_suitbar4_path)
suitbar2 = Image.open(artifacts_suitbar2_path) suitbar2 = Image.open(artifacts_suitbar2_path)
pc2 = await str_lenth('    ' + data['2pc'], 22, 455) pc2 = await str_lenth('    ' + data['effect2Pc'], 22, 455)
pc4 = await str_lenth('    ' + data['4pc'], 22, 455) pc4 = await str_lenth('    ' + data['effect4Pc'], 22, 455)
# 计算长度 # 计算长度
img_draw = ImageDraw.Draw(img1) img_draw = ImageDraw.Draw(img1)
@ -117,7 +117,7 @@ async def draw_artifacts_wiki_img(data: Artifact) -> bytes:
artifacts_list = ['flower', 'plume', 'sands', 'goblet', 'circlet'] artifacts_list = ['flower', 'plume', 'sands', 'goblet', 'circlet']
for index, i in enumerate(artifacts_list): for index, i in enumerate(artifacts_list):
if '1pc' in data and i != 'circlet': if 'effect1Pc' in data and i != 'circlet':
continue continue
rel_path = REL_PATH / f'{data[i]["name"]}.png' rel_path = REL_PATH / f'{data[i]["name"]}.png'
@ -153,7 +153,7 @@ async def draw_artifacts_wiki_img(data: Artifact) -> bytes:
result_img.paste(artifacts_bar, (0, 260 + y2 + y1 + 40), artifacts_bar) result_img.paste(artifacts_bar, (0, 260 + y2 + y1 + 40), artifacts_bar)
rarity = '稀有度:' + '/'.join(data['rarity']) rarity = '稀有度:' + '/'.join([str(i) for i in [data['rarityList']]])
text_draw = ImageDraw.Draw(result_img) text_draw = ImageDraw.Draw(result_img)
text_draw.text((295, 182), data['name'], (154, 123, 51), gs_font_40, 'mm') text_draw.text((295, 182), data['name'], (154, 123, 51), gs_font_40, 'mm')

View File

@ -15,6 +15,7 @@ from gsuid_core.utils.api.minigg.models import (
from .path import TEXT_PATH from .path import TEXT_PATH
from ..utils.resource.download_url import download from ..utils.resource.download_url import download
from ..utils.get_assets import get_assets_from_ambr
from ..utils.map.name_covert import name_to_avatar_id from ..utils.map.name_covert import name_to_avatar_id
from ..utils.image.convert import str_lenth, convert_img from ..utils.image.convert import str_lenth, convert_img
from ..utils.resource.RESOURCE_PATH import ( from ..utils.resource.RESOURCE_PATH import (
@ -78,7 +79,7 @@ async def get_single_constellation_img(
async with aiofiles.open(path, 'rb') as f: async with aiofiles.open(path, 'rb') as f:
return await f.read() return await f.read()
con = data[f'c{num}'] con = data[f'c{num}']
url = data['images'][f'c{num}'] url = data['images'][f'filename_c{num}']
img = await draw_single_constellation(con, url, num, data['name'], True) img = await draw_single_constellation(con, url, num, data['name'], True)
return await convert_img(img) return await convert_img(img)
@ -91,7 +92,7 @@ async def draw_single_constellation(
is_single: bool = False, is_single: bool = False,
) -> Image.Image: ) -> Image.Image:
# 计算长度 # 计算长度
effect = data['effect'] effect = data['description']
for i in range(1, 10): for i in range(1, 10):
if i % 2 != 0: if i % 2 != 0:
effect = effect.replace('**', '', 1) effect = effect.replace('**', '', 1)
@ -126,10 +127,10 @@ async def draw_single_constellation(
icon_bg = Image.open(TEXT_PATH / 'ring_bg.png').resize((74, 74)) icon_bg = Image.open(TEXT_PATH / 'ring_bg.png').resize((74, 74))
img.paste(icon_bg, (38, 20), icon_bg) img.paste(icon_bg, (38, 20), icon_bg)
icon_name = image.split('/')[-1] icon_name = f'{image}.png'
path = ICON_PATH / icon_name path = ICON_PATH / icon_name
if not path.exists(): if not path.exists():
await download(image, 8, icon_name) await get_assets_from_ambr(icon_name)
icon = Image.open(path).resize((38, 38)).convert('RGBA') icon = Image.open(path).resize((38, 38)).convert('RGBA')
img.paste(icon, (57, 37), icon) img.paste(icon, (57, 37), icon)
img_draw.text( img_draw.text(
@ -161,7 +162,10 @@ async def draw_constellation_wiki_img(
y = 0 y = 0
for i in range(1, 7): for i in range(1, 7):
_img = await draw_single_constellation( _img = await draw_single_constellation(
data[f'c{i}'], data['images'][f'c{i}'], i, char_data['name'] data[f'c{i}'],
data['images'][f'filename_c{i}'],
i,
char_data['name'],
) )
img_list[i] = (_img, _img.size[1]) img_list[i] = (_img, _img.size[1])
y += _img.size[1] y += _img.size[1]
@ -187,7 +191,7 @@ async def draw_constellation_wiki_img(
) )
star_pic = get_star_png(char_data['rarity']) star_pic = get_star_png(char_data['rarity'])
element_pic_path = TEXT_PATH / f'{char_data["element"]}.png' element_pic_path = TEXT_PATH / f'{char_data["elementText"]}.png'
if element_pic_path.exists(): if element_pic_path.exists():
element_pic = Image.open(element_pic_path).resize((36, 36)) element_pic = Image.open(element_pic_path).resize((36, 36))
else: else:

View File

@ -70,7 +70,7 @@ async def draw_single_cost(title: str, data: Dict) -> Tuple[Image.Image, str]:
if isinstance(material, int): if isinstance(material, int):
cost_pic = get_unknown_png() cost_pic = get_unknown_png()
else: else:
name_icon = material['images']['nameicon'] name_icon = material['images']['filename_icon']
_cost_pic = await get_assets_from_ambr(name_icon) _cost_pic = await get_assets_from_ambr(name_icon)
if _cost_pic is None: if _cost_pic is None:
cost_pic = get_unknown_png().resize((96, 96)) cost_pic = get_unknown_png().resize((96, 96))
@ -78,11 +78,11 @@ async def draw_single_cost(title: str, data: Dict) -> Tuple[Image.Image, str]:
cost_pic = _cost_pic.resize((96, 96)) cost_pic = _cost_pic.resize((96, 96))
if ( if (
material['materialtype'] == '武器突破素材' material['typeText'] == '武器突破素材'
or material['materialtype'] == '角色天赋素材' or material['typeText'] == '角色天赋素材'
) and 'daysofweek' in material: ) and 'daysOfWeek' in material:
pos = material['dropdomain'] pos = material['dropDomainName']
days = material['daysofweek'] days = material['daysOfWeek']
if '周日' in days: if '周日' in days:
days.remove('周日') days.remove('周日')
cost_pos = f'{pos} - {"/".join(days)}' cost_pos = f'{pos} - {"/".join(days)}'
@ -147,7 +147,7 @@ async def draw_char_cost_img(data: Character, talent_data: CharacterTalents):
) )
star_pic = get_star_png(data['rarity']) star_pic = get_star_png(data['rarity'])
element_pic_path = TEXT_PATH / f'{data["element"]}.png' element_pic_path = TEXT_PATH / f'{data["elementText"]}.png'
if element_pic_path.exists(): if element_pic_path.exists():
element_pic = Image.open(element_pic_path).resize((54, 54)) element_pic = Image.open(element_pic_path).resize((54, 54))
else: else:

View File

@ -56,18 +56,18 @@ async def draw_foods_wiki_img(data: Food):
w, h = 600, 750 + y1 + y2 w, h = 600, 750 + y1 + y2
star_pic = get_star_png(data['rarity']) star_pic = get_star_png(data['rarity'])
path = TEXT_PATH / f'UI_Buff_Item_{data["foodcategory"]}.png' path = TEXT_PATH / f'UI_Buff_Item_{data["filterType"]}.png'
if path.exists(): if path.exists():
type_pic = Image.open(path) type_pic = Image.open(path)
else: else:
type_pic = await get_assets_from_ambr( type_pic = await get_assets_from_ambr(
f'UI_Buff_Item_{data["foodcategory"]}' f'UI_Buff_Item_{data["filterType"]}'
) )
if type_pic is None: if type_pic is None:
type_pic = get_unknown_png() type_pic = get_unknown_png()
type_pic = type_pic.convert('RGBA').resize((40, 40)) type_pic = type_pic.convert('RGBA').resize((40, 40))
food_pic = await get_assets_from_ambr(data['images']['nameicon']) food_pic = await get_assets_from_ambr(data['images']['filename_icon'])
if food_pic is None: if food_pic is None:
food_pic = Image.new('RGBA', (320, 320)) food_pic = Image.new('RGBA', (320, 320))
else: else:
@ -86,7 +86,7 @@ async def draw_foods_wiki_img(data: Food):
img.paste(food_pic, (140, 119), food_pic) img.paste(food_pic, (140, 119), food_pic)
img_draw.text((45, 465), '食物类型', gray_color, gs_font_18, 'lm') img_draw.text((45, 465), '食物类型', gray_color, gs_font_18, 'lm')
img_draw.text((45, 500), data['foodfilter'], white_color, gs_font_36, 'lm') img_draw.text((45, 500), data['filterText'], white_color, gs_font_36, 'lm')
wiki_cost_tag = Image.open(TEXT_PATH / 'cost_tag.png') wiki_cost_tag = Image.open(TEXT_PATH / 'cost_tag.png')
img.paste(wiki_cost_tag, (25, 550), wiki_cost_tag) img.paste(wiki_cost_tag, (25, 550), wiki_cost_tag)
@ -106,7 +106,7 @@ async def draw_foods_wiki_img(data: Food):
if isinstance(material, int): if isinstance(material, int):
cost_pic = get_unknown_png() cost_pic = get_unknown_png()
else: else:
name_icon = material['images']['nameicon'] name_icon = material['images']['filename_icon']
_cost_pic = await get_assets_from_ambr(name_icon) _cost_pic = await get_assets_from_ambr(name_icon)
if _cost_pic is None: if _cost_pic is None:
cost_pic = get_unknown_png() cost_pic = get_unknown_png()

View File

@ -1,3 +1,4 @@
import re
import math import math
from typing import Dict, List, Union from typing import Dict, List, Union
@ -62,30 +63,32 @@ async def draw_weapons_wiki_img(data: Weapon, stats: WeaponStats):
gray_color = (214, 214, 214) gray_color = (214, 214, 214)
img_test = Image.new('RGBA', (1, 1)) img_test = Image.new('RGBA', (1, 1))
img_test_draw = ImageDraw.Draw(img_test) img_test_draw = ImageDraw.Draw(img_test)
effect = data['effect'] effect_desc = re.sub(
effect = effect.replace('/', '·') r'</?c[^\u4e00-\u9fa5/d]+>',
'',
data['effectTemplateRaw'],
)
rw_ef = [] rw_ef = []
for i in range(len(data['r1'])): for i in range(len(data['r1']['values'])):
now = '' _temp = []
for j in range(1, 6): for j in range(1, 6):
ef_val = data[f'r{j}'][i].replace('/', '·') _temp.append(data[f'r{j}']['values'][i].replace('/', '·'))
now += ef_val + ' / ' now = ' / '.join(_temp)
now = f'{now[:-2]}'
rw_ef.append(now) rw_ef.append(now)
if effect: if effect_desc:
effect = effect.format(*rw_ef) effect_desc = effect_desc.format(*rw_ef)
else: else:
effect = '无特效' effect_desc = '无特效'
effect = get_str_size(effect, gs_font_22, 490) effect_desc = get_str_size(effect_desc, gs_font_22, 490)
_, _, _, y1 = img_test_draw.textbbox((0, 0), effect, gs_font_22) _, _, _, y1 = img_test_draw.textbbox((0, 0), effect_desc, gs_font_22)
w, h = 600, 1110 + y1 w, h = 600, 1110 + y1
star_pic = get_star_png(data['rarity']) star_pic = get_star_png(data['rarity'])
type_pic = Image.open(TEXT_PATH / f'{data["weapontype"]}.png') type_pic = Image.open(TEXT_PATH / f'{data["weaponText"]}.png')
gacha_pic = await get_assets_from_ambr(data['images']['namegacha']) gacha_pic = await get_assets_from_ambr(data['images']['filename_gacha'])
if gacha_pic is None: if gacha_pic is None:
gacha_pic = Image.new('RGBA', (333, 666)) gacha_pic = Image.new('RGBA', (333, 666))
else: else:
@ -100,35 +103,33 @@ async def draw_weapons_wiki_img(data: Weapon, stats: WeaponStats):
img.paste(type_pic, (44, 158), type_pic) img.paste(type_pic, (44, 158), type_pic)
img.paste(gacha_pic, (134, 81), gacha_pic) img.paste(gacha_pic, (134, 81), gacha_pic)
img_draw.text((45, 744), '基础攻击力', gray_color, gs_font_18, 'lm') img_draw.text((45, 744), '基础攻击力', gray_color, gs_font_18, 'lm')
img_draw.text((545, 744), data['substat'], gray_color, gs_font_18, 'rm') img_draw.text(
(545, 744), data['mainStatText'], gray_color, gs_font_18, 'rm'
)
if data['subvalue'] != '': if data['baseStatText'] != '':
sub_val = ( sub_val = data['baseStatText']
(data['subvalue'] + '%')
if data['substat'] != '元素精通'
else data['subvalue']
)
else: else:
sub_val = '' sub_val = ''
if data['substat'] != '': if data['mainStatText'] != '':
sp = ( sp = (
'%.1f%%' % (stats['specialized'] * 100) '%.1f%%' % (stats['specialized'] * 100)
if data['substat'] != '元素精通' if data['mainStatText'] != '元素精通'
else str(math.ceil(stats['specialized'])) else str(math.ceil(stats['specialized']))
) )
else: else:
sp = '' sp = ''
atk = f'{data["baseatk"]}/{math.ceil(stats["attack"])}' atk = f'{int(data["baseAtkValue"])}/{math.ceil(stats["attack"])}'
subval = f'{sub_val}/{sp}' subval = f'{sub_val}/{sp}'
img_draw.text((45, 779), atk, white_color, gs_font_36, 'lm') img_draw.text((45, 779), atk, white_color, gs_font_36, 'lm')
img_draw.text((545, 779), subval, white_color, gs_font_36, 'rm') img_draw.text((545, 779), subval, white_color, gs_font_36, 'rm')
effect_name = f'{data["effectname"]}' if data['effectname'] else '无特效' effect_name = f'{data["effectName"]}' if data['effectName'] else '无特效'
img_draw.text((46, 837), effect_name, (255, 206, 51), gs_font_28, 'lm') img_draw.text((46, 837), effect_name, (255, 206, 51), gs_font_28, 'lm')
img_draw.text((46, 866), effect, gray_color, gs_font_22) img_draw.text((46, 866), effect_desc, gray_color, gs_font_22)
# 计算材料 # 计算材料
temp: Dict[str, List[int]] = {} temp: Dict[str, List[int]] = {}
@ -190,16 +191,16 @@ async def draw_weapons_wiki_img(data: Weapon, stats: WeaponStats):
if isinstance(material, int): if isinstance(material, int):
cost_pic = get_unknown_png() cost_pic = get_unknown_png()
else: else:
name_icon = material['images']['nameicon'] name_icon = material['images']['filename_icon']
_cost_pic = await get_assets_from_ambr(name_icon) _cost_pic = await get_assets_from_ambr(name_icon)
if _cost_pic is None: if _cost_pic is None:
cost_pic = get_unknown_png() cost_pic = get_unknown_png()
else: else:
cost_pic = _cost_pic.convert('RGBA').resize((64, 64)) cost_pic = _cost_pic.convert('RGBA').resize((64, 64))
if not cost_pos and material['materialtype'] == '武器突破素材': if not cost_pos and material['typeText'] == '武器突破素材':
pos = material['dropdomain'] pos = material['dropDomainName']
days = material['daysofweek'] days = material['daysOfWeek']
cost_pos = f'{pos} - {"/".join(days)}' cost_pos = f'{pos} - {"/".join(days)}'
t = 100 * index t = 100 * index

View File

@ -25,14 +25,14 @@ async def artifacts_wiki(name: str) -> str:
im = '该圣遗物不存在。' im = '该圣遗物不存在。'
else: else:
star = '' star = ''
for i in data['rarity']: for i in data['rarityList']:
star = star + i + '星、' star = f'{star}{i}星、'
star = star[:-1] star = star[:-1]
im = artifacts_im.format( im = artifacts_im.format(
data['name'], data['name'],
star, star,
data['2pc'], data['effect2Pc'],
data['4pc'], data['effect4Pc'],
data['flower']['name'], data['flower']['name'],
data['flower']['description'], data['flower']['description'],
data['plume']['name'], data['plume']['name'],
@ -66,7 +66,7 @@ async def foods_wiki(name: str) -> str:
data['name'], data['name'],
data['rarity'], data['rarity'],
data['foodtype'], data['foodtype'],
data['foodfilter'], data['filterText'],
data['effect'], data['effect'],
data['description'], data['description'],
ingredients, ingredients,
@ -80,7 +80,7 @@ async def enemies_wiki(name: str) -> str:
im = '该原魔不存在。' im = '该原魔不存在。'
else: else:
reward = '' reward = ''
for i in data['rewardpreview']: for i in data['rewardPreview']:
reward += ( reward += (
f'{i["name"]}:{i["count"] if "count" in i else "未知"}' f'{i["name"]}:{i["count"] if "count" in i else "未知"}'
if 'count' in i.keys() if 'count' in i.keys()
@ -89,7 +89,7 @@ async def enemies_wiki(name: str) -> str:
reward += '\n' reward += '\n'
im = '{}\n——{}——\n类型: {}\n信息: {}\n掉落物: \n{}'.format( im = '{}\n——{}——\n类型: {}\n信息: {}\n掉落物: \n{}'.format(
data['name'], data['name'],
data['specialname'], data['specialName'],
data['category'], data['category'],
data['description'], data['description'],
reward, reward,
@ -105,32 +105,32 @@ async def weapon_wiki(name: str) -> str:
im = ', '.join(data) im = ', '.join(data)
else: else:
name = data['name'] name = data['name']
_type = data['weapontype'] _type = data['weaponText']
star = data['rarity'] + '' star = str(data['rarity']) + ''
info = data['description'] info = data['description']
atk = str(data['baseatk']) atk = str(int(data['baseAtkValue']))
sub_name = data['substat'] sub_name = data['mainStatText']
if data['subvalue'] != '': if data['baseStatText'] != '':
sub_val = ( sub_val = data['baseStatText']
(data['subvalue'] + '%')
if sub_name != '元素精通'
else data['subvalue']
)
sub = '\n' + '' + sub_name + '' + sub_val sub = '\n' + '' + sub_name + '' + sub_val
else: else:
sub = '' sub = ''
if data['effectname'] != '': if data['effectName'] != '':
raw_effect = data['effect'] raw_effect = re.sub(
r'</?c[^\u4e00-\u9fa5/d]+>',
'',
data['effectTemplateRaw'],
)
rw_ef = [] rw_ef = []
for i in range(len(data['r1'])): for i in range(len(data['r1']["values"])):
now = '' now = ''
for j in range(1, 6): for j in range(1, 6):
now = now + data['r{}'.format(j)][i] + '/' now = now + data['r{}'.format(j)]["values"][i] + '/'
now = now[:-1] now = now[:-1]
rw_ef.append(now) rw_ef.append(now)
raw_effect = raw_effect.format(*rw_ef) raw_effect = raw_effect.format(*rw_ef)
effect = '\n' + '' + data['effectname'] + '' + ': ' + raw_effect effect = '\n' + '' + data['effectName'] + '' + ': ' + raw_effect
else: else:
effect = '' effect = ''
im = weapon_im.format(name, _type, star, info, atk, sub, effect) im = weapon_im.format(name, _type, star, info, atk, sub, effect)
@ -145,13 +145,13 @@ async def weapon_stats_wiki(name: str, stats: int):
elif isinstance(data, List) or isinstance(data2, List): elif isinstance(data, List) or isinstance(data2, List):
im = '请输入具体的武器名称...' im = '请输入具体的武器名称...'
else: else:
if data['substat'] != '': if data['mainStatText'] != '':
sp = ( sp = (
data['substat'] data['mainStatText']
+ ': ' + ': '
+ '%.1f%%' % (data2['specialized'] * 100) + '%.1f%%' % (data2['specialized'] * 100)
if data['substat'] != '元素精通' if data['mainStatText'] != '元素精通'
else data['substat'] else data['mainStatText']
+ ': ' + ': '
+ str(math.floor(data2['specialized'])) + str(math.floor(data2['specialized']))
) )
@ -202,9 +202,9 @@ async def char_wiki(name: str) -> str:
else: else:
name = data['title'] + '' + data['name'] name = data['title'] + '' + data['name']
star = data['rarity'] star = data['rarity']
_type = data['weapontype'] _type = data['weaponType']
element = data['element'] element = data['elementText']
up_val = data['substat'] up_val = data['substatText']
bdday = data['birthday'] bdday = data['birthday']
polar = data['constellation'] polar = data['constellation']
cv = data['cv']['chinese'] cv = data['cv']['chinese']
@ -224,9 +224,13 @@ async def char_stats_wiki(name: str, stats: int):
im = '请输入具体的角色名称...' im = '请输入具体的角色名称...'
else: else:
sp = ( sp = (
data2['substat'] + ': ' + '%.1f%%' % (data['specialized'] * 100) data2['substatText']
if data2['substat'] != '元素精通' + ': '
else data2['substat'] + ': ' + str(math.floor(data['specialized'])) + '%.1f%%' % (data['specialized'] * 100)
if data2['substatText'] != '元素精通'
else data2['substatText']
+ ': '
+ str(math.floor(data['specialized']))
) )
im = ( im = (
data2['name'] data2['name']
@ -295,7 +299,7 @@ async def constellation_wiki(name: str, c: int) -> str:
+ '' + ''
+ ': ' + ': '
+ '\n' + '\n'
+ data['c{}'.format(c)]['effect'].replace('*', '') + data['c{}'.format(c)]['description'].replace('*', '')
) )
return im return im
@ -313,7 +317,7 @@ async def talent_wiki(name: str, level: int) -> Union[List[Message], str]:
else: else:
data = data['combat3'] data = data['combat3']
skill_name = data['name'] skill_name = data['name']
skill_info = data['info'] skill_info = data['description']
skill_detail = '' skill_detail = ''
mes_list: List[Message] = [] mes_list: List[Message] = []
@ -392,6 +396,6 @@ async def talent_wiki(name: str, level: int) -> Union[List[Message], str]:
else: else:
return '该角色未有第四个被动天赋...' return '该角色未有第四个被动天赋...'
skill_name = data['name'] skill_name = data['name']
skill_info = data['info'] skill_info = data['description']
im = '{}\n{}'.format(skill_name, skill_info) im = '{}\n{}'.format(skill_name, skill_info)
return im return im

View File

@ -164,13 +164,13 @@ async def avatarName2ElementJson() -> None:
if 'retcode' in data: if 'retcode' in data:
data = await convert_ambr_to_minigg(_id) data = await convert_ambr_to_minigg(_id)
if data is not None and 'code' not in data: if data is not None and 'code' not in data:
temp[name] = elementMap[data['element']] temp[name] = elementMap[data['elementText']]
try: try:
nameicon = data['images']['namesideicon'] # type: ignore nameicon = data['images']['namesideicon'] # type: ignore
enName = nameicon.split('_')[-1] enName = nameicon.split('_')[-1]
enName2Id_result[enName] = _id enName2Id_result[enName] = _id
avatarId2Star_result[int(_id)] = str(data['rarity']) avatarId2Star_result[int(_id)] = str(data['rarity'])
avatarName2Weapon_result[data['name']] = data['weapontype'] avatarName2Weapon_result[data['name']] = data['weaponText']
except: # noqa: E722 except: # noqa: E722
adata = httpx.get( adata = httpx.get(
f'https://api.ambr.top/v2/chs/avatar/{_id}?vh=40F8' f'https://api.ambr.top/v2/chs/avatar/{_id}?vh=40F8'

View File

@ -91,6 +91,9 @@ extra = {
'Q炽鬃拳伤害': '蒸发', 'Q炽鬃拳伤害': '蒸发',
'Q焚落踢伤害': '蒸发', 'Q焚落踢伤害': '蒸发',
}, },
'娜维娅': {
'E玫瑰晶弹基础伤害': ['3层', '6层'],
},
} }
template = {'A重击伤害': {'name': 'A重击伤害', 'type': '', 'plus': 1, 'value': []}} template = {'A重击伤害': {'name': 'A重击伤害', 'type': '', 'plus': 1, 'value': []}}

View File

@ -71,12 +71,12 @@ WEAPON_TYPE = {
class ConvertWeapon(TypedDict): class ConvertWeapon(TypedDict):
name: str name: str
weapontype: str weaponText: str
rarity: str rarity: str
baseatk: float baseAtkValue: float
substat: str mainStatText: str
effect: str effectTemplateRaw: str
effectname: str effectName: str
level: int level: int
ascension: int ascension: int
attack: float attack: float
@ -94,10 +94,10 @@ class Image(TypedDict):
class ConvertCharacter(TypedDict): class ConvertCharacter(TypedDict):
name: str name: str
weapontype: str weaponText: str
rarity: str rarity: str
baseatk: float baseatk: float
substat: str substatText: str
effect: str effect: str
effectname: str effectname: str
level: int level: int
@ -105,7 +105,7 @@ class ConvertCharacter(TypedDict):
attack: float attack: float
specialized: float specialized: float
title: str title: str
element: str elementText: str
images: Image images: Image
hp: float hp: float
defense: float defense: float
@ -141,36 +141,32 @@ async def convert_ambr_to_weapon(
substat = '无副词条' substat = '无副词条'
result = { result = {
'name': raw_data['name'], 'name': raw_data['name'],
'weapontype': raw_data['type'], 'weaponText': raw_data['type'],
'rarity': str(raw_data['rank']), 'rarity': str(raw_data['rank']),
'baseatk': baseatk, 'baseAtkValue': baseatk,
'substat': substat, 'mainStatText': substat,
'effectname': effect_name, 'effectName': effect_name,
'level': 90, 'level': 90,
'ascension': 6, 'ascension': 6,
} }
for index, affix in enumerate(effect_up): for index, affix in enumerate(effect_up):
effect_value = re.findall( effect_desc = re.sub(
r'<c[^\u4e00-\u9fa5]+>\d+?.?\d+[^\u4e00-\u9fa5]+r>', r'</?c[^\u4e00-\u9fa5/d]+>',
'',
effect_up[affix], effect_up[affix],
) )
attr_list = []
if index == 0: result[f'r{index+1}'] = {'description': effect_desc}
result['effect'] = effect_up[affix]
for i, v in enumerate(effect_value):
if index == 0:
result['effect'] = result['effect'].replace(v, f'{{{i}}}')
r = re.search(r'>([0-9/.%]+)', v)
if r:
attr_list.append(r.group(1))
result[f'r{index+1}'] = attr_list
atk_curve_type = upgrade['prop'][0]['type'] atk_curve_type = upgrade['prop'][0]['type']
sp_curve_type = upgrade['prop'][1]['type'] sp_curve_type = upgrade['prop'][1]['type']
atk_curve = WEAPON_GROW_CURVE['90']['curveInfos'][atk_curve_type] atk_curve = WEAPON_GROW_CURVE['90']['curveInfos'][atk_curve_type]
sp_curve = WEAPON_GROW_CURVE['90']['curveInfos'][sp_curve_type] sp_curve = WEAPON_GROW_CURVE['90']['curveInfos'][sp_curve_type]
atk_promoto = upgrade['promote'][-1]['addProps']['FIGHT_PROP_BASE_ATTACK'] atk_promoto = upgrade['promote'][-1]['addProps']['FIGHT_PROP_BASE_ATTACK']
result['attack'] = atk_curve * baseatk + atk_promoto result['attack'] = atk_curve * baseatk + atk_promoto
result['specialized'] = sp_curve * basesp result['specialized'] = sp_curve * basesp
return cast(ConvertWeapon, result) return cast(ConvertWeapon, result)
@ -187,7 +183,7 @@ async def convert_ambr_to_minigg(
'weapontype': WEAPON_TYPE[raw_data['weaponType']], 'weapontype': WEAPON_TYPE[raw_data['weaponType']],
'element': ELEMENT_MAP[raw_data['element']], 'element': ELEMENT_MAP[raw_data['element']],
'images': {'namesideicon': raw_data['icon']}, # 暂时适配 'images': {'namesideicon': raw_data['icon']}, # 暂时适配
'substat': PROP_MAP[ 'substatText': PROP_MAP[
list(raw_data['upgrade']['promote'][-1]['addProps'].keys())[-1] list(raw_data['upgrade']['promote'][-1]['addProps'].keys())[-1]
], ],
'hp': raw_data['upgrade']['prop'][0]['initValue'] 'hp': raw_data['upgrade']['prop'][0]['initValue']