重构伤害计算

This commit is contained in:
a376148946 2023-10-05 13:28:09 +08:00 committed by qwerdvd
parent 1322c0780c
commit fec83e38d5
20 changed files with 5031 additions and 36 deletions

View File

@ -13,44 +13,14 @@ from ..utils.sr_prefix import PREFIX
from ..utils.error_reply import UID_HINT
from .get_char_img import draw_char_info_img
from ..utils.image.convert import convert_img
from .draw_char_img import cal, get_char_data
from .draw_char_img import get_char_data
from .cal_damage import cal_info
from ..utils.resource.RESOURCE_PATH import TEMP_PATH
sv_char_info_config = SV('sr面板设置', pm=2)
sv_get_char_info = SV('sr面板查询', priority=10)
sv_get_sr_original_pic = SV('sr查看面板原图', priority=5)
sv_char_damage_cal = SV('sr伤害计算')
sv_group_damage_cal = SV('sr伤害计算')
@sv_group_damage_cal.on_prefix(f'{PREFIX}队伍伤害')
async def send_group_damage_msg(bot: Bot, ev: Event):
msg = ''.join(re.findall('[\u4e00-\u9fa5 ]', ev.text))
if not msg:
return None
await bot.logger.info('开始执行[队伍伤害计算]')
# 获取uid
sr_uid = await get_uid(bot, ev)
if sr_uid is None:
return await bot.send(UID_HINT)
await bot.logger.info(f'[队伍伤害计算]uid: {sr_uid}')
char_name = ' '.join(re.findall('[\u4e00-\u9fa5]+', msg))
char_list = char_name.split()
char_data_list = []
for char_name in char_list:
char_data = await get_char_data(sr_uid, char_name)
if isinstance(char_data, str):
return await bot.send(char_data)
char_data_list.append(char_data)
im_list = []
# im = await cal_group(char_data_list)
# for info_im in im:
# con = f'{info_im[0]} 暴击伤害: {info_im[1]}'
# con = f'{con} 期望伤害{info_im[2]} 满配辅助末日兽伤害{info_im[3]}'
# im_list.append(con)
await bot.send(im_list)
return None
@sv_char_damage_cal.on_prefix(f'{PREFIX}伤害计算')
async def send_damage_msg(bot: Bot, ev: Event):
@ -69,10 +39,10 @@ async def send_damage_msg(bot: Bot, ev: Event):
if isinstance(char_data, str):
return await bot.send(char_data)
im_list = []
im = await cal(char_data)
im = await cal_info(char_data)
for info_im in im:
con = f'{info_im[0]} 暴击伤害: {info_im[1]}'
con = f'{con} 期望伤害{info_im[2]} 满配辅助末日兽伤害{info_im[3]}'
con = f"{info_im['name']}"
con = f"{con} 暴击伤害{info_im['damagelist'][0]} 期望伤害{info_im['damagelist'][1]} 满配辅助末日兽伤害{info_im['damagelist'][2]}"
im_list.append(con)
await bot.send(im_list)
return None

View File

@ -4,6 +4,7 @@ from typing import Dict, List, Union
from .effect.Role import RoleInstance
from .mono.Character import Character
from .damage.Avatar import AvatarInstance
Excel_path = Path(__file__).parent / 'effect'
with Path.open(Excel_path / 'Excel' / 'SkillData.json', encoding='utf-8') as f:
@ -31,3 +32,9 @@ async def cal(char_data: Dict):
skill_info_list.append(im_tmp)
return skill_info_list
return '角色伤害计算未完成'
async def cal_info(char_data: Dict):
char = await cal_char_info(char_data)
avatar = AvatarInstance(char)
skill_info_list = await avatar.gat_damage()
return skill_info_list

View File

@ -0,0 +1,152 @@
import json
from pathlib import Path
from typing import List, Union
from gsuid_core.logger import logger
from .Base.AvatarBase import BaseAvatarinfo
from .AvatarDamage.AvatarDamage import AvatarDamage
from .Weapon.Weapon import Weapon
from .utils import merge_attribute
from ..mono.Character import Character
from .Base.model import DamageInstance
from .Relic.Relic import RelicSet, SingleRelic
Excel_path = Path(__file__).parent
with Path.open(Excel_path / 'Excel' / 'SkillData.json', encoding='utf-8') as f:
skill_dict = json.load(f)
class AvatarInstance:
def __init__(self, raw_data: Character):
self.raw_data = DamageInstance(raw_data)
self.avatardamage = AvatarDamage.create(self.raw_data.avatar, self.raw_data.skill)
self.avatar = BaseAvatarinfo(self.raw_data.avatar)
self.weapon = Weapon.create(self.raw_data.weapon)
self.relic_set = RelicSet().create(self.raw_data.relic)
self.base_attr = self.cal_role_base_attr()
self.attribute_bonus: dict[str, float] = {}
self.cal_relic_attr_add()
self.cal_avatar_attr_add()
self.cal_avatar_eidolon_add()
self.cal_weapon_attr_add()
def cal_role_base_attr(self):
logger.info('cal_role_base_attr')
base_attr: dict[str, float] = {}
avatar_attribute = self.avatar.avatar_attribute
for attr_name, attr_value in avatar_attribute.items():
if attr_name in base_attr:
base_attr[attr_name] += attr_value
else:
base_attr[attr_name] = attr_value
weapon_attribute = self.weapon.weapon_base_attribute
for attr_name, attr_value in weapon_attribute.items():
if attr_name in base_attr:
base_attr[attr_name] += attr_value
else:
base_attr[attr_name] = attr_value
return base_attr
def cal_relic_attr_add(self):
# 单件属性
for relic_type in self.relic_set.__dict__:
if type(self.relic_set.__dict__[relic_type]) == SingleRelic:
relic: SingleRelic = self.relic_set.__dict__[relic_type]
for attribute in relic.relic_attribute_bonus:
if attribute in self.attribute_bonus:
self.attribute_bonus[
attribute
] += relic.relic_attribute_bonus[attribute]
else:
self.attribute_bonus[
attribute
] = relic.relic_attribute_bonus[attribute]
# 套装面板加成属性
for set_skill in self.relic_set.SetSkill:
for attribute in set_skill.relicSetAttribute:
if attribute in self.attribute_bonus:
self.attribute_bonus[
attribute
] += set_skill.relicSetAttribute[attribute]
else:
self.attribute_bonus[
attribute
] = set_skill.relicSetAttribute[attribute]
def cal_avatar_eidolon_add(self):
for attribute in self.avatardamage.eidolon_attribute:
if attribute in self.attribute_bonus:
self.attribute_bonus[
attribute
] += self.avatardamage.eidolon_attribute[attribute]
else:
self.attribute_bonus[
attribute
] = self.avatardamage.eidolon_attribute[attribute]
for attribute in self.avatardamage.extra_ability_attribute:
if attribute in self.attribute_bonus:
self.attribute_bonus[
attribute
] += self.avatardamage.extra_ability_attribute[attribute]
else:
self.attribute_bonus[
attribute
] = self.avatardamage.extra_ability_attribute[attribute]
def cal_avatar_attr_add(self):
attribute_bonus = self.avatar.avatar_attribute_bonus
if attribute_bonus:
for bonus in attribute_bonus:
status_add = bonus.statusAdd
bonus_property = status_add.property
value = status_add.value
if bonus_property in self.attribute_bonus:
self.attribute_bonus[bonus_property] += value
else:
self.attribute_bonus[bonus_property] = value
def cal_weapon_attr_add(self):
for attribute in self.weapon.weapon_attribute:
if attribute in self.attribute_bonus:
self.attribute_bonus[
attribute
] += self.weapon.weapon_attribute[attribute]
else:
self.attribute_bonus[attribute] = self.weapon.weapon_attribute[
attribute
]
async def gat_damage(self):
logger.info('base_attr')
logger.info(self.base_attr)
logger.info('attribute_bonus')
logger.info(self.attribute_bonus)
logger.info('检查武器战斗生效的buff')
Ultra_Use = self.avatar.Ultra_Use()
logger.info('Ultra_Use')
logger.info(Ultra_Use)
self.attribute_bonus = await self.weapon.weapon_ability(
Ultra_Use, self.base_attr, self.attribute_bonus
)
logger.info(self.attribute_bonus)
logger.info('检查遗器套装战斗生效的buff')
for set_skill in self.relic_set.SetSkill:
self.attribute_bonus = await set_skill.set_skill_ability(
self.base_attr, self.attribute_bonus
)
if self.attribute_bonus is None:
raise Exception('attribute_bonus is None')
logger.info(self.attribute_bonus)
return await self.avatardamage.getdamage(self.base_attr, self.attribute_bonus)

View File

