PGRData/Script/matrix/xui/xuifubenfashionstory/XUiFubenFashionStory.lua
2024-09-01 22:49:41 +02:00

422 lines
No EOL
14 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.

local XUiFubenFashionStory = XLuaUiManager.Register(XLuaUi, "UiFubenFashionStory")
local XUiFashionStoryChapter = require("XUi/XUiFubenFashionStory/XUiFashionStoryChapter")
local XUiGridFashionStoryTrial = require("XUi/XUiFubenFashionStory/XUiGridFashionStoryTrial")
local FIGHT_DETAIL = "UiFashionStoryStageFightDetail"
local STORY_DETAIL = "UiFashionStoryStageStoryDetail"
local TRIAL_DETAIL = "UiFashionStoryStageTrialDetail"
local CurrentSchedule
function XUiFubenFashionStory:OnAwake()
self.BtnSkipList = {}
self.TimerFunctions = {}
self.MoveToLast = true
self:InitComponent()
self:AddListener()
end
function XUiFubenFashionStory:OnStart(activityId,trialStageId,singleLineId)
self.TrialStageId = trialStageId
self.SingleLineId=singleLineId
self:LoadActivity(activityId)
end
function XUiFubenFashionStory:OnEnable()
XEventManager.AddEventListener(XEventId.EVENT_FASHION_STORY_CHAPTER_REFRESH, self.Refresh, self)
XEventManager.AddEventListener(XEventId.EVENT_FASHION_STORY_TRIAL_REFRESH, self.RefreshTrial, self)
XEventManager.AddEventListener(XEventId.EVENT_FASHION_STORY_OPEN_STAGE_DETAIL, self.OpenStageDetail, self)
XEventManager.AddEventListener(XEventId.EVENT_FASHION_STORY_CLOSE_STAGE_DETAIL, self.CloseStageDetail, self)
XEventManager.AddEventListener(XEventId.EVENT_FASHION_STORY_OPEN_TRIAL_DETAIL, self.OpenTrialDetail, self)
self:Refresh(self.MoveToLast)
self:RefreshLeftTime()
end
function XUiFubenFashionStory:OnDisable()
XEventManager.RemoveEventListener(XEventId.EVENT_FASHION_STORY_CHAPTER_REFRESH, self.Refresh, self)
XEventManager.RemoveEventListener(XEventId.EVENT_FASHION_STORY_TRIAL_REFRESH, self.RefreshTrial, self)
XEventManager.RemoveEventListener(XEventId.EVENT_FASHION_STORY_OPEN_STAGE_DETAIL, self.OpenStageDetail, self)
XEventManager.RemoveEventListener(XEventId.EVENT_FASHION_STORY_CLOSE_STAGE_DETAIL, self.CloseStageDetail, self)
XEventManager.RemoveEventListener(XEventId.EVENT_FASHION_STORY_OPEN_TRIAL_DETAIL, self.OpenTrialDetail, self)
self:RemoveTimerFun(self.ActivityId)
-- 首次打开界面、通关关卡时才会自动移动到最后一关
self.MoveToLast = false
end
function XUiFubenFashionStory:OnDestroy()
self.Type = nil
self.Mode = nil
self.ActivityId = nil
self:DestroyTimer()
end
function XUiFubenFashionStory:InitComponent()
self.BtnCloseDetail.gameObject:SetActiveEx(false)
self.GridTrial.gameObject:SetActiveEx(false)
self.AssetPanel = XUiPanelAsset.New(self, self.PanelAsset,
XDataCenter.ItemManager.ItemId.FreeGem, XDataCenter.ItemManager.ItemId.ActionPoint, XDataCenter.ItemManager.ItemId.Coin)
-- 保存章节关的跳转按钮
local index = 1
while true do
local btnSkip = self[string.format("BtnSkip%s", tostring(index))]
if not btnSkip then
break
end
btnSkip = btnSkip.transform:GetComponent("Button")
self.BtnSkipList[index] = btnSkip
index = index + 1
end
self:InitDynamicTable()
self:StartTimer()
end
function XUiFubenFashionStory:InitDynamicTable()
self.DynamicTable = XDynamicTableNormal.New(self.PanelTrialList)
self.DynamicTable:SetProxy(XUiGridFashionStoryTrial, self)
self.DynamicTable:SetDelegate(self)
end
function XUiFubenFashionStory:AddListener()
self.BtnBack.CallBack = function()
self:OnBtnBackClick()
end
self.BtnMainUi.CallBack = function()
self:OnBtnMainUiClick()
end
self.BtnCloseDetail.CallBack = function()
self:CloseStageDetail()
end
end
function XUiFubenFashionStory:OnBtnBackClick()
if XLuaUiManager.IsUiShow(FIGHT_DETAIL) or XLuaUiManager.IsUiShow(STORY_DETAIL) then
self:CloseStageDetail()
else
if self.Type ~= XFashionStoryConfigs.Type.OnlyChapter and self.Mode == XFashionStoryConfigs.Mode.Chapter then
self:OnBtnSwitchClick(XFashionStoryConfigs.Mode.Trial)
else
self:Close()
end
end
end
function XUiFubenFashionStory:OnBtnMainUiClick()
XLuaUiManager.RunMain()
end
function XUiFubenFashionStory:OnBtnSwitchClick(mode)
self:SetMode(mode)
self:Refresh(false)
end
------------------------------------------------------初始化加载----------------------------------------------------------
---
--- 加载 'activityId' 活动,并设置类型与初始模式
function XUiFubenFashionStory:LoadActivity(activityId)
self.ActivityId = activityId
local type = XDataCenter.FashionStoryManager.GetType(activityId)
self:SetType(type)
local initMode
if type == XFashionStoryConfigs.Type.OnlyTrial or type == XFashionStoryConfigs.Type.Both then
initMode = self.Mode or XFashionStoryConfigs.Mode.Trial
elseif type == XFashionStoryConfigs.Type.OnlyChapter then
initMode = self.Mode or XFashionStoryConfigs.Mode.Chapter
else
XLog.Error(string.format("XUiFubenFashionStory.LoadActivity函数错误没有类型%d的处理逻辑", type))
return
end
self:LoadChapter()
self:SetMode(initMode)
end
---
--- 设置活动类型,并设置模式切换按钮的显隐
function XUiFubenFashionStory:SetType(type)
self.Type = type
local isBothMode = type == XFashionStoryConfigs.Type.Both
local isOnlyTrial = type == XFashionStoryConfigs.Type.OnlyTrial
self.PanelTrialLeftTime.gameObject:SetActiveEx(not isOnlyTrial)
end
---
--- 加载章节关
function XUiFubenFashionStory:LoadChapter()
-- 处理跳转按钮
local skipList = XFashionStoryConfigs.GetSkipIdList(self.ActivityId)
if not XTool.IsTableEmpty(skipList) then
for i, skipId in ipairs(skipList) do
-- 是否有对应的跳转按钮
local btn = self.BtnSkipList[i]
if not btn then
XLog.Error(string.format("XUiFubenFashionStory.LoadChapter函数错误FashionStory:%s 预制界面的跳转按钮不足,第%s个跳转:%s 与后面配置的跳转无法生效",
tostring(self.ActivityId), tostring(i), tostring(skipId)))
break
end
-- 添加跳转逻辑
btn.CallBack = function()
XFunctionManager.SkipInterface(skipId)
end
btn.gameObject:SetActiveEx(true)
btn:SetName(XFunctionConfig.GetExplain(skipId))
end
end
-- 隐藏多余的跳转按钮
if #self.BtnSkipList > #skipList then
for i = #skipList + 1, #self.BtnSkipList do
self.BtnSkipList[i].gameObject:SetActiveEx(false)
end
end
-- 预制体
local prefabPath = XFashionStoryConfigs.GetChapterPrefab(self.SingleLineId)
if prefabPath then
local go = self.PanelChapterContent:LoadPrefab(prefabPath)
self.ChapterContent = XUiFashionStoryChapter.New(go, self.ActivityId,self.SingleLineId)
end
end
------------------------------------------------------切换模式------------------------------------------------------------
---
--- 切换到 'mode' 模式,显示对应模式的面板
function XUiFubenFashionStory:SetMode(mode)
if (self.Type == XFashionStoryConfigs.Type.OnlyChapter and mode == XFashionStoryConfigs.Mode.Trial)
or (self.Type == XFashionStoryConfigs.Type.OnlyTrial and mode == XFashionStoryConfigs.Mode.Chapter) then
XLog.Error(string.format("XUiFubenFashionStory.SetMode函数错误Type%d与Mode%s冲突", self.Type, mode))
return
end
self.Mode = mode
self:ShowPanelByMode()
end
---
--- 根据Self.Mode显示对应的面板
function XUiFubenFashionStory:ShowPanelByMode()
local bg
if self.Mode == XFashionStoryConfigs.Mode.Chapter then
self.PanelChapter.gameObject:SetActiveEx(true)
self.PanelTrial.gameObject:SetActiveEx(false)
bg = XFashionStoryConfigs.GetChapterBg(self.ActivityId)
elseif self.Mode == XFashionStoryConfigs.Mode.Trial then
self.PanelChapter.gameObject:SetActiveEx(false)
self.PanelTrial.gameObject:SetActiveEx(true)
bg = XFashionStoryConfigs.GetTrialBg(self.ActivityId)
else
XLog.Error(string.format("XUiFubenFashionStory.ShowPanelByMode函数错误没有模式%d的处理逻辑", self.Mode))
return
end
if bg then
self.RImgFestivalBg:SetRawImage(bg)
end
end
-------------------------------------------------------界面刷新-----------------------------------------------------------
---
--- 根据self.Mode刷新对应面板 'moveToLast' 是否移动到最后一关
function XUiFubenFashionStory:Refresh(moveToLast)
if self.Mode == XFashionStoryConfigs.Mode.Chapter then
-- 通关进度
local passNum, totalNum = XDataCenter.FashionStoryManager.GetChapterProgress(self.ActivityId)
self.TxtCurProgress.text = passNum
self.TxtTotalProgress.text = totalNum
-- 章节预制
if self.ChapterContent then
self.ChapterContent:Refresh(moveToLast)
end
elseif self.Mode == XFashionStoryConfigs.Mode.Trial then
self:RefreshTrial()
else
XLog.Error(string.format("XUiFubenFashionStory.Refresh函数错误没有模式%s的处理逻辑", tostring(self.Mode)))
return
end
end
---
--- 刷新试玩关
function XUiFubenFashionStory:RefreshTrial()
self.DataSource = XDataCenter.FashionStoryManager.GetActiveTrialStage(self.ActivityId)
if XDataCenter.FashionStoryManager.IsStoryInTime(self.ActivityId) then
-- 剧情模式处于开放时间,插入模式入口
table.insert(self.DataSource, 1, XFashionStoryConfigs.StoryEntranceId)
end
for i, v in pairs(self.DataSource) do
if self.TrialStageId == v then
self.SelectIndex = i
break
end
end
self.DynamicTable:SetDataSource(self.DataSource)
self.DynamicTable:ReloadDataSync(self.SelectIndex)
end
---
--- 动态列表事件
function XUiFubenFashionStory:OnDynamicTableEvent(event, index, grid)
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
if self.DataSource[index] == XFashionStoryConfigs.StoryEntranceId then
grid:Refresh(self.DataSource[index], self.ActivityId, function()
self:OnBtnSwitchClick(XFashionStoryConfigs.Mode.Chapter)
self:PlayAnimation("PanelChapterEnable")
end)
else
grid:Refresh(self.DataSource[index])
end
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_TOUCHED then
grid:OnClick()
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_RECYCLE then
grid:OnRecycle()
end
end
---
--- 刷新活动剩余时间
function XUiFubenFashionStory:RefreshLeftTime()
local leftTimeStamp = XDataCenter.FashionStoryManager.GetLeftTimeStamp(self.ActivityId)
local refreshFunc = function()
leftTimeStamp = leftTimeStamp > 0 and leftTimeStamp or 0
local timeStr = XUiHelper.GetTime(leftTimeStamp, XUiHelper.TimeFormatType.ACTIVITY)
if self.TxtTrialLeftTime and self.TxtChapterLeftTime then
self.TxtTrialLeftTime.text = timeStr
self.TxtChapterLeftTime.text = timeStr
end
if leftTimeStamp <= 0 then
XUiManager.TipMsg(CSXTextManagerGetText("FashionStoryActivityEnd"))
self:RemoveTimerFun(self.ActivityId)
self:Close()
end
end
refreshFunc()
-- 活动已结束
if leftTimeStamp <= 0 then
return
end
self:RegisterTimerFun(self.ActivityId, function()
leftTimeStamp = leftTimeStamp - 1
refreshFunc()
end)
end
-------------------------------------------------------计时器------------------------------------------------------------
function XUiFubenFashionStory:StartTimer()
self:DestroyTimer()
CurrentSchedule = XScheduleManager.ScheduleForever(function()
self:UpdateTimer()
end, 1000)
end
function XUiFubenFashionStory:UpdateTimer()
if next(self.TimerFunctions) then
for _, timerFun in pairs(self.TimerFunctions) do
if timerFun then
timerFun()
end
end
end
end
function XUiFubenFashionStory:RegisterTimerFun(id, fun)
self.TimerFunctions[id] = fun
end
function XUiFubenFashionStory:RemoveTimerFun(id)
self.TimerFunctions[id] = nil
end
function XUiFubenFashionStory:DestroyTimer()
if CurrentSchedule then
XScheduleManager.UnSchedule(CurrentSchedule)
CurrentSchedule = nil
self.TimerFunctions = {}
end
end
-------------------------------------------------------关卡相关-----------------------------------------------------------
---
--- 打开章节关卡详情
function XUiFubenFashionStory:OpenStageDetail(stageId)
-- 选择关卡
self.ChapterContent:SelectStage(stageId)
local detailType
local stageType = XFubenConfigs.GetStageType(stageId)
if stageType == XFubenConfigs.STAGETYPE_FIGHT or stageType == XFubenConfigs.STAGETYPE_FIGHTEGG
or stageType == XFubenConfigs.STAGETYPE_COMMON then
detailType = FIGHT_DETAIL
elseif stageType == XFubenConfigs.STAGETYPE_STORY or stageType == XFubenConfigs.STAGETYPE_STORYEGG then
detailType = STORY_DETAIL
else
XLog.Error(string.format("XUiPartnerTeachingChapter.OpenStageDetail函数错误没有对应StageType的处理逻辑关卡%sStageType%s",
stageId, stageType))
return
end
self:OpenOneChildUi(detailType, handler(self, self.Close))
self:FindChildUiObj(detailType):Refresh(stageId, self.ActivityId)
self.BtnCloseDetail.gameObject:SetActiveEx(true)
end
---
--- 关闭章节关卡详情
function XUiFubenFashionStory:CloseStageDetail()
-- 取消关卡选择
self.ChapterContent:CancelSelectStage()
if XLuaUiManager.IsUiShow(FIGHT_DETAIL) then
self:FindChildUiObj(FIGHT_DETAIL):CloseDetailWithAnimation()
end
if XLuaUiManager.IsUiShow(STORY_DETAIL) then
self:FindChildUiObj(STORY_DETAIL):CloseDetailWithAnimation()
end
self.BtnCloseDetail.gameObject:SetActiveEx(false)
end
---
--- 打开试玩关卡详情
function XUiFubenFashionStory:OpenTrialDetail(stageId)
self:OpenOneChildUi(TRIAL_DETAIL, handler(self, self.Close),handler(self,self.CloseTrialDetailCb))
self:FindChildUiObj(TRIAL_DETAIL):Refresh(self.ActivityId, stageId)
self.PanelEffect.gameObject:SetActiveEx(false)
end
function XUiFubenFashionStory:CloseTrialDetailCb()
self.PanelEffect.gameObject:SetActiveEx(true)
end
function XUiFubenFashionStory:OnReleaseInst()
return self.Mode
end
function XUiFubenFashionStory:OnResume(mode)
self.Mode = mode
end