StarRailDamageCal/starrail_damage_cal/damage/AvatarDamage/AvatarDamage.py
2024-05-17 14:56:36 +08:00

4847 lines
155 KiB
Python

import copy
from typing import Dict, List
from starrail_damage_cal.damage.Base.AvatarBase import BaseAvatar, BaseAvatarBuff
from starrail_damage_cal.damage.Base.model import (
DamageInstanceAvatar,
DamageInstanceSkill,
)
from starrail_damage_cal.damage.Role import (
break_damage,
calculate_damage,
calculate_heal,
calculate_shield,
)
from starrail_damage_cal.logger import logger
class Seele(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 < 2:
self.eidolon_attribute["SpeedAddedRatio"] = 0.25
if self.avatar_rank >= 1:
self.eidolon_attribute["CriticalChanceBase"] = 0.15
if self.avatar_rank >= 2:
self.eidolon_attribute["SpeedAddedRatio"] = 0.5
def extra_ability(self):
# 额外能力 割裂 抗性穿透提高20
self.extra_ability_attribute["QuantumResistancePenetration"] = 0.2
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# logger.info(base_attr)
# logger.info(self.avatar_rank)
# 希尔天赋再现加伤害
attribute_bonus["AllDamageAddedRatio"] = self.Skill_num(
"Talent",
"Talent",
) + attribute_bonus.get("AllDamageAddedRatio", 0)
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算大招伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
# 银狼降防终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
add_attr_bonus = copy.deepcopy(attribute_bonus)
add_attr_bonus["ignore_defence"] = 0.45 + add_attr_bonus.get(
"ignore_defence", 0
)
damagelist4 = await calculate_damage(
base_attr,
add_attr_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "银狼降防终结技", "damagelist": damagelist4})
logger.info(skill_info_list)
return skill_info_list
class JingYuan(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 >= 2:
self.eidolon_attribute["NormalDmgAdd"] = 0.2
self.eidolon_attribute["BPSkillDmgAdd"] = 0.2
self.eidolon_attribute["UltraDmgAdd"] = 0.2
if self.avatar_rank >= 6:
self.eidolon_attribute["Talent_DmgRatio"] = 0.288
def extra_ability(self):
logger.info("额外能力")
logger.info(
"【神君】下回合的攻击段数大于等于6段, 则其下回合的暴击伤害提高25%",
)
self.extra_ability_attribute["CriticalDamageBase"] = 0.25
logger.info("施放战技后, 暴击率提升10%")
self.extra_ability_attribute["CriticalChanceBase"] = 0.1
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算大招伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
# 神君
skill_multiplier = self.Skill_num("Talent", "Talent")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "10层神君伤害", "damagelist": damagelist4})
logger.info(skill_info_list)
return skill_info_list
class Welt(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):
pass
def extra_ability(self):
logger.info("额外能力")
logger.info("施放终结技时, 有100%基础概率使目标受到的伤害提高12%, 持续2回合。")
self.extra_ability_attribute["DmgRatio"] = 0.12
logger.info("对被弱点击破的敌方目标造成的伤害提高20")
self.extra_ability_attribute["AllDamageAddedRatio"] = 0.20
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
attnum = 3
skill_multiplier = self.Skill_num("BPSkill", "BPSkill") / attnum
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
if self.avatar_rank >= 6:
attnum = 4
damagelist2[0] = damagelist2[0] * attnum
damagelist2[1] = damagelist2[1] * attnum
damagelist2[2] = damagelist2[2] * attnum
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算大招伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
if self.avatar_rank >= 1:
skill_multiplier = self.Skill_num("Normal", "Normal") * 0.5
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damagelist4[0] = damagelist1[0] + damagelist4[0]
damagelist4[1] = damagelist1[1] + damagelist4[1]
damagelist4[2] = damagelist1[2] + damagelist4[2]
skill_info_list.append({"name": "强化普攻", "damagelist": damagelist4})
skill_multiplier = (self.Skill_num("BPSkill", "BPSkill") / 3) * 0.8
damagelist5 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damagelist5[0] = damagelist2[0] + damagelist5[0]
damagelist5[1] = damagelist2[1] + damagelist5[1]
damagelist5[2] = damagelist2[2] + damagelist5[2]
skill_info_list.append({"name": "强化战技", "damagelist": damagelist5})
logger.info(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
add_attr_bonus: Dict[str, float] = {}
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
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
add_attr_bonus: Dict[str, float] = {}
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
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
add_attr_bonus: Dict[str, float] = {}
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)
)
elif 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
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
add_attr_bonus: Dict[str, float] = {}
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)
)
elif 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
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
add_attr_bonus: Dict[str, float] = {}
for _ 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
skill_info_list.append(
{"name": "终结技", "damagelist": [damage_c, damage_e, damage_a]},
)
logger.info(skill_info_list)
return skill_info_list
class Argenti(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 >= 1:
self.eidolon_attribute["CriticalDamageBase"] = 0.4
if self.avatar_rank >= 2:
self.eidolon_attribute["AttackAddedRatio"] = 0.4
if self.avatar_rank >= 6:
self.eidolon_attribute["Ultra_PhysicalResistancePenetration"] = 0.3
def extra_ability(self):
self.extra_ability_attribute["AllDamageAddedRatio"] = 0.15
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
talent_cc_add = self.Skill_num("Talent", "Talent")
attribute_bonus["CriticalChanceBase"] = (
talent_cc_add * 10 + attribute_bonus.get("CriticalChanceBase", 0)
)
if self.avatar_rank >= 4:
attribute_bonus["CriticalDamageBase"] = 0.08 + attribute_bonus.get(
"CriticalDamageBase", 0
)
attribute_bonus["CriticalChanceBase"] = (
talent_cc_add * 2 + attribute_bonus.get("CriticalChanceBase", 0)
)
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算大招1伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技(90耗能)", "damagelist": damagelist3})
# 计算大招2伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra1")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
# 计算大招2额外伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra_add")
damagelist5 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damagelist5[0] = damagelist5[0] * 6 + damagelist4[0]
damagelist5[1] = damagelist5[1] * 6 + damagelist4[1]
damagelist5[2] = damagelist5[2] * 6 + damagelist4[2]
skill_info_list.append(
{"name": "强化终结技(180耗能)", "damagelist": damagelist5},
)
return skill_info_list
class Clara(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 >= 2:
self.eidolon_attribute["AttackAddedRatio"] = 0.2
def extra_ability(self):
logger.info("额外能力")
logger.info("史瓦罗的反击造成的伤害提高30%")
self.extra_ability_attribute["TalentDmgAdd"] = 0.3
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算反击伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "反击", "damagelist": damagelist3})
# 计算强化反击伤害
skill_multiplier = self.Skill_num("Talent", "Talent") + self.Skill_num(
"Ultra",
"Talent1",
)
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "强化反击", "damagelist": damagelist4})
# 计算1+1托帕反击伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
add_attr_bonus = copy.deepcopy(attribute_bonus)
add_attr_bonus["Talent_DmgRatio"] = (
add_attr_bonus.get("Talent_DmgRatio", 0) + 0.5
)
add_attr_bonus["Talent_CriticalDamageBase"] = (
add_attr_bonus.get("Talent_CriticalDamageBase", 0) + 0.74
)
damagelist5 = await calculate_damage(
base_attr,
add_attr_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "(1+1托帕)反击", "damagelist": damagelist5})
# 计算反击伤害
skill_multiplier = self.Skill_num("Talent", "Talent") + self.Skill_num(
"Ultra",
"Talent1",
)
add_attr_bonus = copy.deepcopy(attribute_bonus)
add_attr_bonus["Talent_DmgRatio"] = (
add_attr_bonus.get("Talent_DmgRatio", 0) + 0.5
)
add_attr_bonus["Talent_CriticalDamageBase"] = (
add_attr_bonus.get("Talent_CriticalDamageBase", 0) + 0.74
)
damagelist6 = await calculate_damage(
base_attr,
add_attr_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "(1+1托帕)强化反击", "damagelist": damagelist6})
return skill_info_list
class Silverwolf(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["AllDamageAddedRatio"] = 1
def extra_ability(self):
logger.info("额外能力")
logger.info("战技降抗")
logger.info("战技使目标全属性抗性降低的效果额外降低3%")
enemy_status_resistance = self.Skill_num("BPSkill", "BPSkill_D") + 0.03
self.extra_ability_attribute["QuantumResistancePenetration"] = (
enemy_status_resistance
)
logger.info("终结技降防")
ultra_defence = self.Skill_num("Ultra", "Ultra_D")
logger.info("天赋降防")
talent_defence = self.Skill_num("Talent", "Talent")
ignore_defence = ultra_defence + talent_defence
self.extra_ability_attribute["ignore_defence"] = ignore_defence
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
if self.avatar_rank >= 4:
skill_multiplier += 1
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
return skill_info_list
class Kafka(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 >= 1:
self.extra_ability_attribute["DOTDmgAdd"] = 0.3
if self.avatar_rank >= 2:
self.extra_ability_attribute["DOTDmgAdd"] = 0.55
def extra_ability(self):
pass
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
# 计算持续伤害
skill_multiplier = self.Skill_num("Ultra", "DOT")
if self.avatar_rank >= 6:
skill_multiplier += 1.56
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"DOT",
"DOT",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "单次持续伤害", "damagelist": damagelist4})
# 计算追加攻击伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
damagelist5 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "追加攻击", "damagelist": damagelist5})
return skill_info_list
class Blade(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 >= 2:
self.eidolon_attribute["CriticalChanceBase"] = 0.15
if self.avatar_rank >= 4:
self.eidolon_attribute["HPAddedRatio"] = 0.4
def extra_ability(self):
logger.info("额外能力")
logger.info("天赋施放的追加攻击伤害提高20%")
self.extra_ability_attribute["TalentDmgAdd"] = 0.2
logger.info("战技加伤")
self.extra_ability_attribute["AllDamageAddedRatio"] = self.Skill_num(
"BPSkill",
"BPSkill",
)
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算强化普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal1")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_multiplier = self.Skill_num("Normal", "Normal1_HP")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
1,
)
damagelist3[0] += damagelist2[0]
damagelist3[1] += damagelist2[1]
damagelist3[2] += damagelist2[2]
skill_info_list.append({"name": "无间剑树", "damagelist": damagelist3})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_multiplier = self.Skill_num("Ultra", "Ultra_HP")
if self.avatar_rank >= 1:
skill_multiplier += 0.9
damagelist5 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
1,
)
damagelist5[0] += damagelist4[0]
damagelist5[1] += damagelist4[1]
damagelist5[2] += damagelist4[2]
skill_info_list.append({"name": "终结技", "damagelist": damagelist5})
# 计算追加攻击伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
damagelist6 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_multiplier = self.Skill_num("Talent", "Talent_HP")
damagelist7 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
1,
)
damagelist7[0] += damagelist6[0]
damagelist7[1] += damagelist6[1]
damagelist7[2] += damagelist6[2]
if self.avatar_rank >= 6:
hp = base_attr["hp"] * (
1 + attribute_bonus.get("HPAddedRatio", 0)
) + attribute_bonus.get("HPDelta", 0)
damage_add = hp * 0.5
damagelist7[0] += damage_add
damagelist7[1] += damage_add
damagelist7[2] += damage_add
skill_info_list.append({"name": "追加攻击", "damagelist": damagelist7})
return skill_info_list
class Fuxuan(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 >= 1:
self.eidolon_attribute["CriticalDamageBase"] = 0.3
def extra_ability(self):
logger.info("符玄战技【穷观阵】属性加成")
self.extra_ability_attribute["CriticalChanceBase"] = self.Skill_num(
"BPSkill",
"BPSkill_CC",
)
self.extra_ability_attribute["HPAddedRatio"] = self.Skill_num(
"BPSkill",
"BPSkill_HP",
)
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal_HP")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
1,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra_HP")
if self.avatar_rank >= 6:
skill_multiplier += 1.2
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
1,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist2})
# 计算终结技治疗
damagelist3 = await calculate_heal(
base_attr,
attribute_bonus,
"Ultra",
0.05,
133,
)
skill_info_list.append({"name": "终结技治疗", "damagelist": damagelist3})
return skill_info_list
class Yanqing(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 >= 4:
self.eidolon_attribute["IceResistancePenetration"] = 0.15
def extra_ability(self):
logger.info("额外能力")
logger.info("触发暴击时, 速度提高10%")
self.extra_ability_attribute["SpeedAddedRatio"] = 0.1
logger.info("【智剑连心】增益")
critical_damage_base_t = self.Skill_num("Talent", "Talent_CD")
critical_damage_base_u = self.Skill_num("Ultra", "Ultra_CD")
self.extra_ability_attribute["CriticalDamageBase"] = (
critical_damage_base_t + critical_damage_base_u
)
critical_chance_base = self.Skill_num("Talent", "Talent_CC")
self.extra_ability_attribute["CriticalChanceBase"] = critical_chance_base + 0.6
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
# 计算附加伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
if self.avatar_rank >= 1:
skill_multiplier += 0.9
else:
skill_multiplier += 0.3
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "附加伤害", "damagelist": damagelist4})
return skill_info_list
class Himeko(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 >= 1:
self.eidolon_attribute["SpeedAddedRatio"] = 0.1
if self.avatar_rank >= 2:
self.eidolon_attribute["AllDamageAddedRatio"] = 0.15
def extra_ability(self):
logger.info("额外能力")
logger.info("战技对灼烧状态下的敌方目标造成的伤害提高20%")
self.extra_ability_attribute["BPSkillDmgAdd"] = 0.2
logger.info("若当前生命值百分比大于等于80%, 则暴击率提高15%")
self.extra_ability_attribute["CriticalChanceBase"] = 0.15
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
# 计算追加攻击伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "追加攻击", "damagelist": damagelist4})
return skill_info_list
class Qingque(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 >= 1:
self.eidolon_attribute["UltraDmgAdd"] = 0.1
def extra_ability(self):
logger.info("额外能力")
logger.info("施放强化普攻后, 青雀的速度提高10%, 持续1回合。")
self.extra_ability_attribute["SpeedAddedRatio"] = 0.1
logger.info("默认4层战技加伤害")
all_damage_added_ratio = self.Skill_num("BPSkill", "BPSkill") + 0.1
self.extra_ability_attribute["AllDamageAddedRatio"] = all_damage_added_ratio * 4
logger.info("默认暗杠加攻")
self.extra_ability_attribute["AttackAddedRatio"] = self.Skill_num(
"Talent",
"Talent",
)
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算杠上开花伤害
skill_multiplier = self.Skill_num("Normal", "Normal1")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "杠上开花!", "damagelist": damagelist2}) # noqa: RUF001
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
return skill_info_list
class Jingliu(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 >= 1:
self.eidolon_attribute["CriticalDamageBase"] = 0.24
if self.avatar_rank >= 2:
self.eidolon_attribute["BPSkill1DmgAdd"] = 0.8
if self.avatar_rank >= 4:
self.eidolon_attribute["BPSkill1AttackAddedRatio"] = 0.3
self.eidolon_attribute["UltraAttackAddedRatio"] = 0.3
if self.avatar_rank >= 6:
self.eidolon_attribute["Ultra_CriticalDamageBase"] = 0.5
self.eidolon_attribute["BPSkill1_CriticalDamageBase"] = 0.5
def extra_ability(self):
logger.info("额外能力")
logger.info("【转魄】状态下, 终结技造成的伤害提高20%")
logger.info("【转魄】状态下, 暴击率提高。")
logger.info("【转魄】状态下, 攻击力提高。")
self.extra_ability_attribute["UltraDmgAdd"] = 0.2
critical_chance_base = self.Skill_num("Talent", "Talent_CC")
self.extra_ability_attribute["Ultra_CriticalChanceBase"] = critical_chance_base
self.extra_ability_attribute["BPSkill1_CriticalChanceBase"] = (
critical_chance_base
)
attack_added_ratio = self.Skill_num("Talent", "Talent_atk")
self.extra_ability_attribute["BPSkill1AttackAddedRatio"] = attack_added_ratio
self.extra_ability_attribute["UltraAttackAddedRatio"] = attack_added_ratio
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算寒川映月伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill1")
if self.avatar_rank >= 1:
skill_multiplier += 1
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill1",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "寒川映月", "damagelist": damagelist3})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
if self.avatar_rank >= 1:
skill_multiplier += 1
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist4})
return skill_info_list
class Topaz(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 >= 1:
self.eidolon_attribute["Talent_CriticalDamageBase"] = 0.5
if self.avatar_rank >= 6:
self.eidolon_attribute["Talent1_FireResistancePenetration"] = 0.1
def extra_ability(self):
logger.info("额外能力")
logger.info("托帕和账账对拥有火属性弱点的敌方目标造成的伤害提高15%")
self.extra_ability_attribute["AllDamageAddedRatio"] = 0.15
logger.info("涨幅惊人暴击伤害提高")
self.extra_ability_attribute["Talent1_CriticalDamageBase"] = self.Skill_num(
"Ultra",
"Ultra_CD",
)
logger.info("【负债证明】状态,使其受到的追加攻击伤害提高")
self.extra_ability_attribute["Talent_DmgRatio"] = self.Skill_num(
"BPSkill",
"BPSkill_add",
)
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算账账伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "账账", "damagelist": damagelist2})
# 计算强化账账伤害
skill_multiplier = self.Skill_num("Talent", "Talent") + self.Skill_num(
"Ultra",
"Talent1",
)
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent1",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "强化账账", "damagelist": damagelist3})
return skill_info_list
class Guinaifen(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):
pass
def extra_ability(self):
self.extra_ability_attribute["AllDamageAddedRatio"] = 0.2
if self.avatar_rank >= 6:
self.extra_ability_attribute["DmgRatio"] = (
self.Skill_num("Talent", "Talent") * 4
)
else:
self.extra_ability_attribute["DmgRatio"] = (
self.Skill_num("Talent", "Talent") * 3
)
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
# 计算持续伤害
skill_multiplier = self.Skill_num("BPSkill", "DOT")
if self.avatar_rank >= 2:
skill_multiplier += 0.4
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"DOT",
"DOT",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "单次持续伤害", "damagelist": damagelist4})
return skill_info_list
class Gepard(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):
pass
def extra_ability(self):
pass
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技护盾
skill_multiplier = self.Skill_num("Ultra", "Ultra")
skill_num = self.Skill_num("Ultra", "Ultra_G")
damagelist3 = await calculate_shield(
base_attr,
attribute_bonus,
skill_multiplier,
skill_num,
)
skill_info_list.append({"name": "终结技(护盾)", "damagelist": damagelist3})
return skill_info_list
class Luocha(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 >= 1:
self.eidolon_attribute["AttackAddedRatio"] = 0.2
if self.avatar_rank >= 6:
self.eidolon_attribute["ResistancePenetration"] = 0.2
def extra_ability(self):
pass
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist2})
# 计算战技治疗
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
skill_num = self.Skill_num("BPSkill", "BPSkill_G")
damagelist3 = await calculate_heal(
base_attr,
attribute_bonus,
"BPSkill",
skill_multiplier,
skill_num,
1,
)
skill_info_list.append({"name": "战技治疗量", "damagelist": damagelist3})
if self.avatar_rank >= 2:
add_attr_bonus = copy.deepcopy(attribute_bonus)
add_attr_bonus["HealRatioBase"] = (
add_attr_bonus.get("HealRatioBase", 0) + 0.3
)
damagelist4 = await calculate_heal(
base_attr,
add_attr_bonus,
"BPSkill",
skill_multiplier,
skill_num,
1,
)
skill_info_list.append(
{
"name": "战技治疗量(生命<50%)(2魂)",
"damagelist": damagelist4,
},
)
damagelist5 = await calculate_shield(
base_attr,
attribute_bonus,
0.18,
240,
1,
)
skill_info_list.append(
{
"name": "战技护盾量(生命>50%)(2魂)",
"damagelist": damagelist5,
},
)
# 计算天赋治疗量
skill_multiplier = self.Skill_num("Talent", "Talent")
skill_num = self.Skill_num("Talent", "Talent_G")
damagelist6 = await calculate_heal(
base_attr,
attribute_bonus,
"BPSkill",
skill_multiplier,
skill_num,
1,
)
skill_info_list.append({"name": "天赋治疗量", "damagelist": damagelist6})
# 计算技能树额外能力治疗量
damagelist7 = await calculate_heal(
base_attr,
attribute_bonus,
"BPSkill",
0.07,
93,
1,
)
skill_info_list.append({"name": "技能树治疗量", "damagelist": damagelist7})
return skill_info_list
class Bailu(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 >= 2:
self.eidolon_attribute["HealRatioBase"] = 0.15
if self.avatar_rank >= 4:
self.eidolon_attribute["AllDamageAddedRatio"] = 0.3
def extra_ability(self):
self.extra_ability_attribute["HPAddedRatio"] = 0.10
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技治疗
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
skill_num = self.Skill_num("BPSkill", "BPSkill_G")
damagelist2 = await calculate_heal(
base_attr,
attribute_bonus,
"BPSkill",
skill_multiplier,
skill_num,
)
heal_num = damagelist2[0]
for i in range(1, 3):
beilv = 1 - (i * 0.15)
damagelist2[0] = damagelist2[0] + heal_num * beilv
skill_info_list.append({"name": "战技治疗量", "damagelist": damagelist2})
# 计算终结技治疗量
skill_multiplier = self.Skill_num("Ultra", "Ultra")
skill_num = self.Skill_num("Ultra", "Ultra_G")
damagelist3 = await calculate_heal(
base_attr,
attribute_bonus,
"Ultra",
skill_multiplier,
skill_num,
)
skill_info_list.append({"name": "终结技治疗量", "damagelist": damagelist3})
# 计算天赋生息治疗量
skill_multiplier = self.Skill_num("Talent", "Talent")
skill_num = self.Skill_num("Talent", "Talent_G")
damagelist4 = await calculate_heal(
base_attr,
attribute_bonus,
"Talent",
skill_multiplier,
skill_num,
)
skill_info_list.append({"name": "天赋[生息]治疗量", "damagelist": damagelist4})
# 计算天赋复活治疗量
skill_multiplier = self.Skill_num("Talent", "Talent1")
skill_num = self.Skill_num("Talent", "Talent1_G")
damagelist5 = await calculate_heal(
base_attr,
attribute_bonus,
"Talent",
skill_multiplier,
skill_num,
)
skill_info_list.append({"name": "天赋[复活]治疗量", "damagelist": damagelist5})
return skill_info_list
class Lynx(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 >= 1:
self.eidolon_attribute["HealRatioBase"] = 0.2
def extra_ability(self):
pass
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 计算战技生命上限
skill_multiplier = self.Skill_num("BPSkill", "BPSkill_HP")
skill_num = self.Skill_num("BPSkill", "BPSkill_HP_G")
if self.avatar_rank >= 6:
skill_multiplier += 0.06
hp = base_attr["hp"] * (
1 + attribute_bonus.get("HPAddedRatio", 0)
) + attribute_bonus.get("HPDelta", 0)
hp_add = hp * skill_multiplier + skill_num
attribute_bonus["HPDelta"] = attribute_bonus.get("HPDelta", 0) + hp_add
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal_HP")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
1,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技治疗
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
skill_num = self.Skill_num("BPSkill", "BPSkill_G")
damagelist2 = await calculate_heal(
base_attr,
attribute_bonus,
"BPSkill",
skill_multiplier,
skill_num,
)
skill_info_list.append({"name": "战技治疗量", "damagelist": damagelist2})
damagelist3 = []
damagelist3.append(hp_add)
skill_info_list.append(
{"name": "[求生反应]生命上限", "damagelist": damagelist3},
)
# 计算终结技治疗量
skill_multiplier = self.Skill_num("Ultra", "Ultra")
skill_num = self.Skill_num("Ultra", "Ultra_G")
damagelist4 = await calculate_heal(
base_attr,
attribute_bonus,
"Ultra",
skill_multiplier,
skill_num,
)
skill_info_list.append({"name": "终结技治疗量", "damagelist": damagelist4})
# 计算天赋治疗量
skill_multiplier = self.Skill_num("Talent", "Talent")
skill_num = self.Skill_num("Talent", "Talent_G")
damagelist5 = await calculate_heal(
base_attr,
attribute_bonus,
"Talent",
skill_multiplier,
skill_num,
)
skill_info_list.append({"name": "天赋缓回治疗量", "damagelist": damagelist5})
# 计算天赋求生反应治疗量
skill_multiplier = self.Skill_num("Talent", "Talent1") + self.Skill_num(
"Talent",
"Talent",
)
skill_num = self.Skill_num("Talent", "Talent1_G") + self.Skill_num(
"Talent",
"Talent_G",
)
damagelist6 = await calculate_heal(
base_attr,
attribute_bonus,
"Talent",
skill_multiplier,
skill_num,
)
skill_info_list.append(
{"name": "天赋[求生反应]缓回治疗量", "damagelist": damagelist6},
)
return skill_info_list
class Natasha(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):
pass
def extra_ability(self):
self.extra_ability_attribute["HealRatioBase"] = 0.1 + self.Skill_num(
"Talent",
"Talent",
)
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
if self.avatar_rank >= 6:
damagelist_add = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
0.4,
self.avatar_level,
1,
)
damagelist1[0] += damagelist_add[0]
damagelist1[1] += damagelist_add[1]
damagelist1[2] += damagelist_add[2]
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技治疗
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
skill_num = self.Skill_num("BPSkill", "BPSkill_G")
damagelist2 = await calculate_heal(
base_attr,
attribute_bonus,
"BPSkill",
skill_multiplier,
skill_num,
)
skill_info_list.append({"name": "战技治疗量", "damagelist": damagelist2})
# 计算战技缓回治疗量
skill_multiplier = self.Skill_num("BPSkill", "BPSkill1")
skill_num = self.Skill_num("BPSkill", "BPSkill1_G")
damagelist3 = await calculate_heal(
base_attr,
attribute_bonus,
"BPSkill",
skill_multiplier,
skill_num,
)
skill_info_list.append({"name": "战技缓回治疗量", "damagelist": damagelist3})
# 计算终结技治疗量
skill_multiplier = self.Skill_num("Ultra", "Ultra")
skill_num = self.Skill_num("Ultra", "Ultra_G")
damagelist4 = await calculate_heal(
base_attr,
attribute_bonus,
"Ultra",
skill_multiplier,
skill_num,
)
skill_info_list.append({"name": "终结技治疗量", "damagelist": damagelist4})
return skill_info_list
class Mar7th(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):
pass
def extra_ability(self):
pass
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技护盾
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
skill_num = self.Skill_num("BPSkill", "BPSkill_G")
damagelist2 = await calculate_shield(
base_attr,
attribute_bonus,
skill_multiplier,
skill_num,
)
skill_info_list.append({"name": "战技护盾量", "damagelist": damagelist2})
# 计算终结技
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
# 计算追加攻击
skill_multiplier = self.Skill_num("Talent", "Talent")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
if self.avatar_rank >= 4:
defence = base_attr.get("defence", 0) * (
1 + attribute_bonus.get("DefenceAddedRatio", 0)
) + attribute_bonus.get("DefenceDelta", 0)
damage_add = defence * 0.3
damagelist4[0] += damage_add
damagelist4[1] += damage_add
damagelist4[2] += damage_add
skill_info_list.append({"name": "追加攻击", "damagelist": damagelist4})
# 计算2命护盾
if self.avatar_rank >= 2:
damagelist5 = await calculate_shield(
base_attr,
attribute_bonus,
0.24,
320,
)
skill_info_list.append({"name": "开场护盾(2命)", "damagelist": damagelist5})
return skill_info_list
class Bronya(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 >= 2:
self.eidolon_attribute["SpeedAddedRatio"] = 0.3
def extra_ability(self):
self.extra_ability_attribute["AllDamageAddedRatio"] = 0.1
self.extra_ability_attribute["Normal_CriticalChance"] = 1
self.extra_ability_attribute["DefenceAddedRatio"] = 0.2
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 终结技增加伤害
attribute_bonus["AttackAddedRatio"] = attribute_bonus.get(
"AttackAddedRatio", 0
) + self.Skill_num("Ultra", "Ultra_A")
add_critical_damage_base = (
attribute_bonus.get("CriticalDamageBase", 0)
* self.Skill_num("Ultra", "Ultra")
) + self.Skill_num("Ultra", "Ultra_G")
attribute_bonus["CriticalDamageBase"] = (
attribute_bonus.get("CriticalDamageBase", 0) + add_critical_damage_base
)
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算终结技
critical_damage_base_str = add_critical_damage_base * 100
damagelist2 = []
damagelist2.append(critical_damage_base_str)
skill_info_list.append({"name": "终结技提升爆伤(%)", "damagelist": damagelist2})
return skill_info_list
class Yukong(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 >= 1:
self.eidolon_attribute["SpeedAddedRatio"] = 0.1
if self.avatar_rank >= 4:
self.eidolon_attribute["AllDamageAddedRatio"] = 0.3
def extra_ability(self):
self.extra_ability_attribute["ImaginaryAddedRatio"] = 0.15
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 终结技增加伤害
attribute_bonus["AttackAddedRatio"] = attribute_bonus.get(
"AttackAddedRatio", 0
) + self.Skill_num("BPSkill", "BPSkill")
attribute_bonus["CriticalChanceBase"] = attribute_bonus.get(
"CriticalChanceBase", 0
) + self.Skill_num("Ultra", "Ultra_CC")
attribute_bonus["CriticalDamageBase"] = attribute_bonus.get(
"CriticalDamageBase", 0
) + self.Skill_num("Ultra", "Ultra_CD")
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_multiplier = self.Skill_num("Talent", "Normal_add")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damagelist2[0] += damagelist1[0]
damagelist2[1] += damagelist1[1]
damagelist2[2] += damagelist1[2]
skill_info_list.append({"name": "普攻", "damagelist": damagelist2})
# 计算终结技
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
return skill_info_list
class Sushang(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):
self.eidolon_attribute["SpeedAddedRatio"] = self.Skill_num("Talent", "Talent")
if self.avatar_rank >= 6:
self.eidolon_attribute["SpeedAddedRatio"] = (
self.Skill_num("Talent", "Talent") * 2
)
def extra_ability(self):
self.extra_ability_attribute["jianshiDmgAdd"] = 0.2
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算剑势附加伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill_F")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"jianshi",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damagelist3[0] += damagelist2[0]
damagelist3[1] += damagelist2[1]
damagelist3[2] += damagelist2[2]
skill_info_list.append({"name": "战技", "damagelist": damagelist3})
# 计算强化战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damagelist4[0] += damagelist2[0] * 3
damagelist4[1] += damagelist2[1] * 3
damagelist4[2] += damagelist2[2] * 3
skill_info_list.append({"name": "强化战技", "damagelist": damagelist4})
skill_info_list.append({"name": "剑势附加伤害", "damagelist": damagelist2})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist5 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist5})
return skill_info_list
class Luka(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 >= 1:
self.eidolon_attribute["AllDamageAddedRatio"] = 0.15
def extra_ability(self):
pass
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 计算终结技提供的易伤加成
attribute_bonus["DmgRatio"] = attribute_bonus.get(
"DmgRatio", 0
) + self.Skill_num("Ultra", "Ultra_d")
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算强化普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal1")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damagelist2[0] += damagelist2[0] * 5
damagelist2[1] += damagelist2[1] * 5
damagelist2[2] += damagelist2[2] * 5
skill_multiplier = self.Skill_num("Normal", "Normal2")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damagelist3[0] += damagelist2[0]
damagelist3[1] += damagelist2[1]
damagelist3[2] += damagelist2[2]
skill_info_list.append({"name": "强化普攻(满段数)", "damagelist": damagelist3})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist4})
# 计算DOT伤害
skill_multiplier = self.Skill_num("BPSkill", "DOT")
damagelist5 = await calculate_damage(
base_attr,
attribute_bonus,
"DOT",
"DOT",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "持续伤害(最大值)", "damagelist": damagelist5})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist6 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist6})
return skill_info_list
class DanHeng(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 >= 1:
self.eidolon_attribute["CriticalChanceBase"] = 0.12
def extra_ability(self):
self.extra_ability_attribute["SpeedAddedRatio"] = 0.2
self.extra_ability_attribute["NormalDmgAdd"] = 0.4
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 计算穿透加成
attribute_bonus["WindResistancePenetration"] = attribute_bonus.get(
"WindResistancePenetration", 0
) + self.Skill_num("Talent", "Talent")
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra") + self.Skill_num(
"Ultra",
"Ultra_d",
)
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
return skill_info_list
class Arlan(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 >= 1:
self.eidolon_attribute["BPSkillDmgAdd"] = 0.12
if self.avatar_rank >= 6:
self.eidolon_attribute["UltraDmgAdd"] = 0.12
def extra_ability(self):
pass
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 计算天赋伤害加成
attribute_bonus["AllDamageAddedRatio"] = attribute_bonus.get(
"AllDamageAddedRatio", 0
) + self.Skill_num("Talent", "Talent")
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
return skill_info_list
class Asta(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):
pass
def extra_ability(self):
self.eidolon_attribute["FireAddedRatio"] = 0.18
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 计算天赋加成
attribute_bonus["AttackAddedRatio"] = (
attribute_bonus.get("AttackAddedRatio", 0)
+ self.Skill_num("Talent", "Talent") * 5
)
attribute_bonus["SpeedDelta"] = attribute_bonus.get(
"SpeedDelta", 0
) + self.Skill_num("Ultra", "Ultra")
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_num = 5
if self.avatar_rank >= 1:
skill_num += 1
damagelist2[0] = damagelist2[0] * skill_num
damagelist2[1] = damagelist2[1] * skill_num
damagelist2[2] = damagelist2[2] * skill_num
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
return skill_info_list
class Herta(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 >= 2:
self.eidolon_attribute["CriticalChanceBase"] = 0.15
if self.avatar_rank >= 4:
self.eidolon_attribute["TalentDmgAdd"] = 0.12
if self.avatar_rank >= 6:
self.eidolon_attribute["AttackAddedRatio"] = 0.25
def extra_ability(self):
self.extra_ability_attribute["BPSkillDmgAdd"] = 0.25
self.extra_ability_attribute["UltraDmgAdd"] = 0.2
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
if self.avatar_rank >= 1:
skill_multiplier += 0.4
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
attribute_bonus["BPSkillDmgAdd"] = attribute_bonus.get("BPSkillDmgAdd", 0) + 0.2
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
# 计算追加攻击伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "追加攻击", "damagelist": damagelist4})
return skill_info_list
class Serval(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.eidolon_attribute["AllDamageAddedRatio"] = 0.3
def extra_ability(self):
self.extra_ability_attribute["AttackAddedRatio"] = 0.2
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算DOT伤害
skill_multiplier = self.Skill_num("BPSkill", "DOT")
damagelist5 = await calculate_damage(
base_attr,
attribute_bonus,
"DOT",
"DOT",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "持续伤害", "damagelist": damagelist5})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
# 计算追加攻击伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "追加攻击", "damagelist": damagelist4})
return skill_info_list
class Pela(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 >= 2:
self.eidolon_attribute["SpeedAddedRatio"] = 0.1
if self.avatar_rank >= 4:
self.eidolon_attribute["IceResistancePenetration"] = 0.12
def extra_ability(self):
self.extra_ability_attribute["AllDamageAddedRatio"] = 0.4
self.extra_ability_attribute["StatusProbabilityBase"] = 0.1
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 计算终结技降防
attribute_bonus["ignore_defence"] = attribute_bonus.get(
"ignore_defence", 0
) + self.Skill_num("Ultra", "Ultra_d")
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
if self.avatar_rank >= 6:
# 计算命座附加伤害
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"fujia",
"fujia",
self.avatar_element,
0.4,
self.avatar_level,
)
skill_info_list.append({"name": "6命追加伤害", "damagelist": damagelist4})
return skill_info_list
class Sampo(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):
pass
def extra_ability(self):
pass
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 计算终结技持续伤害加成
attribute_bonus["DOTDmgAdd"] = attribute_bonus.get(
"DOTDmgAdd", 0
) + self.Skill_num("Ultra", "Ultra_d")
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damagelist2[0] = damagelist2[0] * 5
damagelist2[1] = damagelist2[1] * 5
damagelist2[2] = damagelist2[2] * 5
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
# 计算持续伤害
skill_multiplier = self.Skill_num("Talent", "DOT")
if self.avatar_rank >= 6:
skill_multiplier += 0.15
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"DOT",
"DOT",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "单层持续伤害", "damagelist": damagelist4})
return skill_info_list
class Hook(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 >= 2:
self.eidolon_attribute["BPSkill1DmgAdd"] = 0.2
if self.avatar_rank >= 6:
self.eidolon_attribute["AllDamageAddedRatio"] = 0.2
def extra_ability(self):
pass
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算强化战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill1")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill1",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "强化战技", "damagelist": damagelist3})
# 计算持续伤害
skill_multiplier = self.Skill_num("BPSkill", "DOT")
damagelist5 = await calculate_damage(
base_attr,
attribute_bonus,
"DOT",
"DOT",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "灼烧伤害", "damagelist": damagelist5})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist4})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
damagelist6 = await calculate_damage(
base_attr,
attribute_bonus,
"fujia",
"fujia",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "附加伤害", "damagelist": damagelist6})
return skill_info_list
class Tingyun(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 >= 1:
self.eidolon_attribute["SpeedAddedRatio"] = 0.2
def extra_ability(self):
self.eidolon_attribute["SpeedAddedRatio"] = 0.2
self.eidolon_attribute["NormalDmgAdd"] = 0.4
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill_M")
attack = (
base_attr["attack"] * (1 + attribute_bonus["AttackAddedRatio"])
+ attribute_bonus["AttackDelta"]
)
add_atk = attack * skill_multiplier
damagelist2 = []
damagelist2.append(add_atk)
skill_info_list.append({"name": "战技提升攻击力", "damagelist": damagelist2})
return skill_info_list
class Trailblazer(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 >= 4:
self.eidolon_attribute["CriticalChanceBase"] = 0.25
def extra_ability(self):
self.extra_ability_attribute["BPSkillDmgAdd"] = 0.25
self.extra_ability_attribute["Ultra1DmgAdd"] = 0.25
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 计算天赋攻击加成
attribute_bonus["AttackAddedRatio"] = (
attribute_bonus.get("AttackAddedRatio", 0)
+ self.Skill_num("Talent", "Talent") * 2
)
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技1伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "全胜•再见安打", "damagelist": damagelist3})
# 计算终结技2伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra1")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra1",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "全胜•安息全垒打", "damagelist": damagelist4})
return skill_info_list
class Trailblazer_K(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.eidolon_attribute["DefenceAddedRatio"] = 0.3
def extra_ability(self):
self.extra_ability_attribute["AttackAddedRatio"] = 0.15
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
if self.avatar_rank >= 1:
damagelist1_f = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
0.25,
self.avatar_level,
2,
)
damagelist1[0] += damagelist1_f[0]
damagelist1[1] += damagelist1_f[1]
damagelist1[2] += damagelist1_f[2]
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算强化普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal1")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
if self.avatar_rank >= 1:
damagelist2_f = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
0.5,
self.avatar_level,
2,
)
damagelist2[0] += damagelist2_f[0]
damagelist2[1] += damagelist2_f[1]
damagelist2[2] += damagelist2_f[2]
skill_info_list.append({"name": "强化普攻", "damagelist": damagelist2})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_multiplier = self.Skill_num("Ultra", "Ultra1")
damagelist3_f = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
2,
)
damagelist3[0] += damagelist3_f[0]
damagelist3[1] += damagelist3_f[1]
damagelist3[2] += damagelist3_f[2]
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
# 计算天赋提供护盾
skill_multiplier = self.Skill_num("Talent", "Talent")
skill_multiplier_g = self.Skill_num("Talent", "Talent_G")
if self.avatar_rank >= 2:
skill_multiplier += 0.02
skill_multiplier_g += 27
damagelist4 = await calculate_shield(
base_attr,
attribute_bonus,
skill_multiplier,
skill_multiplier_g,
)
skill_info_list.append({"name": "天赋护盾", "damagelist": damagelist4})
return skill_info_list
class Huohuo(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 >= 1:
self.eidolon_attribute["SpeedAddedRatio"] = 0.12
if self.avatar_rank >= 6:
self.eidolon_attribute["AllDamageAddedRatio"] = 0.5
def extra_ability(self):
pass
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
1,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技治疗
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
skill_num = self.Skill_num("BPSkill", "BPSkill_G")
damagelist2 = await calculate_heal(
base_attr,
attribute_bonus,
"BPSkill",
skill_multiplier,
skill_num,
)
skill_info_list.append({"name": "战技治疗量", "damagelist": damagelist2})
if self.avatar_rank >= 4:
# 计算战技治疗
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
skill_num = self.Skill_num("BPSkill", "BPSkill_G")
add_attr_bonus = copy.deepcopy(attribute_bonus)
add_attr_bonus["HealRatioBase"] = (
add_attr_bonus.get("HealRatioBase", 0) + 0.8
)
damagelist2_max = await calculate_heal(
base_attr,
add_attr_bonus,
"BPSkill",
skill_multiplier,
skill_num,
)
skill_info_list.append(
{"name": "战技最高治疗量(4魂)", "damagelist": damagelist2_max},
)
# 计算天赋治疗量
skill_multiplier = self.Skill_num("Talent", "Talent")
skill_num = self.Skill_num("Talent", "Talent_G")
damagelist5 = await calculate_heal(
base_attr,
attribute_bonus,
"Talent",
skill_multiplier,
skill_num,
)
skill_info_list.append({"name": "天赋治疗量", "damagelist": damagelist5})
if self.avatar_rank >= 4:
skill_multiplier = self.Skill_num("Talent", "Talent")
skill_num = self.Skill_num("Talent", "Talent_G")
add_attr_bonus = copy.deepcopy(attribute_bonus)
add_attr_bonus["HealRatioBase"] = (
add_attr_bonus.get("HealRatioBase", 0) + 0.8
)
damagelist5 = await calculate_heal(
base_attr,
add_attr_bonus,
"Talent",
skill_multiplier,
skill_num,
)
skill_info_list.append({"name": "天赋治疗量", "damagelist": damagelist5})
return skill_info_list
class Hanya(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 >= 2:
self.eidolon_attribute["SpeedAddedRatio"] = 0.2
def extra_ability(self):
self.extra_ability_attribute["AttackAddedRatio"] = 0.1
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 计算天赋易伤加成
attribute_bonus["DmgRatio"] = attribute_bonus.get(
"DmgRatio", 0
) + self.Skill_num("Talent", "Talent")
if self.avatar_rank >= 6:
attribute_bonus["DmgRatio"] = attribute_bonus.get("DmgRatio", 0) + 0.1
attribute_bonus["AttackAddedRatio"] = attribute_bonus.get(
"AttackAddedRatio", 0
) + self.Skill_num("Ultra", "Ultra_A")
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技提升速度
speed = (
base_attr["speed"] * (1 + attribute_bonus["SpeedAddedRatio"])
+ attribute_bonus["SpeedDelta"]
)
skill_multiplier = self.Skill_num("Ultra", "Ultra_S")
add_speed = speed * skill_multiplier
damagelist3 = []
damagelist3.append(add_speed)
skill_info_list.append({"name": "终结技增加速度", "damagelist": damagelist3})
return skill_info_list
class DrRatio(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 >= 1:
self.eidolon_attribute["CriticalChanceBase"] = 0.1
self.eidolon_attribute["CriticalDamageBase"] = 0.2
if self.avatar_rank >= 6:
self.eidolon_attribute["TalentDmgAdd"] = 0.5
def extra_ability(self):
self.extra_ability_attribute["AllDamageAddedRatio"] = 0.5
self.extra_ability_attribute["CriticalChanceBase"] = 0.15
self.extra_ability_attribute["CriticalDamageBase"] = 0.3
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技1伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
# 计算天赋追伤伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
if self.avatar_rank >= 2:
damagelist5 = await calculate_damage(
base_attr,
attribute_bonus,
"fujia",
"fujia",
self.avatar_element,
0.2,
self.avatar_level,
)
damagelist4[0] += damagelist5[0] * 4
damagelist4[1] += damagelist5[1] * 4
damagelist4[2] += damagelist5[2] * 4
skill_info_list.append({"name": "协同攻击", "damagelist": damagelist4})
return skill_info_list
class RuanMei(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 >= 1:
self.eidolon_attribute["ignore_defence"] = 0.2
if self.avatar_rank >= 2:
self.eidolon_attribute["AttackAddedRatio"] = 0.4
if self.avatar_rank >= 4:
self.eidolon_attribute["BreakDamageAddedRatioBase"] = 1
def extra_ability(self):
self.extra_ability_attribute["BreakDamageAddedRatioBase"] = 0.2
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 计算属性加成
attribute_bonus["AllDamageAddedRatio"] = attribute_bonus.get(
"AllDamageAddedRatio", 0
) + self.Skill_num("BPSkill", "BPSkill")
attribute_bonus["BreakDamageAddedRatioBase"] = (
attribute_bonus.get("BreakDamageAddedRatioBase", 0) + 0.5
)
attribute_bonus["ResistancePenetration"] = attribute_bonus.get(
"ResistancePenetration", 0
) + self.Skill_num("Ultra", "Ultra_P")
attribute_bonus["SpeedAddedRatio"] = attribute_bonus.get(
"SpeedAddedRatio", 0
) + self.Skill_num("Talent", "Talent_S")
# 战斗中阮•梅的击破特攻大于120%时, 每超过10%, 则战技使我方全体伤害提高的效果额外提高6%, 最高不超过36%。
Break_Damage_Added_Ratio = attribute_bonus.get("BreakDamageAddedRatioBase", 0)
if Break_Damage_Added_Ratio > 1.2:
add_all_damage_added_ratio = ((Break_Damage_Added_Ratio - 1.2) / 0.1) * 0.06
add_all_damage_added_ratio = min(0.36, add_all_damage_added_ratio)
attribute_bonus["AllDamageAddedRatio"] = (
attribute_bonus.get("AllDamageAddedRatio", 0)
+ add_all_damage_added_ratio
)
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
jipodamage1 = await break_damage(
base_attr,
attribute_bonus,
"jipo",
"jipo",
self.avatar_element,
self.avatar_level,
)
jipodamage1[0] = jipodamage1[0] * skill_multiplier
skill_info_list.append({"name": "残梅绽附加伤害", "damagelist": jipodamage1})
# 计算天赋追伤伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
if self.avatar_rank >= 6:
skill_multiplier += 2
jipodamage2 = await break_damage(
base_attr,
attribute_bonus,
"jipo",
"jipo",
self.avatar_element,
self.avatar_level,
)
jipodamage2[0] = jipodamage2[0] * skill_multiplier
skill_info_list.append({"name": "天赋附加击破伤害", "damagelist": jipodamage2})
return skill_info_list
class XueYi(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 >= 1:
self.eidolon_attribute["TalentDmgAdd"] = 0.4
if self.avatar_rank >= 4:
self.eidolon_attribute["BreakDamageAddedRatioBase"] = 0.4
def extra_ability(self):
self.extra_ability_attribute["UltraDmgAdd"] = 0.1 + self.Skill_num(
"Ultra", "Ultra_A"
)
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 使自身造成的伤害提高, 提高数值等同于击破特攻的100%, 最多使造成的伤害提高240%。
Break_Damage_Added_Ratio = attribute_bonus.get("BreakDamageAddedRatioBase", 0)
attribute_bonus["AllDamageAddedRatio"] = attribute_bonus.get(
"AllDamageAddedRatio", 0
) + min(2.4, Break_Damage_Added_Ratio)
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
# 计算天赋追伤伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damagelist4[0] += damagelist4[0] * 3
damagelist4[1] += damagelist4[1] * 3
damagelist4[2] += damagelist4[2] * 3
skill_info_list.append({"name": "天赋追加攻击", "damagelist": damagelist4})
return skill_info_list
class BlackSwan(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 >= 1:
self.eidolon_attribute["WindResistancePenetration"] = 0.25
self.eidolon_attribute["PhysicalResistancePenetration"] = 0.25
self.eidolon_attribute["FireResistancePenetration"] = 0.25
self.eidolon_attribute["ThunderResistancePenetration"] = 0.25
def extra_ability(self):
# 战技降防计算
bpskill_defence = self.Skill_num("BPSkill", "BPSkill_D")
self.extra_ability_attribute["ignore_defence"] = bpskill_defence
# 终结技加伤害
self.extra_ability_attribute["AllDamageAddedRatio"] = self.Skill_num(
"Ultra", "Ultra_A"
)
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 使自身造成的伤害提高, 提高数值等同于效果命中的60%, 最多使造成的伤害提高72%。
Break_Damage_Added_Ratio = attribute_bonus.get("StatusProbabilityBase", 0) * 0.6
attribute_bonus["AllDamageAddedRatio"] = attribute_bonus.get(
"AllDamageAddedRatio", 0
) + min(0.72, Break_Damage_Added_Ratio)
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"BPSkill",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
# 计算1层奥迹持续伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
skill_multiplier += self.Skill_num("Talent", "Talent_UP")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"DOT",
"DOT",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "1层奥迹伤害", "damagelist": damagelist4})
# 计算50层奥迹持续伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
skill_multiplier += self.Skill_num("Talent", "Talent_UP") * 50
add_attr_bonus = copy.deepcopy(attribute_bonus)
add_attr_bonus["ignore_defence"] = add_attr_bonus.get("ignore_defence", 0) + 0.2
damagelist5 = await calculate_damage(
base_attr,
add_attr_bonus,
"DOT",
"DOT",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "50层奥迹伤害", "damagelist": damagelist5})
return skill_info_list
class Sparkle(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):
pass
def extra_ability(self):
self.extra_ability_attribute["AttackAddedRatio"] = 0.45
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 终结技天赋增加伤害
All_Damage_Add = (
self.Skill_num("Talent", "Talent") + self.Skill_num("Ultra", "Ultra")
) * 3
attribute_bonus["AllDamageAddedRatio"] = (
attribute_bonus.get("AllDamageAddedRatio", 0) + All_Damage_Add
)
# 战技增加暴击伤害
if self.avatar_rank >= 6:
add_critical_damage_base = attribute_bonus.get("CriticalDamageBase", 0) * (
self.Skill_num("BPSkill", "BPSkill") + 0.3
) + self.Skill_num("BPSkill", "BPSkill_G")
else:
add_critical_damage_base = attribute_bonus.get(
"CriticalDamageBase", 0
) * self.Skill_num("BPSkill", "BPSkill") + self.Skill_num(
"BPSkill", "BPSkill_G"
)
attribute_bonus["CriticalDamageBase"] = (
attribute_bonus.get("CriticalDamageBase", 0) + add_critical_damage_base
)
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算终结技
critical_damage_base_str = add_critical_damage_base * 100
damagelist2 = []
damagelist2.append(critical_damage_base_str)
skill_info_list.append({"name": "战技提升爆伤(%)", "damagelist": damagelist2})
return skill_info_list
class Acheron(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 >= 1:
self.eidolon_attribute["CriticalChanceBase"] = 0.18
if self.avatar_rank >= 4:
self.eidolon_attribute["Ultra_DmgRatio"] = 0.08
if self.avatar_rank >= 6:
self.eidolon_attribute["Ultra_AllDamageResistancePenetration"] = 0.2
def extra_ability(self):
self.extra_ability_attribute["AttackAddedRatio"] = 0.45
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
attribute_bonus["AllDamageAddedRatio"] = (
attribute_bonus.get("AllDamageAddedRatio", 0) + 0.9
)
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
if self.avatar_rank >= 6:
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
else:
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damagelist1[0] = damagelist1[0] * 1.6
damagelist1[1] = damagelist1[1] * 1.6
damagelist1[2] = damagelist1[2] * 1.6
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技伤害
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
if self.avatar_rank >= 6:
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
else:
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"BPSkill",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damagelist2[0] = damagelist2[0] * 1.6
damagelist2[1] = damagelist2[1] * 1.6
damagelist2[2] = damagelist2[2] * 1.6
skill_info_list.append({"name": "战技", "damagelist": damagelist2})
# 计算终结技
add_attr_bonus = copy.deepcopy(attribute_bonus)
add_attr_bonus["AllDamageResistancePenetration"] = (
add_attr_bonus.get("AllDamageResistancePenetration", 0) + 0.2
)
# 啼泽雨斩
skill_multiplier = self.Skill_num("Ultra", "Ultra_1_d")
damagelist_u_1_d = await calculate_damage(
base_attr,
add_attr_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damagelist_u_2_d = await calculate_damage(
base_attr,
add_attr_bonus,
"Ultra",
"Ultra",
self.avatar_element,
0.6,
self.avatar_level,
)
damagelist_u_1_d[0] = damagelist_u_1_d[0] * 1.6 + damagelist_u_2_d[0] * 1.6
damagelist_u_1_d[1] = damagelist_u_1_d[1] * 1.6 + damagelist_u_2_d[1] * 1.6
damagelist_u_1_d[2] = damagelist_u_1_d[2] * 1.6 + damagelist_u_2_d[2] * 1.6
skill_info_list.append({"name": "啼泽雨斩", "damagelist": damagelist_u_1_d})
# 黄泉返渡
skill_multiplier = self.Skill_num("Ultra", "Ultra_1_a")
damagelist_u_1_a = await calculate_damage(
base_attr,
add_attr_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
damagelist_u_1_a_e = await calculate_damage(
base_attr,
add_attr_bonus,
"Ultra",
"Ultra",
self.avatar_element,
0.25,
self.avatar_level,
)
damagelist_u_1_a[0] = (
damagelist_u_1_a[0] * 1.6 + (damagelist_u_1_a_e[0] * 1.6) * 6
)
damagelist_u_1_a[1] = (
damagelist_u_1_a[1] * 1.6 + (damagelist_u_1_a_e[1] * 1.6) * 6
)
damagelist_u_1_a[2] = (
damagelist_u_1_a[2] * 1.6 + (damagelist_u_1_a_e[2] * 1.6) * 6
)
skill_info_list.append({"name": "黄泉返渡", "damagelist": damagelist_u_1_a})
# 总伤害
damagelist_u = {}
damagelist_u[0] = damagelist_u_1_d[0] * 3 + damagelist_u_1_a[0]
damagelist_u[1] = damagelist_u_1_d[1] * 3 + damagelist_u_1_a[1]
damagelist_u[2] = damagelist_u_1_d[2] * 3 + damagelist_u_1_a[2]
skill_info_list.append({"name": "终结技总伤", "damagelist": damagelist_u})
return skill_info_list
class Aventurine(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 >= 1:
self.eidolon_attribute["CriticalDamageBase"] = 0.2
if self.avatar_rank >= 2:
self.eidolon_attribute["AllDamageResistancePenetration"] = 0.12
if self.avatar_rank >= 4:
self.eidolon_attribute["DefenceAddedRatio"] = 0.4
if self.avatar_rank >= 6:
self.eidolon_attribute["AllDamageAddedRatio"] = 1.5
def extra_ability(self):
pass
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 天赋增加暴击
defence = base_attr["defence"] * (
1 + attribute_bonus.get("DefenceAddedRatio", 0)
) + attribute_bonus.get("DefenceDelta", 0)
if defence > 1600:
adddefrnce = defence - 1600
Critical_Chance_Base = (defence / 100) * 0.02
Critical_Chance_Base = min(Critical_Chance_Base, 0.48)
attribute_bonus["CriticalChanceBase"] = (
attribute_bonus.get("CriticalChanceBase", 0) + Critical_Chance_Base
)
# 终结技增加暴击伤害
attribute_bonus["CriticalDamageBase"] = attribute_bonus.get(
"CriticalDamageBase", 0
) + self.Skill_num("Ultra", "Ultra_CD")
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
2,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技护盾
skill_multiplier = self.Skill_num("BPSkill", "BPSkill")
skill_num = self.Skill_num("BPSkill", "BPSkill_G")
damagelist2 = await calculate_shield(
base_attr,
attribute_bonus,
skill_multiplier,
skill_num,
)
skill_info_list.append({"name": "战技(护盾)", "damagelist": damagelist2})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist3 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
2,
)
skill_info_list.append({"name": "终结技", "damagelist": damagelist3})
duanshu = 7
if self.avatar_rank >= 4:
duanshu = 10
damagelist5 = {}
# 计算天赋追加攻击伤害
skill_multiplier = self.Skill_num("Talent", "Talent")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Talent",
"Talent",
self.avatar_element,
skill_multiplier,
self.avatar_level,
2,
)
damagelist5[0] = damagelist4[0] * duanshu
damagelist5[1] = damagelist4[1] * duanshu
damagelist5[2] = damagelist4[2] * duanshu
skill_info_list.append({"name": "单层【盲注】追击", "damagelist": damagelist4})
skill_info_list.append({"name": "满层【盲注】追击", "damagelist": damagelist5})
return skill_info_list
class Gallagher(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.eidolon_attribute["BreakDamageAddedRatioBase"] = 0.2
def extra_ability(self):
pass
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 使自身提供的治疗量提高, 提高数值等同于击破特攻的50%, 最多使提供的治疗量提高75%
Break_Damage_Added_Ratio_Base = attribute_bonus.get(
"BreakDamageAddedRatioBase", 0
)
Heal_Ratio_Base = Break_Damage_Added_Ratio_Base * 0.5
Heal_Ratio_Base = min(0.75, Heal_Ratio_Base)
attribute_bonus["HealRatioBase"] = (
attribute_bonus.get("HealRatioBase", 0) + Heal_Ratio_Base
)
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算强化普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal1")
damagelist2 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal1",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "强化普攻", "damagelist": damagelist2})
# 计算战技治疗量
skill_num = self.Skill_num("BPSkill", "BPSkill")
damagelist3 = await calculate_heal(
base_attr,
attribute_bonus,
"BPSkill",
0,
skill_num,
)
skill_info_list.append({"name": "战技治疗量", "damagelist": damagelist3})
# 计算终结技伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
damagelist4 = await calculate_damage(
base_attr,
attribute_bonus,
"Ultra",
"Ultra",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "结技", "damagelist": damagelist4})
# 计算天赋治疗量
skill_num = self.Skill_num("Talent", "Talent")
damagelist5 = await calculate_heal(
base_attr,
attribute_bonus,
"Talent",
0,
skill_num,
)
skill_info_list.append({"name": "天赋治疗量", "damagelist": damagelist5})
return skill_info_list
class Robin(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 >= 1:
self.eidolon_attribute["AllDamageResistancePenetration"] = 0.24
def extra_ability(self):
self.extra_ability_attribute["Talent_CriticalDamageBase"] = 0.25
async def getdamage(
self,
base_attr: Dict[str, float],
attribute_bonus: Dict[str, float],
):
# 战技伤害加成
all_damage_added_ratio = attribute_bonus.get("AllDamageAddedRatio", 0)
attribute_bonus["AllDamageAddedRatio"] = (
all_damage_added_ratio + self.Skill_num("BPSkill", "BPSkill")
)
# 终结技攻击加成计算
attack = base_attr["attack"] * (
1 + attribute_bonus.get("AttackAddedRatio", 0)
) + attribute_bonus.get("AttackDelta", 0)
add_attack = (attack * self.Skill_num("Ultra", "Ultra_A")) + self.Skill_num(
"Ultra", "Ultra_G"
)
attribute_bonus["AttackDelta"] = (
attribute_bonus.get("AttackDelta", 0) + add_attack
)
# 天赋爆伤加成
Critical_Damage_Base = attribute_bonus.get("CriticalDamageBase", 0)
attribute_bonus["CriticalDamageBase"] = Critical_Damage_Base + self.Skill_num(
"Talent", "Talent"
)
skill_info_list = []
# 计算普攻伤害
skill_multiplier = self.Skill_num("Normal", "Normal")
damagelist1 = await calculate_damage(
base_attr,
attribute_bonus,
"Normal",
"Normal",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "普攻", "damagelist": damagelist1})
# 计算战技治疗量
skill_num = self.Skill_num("BPSkill", "BPSkill")
damagelist2 = {}
damagelist2[0] = add_attack
skill_info_list.append({"name": "终结技攻击提高", "damagelist": damagelist2})
# 计算追击伤害
skill_multiplier = self.Skill_num("Ultra", "Ultra")
add_attr_bonus = copy.deepcopy(attribute_bonus)
add_attr_bonus["CriticalDamageBase"] = 1
add_attr_bonus["CriticalChanceBase"] = 0.95
if self.avatar_rank >= 6:
add_attr_bonus["CriticalDamageBase"] = 5.5
damagelist4 = await calculate_damage(
base_attr,
add_attr_bonus,
"fujia",
"fujia",
self.avatar_element,
skill_multiplier,
self.avatar_level,
)
skill_info_list.append({"name": "【协奏】附加伤害", "damagelist": damagelist4})
return skill_info_list
class AvatarDamage:
@classmethod
def create(cls, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill]):
if char.id_ == 1214:
return XueYi(char, skills)
if char.id_ == 1306:
return Sparkle(char, skills)
if char.id_ == 1308:
return Acheron(char, skills)
if char.id_ == 1309:
return Robin(char, skills)
if char.id_ == 1303:
return RuanMei(char, skills)
if char.id_ == 1304:
return Aventurine(char, skills)
if char.id_ == 1301:
return Gallagher(char, skills)
if char.id_ == 1307:
return BlackSwan(char, skills)
if char.id_ == 1305:
return DrRatio(char, skills)
if char.id_ == 1215:
return Hanya(char, skills)
if char.id_ == 1217:
return Huohuo(char, skills)
if char.id_ == 8003 or char.id_ == 8004:
return Trailblazer_K(char, skills)
if char.id_ == 8002 or char.id_ == 8001:
return Trailblazer(char, skills)
if char.id_ == 1202:
return Tingyun(char, skills)
if char.id_ == 1109:
return Hook(char, skills)
if char.id_ == 1108:
return Sampo(char, skills)
if char.id_ == 1106:
return Pela(char, skills)
if char.id_ == 1103:
return Serval(char, skills)
if char.id_ == 1013:
return Herta(char, skills)
if char.id_ == 1009:
return Asta(char, skills)
if char.id_ == 1008:
return Arlan(char, skills)
if char.id_ == 1002:
return DanHeng(char, skills)
if char.id_ == 1111:
return Luka(char, skills)
if char.id_ == 1206:
return Sushang(char, skills)
if char.id_ == 1101:
return Bronya(char, skills)
if char.id_ == 1207:
return Yukong(char, skills)
if char.id_ == 1001:
return Mar7th(char, skills)
if char.id_ == 1105:
return Natasha(char, skills)
if char.id_ == 1110:
return Lynx(char, skills)
if char.id_ == 1211:
return Bailu(char, skills)
if char.id_ == 1203:
return Luocha(char, skills)
if char.id_ == 1210:
return Guinaifen(char, skills)
if char.id_ == 1302:
return Argenti(char, skills)
if char.id_ == 1112:
return Topaz(char, skills)
if char.id_ == 1104:
return Gepard(char, skills)
if char.id_ == 1005:
return Kafka(char, skills)
if char.id_ == 1201:
return Qingque(char, skills)
if char.id_ == 1212:
return Jingliu(char, skills)
if char.id_ == 1107:
return Clara(char, skills)
if char.id_ == 1205:
return Blade(char, skills)
if char.id_ == 1003:
return Himeko(char, skills)
if char.id_ == 1209:
return Yanqing(char, skills)
if char.id_ == 1102:
return Seele(char, skills)
if char.id_ == 1208:
return Fuxuan(char, skills)
if char.id_ == 1006:
return Silverwolf(char, skills)
if char.id_ == 1204:
return JingYuan(char, skills)
if char.id_ == 1004:
return Welt(char, skills)
if char.id_ == 1213:
return Danhengil(char, skills)
msg = "不支持的角色"
raise ValueError(msg)