PGRData/Resources/Scripts/XManager/XPrequelManager.lua
2022-12-26 14:06:01 +05:30

483 lines
No EOL
19 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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