完成刃卡芙卡伤害计算 (#69)

* 完成刃卡芙卡伤害计算

* 完成刃卡芙卡伤害计算

* 🚨 `pre-commit-ci`修复格式错误

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
季落 2023-09-07 12:11:15 +08:00 committed by GitHub
parent 6d1d4e656f
commit ac3f219db8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 387 additions and 33 deletions

View File

@ -50,7 +50,6 @@ TEXT_PATH = Path(__file__).parent / 'texture2D'
bg_img = Image.open(TEXT_PATH / "bg.png") bg_img = Image.open(TEXT_PATH / "bg.png")
white_color = (213, 213, 213) white_color = (213, 213, 213)
yellow_color = (255, 255, 0)
NUM_MAP = {0: '', 1: '', 2: '', 3: '', 4: '', 5: '', 6: '', 7: ''} NUM_MAP = {0: '', 1: '', 2: '', 3: '', 4: '', 5: '', 6: '', 7: ''}
RANK_MAP = { RANK_MAP = {
@ -90,7 +89,7 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
return char_data return char_data
char = await cal_char_info(char_data) char = await cal_char_info(char_data)
damage_len = 0 damage_len = 0
if char.char_id in [1102, 1204, 1107, 1213, 1006]: if char.char_id in [1102, 1204, 1107, 1213, 1006, 1005, 1205]:
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) # print(damage_len)
@ -585,12 +584,14 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
) )
if damage_len > 0: if damage_len > 0:
damage_title_img = Image.open(TEXT_PATH / 'base_info_pure.png')
char_info.paste(damage_title_img, (0, 2028), damage_title_img)
damage_list = await cal(char_data) damage_list = await cal(char_data)
# 写伤害 # 写伤害
char_img_draw.text( char_img_draw.text(
(55, 2048), (55, 2048),
'角色动作', '角色动作',
yellow_color, white_color,
sr_font_26, sr_font_26,
'lm', 'lm',
) )
@ -598,7 +599,7 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
char_img_draw.text( char_img_draw.text(
(370, 2048), (370, 2048),
'暴击值', '暴击值',
yellow_color, white_color,
sr_font_26, sr_font_26,
'lm', 'lm',
) )
@ -606,7 +607,7 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
char_img_draw.text( char_img_draw.text(
(560, 2048), (560, 2048),
'期望值', '期望值',
yellow_color, white_color,
sr_font_26, sr_font_26,
'lm', 'lm',
) )
@ -614,13 +615,20 @@ async def draw_char_info_img(raw_mes: str, sr_uid: str):
char_img_draw.text( char_img_draw.text(
(750, 2048), (750, 2048),
'满配辅助末日兽', '满配辅助末日兽',
yellow_color, white_color,
sr_font_26, sr_font_26,
'lm', 'lm',
) )
damage_num = 0 damage_num = 0
for damage_info in damage_list: for damage_info in damage_list:
damage_num = damage_num + 1 damage_num = damage_num + 1
if damage_num % 2 == 0:
damage_img = Image.open(TEXT_PATH / 'attack_1.png')
else:
damage_img = Image.open(TEXT_PATH / 'attack_2.png')
char_info.paste(
damage_img, (0, 2028 + damage_num * 48), damage_img
)
char_img_draw.text( char_img_draw.text(
(55, 2048 + damage_num * 48), (55, 2048 + damage_num * 48),
f'{damage_info[0]}', f'{damage_info[0]}',
@ -719,7 +727,7 @@ async def cal(char_data: Dict):
char = await cal_char_info(char_data) char = await cal_char_info(char_data)
skill_info_list = [] skill_info_list = []
if char.char_id in [1102, 1204, 1107, 1213, 1006]: if char.char_id in [1102, 1204, 1107, 1213, 1006, 1005, 1205]:
if char.char_id == 1213: if char.char_id == 1213:
for skill_type in [ for skill_type in [
'Normal', 'Normal',
@ -731,12 +739,22 @@ async def cal(char_data: Dict):
role = RoleInstance(char) role = RoleInstance(char)
im_tmp = await role.cal_damage(skill_type) im_tmp = await role.cal_damage(skill_type)
skill_info_list.append(im_tmp) skill_info_list.append(im_tmp)
elif char.char_id == 1005:
for skill_type in ['Normal', 'BPSkill', 'Ultra', 'DOT']:
role = RoleInstance(char)
im_tmp = await role.cal_damage(skill_type)
skill_info_list.append(im_tmp)
if char.char_id == 1205:
for skill_type in ['Normal', 'Normal1', 'Ultra']:
role = RoleInstance(char)
im_tmp = await role.cal_damage(skill_type)
skill_info_list.append(im_tmp)
else: else:
for skill_type in ['Normal', 'BPSkill', 'Ultra']: for skill_type in ['Normal', 'BPSkill', 'Ultra']:
role = RoleInstance(char) role = RoleInstance(char)
im_tmp = await role.cal_damage(skill_type) im_tmp = await role.cal_damage(skill_type)
skill_info_list.append(im_tmp) skill_info_list.append(im_tmp)
if char.char_id in [1204, 1107]: if char.char_id in [1204, 1107, 1005, 1205]:
role = RoleInstance(char) role = RoleInstance(char)
im_tmp = await role.cal_damage('Talent') im_tmp = await role.cal_damage('Talent')
skill_info_list.append(im_tmp) skill_info_list.append(im_tmp)

View File

@ -28,7 +28,7 @@ class Seele(BaseAvatar):
if self.avatar_rank < 2: if self.avatar_rank < 2:
self.eidolon_attribute['SpeedAddedRatio'] = mp.mpf(0.25) self.eidolon_attribute['SpeedAddedRatio'] = mp.mpf(0.25)
if self.avatar_rank >= 1: if self.avatar_rank >= 1:
self.eidolon_attribute['CriticalDamageBase'] = mp.mpf(0.15) self.eidolon_attribute['CriticalChanceBase'] = mp.mpf(0.15)
if self.avatar_rank >= 2: if self.avatar_rank >= 2:
self.eidolon_attribute['SpeedAddedRatio'] = mp.mpf(0.5) self.eidolon_attribute['SpeedAddedRatio'] = mp.mpf(0.5)
@ -150,23 +150,80 @@ class Silverwolf(BaseAvatar):
logger.info('额外能力') logger.info('额外能力')
logger.info('战技降抗') logger.info('战技降抗')
logger.info('战技使目标全属性抗性降低的效果额外降低3%') logger.info('战技使目标全属性抗性降低的效果额外降低3%')
enemy_status_resistance = self.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'] = mp.mpf(
enemy_status_resistance enemy_status_resistance
) )
logger.info('终结技降防') logger.info('终结技降防')
ultra_defence = self.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'] = mp.mpf(ignore_defence)
class Kafka(BaseAvatar):
Buff: BaseAvatarBuff
def __init__(
self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill]
):
super().__init__(char=char, skills=skills)
self.eidolon_attribute = {}
self.extra_ability_attribute = {}
self.eidolons()
self.extra_ability()
def Technique(self):
pass
def eidolons(self):
if self.avatar_rank >= 1:
self.extra_ability_attribute['DOTDmgAdd'] = mp.mpf(0.3)
if self.avatar_rank >= 2:
self.extra_ability_attribute['DOTDmgAdd'] = mp.mpf(0.55)
def extra_ability(self):
pass
class Blade(BaseAvatar):
Buff: BaseAvatarBuff
def __init__(
self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill]
):
super().__init__(char=char, skills=skills)
self.eidolon_attribute = {}
self.extra_ability_attribute = {}
self.eidolons()
self.extra_ability()
def Technique(self):
pass
def eidolons(self):
if self.avatar_rank >= 2:
self.eidolon_attribute['CriticalChanceBase'] = mp.mpf(0.15)
if self.avatar_rank >= 4:
self.extra_ability_attribute['HPAddedRatio'] = mp.mpf(0.4)
def extra_ability(self):
logger.info('额外能力')
logger.info('天赋施放的追加攻击伤害提高20%')
self.extra_ability_attribute['TalentDmgAdd'] = mp.mpf(0.2)
class Avatar: class Avatar:
@classmethod @classmethod
def create( def create(
cls, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] cls, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill]
): ):
if char.id_ == 1205:
return Blade(char, skills)
if char.id_ == 1005:
return Kafka(char, skills)
if char.id_ == 1006: if char.id_ == 1006:
return Silverwolf(char, skills) return Silverwolf(char, skills)
if char.id_ == 1213: if char.id_ == 1213:

