This commit is contained in:
2025-03-22 22:40:36 +08:00
parent c6b6b02743
commit 3b4a503f01
5 changed files with 116 additions and 128 deletions
+80 -105
View File
@@ -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:
# 站街
+10 -1
View File
@@ -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)
+6 -10
View File
@@ -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
+10 -9
View File
@@ -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
@@ -2,15 +2,15 @@
<template>
<div class="flex flex-wrap gap-4px content-start" :style="{width: `${rowCount * 32}px`}">
<template v-for="(equ,_) in equs" :key="_">
<EquipmentIcon :equipment="equ" />
<template v-for="(equip,_) in equs" :key="_">
<EquipmentIcon :inactive="configStore.config.equips[equip?.itemDetailType ?? '']?.id != equip?.id" :equipment="equip" @click="chooseEqu(equip)" />
</template>
</div>
</template>
<script lang="ts" setup>
import type { IEquipment } from '@/api/info/type'
import { useInfoStore } from '@/stores'
import { useConfigStore, useInfoStore } from '@/stores'
import { getImageURL } from '@/utils/images'
import EquipmentIcon from '@/components/dnf/Equipment/Icon/index.vue'
@@ -20,6 +20,7 @@ const props = defineProps<{
const rowCount = Math.max(props.rowCount ?? 0, 14)
const infoStore = useInfoStore()
const configStore = useConfigStore()
const equs = computed(() => {
const items = infoStore.equips.filter(
@@ -38,4 +39,10 @@ const equs = computed(() => {
})
return res
})
const chooseEqu = async(equip: IEquipment | undefined) => {
if (equip && configStore.config.equips[equip.itemDetailType]) {
configStore.config.equips[equip.itemDetailType].id = equip.id
}
}
</script>