diff --git a/StarRailUID/starrailuid_charinfo/draw_char_img.py b/StarRailUID/starrailuid_charinfo/draw_char_img.py index 9fa66cb..cb94350 100644 --- a/StarRailUID/starrailuid_charinfo/draw_char_img.py +++ b/StarRailUID/starrailuid_charinfo/draw_char_img.py @@ -50,7 +50,6 @@ TEXT_PATH = Path(__file__).parent / 'texture2D' bg_img = Image.open(TEXT_PATH / "bg.png") white_color = (213, 213, 213) -yellow_color = (255, 255, 0) NUM_MAP = {0: '零', 1: '一', 2: '二', 3: '三', 4: '四', 5: '五', 6: '六', 7: '七'} RANK_MAP = { @@ -90,7 +89,7 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str): return char_data char = await cal_char_info(char_data) damage_len = 0 - if char.char_id in [1102, 1204, 1107, 1213, 1006]: + if char.char_id in [1102, 1204, 1107, 1213, 1006, 1005, 1205]: skill_list = skill_dict[str(char.char_id)]['skilllist'] damage_len = len(skill_list) # print(damage_len) @@ -585,12 +584,14 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str): ) if damage_len > 0: + damage_title_img = Image.open(TEXT_PATH / 'base_info_pure.png') + char_info.paste(damage_title_img, (0, 2028), damage_title_img) damage_list = await cal(char_data) # 写伤害 char_img_draw.text( (55, 2048), '角色动作', - yellow_color, + white_color, sr_font_26, 'lm', ) @@ -598,7 +599,7 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str): char_img_draw.text( (370, 2048), '暴击值', - yellow_color, + white_color, sr_font_26, 'lm', ) @@ -606,7 +607,7 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str): char_img_draw.text( (560, 2048), '期望值', - yellow_color, + white_color, sr_font_26, 'lm', ) @@ -614,13 +615,20 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str): char_img_draw.text( (750, 2048), '满配辅助末日兽', - yellow_color, + white_color, sr_font_26, 'lm', ) damage_num = 0 for damage_info in damage_list: damage_num = damage_num + 1 + if damage_num % 2 == 0: + damage_img = Image.open(TEXT_PATH / 'attack_1.png') + else: + damage_img = Image.open(TEXT_PATH / 'attack_2.png') + char_info.paste( + damage_img, (0, 2028 + damage_num * 48), damage_img + ) char_img_draw.text( (55, 2048 + damage_num * 48), f'{damage_info[0]}', @@ -719,7 +727,7 @@ async def cal(char_data: Dict): char = await cal_char_info(char_data) skill_info_list = [] - if char.char_id in [1102, 1204, 1107, 1213, 1006]: + if char.char_id in [1102, 1204, 1107, 1213, 1006, 1005, 1205]: if char.char_id == 1213: for skill_type in [ 'Normal', @@ -731,12 +739,22 @@ async def cal(char_data: Dict): role = RoleInstance(char) im_tmp = await role.cal_damage(skill_type) skill_info_list.append(im_tmp) + elif char.char_id == 1005: + for skill_type in ['Normal', 'BPSkill', 'Ultra', 'DOT']: + role = RoleInstance(char) + im_tmp = await role.cal_damage(skill_type) + skill_info_list.append(im_tmp) + if char.char_id == 1205: + for skill_type in ['Normal', 'Normal1', 'Ultra']: + role = RoleInstance(char) + im_tmp = await role.cal_damage(skill_type) + skill_info_list.append(im_tmp) else: for skill_type in ['Normal', 'BPSkill', 'Ultra']: role = RoleInstance(char) im_tmp = await role.cal_damage(skill_type) skill_info_list.append(im_tmp) - if char.char_id in [1204, 1107]: + if char.char_id in [1204, 1107, 1005, 1205]: role = RoleInstance(char) im_tmp = await role.cal_damage('Talent') skill_info_list.append(im_tmp) diff --git a/StarRailUID/starrailuid_charinfo/effect/Avatar/Avatar.py b/StarRailUID/starrailuid_charinfo/effect/Avatar/Avatar.py index d8a88bf..edc488b 100644 --- a/StarRailUID/starrailuid_charinfo/effect/Avatar/Avatar.py +++ b/StarRailUID/starrailuid_charinfo/effect/Avatar/Avatar.py @@ -28,7 +28,7 @@ class Seele(BaseAvatar): if self.avatar_rank < 2: self.eidolon_attribute['SpeedAddedRatio'] = mp.mpf(0.25) if self.avatar_rank >= 1: - self.eidolon_attribute['CriticalDamageBase'] = mp.mpf(0.15) + self.eidolon_attribute['CriticalChanceBase'] = mp.mpf(0.15) if self.avatar_rank >= 2: self.eidolon_attribute['SpeedAddedRatio'] = mp.mpf(0.5) @@ -150,23 +150,80 @@ class Silverwolf(BaseAvatar): logger.info('额外能力') logger.info('战技降抗') logger.info('战技使目标全属性抗性降低的效果额外降低3%') - enemy_status_resistance = self.BPSkill_d() + 0.03 + enemy_status_resistance = self.BPSkill_num('BPSkill_D') + 0.03 self.extra_ability_attribute['QuantumResistancePenetration'] = mp.mpf( enemy_status_resistance ) logger.info('终结技降防') - ultra_defence = self.Ultra_d() + ultra_defence = self.Ultra_num('Ultra_D') logger.info('天赋降防') talent_defence = self.Talent() ignore_defence = ultra_defence + talent_defence self.extra_ability_attribute['ignore_defence'] = mp.mpf(ignore_defence) +class Kafka(BaseAvatar): + Buff: BaseAvatarBuff + + def __init__( + self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] + ): + super().__init__(char=char, skills=skills) + self.eidolon_attribute = {} + self.extra_ability_attribute = {} + self.eidolons() + self.extra_ability() + + def Technique(self): + pass + + def eidolons(self): + if self.avatar_rank >= 1: + self.extra_ability_attribute['DOTDmgAdd'] = mp.mpf(0.3) + if self.avatar_rank >= 2: + self.extra_ability_attribute['DOTDmgAdd'] = mp.mpf(0.55) + + def extra_ability(self): + pass + + +class Blade(BaseAvatar): + Buff: BaseAvatarBuff + + def __init__( + self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] + ): + super().__init__(char=char, skills=skills) + self.eidolon_attribute = {} + self.extra_ability_attribute = {} + self.eidolons() + self.extra_ability() + + def Technique(self): + pass + + def eidolons(self): + if self.avatar_rank >= 2: + self.eidolon_attribute['CriticalChanceBase'] = mp.mpf(0.15) + + if self.avatar_rank >= 4: + self.extra_ability_attribute['HPAddedRatio'] = mp.mpf(0.4) + + def extra_ability(self): + logger.info('额外能力') + logger.info('天赋施放的追加攻击伤害提高20%') + self.extra_ability_attribute['TalentDmgAdd'] = mp.mpf(0.2) + + class Avatar: @classmethod def create( cls, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): + if char.id_ == 1205: + return Blade(char, skills) + if char.id_ == 1005: + return Kafka(char, skills) if char.id_ == 1006: return Silverwolf(char, skills) if char.id_ == 1213: diff --git a/StarRailUID/starrailuid_charinfo/effect/Base/AvatarBase.py b/StarRailUID/starrailuid_charinfo/effect/Base/AvatarBase.py index 445fa6b..3db6548 100644 --- a/StarRailUID/starrailuid_charinfo/effect/Base/AvatarBase.py +++ b/StarRailUID/starrailuid_charinfo/effect/Base/AvatarBase.py @@ -134,20 +134,27 @@ class BaseAvatar: ] ) - def BPSkill_d(self): + def BPSkill_num(self, skill_type): return mp.mpf( - skill_dict[str(self.avatar_id)]['BPSkill_D'][ + skill_dict[str(self.avatar_id)][skill_type][ self.Skill.BPSkill_.level - 1 ] ) - def Ultra_d(self): + def Ultra_num(self, skill_type): return mp.mpf( - skill_dict[str(self.avatar_id)]['Ultra_D'][ + skill_dict[str(self.avatar_id)][skill_type][ self.Skill.Ultra_.level - 1 ] ) + def Talent_num(self, skill_type): + return mp.mpf( + skill_dict[str(self.avatar_id)][skill_type][ + self.Skill.Talent_.level - 1 + ] + ) + def Talent_add(self): if self.avatar_id in [1102]: return mp.mpf( @@ -155,6 +162,12 @@ class BaseAvatar: self.Skill.Talent_.level - 1 ] ) + elif self.avatar_id in [1205]: + return mp.mpf( + skill_dict[str(self.avatar_id)]['BPSkill'][ + self.Skill.BPSkill_.level - 1 + ] + ) else: return mp.mpf(0) diff --git a/StarRailUID/starrailuid_charinfo/effect/Base/model.py b/StarRailUID/starrailuid_charinfo/effect/Base/model.py index 742da2c..42a7cac 100644 --- a/StarRailUID/starrailuid_charinfo/effect/Base/model.py +++ b/StarRailUID/starrailuid_charinfo/effect/Base/model.py @@ -81,8 +81,13 @@ class DamageInstance: rank=char.char_rank, element=char.char_element, promotion=char.char_promotion, - attribute_bonus=msgspec.from_builtins(char.attribute_bonus, Union[List[DamageInstanceAvatarAttributeBouns], None]), - extra_ability=msgspec.from_builtins(char.extra_ability, Union[List, None]), + attribute_bonus=msgspec.from_builtins( + char.attribute_bonus, + Union[List[DamageInstanceAvatarAttributeBouns], None], + ), + extra_ability=msgspec.from_builtins( + char.extra_ability, Union[List, None] + ), ) self.weapon = DamageInstanceWeapon( id_=char.equipment['equipmentID'], diff --git a/StarRailUID/starrailuid_charinfo/effect/Excel/seele.json b/StarRailUID/starrailuid_charinfo/effect/Excel/seele.json index e0f22f0..2296ace 100644 --- a/StarRailUID/starrailuid_charinfo/effect/Excel/seele.json +++ b/StarRailUID/starrailuid_charinfo/effect/Excel/seele.json @@ -444,5 +444,230 @@ "BPSkill": ["attack","战技", 1], "Ultra": ["attack","终结技", 1] } + }, + "1005": { + "Normal": [ + 0.5000000004656613, + 0.6000000005587935, + 0.7000000006519258, + 0.8000000007450581, + 0.9000000008381903, + 1.0000000000931323, + 1.1000000001862645, + 1.2000000002793968 + ], + "BPSkill": [ + 0.8000000004656613, + 0.8800000004656613, + 0.9600000005587935, + 1.0400000005587935, + 1.1200000006519258, + 1.2000000006519258, + 1.3000000007450581, + 1.4000000007450581, + 1.5000000008381903, + 1.6000000008381903, + 1.6800000000931323, + 1.7600000000931323, + 1.8400000001862645, + 1.9200000001862645, + 2.0000000002793968 + ], + "Ultra": [ + 0.4800000003725290, + 0.5120000003725290, + 0.5440000003725290, + 0.5760000003725290, + 0.6080000003725290, + 0.6400000003725290, + 0.6800000003725290, + 0.7200000003725290, + 0.7600000003725290, + 0.8000000003725290, + 0.8320000003725290, + 0.8640000003725290, + 0.8960000003725290, + 0.9280000003725290, + 0.9600000003725290 + ], + "DOT": [ + 1.1600000004656613, + 1.2688000004656613, + 1.3775000005587935, + 1.4863000005587935, + 1.5950000006519258, + 1.7581000006519258, + 1.9756000007450581, + 2.2475000007450581, + 2.5738000008381903, + 2.9000000008381903, + 3.0414000000931323, + 3.1828000000931323, + 3.3241000001862645, + 3.4655000001862645, + 3.6069000002793968 + ], + "Talent": [ + 0.4200000003725290, + 0.5180000003725290, + 0.6160000003725290, + 0.7140000003725290, + 0.8120000003725290, + 0.9100000003725290, + 1.0325000003725290, + 1.1550000003725290, + 1.2775000003725290, + 1.4000000003725290, + 1.4980000003725290, + 1.5960000003725290, + 1.6940000003725290, + 1.7920000003725290, + 1.8900000003725290 + ], + "Maze": [ + 20 + ], + "Ultra_Use": [ + 110 + ], + "skilllist": { + "Normal": ["attack","普攻", 1], + "BPSkill": ["attack","战技", 1], + "Ultra": ["attack","终结技", 1], + "DOT": ["attack","单次持续伤害", 1], + "Talent": ["attack","追加攻击", 1] + } + }, + "1205": { + "Normal": [ + 0.5000000004656613, + 0.6000000005587935, + 0.7000000006519258, + 0.8000000007450581, + 0.9000000008381903, + 1.0000000000931323, + 1.1000000001862645, + 1.2000000002793968, + 1.3000000002793968 + ], + "Normal1": [ + 0.2000000004656613, + 0.2400000005587935, + 0.2800000006519258, + 0.3200000007450581, + 0.3600000008381903, + 0.4000000000931323, + 0.4400000001862645, + 0.4800000002793968, + 0.5200000002793968 + ], + "Normal1_HP": [ + 0.5000000004656613, + 0.6000000005587935, + 0.7000000006519258, + 0.8000000007450581, + 0.9000000008381903, + 1.0000000000931323, + 1.1000000001862645, + 1.2000000002793968, + 1.3000000002793968 + ], + "BPSkill": [ + 0.1200000004656613, + 0.1480000004656613, + 0.1760000005587935, + 0.2040000003725290, + 0.2320000003725290, + 0.2600000003725290, + 0.2950000003725290, + 0.3300000003725290, + 0.3650000003725290, + 0.4000000003725290, + 0.4280000003725290, + 0.4560000003725290, + 0.4840000003725290, + 0.5120000003725290, + 0.5400000003725290 + ], + "Ultra": [ + 0.2400000003725290, + 0.2560000003725290, + 0.2720000003725290, + 0.2880000003725290, + 0.3040000003725290, + 0.3200000003725290, + 0.3400000003725290, + 0.3600000003725290, + 0.3800000003725290, + 0.4000000003725290, + 0.4160000003725290, + 0.4320000003725290, + 0.4480000003725290, + 0.4640000003725290, + 0.4800000003725290 + ], + "Ultra_HP": [ + 1.5000000003725290, + 1.5400000003725290, + 1.5800000003725290, + 1.6200000003725290, + 1.6600000003725290, + 1.7000000003725290, + 1.7500000003725290, + 1.8000000003725290, + 1.8500000003725290, + 1.9000000003725290, + 1.9400000003725290, + 1.9800000003725290, + 2.0200000003725290, + 2.0600000003725290, + 2.1000000003725290 + ], + "Talent": [ + 0.2200000003725290, + 0.2420000003725290, + 0.2640000003725290, + 0.2860000003725290, + 0.3080000003725290, + 0.3300000003725290, + 0.3575000003725290, + 0.3850000003725290, + 0.4125000003725290, + 0.4400000003725290, + 0.4620000003725290, + 0.4840000003725290, + 0.5060000003725290, + 0.5280000003725290, + 0.5500000003725290 + ], + "Talent_HP": [ + 0.5500000003725290, + 0.6050000003725290, + 0.6600000003725290, + 0.7150000003725290, + 0.7700000003725290, + 0.8250000003725290, + 0.8938000003725290, + 0.9625000003725290, + 1.0313000003725290, + 1.1000000003725290, + 1.1550000003725290, + 1.2100000003725290, + 1.2650000003725290, + 1.3200000003725290, + 1.3750000003725290 + ], + "Maze": [ + 20 + ], + "Ultra_Use": [ + 110 + ], + "skilllist": { + "Normal": ["attack","普攻", 1], + "Normal1": ["attack","无间剑树", 1], + "Ultra": ["attack","终结技", 1], + "Talent": ["attack","追加攻击", 1] + } } } diff --git a/StarRailUID/starrailuid_charinfo/effect/Role.py b/StarRailUID/starrailuid_charinfo/effect/Role.py index 278e13b..f3082c1 100644 --- a/StarRailUID/starrailuid_charinfo/effect/Role.py +++ b/StarRailUID/starrailuid_charinfo/effect/Role.py @@ -128,7 +128,7 @@ class RoleInstance: logger.info(self.base_attr) logger.info('attribute_bonus') logger.info(self.attribute_bonus) - + logger.info(skill_type) # 技能区 skill_info = self.avatar.Skill_Info(skill_type) if skill_type == 'Normal': @@ -151,6 +151,12 @@ class RoleInstance: if self.raw_data.avatar.id_ == 1213: skill_multiplier = self.avatar.Normalnum(skill_type) skill_type = 'Normal' + elif self.raw_data.avatar.id_ == 1005: + skill_multiplier = self.avatar.Ultra_num(skill_type) + if self.raw_data.avatar.rank >= 6: + skill_multiplier = skill_multiplier + 1.56 + elif self.raw_data.avatar.id_ == 1205: + skill_multiplier = self.avatar.Normalnum(skill_type) else: raise Exception('skill type error') @@ -202,13 +208,34 @@ class RoleInstance: merged_attr = await merge_attribute( self.base_attr, self.attribute_bonus ) - + logger.info(f'{merged_attr}') # 技能类型为攻击 if skill_info[0] == 'attack': skill_multiplier = skill_multiplier / skill_info[2] logger.info(f'技能区单段: {skill_multiplier}') attack = merged_attr['attack'] logger.info(f'攻击力: {attack}') + damage_add = 0 + if self.raw_data.avatar.id_ == 1205: + hp_num = merged_attr['hp'] + if skill_type == 'Normal1': + hp_multiplier = self.avatar.Normalnum('Normal1_HP') + skill_type = 'Normal' + elif skill_type == 'Ultra': + hp_multiplier = self.avatar.Ultra_num('Ultra_HP') + if self.raw_data.avatar.rank >= 1: + hp_multiplier += 0.9 + elif skill_type == 'Talent': + hp_multiplier = self.avatar.Talent_num('Talent_HP') + if self.raw_data.avatar.rank >= 6: + damage_add = hp_num * 0.5 + else: + hp_multiplier = 0 + attack = (skill_multiplier * attack) + (hp_multiplier * hp_num) + skill_multiplier = 1 + logger.info(f'混伤区: {attack}') + + logger.info(f'额外伤害: {damage_add}') # 模拟 同属性弱点 同等级 的怪物 # 韧性条减伤 enemy_damage_reduction = 0.1 @@ -283,7 +310,6 @@ class RoleInstance: # 易伤区 logger.info('检查是否有易伤加成') - logger.info(f'{merged_attr}') damage_ratio = merged_attr.get('DmgRatio', 0) # 检查是否有对特定技能的易伤加成 # Talent_DmgRatio @@ -299,19 +325,22 @@ class RoleInstance: logger.info(f'易伤: {damage_ratio}') # 爆伤区 - logger.info('检查是否有爆伤加成') - logger.info(f'{merged_attr}') - critical_damage_base = merged_attr['CriticalDamageBase'] - # 检查是否有对特定技能的爆伤加成 - # Ultra_CriticalChance - for attr in merged_attr: - if attr.__contains__('_CriticalChance'): - skill_name = attr.split('_')[0] - if skill_name == skill_type: - logger.info( - f'{attr} 对 {skill_type} 有 {merged_attr[attr]} 爆伤加成' - ) - critical_damage_base += merged_attr[attr] + if skill_type == 'DOT': + critical_damage_base = 0 + else: + logger.info('检查是否有爆伤加成') + logger.info(f'{merged_attr}') + critical_damage_base = merged_attr['CriticalDamageBase'] + # 检查是否有对特定技能的爆伤加成 + # Ultra_CriticalChance + for attr in merged_attr: + if attr.__contains__('_CriticalChance'): + skill_name = attr.split('_')[0] + if skill_name == skill_type: + logger.info( + f'{attr} 对 {skill_type} 有 {merged_attr[attr]} 爆伤加成' + ) + critical_damage_base += merged_attr[attr] critical_damage = critical_damage_base + 1 logger.info(f'暴伤: {critical_damage}') @@ -357,6 +386,7 @@ class RoleInstance: * resistance_area * damage_reduction * (critical_damage + critical_damage_add) + + damage_add ) damage_cd_z += damage_cd damage_qw = ( @@ -368,6 +398,7 @@ class RoleInstance: * resistance_area * damage_reduction * qiwang_damage + + damage_add ) damage_qw_z += damage_qw @@ -378,6 +409,10 @@ class RoleInstance: * (1 + self.attribute_bonus['AttackAddedRatio'] + 2.144) + self.attribute_bonus['AttackDelta'] ) + if self.raw_data.avatar.id_ == 1205: + attack_tz = (skill_multiplier * attack_tz) + ( + hp_multiplier * hp_num + ) injury_add_tz = 0 if self.avatar.avatar_element == 'Imaginary': injury_add_tz = 0.12 @@ -391,6 +426,7 @@ class RoleInstance: * damage_reduction * (critical_damage + critical_damage_add + 1.594) * 10 + + damage_add ) damage_tz_z += damage_tz diff --git a/StarRailUID/starrailuid_charinfo/texture2D/attack_1.png b/StarRailUID/starrailuid_charinfo/texture2D/attack_1.png new file mode 100644 index 0000000..0b473ec Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/attack_1.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/attack_2.png b/StarRailUID/starrailuid_charinfo/texture2D/attack_2.png new file mode 100644 index 0000000..88a21b2 Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/attack_2.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/base_info_pure.png b/StarRailUID/starrailuid_charinfo/texture2D/base_info_pure.png new file mode 100644 index 0000000..e81adb0 Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/base_info_pure.png differ