重构伤害计算的部分代码

This commit is contained in:
qwerdvd 2023-09-11 02:31:19 +08:00
parent ca1fe55666
commit ca99169a6b
22 changed files with 1411 additions and 6150 deletions

View File

@ -1,9 +1,5 @@
from mpmath import mp from ..utils.excel.model import RelicMainAffixConfig, RelicSubAffixConfig
from ..utils.map.SR_MAP_PATH import RelicId2MainAffixGroup from ..utils.map.SR_MAP_PATH import RelicId2MainAffixGroup
from ..utils.excel.read_excel import RelicSubAffix, RelicMainAffix
mp.dps = 14
async def cal_relic_main_affix( async def cal_relic_main_affix(
@ -18,25 +14,22 @@ async def cal_relic_main_affix(
group_id = str(rarity) + str(relic_type) group_id = str(rarity) + str(relic_type)
else: else:
group_id = str(RelicId2MainAffixGroup[str(relic_id)]) group_id = str(RelicId2MainAffixGroup[str(relic_id)])
relic_data = RelicMainAffix[group_id][str(affix_id)] relic_data = RelicMainAffixConfig.Relic[group_id][str(affix_id)]
assert relic_data['GroupID'] == int(group_id) print(relic_data)
assert relic_data['AffixID'] == affix_id base_value = relic_data.BaseValue.Value
base_value = mp.mpf(relic_data['BaseValue']['Value']) level_add = relic_data.LevelAdd.Value
level_add = mp.mpf(relic_data['LevelAdd']['Value'])
value = base_value + level_add * relic_level value = base_value + level_add * relic_level
affix_property = relic_data['Property'] affix_property = relic_data.Property
return affix_property, str(value) return affix_property, value
async def cal_relic_sub_affix( async def cal_relic_sub_affix(
relic_id: int, affix_id: int, cnt: int, step: int relic_id: int, affix_id: int, cnt: int, step: int
): ):
rarity = int(str(relic_id)[0]) - 1 rarity = int(str(relic_id)[0]) - 1
relic_data = RelicSubAffix[str(rarity)][str(affix_id)] relic_data = RelicSubAffixConfig.Relic[str(rarity)][str(affix_id)]
assert relic_data['GroupID'] == int(rarity) base_value = relic_data.BaseValue.Value
assert relic_data['AffixID'] == affix_id step_value = relic_data.StepValue.Value
base_value = mp.mpf(relic_data['BaseValue']['Value'])
step_value = mp.mpf(relic_data['StepValue']['Value'])
value = base_value * cnt + step_value * step value = base_value * cnt + step_value * step
affix_property = relic_data['Property'] affix_property = relic_data.Property
return affix_property, str(value) return affix_property, value

File diff suppressed because it is too large Load Diff

View File

@ -1,35 +1,18 @@
import re
import json import json
import math import math
import re
from pathlib import Path from pathlib import Path
from typing import Dict, Union from typing import Dict, Union
from mpmath import mp, nstr
from PIL import Image, ImageDraw from PIL import Image, ImageDraw
from gsuid_core.logger import logger from gsuid_core.logger import logger
from gsuid_core.utils.image.convert import convert_img from gsuid_core.utils.image.convert import convert_img
from gsuid_core.utils.image.image_tools import draw_text_by_line from gsuid_core.utils.image.image_tools import draw_text_by_line
from .to_data import api_to_dict
from .effect.Role import RoleInstance
from .mono.Character import Character
from ..utils.error_reply import CHAR_HINT from ..utils.error_reply import CHAR_HINT
from ..utils.fonts.first_world import fw_font_28
from ..utils.excel.read_excel import light_cone_ranks from ..utils.excel.read_excel import light_cone_ranks
from ..utils.map.name_covert import name_to_avatar_id, alias_to_char_name from ..utils.fonts.first_world import fw_font_28
from ..utils.map.SR_MAP_PATH import (
RelicId2Rarity,
AvatarRelicScore,
avatarId2Name,
avatarId2DamageType,
)
from ..utils.resource.RESOURCE_PATH import (
RELIC_PATH,
SKILL_PATH,
PLAYER_PATH,
WEAPON_PATH,
CHAR_PORTRAIT_PATH,
)
from ..utils.fonts.starrail_fonts import ( from ..utils.fonts.starrail_fonts import (
sr_font_20, sr_font_20,
sr_font_23, sr_font_23,
@ -39,13 +22,28 @@ from ..utils.fonts.starrail_fonts import (
sr_font_34, sr_font_34,
sr_font_38, sr_font_38,
) )
from ..utils.map.name_covert import alias_to_char_name, name_to_avatar_id
from ..utils.map.SR_MAP_PATH import (
AvatarRelicScore,
RelicId2Rarity,
avatarId2DamageType,
avatarId2Name,
)
from ..utils.resource.RESOURCE_PATH import (
CHAR_PORTRAIT_PATH,
PLAYER_PATH,
RELIC_PATH,
SKILL_PATH,
WEAPON_PATH,
)
from .effect.Role import RoleInstance
from .mono.Character import Character
from .to_data import api_to_dict
Excel_path = Path(__file__).parent / 'effect' Excel_path = Path(__file__).parent / 'effect'
with Path.open(Excel_path / 'Excel' / 'seele.json', encoding='utf-8') as f: with Path.open(Excel_path / 'Excel' / 'SkillData.json', encoding='utf-8') as f:
skill_dict = json.load(f) skill_dict = json.load(f)
mp.dps = 14
TEXT_PATH = Path(__file__).parent / 'texture2D' TEXT_PATH = Path(__file__).parent / 'texture2D'
bg_img = Image.open(TEXT_PATH / "bg.png") bg_img = Image.open(TEXT_PATH / "bg.png")
@ -105,9 +103,8 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
1201, 1201,
1212, 1212,
]: ]:
skill_list = skill_dict[str(char.char_id)]['skilllist'] skill_list = skill_dict[str(char.char_id)]['skillList']
damage_len = len(skill_list) damage_len = len(skill_list)
# print(damage_len)
bg_height = 0 bg_height = 0
if damage_len > 0: if damage_len > 0:
bg_height = 48 * (1 + damage_len) + 48 bg_height = 48 * (1 + damage_len) + 48
@ -172,12 +169,11 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
attr_bg = Image.open(TEXT_PATH / 'attr_bg.png') attr_bg = Image.open(TEXT_PATH / 'attr_bg.png')
attr_bg_draw = ImageDraw.Draw(attr_bg) attr_bg_draw = ImageDraw.Draw(attr_bg)
# 生命值 # 生命值
hp = mp.mpf(char.base_attributes.get('hp')) hp = int(char.base_attributes.get('hp'))
add_hp = mp.mpf(char.add_attr.get('HPDelta', 0)) + hp * mp.mpf( add_hp = int(char.add_attr.get('HPDelta', 0)
char.add_attr.get('HPAddedRatio', 0) + hp
* char.add_attr.get('HPAddedRatio', 0)
) )
hp = int(mp.floor(hp))
add_hp = int(mp.floor(add_hp))
attr_bg_draw.text( attr_bg_draw.text(
(413, 31), f'{hp + add_hp}', white_color, sr_font_26, 'rm' (413, 31), f'{hp + add_hp}', white_color, sr_font_26, 'rm'
) )
@ -189,15 +185,14 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
anchor='lm', anchor='lm',
) )
# 攻击力 # 攻击力
attack = mp.mpf(char.base_attributes['attack']) attack = int(char.base_attributes['attack'])
add_attack = mp.mpf(char.add_attr.get('AttackDelta', 0)) + attack * mp.mpf( add_attack = int(char.add_attr.get('AttackDelta', 0)
char.add_attr.get('AttackAddedRatio', 0) + attack
* char.add_attr.get('AttackAddedRatio', 0)
) )
atk = int(mp.floor(attack))
add_attack = int(mp.floor(add_attack))
attr_bg_draw.text( attr_bg_draw.text(
(413, 31 + 48), (413, 31 + 48),
f'{atk + add_attack}', f'{attack + add_attack}',
white_color, white_color,
sr_font_26, sr_font_26,
'rm', 'rm',
@ -210,12 +205,11 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
anchor='lm', anchor='lm',
) )
# 防御力 # 防御力
defence = mp.mpf(char.base_attributes['defence']) defence = int(char.base_attributes['defence'])
add_defence = mp.mpf( add_defence = int(char.add_attr.get('DefenceDelta', 0)
char.add_attr.get('DefenceDelta', 0) + defence
) + defence * mp.mpf(char.add_attr.get('DefenceAddedRatio', 0)) * char.add_attr.get('DefenceAddedRatio', 0)
defence = int(mp.floor(defence)) )
add_defence = int(mp.floor(add_defence))
attr_bg_draw.text( attr_bg_draw.text(
(413, 31 + 48 * 2), (413, 31 + 48 * 2),
f'{defence + add_defence}', f'{defence + add_defence}',
@ -231,10 +225,8 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
anchor='lm', anchor='lm',
) )
# 速度 # 速度
speed = mp.mpf(char.base_attributes['speed']) speed = int(char.base_attributes['speed'])
add_speed = mp.mpf(char.add_attr.get('SpeedDelta', 0)) add_speed = int(char.add_attr.get('SpeedDelta', 0))
speed = int(mp.floor(speed))
add_speed = int(mp.floor(add_speed))
attr_bg_draw.text( attr_bg_draw.text(
(413, 31 + 48 * 3), (413, 31 + 48 * 3),
f'{speed + add_speed}', f'{speed + add_speed}',
@ -250,49 +242,45 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
anchor='lm', anchor='lm',
) )
# 暴击率 # 暴击率
critical_chance = mp.mpf(char.base_attributes['CriticalChanceBase']) critical_chance = char.base_attributes['CriticalChanceBase']
critical_chance_base = mp.mpf(char.add_attr.get('CriticalChanceBase', 0)) critical_chance_base = char.add_attr.get('CriticalChanceBase', 0)
critical_chance = (critical_chance + critical_chance_base) * 100 critical_chance = (critical_chance + critical_chance_base) * 100
critical_chance = nstr(critical_chance, 3)
attr_bg_draw.text( attr_bg_draw.text(
(500, 31 + 48 * 4), (500, 31 + 48 * 4),
f'{critical_chance}%', "{:.1f}%".format(critical_chance),
white_color, white_color,
sr_font_26, sr_font_26,
'rm', 'rm',
) )
# 暴击伤害 # 暴击伤害
critical_damage = mp.mpf(char.base_attributes['CriticalDamageBase']) critical_damage = char.base_attributes['CriticalDamageBase']
critical_damage_base = mp.mpf(char.add_attr.get('CriticalDamageBase', 0)) critical_damage_base = char.add_attr.get('CriticalDamageBase', 0)
critical_damage = (critical_damage + critical_damage_base) * 100 critical_damage = (critical_damage + critical_damage_base) * 100
critical_damage = nstr(critical_damage, 4)
attr_bg_draw.text( attr_bg_draw.text(
(500, 31 + 48 * 5), (500, 31 + 48 * 5),
f'{critical_damage}%', "{:.1f}%".format(critical_damage),
white_color, white_color,
sr_font_26, sr_font_26,
'rm', 'rm',
) )
# 效果命中 # 效果命中
status_probability_base = ( status_probability_base = (
mp.mpf(char.add_attr.get('StatusProbabilityBase', 0)) * 100 char.add_attr.get('StatusProbabilityBase', 0) * 100
) )
status_probability = nstr(status_probability_base, 3)
attr_bg_draw.text( attr_bg_draw.text(
(500, 31 + 48 * 6), (500, 31 + 48 * 6),
f'{status_probability}%', "{:.1f}%".format(status_probability_base),
white_color, white_color,
sr_font_26, sr_font_26,
'rm', 'rm',
) )
# 效果抵抗 # 效果抵抗
status_resistance_base = ( status_resistance_base = (
mp.mpf(char.add_attr.get('StatusResistanceBase', 0)) * 100 char.add_attr.get('StatusResistanceBase', 0) * 100
) )
status_resistance = nstr(status_resistance_base, 3)
attr_bg_draw.text( attr_bg_draw.text(
(500, 31 + 48 * 7), (500, 31 + 48 * 7),
f'{status_resistance}%', "{:.1f}%".format(status_resistance_base),
white_color, white_color,
sr_font_26, sr_font_26,
'rm', 'rm',
@ -475,13 +463,13 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
) )
# 主属性 # 主属性
main_value = mp.mpf(relic['MainAffix']['Value']) main_value = relic['MainAffix']['Value']
main_name: str = relic['MainAffix']['Name'] main_name: str = relic['MainAffix']['Name']
main_property: str = relic['MainAffix']['Property'] main_property: str = relic['MainAffix']['Property']
main_level: int = relic['Level'] main_level: int = relic['Level']
if main_name in ['攻击力', '生命值', '防御力', '速度']: if main_name in ['攻击力', '生命值', '防御力', '速度']:
mainValueStr = nstr(main_value, 3) mainValueStr = "{:.1f}".format(main_value)
else: else:
mainValueStr = str(math.floor(main_value * 1000) / 10) + '%' mainValueStr = str(math.floor(main_value * 1000) / 10) + '%'
@ -534,7 +522,7 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
single_relic_score += main_value_score single_relic_score += main_value_score
for index, i in enumerate(relic['SubAffixList']): for index, i in enumerate(relic['SubAffixList']):
subName: str = i['Name'] subName: str = i['Name']
subValue = mp.mpf(i['Value']) subValue = i['Value']
subProperty = i['Property'] subProperty = i['Property']
tmp_score = await get_relic_score( tmp_score = await get_relic_score(
@ -543,9 +531,9 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
single_relic_score += tmp_score single_relic_score += tmp_score
if subName in ['攻击力', '生命值', '防御力', '速度']: if subName in ['攻击力', '生命值', '防御力', '速度']:
subValueStr = nstr(subValue, 3) subValueStr = "{:.1f}".format(subValue)
else: else:
subValueStr = nstr(subValue * 100, 3) + '%' # type: ignore subValueStr = "{:.1f}".format(subValue * 100) + '%' # type: ignore
subNameStr = subName.replace('百分比', '').replace('元素', '') subNameStr = subName.replace('百分比', '').replace('元素', '')
# 副词条文字颜色 # 副词条文字颜色
relic_color = (255, 255, 255) relic_color = (255, 255, 255)

View File

@ -1,12 +1,9 @@
from typing import List from typing import List
from mpmath import mp
from gsuid_core.logger import logger from gsuid_core.logger import logger
from ..Base.AvatarBase import BaseAvatar, BaseAvatarBuff from ..Base.AvatarBase import BaseAvatar, BaseAvatarBuff
from ..Base.model import DamageInstanceSkill, DamageInstanceAvatar from ..Base.model import DamageInstanceAvatar, DamageInstanceSkill
mp.dps = 14
class Seele(BaseAvatar): class Seele(BaseAvatar):
@ -26,17 +23,15 @@ class Seele(BaseAvatar):
def eidolons(self): def eidolons(self):
if self.avatar_rank < 2: if self.avatar_rank < 2:
self.eidolon_attribute['SpeedAddedRatio'] = mp.mpf(0.25) self.eidolon_attribute['SpeedAddedRatio'] = 0.25
if self.avatar_rank >= 1: if self.avatar_rank >= 1:
self.eidolon_attribute['CriticalChanceBase'] = mp.mpf(0.15) self.eidolon_attribute['CriticalChanceBase'] = 0.15
if self.avatar_rank >= 2: if self.avatar_rank >= 2:
self.eidolon_attribute['SpeedAddedRatio'] = mp.mpf(0.5) self.eidolon_attribute['SpeedAddedRatio'] = 0.5
def extra_ability(self): def extra_ability(self):
# 额外能力 割裂 抗性穿透提高20 # 额外能力 割裂 抗性穿透提高20
self.extra_ability_attribute['QuantumResistancePenetration'] = mp.mpf( self.extra_ability_attribute['QuantumResistancePenetration'] = 0.2
0.2
)
class JingYuan(BaseAvatar): class JingYuan(BaseAvatar):
@ -56,18 +51,18 @@ class JingYuan(BaseAvatar):
def eidolons(self): def eidolons(self):
if self.avatar_rank >= 2: if self.avatar_rank >= 2:
self.eidolon_attribute['NormalDmgAdd'] = mp.mpf(0.2) self.eidolon_attribute['NormalDmgAdd'] = 0.2
self.eidolon_attribute['BPSkillDmgAdd'] = mp.mpf(0.2) self.eidolon_attribute['BPSkillDmgAdd'] = 0.2
self.eidolon_attribute['UltraDmgAdd'] = mp.mpf(0.2) self.eidolon_attribute['UltraDmgAdd'] = 0.2
if self.avatar_rank >= 6: if self.avatar_rank >= 6:
self.eidolon_attribute['Talent_DmgRatio'] = mp.mpf(0.288) self.eidolon_attribute['Talent_DmgRatio'] = 0.288
def extra_ability(self): def extra_ability(self):
logger.info('额外能力') logger.info('额外能力')
logger.info('【神君】下回合的攻击段数大于等于6段则其下回合的暴击伤害提高25%') logger.info('【神君】下回合的攻击段数大于等于6段则其下回合的暴击伤害提高25%')
self.extra_ability_attribute['CriticalDamageBase'] = mp.mpf(0.25) self.extra_ability_attribute['CriticalDamageBase'] = 0.25
logger.info('施放战技后暴击率提升10%') logger.info('施放战技后暴击率提升10%')
self.extra_ability_attribute['CriticalChanceBase'] = mp.mpf(0.1) self.extra_ability_attribute['CriticalChanceBase'] = 0.1
class Clara(BaseAvatar): class Clara(BaseAvatar):
@ -87,13 +82,13 @@ class Clara(BaseAvatar):
def eidolons(self): def eidolons(self):
if self.avatar_rank >= 2: if self.avatar_rank >= 2:
self.eidolon_attribute['AttackAddedRatio'] = mp.mpf(0.2) self.eidolon_attribute['AttackAddedRatio'] = 0.2
def extra_ability(self): def extra_ability(self):
logger.info('额外能力') logger.info('额外能力')
logger.info('史瓦罗的反击造成的伤害提高30%') logger.info('史瓦罗的反击造成的伤害提高30%')
self.extra_ability_attribute['TalentDmgAdd'] = mp.mpf(0.3) self.extra_ability_attribute['TalentDmgAdd'] = 0.3
self.extra_ability_attribute['UltraDmgAdd'] = mp.mpf(0.3) self.extra_ability_attribute['UltraDmgAdd'] = 0.3
class Danhengil(BaseAvatar): class Danhengil(BaseAvatar):
@ -113,18 +108,18 @@ class Danhengil(BaseAvatar):
def eidolons(self): def eidolons(self):
if self.avatar_rank >= 1: if self.avatar_rank >= 1:
self.eidolon_attribute['Atk_buff'] = mp.mpf(1) self.eidolon_attribute['Atk_buff'] = 1
if self.avatar_rank >= 4: if self.avatar_rank >= 4:
self.eidolon_attribute['Normal_buff'] = mp.mpf(4) self.eidolon_attribute['Normal_buff'] = 4
if self.avatar_rank >= 6: if self.avatar_rank >= 6:
self.extra_ability_attribute[ self.extra_ability_attribute[
'Normal_ImaginaryResistancePenetration' 'Normal_ImaginaryResistancePenetration'
] = mp.mpf(0.6) ] = 0.6
def extra_ability(self): def extra_ability(self):
logger.info('额外能力') logger.info('额外能力')
logger.info('对拥有虚数属性弱点的敌方目标造成伤害时暴击伤害提高24%') logger.info('对拥有虚数属性弱点的敌方目标造成伤害时暴击伤害提高24%')
self.extra_ability_attribute['CriticalDamageBase'] = mp.mpf(0.24) self.extra_ability_attribute['CriticalDamageBase'] = 0.24
class Silverwolf(BaseAvatar): class Silverwolf(BaseAvatar):
@ -144,22 +139,20 @@ class Silverwolf(BaseAvatar):
def eidolons(self): def eidolons(self):
if self.avatar_rank >= 6: if self.avatar_rank >= 6:
self.extra_ability_attribute['AllDamageAddedRatio'] = mp.mpf(1) self.extra_ability_attribute['AllDamageAddedRatio'] = 1
def extra_ability(self): def extra_ability(self):
logger.info('额外能力') logger.info('额外能力')
logger.info('战技降抗') logger.info('战技降抗')
logger.info('战技使目标全属性抗性降低的效果额外降低3%') logger.info('战技使目标全属性抗性降低的效果额外降低3%')
enemy_status_resistance = self.BPSkill_num('BPSkill_D') + 0.03 enemy_status_resistance = self.BPSkill_num('BPSkill_D') + 0.03
self.extra_ability_attribute['QuantumResistancePenetration'] = mp.mpf( self.extra_ability_attribute['QuantumResistancePenetration'] = enemy_status_resistance
enemy_status_resistance
)
logger.info('终结技降防') logger.info('终结技降防')
ultra_defence = self.Ultra_num('Ultra_D') ultra_defence = self.Ultra_num('Ultra_D')
logger.info('天赋降防') logger.info('天赋降防')
talent_defence = self.Talent() talent_defence = self.Talent()
ignore_defence = ultra_defence + talent_defence ignore_defence = ultra_defence + talent_defence
self.extra_ability_attribute['ignore_defence'] = mp.mpf(ignore_defence) self.extra_ability_attribute['ignore_defence'] = ignore_defence
class Kafka(BaseAvatar): class Kafka(BaseAvatar):
@ -179,9 +172,9 @@ class Kafka(BaseAvatar):
def eidolons(self): def eidolons(self):
if self.avatar_rank >= 1: if self.avatar_rank >= 1:
self.extra_ability_attribute['DOTDmgAdd'] = mp.mpf(0.3) self.extra_ability_attribute['DOTDmgAdd'] = 0.3
if self.avatar_rank >= 2: if self.avatar_rank >= 2:
self.extra_ability_attribute['DOTDmgAdd'] = mp.mpf(0.55) self.extra_ability_attribute['DOTDmgAdd'] = 0.55
def extra_ability(self): def extra_ability(self):
pass pass
@ -204,15 +197,15 @@ class Blade(BaseAvatar):
def eidolons(self): def eidolons(self):
if self.avatar_rank >= 2: if self.avatar_rank >= 2:
self.eidolon_attribute['CriticalChanceBase'] = mp.mpf(0.15) self.eidolon_attribute['CriticalChanceBase'] = 0.15
if self.avatar_rank >= 4: if self.avatar_rank >= 4:
self.eidolon_attribute['HPAddedRatio'] = mp.mpf(0.4) self.eidolon_attribute['HPAddedRatio'] = 0.4
def extra_ability(self): def extra_ability(self):
logger.info('额外能力') logger.info('额外能力')
logger.info('天赋施放的追加攻击伤害提高20%') logger.info('天赋施放的追加攻击伤害提高20%')
self.extra_ability_attribute['TalentDmgAdd'] = mp.mpf(0.2) self.extra_ability_attribute['TalentDmgAdd'] = 0.2
class Fuxuan(BaseAvatar): class Fuxuan(BaseAvatar):
@ -232,7 +225,7 @@ class Fuxuan(BaseAvatar):
def eidolons(self): def eidolons(self):
if self.avatar_rank >= 1: if self.avatar_rank >= 1:
self.eidolon_attribute['CriticalDamageBase'] = mp.mpf(0.3) self.eidolon_attribute['CriticalDamageBase'] = 0.3
def extra_ability(self): def extra_ability(self):
pass pass
@ -277,12 +270,12 @@ class Yanqing(BaseAvatar):
def eidolons(self): def eidolons(self):
if self.avatar_rank >= 4: if self.avatar_rank >= 4:
self.eidolon_attribute['IceResistancePenetration'] = mp.mpf(0.15) self.eidolon_attribute['IceResistancePenetration'] = 0.15
def extra_ability(self): def extra_ability(self):
logger.info('额外能力') logger.info('额外能力')
logger.info('触发暴击时速度提高10%') logger.info('触发暴击时速度提高10%')
self.extra_ability_attribute['SpeedAddedRatio'] = mp.mpf(0.1) self.extra_ability_attribute['SpeedAddedRatio'] = 0.1
logger.info('【智剑连心】增益') logger.info('【智剑连心】增益')
critical_damage_base_t = self.Talent_num('Talent_CD') critical_damage_base_t = self.Talent_num('Talent_CD')
critical_damage_base_u = self.Ultra_num('Ultra_CD') critical_damage_base_u = self.Ultra_num('Ultra_CD')
@ -292,7 +285,7 @@ class Yanqing(BaseAvatar):
critical_chance_base = self.Talent_num('Talent_CC') critical_chance_base = self.Talent_num('Talent_CC')
self.extra_ability_attribute[ self.extra_ability_attribute[
'CriticalChanceBase' 'CriticalChanceBase'
] = critical_chance_base + mp.mpf(0.6) ] = critical_chance_base + 0.6
class Welt(BaseAvatar): class Welt(BaseAvatar):
@ -317,7 +310,7 @@ class Welt(BaseAvatar):
logger.info('额外能力') logger.info('额外能力')
logger.info('施放终结技时有100%基础概率使目标受到的伤害提高12%持续2回合。') logger.info('施放终结技时有100%基础概率使目标受到的伤害提高12%持续2回合。')
logger.info('对被弱点击破的敌方目标造成的伤害提高20') logger.info('对被弱点击破的敌方目标造成的伤害提高20')
self.extra_ability_attribute['AllDamageAddedRatio'] = mp.mpf(0.32) self.extra_ability_attribute['AllDamageAddedRatio'] = 0.32
class Himeko(BaseAvatar): class Himeko(BaseAvatar):
@ -337,16 +330,16 @@ class Himeko(BaseAvatar):
def eidolons(self): def eidolons(self):
if self.avatar_rank >= 1: if self.avatar_rank >= 1:
self.eidolon_attribute['SpeedAddedRatio'] = mp.mpf(0.1) self.eidolon_attribute['SpeedAddedRatio'] = 0.1
if self.avatar_rank >= 2: if self.avatar_rank >= 2:
self.eidolon_attribute['AllDamageAddedRatio'] = mp.mpf(0.15) self.eidolon_attribute['AllDamageAddedRatio'] = 0.15
def extra_ability(self): def extra_ability(self):
logger.info('额外能力') logger.info('额外能力')
logger.info('战技对灼烧状态下的敌方目标造成的伤害提高20%') logger.info('战技对灼烧状态下的敌方目标造成的伤害提高20%')
self.extra_ability_attribute['BPSkillDmgAdd'] = mp.mpf(0.2) self.extra_ability_attribute['BPSkillDmgAdd'] = 0.2
logger.info('若当前生命值百分比大于等于80%则暴击率提高15%') logger.info('若当前生命值百分比大于等于80%则暴击率提高15%')
self.extra_ability_attribute['CriticalChanceBase'] = mp.mpf(0.15) self.extra_ability_attribute['CriticalChanceBase'] = 0.15
class Qingque(BaseAvatar): class Qingque(BaseAvatar):
@ -366,14 +359,14 @@ class Qingque(BaseAvatar):
def eidolons(self): def eidolons(self):
if self.avatar_rank >= 1: if self.avatar_rank >= 1:
self.eidolon_attribute['UltraDmgAdd'] = mp.mpf(0.1) self.eidolon_attribute['UltraDmgAdd'] = 0.1
def extra_ability(self): def extra_ability(self):
logger.info('额外能力') logger.info('额外能力')
logger.info('施放强化普攻后青雀的速度提高10%持续1回合。') logger.info('施放强化普攻后青雀的速度提高10%持续1回合。')
self.extra_ability_attribute['SpeedAddedRatio'] = mp.mpf(0.1) self.extra_ability_attribute['SpeedAddedRatio'] = 0.1
logger.info('默认4层战技加伤害') logger.info('默认4层战技加伤害')
all_damage_added_ratio = self.BPSkill() + mp.mpf(0.1) all_damage_added_ratio = self.BPSkill() + 0.1
self.extra_ability_attribute['AllDamageAddedRatio'] = ( self.extra_ability_attribute['AllDamageAddedRatio'] = (
all_damage_added_ratio * 4 all_damage_added_ratio * 4
) )
@ -398,24 +391,22 @@ class Jingliu(BaseAvatar):
def eidolons(self): def eidolons(self):
if self.avatar_rank >= 1: if self.avatar_rank >= 1:
self.eidolon_attribute['Ultra_CriticalChanceBase'] = mp.mpf(0.12) self.eidolon_attribute['Ultra_CriticalChanceBase'] = 0.12
self.eidolon_attribute['BPSkill1_CriticalChanceBase'] = mp.mpf( self.eidolon_attribute['BPSkill1_CriticalChanceBase'] = 0.12
0.12
)
if self.avatar_rank >= 2: if self.avatar_rank >= 2:
self.eidolon_attribute['UltraDmgAdd'] = mp.mpf(0.3) self.eidolon_attribute['UltraDmgAdd'] = 0.3
if self.avatar_rank >= 4: if self.avatar_rank >= 4:
self.eidolon_attribute['BPSkill1AttackAddedRatio'] = mp.mpf(0.4) self.eidolon_attribute['BPSkill1AttackAddedRatio'] = 0.4
self.eidolon_attribute['UltraAttackAddedRatio'] = mp.mpf(0.4) self.eidolon_attribute['UltraAttackAddedRatio'] = 0.4
if self.avatar_rank >= 6: if self.avatar_rank >= 6:
self.eidolon_attribute['Ultra_CriticalDamageBase'] = mp.mpf(0.5) self.eidolon_attribute['Ultra_CriticalDamageBase'] = 0.5
self.eidolon_attribute['BPSkill1_CriticalDamageBase'] = mp.mpf(0.5) self.eidolon_attribute['BPSkill1_CriticalDamageBase'] = 0.5
def extra_ability(self): def extra_ability(self):
logger.info('额外能力') logger.info('额外能力')
logger.info('【转魄】状态下造成的伤害提高10%') logger.info('【转魄】状态下造成的伤害提高10%')
self.extra_ability_attribute['BPSkill1DmgAdd'] = mp.mpf(0.1) self.extra_ability_attribute['BPSkill1DmgAdd'] = 0.1
self.extra_ability_attribute['UltraDmgAdd'] = mp.mpf(0.1) self.extra_ability_attribute['UltraDmgAdd'] = 0.1
class Avatar: class Avatar:

View File

@ -1,19 +1,38 @@
import json import json
from typing import List
from pathlib import Path
from abc import abstractmethod from abc import abstractmethod
from pathlib import Path
from typing import List
from mpmath import mp from msgspec import Struct
from ....utils.excel.model import AvatarPromotionConfig
from .model import DamageInstanceAvatar, DamageInstanceSkill
from .SkillBase import BaseSkills from .SkillBase import BaseSkills
from ....utils.excel.read_excel import AvatarPromotion
from .model import DamageInstanceSkill, DamageInstanceAvatar
path = Path(__file__).parent.parent path = Path(__file__).parent.parent
with Path.open(path / 'Excel' / 'seele.json', encoding='utf-8') as f: with Path.open(path / 'Excel' / 'SkillData.json', encoding='utf-8') as f:
skill_dict = json.load(f) skill_dict = json.load(f)
mp.dps = 14
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: class BaseAvatarBuff:
@ -53,123 +72,100 @@ class BaseAvatar:
self.avatar_promotion = char.promotion self.avatar_promotion = char.promotion
self.avatar_attribute_bonus = char.attribute_bonus self.avatar_attribute_bonus = char.attribute_bonus
self.avatar_extra_ability = char.extra_ability self.avatar_extra_ability = char.extra_ability
self.avatar_attribute = {} self.avatar_attribute = self.get_attribute()
self.get_attribute()
def get_attribute(self): def get_attribute(self):
promotion = AvatarPromotion[str(self.avatar_id)][ promotion = AvatarPromotionConfig.Avatar[
str(self.avatar_promotion) str(self.avatar_id)
] ][str(self.avatar_promotion)]
return BaseAvatarAttribute(
# 攻击力 # 攻击力
self.avatar_attribute['attack'] = mp.mpf( attack = (
promotion["AttackBase"]['Value'] promotion.AttackBase.Value
) + mp.mpf(promotion["AttackAdd"]['Value']) * (self.avatar_level - 1) + promotion.AttackAdd.Value
* (self.avatar_level - 1)
),
# 防御力 # 防御力
self.avatar_attribute['defence'] = mp.mpf( defence = (
promotion["DefenceBase"]['Value'] promotion.DefenceBase.Value
) + mp.mpf(promotion["DefenceAdd"]['Value']) * (self.avatar_level - 1) + promotion.DefenceAdd.Value
* (self.avatar_level - 1)
),
# 血量 # 血量
self.avatar_attribute['hp'] = mp.mpf( hp = (
promotion["HPBase"]['Value'] promotion.HPBase.Value
) + mp.mpf(promotion["HPAdd"]['Value']) * (self.avatar_level - 1) + promotion.HPAdd.Value
* (self.avatar_level - 1)
),
# 速度 # 速度
self.avatar_attribute['speed'] = mp.mpf( speed = promotion.SpeedBase.Value,
promotion["SpeedBase"]['Value']
)
# 暴击率 # 暴击率
self.avatar_attribute['CriticalChanceBase'] = mp.mpf( CriticalChanceBase = promotion.CriticalChance.Value,
promotion["CriticalChance"]['Value']
)
# 暴击伤害 # 暴击伤害
self.avatar_attribute['CriticalDamageBase'] = mp.mpf( CriticalDamageBase = promotion.CriticalDamage.Value,
promotion["CriticalDamage"]['Value']
)
# 嘲讽 # 嘲讽
self.avatar_attribute['BaseAggro'] = mp.mpf( BaseAggro = promotion.BaseAggro.Value
promotion["BaseAggro"]['Value']
) )
def Skill_Info(self, skill_type): def Skill_Info(self, skill_type: str):
skill_info = skill_dict[str(self.avatar_id)]['skilllist'][skill_type] skill_info = skill_dict[str(self.avatar_id)]['skillList'][skill_type]
return skill_info return skill_info
def Normalnum(self, skill_type): def Normalnum(self, skill_type: str) -> float:
return mp.mpf( return skill_dict[str(self.avatar_id)][skill_type][
skill_dict[str(self.avatar_id)][skill_type][
self.Skill.Normal_.level - 1 self.Skill.Normal_.level - 1
] ]
)
def Normal(self): def Normal(self) -> float:
return mp.mpf( return skill_dict[str(self.avatar_id)]['Normal'][
skill_dict[str(self.avatar_id)]['Normal'][
self.Skill.Normal_.level - 1 self.Skill.Normal_.level - 1
] ]
)
def BPSkill(self): def BPSkill(self) -> float:
return mp.mpf( return skill_dict[str(self.avatar_id)]['BPSkill'][
skill_dict[str(self.avatar_id)]['BPSkill'][
self.Skill.BPSkill_.level - 1 self.Skill.BPSkill_.level - 1
] ]
)
def Ultra(self): def Ultra(self) -> float:
return mp.mpf( return skill_dict[str(self.avatar_id)]['Ultra'][
skill_dict[str(self.avatar_id)]['Ultra'][
self.Skill.Ultra_.level - 1 self.Skill.Ultra_.level - 1
] ]
)
def Maze(self): def Maze(self) -> float:
return mp.mpf( return skill_dict[str(self.avatar_id)]['Maze'][self.Skill.Maze_.level - 1]
skill_dict[str(self.avatar_id)]['Maze'][self.Skill.Maze_.level - 1]
)
def Talent(self): def Talent(self) -> float:
return mp.mpf( return skill_dict[str(self.avatar_id)]['Talent'][
skill_dict[str(self.avatar_id)]['Talent'][
self.Skill.Talent_.level - 1 self.Skill.Talent_.level - 1
] ]
)
def BPSkill_num(self, skill_type): def BPSkill_num(self, skill_type) -> float:
return mp.mpf( return skill_dict[str(self.avatar_id)][skill_type][
skill_dict[str(self.avatar_id)][skill_type][
self.Skill.BPSkill_.level - 1 self.Skill.BPSkill_.level - 1
] ]
)
def Ultra_num(self, skill_type): def Ultra_num(self, skill_type) -> float:
return mp.mpf( return skill_dict[str(self.avatar_id)][skill_type][
skill_dict[str(self.avatar_id)][skill_type][
self.Skill.Ultra_.level - 1 self.Skill.Ultra_.level - 1
] ]
)
def Talent_num(self, skill_type): def Talent_num(self, skill_type) -> float:
return mp.mpf( return skill_dict[str(self.avatar_id)][skill_type][
skill_dict[str(self.avatar_id)][skill_type][
self.Skill.Talent_.level - 1 self.Skill.Talent_.level - 1
] ]
)
def Talent_add(self): def Talent_add(self) -> float:
if self.avatar_id in [1102]: if self.avatar_id in [1102]:
return mp.mpf( return float(skill_dict[str(self.avatar_id)]['Talent'][
skill_dict[str(self.avatar_id)]['Talent'][
self.Skill.Talent_.level - 1 self.Skill.Talent_.level - 1
] ])
)
elif self.avatar_id in [1205]: elif self.avatar_id in [1205]:
return mp.mpf( return float(skill_dict[str(self.avatar_id)]['BPSkill'][
skill_dict[str(self.avatar_id)]['BPSkill'][
self.Skill.BPSkill_.level - 1 self.Skill.BPSkill_.level - 1
] ])
)
else: else:
return mp.mpf(0) return float(0)
def Ultra_Use(self): def Ultra_Use(self) -> float:
return skill_dict[str(self.avatar_id)]['Ultra_Use'][0] return skill_dict[str(self.avatar_id)]['Ultra_Use'][0]

View File

@ -1,13 +1,10 @@
from typing import Dict
from abc import abstractmethod from abc import abstractmethod
from typing import Dict
from mpmath import mp
from gsuid_core.logger import logger from gsuid_core.logger import logger
from .model import DamageInstanceRelic
from ....utils.map.SR_MAP_PATH import RelicSetSkill from ....utils.map.SR_MAP_PATH import RelicSetSkill
from .model import DamageInstanceRelic
mp.dps = 14
class SingleRelic: class SingleRelic:
@ -24,17 +21,17 @@ class SingleRelic:
if self.raw_relic.MainAffix.Property in self.relic_attribute_bonus: if self.raw_relic.MainAffix.Property in self.relic_attribute_bonus:
self.relic_attribute_bonus[ self.relic_attribute_bonus[
self.raw_relic.MainAffix.Property self.raw_relic.MainAffix.Property
] += mp.mpf(self.raw_relic.MainAffix.Value) ] += self.raw_relic.MainAffix.Value
else: else:
self.relic_attribute_bonus[ self.relic_attribute_bonus[
self.raw_relic.MainAffix.Property self.raw_relic.MainAffix.Property
] = mp.mpf(self.raw_relic.MainAffix.Value) ] = self.raw_relic.MainAffix.Value
# SubAffix # SubAffix
if self.raw_relic.SubAffixList: if self.raw_relic.SubAffixList:
for sub_affix in self.raw_relic.SubAffixList: for sub_affix in self.raw_relic.SubAffixList:
sub_affix_property = sub_affix.Property sub_affix_property = sub_affix.Property
value = mp.mpf(sub_affix.Value) value = sub_affix.Value
if sub_affix_property in self.relic_attribute_bonus: if sub_affix_property in self.relic_attribute_bonus:
self.relic_attribute_bonus[sub_affix_property] += value self.relic_attribute_bonus[sub_affix_property] += value
else: else:
@ -70,13 +67,13 @@ class BaseRelicSetSkill:
def set_skill_property_ability(self): def set_skill_property_ability(self):
set_property = '' set_property = ''
set_value = mp.mpf(0) set_value = 0
if self.pieces2 and RelicSetSkill[str(self.setId)]['2'] != {}: if self.pieces2 and RelicSetSkill[str(self.setId)]['2'] != {}:
set_property = RelicSetSkill[str(self.setId)]['2']['Property'] set_property = RelicSetSkill[str(self.setId)]['2']['Property']
set_value = mp.mpf(RelicSetSkill[str(self.setId)]['2']['Value']) set_value = RelicSetSkill[str(self.setId)]['2']['Value']
if self.pieces4 and RelicSetSkill[str(self.setId)]['4'] != {}: if self.pieces4 and RelicSetSkill[str(self.setId)]['4'] != {}:
set_property = RelicSetSkill[str(self.setId)]['4']['Property'] set_property = RelicSetSkill[str(self.setId)]['4']['Property']
set_value = mp.mpf(RelicSetSkill[str(self.setId)]['4']['Value']) set_value = RelicSetSkill[str(self.setId)]['4']['Value']
if set_property != '': if set_property != '':
if set_property in self.relicSetAttribute: if set_property in self.relicSetAttribute:
self.relicSetAttribute[set_property] = ( self.relicSetAttribute[set_property] = (

View File

@ -1,16 +1,11 @@
import json import json
from typing import List
from pathlib import Path from pathlib import Path
from typing import List
from mpmath import mp from .model import DamageInstanceAvatar, DamageInstanceSkill
from .model import DamageInstanceSkill, DamageInstanceAvatar
mp.dps = 14
path = Path(__file__).parent.parent path = Path(__file__).parent.parent
with Path.open(path / 'Excel' / 'seele.json', encoding='utf-8') as f: with Path.open(path / 'Excel' / 'SkillData.json', encoding='utf-8') as f:
skill_dict = json.load(f) skill_dict = json.load(f)

View File

@ -1,13 +1,24 @@
from typing import Dict
from abc import abstractmethod from abc import abstractmethod
from typing import Dict
from mpmath import mp from msgspec import Struct
from .model import DamageInstanceWeapon from ....utils.excel.model import EquipmentPromotionConfig
from ....utils.excel.read_excel import EquipmentPromotion
from ....utils.map.SR_MAP_PATH import EquipmentID2AbilityProperty from ....utils.map.SR_MAP_PATH import EquipmentID2AbilityProperty
from .model import DamageInstanceWeapon
mp.dps = 14
class BaseWeaponAttribute(Struct):
hp: float
attack: float
defence: float
def items(self):
return [
('hp', self.hp),
('attack', self.attack),
('defence', self.defence)
]
class BaseWeapon: class BaseWeapon:
@ -16,7 +27,7 @@ class BaseWeapon:
self.weapon_level = weapon.level self.weapon_level = weapon.level
self.weapon_rank = weapon.rank self.weapon_rank = weapon.rank
self.weapon_promotion = weapon.promotion self.weapon_promotion = weapon.promotion
self.weapon_base_attribute = {} self.weapon_base_attribute = self.get_attribute()
self.weapon_attribute = {} self.weapon_attribute = {}
self.get_attribute() self.get_attribute()
self.weapon_property_ability() self.weapon_property_ability()
@ -47,22 +58,25 @@ class BaseWeapon:
... ...
def get_attribute(self): def get_attribute(self):
promotion = EquipmentPromotion[str(self.weapon_id)][ promotion = EquipmentPromotionConfig.Equipment[
str(self.weapon_promotion) str(self.weapon_id)
] ][str(self.weapon_promotion)]
print(promotion)
self.weapon_base_attribute['hp'] = mp.mpf( return BaseWeaponAttribute(
promotion["BaseHP"]['Value'] hp = (
) + mp.mpf(promotion["BaseHPAdd"]['Value']) * (self.weapon_level - 1) promotion.BaseHP.Value
+ promotion.BaseHPAdd.Value
self.weapon_base_attribute['attack'] = mp.mpf( * (self.weapon_level - 1)
promotion["BaseAttack"]['Value'] ),
) + mp.mpf(promotion["BaseAttackAdd"]['Value']) * ( attack = (
self.weapon_level - 1 promotion.BaseAttack.Value
+ promotion.BaseAttackAdd.Value
* (self.weapon_level - 1)
),
defence = (
promotion.BaseDefence.Value
+ promotion.BaseDefenceAdd.Value
* (self.weapon_level - 1)
) )
self.weapon_base_attribute['defence'] = mp.mpf(
promotion["BaseDefence"]['Value']
) + mp.mpf(promotion["BaseDefenceAdd"]['Value']) * (
self.weapon_level - 1
) )

View File

@ -18,14 +18,14 @@ class DamageInstanceRelicSubAffix(Struct):
Name: str Name: str
Cnt: int Cnt: int
Step: int Step: int
Value: str Value: float
class DamageInstanceRelicMainAffix(Struct): class DamageInstanceRelicMainAffix(Struct):
AffixID: int AffixID: int
Property: str Property: str
Name: str Name: str
Value: str Value: float
class DamageInstanceRelic(Struct): class DamageInstanceRelic(Struct):

View File

@ -1,9 +0,0 @@
{
"1102": [
{
"id": 1102102,
"property": "QuantumResistancePenetration",
"value": 0.2
}
]
}

View File

@ -1,9 +0,0 @@
{
"1102": [
{
"rank": 1,
"property" :"CriticalDamageBase",
"value": 0.2
}
]
}

View File

@ -0,0 +1,604 @@
{
"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"],
"BPSkill": ["attack", "战技", 1, "BPSkill"],
"Ultra": ["attack", "终结技", 1, "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"],
"BPSkill": ["attack", "战技", 1, "BPSkill"],
"Ultra": ["attack", "终结技", 1, "Ultra"],
"Talent": ["attack", "10层神君", 1, "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
],
"Ultra": [
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"],
"BPSkill": ["attack", "战技", 1, "BPSkill"],
"Ultra": ["attack", "强化反击", 1, "Ultra"],
"Talent": ["attack", "反击", 1, "Talent"]
}
},
"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"],
"Normal1": ["attack", "瞬华", 3, "Normal1"],
"Normal2": ["attack", "天矢阴", 5, "Normal2"],
"Normal3": ["attack", "盘拏耀跃", 7, "Normal3"],
"Ultra": ["attack", "终结技", 3, "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"],
"BPSkill": ["attack", "战技", 1, "BPSkill"],
"Ultra": ["attack", "终结技", 1, "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"],
"BPSkill": ["attack", "战技", 1, "BPSkill"],
"Ultra": ["attack", "终结技", 1, "Ultra"],
"DOT": ["attack", "单次持续伤害", 1, "DOT"],
"Talent": ["attack", "追加攻击", 1, "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"],
"Normal1": ["attack", "无间剑树", 1, "Normal1"],
"Ultra": ["attack", "终结技", 1, "Ultra"],
"Talent": ["attack", "追加攻击", 1, "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"],
"Ultra": ["attack", "终结技", 1, "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"],
"BPSkill": ["attack", "战技", 1, "BPSkill"],
"Ultra": ["defence", "终结技(护盾)", 1, "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"],
"BPSkill": ["attack", "战技", 1, "BPSkill"],
"Ultra": ["attack", "终结技", 1, "Ultra"],
"Talent": ["attack", "附加伤害", 1, "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"],
"BPSkill": ["attack", "战技", 3, "BPSkill"],
"Ultra": ["attack", "终结技", 1, "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"],
"BPSkill": ["attack", "战技", 1, "BPSkill"],
"Ultra": ["attack", "终结技", 1, "Ultra"],
"Talent": ["attack", "追加攻击", 1, "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"],
"Normal1": ["attack", "杠上开花!", 1, "Normal1"],
"Ultra": ["attack", "终结技", 1, "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.2000000005122274, 1.3200000006705523, 1.440000000828877,
1.560000000558794, 1.680000000214204, 1.800000000372529,
1.950000000745058, 2.100000000419095, 2.250000000860302,
2.400000000232831, 2.5200000003911555, 2.64000000054948,
2.760000000707805, 2.88000000086613, 3.00000000093132
],
"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": [
0.60000000037252903, 0.66000000040978193, 0.72000000044703484,
0.7800000004842877, 0.8400000005215406, 0.9000000005587935,
0.9800000006053597, 1.0500000006519258, 1.1200000006984919,
1.2000000007450581, 1.260000000782311, 1.3200000008195639,
1.3800000008568168, 1.4400000008940697, 1.5000000008940697
],
"Maze": [20],
"Ultra_Use": [140],
"skillList": {
"Normal": ["attack", "普攻", 1, "Normal"],
"BPSkill": ["attack", "战技", 1, "BPSkill"],
"BPSkill1": ["attack", "寒川映月", 1, "BPSkill1"],
"Ultra": ["attack", "终结技", 1, "Ultra"]
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,11 @@
from typing import Dict, List
from collections import Counter from collections import Counter
from typing import Dict, List
from mpmath import mp
from gsuid_core.logger import logger from gsuid_core.logger import logger
from ..utils import merge_attribute
from ..Base.model import DamageInstanceRelic from ..Base.model import DamageInstanceRelic
from ..Base.RelicBase import SingleRelic, BaseRelicSetSkill from ..Base.RelicBase import BaseRelicSetSkill, SingleRelic
from ..utils import merge_attribute
class Relic101(BaseRelicSetSkill): class Relic101(BaseRelicSetSkill):
@ -40,9 +39,7 @@ class Relic102(BaseRelicSetSkill):
async def set_skill_ability(self, base_attr: Dict, attribute_bonus: Dict): async def set_skill_ability(self, base_attr: Dict, attribute_bonus: Dict):
if self.pieces4 and await self.check(base_attr, attribute_bonus): if self.pieces4 and await self.check(base_attr, attribute_bonus):
a_dmg = attribute_bonus.get('NormalDmgAdd', 0) a_dmg = attribute_bonus.get('NormalDmgAdd', 0)
attribute_bonus['NormalDmgAdd'] = a_dmg + mp.mpf( attribute_bonus['NormalDmgAdd'] = a_dmg + 0.10000000018626451
0.10000000018626451
)
return attribute_bonus return attribute_bonus
@ -62,7 +59,7 @@ class Relic103(BaseRelicSetSkill):
shield_added_ratio = attribute_bonus.get('shield_added_ratio', 0) shield_added_ratio = attribute_bonus.get('shield_added_ratio', 0)
attribute_bonus[ attribute_bonus[
'shield_added_ratio' 'shield_added_ratio'
] = shield_added_ratio + mp.mpf(0.20000000018626451) ] = shield_added_ratio + 0.20000000018626451
return attribute_bonus return attribute_bonus
@ -82,7 +79,7 @@ class Relic104(BaseRelicSetSkill):
critical_damage_base = attribute_bonus.get('CriticalDamageBase', 0) critical_damage_base = attribute_bonus.get('CriticalDamageBase', 0)
attribute_bonus[ attribute_bonus[
'CriticalDamageBase' 'CriticalDamageBase'
] = critical_damage_base + mp.mpf(0.25000000023283064) ] = critical_damage_base + 0.25000000023283064
return attribute_bonus return attribute_bonus
@ -100,9 +97,7 @@ class Relic105(BaseRelicSetSkill):
async def set_skill_ability(self, base_attr: Dict, attribute_bonus: Dict): async def set_skill_ability(self, base_attr: Dict, attribute_bonus: Dict):
if self.pieces4 and await self.check(base_attr, attribute_bonus): if self.pieces4 and await self.check(base_attr, attribute_bonus):
attack_added_ratio = attribute_bonus.get('AttackAddedRatio', 0) attack_added_ratio = attribute_bonus.get('AttackAddedRatio', 0)
attribute_bonus['AttackAddedRatio'] = ( attribute_bonus['AttackAddedRatio'] = attack_added_ratio + 0.05000000004656613 * 5
attack_added_ratio + mp.mpf(0.05000000004656613) * 5
)
return attribute_bonus return attribute_bonus
@ -138,17 +133,11 @@ class Relic107(BaseRelicSetSkill):
if self.pieces4: if self.pieces4:
e_dmg = attribute_bonus.get('BPSkillDmgAdd', {}) e_dmg = attribute_bonus.get('BPSkillDmgAdd', {})
q_dmg = attribute_bonus.get('UltraSkillDmgAdd', {}) q_dmg = attribute_bonus.get('UltraSkillDmgAdd', {})
attribute_bonus['BPSkillDmgAdd'] = e_dmg + mp.mpf( attribute_bonus['BPSkillDmgAdd'] = e_dmg + 0.12000000011175871
0.12000000011175871 attribute_bonus['UltraSkillDmgAdd'] = q_dmg + 0.12000000011175871
)
attribute_bonus['UltraSkillDmgAdd'] = q_dmg + mp.mpf(
0.12000000011175871
)
if self.pieces4 and await self.check(base_attr, attribute_bonus): if self.pieces4 and await self.check(base_attr, attribute_bonus):
fire_added_ratio = attribute_bonus.get('FireAddedRatio', {}) fire_added_ratio = attribute_bonus.get('FireAddedRatio', {})
attribute_bonus['FireAddedRatio'] = fire_added_ratio + mp.mpf( attribute_bonus['FireAddedRatio'] = fire_added_ratio + 0.12000000011175871
0.12000000011175871
)
return attribute_bonus return attribute_bonus
@ -168,9 +157,7 @@ class Relic108(BaseRelicSetSkill):
if self.pieces4 and await self.check(base_attr, attribute_bonus): if self.pieces4 and await self.check(base_attr, attribute_bonus):
logger.info(attribute_bonus) logger.info(attribute_bonus)
ignore_defence = attribute_bonus.get('ignore_defence', 0) ignore_defence = attribute_bonus.get('ignore_defence', 0)
attribute_bonus['ignore_defence'] = ( attribute_bonus['ignore_defence'] = ignore_defence + 0.10000000009313226 * 2
ignore_defence + mp.mpf(0.10000000009313226) * 2
)
return attribute_bonus return attribute_bonus
@ -189,9 +176,7 @@ class Relic109(BaseRelicSetSkill):
if self.pieces4 and await self.check(base_attr, attribute_bonus): if self.pieces4 and await self.check(base_attr, attribute_bonus):
logger.info(attribute_bonus) logger.info(attribute_bonus)
attack_added_ratio = attribute_bonus.get('AttackAddedRatio', 0) attack_added_ratio = attribute_bonus.get('AttackAddedRatio', 0)
attribute_bonus['AttackAddedRatio'] = attack_added_ratio + mp.mpf( attribute_bonus['AttackAddedRatio'] = attack_added_ratio + 0.20000000018626451
0.20000000018626451
)
return attribute_bonus return attribute_bonus
@ -251,13 +236,13 @@ class Relic112(BaseRelicSetSkill):
critical_chance_base = attribute_bonus.get('CriticalChanceBase', 0) critical_chance_base = attribute_bonus.get('CriticalChanceBase', 0)
attribute_bonus[ attribute_bonus[
'CriticalChanceBase' 'CriticalChanceBase'
] = critical_chance_base + mp.mpf(0.10000000009313226) ] = critical_chance_base + 0.10000000009313226
if self.pieces4 and await self.check(base_attr, attribute_bonus): if self.pieces4 and await self.check(base_attr, attribute_bonus):
logger.info('对陷入禁锢状态的敌方目标造成伤害') logger.info('对陷入禁锢状态的敌方目标造成伤害')
critical_damage_base = attribute_bonus.get('CriticalDamageBase', 0) critical_damage_base = attribute_bonus.get('CriticalDamageBase', 0)
attribute_bonus[ attribute_bonus[
'CriticalDamageBase' 'CriticalDamageBase'
] = critical_damage_base + mp.mpf(0.20000000018626451) ] = critical_damage_base + 0.20000000018626451
return attribute_bonus return attribute_bonus
@ -277,9 +262,7 @@ class Relic113(BaseRelicSetSkill):
if self.pieces4 and await self.check(base_attr, attribute_bonus): if self.pieces4 and await self.check(base_attr, attribute_bonus):
logger.info('当装备者受到攻击或被我方目标消耗生命值后') logger.info('当装备者受到攻击或被我方目标消耗生命值后')
critical_chance_base = attribute_bonus.get('CriticalChanceBase', 0) critical_chance_base = attribute_bonus.get('CriticalChanceBase', 0)
attribute_bonus['CriticalChanceBase'] = ( attribute_bonus['CriticalChanceBase'] = critical_chance_base + 0.08000000009313226 * 2
critical_chance_base + mp.mpf(0.08000000009313226) * 2
)
return attribute_bonus return attribute_bonus
@ -298,9 +281,7 @@ class Relic114(BaseRelicSetSkill):
async def set_skill_ability(self, base_attr: Dict, attribute_bonus: Dict): async def set_skill_ability(self, base_attr: Dict, attribute_bonus: Dict):
if self.pieces4 and await self.check(base_attr, attribute_bonus): if self.pieces4 and await self.check(base_attr, attribute_bonus):
speed_added_ratio = attribute_bonus.get('SpeedAddedRatio', 0) speed_added_ratio = attribute_bonus.get('SpeedAddedRatio', 0)
attribute_bonus['SpeedAddedRatio'] = speed_added_ratio + mp.mpf( attribute_bonus['SpeedAddedRatio'] = speed_added_ratio + 0.12000000011175871
0.12000000011175871
)
return attribute_bonus return attribute_bonus
@ -313,7 +294,7 @@ class Relic301(BaseRelicSetSkill):
装备者的速度大于等于120 装备者的速度大于等于120
''' '''
merged_attr = await merge_attribute(base_attr, attribute_bonus) merged_attr = await merge_attribute(base_attr, attribute_bonus)
if merged_attr['speed'] >= mp.mpf(120): if merged_attr['speed'] >= 120:
logger.info('Relic306 check success') logger.info('Relic306 check success')
return True return True
return None return None
@ -321,9 +302,7 @@ class Relic301(BaseRelicSetSkill):
async def set_skill_ability(self, base_attr: Dict, attribute_bonus: Dict): async def set_skill_ability(self, base_attr: Dict, attribute_bonus: Dict):
if self.pieces2 and await self.check(base_attr, attribute_bonus): if self.pieces2 and await self.check(base_attr, attribute_bonus):
attack_added_ratio = attribute_bonus.get('AttackAddedRatio', 0) attack_added_ratio = attribute_bonus.get('AttackAddedRatio', 0)
attribute_bonus['AttackAddedRatio'] = attack_added_ratio + mp.mpf( attribute_bonus['AttackAddedRatio'] = attack_added_ratio + 0.12000000011175871
0.12000000011175871
)
return attribute_bonus return attribute_bonus
@ -336,7 +315,7 @@ class Relic302(BaseRelicSetSkill):
装备者的速度大于等于120 装备者的速度大于等于120
''' '''
merged_attr = await merge_attribute(base_attr, attribute_bonus) merged_attr = await merge_attribute(base_attr, attribute_bonus)
if merged_attr['speed'] >= mp.mpf(120): if merged_attr['speed'] >= 120:
logger.info('Relic306 check success') logger.info('Relic306 check success')
return True return True
return None return None
@ -344,9 +323,7 @@ class Relic302(BaseRelicSetSkill):
async def set_skill_ability(self, base_attr: Dict, attribute_bonus: Dict): async def set_skill_ability(self, base_attr: Dict, attribute_bonus: Dict):
if self.pieces2 and await self.check(base_attr, attribute_bonus): if self.pieces2 and await self.check(base_attr, attribute_bonus):
attack_added_ratio = attribute_bonus.get('AttackAddedRatio', 0) attack_added_ratio = attribute_bonus.get('AttackAddedRatio', 0)
attribute_bonus['AttackAddedRatio'] = attack_added_ratio + mp.mpf( attribute_bonus['AttackAddedRatio'] = attack_added_ratio + 0.0800000000745058
0.0800000000745058
)
return attribute_bonus return attribute_bonus
@ -365,7 +342,7 @@ class Relic303(BaseRelicSetSkill):
status_probability = merged_attr.get('StatusProbabilityBase', 0) status_probability = merged_attr.get('StatusProbabilityBase', 0)
# 提高装备者等同于当前效果命中25%的攻击力,最多提高25% # 提高装备者等同于当前效果命中25%的攻击力,最多提高25%
attribute_bonus['AttackAddedRatio'] = attack_added_ratio + min( attribute_bonus['AttackAddedRatio'] = attack_added_ratio + min(
mp.mpf(0.25000000023283064), status_probability / mp.mpf(0.25) 0.25000000023283064, status_probability / 0.25
) )
return attribute_bonus return attribute_bonus
@ -379,7 +356,7 @@ class Relic304(BaseRelicSetSkill):
备者的效果命中大于等于50% 备者的效果命中大于等于50%
''' '''
merged_attr = await merge_attribute(base_attr, attribute_bonus) merged_attr = await merge_attribute(base_attr, attribute_bonus)
if merged_attr['StatusResistanceBase'] >= mp.mpf(0.5000000004656613): if merged_attr['StatusResistanceBase'] >= 0.5000000004656613:
logger.info('Relic306 check success') logger.info('Relic306 check success')
return True return True
return None return None
@ -389,7 +366,7 @@ class Relic304(BaseRelicSetSkill):
defence_added_ratio = attribute_bonus.get('DefenceAddedRatio', 0) defence_added_ratio = attribute_bonus.get('DefenceAddedRatio', 0)
attribute_bonus[ attribute_bonus[
'DefenceAddedRatio' 'DefenceAddedRatio'
] = defence_added_ratio + mp.mpf(0.1500000001396984) ] = defence_added_ratio + 0.1500000001396984
return attribute_bonus return attribute_bonus
@ -402,7 +379,7 @@ class Relic305(BaseRelicSetSkill):
装备者的暴击伤害大于等于120% 装备者的暴击伤害大于等于120%
''' '''
merged_attr = await merge_attribute(base_attr, attribute_bonus) merged_attr = await merge_attribute(base_attr, attribute_bonus)
if merged_attr['CriticalDamageBase'] >= mp.mpf(1.2000000001862645): if merged_attr['CriticalDamageBase'] >= 1.2000000001862645:
logger.info('Relic306 check success') logger.info('Relic306 check success')
return True return True
return None return None
@ -412,7 +389,7 @@ class Relic305(BaseRelicSetSkill):
critical_chance_base = attribute_bonus.get('CriticalChanceBase', 0) critical_chance_base = attribute_bonus.get('CriticalChanceBase', 0)
attribute_bonus[ attribute_bonus[
'CriticalChanceBase' 'CriticalChanceBase'
] = critical_chance_base + mp.mpf(0.6000000005587935) ] = critical_chance_base + 0.6000000005587935
return attribute_bonus return attribute_bonus
@ -425,7 +402,7 @@ class Relic306(BaseRelicSetSkill):
装备者当前暴击率大于等于50% 装备者当前暴击率大于等于50%
''' '''
merged_attr = await merge_attribute(base_attr, attribute_bonus) merged_attr = await merge_attribute(base_attr, attribute_bonus)
if merged_attr['CriticalChanceBase'] >= mp.mpf(0.5): if merged_attr['CriticalChanceBase'] >= 0.5:
logger.info('Relic306 check success') logger.info('Relic306 check success')
return True return True
return None return None
@ -433,11 +410,9 @@ class Relic306(BaseRelicSetSkill):
async def set_skill_ability(self, base_attr: Dict, attribute_bonus: Dict): async def set_skill_ability(self, base_attr: Dict, attribute_bonus: Dict):
if self.pieces2 and await self.check(base_attr, attribute_bonus): if self.pieces2 and await self.check(base_attr, attribute_bonus):
q_dmg = attribute_bonus.get('UltraDmgAdd', 0) q_dmg = attribute_bonus.get('UltraDmgAdd', 0)
attribute_bonus['UltraDmgAdd'] = q_dmg + mp.mpf(0.1500000001396984) attribute_bonus['UltraDmgAdd'] = q_dmg + 0.1500000001396984
a3_dmg = attribute_bonus.get('TalentDmgAdd', 0) a3_dmg = attribute_bonus.get('TalentDmgAdd', 0)
attribute_bonus['TalentDmgAdd'] = a3_dmg + mp.mpf( attribute_bonus['TalentDmgAdd'] = a3_dmg + 0.1500000001396984
0.1500000001396984
)
return attribute_bonus return attribute_bonus
@ -450,7 +425,7 @@ class Relic307(BaseRelicSetSkill):
装备者的速度大于等于145 装备者的速度大于等于145
''' '''
merged_attr = await merge_attribute(base_attr, attribute_bonus) merged_attr = await merge_attribute(base_attr, attribute_bonus)
if merged_attr['speed'] >= mp.mpf(145): if merged_attr['speed'] >= 145:
logger.info('Relic306 check success') logger.info('Relic306 check success')
return True return True
return None return None
@ -462,7 +437,7 @@ class Relic307(BaseRelicSetSkill):
) )
attribute_bonus[ attribute_bonus[
'BreakDamageAddedRatioBase' 'BreakDamageAddedRatioBase'
] = break_damage_added_ratio_base + mp.mpf(0.20000000018626451) ] = break_damage_added_ratio_base + 0.20000000018626451
return attribute_bonus return attribute_bonus
@ -475,7 +450,7 @@ class Relic308(BaseRelicSetSkill):
装备者的速度大于等于120 装备者的速度大于等于120
''' '''
merged_attr = await merge_attribute(base_attr, attribute_bonus) merged_attr = await merge_attribute(base_attr, attribute_bonus)
if merged_attr['speed'] >= mp.mpf(120): if merged_attr['speed'] >= 120:
logger.info('Relic306 check success') logger.info('Relic306 check success')
return True return True
return None return None
@ -495,7 +470,7 @@ class Relic309(BaseRelicSetSkill):
当装备者的当前暴击率大于等于70%普攻和战技造成的伤害提高20% 当装备者的当前暴击率大于等于70%普攻和战技造成的伤害提高20%
''' '''
merged_attr = await merge_attribute(base_attr, attribute_bonus) merged_attr = await merge_attribute(base_attr, attribute_bonus)
if merged_attr['CriticalChanceBase'] >= mp.mpf(0.7): if merged_attr['CriticalChanceBase'] >= 0.7:
logger.info('Relic309 check success') logger.info('Relic309 check success')
return True return True
return None return None
@ -503,13 +478,9 @@ class Relic309(BaseRelicSetSkill):
async def set_skill_ability(self, base_attr: Dict, attribute_bonus: Dict): async def set_skill_ability(self, base_attr: Dict, attribute_bonus: Dict):
if self.pieces2 and await self.check(base_attr, attribute_bonus): if self.pieces2 and await self.check(base_attr, attribute_bonus):
a_dmg = attribute_bonus.get('NormalDmgAdd', 0) a_dmg = attribute_bonus.get('NormalDmgAdd', 0)
attribute_bonus['NormalDmgAdd'] = a_dmg + mp.mpf( attribute_bonus['NormalDmgAdd'] = a_dmg + 0.20000000018626451
0.20000000018626451
)
a2_dmg = attribute_bonus.get('BPSkillDmgAdd', 0) a2_dmg = attribute_bonus.get('BPSkillDmgAdd', 0)
attribute_bonus['BPSkillDmgAdd'] = a2_dmg + mp.mpf( attribute_bonus['BPSkillDmgAdd'] = a2_dmg + 0.20000000018626451
0.20000000018626451
)
return attribute_bonus return attribute_bonus
@ -522,7 +493,7 @@ class Relic310(BaseRelicSetSkill):
当装备者的效果抵抗大于等于30%我方全体暴击伤害提高10% 当装备者的效果抵抗大于等于30%我方全体暴击伤害提高10%
''' '''
merged_attr = await merge_attribute(base_attr, attribute_bonus) merged_attr = await merge_attribute(base_attr, attribute_bonus)
if merged_attr['StatusResistanceBase'] >= mp.mpf(0.3): if merged_attr['StatusResistanceBase'] >= 0.3:
logger.info('Relic310 check success') logger.info('Relic310 check success')
return True return True
return None return None
@ -532,7 +503,7 @@ class Relic310(BaseRelicSetSkill):
critical_damage_base = attribute_bonus.get('CriticalDamageBase', 0) critical_damage_base = attribute_bonus.get('CriticalDamageBase', 0)
attribute_bonus[ attribute_bonus[
'CriticalDamageBase' 'CriticalDamageBase'
] = critical_damage_base + mp.mpf(0.10000000018626451) ] = critical_damage_base + 0.10000000018626451
return attribute_bonus return attribute_bonus

View File

@ -1,14 +1,11 @@
from mpmath import mp
from gsuid_core.logger import logger from gsuid_core.logger import logger
from .Avatar.Avatar import Avatar
from .Weapon.Weapon import Weapon
from .utils import merge_attribute
from ..mono.Character import Character from ..mono.Character import Character
from .Avatar.Avatar import Avatar
from .Base.model import DamageInstance from .Base.model import DamageInstance
from .Relic.Relic import RelicSet, SingleRelic from .Relic.Relic import RelicSet, SingleRelic
from .utils import merge_attribute
mp.dps = 14 from .Weapon.Weapon import Weapon
class RoleInstance: class RoleInstance:
@ -19,10 +16,9 @@ class RoleInstance:
self.weapon = Weapon.create(self.raw_data.weapon) self.weapon = Weapon.create(self.raw_data.weapon)
self.relic_set = RelicSet.create(self.raw_data.relic) self.relic_set = RelicSet.create(self.raw_data.relic)
self.base_attr = {} self.base_attr = self.cal_role_base_attr()
self.attribute_bonus = {} self.attribute_bonus = {}
self.cal_role_base_attr()
self.cal_relic_attr_add() self.cal_relic_attr_add()
self.cal_avatar_attr_add() self.cal_avatar_attr_add()
self.cal_avatar_eidolon_add() self.cal_avatar_eidolon_add()
@ -30,24 +26,23 @@ class RoleInstance:
def cal_role_base_attr(self): def cal_role_base_attr(self):
logger.info('cal_role_base_attr') logger.info('cal_role_base_attr')
avatar_attribute = self.avatar.__dict__['avatar_attribute'] base_attr = {}
logger.info(avatar_attribute) avatar_attribute = self.avatar.avatar_attribute
for attribute in avatar_attribute: for attr_name, attr_value in avatar_attribute.items():
if attribute in self.base_attr: if attr_name in base_attr:
self.base_attr[attribute] += avatar_attribute[attribute] base_attr[attr_name] += attr_value
else: else:
self.base_attr[attribute] = avatar_attribute[attribute] base_attr[attr_name] = attr_value
weapon_attribute = self.weapon.__dict__['weapon_base_attribute'] weapon_attribute = self.weapon.weapon_base_attribute
for attribute in weapon_attribute: for attr_name, attr_value in weapon_attribute.items():
if attribute in self.base_attr: if attr_name in base_attr:
self.base_attr[attribute] += weapon_attribute[attribute] base_attr[attr_name] += attr_value
else: else:
self.base_attr[attribute] = weapon_attribute[attribute] base_attr[attr_name] = attr_value
return base_attr
def cal_relic_attr_add(self): def cal_relic_attr_add(self):
if self.attribute_bonus is None:
raise Exception('attribute_bonus is None')
# 单件属性 # 单件属性
for relic_type in self.relic_set.__dict__: for relic_type in self.relic_set.__dict__:
if type(self.relic_set.__dict__[relic_type]) == SingleRelic: if type(self.relic_set.__dict__[relic_type]) == SingleRelic:
@ -80,17 +75,13 @@ class RoleInstance:
for bonus in attribute_bonus: for bonus in attribute_bonus:
status_add = bonus.statusAdd status_add = bonus.statusAdd
bonus_property = status_add.property bonus_property = status_add.property
value = mp.mpf(status_add.value) value = status_add.value
if self.attribute_bonus is None:
raise Exception('attribute_bonus is None')
if bonus_property in self.attribute_bonus: if bonus_property in self.attribute_bonus:
self.attribute_bonus[bonus_property] += value self.attribute_bonus[bonus_property] += value
else: else:
self.attribute_bonus[bonus_property] = value self.attribute_bonus[bonus_property] = value
def cal_avatar_eidolon_add(self): def cal_avatar_eidolon_add(self):
if self.attribute_bonus is None:
raise Exception('attribute_bonus is None')
for attribute in self.avatar.eidolon_attribute: for attribute in self.avatar.eidolon_attribute:
if attribute in self.attribute_bonus: if attribute in self.attribute_bonus:
self.attribute_bonus[ self.attribute_bonus[
@ -111,19 +102,17 @@ class RoleInstance:
] = self.avatar.extra_ability_attribute[attribute] ] = self.avatar.extra_ability_attribute[attribute]
def cal_weapon_attr_add(self): def cal_weapon_attr_add(self):
if self.attribute_bonus is None: for attribute in self.weapon.weapon_attribute:
raise Exception('attribute_bonus is None')
for attribute in self.weapon.__dict__['weapon_attribute']:
if attribute in self.attribute_bonus: if attribute in self.attribute_bonus:
self.attribute_bonus[attribute] += self.weapon.__dict__[ self.attribute_bonus[attribute] += self.weapon.weapon_attribute[
'weapon_attribute' attribute
][attribute] ]
else: else:
self.attribute_bonus[attribute] = self.weapon.__dict__[ self.attribute_bonus[attribute] = self.weapon.weapon_attribute[
'weapon_attribute' attribute
][attribute] ]
async def cal_damage(self, skill_type): async def cal_damage(self, skill_type: str):
logger.info('base_attr') logger.info('base_attr')
logger.info(self.base_attr) logger.info(self.base_attr)
logger.info('attribute_bonus') logger.info('attribute_bonus')
@ -189,20 +178,16 @@ class RoleInstance:
) )
self.attribute_bonus[ self.attribute_bonus[
'CriticalChanceBase' 'CriticalChanceBase'
] = critical_chance_base + mp.mpf(fx_cc_up) ] = critical_chance_base + fx_cc_up
hp_added_ratio = self.attribute_bonus.get('HPAddedRatio', 0) hp_added_ratio = self.attribute_bonus.get('HPAddedRatio', 0)
self.attribute_bonus['HPAddedRatio'] = hp_added_ratio + mp.mpf( self.attribute_bonus['HPAddedRatio'] = hp_added_ratio + fx_hp_up
fx_hp_up
)
# 检查武器战斗生效的buff # 检查武器战斗生效的buff
logger.info('检查武器战斗生效的buff') logger.info('检查武器战斗生效的buff')
Ultra_Use = self.avatar.Ultra_Use() Ultra_Use = self.avatar.Ultra_Use()
logger.info('Ultra_Use') logger.info('Ultra_Use')
logger.info(Ultra_Use) logger.info(Ultra_Use)
if self.attribute_bonus is None:
raise Exception('attribute_bonus is None')
self.attribute_bonus = await self.weapon.weapon_ability( self.attribute_bonus = await self.weapon.weapon_ability(
Ultra_Use, self.base_attr, self.attribute_bonus Ultra_Use, self.base_attr, self.attribute_bonus
) )
@ -210,19 +195,17 @@ class RoleInstance:
# 检查是否有对某一个技能的属性加成 # 检查是否有对某一个技能的属性加成
logger.info('检查是否有对某一个技能的属性加成') logger.info('检查是否有对某一个技能的属性加成')
if self.attribute_bonus is None:
raise Exception('attribute_bonus is None')
for attr in self.attribute_bonus: for attr in self.attribute_bonus:
# 攻击加成 # 攻击加成
if attr.__contains__('AttackAddedRatio'): if attr.__contains__('AttackAddedRatio'):
attr_name = attr.split('AttackAddedRatio')[0] attr_name: str = attr.split('AttackAddedRatio')[0]
if attr_name == skill_type or attr_name == skill_info[3]: if attr_name == skill_type or attr_name == skill_info[3]:
attack_added_ratio = self.attribute_bonus.get( attack_added_ratio = self.attribute_bonus.get(
'AttackAddedRatio', 0 'AttackAddedRatio', 0
) )
self.attribute_bonus[ self.attribute_bonus[
'AttackAddedRatio' 'AttackAddedRatio'
] = attack_added_ratio + mp.mpf(self.attribute_bonus[attr]) ] = attack_added_ratio + self.attribute_bonus[attr]
# 效果命中加成 # 效果命中加成
if attr.__contains__('StatusProbabilityBase'): if attr.__contains__('StatusProbabilityBase'):
attr_name = attr.split('StatusProbabilityBase')[0] attr_name = attr.split('StatusProbabilityBase')[0]
@ -232,7 +215,7 @@ class RoleInstance:
) )
self.attribute_bonus[ self.attribute_bonus[
'StatusProbabilityBase' 'StatusProbabilityBase'
] = status_probability + mp.mpf(self.attribute_bonus[attr]) ] = status_probability + self.attribute_bonus[attr]
logger.info(self.attribute_bonus) logger.info(self.attribute_bonus)
logger.info('检查遗器套装战斗生效的buff') logger.info('检查遗器套装战斗生效的buff')
for set_skill in self.relic_set.SetSkill: for set_skill in self.relic_set.SetSkill:
@ -565,6 +548,7 @@ class RoleInstance:
if skill_info[0] == 'defence': if skill_info[0] == 'defence':
defence = merged_attr['defence'] defence = merged_attr['defence']
logger.info(f'防御力: {defence}') logger.info(f'防御力: {defence}')
defence_multiplier = 0
# 获取技能提供的固定护盾值 # 获取技能提供的固定护盾值
if skill_type == 'Normal': if skill_type == 'Normal':

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,10 @@
import json import json
from typing import Dict
from collections import Counter from collections import Counter
from typing import Dict
from mpmath import mp
from loguru import logger from loguru import logger
from ...utils.map.SR_MAP_PATH import RelicSetSkill, EquipmentID2AbilityProperty from ...utils.map.SR_MAP_PATH import EquipmentID2AbilityProperty, RelicSetSkill
mp.dps = 14
class Character: class Character:
@ -34,20 +31,6 @@ class Character:
card_prop['rankList'] if card_prop.get('rankList') else [] card_prop['rankList'] if card_prop.get('rankList') else []
) )
# 伤害计算
self.def_ignore = 0
self.q_dmg = 0
self.q_crit_dmg = 0
self.e_dmg = 0
self.a_dmg = 0
self.a3_dmg = 0
# 角色的圣遗物总分
self.artifacts_all_score: float = 0
self.percent: str = '0.0'
self.dmg_data: Dict = {}
self.seq_str: str = '无匹配'
async def get_equipment_info(self): async def get_equipment_info(self):
if self.equipment == {}: if self.equipment == {}:
return return
@ -61,16 +44,9 @@ class Character:
equip_ability_property = ability_property[str(equip_rank)] equip_ability_property = ability_property[str(equip_rank)]
equip_add_base_attr = equip['baseAttributes'] equip_add_base_attr = equip['baseAttributes']
hp = mp.mpf(base_attr['hp']) + mp.mpf(equip_add_base_attr['hp']) base_attr['hp'] = base_attr['hp'] + equip_add_base_attr['hp']
attack = mp.mpf(base_attr['attack']) + mp.mpf( base_attr['attack'] = base_attr['attack'] + equip_add_base_attr['attack']
equip_add_base_attr['attack'] base_attr['defence'] = base_attr['defence'] + equip_add_base_attr['defence']
)
defence = mp.mpf(base_attr['defence']) + mp.mpf(
equip_add_base_attr['defence']
)
base_attr['hp'] = str(hp)
base_attr['attack'] = str(attack)
base_attr['defence'] = str(defence)
self.base_attributes = base_attr self.base_attributes = base_attr
for equip_ability in equip_ability_property: for equip_ability in equip_ability_property:
@ -99,23 +75,23 @@ class Character:
set_id_list.append(relic['SetId']) set_id_list.append(relic['SetId'])
# 处理主属性 # 处理主属性
relic_property = relic['MainAffix']['Property'] relic_property = relic['MainAffix']['Property']
property_value = mp.mpf(relic['MainAffix']['Value']) property_value = relic['MainAffix']['Value']
if relic_property in self.add_attr: if relic_property in self.add_attr:
self.add_attr[relic_property] = str( self.add_attr[relic_property] = (
mp.mpf(self.add_attr[relic_property]) + property_value self.add_attr[relic_property] + property_value
) )
else: else:
self.add_attr[relic_property] = str(property_value) self.add_attr[relic_property] = property_value
# 处理副词条 # 处理副词条
for sub in relic['SubAffixList']: for sub in relic['SubAffixList']:
sub_property = sub['Property'] sub_property = sub['Property']
sub_value = mp.mpf(sub['Value']) sub_value = sub['Value']
if sub_property in self.add_attr: if sub_property in self.add_attr:
self.add_attr[sub_property] = str( self.add_attr[sub_property] = (
mp.mpf(self.add_attr[sub_property]) + sub_value self.add_attr[sub_property] + sub_value
) )
else: else:
self.add_attr[sub_property] = str(sub_value) self.add_attr[sub_property] = sub_value
# 处理套装属性 # 处理套装属性
set_id_dict = Counter(set_id_list) set_id_dict = Counter(set_id_list)
for item in set_id_dict.most_common(): for item in set_id_dict.most_common():
@ -125,17 +101,17 @@ class Character:
set_value = 0 set_value = 0
if count >= 2 and RelicSetSkill[str(set_id)]['2'] != {}: if count >= 2 and RelicSetSkill[str(set_id)]['2'] != {}:
set_property = RelicSetSkill[str(set_id)]['2']['Property'] set_property = RelicSetSkill[str(set_id)]['2']['Property']
set_value = mp.mpf(RelicSetSkill[str(set_id)]['2']['Value']) set_value = RelicSetSkill[str(set_id)]['2']['Value']
if count == 4 and RelicSetSkill[str(set_id)]['4'] != {}: if count == 4 and RelicSetSkill[str(set_id)]['4'] != {}:
set_property = RelicSetSkill[str(set_id)]['4']['Property'] set_property = RelicSetSkill[str(set_id)]['4']['Property']
set_value = mp.mpf(RelicSetSkill[str(set_id)]['4']['Value']) set_value = RelicSetSkill[str(set_id)]['4']['Value']
if set_property != '': if set_property != '':
if set_property in self.add_attr: if set_property in self.add_attr:
self.add_attr[set_property] = str( self.add_attr[set_property] = (
mp.mpf(self.add_attr[set_property]) + set_value self.add_attr[set_property] + set_value
) )
else: else:
self.add_attr[set_property] = str(set_value) self.add_attr[set_property] = set_value
logger.info(json.dumps(self.base_attributes)) logger.info(json.dumps(self.base_attributes))
logger.info(json.dumps(self.add_attr)) logger.info(json.dumps(self.add_attr))

