483 lines
No EOL
19 KiB
Lua
483 lines
No EOL
19 KiB
Lua
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 |