Files
Main/Assets/GameAssets/Resources/Lua/Logic/HolyEquip/HolyEquipSystem.lua
2025-01-25 04:38:09 +08:00

684 lines
22 KiB
Lua

------------------------------------------------
--作者: yangqf
--日期: 2021-03-18
--文件: HolyEquipSystem.lua
--模块: HolyEquipSystem
--描述: 圣装系统
------------------------------------------------
local AUTO_SPLIT_LEVEL = "HolyEquipSplitLevel"
local AUTO_SPLIT_QUALITY = "HolyEquipSplitQuality"
local L_HolyEquipSoul = require "Logic.HolyEquip.HolyEquipSoul"
local L_HolyEquipPart = require "Logic.HolyEquip.HolyEquipPart"
local L_HolyEquipSuitCfg = require "Logic.HolyEquip.HolyEquipSuitCfg"
local L_HolyEquip = CS.Thousandto.Code.Logic.HolyEquip
local L_RedPointCustomCondition = CS.Thousandto.Code.Logic.RedPointCustomCondition
local L_RedPointItemCondition = CS.Thousandto.Code.Logic.RedPointItemCondition
local HolyEquipSystem = {
--装备栏的数据
EquipDic = Dictionary:New(),
--背包中的数据
BagList = List:New(),
--临时列表,用于返回给外部
TmpList = List:New(),
--是否自动分解
AutoFenJie = false,
--自动分解的等级
AutoFenJieLevel = 0,
--自动分解的品质
AutoFenJieQuality = 0,
--圣魂列表
SoulList = List:New(),
--套装属性配置
SuitCfgs = Dictionary:New(),
--套装部位配置
SuitPartCfg = nil,
SuitTypePartCfg = nil,
--总属性
AllProps = nil,
--总战力
AllPower = 0,
--当前套装属性
CurSuitPro = nil,
--当前套装总属性加成
CurMultipleSuitPro = nil,
}
function HolyEquipSystem:Initialize()
self.AutoFenJie = true
self.AutoFenJieLevel = PlayerPrefs.GetInt(AUTO_SPLIT_LEVEL, 3)
self.AutoFenJieQuality = PlayerPrefs.GetInt(AUTO_SPLIT_QUALITY, 4)
self.AllProps = {}
self.SoulList:Clear()
local _gCfg = DataConfig.DataGlobal[GlobalName.Equip_Holy_att_item]
if _gCfg ~= nil then
local _paramArray = Utils.SplitStrByTableS(_gCfg.Params, {';', '_'})
for i = 1, #_paramArray do
local _itemId = _paramArray[i][1]
local _maxCount = _paramArray[i][2]
self.SoulList:Add(L_HolyEquipSoul:New(_itemId, _maxCount))
end
end
self.SuitCfgs:Clear()
local _func = function(k, v)
self.SuitCfgs:Add(k, L_HolyEquipSuitCfg:New(v))
end
DataConfig.DataEquipHolySuit:Foreach(_func)
self.SuitPartCfg = List:New()
self.SuitTypePartCfg = Dictionary:New()
local _func2 = function(k,v)
local _partParams = Utils.SplitNumber(v.PartsList, '_')
local _allList = List:New()
local _list1 = List:New()
for i = 1, 6 do
_list1:Add(_partParams[i])
_allList:Add(_partParams[i])
end
local _list2 = List:New()
for i = 7, 11 do
_list2:Add(_partParams[i])
_allList:Add(_partParams[i])
end
self.SuitPartCfg:Add(_list1)
self.SuitPartCfg:Add(_list2)
self.SuitTypePartCfg:Add(k, _allList)
end
DataConfig.DataEquipHolyType:Foreach(_func2)
self.CurSuitPro = {}
self.CurMultipleSuitPro = {}
end
function HolyEquipSystem:UnInitialize()
end
function HolyEquipSystem:SetAutoFenJie(value)
if self.AutoFenJie ~= value then
self.AutoFenJie = value
self:SendAutoSplitMsg()
end
end
function HolyEquipSystem:SetAutoFenJieLevel(value)
if self.AutoFenJieLevel ~= value then
self.AutoFenJieLevel = value
PlayerPrefs.SetInt(AUTO_SPLIT_LEVEL, self.AutoFenJieLevel)
self:SendAutoSplitMsg()
end
end
function HolyEquipSystem:SetAutoFenJieQuality(value)
if self.AutoFenJieQuality ~= value then
self.AutoFenJieQuality = value
PlayerPrefs.GetInt(AUTO_SPLIT_QUALITY, self.AutoFenJieQuality)
self:SendAutoSplitMsg()
end
end
--获取身上穿戴的装备
function HolyEquipSystem:GetDressEquip(part)
return self.EquipDic[part]
end
--获取可分解物品列表
function HolyEquipSystem:GetCanFenJieList()
self.TmpList:Clear()
local _lp = GameCenter.GameSceneSystem:GetLocalPlayer()
if _lp ~= nil then
for i = 1, #self.BagList do
local _equip = self.BagList[i]
if _equip.CanFenJie then
if string.find(_equip:GetOcc(), tostring(_lp.IntOcc)) == nil then
--职业不匹配
self.TmpList:Add(_equip)
else
local _dressEquip = self:GetDressEquip(_equip.Part)
if _dressEquip ~= nil and _dressEquip.Equip ~= nil and _dressEquip.Equip.Power >= _equip.Power then
self.TmpList:Add(_equip)
end
end
end
end
end
return self.TmpList
end
--获取套装属性配置
function HolyEquipSystem:GetSuitCfg(suitID)
return self.SuitCfgs[suitID]
end
--获取套装被激活的件数
function HolyEquipSystem:GetSuitActiveCounts(suitID)
local _result = List:New()
for k, v in pairs(self.EquipDic) do
local _equip = v.equip
if _equip ~= nil then
local _iterActive = _equip.ActiveSuits:GetEnumerator()
while _iterActive:MoveNext() do
if _iterActive.Current.Value == suitID and not _result:Contains(iterActive.Current.Key) then
_result:Add(iterActive.Current.Key)
end
end
end
end
return _result
end
--根据DBID获取背包中的圣装
function HolyEquipSystem:GetEquipByDBID(uid)
for i = 1, #self.BagList do
local _equip = self.BagList[i]
if _equip.DBID == uid then
return self.BagList[i]
end
end
return nil
end
--获取可合成的装备列表
function HolyEquipSystem:GetCanHeChengEquipList()
self.TmpList:Clear()
local _occ = tostring(GameCenter.GameSceneSystem:GetLocalPlayer().Occ)
for k, v in pairs(self.EquipDic) do
if v.Equip ~= nil then
local _cfg = DataConfig.DataEquipHolySynthesis[v.Equip.CfgID]
if _cfg ~= nil then
self.TmpList:Add(v.Equip)
end
end
end
for i = 1, #self.BagList do
local _item = self.BagList[i]
local _cfg = DataConfig.DataEquipHolySynthesis[_item.CfgID]
if _cfg ~= nil then
local _equipCfg = DataConfig.DataEquip[_cfg.Id]
if _equipCfg ~= nil and string.find(_equipCfg.Gender, _occ) then
self.TmpList:Add(_item)
end
end
end
return self.TmpList
end
--获取合成自动放入的圣装id
function HolyEquipSystem:GetCanMergeItemID()
local _list = self:GetCanHeChengEquipList()
local _itemCountDic = {}
for i = 1, #_list do
local _cfgID = _list[i].CfgID
local _oriCount = _itemCountDic[_cfgID]
if _oriCount == nil then
_oriCount = 0
end
if (_oriCount + 1) >= 2 then
--判断材料是否足够
local _cfg = DataConfig.DataEquipHolySynthesis[_cfgID]
if _cfg.JoinItem ~= nil and string.len(_cfg.JoinItem) > 0 then
local _itemPar = Utils.SplitNumber(_cfg.JoinItem, '_')
if GameCenter.ItemContianerSystem:GetItemCountFromCfgId(_itemPar[1]) >= _itemPar[2] then
return _list[i].DBID
end
else
return _list[i].DBID
end
else
_itemCountDic[_cfgID] = _oriCount + 1
end
end
return 0
end
--判断某个类型的圣装是否有红点
function HolyEquipSystem:IsHasIntensifyRedPointByType(type)
local _parts = self.SuitTypePartCfg[type]
if _parts ~= nil then
for i = 1, #_parts do
if GameCenter.RedPointSystem:OneConditionsIsReach(FunctionStartIdCode.HolyEquipIntensify, _parts[i]) then
return true
end
end
end
return false
end
--根据类型获取装备列表
function HolyEquipSystem:GetEquipListByType(type)
local _result = List:New()
local _parts = self.SuitTypePartCfg[type]
if _parts ~= nil then
for i = 1, #_parts do
local _equip = self:GetDressEquip(_parts[i])
if _equip ~= nil and _equip.Equip ~= nil then
_result:Add(_equip)
end
end
end
return _result
end
--套装排序
local L_SuitSort = function(left, right)
if right.Grade ~= left.Grade then
return right.Grade < left.Grade
end
return right.Quality < left.Quality
end
function HolyEquipSystem:GetEquipListBySuitType(typeId, suitType)
self.TmpList:Clear()
local _parts = self.SuitTypePartCfg[typeId]
if _parts ~= nil then
if suitType == 0 then
for i = 1, 6 do
local _equip = self:GetDressEquip(_parts[i])
if _equip ~= nil and _equip.Equip ~= nil then
self.TmpList:Add(_equip.Equip)
end
end
else
for i = 7, 11 do
local _equip = self:GetDressEquip(_parts[i])
if _equip ~= nil and _equip.Equip ~= nil then
self.TmpList:Add(_equip.Equip)
end
end
end
end
self.TmpList:Sort(L_SuitSort)
return self.TmpList
end
--排序装备2
local L_SortEquip2 = function(left, right)
return right.Power < right.Power
end
--获取某个部位的所有装备,并且根据战力排序
function HolyEquipSystem:GetEquipListByPart(part)
local _lp = GameCenter.GameSceneSystem:GetLocalPlayer()
self.TmpList:Clear()
if _lp ~= nil then
local _lpOcc = _lp.IntOcc
for i = 1, #self.BagList do
local _item = self.BagList[i]
if _item.Occ == _lpOcc and _item.Part == part and _item:CheckBetterThanDress() then
self.TmpList:Add(_item)
end
end
self.TmpList:Sort(L_SortEquip2)
end
return self.TmpList
end
--获取圣装所属的类型
function HolyEquipSystem:GetTypeIdByPart(part)
for k, v in pairs(self.SuitTypePartCfg) do
if v:Contains(part) then
return k
end
end
return 0
end
--排序装备
local L_SortEquip = function(left, right)
local _lp = GameCenter.GameSceneSystem:GetLocalPlayer()
if _lp ~= nil then
local _occ = _lp.IntOcc
local _leftOcc = 1
if left.Occ == _occ then
_leftOcc = 0
end
local _rightOcc = 1
if right.Occ == _occ then
_rightOcc = 0
end
if _leftOcc ~= _rightOcc then
return _leftOcc < _rightOcc
end
if left.Grade ~= right.Grade then
return right.Grade < left.Grade
end
if left.Quality ~= right.Quality then
return right.Quality < left.Quality
end
if left.Part ~= right.Part then
return left.Part < right.Part
end
end
return false
end
--上线初始化数据
function HolyEquipSystem:ResOnlineInit(result)
self.BagList:Clear()
if result.holyBagItemList ~= nil then
for i = 1, #result.holyBagItemList do
local _equip = L_HolyEquip.CreateByLuaMsg(result.holyBagItemList[i])
self:AddBagEquip(_equip, 0)
end
end
self.BagList:Sort(L_SortEquip)
self.EquipDic:Clear()
if result.holyEquipPartList ~= nil then
for i = 1, #result.holyEquipPartList do
local _part = L_HolyEquipPart:New(result.holyEquipPartList[i])
self:UpdateEquipDic(_part)
end
end
for i = 1, #result.holySoulInfoList do
for j = 1, #self.SoulList do
if self.SoulList[j].ItemID == result.holySoulInfoList[i].itemId then
self.SoulList[j]:SetCurCount(result.holySoulInfoList[i].useNum)
end
end
end
self:SendAutoSplitMsg()
self:CheckBagRedPoint()
self:CalculateSuit()
self:CalculateAllPros()
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_HOLYEQUIP_ONLINE)
end
--镶嵌结果反馈
function HolyEquipSystem:ResInlayHolyReuslt(result)
if result.holyPart ~= nil then
--更新装备栏
local _part = L_HolyEquipPart:New(result.holyPart)
self:UpdateEquipDic(_part)
self:CalculateSuit()
self:CalculateAllPros()
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_UPDATE_HOLYEQUIP_PART)
end
end
--强化结果
function HolyEquipSystem:ResIntensifyHolyPartResult(result)
local _oldPart = self.EquipDic[result.holyPart.part]
local _part = L_HolyEquipPart:New(result.holyPart)
if _oldPart ~= nil and _oldPart.Equip ~= nil and _part.Equip ~= nil then
--拷贝套装激活情况
local _iter = _oldPart.Equip.ActiveSuits:GetEnumerator()
while _iter:MoveNext() do
_part.Equip.ActiveSuits[_iter.Current.Key] = _iter.Current.Value
end
end
self:UpdateEquipDic(_part)
self:CheckBagRedPoint()
self:CalculateAllPros()
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_INTENSIFY_HOLYEQUIP)
end
--圣魂使用结果
function HolyEquipSystem:ResUseHolySoulResult(result)
for i = 1, #self.SoulList do
if self.SoulList[i].ItemID == result.holySoulData.itemId then
self.SoulList[i]:SetCurCount(result.holySoulData.useNum)
break
end
end
self:CalculateAllPros()
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_HOLYEQUIP_SOUL_UPDATE)
end
--删除圣装
function HolyEquipSystem:ResDeleteHoly(result)
if result.deleteUID ~= nil then
for i= 1, #result.deleteUID do
self:DeleteBagEquip(result.deleteUID[i], result.reason)
end
self:CheckBagRedPoint()
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_UPDATE_HOLYEQUIP_BAG, result.reason == ItemChangeReasonName.HolyEquipResolveDec)
if result.reason == ItemChangeReasonName.HolyEquipCompoundGet then
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_MERGE_SUCC)
end
end
end
--添加圣装
function HolyEquipSystem:ResAddHoly(result)
if result.addholyitem ~= nil then
for i = 1, #result.addholyitem do
local _equip = L_HolyEquip.CreateByLuaMsg(result.addholyitem[i])
_equip.IsNew = true
self:AddBagEquip(_equip, result.reason)
GameCenter.GetNewItemSystem:AddShowItem(result.reason, _equip, _equip.CfgID, 1)
end
self.BagList:Sort(L_SortEquip)
self:CheckBagRedPoint()
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_UPDATE_HOLYEQUIP_BAG)
end
end
--同步战力
function HolyEquipSystem:ResHolyEquipFightPower(result)
self.AllPower = result.fightPower
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_REFRESH_HOLY_FIGHTPOWER)
end
local L_MergePropTable = function(proTables)
local _result = {}
for i = 1, #proTables do
for k, v in pairs(proTables[i]) do
local _oriValue = _result[k]
if _oriValue == nil then
_oriValue = 0
end
_result[k] = _oriValue + v
end
end
return _result
end
--计算总属性
function HolyEquipSystem:CalculateAllPros()
self.AllProps = {}
local _allBaseProDic = {}
local _allLevelProDic = {}
--加上装备属性和强化属性
for _, part in pairs(self.EquipDic) do
if part.Equip ~= nil and part.LevelCfg ~= nil then
local _dicPro = part.Equip:GetBaseAttribute()
local _iter = _dicPro:GetEnumerator()
while _iter:MoveNext() do
local _k = _iter.Current.Key
local _v = _iter.Current.Value
local _oriValue = _allBaseProDic[_k]
if _oriValue == nil then
_oriValue = 0
end
_allBaseProDic[_k] = _oriValue + _v
end
_allLevelProDic = L_MergePropTable({_allLevelProDic, part.LevelPros})
end
end
--累计基础属性和强化属性
self.AllProps = L_MergePropTable({_allBaseProDic, _allLevelProDic})
--加上圣魂属性
for i= 1, #self.SoulList do
self.AllProps = L_MergePropTable({self.AllProps, self.SoulList[i].AllPros})
end
--加上套装属性
self.AllProps = L_MergePropTable({self.AllProps, self.CurSuitPro, self.CurMultipleSuitPro})
end
--检测背包红点
function HolyEquipSystem:CheckBagRedPoint()
GameCenter.RedPointSystem:CleraFuncCondition(FunctionStartIdCode.HolyEquipDress)
local _betterParts = List:New()
for i = 1, #self.BagList do
local _equip = self.BagList[i]
local _part = _equip.Part
if not _betterParts:Contains(_part) and _equip:CheckCanEquip() and _equip:CheckBetterThanDress() then
_betterParts:Add(_part)
end
end
if #_betterParts > 0 then
for k, v in pairs(self.SuitTypePartCfg) do
for i = 1, #v do
if _betterParts:Contains(v[i]) then
GameCenter.RedPointSystem:AddFuncCondition(FunctionStartIdCode.HolyEquipDress, k, L_RedPointCustomCondition(true))
break
end
end
end
end
for i = 1, #_betterParts do
GameCenter.RedPointSystem:AddFuncCondition(FunctionStartIdCode.HolyEquipDress, _betterParts[i], L_RedPointCustomCondition(true))
end
--根据是否有可以自动合成的来判断是否有红点
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.HolyEquipCompose, self:GetCanMergeItemID() > 0)
end
--添加到背包栏
function HolyEquipSystem:AddBagEquip(equip, reason)
equip.ContainerType = ContainerType.ITEM_LOCATION_BAG
self.BagList:Add(equip)
GameCenter.GetNewItemSystem:AddShowTips(equip, reason, 1)
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_ADD_HOLYEQUIP, equip)
end
--删除背包栏中的装备
function HolyEquipSystem:DeleteBagEquip(id, reason)
for i = 1, #self.BagList do
if self.BagList[i].DBID == id then
self.BagList:RemoveAt(i)
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_DELETE_HOLYEQUIP, id)
break
end
end
end
--计算套装属性
function HolyEquipSystem:CalculateSuit()
self.CurSuitPro = {}
self.CurMultipleSuitPro = {}
for i = 1, #self.SuitPartCfg do
local _equipList = List:New()
for j = 1, #self.SuitPartCfg[i] do
local _equip = self:GetDressEquip(self.SuitPartCfg[i][j])
if _equip ~= nil and _equip.Equip ~= nil then
_equipList:Add(_equip.Equip)
end
end
--计算属性
self:CalculateSuitByParts(_equipList)
end
end
--计算套装属性
function HolyEquipSystem:CalculateSuitByParts(equipList)
--先从高到低排序
equipList:Sort(L_SuitSort)
local _suit2Grade = 0
local _suit2Quality = 0
local _suit2SuitID = 0
--取两件套
local _equipCount = #equipList
if _equipCount >= 2 then
_suit2SuitID = equipList[2].SuitID
_suit2Grade = equipList[2].Grade
_suit2Quality = equipList[2].Quality
end
local _suit4Grade = 0
local _suit4Quality = 0
local _suit4SuitID = 0
if _equipCount >= 4 then
_suit4SuitID = equipList[4].SuitID
_suit4Grade = equipList[4].Grade
_suit4Quality = equipList[4].Quality
end
local _suit5Grade = 0
local _suit5Quality = 0
local _suit5SuitID = 0
if _equipCount >= 5 then
_suit5SuitID = equipList[5].SuitID
_suit5Grade = equipList[5].Grade
_suit5Quality = equipList[5].Quality
end
local _suit6Grade = 0
local _suit6Quality = 0
local _suit6SuitID = 0
if _equipCount >= 6 then
_suit6SuitID = equipList[6].SuitID
_suit6Grade = equipList[6].Grade
_suit6Quality = equipList[6].Quality
end
for i = 1, #equipList do
local _equipGrade = equipList[i].Grade
local _equipQuality = equipList[i].Quality
local _equipSuitIds = equipList[i].ActiveSuits
_equipSuitIds:Clear()
if _equipGrade >= _suit2Grade and _equipQuality >= _suit2Quality then
_equipSuitIds[2] = _suit2SuitID
end
if _equipGrade >= _suit4Grade and _equipQuality >= _suit4Quality then
_equipSuitIds[4] = _suit4SuitID
end
if _equipGrade >= _suit5Grade and _equipQuality >= _suit5Quality then
_equipSuitIds[5] = _suit5SuitID
end
if _equipGrade >= _suit6Grade and _equipQuality >= _suit6Quality then
_equipSuitIds[6] = _suit6SuitID
end
end
--计算属性
local _proList = List:New()
local _muProList = List:New()
local _suit2Cfg = self:GetSuitCfg(_suit2SuitID)
if _suit2Cfg ~= nil then
_proList:Add(_suit2Cfg.Pros2)
_muProList:Add(_suit2Cfg.MultiplePros2)
end
local _suit4Cfg = self:GetSuitCfg(_suit4SuitID)
if _suit4Cfg ~= nil then
_proList:Add(_suit4Cfg.Pros4)
_muProList:Add(_suit4Cfg.MultiplePros4)
end
local _suit5Cfg = self:GetSuitCfg(_suit5SuitID)
if _suit5Cfg ~= nil then
_proList:Add(_suit5Cfg.Pros5)
_muProList:Add(_suit5Cfg.MultiplePros5)
end
local _suit6Cfg = self:GetSuitCfg(_suit6SuitID)
if _suit6Cfg ~= nil then
_proList:Add(_suit6Cfg.Pros6)
_muProList:Add(_suit6Cfg.MultiplePros6)
end
_proList:Add(self.CurSuitPro)
_muProList:Add(self.CurMultipleSuitPro)
self.CurSuitPro = L_MergePropTable(_proList)
self.CurMultipleSuitPro = L_MergePropTable(_muProList)
end
--更新装备栏
function HolyEquipSystem:UpdateEquipDic(part)
local _partValue = part.Part
self.EquipDic[_partValue] = part
local _haveEquip = false
for _, v in pairs(self.EquipDic) do
if v.Equip ~= nil then
_haveEquip = true
break
end
end
--有装备的时候才显示强化界面
GameCenter.MainFunctionSystem:SetFunctionVisible(FunctionStartIdCode.HolyEquipIntensify, _haveEquip)
--检测升级红点
GameCenter.RedPointSystem:RemoveFuncCondition(FunctionStartIdCode.HolyEquipIntensify, _partValue)
if part.Equip ~= nil and part.LevelCfg ~= nil and not part.IsMaxLevel then
GameCenter.RedPointSystem:AddFuncCondition(FunctionStartIdCode.HolyEquipIntensify, _partValue, L_RedPointItemCondition(ItemTypeCode.HolyEquipScore, part.LevelCfg.Cost))
end
end
--发送改变自动分解选项消息
function HolyEquipSystem:SendAutoSplitMsg()
GameCenter.Network.Send("MSG_HolyEquip.ReqSetAutoResolve", {isAuto = self.AutoFenJie, grade = self.AutoFenJieLevel, quality = self.AutoFenJieQuality})
end
return HolyEquipSystem