feat:优化代码
This commit is contained in:
@@ -9,6 +9,25 @@ from ..roleinfo import CharacterEmblemInfo, CharacterEquipInfo, get_key_by_value
|
||||
from .jade import Jade
|
||||
|
||||
|
||||
ELEMENT_STATUS_KEYS = {
|
||||
'ElementA',
|
||||
'ElementDB',
|
||||
'ElementR',
|
||||
'火强',
|
||||
'冰强',
|
||||
'光强',
|
||||
'暗强',
|
||||
'火抗',
|
||||
'冰抗',
|
||||
'光抗',
|
||||
'暗抗',
|
||||
'火属性攻击',
|
||||
'冰属性攻击',
|
||||
'光属性攻击',
|
||||
'暗属性攻击',
|
||||
}
|
||||
|
||||
|
||||
class CharacterBase(CharacterProperty):
|
||||
# region 额外类属性(CharacterProperty 中未声明的)
|
||||
|
||||
@@ -19,6 +38,7 @@ class CharacterBase(CharacterProperty):
|
||||
skills_id_dict: dict[str, 'Skill']
|
||||
skills_uuid_dict: dict[str, 'Skill']
|
||||
skill_names_cache: dict[tuple[str, bool | str], list[str]]
|
||||
skills_cache: dict[tuple[str, bool | str], list['Skill']]
|
||||
equVersion: str = '0'
|
||||
"""装备版本"""
|
||||
charEquipInfo: dict[str, 'CharacterEquipInfo']
|
||||
@@ -153,6 +173,7 @@ class CharacterBase(CharacterProperty):
|
||||
self.skills_id_dict = {}
|
||||
self.skills_uuid_dict = {}
|
||||
self.skill_names_cache = {}
|
||||
self.skills_cache = {}
|
||||
self.load_skills()
|
||||
|
||||
# region 角色属性设置
|
||||
@@ -249,33 +270,38 @@ class CharacterBase(CharacterProperty):
|
||||
# frame = sys._getframe(1) # 1 表示上一级调用帧
|
||||
# caller_name = frame.f_code.co_name
|
||||
# print(caller_name, kwargs.get('SkillAttack', 0))
|
||||
self.STR += 力量 + kwargs.get('STR', 0) + 四维 + 力智
|
||||
self.INT += 智力 + kwargs.get('INT', 0) + 四维 + 力智
|
||||
self.Spirit += 精神 + kwargs.get('Spirit', 0) + 四维 + 体精
|
||||
self.Vitality += 体力 + kwargs.get('Vitality', 0) + 四维 + 体精
|
||||
self.AtkP += 物攻 + kwargs.get('AtkP', 0) + 三攻
|
||||
self.AtkM += 魔攻 + kwargs.get('AtkM', 0) + 三攻
|
||||
self.AtkI += 独立 + kwargs.get('AtkI', 0) + 三攻
|
||||
self.PAtkP *= kwargs.get('PAtkP', 1.0)
|
||||
self.PAtkM *= kwargs.get('PAtkM', 1.0)
|
||||
self.PAtkI *= kwargs.get('PAtkI', 1.0)
|
||||
for elem in ['火', '冰', '光', '暗']:
|
||||
self.ElementA[elem] = kwargs.get(f'{elem}属性攻击', False) or kwargs.get('ElementA', {}).get(elem, False) or self.ElementA[elem]
|
||||
self.ElementDB[elem] += kwargs.get(f'{elem}强', 0) + kwargs.get('ElementDB', {}).get(elem, 0) + 全属强
|
||||
self.ElementR[elem] += kwargs.get(f'{elem}抗', 0) + kwargs.get('ElementR', {}).get(elem, 0) + 全属抗
|
||||
self.CriticalM += kwargs.get('CriticalM', 0) + 魔暴
|
||||
self.CriticalP += kwargs.get('CriticalP', 0) + 物暴
|
||||
self.SkillAttack *= (1 + 技攻) * (1 + kwargs.get('SkillAttack', 0))
|
||||
self.SpeedA += 攻击速度 + kwargs.get('SpeedA', 0) + 三速
|
||||
self.SpeedM += 移动速度 + kwargs.get('SpeedM', 0) + 三速
|
||||
self.SpeedR += 施放速度 + kwargs.get('SpeedR', 0) + 三速
|
||||
self.HitP += 命中率 + kwargs.get('HitP', 0)
|
||||
self.Hit += 命中 + kwargs.get('Hit', 0)
|
||||
self.Attack += 攻击强化 + kwargs.get('Attack', 0)
|
||||
self.AttackP += 攻击强化P + kwargs.get('AttackP', 0.0)
|
||||
self.Buffer += 增益量 + kwargs.get('Buffer', 0)
|
||||
self.BufferP += 增益量P + kwargs.get('BufferP', 0)
|
||||
self.EquEffectRatio += kwargs.get('EquEffectRatio', 0.0)
|
||||
kget = kwargs.get
|
||||
self.STR += 力量 + kget('STR', 0) + 四维 + 力智
|
||||
self.INT += 智力 + kget('INT', 0) + 四维 + 力智
|
||||
self.Spirit += 精神 + kget('Spirit', 0) + 四维 + 体精
|
||||
self.Vitality += 体力 + kget('Vitality', 0) + 四维 + 体精
|
||||
self.AtkP += 物攻 + kget('AtkP', 0) + 三攻
|
||||
self.AtkM += 魔攻 + kget('AtkM', 0) + 三攻
|
||||
self.AtkI += 独立 + kget('AtkI', 0) + 三攻
|
||||
self.PAtkP *= kget('PAtkP', 1.0)
|
||||
self.PAtkM *= kget('PAtkM', 1.0)
|
||||
self.PAtkI *= kget('PAtkI', 1.0)
|
||||
if 全属强 or 全属抗 or ELEMENT_STATUS_KEYS.intersection(kwargs):
|
||||
element_a = kget('ElementA', {})
|
||||
element_db = kget('ElementDB', {})
|
||||
element_r = kget('ElementR', {})
|
||||
for elem in ['火', '冰', '光', '暗']:
|
||||
self.ElementA[elem] = kget(f'{elem}属性攻击', False) or element_a.get(elem, False) or self.ElementA[elem]
|
||||
self.ElementDB[elem] += kget(f'{elem}强', 0) + element_db.get(elem, 0) + 全属强
|
||||
self.ElementR[elem] += kget(f'{elem}抗', 0) + element_r.get(elem, 0) + 全属抗
|
||||
self.CriticalM += kget('CriticalM', 0) + 魔暴
|
||||
self.CriticalP += kget('CriticalP', 0) + 物暴
|
||||
self.SkillAttack *= (1 + 技攻) * (1 + kget('SkillAttack', 0))
|
||||
self.SpeedA += 攻击速度 + kget('SpeedA', 0) + 三速
|
||||
self.SpeedM += 移动速度 + kget('SpeedM', 0) + 三速
|
||||
self.SpeedR += 施放速度 + kget('SpeedR', 0) + 三速
|
||||
self.HitP += 命中率 + kget('HitP', 0)
|
||||
self.Hit += 命中 + kget('Hit', 0)
|
||||
self.Attack += 攻击强化 + kget('Attack', 0)
|
||||
self.AttackP += 攻击强化P + kget('AttackP', 0.0)
|
||||
self.Buffer += 增益量 + kget('Buffer', 0)
|
||||
self.BufferP += 增益量P + kget('BufferP', 0)
|
||||
self.EquEffectRatio += kget('EquEffectRatio', 0.0)
|
||||
|
||||
def AddElementDB(self, element: str, value: float, type: int = 0) -> None:
|
||||
"""
|
||||
@@ -343,10 +369,14 @@ class CharacterBase(CharacterProperty):
|
||||
|
||||
def GetSkillNames(self, type: Literal['active', 'passive', 'all'] = 'all', damage: Literal[True, False, 'all'] = 'all') -> list[str]:
|
||||
"""获取技能名字"""
|
||||
return [skill.name for skill in self.GetSkills(type, damage)]
|
||||
|
||||
def GetSkills(self, type: Literal['active', 'passive', 'all'] = 'all', damage: Literal[True, False, 'all'] = 'all') -> list['Skill']:
|
||||
"""获取技能对象"""
|
||||
key = (type, damage)
|
||||
if key not in self.skill_names_cache:
|
||||
self.skill_names_cache[key] = [skill.name for skill in self.skills if (type == 'all' or skill.type == type) and (damage == 'all' or skill.damage == damage)]
|
||||
return self.skill_names_cache[key]
|
||||
if key not in self.skills_cache:
|
||||
self.skills_cache[key] = [skill for skill in self.skills if (type == 'all' or skill.type == type) and (damage == 'all' or skill.damage == damage)]
|
||||
return self.skills_cache[key]
|
||||
|
||||
def GetWeaponType(self) -> tuple[str, str]:
|
||||
"""获取武器类型"""
|
||||
|
||||
+25
-15
@@ -19,6 +19,18 @@ def _identity(value: Any) -> Any:
|
||||
return value
|
||||
|
||||
|
||||
@cache
|
||||
def _load_custom_cn() -> list[dict[str, Any]]:
|
||||
with (OPENAPI_DIR / 'custom_cn.json').open(encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
@cache
|
||||
def _load_skill_detail(prefix: str) -> dict[str, Any]:
|
||||
with (OPENAPI_DIR / 'data' / f'{prefix}.json').open(encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
@cache
|
||||
def _get_skill_data_suffixes(skill_class: type) -> tuple[str, ...]:
|
||||
return tuple(key.replace('data', '') for key in dir(skill_class) if key.startswith('data') and not key.startswith('plus'))
|
||||
@@ -41,15 +53,9 @@ def get_data(prefix: str, key: int | str, func: Callable[[Any], Any] = _identity
|
||||
jobGrow = prefix_parts[1]
|
||||
skill = prefix_parts[-1]
|
||||
|
||||
def get_custom_cn():
|
||||
with (OPENAPI_DIR / 'custom_cn.json').open(encoding='utf-8') as f:
|
||||
custom_cn = json.load(f)
|
||||
return custom_cn
|
||||
|
||||
def get_skill_info():
|
||||
with (OPENAPI_DIR / 'data' / f'{prefix}.json').open(encoding='utf-8') as f:
|
||||
skill_data = json.load(f)
|
||||
custom_cn = get_redis_info(redis, 'dcalc:custom_cn', get_custom_cn, without_gzip=True)
|
||||
skill_data = _load_skill_detail(prefix)
|
||||
custom_cn = get_redis_info(redis, 'dcalc:custom_cn', _load_custom_cn, without_gzip=True)
|
||||
try:
|
||||
if isinstance(key, int):
|
||||
data = [0] + [row["optionValue"].get("value" + str(key+1), 0) for row in skill_data["levelInfo"]["rows"]]
|
||||
@@ -235,15 +241,19 @@ class Skill:
|
||||
value = self.get_data_value(data, new) / ratio - self.get_data_value(data, old) / ratio
|
||||
self.char.SetStatus(**{type[2:]: value})
|
||||
else:
|
||||
if skills == '*':
|
||||
skills = self.char.GetSkillNames('all', True)
|
||||
exceptSkills = set(exceptSkills)
|
||||
for name in skills:
|
||||
if name in exceptSkills:
|
||||
continue
|
||||
skill = self.char.GetSkillByName(name)
|
||||
if skill is not None:
|
||||
if skills == '*':
|
||||
for skill in self.char.GetSkills('all', True):
|
||||
if skill.name in exceptSkills:
|
||||
continue
|
||||
self.update_skill_attribute(skill, type, old, new, data, ratio, weapon, weapon_type, weapon_options)
|
||||
else:
|
||||
for name in skills:
|
||||
if name in exceptSkills:
|
||||
continue
|
||||
skill = self.char.GetSkillByName(name)
|
||||
if skill is not None:
|
||||
self.update_skill_attribute(skill, type, old, new, data, ratio, weapon, weapon_type, weapon_options)
|
||||
except Exception as e:
|
||||
# print(f"Error applying association {type} for skill {self.name}: {e}")
|
||||
raise e
|
||||
|
||||
Reference in New Issue
Block a user