View File

@ -55,7 +55,6 @@ async def draw_enka_card(uid: str, char_list: List, showfrom: int = 0):
return await convert_img(Image.new('RGBA', (0, 1), (255, 255, 255))) return await convert_img(Image.new('RGBA', (0, 1), (255, 255, 255)))
else: else:
line1 = f'UID {uid} 刷新成功' line1 = f'UID {uid} 刷新成功'
# print(char_list)
line2 = f'可以使用 sr查询{char_data_list[0]["avatarName"]} 查询详情角色面板' line2 = f'可以使用 sr查询{char_data_list[0]["avatarName"]} 查询详情角色面板'
char_num = len(char_data_list) char_num = len(char_data_list)
if char_num <= 4: if char_num <= 4:

View File

@ -1,39 +1,34 @@
import json import json
from pathlib import Path from pathlib import Path
from typing import List, Union, Optional from typing import List, Optional, Union
from mpmath import mp
from httpx import ReadTimeout from httpx import ReadTimeout
from ..utils.error_reply import UID_HINT
from ..sruid_utils.api.mihomo import MihomoData from ..sruid_utils.api.mihomo import MihomoData
from ..sruid_utils.api.mihomo.models import Avatar from ..sruid_utils.api.mihomo.models import Avatar
from ..utils.resource.RESOURCE_PATH import PLAYER_PATH
from ..sruid_utils.api.mihomo.requests import get_char_card_info from ..sruid_utils.api.mihomo.requests import get_char_card_info
from ..utils.error_reply import UID_HINT
# from gsuid_core.utils.api.minigg.request import get_weapon_info from ..utils.excel.model import AvatarPromotionConfig, EquipmentPromotionConfig
from .cal_value import cal_relic_sub_affix, cal_relic_main_affix
from ..utils.excel.read_excel import AvatarPromotion, EquipmentPromotion
from ..utils.map.SR_MAP_PATH import ( from ..utils.map.SR_MAP_PATH import (
SetId2Name, AvatarRankSkillUp,
EquipmentID2Name,
EquipmentID2Rarity,
ItemId2Name, ItemId2Name,
Property2Name, Property2Name,
RelicId2SetId, RelicId2SetId,
EquipmentID2Name, SetId2Name,
AvatarRankSkillUp, avatarId2DamageType,
EquipmentID2Rarity,
rankId2Name,
skillId2Name,
avatarId2Name,
skillId2Effect,
avatarId2EnName, avatarId2EnName,
avatarId2Name,
avatarId2Rarity, avatarId2Rarity,
characterSkillTree, characterSkillTree,
rankId2Name,
skillId2AttackType, skillId2AttackType,
avatarId2DamageType, skillId2Effect,
skillId2Name,
) )
from ..utils.resource.RESOURCE_PATH import PLAYER_PATH
mp.dps = 14 from .cal_value import cal_relic_main_affix, cal_relic_sub_affix
async def api_to_dict( async def api_to_dict(
@ -55,6 +50,8 @@ async def api_to_dict(
sr_data = await get_char_card_info(sr_uid) sr_data = await get_char_card_info(sr_uid)
except ReadTimeout: except ReadTimeout:
return '网络不太稳定...' return '网络不太稳定...'
except json.decoder.JSONDecodeError:
return '网络不太稳定...'
if isinstance(sr_data, str): if isinstance(sr_data, str):
return [] return []
if isinstance(sr_data, dict): if isinstance(sr_data, dict):
@ -195,6 +192,7 @@ async def get_data(char: Avatar, sr_data: MihomoData, sr_uid: str):
relic_type=relic['type'], relic_type=relic['type'],
relic_level=relic_temp['Level'], relic_level=relic_temp['Level'],
) )
print(affix_property)
relic_temp['MainAffix']['Property'] = affix_property relic_temp['MainAffix']['Property'] = affix_property
relic_temp['MainAffix']['Name'] = Property2Name[affix_property] relic_temp['MainAffix']['Name'] = Property2Name[affix_property]
relic_temp['MainAffix']['Value'] = value relic_temp['MainAffix']['Value'] = value
@ -253,42 +251,42 @@ async def get_data(char: Avatar, sr_data: MihomoData, sr_uid: str):
# 处理基础属性 # 处理基础属性
base_attributes = {} base_attributes = {}
avatar_promotion_base = AvatarPromotion[str(char['avatarId'])][ avatar_promotion_base = AvatarPromotionConfig.Avatar[str(char['avatarId'])][
str(char.get('promotion', 0)) str(char.get('promotion', 0))
] ]
# 攻击力 # 攻击力
base_attributes['attack'] = str( base_attributes['attack'] = (
mp.mpf(avatar_promotion_base["AttackBase"]['Value']) avatar_promotion_base.AttackBase.Value
+ mp.mpf(avatar_promotion_base["AttackAdd"]['Value']) + avatar_promotion_base.AttackAdd.Value
* (char['level'] - 1) * (char['level'] - 1)
) )
# 防御力 # 防御力
base_attributes['defence'] = str( base_attributes['defence'] = (
mp.mpf(avatar_promotion_base["DefenceBase"]['Value']) avatar_promotion_base.DefenceBase.Value
+ mp.mpf(avatar_promotion_base["DefenceAdd"]['Value']) + avatar_promotion_base.DefenceAdd.Value
* (char['level'] - 1) * (char['level'] - 1)
) )
# 血量 # 血量
base_attributes['hp'] = str( base_attributes['hp'] = (
mp.mpf(avatar_promotion_base["HPBase"]['Value']) avatar_promotion_base.HPBase.Value
+ mp.mpf(avatar_promotion_base["HPAdd"]['Value']) * (char['level'] - 1) + avatar_promotion_base.HPAdd.Value * (char['level'] - 1)
) )
# 速度 # 速度
base_attributes['speed'] = str( base_attributes['speed'] = (
mp.mpf(avatar_promotion_base["SpeedBase"]['Value']) avatar_promotion_base.SpeedBase.Value
) )
# 暴击率 # 暴击率
base_attributes['CriticalChanceBase'] = str( base_attributes['CriticalChanceBase'] = (
mp.mpf(avatar_promotion_base["CriticalChance"]['Value']) avatar_promotion_base.CriticalChance.Value
) )
# 暴击伤害 # 暴击伤害
base_attributes['CriticalDamageBase'] = str( base_attributes['CriticalDamageBase'] = (
mp.mpf(avatar_promotion_base["CriticalDamage"]['Value']) avatar_promotion_base.CriticalDamage.Value
) )
# 嘲讽 # 嘲讽
base_attributes['BaseAggro'] = str( base_attributes['BaseAggro'] = (
mp.mpf(avatar_promotion_base["BaseAggro"]['Value']) avatar_promotion_base.BaseAggro.Value
) )
char_data['baseAttributes'] = base_attributes char_data['baseAttributes'] = base_attributes
@ -311,26 +309,26 @@ async def get_data(char: Avatar, sr_data: MihomoData, sr_uid: str):
str(char['equipment']['tid']) str(char['equipment']['tid'])
] ]
equipment_base_attributes = {} equipment_base_attributes = {}
equipment_promotion_base = EquipmentPromotion[ equipment_promotion_base = EquipmentPromotionConfig.Equipment[
str(char['equipment']['tid']) str(char['equipment']['tid'])
][str(equipment_info['equipmentPromotion'])] ][str(equipment_info['equipmentPromotion'])]
# 生命值 # 生命值
equipment_base_attributes['hp'] = str( equipment_base_attributes['hp'] = (
mp.mpf(equipment_promotion_base["BaseHP"]['Value']) equipment_promotion_base.BaseHP.Value
+ mp.mpf(equipment_promotion_base["BaseHPAdd"]['Value']) + equipment_promotion_base.BaseHPAdd.Value
* (char['equipment']['level'] - 1) * (char['equipment']['level'] - 1)
) )
# 攻击力 # 攻击力
equipment_base_attributes['attack'] = str( equipment_base_attributes['attack'] = (
mp.mpf(equipment_promotion_base["BaseAttack"]['Value']) equipment_promotion_base.BaseAttack.Value
+ mp.mpf(equipment_promotion_base["BaseAttackAdd"]['Value']) + equipment_promotion_base.BaseAttackAdd.Value
* (char['equipment']['level'] - 1) * (char['equipment']['level'] - 1)
) )
# 防御力 # 防御力
equipment_base_attributes['defence'] = str( equipment_base_attributes['defence'] = (
mp.mpf(equipment_promotion_base["BaseDefence"]['Value']) equipment_promotion_base.BaseDefence.Value
+ mp.mpf(equipment_promotion_base["BaseDefenceAdd"]['Value']) + equipment_promotion_base.BaseDefenceAdd.Value
* (char['equipment']['level'] - 1) * (char['equipment']['level'] - 1)
) )
equipment_info['baseAttributes'] = equipment_base_attributes equipment_info['baseAttributes'] = equipment_base_attributes

