mirror of
https://github.com/PaiGramTeam/StarRailDamageCal.git
synced 2024-11-28 10:16:36 +00:00
791 lines
26 KiB
Python
791 lines
26 KiB
Python
|
from collections import Counter
|
||
|
from typing import Dict, List, Union
|
||
|
|
||
|
from starrail_damage_cal.damage.Base.model import DamageInstanceRelic
|
||
|
from starrail_damage_cal.damage.Base.RelicBase import BaseRelicSetSkill, SingleRelic
|
||
|
from starrail_damage_cal.damage.utils import merge_attribute
|
||
|
from starrail_damage_cal.logger import logger
|
||
|
|
||
|
|
||
|
class Relic101(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""在战斗开始时"""
|
||
|
logger.info("Relic101 check success")
|
||
|
return True
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces4 and await self.check(base_attr, attribute_bonus):
|
||
|
pass
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic102(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""无"""
|
||
|
logger.info("Relic102 check success")
|
||
|
return True
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces4 and await self.check(base_attr, attribute_bonus):
|
||
|
a_dmg = attribute_bonus.get("NormalDmgAdd", 0)
|
||
|
attribute_bonus["NormalDmgAdd"] = a_dmg + 0.10000000018626451
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic103(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""战斗中生效:装备者提供的护盾量提高."""
|
||
|
logger.info("Relic103 check success")
|
||
|
return True
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces4 and await self.check(base_attr, attribute_bonus):
|
||
|
shield_added_ratio = attribute_bonus.get("shield_added_ratio", 0)
|
||
|
attribute_bonus["shield_added_ratio"] = (
|
||
|
shield_added_ratio + 0.20000000018626451
|
||
|
)
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic104(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""装备者施放终结技."""
|
||
|
logger.info("Relic104 check success")
|
||
|
return True
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces4 and await self.check(base_attr, attribute_bonus):
|
||
|
critical_damage_base = attribute_bonus.get("CriticalDamageBase", 0)
|
||
|
attribute_bonus["CriticalDamageBase"] = (
|
||
|
critical_damage_base + 0.25000000023283064
|
||
|
)
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic105(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""施放攻击或受到攻击时, 默认叠满."""
|
||
|
logger.info("Relic105 check success")
|
||
|
return True
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces4 and await self.check(base_attr, attribute_bonus):
|
||
|
attack_added_ratio = attribute_bonus.get("AttackAddedRatio", 0)
|
||
|
attribute_bonus["AttackAddedRatio"] = (
|
||
|
attack_added_ratio + 0.05000000004656613 * 5
|
||
|
)
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic106(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""无."""
|
||
|
logger.info("Relic106 check success")
|
||
|
return True
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces4 and await self.check(base_attr, attribute_bonus):
|
||
|
pass
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic107(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""TODO: 检查是否是火属性伤害."""
|
||
|
logger.info("Relic107 check success")
|
||
|
return True
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces4:
|
||
|
e_dmg = attribute_bonus.get("BPSkillDmgAdd", 0)
|
||
|
attribute_bonus["BPSkillDmgAdd"] = e_dmg + 0.12000000011175871
|
||
|
if self.pieces4 and await self.check(base_attr, attribute_bonus):
|
||
|
fire_added_ratio = attribute_bonus.get("FireAddedRatio", 0)
|
||
|
attribute_bonus["FireAddedRatio"] = fire_added_ratio + 0.12000000011175871
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic108(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""装备者对敌方目标造成伤害
|
||
|
目标拥有量子属性弱点
|
||
|
"""
|
||
|
logger.info("Relic108 check success")
|
||
|
return True
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces4 and await self.check(base_attr, attribute_bonus):
|
||
|
logger.info(attribute_bonus)
|
||
|
ignore_defence = attribute_bonus.get("ignore_defence", 0)
|
||
|
attribute_bonus["ignore_defence"] = ignore_defence + 0.10000000009313226 * 2
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic109(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""TODO: 检查是否释放战技"""
|
||
|
logger.info("Relic109 check success")
|
||
|
return True
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces4 and await self.check(base_attr, attribute_bonus):
|
||
|
logger.info(attribute_bonus)
|
||
|
attack_added_ratio = attribute_bonus.get("AttackAddedRatio", 0)
|
||
|
attribute_bonus["AttackAddedRatio"] = (
|
||
|
attack_added_ratio + 0.20000000018626451
|
||
|
)
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic110(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""装备者施放终结技"""
|
||
|
logger.info("Relic110 check success")
|
||
|
return True
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces4 and await self.check(base_attr, attribute_bonus):
|
||
|
logger.info("ModifyActionDelay")
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic111(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
self._count = count
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""装备者击破敌方目标弱点"""
|
||
|
logger.info("Relic111 check success")
|
||
|
return True
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces4 and await self.check(base_attr, attribute_bonus):
|
||
|
logger.info("ModifySPNew")
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic112(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
self._count = count
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""装备者对陷入负面效果的敌方目标造成伤害
|
||
|
对陷入禁锢状态的敌方目标造成伤害
|
||
|
"""
|
||
|
logger.info("Relic111 check success")
|
||
|
return True
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces4 and await self.check(base_attr, attribute_bonus):
|
||
|
logger.info("对陷入负面效果的敌方目标造成伤害")
|
||
|
critical_chance_base = attribute_bonus.get("CriticalChanceBase", 0)
|
||
|
attribute_bonus["CriticalChanceBase"] = (
|
||
|
critical_chance_base + 0.10000000009313226
|
||
|
)
|
||
|
if self.pieces4 and await self.check(base_attr, attribute_bonus):
|
||
|
logger.info("对陷入禁锢状态的敌方目标造成伤害")
|
||
|
critical_damage_base = attribute_bonus.get("CriticalDamageBase", 0)
|
||
|
attribute_bonus["CriticalDamageBase"] = (
|
||
|
critical_damage_base + 0.20000000018626451
|
||
|
)
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic113(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
self._count = count
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""当装备者受到攻击或被我方目标消耗生命值后, 暴击率提高8%, 持续2回合, 该效果最多叠加2层。"""
|
||
|
logger.info("Relic113 check success")
|
||
|
return True
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces4 and await self.check(base_attr, attribute_bonus):
|
||
|
logger.info("当装备者受到攻击或被我方目标消耗生命值后")
|
||
|
critical_chance_base = attribute_bonus.get("CriticalChanceBase", 0)
|
||
|
attribute_bonus["CriticalChanceBase"] = (
|
||
|
critical_chance_base + 0.08000000009313226 * 2
|
||
|
)
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic114(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
self._count = count
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""当装备者对我方目标施放终结技时, 我方全体速度提高12%, 持续1回合, 该效果无法叠加。"""
|
||
|
logger.info("Relic114 check success")
|
||
|
return True
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces4 and await self.check(base_attr, attribute_bonus):
|
||
|
speed_added_ratio = attribute_bonus.get("SpeedAddedRatio", 0)
|
||
|
attribute_bonus["SpeedAddedRatio"] = speed_added_ratio + 0.12000000011175871
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic301(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""装备者的速度大于等于120"""
|
||
|
merged_attr = await merge_attribute(base_attr, attribute_bonus)
|
||
|
if merged_attr["speed"] >= 120:
|
||
|
logger.info("Relic306 check success")
|
||
|
return True
|
||
|
return False
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces2 and await self.check(base_attr, attribute_bonus):
|
||
|
attack_added_ratio = attribute_bonus.get("AttackAddedRatio", 0)
|
||
|
attribute_bonus["AttackAddedRatio"] = (
|
||
|
attack_added_ratio + 0.12000000011175871
|
||
|
)
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic302(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""装备者的速度大于等于120"""
|
||
|
merged_attr = await merge_attribute(base_attr, attribute_bonus)
|
||
|
if merged_attr["speed"] >= 120:
|
||
|
logger.info("Relic306 check success")
|
||
|
return True
|
||
|
return False
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces2 and await self.check(base_attr, attribute_bonus):
|
||
|
attack_added_ratio = attribute_bonus.get("AttackAddedRatio", 0)
|
||
|
attribute_bonus["AttackAddedRatio"] = (
|
||
|
attack_added_ratio + 0.0800000000745058
|
||
|
)
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic303(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
# 提高装备者等同于当前效果命中25%的攻击力,最多提高25%
|
||
|
return True
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces2 and await self.check(base_attr, attribute_bonus):
|
||
|
attack_added_ratio = attribute_bonus.get("AttackAddedRatio", 0)
|
||
|
merged_attr = await merge_attribute(base_attr, attribute_bonus)
|
||
|
status_probability = merged_attr.get("StatusProbabilityBase", 0)
|
||
|
# 提高装备者等同于当前效果命中25%的攻击力,最多提高25%
|
||
|
attribute_bonus["AttackAddedRatio"] = attack_added_ratio + min(
|
||
|
0.25000000023283064,
|
||
|
status_probability / 0.25,
|
||
|
)
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic304(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""备者的效果命中大于等于50%"""
|
||
|
merged_attr = await merge_attribute(base_attr, attribute_bonus)
|
||
|
if merged_attr["StatusResistanceBase"] >= 0.5000000004656613:
|
||
|
logger.info("Relic306 check success")
|
||
|
return True
|
||
|
return False
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces2 and await self.check(base_attr, attribute_bonus):
|
||
|
defence_added_ratio = attribute_bonus.get("DefenceAddedRatio", 0)
|
||
|
attribute_bonus["DefenceAddedRatio"] = (
|
||
|
defence_added_ratio + 0.1500000001396984
|
||
|
)
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic305(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""装备者的暴击伤害大于等于120%"""
|
||
|
merged_attr = await merge_attribute(base_attr, attribute_bonus)
|
||
|
if merged_attr["CriticalDamageBase"] >= 1.2000000001862645:
|
||
|
logger.info("Relic306 check success")
|
||
|
return True
|
||
|
return False
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces2 and await self.check(base_attr, attribute_bonus):
|
||
|
critical_chance_base = attribute_bonus.get("CriticalChanceBase", 0)
|
||
|
attribute_bonus["CriticalChanceBase"] = (
|
||
|
critical_chance_base + 0.6000000005587935
|
||
|
)
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic306(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""装备者当前暴击率大于等于50%"""
|
||
|
merged_attr = await merge_attribute(base_attr, attribute_bonus)
|
||
|
if merged_attr["CriticalChanceBase"] >= 0.5:
|
||
|
logger.info("Relic306 check success")
|
||
|
return True
|
||
|
return False
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces2 and await self.check(base_attr, attribute_bonus):
|
||
|
q_dmg = attribute_bonus.get("UltraDmgAdd", 0)
|
||
|
attribute_bonus["UltraDmgAdd"] = q_dmg + 0.1500000001396984
|
||
|
a3_dmg = attribute_bonus.get("TalentDmgAdd", 0)
|
||
|
attribute_bonus["TalentDmgAdd"] = a3_dmg + 0.1500000001396984
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic307(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""装备者的速度大于等于145"""
|
||
|
merged_attr = await merge_attribute(base_attr, attribute_bonus)
|
||
|
if merged_attr["speed"] >= 145:
|
||
|
logger.info("Relic306 check success")
|
||
|
return True
|
||
|
return False
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces2 and await self.check(base_attr, attribute_bonus):
|
||
|
break_damage_added_ratio_base = attribute_bonus.get(
|
||
|
"BreakDamageAddedRatioBase",
|
||
|
0,
|
||
|
)
|
||
|
attribute_bonus["BreakDamageAddedRatioBase"] = (
|
||
|
break_damage_added_ratio_base + 0.20000000018626451
|
||
|
)
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic308(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""装备者的速度大于等于120"""
|
||
|
merged_attr = await merge_attribute(base_attr, attribute_bonus)
|
||
|
if merged_attr["speed"] >= 120:
|
||
|
logger.info("Relic306 check success")
|
||
|
return True
|
||
|
return False
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces2 and await self.check(base_attr, attribute_bonus):
|
||
|
logger.info("ModifyActionDelay")
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic309(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""当装备者的当前暴击率大于等于70%时, 普攻和战技造成的伤害提高20%。"""
|
||
|
merged_attr = await merge_attribute(base_attr, attribute_bonus)
|
||
|
if merged_attr["CriticalChanceBase"] >= 0.7:
|
||
|
logger.info("Relic309 check success")
|
||
|
return True
|
||
|
return False
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces2 and await self.check(base_attr, attribute_bonus):
|
||
|
a_dmg = attribute_bonus.get("NormalDmgAdd", 0)
|
||
|
attribute_bonus["NormalDmgAdd"] = a_dmg + 0.20000000018626451
|
||
|
a2_dmg = attribute_bonus.get("BPSkillDmgAdd", 0)
|
||
|
attribute_bonus["BPSkillDmgAdd"] = a2_dmg + 0.20000000018626451
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class Relic310(BaseRelicSetSkill):
|
||
|
def __init__(self, set_id: int, count: int):
|
||
|
super().__init__(set_id, count)
|
||
|
|
||
|
async def check(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
"""当装备者的效果抵抗大于等于30%时, 我方全体暴击伤害提高10%。"""
|
||
|
merged_attr = await merge_attribute(base_attr, attribute_bonus)
|
||
|
if merged_attr["StatusResistanceBase"] >= 0.3:
|
||
|
logger.info("Relic310 check success")
|
||
|
return True
|
||
|
return False
|
||
|
|
||
|
async def set_skill_ability(
|
||
|
self,
|
||
|
base_attr: Dict[str, float],
|
||
|
attribute_bonus: Dict[str, float],
|
||
|
):
|
||
|
if self.pieces2 and await self.check(base_attr, attribute_bonus):
|
||
|
critical_damage_base = attribute_bonus.get("CriticalDamageBase", 0)
|
||
|
attribute_bonus["CriticalDamageBase"] = (
|
||
|
critical_damage_base + 0.10000000018626451
|
||
|
)
|
||
|
return attribute_bonus
|
||
|
|
||
|
|
||
|
class RelicSet:
|
||
|
HEAD: SingleRelic
|
||
|
HAND: SingleRelic
|
||
|
BODY: SingleRelic
|
||
|
FOOT: SingleRelic
|
||
|
NECK: SingleRelic
|
||
|
OBJECT: SingleRelic
|
||
|
Unknow: SingleRelic
|
||
|
|
||
|
SetSkill: List[
|
||
|
Union[
|
||
|
Relic101,
|
||
|
Relic102,
|
||
|
Relic103,
|
||
|
Relic104,
|
||
|
Relic105,
|
||
|
Relic106,
|
||
|
Relic107,
|
||
|
Relic108,
|
||
|
Relic109,
|
||
|
Relic110,
|
||
|
Relic111,
|
||
|
Relic112,
|
||
|
Relic113,
|
||
|
Relic114,
|
||
|
Relic301,
|
||
|
Relic302,
|
||
|
Relic303,
|
||
|
Relic304,
|
||
|
Relic305,
|
||
|
Relic306,
|
||
|
Relic307,
|
||
|
Relic308,
|
||
|
Relic309,
|
||
|
Relic310,
|
||
|
]
|
||
|
]
|
||
|
|
||
|
def create(self, relic_list: List[DamageInstanceRelic]):
|
||
|
set_id_list: List[int] = []
|
||
|
for relic in relic_list:
|
||
|
set_id_list.append(relic.SetId)
|
||
|
|
||
|
if relic.Type == 1:
|
||
|
self.HEAD = SingleRelic(relic)
|
||
|
elif relic.Type == 2:
|
||
|
self.HAND = SingleRelic(relic)
|
||
|
elif relic.Type == 3:
|
||
|
self.BODY = SingleRelic(relic)
|
||
|
elif relic.Type == 4:
|
||
|
self.FOOT = SingleRelic(relic)
|
||
|
elif relic.Type == 5:
|
||
|
self.NECK = SingleRelic(relic)
|
||
|
elif relic.Type == 6:
|
||
|
self.OBJECT = SingleRelic(relic)
|
||
|
else:
|
||
|
self.Unknow = SingleRelic(relic)
|
||
|
|
||
|
self.set_id_counter = Counter(set_id_list).most_common()
|
||
|
self.check_set()
|
||
|
self.get_attribute()
|
||
|
return self
|
||
|
|
||
|
def get_attribute(self):
|
||
|
for item in self.__dict__:
|
||
|
if type(self.__dict__[item]) == SingleRelic:
|
||
|
itme__: SingleRelic = self.__dict__[item]
|
||
|
itme__.get_attribute_()
|
||
|
|
||
|
def check_set(self):
|
||
|
self.SetSkill = []
|
||
|
for item in self.set_id_counter:
|
||
|
set_id = item[0]
|
||
|
count = item[1]
|
||
|
|
||
|
if set_id == 101:
|
||
|
self.SetSkill.append(Relic101(set_id, count))
|
||
|
elif set_id == 102:
|
||
|
self.SetSkill.append(Relic102(set_id, count))
|
||
|
elif set_id == 103:
|
||
|
self.SetSkill.append(Relic103(set_id, count))
|
||
|
elif set_id == 104:
|
||
|
self.SetSkill.append(Relic104(set_id, count))
|
||
|
elif set_id == 105:
|
||
|
self.SetSkill.append(Relic105(set_id, count))
|
||
|
elif set_id == 106:
|
||
|
self.SetSkill.append(Relic106(set_id, count))
|
||
|
elif set_id == 107:
|
||
|
self.SetSkill.append(Relic107(set_id, count))
|
||
|
elif set_id == 108:
|
||
|
self.SetSkill.append(Relic108(set_id, count))
|
||
|
elif set_id == 109:
|
||
|
self.SetSkill.append(Relic109(set_id, count))
|
||
|
elif set_id == 110:
|
||
|
self.SetSkill.append(Relic110(set_id, count))
|
||
|
elif set_id == 111:
|
||
|
self.SetSkill.append(Relic111(set_id, count))
|
||
|
elif set_id == 112:
|
||
|
self.SetSkill.append(Relic112(set_id, count))
|
||
|
elif set_id == 113:
|
||
|
self.SetSkill.append(Relic113(set_id, count))
|
||
|
elif set_id == 114:
|
||
|
self.SetSkill.append(Relic114(set_id, count))
|
||
|
elif set_id == 301:
|
||
|
self.SetSkill.append(Relic301(set_id, count))
|
||
|
elif set_id == 302:
|
||
|
self.SetSkill.append(Relic302(set_id, count))
|
||
|
elif set_id == 303:
|
||
|
self.SetSkill.append(Relic303(set_id, count))
|
||
|
elif set_id == 304:
|
||
|
self.SetSkill.append(Relic304(set_id, count))
|
||
|
elif set_id == 305:
|
||
|
self.SetSkill.append(Relic305(set_id, count))
|
||
|
elif set_id == 306:
|
||
|
self.SetSkill.append(Relic306(set_id, count))
|
||
|
elif set_id == 307:
|
||
|
self.SetSkill.append(Relic307(set_id, count))
|
||
|
elif set_id == 308:
|
||
|
self.SetSkill.append(Relic308(set_id, count))
|
||
|
elif set_id == 309:
|
||
|
self.SetSkill.append(Relic309(set_id, count))
|
||
|
elif set_id == 310:
|
||
|
self.SetSkill.append(Relic310(set_id, count))
|
||
|
else:
|
||
|
msg = f"Unknow SetId: {set_id}"
|
||
|
raise ValueError(msg)
|