@ -0,0 +1,214 @@
from typing import Dict, List
import json
from pathlib import Path
import copy
from gsuid_core.logger import logger
from ..Base.model import DamageInstanceSkill, DamageInstanceAvatar
from ..Base.AvatarBase import BaseAvatar, BaseAvatarBuff
from ..Role import demage_num
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 demage_num(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 demage_num(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 demage_num(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 demage_num(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 demage_num(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 demage_num(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 demage_num(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 demage_num(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 demage_num(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 demage_num(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 demage_num(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 demage_num(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 demage_num(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 AvatarDamage:
@classmethod
def create(
cls, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill]
):
if char.id_ == 1102:
return Seele(char, skills)
if char.id_ == 1204:
return JingYuan(char, skills)
if char.id_ == 1004:
return Welt(char, skills)
raise Exception('不支持的角色')

View File

@ -0,0 +1,171 @@
import json
from pathlib import Path
from abc import abstractmethod
from typing import List, Union
import msgspec
from msgspec import Struct
from .SkillBase import BaseSkills
from ....utils.excel.model import AvatarPromotionConfig
from .model import DamageInstanceSkill, DamageInstanceAvatar
path = Path(__file__).parent.parent
with Path.open(path / 'Excel' / 'SkillData.json', encoding='utf-8') as f:
skill_dict = json.load(f)
class BaseAvatarAttribute(Struct):
attack: float
defence: float
hp: float
speed: float
CriticalChanceBase: float
CriticalDamageBase: float
BaseAggro: float
def items(self):
return [
('attack', self.attack),
('defence', self.defence),
('hp', self.hp),
('speed', self.speed),
('CriticalChanceBase', self.CriticalChanceBase),
('CriticalDamageBase', self.CriticalDamageBase),
('BaseAggro', self.BaseAggro),
]
class BaseAvatarBuff:
@classmethod
def create(
cls, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill]
):
cls.extra_ability_id = []
if char.extra_ability:
for extra_ability in char.extra_ability:
cls.extra_ability_id.append(extra_ability['extraAbilityId'])
return cls
@abstractmethod
async def Technique(self):
...
@abstractmethod
async def eidolons(self):
...
@abstractmethod
async def extra_ability(self):
...
class BaseAvatarinfo:
def __init__(
self, char: DamageInstanceAvatar
):
self.avatar_id = char.id_
self.avatar_level = char.level
self.avatar_rank = char.rank
self.avatar_element = char.element
self.avatar_promotion = char.promotion
self.avatar_attribute_bonus = char.attribute_bonus
self.avatar_extra_ability = char.extra_ability
self.avatar_attribute = self.get_attribute()
def get_attribute(self):
promotion = AvatarPromotionConfig.Avatar[str(self.avatar_id)][
str(self.avatar_promotion)
]
return BaseAvatarAttribute(
# 攻击力
attack=(
promotion.AttackBase.Value
+ promotion.AttackAdd.Value * (self.avatar_level - 1)
),
# 防御力
defence=(
promotion.DefenceBase.Value
+ promotion.DefenceAdd.Value * (self.avatar_level - 1)
),
# 血量
hp=(
promotion.HPBase.Value
+ promotion.HPAdd.Value * (self.avatar_level - 1)
),
# 速度
speed=promotion.SpeedBase.Value,
# 暴击率
CriticalChanceBase=promotion.CriticalChance.Value,
# 暴击伤害
CriticalDamageBase=promotion.CriticalDamage.Value,
# 嘲讽
BaseAggro=promotion.BaseAggro.Value,
)
def Ultra_Use(self):
skill_info = skill_dict[str(self.avatar_id)]['Ultra_Use'][0]
return msgspec.convert(skill_info, type=float)
class BaseAvatar:
def __init__(
self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill]
):
self.Skill = BaseSkills.create(char=char, skills=skills)
self.Buff = BaseAvatarBuff.create(char=char, skills=skills)
self.avatar_id = char.id_
self.avatar_level = char.level
self.avatar_rank = char.rank
self.avatar_element = char.element
self.avatar_promotion = char.promotion
self.avatar_attribute_bonus = char.attribute_bonus
self.avatar_extra_ability = char.extra_ability
self.avatar_attribute = self.get_attribute()
def get_attribute(self):
promotion = AvatarPromotionConfig.Avatar[str(self.avatar_id)][
str(self.avatar_promotion)
]
return BaseAvatarAttribute(
# 攻击力
attack=(
promotion.AttackBase.Value
+ promotion.AttackAdd.Value * (self.avatar_level - 1)
),
# 防御力
defence=(
promotion.DefenceBase.Value
+ promotion.DefenceAdd.Value * (self.avatar_level - 1)
),
# 血量
hp=(
promotion.HPBase.Value
+ promotion.HPAdd.Value * (self.avatar_level - 1)
),
# 速度
speed=promotion.SpeedBase.Value,
# 暴击率
CriticalChanceBase=promotion.CriticalChance.Value,
# 暴击伤害
CriticalDamageBase=promotion.CriticalDamage.Value,
# 嘲讽
BaseAggro=promotion.BaseAggro.Value,
)
def Skill_Info(self, skill_type: str):
skill_info = skill_dict[str(self.avatar_id)]['skillList'][skill_type]
return msgspec.convert(skill_info, type=List[Union[str, int]])
def Skill_num(self, skill: Union[str, int], skill_type: str):
skill_level = 0
if skill == 'Normal':
skill_level = self.Skill.Normal_.level - 1
if skill == 'BPSkill':
skill_level = self.Skill.BPSkill_.level - 1
if skill == 'Ultra':
skill_level = self.Skill.Ultra_.level - 1
if skill == 'Talent':
skill_level = self.Skill.Talent_.level - 1
skill_info = skill_dict[str(self.avatar_id)][skill_type][skill_level]
return msgspec.convert(skill_info, type=float)

View File

@ -0,0 +1,93 @@
from typing import Dict
from abc import abstractmethod
from gsuid_core.logger import logger
from .model import DamageInstanceRelic
from ....utils.map.SR_MAP_PATH import RelicSetSkill
class SingleRelic:
def __init__(self, relic: DamageInstanceRelic):
self.raw_relic = relic
self.relic_id = relic.relicId
self.set_id = relic.SetId
self.relic_type = relic.Type
self.relic_level = relic.Level
self.relic_attribute_bonus: Dict[str, float] = {}
def get_attribute_(self):
# MainAffix
if self.raw_relic.MainAffix.Property in self.relic_attribute_bonus:
self.relic_attribute_bonus[
self.raw_relic.MainAffix.Property
] += self.raw_relic.MainAffix.Value
else:
self.relic_attribute_bonus[
self.raw_relic.MainAffix.Property
] = self.raw_relic.MainAffix.Value
# SubAffix
if self.raw_relic.SubAffixList:
for sub_affix in self.raw_relic.SubAffixList:
sub_affix_property = sub_affix.Property
value = sub_affix.Value
if sub_affix_property in self.relic_attribute_bonus:
self.relic_attribute_bonus[sub_affix_property] += value
else:
self.relic_attribute_bonus[sub_affix_property] = value
class BaseRelicSetSkill:
setId: int
pieces2: bool = False
pieces4: bool = False
def __init__(self, set_id: int, count: int):
self.setId = set_id
if count >= 2:
self.pieces2 = True
logger.info(f'Relic {set_id} 2 pieces set activated')
if count == 4:
self.pieces4 = True
logger.info(f'Relic {set_id} 4 pieces set activated')
self.relicSetAttribute = self.set_skill_property_ability()
@abstractmethod
async def check(
self, base_attr: Dict[str, float], attribute_bonus: Dict[str, float]
):
...
@abstractmethod
async def set_skill_ability(
self, base_attr: Dict[str, float], attribute_bonus: Dict[str, float]
):
"""
战斗加成属性, set_skill_property() 互斥
"""
...
def set_skill_property_ability(self):
set_property = ''
set_value = 0
relic_set_attribute: Dict[str, float] = {}
if self.pieces2:
status_add = RelicSetSkill.RelicSet[str(self.setId)]['2']
if status_add:
set_property = status_add.Property
set_value = status_add.Value
if set_property != '':
relic_set_attribute[set_property] = (
relic_set_attribute.get(set_property, 0) + set_value
)
if self.pieces4:
status_add = RelicSetSkill.RelicSet[str(self.setId)]['4']
if status_add:
set_property = status_add.Property
set_value = status_add.Value
if set_property != '':
relic_set_attribute[set_property] = (
relic_set_attribute.get(set_property, 0) + set_value
)
return relic_set_attribute

View File

@ -0,0 +1,45 @@
import json
from typing import List
from pathlib import Path
from .model import DamageInstanceSkill, DamageInstanceAvatar
path = Path(__file__).parent.parent
with Path.open(path / 'Excel' / 'SkillData.json', encoding='utf-8') as f:
skill_dict = json.load(f)
class SingleSkill:
def __init__(self, skill: DamageInstanceSkill):
self.id = skill.skillId
self.level = skill.skillLevel
class BaseSkills:
Normal_: SingleSkill
BPSkill_: SingleSkill
Ultra_: SingleSkill
Maze_: SingleSkill
Talent_: SingleSkill
@classmethod
def create(
cls, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill]
):
for skill in skills:
skill_attack_type = skill.skillAttackType
if skill_attack_type == 'Normal':
cls.Normal_ = SingleSkill(skill)
elif skill_attack_type == 'BPSkill':
cls.BPSkill_ = SingleSkill(skill)
elif skill_attack_type == 'Ultra':
cls.Ultra_ = SingleSkill(skill)
elif skill_attack_type == 'Maze':
cls.Maze_ = SingleSkill(skill)
elif skill_attack_type == '':
cls.Talent_ = SingleSkill(skill)
else:
raise ValueError(
f'Unknown skillAttackType: {skill_attack_type}'
)
return cls

View File

@ -0,0 +1,78 @@
from typing import Dict
from abc import abstractmethod
from msgspec import Struct
from .model import DamageInstanceWeapon
from ....utils.excel.model import EquipmentPromotionConfig
from ....utils.map.SR_MAP_PATH import EquipmentID2AbilityProperty
class BaseWeaponAttribute(Struct):
hp: float
attack: float
defence: float
def items(self):
return [
('hp', self.hp),
('attack', self.attack),
('defence', self.defence),
]
class BaseWeapon:
def __init__(self, weapon: DamageInstanceWeapon):
self.weapon_id = weapon.id_
self.weapon_level = weapon.level
self.weapon_rank = weapon.rank
self.weapon_promotion = weapon.promotion
self.weapon_base_attribute = self.get_attribute()
self.weapon_attribute: Dict[str, float] = {}
self.get_attribute()
self.weapon_property_ability()
@abstractmethod
async def weapon_ability(self, base_attr: Dict, attribute_bonus: Dict):
"""
战斗加成属性, weapon_property_ability() 互斥
"""
...
def weapon_property_ability(self):
"""
面板加成属性, weapon_ability() 互斥
"""
ability_property = EquipmentID2AbilityProperty[str(self.weapon_id)]
equip_ability_property = ability_property[str(self.weapon_rank)]
for equip_ability in equip_ability_property:
property_type = equip_ability['PropertyType']
value = equip_ability['Value']['Value']
if property_type in self.weapon_attribute:
self.weapon_attribute[property_type] += value
else:
self.weapon_attribute[property_type] = value
@abstractmethod
async def check(self):
...
def get_attribute(self):
promotion = EquipmentPromotionConfig.Equipment[str(self.weapon_id)][
str(self.weapon_promotion)
]
return BaseWeaponAttribute(
hp=(
promotion.BaseHP.Value
+ promotion.BaseHPAdd.Value * (self.weapon_level - 1)
),
attack=(
promotion.BaseAttack.Value
+ promotion.BaseAttackAdd.Value * (self.weapon_level - 1)
),
defence=(
promotion.BaseDefence.Value
+ promotion.BaseDefenceAdd.Value * (self.weapon_level - 1)
),
)

View File

@ -0,0 +1,103 @@
from typing import List, Union
import msgspec
from msgspec import Struct, field
class DamageInstanceSkill(Struct):
skillId: int
skillName: str
skillEffect: str
skillAttackType: str
skillLevel: int
class DamageInstanceRelicSubAffix(Struct):
SubAffixID: int
Property: str
Name: str
Cnt: int
Step: int
Value: float
class DamageInstanceRelicMainAffix(Struct):
AffixID: int
Property: str
Name: str
Value: float
class DamageInstanceRelic(Struct):
relicId: int
relicName: str
SetId: int
SetName: str
Type: int
MainAffix: DamageInstanceRelicMainAffix
SubAffixList: Union[List[DamageInstanceRelicSubAffix], None]
Level: int = 0
class DamageInstanceWeapon(Struct):
id_: str = field(name='id')
level: int
rank: int
promotion: int
class AttributeBounsStatusAdd(Struct):
property: str
name: str
value: float
class DamageInstanceAvatarAttributeBouns(Struct):
attributeBonusId: int
attributeBonusLevel: int
statusAdd: AttributeBounsStatusAdd
class DamageInstanceAvatar(Struct):
id_: str = field(name='id')
level: int
rank: int
element: str
promotion: int
attribute_bonus: Union[List[DamageInstanceAvatarAttributeBouns], None]
extra_ability: Union[List, None]
class DamageInstance:
avatar: DamageInstanceAvatar
weapon: DamageInstanceWeapon
relic: List[DamageInstanceRelic]
skill: List[DamageInstanceSkill]
def __init__(self, char):
self.avatar = DamageInstanceAvatar(
id_=char.char_id,
level=char.char_level,
rank=char.char_rank,
element=char.char_element,
promotion=char.char_promotion,
attribute_bonus=msgspec.convert(
char.attribute_bonus,
Union[List[DamageInstanceAvatarAttributeBouns], None],
),
extra_ability=msgspec.convert(
char.extra_ability, Union[List, None]
),
)
self.weapon = DamageInstanceWeapon(
id_=char.equipment['equipmentID'],
level=char.equipment['equipmentLevel'],
rank=char.equipment['equipmentRank'],
promotion=char.equipment['equipmentPromotion'],
)
self.relic = []
for relic in char.char_relic:
self.relic.append(msgspec.convert(relic, DamageInstanceRelic))
self.skill = []
for skill in char.char_skill:
self.skill.append(msgspec.convert(skill, DamageInstanceSkill))

View File

@ -0,0 +1,695 @@
{
"1102": {
"Normal": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000001862645, 1.2000000002793968
],
"BPSkill": [
1.1000000000931323, 1.2100000001955777, 1.3200000002980232,
1.4300000004004687, 1.5400000005029142, 1.6500000006053597,
1.7875000005587935, 1.9250000005122274, 2.0625000002328306,
2.2000000001862645, 2.31000000028871, 2.4200000003911555,
2.530000000493601, 2.6400000005960464, 2.750000000698492
],
"Ultra": [
2.5500000005122274, 2.7200000006705523, 2.890000000828877,
3.0600000000558794, 3.230000000214204, 3.400000000372529,
3.612500000745058, 3.825000000419095, 4.037499999860302,
4.250000000232831, 4.4200000003911555, 4.59000000054948,
4.760000000707805, 4.93000000086613, 5.100000000093132
],
"Talent": [
0.40000000037252903, 0.44000000040978193, 0.48000000044703484,
0.5200000004842877, 0.5600000005215406, 0.6000000005587935,
0.6500000006053597, 0.7000000006519258, 0.7500000006984919,
0.8000000007450581, 0.840000000782311, 0.8800000008195639,
0.9200000008568168, 0.9600000008940697, 1
],
"Maze": [20],
"Ultra_Use": [120],
"skillList": {
"Normal": ["attack", "普攻", 1, "Normal", "Normal"],
"BPSkill": ["attack", "战技", 1, "BPSkill", "BPSkill"],
"Ultra": ["attack", "终结技", 1, "Ultra", "Ultra"]
}
},
"1204": {
"Normal": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000001862645, 1.2000000002793968
],
"BPSkill": [
0.5000000004656613, 0.5500000004656613, 0.6000000005587935,
0.6500000005587935, 0.7000000006519258, 0.7500000006519258,
0.8000000007450581, 0.8500000007450581, 0.9000000008381903,
0.9500000008381903, 1.0000000000931323, 1.0500000000931323,
1.1000000001862645, 1.1500000001862645, 1.2000000002793968,
1.2500000002793968
],
"Ultra": [
1.2000000002793968, 1.2800000002793968, 1.3600000002793968,
1.4400000002793968, 1.5200000002793968, 1.6000000002793968,
1.6800000002793968, 1.7600000002793968, 1.8400000002793968,
1.9200000002793968, 2.0000000002793968, 2.0800000002793968,
2.1600000002793968, 2.2400000002793968, 2.3200000002793968,
2.4000000002793968
],
"Talent": [
3.300000000372529, 3.63000000372529, 3.960000000372529, 4.290000000372529,
4.620000000372529, 4.495000000372529, 5.363000000372529,
5.775000000372529, 6.188000000372529, 6.600000000372529,
6.930000000372529, 7.260000000372529, 7.590000000372529,
7.920000000372529, 8.250000000372529
],
"Maze": [20],
"Ultra_Use": [130],
"skillList": {
"Normal": ["attack", "普攻", 1, "Normal", "Normal"],
"BPSkill": ["attack", "战技", 1, "BPSkill", "BPSkill"],
"Ultra": ["attack", "终结技", 1, "Ultra", "Ultra"],
"Talent": ["attack", "10层神君", 1, "Talent", "Talent"]
}
},
"1107": {
"Normal": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000001862645, 1.2000000002793968
],
"BPSkill": [
0.6000000004656613, 0.6600000004656613, 0.7200000005587935,
0.7800000005587935, 0.8400000006519258, 0.9000000006519258,
0.9600000007450581, 1.0200000007450581, 1.0800000008381903,
1.1400000008381903, 1.2000000000931323, 1.2600000000931323,
1.3200000001862645, 1.3800000001862645, 1.4400000002793968,
1.5000000002793968
],
"Talent1": [
0.9600000002793968, 1.0240000002793968, 1.0880000002793968,
1.1520000002793968, 1.2160000002793968, 1.2800000002793968,
1.3600000002793968, 1.4400000002793968, 1.5200000002793968,
1.6000000002793968, 1.6640000002793968, 1.7280000002793968,
1.7920000002793968, 1.1850000002793968, 1.9200000002793968
],
"Talent": [
0.800000000372529, 0.880000000372529, 0.960000000372529,
1.040000000372529, 1.120000000372529, 1.200000000372529,
1.300000000372529, 1.400000000372529, 1.500000000372529,
1.600000000372529, 1.680000000372529, 1.760000000372529,
1.840000000372529, 1.920000000372529, 2.000000000372529
],
"Maze": [20],
"Ultra_Use": [130],
"skillList": {
"Normal": ["attack", "普攻", 1, "Normal", "Normal"],
"BPSkill": ["attack", "战技", 1, "BPSkill", "BPSkill"],
"Talent": ["attack", "反击", 1, "Talent", "Talent"],
"Talent1": ["attack", "强化反击", 1, "Talent", "Ultra"]
}
},
"1213": {
"Normal": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000001862645, 1.2000000002793968, 1.3000000002793968
],
"Normal1": [
1.3000000004656613, 1.5600000005587935, 1.8200000006519258,
2.0800000007450581, 2.3400000008381903, 2.6000000000931323,
2.8600000001862645, 3.1200000002793968, 3.3800000002793968
],
"Normal2": [
1.9000000004656613, 2.2800000005587935, 2.6600000006519258,
3.0400000007450581, 3.4200000008381903, 3.8000000000931323,
4.1800000001862645, 4.5600000002793968, 4.9400000002793968
],
"Normal3": [
2.5000000004656613, 3.0000000005587935, 3.5000000006519258,
4.0000000007450581, 4.5000000008381903, 5.0000000000931323,
5.5000000001862645, 6.0000000002793968, 6.5000000002793968
],
"BPSkill": [
0.0600000004656613, 0.0660000004656613, 0.0720000005587935,
0.0780000005587935, 0.0840000006519258, 0.0900000006519258,
0.0975000007450581, 0.1050000007450581, 0.1125000008381903,
0.1200000008381903, 0.1260000000931323, 0.1320000000931323,
0.1380000001862645, 0.1440000001862645, 0.1500000002793968,
0.1560000002793968
],
"Ultra": [
1.8000000002793968, 1.9200000002793968, 2.0400000002793968,
2.1600000002793968, 2.2800000002793968, 2.4000000002793968,
2.5500000002793968, 2.7000000002793968, 2.8500000002793968,
3.0000000002793968, 3.1200000002793968, 3.2400000002793968,
3.3600000002793968, 3.4800000002793968, 3.6000000002793968
],
"Talent": [
0.050000000372529, 0.055000000372529, 0.060000000372529,
0.065000000372529, 0.070000000372529, 0.075000000372529,
0.081300000372529, 0.087500000372529, 0.093800000372529,
0.100000000372529, 0.105000000372529, 0.110000000372529,
0.115000000372529, 0.120000000372529, 0.125000000372529
],
"Maze": [20],
"Ultra_Use": [140],
"skillList": {
"Normal": ["attack", "普攻", 2, "Normal", "Normal"],
"Normal1": ["attack", "瞬华", 3, "Normal", "Normal"],
"Normal2": ["attack", "天矢阴", 5, "Normal", "Normal"],
"Normal3": ["attack", "盘拏耀跃", 7, "Normal", "Normal"],
"Ultra": ["attack", "终结技", 3, "Ultra", "Ultra"]
}
},
"1006": {
"Normal": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000001862645, 1.2000000002793968
],
"BPSkill": [
0.9800000004656613, 1.0790000004656613, 1.1760000005587935,
1.2740000005587935, 1.3720000006519258, 1.4700000006519258,
1.5925000007450581, 1.7150000007450581, 1.8375000008381903,
1.9600000008381903, 2.0580000000931323, 2.1560000000931323,
2.2540000001862645, 2.3520000001862645, 2.4500000002793968
],
"BPSkill_D": [
0.075000000372529, 0.077500000372529, 0.080000000372529,
0.082500000372529, 0.085000000372529, 0.087500000372529,
0.090600000372529, 0.093800000372529, 0.096900000372529,
0.100000000372529, 0.102500000372529, 0.105000000372529,
0.107500000372529, 0.110000000372529, 0.112500000372529
],
"Ultra": [
2.280000000372529, 2.432000000372529, 2.584000000372529,
2.736000000372529, 2.888000000372529, 3.040000000372529,
3.230000000372529, 3.420000000372529, 3.610000000372529,
3.800000000372529, 3.952000000372529, 4.104000000372529,
4.256000000372529, 4.408000000372529, 4.560000000372529
],
"Ultra_D": [
0.360000000372529, 0.369000000372529, 0.378000000372529,
0.387000000372529, 0.396000000372529, 0.405000000372529,
0.416300000372529, 0.427500000372529, 0.438800000372529,
0.450000000372529, 0.459000000372529, 0.468000000372529,
0.477000000372529, 0.486000000372529, 0.495000000372529
],
"Talent": [
0.040000000372529, 0.044000000372529, 0.048000000372529,
0.052000000372529, 0.056000000372529, 0.040000000372529,
0.060000000372529, 0.065000000372529, 0.070000000372529,
0.075000000372529, 0.080000000372529, 0.084000000372529,
0.088000000372529, 0.096000000372529, 0.100000000372529
],
"Maze": [20],
"Ultra_Use": [110],
"skillList": {
"Normal": ["attack", "普攻", 1, "Normal", "Normal"],
"BPSkill": ["attack", "战技", 1, "BPSkill", "BPSkill"],
"Ultra": ["attack", "终结技", 1, "Ultra", "Ultra"]
}
},
"1005": {
"Normal": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000001862645, 1.2000000002793968
],
"BPSkill": [
0.8000000004656613, 0.8800000004656613, 0.9600000005587935,
1.0400000005587935, 1.1200000006519258, 1.2000000006519258,
1.3000000007450581, 1.4000000007450581, 1.5000000008381903,
1.6000000008381903, 1.6800000000931323, 1.7600000000931323,
1.8400000001862645, 1.9200000001862645, 2.0000000002793968
],
"Ultra": [
0.480000000372529, 0.512000000372529, 0.544000000372529,
0.576000000372529, 0.608000000372529, 0.640000000372529,
0.680000000372529, 0.720000000372529, 0.760000000372529,
0.800000000372529, 0.832000000372529, 0.864000000372529,
0.896000000372529, 0.928000000372529, 0.960000000372529
],
"DOT": [
1.1600000004656613, 1.2688000004656613, 1.3775000005587935,
1.4863000005587935, 1.5950000006519258, 1.7581000006519258,
1.9756000007450581, 2.2475000007450581, 2.5738000008381903,
2.9000000008381903, 3.0414000000931323, 3.1828000000931323,
3.3241000001862645, 3.4655000001862645, 3.6069000002793968
],
"Talent": [
0.420000000372529, 0.518000000372529, 0.616000000372529,
0.714000000372529, 0.812000000372529, 0.910000000372529,
1.032500000372529, 1.155000000372529, 1.277500000372529,
1.400000000372529, 1.498000000372529, 1.596000000372529,
1.694000000372529, 1.792000000372529, 1.890000000372529
],
"Maze": [20],
"Ultra_Use": [110],
"skillList": {
"Normal": ["attack", "普攻", 1, "Normal", "Normal"],
"BPSkill": ["attack", "战技", 1, "BPSkill", "BPSkill"],
"Ultra": ["attack", "终结技", 1, "Ultra", "Ultra"],
"DOT": ["attack", "单次持续伤害", 1, "DOT", "Ultra"],
"Talent": ["attack", "追加攻击", 1, "Talent", "Talent"]
}
},
"1205": {
"Normal": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000001862645, 1.2000000002793968, 1.3000000002793968
],
"Normal1": [
0.2000000004656613, 0.2400000005587935, 0.2800000006519258,
0.3200000007450581, 0.3600000008381903, 0.4000000000931323,
0.4400000001862645, 0.4800000002793968, 0.5200000002793968
],
"Normal1_HP": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000001862645, 1.2000000002793968, 1.3000000002793968
],
"BPSkill": [
0.1200000004656613, 0.1480000004656613, 0.1760000005587935,
0.204000000372529, 0.232000000372529, 0.260000000372529,
0.295000000372529, 0.330000000372529, 0.365000000372529,
0.400000000372529, 0.428000000372529, 0.456000000372529,
0.484000000372529, 0.512000000372529, 0.540000000372529
],
"Ultra": [
0.240000000372529, 0.256000000372529, 0.272000000372529,
0.288000000372529, 0.304000000372529, 0.320000000372529,
0.340000000372529, 0.360000000372529, 0.380000000372529,
0.400000000372529, 0.416000000372529, 0.432000000372529,
0.448000000372529, 0.464000000372529, 0.480000000372529
],
"Ultra_HP": [
1.500000000372529, 1.540000000372529, 1.580000000372529,
1.620000000372529, 1.660000000372529, 1.700000000372529,
1.750000000372529, 1.800000000372529, 1.850000000372529,
1.900000000372529, 1.940000000372529, 1.980000000372529,
2.020000000372529, 2.060000000372529, 2.100000000372529
],
"Talent": [
0.220000000372529, 0.242000000372529, 0.264000000372529,
0.286000000372529, 0.308000000372529, 0.330000000372529,
0.357500000372529, 0.385000000372529, 0.412500000372529,
0.440000000372529, 0.462000000372529, 0.484000000372529,
0.506000000372529, 0.528000000372529, 0.550000000372529
],
"Talent_HP": [
0.550000000372529, 0.605000000372529, 0.660000000372529,
0.715000000372529, 0.770000000372529, 0.825000000372529,
0.893800000372529, 0.962500000372529, 1.031300000372529,
1.100000000372529, 1.155000000372529, 1.210000000372529,
1.265000000372529, 1.320000000372529, 1.375000000372529
],
"Maze": [20],
"Ultra_Use": [110],
"skillList": {
"Normal": ["attack", "普攻", 1, "Normal", "Normal"],
"Normal1": ["attack", "无间剑树", 1, "Normal", "Normal"],
"Ultra": ["attack", "终结技", 1, "Ultra", "Ultra"],
"Talent": ["attack", "追加攻击", 1, "Talent", "Talent"]
}
},
"1208": {
"Normal": [0, 0, 0, 0, 0, 0, 0, 0, 0],
"Normal_HP": [
0.2500000004656613, 0.3000000005587935, 0.3500000006519258,
0.4000000007450581, 0.4500000008381903, 0.5000000000931323,
0.5500000001862645, 0.6000000002793968, 0.6500000002793968
],
"BPSkill_HP": [
0.0300000004656613, 0.0330000004656613, 0.0360000005587935,
0.039000000372529, 0.042000000372529, 0.045000000372529,
0.048800000372529, 0.052500000372529, 0.056300000372529,
0.060000000372529, 0.063000000372529, 0.066000000372529,
0.069000000372529, 0.072000000372529, 0.075000000372529
],
"BPSkill_CC": [
0.0600000004656613, 0.0660000004656613, 0.0720000005587935,
0.078000000372529, 0.084000000372529, 0.090000000372529,
0.097500000372529, 0.105000000372529, 0.112500000372529,
0.120000000372529, 0.126000000372529, 0.132000000372529,
0.138000000372529, 0.144000000372529, 0.150000000372529
],
"Ultra": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"Ultra_HP": [
0.600000000372529, 0.640000000372529, 0.680000000372529,
0.720000000372529, 0.760000000372529, 0.800000000372529,
0.850000000372529, 0.900000000372529, 0.950000000372529,
1.000000000372529, 1.040000000372529, 1.080000000372529,
1.120000000372529, 1.160000000372529, 1.200000000372529
],
"Talent": [
0.220000000372529, 0.242000000372529, 0.264000000372529,
0.286000000372529, 0.308000000372529, 0.330000000372529,
0.357500000372529, 0.385000000372529, 0.412500000372529,
0.440000000372529, 0.462000000372529, 0.484000000372529,
0.506000000372529, 0.528000000372529, 0.550000000372529
],
"Maze": [20],
"Ultra_Use": [135],
"skillList": {
"Normal": ["attack", "普攻", 1, "Normal", "Normal"],
"Ultra": ["attack", "终结技", 1, "Ultra", "Ultra"]
}
},
"1104": {
"Normal": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000001862645, 1.2000000002793968, 1.3000000002793968
],
"BPSkill": [
1.0000000004656613, 1.1000000004656613, 1.2000000005587935,
1.300000000372529, 1.400000000372529, 1.500000000372529,
1.625000000372529, 1.750000000372529, 1.875000000372529,
2.000000000372529, 2.100000000372529, 2.200000000372529,
2.300000000372529, 2.400000000372529, 2.500000000372529
],
"Ultra": [
0.300000000372529, 0.318800000372529, 0.337500000372529,
0.356300000372529, 0.375000000372529, 0.390000000372529,
0.405000000372529, 0.420000000372529, 0.435000000372529,
0.450000000372529, 0.465000000372529, 0.480000000372529,
0.495000000372529, 0.510000000372529, 0.525000000372529
],
"Ultra_G": [
150, 240, 308, 375, 420, 465, 499, 533, 566, 600, 634, 668, 701, 735, 769
],
"Maze": [20],
"Ultra_Use": [110],
"skillList": {
"Normal": ["attack", "普攻", 1, "Normal", "Normal"],
"BPSkill": ["attack", "战技", 1, "BPSkill", "BPSkill"],
"Ultra": ["defence", "终结技(护盾)", 1, "Ultra", "Ultra"]
}
},
"1209": {
"Normal": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000001862645, 1.2000000002793968
],
"BPSkill": [
1.1000000000931323, 1.2100000001955777, 1.3200000002980232,
1.4300000004004687, 1.5400000005029142, 1.6500000006053597,
1.7875000005587935, 1.9250000005122274, 2.0625000002328306,
2.2000000001862645, 2.31000000028871, 2.4200000003911555,
2.530000000493601, 2.6400000005960464, 2.750000000698492
],
"Ultra": [
2.1000000005122274, 2.2400000006705523, 2.380000000828877,
2.5200000000558794, 2.660000000214204, 2.800000000372529,
2.975000000745058, 3.150000000419095, 3.332499999860302,
3.500000000232831, 3.6400000003911555, 3.78000000054948,
3.920000000707805, 4.06000000086613, 4.200000000093132
],
"Ultra_CD": [
0.3000000005122274, 0.3200000006705523, 0.340000000828877,
0.3600000000558794, 0.380000000214204, 0.400000000372529,
0.425000000745058, 0.450000000419095, 0.474999999860302,
0.500000000232831, 0.5200000003911555, 0.54000000054948,
0.560000000707805, 0.58000000086613, 0.600000000093132
],
"Talent": [
0.25000000037252903, 0.27500000040978193, 0.30000000044703484,
0.3250000004842877, 0.3500000005215406, 0.3750000005587935,
0.4063000006053597, 0.4375000006519258, 0.4688000006984919,
0.5000000007450581, 0.525000000782311, 0.5500000008195639,
0.5750000008568168, 0.6000000008940697, 0.6250000008940697
],
"Talent_CC": [
0.15000000037252903, 0.15500000040978193, 0.16000000044703484,
0.1650000004842877, 0.1700000005215406, 0.1750000005587935,
0.1813000006053597, 0.1875000006519258, 0.1938000006984919,
0.2000000007450581, 0.205000000782311, 0.2100000008195639,
0.2150000008568168, 0.2200000008940697, 0.2250000008940697
],
"Talent_CD": [
0.15000000037252903, 0.16500000040978193, 0.18000000044703484,
0.1950000004842877, 0.2100000005215406, 0.2250000005587935,
0.2438000006053597, 0.2625000006519258, 0.2813000006984919,
0.3000000007450581, 0.315000000782311, 0.3300000008195639,
0.3450000008568168, 0.3600000008940697, 0.3750000008940697
],
"Maze": [20],
"Ultra_Use": [120],
"skillList": {
"Normal": ["attack", "普攻", 1, "Normal", "Normal"],
"BPSkill": ["attack", "战技", 1, "BPSkill", "BPSkill"],
"Ultra": ["attack", "终结技", 1, "Ultra", "Ultra"],
"Talent": ["attack", "附加伤害", 1, "Talent", "Talent"]
}
},
"1004": {
"Normal": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000001862645, 1.2000000002793968
],
"BPSkill": [
1.0800000000931323, 1.1880000001955777, 1.2960000002980232,
1.4040000004004687, 1.5120000005029142, 1.6200000006053597,
1.7550000005587935, 1.8900000005122274, 2.0550000002328306,
2.1600000001862645, 2.26800000028871, 2.3760000003911555,
2.484000000493601, 2.5920000005960464, 2.700000000698492
],
"Ultra": [
0.9000000005122274, 0.9600000006705523, 1.020000000828877,
1.0800000000558794, 1.140000000214204, 1.200000000372529,
1.275000000745058, 1.350000000419095, 1.424999999860302,
1.500000000232831, 1.5600000003911555, 1.62000000054948,
1.680000000707805, 1.74000000086613, 1.800000000093132
],
"Talent": [
0.30000000037252903, 0.33000000040978193, 0.36000000044703484,
0.3900000004842877, 0.4200000005215406, 0.4500000005587935,
0.4875000006053597, 0.525000006519258, 0.5625000006984919,
0.6000000007450581, 0.63000000782311, 0.6600000008195639,
0.6900000008568168, 0.7200000008940697, 0.7500000008940697
],
"Maze": [20],
"Ultra_Use": [120],
"skillList": {
"Normal": ["attack", "普攻", 1, "Normal", "Normal"],
"BPSkill": ["attack", "战技", 3, "BPSkill", "BPSkill"],
"Ultra": ["attack", "终结技", 1, "Ultra", "Ultra"]
}
},
"1003": {
"Normal": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000001862645, 1.2000000002793968
],
"BPSkill": [
1.0000000000931323, 1.1000000001955777, 1.2000000002980232,
1.3000000004004687, 1.4000000005029142, 1.5000000006053597,
1.6250000005587935, 1.7500000005122274, 1.8750000002328306,
2.0000000001862645, 2.10000000028871, 2.2000000003911555,
2.300000000493601, 2.4000000005960464, 2.500000000698492
],
"Ultra": [
1.3800000005122274, 1.4720000006705523, 1.564000000828877,
1.6560000000558794, 1.748000000214204, 1.840000000372529,
1.955000000745058, 2.070000000419095, 2.185000000860302,
2.300000000232831, 2.3920000003911555, 2.48400000054948,
2.596000000707805, 2.66800000086613, 2.76000000093132
],
"Talent": [
0.70000000037252903, 0.77000000040978193, 0.84000000044703484,
0.9100000004842877, 0.9800000005215406, 1.0500000005587935,
1.1375000006053597, 1.225000006519258, 1.312500006984919,
1.4000000007450581, 1.47000000782311, 1.5400000008195639,
1.6100000008568168, 1.6800000008940697, 1.7500000008940697
],
"Maze": [20],
"Ultra_Use": [120],
"skillList": {
"Normal": ["attack", "普攻", 1, "Normal", "Normal"],
"BPSkill": ["attack", "战技", 1, "BPSkill", "BPSkill"],
"Ultra": ["attack", "终结技", 1, "Ultra", "Ultra"],
"Talent": ["attack", "追加攻击", 1, "Talent", "Talent"]
}
},
"1201": {
"Normal": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000001862645, 1.2000000002793968
],
"Normal1": [
1.2000000000931323, 1.4400000001955777, 1.6800000002980232,
1.9200000004004687, 2.1600000005029142, 2.4000000006053597,
2.6450000005587935, 2.8800000005122274, 3.1200000002328306
],
"BPSkill": [
0.14000000037252903, 0.15400000040978193, 0.16800000044703484,
0.1820000004842877, 0.1960000005215406, 0.2100000005587935,
0.2275000006053597, 0.2450000006519258, 0.2625000006984919,
0.2800000007450581, 0.294000000782311, 0.3080000008195639,
0.3220000008568168, 0.3360000008940697, 0.3500000008940697
],
"Ultra": [
1.2000000005122274, 1.2800000006705523, 1.360000000828877,
1.440000000558794, 1.520000000214204, 1.600000000372529,
1.700000000745058, 1.800000000419095, 1.900000000860302,
2.000000000232831, 2.0800000003911555, 2.16000000054948,
2.240000000707805, 2.32000000086613, 2.40000000093132
],
"Talent": [
0.36000000037252903, 0.39600000040978193, 0.43200000044703484,
0.4680000004842877, 0.5040000005215406, 0.5400000005587935,
0.5850000006053597, 0.6300000006519258, 0.6750000006984919,
0.7200000007450581, 0.756000000782311, 0.7920000008195639,
0.8280000008568168, 0.8640000008940697, 0.9000000008940697
],
"Maze": [20],
"Ultra_Use": [140],
"skillList": {
"Normal": ["attack", "普攻", 1, "Normal", "Normal"],
"Normal1": ["attack", "杠上开花!", 1, "Normal", "Normal"],
"Ultra": ["attack", "终结技", 1, "Ultra", "Ultra"]
}
},
"1212": {
"Normal": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000001862645, 1.2000000002793968, 1.3000000002793968
],
"BPSkill": [
1.0000000005122274, 1.1000000006705523, 1.200000000828877,
1.300000000558794, 1.400000000214204, 1.500000000372529,
1.630000000745058, 1.750000000419095, 1.880000000860302,
2.000000000232831, 2.1000000003911555, 2.20000000054948,
2.300000000707805, 2.40000000086613, 2.50000000093132
],
"BPSkill1": [
1.2500000005122274, 1.3750000006705523, 1.500000000828877,
1.625000000558794, 1.750000000214204, 1.875000000372529,
0.031250000745058, 2.187500000419095, 2.343750000860302,
2.500000000232831, 2.6250000003911555, 2.75000000054948,
2.875000000707805, 3.00000000086613, 3.12500000093132
],
"Ultra": [
1.8000000005122274, 1.9200000006705523, 2.040000000828877,
2.160000000558794, 2.280000000214204, 2.400000000372529,
2.550000000745058, 2.700000000419095, 2.850000000860302,
3.000000000232831, 3.1200000003911555, 3.24000000054948,
3.360000000707805, 3.48000000086613, 3.60000000093132
],
"Talent_CC": [
0.40000000037252903, 0.41000000040978193, 0.42000000044703484,
0.4300000004842877, 0.4400000005215406, 0.4500000005587935,
0.4625000006053597, 0.4750000006519258, 0.4875000006984919,
0.5000000007450581, 0.510000000782311, 0.5200000008195639,
0.5300000008568168, 0.5400000008940697, 0.5500000008940697
],
"Talent_atk": [
0.90000000037252903, 0.99000000040978193, 1.08000000044703484,
1.1700000004842877, 1.2600000005215406, 1.3500000005587935,
1.4625000006053597, 1.5750000006519258, 1.6875000006984919,
1.8000000007450581, 1.890000000782311, 1.9800000008195639,
2.0700000008568168, 2.1600000008940697, 2.2500000008940697
],
"Maze": [20],
"Ultra_Use": [140],
"skillList": {
"Normal": ["attack", "普攻", 1, "Normal", "Normal"],
"BPSkill": ["attack", "战技", 1, "BPSkill", "BPSkill"],
"BPSkill1": ["attack", "寒川映月", 1, "BPSkill", "BPSkill"],
"Ultra": ["attack", "终结技", 1, "Ultra", "Ultra"]
}
},
"1112": {
"Normal": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000001862645, 1.2000000002793968, 1.3000000002793968
],
"BPSkill": [
0.7500000005122274, 0.8250000006705523, 0.900000000828877,
0.975000000558794, 1.050000000214204, 1.125000000372529,
1.218750000745058, 1.312500000419095, 1.406250000860302,
1.500000000232831, 1.575000000391155, 1.65000000054948, 1.725000000707805,
1.80000000086613, 1.87500000093132
],
"BPSkill_add": [
0.2500000005122274, 0.2750000006705523, 0.300000000828877,
0.325000000558794, 0.350000000214204, 0.375000000372529,
0.406250000745058, 0.437500000419095, 0.468750000860302,
0.500000000232831, 0.5250000003911555, 0.55000000054948,
0.575000000707805, 0.60000000086613, 0.62500000093132
],
"Talent1": [
0.7500000005122274, 0.8250000006705523, 0.900000000828877,
0.975000000558794, 1.050000000214204, 1.125000000372529,
1.218750000745058, 1.312500000419095, 1.406250000860302,
1.500000000232831, 1.575000000391155, 1.65000000054948, 1.725000000707805,
1.80000000086613, 1.87500000093132
],
"Ultra_CD": [
0.1250000005122274, 0.13750000006705523, 0.150000000828877,
0.162500000558794, 0.175000000214204, 0.187500000372529,
0.203125000745058, 0.218750000419095, 0.234375000860302,
0.250000000232831, 0.262500000391155, 0.27500000054948, 0.287500000707805,
0.30000000086613, 0.31250000093132
],
"Maze": [20],
"Ultra_Use": [140],
"skillList": {
"Normal": ["attack", "普攻", 1, "Talent", "Normal"],
"BPSkill": ["attack", "账账", 1, "Talent", "BPSkill"],
"Talent1": ["attack", "强化账账", 1, "Talent", "Talent"]
}
},
"1210": {
"Normal": [
0.5000000004656613, 0.6000000005587935, 0.7000000006519258,
0.8000000007450581, 0.9000000008381903, 1.0000000000931323,
1.1000000000931323, 1.2000000001862645, 1.3000000002793968
],
"BPSkill": [
0.6000000005587935, 0.6600000006146729, 0.7200000006705523,
0.7800000007264316, 0.840000000782311, 0.9000000008381903,
0.9750000005587935, 1.0500000000465661, 1.1249999997671694,
1.2000000001862645, 1.2600000002421439, 1.3200000002980232,
1.3800000003539026, 1.440000000409782, 1.5000000004656613
],
"DOT": [
0.8390400004573166, 0.9229800018947572, 1.0069200003053993,
1.0908600010443479, 1.1748000003863126, 1.3007100007962435,
1.4685900008771569, 1.6784400006290525, 1.9302600014489144,
2.182080000638962, 2.2912020003423095, 2.400324000744149,
2.5094460004474968, 2.6185680008493364, 2.727690001251176
],
"Ultra": [
0.7200000006705523, 0.7680000001564622, 0.8160000003408641,
0.8640000005252659, 0.9120000007096678, 0.9600000008940697,
1.0200000000186265, 1.0800000000745058, 1.1400000001303852,
1.2000000001862645, 1.2479999996721745, 1.2959999998565763,
1.3440000000409782, 1.39200000022538, 1.440000000409782
],
"Talent": [
0.0400000000372529, 0.04299999983049929, 0.04599999962374568,
0.04899999941699207, 0.05199999990873039, 0.054999999701976776,
0.058750000316649675, 0.06250000023283064, 0.06625000014901161,
0.07000000006519258, 0.07299999985843897, 0.07599999965168536,
0.07899999944493175, 0.08199999993667006, 0.08499999972991645
],
"Maze": [20],
"Ultra_Use": [140],
"skillList": {
"Normal": ["attack", "普攻", 1, "Normal", "Normal"],
"BPSkill": ["attack", "战技", 1, "BPSkill", "BPSkill"],
"Ultra": ["attack", "终结技", 1, "Ultra", "Ultra"],
"DOT": ["attack", "每段灼烧", 1, "DOT", "BPSkill"]
}
}
}

