diff --git a/backend/core/basic/character/calc_equip.py b/backend/core/basic/character/calc_equip.py index 850277d8..8f4faaba 100644 --- a/backend/core/basic/character/calc_equip.py +++ b/backend/core/basic/character/calc_equip.py @@ -6,6 +6,7 @@ from core.basic.equipment import OathSuit, Suit, get_equipment from ..formula import 增幅计算, 强化技攻, 武器强化计算, 精通计算, 耳环计算, 左右计算, 锻造计算 from ..roleinfo import CharacterEmblemInfo, CharacterEquipInfo, CharacterOathInfo, get_key_by_value from .base import CharacterBase +from .config_view import CalcConfigView @cache @@ -403,12 +404,13 @@ class CalcEquipMixin(CharacterBase): # region 主计算入口 def calc(self, setInfo: dict[str, dict]): - self.calc_init(setInfo) + config = CalcConfigView(setInfo).as_legacy_dict() + self.calc_init(config) self.SetBaseStatus() - self.calc_jade(setInfo.get('jades', [])) - self.calc_avatar(setInfo.get('avatar', {})) + self.calc_jade(config.get('jades', [])) + self.calc_avatar(config.get('avatar', {})) self.calc_basic() - self.calc_sundry(setInfo.get('sundry', {})) + self.calc_sundry(config.get('sundry', {})) self.calc_emblems() suit = self.calc_suits() self.calc_equs() @@ -430,7 +432,7 @@ class CalcEquipMixin(CharacterBase): self.输出类型 = '魔法百分比' else: self.输出类型 = '物理百分比' - skillInfos = self.calc_carry_skills(setInfo.get('DSB', False), setInfo.get('BUFF', False)) + skillInfos = self.calc_carry_skills(config.get('DSB', False), config.get('BUFF', False)) info = self.get_carry_info() return {'uuid': uuid1().hex, 'skills': skillInfos, 'info': info, 'suits': suit, 'buffer': self.buffer} diff --git a/backend/core/basic/character/config_view.py b/backend/core/basic/character/config_view.py new file mode 100644 index 00000000..91aa3a7c --- /dev/null +++ b/backend/core/basic/character/config_view.py @@ -0,0 +1,61 @@ +from collections.abc import Mapping +from typing import Any + + +class CalcConfigView: + def __init__(self, raw: Mapping[str, Any] | None): + self.raw = dict(raw or {}) + + @property + def equips(self) -> dict[str, dict[str, Any]]: + return dict(self.raw.get('equips') or {}) + + @property + def oaths(self) -> dict[str, dict[str, Any]]: + return dict(self.raw.get('oaths') or {}) + + @property + def emblems(self) -> dict[str, dict[str, Any]]: + return dict(self.raw.get('emblems') or {}) + + @property + def skills(self) -> dict[str, dict[str, Any]]: + return dict(self.raw.get('skills') or {}) + + @property + def avatar(self) -> dict[str, Any]: + return dict(self.raw.get('avatar') or {}) + + @property + def sundry(self) -> dict[str, Any]: + return dict(self.raw.get('sundry') or {}) + + @property + def jades(self) -> dict[str, Any]: + return dict(self.raw.get('jades') or {}) + + @property + def options(self) -> dict[str, Any]: + return dict(self.raw.get('options') or {}) + + @property + def dsb(self) -> bool: + return bool(self.raw.get('DSB', False)) + + @property + def buff(self) -> bool: + return bool(self.raw.get('BUFF', False)) + + def as_legacy_dict(self) -> dict[str, Any]: + data = dict(self.raw) + data.setdefault('equips', {}) + data.setdefault('oaths', {}) + data.setdefault('emblems', {}) + data.setdefault('skills', {}) + data.setdefault('avatar', {}) + data.setdefault('sundry', {}) + data.setdefault('jades', {}) + data.setdefault('options', {}) + data.setdefault('DSB', False) + data.setdefault('BUFF', False) + return data diff --git a/backend/tests/unit/test_calc_config_view.py b/backend/tests/unit/test_calc_config_view.py new file mode 100644 index 00000000..200ee1ed --- /dev/null +++ b/backend/tests/unit/test_calc_config_view.py @@ -0,0 +1,27 @@ +from core.basic.character.config_view import CalcConfigView + + +def test_config_view_provides_defaults(): + view = CalcConfigView(None) + + assert view.equips == {} + assert view.oaths == {} + assert view.emblems == {} + assert view.skills == {} + assert view.avatar == {} + assert view.sundry == {} + assert view.jades == {} + assert view.options == {} + assert view.dsb is False + assert view.buff is False + + +def test_config_view_preserves_legacy_keys(): + view = CalcConfigView({'skills': {'100': {'lv': 1}}, 'BUFF': True}) + + data = view.as_legacy_dict() + + assert data['skills'] == {'100': {'lv': 1}} + assert data['BUFF'] is True + assert data['DSB'] is False + assert data['equips'] == {}