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

1779 lines
60 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.

------------------------------------------------
-- 作者: 陈宇
-- 日期: 2019-07-18
-- 文件: XianPoSystem.lua
-- 模块: XianPoSystem
-- 描述: 仙魄系统
------------------------------------------------
local XianPoData = require("Logic.XianPo.XianPoData")
local XianPoSyntheticData = require("Logic.XianPo.XianPoSyntheticData")
local L_JianCore = require "Logic.XianPo.JianCoreData"
local L_BattlePropTools = CS.Thousandto.Code.Logic.BattlePropTools
local RedPointItemCondition = CS.Thousandto.Code.Logic.RedPointItemCondition
local XianPoSystem = {
EquipedXianPoDic = Dictionary:New(), -- 已装备的仙魄字典key = 位置value = XianPoData
BagXianPoDic = Dictionary:New(), -- 背包内的仙魄字典key = uidvalue = XianPoData
XianPoOverviewDic = Dictionary:New(), -- 仙魄预览字典key = 解锁层数value = 配置表id
XianPoExchangeDic = Dictionary:New(), -- 仙魄兑换字典key = 排序value = 配置表id
XianPoSyntheticTypeDic = Dictionary:New(), -- 仙魄合成类型字典key = 大分类idvalue = List<合成表id>
XianPoSyntheticDic = Dictionary:New(), -- 仙魄合成字典key = 合成idvalue = XianPoSyntheticData
GetXianPoConditionType = 0, -- 获取仙魄所需条件的类型functionVariable表中的类型
HoleDataDic = nil, -- 镶嵌孔数据
XianPoMaxInlayIndex = 10, -- 仙魄最大镶嵌位置
MaxBagCount = 200, -- 最大背包格子
-- 当前请求合成的CfgId
ReqCompoundCfgId = 0,
-- 红点索引Id
ListRedPointIds = List:New(),
-- 通关剑灵阁层数
JianLingGeLevel = 0,
-- 每个剑灵可镶嵌的格子总数
HoleCount = 7,
-- 剑灵列表 (暂时只包含名字)
JianLingList = List:New(),
JianLingModelIdList = List:New(),
-- 可以升级的镶嵌孔列表
CanLvList = List:New(),
-- 可镶嵌(替换)的剑灵列表
ValidJianLingList = List:New(),
-- 总揽数据
ViewDic = Dictionary:New(),
-- 是否显示合成红点
preShowSynRedPoint = false,
IsShowSynRedPoint = false,
-- 背包灵魄是否改变了
IsLingPoChange = false,
-- update检测红点时间
CheckTime = 1,
-- 剑灵总数量
JianLingCount = 6,
--剑是否显示的条件
DicJianCore = nil,
--背包灵魄总数
BagSoulCount = 0,
--配置id对应灵魄在背包中的数量
SoulBagDic = Dictionary:New(),
}
function XianPoSystem:Initialize()
self.BagSoulCount = 0
self.SoulBagDic:Clear()
-- 消息注册
GameCenter.RegFixEventHandle(LogicLuaEventDefine.EID_EVEMT_UPDATE_SWORDMANDATE, self.SwordChange, self)
self.MaxBagCount = DataConfig.DataGlobal[1581].Params
DataConfig.DataImmortalSoulAttribute:Foreach(function(key, value)
-- 非经验仙魄,预览用仙魄
if value.Type ~= 2 then
if self.GetXianPoConditionType == 0 then
if value.ExchangeConditions ~= "" then
local _condition = Utils.SplitNumber(value.ExchangeConditions, "_")
self.GetXianPoConditionType = _condition[1]
end
end
if not self.XianPoOverviewDic:ContainsKey(value.OverviewConditions) then
local _cfgIdList = List:New()
_cfgIdList:Add(key)
self.XianPoOverviewDic:Add(value.OverviewConditions, _cfgIdList)
else
local _cfgIdList = self.XianPoOverviewDic[value.OverviewConditions]
_cfgIdList:Add(key)
end
end
-- 可兑换仙魄
if value.ExchangeRanking > 0 then
if not self.XianPoExchangeDic:ContainsKey(value.ExchangeRanking) then
self.XianPoExchangeDic:Add(value.ExchangeRanking, key)
end
end
end)
-- 兑换仙魄字典排序
self.XianPoExchangeDic:SortKey(function(a, b)
return a < b
end)
DataConfig.DataImmortalSoulSynthesis:Foreach(function(key, value)
if not self.XianPoSyntheticTypeDic:ContainsKey(value.Type) then
local _idList = List:New()
_idList:Add(key)
self.XianPoSyntheticTypeDic:Add(value.Type, _idList)
else
local _idList = self.XianPoSyntheticTypeDic[value.Type]
_idList:Add(key)
end
if not self.XianPoSyntheticDic:ContainsKey(key) then
local _data = XianPoSyntheticData:New()
_data:SetAllData(value)
self.XianPoSyntheticDic:Add(key, _data)
end
end)
GameCenter.RegFixEventHandle(LogicEventDefine.EVENT_COIN_CHANGE_UPDATE, self.CoinChange, self)
-- 灵魄抽取红点
local _huntCfg = DataConfig.DataImmortalSoulHunt[2]
if _huntCfg ~= nil then
local _costItems = Utils.SplitNumber(_huntCfg.BasicAttributes, '_')
GameCenter.RedPointSystem:AddFuncCondition(FunctionStartIdCode.LingPoLottery, 0,
RedPointItemCondition(_costItems[1], _costItems[2]))
end
end
function XianPoSystem:UnInitialize()
self.BagSoulCount = 0
self.SoulBagDic:Clear()
self.EquipedXianPoDic:Clear()
self.BagXianPoDic:Clear()
GameCenter.UnRegFixEventHandle(LogicLuaEventDefine.EID_EVEMT_UPDATE_SWORDMANDATE, self.SwordChange, self)
GameCenter.UnRegFixEventHandle(LogicEventDefine.EVENT_COIN_CHANGE_UPDATE, self.CoinChange, self)
end
function XianPoSystem:CoinChange(obj, sender)
if obj == ItemTypeCode.LingPoSw then
self:LingPoChange()
end
end
-- 剑阁层数改变
function XianPoSystem:SwordChange(obj, sender)
self.JianLingGeLevel = GameCenter.SwordMandateSystem.CurLevel
self.IsShowSynRedPoint = self:SetXianPoSyntheticRedPoint()
if self.preShowSynRedPoint ~= self.IsShowSynRedPoint then
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.XianPoSynthetic, self.IsShowSynRedPoint)
self.preShowSynRedPoint = self.IsShowSynRedPoint
end
end
-- 获取剑灵名字列表
function XianPoSystem:GetNameList()
if #self.JianLingList == 0 then
local dic = GameCenter.FlySowardSystem:GetTypeDic()
if dic ~= nil then
local list = dic:GetKeys()
for i = 1, #list do
local cfg = GameCenter.FlySowardSystem:GetActiveCfgByType(list[i])
if cfg ~= nil then
self.JianLingList:Add(cfg.Name)
end
end
end
end
return self.JianLingList
end
-- 获取剑灵模型ID列表
function XianPoSystem:GetModelList()
if #self.JianLingModelIdList == 0 then
local dic = GameCenter.FlySowardSystem:GetTypeDic()
if dic ~= nil then
local list = dic:GetKeys()
for i = 1, #list do
local cfg = GameCenter.FlySowardSystem:GetActiveCfgByType(list[i])
if cfg ~= nil then
self.JianLingModelIdList:Add(cfg.Id)
end
end
end
end
return self.JianLingModelIdList
end
-- 获取激活的剑灵最大索引
function XianPoSystem:GetActiveJianlingIndex()
local index = 1
local dic = GameCenter.FlySowardSystem:GetTypeDic()
if dic ~= nil then
local list = dic:GetKeys()
for i = 1, #list do
local type = list[i]
for m = 1, self.HoleCount do
local holeId = i * 100 + m
if self:GetJianValid(i) then
local isValid = self:GetHoleIsValid(holeId)
if isValid then
index = type
end
end
end
end
end
return index
end
-- 获取镶嵌孔数据
function XianPoSystem:GetHoleDataDic()
if self.HoleDataDic == nil then
self.HoleDataDic = Dictionary:New()
local nameList = self:GetNameList()
local isActive = false
for i = 1, #nameList do
local index = i
for m = 1, self.HoleCount do
local holeId = i * 100 + m
local data = self.HoleDataDic[holeId]
if data == nil then
local cfg = DataConfig.DataImmortalSoulIattice[holeId]
if cfg ~= nil then
local list = Utils.SplitNumber(cfg.Condition, '_')
local level = list[2]
data = {
ActiveLv = level
}
end
self.HoleDataDic[holeId] = data
end
end
end
end
return self.HoleDataDic
end
function XianPoSystem:Sort(list)
if list ~= nil then
list:Sort(function(a, b)
return a.SortId < b.SortId
end)
end
end
-- 排序
function XianPoSystem:SortUid(uidlist)
local list = List:New()
local retList = List:New()
for i = 1, #uidlist do
local data = self:GetBagXianPoDataByUID(uidlist[i])
if data ~= nil then
data.SortId = self:GetSortId(data)
list:Add(data)
end
end
list:Sort(function(a, b)
return a.SortId < b.SortId
end)
for i = 1, #list do
local data = list[i]
if data ~= nil then
retList:Add(data.Uid)
end
end
return retList
end
function XianPoSystem:SortUid2(uidlist, holeId, index)
local list = List:New()
local retList = List:New()
for i = 1, #uidlist do
local data = self:GetBagXianPoDataByUID(uidlist[i])
if data ~= nil then
data.SortId = self:GetSortId2(data, holeId, index)
list:Add(data)
end
end
list:Sort(function(a, b)
return a.SortId < b.SortId
end)
for i = 1, #list do
local data = list[i]
if data ~= nil then
retList:Add(data.Uid)
end
end
return retList
end
function XianPoSystem:GetSortId(data)
local sortId = 0
if data.Quality == XianPoQuality.Blue then
sortId = 1000000000000
elseif data.Quality == XianPoQuality.Purple then
sortId = 2000000000000
elseif data.Quality == XianPoQuality.Gold then
sortId = 3000000000000
elseif data.Quality == XianPoQuality.Red then
sortId = 4000000000000
end
sortId = sortId + data.CfgId - data.Level
return sortId
end
function XianPoSystem:GetSortId2(data, holeId, index)
local sortId = 0
if data.Quality == XianPoQuality.Blue then
sortId = 4000000000000
elseif data.Quality == XianPoQuality.Purple then
sortId = 3000000000000
elseif data.Quality == XianPoQuality.Gold then
sortId = 2000000000000
elseif data.Quality == XianPoQuality.Red then
sortId = 1000000000000
end
local visable, equal = self:CanEquipOrRepalce(data.Uid, holeId, index)
if equal then
sortId = sortId + 4000000000000
end
sortId = sortId + data.CfgId - data.Level * 10000000000 - data.Star * 100000000000
return sortId
end
-- 判断指定ID的仙魄是否可以替换或者镶嵌
function XianPoSystem:CanEquipOrRepalce(uid, holeId, index)
local ret = false
local haveEqualAtt = false
local data = self.BagXianPoDic[uid]
if data == nil then
return false
end
if not self:GetHoleIsValid(holeId) then
-- 这个空无效
return false
end
-- 先检查所有剑灵项是否有可镶嵌的孔
ret = self:HaveFreeHole(holeId)
if ret then
-- 判断当前孔是否可以镶嵌
ret = false
for n = 1, self.HoleCount do
local otherHole = index * 100 + n
if otherHole ~= holeId then
local otherEquiptItem = self.EquipedXianPoDic[otherHole]
if otherEquiptItem ~= nil and otherEquiptItem.Type2 == data.Type2 then
-- 如果属性相同 并且不是同一个孔
haveEqualAtt = true
end
end
end
if not haveEqualAtt then
-- 如果没有相同的属性 就可以替换
ret = true
end
end
if not ret then
-- 不能镶嵌 就检查是否可以替换
local equipItem = self.EquipedXianPoDic[holeId]
if equipItem ~= nil then
ret, haveEqualAtt = self:CanReplace(data, equipItem, index, holeId)
end
end
return ret, haveEqualAtt
end
-- 获取可以升级灵魄的孔
function XianPoSystem:GetCanLvHole()
self.CanLvList:Clear()
local nameList = self:GetNameList()
local isActive = false
for i = 1, #nameList do
local index = i
for m = 1, self.HoleCount do
local holeId = i * 100 + m
local isValid = self:GetHoleIsValid(holeId)
if isValid then
-- 激活了
isActive = true
break
end
end
if isActive then
for m = 1, self.HoleCount do
local holeId = index * 100 + m
if self:GetHoleIsValid(holeId) then
if self:IsIndexXianPoCanUpgrade(holeId) then
self.CanLvList:Add(holeId)
end
end
end
end
end
return self.CanLvList
end
-- 判断当前孔是否有可替换的灵魄
function XianPoSystem:HaveReplaceItem(index, holeId)
local ret = false
if self:GetHoleIsValid(holeId) then
local equipItem = self.EquipedXianPoDic[holeId]
-- 从未灵魄背包中获取等级比当前孔等级更高的灵魄
local bagKeys = self.BagXianPoDic:GetKeys()
for i = 1, #bagKeys do
local key = bagKeys[i]
local bagItem = self.BagXianPoDic[key]
ret = self:CanReplace(bagItem, equipItem, index, holeId)
if ret then
break
end
end
end
return ret
end
function XianPoSystem:CanReplace(bagItem, equipItem, index, holeId)
local ret = false
local haveEqualAtt = false
if bagItem ~= nil and bagItem.Typ ~= 2 then
-- 如果是属性灵魄
if equipItem == nil or (bagItem.Level > equipItem.Level and bagItem.Quality > equipItem.Quality) then
-- 如果背包中的该仙魄等级更高 判断其他格子里面是否有相同属性的仙魄
for n = 1, self.HoleCount do
local otherHole = index * 100 + n
if otherHole ~= holeId then
local otherEquiptItem = self.EquipedXianPoDic[otherHole]
if otherEquiptItem ~= nil and otherEquiptItem.Type2 == bagItem.Type2 then
-- 如果属性相同 并且不是同一个孔
haveEqualAtt = true
end
end
end
if not haveEqualAtt then
-- 如果没有相同的属性 就可以替换
ret = true
end
end
if equipItem == nil or bagItem.Quality > equipItem.Quality or (bagItem.Quality == equipItem.Quality and bagItem.Star > equipItem.Star) then
-- 如果背包中的该仙魄品质更高 判断其他格子里面是否有相同属性的仙魄
for n = 1, self.HoleCount do
local otherHole = index * 100 + n
if otherHole ~= holeId then
local otherEquiptItem = self.EquipedXianPoDic[otherHole]
if otherEquiptItem ~= nil and otherEquiptItem.Type2 == bagItem.Type2 then
-- 如果属性相同 并且不是同一个孔
haveEqualAtt = true
end
end
end
if not haveEqualAtt then
-- 如果没有相同的属性 就可以替换
ret = true
end
end
if not haveEqualAtt then
for n = 1, self.HoleCount do
local otherHole = index * 100 + n
if otherHole ~= holeId then
local otherEquiptItem = self.EquipedXianPoDic[otherHole]
if otherEquiptItem ~= nil and otherEquiptItem.Type2 == bagItem.Type2 then
-- 如果属性相同 并且不是同一个孔
haveEqualAtt = true
break
end
end
end
end
end
return ret, haveEqualAtt
end
-- 判断传入剑灵index对应的剑灵是否有可以替换或者镶嵌的灵魄
function XianPoSystem:GetEquiptHoleList(index)
local holeList = List:New()
local ret = false
for i = 1, self.HoleCount do
-- 格子id
-- 先判断是否有格子没有镶嵌
local haveHole = false
local holeId = index * 100 + i
haveHole = self:GetHoleIsValid(holeId)
if haveHole then
haveHole = self.EquipedXianPoDic:ContainsKey(holeId)
if haveHole then
-- 镶嵌了灵魄 判断是否有可以替换的灵魄
local equipItem = self.EquipedXianPoDic[holeId]
-- 从未灵魄背包中获取等级比当前孔等级更高的灵魄
local bagKeys = self.BagXianPoDic:GetKeys()
for m = 1, #bagKeys do
local key = bagKeys[m]
local item = self.BagXianPoDic[key]
if item ~= nil and item.Typ ~= 2 then
haveHole = self:CanReplace(item, equipItem, index, holeId)
if haveHole then
holeList:Add(holeId)
end
end
end
else
-- 没有镶嵌灵魄 检查背包里面的灵魄是否可以镶嵌
local bagKeys = self.BagXianPoDic:GetKeys()
for k = 1, #bagKeys do
local key = bagKeys[k]
local item = self.BagXianPoDic[key]
if item ~= nil and item.Typ ~= 2 then
-- 如果是属性灵魄 判断和其他孔是否有属性冲突
haveHole = true
for m = 1, self.HoleCount do
if i ~= m then
local otherEquipItem = self.EquipedXianPoDic[index * 100 + m]
if otherEquipItem ~= nil and otherEquipItem.Type2 == item.Type2 then
haveHole = false
end
end
end
if haveHole then
holeList:Add(holeId)
break
end
end
end
end
end
end
return holeList
end
-- 一次性返回有可镶嵌的剑灵序号
function XianPoSystem:GetValidJianLingIndexs()
self.ValidJianLingList:Clear()
local bagKeys = self.BagXianPoDic:GetKeys()
-- 先检查所有剑灵项是否有可镶嵌的孔
local nameList = self:GetNameList()
local activeIndex = self:GetActiveJianlingIndex()
for i = 1, #nameList do
local index = i
if activeIndex >= index then
local ret = false
for m = 1, self.HoleCount do
local holeId = index * 100 + i
ret = self:HaveFreeHole(holeId)
if ret then
-- 没有镶嵌灵魄 检查背包里面的灵魄是否可以镶嵌
for k = 1, #bagKeys do
local key = bagKeys[k]
local item = self.BagXianPoDic[key]
if item ~= nil and item.Typ ~= 2 then
-- 如果是属性灵魄 判断和其他孔是否有属性冲突
for n = 1, self.HoleCount do
if i ~= n then
local otherEquipItem = self.EquipedXianPoDic[index * 100 + n]
if otherEquipItem ~= nil and otherEquipItem.Type2 == item.Type2 then
ret = false
end
end
end
if ret then
self.ValidJianLingList:Add(index)
break
end
end
end
break
end
end
end
end
for i = 1, #bagKeys do
local bagKey = bagKeys[i]
local bagItem = self.BagXianPoDic[bagKey]
-- 和所有的剑灵项比较
for m = 1, #nameList do
local index = m
if activeIndex >= index then
local ret = false
if not self.ValidJianLingList:Contains(m) then
-- 如果没有可镶嵌的孔 检查是否可以替换
ret = self:HaveBetterItem(index, bagItem)
if ret then
self.ValidJianLingList:Add(m)
end
end
end
end
end
return self.ValidJianLingList
end
function XianPoSystem:GetValidJianLingStateList()
local bagKeys = self.BagXianPoDic:GetKeys()
local bagCount = #bagKeys
-- 先检查所有剑灵项是否有可镶嵌的孔
local activeIndex = self:GetActiveJianlingIndex()
for i = 1, self.JianLingCount do
local index = i
if activeIndex >= index then
local ret = false
-- 获取可镶嵌孔列表
local freeHoleList = self:GetFreeHoleList(index)
if #freeHoleList > 0 then
-- 有可镶嵌的孔
ret = true
for k = 1, bagCount do
local key = bagKeys[k]
local item = self.BagXianPoDic[key]
if item ~= nil and item.Typ ~= 2 then
-- 如果是属性灵魄 判断和其他孔是否有属性冲突
for m = 1, self.HoleCount do
local otherEquipItem = self.EquipedXianPoDic[index * 100 + m]
if otherEquipItem ~= nil and otherEquipItem.Type2 == item.Type2 then
ret = false
break
end
end
if ret then
return true
end
end
end
if not ret then
--不能镶嵌 判断是否有更好的灵魄
for k = 1, bagCount do
local bagKey = bagKeys[k]
local bagItem = self.BagXianPoDic[bagKey]
ret = self:HaveBetterItem(index, bagItem)
if ret then
return true
end
end
end
else
-- 没有可镶嵌的孔
for k = 1, bagCount do
local bagKey = bagKeys[k]
local bagItem = self.BagXianPoDic[bagKey]
ret = self:HaveBetterItem(index, bagItem)
if ret then
return true
end
end
end
-- 判断是否有可以升级的
for m = 1, self.HoleCount do
local holeId = index * 100 + m
if self:GetHoleIsValid(holeId) then
if self:IsIndexXianPoCanUpgrade(holeId) then
return true
end
end
end
end
end
return false
end
-- 获取可镶嵌孔列表
function XianPoSystem:GetFreeHoleList(index)
local list = List:New()
for m = 1, self.HoleCount do
local holeId = index * 100 + m
local ret = self:HaveFreeHole(holeId)
if ret then
list:Add(holeId)
end
end
return list
end
-- 判断是否有空闲的孔洞
function XianPoSystem:HaveFreeHole(holeId)
local ret = false
-- 先判断该孔是否可用
ret = self:GetHoleIsValid(holeId)
if ret then
-- 如果该孔有效 判断是否装备了灵魄
if self.EquipedXianPoDic:ContainsKey(holeId) then
ret = false
end
end
return ret
end
-- 判断是否有更高级的灵魄
function XianPoSystem:HaveBetterItem(index, bagItem)
local ret = false
for k = 1, self.HoleCount do
local holeId = index * 100 + k
-- 判断当前孔是否激活
if self:GetHoleIsValid(holeId) then
local equipItem = self.EquipedXianPoDic[holeId]
-- 从未灵魄背包中获取等级比当前孔等级更高的灵魄
if bagItem ~= nil and bagItem.Typ ~= 2 then
-- 如果是属性灵魄
ret = self:CanReplace(bagItem, equipItem, index, holeId)
if ret then
break
end
end
end
end
return ret
end
-- 判断是否有更好品质的灵魄
function XianPoSystem:HaveBetterQualityItem(index, bagItem)
local ret = false
for k = 1, self.HoleCount do
local holeId = index * 100 + k
-- 判断当前孔是否激活
if self:GetHoleIsValid(holeId) then
local equipItem = self.EquipedXianPoDic[holeId]
-- 从未灵魄背包中获取等级比当前孔等级更高的灵魄
if bagItem ~= nil and bagItem.Typ ~= 2 then
-- 如果是属性灵魄
if bagItem.Quality > equipItem.Quality then
-- 如果背包中的该仙魄等级更高 判断其他格子里面是否有相同属性的仙魄
local haveEqualAtt = false
local equipedKeys = self.EquipedXianPoDic:GetKeys()
for n = 1, self.HoleCount do
if n ~= k then
local otherEquiptItem = self.EquipedXianPoDic[equipedKeys[n]]
if otherEquiptItem ~= nil and otherEquiptItem.Type2 == bagItem.Type2 then
-- 如果属性相同 并且不是同一个孔
haveEqualAtt = true
end
end
end
if not haveEqualAtt then
-- 如果没有相同的属性 就可以替换
ret = true
break
end
end
end
end
end
return ret
end
-- 获取灵魄镶嵌格子是否激活
function XianPoSystem:GetHoleIsValid(holeId)
local ret = false
local dic = self:GetHoleDataDic()
if dic ~= nil then
local data = dic[holeId]
if data ~= nil then
ret = self.JianLingGeLevel > data.ActiveLv
end
end
return ret
end
-- 获取总揽数据
function XianPoSystem:GetViewData()
if self.ViewDic:Count() == 0 then
DataConfig.DataImmortalSoulAttribute:Foreach(function(key, value)
if value.OverviewConditions ~= nil and value.OverviewConditions ~= "" then
local params = Utils.SplitNumber(value.OverviewConditions, "_")
local floor = params[1]
local row = params[2]
local col = params[3]
local subDic = self.ViewDic[floor]
if subDic ~= nil then
local list = subDic[row]
if list ~= nil then
list:Add(key)
else
list = List:New()
list:Add(key)
subDic:Add(row, list)
end
else
local list = List:New()
list:Add(key)
subDic = Dictionary:New()
subDic:Add(row, list)
self.ViewDic:Add(floor, subDic)
end
end
end)
end
return self.ViewDic
end
function XianPoSystem:GetAllItemDic()
local index = 0
local retDic = Dictionary:New()
local dic = self:GetViewData()
local keys = dic:GetKeys()
keys:Sort(function(a, b)
return a < b
end)
for i = 1, #keys do
if self.JianLingGeLevel > keys[i] then
local floorDic = dic[keys[i]]
if floorDic ~= nil then
local floorKeys = floorDic:GetKeys()
for m = 1, #floorKeys do
local list = floorDic[floorKeys[m]]
if list ~= nil then
retDic:Add(index, list)
index = index + 1
end
end
end
end
end
return retDic
end
function XianPoSystem:AddBag(uId, data)
if data == nil then
return
end
local _soul = self.BagXianPoDic[uId]
if _soul == nil then
self.BagXianPoDic:Add(uId, data)
self.BagSoulCount = self.BagSoulCount + 1
else
self.BagXianPoDic[uId] = data
end
local _soulCount = self.SoulBagDic[data.CfgId]
if _soulCount == nil then
self.SoulBagDic[data.CfgId] = 1
else
self.SoulBagDic[data.CfgId] = _soulCount + 1
end
end
function XianPoSystem:RemoveBag(uId)
local _soul = self.BagXianPoDic[uId]
if _soul ~= nil then
self.BagXianPoDic:Remove(uId)
self.BagSoulCount = self.BagSoulCount - 1
local _soulCount = self.SoulBagDic[_soul.CfgId]
if _soulCount ~= nil and _soulCount > 0 then
self.SoulBagDic[_soul.CfgId] = _soulCount - 1
end
end
end
function XianPoSystem:GetAnalyseXianPo()
local _list = List:New()
if self.BagXianPoDic ~= nil then
local _keys = self.BagXianPoDic:GetKeys()
if _keys ~= nil then
for i = 1, #_keys do
local _xianPo = self.BagXianPoDic[_keys[i]]
if _xianPo.Quality >= 4 and _xianPo.Star >= 2 then
_list:Add(_xianPo)
end
end
end
end
return _list
end
function XianPoSystem:GetDecomposeXianPo()
local _list = List:New()
if self.BagXianPoDic ~= nil then
local _keys = self.BagXianPoDic:GetKeys()
if _keys ~= nil then
for i = 1, #_keys do
local _xianPo = self.BagXianPoDic[_keys[i]]
if _xianPo.Quality >= 4 and _xianPo.Star >= 2 then
else
_list:Add(_xianPo)
end
end
end
end
return _list
end
-- 心跳
function XianPoSystem:Update(dt)
local isShow = false
-- 每0.5秒检查一次是否有激活的剑灵
if self.CheckTime > 0 then
self.CheckTime = self.CheckTime - dt
else
self.CheckTime = 1
-- 检查灵魄镶嵌是否有红点
local isShow = self:GetValidJianLingStateList()
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.XianPoInlay, isShow)
end
if self.IsLingPoChange then
self.IsShowSynRedPoint = self:SetXianPoSyntheticRedPoint()
if self.preShowSynRedPoint ~= self.IsShowSynRedPoint then
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.XianPoSynthetic, self.IsShowSynRedPoint)
self.preShowSynRedPoint = self.IsShowSynRedPoint
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_XIANPO_EXCHANGE)
self:SetXianPoDecompositionRedPoint()
local isShow = self:GetValidJianLingStateList()
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.XianPoInlay, isShow)
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_LINGPO_EXCHANGE)
self.IsLingPoChange = false
end
-- 检查分解
-- 检查对话
-- 检查合成
end
-- 上线初始化所有仙魂
function XianPoSystem:ResAllImmortalSoul(msg)
if msg.soulEquipmentList then
for i = 1, #msg.soulEquipmentList do
local _xianPoInfos = msg.soulEquipmentList[i]
local _data = XianPoData:New()
_data:SetAllData(_xianPoInfos)
if not self.EquipedXianPoDic:ContainsKey(_xianPoInfos.location) then
self.EquipedXianPoDic:Add(_xianPoInfos.location, _data)
end
end
end
if msg.soulBagList then
for i = 1, #msg.soulBagList do
local _xianPoInfos = msg.soulBagList[i]
local _data = XianPoData:New()
_data:SetAllData(_xianPoInfos)
if not self.BagXianPoDic:ContainsKey(_xianPoInfos.uid) then
self:AddBag(_xianPoInfos.uid, _data)
end
end
end
-- self:SetXianPoDecompositionRedPoint()
self:LingPoChange()
end
-- 请求镶嵌仙魄location = 位置
function XianPoSystem:ReqInlaySoul(uid, location)
local _req = ReqMsg.MSG_ImmortalSoul.ReqInlaySoul:New()
_req.soulUID = uid
_req.location = location
_req:Send()
end
-- 镶嵌仙魂结果反馈
function XianPoSystem:ResInlaySoulReuslt(msg)
if msg.isSucceed then
local _inlayIndex = -1
for i = 1, #msg.soulInlayList do
local _xianPoInfos = msg.soulInlayList[i]
local _data = XianPoData:New()
_data:SetAllData(_xianPoInfos)
if _xianPoInfos.location ~= 0 then
_inlayIndex = _xianPoInfos.location
-- 如果不在背包(穿在身上的)
-- 先替换身上的仙魄
if self.EquipedXianPoDic:ContainsKey(_xianPoInfos.location) then
self.EquipedXianPoDic[_xianPoInfos.location] = _data
else
self.EquipedXianPoDic:Add(_xianPoInfos.location, _data)
end
-- 在删除背包内的仙魄
if self.BagXianPoDic:ContainsKey(_xianPoInfos.uid) then
self:RemoveBag(_xianPoInfos.uid)
end
else
-- 如果是背包里的,那就加到背包里去
if not self.BagXianPoDic:ContainsKey(_xianPoInfos.uid) then
self:AddBag(_xianPoInfos.uid, _data)
end
end
-- 发送背包中仙魄改变的消息
-- GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_XIANPO_BAG_ITEM_CHANGED, _xianPoInfos.CfgId)
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_XIANPOINFO_REFRESH, _inlayIndex)
Utils.ShowPromptByEnum("InlaySucced")
-- self:SortBagXianPoDic()
-- self:SetXianPoInlayRedPoint()
-- self:SetXianPoDecompositionRedPoint()
self:LingPoChange()
end
end
-- 请求分解仙魄
function XianPoSystem:ReqResolveSoul(uidList)
local _req = ReqMsg.MSG_ImmortalSoul.ReqResolveSoul:New()
_req.uids = uidList
_req:Send()
end
-- 分解仙魄返回
function XianPoSystem:ResResolveSoulReuslt(msg)
if msg.isSucceed then
for i = 1, #msg.uids do
local _data = self.BagXianPoDic[msg.uids[i]]
if _data ~= nil then
local _cfgId = _data.CfgId
self:RemoveBag(msg.uids[i])
-- GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_XIANPO_BAG_ITEM_CHANGED, _cfgId)
end
end
Utils.ShowPromptByEnum("ResolveSucceed")
-- self:SortBagXianPoDic()
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_XIANPO_DECOMPOSITION)
-- self:SetXianPoInlayRedPoint()
-- self:SetXianPoDecompositionRedPoint()
self:LingPoChange()
end
end
-- 请求仙魄升级
function XianPoSystem:ReqUpSoul(location)
local _req = ReqMsg.MSG_ImmortalSoul.ReqUpSoul:New()
_req.location = location
_req:Send()
end
-- 仙魄升级返回
function XianPoSystem:ResUpSoulReuslt(msg)
if msg.isSucceed then
local _data = XianPoData:New()
_data:SetAllData(msg.soul)
if self.EquipedXianPoDic:ContainsKey(_data.Location) then
self.EquipedXianPoDic[_data.Location] = _data
end
Utils.ShowPromptByEnum("LevelUpSucceed")
-- self:SortBagXianPoDic()
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_XIANPOINFO_REFRESH, _data.Location)
-- self:SetXianPoInlayRedPoint()
self:LingPoChange()
end
end
-- 请求兑换仙魄
function XianPoSystem:ReqExchangeSoul(cfgId, num)
local _req = ReqMsg.MSG_ImmortalSoul.ReqExchangeSoul:New()
_req.itemId = cfgId
_req.num = num
_req:Send()
end
-- 仙魄兑换返回
function XianPoSystem:ResExchangeSoulReuslt(msg)
if msg.isSucceed then
local _reason = msg.reason or 0
local _data = XianPoData:New()
_data:SetAllData(msg.soul)
if not self.BagXianPoDic:ContainsKey(_data.Uid) then
self:AddBag(_data.Uid, _data)
-- 增加灵魄获取效果
GameCenter.GetNewItemSystem:AddShowItem(_reason, nil, _data.CfgId, 1);
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_XIANPOINFO_REFRESH, 0)
self:LingPoChange()
end
end
-- 请求合成仙魄
function XianPoSystem:ReqCompoundSoul(cfgId)
self.ReqCompoundCfgId = cfgId
local _req = ReqMsg.MSG_ImmortalSoul.ReqCompoundSoul:New()
_req.itemId = cfgId
_req:Send()
end
-- 合成仙魄返回
function XianPoSystem:ResCompoundSoulReuslt(msg)
if msg.isSucceed then
local _data = XianPoData:New()
_data:SetAllData(msg.soul)
if not self.BagXianPoDic:ContainsKey(_data.Uid) then
self:AddBag(_data.Uid, _data)
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_XIANPO_BAG_ITEM_CHANGED, _data.CfgId)
end
for i = 1, #msg.deleteUid do
if self.BagXianPoDic:ContainsKey(msg.deleteUid[i]) then
local _cfgId = self.BagXianPoDic:Get(msg.deleteUid[i]).CfgId
self:RemoveBag(msg.deleteUid[i])
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_XIANPO_BAG_ITEM_CHANGED, _cfgId)
end
end
Utils.ShowPromptByEnum("CompoundSucceed", _data.Name)
self:SortBagXianPoDic()
-- self:SetXianPoDecompositionRedPoint()
-- GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_XIANPO_SYNTHETIC, _data.CfgId)
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_XIANPO_SYNTHETIC, {
id = _data.CfgId,
success = true
})
-- self:SetXianPoInlayRedPoint()
else
for i = 1, #msg.deleteUid do
if self.BagXianPoDic:ContainsKey(msg.deleteUid[i]) then
local _cfgId = self.BagXianPoDic:Get(msg.deleteUid[i]).CfgId
self:RemoveBag(msg.deleteUid[i])
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_XIANPO_BAG_ITEM_CHANGED, _cfgId)
end
end
self:SortBagXianPoDic()
-- self:SetXianPoDecompositionRedPoint()
-- GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_XIANPO_SYNTHETIC, self.ReqCompoundCfgId)
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_XIANPO_SYNTHETIC, {
id = self.ReqCompoundCfgId,
success = false
})
-- self:SetXianPoInlayRedPoint()
end
self:LingPoChange()
end
-- 请求脱下仙魄
function XianPoSystem:ReqGetOffSoul(location)
local _req = ReqMsg.MSG_ImmortalSoul.ReqGetOffSoul:New()
_req.location = location
_req:Send()
end
-- 脱下仙魄返回
function XianPoSystem:ResGetOffReuslt(msg)
end
-- =============红点函数=============--
-- 灵魄背包改变
function XianPoSystem:LingPoChange()
if not self.IsLingPoChange then
self.IsLingPoChange = true
end
end
-- 设置仙魄镶嵌的红点
function XianPoSystem:SetXianPoInlayRedPoint()
local _haveRedPoint = false
self.ListRedPointIds:Clear()
if self:IsCanInlayXianPo() or self:IsEquipXianPoCanUpgrade() then
_haveRedPoint = true
end
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.XianPoInlay, _haveRedPoint)
self:SetXianPoSyntheticRedPoint()
end
-- 设置仙魄合成的红点
function XianPoSystem:SetXianPoSyntheticRedPoint()
local _haveRedPoint = false
local _cache = Dictionary:New()
local _synKeys = self.XianPoSyntheticDic:GetKeys()
for m = 1, #_synKeys do
local _value = self.XianPoSyntheticDic[_synKeys[m]]
local _needList = _value.NeedXianPoIdCountList
local _isShow = true
for i = 1, #_needList do
local _cfgId = _needList[i].Id
local _haveCount = 0
local _needNum = _needList[i].NeedNum
local _cacheData = _cache[_needList[i].Id]
if _cacheData == nil then
_cacheData = {Id = _cfgId, Left = self:GetXianPoCountByCfgId(_cfgId)}
_cache:Add(_cfgId, _cacheData)
end
_haveCount = _cacheData.Left
if _haveCount < _needNum then
_isShow = false
break
end
_cacheData.Left = _haveCount > _needNum and _haveCount - _needNum or 0
end
if _isShow then
local _itemCount = GameCenter.ItemContianerSystem:GetItemCountFromCfgId(_value.NeedItemId)
if _itemCount < _value.NeedItemNum then
_isShow = false
end
if self.JianLingGeLevel <= _value.Limit then
_isShow = false
end
end
if _isShow then
_haveRedPoint = true
break
end
end
return _haveRedPoint
end
function XianPoSystem:GetSyntheticRedPointList()
local list = List:New()
local _cache = Dictionary:New()
local _haveRedPoint = false
self.XianPoSyntheticDic:ForeachCanBreak(function(_, _value)
local id = _
local _needList = _value.NeedXianPoIdCountList
local isShow = true
for i = 1, #_needList do
local _haveCount = 0
local _cacheData = _cache[_needList[i].Id]
if _cacheData == nil then
_cacheData = {Id = _needList[i].Id, Left = self:GetXianPoCountByCfgId(_needList[i].Id)}
_cache:Add(_needList[i].Id, _cacheData)
end
_haveCount = _cacheData.Left
if _haveCount < _needList[i].NeedNum then
isShow = false
end
_cacheData.Left = _haveCount > _needList[i].NeedNum and _haveCount - _needList[i].NeedNum or 0
end
local _haveCount = GameCenter.ItemContianerSystem:GetItemCountFromCfgId(_value.NeedItemId)
if _haveCount < _value.NeedItemNum then
isShow = false
end
if self.JianLingGeLevel <= _value.Limit then
isShow = false
end
if isShow then
_haveRedPoint = true
list:Add(id)
end
end)
return list
end
-- 判定所有位置是否为空,并有可镶嵌仙魄
function XianPoSystem:IsCanInlayXianPo()
local _ret = false
for i = 1, self.XianPoMaxInlayIndex do
if self:IsIndexEmptyCanInlay(i) then
_ret = true
break
end
end
return _ret
end
-- 判定一个位置是否为空,并且背包内有对应仙魄可镶嵌
function XianPoSystem:IsIndexEmptyCanInlay(index)
local _canInlay = false
if self:IsIndexUnlock(index) then
-- 该位置已解锁
if self:GetXianPoDataByIndex(index) == nil then
-- 该位置没有镶嵌仙魄,遍历背包内的仙魄
self.BagXianPoDic:ForeachCanBreak(function(key, value)
if value.CanInlayLocationList:Contains(index) then
-- 如果这个仙魄可以镶嵌到这个格子
_canInlay = true
return true
end
end)
end
end
return _canInlay
end
-- 判定所有位置的仙魄是否可升级
function XianPoSystem:IsEquipXianPoCanUpgrade()
local _ret = false
for i = 1, self.XianPoMaxInlayIndex do
if self:IsIndexXianPoCanUpgrade(i) then
_ret = true
break
end
end
return _ret
end
-- 判定一个位置的仙魄是否可升级
function XianPoSystem:IsIndexXianPoCanUpgrade(index)
local _canUpgrade = false
local _data = self:GetXianPoDataByIndex(index)
if _data then
local _nextLvNeedExp = self:GetNextLvNeedExp(_data.Quality, _data.Level)
local _myExp = GameCenter.ItemContianerSystem:GetEconomyWithType(ItemTypeCode.LingPoJc)
if _myExp >= _nextLvNeedExp and _data.Level < _data.MaxLevel then
_canUpgrade = true
self.ListRedPointIds:Add(_data.CfgId)
end
end
return _canUpgrade
end
-- 设置仙魄分解的红点
function XianPoSystem:SetXianPoDecompositionRedPoint()
local _haveRedPoint = false
self.BagXianPoDic:ForeachCanBreak(function(key, value)
if value.Typ == 2 then
-- 是经验仙魄
_haveRedPoint = true
return true
else
-- 不是经验仙魄,判断是不是蓝色
if value.Quality == XianPoQuality.Blue then
_haveRedPoint = true
return true
end
end
end)
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.XianPoDecomposition, _haveRedPoint)
end
-- =============接口函数=============--
-- 根据位置获取 该位置是否已镶嵌仙魄
-- function XianPoSystem:IsHaveXianPoByIndex(index)
-- local _ret = false
-- if self.EquipedXianPoDic:ContainsKey(index) then
-- if self.EquipedXianPoDic[index].Uid > 0 then
-- _ret = true
-- end
-- end
-- return _ret
-- end
-- 判断该位置是否已解锁
function XianPoSystem:IsIndexUnlock(index)
local _unLockCfg = DataConfig.DataImmortalSoulIattice[index]
if _unLockCfg then
local _variableSystem = GameCenter.VariableSystem
local _unLockCondition = Utils.SplitNumber(_unLockCfg.Condition, "_")
return _variableSystem.IsVariableReach(_unLockCondition[1], _unLockCondition[2])
end
return false
end
-- 根据位置获取该位置的仙魄
function XianPoSystem:GetXianPoDataByIndex(index)
local _ret = nil
if self.EquipedXianPoDic:ContainsKey(index) then
_ret = self.EquipedXianPoDic[index]
end
return _ret
end
-- 根据uid获取背包内的某个仙魄
function XianPoSystem:GetBagXianPoDataByUID(uid)
local _ret = nil
if self.BagXianPoDic:ContainsKey(uid) then
_ret = self.BagXianPoDic[uid]
end
return _ret
end
-- 根据配置表id获取背包内有多少个这个id的仙魄
function XianPoSystem:GetXianPoCountByCfgId(cfgId)
local _count = self.SoulBagDic[cfgId]
if _count == nil then
_count = 0
end
return _count
end
-- 根据配置表id判定当前身上是否已有相同属性的仙魄
-- prams:cfgId 背包中的仙魄配置表ID
function XianPoSystem:IsHaveSameAttrXianPo(cfgId, selectIndex)
if selectIndex == nil then
return false
end
local _have = false
-- 根据配置表Type2再加一个判断用于仙魄互斥的判定,type2相等那么就是同一类型的仙魄不能穿戴
local _cfg = DataConfig.DataImmortalSoulAttribute
-- 经验仙魄
local _curType1 = 1
-- 道具仙魄
local _curType2 = 0
if _cfg:IsContainKey(cfgId) then
_curType1 = _cfg[cfgId].Type
_curType2 = _cfg[cfgId].Type2
end
local _selectedData = self:GetXianPoDataByIndex(selectIndex)
-- 装备了的仙魄
self.EquipedXianPoDic:ForeachCanBreak(function(key, value)
-- 1. 有互斥ID不能装备
if value.MutexIdList:Contains(cfgId) then
_have = true
return true
end
-- 3. 未镶嵌格子的点击单独处理两个特殊位置不是9和10的只要背包里面没有就不能点击
if _selectedData == nil then
if selectIndex == 9 and _curType2 ~= 9 then
_have = true
return true
elseif selectIndex == 10 and _curType2 ~= 10 then
_have = true
return true
end
-- 镶嵌的时候判断下是否是特殊仙魄
if selectIndex < 9 and _curType2 >= 9 then
_have = true
return true
end
if value.Type2 == _curType2 then
_have = true
return true
end
else
-- 4. 选中的需要替换的这个和背包中的对比
if _selectedData.Type2 == _curType2 then
-- 没有属性更高的了
if not self:CheckChangeBtnRedPoint(cfgId) then
_have = true
return true
end
-- 5. 中间两个特殊的类型单独判断下
elseif _selectedData.Type2 == 9 or _selectedData.Type2 == 10 and value.Type2 < _selectedData.Type2 then
_have = true
return true
-- 6. 替换的时候判断下是否是特殊的仙魄
elseif selectIndex < 9 and _curType2 >= 9 then
_have = true
return true
-- 已装备的这个和背包中有相同类型的仙魄
elseif value.Type2 == _curType2 then
_have = true
return true
end
end
end)
-- 7. 经验仙魄不能被装备
if _curType1 > 1 then
_have = true
end
-- 8. 什么都还没装备,判断下特定的
if _selectedData == nil then
if selectIndex == 9 and _curType2 ~= 9 then
_have = true
elseif selectIndex == 10 and _curType2 ~= 10 then
_have = true
end
-- 镶嵌的时候判断下是否是特殊仙魄
if selectIndex < 9 and _curType2 >= 9 then
_have = true
return true
end
end
return _have
end
-- 替换按钮的红点
function XianPoSystem:CheckChangeBtnRedPoint(cfgId)
local _cfg = DataConfig.DataImmortalSoulAttribute
local _curCfg = nil
if _cfg:IsContainKey(cfgId) then
_curCfg = _cfg[cfgId]
end
local _haveRedPoint = false
local _totalAttr = 0
local _curTotalAttr = 0
self.BagXianPoDic:ForeachCanBreak(function(key, _bagValue)
-- 相同类型的仙魄对比属性看是否可以替换
if _bagValue.Type2 == _curCfg.Type2 then
_bagValue.TotalAddAttrDic:Foreach(function(_id, _attr)
_totalAttr = _totalAttr + _attr
end)
local _cfgId = _curCfg.Id
self.EquipedXianPoDic:ForeachCanBreak(function(key, _equipedValue)
if _equipedValue.CfgId == _curCfg.Id then
_equipedValue.TotalAddAttrDic:ForeachCanBreak(
function(_id, _attr)
_curTotalAttr = _curTotalAttr + _attr
-- return true
end)
return true
end
end)
if _totalAttr > _curTotalAttr then
_haveRedPoint = true
return true
end
end
end)
return _haveRedPoint
end
-- 未镶嵌的卡槽红点处理
function XianPoSystem:CheckUnEquipXianPoRedPoint()
local _count = 0
-- 装备了的仙魄
local _equipDict = GameCenter.XianPoSystem.EquipedXianPoDic
-- 背包里面的仙魄
local _bagDict = GameCenter.XianPoSystem.BagXianPoDic
local _typeList = List:New()
-- 装备仙魄的所有type
_equipDict:Foreach(function(_key, _value)
if not _typeList:Contains(_value.Type2) then
_typeList:Add(_value.Type2)
end
end)
_bagDict:ForeachCanBreak(function(_key, _value)
-- 非已装备的仙魄并且非经验仙魄
if not _typeList:Contains(_value.Type2) and _value.Typ ~= 2 then
_count = _count + 1
end
end)
return _count
end
-- 获取预览界面的条件名称
function XianPoSystem:GetOverviewFormConditionName(value)
if value == 0 then
return DataConfig.DataMessageString.Get("UnlockDefault")
else
local _text = GameCenter.VariableSystem.GetVariableShowText(self.GetXianPoConditionType, value)
return UIUtils.CSFormat(DataConfig.DataMessageString.Get("UnlockByThroughPass"), _text)
end
end
-- 根据品质、等级,获取升到下一级所需经验
function XianPoSystem:GetNextLvNeedExp(quality, level)
local _ret = 0
local _cfg = DataConfig.DataImmortalSoulExp[level]
if _cfg then
if quality == XianPoQuality.Blue then
-- 蓝色
local _exp = Utils.SplitNumber(_cfg.BlueExp, "_")
_ret = _exp[1]
elseif quality == XianPoQuality.Purple then
-- 紫色
local _exp = Utils.SplitNumber(_cfg.VioletExp, "_")
_ret = _exp[1]
elseif quality == XianPoQuality.Gold then
-- 金色
local _exp = Utils.SplitNumber(_cfg.GoldenExp, "_")
_ret = _exp[1]
elseif quality == XianPoQuality.Red then
-- 红色
local _exp = Utils.SplitNumber(_cfg.GulesExp, "_")
_ret = _exp[1]
end
end
return _ret
end
-- 根据品质、等级,获取当前等级总经验
function XianPoSystem:GetCurLvTotalExp(quality, level)
local _ret = 0
local _cfg = DataConfig.DataImmortalSoulExp[level]
if _cfg then
if quality == XianPoQuality.Blue then
-- 蓝色
local _exp = Utils.SplitNumber(_cfg.BlueExp, "_")
_ret = _exp[2]
elseif quality == XianPoQuality.Purple then
-- 紫色
local _exp = Utils.SplitNumber(_cfg.VioletExp, "_")
_ret = _exp[2]
elseif quality == XianPoQuality.Gold then
-- 金色
local _exp = Utils.SplitNumber(_cfg.GoldenExp, "_")
_ret = _exp[2]
elseif quality == XianPoQuality.Red then
-- 红色
local _exp = Utils.SplitNumber(_cfg.GulesExp, "_")
_ret = _exp[2]
end
end
return _ret
end
-- 根据类型获取该种类型仙魄的类型名1属性仙魄2经验仙魄
function XianPoSystem:GetXianPoTypeName(typ)
if typ == 1 then
return "PropertyXianPo"
elseif typ == 2 then
return "PropertyExp"
else
return "PropertyXianPo"
end
end
-- =============功能函数=============--
-- 对背包里的仙魄排序
function XianPoSystem:SortBagXianPoDic()
self.BagXianPoDic:SortValue(function(a, b)
if a.Quality == b.Quality then
if a.Level == b.Level then
return a.CfgId < b.CfgId
else
return a.Level > b.Level
end
else
return a.Quality > b.Quality
end
end)
end
-- 设置仙魄的图标
function XianPoSystem:SetXianPoIcons(trans, cfgId)
-- 后面可能会增加背景品质框
local _cfg = DataConfig.DataImmortalSoulAttribute[cfgId]
local _uiIcon = UIUtils.RequireUIIconBase(trans)
local _qualitySpr = UIUtils.FindSpr(trans, "Quality")
if _uiIcon and _cfg then
_uiIcon:UpdateIcon(_cfg.Icon)
_qualitySpr.spriteName = Utils.GetQualitySpriteName(tonumber(_cfg.Quality))
end
end
-- 设置仙魄的tips
function XianPoSystem:SetXianPoTips(trans, cfgId)
local _tipsRoot = UIUtils.FindTrans(trans, "Tips")
local _iconTrs = UIUtils.FindTrans(_tipsRoot, "Icon")
self:SetXianPoIcons(_iconTrs, cfgId)
local _cfg = DataConfig.DataImmortalSoulAttribute[cfgId]
if _cfg then
-- 名字
local _nameLab = UIUtils.FindLabel(_tipsRoot, "Name")
UIUtils.SetTextByStringDefinesID(_nameLab, _cfg._Name)
-- 等级
-- local _levelLab = UIUtils.FindLabel(_tipsRoot, "Level")
-- 类型
local _typeLab = UIUtils.FindLabel(_tipsRoot, "Type")
UIUtils.SetTextByEnum(_typeLab, self:GetXianPoTypeName(_cfg.Type))
-- 属性
local _attrCloneGo = UIUtils.FindGo(_tipsRoot, "AttrClone")
local _attrCloneRoot = UIUtils.FindTrans(_tipsRoot, "AttrCloneGrid")
local _attrCloneRootGrid = UIUtils.FindGrid(_tipsRoot, "AttrCloneGrid")
-- 先隐藏所有属性
for i = 0, _attrCloneRoot.childCount - 1 do
_attrCloneRoot:GetChild(i).gameObject:SetActive(false)
end
if _cfg.DemandValue and _cfg.DemandValue ~= "" then
local _attrList = Utils.SplitStrByTableS(_cfg.DemandValue)
for i = 1, #_attrList do
local _go
if i - 1 < _attrCloneRoot.childCount then
_go = _attrCloneRoot:GetChild(i - 1).gameObject
else
_go = UnityUtils.Clone(_attrCloneGo, _attrCloneRoot)
end
local _label = UIUtils.FindLabel(_go.transform)
UIUtils.SetTextByPropNameAndValue(_label, _attrList[i][1], _attrList[i][2])
_go:SetActive(true)
end
end
_attrCloneRootGrid.repositionNow = true
-- 获得方式
local _getMethodLab = UIUtils.FindLabel(_tipsRoot, "GetMethod")
UIUtils.SetTextByString(_getMethodLab, self:GetOverviewFormConditionName(_cfg.OverviewConditions))
end
end
function XianPoSystem:GetCoreDic()
if self.DicJianCore == nil then
self.DicJianCore = Dictionary:New()
DataConfig.DataImmortalSoulCore:Foreach(function(k, v)
local _data = L_JianCore:New()
_data.JianId = k
self.DicJianCore:Add(k,_data)
end)
end
return self.DicJianCore
end
function XianPoSystem:GetJianCoreData(index)
local _ret = nil
local _dic = self:GetCoreDic()
if _dic ~= nil then
_ret = _dic[index]
end
return _ret
end
function XianPoSystem:GetJianValid(index)
local _ret = false
local _jianCore = nil
local _dic = self:GetCoreDic()
if _dic ~= nil then
_jianCore = _dic[index]
if _jianCore ~= nil then
_ret = _jianCore:GetJianValid()
end
end
return _ret
end
function XianPoSystem:GetJianName(index)
local _ret = ""
for i = 1, #self.JianLingList do
if index == i then
_ret = self.JianLingList[i]
break
end
end
return _ret
end
--获取所有装备仙魄的等级
function XianPoSystem:GetAllEquipLv(index)
local _ret = 0
local _keys = self.EquipedXianPoDic:GetKeys()
for i = 1, #_keys do
local _key = _keys[i]
if math.floor( _key / 100 ) == index then
local _data = self.EquipedXianPoDic[_key]
if _data ~= nil then
_ret = _ret + _data.Level
end
end
end
return _ret
end
--获取激活条件
function XianPoSystem:GetJianActiveDes(index)
local _ret = ""
local _lv = 0
local _jianName = ""
local _preJianName = ""
local _coreName = ""
local _cfg = DataConfig.DataGlobal[GlobalName.immortal_soul_core_limit]
if _cfg ~= nil then
local _list = Utils.SplitStr(_cfg.Params, ';')
if _list ~= nil then
for i = 1, #_list do
local _values = Utils.SplitNumber(_list[i], '_')
if _values ~= nil then
if _values[1] == index then
_lv = _values[2]
break
end
end
end
end
end
local _nameList = self:GetNameList()
if _nameList ~= nil then
if index <= #_nameList then
_jianName = _nameList[index]
end
if index - 1 > 0 and index - 1 <= #_nameList then
_preJianName = _nameList[index - 1]
end
end
local _preCfg = DataConfig.DataImmortalSoulCore[index - 1]
if _preCfg ~= nil then
_coreName = _preCfg.Name
end
_ret = UIUtils.CSFormat(DataConfig.DataMessageString.Get("LING_PO_CORE_open_next"), _coreName, _lv, _jianName)
return _ret
end
function XianPoSystem:ResSoulCore(msg)
if msg == nil then
return
end
local _dic = self:GetCoreDic()
if _dic ~= nil then
if msg.info ~= nil then
for i = 1, #msg.info do
local _data = _dic[i]
_data.JianId = i
_data.CoreId = msg.info[i].core
end
end
end
end
function XianPoSystem:ResSoulCoreUpdate(msg)
if msg == nil then
return
end
local _dic = self:GetCoreDic()
if _dic == nil then
return
end
local _data = _dic[msg.info.type]
if _data ~= nil then
_data.CoreId = msg.info.core
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_LINGPO_CORE_LV_RESULT)
end
function XianPoSystem:ReqDismountingSoul(id)
GameCenter.Network.Send("MSG_ImmortalSoul.ReqDismountingSoul", {
uid = id
})
end
function XianPoSystem:ResDismountingSoulReuslt(msg)
if msg == nil then
return
end
if msg.isSucceed then
self:RemoveBag(msg.uid)
end
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_XIANPO_DECOMPOSITION)
end
return XianPoSystem