View File

@ -0,0 +1,469 @@
{
"23001": {
"Param": {
"CriticalChance": [
0.18000000016763806, 0.21000000019557774, 0.24000000022351742,
0.2700000002514571, 0.3000000002793968
],
"a_dmg": [
0.060000000055879354, 0.07000000006519258, 0.0800000000745058,
0.09000000008381903, 0.10000000009313226
],
"e_dmg": [
0.060000000055879354, 0.07000000006519258, 0.0800000000745058,
0.09000000008381903, 0.10000000009313226
],
"q_crit_dmg": [
0.12000000011175871, 0.14000000013038516, 0.1600000001490116,
0.18000000016763806, 0.20000000018626451
]
},
"AbilityProperty": [
0.18000000016763806, 0.21000000019557774, 0.24000000022351742,
0.2700000002514571, 0.3000000002793968
]
},
"21003": {
"Param": {
"CriticalChance": [
0.12000000011175871, 0.1500000001396984, 0.18000000016763806,
0.21000000019557774, 0.24000000022351742
]
}
},
"24001": {
"Param": {
"CriticalChance": [
0.0800000000745058, 0.10000000009313226, 0.12000000011175871,
0.14000000013038516, 0.1600000001490116
],
"AttackAddedRatio": [
0.20000000018626451, 0.25000000023283064, 0.3000000002793968,
0.3500000003259629, 0.40000000037252903
]
},
"AbilityProperty": [
0.0800000000745058, 0.10000000009313226, 0.12000000011175871,
0.14000000013038516, 0.1600000001490116
]
},
"21024": {
"Param": {
"SpeedAddedRatio": [
0.0800000000745058, 0.09000000008381903, 0.10000000009313226,
0.11000000010244548, 0.12000000011175871
],
"AllDamageAddedRatio": [
0.12000000011175871, 0.1500000001396984, 0.18000000016763806,
0.21000000019557774, 0.24000000022351742
]
}
},
"21017": {
"Param": {
"a_dmg": [
0.24000000022351742, 0.3000000002793968, 0.3600000003352761,
0.4200000003911555, 0.48000000044703484
],
"e_dmg": [
0.24000000022351742, 0.3000000002793968, 0.3600000003352761,
0.4200000003911555, 0.48000000044703484
]
}
},
"23010": {
"Param": {
"CriticalDamageBase": [
0.36000000022351742, 0.4200000002793968, 0.4800000003352761,
0.5400000003911555, 0.60000000044703484
],
"e_dmg": [
0.18000000022351742, 0.2100000002793968, 0.2400000003352761,
0.2700000003911555, 0.30000000044703484
],
"r_dmg": [
0.18000000022351742, 0.2100000002793968, 0.2400000003352761,
0.2700000003911555, 0.30000000044703484
],
"t_dmg": [
0.48000000022351742, 0.5600000002793968, 0.6400000003352761,
0.7200000003911555, 0.80000000044703484
]
}
},
"20002": {
"Param": {
"a_dmg": [
0.20000000022351742, 0.2500000002793968, 0.3000000003352761,
0.3500000003911555, 0.40000000044703484
],
"e_dmg": [
0.20000000022351742, 0.2500000002793968, 0.3000000003352761,
0.3500000003911555, 0.40000000044703484
]
}
},
"21006": {
"Param": {
"t_dmg": [
0.48000000022351742, 0.6000000002793968, 0.7200000003352761,
0.8400000003911555, 0.96000000044703484
]
}
},
"21012": {
"Param": {
"AllDamageAddedRatio": [
0.40000000022351742, 0.5000000002793968, 0.6000000003352761,
0.7000000003911555, 0.80000000044703484
]
}
},
"20011": {
"Param": {
"AllDamageAddedRatio": [
0.24000000022351742, 0.3000000002793968, 0.3600000003352761,
0.4200000003911555, 0.48000000044703484
]
}
},
"20004": {
"Param": {
"StatusProbability": [
0.20000000022351742, 0.2500000002793968, 0.3000000003352761,
0.3500000003911555, 0.40000000044703484
]
}
},
"20020": {
"Param": {
"A3_AttackAddedRatio": [
0.24000000022351742, 0.3000000002793968, 0.3600000003352761,
0.4200000003911555, 0.48000000044703484
]
}
},
"21013": {
"Param": {
"r_dmg": [
0.32000000022351742, 0.4000000002793968, 0.4800000003352761,
0.5600000003911555, 0.64000000044703484
]
}
},
"20006": {
"Param": {
"r_dmg": [
0.28000000022351742, 0.3500000002793968, 0.4200000003352761,
0.4900000003911555, 0.56000000044703484
]
}
},
"20014": {
"Param": {
"SpeedAddedRatio": [
0.10000000009313226, 0.12000000011175871, 0.14000000013038516,
0.1600000001490116, 0.18000000016763806
]
}
},
"20007": {
"Param": {
"AttackAddedRatio": [
0.24000000022351742, 0.3000000002793968, 0.3600000003352761,
0.4200000003911555, 0.48000000044703484
]
}
},
"23000": {
"Param": {
"AttackAddedRatio": [
0.09000000022351742, 0.1050000002793968, 0.1200000003352761,
0.1350000003911555, 0.15000000044703484
],
"AllDamageAddedRatio": [
0.30000000022351742, 0.3500000002793968, 0.4000000003352761,
0.4500000003911555, 0.50000000044703484
]
}
},
"21001": {
"Param": {
"AllDamageAddedRatio": [
0.12000000022351742, 0.1500000002793968, 0.1800000003352761,
0.2100000003911555, 0.24000000044703484
]
}
},
"23011": {
"Param": {
"AllDamageAddedRatio": [
0.09000000022351742, 0.1050000002793968, 0.1200000003352761,
0.1350000003911555, 0.15000000044703484
]
}
},
"23005": {
"Param": {
"DefenceAddedRatio": [
0.2400000000745058, 0.28000000009313226, 0.32000000011175871,
0.36000000013038516, 0.4000000001490116
]
}
},
"20003": {
"Param": {
"DefenceAddedRatio": [
0.1600000000745058, 0.20000000009313226, 0.24000000011175871,
0.28000000013038516, 0.3200000001490116
]
}
},
"21022": {
"Param": {
"AllDamageAddedRatio": [
0.16000000022351742, 0.2050000002793968, 0.2400000003352761,
0.2850000003911555, 0.32000000044703484
]
}
},
"21015": {
"Param": {
"ignore_defence": [
0.12000000022351742, 0.1300000002793968, 0.1400000003352761,
0.1500000003911555, 0.16000000044703484
]
}
},
"23004": {
"Param": {
"AllDamageAddedRatio": [
0.2400000000745058, 0.28000000009313226, 0.32000000011175871,
0.36000000013038516, 0.4000000001490116
],
"A2_StatusProbability": [
0.18000000022351742, 0.2100000002793968, 0.2400000003352761,
0.2700000003911555, 0.30000000044703484
],
"A2_AttackAddedRatio": [
0.2400000000745058, 0.28000000009313226, 0.32000000011175871,
0.36000000013038516, 0.4000000001490116
]
}
},
"23007": {
"Param": {
"DmgRatio": [
0.12000000022351742, 0.1400000002793968, 0.1600000003352761,
0.1800000003911555, 0.20000000044703484
],
"CriticalChance": [
0.12000000022351742, 0.1400000002793968, 0.1600000003352761,
0.1800000003911555, 0.20000000044703484
]
}
},
"23006": {
"Param": {
"SpeedAddedRatio": [
0.04800000022351742, 0.0560000002793968, 0.0640000003352761,
0.0720000003911555, 0.0800000044703484
],
"AllDamageAddedRatio": [
0.2400000000745058, 0.28000000009313226, 0.32000000011175871,
0.36000000013038516, 0.4000000001490116
]
}
},
"21020": {
"Param": {
"AttackAddedRatio": [
0.16000000022351742, 0.2050000002793968, 0.2400000003352761,
0.2850000003911555, 0.32000000044703484
],
"CriticalDamageBase": [
0.24000000022351742, 0.3000000002793968, 0.3600000003352761,
0.4200000003911555, 0.48000000044703484
]
}
},
"23015": {
"Param": {
"AttackAddedRatio": [
0.18000000022351742, 0.2150000002793968, 0.2400000003352761,
0.2750000003911555, 0.30000000044703484
],
"CriticalChance": [
0.18000000022351742, 0.2100000002793968, 0.2400000003352761,
0.2700000003911555, 0.30000000044703484
]
}
},
"20016": {
"Param": {
"CriticalChance": [
0.12000000022351742, 0.1500000002793968, 0.1800000003352761,
0.2100000003911555, 0.24000000044703484
]
}
},
"21005": {
"Param": {
"AttackAddedRatio": [
0.12000000022351742, 0.1500000002793968, 0.1800000003352761,
0.2100000003911555, 0.24000000044703484
]
}
},
"21019": {
"Param": {
"AttackAddedRatio": [
0.16000000022351742, 0.200000002793968, 0.2400000003352761,
0.2850000003911555, 0.32000000044703484
],
"CriticalChance": [
0.12000000022351742, 0.1500000002793968, 0.1800000003352761,
0.2100000003911555, 0.24000000044703484
]
}
},
"23009": {
"Param": {
"CriticalChance": [
0.18000000022351742, 0.2100000002793968, 0.2400000003352761,
0.2700000003911555, 0.30000000044703484
],
"HPAddedRatio": [
0.18000000022351742, 0.2100000002793968, 0.2400000003352761,
0.2700000003911555, 0.30000000044703484
],
"AllDamageAddedRatio": [
0.2400000000745058, 0.28000000009313226, 0.32000000011175871,
0.36000000013038516, 0.4000000001490116
]
}
},
"21034": {
"Param": {
"AllDamageAddedRatio": [
0.0020000022351742, 0.0025000002793968, 0.0030000003352761,
0.0035000003911555, 0.0040000044703484
]
}
},
"20009": {
"Param": {
"AllDamageAddedRatio": [
0.2000000000745058, 0.25000000009313226, 0.30000000011175871,
0.35000000013038516, 0.4100000001490116
]
}
},
"21010": {
"Param": {
"AllDamageAddedRatio": [
0.0800000000745058, 0.10000000009313226, 0.12000000011175871,
0.14000000013038516, 0.1600000001490116
]
}
},
"21033": {
"Param": {
"AllDamageAddedRatio": [
0.2400000000745058, 0.28000000009313226, 0.32000000011175871,
0.36000000013038516, 0.4000000001490116
],
"AttackAddedRatio": [
0.2400000000745058, 0.28000000009313226, 0.32000000011175871,
0.36000000013038516, 0.4000000001490116
]
}
},
"23014": {
"Param": {
"AllDamageAddedRatio": [
0.1400000000745058, 0.16400000009313226, 0.19000000011175871,
0.21400000013038516, 0.2400000001490116
],
"ResistancePenetration": [
0.1200000000745058, 0.14000000009313226, 0.16000000011175871,
0.18000000013038516, 0.2000000001490116
]
}
},
"23002": {
"Param": {
"AllDamageAddedRatio": [
0.2400000000745058, 0.28000000009313226, 0.32000000011175871,
0.36000000013038516, 0.4000000001490116
]
}
},
"21026": {
"Param": {
"AllDamageAddedRatio": [
0.16000000011175871, 0.2000000001396984, 0.24000000016763806,
0.28000000019557774, 0.32000000022351742
],
"AttackAddedRatio": [
0.1000000000745058, 0.12500000009313226, 0.15000000011175871,
0.17500000013038516, 0.2000000001490116
]
}
},
"24000": {
"Param": {
"AllDamageAddedRatio": [
0.12000000011175871, 0.1500000001396984, 0.18000000016763806,
0.21000000019557774, 0.24000000022351742
],
"AttackAddedRatio": [
0.0800000000745058, 0.10000000009313226, 0.12000000011175871,
0.14000000013038516, 0.1600000001490116
]
}
},
"21027": {
"Param": {
"AllDamageAddedRatio": [
0.12000000011175871, 0.1500000001396984, 0.18000000016763806,
0.21000000019557774, 0.24000000022351742
],
"AttackAddedRatio": [
0.04000000011175871, 0.0500000001396984, 0.06000000016763806,
0.07000000019557774, 0.08000000022351742
]
}
},
"23012": {
"Param": {
"CriticalChance": [
0.36000000011175871, 0.4200000001396984, 0.48000000016763806,
0.54000000019557774, 0.60000000022351742
]
}
},
"23016": {
"Param": {
"CriticalDamageBase": [
0.12000000011175871, 0.14000000013038516, 0.1600000001490116,
0.18000000016763806, 0.20000000018626451
],
"TalentDmgAdd": [
0.30000000011175871, 0.3500000001396984, 0.40000000016763806,
0.45000000019557774, 0.50000000022351742
]
}
},
"21031": {
"enable": false
},
"20000": {
"Param": {
"CriticalChance": [
0.12000000011175871, 0.1500000001396984, 0.18000000016763806,
0.21000000019557774, 0.24000000022351742
]
}
}
}