View File

@ -134,20 +134,27 @@ class BaseAvatar:
] ]
) )
def BPSkill_d(self): def BPSkill_num(self, skill_type):
return mp.mpf( return mp.mpf(
skill_dict[str(self.avatar_id)]['BPSkill_D'][ skill_dict[str(self.avatar_id)][skill_type][
self.Skill.BPSkill_.level - 1 self.Skill.BPSkill_.level - 1
] ]
) )
def Ultra_d(self): def Ultra_num(self, skill_type):
return mp.mpf( return mp.mpf(
skill_dict[str(self.avatar_id)]['Ultra_D'][ skill_dict[str(self.avatar_id)][skill_type][
self.Skill.Ultra_.level - 1 self.Skill.Ultra_.level - 1
] ]
) )
def Talent_num(self, skill_type):
return mp.mpf(
skill_dict[str(self.avatar_id)][skill_type][
self.Skill.Talent_.level - 1
]
)
def Talent_add(self): def Talent_add(self):
if self.avatar_id in [1102]: if self.avatar_id in [1102]:
return mp.mpf( return mp.mpf(
@ -155,6 +162,12 @@ class BaseAvatar:
self.Skill.Talent_.level - 1 self.Skill.Talent_.level - 1
] ]
) )
elif self.avatar_id in [1205]:
return mp.mpf(
skill_dict[str(self.avatar_id)]['BPSkill'][
self.Skill.BPSkill_.level - 1
]
)
else: else:
return mp.mpf(0) return mp.mpf(0)

