PGRData/Script/matrix/xmanager/XPrequelManager.lua

483 lines
19 KiB
Lua
Raw Normal View History

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