forked from endernon/PGRData
336 lines
No EOL
16 KiB
Lua
336 lines
No EOL
16 KiB
Lua
local XChapterViewModel = require("XEntity/XFuben/XChapterViewModel")
|
||
local XExFubenBaseManager = require("XEntity/XFuben/XExFubenBaseManager")
|
||
local XExFubenMainLineManager = XClass(XExFubenBaseManager, "XExFubenMainLineManager")
|
||
|
||
function XExFubenMainLineManager:ExOpenChapterUi(viewModel, difficulty)
|
||
if difficulty == nil then difficulty = XDataCenter.FubenManager.DifficultNormal end
|
||
-- 已解锁
|
||
local extralData = viewModel:GetExtralData()
|
||
local chapterMainId = extralData.MainId
|
||
local chapterConfig = XDataCenter.FubenMainLineManager.GetChapterCfgByChapterMain(chapterMainId, difficulty)
|
||
if not viewModel:GetIsLocked() then
|
||
XDataCenter.DlcManager.CheckDownloadForEntry(XDlcConfig.EntryType.MainChapter, chapterMainId, function()
|
||
if chapterMainId == XDataCenter.FubenMainLineManager.TRPGChapterId then
|
||
XDataCenter.TRPGManager.PlayStartStory()
|
||
elseif chapterMainId == XDataCenter.FubenMainLineManager.MainLine3DId then
|
||
XLuaUiManager.Open("UiFubenMainLine3D")
|
||
else
|
||
XLuaUiManager.Open("UiFubenMainLineChapter", chapterConfig)
|
||
end
|
||
end)
|
||
-- self:ExSetCurrentGroupIndexAndChapterIndex(extralData.GroupId, extralData.Index)
|
||
elseif viewModel:CheckHasTimeLimitTag() then
|
||
local ret, desc = XDataCenter.FubenMainLineManager.CheckActivityCondition(viewModel:GetId())
|
||
if not ret then
|
||
XUiManager.TipError(desc)
|
||
end
|
||
else
|
||
if difficulty == XDataCenter.FubenManager.DifficultNightmare then
|
||
XUiManager.TipMsg(CS.XTextManager.GetText("BfrtChapterUnlockCondition"))
|
||
elseif chapterMainId == XDataCenter.FubenMainLineManager.TRPGChapterId then
|
||
XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.MainLineTRPG)
|
||
else
|
||
local isOpen, desc = XDataCenter.FubenMainLineManager.CheckOpenCondition(viewModel:GetId())
|
||
if not isOpen then
|
||
XUiManager.TipMsg(desc)
|
||
return
|
||
end
|
||
local chapterInfo = XDataCenter.FubenMainLineManager.GetChapterInfoByChapterMain(chapterMainId, difficulty)
|
||
local tipMsg = XDataCenter.FubenManager.GetFubenOpenTips(chapterInfo.FirstStage)
|
||
XUiManager.TipMsg(tipMsg)
|
||
end
|
||
end
|
||
end
|
||
|
||
function XExFubenMainLineManager:ExGetChapterViewModels(groupId, difficulty)
|
||
if difficulty == nil then
|
||
local result = {}
|
||
result = appendArray(result, self:ExGetChapterViewModels(groupId, XDataCenter.FubenManager.DifficultNormal))
|
||
result = appendArray(result, self:ExGetChapterViewModels(groupId, XDataCenter.FubenManager.DifficultHard))
|
||
return result
|
||
end
|
||
if self.__ChapterViewModelDic == nil then self.__ChapterViewModelDic = {} end
|
||
if self.__ChapterViewModelDic[groupId] == nil then self.__ChapterViewModelDic[groupId] = {} end
|
||
if self.__ChapterViewModelDic[groupId][difficulty] then return self.__ChapterViewModelDic[groupId][difficulty] end
|
||
self.__ChapterViewModelDic[groupId][difficulty] = {}
|
||
for i, config in ipairs(self:ExGetChapterConfigs(groupId, difficulty)) do
|
||
local subChapterId = XDataCenter.FubenMainLineManager.GetChapterIdByChapterMain(config.Id, difficulty)
|
||
if subChapterId ~= nil and subChapterId > 0 then
|
||
-- 提审服屏蔽第一章以外的
|
||
if XUiManager.IsHideFunc then
|
||
if config.Id == 1001 then -- 第一章id
|
||
table.insert(self.__ChapterViewModelDic[groupId][difficulty], self:ExGetChapterViewModelById(config.Id, difficulty, i))
|
||
end
|
||
else
|
||
table.insert(self.__ChapterViewModelDic[groupId][difficulty], self:ExGetChapterViewModelById(config.Id, difficulty, i))
|
||
end
|
||
end
|
||
end
|
||
return self.__ChapterViewModelDic[groupId][difficulty]
|
||
end
|
||
|
||
-- 获取主线章节配置数据, 服务器数据走XDataCenter.FubenMainLineManager.GetChapterInfoByChapterMain
|
||
-- difficulty : XDataCenter.FubenManager.DifficultNormal or XDataCenter.FubenManager.DifficultHard
|
||
function XExFubenMainLineManager:ExGetChapterConfigs(groupId, difficulty)
|
||
if difficulty == nil then
|
||
return appendArray(self:ExGetChapterConfigs(groupId, XDataCenter.FubenManager.DifficultNormal)
|
||
, self:ExGetChapterConfigs(groupId, XDataCenter.FubenManager.DifficultHard))
|
||
end
|
||
if self.__ChapterConfigDic == nil then self.__ChapterConfigDic = {} end
|
||
if self.__ChapterConfigDic[groupId] == nil then self.__ChapterConfigDic[groupId] = {} end
|
||
local result = self.__ChapterConfigDic[groupId][difficulty]
|
||
if result then return result end
|
||
result = result or {}
|
||
local chapterConfigs = XDataCenter.FubenMainLineManager.GetChapterMainTemplates(difficulty)
|
||
for _, config in ipairs(chapterConfigs) do
|
||
if config.GroupId == groupId then
|
||
table.insert(result, config)
|
||
end
|
||
end
|
||
self.__ChapterConfigDic[groupId][difficulty] = result
|
||
return result
|
||
end
|
||
|
||
-- 获取主线章节分组配置数据
|
||
function XExFubenMainLineManager:ExGetChapterGroupConfigs()
|
||
local resultConfigs = XFubenMainLineConfigs.GetAllConfigs(XFubenMainLineConfigs.TableKey.ChapterMainGroup)
|
||
if XUiManager.IsHideFunc then
|
||
local tempConfigs = {}
|
||
table.insert(tempConfigs, resultConfigs[1])
|
||
resultConfigs = tempConfigs
|
||
end
|
||
return resultConfigs
|
||
end
|
||
|
||
-- 检查章节分组是否有红点
|
||
function XExFubenMainLineManager:ExCheckChapterGroupHasRedPoint(groupId, difficulty)
|
||
for _, viewModel in ipairs(self:ExGetChapterViewModels(groupId, difficulty)) do
|
||
if viewModel:CheckHasRedPoint() then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 检查章节分组是否有限时tag
|
||
function XExFubenMainLineManager:ExCheckChapterGroupHasTimeLimitTag(groupId, difficulty)
|
||
for _, viewModel in ipairs(self:ExGetChapterViewModels(groupId,difficulty)) do
|
||
if viewModel:CheckHasTimeLimitTag() then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 检查是否展示红点
|
||
function XExFubenMainLineManager:ExCheckIsShowRedPoint()
|
||
for _, config in ipairs(self:ExGetChapterGroupConfigs()) do
|
||
if self:ExCheckChapterGroupHasRedPoint(config.Id) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 检查章节是否已经锁住
|
||
function XExFubenMainLineManager:ExCheckGroupIsLocked(groupId, difficulty)
|
||
for _, viewModel in ipairs(self:ExGetChapterViewModels(groupId, difficulty)) do
|
||
if not viewModel:GetIsLocked() then
|
||
return false
|
||
end
|
||
end
|
||
return true
|
||
end
|
||
|
||
-- 获取章节是否已解锁和锁定提示
|
||
function XExFubenMainLineManager:ExGetChapterIsLockAndLockTip(chapterMainId, difficulty)
|
||
local chapterInfo = XDataCenter.FubenMainLineManager.GetChapterInfoByChapterMain(chapterMainId, difficulty)
|
||
-- 已解锁
|
||
if chapterInfo and chapterInfo.Unlock then return false end
|
||
-- 未解锁
|
||
-- 限时活动特殊处理
|
||
if chapterInfo.IsActivity then
|
||
local chapterId = XDataCenter.FubenMainLineManager.GetChapterIdByChapterMain(chapterMainId, difficulty)
|
||
local _, desc = XDataCenter.FubenMainLineManager.CheckActivityCondition(chapterId)
|
||
return true, desc
|
||
end
|
||
return true, XUiHelper.GetText("CommonLockedTip")
|
||
end
|
||
|
||
function XExFubenMainLineManager:ExGetChapterViewModelById(chapterMainId, difficulty, index)
|
||
local subChapterId = XDataCenter.FubenMainLineManager.GetChapterIdByChapterMain(chapterMainId, difficulty)
|
||
if self.__ChapterViewModelIdDic == nil then self.__ChapterViewModelIdDic = {} end
|
||
if self.__ChapterViewModelIdDic[subChapterId] then return self.__ChapterViewModelIdDic[subChapterId] end
|
||
local result = nil
|
||
local config = XDataCenter.FubenMainLineManager.GetChapterMainTemplate(chapterMainId)
|
||
if subChapterId ~= nil and subChapterId > 0 then
|
||
result = CreateAnonClassInstance({
|
||
CheckHasRedPoint = function(proxy)
|
||
return XRedPointConditionChapterReward.Check(proxy:GetId())
|
||
end,
|
||
CheckHasNewTag = function(proxy)
|
||
return XDataCenter.FubenMainLineManager.CheckChapterNew(proxy:GetId())
|
||
end,
|
||
CheckIsPassed = function(proxy)
|
||
local chapterInfo = XDataCenter.FubenMainLineManager.GetChapterInfo(proxy:GetId())
|
||
return chapterInfo.Unlock and chapterInfo.Passed
|
||
end,
|
||
CheckHasTimeLimitTag = function(proxy)
|
||
local chapterInfo = XDataCenter.FubenMainLineManager.GetChapterInfoByChapterMain(proxy:GetExtralData().MainId
|
||
, proxy:GetExtralData().Difficulty)
|
||
return chapterInfo.IsActivity or false
|
||
end,
|
||
GetWeeklyChallengeCount = function(proxy)
|
||
local chapterConfig = XDataCenter.FubenMainLineManager.GetChapterMainTemplate(proxy:GetExtralData().MainId)
|
||
return XDataCenter.FubenZhouMuManager.GetZhouMuNumber(chapterConfig.ZhouMuId)
|
||
end,
|
||
GetIsLocked = function(proxy)
|
||
return self:ExGetChapterIsLockAndLockTip(proxy:GetExtralData().MainId, proxy:GetExtralData().Difficulty)
|
||
end,
|
||
GetLockTip = function(proxy)
|
||
if proxy:CheckHasTimeLimitTag() then
|
||
local ret, desc = XDataCenter.FubenMainLineManager.CheckActivityCondition(proxy:GetId())
|
||
if not ret then
|
||
return desc
|
||
end
|
||
else
|
||
if difficulty == XDataCenter.FubenManager.DifficultNightmare then
|
||
return CS.XTextManager.GetText("BfrtChapterUnlockCondition")
|
||
elseif chapterMainId == XDataCenter.FubenMainLineManager.TRPGChapterId then
|
||
return XFunctionManager.GetFunctionOpenCondition(XFunctionManager.FunctionName.MainLineTRPG)
|
||
else
|
||
local isOpen, desc = XDataCenter.FubenMainLineManager.CheckOpenCondition(proxy:GetId())
|
||
if not isOpen then
|
||
return desc
|
||
end
|
||
local chapterInfo = XDataCenter.FubenMainLineManager.GetChapterInfoByChapterMain(chapterMainId, difficulty)
|
||
local tipMsg = XDataCenter.FubenManager.GetFubenOpenTips(chapterInfo.FirstStage)
|
||
return tipMsg
|
||
end
|
||
end
|
||
|
||
end,
|
||
GetDifficulty = function(proxy)
|
||
return difficulty
|
||
end,
|
||
GetCurrentAndMaxProgress = function(proxy)
|
||
-- return XDataCenter.FubenMainLineManager.GetCurrentAndMaxProgress(proxy:GetId())
|
||
local normalCurStars, normalTotalStars = XDataCenter.FubenMainLineManager.GetChapterStars(proxy:GetId())
|
||
-- 再加上剧情进度计算:1个剧情关算1颗星
|
||
local styPassCount, styTotal = XDataCenter.FubenManagerEx.GetStoryStagePassCount(XDataCenter.FubenMainLineManager.GetStageList(proxy:GetId()))
|
||
normalCurStars = normalCurStars + styPassCount
|
||
normalTotalStars = normalTotalStars + styTotal
|
||
-- 如果有隐藏模式 要把隐藏模式的进度一起算上
|
||
local hideId = XDataCenter.FubenMainLineManager.GetChapterIdByChapterMain(chapterMainId, XDataCenter.FubenMainLineManager.DifficultHard)
|
||
if hideId and hideId > 0 then -- 如果该viewmodel本来就是隐藏关,这里也会重复计算,但是也不需要检测该viewmodel是否是隐藏关, 因为只是拿进度和红点
|
||
local styPassCount2, styTotal2 = XDataCenter.FubenManagerEx.GetStoryStagePassCount(XDataCenter.FubenMainLineManager.GetStageList(hideId))
|
||
normalCurStars = normalCurStars + styPassCount2
|
||
normalTotalStars = normalTotalStars + styTotal2
|
||
local hideCurStars, hideTotalStars = XDataCenter.FubenMainLineManager.GetChapterStars(hideId)
|
||
normalCurStars = normalCurStars + hideCurStars
|
||
normalTotalStars = normalTotalStars + hideTotalStars
|
||
end
|
||
return normalCurStars, normalTotalStars
|
||
end,
|
||
}, XChapterViewModel
|
||
, {
|
||
Id = subChapterId,
|
||
ExtralName = string.format("%02d", config.OrderId),
|
||
Name = config.ChapterEn,
|
||
Icon = config.Icon,
|
||
ExtralData = {
|
||
GroupId = config.GroupId,
|
||
Difficulty = difficulty,
|
||
MainId = config.Id,
|
||
OrderId = config.OrderId,
|
||
Index = index,
|
||
},
|
||
FirstStage = XDataCenter.FubenMainLineManager.GetChapterInfoByChapterMain(chapterMainId, difficulty).FirstStage,
|
||
ActivityCondition = XDataCenter.FubenMainLineManager.GetChapterCfg(subChapterId).ActivityCondition
|
||
})
|
||
self.__ChapterViewModelIdDic[subChapterId] = result
|
||
end
|
||
return result
|
||
end
|
||
|
||
-- 检查章节是否有指定难度开启
|
||
function XExFubenMainLineManager:ExCheckChapterHasDifficulty(difficulty, orderId)
|
||
local hardOpen = XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.FubenDifficulty)
|
||
local chapterInfo = XDataCenter.FubenMainLineManager.GetChapterInfoForOrderId(difficulty, orderId)
|
||
hardOpen = hardOpen and chapterInfo and chapterInfo.IsOpen
|
||
return hardOpen
|
||
end
|
||
|
||
function XExFubenMainLineManager:ExGetCurrentGroupIndexAndChapterIndex(groupId)
|
||
-- if checkHistory == nil then checkHistory = true end
|
||
-- checkHistory = false
|
||
-- if checkHistory then
|
||
-- return XSaveTool.GetData("XExFubenMainLineManager.CurrentGroupIndex" .. XPlayer.Id) or 1
|
||
-- , XSaveTool.GetData("XExFubenMainLineManager.CurrentChapterIndex" .. XPlayer.Id) or 1
|
||
-- end
|
||
local groupConfigs
|
||
if groupId == nil then
|
||
groupConfigs = self:ExGetChapterGroupConfigs()
|
||
else
|
||
groupConfigs = { XFubenMainLineConfigs.GetCfgByIdKey(XFubenMainLineConfigs.TableKey.ChapterMainGroup, groupId) }
|
||
end
|
||
local extralData, hardViewModel
|
||
local lockAll = true
|
||
local timeLimitResult = nil
|
||
local normalResult = nil
|
||
local lastModelInfo = nil -- 记录上一个
|
||
local playerCurrModelInfo = nil -- 记录玩家当前通关到的关卡
|
||
for i, config in ipairs(groupConfigs) do
|
||
local viewModels = self:ExGetChapterViewModels(config.Id, XDataCenter.FubenManager.DifficultNormal)
|
||
for i, viewModel in ipairs(viewModels) do
|
||
if not viewModel:GetIsLocked() then
|
||
lockAll = false
|
||
end
|
||
extralData = viewModel:GetExtralData()
|
||
-- 检查正常难度
|
||
if viewModel:CheckHasNewTag() then
|
||
if viewModel:CheckHasTimeLimitTag() then
|
||
return extralData.GroupId, i
|
||
end
|
||
if normalResult == nil then
|
||
normalResult = { extralData.GroupId, i }
|
||
end
|
||
end
|
||
-- 检查困难难度
|
||
hardViewModel = self:ExGetChapterViewModelById(extralData.MainId, XDataCenter.FubenManager.DifficultHard, i)
|
||
if hardViewModel and hardViewModel:CheckHasNewTag() then
|
||
if hardViewModel:CheckHasTimeLimitTag() then
|
||
return extralData.GroupId, i
|
||
end
|
||
if normalResult == nil then
|
||
normalResult = { extralData.GroupId, i }
|
||
end
|
||
end
|
||
-- 记录当前玩家打到的关卡
|
||
if viewModel:GetIsLocked() and lastModelInfo and lastModelInfo.ViewModel and not lastModelInfo.ViewModel:GetIsLocked() then
|
||
playerCurrModelInfo = {ViewModel = lastModelInfo.ViewModel, Index = lastModelInfo.Index}
|
||
end
|
||
|
||
lastModelInfo = {ViewModel = viewModel, Index = i}
|
||
end
|
||
end
|
||
-- 最后如果没有限时章节,再返回当前打到的关卡
|
||
if playerCurrModelInfo then
|
||
return playerCurrModelInfo.ViewModel:GetExtralData().GroupId, playerCurrModelInfo.Index
|
||
end
|
||
if lockAll then
|
||
return 1, 1
|
||
end
|
||
if normalResult then
|
||
return normalResult[1], normalResult[2]
|
||
end
|
||
return #groupConfigs, #self:ExGetChapterViewModels(groupConfigs[#groupConfigs].Id, XDataCenter.FubenManager.DifficultNormal)
|
||
|
||
end
|
||
|
||
-- function XExFubenMainLineManager:ExSetCurrentGroupIndexAndChapterIndex(groupId, index)
|
||
-- XSaveTool.SaveData("XExFubenMainLineManager.CurrentGroupIndex" .. XPlayer.Id, groupId)
|
||
-- XSaveTool.SaveData("XExFubenMainLineManager.CurrentChapterIndex" .. XPlayer.Id, index)
|
||
-- end
|
||
|
||
return XExFubenMainLineManager |