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 @@
-
-
+
+