sr查询添加面板替换 (#77)

* sr查询添加面板替换

* 🚨 `pre-commit-ci`修复格式错误

* sr查询添加面板替换

* 🚨 `pre-commit-ci`修复格式错误

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
季落 2023-09-14 19:37:41 +08:00 committed by GitHub
parent e2a54ed6b9
commit 00e8b1e3cd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 390 additions and 15 deletions

View File

@ -11,14 +11,45 @@ from .to_card import api_to_card
from ..utils.convert import get_uid
from ..utils.sr_prefix import PREFIX
from ..utils.error_reply import UID_HINT
from .get_char_img import draw_char_info_img
from ..utils.image.convert import convert_img
from .draw_char_img import cal, get_char_data
from ..utils.resource.RESOURCE_PATH import TEMP_PATH
from .draw_char_img import cal, get_char_data, draw_char_info_img
sv_char_info_config = SV('sr面板设置', pm=2)
sv_get_char_info = SV('sr面板查询', priority=10)
sv_get_sr_original_pic = SV('sr查看面板原图', priority=5)
sv_char_damage_cal = SV('sr伤害计算')
sv_group_damage_cal = SV('sr伤害计算')
@sv_group_damage_cal.on_prefix(f'{PREFIX}队伍伤害')
async def send_group_damage_msg(bot: Bot, ev: Event):
msg = ''.join(re.findall('[\u4e00-\u9fa5 ]', ev.text))
if not msg:
return None
await bot.logger.info('开始执行[队伍伤害计算]')
# 获取uid
sr_uid = await get_uid(bot, ev)
if sr_uid is None:
return await bot.send(UID_HINT)
await bot.logger.info(f'[队伍伤害计算]uid: {sr_uid}')
char_name = ' '.join(re.findall('[\u4e00-\u9fa5]+', msg))
char_list = char_name.split()
char_data_list = []
for char_name in char_list:
char_data = await get_char_data(sr_uid, char_name)
if isinstance(char_data, str):
return await bot.send(char_data)
char_data_list.append(char_data)
im_list = []
# im = await cal_group(char_data_list)
# for info_im in im:
# con = f'{info_im[0]} 暴击伤害: {info_im[1]}'
# con = f'{con} 期望伤害{info_im[2]} 满配辅助末日兽伤害{info_im[3]}'
# im_list.append(con)
await bot.send(im_list)
return None
@sv_char_damage_cal.on_prefix(f'{PREFIX}伤害计算')
@ -73,12 +104,15 @@ async def send_char_info(bot: Bot, ev: Event):
async def _get_char_info(bot: Bot, ev: Event, text: str):
# 获取角色名
msg = ''.join(re.findall('[\u4e00-\u9fa5 ]', text))
msg = ''.join(re.findall('^[a-zA-Z0-9_\u4e00-\u9fa5]+$', text))
if not msg:
return None
await bot.logger.info('开始执行[查询角色面板]')
# 获取uid
uid = await get_uid(bot, ev)
if '' in msg or '' in msg or '圣遗物' in msg:
uid = await get_uid(bot, ev, False, True)
else:
uid = await get_uid(bot, ev)
if uid is None:
return await bot.send(UID_HINT)
await bot.logger.info(f'[查询角色面板]uid: {uid}')

View File

@ -1,4 +1,3 @@
import re
import json
import math
from pathlib import Path
@ -76,11 +75,7 @@ RELIC_POS = {
}
async def draw_char_info_img(raw_mes: str, sr_uid: str):
# 获取角色名
char_name = ' '.join(re.findall('[\u4e00-\u9fa5]+', raw_mes))
char_data = await get_char_data(sr_uid, char_name)
async def draw_char_img(char_data: Dict, sr_uid: str, msg: str):
if isinstance(char_data, str):
return char_data
char = await cal_char_info(char_data)
@ -106,6 +101,10 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
bg_height = 0
if damage_len > 0:
bg_height = 48 * (1 + damage_len) + 48
char_change = 0
if '' in msg or '' in msg or '圣遗物' in msg:
char_change = 1
bg_height = bg_height + 80
# 放角色立绘
char_info = bg_img.copy()
char_info = char_info.resize((1050, 2050 + bg_height))
@ -499,14 +498,17 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
single_relic_score = 0
main_value_score = await get_relic_score(
relic['MainAffix']['Property'], main_value, char_name, True
relic['MainAffix']['Property'],
main_value,
char.char_name,
True,
)
if main_property.__contains__('AddedRatio') and relic['Type'] == 5:
attr_name = main_property.split('AddedRatio')[0]
if attr_name == avatarId2DamageType[str(char.char_id)]:
weight_dict = {}
for item in AvatarRelicScore:
if item['role'] == char_name:
if item['role'] == char.char_name:
weight_dict = item
add_value = (
(main_value + 1)
@ -522,14 +524,14 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
subProperty = i['Property']
tmp_score = await get_relic_score(
subProperty, subValue, char_name, False
subProperty, subValue, char.char_name, False
)
single_relic_score += tmp_score
if subName in ['攻击力', '生命值', '防御力', '速度']:
subValueStr = "{:.1f}".format(subValue)
else:
subValueStr = "{:.1f}".format(subValue * 100) + '%' # type: ignore
subValueStr = "{:.1f}".format(subValue * 100) + '%'
subNameStr = subName.replace('百分比', '').replace('元素', '')
# 副词条文字颜色
relic_color = (255, 255, 255)
@ -660,6 +662,23 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
'lm',
)
if char_change == 1:
char_img_draw.text(
(525, 2022 + bg_height - 80),
'面板数据来源于:【面板替换】',
(255, 255, 255),
sr_font_26,
'mm',
)
char_img_draw.text(
(525, 2022 + bg_height - 50),
f'{msg}',
(255, 255, 255),
sr_font_26,
'mm',
)
# 写底层文字
char_img_draw.text(
(525, 2022 + bg_height),

View File

@ -250,7 +250,7 @@ class RoleInstance:
):
skill_info[2] = skill_info[2] + 1
attack = merged_attr['attack']
attack = merged_attr.get('attack', 0)
if self.raw_data.avatar.id_ == 1104:
# 杰帕德天赋加攻
defence = merged_attr['defence']
@ -481,6 +481,7 @@ class RoleInstance:
damage_qw_z += damage_qw
attr_value_tz: float = self.base_attr.get('attack', 0)
attribute_atk = self.attribute_bonus.get('AttackDelta', 0)
attack_tz = (
attr_value_tz
+ attr_value_tz
@ -489,7 +490,7 @@ class RoleInstance:
+ self.attribute_bonus.get('AttackAddedRatio', 0)
+ 2.144
)
+ self.attribute_bonus['AttackDelta']
+ attribute_atk
)
if self.raw_data.avatar.id_ in [1205, 1208]:
attack_tz = (skill_multiplier * attack_tz) + (

View File

@ -0,0 +1,321 @@
import re
import json
from pathlib import Path
from typing import Dict, Tuple, Union, Optional
from gsuid_core.logger import logger
from .to_data import api_to_dict
from .draw_char_img import draw_char_img
from ..utils.error_reply import CHAR_HINT
from ..utils.resource.RESOURCE_PATH import PLAYER_PATH
from ..utils.excel.model import EquipmentPromotionConfig
from ..utils.map.name_covert import (
name_to_avatar_id,
name_to_weapon_id,
alias_to_char_name,
)
from ..utils.map.SR_MAP_PATH import (
EquipmentID2Name,
EquipmentID2Rarity,
rankId2Name,
avatarId2Name,
avatarId2EnName,
avatarId2DamageType,
)
WEAPON_TO_INT = {
'': 1,
'': 2,
'': 3,
'': 4,
'': 5,
'': 5,
}
CHAR_TO_INT = {
'': 0,
'': 1,
'': 2,
'': 3,
'': 4,
'': 5,
'': 6,
'': 6,
}
PieceName_ilst = {
0: ['', '帽子', '头部'],
1: ['', '手套', '手部'],
2: ['', '衣服', '躯干'],
3: ['', '鞋子', '', '腿部'],
4: ['', '位面球'],
5: ['', '绳子', '', '链子', '连结绳'],
}
async def draw_char_info_img(raw_mes: str, sr_uid: str):
# 获取角色名
# msg = ' '.join(re.findall('[\u4e00-\u9fa5]+', raw_mes))
print(raw_mes)
_args = await get_char_args(raw_mes, sr_uid)
if isinstance(_args, str):
return _args
else:
if isinstance(_args[0], str):
return _args[0]
char = await get_char(*_args)
if isinstance(char, str):
logger.info('[sr查询角色] 绘图失败, 替换的武器不正确!')
return char
im = await draw_char_img(char, sr_uid, raw_mes)
logger.info('[查询角色] 绘图完成,等待发送...')
return im
async def get_char_args(
msg: str, uid: str
) -> Union[Tuple[Dict, Optional[str], Optional[int], Optional[int]], str]:
# 可能进来的值
# 六命希儿带于夜色中换1000xxxx4青雀遗器换1000xxxx6希儿头换银狼手
# 六命希儿带于夜色中换1000xxxx6希儿头
# 希儿换银狼手
fake_name = ''
talent_num = None
char_data = {}
weapon, weapon_affix = None, None
msg = (
msg.replace('', '')
.replace('', '')
.replace('圣遗物', '遗器')
.replace('', '')
)
# 希儿带于夜色中换1000xxxx6希儿头
msg_list = msg.split('')
for index, part in enumerate(msg_list):
changeuid = await get_part_uid(part, uid)
# 判断主体
if index == 0:
fake_name, talent_num = await get_fake_char_str(part)
# 判断是否开启fake_char
if '遗器' in msg:
char_data = await get_fake_char_data(
char_data, fake_name, changeuid
)
else:
char_data = await get_char_data(uid, fake_name)
if isinstance(char_data, str):
return char_data
continue
if '遗器' in part:
fake_data = await get_char_data(
changeuid, part.replace('遗器', '').replace(changeuid, '')
)
if isinstance(fake_data, str):
return fake_data
char_data = await get_fake_char_data(fake_data, fake_name, uid)
if isinstance(char_data, str):
return char_data
else:
for i, s in enumerate(['头部', '手部', '躯干', '腿部', '位面球', '连结绳']):
if '赤沙' in part:
continue
if part[-1] in PieceName_ilst[i]:
if isinstance(char_data, str):
return char_data
char_data = await change_equip(
changeuid, char_data, part, s, i
)
if not char_data:
return '要替换的部件不存在噢~'
break
else:
weapon, weapon_affix = await get_fake_weapon_str(part)
return char_data, weapon, weapon_affix, talent_num
async def change_equip(
uid: str, char_data: Dict, part: str, s: str, i: int
) -> Dict:
char_name = part.replace(part[-1], '').replace(uid, '')
print(char_name)
print(uid)
fake_data = await get_char_data(uid, char_name)
if isinstance(fake_data, str):
return {}
relicmap = i + 1
for equip in fake_data['RelicInfo']:
if str(str(equip['relicId'])[-1]) == str(relicmap):
char_data['RelicInfo'][i] = equip
break
return char_data
async def get_part_uid(part: str, uid: str):
print(part)
sr_uid = uid
uid_data = re.findall(r'\d{9}', part)
if uid_data:
sr_uid: Optional[str] = uid_data[0]
return sr_uid
async def get_fake_char_str(char_name: str) -> Tuple[str, Optional[int]]:
'''
获取一个角色信息
'''
talent_num = None
if '' in char_name and char_name[0] in CHAR_TO_INT:
talent_num = CHAR_TO_INT[char_name[0]]
char_name = char_name[2:]
return char_name, talent_num
async def get_fake_weapon_str(msg: str) -> Tuple[str, Optional[int]]:
weapon_affix = 0
if '' in msg and msg[1] in WEAPON_TO_INT:
weapon_affix = WEAPON_TO_INT[msg[1]]
weapon = msg[2:]
else:
weapon = msg
return weapon, weapon_affix
async def get_fake_char_data(
char_data: Dict, fake_name: str, uid: str
) -> Union[Dict, str]:
fake_name = await alias_to_char_name(fake_name)
original_data = await get_char_data(uid, fake_name)
if isinstance(original_data, Dict):
char_data['RelicInfo'] = original_data['RelicInfo']
char_data['avatarAttributeBonus'] = original_data[
'avatarAttributeBonus'
]
char_data['rankList'] = original_data['rankList']
char_data['avatarSkill'] = original_data['avatarSkill']
char_data['avatarExtraAbility'] = original_data['avatarExtraAbility']
char_data['equipmentInfo'] = original_data['equipmentInfo']
char_data['baseAttributes'] = original_data['baseAttributes']
char_data['uid'] = original_data['uid']
char_data['rank'] = original_data['rank']
char_data['nickName'] = original_data['nickName']
char_data['avatarRarity'] = original_data['avatarRarity']
char_data['avatarPromotion'] = original_data['avatarPromotion']
char_data['avatarName'] = fake_name
char_data['avatarId'] = await name_to_avatar_id(fake_name)
en_name = avatarId2EnName(char_data['avatarId'])
char_data['avatarEnName'] = en_name
if str(char_data['avatarId']) in avatarId2DamageType:
char_data['avatarElement'] = avatarId2DamageType[
str(char_data['avatarId'])
]
else:
return '要查询的角色不存在...'
char_data['avatarLevel'] = '80'
return char_data
async def get_char_data(
sr_uid: str, char_name: str, enable_self: bool = True
) -> Union[Dict, str]:
player_path = PLAYER_PATH / str(sr_uid)
SELF_PATH = player_path / 'SELF'
if "开拓者" in str(char_name):
char_name = "开拓者"
char_id = await name_to_avatar_id(char_name)
if char_id == '':
char_name = await alias_to_char_name(char_name)
if char_name is False:
return "请输入正确的角色名"
char_path = player_path / f'{char_name}.json'
char_self_path = SELF_PATH / f'{char_name}.json'
path = Path()
if char_path.exists():
path = char_path
elif enable_self and char_self_path.exists():
path = char_self_path
else:
char_data_list = await api_to_dict(sr_uid)
charname_list = []
if isinstance(char_data_list, str):
return char_data_list
for char in char_data_list:
charname = avatarId2Name[str(char)]
charname_list.append(charname)
if str(char_name) in charname_list:
if char_path.exists():
path = char_path
elif enable_self and char_self_path.exists():
path = char_self_path
else:
return CHAR_HINT.format(char_name, char_name)
with Path.open(path, encoding='utf8') as fp:
return json.load(fp)
async def get_char(
char_data: dict,
weapon: Optional[str] = None,
weapon_affix: Optional[int] = None,
talent_num: Optional[int] = None,
):
if talent_num:
# 处理命座
rank_temp = []
char_data['rank'] = talent_num
for index in range(talent_num):
rankTemp = {}
rank_id = int(str(char_data['avatarId']) + '0' + str(index + 1))
rankTemp['rankId'] = rank_id
rankTemp['rankName'] = rankId2Name[str(rank_id)]
rank_temp.append(rankTemp)
char_data['rankList'] = rank_temp
print(weapon)
if weapon:
# 处理武器
equipmentid = await name_to_weapon_id(weapon)
print(equipmentid)
equipment_info = {}
equipment_info['equipmentID'] = int(equipmentid)
equipment_info['equipmentName'] = EquipmentID2Name[str(equipmentid)]
equipment_info['equipmentLevel'] = 80
equipment_info['equipmentPromotion'] = 6
equipment_info['equipmentRank'] = weapon_affix
equipment_info['equipmentRarity'] = EquipmentID2Rarity[
str(equipmentid)
]
equipment_base_attributes = {}
equipment_promotion_base = EquipmentPromotionConfig.Equipment[
str(equipmentid)
]['6']
# 生命值
equipment_base_attributes['hp'] = (
equipment_promotion_base.BaseHP.Value
+ equipment_promotion_base.BaseHPAdd.Value * (80 - 1)
)
# 攻击力
equipment_base_attributes['attack'] = (
equipment_promotion_base.BaseAttack.Value
+ equipment_promotion_base.BaseAttackAdd.Value * (80 - 1)
)
# 防御力
equipment_base_attributes['defence'] = (
equipment_promotion_base.BaseDefence.Value
+ equipment_promotion_base.BaseDefenceAdd.Value * (80 - 1)
)
equipment_info['baseAttributes'] = equipment_base_attributes
char_data['equipmentInfo'] = equipment_info
return char_data