View File

@ -1,30 +1,31 @@
import math import math
from pathlib import Path from pathlib import Path
from typing import List, Union, Optional from typing import List, Optional, Union
from PIL import Image, ImageDraw from PIL import Image, ImageDraw
from gsuid_core.logger import logger from gsuid_core.logger import logger
from gsuid_core.utils.error_reply import get_error from gsuid_core.utils.error_reply import get_error
from gsuid_core.utils.image.image_tools import ( from gsuid_core.utils.image.image_tools import (
get_qq_avatar,
draw_pic_with_ring, draw_pic_with_ring,
get_qq_avatar,
) )
from .utils import get_icon from ..sruid_utils.api.mys.models import (
LocustBlocks,
RogueAvatar,
RogueBuffitems,
RogueMiracles,
)
from ..utils.convert import GsCookie from ..utils.convert import GsCookie
from ..utils.image.convert import convert_img
from ..utils.fonts.starrail_fonts import ( from ..utils.fonts.starrail_fonts import (
sr_font_22, sr_font_22,
sr_font_28, sr_font_28,
sr_font_34, sr_font_34,
sr_font_42, sr_font_42,
) )
from ..sruid_utils.api.mys.models import ( from ..utils.image.convert import convert_img
RogueAvatar, from .utils import get_icon
LocustBlocks,
RogueMiracles,
RogueBuffitems,
)
TEXT_PATH = Path(__file__).parent / 'texture2D' TEXT_PATH = Path(__file__).parent / 'texture2D'
white_color = (255, 255, 255) white_color = (255, 255, 255)
@ -585,6 +586,7 @@ async def draw_rogue_locust_img(
detail_h = detail_h + miracles_h detail_h = detail_h + miracles_h
# 事件 # 事件
blocks_h = 0
if len(detail['blocks']) > 0: if len(detail['blocks']) > 0:
blocks_h = 60 blocks_h = 60
blocks_num = len(detail['blocks']) blocks_num = len(detail['blocks'])

View File

@ -0,0 +1,245 @@
from typing import Dict, List
from msgspec import Struct
from .read_excel import (
AvatarPromotion,
EquipmentPromotion,
RelicMainAffix,
RelicSubAffix,
)
class PromotionCost(Struct):
ItemID: int
ItemNum: int
class PromotionAttr(Struct):
Value: float
class SingleAvatarPromotion(Struct):
AvatarID: int
Promotion: int
PromotionCostList: List[PromotionCost]
MaxLevel: int
PlayerLevelRequire: int | None
WorldLevelRequire: int | None
AttackBase: PromotionAttr
AttackAdd: PromotionAttr
DefenceBase: PromotionAttr
DefenceAdd: PromotionAttr
HPBase: PromotionAttr
HPAdd: PromotionAttr
SpeedBase: PromotionAttr
CriticalChance: PromotionAttr
CriticalDamage: PromotionAttr
BaseAggro: PromotionAttr
class SingleEquipmentPromotion(Struct):
EquipmentID: int
Promotion: int
PromotionCostList: List[PromotionCost]
MaxLevel: int
PlayerLevelRequire: int | None
WorldLevelRequire: int | None
BaseHP: PromotionAttr
BaseHPAdd: PromotionAttr
BaseAttack: PromotionAttr
BaseAttackAdd: PromotionAttr
BaseDefence: PromotionAttr
BaseDefenceAdd: PromotionAttr
class SingleRelicMainAffix(Struct):
GroupID: int
AffixID: int
Property: str
BaseValue: PromotionAttr
LevelAdd: PromotionAttr
IsAvailable: bool
class SingleRelicSubAffix(Struct):
GroupID: int
AffixID: int
Property: str
BaseValue: PromotionAttr
StepValue: PromotionAttr
StepNum: int
class AvatarPromotionConfigModel(Struct):
Avatar: Dict[str, Dict[str, SingleAvatarPromotion]]
@classmethod
def from_json(cls, data: Dict):
return cls(
Avatar={
avatar_id: {
promotion: SingleAvatarPromotion(
AvatarID=promotion_dict[promotion]['AvatarID'],
Promotion=promotion_dict[promotion]['Promotion'],
PromotionCostList=[
PromotionCost(
ItemID=item['ItemID'],
ItemNum=item['ItemNum']
)
for item in promotion_dict[promotion]['PromotionCostList']
],
PlayerLevelRequire=promotion_dict[promotion].get(
'PlayerLevelRequire', None
),
WorldLevelRequire=promotion_dict[promotion].get(
'WorldLevelRequire', None
),
MaxLevel=promotion_dict[promotion]['MaxLevel'],
AttackBase=PromotionAttr(
Value=promotion_dict[promotion]['AttackBase']['Value']
),
AttackAdd=PromotionAttr(
Value=promotion_dict[promotion]['AttackAdd']['Value']
),
DefenceBase=PromotionAttr(
Value=promotion_dict[promotion]['DefenceBase']['Value']
),
DefenceAdd=PromotionAttr(
Value=promotion_dict[promotion]['DefenceAdd']['Value']
),
HPBase=PromotionAttr(
Value=promotion_dict[promotion]['HPBase']['Value']
),
HPAdd=PromotionAttr(
Value=promotion_dict[promotion]['HPAdd']['Value']
),
SpeedBase=PromotionAttr(
Value=promotion_dict[promotion]['SpeedBase']['Value']
),
CriticalChance=PromotionAttr(
Value=promotion_dict[promotion]['CriticalChance']['Value']
),
CriticalDamage=PromotionAttr(
Value=promotion_dict[promotion]['CriticalDamage']['Value']
),
BaseAggro=PromotionAttr(
Value=promotion_dict[promotion]['BaseAggro']['Value']
)
)
for promotion in promotion_dict.keys()
}
for avatar_id, promotion_dict in data.items()
}
)
class EquipmentPromotionConfigModel(Struct):
Equipment: Dict[str, Dict[str, SingleEquipmentPromotion]]
@classmethod
def from_json(cls, data: Dict):
return cls(
Equipment={
equipment_id: {
promotion: SingleEquipmentPromotion(
EquipmentID=promotion_dict[promotion]['EquipmentID'],
Promotion=promotion_dict[promotion]['Promotion'],
PromotionCostList=[
PromotionCost(
ItemID=item['ItemID'],
ItemNum=item['ItemNum']
)
for item in promotion_dict[promotion]['PromotionCostList']
],
PlayerLevelRequire=promotion_dict[promotion].get(
'PlayerLevelRequire', None
),
WorldLevelRequire=promotion_dict[promotion].get(
'WorldLevelRequire', None
),
MaxLevel=promotion_dict[promotion]['MaxLevel'],
BaseHP=PromotionAttr(
Value=promotion_dict[promotion]['BaseHP']['Value']
),
BaseHPAdd=PromotionAttr(
Value=promotion_dict[promotion]['BaseHPAdd']['Value']
),
BaseAttack=PromotionAttr(
Value=promotion_dict[promotion]['BaseAttack']['Value']
),
BaseAttackAdd=PromotionAttr(
Value=promotion_dict[promotion]['BaseAttackAdd']['Value']
),
BaseDefence=PromotionAttr(
Value=promotion_dict[promotion]['BaseDefence']['Value']
),
BaseDefenceAdd=PromotionAttr(
Value=promotion_dict[promotion]['BaseDefenceAdd']['Value']
)
)
for promotion in promotion_dict.keys()
}
for equipment_id, promotion_dict in data.items()
}
)
class RelicMainAffixConfigModel(Struct):
Relic: Dict[str, Dict[str, SingleRelicMainAffix]]
@classmethod
def from_json(cls, data: Dict):
return cls(
Relic={
relic_id: {
group_id: SingleRelicMainAffix(
GroupID=affix_dict[group_id]['GroupID'],
AffixID=affix_dict[group_id]['AffixID'],
Property=affix_dict[group_id]['Property'],
BaseValue=PromotionAttr(
Value=affix_dict[group_id]['BaseValue']['Value']
),
LevelAdd=PromotionAttr(
Value=affix_dict[group_id]['LevelAdd']['Value']
),
IsAvailable=affix_dict[group_id]['IsAvailable']
)
for group_id in affix_dict.keys()
}
for relic_id, affix_dict in data.items()
}
)
class RelicSubAffixConfigModel(Struct):
Relic: Dict[str, Dict[str, SingleRelicSubAffix]]
@classmethod
def from_json(cls, data: Dict):
return cls(
Relic={
relic_id: {
group_id: SingleRelicSubAffix(
GroupID=affix_dict[group_id]['GroupID'],
AffixID=affix_dict[group_id]['AffixID'],
Property=affix_dict[group_id]['Property'],
BaseValue=PromotionAttr(
Value=affix_dict[group_id]['BaseValue']['Value']
),
StepValue=PromotionAttr(
Value=affix_dict[group_id]['StepValue']['Value']
),
StepNum=affix_dict[group_id]['StepNum']
)
for group_id in affix_dict.keys()
}
for relic_id, affix_dict in data.items()
}
)
AvatarPromotionConfig = AvatarPromotionConfigModel.from_json(AvatarPromotion)
EquipmentPromotionConfig = EquipmentPromotionConfigModel.from_json(EquipmentPromotion)
RelicMainAffixConfig = RelicMainAffixConfigModel.from_json(RelicMainAffix)
RelicSubAffixConfig = RelicSubAffixConfigModel.from_json(RelicSubAffix)

View File

@ -1,31 +1,31 @@
import copy import copy
import time
import random import random
from string import digits, ascii_letters import time
from typing import Any, Dict, Union, Optional, cast from string import ascii_letters, digits
from typing import Any, Dict, Optional, Union, cast
from gsuid_core.utils.api.mys_api import _MysApi
from gsuid_core.utils.api.mys.models import MysSign, SignInfo, SignList from gsuid_core.utils.api.mys.models import MysSign, SignInfo, SignList
from gsuid_core.utils.api.mys.tools import ( from gsuid_core.utils.api.mys.tools import (
_random_int_ds, _random_int_ds,
generate_os_ds, generate_os_ds,
get_web_ds_token, get_web_ds_token,
) )
from gsuid_core.utils.api.mys_api import _MysApi
from .api import srdbsqla
from ..sruid_utils.api.mys.api import _API from ..sruid_utils.api.mys.api import _API
from ..sruid_utils.api.mys.models import ( from ..sruid_utils.api.mys.models import (
GachaLog,
AbyssData, AbyssData,
RogueData,
RoleIndex,
AvatarInfo, AvatarInfo,
MonthlyAward,
DailyNoteData, DailyNoteData,
RoleBasicInfo, GachaLog,
WidgetStamina, MonthlyAward,
RogueData,
RogueLocustData, RogueLocustData,
RoleBasicInfo,
RoleIndex,
WidgetStamina,
) )
from .api import srdbsqla
RECOGNIZE_SERVER = { RECOGNIZE_SERVER = {
'1': 'prod_gf_cn', '1': 'prod_gf_cn',
@ -386,7 +386,7 @@ class MysApi(_MysApi):
) )
# print(data) # print(data)
if isinstance(data, Dict): if isinstance(data, Dict):
data = cast(RogueData, data['data']) data = cast(RogueLocustData, data['data'])
return data return data
async def mys_sign( async def mys_sign(