This commit is contained in:
baiqwerdvd 2024-09-18 14:39:29 +08:00
parent 211cb186ec
commit 32a77d6230
No known key found for this signature in database
GPG Key ID: 7717E46E1797411A
17 changed files with 115 additions and 6100 deletions

View File

@ -77,6 +77,8 @@ class AvatarInstance:
self.merge_attribute_bonus(set_skill.relicSetAttribute) self.merge_attribute_bonus(set_skill.relicSetAttribute)
def cal_avatar_eidolon_add(self): def cal_avatar_eidolon_add(self):
if self.avatardamage is None:
return
self.merge_attribute_bonus(self.avatardamage.eidolon_attribute) self.merge_attribute_bonus(self.avatardamage.eidolon_attribute)
self.merge_attribute_bonus(self.avatardamage.extra_ability_attribute) self.merge_attribute_bonus(self.avatardamage.extra_ability_attribute)

View File

@ -2,8 +2,7 @@ from abc import abstractmethod
from typing import Dict from typing import Dict
from ...logger import logger from ...logger import logger
from ...map.model.RelicSetSkill import RelicSetStatusAdd from ...map.SR_MAP_PATH import RelicSetSkill, RelicSetStatusAdd
from ...map.SR_MAP_PATH import RelicSetSkill
from ...model import Relic from ...model import Relic
@ -80,12 +79,12 @@ class BaseRelicSetSkill:
relic_set_attribute: Dict[str, float] = {} relic_set_attribute: Dict[str, float] = {}
if self.pieces2: if self.pieces2:
status_add = RelicSetSkill.RelicSet[str(self.setId)]["2"] status_add = RelicSetSkill[str(self.setId)].get("2", None)
if status_add: if status_add:
add_relic_set_attribute(status_add) add_relic_set_attribute(status_add)
if self.pieces4: if self.pieces4:
status_add = RelicSetSkill.RelicSet[str(self.setId)]["4"] status_add = RelicSetSkill[str(self.setId)].get("4", None)
if status_add: if status_add:
add_relic_set_attribute(status_add) add_relic_set_attribute(status_add)

View File

@ -43,8 +43,8 @@ class BaseWeapon:
ability_property = EquipmentID2AbilityProperty[str(self.weapon_id)] ability_property = EquipmentID2AbilityProperty[str(self.weapon_id)]
equip_ability_property = ability_property[str(self.weapon_rank)] equip_ability_property = ability_property[str(self.weapon_rank)]
for equip_ability in equip_ability_property: for equip_ability in equip_ability_property:
property_type = equip_ability["PropertyType"] property_type = equip_ability.PropertyType
value = equip_ability["Value"]["Value"] value = equip_ability.Value.Value
if property_type in self.weapon_attribute: if property_type in self.weapon_attribute:
self.weapon_attribute[property_type] += value self.weapon_attribute[property_type] += value
else: else:

View File

@ -255,6 +255,7 @@ def apply_attribute_bonus(
def calculate_damage_reduction(level: int): def calculate_damage_reduction(level: int):
_ = level
enemy_damage_reduction = 0.1 enemy_damage_reduction = 0.1
return 1 - enemy_damage_reduction return 1 - enemy_damage_reduction
@ -265,6 +266,7 @@ def calculate_resistance_area(
add_skill_type: str, add_skill_type: str,
element: str, element: str,
): ):
_ = skill_type
enemy_status_resistance = 0.0 enemy_status_resistance = 0.0
for attr in merged_attr: for attr in merged_attr:
if "ResistancePenetration" in attr: if "ResistancePenetration" in attr:

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,10 @@
import json
from pathlib import Path
from typing import List, Union from typing import List, Union
from msgspec import Struct, convert from msgspec import Struct, convert
from ..excel.read_excel import ( EXCEL = Path(__file__).parent
AvatarPromotion,
EquipmentPromotion,
RelicMainAffix,
RelicSubAffix,
)
class PromotionCost(Struct): class PromotionCost(Struct):
@ -70,8 +67,14 @@ class SingleRelicSubAffix(Struct):
StepValue: PromotionAttr StepValue: PromotionAttr
StepNum: int StepNum: int
with Path.open(EXCEL / "RelicMainAffixConfig.json", encoding="utf8") as f:
RelicMainAffixConfig = convert(json.load(f), List[SingleRelicMainAffix])
AvatarPromotionConfig = convert(AvatarPromotion, List[SingleAvatarPromotion]) with Path.open(EXCEL / "RelicSubAffixConfig.json", encoding="utf8") as f:
EquipmentPromotionConfig = convert(EquipmentPromotion, List[SingleEquipmentPromotion]) RelicSubAffixConfig = convert(json.load(f), List[SingleRelicSubAffix])
RelicMainAffixConfig = convert(RelicMainAffix, List[SingleRelicMainAffix])
RelicSubAffixConfig = convert(RelicSubAffix, List[SingleRelicSubAffix]) with Path.open(EXCEL / "AvatarPromotionConfig.json", encoding="utf8") as f:
AvatarPromotionConfig = convert(json.load(f), List[SingleAvatarPromotion])
with Path.open(EXCEL / "EquipmentPromotionConfig.json", encoding="utf8") as f:
EquipmentPromotionConfig = convert(json.load(f), List[SingleEquipmentPromotion])

