forked from endernon/PGRData
305 lines
10 KiB
Lua
305 lines
10 KiB
Lua
|
local XTheatreToken = require("XEntity/XTheatre/Token/XTheatreToken")
|
|||
|
local XAdventureSkill = require("XEntity/XTheatre/Adventure/XAdventureSkill")
|
|||
|
|
|||
|
local Default = {
|
|||
|
_SkillIllustratedBook = {}, --已解锁的技能图鉴字典,存的是TheatreSkill表的Id
|
|||
|
_Keepsakes = {}, --已解锁的信物
|
|||
|
_UnlockTokenLevelDic = {}, --已解锁的信物的当前等级字典
|
|||
|
_UnlockTokenCurLvToIdDic = {}, --已解锁的当前等级的信物对应的TheatreItem表的Id
|
|||
|
_SkillPowerAndPosToSkillIdDic = {}, --已解锁的核心技能当前势力和位置对应的TheatreSkill表的Id(相同势力相同位置的核心技能只会存最高等级的Id)
|
|||
|
}
|
|||
|
|
|||
|
-- 信物(道具)和技能图鉴管理
|
|||
|
local XTheatreTokenManager = XClass(nil, "XTheatreTokenManager")
|
|||
|
|
|||
|
function XTheatreTokenManager:Ctor()
|
|||
|
for key, value in pairs(Default) do
|
|||
|
if type(value) == "table" then
|
|||
|
self[key] = {}
|
|||
|
else
|
|||
|
self[key] = value
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XTheatreTokenManager:UpdateData(data)
|
|||
|
self:UpdateSkillPowerAndPosToSkillIdDic(data.SkillIllustratedBook)
|
|||
|
|
|||
|
if not self.TokenDic then
|
|||
|
self:InitAllToken()
|
|||
|
end
|
|||
|
|
|||
|
for _, v in ipairs(data.Keepsakes) do
|
|||
|
self:UpdateKeepsake(v)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XTheatreTokenManager:UpdateSkillPowerAndPosToSkillIdDic(skillIllustratedBook)
|
|||
|
local powerId
|
|||
|
local pos
|
|||
|
local curTheatreSkillId
|
|||
|
local curSkillLv --已存在字典里的技能等级
|
|||
|
local skillLv
|
|||
|
|
|||
|
for _, theatreSkillId in pairs(skillIllustratedBook) do
|
|||
|
self._SkillIllustratedBook[theatreSkillId] = true
|
|||
|
|
|||
|
powerId = XTheatreConfigs.GetTheatreSkillPowerId(theatreSkillId)
|
|||
|
pos = XTheatreConfigs.GetTheatreSkillPos(theatreSkillId)
|
|||
|
if XTool.IsNumberValid(pos) then
|
|||
|
if not self._SkillPowerAndPosToSkillIdDic[powerId] then
|
|||
|
self._SkillPowerAndPosToSkillIdDic[powerId] = {}
|
|||
|
end
|
|||
|
|
|||
|
curTheatreSkillId = self._SkillPowerAndPosToSkillIdDic[powerId][pos]
|
|||
|
curSkillLv = curTheatreSkillId and XTheatreConfigs.GetTheatreSkillLv(curTheatreSkillId) or 0
|
|||
|
skillLv = XTheatreConfigs.GetTheatreSkillLv(theatreSkillId)
|
|||
|
if curSkillLv < skillLv then
|
|||
|
self._SkillPowerAndPosToSkillIdDic[powerId][pos] = theatreSkillId
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XTheatreTokenManager:UpdateKeepsake(keepsakeData)
|
|||
|
table.insert(self._Keepsakes, keepsakeData)
|
|||
|
|
|||
|
if not self.TokenDic or not self.TokenKeepsakeIdAndLvDic then
|
|||
|
self:InitAllToken()
|
|||
|
end
|
|||
|
|
|||
|
local keepsakeId = keepsakeData.KeepsakeId --信物id, TheatreItem表的KeepsakeId
|
|||
|
local lv = keepsakeData.Lv
|
|||
|
local theatreItemId = self.TokenKeepsakeIdAndLvDic[keepsakeId][lv]
|
|||
|
local theatreKeepsake = theatreItemId and self.TokenDic[theatreItemId]
|
|||
|
if not theatreKeepsake then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
theatreKeepsake:UpdateData(keepsakeData)
|
|||
|
if not self._UnlockTokenLevelDic[keepsakeId] or self._UnlockTokenLevelDic[keepsakeId] < lv then
|
|||
|
self._UnlockTokenLevelDic[keepsakeId] = lv
|
|||
|
self._UnlockTokenCurLvToIdDic[keepsakeId] = theatreKeepsake:GetId()
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--更新等级和携带信物战斗次数
|
|||
|
function XTheatreTokenManager:UpdateKeepsakeLv(data)
|
|||
|
if not self.TokenDic or not self.TokenKeepsakeIdAndLvDic then
|
|||
|
self:InitAllToken()
|
|||
|
end
|
|||
|
|
|||
|
local keepsakeId = data.KeepsakeId --信物id, TheatreItem表的KeepsakeId
|
|||
|
local lv = data.Lv
|
|||
|
local theatreItemId = self.TokenKeepsakeIdAndLvDic[keepsakeId][lv]
|
|||
|
local theatreKeepsake = theatreItemId and self.TokenDic[theatreItemId]
|
|||
|
if not theatreKeepsake then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
theatreKeepsake:UpdateData(data)
|
|||
|
if not self._UnlockTokenLevelDic[keepsakeId] or self._UnlockTokenLevelDic[keepsakeId] < lv then
|
|||
|
self._UnlockTokenLevelDic[keepsakeId] = lv
|
|||
|
self._UnlockTokenCurLvToIdDic[keepsakeId] = theatreKeepsake:GetId()
|
|||
|
end
|
|||
|
|
|||
|
self:UpdateCurAdventureToken(data)
|
|||
|
end
|
|||
|
|
|||
|
function XTheatreTokenManager:UpdateCurAdventureToken(data)
|
|||
|
--更新局内携带中的信物
|
|||
|
local adventureManager = XDataCenter.TheatreManager.GetCurrentAdventureManager()
|
|||
|
if not adventureManager then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local currToken = adventureManager:GetCurrentToken()
|
|||
|
if not currToken then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local curKeepsakeId = currToken:GetKeepsakeId()
|
|||
|
if curKeepsakeId ~= data.KeepsakeId then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local tokenId = XDataCenter.TheatreManager.GetTokenManager():GetTokenId(data.KeepsakeId)
|
|||
|
adventureManager:UpdateCurrentToken(XTheatreToken.New(tokenId))
|
|||
|
end
|
|||
|
|
|||
|
function XTheatreTokenManager:InitAllToken()
|
|||
|
if self.TokenList and self.TokenDic and self.TokenKeepsakeIdAndLvDic then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
self.TokenList = {}
|
|||
|
self.TokenDic = {}
|
|||
|
self.TokenKeepsakeIdAndLvDic = {} --TheatreItem表的KeepsakeId和等级,对应的TheatreItem表Id
|
|||
|
local configs = XTheatreConfigs.GetTheatreItem()
|
|||
|
for id, v in pairs(configs) do
|
|||
|
local template = XTheatreToken.New(id)
|
|||
|
self.TokenDic[id] = template
|
|||
|
table.insert(self.TokenList, template)
|
|||
|
|
|||
|
if XTool.IsNumberValid(v.KeepsakeId) then
|
|||
|
if not self.TokenKeepsakeIdAndLvDic[v.KeepsakeId] then
|
|||
|
self.TokenKeepsakeIdAndLvDic[v.KeepsakeId] = {}
|
|||
|
end
|
|||
|
self.TokenKeepsakeIdAndLvDic[v.KeepsakeId][v.Lv] = id
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--获得所有信物和道具
|
|||
|
--isOnlyShowCurLevelToken:是否只显示当前等级且已激活的信物
|
|||
|
function XTheatreTokenManager:GetAllToken(isOnlyShowCurLevelToken)
|
|||
|
if not self.TokenList then
|
|||
|
self:InitAllToken()
|
|||
|
end
|
|||
|
|
|||
|
local isInsertKeepsakeDic = {}
|
|||
|
local tokenList = {}
|
|||
|
if not isOnlyShowCurLevelToken then
|
|||
|
for _, token in ipairs(self.TokenList) do
|
|||
|
--信物已激活时只显示当前等级,未激活显示最低等级
|
|||
|
local keepsakeId = token:GetKeepsakeId()
|
|||
|
if (not token:IsToken()) or
|
|||
|
(not self._UnlockTokenCurLvToIdDic[keepsakeId] and XTheatreConfigs.GetTheatreMinLvTheatreItemId(keepsakeId) == token:GetId()) or
|
|||
|
self._UnlockTokenCurLvToIdDic[keepsakeId] == token:GetId() then
|
|||
|
table.insert(tokenList, token)
|
|||
|
end
|
|||
|
end
|
|||
|
else
|
|||
|
for _, token in ipairs(self.TokenList) do
|
|||
|
if token:IsToken() and self._UnlockTokenCurLvToIdDic[token:GetKeepsakeId()] == token:GetId() then
|
|||
|
table.insert(tokenList, token)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
table.sort(tokenList, function(tokenA, tokenB)
|
|||
|
--已解锁优先
|
|||
|
local isActiveA = tokenA:IsActive()
|
|||
|
local isActiveB = tokenB:IsActive()
|
|||
|
if isActiveA ~= isActiveB then
|
|||
|
return isActiveA
|
|||
|
end
|
|||
|
|
|||
|
--按照类型由小到大排序
|
|||
|
local typeA = tokenA:GetType()
|
|||
|
local typeB = tokenB:GetType()
|
|||
|
if typeA ~= typeB then
|
|||
|
return typeA < typeB
|
|||
|
end
|
|||
|
|
|||
|
return tokenA:GetId() < tokenB:GetId()
|
|||
|
end)
|
|||
|
|
|||
|
return tokenList
|
|||
|
end
|
|||
|
|
|||
|
--返回和势力Id相同的技能列表,powerId为0或nil时返回所有技能Id
|
|||
|
function XTheatreTokenManager:GetSkillTemplateList(powerId)
|
|||
|
local isFilter = XTool.IsNumberValid(powerId)
|
|||
|
local config = XTheatreConfigs.GetTheatreSkill()
|
|||
|
local skillTemplateList = {}
|
|||
|
for _, v in pairs(config) do
|
|||
|
if not isFilter or v.PowerId == powerId then
|
|||
|
table.insert(skillTemplateList, XAdventureSkill.New(v.Id))
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
table.sort(skillTemplateList, function(a, b)
|
|||
|
local idA = a:GetId()
|
|||
|
local idB = b:GetId()
|
|||
|
|
|||
|
--是否已解锁
|
|||
|
local isActiveA = self:IsActiveSkill(idA)
|
|||
|
local isActiveB = self:IsActiveSkill(idB)
|
|||
|
if isActiveA ~= isActiveB then
|
|||
|
return isActiveA
|
|||
|
end
|
|||
|
|
|||
|
--是否核心增益
|
|||
|
local skillTypeA = a:GetSkillType()
|
|||
|
local skillTypeB = b:GetSkillType()
|
|||
|
if skillTypeA ~= skillTypeB then
|
|||
|
if skillTypeA == XTheatreConfigs.SkillType.Core then
|
|||
|
return true
|
|||
|
end
|
|||
|
if skillTypeB == XTheatreConfigs.SkillType.Core then
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--势力由小到大
|
|||
|
local powerIdA = a:GetPowerId()
|
|||
|
local powerIdB = b:GetPowerId()
|
|||
|
if powerIdA ~= powerIdB then
|
|||
|
return powerIdA < powerIdB
|
|||
|
end
|
|||
|
|
|||
|
return idA < idB
|
|||
|
end)
|
|||
|
return skillTemplateList
|
|||
|
end
|
|||
|
|
|||
|
function XTheatreTokenManager:IsActiveSkill(theatreSkillId)
|
|||
|
if self._SkillIllustratedBook[theatreSkillId] then
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
--比激活的相同势力相同位置的核心技能等级小的都判断激活
|
|||
|
local powerId = XTheatreConfigs.GetTheatreSkillPowerId(theatreSkillId)
|
|||
|
local pos = XTheatreConfigs.GetTheatreSkillPos(theatreSkillId)
|
|||
|
local activeTheatreSkillId = self:GetTheatreSkillIdByPowerIdAndPos(powerId, pos)
|
|||
|
if activeTheatreSkillId then
|
|||
|
local activeSkillLv = XTheatreConfigs.GetTheatreSkillLv(activeTheatreSkillId)
|
|||
|
local skillLv = XTheatreConfigs.GetTheatreSkillLv(theatreSkillId)
|
|||
|
if skillLv <= activeSkillLv then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--局内激活技能
|
|||
|
local adventureManager = XDataCenter.TheatreManager.GetCurrentAdventureManager()
|
|||
|
if adventureManager then
|
|||
|
local currSkills = adventureManager:GetCurrentSkills()
|
|||
|
for _, adventureSkill in ipairs(currSkills) do
|
|||
|
if adventureSkill:GetId() == theatreSkillId then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
function XTheatreTokenManager:GetTheatreSkillIdByPowerIdAndPos(powerId, pos)
|
|||
|
if not XTool.IsNumberValid(powerId) or not XTool.IsNumberValid(pos) then
|
|||
|
return
|
|||
|
end
|
|||
|
return self._SkillPowerAndPosToSkillIdDic[powerId] and self._SkillPowerAndPosToSkillIdDic[powerId][pos]
|
|||
|
end
|
|||
|
|
|||
|
function XTheatreTokenManager:IsActiveToken(theatreItemId)
|
|||
|
if not self.TokenDic then
|
|||
|
self:InitAllToken()
|
|||
|
end
|
|||
|
local token = self.TokenDic[theatreItemId]
|
|||
|
return token and token:IsActive() or false
|
|||
|
end
|
|||
|
|
|||
|
-- 检查是否有指定信物
|
|||
|
-- id : 信物Id,若不传直接判断是否有任意信物
|
|||
|
function XTheatreTokenManager:CheckHasToken(id)
|
|||
|
if id then
|
|||
|
return self:IsActiveToken(id)
|
|||
|
end
|
|||
|
return not XTool.IsTableEmpty(self._Keepsakes)
|
|||
|
end
|
|||
|
|
|||
|
function XTheatreTokenManager:GetTokenId(keepsakeId)
|
|||
|
return self._UnlockTokenCurLvToIdDic[keepsakeId]
|
|||
|
end
|
|||
|
|
|||
|
return XTheatreTokenManager
|