Files
Main/Assets/GameAssets/Resources/Lua/Logic/XianPo/XianPoSystem.lua

1779 lines
60 KiB
Lua
Raw Normal View History

2025-01-25 04:38:09 +08:00
------------------------------------------------
-- 作者: 陈宇
-- 日期: 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