View File

@ -1,19 +0,0 @@
import json
from pathlib import Path
EXCEL = Path(__file__).parent
with Path.open(EXCEL / "RelicMainAffixConfig.json", encoding="utf8") as f:
RelicMainAffix = json.load(f)
with Path.open(EXCEL / "RelicSubAffixConfig.json", encoding="utf8") as f:
RelicSubAffix = json.load(f)
with Path.open(EXCEL / "AvatarPromotionConfig.json", encoding="utf8") as f:
AvatarPromotion = json.load(f)
with Path.open(EXCEL / "EquipmentPromotionConfig.json", encoding="utf8") as f:
EquipmentPromotion = json.load(f)
with Path.open(EXCEL / "light_cone_ranks.json", encoding="utf8") as f:
light_cone_ranks = json.load(f)

View File

@ -1,10 +1,9 @@
import json
from pathlib import Path from pathlib import Path
from typing import Dict, List, TypedDict, Union from typing import Dict, List, TypedDict, Union
from msgspec import Struct
from msgspec import json as msgjson from msgspec import json as msgjson
from ..map.model.RelicSetSkill import RelicSetSkillModel
from ..version import StarRail_version from ..version import StarRail_version
MAP = Path(__file__).parent / "data" MAP = Path(__file__).parent / "data"
@ -39,11 +38,50 @@ class TS(TypedDict):
Icon: Dict[str, str] Icon: Dict[str, str]
class LU(TypedDict): class LU(Struct):
id: str id: str
num: int num: int
class TV(Struct):
type: str
value: float
class AbilityPropertyValue(Struct):
Value: float
class AbilityProperty(Struct):
PropertyType: str
Value: AbilityPropertyValue
class SkillTreeLevel(Struct):
promotion: int
level: int
properties: List[TV]
materials: List[LU]
class CharacterSkillTreeModel(Struct):
id: str
name: str
max_level: int
desc: str
params: List[List[float]]
anchor: str
pre_points: List[str]
level_up_skills: List[LU]
levels: List[SkillTreeLevel]
icon: str
class RelicSetStatusAdd(Struct):
Property: str
Value: float
with Path.open(MAP / avatarId2Name_fileName, encoding="UTF-8") as f: with Path.open(MAP / avatarId2Name_fileName, encoding="UTF-8") as f:
avatarId2Name = msgjson.decode(f.read(), type=Dict[str, str]) avatarId2Name = msgjson.decode(f.read(), type=Dict[str, str])
@ -72,13 +110,15 @@ with Path.open(MAP / rankId2Name_fileName, encoding="UTF-8") as f:
rankId2Name = msgjson.decode(f.read(), type=Dict[str, str]) rankId2Name = msgjson.decode(f.read(), type=Dict[str, str])
with Path.open(MAP / characterSkillTree_fileName, encoding="UTF-8") as f: with Path.open(MAP / characterSkillTree_fileName, encoding="UTF-8") as f:
characterSkillTree = msgjson.decode(f.read(), type=Dict[str, Dict]) characterSkillTree = msgjson.decode(
f.read(), type=Dict[str, Dict[str, CharacterSkillTreeModel]]
)
with Path.open(MAP / avatarId2DamageType_fileName, encoding="UTF-8") as f: with Path.open(MAP / avatarId2DamageType_fileName, encoding="UTF-8") as f:
avatarId2DamageType = msgjson.decode(f.read(), type=Dict[str, str]) avatarId2DamageType = msgjson.decode(f.read(), type=Dict[str, str])
with Path.open(MAP / "char_alias.json", encoding="UTF-8") as f: with Path.open(MAP / "char_alias.json", encoding="UTF-8") as f:
alias_data = msgjson.decode(f.read(), type=Dict[str, Dict[str, List]]) alias_data = msgjson.decode(f.read(), type=Dict[str, Dict[str, List[str]]])
with Path.open(MAP / avatarId2Rarity_fileName, encoding="UTF-8") as f: with Path.open(MAP / avatarId2Rarity_fileName, encoding="UTF-8") as f:
avatarId2Rarity = msgjson.decode(f.read(), type=Dict[str, str]) avatarId2Rarity = msgjson.decode(f.read(), type=Dict[str, str])
@ -86,11 +126,13 @@ with Path.open(MAP / avatarId2Rarity_fileName, encoding="UTF-8") as f:
with Path.open(MAP / EquipmentID2AbilityProperty_fileName, encoding="UTF-8") as f: with Path.open(MAP / EquipmentID2AbilityProperty_fileName, encoding="UTF-8") as f:
EquipmentID2AbilityProperty = msgjson.decode( EquipmentID2AbilityProperty = msgjson.decode(
f.read(), f.read(),
type=Dict[str, Dict[str, List]], type=Dict[str, Dict[str, List[AbilityProperty]]],
) )
with Path.open(MAP / RelicSetSkill_fileName, encoding="UTF-8") as f: with Path.open(MAP / RelicSetSkill_fileName, encoding="UTF-8") as f:
RelicSetSkill = RelicSetSkillModel.from_json(json.load(f)) RelicSetSkill = msgjson.decode(
f.read(), type=Dict[str, Dict[str, RelicSetStatusAdd]]
)
with Path.open(MAP / skillId2AttackType_fileName, encoding="UTF-8") as f: with Path.open(MAP / skillId2AttackType_fileName, encoding="UTF-8") as f:
skillId2AttackType = msgjson.decode(f.read(), type=Dict[str, str]) skillId2AttackType = msgjson.decode(f.read(), type=Dict[str, str])

