diff --git a/backend/core/basic/character.py b/backend/core/basic/character.py index c4cef61a..559e0696 100644 --- a/backend/core/basic/character.py +++ b/backend/core/basic/character.py @@ -9,7 +9,7 @@ from core.basic.equipment import get_equipment, EquEffect,Equ # from core.basic.equipment import equipments # from core.basic.skill import Skill, ActiveSkill, PassiveSkill -from .formula import 获取基础属性 +from .formula import 增幅计算, 精通计算, 获取基础属性 from .roleinfo import CharacterEquipInfo, get_key_by_value # from .property import 精通计算, 角色基础, CharacterInfo @@ -105,8 +105,6 @@ class Character: """装备版本""" charEquipInfo: dict[str, 'CharacterEquipInfo'] """装备打造信息""" - equs: dict[str, 'Equ'] - """装备列表""" equ_effect: list['EquEffect'] = [] """装备效果列表""" @@ -328,7 +326,6 @@ class Character: """通过技能ID获取技能""" return skill[0] if len(skill) > 0 else None - @cache 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)] @@ -343,16 +340,6 @@ class Character: # 导入部位打造信息、装备信息、贴膜信息 self.charEquipInfo[key] = CharacterEquipInfo(info['equips'][key], self.equVersion, key) - # def calc(self): - # """计算角色属性""" - # func = [] - # for i in self.charEquipInfo: - # # 计算装备 - # temp = self.equs.get_func_by_id(self.charEquipInfo[i].id) - # func.append(temp) - # temp(self) - # pass - def getInfo(self): """返回到前端信息""" info = {} @@ -391,57 +378,6 @@ class Character: info['suits'] = suits enchats = [] emblems = [] - # 装备过滤 - # for i in self.equs.info: - # if (i.typeSon1Id == '武器' and i.typeSon2Id not in self.武器选项) or (i.name.startswith('精 · ') and self.异界 not in i.name): - # pass - # else: - # equs.append( - # { - # 'id': i.id, - # 'name': i.name, - # 'icon': i.icon, - # 'typeSon1Id': i.typeSon1Id, - # 'typeSon2Id': i.typeSon2Id, - # 'typeSon3Id': i.typeSon3Id, - # 'rarity': i.rarity, - # 'lv': i.lv, - # 'suit': i.suit, - # } - # ) - # 附魔、徽章 - # for i in self.equs.prop: - # if i.typeSon1Id == '附魔': - # enchats.append( - # { - # 'id': i.id, - # 'name': i.name, - # 'icon': i.icon, - # 'typeSon1Id': i.typeSon1Id, - # 'typeSon2Id': i.typeSon2Id, - # 'typeSon3Id': i.typeSon3Id, - # 'rarity': i.rarity, - # 'lv': i.lv, - # 'desc': i.desc, - # } - # ) - # if i.typeSon1Id == '徽章': - # emblems.append( - # { - # 'id': i.id, - # 'name': i.name, - # 'icon': i.icon, - # 'typeSon1Id': i.typeSon1Id, - # 'typeSon2Id': i.typeSon2Id, - # 'typeSon3Id': i.typeSon3Id, - # 'rarity': i.rarity, - # 'lv': i.lv, - # 'desc': i.desc, - # } - # ) - # info['enchats'] = enchats - # info['emblems'] = emblems - # info['seal'] = [i.__dict__ for i in self.equs.seal] return info def getBasicInos(self): @@ -498,13 +434,8 @@ class Character: def load_skills(self): pass - def calc(self, setInfo: dict[str, dict]): - funcs = [] - suits = [] - self.calc_init(setInfo) - # self.SetDetail(setInfo) - # 角色基础属性 - self.SetBaseStatus() + def calc_suits(self): + """套装效果统计""" suitInfo = {} equs = get_equipment(self.equVersion) # 设置装备和获取对应的套装属性 @@ -514,14 +445,87 @@ class Character: # 当前部位适用调试后的属性 partEqu = equs.equ_dict.get(cur.id).adapt(cur.adaptation) # 设置当前部位的装备 - self.equs[part] = equs.equ_dict.get(cur.id) + self.charEquipInfo[part].equInfo = equs.equ_dict.get(cur.id) # 套装属性设置 for suit in partEqu.suit: - suitInfo[suit] = partEqu.Point + suitInfo.get(suit, 0) - for suit in suitInfo: - print(equs.get_suit_info(suit, suitInfo[suit])[0].id) + 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 + # 取得点数最高的套装 + 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 = [] + for suit in suits: + if suitInfo[suit]['point'] == 0: + suits_effect += [i.id for i in equs.get_suit_info(suit, 0, suitInfo[suit]['count'])] + else: + suits_effect += [i.id for i in equs.get_suit_info(suit, suitInfo[suit]['point'], 0)] + return suits_effect + + def calc_basic(self): + """计算基础属性:防具精通、增幅、强化等""" + # 防具精通跟随装备品级 + for part in ['上衣', '头肩', '下装', '腰带', '鞋']: + cur = self.charEquipInfo[part] + equ = cur.equInfo + reinforce = self.charEquipInfo[part].reinforce + value = 精通计算(115, equ.rarity,reinforce,equ.itemDetailType,self.防具类型) + for key in self.防具精通属性: + key = get_key_by_value(key) + setattr(self, key, getattr(self, key) + value[key]) + # 115增幅强化品级固定史诗 + for part in self.charEquipInfo.keys(): + cur = self.charEquipInfo[part] + # 增幅 + if cur.reinforceType == 1: + # 增幅四维 + value = 增幅计算(115,'史诗',cur.reinforce) + self.SetStatus(STR=value,INT=value,Spirit=value,Vitality=value) + # 增幅计算 + # 武器、特殊装备强化额外效果计算 + # 传世武器强化系数取所有武器的最高的1.12 + pass + + def calc_jade(self): + """计算辟邪玉效果""" + pass + + def calc(self, setInfo: dict[str, dict]): + funcs = [] + suits = [] + self.calc_init(setInfo) + # self.SetDetail(setInfo) + # 角色基础属性 + self.SetBaseStatus() + # 辟邪玉计算 + # 精通、增幅、强化计算 + self.calc_basic() + # 单件效果计算 + # 套装效果列表 + suits_effect = self.calc_suits() + effects = get_equipment(self.equVersion).funs + for effect in suits_effect: + func = effects.suit_func_list.get(str(effect), None) + func(self) + # 徽章计算 + # 附魔计算 + + # 技能计算 skill = self.GetSkillByName('G-35L感电手雷') print(skill.getSkillDate(skill.lv),skill.skillDamage,skill.skillRation) + # return # 技能影响角色的属性,如属强、抗性等 for skill in self.skills: @@ -554,35 +558,6 @@ class Character: fun = self.equs.get_func_by_id(f'seal_{seal}') funcs.append(fun + (equ,)) # endregion - # region 套装效果 - matchSuit = [] - for i in list(set(filter(lambda x: x != '' and x is not None, suits))): - # 获取当前的套装的数量 - nums = len(list(filter(lambda x: x == i, suits))) - # 获取当前的套装信息 - suisInfos = list(filter(lambda x: x.suitID == i, self.equs.suit)) - if len(suisInfos) > 0: - matchSuit += [i.id for i in list(filter(lambda x: x.needNum <= nums, suisInfos))] - # 兼容于判断 - if suisInfos[0].compatibility is not None and suisInfos[0].compatibility != '': - for compatibility in suisInfos[0].compatibility.split(','): - # 兼容于的装备数量 - numsComp = len(list(filter(lambda x: x == compatibility, suits))) - # 大于兼容于小于兼容于加上当前套装数量 - if numsComp > 0: - matchSuit += [ - i.id - for i in list( - filter( - lambda x: x.suitID == compatibility and numsComp < x.needNum <= nums + numsComp, - self.equs.suit, - ) - ) - ] - for i in matchSuit: - fun = self.equs.get_func_by_id(f'suit_{i}') - funcs.append(fun + (None,)) - # endregion funcs.sort(key=lambda x: x[2]) for func in funcs: # 站街 diff --git a/backend/core/basic/equipment.py b/backend/core/basic/equipment.py index b8deb2b6..006e2dac 100644 --- a/backend/core/basic/equipment.py +++ b/backend/core/basic/equipment.py @@ -1,3 +1,4 @@ +import importlib from database.models import Session, EquData, SuitData from database.connect import get_db_engine as get_engine from functools import cache @@ -70,6 +71,7 @@ class Equipments: self.version = version self.engine = get_engine(version) self.equs: list[Equ] = [] + self.funs = self.init_func() self.equ_dict: dict[str, Equ] = {} self.suits: list[Suit] = [] self.suit_dict: dict[str, Suit] = {} @@ -109,6 +111,14 @@ class Equipments: self.suit_dict.setdefault(str(suit.suitId), []).append(suit) pass + def init_func(self): + """根据装备版本加载装备效果""" + try: + funs = importlib.import_module(f"core.equipment.version_{self.version}") + except Exception: + funs = importlib.import_module("core.equipment.version_0") + return funs + def get_suit_info(self, suitId: str | int, point: int = 0, count: int = 0) -> list[Suit]: """根据套装点数返回对应适用的套装属性\n 新套装只需要传入suitID和point即可,count默认为0\n @@ -141,7 +151,6 @@ class EquEffect: self.cd = cd self.data = data -@cache def get_equipment(version: str = '0') -> Equipments: # print('加载装备信息') return Equipments(version) diff --git a/backend/core/basic/formula.py b/backend/core/basic/formula.py index db879367..027b9507 100644 --- a/backend/core/basic/formula.py +++ b/backend/core/basic/formula.py @@ -25,11 +25,8 @@ def 强化技攻(强化等级, 强化类型, 部位): 增幅品级底数 = {'稀有': 10, '神器': 11, '勇者': 10, '传说': 11, '史诗': 12, '神话': 13} -def 增幅计算(装备等级, 品质, 强化等级, 版本='GF'): - if 版本 == 'GF': - if 品质 == '智慧产物': - return 0 - return int((装备等级 + 增幅品级加分[品质]) * 增幅成长系数[品质] * 增幅系数[强化等级] / 100 - 0.00000001) + 增幅品级底数[品质] + (0 if 强化等级 < 12 else 5) +def 增幅计算(装备等级, 品质, 强化等级): + return int((装备等级 + 增幅品级加分[品质]) * 增幅成长系数[品质] * 增幅系数[强化等级] / 100 - 0.00000001) + 增幅品级底数[品质] + (0 if 强化等级 < 12 else 5) # endregion @@ -179,8 +176,8 @@ def 勋章计算(装备等级, 品质, 强化等级): } -def 武器强化计算(装备等级, 品质, 强化等级, 武器类型, 类型): - 武器系数 = 武器类型系数[武器类型][0 if 类型 == '物理' else 1] +def 武器强化计算(装备等级, 品质, 强化等级, 武器类型, 类型, 默认系数=0): + 武器系数 = max(武器类型系数[武器类型][0 if 类型 == '物理' else 1], 默认系数) return int((装备等级 + 武器品级加分[品质]) / 8 * 武器成长系数[品质] * 武器强化系数[强化等级] * 武器系数) @@ -290,10 +287,9 @@ def 武器冷却惩罚(武器类型, 输出类型): # return 武器冷却惩罚系数_HF[武器类型][类型系数] -def 武器MP系数(武器类型, 输出类型, 版本='GF') -> float: +def 武器MP系数(武器类型, 输出类型) -> float: 类型系数 = 0 if 输出类型 == '物理百分比' else (1 if 输出类型 == '魔法百分比' else 2) - if 版本 == 'GF': - return MP系数[武器类型][类型系数] + return MP系数[武器类型][类型系数] # endregion diff --git a/backend/core/equipment/version_0/suit.py b/backend/core/equipment/version_0/suit.py index 20389746..cc2c0e94 100644 --- a/backend/core/equipment/version_0/suit.py +++ b/backend/core/equipment/version_0/suit.py @@ -3,13 +3,6 @@ from core.basic.equipment import EquEffect suit_func_list = {} -for i in range(0, 300): - try: - if i not in suit_func_list.keys(): - suit_func_list[i] = eval(f'suit_{i}') - except Exception: - pass - # region 潜影暗袭 @@ -530,7 +523,7 @@ def suit_37(char: Character): char.equ_effect.append(EquEffect(name='火灵安珀', icon='', cd=2, data=19200)) char.equ_effect.append(EquEffect(name='水灵阿库娅', icon='', cd=3, data=24000)) char.equ_effect.append(EquEffect(name='风灵希尔珂', icon='', cd=2, data=19200)) - char.SetBaseStatus(SpeedM=0.15) + char.SetStatus(SpeedM=0.15) char.equ_effect.append(EquEffect(name='元素释放', icon='', cd=15, data=118200)) pass @@ -615,6 +608,7 @@ def suit_40(char: Character): 一被击时,精灵之魂- 5(冷却时间1秒) - 元素释放伤害量:118,200% """ + print("~~~~~~") suit_37(char) pass @@ -676,7 +670,7 @@ def suit_42(char: Character): char.equ_effect.append(EquEffect(name='火灵安珀', icon='', cd=2, data=19200)) char.equ_effect.append(EquEffect(name='水灵阿库娅', icon='', cd=3, data=24000)) char.equ_effect.append(EquEffect(name='风灵希尔珂', icon='', cd=2, data=19200)) - char.SetBaseStatus(SpeedM=0.15) + char.SetStatus(SpeedM=0.15) char.equ_effect.append(EquEffect(name='元素释放', icon='', cd=10, data=181920)) char.equ_effect.append(EquEffect(name='精灵女王提泰妮娅', icon='', cd=5, data=47520)) pass @@ -4109,3 +4103,10 @@ def suit_252(char: Character): # endregion + +for i in range(0, 300): + try: + if str(i) not in suit_func_list.keys(): + suit_func_list[str(i)] = eval(f'suit_{i}') + except Exception: + pass \ No newline at end of file diff --git a/frontend/src/pages/Character/Equipment/Universal.vue b/frontend/src/pages/Character/Equipment/Universal.vue index 7dffcf34..033c8191 100644 --- a/frontend/src/pages/Character/Equipment/Universal.vue +++ b/frontend/src/pages/Character/Equipment/Universal.vue @@ -2,15 +2,15 @@