2023-05-11 15:09:39 +00:00
|
|
|
from decimal import Decimal
|
|
|
|
from typing import Optional, Dict
|
|
|
|
|
2024-11-30 14:31:42 +00:00
|
|
|
from pydantic import model_validator, BaseModel
|
2023-05-11 15:09:39 +00:00
|
|
|
|
|
|
|
from .enums import RelicAffix, RelicPosition
|
|
|
|
|
|
|
|
|
|
|
|
class SingleRelicAffix(BaseModel):
|
|
|
|
id: int
|
|
|
|
property: RelicAffix
|
|
|
|
base_value: float
|
|
|
|
level_value: Optional[float] = None
|
|
|
|
step_value: Optional[float] = None
|
|
|
|
is_main: bool
|
|
|
|
max_step: Optional[int] = None
|
|
|
|
|
|
|
|
def get_value(self, level_or_step: int, cnt: int = 1) -> float:
|
|
|
|
base_value = Decimal(self.base_value) * Decimal(cnt)
|
|
|
|
add_value = Decimal(self.level_value if self.is_main else self.step_value)
|
|
|
|
return float(base_value + add_value * Decimal(level_or_step))
|
|
|
|
|
|
|
|
|
|
|
|
class RelicAffixAll(BaseModel):
|
|
|
|
id: int
|
|
|
|
set_id: int
|
|
|
|
""" 套装ID """
|
|
|
|
type: RelicPosition
|
|
|
|
""" 遗器类型 """
|
|
|
|
rarity: int
|
|
|
|
""" 星级 """
|
|
|
|
main_affix_group: int
|
|
|
|
sub_affix_group: int
|
|
|
|
max_level: int
|
|
|
|
""" 最大等级 """
|
|
|
|
main_affix: Dict[str, SingleRelicAffix]
|
|
|
|
""" 主词条 """
|
|
|
|
sub_affix: Dict[str, SingleRelicAffix]
|
|
|
|
""" 副词条 """
|
|
|
|
|
2024-11-30 14:31:42 +00:00
|
|
|
@model_validator(mode="before")
|
|
|
|
@classmethod
|
2023-05-11 15:09:39 +00:00
|
|
|
def transform_dicts(cls, values):
|
|
|
|
for data in ["main_affix", "sub_affix"]:
|
|
|
|
affix = values.get(data)
|
|
|
|
if affix:
|
|
|
|
new_affix = {}
|
|
|
|
for key, value in affix.items():
|
|
|
|
if isinstance(value, dict):
|
|
|
|
new_affix[key] = SingleRelicAffix(**value)
|
|
|
|
else:
|
|
|
|
new_affix[key] = value
|
|
|
|
values[data] = new_affix
|
|
|
|
return values
|