完成符玄伤害计算 (#70)

* 完成符玄伤害计算

* 完成符玄伤害计算

* 🚨 `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 20:34:16 +08:00 committed by GitHub
parent 6de261cfc3
commit 7e12552b96
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 292 additions and 67 deletions

View File

@ -1,19 +1,35 @@
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 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.excel.read_excel import light_cone_ranks
from ..utils.fonts.first_world import fw_font_28 from ..utils.fonts.first_world import fw_font_28
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.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,
@ -23,23 +39,6 @@ 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' / 'seele.json', encoding='utf-8') as f:
@ -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, 1005, 1205]: if char.char_id in [1102, 1204, 1107, 1213, 1006, 1005, 1205, 1208]:
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)
@ -728,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, 1005, 1205]: if char.char_id in [1102, 1204, 1107, 1213, 1006, 1005, 1205, 1208]:
if char.char_id == 1213: if char.char_id == 1213:
for skill_type in [ for skill_type in [
'Normal', 'Normal',
@ -745,6 +744,11 @@ 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 == 1208:
for skill_type in ['Normal', 'Ultra']:
role = RoleInstance(char)
im_tmp = await role.cal_damage(skill_type)
skill_info_list.append(im_tmp)
elif char.char_id == 1205: elif char.char_id == 1205:
for skill_type in ['Normal', 'Normal1', 'Ultra']: for skill_type in ['Normal', 'Normal1', 'Ultra']:
role = RoleInstance(char) role = RoleInstance(char)

View File

@ -215,11 +215,36 @@ class Blade(BaseAvatar):
self.extra_ability_attribute['TalentDmgAdd'] = mp.mpf(0.2) self.extra_ability_attribute['TalentDmgAdd'] = mp.mpf(0.2)
class Fuxuan(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.eidolon_attribute['CriticalDamageBase'] = mp.mpf(0.3)
def extra_ability(self):
pass
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_ == 1208:
return Fuxuan(char, skills)
if char.id_ == 1205: if char.id_ == 1205:
return Blade(char, skills) return Blade(char, skills)
if char.id_ == 1005: if char.id_ == 1005:

View File

@ -97,11 +97,7 @@ class DamageInstance:
) )
self.relic = [] self.relic = []
for relic in char.char_relic: for relic in char.char_relic:
self.relic.append( self.relic.append(msgspec.convert(relic, DamageInstanceRelic))
msgspec.convert(relic, DamageInstanceRelic)
)
self.skill = [] self.skill = []
for skill in char.char_skill: for skill in char.char_skill:
self.skill.append( self.skill.append(msgspec.convert(skill, DamageInstanceSkill))
msgspec.convert(skill, DamageInstanceSkill)
)

View File

@ -669,5 +669,124 @@
"Ultra": ["attack","终结技", 1], "Ultra": ["attack","终结技", 1],
"Talent": ["attack","追加攻击", 1] "Talent": ["attack","追加攻击", 1]
} }
},
"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.0390000003725290,
0.0420000003725290,
0.0450000003725290,
0.0488000003725290,
0.0525000003725290,
0.0563000003725290,
0.0600000003725290,
0.0630000003725290,
0.0660000003725290,
0.0690000003725290,
0.0720000003725290,
0.0750000003725290
],
"BPSkill_CC": [
0.0600000004656613,
0.0660000004656613,
0.0720000005587935,
0.0780000003725290,
0.0840000003725290,
0.0900000003725290,
0.0975000003725290,
0.1050000003725290,
0.1125000003725290,
0.1200000003725290,
0.1260000003725290,
0.1320000003725290,
0.1380000003725290,
0.1440000003725290,
0.1500000003725290
],
"Ultra": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"Ultra_HP": [
0.6000000003725290,
0.6400000003725290,
0.6800000003725290,
0.7200000003725290,
0.7600000003725290,
0.8000000003725290,
0.8500000003725290,
0.9000000003725290,
0.9500000003725290,
1.0000000003725290,
1.0400000003725290,
1.0800000003725290,
1.1200000003725290,
1.1600000003725290,
1.2000000003725290
],
"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
],
"Maze": [
20
],
"Ultra_Use": [
135
],
"skilllist": {
"Normal": ["attack","普攻", 1],
"Ultra": ["attack","终结技", 1]
}
} }
} }

View File

@ -225,10 +225,21 @@
0.12000000022351742, 0.12000000022351742,
0.1500000002793968, 0.1500000002793968,
0.1800000003352761, 0.1800000003352761,
0.210000003911555, 0.2100000003911555,
0.24000000044703484 0.24000000044703484
] ]
} }
},
"23011": {
"Param": {
"AllDamageAddedRatio": [
0.09000000022351742,
0.1050000002793968,
0.1200000003352761,
0.1350000003911555,
0.15000000044703484
]
}
}, },
"21022": { "21022": {
"Param": { "Param": {

View File

@ -1,13 +1,12 @@
from mpmath import mp from mpmath import mp
from gsuid_core.logger import logger from gsuid_core.logger import logger
from ..mono.Character import Character
from .Avatar.Avatar import Avatar from .Avatar.Avatar import Avatar
from .Weapon.Weapon import Weapon
from .utils import merge_attribute
from ..mono.Character import Character
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
from .Weapon.Weapon import Weapon
mp.dps = 14 mp.dps = 14
@ -163,6 +162,22 @@ class RoleInstance:
logger.info(f'技能区总: {skill_multiplier}') logger.info(f'技能区总: {skill_multiplier}')
if self.raw_data.avatar.id_ == 1208:
logger.info(f'符玄战技【穷观阵】属性加成')
fx_cc_up = self.avatar.BPSkill_num('BPSkill_CC')
fx_hp_up = self.avatar.BPSkill_num('BPSkill_HP')
critical_chance_base = self.attribute_bonus.get(
'CriticalChanceBase', 0
)
self.attribute_bonus[
'CriticalChanceBase'
] = critical_chance_base + mp.mpf(fx_cc_up)
hp_added_ratio = self.attribute_bonus.get('HPAddedRatio', 0)
self.attribute_bonus['HPAddedRatio'] = hp_added_ratio + mp.mpf(
fx_hp_up
)
# 检查武器战斗生效的buff # 检查武器战斗生效的buff
logger.info('检查武器战斗生效的buff') logger.info('检查武器战斗生效的buff')
Ultra_Use = self.avatar.Ultra_Use() Ultra_Use = self.avatar.Ultra_Use()
@ -222,18 +237,32 @@ class RoleInstance:
damage_add = 0 damage_add = 0
hp_multiplier = 0 hp_multiplier = 0
hp_num = 0 hp_num = 0
if self.raw_data.avatar.id_ == 1205: if self.raw_data.avatar.id_ in [1205, 1208]:
hp_num = merged_attr['hp'] hp_num = merged_attr['hp']
if skill_type == 'Normal1': if skill_type == 'Normal':
if self.raw_data.avatar.id_ == 1208:
hp_multiplier = self.avatar.Normalnum('Normal_HP')
elif skill_type == 'Normal1':
hp_multiplier = self.avatar.Normalnum('Normal1_HP') hp_multiplier = self.avatar.Normalnum('Normal1_HP')
skill_type = 'Normal' skill_type = 'Normal'
elif skill_type == 'Ultra': elif skill_type == 'Ultra':
hp_multiplier = self.avatar.Ultra_num('Ultra_HP') hp_multiplier = self.avatar.Ultra_num('Ultra_HP')
if self.raw_data.avatar.rank >= 1: if (
self.raw_data.avatar.rank >= 1
and self.raw_data.avatar.id_ == 1205
):
hp_multiplier += 0.9 hp_multiplier += 0.9
if (
self.raw_data.avatar.rank >= 6
and self.raw_data.avatar.id_ == 1208
):
hp_multiplier += 1.2
elif skill_type == 'Talent': elif skill_type == 'Talent':
hp_multiplier = self.avatar.Talent_num('Talent_HP') hp_multiplier = self.avatar.Talent_num('Talent_HP')
if self.raw_data.avatar.rank >= 6: if (
self.raw_data.avatar.rank >= 6
and self.raw_data.avatar.id_ == 1205
):
damage_add = hp_num * 0.5 damage_add = hp_num * 0.5
else: else:
hp_multiplier = 0 hp_multiplier = 0
@ -412,10 +441,14 @@ class RoleInstance:
attack_tz = ( attack_tz = (
attr_value_tz attr_value_tz
+ attr_value_tz + attr_value_tz
* (1 + self.attribute_bonus.get('AttackAddedRatio', 0) + 2.144) * (
1
+ self.attribute_bonus.get('AttackAddedRatio', 0)
+ 2.144
)
+ self.attribute_bonus['AttackDelta'] + self.attribute_bonus['AttackDelta']
) )
if self.raw_data.avatar.id_ == 1205: if self.raw_data.avatar.id_ in [1205, 1208]:
attack_tz = (skill_multiplier * attack_tz) + ( attack_tz = (skill_multiplier * attack_tz) + (
hp_multiplier * hp_num hp_multiplier * hp_num
) )

View File

@ -1117,10 +1117,41 @@ class GoodNightandSleepWell(BaseWeapon):
return attribute_bonus return attribute_bonus
# 她已闭上双眼
class SheAlreadyShutHerEyes(BaseWeapon):
weapon_base_attributes: Dict
def __init__(self, weapon: DamageInstanceWeapon):
super().__init__(weapon)
async def check(self):
# 当装备者的生命值降低时使我方全体造成的伤害提高15%
return True
async def weapon_ability(
self, Ultra_Use: int, base_attr: Dict, attribute_bonus: Dict
):
if await self.check():
all_damage_added_ratio = attribute_bonus.get(
'AllDamageAddedRatio', 0
)
attribute_bonus['AllDamageAddedRatio'] = (
all_damage_added_ratio
+ mp.mpf(
weapon_effect['23011']['Param']['AllDamageAddedRatio'][
self.weapon_rank - 1
]
)
* 3
)
return attribute_bonus
class Weapon: class Weapon:
@classmethod @classmethod
def create(cls, weapon: DamageInstanceWeapon): def create(cls, weapon: DamageInstanceWeapon):
if weapon.id_ in [ if weapon.id_ in [
23011,
23007, 23007,
21005, 21005,
21019, 21019,
@ -1159,6 +1190,8 @@ class Weapon:
21008, 21008,
21001, 21001,
]: ]:
if weapon.id_ == 23011:
return SheAlreadyShutHerEyes(weapon)
if weapon.id_ == 21001: if weapon.id_ == 21001:
return GoodNightandSleepWell(weapon) return GoodNightandSleepWell(weapon)
if weapon.id_ == 21008: if weapon.id_ == 21008:

View File

@ -1,37 +1,37 @@
import json import json
from pathlib import Path from pathlib import Path
from typing import List, Optional, Union from typing import List, Union, Optional
from httpx import ReadTimeout
from mpmath import mp from mpmath import mp
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 .cal_value import cal_relic_sub_affix, cal_relic_main_affix
from ..utils.excel.read_excel import AvatarPromotion, EquipmentPromotion from ..utils.excel.read_excel import AvatarPromotion, EquipmentPromotion
from ..utils.map.SR_MAP_PATH import ( from ..utils.map.SR_MAP_PATH import (
AvatarRankSkillUp, SetId2Name,
EquipmentID2Name,
EquipmentID2Rarity,
ItemId2Name, ItemId2Name,
Property2Name, Property2Name,
RelicId2SetId, RelicId2SetId,
SetId2Name, EquipmentID2Name,
avatarId2DamageType, AvatarRankSkillUp,
avatarId2EnName, EquipmentID2Rarity,
rankId2Name,
skillId2Name,
avatarId2Name, avatarId2Name,
skillId2Effect,
avatarId2EnName,
avatarId2Rarity, avatarId2Rarity,
characterSkillTree, characterSkillTree,
rankId2Name,
skillId2AttackType, skillId2AttackType,
skillId2Effect, avatarId2DamageType,
skillId2Name,
) )
from ..utils.resource.RESOURCE_PATH import PLAYER_PATH
# from gsuid_core.utils.api.minigg.request import get_weapon_info
from .cal_value import cal_relic_main_affix, cal_relic_sub_affix
mp.dps = 14 mp.dps = 14
@ -231,7 +231,7 @@ async def get_data(char: Avatar, sr_data: MihomoData, sr_uid: str):
rankTemp['rankName'] = rankId2Name[str(rank_id)] rankTemp['rankName'] = rankId2Name[str(rank_id)]
rank_temp.append(rankTemp) rank_temp.append(rankTemp)
char_data['rankList'] = rank_temp char_data['rankList'] = rank_temp
# 处理命座中的 level_up_skills # 处理命座中的 level_up_skills
if char_data.get('rankList'): if char_data.get('rankList'):
for rank_item in char_data['rankList']: for rank_item in char_data['rankList']:
@ -242,14 +242,15 @@ async def get_data(char: Avatar, sr_data: MihomoData, sr_uid: str):
skill_id = item['id'] skill_id = item['id']
skill_up_num = item['num'] skill_up_num = item['num']
# 查找skill_id在不在avatarSkill中 # 查找skill_id在不在avatarSkill中
for index, skill_item in enumerate(char_data['avatarSkill']): for index, skill_item in enumerate(
if skill_id == str(skill_item['skillId']): char_data['avatarSkill']
char_data['avatarSkill'][index]['skillLevel'] += skill_up_num ):
if str(skill_id) == str(skill_item['skillId']):
char_data['avatarSkill'][index][
'skillLevel'
] += skill_up_num
break break
# 处理基础属性 # 处理基础属性
base_attributes = {} base_attributes = {}
avatar_promotion_base = AvatarPromotion[str(char['avatarId'])][ avatar_promotion_base = AvatarPromotion[str(char['avatarId'])][

View File

@ -1,12 +1,12 @@
from gsuid_core.sv import SV
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
from gsuid_core.models import Event from gsuid_core.models import Event
from gsuid_core.sv import SV
from ..utils.convert import get_uid from ..utils.convert import get_uid
from ..utils.error_reply import UID_HINT
from ..utils.sr_prefix import PREFIX from ..utils.sr_prefix import PREFIX
from .draw_gachalogs import draw_gachalogs_img from ..utils.error_reply import UID_HINT
from .get_gachalogs import save_gachalogs from .get_gachalogs import save_gachalogs
from .draw_gachalogs import draw_gachalogs_img
sv_gacha_log = SV('sr抽卡记录') sv_gacha_log = SV('sr抽卡记录')
sv_get_gachalog_by_link = SV('sr导入抽卡链接', area='DIRECT') sv_get_gachalog_by_link = SV('sr导入抽卡链接', area='DIRECT')

View File

@ -1,5 +1,5 @@
from pathlib import Path from pathlib import Path
from typing import Dict, List, TypedDict, Union from typing import Dict, List, Union, TypedDict
from msgspec import json as msgjson from msgspec import json as msgjson
@ -41,6 +41,7 @@ class TS(TypedDict):
Name: Dict[str, str] Name: Dict[str, str]
Icon: Dict[str, str] Icon: Dict[str, str]
class LU(TypedDict): class LU(TypedDict):
id: str id: str
num: int num: int
@ -117,4 +118,6 @@ with Path.open(MAP / AvatarRelicScore_fileName, encoding='UTF-8') as f:
AvatarRelicScore = msgjson.decode(f.read(), type=List[Dict]) AvatarRelicScore = msgjson.decode(f.read(), type=List[Dict])
with Path.open(MAP / avatarRankSkillUp_fileName, encoding='UTF-8') as f: with Path.open(MAP / avatarRankSkillUp_fileName, encoding='UTF-8') as f:
AvatarRankSkillUp = msgjson.decode(f.read(), type=Dict[str, Union[List[LU], None]]) AvatarRankSkillUp = msgjson.decode(
f.read(), type=Dict[str, Union[List[LU], None]]
)