From 070bce413211e8a48192ba910d570410f82948ab Mon Sep 17 00:00:00 2001 From: qwerdvd <2450899274@qq.com> Date: Mon, 11 Sep 2023 15:17:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=8D=E5=8A=A0=E7=82=B9typing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../effect/Avatar/Avatar.py | 60 ++++++++--------- .../effect/Base/AvatarBase.py | 64 +++++++++++-------- .../effect/Base/RelicBase.py | 32 ++++++---- .../effect/Base/WeaponBase.py | 6 +- .../starrailuid_charinfo/mono/Character.py | 22 ++++--- StarRailUID/utils/map/SR_MAP_PATH.py | 7 +- StarRailUID/utils/map/model/RelicSetSkill.py | 25 ++++++++ 7 files changed, 130 insertions(+), 86 deletions(-) create mode 100644 StarRailUID/utils/map/model/RelicSetSkill.py diff --git a/StarRailUID/starrailuid_charinfo/effect/Avatar/Avatar.py b/StarRailUID/starrailuid_charinfo/effect/Avatar/Avatar.py index 0f923be..d91f587 100644 --- a/StarRailUID/starrailuid_charinfo/effect/Avatar/Avatar.py +++ b/StarRailUID/starrailuid_charinfo/effect/Avatar/Avatar.py @@ -1,9 +1,9 @@ -from typing import List +from typing import Dict, List from gsuid_core.logger import logger from ..Base.AvatarBase import BaseAvatar, BaseAvatarBuff -from ..Base.model import DamageInstanceSkill, DamageInstanceAvatar +from ..Base.model import DamageInstanceAvatar, DamageInstanceSkill class Seele(BaseAvatar): @@ -13,8 +13,8 @@ class Seele(BaseAvatar): self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): super().__init__(char=char, skills=skills) - self.eidolon_attribute = {} - self.extra_ability_attribute = {} + self.eidolon_attribute: Dict[str, float] = {} + self.extra_ability_attribute: Dict[str, float] = {} self.eidolons() self.extra_ability() @@ -41,8 +41,8 @@ class JingYuan(BaseAvatar): self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): super().__init__(char=char, skills=skills) - self.eidolon_attribute = {} - self.extra_ability_attribute = {} + self.eidolon_attribute: Dict[str, float] = {} + self.extra_ability_attribute: Dict[str, float] = {} self.eidolons() self.extra_ability() @@ -72,8 +72,8 @@ class Clara(BaseAvatar): self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): super().__init__(char=char, skills=skills) - self.eidolon_attribute = {} - self.extra_ability_attribute = {} + self.eidolon_attribute: Dict[str, float] = {} + self.extra_ability_attribute: Dict[str, float] = {} self.eidolons() self.extra_ability() @@ -98,8 +98,8 @@ class Danhengil(BaseAvatar): self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): super().__init__(char=char, skills=skills) - self.eidolon_attribute = {} - self.extra_ability_attribute = {} + self.eidolon_attribute: Dict[str, float] = {} + self.extra_ability_attribute: Dict[str, float] = {} self.eidolons() self.extra_ability() @@ -129,8 +129,8 @@ class Silverwolf(BaseAvatar): self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): super().__init__(char=char, skills=skills) - self.eidolon_attribute = {} - self.extra_ability_attribute = {} + self.eidolon_attribute: Dict[str, float] = {} + self.extra_ability_attribute: Dict[str, float] = {} self.eidolons() self.extra_ability() @@ -164,8 +164,8 @@ class Kafka(BaseAvatar): self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): super().__init__(char=char, skills=skills) - self.eidolon_attribute = {} - self.extra_ability_attribute = {} + self.eidolon_attribute: Dict[str, float] = {} + self.extra_ability_attribute: Dict[str, float] = {} self.eidolons() self.extra_ability() @@ -189,8 +189,8 @@ class Blade(BaseAvatar): self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): super().__init__(char=char, skills=skills) - self.eidolon_attribute = {} - self.extra_ability_attribute = {} + self.eidolon_attribute: Dict[str, float] = {} + self.extra_ability_attribute: Dict[str, float] = {} self.eidolons() self.extra_ability() @@ -217,8 +217,8 @@ class Fuxuan(BaseAvatar): self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): super().__init__(char=char, skills=skills) - self.eidolon_attribute = {} - self.extra_ability_attribute = {} + self.eidolon_attribute: Dict[str, float] = {} + self.extra_ability_attribute: Dict[str, float] = {} self.eidolons() self.extra_ability() @@ -240,8 +240,8 @@ class Gepard(BaseAvatar): self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): super().__init__(char=char, skills=skills) - self.eidolon_attribute = {} - self.extra_ability_attribute = {} + self.eidolon_attribute: Dict[str, float] = {} + self.extra_ability_attribute: Dict[str, float] = {} self.eidolons() self.extra_ability() @@ -262,8 +262,8 @@ class Yanqing(BaseAvatar): self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): super().__init__(char=char, skills=skills) - self.eidolon_attribute = {} - self.extra_ability_attribute = {} + self.eidolon_attribute: Dict[str, float] = {} + self.extra_ability_attribute: Dict[str, float] = {} self.eidolons() self.extra_ability() @@ -297,8 +297,8 @@ class Welt(BaseAvatar): self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): super().__init__(char=char, skills=skills) - self.eidolon_attribute = {} - self.extra_ability_attribute = {} + self.eidolon_attribute: Dict[str, float] = {} + self.extra_ability_attribute: Dict[str, float] = {} self.eidolons() self.extra_ability() @@ -322,8 +322,8 @@ class Himeko(BaseAvatar): self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): super().__init__(char=char, skills=skills) - self.eidolon_attribute = {} - self.extra_ability_attribute = {} + self.eidolon_attribute: Dict[str, float] = {} + self.extra_ability_attribute: Dict[str, float] = {} self.eidolons() self.extra_ability() @@ -351,8 +351,8 @@ class Qingque(BaseAvatar): self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): super().__init__(char=char, skills=skills) - self.eidolon_attribute = {} - self.extra_ability_attribute = {} + self.eidolon_attribute: Dict[str, float] = {} + self.extra_ability_attribute: Dict[str, float] = {} self.eidolons() self.extra_ability() @@ -383,8 +383,8 @@ class Jingliu(BaseAvatar): self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill] ): super().__init__(char=char, skills=skills) - self.eidolon_attribute = {} - self.extra_ability_attribute = {} + self.eidolon_attribute: Dict[str, float] = {} + self.extra_ability_attribute: Dict[str, float] = {} self.eidolons() self.extra_ability() diff --git a/StarRailUID/starrailuid_charinfo/effect/Base/AvatarBase.py b/StarRailUID/starrailuid_charinfo/effect/Base/AvatarBase.py index 7f57366..1dad396 100644 --- a/StarRailUID/starrailuid_charinfo/effect/Base/AvatarBase.py +++ b/StarRailUID/starrailuid_charinfo/effect/Base/AvatarBase.py @@ -111,66 +111,74 @@ class BaseAvatar: skill_info_ = msgspec.convert(skill_info, type=List[Union[str, int]]) return skill_info_ - def Normalnum(self, skill_type: str) -> float: - return skill_dict[str(self.avatar_id)][skill_type][ + def Normalnum(self, skill_type: str): + skill_info = skill_dict[str(self.avatar_id)][skill_type][ self.Skill.Normal_.level - 1 ] + return msgspec.convert(skill_info, type=float) - def Normal(self) -> float: - return skill_dict[str(self.avatar_id)]['Normal'][ + def Normal(self): + skill_info = skill_dict[str(self.avatar_id)]['Normal'][ self.Skill.Normal_.level - 1 ] + return msgspec.convert(skill_info, type=float) - def BPSkill(self) -> float: - return skill_dict[str(self.avatar_id)]['BPSkill'][ + def BPSkill(self): + skill_info = skill_dict[str(self.avatar_id)]['BPSkill'][ self.Skill.BPSkill_.level - 1 ] + return msgspec.convert(skill_info, type=float) - def Ultra(self) -> float: - return skill_dict[str(self.avatar_id)]['Ultra'][ + def Ultra(self): + skill_info = skill_dict[str(self.avatar_id)]['Ultra'][ self.Skill.Ultra_.level - 1 ] + return msgspec.convert(skill_info, type=float) - def Maze(self) -> float: - return skill_dict[str(self.avatar_id)]['Maze'][ + def Maze(self): + skill_info = skill_dict[str(self.avatar_id)]['Maze'][ self.Skill.Maze_.level - 1 ] + return msgspec.convert(skill_info, type=float) - def Talent(self) -> float: - return skill_dict[str(self.avatar_id)]['Talent'][ + def Talent(self): + skill_info = skill_dict[str(self.avatar_id)]['Talent'][ self.Skill.Talent_.level - 1 ] + return msgspec.convert(skill_info, type=float) - def BPSkill_num(self, skill_type: str) -> float: - return skill_dict[str(self.avatar_id)][skill_type][ + def BPSkill_num(self, skill_type: str): + skill_info = skill_dict[str(self.avatar_id)][skill_type][ self.Skill.BPSkill_.level - 1 ] + return msgspec.convert(skill_info, type=float) - def Ultra_num(self, skill_type: str) -> float: - return skill_dict[str(self.avatar_id)][skill_type][ + def Ultra_num(self, skill_type: str): + skill_info = skill_dict[str(self.avatar_id)][skill_type][ self.Skill.Ultra_.level - 1 ] + return msgspec.convert(skill_info, type=float) - def Talent_num(self, skill_type: str) -> float: - return skill_dict[str(self.avatar_id)][skill_type][ + def Talent_num(self, skill_type: str): + skill_info = skill_dict[str(self.avatar_id)][skill_type][ self.Skill.Talent_.level - 1 ] + return msgspec.convert(skill_info, type=float) - def Talent_add(self) -> float: + def Talent_add(self): if self.avatar_id in [1102]: - return float( - skill_dict[str(self.avatar_id)]['Talent'][ + skill_info = skill_dict[str(self.avatar_id)]['Talent'][ self.Skill.Talent_.level - 1 ] - ) + return msgspec.convert(skill_info, type=float) elif self.avatar_id in [1205]: - return float( - skill_dict[str(self.avatar_id)]['BPSkill'][ + skill_info = skill_dict[str(self.avatar_id)]['BPSkill'][ self.Skill.BPSkill_.level - 1 ] - ) + return msgspec.convert(skill_info, type=float) else: - return float(0) + return 0.0 - def Ultra_Use(self) -> float: - return skill_dict[str(self.avatar_id)]['Ultra_Use'][0] + def Ultra_Use(self): + skill_info = skill_dict[str(self.avatar_id)]['Ultra_Use'][0] + return msgspec.convert(skill_info, type=float) diff --git a/StarRailUID/starrailuid_charinfo/effect/Base/RelicBase.py b/StarRailUID/starrailuid_charinfo/effect/Base/RelicBase.py index 59e3fe5..2e38e90 100644 --- a/StarRailUID/starrailuid_charinfo/effect/Base/RelicBase.py +++ b/StarRailUID/starrailuid_charinfo/effect/Base/RelicBase.py @@ -14,7 +14,7 @@ class SingleRelic: self.set_id = relic.SetId self.relic_type = relic.Type self.relic_level = relic.Level - self.relic_attribute_bonus = {} + self.relic_attribute_bonus: Dict[str, float] = {} def get_attribute_(self): # MainAffix @@ -51,8 +51,7 @@ class BaseRelicSetSkill: if count == 4: self.pieces4 = True logger.info(f'Relic {set_id} 4 pieces set activated') - self.relicSetAttribute: Dict[str, float] = {} - self.set_skill_property_ability() + self.relicSetAttribute = self.set_skill_property_ability() @abstractmethod async def check( @@ -72,17 +71,22 @@ class BaseRelicSetSkill: def set_skill_property_ability(self): set_property = '' set_value = 0 - if self.pieces2 and RelicSetSkill[str(self.setId)]['2'] != {}: - set_property = RelicSetSkill[str(self.setId)]['2']['Property'] - set_value = RelicSetSkill[str(self.setId)]['2']['Value'] - if self.pieces4 and RelicSetSkill[str(self.setId)]['4'] != {}: - set_property = RelicSetSkill[str(self.setId)]['4']['Property'] - set_value = RelicSetSkill[str(self.setId)]['4']['Value'] + relic_set_attribute: Dict[str, float] = {} + if self.pieces2: + status_add = RelicSetSkill.RelicSet[str(self.setId)]['2'] + if status_add: + set_property = status_add.Property + set_value = status_add.Value + if self.pieces4: + status_add = RelicSetSkill.RelicSet[str(self.setId)]['4'] + if status_add: + set_property = status_add.Property + set_value = status_add.Value if set_property != '': - if set_property in self.relicSetAttribute: - self.relicSetAttribute[set_property] = ( - self.relicSetAttribute[set_property] + set_value + if set_property in relic_set_attribute: + relic_set_attribute[set_property] = ( + relic_set_attribute[set_property] + set_value ) else: - self.relicSetAttribute[set_property] = set_value - return self.relicSetAttribute + relic_set_attribute[set_property] = set_value + return relic_set_attribute diff --git a/StarRailUID/starrailuid_charinfo/effect/Base/WeaponBase.py b/StarRailUID/starrailuid_charinfo/effect/Base/WeaponBase.py index 2d4558f..0ff2fae 100644 --- a/StarRailUID/starrailuid_charinfo/effect/Base/WeaponBase.py +++ b/StarRailUID/starrailuid_charinfo/effect/Base/WeaponBase.py @@ -1,11 +1,11 @@ -from typing import Dict from abc import abstractmethod +from typing import Dict from msgspec import Struct -from .model import DamageInstanceWeapon from ....utils.excel.model import EquipmentPromotionConfig from ....utils.map.SR_MAP_PATH import EquipmentID2AbilityProperty +from .model import DamageInstanceWeapon class BaseWeaponAttribute(Struct): @@ -28,7 +28,7 @@ class BaseWeapon: self.weapon_rank = weapon.rank self.weapon_promotion = weapon.promotion self.weapon_base_attribute = self.get_attribute() - self.weapon_attribute = {} + self.weapon_attribute: Dict[str, float] = {} self.get_attribute() self.weapon_property_ability() diff --git a/StarRailUID/starrailuid_charinfo/mono/Character.py b/StarRailUID/starrailuid_charinfo/mono/Character.py index e4cd46b..b94e094 100644 --- a/StarRailUID/starrailuid_charinfo/mono/Character.py +++ b/StarRailUID/starrailuid_charinfo/mono/Character.py @@ -1,10 +1,10 @@ import json -from typing import Dict from collections import Counter +from typing import Dict, List from loguru import logger -from ...utils.map.SR_MAP_PATH import RelicSetSkill, EquipmentID2AbilityProperty +from ...utils.map.SR_MAP_PATH import EquipmentID2AbilityProperty, RelicSetSkill class Character: @@ -74,7 +74,7 @@ class Character: async def get_relic_info(self): # 计算圣遗物效果 - set_id_list = [] + set_id_list: List[int] = [] for relic in self.char_relic: set_id_list.append(relic['SetId']) # 处理主属性 @@ -103,12 +103,16 @@ class Character: set_id = item[0] count = item[1] set_value = 0 - if count >= 2 and RelicSetSkill[str(set_id)]['2'] != {}: - set_property = RelicSetSkill[str(set_id)]['2']['Property'] - set_value = RelicSetSkill[str(set_id)]['2']['Value'] - if count == 4 and RelicSetSkill[str(set_id)]['4'] != {}: - set_property = RelicSetSkill[str(set_id)]['4']['Property'] - set_value = RelicSetSkill[str(set_id)]['4']['Value'] + if count >= 2: + status_add = RelicSetSkill.RelicSet[str(set_id)]['2'] + if status_add: + set_property = status_add.Property + set_value = status_add.Value + if count == 4: + status_add = RelicSetSkill.RelicSet[str(set_id)]['4'] + if status_add: + set_property = status_add.Property + set_value = status_add.Value if set_property != '': if set_property in self.add_attr: self.add_attr[set_property] = ( diff --git a/StarRailUID/utils/map/SR_MAP_PATH.py b/StarRailUID/utils/map/SR_MAP_PATH.py index 21f9c70..cb1dd25 100644 --- a/StarRailUID/utils/map/SR_MAP_PATH.py +++ b/StarRailUID/utils/map/SR_MAP_PATH.py @@ -1,9 +1,11 @@ +import json from pathlib import Path -from typing import Dict, List, Union, TypedDict +from typing import Dict, List, TypedDict, Union from msgspec import json as msgjson from ...version import StarRail_version +from .model.RelicSetSkill import RelicSetSkillModel MAP = Path(__file__).parent / 'data' @@ -97,7 +99,8 @@ with Path.open( ) with Path.open(MAP / RelicSetSkill_fileName, encoding='UTF-8') as f: - RelicSetSkill = msgjson.decode(f.read(), type=Dict[str, Dict]) + data = json.load(f) + RelicSetSkill = RelicSetSkillModel.from_json(data) with Path.open(MAP / skillId2AttackType_fileName, encoding='UTF-8') as f: skillId2AttackType = msgjson.decode(f.read(), type=Dict[str, str]) diff --git a/StarRailUID/utils/map/model/RelicSetSkill.py b/StarRailUID/utils/map/model/RelicSetSkill.py new file mode 100644 index 0000000..878f034 --- /dev/null +++ b/StarRailUID/utils/map/model/RelicSetSkill.py @@ -0,0 +1,25 @@ +from typing import Dict, Union + +from msgspec import Struct + + +class RelicSetStatusAdd(Struct): + Property: str + Value: float + + +class RelicSetSkillModel(Struct): + RelicSet: Dict[str, Dict[str, Union[RelicSetStatusAdd, None]]] + + @classmethod + def from_json(cls, data: Dict): + return cls(RelicSet={ + str(k): { + str(k2): RelicSetStatusAdd( + Property=v2['Property'], + Value=v2['Value'] + ) if v2 else None + for k2, v2 in v.items() + } + for k, v in data.items() + })