From e3660034eaa7050bbc8efd5d8c07908b1962e4de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Sun, 28 Jun 2026 21:59:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E4=BF=AE=E6=AD=A3=E8=81=8C=E4=B8=9A?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E7=B3=BB=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/core/basic/character/base.py | 4 +- backend/core/basic/character/calc_carry.py | 8 +- backend/core/basic/character_old.py | 1095 -------------------- backend/core/basic/formula.py | 287 +++-- 4 files changed, 182 insertions(+), 1212 deletions(-) delete mode 100644 backend/core/basic/character_old.py diff --git a/backend/core/basic/character/base.py b/backend/core/basic/character/base.py index 11d4d7a8..6cebdfa1 100644 --- a/backend/core/basic/character/base.py +++ b/backend/core/basic/character/base.py @@ -4,7 +4,7 @@ from typing import Any, Literal from core.abstract.character import CharacterProperty from core.basic.skill import Skill from core.basic.equipment import EquEffect, OathSuit, OathSuitSkill, Suit -from ..formula import 获取基础属性, 获取唤醒属性 +from ..formula import get_base_attributes, 获取唤醒属性 from ..roleinfo import CharacterEmblemInfo, CharacterEquipInfo, get_key_by_value, CharacterOathInfo from .jade import Jade @@ -180,7 +180,7 @@ class CharacterBase(CharacterProperty): def SetBaseStatus(self) -> None: """设角色基础属性""" - temp = 获取基础属性(self.角色, self.职业) + temp = get_base_attributes(self.role, self.name) 唤醒 = 获取唤醒属性() for index, i in enumerate([get_key_by_value(i) for i in ['力量', '体力', '智力', '精神']]): setattr(self, i, getattr(self, i) + temp[index] + 唤醒) diff --git a/backend/core/basic/character/calc_carry.py b/backend/core/basic/character/calc_carry.py index 6a72509a..fdcb7d2d 100644 --- a/backend/core/basic/character/calc_carry.py +++ b/backend/core/basic/character/calc_carry.py @@ -1,6 +1,6 @@ import inspect -from ..formula import 获取基础属性 +from ..formula import get_base_attributes from core.basic.property import CharacterInfo from .base import CharacterBase @@ -9,8 +9,8 @@ def _skill_error_context(char: CharacterBase, skill, mode: str) -> str: skill_class = skill.__class__ skill_file = inspect.getsourcefile(skill_class) or inspect.getfile(skill_class) return ( - f'角色={getattr(char, "角色", "")}, ' - f'职业={getattr(char, "职业", "")}, ' + f'角色={getattr(char, "name", "")}, ' + f'职业={getattr(char, "role", "")}, ' f'技能={getattr(skill, "name", "")}, ' f'技能类={skill_class.__name__}, ' f'mode={mode}, ' @@ -36,7 +36,7 @@ class CalcCarryMixin(CharacterBase): attrs.extend(['INT', 'AtkI', 'PAtkI']) # 力智系数 value0_1 = getattr(self, attrs[0]) - value0_2 = 获取基础属性(self.角色, self.职业)[0] if attrs[0] == 'STR' else 获取基础属性(self.角色, self.职业)[1] + value0_2 = get_base_attributes(self.role, self.name)[0] if attrs[0] == 'STR' else get_base_attributes(self.role, self.name)[1] # 系统奶及奶系增幅 value = value0_1 + ((value0_1 - value0_2) * 3.08 + 2886) * (1 if DSB else 0) + (170000 + 300000) * (1 if BUFF else 0) ratio_0: float = value / 250 + 1 diff --git a/backend/core/basic/character_old.py b/backend/core/basic/character_old.py deleted file mode 100644 index 8d7a1da6..00000000 --- a/backend/core/basic/character_old.py +++ /dev/null @@ -1,1095 +0,0 @@ -# ⚠️ 此文件已被 character/ 包目录取代。 -# Python 会优先加载 character/__init__.py,此文件不会被 import 执行。 -# -# 模块拆分结构(位于 core/basic/character/): -# jade.py — Jade 辟邪玉类 -# base.py — CharacterBase(属性 / __init__ / 基础状态方法 / 技能操作) -# calc_equip.py — CalcEquipMixin(套装/装备/时装/强化/辟邪玉/杂项 + calc 主入口) -# calc_carry.py — CalcCarryMixin(输出伤害计算) -# calc_buffer.py — CalcBufferMixin(辅助 Buff 技能计算) -# info.py — CharacterInfoMixin(前端信息查询) -# __init__.py — 组装 Character 类 + createCharacter 工厂函数 - -from functools import cache -import importlib -import sys -from typing import Any, Literal, Mapping, Union -from uuid import uuid1 - -from core.abstract.character import CharacterProperty -from core.basic.property import CharacterInfo -from core.basic.skill import Skill - -from core.basic.equipment import Suit, get_equipment, EquEffect, Equ, OathSuit - -# from core.basic.equipment import equipments -# from core.basic.skill import Skill, ActiveSkill, PassiveSkill -from .formula import 增幅计算, 强化技攻, 武器强化计算, 精通计算, 获取唤醒属性, 获取基础属性, 耳环计算, 左右计算, 锻造计算 -from .roleinfo import CharacterEquipInfo, get_key_by_value, CharacterOathInfo -# from .property import 精通计算, 角色基础, CharacterInfo - - -class Jade: - ElementIncrease: float - """属性增幅""" - AttackP: float - """攻击强化%""" - SkillAttack: float - """技能攻击力%""" - - def __init__(self) -> None: - self.ElementIncrease = 0.0 - self.AttackP = 0.0 - self.SkillAttack = 0.0 - - -class Character(CharacterProperty): - # region 角色属性 - - STR: float - """力量""" - - INT: float - """智力""" - - Spirit: float - """精神""" - - Vitality: float - """体力""" - - AtkP: float - """物理攻击力""" - - PAtkP: float - """物理攻击力%""" - - AtkM: float - """魔法攻击力""" - PAtkM: float - """魔法攻击力%""" - - AtkI: float - """独立攻击力""" - PAtkI: float - """独立攻击力%""" - - ElementA: dict[str, float] - """属性攻击""" - - ElementIncrease: float - """属性增幅""" - - ElementDB: dict[str, float] - """属性强化数值""" - - ElementR: dict[str, float] - """属性抗性数值""" - - CriticalM: float - """魔法暴击""" - - CriticalP: float - """物理暴击""" - - SkillAttack: float - """技能攻击力""" - - SpeedA: float - """攻击速度""" - - SpeedM: float - """移动速度""" - - SpeedR: float - """施放速度""" - - Hit: float - """命中率""" - - Abnormal: dict[str, bool] - """敌人异常状态""" - - MonsterInfo: dict[str, float] - - jade_effect: 'Jade' - """辟邪玉加成""" - - Buffer: float - """增益量""" - - BufferP: float - """增益量%""" - - Attack: float - """攻击强化""" - - AttackP: float - """攻击强化%""" - - # endregion - - BindAwake: int - """绑定觉醒等级""" - skills: list['Skill'] = [] - # """技能列表""" - skills_dict: dict[str, 'Skill'] = {} - # """技能名字对应技能""" - equVersion: str = '0' - """装备版本""" - charEquipInfo: dict[str, 'CharacterEquipInfo'] - """装备打造信息""" - charOathInfo: list['CharacterOathInfo'] - """誓约打造信息""" - equ_effect: list['EquEffect'] = [] - """装备效果列表""" - equ_options: dict[str, int] = {} - """装备选项列表""" - EquEffectRatio = 1.0 - """装备效果倍率""" - max_point = 0 - """套装效果点数""" - - buffer: bool = False - - # region 职业属性 - 实际名称: str = '' - 名称: str = '' - 角色: str = '' - 角色类型: str = '' - 职业: str = '' - 武器选项: list[str] = [] - 副武器选项: list[str] = [] - 输出类型选项: list[str] = [] - 防具精通属性: list[str] = [] - - 输出类型: str = '物理百分比' - - # endregion - - def __init__(self, equVersion, moduleName) -> None: - self.equVersion = equVersion - self.moduleName = moduleName - # self.equs = get_equ(self.equVersion) - # 工会四维 - self.STR = 0 + 120 - self.INT = 0 + 120 - self.Spirit = 0 + 120 - self.Vitality = 0 + 120 - # 唤醒的情况下的基础数据 - self.AtkP = 0 + 65 - self.AtkM = 0 + 65 - self.AtkI = 1116 + 65 - self.PAtkP = 1.0 - self.PAtkM = 1.0 - self.PAtkI = 1.0 - self.ElementA = { - '火': False, - '冰': False, - '光': False, - '暗': False, - } - self.ElementDB = { - '火': 13, - '冰': 13, - '光': 13, - '暗': 13, - } - self.ElementR = { - '火': 0, - '冰': 0, - '光': 0, - '暗': 0, - } - self.Abnormal = { - '出血': False, - '灼伤': False, - '感电': False, - '中毒': False, - } - self.CriticalM = 0 - self.CriticalP = 0 - self.SkillAttack = 1 - self.SpeedA = 0 - self.SpeedM = 0 - self.SpeedR = 0 - self.HitP = 0 - self.Hit = 0 - self.MonsterInfo = { - 'DefenseP': 0, - 'DefenseM': 0, - '火抗': 0, - '冰抗': 0, - '光抗': 0, - '暗抗': 0, - } - self.Buffer = 0 - self.BufferP = 1.0 - self.Attack = 0 - self.AttackP = 1.0 - self.ElementIncrease = 1.0 - self.equs = {} - self.jade_effect = Jade() - self.equ_effect = [] - self.equ_options = {} - self.max_point = 0 - self.skills = [] - self.skills_dict = {} - self.load_skills() - pass - - # region 角色属性设置 - def SetBaseStatus(self) -> None: - """设角色基础属性""" - # 角色四维 - temp = 获取基础属性(self.角色, self.职业) - 唤醒 = 获取唤醒属性() - for index, i in enumerate([get_key_by_value(i) for i in ['力量', '体力', '智力', '精神']]): - setattr(self, i, getattr(self, i) + temp[index] + 唤醒) - # 角色属性抗性 - pass - # 角色异常抗性 - pass - - def SetStatus( - self, - 力量=0, - 智力=0, - 力智=0, - 体力=0, - 精神=0, - 体精=0, - 四维=0, - 物攻=0, - 魔攻=0, - 独立=0, - 三攻=0, - 技攻=0, - 全属强=0, - 全属抗=0, - 移动速度=0, - 攻击速度=0, - 施放速度=0, - 三速=0, - 命中=0, - 命中率=0, - 物暴=0, - 魔暴=0, - 攻击强化=0, - 攻击强化P=0, - 增益量=0, - 增益量P=0, - **kwargs: Mapping[ - Literal[ - 'STR', - 'INT', - 'AtkP', - 'AtkM', - 'AtkI', - 'PAtkP', - 'PAtkM', - 'PAtkI', - 'PATKIPDamage', - 'PDamageC', - 'PSTR', - 'PINT', - 'PDamageB', - 'ElementA', - 'ElementDB', - 'ElementR', - 'CriticalMP', - 'CriticalM', - 'CriticalPP', - 'CriticalP', - 'EquipmentSkillAttack', - 'SkillAttack', - 'SpeedA', - 'SpeedM', - 'SpeedR', - 'HitP', - 'Hit', - 'Attack', - 'AttackP', - 'Buffer', - 'BufferP', - 'Spirit', - 'Vitality', - 'EquEffectRatio', - '火强', - '冰强', - '光强', - '暗强', - '火属性抗性', - '冰属性抗性', - '光属性抗性', - '暗属性抗性', - '火属性攻击', - '冰属性攻击', - '光属性攻击', - '暗属性攻击', - ], - Any, - ], - ) -> None: - """设置角色属性""" - 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) - # if 攻击强化 + kwargs.get('Attack', 0) > 0: - # print(sys._getframe(1).f_code.co_name,sys._getframe(1).f_lineno,攻击强化 + 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) - pass - - def AddElementDB(self, element: str, value: float, type: int = 0) -> None: - """ - 增加属性强化 - type: 0 站街 1 进图 - """ - if element not in self.ElementDB: - raise ValueError(f'Invalid element: {element}') - if type == 0: - value = value * (1 + self.jade_effect.ElementIncrease) - if type == 1: - value = int(value * (1 + self.jade_effect.ElementIncrease)) - self.ElementDB[element] += value - pass - - def AddSkillLv(self, min: int, max: int, lv: int, type=-1, exceptSkills: list[str] = []) -> None: - """ - 增加技能等级 - type: -1 全部, 0 被动, 1 主动 - """ - skillType = 'all' if type == -1 else ('active' if type == 1 else 'passive') - for skill in self.skills: - if min <= skill.learnLv <= max: - if (skillType == 'all' or skill.type == skillType) and skill.lv > 0 and skill.name not in exceptSkills: - skill.lv += lv - - def SetSkillCD(self, min=1, max=100, cd=0, exclude=[50, 85, 100]) -> None: - """ - 设置技能CD - """ - for skill in self.skills: - if min <= skill.learnLv <= max and (skill.type == 'active' or skill.damage) and skill.learnLv not in exclude: - skill.cdReduce *= 1 - cd - - def SetSkillCDRecover(self, min=1, max=100, cd=0, exclude=[50, 85, 100]) -> None: - """设置技能CD恢复""" - for skill in self.skills: - if min <= skill.learnLv <= max and (skill.type == 'active' or skill.damage) and skill.learnLv not in exclude: - skill.cdRecover += cd - - def SetSkillRation(self, min=1, max=100, ratio=1, type=-1) -> None: - """设置技能倍率 - 0 修改技能面板 1 不修改技能面板 - type: -1 全部, 0 被动, 1 主动 - """ - for skill in self.skills: - if min <= skill.learnLv <= max and skill.damage and skill.type == 'active': - if type == 0: - skill.skillRation *= 1 + ratio - else: - skill.skillDamage *= 1 + ratio - - def GetSkillByName(self, name) -> Skill: - """通过技能名获取技能""" - return self.skills_dict.get(name, None) - - def GetSkillByID(self, id: str) -> Skill: - skill = list(filter(lambda x: str(x.id) == id, self.skills)) - """通过技能ID获取技能""" - return skill[0] if len(skill) > 0 else None - - def GetSkillByUUID(self, uuid: str) -> Skill: - skill = list(filter(lambda x: str(x.uuid) == uuid, self.skills)) - """通过技能UUID获取技能""" - return skill[0] if len(skill) > 0 else None - - def GetSkillNames(self, type: Literal['active', 'passive', 'all'] = 'all', damage: Literal[True, False, 'all'] = 'all') -> list[str]: - """获取技能名字""" - return [skill.name for skill in self.skills if (type == 'all' or skill.type == type) and (damage == 'all' or skill.damage == damage)] - - def GetWeaponType(self) -> tuple[str, str]: - """获取武器类型""" - weapon = self.charEquipInfo['武器'].equInfo - if weapon is None: - return None, None - else: - return weapon.itemDetailType, weapon.categorize - - # endregion - - # region 计算相关 - def SetDetail(self, info: dict[str, dict]) -> None: - self.charEquipInfo = {} - # self.charOathInfo = [] - self.bindAwake = info.get('bindAwake', 50) - """打造信息导入""" - for key in info['equips']: - # 导入部位打造信息、装备信息、贴膜信息 - self.charEquipInfo[key] = CharacterEquipInfo(info['equips'][key], self.equVersion, key) - # for key in info['oaths']: - # # 导入誓约打造信息、誓约信息 - # self.charOathInfo.append(CharacterOathInfo(info['oaths'][key], self.equVersion, key)) - - def getInfo(self): - """返回到前端信息""" - info = {} - info['role'] = self.role - info['alter'] = self.name - info['equVersion'] = self.equVersion - info['name'] = self.nameCN - info['weapons'] = self.武器选项 - info['subweapons'] = self.副武器选项 - info['buffer'] = self.buffer - if self.buffer: - info['properties'] = self.防具精通属性 - info['properties'] = self.输出类型选项 - skillInfo = [] - skill_clothes = [] - platinum = [] - for skill in self.skills: - # 白金 - if 15 <= skill.learnLv <= 70 and skill.learnLv not in [48, 50]: - platinum.append(skill.name) - # 时装 - if skill.learnLv <= 95: - skill_clothes.append(skill.name) - skillInfo.append( - { - 'id': skill.id, - 'name': skill.name, - 'icon': skill.icon, - 'type': skill.type, - # 'SPCost': skill.SPCost, - 'learnLv': skill.learnLv, - 'masterLv': skill.masterLv, - 'maxLearnLv': skill.calculate_lv(), - 'maxLv': skill.maxLv, - # 'TPCost': 0 if not skill.hasTP else skill.TPCost, - # "masterTPLv":0 if not skill.hasTP else skill.masterTPLv, - # 'maxTPLv': 0 if not skill.hasTP else skill.TPLearnMax, - 'position': skill.position, - 'line': skill.line, - 'bind': skill.bind, - 'hasVP': skill.hasVP, - 'hasUP': skill.hasUP, - 'upType': skill.upType, - 'uuid': skill.uuid, - 'vps': [{'name': i['name'], 'desc': i['desc']} for i in skill.vps], - } - ) - info['skills'] = skillInfo - equInfos = get_equipment(self.equVersion) - equs = [] - suits = [] - stones = [] - for i in equInfos.equs: - if i.itemType == '武器' and i.itemDetailType not in self.武器选项: - continue - equs.append(i.__dict__) - for i in equInfos.suits: - suits.append(i.__dict__) - for i in equInfos.stones: - stones.append(i.__dict__) - info['equips'] = equs - info['suits'] = suits - info['stones'] = stones - key = '辅助' if self.buffer else '输出' - info['enchants'] = list(filter(lambda x: key in x['categorize'], equInfos.enchants)) - info['emblems'] = [i for i in equInfos.emblems] - info['avatar'] = equInfos.funs.get_dress_list(skill_clothes) - info['jades'] = equInfos.jades - info['options'] = equInfos.funs.options - info['sundry'] = equInfos.funs.sundryList - for skill in platinum: - info['emblems'].append( - { - 'id': skill, - 'fame': 232, - 'position': ['辅助装备', '魔法石'], - 'detail': skill + ' Lv+1' + ' 四维 + 8', - 'categorize': ['技能'], - 'rarity': '白金', - } - ) - return info - - def getBasicInos(self): - res = [] - attrs = [] - if self.输出类型.includes('物理'): - attrs = ['STR', 'PSTR', 'AtkP', 'PAtkP', 'CriticalPP', 'CriticalP'] - if self.输出类型.includes('魔法'): - attrs = ['INT', 'PINT', 'AtkM', 'PAtkM', 'CriticalMP', 'CriticalM'] - for attr in attrs + ['PDamage', 'PDamageC', 'PDamageB', 'SpeedA', 'SpeedM', 'SpeedR']: - temp = getattr(CharacterInfo, attr) - res.append( - { - 'name': temp.name, - 'value': temp.value(getattr(self, attr)), - 'icon': temp.icon, - } - ) - keys = ['火', '冰', '光', '暗'] - for index in range(0, 4): - temp = getattr(CharacterInfo, f'ElementDB{index}') - res.append( - { - 'name': temp.name, - 'value': temp.value(getattr(self, 'ElementDB')[keys[index]]), - 'icon': temp.icon, - } - ) - temp = getattr(CharacterInfo, f'ElementR{index}') - res.append( - { - 'name': temp.name, - 'value': temp.value(getattr(self, 'ElementR')[keys[index]]), - 'icon': temp.icon, - } - ) - return res - - def calc_init(self, setInfo: dict[str, dict]): - self.equ_options = setInfo.get('options', {}) - self.setInfo = setInfo - # 打造信息导入 - self.SetDetail(setInfo) - # 技能等级设置 - self.SetSkills(setInfo.get('skills', {})) - pass - - def SetSkills(self, skills: dict[str, dict]): - """设置技能等级""" - for key in skills: - skill = self.GetSkillByID(key) - if skill is not None: - if skill.hasUP: - skill.up = skills[key].get('up', 0) - if skill.hasVP: - skill.vp = skills[key].get('vp', 0) - skill.lv += skills[key].get('lv', 0) - pass - - def load_skills(self) -> None: - """加载技能""" - module = sys.modules[self.moduleName] - for name in dir(module): - memberClass = getattr(module, name) - if isinstance(memberClass, type) and memberClass.__name__.startswith('Skill'): - skill = memberClass(char=self) - self.skills_dict[skill.name] = skill - self.skills.append(skill) - - def calc_suits(self): - """套装效果统计""" - suitInfo = {} - equs = get_equipment(self.equVersion) - # 设置装备和获取对应的套装属性 - for item in filter(lambda x: x.equInfo is not None, self.charEquipInfo.values()): - partEqu = item.equInfo - partFusion = item.fusionInfo - # 套装属性设置 - if partEqu is not None: - for suit in partEqu.suit: - if suitInfo.get(suit, None) is None: - suitInfo[suit] = { - 'point': 0, - 'count': 0, - } - if partEqu.Point == 0: - suitInfo[suit]['count'] += 1 - else: - suitInfo[suit]['point'] += partEqu.Point - if partFusion is not None: - for suit in partFusion.suit: - if suitInfo.get(suit, None) is None: - suitInfo[suit] = { - 'point': 0, - 'count': 0, - } - if partFusion.Point == 0: - suitInfo[suit]['count'] += 1 - else: - suitInfo[suit]['point'] += partFusion.Point - # 取得点数最高的套装 - max_point_suit = max((suit for suit in suitInfo if suitInfo[suit]['point'] > 0), key=lambda suit: suitInfo[suit]['point'], default=None) - # 处理没有点数的老套装 - zero_point_suits = [suit for suit in suitInfo if suitInfo[suit]['point'] == 0] - suits = zero_point_suits + ([max_point_suit] if max_point_suit is not None else []) - suits_effect = [] - suitList = [] - res = [] - for suit in suits: - if suitInfo[suit]['point'] == 0: - suitList += equs.get_suit_info(suit, 0, suitInfo[suit]['count']) - # suits_effect += [i.id for i in equs.get_suit_info(suit, 0, suitInfo[suit]['count'])] - else: - suitList += equs.get_suit_info(suit, suitInfo[suit]['point'], 0) - # suits_effect += [i.id for i in equs.get_suit_info(suit, suitInfo[suit]['point'], 0)] - if len(suitList) == 0: - continue - temp = suitList[-1] - res.append( - { - 'id': temp.id, - 'name': temp.name, - 'rarity': temp.rarity, - 'point': suitInfo[suit]['point'], - 'count': suitInfo[suit]['count'], - 'level': temp.level, - 'imageUrl': temp.imageUrl, - 'value': temp.value, - } - ) - suits_effect = [i.id for i in suitList] - for i in suits_effect: - func = equs.funs.execture(f'suit_{i}') - suit = next((x for x in equs.suits if str(x.id) == str(i)), None) - if func is not None: - func(self) - if suit is not None: - filtered_dict = {k: v for k, v in suit.__dict__.items() if k[0].isupper()} - self.SetStatus(**filtered_dict) - self.max_point = max([i['point'] for i in res], default=0) - # 太初积分以上,每超过70点数增加1%技能攻击力 - if self.max_point >= 2550: - skillAttack = (self.max_point - 2550) // 70 * 0.01 - buffer = (self.max_point - 2550) // 70 * 100 - self.SetStatus(SkillAttack=skillAttack, Buffer=buffer) - return res - - def calc_equs(self): - """计算装备基础效果、附魔、贴膜""" - effects = get_equipment(self.equVersion).funs - for detail in [(item.equInfo, item.fusionInfo, item.enchant, item.emblem_0, item.emblem_1) for item in filter(lambda x: x.equInfo is not None, self.charEquipInfo.values())]: - equ = detail[0] - if equ is None or equ.itemType == '副武器': - continue - fusion = detail[1] - enchat = detail[2] - fun = effects.execture(f'equ_{equ.id}') - if fun is None: - continue - # 获取装备基础属性 并给角色设置(大写开头属性为角色属性) - filtered_dict = {k: v for k, v in equ.__dict__.items() if k[0].isupper()} - self.SetStatus(**filtered_dict) - # 获取装备额外属性 - fun(self) - # 附魔 - fun = effects.execture(f'enchant_{enchat}') - if fun is not None: - fun(self) - # 徽章效果 - emblem_0 = detail[3] - emblem_1 = detail[4] - if str(emblem_0).isdigit(): - fun = effects.execture(f'emblem_{emblem_0}') - if fun is not None: - fun(self) - else: - # 白金徽章处理 - skill = self.GetSkillByName(emblem_0) - if skill is not None: - skill.lv += 1 - self.SetStatus(四维=8) - fun = effects.execture(f'emblem_{emblem_1}') - if fun is not None: - fun(self) - # 贴膜 - if fusion is None: - continue - fun = effects.execture(f'stone_{fusion.id}') - # 获取装备基础属性 并给角色设置(大写开头属性为角色属性) - filtered_dict = {k: v for k, v in fusion.__dict__.items() if k[0].isupper()} - self.SetStatus(**filtered_dict) - # 获取装备额外属性 - if fun is not None: - fun(self) - # 武器铭刻处理 已移除该系统 - # weapon = self.charEquipInfo['武器'] - # if weapon.equInfo is None or weapon.weaponFusion is None or weapon.weaponFusion == 0: - # return - # adaptation = min(weapon.adaptation,weapon.equInfo.max_adaptation) - # if weapon.weaponFusion == 1: - # self.SetStatus(SkillAttack = 0.07 + adaptation * 0.01) - # if weapon.weaponFusion == 2: - # self.SetStatus(SkillAttack = 0.055 + adaptation * 0.01) - # self.SetStatus(SpeedA = 0.2,SpeedM = 0.2,SpeedR = 0.2) - # if weapon.weaponFusion == 3: - # self.SetStatus(SkillAttack = 0.01 + adaptation * 0.01) - # self.SetSkillCD(1, 100, 0.1) - # self.SetStatus(EquEffectRatio = 0.05) - - def calc_avatar(self, avatar: dict): - """计算时装效果""" - equ = get_equipment(self.equVersion) - dress = {key: value for key, value in avatar.items() if key in ['头部', '帽子', '脸部', '胸部', '上衣', '腰带', '下装', '鞋']} - equ.funs.calc_dress_effect(dress, self) - avatarElse = {key: value for key, value in avatar.items() if key not in ['头部', '帽子', '脸部', '胸部', '上衣', '腰带', '下装', '鞋']} - for key in avatarElse: - value = avatarElse[key].get('enchant', None) - emblem_0 = avatarElse[key].get('emblem_0', None) - emblem_1 = avatarElse[key].get('emblem_1', None) - if value is not None: - fun = equ.funs.execture(f'enchant_{value}') - if fun is not None: - fun(self) - for i in [emblem_0, emblem_1]: - if i is None: - continue - fun = equ.funs.execture(f'emblem_{i}') - if fun is not None: - fun(self) - pass - - def calc_weapon(self, cur: CharacterEquipInfo): - # 锻造独立计算 - value = 锻造计算(115, '史诗', cur.refine) - self.SetStatus(AtkI=value) - # 传世武器强化系数取所有武器的最高的1.12 - if '传世武器' in cur.equInfo.categorize: - value = 武器强化计算(115, '史诗', cur.reinforce, cur.equInfo.itemDetailType, '物理', 1.12) - self.SetStatus(AtkP=value, AtkM=value) - else: - # 强化计算 - value = 武器强化计算(115, '史诗', cur.reinforce, cur.equInfo.itemDetailType, '物理') - self.SetStatus(AtkP=value) - value = 武器强化计算(115, '史诗', cur.reinforce, cur.equInfo.itemDetailType, '魔法') - self.SetStatus(AtkM=value) - - def calc_basic(self): - """计算基础属性:防具精通、增幅、强化等""" - # 防具精通跟随装备品级 - for part in ['上衣', '头肩', '下装', '腰带', '鞋']: - cur = self.charEquipInfo[part] - if cur.equInfo is None: - continue - equ = cur.equInfo - reinforce = self.charEquipInfo[part].reinforce - if equ is None: - continue - - for key in self.防具精通属性: - value = 精通计算(115, equ.rarity, reinforce, equ.itemDetailType, self.防具类型, self.buffer, key) - key = get_key_by_value(key) - setattr(self, key, getattr(self, key) + value) - # 115增幅强化品级固定史诗 - for part in self.charEquipInfo.keys(): - cur = self.charEquipInfo[part] - if cur.equInfo is None: - continue - # 增幅 - if cur.reinforceType == 1: - # 增幅四维 - value = 增幅计算(115, '史诗', cur.reinforce) - self.SetStatus(STR=value, INT=value, Spirit=value, Vitality=value) - # 增幅技攻计算 - value = 强化技攻(cur.reinforce, cur.reinforceType, part) - self.SetStatus(SkillAttack=value) - # 武器强化、武器锻造、特殊装备强化额外效果计算 - if '武器' in part: - self.calc_weapon(cur) - pass - if part == '耳环': - value = 耳环计算(115, '史诗', cur.reinforce) - self.SetStatus(AtkM=value, AtkP=value, AtkI=value) - pass - if part in ['辅助装备', '魔法石']: - value = 左右计算(115, '史诗', cur.reinforce) - self.SetStatus(STR=value, INT=value, Spirit=value, Vitality=value) - pass - pass - - def calc_jade(self, jades): - """计算辟邪玉效果""" - funs = get_equipment(self.equVersion).funs - for key in jades: - jade = jades[key] - fun = funs.execture(f'jade_{jade.get("id", 0)}') - if fun is not None: - fun(self, jade.get('value', 0)) - pass - - def calc_sundry(self, sundry: dict): - """计算杂项效果""" - funs = get_equipment(self.equVersion).funs - funs.execture('sundry_0')( - self, - sundry.get('medal_rarity', 0), - sundry.get('medal_reinforce', 0), - [sundry.get('medal_gem_0', 0), sundry.get('medal_gem_1', 0), sundry.get('medal_gem_2', 0), sundry.get('medal_gem_3', 0)], - ) - funs.execture('sundry_6')(self, sundry.get('adventure', 1)) - funs.execture('sundry_5')(self, sundry.get('fog', 1)) - funs.execture('sundry_7')(self, sundry.get('marriage_house', 0), sundry.get('marriage_ring', 0)) - funs.execture('sundry_9')(self, sundry.get('contract', 0)) - funs.execture('sundry_10')( - self, - sundry.get('collection_type', 0), - sundry.get('collection_num_0', 0), - sundry.get('collection_num_1', 0), - ) - funs.execture('sundry_13')(self, sundry.get('costume_card', 0)) - pass - - def calc(self, setInfo: dict[str, dict]): - self.calc_init(setInfo) - # self.SetDetail(setInfo) - # 角色基础属性 - self.SetBaseStatus() - # 辟邪玉计算 - self.calc_jade(setInfo.get('jades', [])) - # 时装计算 - self.calc_avatar(setInfo.get('avatar', {})) - # 精通、增幅、强化计算 - self.calc_basic() - # 杂项信息 - self.calc_sundry(setInfo.get('sundry', {})) - # 计算套装基础效果 - suit = self.calc_suits() - # 部位效果计算 - self.calc_equs() - skillInfos = [] - if self.buffer: - skillInfos = self.calc_buffer_skills() - info = self.get_buffer_info() - pass - else: - # 如果存在 - if len(self.输出类型选项) > 1: - temp = self.输出类型选项[0] - if '固伤' in temp: - if self.INT > self.STR: - self.输出类型 = '魔法固伤' - else: - self.输出类型 = '物理固伤' - else: - if self.INT > self.STR and self.AtkM > self.AtkP: - self.输出类型 = '魔法百分比' - else: - self.输出类型 = '物理百分比' - skillInfos = self.calc_carry_skills(setInfo.get('DSB', False), setInfo.get('BUFF', False)) - info = self.get_carry_info() - return {'uuid': uuid1().hex, 'skills': skillInfos, 'info': info, 'suits': suit, 'buffer': self.buffer} - # 技能影响角色的属性,如属强、抗性等 - - # region 输出计算项 - - def calc_damage_ration(self, DSB: bool, BUFF: bool): - """计算属性系数""" - # 计算最终属性 - # 力/智 攻击力 攻击力%(特效不吃这部分) - attrs = [] - if self.输出类型 == '物理百分比': - attrs.extend(['STR', 'AtkP', 'PAtkP']) - if self.输出类型 == '魔法百分比': - attrs.extend(['INT', 'AtkM', 'PAtkM']) - if self.输出类型 == '物理固伤': - attrs.extend(['STR', 'AtkI', 'PAtkI']) - if self.输出类型 == '魔法固伤': - attrs.extend(['INT', 'AtkI', 'PAtkI']) - # 力智系数 - value0_1 = getattr(self, attrs[0]) - value0_2 = 获取基础属性(self.角色, self.职业)[0] if attrs[0] == 'STR' else 获取基础属性(self.角色, self.职业)[1] - # 系统奶及奶系增幅 - value = value0_1 + ((value0_1 - value0_2) * 3.08 + 2886) * (1 if DSB else 0) + (170000 + 300000) * (1 if BUFF else 0) - ratio_0: float = value / 250 + 1 - # 物理/魔法/独立攻击力 - ratio_1: float = getattr(self, attrs[1]) + 30000 * (1 if BUFF else 0) - # 技能 物理/魔法/独立攻击力% - ratio_2: float = getattr(self, attrs[2]) - # 属强系数 - ratio_3 = max(self.ElementDB.values()) * 0.0045 + 1.05 - # 暴击系数 - ratio_4 = 1.5 - # BUFF系数 - ratio_5 = self.buff - # 技攻系数 - ratio_6 = self.SkillAttack * (self.jade_effect.SkillAttack + 1) - # 攻击强化 - ratio_7 = 1 + self.Attack / 100 * (self.AttackP + self.jade_effect.AttackP) - # 防御系数,暂定145沙袋防御 - monster_defense = 81417275817 - ratio_8 = 1 - monster_defense / (monster_defense + 200 * 100) - # 杂项 斗神、宠物技能、队友增幅等(技能的属性增幅归属到这部分,因为会加成到特效部分,修复后修改为技能攻击力计算) - ratio_9 = 1.0 * self.ElementIncrease - return (ratio_0, ratio_1, ratio_2, ratio_3, ratio_4, ratio_5, ratio_6, ratio_7, ratio_8, ratio_9) - - def calc_carry_skills(self, DSB: bool, BUFF: bool): - skillInfos = [] - for i in self.skills: - if i.damage and i.lv > 0: - for mode in i.mode: - temp = i.skillInfo(mode) - if temp[0] > 0: - skillInfos.append( - { - 'name': i.name, - 'icon': i.icon, - 'lv': i.lv, - 'data': temp[0], - 'ratio': temp[1], - 'cd': temp[2], - 'mode': mode, - 'learnLv': i.learnLv, - 'type': i.type, - } - ) - ratios = self.calc_damage_ration(DSB, BUFF) - ratio_char_skill = ratios[0] * ratios[1] * ratios[2] * ratios[3] * ratios[4] * ratios[5] * ratios[6] * ratios[7] * ratios[8] * ratios[9] / 1000 - ratuio_equ_skill = ratios[0] * ratios[1] * ratios[3] * ratios[4] * ratios[6] * ratios[7] * ratios[8] * ratios[9] / 1000 - for i in skillInfos: - i['damage'] = ratio_char_skill * i['data'] * i['ratio'] / 100 - for i in self.equ_effect: - skillInfos.append({'name': i.name, 'icon': i.icon, 'lv': 0, 'data': i.data, 'ratio': 10.0, 'cd': i.cd, 'damage': ratuio_equ_skill * i.data * 10 * self.EquEffectRatio / 100, 'mode': ''}) - # 合并相同 name、cd、damage 的项 - # merged = {} - # for skill in skillInfos: - # key = (skill['name'], skill['cd'], skill['damage']) - # if key not in merged: - # merged[key] = skill.copy() - # else: - # merged[key]['mode'] = '' - # skillInfos = list(merged.values()) - return skillInfos - - def get_carry_info(self): - attrs = [] - if self.输出类型 == '物理百分比': - attrs.extend(['STR', 'AtkP']) - if self.输出类型 == '魔法百分比': - attrs.extend(['INT', 'AtkM']) - if self.输出类型 == '物理固伤': - attrs.extend(['STR', 'AtkI']) - if self.输出类型 == '魔法固伤': - attrs.extend(['INT', 'AtkI']) - info = [] - attrs.extend(['Attack', 'AttackP', 'SkillAttack', 'EquEffectRatio', 'ElementDB']) - for attr in attrs: - temp = getattr(CharacterInfo, attr) - if attr.startswith('Atk'): - info.append({'name': temp.name, 'value': temp.value(getattr(self, attr) * getattr(self, f'P{attr}'))}) - pass - else: - value = getattr(self, attr) - if attr == 'SkillAttack': - value *= self.jade_effect.SkillAttack + 1 - if attr == 'AttackP': - value += self.jade_effect.AttackP - info.append( - { - 'name': temp.name, - 'value': temp.value(value), - } - ) - pass - return info - - # endregion - - # region 辅助计算项 - - def calc_buffer_skills(self): - skillInfos = [] - # 适用属性 - main = getattr(self, get_key_by_value(self.适用属性)) - # 增益量 - buffer_power = self.Buffer * self.BufferP - # buff系数 - buff_ratio_new = (main / 2993 + 1) * (buffer_power / 4800 + 1) if buffer_power > 0 else 0 - buff_ratio_old = main / 2993 + 1 - # 觉醒系数 - awake_ratio_new = ((main + 7500) / 7500 + 1) * ((buffer_power + 68000) / 8500 + 1) if buffer_power > 0 else 0 - awake_ratio_old = main / 7500 + 1 - for i in self.skills: - if i.lv > 0 and i.hasUP and i.up is not None and i.up > 0: - self.SetStatus(四维=40) - if i.buffer and i.lv > 0: - info = i.skillInfo() - # 奶自己的面板加成 - value = info[0] - # buff技能 - if i.buffType == 'buff' or i.buffType == 'buffSub': - value1 = (info[1][0] + info[1][2]) * info[1][1] * buff_ratio_old + info[1][0] * buff_ratio_new - value2 = (info[2][0] + info[2][2]) * info[2][1] * buff_ratio_old + info[2][0] * buff_ratio_new - # 觉醒技能 - elif i.buffType == 'awake' or i.buffType == 'awakeSub': - value1 = (info[1][0] + info[1][2]) * info[1][1] * awake_ratio_old + info[1][0] * awake_ratio_new - value2 = (info[2][0] + info[2][2]) * info[2][1] * awake_ratio_old + info[2][0] * awake_ratio_new - else: - value1 = (info[1][0] + info[1][2]) * info[1][1] - value2 = (info[2][0] + info[2][2]) * info[2][1] - value3 = info[3] - value4 = info[4] - if i.buffType == 'awake' and self.bindAwake == 50: - pass - else: - skillInfos.append( - { - 'name': i.name, - 'cd': value4, - 'icon': i.icon, - 'lv': i.lv, - # 对自己的加成 三攻 力智 伤害直接加成 - 'buff': [value, value1, value2, value3], - 'type': i.type, - } - ) - return skillInfos - - def get_buffer_info(self): - attrs = [get_key_by_value(self.适用属性), 'Buffer', 'BufferP'] - info = [] - for attr in attrs: - temp = getattr(CharacterInfo, attr) - value = getattr(self, attr) - info.append( - { - 'name': temp.name, - 'value': temp.value(value), - } - ) - return info - - # endregion - - # endregion - - -def createCharacter(alter: str, equVersion: str = '0'): - character: Character = None - module_name = 'core.character.' + alter - if equVersion is None or equVersion == '': - equVersion = '0' - try: - character = importlib.import_module(module_name).classChange(equVersion) - except Exception as ex: - print(ex) - print('create character ' + module_name + ' error.') - pass - return character diff --git a/backend/core/basic/formula.py b/backend/core/basic/formula.py index dc328e30..1b30b6e8 100644 --- a/backend/core/basic/formula.py +++ b/backend/core/basic/formula.py @@ -342,107 +342,152 @@ def 精通计算(装备等级, 品质, 强化等级, 部位, 甲类, 属性='', # region 角色基础属性 -当前等级 = 110 - # 力量 体力 智力 精神 -角色基础系数 = { - '魔枪士': (4.6, 4.6, 4.4, 4.4, 7, 7, 5, 5), - '格斗家(女)': (5, 5, 4, 4, 7.5, 7.5, 4.5, 4.5), - '格斗家(男)': (5, 5, 4, 4, 7.5, 7.5, 4.5, 4.5), - '枪剑士': (4.6, 4.6, 4.4, 4.4, 7, 7, 5, 5), - '神枪手(女)': (4.5, 4.5, 4.5, 4.5, 6.5, 6.5, 5.5, 5.5), - '神枪手(男)': (4.5, 4.5, 4.5, 4.5, 6.5, 6.5, 5.5, 5.5), - '守护者': (4.8, 4.8, 4.2, 4.2, 7, 7, 5, 5), - '魔法师(女)': (4, 4, 5, 5, 4.5, 4.5, 7.5, 7.5), - '魔法师(男)': (3.5, 4, 5.5, 5, 4, 4.5, 8, 7.5), - '暗夜使者': (5, 4, 5, 4, 7.5, 5.5, 6.5, 4.5), - '缔造者': (4, 4, 5, 5, 4.5, 4.5, 7.5, 7.5), - '黑暗武士': (4.8, 4.8, 4.2, 4.2, 7.5, 7.5, 4.5, 4.5), - '鬼剑士(男)': (4.8, 4.8, 4.2, 4.2, 7.5, 7.5, 4.5, 4.5), - '鬼剑士(女)': (4.6, 4.6, 4.4, 4.4, 7, 7, 5, 5), - '圣职者(男)': (4.7, 4.8, 4, 4.5, 6.5, 6.5, 4.5, 6.5), - '圣职者(女)': (4.7, 4.8, 4, 4.5, 6.5, 6.5, 4.5, 6.5), - # todo - '弓箭手': (4.6, 4.6, 4.4, 4.4, 6.5, 6.5, 5.5, 5.5), - '帝国骑士': (4.6, 4.6, 4.4, 4.4, 7, 7, 5, 5), -} - -# 力量 体力 智力 精神 -职业基础数据 = { - '征战者-魔枪士': (5.5, 5.5, 3.5, 3.5), - '决战者-魔枪士': (5, 5, 4, 4), - '狩猎者-魔枪士': (3, 4.5, 6, 4.5), - '暗枪士-魔枪士': (3.5, 3.5, 5.5, 5.5), - '气功师-格斗家(女)': (3.5, 3.5, 5.5, 5.5), - '散打-格斗家(女)': (5.5, 5.5, 3.5, 3.5), - '街霸-格斗家(女)': (5, 4, 5, 4), - '柔道家-格斗家(女)': (5, 6, 3.5, 3.5), - '气功师-格斗家(男)': (3.5, 3.5, 5.5, 5.5), - '散打-格斗家(男)': (5.5, 5.5, 3.5, 3.5), - '街霸-格斗家(男)': (5, 4, 5, 4), - '柔道家-格斗家(男)': (5, 6, 3.5, 3.5), - '暗刃-枪剑士': (5.5, 5.5, 3.5, 3.5), - '特工-枪剑士': (5, 5, 4, 4), - '战线佣兵-枪剑士': (5.2, 5, 3.5, 4.3), - '源能专家-枪剑士': (3.5, 3.5, 5.5, 5.5), - '漫游枪手-神枪手(女)': (5.5, 5.5, 3.5, 3.5), - '枪炮师-神枪手(女)': (5.5, 5.5, 3.5, 3.5), - '机械师-神枪手(女)': (3.5, 3.5, 5.5, 5.5), - '弹药专家-神枪手(女)': (4.7, 4.3, 4.7, 4.3), - '协战师-神枪手(女)': (3.5, 5.5, 3.5, 5.5), - '漫游枪手-神枪手(男)': (5.5, 5.5, 3.5, 3.5), - '枪炮师-神枪手(男)': (5.5, 5.5, 3.5, 3.5), - '机械师-神枪手(男)': (3.5, 3.5, 5.5, 5.5), - '弹药专家-神枪手(男)': (4.7, 4.3, 4.7, 4.3), - '合金战士-神枪手(男)': (5.5, 5.5, 3.5, 3.5), - '精灵骑士-守护者': (5, 5, 4, 4), - '混沌魔灵-守护者': (3.5, 3.5, 5.5, 5.5), - '帕拉丁-守护者': (5, 5.5, 2, 5.5), - '龙骑士-守护者': (5, 5, 4, 4), - '元素师-魔法师(女)': (3.5, 3.5, 5.5, 5.5), - '召唤师-魔法师(女)': (3.8, 3.7, 5.3, 5.2), - '战斗法师-魔法师(女)': (5, 4, 5, 4), - '魔道学者-魔法师(女)': (4.5, 4, 5.2, 4.3), - '小魔女-魔法师(女)': (4.7, 4.8, 5.5, 4.5), - '元素爆破师-魔法师(男)': (3.5, 3.5, 5.5, 5.5), - '冰结师-魔法师(男)': (3.5, 3.7, 5.5, 5.2), - '血法师-魔法师(男)': (5.5, 5.5, 3.5, 3.5), - '逐风者-魔法师(男)': (5.5, 5.2, 3.5, 3.8), - '次元行者-魔法师(男)': (3.5, 3.5, 5.5, 5.5), - '刺客-暗夜使者': (5.3, 4.5, 4.2, 4), - '死灵术士-暗夜使者': (4.7, 3.5, 5.3, 4.5), - '忍者-暗夜使者': (4.5, 3.5, 5.5, 4.5), - '影舞者-暗夜使者': (5.5, 4.5, 4, 4), - '缔造者-缔造者': (4, 4, 5, 5), - '黑暗武士-黑暗武士': (4.8, 4.8, 4.2, 4.2), - '剑魂-鬼剑士(男)': (5, 5, 4, 4), - '鬼泣-鬼剑士(男)': (3.5, 3.5, 5.5, 5.5), - '狂战士-鬼剑士(男)': (5.5, 5.5, 3.5, 3.5), - '阿修罗-鬼剑士(男)': (3, 4.5, 6, 4.5), - '剑影-鬼剑士(男)': (5, 5, 4, 4), - '刃影-鬼剑士(女)': (5, 5, 4, 4), - '驭剑士-鬼剑士(女)': (5, 5, 4, 4), - '暗殿骑士-鬼剑士(女)': (3.5, 3.5, 5.5, 5.5), - '契魔者-鬼剑士(女)': (5.5, 5.5, 3.5, 3.5), - '流浪武士-鬼剑士(女)': (5.5, 5.5, 3.5, 3.5), - '圣骑士-圣职者(男)': (3.5, 5.5, 4.5, 5.5), - '蓝拳圣使-圣职者(男)': (5.2, 5, 3.9, 3.9), - '驱魔师-圣职者(男)': (5, 4, 5, 4), - '复仇者-圣职者(男)': (3.5, 3.5, 5.5, 5.5), - '圣骑士-圣职者(女)': (3.5, 5.5, 5.5, 3.5), - '异端审判者-圣职者(女)': (5.2, 5, 3.5, 4.3), - '巫女-圣职者(女)': (3.5, 3.5, 5.5, 5.5), - '诱魔者-圣职者(女)': (3.5, 3.5, 5.5, 5.5), - # TODO - '蓝拳圣使-圣职者(女)': (5.5, 5, 3.9, 3.9), - # todo - '缪斯-弓箭手': (3.5, 5.5, 3.5, 5.5), - '旅人-弓箭手': (5.5, 5.5, 3.5, 3.5), - '猎人-弓箭手': (5.5, 5.5, 3.5, 3.5), - '妖护使-弓箭手': (5.5, 5.5, 5.5, 3.5), - '奇美拉-弓箭手': (5.5, 5.5, 3.5, 3.5), - # - '破浪者-帝国骑士': (6, 5.5, 3.5, 3.5), +character_base = { + "archer": { + "initial": (100.5, 100.5, 99.5, 99.5), + "basic": (5.6, 5.6, 5.4, 5.4), + "muse": (4.5, 6.5, 4.5, 6.5), + "traveler": (6.5, 6.5, 4.5, 4.5), + "hunter": (6.5, 6.0, 4.5, 5.0), + "vigilante": (4.5, 4.5, 6.5, 6.5), + "chimera": (6.5, 6.5, 4.5, 4.5), + }, + "demonic_lancer": { + "initial": (101.0, 101.0, 99.0, 99.0), + "basic": (5.6, 5.6, 5.4, 5.4), + "vanguard": (6.5, 6.5, 4.5, 4.5), + "skirmisher": (6.0, 6.0, 5.0, 5.0), + "dragoon": (4.0, 5.5, 7.0, 5.5), + "impaler": (4.5, 4.5, 6.5, 6.5), + }, + "fighter_male": { + "initial": (101.5, 101.5, 98.5, 98.5), + "basic": (6.0, 6.0, 5.0, 5.0), + "nenmaster_male": (4.5, 4.5, 6.5, 6.5), + "striker_male": (6.5, 6.5, 4.5, 4.5), + "brawler_male": (6.0, 5.0, 6.0, 5.0), + "grappler_male": (6.0, 7.0, 4.5, 4.5), + }, + "fighter_female": { + "initial": (101.5, 101.5, 98.5, 98.5), + "basic": (6.0, 6.0, 5.0, 5.0), + "nenmaster_female": (4.5, 4.5, 6.5, 6.5), + "striker_female": (6.5, 6.5, 4.5, 4.5), + "brawler_female": (6.0, 5.0, 6.0, 5.0), + "grappler_female": (6.0, 7.0, 4.5, 4.5), + }, + "gunblader": { + "initial": (101.0, 101.0, 99.0, 99.0), + "basic": (5.6, 5.6, 5.4, 5.4), + "hitman": (6.5, 6.5, 4.5, 4.5), + "agent": (6.0, 6.0, 5.0, 5.0), + "trouble_shooter": (6.2, 6.0, 4.5, 5.3), + "specialist": (4.5, 4.5, 6.5, 6.5), + }, + "gunner_female": { + "initial": (100.5, 100.5, 99.5, 99.5), + "basic": (5.5, 5.5, 5.5, 5.5), + "ranger_female": (6.5, 6.5, 4.5, 4.5), + "launcher_female": (6.5, 6.5, 4.5, 4.5), + "mechanic_female": (4.5, 4.5, 6.5, 6.5), + "spitfire_female": (5.7, 5.3, 5.7, 5.3), + "paramedic": (6.5, 4.0, 5.0, 6.5), + }, + "gunner_male": { + "initial": (100.5, 100.5, 99.5, 99.5), + "basic": (5.5, 5.5, 5.5, 5.5), + "ranger_male": (6.5, 6.5, 4.5, 4.5), + "launcher_male": (6.5, 6.5, 4.5, 4.5), + "mechanic_male": (4.5, 4.5, 6.5, 6.5), + "spitfire_male": (5.7, 5.3, 5.7, 5.3), + "assault": (6.5, 6.5, 4.5, 4.5), + }, + "imperialknight": { + "initial": (101.0, 101.0, 99.0, 99.0), + "basic": (5.6, 5.6, 5.4, 5.4), + "breaker": (7.0, 6.5, 4.0, 4.5), + }, + "knight": { + "initial": (101.0, 101.0, 99.0, 99.0), + "basic": (5.8, 5.8, 5.2, 5.2), + "elven_knight": (6.0, 6.0, 5.0, 5.0), + "chaos": (4.5, 4.5, 6.5, 6.5), + "paladin": (6.0, 6.5, 3.0, 6.5), + "dragon_knight": (6.0, 6.0, 5.0, 5.0), + }, + "mage_male": { + "initial": (98.0, 98.5, 102.0, 101.5), + "basic": (4.5, 5.0, 6.5, 6.0), + "elemental_bomber": (4.5, 4.5, 6.5, 6.5), + "glacial_master": (4.5, 4.8, 6.5, 6.2), + "blood_mage": (6.5, 6.5, 4.5, 4.5), + "swift_master": (6.5, 6.2, 4.5, 4.8), + "dimension_walker": (4.5, 4.5, 6.5, 6.5), + }, + "mage_female": { + "initial": (98.5, 98.5, 101.5, 101.5), + "basic": (5.0, 5.0, 6.0, 6.0), + "elementalist": (4.5, 4.5, 6.5, 6.5), + "summoner": (4.8, 4.7, 6.3, 6.2), + "battle_mage": (6.0, 5.0, 6.0, 5.0), + "witch": (5.5, 5.0, 6.2, 5.3), + "enchantress": (4.5, 5.5, 6.5, 5.5), + }, + "priest_female": { + "initial": (100.5, 100.5, 98.5, 100.5), + "basic": (5.7, 5.8, 5.0, 5.5), + "crusader_female": (4.5, 6.5, 6.5, 4.5), + "inquistor": (6.2, 6.0, 4.5, 5.3), + "sorceress": (4.5, 4.5, 6.5, 6.5), + "mistress": (4.5, 4.5, 6.5, 6.5), + "infighter_female": (6.5, 5.5, 4.5, 5.5), + }, + "priest_male": { + "initial": (100.5, 100.5, 98.5, 100.5), + "basic": (5.7, 5.8, 5.0, 5.5), + "crusader_male": (4.5, 6.5, 4.5, 6.5), + "infighter": (6.2, 6.0, 4.9, 4.9), + "exorcist": (6.0, 5.0, 6.0, 5.0), + "avenger": (4.5, 4.5, 6.5, 6.5) + }, + "swordman_female": { + "initial": (101.0, 101.0, 99.0, 99.0), + "basic": (5.6, 5.6, 5.4, 5.4), + "sword_master": (6.0, 6.0, 5.0, 5.0), + "dark_templar": (4.5, 4.5, 6.5, 6.5), + "demon_slayer": (6.5, 6.5, 4.5, 4.5), + "vegabond": (6.5, 6.5, 4.5, 4.5), + "spectre": (6.0, 6.0, 5.0, 5.0), + }, + "swordman_male": { + "initial": (101.5, 101.5, 98.5, 98.5), + "basic": (5.8, 5.8, 5.2, 5.2), + "weapon_master": (6.0, 6.0, 5.0, 5.0), + "soul_bender": (4.5, 4.5, 6.5, 6.5), + "berserker": (6.5, 6.5, 4.5, 4.5), + "asura": (4.0, 5.5, 7.0, 5.5), + "ghostblade": (6.0, 6.0, 5.0, 5.0) + }, + "thief": { + "initial": (101.5, 99.5, 100.5, 98.5), + "basic": (6.0, 5.0, 6.0, 5.0), + "rogue": (6.3, 5.5, 5.2, 5.0), + "necro": (5.7, 4.5, 6.3, 5.5), + "kunoichi": (5.5, 4.5, 6.5, 5.5), + "shadow_dancer": (6.5, 5.5, 5.0, 5.0), + "growtype_6": (5.0, 4.0, 5.0, 4.0), + }, + "creator": { + "initial": (98.5, 98.5, 101.5, 101.5), + "basic": (5.0, 5.0, 6.0, 6.0), + "creator": (5.0, 5.0, 6.0, 6.0), + }, + "dark_knight": { + "initial": (101.5, 101.5, 98.5, 98.5), + "basic": (5.8, 5.8, 5.2, 5.2), + "dark_knight": (5.8, 5.8, 5.2, 5.2), + }, } # 火抗 冰抗 光抗 暗抗 @@ -598,19 +643,39 @@ def 精通计算(装备等级, 品质, 强化等级, 部位, 甲类, 属性='', } -def 获取基础属性(角色, 职业): - 角色数据 = 角色基础系数[角色] - 职业数据 = 职业基础数据[职业 + '-' + 角色] - # TODO 将93 + 当前等级 角色基础数据+94 角色成长全部+1 - 力量 = int(角色数据[4] + 角色数据[0] * min(14, 当前等级 - 1) + 94 + (职业数据[0] + 1) * max(当前等级 - 15, 0)) - 体力 = int(角色数据[5] + 角色数据[1] * min(14, 当前等级 - 1) + 94 + (职业数据[1] + 1) * max(当前等级 - 15, 0)) - 智力 = int(角色数据[6] + 角色数据[2] * min(14, 当前等级 - 1) + 94 + (职业数据[2] + 1) * max(当前等级 - 15, 0)) - 精神 = int(角色数据[7] + 角色数据[3] * min(14, 当前等级 - 1) + 94 + (职业数据[3] + 1) * max(当前等级 - 15, 0)) - return (力量, 智力, 体力, 精神) +def get_base_attributes(character, growth, current_level = 115): + ''' + 获取职业基础属性 + 返回 (力量, 体力, 智力, 精神) + ''' + # 外传特殊处理 + key = growth if character == 'extra' else character + basic = character_base.get(key, {}) + growth_info = basic.get(growth, None) + if growth_info is None: + return (0,0,0,0) + else: + basic_level = min(14, current_level - 1) + growth_level = max(current_level - 15, 0) + return tuple( + int(basic['initial'][i] + basic['basic'][i] * basic_level + growth_info[i] * growth_level) + for i in range(4) + ) -def 获取唤醒属性(): - return 335 if 当前等级 >= 75 else (145 if 当前等级 >= 15 else 0) +# def 获取基础属性(角色, 职业): +# 角色数据 = 角色基础系数[角色] +# 职业数据 = 职业基础数据[职业 + '-' + 角色] +# # TODO 将93 + 当前等级 角色基础数据+94 角色成长全部+1 +# 力量 = int(角色数据[4] + 角色数据[0] * min(14, 当前等级 - 1) + 94 + (职业数据[0] + 1) * max(当前等级 - 15, 0)) +# 体力 = int(角色数据[5] + 角色数据[1] * min(14, 当前等级 - 1) + 94 + (职业数据[1] + 1) * max(当前等级 - 15, 0)) +# 智力 = int(角色数据[6] + 角色数据[2] * min(14, 当前等级 - 1) + 94 + (职业数据[2] + 1) * max(当前等级 - 15, 0)) +# 精神 = int(角色数据[7] + 角色数据[3] * min(14, 当前等级 - 1) + 94 + (职业数据[3] + 1) * max(当前等级 - 15, 0)) +# return (力量, 智力, 体力, 精神) + + +def 获取唤醒属性(current_level = 115): + return 335 if current_level >= 75 else (145 if current_level >= 15 else 0) def 获取属性抗性基础(角色, 职业):