Files
Endfield-Data/LuaScripts/UI/Panels/BattlePass/BattlePassCtrl.lua
2026-01-31 21:42:01 +07:00

568 lines
14 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.BattlePass
BattlePassCtrl = HL.Class('BattlePassCtrl', uiCtrl.UICtrl)
BattlePassCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_BATTLE_PASS_TASK_BASIC_INFO_UPDATE] = '_OnBasicInfoUpdate',
[MessageConst.ON_BATTLE_PASS_LEVEL_UPDATE] = '_OnLevelUpdate',
[MessageConst.ON_BATTLE_PASS_TRACK_UPDATE] = '_OnTrackUpdate',
[MessageConst.ON_CHANGE_BATTLE_PASS_TAB] = '_OnChangeTab',
}
BattlePassCtrl.m_arg = HL.Field(HL.Table)
BattlePassCtrl.m_tabInfos = HL.Field(HL.Table)
BattlePassCtrl.m_curTabIndex = HL.Field(HL.Number) << -1
BattlePassCtrl.m_genTabCells = HL.Field(HL.Forward("UIListCache"))
BattlePassCtrl.m_seasonId = HL.Field(HL.String) << ''
BattlePassCtrl.m_curLevel = HL.Field(HL.Number) << 0
BattlePassCtrl.m_curShowLevel = HL.Field(HL.Number) << 0
BattlePassCtrl.m_maxLevel = HL.Field(HL.Number) << 0
BattlePassCtrl.m_curExp = HL.Field(HL.Number) << 0
BattlePassCtrl.m_curShowExp = HL.Field(HL.Number) << 0
BattlePassCtrl.m_openTime = HL.Field(HL.Number) << 0
BattlePassCtrl.m_endTime = HL.Field(HL.Number) << 0
BattlePassCtrl.m_buyLevelTime = HL.Field(HL.Number) << 0
BattlePassCtrl.m_expBoost = HL.Field(HL.Number) << 0
BattlePassCtrl.m_canBuyTime = HL.Field(HL.Number) << 0
BattlePassCtrl.m_expTween = HL.Field(HL.Userdata)
BattlePassCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.m_arg = arg
self:_InitViews()
self:_InitTabIndex(arg)
self:_InitTabs()
self:_LoadData(true)
self:_RenderViews()
self:_RenderTimeRelatedPart()
end
BattlePassCtrl.OnShow = HL.Override() << function(self)
if CashShopUtils.NoCashShopGoods() and CashShopUtils.IsPS() then
logger.info("[CashShop] 显示ps empty store")
GameInstance.player.cashShopSystem:ShowPsEmptyStore()
end
end
BattlePassCtrl.OnClose = HL.Override() << function(self)
self:_ClearExpTween()
end
BattlePassCtrl._InitViews = HL.Method() << function(self)
self:_InitTabInfos()
self:BindInputPlayerAction("common_open_battle_pass", function()
self.m_phase:CloseSelf()
end)
self.view.btnClose.onClick:RemoveAllListeners()
self.view.btnClose.onClick:AddListener(function()
self.m_phase:CloseSelf()
end)
self.view.helpBtn.onClick:RemoveAllListeners()
self.view.helpBtn.onClick:AddListener(function()
UIManager:Open(PanelId.InstructionBook, "battle_pass")
end)
self.view.btnCommon.onClick:RemoveAllListeners()
self.view.btnCommon.onClick:AddListener(function()
Notify(MessageConst.HIDE_COMMON_HOVER_TIP)
PhaseManager:GoToPhase(PhaseId.BattlePassBuyLevel, {
onBuyClose = function(isBuy)
if isBuy then
local tabCell = self.m_genTabCells:GetItem(1)
if tabCell ~= nil then
tabCell.toggle.isOn = true
end
self:_OnLevelUpdateImpl()
end
end
})
end)
self.m_genTabCells = UIUtils.genCellCache(self.view.tabPlanNode)
end
BattlePassCtrl._InitTabInfos = HL.Method() << function(self)
self.m_tabInfos = {}
table.insert(self.m_tabInfos, {
iconId = "icon_bp_plan",
tabName = "ui_battlepass_tab_plan",
panelId = PanelId.BattlePassPlan,
redDot = "BattlePassPlan",
})
table.insert(self.m_tabInfos, {
iconId = "icon_bp_task",
tabName = "ui_battlepass_tab_task",
panelId = PanelId.BattlePassTask,
redDot = "BattlePassTask",
})
end
BattlePassCtrl._InitTabIndex = HL.Method(HL.Any) << function(self, arg)
if arg ~= nil and arg.panelId ~= nil then
local panelId = PanelId[arg.panelId]
local panelIndex = self:_FindTabIndexByPanelId(panelId)
if panelIndex > 0 then
self.m_curTabIndex = panelIndex
end
else
self.m_curTabIndex = 1
end
end
BattlePassCtrl._FindTabIndexByPanelId = HL.Method(HL.Number).Return(HL.Number) << function(self, panelId)
for index, info in ipairs(self.m_tabInfos) do
if info.panelId == panelId then
return index
end
end
return -1
end
BattlePassCtrl._InitTabs = HL.Method() << function(self)
self.m_genTabCells:Refresh(#self.m_tabInfos, function(cell, luaIndex)
local info = self.m_tabInfos[luaIndex]
local iconPath = UIConst.UI_SPRITE_BATTLE_PASS
cell.selectedIcon:LoadSprite(iconPath, info.iconId)
cell.defaultIcon:LoadSprite(iconPath, info.iconId)
cell.selectedNameTxt.text = I18nUtils.GetText(info.tabName)
cell.defaultNameTxt.text = I18nUtils.GetText(info.tabName)
if not string.isEmpty(info.redDot) then
if info.redDotArg then
cell.redDot:InitRedDot(info.redDot, info.redDotArg)
else
cell.redDot:InitRedDot(info.redDot)
end
end
cell.toggle.isOn = luaIndex == self.m_curTabIndex
cell.toggle.onValueChanged:RemoveAllListeners()
cell.toggle.onValueChanged:AddListener(function(isOn)
if isOn then
self:_ChangeTab(luaIndex)
end
end)
end)
end
BattlePassCtrl._LoadData = HL.Method(HL.Opt(HL.Boolean)) << function(self, isInit)
local bpSystem = GameInstance.player.battlePassSystem
self.m_seasonId = bpSystem.seasonData.seasonId
self.m_openTime = bpSystem.seasonData.openTime
self.m_endTime = bpSystem.seasonData.closeTime
self.m_canBuyTime = bpSystem.seasonData.canBuyLevelTime
self.m_curLevel = bpSystem.levelData.currLevel
self.m_curExp = bpSystem.levelData.currExp
if isInit then
self.m_curShowLevel = self.m_curLevel
self.m_curShowExp = self.m_curExp
end
self.m_expBoost = BattlePassUtils.GetBattlePassExpBoost()
if string.isEmpty(self.m_seasonId) then
return
end
local hasSeason, seasonData = Tables.battlePassSeasonTable:TryGetValue(self.m_seasonId)
if not hasSeason then
return
end
self.m_maxLevel = seasonData.maxLevel
end
BattlePassCtrl._RenderViews = HL.Method() << function(self)
if not string.isEmpty(self.m_seasonId) then
local hasSeason, seasonData = Tables.battlePassSeasonTable:TryGetValue(self.m_seasonId)
if hasSeason then
self.view.titleText.text = seasonData.shortName
end
end
self:_ClearExpTween()
if self.m_curLevel <= self.m_curShowLevel and self.m_curExp <= self.m_curShowExp then
self.m_curShowLevel = self.m_curLevel
self.m_curShowExp = self.m_curExp
self:_RenderExp(self.m_curLevel, self.m_curExp)
else
self:_PlayExpTween()
end
self.view.percentageNode.gameObject:SetActive(self.m_expBoost > 0)
self.view.percentageTxt.text = string.format("+%d%%", self.m_expBoost / 10)
end
BattlePassCtrl._RenderMaxLevel = HL.Method() << function(self)
self.view.maxLevelNode:ClearTween()
if self.m_curLevel == self.m_maxLevel then
self.view.maxLevelNode:PlayWithTween(self.view.config.LEVEL_MAX_ANIMATION_NAME)
else
self.view.maxLevelNode:PlayWithTween(self.view.config.LEVEL_MAX_OVER_ANIMATION_NAME)
end
end
BattlePassCtrl._QueryToNextExp = HL.Method(HL.Number, HL.Number).Return(HL.Number) << function(self, level, maxLevel)
local hasSeason, seasonData = Tables.battlePassSeasonTable:TryGetValue(self.m_seasonId)
if not hasSeason then
return 0
end
local hasLevel, levelGroupData = Tables.battlePassLevelTable:TryGetValue(seasonData.levelGroupId)
if hasLevel then
local nextLevel = math.min(level, maxLevel) + 1
local hasNext, levelData = levelGroupData.levelInfos:TryGetValue(nextLevel)
if hasNext then
return levelData.levelExp
end
end
end
BattlePassCtrl._RenderExp = HL.Method(HL.Number, HL.Number) << function(self, level, exp)
local showLevel = math.min(level, self.m_maxLevel)
local progress = 0
local toNextExp = self:_QueryToNextExp(level, self.m_maxLevel)
local showExp = (toNextExp > 0 and showLevel >= self.m_maxLevel) and (exp % toNextExp) or exp
if toNextExp > 0 then
progress = showExp / toNextExp
end
showExp = math.floor(showExp + 0.5)
toNextExp = math.floor(toNextExp + 0.5)
self.view.fill.gameObject:SetActive(showExp > 0)
self.view.levelNumTxt.text = showLevel
self.view.progressBar.value = progress
self.view.progressTxt.text = string.format(Language.LUA_BATTLEPASS_PLAN_EXP_PROGRESS_FORMAT, showExp, toNextExp)
end
BattlePassCtrl._PlayExpTween = HL.Method() << function(self)
local startPos = self.m_curShowExp
local endPos = 0
local toNextExpMap = {}
for i = self.m_curShowLevel, self.m_curLevel do
if i < self.m_curLevel then
local toNextExp = self:_QueryToNextExp(i, self.m_maxLevel)
toNextExpMap[i] = toNextExp
if i < self.m_maxLevel then
endPos = endPos + toNextExp
end
else
endPos = endPos + self.m_curExp
end
end
local duration = self.view.config.EXP_ANIMATION_DURATION
self.m_expTween = DOTween.To(function()
return startPos
end, function(pos)
local toNextExp = -1
if toNextExpMap[self.m_curShowLevel] ~= nil then
toNextExp = toNextExpMap[self.m_curShowLevel]
end
local curExp = pos
for level, toNextExp in pairs(toNextExpMap) do
if level < self.m_curShowLevel and level < self.m_maxLevel then
curExp = curExp - toNextExp
end
end
if toNextExp < 0 then
self.m_curShowExp = curExp
else
if curExp >= toNextExp then
self.m_curShowLevel = self.m_curShowLevel + 1
self.m_curShowExp = curExp - toNextExp
if self.m_curShowLevel <= self.m_maxLevel then
self:_OnExpTweenLevelUp()
end
else
self.m_curShowExp = curExp
end
end
self:_RenderExp(self.m_curShowLevel, self.m_curShowExp)
end, endPos, duration):OnComplete(
function()
self:_OnExpTweenEnd()
end
):SetEase(CS.DG.Tweening.Ease.OutCubic)
self:_OnExpTweenStart()
end
BattlePassCtrl._ClearExpTween = HL.Method() << function(self)
if self.m_expTween ~= nil then
self.m_expTween:Kill(false)
self.m_expTween = nil
self:_OnExpTweenEnd()
end
end
BattlePassCtrl._OnExpTweenStart = HL.Method() << function(self)
if PhaseManager:GetTopPhaseId() == PhaseId.BattlePass then
AudioAdapter.PostEvent("Au_UI_Event_BPLevelUp")
end
end
BattlePassCtrl._OnExpTweenEnd = HL.Method() << function(self)
AudioAdapter.PostEvent("Au_UI_Event_BPLevelUp_Stop")
end
BattlePassCtrl._OnExpTweenLevelUp = HL.Method() << function(self)
if not string.isEmpty(self.view.config.LEVEL_UP_ANIMATION_NAME) then
self.view.topNode:ClearTween()
self.view.topNode:PlayWithTween(self.view.config.LEVEL_UP_ANIMATION_NAME)
end
AudioAdapter.PostEvent("Au_UI_Event_BPLevelUpgrade")
end
BattlePassCtrl._RenderTimeRelatedPart = HL.Method() << function(self)
local curServerTime = DateTimeUtils.GetCurrentTimestampBySeconds()
local leftSec = self.m_endTime - curServerTime
leftSec = math.max(leftSec, 0)
self.view.endTimeTxt.text = string.format(Language.LUA_BATTLEPASS_PLAN_END_TIME_HINT, UIUtils.getLeftTime(leftSec))
self.view.buyNode:SetState(self.m_curLevel >= self.m_maxLevel and "Max" or (curServerTime >= self.m_canBuyTime and "CanBuy" or "CantBuy"))
end
BattlePassCtrl._OnPhaseItemBind = HL.Override() << function(self)
self:_ChangeTab(self.m_curTabIndex, true)
end
BattlePassCtrl._OnChangeTab = HL.Method(HL.Any) << function(self, arg)
if arg == nil or arg.panelId == nil then
return
end
local panelId = PanelId[arg.panelId]
local index = self:_FindTabIndexByPanelId(panelId)
local toggleCell = self.m_genTabCells:Get(index)
if toggleCell ~= nil then
toggleCell.toggle.isOn = true
end
end
BattlePassCtrl._ChangeTab = HL.Method(HL.Number, HL.Opt(HL.Boolean)) << function(self, luaIndex, isInit)
if self.m_curTabIndex == luaIndex and not isInit then
return
end
local isRight = self.m_curTabIndex <= luaIndex
self.m_curTabIndex = luaIndex
local tabInfo = self.m_tabInfos[luaIndex]
local arg = {
baseNaviGroupId = self.view.inputGroup.groupId,
}
if isInit and self.m_arg ~= nil and self.m_arg.panelArgs ~= nil then
arg.panelArgs = self.m_arg.panelArgs
arg.popupPlanBuy = self.m_arg.popupPlanBuy
end
self.m_phase:ChangePanel(tabInfo.panelId, isRight, arg)
if luaIndex == 1 then
self.m_phase:ShowPsStore()
else
self.m_phase:HidePsStore()
end
end
BattlePassCtrl._OnLevelUpdate = HL.Method() << function(self)
if UIManager:IsOpen(PanelId.BattlePassBuyLevel) then
return
end
self:_OnLevelUpdateImpl()
end
BattlePassCtrl._OnLevelUpdateImpl = HL.Method() << function(self)
local fromLevel = self.m_curLevel
local fromExp = self.m_curExp
local fromRecruitTime = 0
local toNextExp = self:_QueryToNextExp(self.m_maxLevel, self.m_maxLevel)
if toNextExp > 0 and fromLevel >= self.m_maxLevel then
fromRecruitTime = fromExp // toNextExp
end
self:_LoadData()
self:_RenderViews()
self:_RenderTimeRelatedPart()
local currRecruitTime = 0
if toNextExp > 0 and self.m_curLevel >= self.m_maxLevel then
currRecruitTime = self.m_curExp // toNextExp
end
if self.m_curLevel >= self.m_maxLevel and (fromLevel < self.m_curLevel or fromRecruitTime < currRecruitTime) then
self:_RenderMaxLevel()
if fromRecruitTime < currRecruitTime then
self.view.maxTextNew.text = string.format(Language.LUA_BATTLE_PASS_PLAN_MAX_LEVEL_RECRUIT_TIME_FORMAT, currRecruitTime - fromRecruitTime)
end
AudioAdapter.PostEvent("Au_UI_Event_BPLevelUpgrade")
end
end
BattlePassCtrl._OnTrackUpdate = HL.Method() << function(self)
self.m_expBoost = BattlePassUtils.GetBattlePassExpBoost()
self.view.percentageNode.gameObject:SetActive(self.m_expBoost > 0)
self.view.percentageTxt.text = string.format("+%d%%", self.m_expBoost / 10)
end
BattlePassCtrl._OnBasicInfoUpdate = HL.Method() << function(self)
self:_RenderTimeRelatedPart()
end
HL.Commit(BattlePassCtrl)