View File

@ -81,8 +81,13 @@ class DamageInstance:
rank=char.char_rank, rank=char.char_rank,
element=char.char_element, element=char.char_element,
promotion=char.char_promotion, promotion=char.char_promotion,
attribute_bonus=msgspec.from_builtins(char.attribute_bonus, Union[List[DamageInstanceAvatarAttributeBouns], None]), attribute_bonus=msgspec.from_builtins(
extra_ability=msgspec.from_builtins(char.extra_ability, Union[List, None]), char.attribute_bonus,
Union[List[DamageInstanceAvatarAttributeBouns], None],
),
extra_ability=msgspec.from_builtins(
char.extra_ability, Union[List, None]
),
) )
self.weapon = DamageInstanceWeapon( self.weapon = DamageInstanceWeapon(
id_=char.equipment['equipmentID'], id_=char.equipment['equipmentID'],

View File

@ -444,5 +444,230 @@
"BPSkill": ["attack","战技", 1], "BPSkill": ["attack","战技", 1],
"Ultra": ["attack","终结技", 1] "Ultra": ["attack","终结技", 1]
} }
},
"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.4800000003725290,
0.5120000003725290,
0.5440000003725290,
0.5760000003725290,
0.6080000003725290,
0.6400000003725290,
0.6800000003725290,
0.7200000003725290,
0.7600000003725290,
0.8000000003725290,
0.8320000003725290,
0.8640000003725290,
0.8960000003725290,
0.9280000003725290,
0.9600000003725290
],
"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.4200000003725290,
0.5180000003725290,
0.6160000003725290,
0.7140000003725290,
0.8120000003725290,
0.9100000003725290,
1.0325000003725290,
1.1550000003725290,
1.2775000003725290,
1.4000000003725290,
1.4980000003725290,
1.5960000003725290,
1.6940000003725290,
1.7920000003725290,
1.8900000003725290
],
"Maze": [
20
],
"Ultra_Use": [
110
],
"skilllist": {
"Normal": ["attack","普攻", 1],
"BPSkill": ["attack","战技", 1],
"Ultra": ["attack","终结技", 1],
"DOT": ["attack","单次持续伤害", 1],
"Talent": ["attack","追加攻击", 1]
}
},
"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.2040000003725290,
0.2320000003725290,
0.2600000003725290,
0.2950000003725290,
0.3300000003725290,
0.3650000003725290,
0.4000000003725290,
0.4280000003725290,
0.4560000003725290,
0.4840000003725290,
0.5120000003725290,
0.5400000003725290
],
"Ultra": [
0.2400000003725290,
0.2560000003725290,
0.2720000003725290,
0.2880000003725290,
0.3040000003725290,
0.3200000003725290,
0.3400000003725290,
0.3600000003725290,
0.3800000003725290,
0.4000000003725290,
0.4160000003725290,
0.4320000003725290,
0.4480000003725290,
0.4640000003725290,
0.4800000003725290
],
"Ultra_HP": [
1.5000000003725290,
1.5400000003725290,
1.5800000003725290,
1.6200000003725290,
1.6600000003725290,
1.7000000003725290,
1.7500000003725290,
1.8000000003725290,
1.8500000003725290,
1.9000000003725290,
1.9400000003725290,
1.9800000003725290,
2.0200000003725290,
2.0600000003725290,
2.1000000003725290
],
"Talent": [
0.2200000003725290,
0.2420000003725290,
0.2640000003725290,
0.2860000003725290,
0.3080000003725290,
0.3300000003725290,
0.3575000003725290,
0.3850000003725290,
0.4125000003725290,
0.4400000003725290,
0.4620000003725290,
0.4840000003725290,
0.5060000003725290,
0.5280000003725290,
0.5500000003725290
],
"Talent_HP": [
0.5500000003725290,
0.6050000003725290,
0.6600000003725290,
0.7150000003725290,
0.7700000003725290,
0.8250000003725290,
0.8938000003725290,
0.9625000003725290,
1.0313000003725290,
1.1000000003725290,
1.1550000003725290,
1.2100000003725290,
1.2650000003725290,
1.3200000003725290,
1.3750000003725290
],
"Maze": [
20
],
"Ultra_Use": [
110
],
"skilllist": {
"Normal": ["attack","普攻", 1],
"Normal1": ["attack","无间剑树", 1],
"Ultra": ["attack","终结技", 1],
"Talent": ["attack","追加攻击", 1]
}
} }
} }

