XPrequelManagerCreator = function() local XPrequelManager = {} local UnlockChallengeStages = {} local RewardedStages = {} local NextCheckPoint = nil -- manager层 local Cover2ChapterMap = {}--记录上一个封面 local CoverPrefix = "CoverPrefix" local Stage2ChapterMap = {} function XPrequelManager.InitPrequelData(fubenPrequelData) if not fubenPrequelData then return end for _, v in pairs(fubenPrequelData.RewardedStages or {}) do RewardedStages[v] = true end for _, v in pairs(fubenPrequelData.UnlockChallengeStages or {}) do UnlockChallengeStages[v.StageId] = v end end function XPrequelManager.SaveCoverChapterHint(key, value) if XPlayer.Id then key = string.format("%s_%s", tostring(XPlayer.Id), key) CS.UnityEngine.PlayerPrefs.SetInt(key, value) CS.UnityEngine.PlayerPrefs.Save() end end function XPrequelManager.GetCoverChapterHint(key, defaultValue) if XPlayer.Id then key = string.format("%s_%s", tostring(XPlayer.Id), key) if CS.UnityEngine.PlayerPrefs.HasKey(key) then local newPlayerHint = CS.UnityEngine.PlayerPrefs.GetInt(key) return (newPlayerHint == nil or newPlayerHint == 0) and defaultValue or newPlayerHint end end return defaultValue end function XPrequelManager.InitStageInfo() for chapterId, chapterCfg in pairs(XPrequelConfigs.GetPequelAllChapter() or {}) do for _, stageId in pairs(chapterCfg.StageId or {}) do Stage2ChapterMap[stageId] = chapterId local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId) if stageInfo then stageInfo.Type = XDataCenter.FubenManager.StageType.Prequel end end end for _, coverCfg in pairs(XPrequelConfigs.GetPrequelCoverList() or {}) do for _, stageId in pairs(coverCfg.ChallengeStage or {}) do local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId) if stageInfo then stageInfo.Type = XDataCenter.FubenManager.StageType.Prequel end end end end -- [更新封面显示的chapter] function XPrequelManager.UpdateShowChapter(stageId) if not stageId then return end local chapterId = XPrequelConfigs.GetChapterByStageId(stageId) if not chapterId then return end local coverId = XPrequelConfigs.GetCoverByChapterId(chapterId) if not coverId then return end local key = string.format("%s%s", CoverPrefix, tostring(coverId)) XPrequelManager.SaveCoverChapterHint(key, chapterId) Cover2ChapterMap[coverId] = chapterId end function XPrequelManager.ShowReward(winData) XLuaUiManager.Open("UiSettleWin", winData) end -- [获取已经解锁的挑战关卡,nil代表未解锁] function XPrequelManager.GetUnlockChallengeStagesByStageId(stageId) return UnlockChallengeStages[stageId] end -- [解锁挑战] function XPrequelManager.UnlockPrequelChallengeRequest(coverId, challengeIdx, stageId, cb) XNetwork.Call("UnlockPrequelChallengeRequest", { CoverId = coverId, ChallengeId = challengeIdx }, function(res) cb = cb or function() end if res.Code == XCode.Success then UnlockChallengeStages[stageId] = res.ChallengeStage cb(res) else XUiManager.TipCode(res.Code) end end) end -- [前传奖励领取] function XPrequelManager.ReceivePrequelRewardRequest(stageId, cb) XNetwork.Call("ReceivePrequelRewardRequest", { StageId = stageId }, function(res) cb = cb or function() end if res.Code == XCode.Success then RewardedStages[res.StageId] = true -- 显示奖励 XUiManager.OpenUiObtain(res.RewardGoodsList, CS.XTextManager.GetText("DailyActiveRewardTitle")) cb(res) else XUiManager.TipCode(res.Code) end end) end -- [剧情] function XPrequelManager.FinishStoryRequest(stageId, cb) XNetwork.Call("EnterStoryRequest", { StageId = stageId }, function(res) cb = cb or function() end if res.Code == XCode.Success then cb(res) else XUiManager.TipCode(res.Code) end end) end function XPrequelManager.GetRewardedStages() return RewardedStages end function XPrequelManager.IsRewardStageCollected(stageId) return RewardedStages[stageId] end function XPrequelManager.IsStoryStage(stageId) local stageCfg = XDataCenter.FubenManager.GetStageCfg(stageId) if not stageCfg then return false end return stageCfg.StageType == XFubenConfigs.STAGETYPE_STORYEGG end -- [服务器同步领取奖励的剧情关卡数据] function XPrequelManager.OnSyncRewardedStage(response) for _, v in pairs(response.RewardedStages or {}) do RewardedStages[v] = true end end -- [服务器同步解锁的挑战关卡数据] function XPrequelManager.OnSyncUnlockChallengeStage(response) UnlockChallengeStages = response.UnlockChallengeStages XEventManager.DispatchEvent(XEventId.EVENT_NOTICE_CHALLENGESTAGES_CHANGE) end function XPrequelManager.OnSyncSingleUnlockChallengeStage(response) local currentStage = response.ChallengeStage UnlockChallengeStages[currentStage.StageId] = currentStage XEventManager.DispatchEvent(XEventId.EVENT_NOTICE_CHALLENGESTAGES_CHANGE) end -- [刷新时间-需要通知界面及时更新] function XPrequelManager.OnSyncNextRefreshTime(response) NextCheckPoint = response.NextRefreshTime XEventManager.DispatchEvent(XEventId.EVENT_NOTICE_REFRESHTIME_CHANGE) end -- [判断解锁条件] function XPrequelManager.CheckPrequelStageOpen(stageId) local stageCfg = XDataCenter.FubenManager.GetStageCfg(stageId) local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId) local isUnlock = stageInfo.Unlock if stageInfo.Unlock then for _, conditionId in pairs(stageCfg.ForceConditionId or {}) do local rect, _ = XConditionManager.CheckCondition(conditionId) if not rect then return rect end end end if stageCfg.StageType == XFubenConfigs.STAGETYPE_STORYEGG or stageCfg.StageType == XFubenConfigs.STAGETYPE_FIGHTEGG then return isUnlock and XDataCenter.FubenManager.GetUnlockHideStageById(stageId) end return isUnlock end function XPrequelManager.GetCoverUnlockDescription(coverId) local coverInfos = XPrequelConfigs.GetPrequelCoverById(coverId) local chapterIds = coverInfos.ChapterId for _, chapterId in pairs(chapterIds or {}) do local chapterInfo = XPrequelConfigs.GetPrequelChapterById(chapterId) for _, openConditoinId in pairs(chapterInfo.OpenCondition or {}) do local rect, desc = XConditionManager.CheckCondition(openConditoinId) if not rect then return desc end end end return "" end -- 检查章节开启条件 function XPrequelManager.GetChapterUnlockDescription(chapterId) local chapterTemplate = XPrequelConfigs.GetPrequelChapterById(chapterId) -- 如果处于活动,优先判断活动的Condition local inActivity = XPrequelManager.IsChapterInActivity(chapterId) if chapterTemplate.ActivityCondition ~= 0 and inActivity then local rect, desc = XConditionManager.CheckCondition(chapterTemplate.ActivityCondition) if not rect then return desc end return nil end for _, openConditoinId in pairs(chapterTemplate.OpenCondition or {}) do local rect, desc = XConditionManager.CheckCondition(openConditoinId) if not rect then return desc end end end -- [进度] function XPrequelManager.GetChapterProgress(chapterId) local chapterInfos = XPrequelConfigs.GetPrequelChapterById(chapterId) local total = 0 local finishedStageNum = 0 for _, stageId in pairs(chapterInfos.StageId or {}) do local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId) local stageCfg = XDataCenter.FubenManager.GetStageCfg(stageId) if stageCfg.StageType ~= XFubenConfigs.STAGETYPE_STORYEGG and stageCfg.StageType ~= XFubenConfigs.STAGETYPE_FIGHTEGG then total = total + 1 if stageInfo.Passed then finishedStageNum = finishedStageNum + 1 end end end return finishedStageNum, total end -- [寻找一个可以使用的章节] function XPrequelManager.GetSelectableChaperIndex(cover) local showChapter = cover.ShowChapter local defaultChapter = 1 local hasDefault = false local reverseId = #cover.CoverActiveChapterIds --章节UI页签按钮是以倒序显示的 for index, chapterId in pairs(cover.CoverActiveChapterIds or {}) do local chapterDescription = XPrequelManager.GetChapterUnlockDescription(chapterId) if chapterDescription == nil then if showChapter and showChapter == chapterId then return reverseId end if not hasDefault then hasDefault = true defaultChapter = index end end reverseId = reverseId - 1 end return defaultChapter end function XPrequelManager.GetIndexByChapterId(cover, chapterId) if not chapterId then return nil end local index = #cover.CoverActiveChapterIds for _, id in pairs(cover.CoverActiveChapterIds or {}) do if XPrequelManager.IsChapterInActivity(id) or not XPrequelManager.GetChapterLockStatus(id) then if chapterId == id then return index end end index = index - 1 end return index end -- [获取章节锁定状态] function XPrequelManager.GetChapterLockStatus(chapterId) local chapterInfo = XPrequelConfigs.GetPrequelChapterById(chapterId) for _, conditionId in pairs(chapterInfo.OpenCondition or {}) do local rect, _ = XConditionManager.CheckCondition(conditionId) if not rect then return true end end return false end -- [章节是否处于活动中] function XPrequelManager.IsInActivity() local chapters = XPrequelConfigs.GetPequelAllChapter() for chapterId in pairs(chapters) do if XPrequelManager.IsChapterInActivity(chapterId) then return true end end return false end -- [是否有章节处于活动中] function XPrequelManager.IsChapterInActivity(chapterId) local config = XPrequelConfigs.GetPrequelChapterById(chapterId) return XFunctionManager.CheckInTimeByTimeId(config.TimeId) end -- 支线奖励 function XPrequelManager.CheckRewardAvailable(chapterId) local chapterInfos = XPrequelConfigs.GetPrequelChapterById(chapterId) local rewardedStages = XPrequelManager.GetRewardedStages() for _, stageId in pairs(chapterInfos.StageId or {}) do local stageCfg = XDataCenter.FubenManager.GetStageCfg(stageId) local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId) if stageCfg.FirstRewardShow > 0 and stageInfo.Passed and rewardedStages and (not rewardedStages[stageId]) then return true end end return false end function XPrequelManager.GetListCovers() local coverList = {} for k, v in pairs(XPrequelConfigs.GetPrequelCoverList() or {}) do local showChapter, isActivity, isAllChapterLock, isActivityNotOpen = XPrequelManager.GetPriorityChapter(v.ChapterId, k) local chapterWeight = 0 if isActivity then chapterWeight = 4 else if isAllChapterLock == false then chapterWeight = 3 end if isActivityNotOpen then chapterWeight = 2 end end local activeChapterIds = XPrequelManager.GetListActiveChapterIdsByCoverId(k) if #activeChapterIds > 0 then -- 如果存在当前时间下激活的章节才显示 table.insert(coverList, { CoverId = k, CoverVal = v, ShowChapter = showChapter, IsActivity = isActivity, IsAllChapterLock = isAllChapterLock, IsActivityNotOpen = isActivityNotOpen, ChapterWeight = chapterWeight, CoverActiveChapterIds = activeChapterIds, }) end end table.sort(coverList, function(coverA, coverB) local coverAWeight = coverA.ChapterWeight local coverBWeight = coverB.ChapterWeight if coverAWeight == coverBWeight then return coverA.CoverVal.Priority < coverB.CoverVal.Priority end return coverAWeight > coverBWeight end) return coverList end -- 获取当前时间已激活的章节Id列表 function XPrequelManager.GetListActiveChapterIdsByCoverId(coverId) local coverTemplate = XPrequelConfigs.GetPrequelCoverById(coverId) local activeChapterIdList = {} local nowTimeStamp = XTime.GetServerNowTimestamp() for i, v in ipairs(coverTemplate.ChapterId) do local isActive = false if coverTemplate.ActiveTimes[i] ~= nil and coverTemplate.ActiveTimes[i] ~= "" then local activeTime = XTime.ParseToTimestamp(coverTemplate.ActiveTimes[i]) if nowTimeStamp >= activeTime then isActive = true end else isActive = true end if isActive then table.insert(activeChapterIdList, coverTemplate.ChapterId[i]) end end return activeChapterIdList end function XPrequelManager.GetPriorityChapter(chapters, coverId) local currentChapter = chapters[1] local currentPriority = 0 local isActivity = false local isActivityNotOpen = false local isAllChapterLock = true for _, chapterId in pairs(chapters or {}) do local chapterInfo = XPrequelConfigs.GetPrequelChapterById(chapterId) if XPrequelManager.IsChapterInActivity(chapterId) then if currentPriority < chapterInfo.Priority then isActivityNotOpen = true if chapterInfo.ActivityCondition <= 0 or (chapterInfo.ActivityCondition > 0 and XConditionManager.CheckCondition(chapterInfo.ActivityCondition)) then currentChapter = chapterId currentPriority = chapterInfo.Priority isActivity = true isActivityNotOpen = false end end end for _, conditionId in pairs(chapterInfo.OpenCondition or {}) do local rect, _ = XConditionManager.CheckCondition(conditionId) if rect then isAllChapterLock = false end end end -- [寻找一个正确的显示在封面的章节] if (not isAllChapterLock) and (not isActivity) then for _, chapterId in pairs(chapters or {}) do if not XDataCenter.PrequelManager.GetChapterLockStatus(chapterId) then currentChapter = chapterId break end end end -- 优先显示上一次打过的章节 if not Cover2ChapterMap[coverId] then local key = string.format("%s%s", CoverPrefix, tostring(coverId)) local recordChapter = XPrequelManager.GetCoverChapterHint(key, currentChapter) local isRecordChapterInActivity = XPrequelManager.IsChapterInActivity(recordChapter) local recordChapterDescription = XPrequelManager.GetChapterUnlockDescription(recordChapter) if isRecordChapterInActivity then currentChapter = recordChapter else if recordChapterDescription == nil then currentChapter = recordChapter end end elseif Cover2ChapterMap[coverId] and Cover2ChapterMap[coverId] ~= currentChapter then local recordChapter = Cover2ChapterMap[coverId] local recordChapterDescription = XPrequelManager.GetChapterUnlockDescription(recordChapter) local isRecordChapterInActivity = XPrequelManager.IsChapterInActivity(recordChapter) if isRecordChapterInActivity then currentChapter = Cover2ChapterMap[coverId] else if recordChapterDescription == nil then currentChapter = recordChapter end end end return currentChapter, isActivity, isAllChapterLock, isActivityNotOpen end function XPrequelManager.GetNextCheckPointTime() return NextCheckPoint end function XPrequelManager.GetChapterIdByStageId(stageId) return Stage2ChapterMap[stageId] end return XPrequelManager end XRpc.NotifyFubenPrequelData = function(response) if not response then return end XDataCenter.PrequelManager.InitPrequelData(response.FubenPrequelData) end -- [领取奖励] XRpc.NotifyPrequelRewardedStages = function(response) if not response then return end XDataCenter.PrequelManager.OnSyncRewardedStage(response) end -- [解锁挑战关卡回复] XRpc.NotifyPrequelUnlockChallengeStages = function(response) if not response then return end XDataCenter.PrequelManager.OnSyncUnlockChallengeStage(response) end XRpc.NotifyPrequelChallengeStage = function(response) if not response then return end XDataCenter.PrequelManager.OnSyncSingleUnlockChallengeStage(response) end -- [下一个刷新时间] XRpc.NotifyPrequelChallengeRefreshTime = function(response) if not response then return end XDataCenter.PrequelManager.OnSyncNextRefreshTime(response) end