forked from endernon/PGRData
336 lines
16 KiB
Lua
336 lines
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
|