Files
StellaSora_DataLua/lua/game/ui/disc/discctrl.lua
T
SL1900 5e0d58cfad Initial version - 1.2.0.60
EN: 1.2.0.60
CN: 1.2.0.61
JP: 1.2.0.63
KR: 1.2.0.67
2025-12-03 01:00:00 +09:00

411 lines
13 KiB
Lua

local DiscCtrl = class("DiscCtrl", BaseCtrl)
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
local MoveBarPos = {
-484.2,
-159.5,
161.6,
484.2
}
local TogAni = {
[AllEnum.DiscTab.Info] = {
[AllEnum.DiscTab.Development] = "DiscPanel_Development",
[AllEnum.DiscTab.BreakLimit] = "DiscPanel_Development",
[AllEnum.DiscTab.Music] = "DiscPanel_Music"
},
[AllEnum.DiscTab.Development] = {
[AllEnum.DiscTab.Info] = "DiscPanel_in3",
[AllEnum.DiscTab.BreakLimit] = "DiscPanel_Development1",
[AllEnum.DiscTab.Music] = "DiscPanel_Music1"
},
[AllEnum.DiscTab.BreakLimit] = {
[AllEnum.DiscTab.Info] = "DiscPanel_in3",
[AllEnum.DiscTab.Development] = "DiscPanel_Development1",
[AllEnum.DiscTab.Music] = "DiscPanel_Music1"
},
[AllEnum.DiscTab.Music] = {
[AllEnum.DiscTab.Info] = "DiscPanel_in1",
[AllEnum.DiscTab.Development] = "DiscPanel_in2",
[AllEnum.DiscTab.BreakLimit] = "DiscPanel_in2"
}
}
DiscCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
UIDrag = {
sComponentName = "UIDrag",
callback = "OnDrag_Disc"
},
imgDiscFrame = {sComponentName = "Image"},
imgDiscIcon = {sComponentName = "Image"},
Middle = {
sNodeName = "---Middle---"
},
liveDiscCtrl = {
sNodeName = "goLiveDisc",
sCtrlName = "Game.UI.Disc.LiveDiscCtrl"
},
FullImage = {
sNodeName = "----Full----"
},
imgFull = {nCount = 2, sComponentName = "Image"},
rtImgFull2 = {
sNodeName = "imgFull2",
sComponentName = "RectTransform"
},
imgFullBg = {},
btnCloseFull = {
sComponentName = "UIButton",
callback = "OnBtnClick_CloseFull"
},
btnOpenFull2 = {
sNodeName = "imgDiscFrame",
sComponentName = "Button",
callback = "OnBtnClick_OpenFull"
},
Development = {
sNodeName = "---Development---"
},
Info = {
sNodeName = "---Info---",
sCtrlName = "Game.UI.Disc.DiscInfoCtrl"
},
Upgrade = {
sCtrlName = "Game.UI.Disc.DiscUpgradeCtrl"
},
Advance = {
sCtrlName = "Game.UI.Disc.DiscAdvanceCtrl"
},
BreakLimit = {
sNodeName = "---BreakLimit---",
sCtrlName = "Game.UI.Disc.DiscBreakLimitCtrl"
},
Music = {
sNodeName = "---Music---",
sCtrlName = "Game.UI.Disc.DiscMusicCtrl"
},
MusicRight = {
sNodeName = "--MusicRight--"
},
cgMiddle = {
sNodeName = "---Middle---",
sComponentName = "CanvasGroup"
},
cgMusic = {
sNodeName = "---Music---",
sComponentName = "CanvasGroup"
},
Story = {
sNodeName = "----Story----",
sCtrlName = "Game.UI.Disc.DiscStoryCtrl"
},
btnTab = {
nCount = 4,
sComponentName = "UIButton",
callback = "OnBtnClick_Tab"
},
imgTabOn = {nCount = 4},
txtTabOn = {nCount = 4, sComponentName = "TMP_Text"},
txtTabOff = {nCount = 4, sComponentName = "TMP_Text"},
layoutOff = {nCount = 4},
reddot = {nCount = 4},
imgMoveBar = {sComponentName = "Transform"},
MatList = {
sCtrlName = "Game.UI.Disc.DiscMatListCtrl"
},
btnMask = {
sComponentName = "UIButton",
callback = "OnBtnClick_Mask"
},
aniMatList = {sNodeName = "MatList", sComponentName = "Animator"},
anibtnMask = {sNodeName = "btnMask", sComponentName = "Animator"},
aniRoot = {
sNodeName = "----SafeAreaRoot----",
sComponentName = "Animator"
},
reddotB = {},
reddotBreak = {},
reddotBRead = {},
reddotBAvg = {},
btnTabSwitchLeft = {
sComponentName = "NaviButton",
callback = "OnBtnClick_TabSwitchLeft"
},
btnTabSwitchRight = {
sComponentName = "NaviButton",
callback = "OnBtnClick_TabSwitchRight"
}
}
DiscCtrl._mapEventConfig = {
DiscRefresh = "OnEvent_GrowthRefresh",
DiscOpenMatList = "OnEvent_OpenMatList",
ClickLiveDisc = "OnEvent_OpenFull",
Guide_DiscSkill = "OnEvent_Guide_DiscSkill"
}
function DiscCtrl:Refresh()
self:ClosePopup()
self:RefreshMiddle()
self:SwitchTog()
self:RefreshIndex()
end
function DiscCtrl:ClosePopup()
self._mapNode.MatList:Open(false)
self._mapNode.btnMask.gameObject:SetActive(false)
end
function DiscCtrl:RefreshMiddle()
local mapCfg = ConfigTable.GetData("Disc", self._panel.nId)
local mapData = PlayerData.Disc:GetDiscById(self._panel.nId)
if not mapCfg then
return
end
self._mapNode.imgDiscIcon.gameObject:SetActive(false)
self._mapNode.liveDiscCtrl:SetDiscActive(true, mapCfg.DiscBg ~= "")
self._mapNode.liveDiscCtrl:SetRawImage(mapCfg.DiscBg, mapData.nRarity)
if mapCfg.DiscBg ~= "" then
local bSSR = mapData.nRarity == GameEnum.itemRarity.SSR
self._mapNode.imgFull[1].gameObject:SetActive(bSSR)
self._mapNode.imgFull[2].gameObject:SetActive(not bSSR)
if bSSR then
self:SetPngSprite(self._mapNode.imgFull[1], mapCfg.DiscBg .. AllEnum.DiscBgSurfix.Image)
else
self:SetPngSprite(self._mapNode.imgFull[2], mapCfg.DiscBg .. AllEnum.DiscBgSurfix.Image)
local nH = Settings.CURRENT_CANVAS_FULL_RECT_HEIGHT
self._mapNode.rtImgFull2.sizeDelta = Vector2(nH, nH)
end
end
end
function DiscCtrl:SwitchTog()
self._mapNode.TopBar:SetCoinVisible(self._panel.nCurTog == AllEnum.DiscTab.Development)
local mapData = PlayerData.Disc:GetDiscById(self._panel.nId)
local bMaxLv = mapData.nLevel == mapData.nMaxLv
local bAdvance = mapData.nPhase < mapData.nMaxPhase and bMaxLv
NovaAPI.SetCanvasGroupBlocksRaycasts(self._mapNode.cgMusic, self._panel.nCurTog == AllEnum.DiscTab.Music)
NovaAPI.SetCanvasGroupBlocksRaycasts(self._mapNode.cgMiddle, self._panel.nCurTog ~= AllEnum.DiscTab.Music)
self._mapNode.Info.gameObject:SetActive(self._panel.nCurTog == AllEnum.DiscTab.Info)
self._mapNode.Development:SetActive(self._panel.nCurTog == AllEnum.DiscTab.Development)
self._mapNode.BreakLimit.gameObject:SetActive(self._panel.nCurTog == AllEnum.DiscTab.BreakLimit)
self._mapNode.MusicRight:SetActive(self._panel.nCurTog == AllEnum.DiscTab.Music)
if self._panel.nCurTog == AllEnum.DiscTab.Info then
self._mapNode.Info:RefreshContent()
elseif self._panel.nCurTog == AllEnum.DiscTab.Development then
self._mapNode.Upgrade.gameObject:SetActive(not bAdvance)
self._mapNode.Advance.gameObject:SetActive(bAdvance)
if bAdvance then
self._mapNode.Advance:Refresh()
else
self._mapNode.Upgrade:Refresh()
end
elseif self._panel.nCurTog == AllEnum.DiscTab.BreakLimit then
self._mapNode.BreakLimit:Refresh()
elseif self._panel.nCurTog == AllEnum.DiscTab.Music then
self._mapNode.Music:Refresh()
end
end
function DiscCtrl:PlayBGM()
local mapCfg = ConfigTable.GetData("DiscIP", self._panel.nId)
if mapCfg == nil then
return
end
local sState = mapCfg.VoFile
WwiseAudioMgr:SetState_Custom("outfit", sState)
self._mapNode.Music:InitMusic()
end
function DiscCtrl:QuitBGM()
if self._panel.bPause and not self._panel.bAvg then
WwiseAudioMgr:PostEvent("music_outfit_resume")
end
end
function DiscCtrl:ClosePanel()
EventManager.Hit(EventId.CloesCurPanel)
end
function DiscCtrl:InitTab()
if self._panel.nCurTog == nil then
self._panel.nCurTog = AllEnum.DiscTab.Info
end
self._mapNode.imgMoveBar.localPosition = Vector3(MoveBarPos[self._panel.nCurTog], 4.5, 0)
for i = 1, 4 do
NovaAPI.SetTMPText(self._mapNode.txtTabOn[i], ConfigTable.GetUIText("Disc_Tab" .. i))
NovaAPI.SetTMPText(self._mapNode.txtTabOff[i], ConfigTable.GetUIText("Disc_Tab" .. i))
self._mapNode.imgTabOn[i]:SetActive(self._panel.nCurTog == i)
self._mapNode.txtTabOn[i].gameObject:SetActive(self._panel.nCurTog == i)
self._mapNode.layoutOff[i].gameObject:SetActive(self._panel.nCurTog ~= i)
end
end
function DiscCtrl:RefreshIndex()
for index, discId in ipairs(self._panel.tbId) do
if self._panel.nId == discId then
self.curDiscIndex = index
break
end
end
end
function DiscCtrl:RegisterRedDot()
RedDotManager.RegisterNode(RedDotDefine.Disc_BreakLimit, self._panel.nId, self._mapNode.reddot[3])
RedDotManager.RegisterNode(RedDotDefine.Disc_Music, self._panel.nId, self._mapNode.reddot[4])
RedDotManager.RegisterNode(RedDotDefine.Disc_SideB, self._panel.nId, self._mapNode.reddotB)
RedDotManager.RegisterNode(RedDotDefine.Disc_BreakBtn, self._panel.nId, self._mapNode.reddotBreak)
RedDotManager.RegisterNode(RedDotDefine.Disc_SideB_Read, self._panel.nId, self._mapNode.reddotBRead)
RedDotManager.RegisterNode(RedDotDefine.Disc_SideB_Avg, self._panel.nId, self._mapNode.reddotBAvg)
end
function DiscCtrl:FadeIn()
if self._panel._nFadeInType == 1 then
self._mapNode.aniRoot:Play("DiscPanel_in")
elseif self._panel.nCurTog == AllEnum.DiscTab.Development or self._panel.nCurTog == AllEnum.DiscTab.BreakLimit then
self._mapNode.aniRoot:Play("DiscPanel_Development", 0, 1)
elseif self._panel.nCurTog == AllEnum.DiscTab.Music then
self._mapNode.aniRoot:Play("DiscPanel_Music", 0, 1)
else
self._mapNode.aniRoot:Play("DiscPanel_in")
end
end
function DiscCtrl:Awake()
self.aniFull = self.gameObject.transform:GetComponent("Animator")
self.aniFull.enabled = false
self.nDragStartPosX = nil
self.nDragThreshold = ConfigTable.GetConfigNumber("DiscDragThreshold")
self.curDiscIndex = nil
self:InitTab()
end
function DiscCtrl:OnEnable()
self:RegisterRedDot()
self:PlayBGM()
self:Refresh()
self.nTabCount = 0
for k, v in pairs(AllEnum.DiscTab) do
self.nTabCount = self.nTabCount + 1
end
end
function DiscCtrl:OnDisable()
self:QuitBGM()
end
function DiscCtrl:OnDestroy()
end
function DiscCtrl:OnBtnClick_Tab(btn, nIndex)
if nIndex == self._panel.nCurTog then
return
end
if self._panel.nCurTog == AllEnum.DiscTab.Music then
self._mapNode.Music:PlayOutMusic()
end
local sAni = TogAni[self._panel.nCurTog][nIndex]
self._mapNode.aniRoot:Play(sAni, 0, 0)
self._mapNode.imgMoveBar:DOLocalMoveX(MoveBarPos[nIndex], 0.1):SetUpdate(true)
self._mapNode.imgTabOn[self._panel.nCurTog]:SetActive(false)
self._mapNode.txtTabOn[self._panel.nCurTog].gameObject:SetActive(false)
self._mapNode.layoutOff[self._panel.nCurTog].gameObject:SetActive(true)
self._mapNode.imgTabOn[nIndex]:SetActive(true)
self._mapNode.txtTabOn[nIndex].gameObject:SetActive(true)
self._mapNode.layoutOff[nIndex].gameObject:SetActive(false)
self._panel.nCurTog = nIndex
self:SwitchTog()
end
function DiscCtrl:OnBtnClick_TabSwitchLeft()
if #self._panel.tbId <= 1 then
return
end
self.curDiscIndex = self.curDiscIndex - 1
if 1 > self.curDiscIndex then
self.curDiscIndex = #self._panel.tbId
end
self._panel.nId = self._panel.tbId[self.curDiscIndex]
self:OnEvent_Drag()
self._mapNode.Info:RefreshShow()
end
function DiscCtrl:OnBtnClick_TabSwitchRight()
if #self._panel.tbId <= 1 then
return
end
self.curDiscIndex = self.curDiscIndex + 1
if self.curDiscIndex > #self._panel.tbId then
self.curDiscIndex = 1
end
self._panel.nId = self._panel.tbId[self.curDiscIndex]
self:OnEvent_Drag()
self._mapNode.Info:RefreshShow()
end
function DiscCtrl:OnBtnClick_Mask(btn)
self._mapNode.anibtnMask:SetTrigger("tOut")
self._mapNode.aniMatList:Play("MatList_out")
local ani_end = function()
self._mapNode.MatList:Open(false)
self._mapNode.btnMask.gameObject:SetActive(false)
end
self:AddTimer(1, 0.2, ani_end, true, true, true)
end
function DiscCtrl:OnBtnClick_OpenFull()
if self._mapNode.liveDiscCtrl:GetCanOpenFullState() then
self.aniFull.enabled = true
self._mapNode.FullImage.gameObject:SetActive(true)
if self._mapNode.imgFull[2].gameObject.activeSelf then
self._mapNode.imgFullBg.gameObject:SetActive(true)
end
if self._panel.nCurTog == AllEnum.DiscTab.Info then
self.aniFull:Play("DiscPanel_Full_in", 0, 0)
elseif self._panel.nCurTog == AllEnum.DiscTab.Development or self._panel.nCurTog == AllEnum.DiscTab.BreakLimit then
self.aniFull:Play("DiscPanel_Full_in1", 0, 0)
end
end
end
function DiscCtrl:OnBtnClick_CloseFull()
if self._panel.nCurTog == AllEnum.DiscTab.Info then
self.aniFull:Play("DiscPanel_Full_out")
elseif self._panel.nCurTog == AllEnum.DiscTab.Development or self._panel.nCurTog == AllEnum.DiscTab.BreakLimit then
self.aniFull:Play("DiscPanel_Full_out1")
end
local ani_end = function()
self.aniFull.enabled = false
self._mapNode.FullImage.gameObject:SetActive(false)
self._mapNode.imgFullBg.gameObject:SetActive(false)
end
self:AddTimer(1, 0.4, ani_end, true, true, true)
end
function DiscCtrl:OnDrag_Disc(mDrag)
if mDrag.DragEventType == AllEnum.UIDragType.DragStart then
self.nDragStartPosX = mDrag.EventData.position.x
elseif mDrag.DragEventType == AllEnum.UIDragType.DragEnd then
local dragEndPosX = mDrag.EventData.position.x
if dragEndPosX - self.nDragStartPosX > self.nDragThreshold then
self:OnBtnClick_TabSwitchLeft()
elseif dragEndPosX - self.nDragStartPosX < -self.nDragThreshold then
self:OnBtnClick_TabSwitchRight()
end
end
end
function DiscCtrl:OnEvent_OpenMatList()
self._mapNode.btnMask.gameObject:SetActive(true)
self._mapNode.MatList:Open(true)
end
function DiscCtrl:OnEvent_Drag()
self:RefreshMiddle()
self:RegisterRedDot()
self:PlayBGM()
local mapData = PlayerData.Disc:GetDiscById(self._panel.nId)
local bMaxLv = mapData.nLevel == mapData.nMaxLv
local bAdvance = mapData.nPhase < mapData.nMaxPhase and bMaxLv
if self._panel.nCurTog == AllEnum.DiscTab.Development then
self._mapNode.Upgrade.gameObject:SetActive(not bAdvance)
self._mapNode.Advance.gameObject:SetActive(bAdvance)
if bAdvance then
self._mapNode.Advance:Refresh()
else
self._mapNode.Upgrade:Refresh()
end
elseif self._panel.nCurTog == AllEnum.DiscTab.BreakLimit then
self._mapNode.BreakLimit:Refresh()
elseif self._panel.nCurTog == AllEnum.DiscTab.Music then
self._mapNode.Music:Refresh()
end
end
function DiscCtrl:OnEvent_OpenFull()
self:OnBtnClick_OpenFull()
end
function DiscCtrl:OnEvent_Guide_DiscSkill()
EventManager.Hit("Guide_SelectDisc", self._panel.nId)
end
function DiscCtrl:OnEvent_GrowthRefresh()
self:ClosePopup()
self:SwitchTog()
end
return DiscCtrl