808 lines
No EOL
32 KiB
Lua
808 lines
No EOL
32 KiB
Lua
local XExFubenSimulationChallengeManager = require("XEntity/XFuben/XExFubenSimulationChallengeManager")
|
||
local XAwarenessChapter = require("XEntity/XAwareness/XAwarenessChapter")
|
||
local XAwarenessTeam = require("XEntity/XAwareness/XAwarenessTeam")
|
||
|
||
--- 意识公约管理器
|
||
XFubenAwarenessManagerCreator = function()
|
||
local XFubenAwarenessManager = {}
|
||
|
||
XFubenAwarenessManager.CAPTIAN_MEMBER_INDEX = 1 -- 队长位置
|
||
XFubenAwarenessManager.FIRSTFIGHT_MEMBER_INDEX = 1 -- 首发位置
|
||
|
||
local MEMBER_MAX_COUNT = 3 -- 队伍最大成员数
|
||
|
||
-- 自定义数据
|
||
local ChapterIdList = nil
|
||
local ChapterDataDict = nil -- 章节
|
||
|
||
local TeamDataDict = nil -- 队伍
|
||
local LoadingData = nil
|
||
local ChapterFirstPassTrigger = nil
|
||
--- 服务器下发确认的数据
|
||
local ChapterTeamRecords = {}
|
||
local ChapterTeamRecordsDic = {} -- ChapterTeamRecords 的重定义字典
|
||
local FinishStageIds = {}
|
||
local FinishStageIdDic = {}
|
||
|
||
------ 战斗接口用的数据
|
||
local FinishFightCb = nil
|
||
local CloseLoadingCb = nil
|
||
-- local MEMBER_INDEX_BY_ORDER = {[1] = 2, [2] = 1, [3] = 3} -- 面板上显示的位置(order) = 队伍中实际中的位置(index)
|
||
local MEMBER_ORDER_BY_INDEX = {[1] = 2, [2] = 1, [3] = 3 } -- 队伍中实际中的位置(index) = 面板上显示的位置(order)
|
||
local ChapterIdByStageId = nil -- {[stageId] = chapterId, ...}
|
||
local FollowGroupDict = nil -- {[前置组id] = {后置组id, ...}, ...}
|
||
|
||
function XFubenAwarenessManager.Init()
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetChapterFirstPassTrigger()
|
||
if ChapterFirstPassTrigger then
|
||
local tempData = ChapterFirstPassTrigger
|
||
ChapterFirstPassTrigger = nil
|
||
return tempData
|
||
end
|
||
end
|
||
|
||
-- 角色是否已在占领
|
||
function XFubenAwarenessManager.CheckCharacterInOccupy(characterId)
|
||
local chapterData
|
||
for _, id in ipairs(XFubenAwarenessManager.GetChapterIdList()) do
|
||
chapterData = XFubenAwarenessManager.GetChapterDataById(id)
|
||
if chapterData:GetCharacterId() == characterId then
|
||
return true, id
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetChapterDataById(id)
|
||
if not id then
|
||
XLog.Error("XFubenAwarenessManager.GetChapterDataById函数参数id不能为空" .. tostring(id))
|
||
return
|
||
end
|
||
if not ChapterDataDict then
|
||
ChapterDataDict = {}
|
||
end
|
||
if not ChapterDataDict[id] then
|
||
ChapterDataDict[id] = XAwarenessChapter.New(id)
|
||
end
|
||
return ChapterDataDict[id]
|
||
end
|
||
|
||
-- 根据意识位拿chapter
|
||
function XFubenAwarenessManager.GetChapterDataBySiteNum(siteNum)
|
||
local chapterId = XFubenAwarenessManager.GetChapterIdList()[siteNum]
|
||
return XFubenAwarenessManager.GetChapterDataById(chapterId)
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetCurrentChapterData()
|
||
local idList = XFubenAwarenessManager.GetChapterIdList()
|
||
for _, chapterId in ipairs(idList) do
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
||
if not chapterData:IsPass() then
|
||
return chapterData
|
||
end
|
||
end
|
||
return XFubenAwarenessManager.GetChapterDataById(idList[#idList])
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetChapterIdList()
|
||
if XTool.IsTableEmpty(ChapterIdList) then
|
||
ChapterIdList = {}
|
||
for chapterId, v in pairs(XFubenAwarenessConfigs.GetAllConfigs(XFubenAwarenessConfigs.TableKey.AwarenessChapter)) do
|
||
table.insert(ChapterIdList, chapterId)
|
||
end
|
||
table.sort(ChapterIdList, function(a, b)
|
||
local chapterA = XFubenAwarenessManager.GetChapterDataById(a)
|
||
local chapterB = XFubenAwarenessManager.GetChapterDataById(b)
|
||
|
||
return chapterA:GetCfg().Site < chapterB:GetCfg().Site
|
||
end)
|
||
end
|
||
return ChapterIdList
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetAllChapterOccupyNum()
|
||
local count = 0
|
||
for _, chapterId in ipairs(XFubenAwarenessManager.GetChapterIdList()) do
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
||
if chapterData:IsOccupy() then
|
||
count = count + 1
|
||
end
|
||
end
|
||
return count
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetChapterProgressTxt()
|
||
local chapterData = XFubenAwarenessManager.GetCurrentChapterData()
|
||
return CS.XTextManager.GetText("AssignChapterProgressTxt", chapterData:GetDesc())
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetCharacterOccupyChapterId(characterId)
|
||
if characterId and characterId ~= 0 then
|
||
for _, chapterId in ipairs(XFubenAwarenessManager.GetChapterIdList()) do
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
||
if chapterData:GetCharacterId() == characterId then
|
||
return chapterId
|
||
end
|
||
end
|
||
end
|
||
return nil
|
||
end
|
||
|
||
-- 检查该group是否有服务器记录过队伍数据
|
||
function XFubenAwarenessManager.CheckChapterHadRecordTeam(chapterId)
|
||
return ChapterTeamRecordsDic[chapterId]
|
||
end
|
||
|
||
-- 检查该group是否有服务器记录过队伍数据
|
||
function XFubenAwarenessManager.GetChapterTeamRecords()
|
||
return ChapterTeamRecords
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetFinishStageIds()
|
||
return FinishStageIds
|
||
end
|
||
|
||
function XFubenAwarenessManager.CheckStageFinish(stageId)
|
||
return FinishStageIdDic[stageId]
|
||
end
|
||
|
||
-- 角色是否已在队伍中
|
||
function XFubenAwarenessManager.CheckCharacterInTeam(characterId)
|
||
for _, teamData in pairs(TeamDataDict) do
|
||
if teamData:GetCharacterOrder(characterId) ~= nil then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 该角色是否已有关卡进度 压制
|
||
function XFubenAwarenessManager.CheckCharacterInMultiTeamLock(characterId, groupId)
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(groupId)
|
||
local isIn, teamData, teamOrder = XFubenAwarenessManager.CheckCharacterInCurChapterTeam(characterId, groupId)
|
||
|
||
local stageList = chapterData:GetStageId()
|
||
local stageId = stageList[teamOrder]
|
||
|
||
return XFubenAwarenessManager.CheckStageFinish(stageId)
|
||
end
|
||
|
||
-- 角色是否已在该chapter的队伍中
|
||
function XFubenAwarenessManager.CheckCharacterInCurChapterTeam(characterId, chapterId)
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
||
|
||
for order, teamId in pairs(chapterData:GetTeamInfoId()) do
|
||
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
||
if teamData:GetCharacterOrder(characterId) ~= nil then
|
||
return true, teamData, order
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 获取其他队伍的角色
|
||
function XFubenAwarenessManager.GetOtherTeamCharacters(chapterId, srcTeamId)
|
||
local otherTeamCharacters = {}
|
||
for _, teamId in pairs(ChapterDataDict[chapterId]:GetTeamInfoId()) do
|
||
if teamId ~= srcTeamId and TeamDataDict[teamId] then
|
||
for i, member in ipairs(TeamDataDict[teamId]:GetMemberList()) do
|
||
local characterId = member:GetCharacterId()
|
||
if characterId and characterId ~= 0 then
|
||
table.insert(otherTeamCharacters, { teamId, i, characterId })
|
||
end
|
||
end
|
||
end
|
||
end
|
||
return otherTeamCharacters
|
||
end
|
||
|
||
-- 获取某组里 角色对应的队伍编号
|
||
function XFubenAwarenessManager.GetCharacterTeamOderMapByGroup(chapterId)
|
||
local teamOrderMap = {}
|
||
local teamIdMap = {}
|
||
for i, teamId in pairs(ChapterDataDict[chapterId]:GetTeamInfoId()) do
|
||
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
||
for _, memberData in ipairs(teamData:GetMemberList()) do
|
||
if memberData:HasCharacter() then
|
||
teamIdMap[memberData:GetCharacterId()] = teamId
|
||
teamOrderMap[memberData:GetCharacterId()] = i
|
||
end
|
||
end
|
||
end
|
||
return teamIdMap, teamOrderMap
|
||
end
|
||
|
||
function XFubenAwarenessManager.SwapMultiTeamMember(aTeam, aPos, bTeam, bPos)
|
||
local aMemberData = aTeam:GetMemberList()[aPos]
|
||
local bMemberData = bTeam:GetMemberList()[bPos]
|
||
local aTeamaPosCharId = aMemberData:GetCharacterId()
|
||
local bTeambPosCharId = bMemberData:GetCharacterId()
|
||
|
||
if aTeamaPosCharId == bTeambPosCharId then
|
||
bMemberData:SetCharacterId(0)
|
||
else
|
||
aMemberData:SetCharacterId(bTeambPosCharId)
|
||
bMemberData:SetCharacterId(aTeamaPosCharId)
|
||
end
|
||
end
|
||
|
||
function XFubenAwarenessManager.SetTeamMember(teamId, targetOrder, characterId)
|
||
local targetTeamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
||
targetTeamData:SetMember(targetOrder, characterId)
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetTeamDataById(id)
|
||
if not TeamDataDict then
|
||
TeamDataDict = {}
|
||
end
|
||
if not TeamDataDict[id] then
|
||
TeamDataDict[id] = XAwarenessTeam.New(id)
|
||
end
|
||
return TeamDataDict[id]
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetTeamCharacterType(teamId)
|
||
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
||
return teamData:GetCharacterType()
|
||
end
|
||
|
||
function XFubenAwarenessManager.IsCharacterInTeamById(teamId, characterId)
|
||
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
||
return teamData:GetCharacterOrder(characterId) ~= nil
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetChapterMemberCount(chapterId)
|
||
local count = 0
|
||
for _, teamId in pairs(ChapterDataDict[chapterId]:GetTeamInfoId()) do
|
||
for _, member in ipairs(XFubenAwarenessManager.GetTeamDataById(teamId):GetMemberList()) do
|
||
if member:HasCharacter() then
|
||
count = count + 1
|
||
end
|
||
end
|
||
end
|
||
return count
|
||
end
|
||
|
||
-- 一键上阵
|
||
function XFubenAwarenessManager.AutoTeam(chapterId)
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
||
for k, stageId in pairs(chapterData:GetStageId()) do
|
||
local isFinish = XFubenAwarenessManager.CheckStageFinish(stageId)
|
||
if isFinish then -- 有完成进度
|
||
XUiManager.TipError(CS.XTextManager.GetText("AutoTeamLimit"))
|
||
return
|
||
end
|
||
end
|
||
|
||
local ownCharacters = XDataCenter.CharacterManager.GetOwnCharacterList()
|
||
table.sort(ownCharacters, function(a, b)
|
||
return a.Ability > b.Ability
|
||
end)
|
||
-- 保留当前角色
|
||
-- local curCharacters = XFubenAwarenessManager.GetOtherTeamCharacters(chapterId, nil)
|
||
for _, teamId in pairs(ChapterDataDict[chapterId]:GetTeamInfoId()) do
|
||
local targetTeamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
||
targetTeamData:ClearMemberList()
|
||
end
|
||
local count = 1
|
||
local maxCount = #ownCharacters
|
||
for _, teamId in pairs(ChapterDataDict[chapterId]:GetTeamInfoId()) do
|
||
if count > maxCount then
|
||
break
|
||
end
|
||
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
||
local needCount = teamData:GetNeedCharacter()
|
||
for index = 1, needCount do
|
||
local order = XFubenAwarenessManager.GetMemberOrderByIndex(index, needCount)
|
||
local targetTeamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
||
|
||
local stageId = teamId
|
||
local characterLimitType = XFubenConfigs.GetStageCharacterLimitType(teamId)
|
||
local defaultCharacterType = XDataCenter.FubenManager.GetDefaultCharacterTypeByCharacterLimitType(characterLimitType)
|
||
|
||
local i
|
||
for charIndex, char in ipairs(ownCharacters) do
|
||
local charType = XCharacterConfigs.GetCharacterType(char.Id)
|
||
if defaultCharacterType ~= XFubenConfigs.CharacterLimitType.All and defaultCharacterType ~= charType then
|
||
goto CONTINUE
|
||
end
|
||
XFubenAwarenessManager.SetTeamMember(teamId, order, char.Id)
|
||
i = charIndex
|
||
break
|
||
:: CONTINUE ::
|
||
end
|
||
if i then
|
||
table.remove(ownCharacters, i)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 是否满足关卡所需战力
|
||
function XFubenAwarenessManager.IsAbilityMatch(targetStageId, charIdList)
|
||
local chapterId = XFubenAwarenessConfigs.GetChapterIdByStageId(targetStageId)
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
||
local isMatch = false
|
||
local teamIdList = chapterData:GetTeamInfoId()
|
||
for i, stageId in pairs(chapterData:GetStageId()) do
|
||
if stageId == targetStageId then
|
||
isMatch = true
|
||
local teamId = teamIdList[i]
|
||
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
||
for order = 1, teamData:GetNeedCharacter() do
|
||
local characterId = charIdList[order]
|
||
local character = XDataCenter.CharacterManager.GetCharacter(characterId)
|
||
if character.Ability < teamData:GetRequireAbility() then
|
||
isMatch = false
|
||
break
|
||
end
|
||
end
|
||
break
|
||
end
|
||
end
|
||
return isMatch
|
||
end
|
||
|
||
function XFubenAwarenessManager.SetCloseLoadingCb(cb)
|
||
CloseLoadingCb = cb
|
||
end
|
||
|
||
function XFubenAwarenessManager.SetFinishFightCb(cb)
|
||
FinishFightCb = cb
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetMemberOrderByIndex(index, maxCount)
|
||
return maxCount > 1 and MEMBER_ORDER_BY_INDEX[index] or index
|
||
end
|
||
|
||
|
||
function XFubenAwarenessManager.CheckIsGroupLastStage(stageId)
|
||
local chapterId = XFubenAwarenessConfigs.GetChapterIdByStageId(stageId)
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
||
local stageIdList = chapterData:GetStageId()
|
||
return (stageIdList[#stageIdList] == stageId)
|
||
end
|
||
|
||
------ 以下是在FubenManager注册的函数
|
||
function XFubenAwarenessManager.InitStageInfo()
|
||
local stageType = XDataCenter.FubenManager.StageType.Awareness
|
||
for _, chapterId in pairs(XFubenAwarenessManager.GetChapterIdList()) do
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
||
for _, stageId in ipairs(chapterData:GetStageId()) do
|
||
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
|
||
stageInfo.IsOpen = true
|
||
stageInfo.Type = stageType
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 设置进入loading界面用到的数据
|
||
function XFubenAwarenessManager.SetEnterLoadingData(stageIndex, teamCharList, chapterData, isNextFight)
|
||
LoadingData = {
|
||
StageIndex = stageIndex,
|
||
TeamCharList = teamCharList,
|
||
ChapterData = chapterData,
|
||
IsNextFight = isNextFight,
|
||
}
|
||
end
|
||
|
||
-- 打开战斗前loading界面
|
||
function XFubenAwarenessManager.OpenFightLoading(stageId)
|
||
if LoadingData.IsNextFight then
|
||
XLuaUiManager.Open("UiAssignLoading", LoadingData)
|
||
else
|
||
XLuaUiManager.Open("UiLoading", LoadingType.Fight)
|
||
end
|
||
end
|
||
|
||
function XFubenAwarenessManager.CloseFightLoading()
|
||
XLuaUiManager.Remove("UiAssignLoading")
|
||
XLuaUiManager.Remove("UiLoading")
|
||
if CloseLoadingCb then
|
||
CloseLoadingCb()
|
||
end
|
||
end
|
||
|
||
function XFubenAwarenessManager.ShowReward(winData)
|
||
-- 同步本地战斗后的关卡数据
|
||
-- 关卡通关数据要先刷新,再在下一关for循环检测,最后再清除
|
||
FinishStageIdDic[winData.StageId] = true
|
||
|
||
local index = nil
|
||
local targetNextStageId = nil
|
||
local chapterData = LoadingData.ChapterData
|
||
local stageIdList = chapterData:GetStageId()
|
||
for i = 1, #stageIdList, 1 do
|
||
local stageId = stageIdList[i]
|
||
if not XFubenAwarenessManager.CheckStageFinish(stageId) then
|
||
index = i
|
||
targetNextStageId = stageId
|
||
break
|
||
end
|
||
end
|
||
|
||
-- 如果还有未完成的关
|
||
if targetNextStageId then
|
||
-- 且是连续挑战
|
||
if LoadingData.IsNextFight then
|
||
local isNextFight = true
|
||
|
||
local _, teamCharListOrg, captainPosList, firstFightPosList = XFubenAwarenessManager.TryGetFightTeamCharList(chapterData:GetId())
|
||
local teamCharList = teamCharListOrg[index]
|
||
|
||
XFubenAwarenessManager.SetEnterLoadingData(index, teamCharList, chapterData, isNextFight)
|
||
XDataCenter.FubenManager.EnterAwarenessFight(targetNextStageId, teamCharList, captainPosList[index], nil, nil, firstFightPosList[index])
|
||
end
|
||
else
|
||
-- 如果没有未完成的关了 说明已经作战完毕 结算
|
||
-- 并清除所有已完成的关卡数据
|
||
for k, id in pairs(stageIdList) do
|
||
FinishStageIdDic[id] = nil
|
||
end
|
||
|
||
chapterData:SetFightCount(chapterData:GetFightCount() + 1)
|
||
|
||
-- 检测设置首通提示驻守trigger
|
||
if chapterData:GetFightCount() == 1 then
|
||
ChapterFirstPassTrigger = chapterData:GetId()
|
||
end
|
||
|
||
XLuaUiManager.Remove("UiAwarenessDeploy")
|
||
XLuaUiManager.Remove("UiAssignLoading")
|
||
XLuaUiManager.Open("UiAwarenessSettleWin", winData)
|
||
end
|
||
|
||
-- 结算完刷新下数据
|
||
XFubenAwarenessManager.AwarenessGetDataRequest()
|
||
end
|
||
----------- 战斗接口 end-----------
|
||
|
||
-- 某角色某技能加成
|
||
function XFubenAwarenessManager.GetSkillLevel(characterId, skillId)
|
||
local character = XDataCenter.CharacterManager.GetCharacter(characterId)
|
||
if not character then return 0 end
|
||
|
||
local keys, levels = XFubenAwarenessManager.GetBuffKeysAndLevels()
|
||
local npcTemplate = XCharacterConfigs.GetNpcTemplate(character.NpcId)
|
||
local tragetCharacterType = npcTemplate.Type
|
||
local targetSkilType = XCharacterConfigs.GetSkillType(skillId)
|
||
local level = nil
|
||
for _, key in pairs(keys) do
|
||
local skillType = key % SKILLTYPE_BITS
|
||
local characterType = (key - skillType) / SKILLTYPE_BITS
|
||
if (characterType == tragetCharacterType or characterType == CHARACTERTYPE_ALL) and skillType == targetSkilType then
|
||
level = levels[key]
|
||
end
|
||
end
|
||
return level or 0
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetSkillLevelByCharacterData(character, skillId, assignChapterRecords)
|
||
local keys = {}
|
||
local levels = {}
|
||
for _, v in ipairs(assignChapterRecords) do
|
||
local chapterData = XAwarenessChapter.New(v.ChapterId)
|
||
chapterData:SetCharacterId(v.CharacterId)
|
||
|
||
if chapterData:IsOccupy() then
|
||
for _, key in ipairs(chapterData:GetBuffKeys()) do
|
||
if not levels[key] then
|
||
levels[key] = 1
|
||
table.insert(keys, key)
|
||
else
|
||
levels[key] = levels[key] + 1
|
||
end
|
||
end
|
||
end
|
||
end
|
||
local npcTemplate = XCharacterConfigs.GetNpcTemplate(character.NpcId)
|
||
local tragetCharacterType = npcTemplate.Type
|
||
local targetSkilType = XCharacterConfigs.GetSkillType(skillId)
|
||
local level = nil
|
||
for _, key in pairs(keys) do
|
||
local skillType = key % SKILLTYPE_BITS
|
||
local characterType = (key - skillType) / SKILLTYPE_BITS
|
||
if (characterType == tragetCharacterType or characterType == CHARACTERTYPE_ALL) and skillType == targetSkilType then
|
||
level = levels[key]
|
||
end
|
||
end
|
||
return level or 0
|
||
end
|
||
|
||
-- 参数keys: {角色类型*1000+技能类型, ...}
|
||
-- 参数levels: {[key] = level, ...}
|
||
function XFubenAwarenessManager.GetBuffDescListByKeys(keys, levels)
|
||
local descList = {}
|
||
local GetCareerName = XCharacterConfigs.GetCareerName
|
||
local GetSkillTypeName = XCharacterConfigs.GetSkillTypeName
|
||
local GetText = CS.XTextManager.GetText
|
||
for _, key in ipairs(keys) do
|
||
local skillType = key % SKILLTYPE_BITS
|
||
local characterType = (key - skillType) / SKILLTYPE_BITS
|
||
local level = levels and levels[key] or 1
|
||
local memberTypeName = characterType == CHARACTERTYPE_ALL and "" or GetCareerName(characterType)
|
||
local str = GetText("AssignSkillPlus", memberTypeName, GetSkillTypeName(skillType), level) -- 全体{0}成员{1}等级+{2}
|
||
table.insert(descList, str)
|
||
end
|
||
return descList
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetBuffKeysAndLevels()
|
||
local keys = {}
|
||
local levels = {}
|
||
for _, id in ipairs(XFubenAwarenessManager.GetChapterIdList()) do
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(id)
|
||
if chapterData:IsOccupy() then
|
||
for _, key in ipairs(chapterData:GetBuffKeys()) do
|
||
if not levels[key] then
|
||
levels[key] = 1
|
||
table.insert(keys, key)
|
||
else
|
||
levels[key] = levels[key] + 1
|
||
end
|
||
end
|
||
end
|
||
end
|
||
return keys, levels
|
||
end
|
||
|
||
function XFubenAwarenessManager.SortKeys(keys)
|
||
table.sort(keys, function(a, b)
|
||
local skillTypeA = a % SKILLTYPE_BITS
|
||
local characterTypeA = (a - skillTypeA) / SKILLTYPE_BITS
|
||
local skillTypeB = b % SKILLTYPE_BITS
|
||
local characterTypeB = (b - skillTypeB) / SKILLTYPE_BITS
|
||
if skillTypeA ~= skillTypeB then
|
||
return skillTypeA < skillTypeB
|
||
end
|
||
return characterTypeA < characterTypeB
|
||
end)
|
||
return keys
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetAllBuffList()
|
||
local keys, levels = XFubenAwarenessManager.GetBuffKeysAndLevels()
|
||
keys = XFubenAwarenessManager.SortKeys(keys)
|
||
return XFubenAwarenessManager.GetBuffDescListByKeys(keys, levels)
|
||
end
|
||
|
||
function XFubenAwarenessManager.TryGetFightTeamCharList(chapterId)
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
||
local teamList = {}
|
||
local captainPosList = {}
|
||
local firstFightPosList = {}
|
||
local teamIdList = chapterData:GetTeamInfoId()
|
||
local allTeamHasMember = (#teamIdList > 0)
|
||
for i, teamId in ipairs(teamIdList) do
|
||
teamList[i] = {}
|
||
local count = 0
|
||
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
||
captainPosList[i] = teamData:GetLeaderIndex()
|
||
firstFightPosList[i] = teamData:GetFirstFightIndex()
|
||
local memberList = teamData:GetMemberList()
|
||
for _, memberData in ipairs(memberList) do
|
||
local characterId = memberData:GetCharacterId() or 0
|
||
teamList[i][memberData:GetIndex()] = characterId
|
||
if characterId ~= 0 then
|
||
count = count + 1
|
||
end
|
||
end
|
||
if count < #memberList then
|
||
allTeamHasMember = false
|
||
end
|
||
end
|
||
return allTeamHasMember, teamList, captainPosList, firstFightPosList
|
||
end
|
||
|
||
function XFubenAwarenessManager.IsRedPoint()
|
||
for _, chapterId in ipairs(XFubenAwarenessManager.GetChapterIdList()) do
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
||
if chapterData:CanReward() then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 是否满足关卡所需战力
|
||
function XFubenAwarenessManager.IsStagePass(stageId)
|
||
local chapterId = XFubenAwarenessConfigs.GetChapterIdByStageId(stageId)
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
||
return chapterData:IsPass()
|
||
end
|
||
|
||
function XFubenAwarenessManager.UpdateChapterRecords(chapterRecords)
|
||
if not chapterRecords then
|
||
return
|
||
end
|
||
for _, v in pairs(chapterRecords) do
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(v.ChapterId)
|
||
chapterData:SetCharacterId(v.CharacterId)
|
||
chapterData:SetRewarded(v.IsGetReward)
|
||
chapterData:SetIsPassByServer(true)
|
||
end
|
||
end
|
||
|
||
function XFubenAwarenessManager.RefreshAwarenessInfo(data)
|
||
local info = data.AwarenessInfo
|
||
if XTool.IsTableEmpty(info) then
|
||
return
|
||
end
|
||
|
||
-- 章节占领角色数据
|
||
local chapterRecords = info.ChapterRecords
|
||
XFubenAwarenessManager.UpdateChapterRecords(chapterRecords)
|
||
|
||
-- 关卡通关数据
|
||
FinishStageIdDic = {}
|
||
local chapterChallengeRecords = info.ChallengeRecords
|
||
for _, v in pairs(chapterChallengeRecords or {}) do
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(v.ChapterId)
|
||
chapterData:SetFightCount(v.Count)
|
||
if not XTool.IsTableEmpty(v.FinishStageIds) then
|
||
for k, id in pairs(v.FinishStageIds) do
|
||
-- 使用全局变量记录服务器发下来的数据
|
||
-- 已通关的StageId
|
||
FinishStageIdDic[id] = true
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 编队记录
|
||
ChapterTeamRecords = info.TeamRecords
|
||
ChapterTeamRecordsDic = {}
|
||
for _, v in ipairs(ChapterTeamRecords or {}) do
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(v.ChapterId)
|
||
local teamCount = #v.TeamInfoList
|
||
local posCount = v.CaptainPosList and #v.CaptainPosList or 0
|
||
local firstFightCount = v.FirstFightPosList and #v.FirstFightPosList or 0
|
||
|
||
for i, teamId in ipairs(chapterData:GetTeamInfoId()) do
|
||
local teamData = XFubenAwarenessManager.GetTeamDataById(teamId)
|
||
local charaterIds = (i <= teamCount) and v.TeamInfoList[i] or nil
|
||
local captainPos = (i <= posCount) and v.CaptainPosList[i] or XFubenAwarenessManager.CAPTIAN_MEMBER_INDEX
|
||
local firstFightPos = (i <= firstFightCount) and v.FirstFightPosList[i] or XFubenAwarenessManager.FIRSTFIGHT_MEMBER_INDEX
|
||
teamData:SetMemberList(charaterIds)
|
||
teamData:SetLeaderIndex(captainPos)
|
||
teamData:SetFirstFightIndex(firstFightPos)
|
||
end
|
||
-- 队伍字典
|
||
ChapterTeamRecordsDic[v.ChapterId] = v
|
||
end
|
||
end
|
||
|
||
-----------------协议----------
|
||
-- Login登录后端初始化数据接口
|
||
function XFubenAwarenessManager.NotifyLoginAwarenessInfo(data)
|
||
if XTool.IsTableEmpty(data) then
|
||
return
|
||
end
|
||
XFubenAwarenessManager.RefreshAwarenessInfo(data)
|
||
end
|
||
|
||
function XFubenAwarenessManager.AwarenessGetDataRequest(cb)
|
||
XNetwork.Call("AwarenessGetDataRequest", nil, function(res)
|
||
XFubenAwarenessManager.RefreshAwarenessInfo(res)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XFubenAwarenessManager.AwarenessSetTeamRequest(ChapterId, TeamList, captainPosList, firstFightPosList, cb)
|
||
XNetwork.Call("AwarenessSetTeamRequest", { ChapterId = ChapterId, TeamList = TeamList, CaptainPosList = captainPosList, FirstFightPosList = firstFightPosList }, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XFubenAwarenessManager.AwarenessSetCharacterRequest(ChapterId, CharacterId, cb)
|
||
XNetwork.Call("AwarenessSetCharacterRequest", { ChapterId = ChapterId, CharacterId = CharacterId }, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(ChapterId)
|
||
chapterData:SetCharacterId(CharacterId)
|
||
|
||
XEventManager.DispatchEvent(XEventId.EVENT_REFRESH_CHRACTER_ABLIITY) -- 重新计算角色战力
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_ASSIGN_SELECT_OCCUPY_END) -- 刷新驻守界面
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XFubenAwarenessManager.AwarenessGetRewardRequest(ChapterId, cb)
|
||
XNetwork.Call("AwarenessGetRewardRequest", { ChapterId = ChapterId }, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(ChapterId)
|
||
chapterData:SetRewarded(true)
|
||
XUiManager.OpenUiObtain(res.RewardList or {})
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
-- 重置关卡
|
||
function XFubenAwarenessManager.AwarenessResetStageRequest(chapterId, stageId, cb)
|
||
XNetwork.Call("AwarenessResetStageRequest", { ChapterId = chapterId, StageId = stageId }, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
FinishStageIdDic[stageId] = nil
|
||
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetSkillPlusIdList()
|
||
local list = {}
|
||
for _, chapterId in ipairs(XFubenAwarenessManager.GetChapterIdList()) do
|
||
local chapterData = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
||
if chapterData:IsOccupy() then
|
||
table.insert(list, chapterData:GetSkillPlusId())
|
||
end
|
||
end
|
||
return list
|
||
end
|
||
|
||
function XFubenAwarenessManager.GetSkillPlusIdListOther(assignChapterRecords)
|
||
|
||
local list = {}
|
||
if assignChapterRecords == nil then
|
||
return list
|
||
end
|
||
for _, v in ipairs(assignChapterRecords) do
|
||
local chapterData = XAwarenessChapter.New(v.ChapterId)
|
||
chapterData:SetCharacterId(v.CharacterId)
|
||
|
||
if chapterData:IsOccupy() then
|
||
table.insert(list, chapterData:GetSkillPlusId())
|
||
end
|
||
end
|
||
return list
|
||
end
|
||
|
||
-- 2选1入口的红点
|
||
function XFubenAwarenessManager.CheckIsShowRedPoint()
|
||
for k, chapterId in pairs(XFubenAwarenessManager.GetChapterIdList()) do
|
||
local chapter = XFubenAwarenessManager.GetChapterDataById(chapterId)
|
||
if chapter:IsRed() then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XFubenAwarenessManager.OpenUi(openCb)
|
||
if XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.FubenAwareness, true) then
|
||
if openCb then
|
||
XLuaUiManager.OpenWithCallback("UiAwarenessMain", openCb)
|
||
else
|
||
XLuaUiManager.Open("UiAwarenessMain")
|
||
end
|
||
end
|
||
end
|
||
|
||
XFubenAwarenessManager.Init()
|
||
return XFubenAwarenessManager
|
||
end
|
||
|
||
XRpc.NotifyLoginAwarenessInfo = function(data)
|
||
XDataCenter.FubenAwarenessManager.NotifyLoginAwarenessInfo(data)
|
||
end |