1003 lines
No EOL
34 KiB
Lua
1003 lines
No EOL
34 KiB
Lua
XBfrtManagerCreator = function()
|
||
|
||
local pairs = pairs
|
||
local ipairs = ipairs
|
||
local string = string
|
||
local table = table
|
||
local tableInsert = table.insert
|
||
local tableRemove = table.remove
|
||
local tableSort = table.sort
|
||
local ParseToTimestamp = XTime.ParseToTimestamp
|
||
local FightCb
|
||
local CloseLoadingCb
|
||
|
||
-- 据点战管理器
|
||
local XBfrtManager = {}
|
||
|
||
--据点战梯队类型
|
||
XBfrtManager.EchelonType = {
|
||
Fight = 0, --作战梯队
|
||
Logistics = 1, --后勤梯队
|
||
}
|
||
|
||
local METHOD_NAME = {
|
||
GetBfrtDataRequest = "GetBfrtDataRequest",
|
||
BfrtTeamSetRequest = "BfrtTeamSetRequest"
|
||
}
|
||
|
||
local BfrtChapterTemplates = {}
|
||
local BfrtGroupTemplates = {}
|
||
local EchelonInfoTemplates = {}
|
||
|
||
local BfrtFollowGroupDic = {}
|
||
local ChapterInfos = {}
|
||
local GroupInfos = {}
|
||
local ChapterDic = {}
|
||
local GroupIdToOrderIdDic = {}
|
||
local StageDic = {}
|
||
local TaskIdToOrderIdDic = {}
|
||
local GroupIdToChapterIdDic = {}
|
||
local EchlonTeamPosDic = {} --缓存本地修改的队长位
|
||
local EchlonServerTeamPosDic = {} --缓存服务端下发的队长位
|
||
local EchlonFirstFightDic = {} --缓存本地修改的首发位
|
||
local EchlonServerFirstFightDic = {} --缓存服务端下发的首发位
|
||
|
||
--面板上显示的位置 = 队伍中实际中的位置
|
||
local TEAM_POS_DIC = {
|
||
[1] = 2,
|
||
[2] = 1,
|
||
[3] = 3,
|
||
}
|
||
|
||
local BfrtData = {}
|
||
local FightTeams = {}
|
||
local LogisticsTeams = {}
|
||
|
||
local function IsGroupPassed(groupId)
|
||
local records = BfrtData.BfrtGroupRecords
|
||
if not records then
|
||
return false
|
||
end
|
||
|
||
for _, record in pairs(records) do
|
||
if record.Id == groupId then
|
||
return true
|
||
end
|
||
end
|
||
|
||
return false
|
||
end
|
||
|
||
function XBfrtManager.GetChapterInfo(chapterId)
|
||
return ChapterInfos[chapterId]
|
||
end
|
||
|
||
local function GetGroupInfo(groupId)
|
||
return GroupInfos[groupId]
|
||
end
|
||
|
||
function XBfrtManager.GetChapterCfg(chapterId)
|
||
local chapterCfg = BfrtChapterTemplates[chapterId]
|
||
if not chapterCfg then
|
||
XLog.ErrorTableDataNotFound("XBfrtManager.GetChapterCfg", "chapterCfg",
|
||
"Share/Fuben/Bfrt/BfrtChapter.tab", "chapterId", tostring(chapterId))
|
||
return
|
||
end
|
||
return chapterCfg
|
||
end
|
||
|
||
local function GetGroupCfg(groupId)
|
||
local groupCfg = BfrtGroupTemplates[groupId]
|
||
if not groupCfg then
|
||
XLog.ErrorTableDataNotFound("GetGroupCfg", "groupCfg", "Share/Fuben/Bfrt/BfrtGroup.tab", "groupId", tostring(groupId))
|
||
return
|
||
end
|
||
return groupCfg
|
||
end
|
||
|
||
function XBfrtManager.GetStageIdList(groupId)
|
||
local stageIdList = {}
|
||
|
||
local groupCfg = GetGroupCfg(groupId)
|
||
local seqList = string.ToIntArray(groupCfg.TeamFightSeq, '|')
|
||
local originList = groupCfg.StageId
|
||
for index, seq in ipairs(seqList) do
|
||
stageIdList[index] = originList[seq]
|
||
end
|
||
|
||
return stageIdList
|
||
end
|
||
|
||
function XBfrtManager.GetFightInfoIdList(groupId)
|
||
local fightInfoIdList = {}
|
||
|
||
local groupCfg = GetGroupCfg(groupId)
|
||
local seqList = string.ToIntArray(groupCfg.TeamFightSeq, '|')
|
||
local originList = groupCfg.FightInfoId
|
||
for index, seq in ipairs(seqList) do
|
||
fightInfoIdList[index] = originList[seq]
|
||
end
|
||
|
||
return fightInfoIdList
|
||
end
|
||
|
||
function XBfrtManager.GetLogisticsInfoIdList(groupId)
|
||
local groupCfg = GetGroupCfg(groupId)
|
||
return groupCfg.LogisticsInfoId
|
||
end
|
||
|
||
local function GetEchelonInfo(echelonId)
|
||
local echelon = EchelonInfoTemplates[echelonId]
|
||
if not echelon then
|
||
XLog.ErrorTableDataNotFound("GetEchelonInfo", "echelon", "Share/Fuben/Bfrt/EchelonInfo.tab", "echelonId", tostring(echelonId))
|
||
return
|
||
end
|
||
|
||
return echelon
|
||
end
|
||
|
||
function XBfrtManager.GetGroupList(chapterId)
|
||
local chapter = BfrtChapterTemplates[chapterId]
|
||
if not chapter then
|
||
XLog.ErrorTableDataNotFound("XBfrtManager.GetGroupList", "chapter", "Share/Fuben/Bfrt/BfrtChapter.tab", "chapterId", tostring(chapterId))
|
||
return
|
||
end
|
||
|
||
return chapter.GroupId
|
||
end
|
||
|
||
function XBfrtManager.GetChapterName(chapterId)
|
||
local chapter = BfrtChapterTemplates[chapterId]
|
||
if not chapter then
|
||
XLog.ErrorTableDataNotFound("XBfrtManager.GetChapterName", "chapter", "Share/Fuben/Bfrt/BfrtChapter.tab", "chapterId", tostring(chapterId))
|
||
return
|
||
end
|
||
|
||
return chapter.ChapterName
|
||
end
|
||
|
||
function XBfrtManager.TeamPosConvert(index)
|
||
return TEAM_POS_DIC[index]
|
||
end
|
||
|
||
function XBfrtManager.MemberIndexConvert(pos)
|
||
for index, dicPos in pairs(TEAM_POS_DIC) do
|
||
if pos == dicPos then
|
||
return index
|
||
end
|
||
end
|
||
end
|
||
|
||
local function CheckTeamLimit(echelonId, team)
|
||
local needNum = XBfrtManager.GetEchelonNeedCharacterNum(echelonId)
|
||
for i = 1, needNum do
|
||
local characterId = team[i]
|
||
if not characterId or characterId == 0 then
|
||
return false
|
||
end
|
||
end
|
||
|
||
return true
|
||
end
|
||
|
||
--获取各梯队需求人数
|
||
function XBfrtManager.GetEchelonNeedCharacterNum(echelonId)
|
||
local echelon = GetEchelonInfo(echelonId)
|
||
return echelon and echelon.NeedCharacter
|
||
end
|
||
|
||
function XBfrtManager.InitStageInfo()
|
||
for groupId, groupCfg in pairs(BfrtGroupTemplates) do
|
||
local groupInfo = GroupInfos[groupId]
|
||
for _, v in pairs(groupCfg.StageId) do
|
||
local stageInfo = XDataCenter.FubenManager.GetStageInfo(v)
|
||
if not stageInfo then
|
||
local tmpStr = "XBfrtManager InitStageInfo错误, 无法根据 Share/Fuben/Bfrt/BfrtGroup.tab 表里面的stageId"
|
||
XLog.Error(tmpStr .. v .. " 找到Share/Fuben/Stage.tab 表中的表项")
|
||
break
|
||
end
|
||
|
||
stageInfo.IsOpen = true
|
||
stageInfo.Type = XDataCenter.FubenManager.StageType.Bfrt
|
||
stageInfo.Unlock = groupInfo and groupInfo.Unlock or false
|
||
stageInfo.ChapterId = groupInfo and groupInfo.ChapterId
|
||
|
||
end
|
||
|
||
local baseStageInfo = XDataCenter.FubenManager.GetStageInfo(groupCfg.BaseStage)
|
||
baseStageInfo.IsOpen = true
|
||
baseStageInfo.Type = XDataCenter.FubenManager.StageType.Bfrt
|
||
baseStageInfo.Unlock = groupInfo and groupInfo.Unlock or false
|
||
baseStageInfo.ChapterId = groupInfo and groupInfo.ChapterId
|
||
end
|
||
end
|
||
|
||
local function InitGroupInfo()
|
||
GroupInfos = {}
|
||
for groupId, groupCfg in pairs(BfrtGroupTemplates) do
|
||
local info = {}
|
||
GroupInfos[groupId] = info
|
||
GroupIdToOrderIdDic[groupId] = groupCfg.GroupOrderId
|
||
|
||
info.Unlock = true
|
||
local preGroupId = groupCfg.PreGroupId
|
||
if preGroupId and preGroupId > 0 then
|
||
info.Unlock = false
|
||
for _, record in pairs(BfrtData.BfrtGroupRecords) do
|
||
if record.Id == preGroupId then
|
||
info.Unlock = true
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
StageDic[groupCfg.BaseStage] = {
|
||
GroupId = groupId,
|
||
IsLastStage = false,
|
||
}
|
||
|
||
local count = #groupCfg.StageId
|
||
for k, v in pairs(groupCfg.StageId) do
|
||
local stageInfo = XDataCenter.FubenManager.GetStageInfo(v)
|
||
if stageInfo then
|
||
stageInfo.Unlock = info.Unlock
|
||
|
||
StageDic[v] = {
|
||
GroupId = groupId,
|
||
IsLastStage = (k == count)
|
||
}
|
||
else
|
||
local tmpStr = "XBfrtManager.InitGroupInfo错误, 无法根据 Share/Fuben/Bfrt/BfrtGroup.tab 表里面的stageId"
|
||
XLog.Error(tmpStr .. v .. " 找到Share/Fuben/Stage.tab 表中的表项")
|
||
end
|
||
end
|
||
info.Passed = IsGroupPassed(groupId)
|
||
end
|
||
end
|
||
|
||
local function InitChapterInfo()
|
||
ChapterInfos = {}
|
||
for chapterId, chapterCfg in pairs(BfrtChapterTemplates) do
|
||
ChapterDic[chapterCfg.OrderId] = chapterId
|
||
local info = {}
|
||
ChapterInfos[chapterId] = info
|
||
info.ChapterId = chapterId
|
||
if #chapterCfg.GroupId > 0 then
|
||
local groupId = chapterCfg.GroupId[1]
|
||
local groupInfo = GroupInfos[groupId]
|
||
if groupInfo then
|
||
info.Unlock = groupInfo.Unlock
|
||
end
|
||
end
|
||
|
||
local allPassed = true
|
||
for k, v in pairs(chapterCfg.GroupId) do
|
||
GroupIdToChapterIdDic[v] = chapterId
|
||
|
||
local groupInfo = GroupInfos[v]
|
||
groupInfo.OrderId = k
|
||
groupInfo.ChapterId = chapterId
|
||
|
||
local groupCfg = BfrtGroupTemplates[v]
|
||
for _, v2 in pairs(groupCfg.StageId) do
|
||
local stageInfo = XDataCenter.FubenManager.GetStageInfo(v2)
|
||
stageInfo.ChapterId = chapterId
|
||
end
|
||
|
||
if not groupInfo.Passed then
|
||
allPassed = false
|
||
end
|
||
end
|
||
info.Passed = allPassed
|
||
|
||
for orderId, taskId in ipairs(chapterCfg.TaskId) do
|
||
TaskIdToOrderIdDic[taskId] = orderId
|
||
end
|
||
end
|
||
end
|
||
|
||
local function GetChapterTaskIdList(chapterId)
|
||
local chapterCfg = XBfrtManager.GetChapterCfg(chapterId)
|
||
local taskIdList = chapterCfg.TaskId
|
||
if not taskIdList then
|
||
XLog.ErrorTableDataNotFound("XBfrtManager.GetChapterTaskIdList",
|
||
"TaskId", "Share/Fuben/Bfrt/BfrtChapter.tab", "chapterId", tostring(chapterId))
|
||
end
|
||
return taskIdList
|
||
end
|
||
|
||
local function InitFollowGroup()
|
||
for k, v in pairs(BfrtGroupTemplates) do
|
||
if v.PreGroupId > 0 then
|
||
local list = BfrtFollowGroupDic[v.PreGroupId]
|
||
if not list then
|
||
list = {}
|
||
end
|
||
|
||
tableInsert(list, k)
|
||
BfrtFollowGroupDic[v.PreGroupId] = list
|
||
end
|
||
end
|
||
end
|
||
|
||
local function InitTeamRecords()
|
||
local teamInfos = BfrtData.BfrtTeamInfos
|
||
if not teamInfos then return end
|
||
|
||
for _, teamInfo in pairs(teamInfos) do
|
||
if teamInfo then
|
||
local groupId = teamInfo.Id
|
||
FightTeams[groupId] = teamInfo.FightTeamList
|
||
LogisticsTeams[groupId] = teamInfo.LogisticsTeamList
|
||
|
||
local captainList = teamInfo.CaptainPosList
|
||
local firstFightList = teamInfo.FirstFightPosList
|
||
|
||
if captainList then
|
||
local fightInfoIdList = XBfrtManager.GetFightInfoIdList(groupId)
|
||
for index, echelonId in ipairs(fightInfoIdList) do
|
||
XBfrtManager.SetTeamCaptainPos(echelonId, captainList[index])
|
||
XBfrtManager.SetServerTeamCaptainPos(echelonId, captainList[index])
|
||
end
|
||
end
|
||
|
||
if firstFightList then
|
||
local fightInfoIdList = XBfrtManager.GetFightInfoIdList(groupId)
|
||
for index, echelonId in ipairs(fightInfoIdList) do
|
||
XBfrtManager.SetTeamFirstFightPos(echelonId, firstFightList[index])
|
||
XBfrtManager.SetServerTeamFirstFightPos(echelonId, firstFightList[index])
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
local function UnlockFollowGroup(groupId)
|
||
local list = BfrtFollowGroupDic[groupId]
|
||
if not list then
|
||
return
|
||
end
|
||
|
||
for _, id in pairs(list) do
|
||
GroupInfos[id].Unlock = true
|
||
|
||
local groupCfg = BfrtGroupTemplates[id]
|
||
for _, v in pairs(groupCfg.StageId) do
|
||
local stageInfo = XDataCenter.FubenManager.GetStageInfo(v)
|
||
stageInfo.Unlock = true
|
||
end
|
||
|
||
local baseStageInfo = XDataCenter.FubenManager.GetStageInfo(groupCfg.BaseStage)
|
||
baseStageInfo.Unlock = true
|
||
|
||
local chapterId = XBfrtManager.GetChapterIdByGroupId(id)
|
||
local chapterInfo = XBfrtManager.GetChapterInfo(chapterId)
|
||
chapterInfo.Unlock = true
|
||
end
|
||
end
|
||
|
||
function XBfrtManager.CheckActivityCondition(chapterId)
|
||
local chapterCfg = XBfrtManager.GetChapterCfg(chapterId)
|
||
local conditionId = chapterCfg.ActivityCondition
|
||
if conditionId ~= 0 and not XConditionManager.CheckCondition(conditionId) then
|
||
return false
|
||
end
|
||
return true
|
||
end
|
||
|
||
function XBfrtManager.CheckAnyTaskRewardCanGet(chapterId)
|
||
if not chapterId then
|
||
return
|
||
end
|
||
local taskId = XBfrtManager.GetBfrtTaskId(chapterId)
|
||
local taskData = XDataCenter.TaskManager.GetTaskDataById(taskId)
|
||
return taskData and taskData.State == XDataCenter.TaskManager.TaskState.Achieved
|
||
end
|
||
|
||
function XBfrtManager.GetTaskOrderId(taskId)
|
||
return TaskIdToOrderIdDic[taskId]
|
||
end
|
||
|
||
function XBfrtManager.GetGroupIdByStageId(stageId)
|
||
if not StageDic[stageId] then
|
||
XLog.Error("XBfrtManager GetGroupIdByStageId 无法从StageDic中找到groupId,检查 Share/Fuben/Bfrt/BfrtGroup.tab 表, stageId 是" .. stageId)
|
||
return
|
||
end
|
||
return StageDic[stageId].GroupId
|
||
end
|
||
|
||
function XBfrtManager.GetGroupIdByBaseStage(baseStage)
|
||
return XBfrtManager.GetGroupIdByStageId(baseStage)
|
||
end
|
||
|
||
function XBfrtManager.Init()
|
||
BfrtChapterTemplates = XBfrtConfigs.GetBfrtChapterTemplates()
|
||
BfrtGroupTemplates = XBfrtConfigs.GetBfrtGroupTemplates()
|
||
EchelonInfoTemplates = XBfrtConfigs.GetEchelonInfoTemplates()
|
||
end
|
||
|
||
function XBfrtManager.IsChapterInTime(chapterId)
|
||
local chapterCfg = XBfrtManager.GetChapterCfg(chapterId)
|
||
local startTime = ParseToTimestamp(chapterCfg.OpenTimeStr)
|
||
if not startTime or startTime <= 0 then
|
||
return true
|
||
end
|
||
|
||
local nowTime = XTime.GetServerNowTimestamp()
|
||
return startTime <= nowTime
|
||
end
|
||
|
||
function XBfrtManager.GetChapterList()
|
||
local list = {}
|
||
|
||
for _, chapterId in pairs(ChapterDic) do
|
||
if XBfrtManager.IsChapterInTime(chapterId) then
|
||
tableInsert(list, chapterId)
|
||
end
|
||
end
|
||
|
||
return list
|
||
end
|
||
|
||
function XBfrtManager.GetChapterInfoForOrder(orderId)
|
||
local chapterId = ChapterDic[orderId]
|
||
return ChapterInfos[chapterId]
|
||
end
|
||
|
||
function XBfrtManager.GetGroupRequireCharacterNum(groupId)
|
||
local groupRequireCharacterNum = 0
|
||
|
||
local fightInfoList = XBfrtManager.GetFightInfoIdList(groupId)
|
||
for _, echelonId in pairs(fightInfoList) do
|
||
groupRequireCharacterNum = groupRequireCharacterNum + XBfrtManager.GetEchelonNeedCharacterNum(echelonId)
|
||
end
|
||
|
||
local logisticsInfoList = XBfrtManager.GetLogisticsInfoIdList(groupId)
|
||
for _, echelonId in pairs(logisticsInfoList) do
|
||
groupRequireCharacterNum = groupRequireCharacterNum + XBfrtManager.GetEchelonNeedCharacterNum(echelonId)
|
||
end
|
||
|
||
return groupRequireCharacterNum
|
||
end
|
||
|
||
function XBfrtManager.CheckChapterNew(chapterId)
|
||
local chapterInfo = XBfrtManager.GetChapterInfo(chapterId)
|
||
return chapterInfo.Unlock and not chapterInfo.Passed
|
||
end
|
||
|
||
--获取当前最新解锁的Chapter
|
||
function XBfrtManager.GetActiveChapterId()
|
||
local activeChapterId
|
||
|
||
local chapterIdList = XBfrtManager.GetChapterList()
|
||
for _, chapterId in ipairs(chapterIdList) do
|
||
local chapterInfo = XBfrtManager.GetChapterInfo(chapterId)
|
||
if chapterInfo.Unlock then
|
||
activeChapterId = chapterId
|
||
end
|
||
end
|
||
|
||
return activeChapterId
|
||
end
|
||
|
||
function XBfrtManager.GetChapterOrderId(chapterId)
|
||
local chapterCfg = XBfrtManager.GetChapterCfg(chapterId)
|
||
return chapterCfg.OrderId
|
||
end
|
||
|
||
function XBfrtManager.GetGroupOrderId(groupId)
|
||
local groupInfo = GetGroupInfo(groupId)
|
||
return groupInfo.OrderId
|
||
end
|
||
|
||
--获取Chapter中所有Group用于展示的BaseStage的List
|
||
function XBfrtManager.GetBaseStageList(chapterId)
|
||
local baseStageList = {}
|
||
|
||
local groupList = XBfrtManager.GetGroupList(chapterId)
|
||
for _, groupId in ipairs(groupList) do
|
||
local groupCfg = GetGroupCfg(groupId)
|
||
table.insert(baseStageList, groupCfg.BaseStage)
|
||
end
|
||
|
||
return baseStageList
|
||
end
|
||
|
||
function XBfrtManager.GetBaseStage(groupId)
|
||
local groupCfg = GetGroupCfg(groupId)
|
||
return groupCfg.BaseStage
|
||
end
|
||
|
||
function XBfrtManager.CheckBaseStageUnlock(baseStage)
|
||
local groupId = XBfrtManager.GetGroupIdByBaseStage(baseStage)
|
||
local groupInfo = GetGroupInfo(groupId)
|
||
return groupInfo.Unlock
|
||
end
|
||
|
||
function XBfrtManager.IsGroupPassedByStageId(stageId)
|
||
local groupId = XDataCenter.BfrtManager.GetGroupIdByStageId(stageId)
|
||
local groupInfo = GetGroupInfo(groupId)
|
||
return groupInfo.Passed
|
||
end
|
||
|
||
function XBfrtManager.GetLogisticSkillDes(echelonId)
|
||
local echelon = GetEchelonInfo(echelonId)
|
||
if not echelon.BuffId or echelon.BuffId == 0 then
|
||
XLog.ErrorTableDataNotFound("XBfrtManager.GetLogisticSkillDes", "BuffId",
|
||
"Share/Fuben/Bfrt/EchelonInfo.tab", "echelonId", tostring(echelonId))
|
||
return
|
||
end
|
||
|
||
local fightEventCfg = CS.XNpcManager.GetFightEventTemplate(echelon.BuffId)
|
||
return fightEventCfg and fightEventCfg.Description
|
||
end
|
||
|
||
function XBfrtManager.GetEchelonRequireAbility(echelonId)
|
||
local echelon = GetEchelonInfo(echelonId)
|
||
return echelon.RequireAbility
|
||
end
|
||
|
||
function XBfrtManager.GetEchelonConditionId(echelonId)
|
||
local echelon = GetEchelonInfo(echelonId)
|
||
return echelon.Condition
|
||
end
|
||
|
||
function XBfrtManager.CheckStageTypeIsBfrt(stageId)
|
||
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
|
||
if stageInfo and stageInfo.Type == XDataCenter.FubenManager.StageType.Bfrt then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XBfrtManager.GetFightTeamList(groupId)
|
||
local team = FightTeams[groupId]
|
||
if not team then
|
||
local preGroupId = XBfrtConfigs.GetBfrtPreGroupId(groupId)
|
||
team = FightTeams[preGroupId] or {}
|
||
end
|
||
|
||
return XTool.Clone(team)
|
||
end
|
||
|
||
function XBfrtManager.GetLogisticsTeamList(groupId)
|
||
local team = LogisticsTeams[groupId] or {}
|
||
return XTool.Clone(team)
|
||
end
|
||
|
||
function XBfrtManager.GetTotalTaskNum(chapterId)
|
||
local taskIdList = GetChapterTaskIdList(chapterId)
|
||
return #taskIdList
|
||
end
|
||
|
||
function XBfrtManager.GetCurFinishTaskNum(chapterId)
|
||
local finishTaskNum = 0
|
||
local taskIdList = GetChapterTaskIdList(chapterId)
|
||
for _, taskId in pairs(taskIdList) do
|
||
local taskData = XDataCenter.TaskManager.GetTaskDataById(taskId)
|
||
if taskData then
|
||
if taskData.State == XDataCenter.TaskManager.TaskState.Achieved or taskData.State == XDataCenter.TaskManager.TaskState.Finish then
|
||
finishTaskNum = finishTaskNum + 1
|
||
end
|
||
end
|
||
end
|
||
return finishTaskNum
|
||
end
|
||
|
||
function XBfrtManager.CheckAllTaskRewardHasGot(chapterId)
|
||
local taskId = XBfrtManager.GetBfrtTaskId(chapterId)
|
||
local taskData = XDataCenter.TaskManager.GetTaskDataById(taskId)
|
||
return taskData and taskData.State == XDataCenter.TaskManager.TaskState.Finish
|
||
end
|
||
|
||
function XBfrtManager.GetBfrtTaskId(chapterId)
|
||
local taskIdList = GetChapterTaskIdList(chapterId)
|
||
return taskIdList[1]
|
||
end
|
||
|
||
function XBfrtManager.CheckAllChapterReward()
|
||
if not ChapterDic then return false end
|
||
for _, chapterId in pairs(ChapterDic) do
|
||
if XBfrtManager.CheckAnyTaskRewardCanGet(chapterId) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XBfrtManager.FinishStage(stageId)
|
||
local stage = StageDic[stageId]
|
||
if not stage or not stage.IsLastStage then
|
||
return
|
||
end
|
||
|
||
local groupId = stage.GroupId
|
||
GroupInfos[groupId].Passed = true
|
||
|
||
local findRecord = false
|
||
for _, record in pairs(BfrtData.BfrtGroupRecords) do
|
||
if record.Id == groupId then
|
||
record.Count = record.Count + 1
|
||
findRecord = true
|
||
break
|
||
end
|
||
end
|
||
|
||
if not findRecord then
|
||
local record = {
|
||
Id = groupId,
|
||
Count = 1,
|
||
}
|
||
tableInsert(BfrtData.BfrtGroupRecords, record)
|
||
end
|
||
|
||
UnlockFollowGroup(groupId)
|
||
end
|
||
|
||
function XBfrtManager.GetGroupFinishCount(baseStage)
|
||
local records = BfrtData.BfrtGroupRecords
|
||
if not records then
|
||
return 0
|
||
end
|
||
|
||
local groupId = XBfrtManager.GetGroupIdByBaseStage(baseStage)
|
||
for _, record in pairs(records) do
|
||
if record.Id == groupId then
|
||
return record.Count
|
||
end
|
||
end
|
||
|
||
return 0
|
||
end
|
||
|
||
function XBfrtManager.IsBfrtChapter(id)
|
||
return BfrtChapterTemplates[id] ~= nil
|
||
end
|
||
|
||
function XBfrtManager.GetGroupMaxChallengeNum(baseStage)
|
||
local groupId = XBfrtManager.GetGroupIdByBaseStage(baseStage)
|
||
local groupCfg = GetGroupCfg(groupId)
|
||
return groupCfg.ChallengeNum
|
||
end
|
||
|
||
function XBfrtManager.GetChapterIdByGroupId(groupId)
|
||
return GroupIdToChapterIdDic[groupId]
|
||
end
|
||
|
||
function XBfrtManager.GetEchelonNameTxt(echelonType, echelonIndex)
|
||
local echelonNameTxt
|
||
if echelonType == XBfrtManager.EchelonType.Fight then
|
||
echelonNameTxt = CS.XTextManager.GetText("BfrtFightEchelonTitle", echelonIndex)
|
||
elseif echelonType == XBfrtManager.EchelonType.Logistics then
|
||
echelonNameTxt = CS.XTextManager.GetText("BfrtLogisticEchelonTitle", echelonIndex)
|
||
end
|
||
|
||
return echelonNameTxt
|
||
end
|
||
|
||
function XBfrtManager.OpenFightLoading()
|
||
return
|
||
end
|
||
|
||
function XBfrtManager.CloseFightLoading(stage)
|
||
if CloseLoadingCb then
|
||
CloseLoadingCb()
|
||
end
|
||
|
||
local groupId = XBfrtManager.GetGroupIdByStageId(stage)
|
||
local logisticsInfoIdList = XBfrtManager.GetLogisticsInfoIdList(groupId)
|
||
local totalShowTimes = #logisticsInfoIdList
|
||
if totalShowTimes > 0 then
|
||
XLuaUiManager.Open("UiTipBfrtLogisticSkill", groupId)
|
||
end
|
||
end
|
||
|
||
function XBfrtManager.FinishFight(settle)
|
||
XDataCenter.FubenManager.FinishFight(settle)
|
||
if FightCb then
|
||
FightCb(settle.IsWin)
|
||
end
|
||
end
|
||
|
||
function XBfrtManager.ShowReward(winData)
|
||
if XBfrtManager.CheckIsGroupLastStage(winData.StageId) then
|
||
XLuaUiManager.Open("UiBfrtPostWarCount", winData)
|
||
end
|
||
end
|
||
|
||
function XBfrtManager.SetCloseLoadingCb(cb)
|
||
CloseLoadingCb = cb
|
||
end
|
||
|
||
function XBfrtManager.SetFightCb(cb)
|
||
FightCb = cb
|
||
end
|
||
|
||
function XBfrtManager.CheckIsGroupLastStage(stageId)
|
||
local groupId = XBfrtManager.GetGroupIdByStageId(stageId)
|
||
local stageIdList = XBfrtManager.GetStageIdList(groupId)
|
||
return stageIdList[#stageIdList] == stageId
|
||
end
|
||
|
||
function XBfrtManager.GetGroupOrderIdByStageId(stageId)
|
||
local groupId = XBfrtManager.GetGroupIdByStageId(stageId)
|
||
return GroupIdToOrderIdDic[groupId]
|
||
end
|
||
|
||
function XBfrtManager.CheckPreGroupUnlock(groupId)
|
||
local groupInfo = GetGroupInfo(groupId)
|
||
local groupCfg = GetGroupCfg(groupId)
|
||
return groupInfo.Unlock, groupCfg.PreGroupId
|
||
end
|
||
|
||
function XBfrtManager.GetEchelonInfoShowFightEventIds(echelonId)
|
||
local config = GetEchelonInfo(echelonId)
|
||
return config and config.ShowFightEventIds or {}
|
||
end
|
||
|
||
----------------------服务端协议begin----------------------
|
||
local function CheckFightTeamCondition(groupId, teamList)
|
||
local infoList = XBfrtManager.GetFightInfoIdList(groupId)
|
||
|
||
for k, echelonId in pairs(infoList) do
|
||
local team = teamList[k]
|
||
if not team then
|
||
return false
|
||
end
|
||
|
||
if not CheckTeamLimit(echelonId, team) then
|
||
return false
|
||
end
|
||
end
|
||
|
||
return true
|
||
end
|
||
|
||
local function CheckLogisticsTeamCondition(groupId, teamList)
|
||
local infoList = XBfrtManager.GetLogisticsInfoIdList(groupId)
|
||
|
||
if not infoList or not next(infoList) then
|
||
return true
|
||
end
|
||
|
||
for k, echelonId in pairs(infoList) do
|
||
local team = teamList[k]
|
||
if not team or not CheckTeamLimit(echelonId, team) then
|
||
return false
|
||
end
|
||
end
|
||
|
||
return true
|
||
end
|
||
|
||
function XBfrtManager.CheckTeam(groupId, fightTeamList, logisticsTeamList, cb)
|
||
if not CheckFightTeamCondition(groupId, fightTeamList) then
|
||
XUiManager.TipText("FightTeamConditionLimit")
|
||
return
|
||
end
|
||
|
||
if not CheckLogisticsTeamCondition(groupId, logisticsTeamList) then
|
||
XUiManager.TipText("LogisticsTeamConditionLimit")
|
||
return
|
||
end
|
||
|
||
local captainList = {}
|
||
local firstFightPosList = {}
|
||
local fightInfoIdList = XBfrtManager.GetFightInfoIdList(groupId)
|
||
for i, echelonId in ipairs(fightInfoIdList) do
|
||
local captainPos = XBfrtManager.GetTeamCaptainPos(echelonId, groupId, i)
|
||
if not XTool.IsNumberValid(fightTeamList[i] and fightTeamList[i][captainPos]) then
|
||
XUiManager.TipMsg(XUiHelper.GetText("BfrtNotCaptain", i))
|
||
return
|
||
end
|
||
tableInsert(captainList, captainPos)
|
||
|
||
local firstFightPos = XBfrtManager.GetTeamFirstFightPos(echelonId, groupId, i)
|
||
if not XTool.IsNumberValid(fightTeamList[i] and fightTeamList[i][firstFightPos]) then
|
||
XUiManager.TipMsg(XUiHelper.GetText("BfrtNotFirstFight", i))
|
||
return
|
||
end
|
||
tableInsert(firstFightPosList, firstFightPos)
|
||
end
|
||
|
||
XNetwork.Call(METHOD_NAME.BfrtTeamSetRequest, {
|
||
BfrtGroupId = groupId,
|
||
FightTeam = fightTeamList, --List<List<int /*characterId*/> /*characterId list*/>
|
||
LogisticsTeam = logisticsTeamList, --List<List<int /*characterId*/> /*characterId list*/>
|
||
CaptainPosList = captainList,
|
||
FirstFightPosList = firstFightPosList,
|
||
}, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
|
||
FightTeams[groupId] = fightTeamList
|
||
LogisticsTeams[groupId] = logisticsTeamList
|
||
XBfrtManager.InitTeamCaptainPos(true)
|
||
XBfrtManager.InitTeamFirstFightPos(true)
|
||
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XBfrtManager.AutoTeam(groupId)
|
||
local anyMemberInTeam = false
|
||
local fightTeamList = {}
|
||
local logisticsTeamList = {}
|
||
local sortTeamInfoList = {}
|
||
local fightInfoIdList = XBfrtManager.GetFightInfoIdList(groupId)
|
||
local stageIds = XBfrtManager.GetStageIdList(groupId)
|
||
for i, echelonId in ipairs(fightInfoIdList) do
|
||
local fightTeam = { 0, 0, 0 }
|
||
tableInsert(fightTeamList, fightTeam)
|
||
|
||
local echelonCfg = GetEchelonInfo(echelonId)
|
||
local teamInfo = {
|
||
Index = i,
|
||
RequireAbility = echelonCfg.RequireAbility,
|
||
NeedCharacter = echelonCfg.NeedCharacter,
|
||
Team = fightTeam,
|
||
StageId = stageIds[i],
|
||
}
|
||
tableInsert(sortTeamInfoList, teamInfo)
|
||
end
|
||
|
||
local logisticsInfoIdList = XBfrtManager.GetLogisticsInfoIdList(groupId)
|
||
for i, echelonId in ipairs(logisticsInfoIdList) do
|
||
local logisticsTeam = { 0, 0, 0 }
|
||
tableInsert(logisticsTeamList, logisticsTeam)
|
||
|
||
local echelonCfg = GetEchelonInfo(echelonId)
|
||
local teamInfo = {
|
||
Index = i,
|
||
RequireAbility = echelonCfg.RequireAbility,
|
||
NeedCharacter = echelonCfg.NeedCharacter,
|
||
Team = logisticsTeam,
|
||
StageId = stageIds[i],
|
||
}
|
||
tableInsert(sortTeamInfoList, teamInfo)
|
||
end
|
||
|
||
tableSort(sortTeamInfoList, function(a, b)
|
||
if a.RequireAbility ~= b.RequireAbility then
|
||
return a.RequireAbility > b.RequireAbility
|
||
end
|
||
return a.Index < b.Index
|
||
end)
|
||
|
||
local ownCharacters = XDataCenter.CharacterManager.GetOwnCharacterList()
|
||
tableSort(ownCharacters, function(a, b)
|
||
return a.Ability > b.Ability
|
||
end)
|
||
|
||
for _, teamInfo in pairs(sortTeamInfoList) do
|
||
if not next(ownCharacters) then break end
|
||
|
||
local characterLimitType = XFubenConfigs.GetStageCharacterLimitType(teamInfo.StageId)
|
||
local defaultCharacterType = XDataCenter.FubenManager.GetDefaultCharacterTypeByCharacterLimitType(characterLimitType)
|
||
for memberIndex = 1, teamInfo.NeedCharacter do
|
||
for index, character in ipairs(ownCharacters) do
|
||
-- if character.Ability >= teamInfo.RequireAbility then
|
||
local charType = XCharacterConfigs.GetCharacterType(character.Id)
|
||
if defaultCharacterType ~= XFubenConfigs.CharacterLimitType.All and defaultCharacterType ~= charType then
|
||
goto SELECT_CONTINUE
|
||
end
|
||
teamInfo.Team[memberIndex] = character.Id
|
||
tableRemove(ownCharacters, index)
|
||
anyMemberInTeam = true
|
||
break
|
||
-- end
|
||
:: SELECT_CONTINUE ::
|
||
end
|
||
end
|
||
end
|
||
|
||
|
||
return fightTeamList, logisticsTeamList, anyMemberInTeam
|
||
end
|
||
|
||
function XBfrtManager.GetChapterPassCount(chapterId)
|
||
local passCount = 0
|
||
|
||
local groupList = XBfrtManager.GetGroupList(chapterId)
|
||
for _, groupId in ipairs(groupList) do
|
||
if GroupInfos[groupId].Passed then
|
||
passCount = passCount + 1
|
||
end
|
||
end
|
||
|
||
return passCount
|
||
end
|
||
|
||
function XBfrtManager.GetGroupCount(chapterId)
|
||
local groupList = XBfrtManager.GetGroupList(chapterId)
|
||
return #groupList
|
||
end
|
||
|
||
function XBfrtManager.GetTeamCaptainPos(echelonId, groupId, stageIndex)
|
||
local captainPos = EchlonTeamPosDic[echelonId]
|
||
local preGroupId = XBfrtConfigs.GetBfrtPreGroupId(groupId)
|
||
if not captainPos and XTool.IsNumberValid(preGroupId) then
|
||
local stageIdList = XBfrtManager.GetStageIdList(preGroupId)
|
||
echelonId = stageIdList and stageIdList[stageIndex]
|
||
captainPos = echelonId and EchlonTeamPosDic[echelonId]
|
||
end
|
||
return captainPos or XBfrtConfigs.CAPTIAN_MEMBER_INDEX
|
||
end
|
||
|
||
function XBfrtManager.SetTeamCaptainPos(echelonId, captainPos)
|
||
EchlonTeamPosDic[echelonId] = captainPos
|
||
end
|
||
|
||
function XBfrtManager.SetServerTeamCaptainPos(echelonId, captainPos)
|
||
EchlonServerTeamPosDic[echelonId] = captainPos
|
||
end
|
||
|
||
function XBfrtManager.InitTeamCaptainPos(isClientToServerData)
|
||
if isClientToServerData then
|
||
for echelonId, captainPos in pairs(EchlonTeamPosDic) do
|
||
XBfrtManager.SetServerTeamCaptainPos(echelonId, captainPos)
|
||
end
|
||
return
|
||
end
|
||
for echelonId, captainPos in pairs(EchlonServerTeamPosDic) do
|
||
XBfrtManager.SetTeamCaptainPos(echelonId, captainPos)
|
||
end
|
||
end
|
||
|
||
---==========================================
|
||
--- 得到队伍首发位
|
||
--- 当首发位不为空时,直接返回首发位,否则返回默认首发位
|
||
---(因为服务器在之前只有队长位,后面区分了队长位与首发位,存在有队长位数据,没有首发位数据的情况)
|
||
---@return number
|
||
---==========================================
|
||
function XBfrtManager.GetTeamFirstFightPos(echelonId, groupId, stageIndex)
|
||
local firstFightPos = EchlonFirstFightDic[echelonId]
|
||
local preGroupId = XBfrtConfigs.GetBfrtPreGroupId(groupId)
|
||
if not firstFightPos and XTool.IsNumberValid(preGroupId) then
|
||
local stageIdList = XBfrtManager.GetStageIdList(preGroupId)
|
||
echelonId = stageIdList and stageIdList[stageIndex]
|
||
firstFightPos = echelonId and EchlonFirstFightDic[echelonId]
|
||
end
|
||
return firstFightPos or XBfrtConfigs.FIRST_FIGHT_MEMBER_INDEX
|
||
end
|
||
|
||
function XBfrtManager.SetTeamFirstFightPos(echelonId, firstFightPos)
|
||
EchlonFirstFightDic[echelonId] = firstFightPos
|
||
end
|
||
|
||
function XBfrtManager.SetServerTeamFirstFightPos(echelonId, firstFightPos)
|
||
EchlonServerFirstFightDic[echelonId] = firstFightPos
|
||
end
|
||
|
||
function XBfrtManager.InitTeamFirstFightPos(isClientToServerData)
|
||
if isClientToServerData then
|
||
for echelonId, firstFightPos in pairs(EchlonFirstFightDic) do
|
||
XBfrtManager.SetServerTeamFirstFightPos(echelonId, firstFightPos)
|
||
end
|
||
return
|
||
end
|
||
for echelonId, firstFightPos in pairs(EchlonServerFirstFightDic) do
|
||
XBfrtManager.SetTeamFirstFightPos(echelonId, firstFightPos)
|
||
end
|
||
end
|
||
|
||
function XBfrtManager.NotifyBfrtData(data)
|
||
BfrtData = data.BfrtData
|
||
|
||
InitGroupInfo()
|
||
InitChapterInfo()
|
||
InitFollowGroup()
|
||
InitTeamRecords()
|
||
end
|
||
----------------------服务端协议end----------------------
|
||
XBfrtManager.Init()
|
||
return XBfrtManager
|
||
end
|
||
|
||
XRpc.NotifyBfrtData = function(data)
|
||
XDataCenter.BfrtManager.NotifyBfrtData(data)
|
||
end |