c1_lua/lua/app/userdata/equip/equip_data.lua
2025-10-30 20:12:43 +08:00

1025 lines
24 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local EquipData = class("EquipData", BaseData)
local EquipEntity = require "app/userdata/equip/equip_entity"
local EquipCfg = ConfigManager:getConfig("equip")
local EquipLevelCfg = ConfigManager:getConfig("equip_level")
local EquipRefineCfg = ConfigManager:getConfig("equip_refine")
local EquipResonateCfg = ConfigManager:getConfig("equip_resonate")
function EquipData:setDirty()
self.data.isDirty = not self.data.isDirty
end
function EquipData:setDirtyRefineSuccess()
self.data.isDirtyRefineSuccess = not self.data.isDirtyRefineSuccess
end
function EquipData:setDirtyRefineFail()
self.data.isDirtyRefineFail = not self.data.isDirtyRefineFail
end
function EquipData:setDirtyResolve()
self.data.isDirtyResolve = not self.data.isDirtyResolve
end
function EquipData:ctor()
self.data.isDirty = false
self.data.isDirtyRefineSuccess = false
self.data.isDirtyRefineFail = false
end
function EquipData:clear()
self.allEquipsCount = 0
end
function EquipData:init(data)
data = data or GConst.EMPTY_TABLE
if EDITOR_MODE then
Logger.logHighlight("装备数据")
Logger.printTable(data)
end
if not data.equips then
return
end
self.slotIdRedPoint = {}
self.allEquips = {}
self.allEquipsCount = 0
if data.equips then
for i, equip in pairs(data.equips) do
self:addEquip(equip)
end
end
-- int64 equip_uid = 1;
-- int32 level = 2;
-- int32 refine = 3;
-- int64 refine_fail = 4;
self.slots = data.slots or {}
end
-- 武器功能是否开启
function EquipData:isWeaponOpen(showToast)
if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.EQUIP_WEAPON, not showToast) then
return false
end
return true
end
--@region 配置
-- 获取配置
function EquipData:getConfig(id)
if id then
return EquipCfg[id]
else
return EquipCfg
end
end
-- 获取强化配置
function EquipData:getLevelConfig(id)
if id then
return EquipLevelCfg[id]
else
return EquipLevelCfg
end
end
-- 获取精炼配置
function EquipData:getRefineConfig(id)
if id then
return EquipRefineCfg[id]
else
return EquipRefineCfg
end
end
-- 获取共鸣配置
function EquipData:getResonateConfig(id)
if id then
return EquipResonateCfg[id]
else
return EquipResonateCfg
end
end
-- 部位 1-6分别对应头盔护腕衣服裤子鞋子手套
function EquipData:getPart(id)
return self:getConfig(id).type
end
-- 装备图标
function EquipData:getIconRes(id)
return tostring(self:getConfig(id).icon)
end
-- 品质(颜色)
function EquipData:getQlt(id)
return self:getConfig(id).qlt
end
-- 星级
function EquipData:getStar(id)
return self:getConfig(id).star
end
-- 基础属性
function EquipData:getBaseAttr(id)
return self:getConfig(id).base_attr
end
-- 装备名字
function EquipData:getName(id)
return I18N:getText("equip", id, "name")
end
--附加属性
function EquipData:getExtraAttr(id, index)
return self:getConfig(id)["extra_attr_" .. index]
end
--精炼额外数值总和
function EquipData:getRefineAttrAdd(refine, attrName)
local attrAll = {type = attrName, num = 0}
for i = 1, refine do
if i <= refine then
local value = self:getRefineAttr(i, attrName)
attrAll.num = attrAll.num + (value or 0)
end
end
return attrAll
end
--对应精炼等级的额外数值
function EquipData:getRefineAttr(refine, attrName)
local cfg = self:getRefineConfig(refine)
if attrName == "attr_atk" then
return cfg.extra_attr_add_1
elseif attrName == "attr_hp" then
return cfg.extra_attr_add_2
elseif attrName == "attr_normal_hurtp" then
return cfg.extra_attr_add_3
elseif attrName == "attr_skill_hurtp" then
return cfg.extra_attr_add_4
end
end
--@endregion
--@region 装备基础
function EquipData:addEquip(equip, itemGetType, noDirty)
if equip == nil then
return
end
if self.allEquips[equip.uid] == nil then
self.allEquipsCount = self.allEquipsCount + 1
end
self.allEquips[equip.uid] = self:createEquipEntity(equip)
if itemGetType then
BIReport:postEquipGet(equip.uid, equip.cfg_id, itemGetType)
end
if not noDirty then
self:setDirty()
end
end
function EquipData:createEquipEntity(equip)
return EquipEntity:create(equip)
end
function EquipData:getAllEquips(part, qlt, star, useHeroId)
local list = {}
for _, v in pairs(self.allEquips) do
local matchAll = true -- 默认全部匹配
-- 品质+星级筛选(必须同时满足)
if qlt ~= nil then
if qlt ~= 0 then
-- 先判断品质,再判断星级
if not (v:getQlt() <= qlt and (v:getQlt() ~= qlt or v:getStar() <= star)) then
matchAll = false
end
end
end
-- 部位筛选
if matchAll and part ~= nil and part ~= 0 then
if v:getPart() ~= part then
matchAll = false
end
end
-- 使用状态筛选
if matchAll and useHeroId ~= nil then
local heroId = self:getEquipUseHero(v:getUid())
if heroId and heroId == useHeroId then
matchAll = false
end
end
-- 只有全部条件满足才加入
if matchAll then
table.insert(list, v)
end
end
return list
end
-- 获取所有装备数据
function EquipData:getAllEquipsSort(part, qlt, star, useHeroId)
local list = self:getAllEquips(part, qlt, star, useHeroId)
return self:sortEquipsList(list)
end
--排序
function EquipData:sortEquipsList(list)
for _, equip in ipairs(list) do
equip._sort = equip:getPower() * 10000000 + (10000000 - equip:getUid())
end
-- 先品质后等级排序
table.sort(list, function(equip1, equip2)
-- 权重相同的情况下,再单独比较评分(从高到低)
-- 评分也相同则按UID排序
return equip1._sort > equip2._sort
end)
return list
end
function EquipData:getEquipByUid(uid)
if self.allEquips[uid] then
return self.allEquips[uid]
end
end
function EquipData:getEquipByCfgId(equipId)
if equipId == nil then
return
end
local entity = EquipEntity:create({cfg_id = equipId, extra_attrs = {}})
return entity
end
--endregion
--@region 穿戴
--装备穿戴
function EquipData:onWearSuccess(slotId, uids)
for _, uid in ipairs(uids) do
local equip = self:getEquipByUid(uid)
local part = equip:getPart()
if part then
local oldUid = self.slots[slotId].parts[part].equip_uid
for i,info in ipairs(self.slots) do
if i ~= slotId then
if info.parts[part].equip_uid == uid then
info.parts[part].equip_uid = oldUid
end
end
end
self.slots[slotId].parts[part].equip_uid = uid
end
end
self:setDirty()
end
function EquipData:getEquipMaxScore(slotId, part)
local equip = nil
local maxScore = 0
local useUid = self:getPartEquipUid(slotId, part)
if useUid ~= 0 then
local useEquip = self:getEquipByUid(useUid)
maxScore = useEquip:getPower()
end
for i, v in pairs(self.allEquips) do
if v:getPart() == part then
local isEquip = false
for k2, info in ipairs(self.slots) do
if info.parts[part] and info.parts[part].equip_uid == v:getUid() then
isEquip = true
break
end
end
if not isEquip then
local score = v:getPower()
if score > maxScore then
equip = v
maxScore = score
end
end
end
end
return equip
end
--获取对应位置的装备Id
function EquipData:getPartEquipUid(slotId, part)
local parts = self.slots[slotId].parts
if parts then
if part == nil then
return parts
else
local partInfo = parts[part]
if partInfo then
return partInfo.equip_uid
end
end
end
return 0
end
--@endregion
--@region 装备强化
function EquipData:getLevelCost(refine)
local cfg = self:getLevelConfig(refine)
if cfg then
return cfg.cost
end
end
-----获取强化等级
function EquipData:getPartLv(slotId, part)
local parts = self.slots[slotId].parts
if parts then
local partInfo = parts[part]
if partInfo then
return partInfo.level
end
end
return 0
end
function EquipData:isPartLvMax(slotId, part)
local lv = self:getPartLv(slotId, part)
return lv >= #self:getLevelConfig()
end
--基础属性额外强化值
function EquipData:getBaseAttrLvAdd(attrType, lv)
local baseAttrAdd = 0
for i = 1, lv do
if attrType == "attr_atk" then
baseAttrAdd = baseAttrAdd + self:getLevelConfig(i).base_attr_add[1]
else
baseAttrAdd = baseAttrAdd + self:getLevelConfig(i).base_attr_add[2]
end
end
return baseAttrAdd
end
function EquipData:onUpgradeSuccess(slotId, upgraded)
upgraded = upgraded or {}
for part, lv in pairs(upgraded) do
if self.slots[slotId].parts[part] then
self.slots[slotId].parts[part].level = lv
end
end
self:setDirty()
end
--@endregion
--@region 精炼
function EquipData:getRefineCost(refine)
local cfg = self:getRefineConfig(refine)
if cfg then
return cfg.cost
end
end
function EquipData:getRefineNeedLevel(refine)
local cfg = self:getRefineConfig(refine)
if cfg then
return cfg.equip_level
end
end
--获取精炼等级
function EquipData:getPartRefine(slotId, part)
local parts = self.slots[slotId].parts
if parts then
local partInfo = parts[part]
if partInfo then
return partInfo.refine
end
end
return 0
end
function EquipData:isRefineLvMax(slotId, part)
local lv = self:getPartRefine(slotId, part)
return lv >= #self:getRefineConfig()
end
-- 精炼成功概率
function EquipData:getPartRefineFailPro(slotId, part)
local parts = self.slots[slotId].parts
if parts then
local partInfo = parts[part]
if partInfo then
local cfgRefine = self:getRefineConfig(partInfo.refine + 1)
if cfgRefine then
return (cfgRefine.base_chance + partInfo.refine_fail * cfgRefine.chance_fail) / 100
end
end
end
return 0
end
function EquipData:onRefineSuccess(slotId, part, info)
local offset = 0
local refine = self:getPartRefine(slotId, part)
if refine < info.refine then
local refine = self.slots[slotId].parts[part].refine
self.slots[slotId].parts[part].refine = refine + 1
self.slots[slotId].parts[part].refine_fail = 0
offset = offset + 1
-- self:addPlayEffectParts(part)
self:setDirtyRefineSuccess()
else
local fail = self.slots[slotId].parts[part].refine_fail
self.slots[slotId].parts[part].refine_fail = fail + 1
self:setDirtyRefineFail()
end
end
-- function EquipData:addPlayEffectParts(part)
-- if self.lvUpSuccess == nil then
-- self.lvUpSuccess = {}
-- end
-- table.insert(self.lvUpSuccess, part)
-- end
-- function EquipData:getPlayEffectParts()
-- return table.refCopy(self.lvUpSuccess or {})
-- end
-- function EquipData:clearPlayEffectParts()
-- self.lvUpSuccess = {}
-- end
--@endregion
--@region 套装 共鸣
function EquipData:getResonateList(type)
if self.listResonate == nil then
self.listResonate = {}
local list = self:getResonateConfig()
for i,v in pairs(list) do
if self.listResonate[v.type] == nil then
self.listResonate[v.type] = {}
end
v.id = i
table.insert(self.listResonate[v.type], v)
end
for _,l in ipairs(self.listResonate) do
table.sort(l, function (a, b)
return a.id < b.id
end)
end
end
if self.listResonate[type] then
return self.listResonate[type]
end
end
function EquipData:getSlotAllAttr(slotId)
local attr = {}
for part = 1, 6 do
local level = self:getPartLv(slotId, part)
local refine = self:getPartRefine(slotId, part)
for i = 1, level do
local cfg = self:getLevelConfig(i)
if attr[cfg.base_attr_add.type] then
attr[cfg.base_attr_add.type] = attr[cfg.base_attr_add.type] + cfg.base_attr_add.num
else
attr[cfg.base_attr_add.type] = cfg.base_attr_add.num
end
end
local uid = self:getPartEquipUid(slotId, part)
if uid ~= 0 then
local equipEntity = self:getEquipByUid(uid)
local equipAttrs = equipEntity:getExtraMap()
local baseAttrs = equipEntity:getBaseAttr()
if attr[baseAttrs.type] then
attr[baseAttrs.type] = attr[baseAttrs.type] + baseAttrs.num
else
attr[baseAttrs.type] = baseAttrs.num
end
for i,extraAttr in pairs(equipAttrs) do
local name = GFunc.getAttrNameById(extraAttr.id)
if attr[name] then
attr[name] = attr[name] + extraAttr.value
else
attr[name] = extraAttr.value
end
local nowAttr = self:getRefineAttrAdd(refine, extraAttr.id)
if nowAttr then
if attr[nowAttr.type] then
attr[nowAttr.type] = attr[nowAttr.type] + nowAttr.num
else
attr[nowAttr.type] = nowAttr.num
end
end
end
end
end
local resonateLevel = self:getResonateLevel(1, slotId)
local list = self:getResonateList(1)
for i,v in ipairs(list) do
if i <= resonateLevel then
if attr[v.attr.type] then
attr[v.attr.type] = attr[v.attr.type] + v.attr.num
else
attr[v.attr.type] = v.attr.num
end
else
break
end
end
local resonateQlt = self:getResonateLevel(2, slotId)
list = self:getResonateList(2)
for i,v in ipairs(list) do
if i <= resonateQlt then
if attr[v.attr.type] then
attr[v.attr.type] = attr[v.attr.type] + v.attr.num
else
attr[v.attr.type] = v.attr.num
end
else
break
end
end
local resonateRefine = self:getResonateLevel(3, slotId)
list = self:getResonateList(3)
for i,v in ipairs(list) do
if i <= resonateRefine then
if attr[v.attr.type] then
attr[v.attr.type] = attr[v.type] + v.attr.num
else
attr[v.attr.type] = v.attr.num
end
else
break
end
end
return attr
end
function EquipData:getResonateMaxLevel(type)
local list = self:getResonateList(type)
return list and #list or 0
end
function EquipData:getResonateLevelValue(type, value, value2)
local list = self:getResonateList(type)
local lv = 0
local nextLv = 0
local attrs = {}
local attrNexts = {}
for i,v in ipairs(list) do
if type == 1 or type == 3 then
if v.parameter[1] <= value then
lv = i
for _, vv in ipairs(v.attr) do
attrs[vv.type] = (attrs[vv.type] or 0) + vv.num
end
else
nextLv = v.parameter
for _, vv in ipairs(v.attr) do
attrNexts[vv.type] = (attrNexts[vv.type] or 0) + vv.num
end
break
end
elseif type == 2 then
local isTrue = false
if v.parameter[1] < value then
isTrue = true
elseif v.parameter[1] == value and v.parameter[2] <= value2 then
isTrue = true
end
if isTrue then
lv = i
for _, vv in ipairs(v.attr) do
attrs[vv.type] = (attrs[vv.type] or 0) + vv.num
end
else
nextLv = v.parameter
for _, vv in ipairs(v.attr) do
attrNexts[vv.type] = (attrNexts[vv.type] or 0) + vv.num
end
break
end
end
end
return lv, nextLv, attrs, attrNexts, table.nums(list)
end
function EquipData:getResonateLevel(type, slotId)
if type == 1 then
local minLv = 999
for i = 1, 6 do
local level = self:getPartLv(slotId, i)
if level < minLv then
minLv = level
end
end
return self:getResonateLevelValue(type, minLv)
elseif type == 2 then
local qlt = 99
local star = 99
for i = 1, 6 do
local uid = self:getPartEquipUid(slotId, i)
local equip = self:getEquipByUid(uid)
if equip == nil then
qlt = 0
star = 0
break
end
local q = equip:getQlt()
local s = equip:getStar()
if qlt > q then
qlt = q
star = s
elseif qlt == q then
if star > s then
qlt = q
star = s
end
end
end
return self:getResonateLevelValue(type, qlt, star)
elseif type == 3 then
local minRefine = 999
for i = 1, 6 do
local refine = self:getPartRefine(slotId, i)
if refine < minRefine then
minRefine = refine
end
end
return self:getResonateLevelValue(type, minRefine)
end
end
function EquipData:getEquipUseHero(uid)
local equip = self:getEquipByUid(uid)
local formation = DataManager.FormationData:getStageFormation()
local part = equip:getPart()
for i,info in ipairs(self.slots) do
if info.parts[part] and info.parts[part].equip_uid and info.parts[part].equip_uid == uid then
return formation[i]
end
end
end
--@endregion
--@region 装备分解
-- 分解额外返还
function EquipData:getResolveReward(id)
return self:getConfig(id).decompose
end
function EquipData:getAllEquipsSortInverted(part, qlt, star, use)
local list = self:getAllEquips(part, qlt, star, use)
return self:reverseTableInPlace(self:sortEquipsList(list))
end
function EquipData:reverseTableInPlace(t)
local i, j = 1, #t
while i < j do
t[i], t[j] = t[j], t[i] -- 交换元素
i = i + 1
j = j - 1
end
return t
end
function EquipData:onResolveSuccess(uids)
for i, uid in ipairs(uids) do
if self.allEquips[uid] then
self.allEquips[uid] = nil
self.allEquipsCount = self.allEquipsCount - 1
end
end
self:setDirtyResolve()
self:setDirty()
end
function EquipData:getLowestFiveGradeEquips()
-- 1. 使用三重结构避免重复
local gradeMap = {} -- { [qlt] = { [star] = {equips} } }
local gradeSet = {} -- 用于去重 { ["qlt-star"] = true }
local gradeList = {} -- 最终排序列表
for _, equip in pairs(self.allEquips) do
local qlt = equip:getQlt()
local star = equip:getStar()
local key = qlt.."-"..star -- 去重key
-- 初始化数据结构
if not gradeMap[qlt] then
gradeMap[qlt] = {}
end
if not gradeMap[qlt][star] then
gradeMap[qlt][star] = {equips = {}}
-- 只有首次遇到该组合时才加入排序列表
if not gradeSet[key] then
gradeSet[key] = true
table.insert(gradeList, {qlt = qlt, star = star})
end
end
table.insert(gradeMap[qlt][star].equips, equip)
end
-- 2. 排序(保持不变)
table.sort(gradeList, function(a, b)
return a.qlt < b.qlt or (a.qlt == b.qlt and a.star < b.star)
end)
-- 3. 构建结果
local gradeGroups = {}
local allEquips = {}
for i = 1, math.min(5, #gradeList) do
local qlt = gradeList[i].qlt
local star = gradeList[i].star
local validEquips = {}
-- 筛选未使用的装备
for _, equip in ipairs(gradeMap[qlt][star].equips) do
if not self:getEquipUseHero(equip:getUid()) then
table.insert(validEquips, equip)
table.insert(allEquips, equip)
end
end
-- 只有存在有效装备时才加入结果
if #validEquips > 0 then
table.insert(gradeGroups, {
qlt = qlt,
star = star,
equips = validEquips
})
end
end
return gradeGroups, allEquips
end
--@endregion
--region 红点
--装备可穿戴红点
function EquipData:hasEquipRedPoint(slotId)
if not self:isOpen() then
return false
end
return self:hasEquipRedPointBySlotId(slotId)
end
function EquipData:hasEquipRedPointBySlotId(slotId)
if slotId == nil then
return false
end
local redPoint = self.slotIdRedPoint[slotId]
if redPoint ~= nil then
return redPoint
end
if self:hasEquipWearRedPoint(slotId) then
redPoint = true
elseif self:hasEquipGrowthRedPointBySlotId(slotId) then
redPoint = true
else
redPoint = false
end
self.slotIdRedPoint[slotId] = redPoint
self.slotIdRedPointDirty = true
return redPoint
end
function EquipData:isOpen(showToast)
if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.HERO_EQUIP, not showToast) then
return false
end
return true
end
function EquipData:hasEquipWearRedPointById(slotId)
if not self:isOpen() then
return false
end
return self:hasEquipWearRedPoint(slotId)
end
function EquipData:hasEquipWearRedPointByPart(slotId, part)
if not self:isOpen() then
return false
end
if self.allEquipsCount <= 0 then
return false
end
if self:getEquipMaxScore(slotId, part) then
return true
elseif self:hasEquipEnhanceRedPoint(slotId, part) then
return true
elseif self:hasEquipRefineRedPoint(slotId, part) then
return true
end
return false
end
function EquipData:hasEquipWearRedPoint(slotId)
if self.allEquipsCount <= 0 then
return false
end
if slotId then
for i = 1, 6 do
if self:getEquipMaxScore(slotId, i) then
return true
end
end
end
return false
end
--装备养成红点
function EquipData:hasEquipGrowthRedPoint(slotId)
if self.allEquipsCount <= 0 then
return false
end
return self:hasEquipGrowthRedPointBySlotId(slotId)
end
function EquipData:hasEquipGrowthRedPointBySlotId(slotId)
if slotId == nil then
return false
end
for part = 1, 6 do
if self:hasEquipEnhanceRedPoint(slotId, part) then
return true
elseif self:hasEquipRefineRedPoint(slotId, part) then
return true
end
end
return false
end
function EquipData:hasEquipGrowthRedPointBySlotIdAndPartId(slotId, part)
if slotId == nil then
return false
end
if self:hasEquipEnhanceRedPoint(slotId, part) then
return true
elseif self:hasEquipRefineRedPoint(slotId, part) then
return true
end
return false
end
-- --强化红点
-- function EquipData:hasEquipGrowthEnhanceRedPoint(heroId)
-- local heroEntity = DataManager.HeroData:getHeroById(heroId)
-- local slotId = heroEntity:getMatchType()
-- if slotId then
-- for part = 1, 6 do
-- if self:hasEquipEnhanceRedPoint(slotId, part) then
-- return true
-- end
-- end
-- end
-- return false
-- end
-- --精炼红点
-- function EquipData:hasEquipGrowthRefineRedPoint(heroId)
-- local heroEntity = DataManager.HeroData:getHeroById(heroId)
-- local slotId = heroEntity:getMatchType()
-- if slotId then
-- for part = 1, 6 do
-- if self:hasEquipRefineRedPoint(slotId, part) then
-- return true
-- end
-- end
-- end
-- return false
-- end
--装备升级红点
function EquipData:hasEquipEnhanceRedPoint(slotId, part)
if self.allEquipsCount <= 0 then
return false
end
local level = self:getPartLv(slotId, part)
local itemCost = self:getLevelCost(level + 1)
if itemCost ~= nil then
local costId = GFunc.getRewardId(itemCost)
local costNum = GFunc.getRewardNum(itemCost)
local count = DataManager.BagData.ItemData:getItemNumById(costId)
if costNum <= count then
return true
end
end
return false
end
function EquipData:hasEquipRefineRedPoint(slotId, part)
if self.allEquipsCount <= 0 then
return false
end
local refine = self:getPartRefine(slotId, part)
local needLevel = self:getRefineNeedLevel(refine + 1)
if needLevel == nil or needLevel > self:getPartLv(slotId, part) then
return false
end
local itemCost = self:getRefineCost(refine + 1)
if itemCost ~= nil then
local costId = GFunc.getRewardId(itemCost)
local costNum = GFunc.getRewardNum(itemCost)
local count = DataManager.BagData.ItemData:getItemNumById(costId)
if costNum <= count then
return true
end
end
return false
end
-- --未穿戴装备有五十件以上的红点
-- function EquipData:hasEquipUnWearRedPoint()
-- local wearList = {}
-- for slotId = 1, 6 do
-- for part = 1, 6 do
-- local uid = self:getPartEquipUid(slotId, part)
-- if uid ~= 0 then
-- wearList[uid] = true
-- end
-- end
-- end
-- local count = 0
-- for _, equip in pairs(self.allEquips) do
-- if wearList[equip:getUid()] == nil then
-- count = count + 1
-- if count >= 50 then
-- return true
-- end
-- end
-- end
-- return false
-- end
--endregion
--@region 属性
function EquipData:getEquipAttrBySlotId(heroId, slotId)
if not self.slots[slotId] or not self.slots[slotId].parts then
return {}
end
-- local curFormation = DataManager.FormationData:getStageFormation()
-- if curFormation[slotId] ~= heroId then
-- return {}
-- end
local allAttr = {}
for part, info in ipairs(self.slots[slotId].parts) do
if info.equip_uid > 0 then
local equip = self:getEquipByUid(info.equip_uid)
if equip then
local attr = equip:getAllAttr()
for k, v in pairs(attr) do
allAttr[k] = (allAttr[k] or 0) + v
end
-- 升级属性
local level = self:getPartLv(slotId, part)
local baseType = equip:getBaseAttr().type
allAttr[baseType] = (attr[baseType] or 0) + self:getBaseAttrLvAdd(baseType, level)
-- for i = 1, level do
-- local cfg = self:getLevelConfig(i)
-- allAttr[cfg.base_attr_add.type] = (attr[cfg.base_attr_add.type] or 0) + self:getBaseAttrLvAdd(cfg.base_attr_add.type, level)
-- self:getBaseAttrLvAdd(attrType, lv)
-- end
-- 精炼属性
local equipAttrs = equip:getExtraMap()
local refine = self:getPartRefine(slotId, part)
if refine > 0 then
for _, extraAttr in pairs(equipAttrs) do
local attrName = GFunc.getAttrNameById(extraAttr.id)
-- allAttr[attrName] = (allAttr[attrName] or 0) + extraAttr.value
local nowAttr = self:getRefineAttrAdd(refine, attrName)
allAttr[attrName] = (allAttr[attrName] or 0) + nowAttr.num
end
end
end
end
end
-- 共鸣
for i = 1, 3 do
local lv = self:getResonateLevel(i, slotId)
local list = self:getResonateList(i)
for ii, vv in ipairs(list) do
if ii <= lv then
for _, vvv in ipairs(vv.attr or {}) do
allAttr[vvv.type] = (allAttr[vvv.type] or 0) + vvv.num
end
else
break
end
end
end
return allAttr
end
--@endregion
return EquipData