forked from endernon/PGRData
254 lines
No EOL
9.9 KiB
Lua
254 lines
No EOL
9.9 KiB
Lua
local XExFubenFestivalManager = require("XEntity/XFuben/XExFubenFestivalManager")
|
||
XFubenFestivalActivityManagerCreator = function()
|
||
local XFestivalChapter = require("XEntity/XFestival/XFestivalChapter")
|
||
---@class XFubenFestivalActivityManager
|
||
local XFubenFestivalActivityManager = XExFubenFestivalManager.New(XFubenConfigs.ChapterType.Festival)
|
||
---@type XFestivalChapter[]
|
||
local FestivalChapters = {}
|
||
XFubenFestivalActivityManager.StageFuben = 1 --战斗
|
||
XFubenFestivalActivityManager.StageStory = 2 --剧情
|
||
local StageId2ChapterIdDic = {}
|
||
|
||
function XFubenFestivalActivityManager.Init()
|
||
XEventManager.AddEventListener(XEventId.EVENT_PLAYER_LEVEL_CHANGE, XFubenFestivalActivityManager.RefreshChapterStages)
|
||
end
|
||
|
||
-- [初始化数据]
|
||
function XFubenFestivalActivityManager.InitStageInfo()
|
||
XFubenFestivalActivityManager.InitAllEntities()
|
||
end
|
||
|
||
function XFubenFestivalActivityManager.InitAllEntities()
|
||
local festivalTemplates = XFestivalActivityConfig.GetFestivalsTemplates()
|
||
for _, festivalTemplate in pairs(festivalTemplates or {}) do
|
||
if not FestivalChapters[festivalTemplate.Id] then
|
||
FestivalChapters[festivalTemplate.Id] = XFestivalChapter.New(festivalTemplate.Id)
|
||
else
|
||
FestivalChapters[festivalTemplate.Id]:RefreshStages()
|
||
end
|
||
end
|
||
end
|
||
|
||
function XFubenFestivalActivityManager.AddStageId2ChapterId(stageId, chapterId)
|
||
StageId2ChapterIdDic[stageId] = chapterId
|
||
end
|
||
|
||
function XFubenFestivalActivityManager.GetChapterIdByStageId(stageId)
|
||
return StageId2ChapterIdDic[stageId] or 0
|
||
end
|
||
|
||
-- [胜利]
|
||
function XFubenFestivalActivityManager.ShowReward(winData)
|
||
if not winData then return end
|
||
XFubenFestivalActivityManager.RefreshStagePassedBySettleDatas(winData.SettleData)
|
||
XLuaUiManager.Open("UiSettleWin", winData)
|
||
end
|
||
--====================
|
||
--根据通关数据刷新章节关卡
|
||
--====================
|
||
function XFubenFestivalActivityManager.RefreshStagePassedBySettleDatas(settleData)
|
||
if not settleData then return end
|
||
for _, chapter in pairs(FestivalChapters) do
|
||
local stage = chapter:GetStageByStageId(settleData.StageId)
|
||
if stage then
|
||
stage:SetIsPass(true)
|
||
stage:AddPassCount(1)
|
||
chapter:RefreshChapterStageInfos()
|
||
XEventManager.DispatchEvent(XEventId.EVENT_ON_FESTIVAL_CHANGED)
|
||
break
|
||
end
|
||
end
|
||
end
|
||
--====================
|
||
--刷新章节关卡,用于外部条件变更时刷新章节关卡状态
|
||
--====================
|
||
function XFubenFestivalActivityManager.RefreshChapterStages()
|
||
for _, chapter in pairs(FestivalChapters) do
|
||
if chapter:GetIsOpen() then
|
||
chapter:RefreshChapterStageInfos()
|
||
end
|
||
end
|
||
end
|
||
--====================
|
||
--同步通关数据
|
||
--@param response:服务器传来的通关数据
|
||
--====================
|
||
function XFubenFestivalActivityManager.RefreshStagePassed(response)
|
||
for _, info in pairs(response.FestivalInfos or {}) do
|
||
local chapter = FestivalChapters[info.Id]
|
||
if chapter then
|
||
for _, stageInfos in pairs(info.StageInfos or {}) do
|
||
local stage = chapter:GetStageByStageId(stageInfos.Id)
|
||
if stage then
|
||
stage:SetIsPass(true)
|
||
stage:SetPassCount(stageInfos.ChallengeCount)
|
||
end
|
||
end
|
||
chapter:RefreshChapterStageInfos()
|
||
end
|
||
end
|
||
end
|
||
--====================
|
||
--根据节日ID获取节日活动的通关数据
|
||
--@return1 通关总数
|
||
--@return2 关卡总数
|
||
--====================
|
||
function XFubenFestivalActivityManager.GetFestivalProgress(festivalId)
|
||
local chapter = FestivalChapters[festivalId]
|
||
if not chapter then return 0, 0 end
|
||
return chapter:GetStagePassCount(), chapter:GetStageTotalCount()
|
||
end
|
||
--====================
|
||
--根据节日ID获取节日活动是否在开放时间内
|
||
--@param festivalId:节日配置Id
|
||
--====================
|
||
function XFubenFestivalActivityManager.GetAvailableFestivals()
|
||
local activityList = {}
|
||
for _, chapter in pairs(FestivalChapters) do
|
||
if chapter:GetIsOpen() then
|
||
table.insert(activityList, {
|
||
Id = chapter:GetChapterId(),
|
||
Type = chapter:GetChapterType(),
|
||
Name = chapter:GetName(),
|
||
Icon = chapter:GetBannerBg(),
|
||
})
|
||
end
|
||
end
|
||
return activityList
|
||
end
|
||
|
||
function XFubenFestivalActivityManager.GetFestivalsByUiType(uiType)
|
||
local result = {}
|
||
for _, chapter in pairs(FestivalChapters) do
|
||
if chapter:GetUiType() == uiType then
|
||
table.insert(result, chapter)
|
||
end
|
||
end
|
||
return result
|
||
end
|
||
|
||
--====================
|
||
--根据节日ID获取节日活动是否在开放时间内
|
||
--@param festivalId:节日配置Id
|
||
--====================
|
||
function XFubenFestivalActivityManager.IsFestivalInActivity(festivalId)
|
||
local chapter = FestivalChapters[festivalId]
|
||
if chapter then
|
||
return chapter:GetIsInTime()
|
||
end
|
||
return false
|
||
end
|
||
--====================
|
||
--根据节日ID和关卡ID获取节日关卡对象
|
||
--@param festivalId:节日配置Id
|
||
--@param stageId:关卡表Id
|
||
--====================
|
||
---@return XFestivalStage
|
||
function XFubenFestivalActivityManager.GetFestivalStageByFestivalIdAndStageId(festivalId, stageId)
|
||
local chapter = FestivalChapters[festivalId]
|
||
if not chapter then return end
|
||
return chapter:GetStageByStageId(stageId)
|
||
end
|
||
--====================
|
||
--根据节日ID和关卡ID获取节日章节对象
|
||
--@param festivalId:节日配置Id
|
||
--====================
|
||
function XFubenFestivalActivityManager.GetFestivalChapterById(festivalId)
|
||
return FestivalChapters[festivalId]
|
||
end
|
||
--====================
|
||
--根据关卡ID获取关卡是否开放
|
||
--@param stageId:关卡ID
|
||
--====================
|
||
function XFubenFestivalActivityManager.CheckPassedByStageId(stageId)
|
||
for _, chapter in pairs(FestivalChapters) do
|
||
local stage = chapter:GetStageByStageId(stageId)
|
||
if stage then
|
||
return stage:GetIsPass()
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
--====================
|
||
--获取所有在开放时间内的节日活动Id
|
||
--====================
|
||
function XFubenFestivalActivityManager.GetAllAvailableFestivalsId()
|
||
local activityList = {}
|
||
for _, chapter in pairs(FestivalChapters) do
|
||
if chapter:GetIsOpen() then
|
||
table.insert(activityList, chapter:GetChapterId())
|
||
end
|
||
end
|
||
return activityList
|
||
end
|
||
-- 红点的显示
|
||
-- 每天凌晨5点(通用重置时间)检测是否存在未通关关卡,存在则刷新红点显示
|
||
-- 点击进活动界面,红点消失,当天未重置前不再显示
|
||
function XFubenFestivalActivityManager.CheckFestivalRedPoint(sectionId)
|
||
local finishCount, totalCount = XFubenFestivalActivityManager.GetFestivalProgress(sectionId)
|
||
if finishCount < totalCount and not XFubenFestivalActivityManager.CheckFestivalActivityIsOpen(sectionId) then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
-- 判断是否是红点判断的节日
|
||
function XFubenFestivalActivityManager.CheckFesticalAcitvityTimeIsOpen(sectionId)
|
||
if XTool.IsTableEmpty(FestivalChapters[sectionId]) then
|
||
return false
|
||
end
|
||
local timeId = FestivalChapters[sectionId]:GetActivityTimeId()
|
||
if not XTool.IsNumberValid(timeId) then
|
||
return false
|
||
else
|
||
local startTime, endTime = XFunctionManager.GetTimeByTimeId(timeId)
|
||
local nowTime = XTime.GetServerNowTimestamp()
|
||
return (nowTime >= startTime) and (nowTime < endTime)
|
||
end
|
||
end
|
||
-- 本地保存key
|
||
function XFubenFestivalActivityManager.GetFestivalActivityKey(sectionId)
|
||
return string.format("%s_%s_%s", "FubenFestivalActivityRedPoint", XPlayer.Id, sectionId)
|
||
end
|
||
|
||
function XFubenFestivalActivityManager.CheckFestivalActivityIsOpen(sectionId)
|
||
local key = XFubenFestivalActivityManager.GetFestivalActivityKey(sectionId)
|
||
local updateTime = XSaveTool.GetData(key)
|
||
if not updateTime then
|
||
return false
|
||
end
|
||
return XTime.GetServerNowTimestamp() < updateTime
|
||
end
|
||
|
||
function XFubenFestivalActivityManager.SaveFestivalActivityIsOpen(sectionId)
|
||
if XFubenFestivalActivityManager.CheckFestivalActivityIsOpen(sectionId) then
|
||
return
|
||
end
|
||
local key = XFubenFestivalActivityManager.GetFestivalActivityKey(sectionId)
|
||
local updateTime = XTime.GetSeverTomorrowFreshTime()
|
||
XSaveTool.SaveData(key, updateTime)
|
||
end
|
||
|
||
-- [播放剧情]
|
||
function XFubenFestivalActivityManager.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 XFubenFestivalActivityManager.OnAsyncFestivalStages(response)
|
||
if not response then return end
|
||
XFubenFestivalActivityManager.RefreshStagePassed(response)
|
||
end
|
||
|
||
XFubenFestivalActivityManager.Init()
|
||
return XFubenFestivalActivityManager
|
||
end
|
||
|
||
XRpc.NotifyFestivalData = function(response)
|
||
XDataCenter.FubenFestivalActivityManager.OnAsyncFestivalStages(response)
|
||
end |