diff --git a/StarRailUID/starrailuid_charinfo/damage/Avatar.py b/StarRailUID/starrailuid_charinfo/damage/Avatar.py index 0323c85..92627d5 100644 --- a/StarRailUID/starrailuid_charinfo/damage/Avatar.py +++ b/StarRailUID/starrailuid_charinfo/damage/Avatar.py @@ -1,15 +1,15 @@ import json -from pathlib import Path from typing import Dict +from pathlib import Path from gsuid_core.logger import logger -from ..mono.Character import Character -from .AvatarDamage.AvatarDamage import AvatarDamage -from .Base.AvatarBase import BaseAvatarinfo -from .Base.model import DamageInstance -from .Relic.Relic import RelicSet, SingleRelic from .Weapon.Weapon import Weapon +from ..mono.Character import Character +from .Base.model import DamageInstance +from .Base.AvatarBase import BaseAvatarinfo +from .Relic.Relic import RelicSet, SingleRelic +from .AvatarDamage.AvatarDamage import AvatarDamage Excel_path = Path(__file__).parent with Path.open(Excel_path / 'Excel' / 'SkillData.json', encoding='utf-8') as f: @@ -37,13 +37,9 @@ class AvatarInstance: def merge_attribute_bonus(self, add_attribute: Dict[str, float]): for attribute in add_attribute: if attribute in self.attribute_bonus: - self.attribute_bonus[ - attribute - ] += add_attribute[attribute] + self.attribute_bonus[attribute] += add_attribute[attribute] else: - self.attribute_bonus[ - attribute - ] = add_attribute[attribute] + self.attribute_bonus[attribute] = add_attribute[attribute] def cal_role_base_attr(self): logger.info('cal_role_base_attr') diff --git a/StarRailUID/starrailuid_charinfo/damage/AvatarDamage/AvatarDamage.py b/StarRailUID/starrailuid_charinfo/damage/AvatarDamage/AvatarDamage.py index a48e0c4..f633efb 100644 --- a/StarRailUID/starrailuid_charinfo/damage/AvatarDamage/AvatarDamage.py +++ b/StarRailUID/starrailuid_charinfo/damage/AvatarDamage/AvatarDamage.py @@ -3,9 +3,9 @@ from typing import Dict, List from gsuid_core.logger import logger -from ..Base.AvatarBase import BaseAvatar, BaseAvatarBuff -from ..Base.model import DamageInstanceAvatar, DamageInstanceSkill from ..Role import calculate_damage +from ..Base.AvatarBase import BaseAvatar, BaseAvatarBuff +from ..Base.model import DamageInstanceSkill, DamageInstanceAvatar class Seele(BaseAvatar): @@ -47,7 +47,7 @@ class Seele(BaseAvatar): attribute_bonus['AllDamageAddedRatio'] = self.Skill_num( 'Talent', 'Talent' ) + attribute_bonus.get('AllDamageAddedRatio', 0) - + damage1, damage2, damage3 = await calculate_damage( base_attr, attribute_bonus, @@ -57,7 +57,7 @@ class Seele(BaseAvatar): 0.44, self.avatar_level, ) - + skill_info_list = [] # 计算普攻伤害 skill_multiplier = self.Skill_num('Normal', 'Normal') @@ -167,7 +167,7 @@ class JingYuan(BaseAvatar): 0.44, self.avatar_level, ) - + skill_info_list = [] # 计算普攻伤害 skill_multiplier = self.Skill_num('Normal', 'Normal') @@ -268,7 +268,7 @@ class Welt(BaseAvatar): 0.44, self.avatar_level, ) - + skill_info_list = [] # 计算普攻伤害 skill_multiplier = self.Skill_num('Normal', 'Normal') @@ -354,6 +354,7 @@ class Welt(BaseAvatar): logger.info(skill_info_list) return skill_info_list + class Danhengil(BaseAvatar): Buff: BaseAvatarBuff @@ -379,7 +380,7 @@ class Danhengil(BaseAvatar): logger.info('额外能力') logger.info('对拥有虚数属性弱点的敌方目标造成伤害时, 暴击伤害提高24%。') self.extra_ability_attribute['CriticalDamageBase'] = 0.24 - + async def getdamage( self, base_attr: Dict[str, float], @@ -392,13 +393,13 @@ class Danhengil(BaseAvatar): start_buff = 6 add_buff = 2 max_buff = 10 - + injury_add = self.Skill_num('Talent', 'Talent') critical_damage_add = self.Skill_num('BPSkill', 'BPSkill') critical_buff = 0 if self.avatar_rank >= 4: critical_buff = critical_damage_add * 4 - + skill_info_list = [] # 计算普攻1伤害 skill_multiplier = self.Skill_num('Normal', 'Normal') / 2 @@ -408,13 +409,15 @@ class Danhengil(BaseAvatar): for i in range(1, 3): add_attr_bonus = copy.deepcopy(attribute_bonus) damage_buff = min(max_buff, start_buff + (i - 1) * add_buff) - add_attr_bonus['AllDamageAddedRatio'] = damage_buff * injury_add + add_attr_bonus.get( + add_attr_bonus[ + 'AllDamageAddedRatio' + ] = damage_buff * injury_add + add_attr_bonus.get( 'AllDamageAddedRatio', 0 ) if self.avatar_rank >= 4: - add_attr_bonus['CriticalDamageBase'] = critical_buff + add_attr_bonus.get( - 'CriticalDamageBase', 0 - ) + add_attr_bonus[ + 'CriticalDamageBase' + ] = critical_buff + add_attr_bonus.get('CriticalDamageBase', 0) damage1, damage2, damage3 = await calculate_damage( base_attr, add_attr_bonus, @@ -437,7 +440,9 @@ class Danhengil(BaseAvatar): self.avatar_level, ) damage_a += damage3 - skill_info_list.append({'name': '普攻', 'damagelist': [damage_c, damage_e, damage_a]}) + skill_info_list.append( + {'name': '普攻', 'damagelist': [damage_c, damage_e, damage_a]} + ) # 计算瞬华伤害 skill_multiplier = self.Skill_num('Normal', 'Normal1') / 3 @@ -447,13 +452,15 @@ class Danhengil(BaseAvatar): for i in range(1, 4): add_attr_bonus = copy.deepcopy(attribute_bonus) damage_buff = min(max_buff, start_buff + (i - 1) * add_buff) - add_attr_bonus['AllDamageAddedRatio'] = damage_buff * injury_add + add_attr_bonus.get( + add_attr_bonus[ + 'AllDamageAddedRatio' + ] = damage_buff * injury_add + add_attr_bonus.get( 'AllDamageAddedRatio', 0 ) if self.avatar_rank >= 4: - add_attr_bonus['CriticalDamageBase'] = critical_buff + add_attr_bonus.get( - 'CriticalDamageBase', 0 - ) + add_attr_bonus[ + 'CriticalDamageBase' + ] = critical_buff + add_attr_bonus.get('CriticalDamageBase', 0) damage1, damage2, damage3 = await calculate_damage( base_attr, add_attr_bonus, @@ -476,8 +483,10 @@ class Danhengil(BaseAvatar): self.avatar_level, ) damage_a += damage3 - skill_info_list.append({'name': '瞬华', 'damagelist': [damage_c, damage_e, damage_a]}) - + skill_info_list.append( + {'name': '瞬华', 'damagelist': [damage_c, damage_e, damage_a]} + ) + # 计算天矢阴伤害 skill_multiplier = self.Skill_num('Normal', 'Normal2') / 5 damage_c = 0 @@ -486,17 +495,21 @@ class Danhengil(BaseAvatar): for i in range(1, 6): add_attr_bonus = copy.deepcopy(attribute_bonus) damage_buff = min(max_buff, start_buff + (i - 1) * add_buff) - add_attr_bonus['AllDamageAddedRatio'] = damage_buff * injury_add + add_attr_bonus.get( + add_attr_bonus[ + 'AllDamageAddedRatio' + ] = damage_buff * injury_add + add_attr_bonus.get( 'AllDamageAddedRatio', 0 ) if self.avatar_rank >= 4: - add_attr_bonus['CriticalDamageBase'] = critical_buff + add_attr_bonus.get( - 'CriticalDamageBase', 0 - ) + add_attr_bonus[ + 'CriticalDamageBase' + ] = critical_buff + add_attr_bonus.get('CriticalDamageBase', 0) else: if i >= 4: critical_buff = (i - 3) * critical_damage_add - add_attr_bonus['CriticalDamageBase'] = critical_buff + add_attr_bonus.get( + add_attr_bonus[ + 'CriticalDamageBase' + ] = critical_buff + add_attr_bonus.get( 'CriticalDamageBase', 0 ) damage1, damage2, damage3 = await calculate_damage( @@ -521,7 +534,9 @@ class Danhengil(BaseAvatar): self.avatar_level, ) damage_a += damage3 - skill_info_list.append({'name': '天矢阴', 'damagelist': [damage_c, damage_e, damage_a]}) + skill_info_list.append( + {'name': '天矢阴', 'damagelist': [damage_c, damage_e, damage_a]} + ) # 计算盘拏耀跃伤害 skill_multiplier = self.Skill_num('Normal', 'Normal3') / 7 @@ -531,17 +546,21 @@ class Danhengil(BaseAvatar): for i in range(1, 8): add_attr_bonus = copy.deepcopy(attribute_bonus) damage_buff = min(max_buff, start_buff + (i - 1) * add_buff) - add_attr_bonus['AllDamageAddedRatio'] = damage_buff * injury_add + add_attr_bonus.get( + add_attr_bonus[ + 'AllDamageAddedRatio' + ] = damage_buff * injury_add + add_attr_bonus.get( 'AllDamageAddedRatio', 0 ) if self.avatar_rank >= 4: - add_attr_bonus['CriticalDamageBase'] = critical_buff + add_attr_bonus.get( - 'CriticalDamageBase', 0 - ) + add_attr_bonus[ + 'CriticalDamageBase' + ] = critical_buff + add_attr_bonus.get('CriticalDamageBase', 0) else: if i >= 4: critical_buff = (i - 3) * critical_damage_add - add_attr_bonus['CriticalDamageBase'] = critical_buff + add_attr_bonus.get( + add_attr_bonus[ + 'CriticalDamageBase' + ] = critical_buff + add_attr_bonus.get( 'CriticalDamageBase', 0 ) damage1, damage2, damage3 = await calculate_damage( @@ -566,8 +585,10 @@ class Danhengil(BaseAvatar): self.avatar_level, ) damage_a += damage3 - skill_info_list.append({'name': '盘拏耀跃', 'damagelist': [damage_c, damage_e, damage_a]}) - + skill_info_list.append( + {'name': '盘拏耀跃', 'damagelist': [damage_c, damage_e, damage_a]} + ) + # 计算大招伤害 skill_multiplier = self.Skill_num('Ultra', 'Ultra') / 3 damage_c = 0 @@ -576,13 +597,15 @@ class Danhengil(BaseAvatar): for i in range(1, 4): add_attr_bonus = copy.deepcopy(attribute_bonus) damage_buff = min(max_buff, 10) - add_attr_bonus['AllDamageAddedRatio'] = damage_buff * injury_add + add_attr_bonus.get( + add_attr_bonus[ + 'AllDamageAddedRatio' + ] = damage_buff * injury_add + add_attr_bonus.get( 'AllDamageAddedRatio', 0 ) critical_buff = 4 * critical_damage_add - add_attr_bonus['CriticalDamageBase'] = critical_buff + add_attr_bonus.get( - 'CriticalDamageBase', 0 - ) + add_attr_bonus[ + 'CriticalDamageBase' + ] = critical_buff + add_attr_bonus.get('CriticalDamageBase', 0) damage1, damage2, damage3 = await calculate_damage( base_attr, add_attr_bonus, @@ -605,10 +628,13 @@ class Danhengil(BaseAvatar): self.avatar_level, ) damage_a += damage3 - skill_info_list.append({'name': '终结技', 'damagelist': [damage_c, damage_e, damage_a]}) + skill_info_list.append( + {'name': '终结技', 'damagelist': [damage_c, damage_e, damage_a]} + ) logger.info(skill_info_list) return skill_info_list + class AvatarDamage: @classmethod def create( diff --git a/StarRailUID/starrailuid_charinfo/damage/Base/AvatarBase.py b/StarRailUID/starrailuid_charinfo/damage/Base/AvatarBase.py index dc75d3e..3e27ee6 100644 --- a/StarRailUID/starrailuid_charinfo/damage/Base/AvatarBase.py +++ b/StarRailUID/starrailuid_charinfo/damage/Base/AvatarBase.py @@ -1,14 +1,14 @@ import json -from abc import abstractmethod from pathlib import Path +from abc import abstractmethod from typing import List, Tuple, Union import msgspec from msgspec import Struct -from ....utils.excel.model import AvatarPromotionConfig -from .model import DamageInstanceAvatar, DamageInstanceSkill from .SkillBase import BaseSkills +from ....utils.excel.model import AvatarPromotionConfig +from .model import DamageInstanceSkill, DamageInstanceAvatar path = Path(__file__).parent.parent with Path.open(path / 'Excel' / 'SkillData.json', encoding='utf-8') as f: diff --git a/StarRailUID/starrailuid_charinfo/damage/Base/RelicBase.py b/StarRailUID/starrailuid_charinfo/damage/Base/RelicBase.py index bb1ed0e..846e263 100644 --- a/StarRailUID/starrailuid_charinfo/damage/Base/RelicBase.py +++ b/StarRailUID/starrailuid_charinfo/damage/Base/RelicBase.py @@ -1,11 +1,11 @@ -from abc import abstractmethod from typing import Dict +from abc import abstractmethod from gsuid_core.logger import logger -from ....utils.map.model.RelicSetSkill import RelicSetStatusAdd -from ....utils.map.SR_MAP_PATH import RelicSetSkill from .model import DamageInstanceRelic +from ....utils.map.SR_MAP_PATH import RelicSetSkill +from ....utils.map.model.RelicSetSkill import RelicSetStatusAdd class SingleRelic: @@ -70,7 +70,6 @@ class BaseRelicSetSkill: ... def set_skill_property_ability(self): - def add_relic_set_attribute(status_add: RelicSetStatusAdd): set_property = status_add.Property set_value = status_add.Value diff --git a/StarRailUID/starrailuid_charinfo/damage/Base/SkillBase.py b/StarRailUID/starrailuid_charinfo/damage/Base/SkillBase.py index 7dbdf65..abacf7a 100644 --- a/StarRailUID/starrailuid_charinfo/damage/Base/SkillBase.py +++ b/StarRailUID/starrailuid_charinfo/damage/Base/SkillBase.py @@ -1,8 +1,8 @@ import json -from pathlib import Path from typing import List +from pathlib import Path -from .model import DamageInstanceAvatar, DamageInstanceSkill +from .model import DamageInstanceSkill, DamageInstanceAvatar path = Path(__file__).parent.parent with Path.open(path / 'Excel' / 'SkillData.json', encoding='utf-8') as f: @@ -14,7 +14,7 @@ skill_types = { 'BPSkill': 'BPSkill_', 'Ultra': 'Ultra_', 'Maze': 'Maze_', - '': 'Talent_' + '': 'Talent_', } diff --git a/StarRailUID/starrailuid_charinfo/damage/Base/WeaponBase.py b/StarRailUID/starrailuid_charinfo/damage/Base/WeaponBase.py index cd12fe7..d89cf5b 100644 --- a/StarRailUID/starrailuid_charinfo/damage/Base/WeaponBase.py +++ b/StarRailUID/starrailuid_charinfo/damage/Base/WeaponBase.py @@ -3,9 +3,9 @@ from typing import Dict, List, Tuple from msgspec import Struct +from .model import DamageInstanceWeapon from ....utils.excel.model import EquipmentPromotionConfig from ....utils.map.SR_MAP_PATH import EquipmentID2AbilityProperty -from .model import DamageInstanceWeapon class BaseWeaponAttribute(Struct): diff --git a/StarRailUID/starrailuid_charinfo/damage/Role.py b/StarRailUID/starrailuid_charinfo/damage/Role.py index 8d9c448..fb6da56 100644 --- a/StarRailUID/starrailuid_charinfo/damage/Role.py +++ b/StarRailUID/starrailuid_charinfo/damage/Role.py @@ -31,30 +31,30 @@ async def calculate_damage( damage_reduction = calculate_damage_reduction(level) logger.info(f'韧性区: {damage_reduction}') - + resistance_area = calculate_resistance_area( merged_attr, skill_type, add_skill_type, element ) logger.info(f'抗性区: {resistance_area}') - + defence_multiplier = calculate_defence_multiplier(level, merged_attr) logger.info(f'防御区: {defence_multiplier}') - + injury_area, element_area = calculate_injury_area( merged_attr, skill_type, add_skill_type, element ) logger.info(f'增伤区: {injury_area}') - + damage_ratio = calculate_damage_ratio( merged_attr, skill_type, add_skill_type ) logger.info(f'易伤区: {damage_ratio}') - + critical_damage = calculate_critical_damage( merged_attr, skill_type, add_skill_type ) logger.info(f'爆伤区: {critical_damage}') - + critical_chance = calculate_critical_chance( merged_attr, skill_type, add_skill_type ) @@ -150,10 +150,13 @@ def calculate_resistance_area( if '_' in attr_name: skill_name = attr_name.split('_')[0] skillattr_name = attr_name.split('_')[1] - if skill_name == add_skill_type and skillattr_name in (element, 'AllDamage'): + if skill_name == add_skill_type and skillattr_name in ( + element, + 'AllDamage', + ): enemy_status_resistance += merged_attr[attr] # logger.info( - # f'{skill_name}对{skillattr_name}属性有{merged_attr[attr]}穿透加成' + # f'{skill_name}对{skillattr_name}属性有{merged_attr[attr]}穿透加成' # ) return 1.0 - (0 - enemy_status_resistance) @@ -183,16 +186,16 @@ def calculate_injury_area( add_skill_type, ): # logger.info( - # f'{attr} 对 {skill_type} 有 {merged_attr[attr]} 伤害加成' + # f'{attr} 对 {skill_type} 有 {merged_attr[attr]} 伤害加成' # ) injury_area += merged_attr[attr] - + if 'AddedRatio' in attr and attr_name in ( element, 'AllDamage', ): # logger.info( - # f'{attr} 对 {element} 属性有 {merged_attr[attr]} 伤害加成' + # f'{attr} 对 {element} 属性有 {merged_attr[attr]} 伤害加成' # ) if attr_name == element: element_area += merged_attr[attr] @@ -312,7 +315,7 @@ def calculate_damage_tz( base_attr: Dict[str, float], ): injury_add_tz = 0.0 - + attack_tz = attack + 355 + base_attr['attack'] * 2.334 # logger.info(f'attack_tz: {attack_tz}') if element == 'Imaginary': diff --git a/StarRailUID/starrailuid_charinfo/damage/Weapon/Weapon.py b/StarRailUID/starrailuid_charinfo/damage/Weapon/Weapon.py index 7fb50fc..4f74fe8 100644 --- a/StarRailUID/starrailuid_charinfo/damage/Weapon/Weapon.py +++ b/StarRailUID/starrailuid_charinfo/damage/Weapon/Weapon.py @@ -1,9 +1,9 @@ import json -from pathlib import Path from typing import Dict +from pathlib import Path -from ..Base.model import DamageInstanceWeapon from ..Base.WeaponBase import BaseWeapon +from ..Base.model import DamageInstanceWeapon path = Path(__file__).parent.parent with Path.open(path / 'Excel' / 'weapon_effect.json', encoding='utf-8') as f: diff --git a/StarRailUID/starrailuid_charinfo/damage/utils.py b/StarRailUID/starrailuid_charinfo/damage/utils.py index 45aea74..67f569f 100644 --- a/StarRailUID/starrailuid_charinfo/damage/utils.py +++ b/StarRailUID/starrailuid_charinfo/damage/utils.py @@ -20,9 +20,16 @@ async def merge_attribute( merged_attr[attr] += base_attr[attr] * value else: merged_attr[attribute] = attribute_bonus[attribute] - elif attribute in ['ignore_defence', 'Atk_buff', 'Normal_buff', 'shield_added_ratio']: + elif attribute in [ + 'ignore_defence', + 'Atk_buff', + 'Normal_buff', + 'shield_added_ratio', + ]: merged_attr[attribute] = base_attr.get(attribute, 0) + value - elif attribute.endswith(('ResistancePenetration', 'DmgAdd', 'DmgRatio')): + elif attribute.endswith( + ('ResistancePenetration', 'DmgAdd', 'DmgRatio') + ): merged_attr[attribute] = base_attr.get(attribute, 0) + value elif attribute.endswith('Base'): merged_attr[attribute] = base_attr.get(attribute, 0) + value