View File

@ -3,8 +3,7 @@
"2": { "2": {
"Property": "HealRatioBase", "Property": "HealRatioBase",
"Value": 0.1 "Value": 0.1
}, }
"4": {}
}, },
"102": { "102": {
"2": { "2": {
@ -20,54 +19,44 @@
"2": { "2": {
"Property": "DefenceAddedRatio", "Property": "DefenceAddedRatio",
"Value": 0.15 "Value": 0.15
}, }
"4": {}
}, },
"104": { "104": {
"2": { "2": {
"Property": "IceAddedRatio", "Property": "IceAddedRatio",
"Value": 0.1 "Value": 0.1
}, }
"4": {}
}, },
"105": { "105": {
"2": { "2": {
"Property": "PhysicalAddedRatio", "Property": "PhysicalAddedRatio",
"Value": 0.1 "Value": 0.1
}, }
"4": {}
},
"106": {
"2": {},
"4": {}
}, },
"106": {},
"107": { "107": {
"2": { "2": {
"Property": "FireAddedRatio", "Property": "FireAddedRatio",
"Value": 0.1 "Value": 0.1
}, }
"4": {}
}, },
"108": { "108": {
"2": { "2": {
"Property": "QuantumAddedRatio", "Property": "QuantumAddedRatio",
"Value": 0.1 "Value": 0.1
}, }
"4": {}
}, },
"109": { "109": {
"2": { "2": {
"Property": "ThunderAddedRatio", "Property": "ThunderAddedRatio",
"Value": 0.1 "Value": 0.1
}, }
"4": {}
}, },
"110": { "110": {
"2": { "2": {
"Property": "WindAddedRatio", "Property": "WindAddedRatio",
"Value": 0.1 "Value": 0.1
}, }
"4": {}
}, },
"111": { "111": {
"2": { "2": {
@ -83,8 +72,7 @@
"2": { "2": {
"Property": "ImaginaryAddedRatio", "Property": "ImaginaryAddedRatio",
"Value": 0.1 "Value": 0.1
}, }
"4": {}
}, },
"301": { "301": {
"2": { "2": {
@ -150,26 +138,20 @@
"2": { "2": {
"Property": "HPAddedRatio", "Property": "HPAddedRatio",
"Value": 0.12 "Value": 0.12
}, }
"4": {}
}, },
"114": { "114": {
"2": { "2": {
"Property": "SpeedAddedRatio", "Property": "SpeedAddedRatio",
"Value": 0.06 "Value": 0.06
}, }
"4": {}
},
"115": {
"2": {},
"4": {}
}, },
"115": {},
"116": { "116": {
"2": { "2": {
"Property": "AttackAddedRatio", "Property": "AttackAddedRatio",
"Value": 0.12 "Value": 0.12
}, }
"4": {}
}, },
"311": { "311": {
"2": { "2": {
@ -184,7 +166,6 @@
} }
}, },
"117": { "117": {
"2": {},
"4": { "4": {
"Property": "CriticalChanceBase", "Property": "CriticalChanceBase",
"Value": 0.04 "Value": 0.04
@ -194,8 +175,7 @@
"2": { "2": {
"Property": "BreakDamageAddedRatioBase", "Property": "BreakDamageAddedRatioBase",
"Value": 0.16 "Value": 0.16
}, }
"4": {}
}, },
"313": { "313": {
"2": { "2": {
@ -213,8 +193,7 @@
"2": { "2": {
"Property": "BreakDamageAddedRatioBase", "Property": "BreakDamageAddedRatioBase",
"Value": 0.16 "Value": 0.16
}, }
"4": {}
}, },
"120": { "120": {
"2": { "2": {
@ -226,9 +205,7 @@
"Value": 0.06 "Value": 0.06
} }
}, },
"315": { "315": {},
"2": {}
},
"316": { "316": {
"2": { "2": {
"Property": "SpeedAddedRatio", "Property": "SpeedAddedRatio",

View File

@ -1,29 +0,0 @@
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()
},
)

View File

@ -1,4 +1,4 @@
from starrail_damage_cal.map.SR_MAP_PATH import ( from ..map.SR_MAP_PATH import (
alias_data, alias_data,
avatarId2Name, avatarId2Name,
) )

View File

@ -1,6 +1,6 @@
"""Mihomo.me api 包装""" """Mihomo.me api 包装"""
from starrail_damage_cal.mihomo.models import MihomoData from ..mihomo.models import MihomoData
from starrail_damage_cal.mihomo.requests import get_char_card_info as requests from ..mihomo.requests import get_char_card_info as requests
__all__ = ["requests", "MihomoData"] __all__ = ["requests", "MihomoData"]

View File

@ -1,4 +1,4 @@
from typing import List, Union from typing import List
from msgspec import Struct, field from msgspec import Struct, field

View File

@ -1,5 +1,5 @@
from collections import Counter from collections import Counter
from typing import List from typing import Dict, List
from ..map.SR_MAP_PATH import ( from ..map.SR_MAP_PATH import (
EquipmentID2AbilityProperty, EquipmentID2AbilityProperty,
@ -22,10 +22,10 @@ class Character:
self.attribute_bonus = card_prop.avatarAttributeBonus self.attribute_bonus = card_prop.avatarAttributeBonus
self.char_relic = card_prop.RelicInfo self.char_relic = card_prop.RelicInfo
self.base_attributes = card_prop.baseAttributes self.base_attributes = card_prop.baseAttributes
self.add_attr = {}
self.equipment = card_prop.equipmentInfo self.equipment = card_prop.equipmentInfo
self.rarity = card_prop.avatarRarity self.rarity = card_prop.avatarRarity
self.eidolons = card_prop.rankList self.eidolons = card_prop.rankList
self.add_attr: Dict[str, float] = {}
async def get_equipment_info(self): async def get_equipment_info(self):
base_attr = self.base_attributes base_attr = self.base_attributes
@ -36,16 +36,15 @@ 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
base_attr.hp = base_attr.hp + equip_add_base_attr.hp base_attr.hp += equip_add_base_attr.hp
base_attr.attack = base_attr.attack + equip_add_base_attr.attack base_attr.attack += +equip_add_base_attr.attack
base_attr.defence = base_attr.defence + equip_add_base_attr.defence base_attr.defence += equip_add_base_attr.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:
property_type: str = equip_ability["PropertyType"] property_type = equip_ability.PropertyType
value: float = equip_ability["Value"]["Value"] value = equip_ability.Value.Value
self.add_attr[property_type] = value + self.add_attr.get(property_type, 0) self.add_attr[property_type] = value + self.add_attr.get(property_type, 0)
return self.add_attr
async def get_char_attribute_bonus(self): async def get_char_attribute_bonus(self):
attribute_bonus = self.attribute_bonus attribute_bonus = self.attribute_bonus
@ -84,7 +83,7 @@ class Character:
count = item[1] count = item[1]
set_value = 0 set_value = 0
if count >= 2: if count >= 2:
status_add = RelicSetSkill.RelicSet[str(set_id)]["2"] status_add = RelicSetSkill[str(set_id)].get("2", None)
if status_add: if status_add:
set_property = status_add.Property set_property = status_add.Property
set_value = status_add.Value set_value = status_add.Value
@ -94,7 +93,7 @@ class Character:
0, 0,
) )
if count == 4: if count == 4:
status_add = RelicSetSkill.RelicSet[str(set_id)]["4"] status_add = RelicSetSkill[str(set_id)].get("4", None)
if status_add: if status_add:
set_property = status_add.Property set_property = status_add.Property
set_value = status_add.Value set_value = status_add.Value

View File

@ -175,17 +175,17 @@ async def get_data(
value=0, value=0,
), ),
) )
status_add = characterSkillTree[str(char.avatarId)][str(behavior.pointId)][ status_add = (
"levels" characterSkillTree[str(char.avatarId)][str(behavior.pointId)]
][behavior.level - 1]["properties"] .levels[behavior.level - 1]
if status_add: .properties
for property_ in status_add: )
attribute_bonus_temp.statusAdd.property_ = property_["type"] # if status_add:
attribute_bonus_temp.statusAdd.name = Property2Name[ for property_ in status_add:
property_["type"] attribute_bonus_temp.statusAdd.property_ = property_.type
] attribute_bonus_temp.statusAdd.name = Property2Name[property_.type]
attribute_bonus_temp.statusAdd.value = property_["value"] attribute_bonus_temp.statusAdd.value = property_.value
char_data.avatarAttributeBonus.append(attribute_bonus_temp) char_data.avatarAttributeBonus.append(attribute_bonus_temp)
# 处理遗器 # 处理遗器
if char.relicList: if char.relicList:
@ -265,8 +265,8 @@ async def get_data(
level_up_skill = AvatarRankSkillUp[str(rank_id)] level_up_skill = AvatarRankSkillUp[str(rank_id)]
if level_up_skill: if level_up_skill:
for item in level_up_skill: for item in level_up_skill:
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(char_data.avatarSkill):
if str(skill_id) == str(skill_item.skillId): if str(skill_id) == str(skill_item.skillId):

View File

@ -8,6 +8,7 @@ async def test_get_damage_data_by_uid() -> None:
print(char_data) print(char_data)
char = await cal_char_info(char_data) char = await cal_char_info(char_data)
print(char.add_attr)
avatar = AvatarInstance(char) avatar = AvatarInstance(char)
print(avatar.base_attr) print(avatar.base_attr)
print(avatar.attribute_bonus) print(avatar.attribute_bonus)