继续重构!

This commit is contained in:
a376148946 2023-10-06 00:10:43 +08:00 committed by qwerdvd
parent 1823adf500
commit 087f11acef
4 changed files with 363 additions and 49 deletions

View File

@ -94,10 +94,10 @@ class AvatarInstance:
self.merge_attribute_bonus(self.weapon.weapon_attribute) self.merge_attribute_bonus(self.weapon.weapon_attribute)
async def gat_damage(self): async def gat_damage(self):
logger.info('base_attr') # logger.info('base_attr')
logger.info(self.base_attr) # logger.info(self.base_attr)
logger.info('attribute_bonus') # logger.info('attribute_bonus')
logger.info(self.attribute_bonus) # logger.info(self.attribute_bonus)
logger.info('检查武器战斗生效的buff') logger.info('检查武器战斗生效的buff')
Ultra_Use = self.avatar.Ultra_Use() Ultra_Use = self.avatar.Ultra_Use()

View File

@ -48,6 +48,16 @@ class Seele(BaseAvatar):
'Talent', 'Talent' 'Talent', 'Talent'
) + attribute_bonus.get('AllDamageAddedRatio', 0) ) + attribute_bonus.get('AllDamageAddedRatio', 0)
damage1, damage2, damage3 = await calculate_damage(
base_attr,
attribute_bonus,
'fujia',
'fujia',
'Thunder',
0.44,
self.avatar_level,
)
skill_info_list = [] skill_info_list = []
# 计算普攻伤害 # 计算普攻伤害
skill_multiplier = self.Skill_num('Normal', 'Normal') skill_multiplier = self.Skill_num('Normal', 'Normal')
@ -60,6 +70,7 @@ class Seele(BaseAvatar):
skill_multiplier, skill_multiplier,
self.avatar_level, self.avatar_level,
) )
damagelist1[2] += damage3
skill_info_list.append({'name': '普攻', 'damagelist': damagelist1}) skill_info_list.append({'name': '普攻', 'damagelist': damagelist1})
# 计算战技伤害 # 计算战技伤害
@ -73,6 +84,7 @@ class Seele(BaseAvatar):
skill_multiplier, skill_multiplier,
self.avatar_level, self.avatar_level,
) )
damagelist2[2] += damage3
skill_info_list.append({'name': '战技', 'damagelist': damagelist2}) skill_info_list.append({'name': '战技', 'damagelist': damagelist2})
# 计算大招伤害 # 计算大招伤害
@ -86,6 +98,7 @@ class Seele(BaseAvatar):
skill_multiplier, skill_multiplier,
self.avatar_level, self.avatar_level,
) )
damagelist3[2] += damage3
skill_info_list.append({'name': '终结技', 'damagelist': damagelist3}) skill_info_list.append({'name': '终结技', 'damagelist': damagelist3})
# 银狼降防终结技伤害 # 银狼降防终结技伤害
@ -103,6 +116,7 @@ class Seele(BaseAvatar):
skill_multiplier, skill_multiplier,
self.avatar_level, self.avatar_level,
) )
damagelist4[2] += damage3
skill_info_list.append({'name': '银狼降防终结技', 'damagelist': damagelist4}) skill_info_list.append({'name': '银狼降防终结技', 'damagelist': damagelist4})
logger.info(skill_info_list) logger.info(skill_info_list)
@ -144,6 +158,16 @@ class JingYuan(BaseAvatar):
base_attr: Dict[str, float], base_attr: Dict[str, float],
attribute_bonus: Dict[str, float], attribute_bonus: Dict[str, float],
): ):
damage1, damage2, damage3 = await calculate_damage(
base_attr,
attribute_bonus,
'fujia',
'fujia',
'Thunder',
0.44,
self.avatar_level,
)
skill_info_list = [] skill_info_list = []
# 计算普攻伤害 # 计算普攻伤害
skill_multiplier = self.Skill_num('Normal', 'Normal') skill_multiplier = self.Skill_num('Normal', 'Normal')
@ -156,6 +180,7 @@ class JingYuan(BaseAvatar):
skill_multiplier, skill_multiplier,
self.avatar_level, self.avatar_level,
) )
damagelist1[2] += damage3
skill_info_list.append({'name': '普攻', 'damagelist': damagelist1}) skill_info_list.append({'name': '普攻', 'damagelist': damagelist1})
# 计算战技伤害 # 计算战技伤害
@ -169,6 +194,7 @@ class JingYuan(BaseAvatar):
skill_multiplier, skill_multiplier,
self.avatar_level, self.avatar_level,
) )
damagelist2[2] += damage3
skill_info_list.append({'name': '战技', 'damagelist': damagelist2}) skill_info_list.append({'name': '战技', 'damagelist': damagelist2})
# 计算大招伤害 # 计算大招伤害
@ -182,6 +208,7 @@ class JingYuan(BaseAvatar):
skill_multiplier, skill_multiplier,
self.avatar_level, self.avatar_level,
) )
damagelist3[2] += damage3
skill_info_list.append({'name': '终结技', 'damagelist': damagelist3}) skill_info_list.append({'name': '终结技', 'damagelist': damagelist3})
# 神君 # 神君
@ -195,6 +222,7 @@ class JingYuan(BaseAvatar):
skill_multiplier, skill_multiplier,
self.avatar_level, self.avatar_level,
) )
damagelist4[2] += damage3
skill_info_list.append({'name': '10层神君伤害', 'damagelist': damagelist4}) skill_info_list.append({'name': '10层神君伤害', 'damagelist': damagelist4})
logger.info(skill_info_list) logger.info(skill_info_list)
@ -231,6 +259,16 @@ class Welt(BaseAvatar):
base_attr: Dict[str, float], base_attr: Dict[str, float],
attribute_bonus: Dict[str, float], attribute_bonus: Dict[str, float],
): ):
damage1, damage2, damage3 = await calculate_damage(
base_attr,
attribute_bonus,
'fujia',
'fujia',
'Thunder',
0.44,
self.avatar_level,
)
skill_info_list = [] skill_info_list = []
# 计算普攻伤害 # 计算普攻伤害
skill_multiplier = self.Skill_num('Normal', 'Normal') skill_multiplier = self.Skill_num('Normal', 'Normal')
@ -243,6 +281,7 @@ class Welt(BaseAvatar):
skill_multiplier, skill_multiplier,
self.avatar_level, self.avatar_level,
) )
damagelist1[2] += damage3
skill_info_list.append({'name': '普攻', 'damagelist': damagelist1}) skill_info_list.append({'name': '普攻', 'damagelist': damagelist1})
# 计算战技伤害 # 计算战技伤害
@ -262,6 +301,7 @@ class Welt(BaseAvatar):
damagelist2[0] = damagelist2[0] * attnum damagelist2[0] = damagelist2[0] * attnum
damagelist2[1] = damagelist2[1] * attnum damagelist2[1] = damagelist2[1] * attnum
damagelist2[2] = damagelist2[2] * attnum damagelist2[2] = damagelist2[2] * attnum
damagelist2[2] += damage3
skill_info_list.append({'name': '战技', 'damagelist': damagelist2}) skill_info_list.append({'name': '战技', 'damagelist': damagelist2})
# 计算大招伤害 # 计算大招伤害
@ -275,6 +315,7 @@ class Welt(BaseAvatar):
skill_multiplier, skill_multiplier,
self.avatar_level, self.avatar_level,
) )
damagelist3[2] += damage3
skill_info_list.append({'name': '终结技', 'damagelist': damagelist3}) skill_info_list.append({'name': '终结技', 'damagelist': damagelist3})
if self.avatar_rank >= 1: if self.avatar_rank >= 1:
@ -291,6 +332,7 @@ class Welt(BaseAvatar):
damagelist4[0] = damagelist1[0] + damagelist4[0] damagelist4[0] = damagelist1[0] + damagelist4[0]
damagelist4[1] = damagelist1[1] + damagelist4[1] damagelist4[1] = damagelist1[1] + damagelist4[1]
damagelist4[2] = damagelist1[2] + damagelist4[2] damagelist4[2] = damagelist1[2] + damagelist4[2]
damagelist4[2] += damage3
skill_info_list.append({'name': '强化普攻', 'damagelist': damagelist4}) skill_info_list.append({'name': '强化普攻', 'damagelist': damagelist4})
skill_multiplier = (self.Skill_num('BPSkill', 'BPSkill') / 3) * 0.8 skill_multiplier = (self.Skill_num('BPSkill', 'BPSkill') / 3) * 0.8
@ -306,11 +348,266 @@ class Welt(BaseAvatar):
damagelist5[0] = damagelist2[0] + damagelist5[0] damagelist5[0] = damagelist2[0] + damagelist5[0]
damagelist5[1] = damagelist2[1] + damagelist5[1] damagelist5[1] = damagelist2[1] + damagelist5[1]
damagelist5[2] = damagelist2[2] + damagelist5[2] damagelist5[2] = damagelist2[2] + damagelist5[2]
damagelist5[2] += damage3
skill_info_list.append({'name': '强化战技', 'damagelist': damagelist5}) skill_info_list.append({'name': '强化战技', 'damagelist': damagelist5})
logger.info(skill_info_list) logger.info(skill_info_list)
return skill_info_list return skill_info_list
class Danhengil(BaseAvatar):
Buff: BaseAvatarBuff
def __init__(
self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill]
):
super().__init__(char=char, skills=skills)
self.eidolon_attribute: Dict[str, float] = {}
self.extra_ability_attribute: Dict[str, float] = {}
self.eidolons()
self.extra_ability()
def Technique(self):
pass
def eidolons(self):
if self.avatar_rank >= 6:
self.extra_ability_attribute[
'Normal3_ImaginaryResistancePenetration'
] = 0.6
def extra_ability(self):
logger.info('额外能力')
logger.info('对拥有虚数属性弱点的敌方目标造成伤害时, 暴击伤害提高24%')
self.extra_ability_attribute['CriticalDamageBase'] = 0.24
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
start_buff = 3
add_buff = 1
max_buff = 6
if self.avatar_rank >= 1:
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
damage_c = 0
damage_e = 0
damage_a = 0
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(
'AllDamageAddedRatio', 0
)
if self.avatar_rank >= 4:
add_attr_bonus['CriticalDamageBase'] = critical_buff + add_attr_bonus.get(
'CriticalDamageBase', 0
)
damage1, damage2, damage3 = await calculate_damage(
base_attr,
add_attr_bonus,
'Normal',
'Normal',
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damage_c += damage1
damage_e += damage2
damage_a += damage3
damage1, damage2, damage3 = await calculate_damage(
base_attr,
add_attr_bonus,
'Normal',
'Normal',
'Thunder',
0.44,
self.avatar_level,
)
damage_a += damage3
skill_info_list.append({'name': '普攻', 'damagelist': [damage_c, damage_e, damage_a]})
# 计算瞬华伤害
skill_multiplier = self.Skill_num('Normal', 'Normal1') / 3
damage_c = 0
damage_e = 0
damage_a = 0
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(
'AllDamageAddedRatio', 0
)
if self.avatar_rank >= 4:
add_attr_bonus['CriticalDamageBase'] = critical_buff + add_attr_bonus.get(
'CriticalDamageBase', 0
)
damage1, damage2, damage3 = await calculate_damage(
base_attr,
add_attr_bonus,
'Normal',
'Normal1',
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damage_c += damage1
damage_e += damage2
damage_a += damage3
damage1, damage2, damage3 = await calculate_damage(
base_attr,
add_attr_bonus,
'Normal',
'Normal',
'Thunder',
0.44,
self.avatar_level,
)
damage_a += damage3
skill_info_list.append({'name': '瞬华', 'damagelist': [damage_c, damage_e, damage_a]})
# 计算天矢阴伤害
skill_multiplier = self.Skill_num('Normal', 'Normal2') / 5
damage_c = 0
damage_e = 0
damage_a = 0
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(
'AllDamageAddedRatio', 0
)
if self.avatar_rank >= 4:
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(
'CriticalDamageBase', 0
)
damage1, damage2, damage3 = await calculate_damage(
base_attr,
add_attr_bonus,
'Normal',
'Normal2',
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damage_c += damage1
damage_e += damage2
damage_a += damage3
damage1, damage2, damage3 = await calculate_damage(
base_attr,
add_attr_bonus,
'Normal',
'Normal',
'Thunder',
0.44,
self.avatar_level,
)
damage_a += damage3
skill_info_list.append({'name': '天矢阴', 'damagelist': [damage_c, damage_e, damage_a]})
# 计算盘拏耀跃伤害
skill_multiplier = self.Skill_num('Normal', 'Normal3') / 7
damage_c = 0
damage_e = 0
damage_a = 0
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(
'AllDamageAddedRatio', 0
)
if self.avatar_rank >= 4:
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(
'CriticalDamageBase', 0
)
damage1, damage2, damage3 = await calculate_damage(
base_attr,
add_attr_bonus,
'Normal',
'Normal3',
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damage_c += damage1
damage_e += damage2
damage_a += damage3
damage1, damage2, damage3 = await calculate_damage(
base_attr,
add_attr_bonus,
'Normal',
'Normal',
'Thunder',
0.44,
self.avatar_level,
)
damage_a += damage3
skill_info_list.append({'name': '盘拏耀跃', 'damagelist': [damage_c, damage_e, damage_a]})
# 计算大招伤害
skill_multiplier = self.Skill_num('Ultra', 'Ultra') / 3
damage_c = 0
damage_e = 0
damage_a = 0
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(
'AllDamageAddedRatio', 0
)
critical_buff = 4 * critical_damage_add
add_attr_bonus['CriticalDamageBase'] = critical_buff + add_attr_bonus.get(
'CriticalDamageBase', 0
)
damage1, damage2, damage3 = await calculate_damage(
base_attr,
add_attr_bonus,
'Ultra',
'Ultra',
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damage_c += damage1
damage_e += damage2
damage_a += damage3
damage1, damage2, damage3 = await calculate_damage(
base_attr,
add_attr_bonus,
'Normal',
'Normal',
'Thunder',
0.44,
self.avatar_level,
)
damage_a += damage3
skill_info_list.append({'name': '终结技', 'damagelist': [damage_c, damage_e, damage_a]})
logger.info(skill_info_list)
return skill_info_list
class AvatarDamage: class AvatarDamage:
@classmethod @classmethod
@ -323,4 +620,6 @@ class AvatarDamage:
return JingYuan(char, skills) return JingYuan(char, skills)
if char.id_ == 1004: if char.id_ == 1004:
return Welt(char, skills) return Welt(char, skills)
if char.id_ == 1213:
return Danhengil(char, skills)
raise Exception('不支持的角色') raise Exception('不支持的角色')

View File

@ -17,37 +17,53 @@ async def calculate_damage(
logger.info(f'Skill Multiplier: {skill_multiplier}') logger.info(f'Skill Multiplier: {skill_multiplier}')
logger.info(f'Skill Type: {skill_type}') logger.info(f'Skill Type: {skill_type}')
logger.info(f'Level: {level}') logger.info(f'Level: {level}')
# logger.info(f'attribute_bonus: {attribute_bonus}')
attribute_bonus = apply_attribute_bonus( attribute_bonus = apply_attribute_bonus(
attribute_bonus, skill_type, add_skill_type attribute_bonus, skill_type, add_skill_type
) )
merged_attr = await merge_attribute(base_attr, attribute_bonus) merged_attr = await merge_attribute(base_attr, attribute_bonus)
# logger.info(f'merged_attr: {merged_attr}')
attack = merged_attr.get('attack', 0) attack = merged_attr.get('attack', 0)
logger.info(f'Attack: {attack}') logger.info(f'Attack: {attack}')
damage_reduction = calculate_damage_reduction(level) damage_reduction = calculate_damage_reduction(level)
logger.info(f'韧性区: {damage_reduction}')
resistance_area = calculate_resistance_area( resistance_area = calculate_resistance_area(
merged_attr, skill_type, add_skill_type, element merged_attr, skill_type, add_skill_type, element
) )
logger.info(f'抗性区: {resistance_area}')
defence_multiplier = calculate_defence_multiplier(level, merged_attr) defence_multiplier = calculate_defence_multiplier(level, merged_attr)
logger.info(f'防御区: {defence_multiplier}')
injury_area, element_area = calculate_injury_area( injury_area, element_area = calculate_injury_area(
merged_attr, skill_type, add_skill_type, element merged_attr, skill_type, add_skill_type, element
) )
logger.info(f'增伤区: {injury_area}')
damage_ratio = calculate_damage_ratio( damage_ratio = calculate_damage_ratio(
merged_attr, skill_type, add_skill_type merged_attr, skill_type, add_skill_type
) )
logger.info(f'易伤区: {damage_ratio}')
critical_damage = calculate_critical_damage( critical_damage = calculate_critical_damage(
merged_attr, skill_type, add_skill_type merged_attr, skill_type, add_skill_type
) )
logger.info(f'爆伤区: {critical_damage}')
critical_chance = calculate_critical_chance( critical_chance = calculate_critical_chance(
merged_attr, skill_type, add_skill_type merged_attr, skill_type, add_skill_type
) )
logger.info(f'暴击区: {critical_chance}')
expected_damage = calculate_expected_damage( expected_damage = calculate_expected_damage(
critical_chance, critical_damage critical_chance, critical_damage
) )
logger.info(f'暴击期望: {expected_damage}')
damage_cd = calculate_damage_cd( damage_cd = calculate_damage_cd(
attack, attack,
@ -57,6 +73,7 @@ async def calculate_damage(
defence_multiplier, defence_multiplier,
resistance_area, resistance_area,
damage_reduction, damage_reduction,
critical_damage,
) )
damage_qw = calculate_damage_qw( damage_qw = calculate_damage_qw(
attack, attack,
@ -77,9 +94,10 @@ async def calculate_damage(
defence_multiplier, defence_multiplier,
resistance_area, resistance_area,
damage_reduction, damage_reduction,
expected_damage, critical_damage,
element, element,
element_area element_area,
base_attr,
) )
skill_info_list = [damage_cd, damage_qw, damage_tz] skill_info_list = [damage_cd, damage_qw, damage_tz]
@ -126,20 +144,17 @@ def calculate_resistance_area(
# 检查是否有某一属性的抗性穿透 # 检查是否有某一属性的抗性穿透
attr_name = attr.split('ResistancePenetration')[0] attr_name = attr.split('ResistancePenetration')[0]
if attr_name in (element, 'AllDamage'): if attr_name in (element, 'AllDamage'):
logger.info(f'{attr_name}属性有{merged_attr[attr]}穿透加成') # logger.info(f'{attr_name}属性有{merged_attr[attr]}穿透加成')
enemy_status_resistance += merged_attr[attr] enemy_status_resistance += merged_attr[attr]
# 检查是否有某一技能属性的抗性穿透 # 检查是否有某一技能属性的抗性穿透
skill_name, skillattr_name = ( if '_' in attr_name:
attr_name.split('_', 1) if '_' in attr_name else (None, None) skill_name = attr_name.split('_')[0]
) skillattr_name = attr_name.split('_')[1]
if skill_name in ( if skill_name == add_skill_type and skillattr_name in (element, 'AllDamage'):
skill_type, enemy_status_resistance += merged_attr[attr]
add_skill_type, # logger.info(
) and skillattr_name in (element, 'AllDamage'): # f'{skill_name}对{skillattr_name}属性有{merged_attr[attr]}穿透加成'
enemy_status_resistance += merged_attr[attr] # )
logger.info(
f'{skill_name}{skillattr_name}属性有{merged_attr[attr]}穿透加成'
)
return 1.0 - (0 - enemy_status_resistance) return 1.0 - (0 - enemy_status_resistance)
@ -147,8 +162,8 @@ def calculate_defence_multiplier(
level: int, level: int,
merged_attr: Dict[str, float], merged_attr: Dict[str, float],
): ):
ignore_defence = merged_attr.get('ignore_defence', 1.0) ignore_defence = merged_attr.get('ignore_defence', 0.0)
enemy_defence = (level * 10 + 200) * ignore_defence enemy_defence = (level * 10 + 200) * (1 - ignore_defence)
return (level * 10 + 200) / (level * 10 + 200 + enemy_defence) return (level * 10 + 200) / (level * 10 + 200 + enemy_defence)
@ -161,17 +176,24 @@ def calculate_injury_area(
injury_area = 0.0 injury_area = 0.0
element_area = 0.0 element_area = 0.0
for attr in merged_attr: for attr in merged_attr:
if 'DmgAdd' in attr and attr.split('DmgAdd')[0] in ( attr_name = attr.split('AddedRatio')[0]
skill_name = attr.split('DmgAdd')[0]
if 'DmgAdd' in attr and skill_name in (
skill_type, skill_type,
add_skill_type, add_skill_type,
): ):
# logger.info(
# f'{attr} 对 {skill_type} 有 {merged_attr[attr]} 伤害加成'
# )
injury_area += merged_attr[attr] injury_area += merged_attr[attr]
for attr in merged_attr:
attr_name = attr.split('DmgAdd')[0]
if 'AddedRatio' in attr and attr_name in ( if 'AddedRatio' in attr and attr_name in (
element, element,
'AllDamage', 'AllDamage',
): ):
# logger.info(
# f'{attr} 对 {element} 属性有 {merged_attr[attr]} 伤害加成'
# )
if attr_name == element: if attr_name == element:
element_area += merged_attr[attr] element_area += merged_attr[attr]
injury_area += merged_attr[attr] injury_area += merged_attr[attr]
@ -199,7 +221,7 @@ def calculate_critical_damage(
add_skill_type: str, add_skill_type: str,
): ):
if skill_type == 'DOT': if skill_type == 'DOT':
return 0.0 return 1.0
critical_damage_base = merged_attr.get('CriticalDamageBase', 0) critical_damage_base = merged_attr.get('CriticalDamageBase', 0)
for attr in merged_attr: for attr in merged_attr:
if '_CriticalDamageBase' in attr and attr.split('_')[0] in ( if '_CriticalDamageBase' in attr and attr.split('_')[0] in (
@ -229,7 +251,7 @@ def calculate_expected_damage(
critical_chance_base: float, critical_chance_base: float,
critical_damage_base: float, critical_damage_base: float,
): ):
return critical_chance_base * critical_damage_base + 1 return critical_chance_base * (critical_damage_base - 1) + 1
def calculate_damage_cd( def calculate_damage_cd(
@ -240,6 +262,7 @@ def calculate_damage_cd(
defence_multiplier: float, defence_multiplier: float,
resistance_area: float, resistance_area: float,
damage_reduction: float, damage_reduction: float,
critical_damage: float,
): ):
return ( return (
attack attack
@ -249,6 +272,7 @@ def calculate_damage_cd(
* defence_multiplier * defence_multiplier
* resistance_area * resistance_area
* damage_reduction * damage_reduction
* critical_damage
) )
@ -282,36 +306,27 @@ def calculate_damage_tz(
defence_multiplier: float, defence_multiplier: float,
resistance_area: float, resistance_area: float,
damage_reduction: float, damage_reduction: float,
expected_damage: float, critical_damage: float,
element: str, element: str,
element_area: float element_area: float,
base_attr: Dict[str, float],
): ):
injury_add_tz = 0.0 injury_add_tz = 0.0
attack_tz = attack + attack * (1 + 2.144) + 0
attack_tz = attack + 355 + base_attr['attack'] * 2.334
# logger.info(f'attack_tz: {attack_tz}')
if element == 'Imaginary': if element == 'Imaginary':
injury_add_tz = 0.12 injury_add_tz = 0.12
damage_tz = ( damage_tz = (
attack_tz attack_tz
* skill_multiplier * skill_multiplier
* damage_ratio * damage_ratio
* (injury_area + injury_add_tz + 2.326) * (injury_area + injury_add_tz + 2.626)
* defence_multiplier * defence_multiplier
* resistance_area * resistance_area
* damage_reduction * damage_reduction
* (expected_damage + 1.594) * (critical_damage + 1.794)
* 10 * 10
) )
element_area = 0 if element == 'Thunder' else 0 damage_tz
damage_tz_fj = (
attack_tz
* 0.44
* damage_ratio
* (injury_area + 2.326 + element_area)
* defence_multiplier
* resistance_area
* damage_reduction
* (expected_damage + 1.594)
* 10
)
damage_tz += damage_tz_fj
return damage_tz return damage_tz

View File

@ -12,10 +12,14 @@ async def merge_attribute(
attr = attribute.split('Delta')[0].lower() attr = attribute.split('Delta')[0].lower()
if attr in merged_attr: if attr in merged_attr:
merged_attr[attr] += value merged_attr[attr] += value
else:
merged_attr[attribute] = attribute_bonus[attribute]
elif attribute.endswith('AddedRatio'): elif attribute.endswith('AddedRatio'):
attr = attribute.split('AddedRatio')[0].lower() attr = attribute.split('AddedRatio')[0].lower()
if attr in merged_attr: if attr in merged_attr:
merged_attr[attr] += base_attr[attr] * (1 + value) 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 merged_attr[attribute] = base_attr.get(attribute, 0) + value
elif attribute.endswith(('ResistancePenetration', 'DmgAdd', 'DmgRatio')): elif attribute.endswith(('ResistancePenetration', 'DmgAdd', 'DmgRatio')):
@ -25,8 +29,4 @@ async def merge_attribute(
else: else:
logger.info(f'未知的属性加成: {attribute}, 采用覆盖模式') logger.info(f'未知的属性加成: {attribute}, 采用覆盖模式')
merged_attr[attribute] = attribute_bonus[attribute] merged_attr[attribute] = attribute_bonus[attribute]
for attr in base_attr:
merged_value = merged_attr.get(attr, 0)
if merged_value == 0:
merged_attr[attr] = base_attr[attr]
return merged_attr return merged_attr