新增:引入avatarOffsetMap.json

This commit is contained in:
KimgiaiiWuyi 2022-06-14 00:27:28 +08:00
parent 24349d5e24
commit 5dc2154073
3 changed files with 142 additions and 124 deletions

View File

@ -2,12 +2,11 @@ import math
import json import json
from io import BytesIO from io import BytesIO
from pathlib import Path from pathlib import Path
import string
from io import BytesIO
from base64 import b64encode from base64 import b64encode
from PIL import Image, ImageDraw, ImageFont from PIL import Image, ImageDraw, ImageFont
from httpx import get from httpx import get
from nonebot import logger
R_PATH = Path(__file__).parents[0] R_PATH = Path(__file__).parents[0]
TEXT_PATH = R_PATH / 'texture2D' TEXT_PATH = R_PATH / 'texture2D'
@ -16,6 +15,7 @@ GACHA_PATH = R_PATH / 'gachaImg'
PLAYER_PATH = R_PATH / 'player' PLAYER_PATH = R_PATH / 'player'
RELIC_PATH = R_PATH / 'relicIcon' RELIC_PATH = R_PATH / 'relicIcon'
MAP_PATH = R_PATH / 'map' MAP_PATH = R_PATH / 'map'
ETC_PATH = R_PATH / 'etc'
COLOR_MAP = {'Anemo' : (3, 90, 77), 'Cryo': (5, 85, 151), 'Dendro': (4, 87, 3), COLOR_MAP = {'Anemo' : (3, 90, 77), 'Cryo': (5, 85, 151), 'Dendro': (4, 87, 3),
'Electro': (47, 1, 85), 'Geo': (85, 34, 1), 'Hydro': (4, 6, 114), 'Pyro': (88, 4, 4)} 'Electro': (47, 1, 85), 'Geo': (85, 34, 1), 'Hydro': (4, 6, 114), 'Pyro': (88, 4, 4)}
@ -56,35 +56,53 @@ def strLenth(r: str, size: int, limit: int = 540) -> str:
async def draw_char_card(raw_data: dict, charUrl: str = None) -> bytes: async def draw_char_card(raw_data: dict, charUrl: str = None) -> bytes:
img = Image.open(TEXT_PATH / '{}.png'.format(raw_data['avatarElement'])) img = Image.open(TEXT_PATH / '{}.png'.format(raw_data['avatarElement']))
char_info_1 = Image.open(TEXT_PATH / 'char_info_1.png') char_info_1 = Image.open(TEXT_PATH / 'char_info_1.png')
char_imfo_mask = Image.open(TEXT_PATH / 'char_info_mask.png') char_info_mask = Image.open(TEXT_PATH / 'char_info_mask.png')
char_name = raw_data['avatarName']
char_level = raw_data['avatarLevel']
char_fetter = raw_data['avatarFetter']
# 引入offset
with open(ETC_PATH / 'avatarOffsetMap.json', 'r', encoding='UTF-8') as f:
avatarOffsetMap = json.load(f)
#based_w, based_h = 320, 1024 #based_w, based_h = 320, 1024
based_w, based_h = 600, 1200 based_w, based_h = 600, 1200
if charUrl: if charUrl:
offset_x, offset_y = 200, 0
char_img = Image.open(BytesIO(get(charUrl).content)).convert('RGBA') char_img = Image.open(BytesIO(get(charUrl).content)).convert('RGBA')
else: else:
if char_name in avatarOffsetMap:
offset_x, offset_y = avatarOffsetMap[char_name][0], avatarOffsetMap[char_name][1]
else:
offset_x, offset_y = 200, 0
char_img = Image.open(GACHA_PATH / 'UI_Gacha_AvatarImg_{}.png'.format(raw_data['avatarEnName'])) #角色图像 char_img = Image.open(GACHA_PATH / 'UI_Gacha_AvatarImg_{}.png'.format(raw_data['avatarEnName'])) #角色图像
# 确定图片的长宽 # 确定图片的长宽
w, h = char_img.size w, h = char_img.size
if (w, h) != (based_w, based_h): if (w, h) != (based_w, based_h):
offset = 200 #offset_all = offset_x if offset_x >= offset_y else offset_y
based_new_w, based_new_h = based_w + offset, based_h + offset based_new_w, based_new_h = based_w + offset_x, based_h + offset_y
based_scale = '%.3f' % (based_new_w / based_new_h) based_scale = '%.3f' % (based_new_w / based_new_h)
scale_f = '%.3f' % (w / h) scale_f = '%.3f' % (w / h)
new_w = math.ceil(based_new_h * float(scale_f)) new_w = math.ceil(based_new_h * float(scale_f))
new_h = math.ceil(based_new_w / float(scale_f)) new_h = math.ceil(based_new_w / float(scale_f))
if scale_f > based_scale: if scale_f > based_scale:
bg_img2 = char_img.resize((new_w, based_new_h), Image.Resampling.LANCZOS) bg_img2 = char_img.resize((new_w, based_new_h), Image.Resampling.LANCZOS)
char_img = bg_img2.crop((new_w/2 - based_new_w /2 + offset, 0, new_w/2 + based_new_w /2 , based_new_h - offset)) x1 = new_w/2 - based_new_w /2 + offset_x
y1 = 0
x2 = new_w/2 + based_new_w /2
y2 = based_new_h - offset_y
else: else:
bg_img2 = char_img.resize((based_new_w , new_h), Image.Resampling.LANCZOS) bg_img2 = char_img.resize((based_new_w , new_h), Image.Resampling.LANCZOS)
char_img = bg_img2.crop((0 + offset , new_h/2 - based_new_h/2, based_new_w , new_h/2 + based_new_h/2 - offset)) x1 = 0 + offset_x
else: y1 = new_h/2 - based_new_h/2
pass x2 = based_new_w
y2 = new_h/2 + based_new_h/2 - offset_y
char_img = bg_img2.crop((x1, y1, x2, y2))
img_temp = Image.new('RGBA', (based_w, based_h), (0,0,0,0)) img_temp = Image.new('RGBA', (based_w, based_h), (0,0,0,0))
img_temp.paste(char_img,(0,0),char_imfo_mask) img_temp.paste(char_img,(0,0),char_info_mask)
img.paste(img_temp, (0, 0), img_temp) img.paste(img_temp, (0, 0), img_temp)
img.paste(char_info_1, (0, 0), char_info_1) img.paste(char_info_1, (0, 0), char_info_1)
@ -267,10 +285,6 @@ async def draw_char_card(raw_data: dict, charUrl: str = None) -> bytes:
else: else:
equipMain += mainName[0] equipMain += mainName[0]
char_name = raw_data['avatarName']
char_level = raw_data['avatarLevel']
char_fetter = raw_data['avatarFetter']
# 评分算法 # 评分算法
# 圣遗物总分 + 角色等级 + (a+e+q)*4 + 武器等级 * 1+(武器精炼数 -1 * 0.25 # 圣遗物总分 + 角色等级 + (a+e+q)*4 + 武器等级 * 1+(武器精炼数 -1 * 0.25
''' '''
@ -332,124 +346,127 @@ async def draw_char_card(raw_data: dict, charUrl: str = None) -> bytes:
attack_green = fight_prop['addAtk'] attack_green = fight_prop['addAtk']
defense_green = fight_prop['addDef'] defense_green = fight_prop['addDef']
with open(MAP_PATH / 'dmgMap.json', 'r', encoding='UTF-8') as f: with open(ETC_PATH / 'dmgMap.json', 'r', encoding='UTF-8') as f:
dmgMap = json.load(f) dmgMap = json.load(f)
for action in dmgMap[char_name]: if char_name in dmgMap:
if action['seq'] == seq: for action in dmgMap[char_name]:
cal = action if action['seq'] == seq:
break cal = action
else: break
if '钟离' in char_name:
cal = dmgMap[char_name][-1]
else: else:
cal = dmgMap[char_name][0] if '钟离' in char_name:
cal = dmgMap[char_name][-1]
else:
cal = dmgMap[char_name][0]
print(seq) print(seq)
print(cal) print(cal)
if cal['action'] == 'E刹那之花': if cal['action'] == 'E刹那之花':
effect_prop = defense effect_prop = defense
elif cal['key'] == '攻击力': elif cal['key'] == '攻击力':
effect_prop = attack effect_prop = attack
elif cal['key'] == '防御力': elif cal['key'] == '防御力':
effect_prop = defense effect_prop = defense
elif cal['key'] == '血量': elif cal['key'] == '血量':
effect_prop = hp effect_prop = hp
if '踩班' in cal['action']:
effect_prop += 1202
effect_prop += fight_prop['baseAtk'] * 0.25
if '蒸发' in cal['action'] or '融化' in cal['action']:
if '蒸发' in cal['action']:
if raw_data['avatarElement'] == 'Pyro':
k = 1.5
else:
k = 2
elif '融化' in cal['action']:
if raw_data['avatarElement'] == 'Pyro':
k = 2
else:
k = 1.5
if '魔女' in equipSets['set']: if '踩班' in cal['action']:
a = 0.15 effect_prop += 1202
else: effect_prop += fight_prop['baseAtk'] * 0.25
a = 0
add_dmg = k*(1+(2.78*em)/(em+1400)+a) if '蒸发' in cal['action'] or '融化' in cal['action']:
else: if '蒸发' in cal['action']:
add_dmg = 1 if raw_data['avatarElement'] == 'Pyro':
k = 1.5
if equipSets['type'] in ['2','']: else:
dmgBonus_cal = dmgBonus k = 2
else: elif '融化' in cal['action']:
if '追忆' in equipSets['set']: if raw_data['avatarElement'] == 'Pyro':
dmgBonus_cal = dmgBonus + 0.5 k = 2
elif '绝缘' in equipSets['set']: else:
Bouns = ce * 0.25 if ce * 0.25 <= 0.75 else 0.75 k = 1.5
dmgBonus_cal = dmgBonus + Bouns
if '魔女' in equipSets['set']:
a = 0.15
else:
a = 0
add_dmg = k*(1+(2.78*em)/(em+1400)+a)
else: else:
add_dmg = 1
if equipSets['type'] in ['2','']:
dmgBonus_cal = dmgBonus dmgBonus_cal = dmgBonus
critdmg_cal = critdmg
if '胡桃' in char_name:
effect_prop += 0.4 * hp if 0.4 * hp <= fight_prop['baseAtk'] * 4 else fight_prop['baseAtk'] * 4
elif '' in char_name:
dmgBonus_cal += 0.906
elif '绫华' in char_name:
dmgBonus_cal += 0.18
elif '宵宫' in char_name:
dmgBonus_cal += 0.5
elif '九条' in char_name:
effect_prop += 0.9129 * fight_prop['baseAtk']
critdmg_cal += 0.6
if '雾切' in weaponName:
dmgBonus_cal += 0.28
elif '弓藏' in weaponName and '' in cal['action']:
dmgBonus_cal += 0.8
elif '飞雷' in weaponName and '' in cal['action']:
dmgBonus_cal += 0.4
elif '试作澹月' in weaponName:
effect_prop += fight_prop['baseAtk'] * 0.72
elif '冬极' in weaponName:
effect_prop += fight_prop['baseAtk'] * 0.48
dmgBonus_cal += 0.12
if cal['action'] == '扩散':
dmg = 868 * 1.15 * (1+0.6+(16*em)/(em+2000))
elif '霄宫' in char_name:
dmg = effect_prop * cal['power'] * (1 + critdmg_cal) * (1 + dmgBonus_cal) * 0.5 * 0.9 * add_dmg * 1.5879
elif cal['action'] == '开Q普攻' and '心海' in char_name:
dmg = (effect_prop * cal['power'] + hp*(0.871+0.15*dmgBonus_cal)) * (1 + critdmg_cal) * (1 + dmgBonus_cal) * 0.5 * 0.9 * add_dmg
elif '绫人' in char_name:
dmg = (effect_prop * cal['power'] + 0.0222 * hp) * (1 + critdmg_cal) * (1 + dmgBonus_cal) * 0.5 * 0.9 * add_dmg * 1.5879
elif '迪奥娜' in char_name:
dmg = (effect_prop * cal['power'] + 1905) * 1.9
elif cal['action'] == 'Q开盾天星':
effect_prop = attack
dmg = (effect_prop * cal['power'] + 0.33 * hp) * (1 + critdmg_cal) * (1 + dmgBonus_cal) * 0.5 * 0.9 * add_dmg
elif isinstance(cal['power'], str):
if cal['power'] == '攻击力':
dmg = attack
elif cal['power'] == '防御力':
dmg = defense
else: else:
power = cal['power'].split('+') if '追忆' in equipSets['set']:
dmg = effect_prop * float(power[0]) / 100 + float(power[1]) dmgBonus_cal = dmgBonus + 0.5
elif cal['val'] != 'any': elif '绝缘' in equipSets['set']:
dmg = effect_prop * cal['power'] * (1 + critdmg_cal) * (1 + dmgBonus_cal) * 0.5 * 0.9 * add_dmg Bouns = ce * 0.25 if ce * 0.25 <= 0.75 else 0.75
dmgBonus_cal = dmgBonus + Bouns
else:
dmgBonus_cal = dmgBonus
critdmg_cal = critdmg
if '胡桃' in char_name:
effect_prop += 0.4 * hp if 0.4 * hp <= fight_prop['baseAtk'] * 4 else fight_prop['baseAtk'] * 4
elif '' in char_name:
dmgBonus_cal += 0.906
elif '绫华' in char_name:
dmgBonus_cal += 0.18
elif '宵宫' in char_name:
dmgBonus_cal += 0.5
elif '九条' in char_name:
effect_prop += 0.9129 * fight_prop['baseAtk']
critdmg_cal += 0.6
if '雾切' in weaponName:
dmgBonus_cal += 0.28
elif '弓藏' in weaponName and '' in cal['action']:
dmgBonus_cal += 0.8
elif '飞雷' in weaponName and '' in cal['action']:
dmgBonus_cal += 0.4
elif '试作澹月' in weaponName:
effect_prop += fight_prop['baseAtk'] * 0.72
elif '冬极' in weaponName:
effect_prop += fight_prop['baseAtk'] * 0.48
dmgBonus_cal += 0.12
if cal['action'] == '扩散':
dmg = 868 * 1.15 * (1+0.6+(16*em)/(em+2000))
elif '霄宫' in char_name:
dmg = effect_prop * cal['power'] * (1 + critdmg_cal) * (1 + dmgBonus_cal) * 0.5 * 0.9 * add_dmg * 1.5879
elif cal['action'] == '开Q普攻' and '心海' in char_name:
dmg = (effect_prop * cal['power'] + hp*(0.871+0.15*dmgBonus_cal)) * (1 + critdmg_cal) * (1 + dmgBonus_cal) * 0.5 * 0.9 * add_dmg
elif '绫人' in char_name:
dmg = (effect_prop * cal['power'] + 0.0222 * hp) * (1 + critdmg_cal) * (1 + dmgBonus_cal) * 0.5 * 0.9 * add_dmg * 1.5879
elif '迪奥娜' in char_name:
dmg = (effect_prop * cal['power'] + 1905) * 1.9
elif cal['action'] == 'Q开盾天星':
effect_prop = attack
dmg = (effect_prop * cal['power'] + 0.33 * hp) * (1 + critdmg_cal) * (1 + dmgBonus_cal) * 0.5 * 0.9 * add_dmg
elif isinstance(cal['power'], str):
if cal['power'] == '攻击力':
dmg = attack
elif cal['power'] == '防御力':
dmg = defense
else:
power = cal['power'].split('+')
dmg = effect_prop * float(power[0]) / 100 + float(power[1])
elif cal['val'] != 'any':
dmg = effect_prop * cal['power'] * (1 + critdmg_cal) * (1 + dmgBonus_cal) * 0.5 * 0.9 * add_dmg
else:
dmg = attack
print(dmg)
if cal['val'] != 'any':
percent = '{:.2f}'.format(dmg / cal['val'] * 100)
elif cal['power'] == '攻击力':
percent = '{:.2f}'.format(dmg / cal['atk'] * 100)
else:
percent = '{:.2f}'.format(dmg / cal['other'] * 100)
else: else:
dmg = attack percent = 0.00
print(dmg)
if cal['val'] != 'any':
percent = '{:.2f}'.format(dmg / cal['val'] * 100)
elif cal['power'] == '攻击力':
percent = '{:.2f}'.format(dmg / cal['atk'] * 100)
else:
percent = '{:.2f}'.format(dmg / cal['other'] * 100)
# 属性 # 属性
img_text.text((785, 174), str(round(hp)), (255, 255, 255), genshin_font_origin(28), anchor='rm') img_text.text((785, 174), str(round(hp)), (255, 255, 255), genshin_font_origin(28), anchor='rm')