View File

@ -0,0 +1,744 @@
from collections import Counter
from typing import Dict, List, Union
from gsuid_core.logger import logger
from ..utils import merge_attribute
from ..Base.model import DamageInstanceRelic
from ..Base.RelicBase import SingleRelic, BaseRelicSetSkill
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')
pass
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')
pass
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:
raise Exception(f'Unknow SetId: {set_id}')

View File

@ -0,0 +1,258 @@
import json
from pathlib import Path
from typing import List, Union
from gsuid_core.logger import logger
from .utils import merge_attribute
async def demage_num(base_attr, attribute_bonus, skill_type, add_skill_type, element, skill_multiplier, level):
logger.info(f'技能区: {skill_multiplier}')
logger.info(f'skill_type: {skill_type}')
logger.info(f'level: {level}')
# logger.info(f'base_attr: {base_attr}')
# logger.info(f'attribute_bonus: {attribute_bonus}')
# 检查是否有对某一个技能的属性加成
logger.info('检查是否有对某一个技能的属性加成')
for attr in attribute_bonus:
# 攻击加成
if attr.__contains__('AttackAddedRatio'):
attr_name = attr.split('AttackAddedRatio')[0]
if attr_name in (skill_type, add_skill_type):
attack_added_ratio = attribute_bonus.get(
'AttackAddedRatio', 0
)
attribute_bonus['AttackAddedRatio'] = (
attack_added_ratio + attribute_bonus[attr]
)
# 效果命中加成
if attr.__contains__('StatusProbabilityBase'):
attr_name = attr.split('StatusProbabilityBase')[0]
if attr_name in (skill_type, add_skill_type):
status_probability = attribute_bonus.get(
'StatusProbabilityBase', 0
)
attribute_bonus['StatusProbabilityBase'] = (
status_probability + attribute_bonus[attr]
)
merged_attr = await merge_attribute(base_attr, attribute_bonus)
# logger.info(f'{merged_attr}')
skill_info_list = []
attack = merged_attr.get('attack', 0)
logger.info(f'攻击力: {attack}')
damage_add = 0
hp_multiplier = 0
hp_num = 0
# 模拟 同属性弱点 同等级 的怪物
# 韧性条减伤
enemy_damage_reduction = 0.1
damage_reduction = 1 - enemy_damage_reduction
logger.info(f'韧性区: {damage_reduction}')
# 抗性区
enemy_status_resistance = 0.0
for attr in merged_attr:
if attr.__contains__('ResistancePenetration'):
# 检查是否有某一属性的抗性穿透
attr_name = attr.split('ResistancePenetration')[0]
if attr_name in (element, 'AllDamage'):
logger.info(f'{attr_name}属性有{merged_attr[attr]}穿透加成')
enemy_status_resistance += merged_attr[attr]
# 检查是否有某一技能属性的抗性穿透
if attr_name.__contains__('_'):
skill_name = attr_name.split('_')[0]
skillattr_name = attr_name.split('_')[1]
if skill_name in (skill_type, add_skill_type) and skillattr_name in (element, 'AllDamage'):
enemy_status_resistance += merged_attr[attr]
logger.info(
f'{skill_name}{skillattr_name}属性有{merged_attr[attr]}穿透加成'
)
resistance_area = 1.0 - (0 - enemy_status_resistance)
logger.info(f'抗性区: {resistance_area}')
# 防御区
# 检查是否有 ignore_defence
logger.info('检查是否有 ignore_defence')
ignore_defence = 1.0
for attr in merged_attr:
if attr == 'ignore_defence':
ignore_defence = 1 - merged_attr[attr]
break
logger.info(f'ignore_defence {ignore_defence}')
enemy_defence = (
level * 10 + 200
) * ignore_defence
defence_multiplier = (level * 10 + 200) / (
level * 10 + 200 + enemy_defence
)
logger.info(f'防御区: {defence_multiplier}')
# 增伤区
injury_area = 0
# 检查是否有对某一个技能的伤害加成
# logger.info('检查是否有对某一个技能的伤害加成')
for attr in merged_attr:
if attr.__contains__('DmgAdd'):
attr_name = attr.split('DmgAdd')[0]
if attr_name in (skill_type, add_skill_type):
logger.info(
f'{attr}{skill_type}{merged_attr[attr]} 伤害加成'
)
injury_area += merged_attr[attr]
# 检查有无符合属性的伤害加成
# logger.info('检查球有无符合属性的伤害加成')
element_area = 0
for attr in merged_attr:
if attr.__contains__('AddedRatio'):
attr_name = attr.split('AddedRatio')[0]
if attr_name in (element, 'AllDamage'):
logger.info(
f'{attr}{element} '
f'{merged_attr[attr]} 伤害加成'
)
if attr_name == element:
element_area += merged_attr[attr]
injury_area += merged_attr[attr]
injury_area += 1
logger.info(f'增伤区: {injury_area}')
# 易伤区
# logger.info('检查是否有易伤加成')
damage_ratio = merged_attr.get('DmgRatio', 0)
# 检查是否有对特定技能的易伤加成
# Talent_DmgRatio
for attr in merged_attr:
if attr.__contains__('_DmgRatio'):
skill_name = attr.split('_')[0]
if skill_name in (skill_type, add_skill_type):
logger.info(
f'{attr}{skill_type}{merged_attr[attr]} 易伤加成'
)
damage_ratio += merged_attr[attr]
damage_ratio = damage_ratio + 1
logger.info(f'易伤: {damage_ratio}')
# 爆伤区
if skill_type == 'DOT':
critical_damage_base = 0.0
else:
# logger.info('检查是否有爆伤加成')
# logger.info(f'{merged_attr}')
critical_damage_base = merged_attr.get('CriticalDamageBase', 0)
# 检查是否有对特定技能的爆伤加成
# Ultra_CriticalChance
for attr in merged_attr:
if attr.__contains__('_CriticalDamageBase'):
skill_name = attr.split('_')[0]
if skill_name in (skill_type, add_skill_type):
logger.info(
f'{attr}{skill_type}'
f'{merged_attr[attr]} 爆伤加成'
)
critical_damage_base += merged_attr[attr]
critical_damage = critical_damage_base + 1
logger.info(f'暴伤: {critical_damage}')
# 暴击区
logger.info('检查是否有暴击加成')
critical_chance_base = merged_attr['CriticalChanceBase']
# 检查是否有对特定技能的爆伤加成
# Ultra_CriticalChance
for attr in merged_attr:
if attr.__contains__('_CriticalChance'):
skill_name = attr.split('_')[0]
if skill_name in (skill_type, add_skill_type):
logger.info(
f'{attr}{skill_type}'
f'{merged_attr[attr]} 暴击加成'
)
critical_chance_base += merged_attr[attr]
critical_chance_base = min(1, critical_chance_base)
logger.info(f'暴击: {critical_chance_base}')
# 期望伤害
qiwang_damage = (critical_chance_base * critical_damage_base) + 1
logger.info(f'暴击期望: {qiwang_damage}')
attack_tz = 0.0
injury_add = 0.0
critical_damage_add = 0
damage_cd = (
attack
* skill_multiplier
* damage_ratio
* (injury_area + injury_add)
* defence_multiplier
* resistance_area
* damage_reduction
* (critical_damage + critical_damage_add)
+ damage_add
)
damage_qw = (
attack
* skill_multiplier
* damage_ratio
* (injury_area + injury_add)
* defence_multiplier
* resistance_area
* damage_reduction
* qiwang_damage
+ damage_add
)
attr_value_tz: float = base_attr.get('attack', 0)
attribute_atk = attribute_bonus.get('AttackDelta', 0)
attack_tz = (
attr_value_tz
+ attr_value_tz
* (
1
+ attribute_bonus.get('AttackAddedRatio', 0)
+ 2.144
)
+ attribute_atk
)
injury_add_tz = 0
if element == 'Imaginary':
injury_add_tz = 0.12
damage_tz = (
attack_tz
* skill_multiplier
* damage_ratio
* (injury_area + injury_add + injury_add_tz + 2.326)
* defence_multiplier
* resistance_area
* damage_reduction
* (critical_damage + critical_damage_add + 1.594)
* 10
+ damage_add
)
if element == 'Thunder':
element_area = 0
damage_tz_fj = (
attack_tz
* 0.44
* damage_ratio
* (injury_area + injury_add + 2.326 + element_area)
* defence_multiplier
* resistance_area
* damage_reduction
* (critical_damage + critical_damage_add + 1.594)
* 10
)
damage_tz += damage_tz_fj
skill_info_list: List[Union[str, float]] = []
skill_info_list.append(damage_cd)
skill_info_list.append(damage_qw)
skill_info_list.append(damage_tz)
logger.info(f'暴击: {damage_cd} 期望:{damage_qw} 末日:{damage_tz}')
return skill_info_list

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,65 @@
from typing import Dict
async def merge_attribute(
base_attr: Dict[str, float], attribute_bonus: Dict[str, float]
):
# hp attack defence need base_value and add_value
merged_attr: Dict[str, float] = {}
attr_list = ['attack', 'defence', 'hp', 'speed']
for attribute in attribute_bonus:
if (
attribute.__contains__('Attack')
or attribute.__contains__('Defence')
or attribute.__contains__('HP')
or attribute.__contains__('Speed')
):
if attribute.__contains__('Delta'):
attr = attribute.split('Delta')[0].lower()
if attr in attr_list:
attr_value = merged_attr.get(attr, 0)
merged_attr[attr] = attr_value + attribute_bonus[attribute]
elif attribute.__contains__('AddedRatio'):
attr = attribute.split('AddedRatio')[0].lower()
if attr in attr_list:
attr_value = merged_attr.get(attr, 0)
merged_attr[attr] = attr_value + base_attr[attr] * (
1 + attribute_bonus[attribute]
)
else:
raise Exception(f'attribute error {attribute}')
elif attribute.__contains__('Base'):
attr_value = base_attr.get(attribute, 0)
merged_attr[attribute] = attr_value + attribute_bonus[attribute]
elif attribute.__contains__('AddedRatio'):
attr_value = base_attr.get(attribute, 0)
merged_attr[attribute] = attr_value + attribute_bonus[attribute]
elif attribute.__contains__('DmgAdd'):
attr_value = base_attr.get(attribute, 0)
merged_attr[attribute] = attr_value + attribute_bonus[attribute]
elif attribute.__contains__('DmgRatio'):
attr_value = base_attr.get(attribute, 0)
merged_attr[attribute] = attr_value + attribute_bonus[attribute]
elif attribute == 'ignore_defence':
attr_value = base_attr.get(attribute, 0)
merged_attr[attribute] = attr_value + attribute_bonus[attribute]
elif attribute.__contains__('ResistancePenetration'):
attr_value = base_attr.get(attribute, 0)
merged_attr[attribute] = attr_value + attribute_bonus[attribute]
elif attribute == 'Atk_buff':
attr_value = base_attr.get(attribute, 0)
merged_attr[attribute] = attr_value + attribute_bonus[attribute]
elif attribute == 'Normal_buff':
attr_value = base_attr.get(attribute, 0)
merged_attr[attribute] = attr_value + attribute_bonus[attribute]
elif attribute == 'shield_added_ratio':
attr_value = base_attr.get(attribute, 0)
merged_attr[attribute] = attr_value + attribute_bonus[attribute]
else:
continue
for attr in base_attr:
merged_value = merged_attr.get(attr, 0)
if merged_value == 0:
merged_attr[attr] = base_attr[attr]
return merged_attr