diff --git a/StarRailUID/starrailuid_charinfo/__init__.py b/StarRailUID/starrailuid_charinfo/__init__.py index c367221..605d8fc 100644 --- a/StarRailUID/starrailuid_charinfo/__init__.py +++ b/StarRailUID/starrailuid_charinfo/__init__.py @@ -15,12 +15,17 @@ from ..utils.error_reply import UID_HINT from ..utils.image.convert import convert_img from ..utils.resource.RESOURCE_PATH import TEMP_PATH from ..utils.sr_prefix import PREFIX -from .draw_char_img import draw_char_info_img +from .cal_damage import cal +from .draw_char_img import ( + draw_char_info_img, + get_char_data, +) from .to_card import api_to_card sv_char_info_config = SV('sr面板设置', pm=2) sv_get_char_info = SV('sr面板查询', priority=10) sv_get_sr_original_pic = SV('sr查看面板原图', priority=5) +sv_char_damage_cal = SV('sr伤害计算') @sv_get_char_info.on_prefix(f'{PREFIX}查询') @@ -72,3 +77,25 @@ async def send_card_info(bot: Bot, ev: Event): await bot.logger.info(f'UID{uid}获取角色数据成功!') await bot.send(im) return None + + +@sv_char_damage_cal.on_prefix(f'{PREFIX}伤害计算') +async def send_damage_msg(bot: Bot, ev: Event): + msg = ''.join(re.findall('[\u4e00-\u9fa5 ]', ev.text)) + if not msg: + return None + await bot.logger.info('开始执行[角色伤害计算]') + # 获取uid + sr_uid = await get_uid(bot, ev) + if sr_uid is None: + return await bot.send(UID_HINT) + await bot.logger.info(f'[角色伤害计算]uid: {sr_uid}') + char_name = ' '.join(re.findall('[\u4e00-\u9fa5]+', msg)) + + char_data = await get_char_data(sr_uid, char_name) + if isinstance(char_data, str): + return await bot.send(char_data) + + im = await cal(char_data) + await bot.send(im) + return None diff --git a/StarRailUID/starrailuid_charinfo/cal_damage.py b/StarRailUID/starrailuid_charinfo/cal_damage.py new file mode 100644 index 0000000..53e0e0a --- /dev/null +++ b/StarRailUID/starrailuid_charinfo/cal_damage.py @@ -0,0 +1,20 @@ +from typing import Dict + +from mpmath import mp + +from .draw_char_img import cal_char_info +from .effect.Role import RoleInstance + +mp.dps = 14 + + +async def cal(char_data: Dict): + char = await cal_char_info(char_data) + + im = [] + + for skill_type in ['Normal', 'BPSkill', 'Ultra']: + role = RoleInstance(char) + im_tmp = await role.cal_damage(skill_type) + im.append(im_tmp) + return im diff --git a/StarRailUID/starrailuid_damagecal/config/RelicAbility.json b/StarRailUID/starrailuid_charinfo/config/RelicAbility.json similarity index 100% rename from StarRailUID/starrailuid_damagecal/config/RelicAbility.json rename to StarRailUID/starrailuid_charinfo/config/RelicAbility.json diff --git a/StarRailUID/starrailuid_charinfo/draw_char_img.py b/StarRailUID/starrailuid_charinfo/draw_char_img.py index 2975224..7301c98 100644 --- a/StarRailUID/starrailuid_charinfo/draw_char_img.py +++ b/StarRailUID/starrailuid_charinfo/draw_char_img.py @@ -37,7 +37,7 @@ from ..utils.resource.RESOURCE_PATH import ( SKILL_PATH, WEAPON_PATH, ) -from .mono.Character import Character +from .effect.Base.Character import Character from .to_data import api_to_dict mp.dps = 14 diff --git a/StarRailUID/starrailuid_damagecal/effect/Avatar/Avatar.py b/StarRailUID/starrailuid_charinfo/effect/Avatar/Avatar.py similarity index 71% rename from StarRailUID/starrailuid_damagecal/effect/Avatar/Avatar.py rename to StarRailUID/starrailuid_charinfo/effect/Avatar/Avatar.py index 0aae3b7..cc9473e 100644 --- a/StarRailUID/starrailuid_damagecal/effect/Avatar/Avatar.py +++ b/StarRailUID/starrailuid_charinfo/effect/Avatar/Avatar.py @@ -1,8 +1,12 @@ -from typing import Dict, List +from typing import List from mpmath import mp from ..Base.AvatarBase import BaseAvatar, BaseAvatarBuff +from ..Base.model import ( + DamageInstanceAvatar, + DamageInstanceSkill, +) mp.dps = 14 @@ -10,7 +14,7 @@ mp.dps = 14 class Seele(BaseAvatar): Buff: BaseAvatarBuff - def __init__(self, char: Dict, skills: List): + def __init__(self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill]): super().__init__(char=char, skills=skills) self.eidolon_attribute = {} self.extra_ability_attribute = {} @@ -35,7 +39,8 @@ class Seele(BaseAvatar): class Avatar(Seele): - def __init__(self, char: Dict, skills: List): - if char['id'] == 1102: + @classmethod + def create(cls, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill]): + if char.id_ == 1102: return Seele(char, skills) - return None + raise Exception('角色不存在') diff --git a/StarRailUID/starrailuid_damagecal/effect/Avatar/__init__.py b/StarRailUID/starrailuid_charinfo/effect/Avatar/__init__.py similarity index 100% rename from StarRailUID/starrailuid_damagecal/effect/Avatar/__init__.py rename to StarRailUID/starrailuid_charinfo/effect/Avatar/__init__.py diff --git a/StarRailUID/starrailuid_damagecal/effect/Base/AvatarBase.py b/StarRailUID/starrailuid_charinfo/effect/Base/AvatarBase.py similarity index 73% rename from StarRailUID/starrailuid_damagecal/effect/Base/AvatarBase.py rename to StarRailUID/starrailuid_charinfo/effect/Base/AvatarBase.py index f37fc5d..46c59e8 100644 --- a/StarRailUID/starrailuid_damagecal/effect/Base/AvatarBase.py +++ b/StarRailUID/starrailuid_charinfo/effect/Base/AvatarBase.py @@ -1,11 +1,12 @@ import json from abc import abstractmethod from pathlib import Path -from typing import Dict, List +from typing import List from mpmath import mp from ....utils.excel.read_excel import AvatarPromotion +from .model import DamageInstanceAvatar, DamageInstanceSkill from .SkillBase import BaseSkills path = Path(__file__).parent.parent @@ -16,10 +17,13 @@ mp.dps = 14 class BaseAvatarBuff: - def __init__(self, char: Dict, skills: List): - self.extra_ability_id = [] - for extra_ability in char['extra_ability']: - self.extra_ability_id.append(extra_ability['extraAbilityId']) + @classmethod + def create(cls, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill]): + cls.extra_ability_id = [] + if char.extra_ability: + for extra_ability in char.extra_ability: + cls.extra_ability_id.append(extra_ability['extraAbilityId']) + return cls @abstractmethod async def Technique(self): @@ -35,19 +39,16 @@ class BaseAvatarBuff: class BaseAvatar: - Skill: BaseSkills - Buff: BaseAvatarBuff - - def __init__(self, char: Dict, skills: List): - self.Skill = BaseSkills(char=char, skills=skills) - self.Buff = BaseAvatarBuff(char=char, skills=skills) - self.avatar_id = char['id'] - self.avatar_level = char['level'] - self.avatar_rank = char['rank'] - self.avatar_element = char['element'] - self.avatar_promotion = char['promotion'] - self.avatar_attribute_bonus = char['attribute_bonus'] - self.avatar_extra_ability = char['extra_ability'] + def __init__(self, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill]): + self.Skill = BaseSkills.create(char=char, skills=skills) + self.Buff = BaseAvatarBuff.create(char=char, skills=skills) + self.avatar_id = char.id_ + self.avatar_level = char.level + self.avatar_rank = char.rank + self.avatar_element = char.element + self.avatar_promotion = char.promotion + self.avatar_attribute_bonus = char.attribute_bonus + self.avatar_extra_ability = char.extra_ability self.avatar_attribute = {} self.get_attribute() diff --git a/StarRailUID/starrailuid_charinfo/mono/Character.py b/StarRailUID/starrailuid_charinfo/effect/Base/Character.py similarity index 97% rename from StarRailUID/starrailuid_charinfo/mono/Character.py rename to StarRailUID/starrailuid_charinfo/effect/Base/Character.py index 3d1bde0..a2a517a 100644 --- a/StarRailUID/starrailuid_charinfo/mono/Character.py +++ b/StarRailUID/starrailuid_charinfo/effect/Base/Character.py @@ -5,11 +5,10 @@ from typing import Dict from loguru import logger from mpmath import mp -from ...utils.map.SR_MAP_PATH import EquipmentID2AbilityProperty, RelicSetSkill +from ....utils.map.SR_MAP_PATH import EquipmentID2AbilityProperty, RelicSetSkill mp.dps = 14 - class Character: def __init__(self, card_prop: Dict): # 面板数据 @@ -138,4 +137,4 @@ class Character: self.add_attr[set_property] = str(set_value) logger.info(json.dumps(self.base_attributes)) - logger.info(json.dumps(self.add_attr)) + logger.info(json.dumps(self.add_attr)) \ No newline at end of file diff --git a/StarRailUID/starrailuid_damagecal/effect/Base/RelicBase.py b/StarRailUID/starrailuid_charinfo/effect/Base/RelicBase.py similarity index 77% rename from StarRailUID/starrailuid_damagecal/effect/Base/RelicBase.py rename to StarRailUID/starrailuid_charinfo/effect/Base/RelicBase.py index f53284a..caad822 100644 --- a/StarRailUID/starrailuid_damagecal/effect/Base/RelicBase.py +++ b/StarRailUID/starrailuid_charinfo/effect/Base/RelicBase.py @@ -1,42 +1,44 @@ -from typing import Dict from abc import abstractmethod +from typing import Dict from mpmath import mp + from gsuid_core.logger import logger from ....utils.map.SR_MAP_PATH import RelicSetSkill +from .model import DamageInstanceRelic mp.dps = 14 class SingleRelic: - def __init__(self, relic: Dict): + def __init__(self, relic: DamageInstanceRelic): self.raw_relic = relic - self.relic_id = relic['relicId'] - self.set_id = relic['SetId'] - self.relic_type = relic['Type'] - self.relic_level = relic.get('Level', 0) + self.relic_id = relic.relicId + self.set_id = relic.SetId + self.relic_type = relic.Type + self.relic_level = relic.Level self.relic_attribute_bonus = {} def get_attribute_(self): # MainAffix if ( - self.raw_relic['MainAffix']['Property'] + self.raw_relic.MainAffix.Property in self.relic_attribute_bonus ): self.relic_attribute_bonus[ - self.raw_relic['MainAffix']['Property'] - ] += mp.mpf(self.raw_relic['MainAffix']['Value']) + self.raw_relic.MainAffix.Property + ] += mp.mpf(self.raw_relic.MainAffix.Value) else: self.relic_attribute_bonus[ - self.raw_relic['MainAffix']['Property'] - ] = mp.mpf(self.raw_relic['MainAffix']['Value']) + self.raw_relic.MainAffix.Property + ] = mp.mpf(self.raw_relic.MainAffix.Value) # SubAffix - if self.raw_relic.get('SubAffixList'): - for sub_affix in self.raw_relic['SubAffixList']: - sub_affix_property = sub_affix['Property'] - value = mp.mpf(sub_affix['Value']) + if self.raw_relic.SubAffixList: + for sub_affix in self.raw_relic.SubAffixList: + sub_affix_property = sub_affix.Property + value = mp.mpf(sub_affix.Value) if sub_affix_property in self.relic_attribute_bonus: self.relic_attribute_bonus[sub_affix_property] += value else: diff --git a/StarRailUID/starrailuid_damagecal/effect/Base/SkillBase.py b/StarRailUID/starrailuid_charinfo/effect/Base/SkillBase.py similarity index 55% rename from StarRailUID/starrailuid_damagecal/effect/Base/SkillBase.py rename to StarRailUID/starrailuid_charinfo/effect/Base/SkillBase.py index 4f861c4..99cf1b4 100644 --- a/StarRailUID/starrailuid_damagecal/effect/Base/SkillBase.py +++ b/StarRailUID/starrailuid_charinfo/effect/Base/SkillBase.py @@ -1,9 +1,11 @@ import json from pathlib import Path -from typing import Dict, List +from typing import List from mpmath import mp +from .model import DamageInstanceAvatar, DamageInstanceSkill + mp.dps = 14 @@ -13,9 +15,9 @@ with Path.open(path / 'Excel' / 'seele.json', encoding='utf-8') as f: class SingleSkill: - def __init__(self, skill: Dict): - self.id = skill['skillId'] - self.level = skill['skillLevel'] + def __init__(self, skill: DamageInstanceSkill): + self.id = skill.skillId + self.level = skill.skillLevel class BaseSkills: @@ -25,20 +27,22 @@ class BaseSkills: Maze_: SingleSkill Talent_: SingleSkill - def __init__(self, char: Dict, skills: List): + @classmethod + def create(cls, char: DamageInstanceAvatar, skills: List[DamageInstanceSkill]): for skill in skills: - skill_attack_type = skill['skillAttackType'] + skill_attack_type = skill.skillAttackType if skill_attack_type == 'Normal': - self.Normal_ = SingleSkill(skill) + cls.Normal_ = SingleSkill(skill) elif skill_attack_type == 'BPSkill': - self.BPSkill_ = SingleSkill(skill) + cls.BPSkill_ = SingleSkill(skill) elif skill_attack_type == 'Ultra': - self.Ultra_ = SingleSkill(skill) + cls.Ultra_ = SingleSkill(skill) elif skill_attack_type == 'Maze': - self.Maze_ = SingleSkill(skill) + cls.Maze_ = SingleSkill(skill) elif skill_attack_type == '': - self.Talent_ = SingleSkill(skill) + cls.Talent_ = SingleSkill(skill) else: raise ValueError( f'Unknown skillAttackType: {skill_attack_type}' ) + return cls diff --git a/StarRailUID/starrailuid_damagecal/effect/Base/WeaponBase.py b/StarRailUID/starrailuid_charinfo/effect/Base/WeaponBase.py similarity index 88% rename from StarRailUID/starrailuid_damagecal/effect/Base/WeaponBase.py rename to StarRailUID/starrailuid_charinfo/effect/Base/WeaponBase.py index bbe03aa..f609d1e 100644 --- a/StarRailUID/starrailuid_damagecal/effect/Base/WeaponBase.py +++ b/StarRailUID/starrailuid_charinfo/effect/Base/WeaponBase.py @@ -1,20 +1,21 @@ -from typing import Dict from abc import abstractmethod +from typing import Dict from mpmath import mp from ....utils.excel.read_excel import EquipmentPromotion from ....utils.map.SR_MAP_PATH import EquipmentID2AbilityProperty +from .model import DamageInstanceWeapon mp.dps = 14 class BaseWeapon: - def __init__(self, weapon: Dict): - self.weapon_id = weapon['id'] - self.weapon_level = weapon['level'] - self.weapon_rank = weapon['rank'] - self.weapon_promotion = weapon['promotion'] + def __init__(self, weapon: DamageInstanceWeapon): + self.weapon_id = weapon.id_ + self.weapon_level = weapon.level + self.weapon_rank = weapon.rank + self.weapon_promotion = weapon.promotion self.weapon_base_attribute = {} self.weapon_attribute = {} self.get_attribute() diff --git a/StarRailUID/starrailuid_charinfo/effect/Base/model.py b/StarRailUID/starrailuid_charinfo/effect/Base/model.py new file mode 100644 index 0000000..d7a123c --- /dev/null +++ b/StarRailUID/starrailuid_charinfo/effect/Base/model.py @@ -0,0 +1,101 @@ +from typing import List + +from msgspec import Struct, field + + +class DamageInstanceSkill(Struct): + skillId: int + skillName: str + skillEffect: str + skillAttackType: str + skillLevel: int + + +class DamageInstanceRelicSubAffix(Struct): + SubAffixID: int + Property: str + Name: str + Cnt: int + Step: int + Value: str + + +class DamageInstanceRelicMainAffix(Struct): + AffixID: int + Property: str + Name: str + Value: str + + +class DamageInstanceRelic(Struct): + relicId: int + relicName: str + SetId: int + SetName: str + Type: int + MainAffix: DamageInstanceRelicMainAffix + SubAffixList: List[DamageInstanceRelicSubAffix] | None + Level: int = 0 + + +class DamageInstanceWeapon(Struct): + id_: str = field(name='id') + level: int + rank: int + promotion: int + + +class AttributeBounsStatusAdd(Struct): + property: str + name: str + value: int + + +class DamageInstanceAvatarAttributeBouns(Struct): + attributeBonusId: int + attributeBonusLevel: int + statusAdd: AttributeBounsStatusAdd + + +class DamageInstanceAvatar(Struct): + id_: str = field(name='id') + level: int + rank: int + element: str + promotion: int + attribute_bonus: List[DamageInstanceAvatarAttributeBouns] | None + extra_ability: List | None + + +class DamageInstance: + avatar: DamageInstanceAvatar + weapon: DamageInstanceWeapon + relic: List[DamageInstanceRelic] + skill: List[DamageInstanceSkill] + + def __init__(self, char): + self.avatar = DamageInstanceAvatar( + id_=char.char_id, + level=char.char_level, + rank=char.char_rank, + element=char.char_element, + promotion=char.char_promotion, + attribute_bonus=char.attribute_bonus, + extra_ability=char.extra_ability, + ) + self.weapon = DamageInstanceWeapon( + id_=char.equipment['equipmentID'], + level=char.equipment['equipmentLevel'], + rank=char.equipment['equipmentRank'], + promotion=char.equipment['equipmentPromotion'], + ) + self.relic = [] + for relic in char.char_relic: + self.relic.append( + DamageInstanceRelic(**relic) + ) + self.skill = [] + for skill in char.char_skill: + self.skill.append( + DamageInstanceSkill(**skill) + ) diff --git a/StarRailUID/starrailuid_damagecal/effect/Excel/AvatarExtraAbility.json b/StarRailUID/starrailuid_charinfo/effect/Excel/AvatarExtraAbility.json similarity index 100% rename from StarRailUID/starrailuid_damagecal/effect/Excel/AvatarExtraAbility.json rename to StarRailUID/starrailuid_charinfo/effect/Excel/AvatarExtraAbility.json diff --git a/StarRailUID/starrailuid_damagecal/effect/Excel/Rank.json b/StarRailUID/starrailuid_charinfo/effect/Excel/Rank.json similarity index 100% rename from StarRailUID/starrailuid_damagecal/effect/Excel/Rank.json rename to StarRailUID/starrailuid_charinfo/effect/Excel/Rank.json diff --git a/StarRailUID/starrailuid_damagecal/effect/Excel/seele.json b/StarRailUID/starrailuid_charinfo/effect/Excel/seele.json similarity index 100% rename from StarRailUID/starrailuid_damagecal/effect/Excel/seele.json rename to StarRailUID/starrailuid_charinfo/effect/Excel/seele.json diff --git a/StarRailUID/starrailuid_damagecal/effect/Excel/weapon_effect.json b/StarRailUID/starrailuid_charinfo/effect/Excel/weapon_effect.json similarity index 100% rename from StarRailUID/starrailuid_damagecal/effect/Excel/weapon_effect.json rename to StarRailUID/starrailuid_charinfo/effect/Excel/weapon_effect.json diff --git a/StarRailUID/starrailuid_damagecal/effect/Relic/Relic.py b/StarRailUID/starrailuid_charinfo/effect/Relic/Relic.py similarity index 87% rename from StarRailUID/starrailuid_damagecal/effect/Relic/Relic.py rename to StarRailUID/starrailuid_charinfo/effect/Relic/Relic.py index 5084d87..b069578 100644 --- a/StarRailUID/starrailuid_damagecal/effect/Relic/Relic.py +++ b/StarRailUID/starrailuid_charinfo/effect/Relic/Relic.py @@ -5,6 +5,7 @@ from mpmath import mp from gsuid_core.logger import logger +from ..Base.model import DamageInstanceRelic from ..Base.RelicBase import BaseRelicSetSkill, SingleRelic from ..utils import merge_attribute @@ -450,81 +451,86 @@ class RelicSet: set_id_counter: List = [] SetSkill: List - def __init__(self, relic_list: List): - self.SetSkill = [] + @classmethod + def create(cls, relic_list: List[DamageInstanceRelic]): + cls.SetSkill = [] set_id_list = [] for relic in relic_list: - set_id_list.append(relic['SetId']) + set_id_list.append(relic.SetId) - if relic['Type'] == 1: - self.HEAD = SingleRelic(relic) - elif relic['Type'] == 2: - self.HAND = SingleRelic(relic) - elif relic['Type'] == 3: - self.BODY = SingleRelic(relic) - elif relic['Type'] == 4: - self.FOOT = SingleRelic(relic) - elif relic['Type'] == 5: - self.NECK = SingleRelic(relic) - elif relic['Type'] == 6: - self.OBJECT = SingleRelic(relic) + if relic.Type == 1: + cls.HEAD = SingleRelic(relic) + elif relic.Type == 2: + cls.HAND = SingleRelic(relic) + elif relic.Type == 3: + cls.BODY = SingleRelic(relic) + elif relic.Type == 4: + cls.FOOT = SingleRelic(relic) + elif relic.Type == 5: + cls.NECK = SingleRelic(relic) + elif relic.Type == 6: + cls.OBJECT = SingleRelic(relic) else: - self.Unknow = SingleRelic(relic) + cls.Unknow = SingleRelic(relic) - self.set_id_counter: List = Counter(set_id_list).most_common() - self.check_set() - self.get_attribute() + cls.set_id_counter: List = Counter(set_id_list).most_common() + cls.check_set() + cls.get_attribute() + return cls - def get_attribute(self): - for item in self.__dict__: - if type(self.__dict__[item]) == SingleRelic: - self.__dict__[item].get_attribute_() + @classmethod + def get_attribute(cls): + for item in cls.__dict__: + if type(cls.__dict__[item]) == SingleRelic: + itme__: SingleRelic = cls.__dict__[item] + itme__.get_attribute_() - def check_set(self): - for item in self.set_id_counter: + @classmethod + def check_set(cls): + for item in cls.set_id_counter: set_id = item[0] count = item[1] # if count == 1: # break if set_id == 101: - self.SetSkill.append(Relic101(set_id, count)) + cls.SetSkill.append(Relic101(set_id, count)) elif set_id == 102: - self.SetSkill.append(Relic102(set_id, count)) + cls.SetSkill.append(Relic102(set_id, count)) elif set_id == 103: - self.SetSkill.append(Relic103(set_id, count)) + cls.SetSkill.append(Relic103(set_id, count)) elif set_id == 104: - self.SetSkill.append(Relic104(set_id, count)) + cls.SetSkill.append(Relic104(set_id, count)) elif set_id == 105: - self.SetSkill.append(Relic105(set_id, count)) + cls.SetSkill.append(Relic105(set_id, count)) elif set_id == 106: - self.SetSkill.append(Relic106(set_id, count)) + cls.SetSkill.append(Relic106(set_id, count)) elif set_id == 107: - self.SetSkill.append(Relic107(set_id, count)) + cls.SetSkill.append(Relic107(set_id, count)) elif set_id == 108: - self.SetSkill.append(Relic108(set_id, count)) + cls.SetSkill.append(Relic108(set_id, count)) elif set_id == 109: - self.SetSkill.append(Relic109(set_id, count)) + cls.SetSkill.append(Relic109(set_id, count)) elif set_id == 110: - self.SetSkill.append(Relic110(set_id, count)) + cls.SetSkill.append(Relic110(set_id, count)) elif set_id == 111: - self.SetSkill.append(Relic111(set_id, count)) + cls.SetSkill.append(Relic111(set_id, count)) elif set_id == 112: - self.SetSkill.append(Relic112(set_id, count)) + cls.SetSkill.append(Relic112(set_id, count)) elif set_id == 301: - self.SetSkill.append(Relic301(set_id, count)) + cls.SetSkill.append(Relic301(set_id, count)) elif set_id == 302: - self.SetSkill.append(Relic302(set_id, count)) + cls.SetSkill.append(Relic302(set_id, count)) elif set_id == 303: - self.SetSkill.append(Relic303(set_id, count)) + cls.SetSkill.append(Relic303(set_id, count)) elif set_id == 304: - self.SetSkill.append(Relic304(set_id, count)) + cls.SetSkill.append(Relic304(set_id, count)) elif set_id == 305: - self.SetSkill.append(Relic305(set_id, count)) + cls.SetSkill.append(Relic305(set_id, count)) elif set_id == 306: - self.SetSkill.append(Relic306(set_id, count)) + cls.SetSkill.append(Relic306(set_id, count)) elif set_id == 307: - self.SetSkill.append(Relic307(set_id, count)) + cls.SetSkill.append(Relic307(set_id, count)) elif set_id == 308: - self.SetSkill.append(Relic308(set_id, count)) + cls.SetSkill.append(Relic308(set_id, count)) else: raise Exception(f'Unknow SetId: {set_id}') diff --git a/StarRailUID/starrailuid_damagecal/effect/Relic/__init__.py b/StarRailUID/starrailuid_charinfo/effect/Relic/__init__.py similarity index 100% rename from StarRailUID/starrailuid_damagecal/effect/Relic/__init__.py rename to StarRailUID/starrailuid_charinfo/effect/Relic/__init__.py diff --git a/StarRailUID/starrailuid_damagecal/effect/Role.py b/StarRailUID/starrailuid_charinfo/effect/Role.py similarity index 85% rename from StarRailUID/starrailuid_damagecal/effect/Role.py rename to StarRailUID/starrailuid_charinfo/effect/Role.py index 1d86476..1a830db 100644 --- a/StarRailUID/starrailuid_damagecal/effect/Role.py +++ b/StarRailUID/starrailuid_charinfo/effect/Role.py @@ -1,10 +1,9 @@ -from typing import Dict - from mpmath import mp from gsuid_core.logger import logger from .Avatar.Avatar import Avatar +from .Base.model import DamageInstance from .Relic.Relic import RelicSet, SingleRelic from .utils import merge_attribute from .Weapon.Weapon import Weapon @@ -13,12 +12,12 @@ mp.dps = 14 class RoleInstance: - def __init__(self, raw_data: Dict): - self.raw_data = raw_data + def __init__(self, raw_data): + self.raw_data = DamageInstance(raw_data) - self.avatar = Avatar(raw_data['avatar'], raw_data['skill']) - self.weapon = Weapon(raw_data['weapon']) - self.relic_set = RelicSet(raw_data['relic']) + self.avatar = Avatar.create(self.raw_data.avatar, self.raw_data.skill) + self.weapon = Weapon.create(self.raw_data.weapon) + self.relic_set = RelicSet.create(self.raw_data.relic) self.base_attr = {} self.attribute_bonus = {} @@ -31,7 +30,7 @@ class RoleInstance: def cal_role_base_attr(self): logger.info('cal_role_base_attr') - avatar_attribute = self.avatar.__dict__['avatar_attribute'] + avatar_attribute = self.avatar.avatar_attribute logger.info(avatar_attribute) for attribute in avatar_attribute: if attribute in self.base_attr: @@ -39,7 +38,7 @@ class RoleInstance: else: self.base_attr[attribute] = avatar_attribute[attribute] - weapon_attribute = self.weapon.__dict__['weapon_base_attribute'] + weapon_attribute = self.weapon.weapon_base_attributes for attribute in weapon_attribute: if attribute in self.base_attr: self.base_attr[attribute] += weapon_attribute[attribute] @@ -47,6 +46,8 @@ class RoleInstance: self.base_attr[attribute] = weapon_attribute[attribute] 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__: if type(self.relic_set.__dict__[relic_type]) == SingleRelic: @@ -75,16 +76,21 @@ class RoleInstance: def cal_avatar_attr_add(self): attribute_bonus = self.avatar.avatar_attribute_bonus - for bonus in attribute_bonus: - status_add = bonus['statusAdd'] - bonus_property = status_add['property'] - value = mp.mpf(status_add['value']) - if bonus_property in self.attribute_bonus: - self.attribute_bonus[bonus_property] += value - else: - self.attribute_bonus[bonus_property] = value + if attribute_bonus: + for bonus in attribute_bonus: + status_add = bonus.statusAdd + bonus_property = status_add.property + value = mp.mpf(status_add.value) + if self.attribute_bonus is None: + raise Exception('attribute_bonus is None') + if bonus_property in self.attribute_bonus: + self.attribute_bonus[bonus_property] += value + else: + self.attribute_bonus[bonus_property] = value 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: if attribute in self.attribute_bonus: self.attribute_bonus[ @@ -105,6 +111,8 @@ class RoleInstance: ] = self.avatar.extra_ability_attribute[attribute] def cal_weapon_attr_add(self): + if self.attribute_bonus is None: + raise Exception('attribute_bonus is None') for attribute in self.weapon.weapon_attribute: if attribute in self.attribute_bonus: self.attribute_bonus[ @@ -120,6 +128,8 @@ class RoleInstance: logger.info(self.attribute_bonus) # 检查武器战斗生效的buff logger.info('检查武器战斗生效的buff') + if self.attribute_bonus is None: + raise Exception('attribute_bonus is None') self.attribute_bonus = await self.weapon.weapon_ability( self.base_attr, self.attribute_bonus ) @@ -130,6 +140,8 @@ class RoleInstance: ) logger.info('merge_attribute') logger.info(self.base_attr) + if self.attribute_bonus is None: + raise Exception('attribute_bonus is None') merged_attr = await merge_attribute( self.base_attr, self.attribute_bonus ) diff --git a/StarRailUID/starrailuid_damagecal/effect/Weapon/Weapon.py b/StarRailUID/starrailuid_charinfo/effect/Weapon/Weapon.py similarity index 74% rename from StarRailUID/starrailuid_damagecal/effect/Weapon/Weapon.py rename to StarRailUID/starrailuid_charinfo/effect/Weapon/Weapon.py index 19a0fae..3a9450d 100644 --- a/StarRailUID/starrailuid_damagecal/effect/Weapon/Weapon.py +++ b/StarRailUID/starrailuid_charinfo/effect/Weapon/Weapon.py @@ -4,6 +4,7 @@ from typing import Dict from mpmath import mp +from ..Base.model import DamageInstanceWeapon from ..Base.WeaponBase import BaseWeapon path = Path(__file__).parent.parent @@ -15,7 +16,8 @@ mp.dps = 14 class Arrows(BaseWeapon): - def __init__(self, weapon: Dict): + weapon_base_attributes: Dict + def __init__(self, weapon: DamageInstanceWeapon): super().__init__(weapon) async def check(self): @@ -34,7 +36,8 @@ class Arrows(BaseWeapon): class ReturntoDarkness(BaseWeapon): - def __init__(self, weapon: Dict): + weapon_base_attributes: Dict + def __init__(self, weapon: DamageInstanceWeapon): super().__init__(weapon) async def check(self): @@ -48,7 +51,8 @@ class ReturntoDarkness(BaseWeapon): class Swordplay(BaseWeapon): - def __init__(self, weapon: Dict): + weapon_base_attributes: Dict + def __init__(self, weapon: DamageInstanceWeapon): super().__init__(weapon) async def check(self): @@ -71,7 +75,8 @@ class Swordplay(BaseWeapon): class DartingArrow(BaseWeapon): - def __init__(self, weapon: Dict): + weapon_base_attributes: Dict + def __init__(self, weapon: DamageInstanceWeapon): super().__init__(weapon) async def check(self): @@ -90,7 +95,8 @@ class DartingArrow(BaseWeapon): class Adversarial(BaseWeapon): - def __init__(self, weapon: Dict): + weapon_base_attributes: Dict + def __init__(self, weapon: DamageInstanceWeapon): super().__init__(weapon) async def check(self): @@ -110,7 +116,8 @@ class Adversarial(BaseWeapon): class SubscribeforMore(BaseWeapon): - def __init__(self, weapon: Dict): + weapon_base_attributes: Dict + def __init__(self, weapon: DamageInstanceWeapon): super().__init__(weapon) async def check(self): @@ -142,7 +149,8 @@ class SubscribeforMore(BaseWeapon): class RiverFlowsinSpring(BaseWeapon): - def __init__(self, weapon: Dict): + weapon_base_attributes: Dict + def __init__(self, weapon: DamageInstanceWeapon): super().__init__(weapon) async def check(self): @@ -173,7 +181,8 @@ class RiverFlowsinSpring(BaseWeapon): class SleepLiketheDead(BaseWeapon): - def __init__(self, weapon: Dict): + weapon_base_attributes: Dict + def __init__(self, weapon: DamageInstanceWeapon): super().__init__(weapon) async def check(self): @@ -188,7 +197,8 @@ class SleepLiketheDead(BaseWeapon): class OnlySilenceRemains(BaseWeapon): - def __init__(self, weapon: Dict): + weapon_base_attributes: Dict + def __init__(self, weapon: DamageInstanceWeapon): super().__init__(weapon) async def check(self): @@ -210,7 +220,8 @@ class OnlySilenceRemains(BaseWeapon): class IntheNight(BaseWeapon): - def __init__(self, weapon: Dict): + weapon_base_attributes: Dict + def __init__(self, weapon: DamageInstanceWeapon): super().__init__(weapon) async def check(self): @@ -250,7 +261,8 @@ class IntheNight(BaseWeapon): class CruisingintheStellarSea(BaseWeapon): - def __init__(self, weapon: Dict): + weapon_base_attributes: Dict + def __init__(self, weapon: DamageInstanceWeapon): super().__init__(weapon) async def check(self): @@ -278,39 +290,45 @@ class CruisingintheStellarSea(BaseWeapon): return attribute_bonus -class HuntWeapon( - CruisingintheStellarSea, IntheNight, OnlySilenceRemains, SleepLiketheDead, +# class HuntWeapon( +# IntheNight, OnlySilenceRemains, SleepLiketheDead, +# SubscribeforMore, Swordplay, DartingArrow, Adversarial, +# RiverFlowsinSpring, Arrows, ReturntoDarkness +# ): +# @classmethod +# def create(cls, weapon: DamageInstanceWeapon): +# if weapon.id_ == 24001: +# return SleepLiketheDead(weapon) +# if weapon.id_ == 23001: +# return IntheNight(weapon) +# if weapon.id_ == 21003: +# return OnlySilenceRemains(weapon) +# if weapon.id_ == 21024: +# return RiverFlowsinSpring(weapon) +# if weapon.id_ == 20014: +# return Adversarial(weapon) +# if weapon.id_ == 20007: +# return DartingArrow(weapon) +# if weapon.id_ == 21010: +# return Swordplay(weapon) +# if weapon.id_ == 21031: +# return ReturntoDarkness(weapon) +# if weapon.id_ == 20000: +# return Arrows(weapon) +# raise ValueError(f'未知武器id: {weapon.id_}') + +# async def check_ability(self): +# pass + + +class Weapon( + IntheNight, OnlySilenceRemains, SleepLiketheDead, SubscribeforMore, Swordplay, DartingArrow, Adversarial, RiverFlowsinSpring, Arrows, ReturntoDarkness ): - def __init__(self, weapon: Dict): - if weapon['id'] == 24001: - return CruisingintheStellarSea(weapon) - if weapon['id'] == 23001: - return IntheNight(weapon) - if weapon['id'] == 21003: - return OnlySilenceRemains(weapon) - if weapon['id'] == 21024: - return RiverFlowsinSpring(weapon) - if weapon['id'] == 20014: - return Adversarial(weapon) - if weapon['id'] == 20007: - return DartingArrow(weapon) - if weapon['id'] == 21010: - return Swordplay(weapon) - if weapon['id'] == 21031: - return ReturntoDarkness(weapon) - if weapon['id'] == 20000: - return Arrows(weapon) - raise ValueError(f'未知武器id: {weapon["id"]}') - - async def check_ability(self): - pass - - -class Weapon(HuntWeapon): - def __init__(self, weapon: Dict): - if weapon['id'] in [ + @classmethod + def create(cls, weapon: DamageInstanceWeapon): + if weapon.id_ in [ 23001, 21003, 23012, @@ -323,6 +341,24 @@ class Weapon(HuntWeapon): 21031, 20000, ]: - return HuntWeapon(weapon) + if weapon.id_ == 24001: + return SleepLiketheDead(weapon) + if weapon.id_ == 23001: + return IntheNight(weapon) + if weapon.id_ == 21003: + return OnlySilenceRemains(weapon) + if weapon.id_ == 21024: + return RiverFlowsinSpring(weapon) + if weapon.id_ == 20014: + return Adversarial(weapon) + if weapon.id_ == 20007: + return DartingArrow(weapon) + if weapon.id_ == 21010: + return Swordplay(weapon) + if weapon.id_ == 21031: + return ReturntoDarkness(weapon) + if weapon.id_ == 20000: + return Arrows(weapon) + raise ValueError(f'未知武器id: {weapon.id_}') else: - raise ValueError(f'不支持的武器种类: {weapon["id"]}') + raise ValueError(f'不支持的武器种类: {weapon.id_}') diff --git a/StarRailUID/starrailuid_damagecal/effect/Weapon/__init__.py b/StarRailUID/starrailuid_charinfo/effect/Weapon/__init__.py similarity index 100% rename from StarRailUID/starrailuid_damagecal/effect/Weapon/__init__.py rename to StarRailUID/starrailuid_charinfo/effect/Weapon/__init__.py diff --git a/StarRailUID/starrailuid_damagecal/effect/__init__.py b/StarRailUID/starrailuid_charinfo/effect/__init__.py similarity index 100% rename from StarRailUID/starrailuid_damagecal/effect/__init__.py rename to StarRailUID/starrailuid_charinfo/effect/__init__.py diff --git a/StarRailUID/starrailuid_damagecal/effect/utils.py b/StarRailUID/starrailuid_charinfo/effect/utils.py similarity index 100% rename from StarRailUID/starrailuid_damagecal/effect/utils.py rename to StarRailUID/starrailuid_charinfo/effect/utils.py diff --git a/StarRailUID/starrailuid_charinfo/to_data.py b/StarRailUID/starrailuid_charinfo/to_data.py index a2fc8d7..5278935 100644 --- a/StarRailUID/starrailuid_charinfo/to_data.py +++ b/StarRailUID/starrailuid_charinfo/to_data.py @@ -5,11 +5,8 @@ from typing import List, Optional, Union from httpx import ReadTimeout from mpmath import mp -from gsuid_core.plugins.StarRailUID.StarRailUID.sruid_utils.api.mihomo.models import ( - Avatar, -) - from ..sruid_utils.api.mihomo import MihomoData +from ..sruid_utils.api.mihomo.models import Avatar from ..sruid_utils.api.mihomo.requests import get_char_card_info from ..utils.error_reply import UID_HINT from ..utils.excel.read_excel import AvatarPromotion, EquipmentPromotion diff --git a/StarRailUID/starrailuid_damagecal/__init__.py b/StarRailUID/starrailuid_damagecal/__init__.py deleted file mode 100644 index 6b6c53e..0000000 --- a/StarRailUID/starrailuid_damagecal/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -import re - -from gsuid_core.bot import Bot -from gsuid_core.models import Event -from gsuid_core.sv import SV - -from ..starrailuid_charinfo.draw_char_img import get_char_data -from ..utils.convert import get_uid -from ..utils.error_reply import UID_HINT -from ..utils.sr_prefix import PREFIX -from .cal_damage import cal - -sv_char_damage_cal = SV('sr伤害计算') - - -@sv_char_damage_cal.on_prefix(f'{PREFIX}伤害计算') -async def send_damage_msg(bot: Bot, ev: Event): - msg = ''.join(re.findall('[\u4e00-\u9fa5 ]', ev.text)) - if not msg: - return None - await bot.logger.info('开始执行[角色伤害计算]') - # 获取uid - sr_uid = await get_uid(bot, ev) - if sr_uid is None: - return await bot.send(UID_HINT) - await bot.logger.info(f'[角色伤害计算]uid: {sr_uid}') - char_name = ' '.join(re.findall('[\u4e00-\u9fa5]+', msg)) - - char_data = await get_char_data(sr_uid, char_name) - if isinstance(char_data, str): - return await bot.send(char_data) - - im = await cal(char_data) - await bot.send(im) - return None diff --git a/StarRailUID/starrailuid_damagecal/cal_damage.py b/StarRailUID/starrailuid_damagecal/cal_damage.py deleted file mode 100644 index 01fd59f..0000000 --- a/StarRailUID/starrailuid_damagecal/cal_damage.py +++ /dev/null @@ -1,39 +0,0 @@ -from typing import Dict - -from mpmath import mp - -from ..starrailuid_charinfo.draw_char_img import cal_char_info -from ..starrailuid_charinfo.mono.Character import Character -from .effect.Role import RoleInstance - -mp.dps = 14 - - -async def cal(char_data: Dict): - char: Character = await cal_char_info(char_data) - - raw_data = {"avatar": {}, "weapon": {}, "relic": []} - raw_data['avatar']['id'] = char.char_id - raw_data['avatar']['level'] = char.char_level - raw_data['avatar']['rank'] = char.char_rank - raw_data['avatar']['element'] = char.char_element - raw_data['avatar']['promotion'] = char.char_promotion - raw_data['avatar']['attribute_bonus'] = char.attribute_bonus - raw_data['avatar']['extra_ability'] = char.extra_ability - - raw_data['weapon']['id'] = char.equipment['equipmentID'] - raw_data['weapon']['level'] = char.equipment['equipmentLevel'] - raw_data['weapon']['rank'] = char.equipment['equipmentRank'] - raw_data['weapon']['promotion'] = char.equipment['equipmentPromotion'] - - raw_data['relic'] = char.char_relic - - raw_data['skill'] = char.char_skill - - im = [] - - for skill_type in ['Normal', 'BPSkill', 'Ultra']: - role = RoleInstance(raw_data) - im_tmp = await role.cal_damage(skill_type) - im.append(im_tmp) - return im