View File

@ -128,7 +128,7 @@ class RoleInstance:
logger.info(self.base_attr) logger.info(self.base_attr)
logger.info('attribute_bonus') logger.info('attribute_bonus')
logger.info(self.attribute_bonus) logger.info(self.attribute_bonus)
logger.info(skill_type)
# 技能区 # 技能区
skill_info = self.avatar.Skill_Info(skill_type) skill_info = self.avatar.Skill_Info(skill_type)
if skill_type == 'Normal': if skill_type == 'Normal':
@ -151,6 +151,12 @@ class RoleInstance:
if self.raw_data.avatar.id_ == 1213: if self.raw_data.avatar.id_ == 1213:
skill_multiplier = self.avatar.Normalnum(skill_type) skill_multiplier = self.avatar.Normalnum(skill_type)
skill_type = 'Normal' skill_type = 'Normal'
elif self.raw_data.avatar.id_ == 1005:
skill_multiplier = self.avatar.Ultra_num(skill_type)
if self.raw_data.avatar.rank >= 6:
skill_multiplier = skill_multiplier + 1.56
elif self.raw_data.avatar.id_ == 1205:
skill_multiplier = self.avatar.Normalnum(skill_type)
else: else:
raise Exception('skill type error') raise Exception('skill type error')
@ -202,13 +208,34 @@ class RoleInstance:
merged_attr = await merge_attribute( merged_attr = await merge_attribute(
self.base_attr, self.attribute_bonus self.base_attr, self.attribute_bonus
) )
logger.info(f'{merged_attr}')
# 技能类型为攻击 # 技能类型为攻击
if skill_info[0] == 'attack': if skill_info[0] == 'attack':
skill_multiplier = skill_multiplier / skill_info[2] skill_multiplier = skill_multiplier / skill_info[2]
logger.info(f'技能区单段: {skill_multiplier}') logger.info(f'技能区单段: {skill_multiplier}')
attack = merged_attr['attack'] attack = merged_attr['attack']
logger.info(f'攻击力: {attack}') logger.info(f'攻击力: {attack}')
damage_add = 0
if self.raw_data.avatar.id_ == 1205:
hp_num = merged_attr['hp']
if skill_type == 'Normal1':
hp_multiplier = self.avatar.Normalnum('Normal1_HP')
skill_type = 'Normal'
elif skill_type == 'Ultra':
hp_multiplier = self.avatar.Ultra_num('Ultra_HP')
if self.raw_data.avatar.rank >= 1:
hp_multiplier += 0.9
elif skill_type == 'Talent':
hp_multiplier = self.avatar.Talent_num('Talent_HP')
if self.raw_data.avatar.rank >= 6:
damage_add = hp_num * 0.5
else:
hp_multiplier = 0
attack = (skill_multiplier * attack) + (hp_multiplier * hp_num)
skill_multiplier = 1
logger.info(f'混伤区: {attack}')
logger.info(f'额外伤害: {damage_add}')
# 模拟 同属性弱点 同等级 的怪物 # 模拟 同属性弱点 同等级 的怪物
# 韧性条减伤 # 韧性条减伤
enemy_damage_reduction = 0.1 enemy_damage_reduction = 0.1
@ -283,7 +310,6 @@ class RoleInstance:
# 易伤区 # 易伤区
logger.info('检查是否有易伤加成') logger.info('检查是否有易伤加成')
logger.info(f'{merged_attr}')
damage_ratio = merged_attr.get('DmgRatio', 0) damage_ratio = merged_attr.get('DmgRatio', 0)
# 检查是否有对特定技能的易伤加成 # 检查是否有对特定技能的易伤加成
# Talent_DmgRatio # Talent_DmgRatio
@ -299,6 +325,9 @@ class RoleInstance:
logger.info(f'易伤: {damage_ratio}') logger.info(f'易伤: {damage_ratio}')
# 爆伤区 # 爆伤区
if skill_type == 'DOT':
critical_damage_base = 0
else:
logger.info('检查是否有爆伤加成') logger.info('检查是否有爆伤加成')
logger.info(f'{merged_attr}') logger.info(f'{merged_attr}')
critical_damage_base = merged_attr['CriticalDamageBase'] critical_damage_base = merged_attr['CriticalDamageBase']
@ -357,6 +386,7 @@ class RoleInstance:
* resistance_area * resistance_area
* damage_reduction * damage_reduction
* (critical_damage + critical_damage_add) * (critical_damage + critical_damage_add)
+ damage_add
) )
damage_cd_z += damage_cd damage_cd_z += damage_cd
damage_qw = ( damage_qw = (
@ -368,6 +398,7 @@ class RoleInstance:
* resistance_area * resistance_area
* damage_reduction * damage_reduction
* qiwang_damage * qiwang_damage
+ damage_add
) )
damage_qw_z += damage_qw damage_qw_z += damage_qw
@ -378,6 +409,10 @@ class RoleInstance:
* (1 + self.attribute_bonus['AttackAddedRatio'] + 2.144) * (1 + self.attribute_bonus['AttackAddedRatio'] + 2.144)
+ self.attribute_bonus['AttackDelta'] + self.attribute_bonus['AttackDelta']
) )
if self.raw_data.avatar.id_ == 1205:
attack_tz = (skill_multiplier * attack_tz) + (
hp_multiplier * hp_num
)
injury_add_tz = 0 injury_add_tz = 0
if self.avatar.avatar_element == 'Imaginary': if self.avatar.avatar_element == 'Imaginary':
injury_add_tz = 0.12 injury_add_tz = 0.12
@ -391,6 +426,7 @@ class RoleInstance:
* damage_reduction * damage_reduction
* (critical_damage + critical_damage_add + 1.594) * (critical_damage + critical_damage_add + 1.594)
* 10 * 10
+ damage_add
) )
damage_tz_z += damage_tz damage_tz_z += damage_tz

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB