Files
StellaSora_DataLua/lua/game/ui/energybuy/energybuyctrl.lua
T
SL1900 35c8d87e86 Update - 1.4.0.73
EN: 1.4.0.73
CN: 1.4.0.74
JP: 1.4.0.77
KR: 1.4.0.80
2025-12-25 19:00:00 +09:00

227 lines
8.6 KiB
Lua

local EnergyBuyCtrl = class("EnergyBuyCtrl", BaseCtrl)
local TimerManager = require("GameCore.Timer.TimerManager")
EnergyBuyCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
imgBlurredBg = {},
safeAreaRoot = {
sNodeName = "----SafeAreaRoot----"
},
MainRoot = {
sNodeName = "---Main---",
sCtrlName = "Game.UI.EnergyBuy.EnergyBuyMainCtrl"
},
ConfirmRoot = {
sNodeName = "---Confirm---",
sCtrlName = "Game.UI.EnergyBuy.EnergyBuyConfirmCtrl"
},
ItemUseRoot = {
sNodeName = "---ItemUse---",
sCtrlName = "Game.UI.EnergyBuy.EnergyItemUseCtrl"
},
BatteryUseRoot = {
sNodeName = "---BatteryUse---",
sCtrlName = "Game.UI.EnergyBuy.EnergyBatteryUseCtrl"
},
goEnergy = {},
animEnergy = {sNodeName = "goEnergy", sComponentName = "Animator"},
goResBarAnimRoot = {},
animResBar = {
sNodeName = "goResBarAnimRoot",
sComponentName = "Animator"
},
goRecoverTime = {},
txtRecoverTime = {
sComponentName = "TMP_Text",
sLanguageId = "Energy_Recover_Time"
},
rtRecoverTime = {
sNodeName = "txtRecoverTime",
sComponentName = "RectTransform"
},
txtEnergyRecover = {sComponentName = "TMP_Text"},
btnBg = {
sComponentName = "Button",
callback = "OnBtnClick_Close"
}
}
EnergyBuyCtrl._mapEventConfig = {
[EventId.UpdateEnergy] = "RefreshEnergyRecover",
[EventId.UpdateEnergyBattery] = "RefreshEnergyRecover",
ChangeEnergyBuyPanel = "OnEvent_ChangeEnergyBuyPanel",
CloseEnergyBuyPanel = "OnEvent_CloseEnergyBuyPanel",
ShowEnergyTopRes = "OnEvent_ShowEnergyTopRes",
[EventId.IsNewDay] = "OnEvent_NewDay"
}
function EnergyBuyCtrl:Awake()
self.tbWindowStack = {}
self.nTopBarId = self._mapNode.TopBar.gameObject:GetInstanceID()
if self._panel.nPanelType ~= AllEnum.EnergyPanelType.Main then
self.nDirectPanelType = self._panel.nPanelType
end
end
function EnergyBuyCtrl:OnEnable()
self.animRoot = self.gameObject:GetComponent("Animator")
self._mapNode.safeAreaRoot.gameObject:SetActive(false)
self._mapNode.btnBg.gameObject:SetActive(false)
self._mapNode.imgBlurredBg.gameObject:SetActive(true)
self._mapNode.goResBarAnimRoot.gameObject:SetActive(false)
self._mapNode.goRecoverTime.gameObject:SetActive(false)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self._mapNode.safeAreaRoot.gameObject:SetActive(true)
self._mapNode.btnBg.gameObject:SetActive(true)
table.insert(self.tbWindowStack, self._panel.nPanelType)
self:ChangePanelType()
end
cs_coroutine.start(wait)
self:StartRecoverTimer()
end
function EnergyBuyCtrl:StartRecoverTimer()
local nCurEnergy = PlayerData.Base:GetCurEnergy().nEnergy
local nCurEnergyBattery = PlayerData.Base:GetCurEnergyBattery().nEnergyBattery
local nWorldClassMax = ConfigTable.GetConfigNumber("EnergyMaxLimit")
local nWorldClassBatteryMax = ConfigTable.GetConfigNumber("EnergyBatteryMax")
if nCurEnergy < nWorldClassMax then
self.nNextRestore = PlayerData.Base:GetCurEnergy().nEnergyTime
self._mapNode.goRecoverTime.gameObject:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtRecoverTime, ConfigTable.GetUIText("Energy_Recover_Time"))
self:RefreshRecoverTime()
if nil == self.recoverTimer then
self.recoverTimer = self:AddTimer(0, 1, "RefreshRecoverTime", true, true, false)
end
elseif nCurEnergy >= nWorldClassMax and nCurEnergyBattery < nWorldClassBatteryMax then
self.nNextRestore = PlayerData.Base:GetCurEnergyBattery().nEnergyBatteryTime
self._mapNode.goRecoverTime.gameObject:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtRecoverTime, ConfigTable.GetUIText("EnergyBattery_Recover_Time"))
self:RefreshRecoverTime()
if nil == self.recoverTimer then
self.recoverTimer = self:AddTimer(0, 1, "RefreshRecoverTime", true, true, false)
end
else
if nil ~= self.recoverTimer then
TimerManager.Remove(self.recoverTimer)
self.recoverTimer = nil
end
self._mapNode.goRecoverTime.gameObject:SetActive(false)
end
end
function EnergyBuyCtrl:RefreshRecoverTime()
local curTime = CS.ClientManager.Instance.serverTimeStamp
local remainTime = self.nNextRestore - curTime
local sTimeStr = ""
if 0 < remainTime then
if 60 < remainTime then
local min = math.floor(remainTime / 60)
local sec = math.floor(remainTime - min * 60)
sec = string.format("%02d", sec)
sTimeStr = orderedFormat(ConfigTable.GetUIText("Energy_Recover_Time_Min"), min, sec)
else
local sec = string.format("%02d", math.floor(remainTime))
sTimeStr = orderedFormat(ConfigTable.GetUIText("Energy_Recover_Time_Sec"), sec)
end
end
NovaAPI.SetTMPText(self._mapNode.txtEnergyRecover, sTimeStr)
end
function EnergyBuyCtrl:RefreshEnergyRecover()
self:StartRecoverTimer()
end
function EnergyBuyCtrl:ChangePanelType()
self._mapNode.MainRoot.gameObject:SetActive(self._panel.nPanelType == AllEnum.EnergyPanelType.Main)
self._mapNode.ConfirmRoot.gameObject:SetActive(self._panel.nPanelType == AllEnum.EnergyPanelType.BuyConfirm)
self._mapNode.ItemUseRoot.gameObject:SetActive(self._panel.nPanelType == AllEnum.EnergyPanelType.ItemUse)
self._mapNode.BatteryUseRoot.gameObject:SetActive(self._panel.nPanelType == AllEnum.EnergyPanelType.BatteryUse)
if self.nDirectPanelType ~= nil then
local bShowEnergy = self.nDirectPanelType == AllEnum.EnergyPanelType.ItemUse
self._mapNode.goEnergy.gameObject:SetActive(bShowEnergy)
self._mapNode.goResBarAnimRoot.gameObject:SetActive(not bShowEnergy)
local sAnim = bShowEnergy and "tc_top_bar_02_t_in" or "tc_top_bar_01_t_in"
self._mapNode.animResBar:Play(sAnim)
self.nDirectPanelType = nil
else
local bShowRecover = self._panel.nPanelType == AllEnum.EnergyPanelType.Main or self._panel.nPanelType == AllEnum.EnergyPanelType.ItemUse
local sRecoverAnim = bShowRecover and "EnergyBuy_Time_in" or "EnergyBuy_Time_out"
local sEnergyAnim = bShowRecover and "tc_top_bar_02_t_in" or "tc_top_bar_02_t_out"
local sResBarAnim = not bShowRecover and "tc_top_bar_01_t_in" or "tc_top_bar_01_t_out"
self._mapNode.goResBarAnimRoot.gameObject:SetActive(not bShowRecover)
self._mapNode.goEnergy.gameObject:SetActive(bShowRecover)
self._mapNode.animEnergy:Play(sEnergyAnim)
self.animRoot:Play(sRecoverAnim)
self._mapNode.animResBar:Play(sResBarAnim)
end
if self._panel.nPanelType == AllEnum.EnergyPanelType.Main then
self._mapNode.MainRoot:ShowPanel()
elseif self._panel.nPanelType == AllEnum.EnergyPanelType.BuyConfirm then
self._mapNode.ConfirmRoot:ShowPanel()
elseif self._panel.nPanelType == AllEnum.EnergyPanelType.ItemUse then
self._mapNode.ItemUseRoot:ShowPanel()
elseif self._panel.nPanelType == AllEnum.EnergyPanelType.BatteryUse then
self._mapNode.BatteryUseRoot:ShowPanel()
end
end
function EnergyBuyCtrl:ClosePanel(nPanelType)
self._mapNode.animEnergy:Play("tc_top_bar_02_t_out")
self._mapNode.animResBar:Play("tc_top_bar_01_t_out")
self.animRoot:Play("EnergyBuy_Time_out")
if nPanelType == AllEnum.EnergyPanelType.Main then
self._mapNode.MainRoot:Close()
elseif nPanelType == AllEnum.EnergyPanelType.BuyConfirm then
self._mapNode.ConfirmRoot:Close()
elseif nPanelType == AllEnum.EnergyPanelType.ItemUse then
self._mapNode.ItemUseRoot:Close()
elseif nPanelType == AllEnum.EnergyPanelType.BatteryUse then
self._mapNode.BatteryUseRoot:Close()
end
end
function EnergyBuyCtrl:OnDisable()
end
function EnergyBuyCtrl:OnDestroy()
end
function EnergyBuyCtrl:OnEvent_ChangeEnergyBuyPanel(nPanelType)
self:ClosePanel(self._panel.nPanelType)
self._panel.nPanelType = nPanelType
table.insert(self.tbWindowStack, self._panel.nPanelType)
self:AddTimer(1, 0.3, function()
self:ChangePanelType()
end, true, true, true)
end
function EnergyBuyCtrl:OnEvent_CloseEnergyBuyPanel(bCloseAll)
local nPanelType = table.remove(self.tbWindowStack, #self.tbWindowStack)
if nPanelType ~= self._panel.nPanelType or bCloseAll then
EventManager.Hit(EventId.ClosePanel, PanelId.EnergyBuy)
else
self:ClosePanel(self._panel.nPanelType)
self:AddTimer(1, 0.3, function()
if #self.tbWindowStack > 0 then
self:RefreshEnergyRecover()
self._panel.nPanelType = self.tbWindowStack[#self.tbWindowStack]
self:ChangePanelType()
else
EventManager.Hit(EventId.ClosePanel, PanelId.EnergyBuy)
end
end, true, true, true)
end
end
function EnergyBuyCtrl:OnEvent_ShowEnergyTopRes(bShow)
self._mapNode.goResBarAnimRoot.gameObject:SetActive(bShow)
end
function EnergyBuyCtrl:OnBtnClick_Close()
self:OnEvent_CloseEnergyBuyPanel()
end
function EnergyBuyCtrl:OnEvent_NewDay()
if PanelManager.GetCurPanelId() == PanelId.MainView then
EventManager.Hit("NewDay_Clear_Guide")
local msg = {
nType = AllEnum.MessageBox.Alert,
sContent = ConfigTable.GetUIText("Alert_NextDay"),
callbackConfirm = function()
PanelManager.Home()
end
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
end
return EnergyBuyCtrl