View File

@ -0,0 +1 @@
{"凯特": [200, 0], "神里绫华": [200, 0], "琴": [200, 0], "旅行者": [200, 0], "丽莎": [200, 0], "芭芭拉": [200, 0], "凯亚": [200, 0], "迪卢克": [200, 0], "雷泽": [200, 0], "安柏": [200, 0], "温迪": [200, 0], "香菱": [200, 0], "北斗": [200, 0], "行秋": [200, 0], "魈": [200, 0], "凝光": [200, 0], "可莉": [-100, -150], "钟离": [200, 0], "菲谢尔": [200, 0], "班尼特": [200, 0], "达达利亚": [0, -100], "诺艾尔": [200, 0], "七七": [200, -100], "重云": [200, 0], "甘雨": [100, -100], "阿贝多": [200, 0], "迪奥娜": [200, 0], "莫娜": [200, 0], "刻晴": [200, -200], "砂糖": [200, 0], "辛焱": [200, 0], "罗莎莉亚": [200, 0], "胡桃": [560, 0], "枫原万叶": [200, 0], "烟绯": [200, 0], "宵宫": [200, 0], "托马": [200, 0], "优菈": [-200, 0], "雷电将军": [200, 0], "早柚": [200, 0], "珊瑚宫心海": [200, 0], "五郎": [200, 0], "九条裟罗": [200, 0], "荒泷一斗": [200, 0], "八重神子": [200, 0], "夜兰": [200, 0], "埃洛伊": [200, 0], "申鹤": [360, 0], "云堇": [200, 0], "久岐忍": [200, 0], "神里绫人": [200, 0], "队伍测试4号": [200, 0], "场景测试": [200, 0], "裸模1号": [200, 0], "裸男": [200, 0], "联机测试": [200, 0], "成男体型测试": [200, 0], "成女体型测试": [200, 0], "少女体型测试": [200, 0], "阿葵丽雅": [200, 0], "瑶瑶": [200, 0], "少女体型测试-二号机": [200, 0], "白盒少女": [200, 0], "大剑少女": [200, 0], "后武器测试A": [200, 0], "后武器测试B": [200, 0], "后武器测试C": [200, 0], "后武器测试D": [200, 0], "长枪成女": [200, 0], "单手剑成女测试": [200, 0], "Rx白盒": [200, 0], "少男体型测试": [200, 0], "女主新普攻": [200, 0], "男主新普攻": [200, 0], "重云(测试)": [200, 0], "测试角色": [200, 0], "七七(测试)": [200, 0], "迪奥娜(测试)": [200, 0]}