diff --git a/StarRailUID/starrailuid_charinfo/draw_char_img.py b/StarRailUID/starrailuid_charinfo/draw_char_img.py index 5c231da..0229e58 100644 --- a/StarRailUID/starrailuid_charinfo/draw_char_img.py +++ b/StarRailUID/starrailuid_charinfo/draw_char_img.py @@ -422,12 +422,7 @@ async def draw_char_img(char_data: Dict, sr_uid: str, msg: str): desctexty = 115 for desctext in desclist: desctexty = draw_text_by_line( - weapon_bg, - (210, desctexty), - desctext, - sr_font_24, - '#F9F9F9', - 370, + weapon_bg, (210, desctexty), desctext, sr_font_24, '#F9F9F9', 370 ) desctexty += 28 char_info.paste(weapon_bg, (0, 855), weapon_bg) diff --git a/StarRailUID/starrailuid_charinfo/effect/Weapon/Weapon.py b/StarRailUID/starrailuid_charinfo/effect/Weapon/Weapon.py index 735bc94..a2f280a 100644 --- a/StarRailUID/starrailuid_charinfo/effect/Weapon/Weapon.py +++ b/StarRailUID/starrailuid_charinfo/effect/Weapon/Weapon.py @@ -220,7 +220,6 @@ class RiverFlowsinSpring(BaseWeapon): return attribute_bonus return attribute_bonus - class OnlySilenceRemains(BaseWeapon): weapon_base_attributes: Dict @@ -1658,7 +1657,6 @@ class Thisbodyisasword(BaseWeapon): return attribute_bonus - # 如泥酣眠 class SleepLiketheDead(BaseWeapon): weapon_base_attributes: Dict @@ -1667,7 +1665,7 @@ class SleepLiketheDead(BaseWeapon): super().__init__(weapon) async def check(self): - # 当装备者的普攻或战技伤害未造成暴击时, 使自身暴击率提高36% + # 当装备者的普攻或战技伤害未造成暴击时,使自身暴击率提高36% return True async def weapon_ability( @@ -1686,7 +1684,6 @@ class SleepLiketheDead(BaseWeapon): ) return attribute_bonus - class Weapon: @classmethod def create(cls, weapon: DamageInstanceWeapon): diff --git a/StarRailUID/starrailuid_charinfo/get_char_img.py b/StarRailUID/starrailuid_charinfo/get_char_img.py index eb3cba4..5f54a2c 100644 --- a/StarRailUID/starrailuid_charinfo/get_char_img.py +++ b/StarRailUID/starrailuid_charinfo/get_char_img.py @@ -9,7 +9,7 @@ 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.excel.model import EquipmentPromotionConfig, AvatarPromotionConfig from ..utils.map.name_covert import ( name_to_avatar_id, name_to_weapon_id, @@ -18,8 +18,17 @@ from ..utils.map.name_covert import ( from ..utils.map.SR_MAP_PATH import ( EquipmentID2Name, EquipmentID2Rarity, + Property2Name, + avatarId2Rarity, + AvatarRankSkillUp, rankId2Name, + characterSkillTree, + skillId2Effect, + skillId2Name, + skillId2AttackType, avatarId2Name, + avatarId2EnName, + avatarId2DamageType, ) WEAPON_TO_INT = { @@ -101,17 +110,18 @@ async def get_char_args( if index == 0: fake_name, talent_num = await get_fake_char_str(part) # 判断是否开启fake_char - char_data = await get_char_data(uid, fake_name) + if '遗器' in msg: + char_data = await get_char_data(uid, fake_name) + if isinstance(char_data, str): + char_data = await make_new_charinfo(uid, fake_name) + else: + char_data = await get_char_data(uid, fake_name) if isinstance(char_data, str): return char_data continue if '遗器' in part: - char_data = await get_fake_char_data( - char_data, - part.replace('遗器', '').replace(changeuid, ''), - changeuid, - ) + char_data = await get_fake_char_data(char_data, part.replace('遗器', '').replace(changeuid, ''), changeuid) if isinstance(char_data, str): return char_data else: @@ -170,7 +180,7 @@ async def get_fake_char_str(char_name: str) -> Tuple[str, Optional[int]]: async def get_fake_weapon_str(msg: str) -> Tuple[str, Optional[int]]: - weapon_affix = 0 + weapon_affix = 1 if '精' in msg and msg[1] in WEAPON_TO_INT: weapon_affix = WEAPON_TO_INT[msg[1]] weapon = msg[2:] @@ -229,7 +239,134 @@ async def get_char_data( with Path.open(path, encoding='utf8') as fp: return json.load(fp) +async def make_new_charinfo( + uid: str, + fake_name: str, +): + char_data = {} + char_data['uid'] = uid + char_data['nickName'] = 'test' + char_data['avatarId'] = int(await name_to_avatar_id(fake_name)) + char_data['avatarName'] = fake_name + char_data['avatarElement'] = avatarId2DamageType[str(char_data['avatarId'])] + char_data['avatarRarity'] = str(avatarId2Rarity[str(char_data['avatarId'])]) + char_data['avatarPromotion'] = 6 + char_data['avatarLevel'] = 80 + char_data['avatarSkill'] = await get_skill_list(char_data['avatarId']) + char_data['avatarExtraAbility'] = await get_extra_list(char_data['avatarId']) + char_data['avatarAttributeBonus'] = await get_attribute_list(char_data['avatarId']) + char_data['RelicInfo'] = [] + char_data['avatarEnName'] = avatarId2EnName[str(char_data['avatarId'])] + char_data['rank'] = 0 + char_data['rankList'] = [] + char_data['baseAttributes'] = await get_baseAttributes(char_data['avatarId']) + char_data['equipmentInfo'] = {} + return char_data +async def get_baseAttributes( + char_id: int, +): + # 处理基础属性 + base_attributes = {} + avatar_promotion_base = AvatarPromotionConfig.Avatar[ + str(char_id) + ]['6'] + + # 攻击力 + base_attributes['attack'] = ( + avatar_promotion_base.AttackBase.Value + + avatar_promotion_base.AttackAdd.Value * (80 - 1) + ) + # 防御力 + base_attributes['defence'] = ( + avatar_promotion_base.DefenceBase.Value + + avatar_promotion_base.DefenceAdd.Value * (80 - 1) + ) + # 血量 + base_attributes['hp'] = ( + avatar_promotion_base.HPBase.Value + + avatar_promotion_base.HPAdd.Value * (80 - 1) + ) + # 速度 + base_attributes['speed'] = avatar_promotion_base.SpeedBase.Value + # 暴击率 + base_attributes[ + 'CriticalChanceBase' + ] = avatar_promotion_base.CriticalChance.Value + # 暴击伤害 + base_attributes[ + 'CriticalDamageBase' + ] = avatar_promotion_base.CriticalDamage.Value + # 嘲讽 + base_attributes['BaseAggro'] = avatar_promotion_base.BaseAggro.Value + return base_attributes + +async def get_attribute_list( + char_id: int, +): + attribute_list = [] + for attributeid in [201, 202, 203, 204, 205, 206, 207, 208, 209, 210]: + attribute_bonus_temp = {} + attribute_bonus_temp['attributeBonusId'] = ( + char_id * 1000 + attributeid + ) + attribute_bonus_temp['attributeBonusLevel'] = 1 + status_add = characterSkillTree[str(char_id)][ + str(attribute_bonus_temp['attributeBonusId']) + ]['levels'][0]['properties'] + attribute_bonus_temp['statusAdd'] = {} + if status_add: + for property_ in status_add: + attribute_bonus_temp['statusAdd']['property'] = property_[ + 'type' + ] + attribute_bonus_temp['statusAdd']['name'] = Property2Name[ + property_['type'] + ] + attribute_bonus_temp['statusAdd']['value'] = property_[ + 'value' + ] + attribute_list.append(attribute_bonus_temp) + return attribute_list + +async def get_extra_list( + char_id: int, +): + extra_list = [] + for extraid in [101, 102, 103]: + extra_temp = {} + extra_temp['extraAbilityId'] = ( + char_id * 1000 + extraid + ) + extra_temp['extraAbilityLevel'] = 1 + extra_list.append(extra_temp) + return extra_list + +async def get_skill_list( + char_id: int, +): + Skilllist = [] + for skillid in [1, 2, 3, 4, 7]: + skill_temp = {} + skill_temp['skillId'] = ( + char_id * 100 + skillid + ) + skill_temp['skillName'] = skillId2Name[str(skill_temp['skillId'])] + skill_temp['skillEffect'] = skillId2Effect[ + str(skill_temp['skillId']) + ] + skill_temp['skillAttackType'] = skillId2AttackType[ + str(skill_temp['skillId']) + ] + skilllevel = 10 + if skillid == 1: + skilllevel = 6 + if skillid == 7: + skilllevel = 1 + skill_temp['skillLevel'] = skilllevel + Skilllist.append(skill_temp) + return Skilllist + async def get_rank_list( char_id: str, talent_num: int, @@ -243,14 +380,13 @@ async def get_rank_list( rank_temp.append(rankTemp) return rank_temp - async def get_char( char_data: dict, weapon: Optional[str] = None, weapon_affix: Optional[int] = None, talent_num: Optional[int] = None, ): - if talent_num: + if isinstance(talent_num, int): # 处理命座 rank_temp = [] char_data['rank'] = talent_num @@ -261,7 +397,35 @@ async def get_char( rankTemp['rankName'] = rankId2Name[str(rank_id)] rank_temp.append(rankTemp) char_data['rankList'] = rank_temp - if weapon: + + # 处理命座中的 level_up_skills + if char_data.get('rankList'): + for rank_item in char_data['rankList']: + rank_id = rank_item['rankId'] + level_up_skill = AvatarRankSkillUp[str(rank_id)] + if level_up_skill: + for item in level_up_skill: + skill_id = item['id'] + skill_up_num = item['num'] + # 查找skill_id在不在avatarSkill中 + for index, skill_item in enumerate( + char_data['avatarSkill'] + ): + if str(skill_id) == str(skill_item['skillId']): + if skill_id[-1] == 1: + skilllevel_max = 7 + else: + skilllevel_max = 12 + skilllevel = min( + skilllevel_max, + char_data['avatarSkill'][index]['skillLevel'] + skill_up_num + ) + char_data['avatarSkill'][index][ + 'skillLevel' + ] = skilllevel + break + + if isinstance(weapon, str): # 处理武器 equipmentid = await name_to_weapon_id(weapon) equipment_info = {}