Files
SL1900 80af235e05 Update - 1.12.0.120
EN: 1.12.0.120
CN: 1.12.0.120
JP: 1.12.0.124
KR: 1.12.0.124
2026-06-30 14:30:00 +09:00

472 lines
17 KiB
Lua

local StarTowerFateCardBookCtrl = class("StarTowerFateCardBookCtrl", BaseCtrl)
StarTowerFateCardBookCtrl._mapNodeConfig = {
goBundle = {},
txtTitle = {
sComponentName = "TMP_Text",
sLanguageId = "StarTower_Book_FateCard_Title_01"
},
bundleLSV = {
sComponentName = "LoopScrollView"
},
goCardList = {},
togLSV = {
sComponentName = "LoopScrollView"
},
goCardItem = {
nCount = 8,
sCtrlName = "Game.UI.StarTowerBook.FateCard.FateCardBookItemCtrl"
},
btnCard = {
nCount = 8,
sComponentName = "UIButton",
callback = "OnBtnClick_CardItem"
},
imgEmpty = {},
goRightCardList = {},
txtCollectCn = {
sComponentName = "TMP_Text",
sLanguageId = "StarTower_Book_Collect"
},
txtCollectCount = {sComponentName = "TMP_Text"},
btnReward = {
sComponentName = "UIButton",
callback = "OnBtnClick_Reward"
},
btnReceiveReward = {
sComponentName = "UIButton",
callback = "OnBtnClick_Reward"
},
btnLeft = {
sComponentName = "UIButton",
callback = "OnBtnClick_Left"
},
btnRight = {
sComponentName = "UIButton",
callback = "OnBtnClick_Right"
},
imgDotBg = {nCount = 8},
imgDot = {nCount = 8},
animPage = {sNodeName = "imgBook", sComponentName = "Animator"},
goLeftCardList = {},
goBlur = {},
goCardDetail = {},
animCardDetail = {
sNodeName = "goCardDetail",
sComponentName = "Animator"
},
btnBg = {
sComponentName = "Button",
callback = "OnBtnClick_Bg"
},
fateCardDetail = {
sCtrlName = "Game.UI.StarTower.FateCard.FateCardItemCtrl"
},
goFateCardDetail = {
sNodeName = "fateCardDetail"
},
btnToggleStarTower = {
sCtrlName = "Game.UI.TemplateEx.TemplateToggleCtrl"
},
btnToggleSurvivor = {
sCtrlName = "Game.UI.TemplateEx.TemplateToggleCtrl"
},
togST = {
sNodeName = "btnToggleStarTower",
sComponentName = "UIButton",
callback = "OnBtnClick_CardTypeStarTower"
},
togSV = {
sNodeName = "btnToggleSurvivor",
sComponentName = "UIButton",
callback = "OnBtnClick_CardTypeSurvivor"
},
txtArea = {sComponentName = "TMP_Text"},
txtTips = {
sComponentName = "TMP_Text",
sLanguageId = "StarTower_Book_Close_Tip"
},
goCardTip = {},
btnTipBg = {
sComponentName = "Button",
callback = "OnBtnClick_TipBg"
},
txtUnlockTitle = {
sComponentName = "TMP_Text",
sLanguageId = "StarTower_Book_FateCard_Unlock_Tip"
},
txtUnlockTip = {sComponentName = "TMP_Text"},
redDotReward = {},
btnReceiveAllFateCard = {
sComponentName = "UIButton",
callback = "OnBtnClick_ReceiveAllFateCard"
},
TMPReceiveAllFateCardTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Quest_Btn_ReceiveAll"
}
}
StarTowerFateCardBookCtrl._mapEventConfig = {
ReceiveFateCardBookReward = "OnEvent_ReceiveFateCardBookReward"
}
StarTowerFateCardBookCtrl._mapRedDotConfig = {}
function StarTowerFateCardBookCtrl:ResetNewRedDot(nBundleId)
if self.mapBundleList ~= nil then
if nBundleId then
local tbCardList = self.mapBundleList[nBundleId].tbCardList
if tbCardList then
for _, card in ipairs(tbCardList) do
RedDotManager.SetValid(RedDotDefine.StarTowerBook_FateCard_New, card.nId, false)
end
end
else
for _, v in pairs(self.mapBundleList) do
for _, card in ipairs(v.tbCardList) do
RedDotManager.SetValid(RedDotDefine.StarTowerBook_FateCard_New, card.nId, false)
end
end
end
end
end
function StarTowerFateCardBookCtrl:Init()
self.animRoot:Play("StarTowerBookFateCard_in", 0, 0)
CS.WwiseAudioManager.Instance:PlaySound("ui_rogueBook_page_drag")
self.nBundleId = 0
self.nSelectIndex = 0
self.nCurPage = 0
self.nCurCardId = 0
self:RefreshBundleList()
self:RefreshReceiveAllBtn()
self._mapNode.btnToggleStarTower:SetText(ConfigTable.GetUIText("LevelMenu_Startower"))
self._mapNode.btnToggleSurvivor:SetText(ConfigTable.GetUIText("LevelMenu_Vampire"))
end
function StarTowerFateCardBookCtrl:Back()
if self.bFateCardList then
self.bFateCardList = false
self:ResetNewRedDot()
self._mapNode.goBundle.gameObject:SetActive(true)
self._mapNode.goCardList.gameObject:SetActive(false)
self._mapNode.goCardDetail.gameObject:SetActive(false)
self._mapNode.goCardTip.gameObject:SetActive(false)
self._mapNode.goBlur.gameObject:SetActive(false)
self:RefreshReceiveAllBtn()
else
EventManager.Hit("ChangeStarTowerBookPanel", AllEnum.StarTowerBookPanelType.Main)
end
end
function StarTowerFateCardBookCtrl:RefreshBundleList()
self._mapNode.goBundle.gameObject:SetActive(true)
self._mapNode.goCardList.gameObject:SetActive(false)
self._mapNode.goCardDetail.gameObject:SetActive(false)
self._mapNode.goCardTip.gameObject:SetActive(false)
self._mapNode.goBlur.gameObject:SetActive(false)
self.mapBundleList = PlayerData.StarTowerBook:GetAllFateCardBundle()
self.mapSortBundleList = {}
self.mapBundleTogList = {}
for nId, v in pairs(self.mapBundleList) do
table.sort(v.tbCardList, function(a, b)
return a.nSort < b.nSort
end)
table.insert(self.mapSortBundleList, {
nBundleId = nId,
tbCardList = v.tbCardList,
nSort = v.nSort
})
end
table.sort(self.mapSortBundleList, function(a, b)
return a.nSort < b.nSort
end)
self.mapBundleTogList = clone(self.mapSortBundleList)
local nCount = #self.mapSortBundleList
if nCount < 8 then
for i = nCount + 1, 8 do
table.insert(self.mapSortBundleList, {bEmpty = true})
end
end
self._mapNode.bundleLSV:Init(#self.mapSortBundleList, self, self.OnBundleGridRefresh, self.OnBundleGridClick)
end
function StarTowerFateCardBookCtrl:SelectBundle(bKeepPos, bSetScrollPos)
self.animRoot:Play("StarTowerBookFateCard_in1", 0, 0)
self.bFateCardList = true
self._mapNode.goBundle.gameObject:SetActive(false)
self._mapNode.goCardList.gameObject:SetActive(true)
self._mapNode.goCardDetail.gameObject:SetActive(false)
self._mapNode.goCardTip.gameObject:SetActive(false)
self._mapNode.goBlur.gameObject:SetActive(false)
self._mapNode.togLSV:Init(#self.mapBundleTogList, self, self.OnTogGridRefresh, self.OnTogGridClick, bKeepPos)
if bSetScrollPos then
self._mapNode.togLSV:SetScrollGridPos(self.nSelectIndex - 1, 0.1, 0)
end
self.mapCardList = self.mapBundleList[self.nBundleId].tbCardList
self.nCurPage = 1
self.nAllPage = math.floor(#self.mapCardList % 8 == 0 and #self.mapCardList / 8 or #self.mapCardList / 8 + 1)
self:RefreshPageList()
self:RefreshLeftPage()
self:RefreshRightPage()
self._mapNode.btnReceiveAllFateCard.gameObject:SetActive(false)
for k, v in ipairs(self._mapNode.imgDotBg) do
v.gameObject:SetActive(k <= self.nAllPage and 1 < self.nAllPage)
end
local nCount = 0
for _, v in ipairs(self.mapCardList) do
if v.nStatus == AllEnum.FateCardBookStatus.Collect then
nCount = nCount + 1
end
end
local bCanReceive = RedDotManager.GetValid(RedDotDefine.StarTowerBook_FateCard_Reward, self.nBundleId)
self._mapNode.btnReward.gameObject:SetActive(not bCanReceive)
self._mapNode.btnReceiveReward.gameObject:SetActive(bCanReceive)
NovaAPI.SetTMPText(self._mapNode.txtCollectCount, string.format("%s/%s", nCount, #self.mapCardList))
RedDotManager.RegisterNode(RedDotDefine.StarTowerBook_FateCard_Reward, self.nBundleId, self._mapNode.redDotReward)
end
function StarTowerFateCardBookCtrl:RefreshPageList()
self._mapNode.btnLeft.gameObject:SetActive(self.nCurPage > 1)
self._mapNode.btnRight.gameObject:SetActive(self.nCurPage < self.nAllPage)
for k, v in ipairs(self._mapNode.imgDot) do
v.gameObject:SetActive(k == self.nCurPage)
end
end
function StarTowerFateCardBookCtrl:RefreshLeftPage()
local nStartIndex = (self.nCurPage - 1) * 8
for i = 1, 4 do
local item = self._mapNode.goCardItem[i]
local nIndex = nStartIndex + i
item.gameObject:SetActive(self.mapCardList[nIndex] ~= nil)
if self.mapCardList[nIndex] ~= nil then
item:InitItem(self.mapCardList[nIndex].nId, self.mapCardList[nIndex].nStatus)
item:RegisterRedDot()
end
end
end
function StarTowerFateCardBookCtrl:RefreshRightPage()
local bEmpty = true
local nStartIndex = (self.nCurPage - 1) * 8
for i = 5, 8 do
local item = self._mapNode.goCardItem[i]
local nIndex = nStartIndex + i
item.gameObject:SetActive(self.mapCardList[nIndex] ~= nil)
if self.mapCardList[nIndex] ~= nil then
bEmpty = false
item:InitItem(self.mapCardList[nIndex].nId, self.mapCardList[nIndex].nStatus)
item:RegisterRedDot()
end
end
self._mapNode.imgEmpty.gameObject:SetActive(bEmpty)
end
function StarTowerFateCardBookCtrl:OnTogGridRefresh(goGrid, nIndex)
local imgBundle = goGrid.transform:Find("btnGrid/AnimRoot/imgBundle"):GetComponent("Image")
local imgNormal = goGrid.transform:Find("btnGrid/AnimRoot/imgNormal")
local txtNormal = goGrid.transform:Find("btnGrid/AnimRoot/imgNormal/txtNormal"):GetComponent("TMP_Text")
local imgChoose = goGrid.transform:Find("btnGrid/AnimRoot/imgChoose")
local txtChoose = goGrid.transform:Find("btnGrid/AnimRoot/imgChoose/txtChoose"):GetComponent("TMP_Text")
local redDot = goGrid.transform:Find("btnGrid/AnimRoot/redDotTog")
local nId = self.mapBundleTogList[nIndex + 1].nBundleId
local bundleCfg = ConfigTable.GetData("StarTowerBookFateCardBundle", nId)
if bundleCfg ~= nil then
self:SetPngSprite(imgBundle, bundleCfg.Icon)
NovaAPI.SetTMPText(txtNormal, bundleCfg.ShortName)
NovaAPI.SetTMPText(txtChoose, bundleCfg.ShortName)
end
imgChoose.gameObject:SetActive(nId == self.nBundleId)
imgNormal.gameObject:SetActive(nId ~= self.nBundleId)
RedDotManager.RegisterNode(RedDotDefine.StarTowerBook_FateCard_Bundle_Tog, nId, redDot, nil, nil, true)
end
function StarTowerFateCardBookCtrl:OnTogGridClick(goGrid, nIndex)
if nIndex + 1 == self.nSelectIndex then
return
end
local goSelect = self._mapNode.togLSV.gameObject.transform:Find("Viewport/Content/" .. self.nSelectIndex - 1)
if goSelect then
local imgChoose = goSelect.transform:Find("btnGrid/AnimRoot/imgChoose")
imgChoose.gameObject:SetActive(false)
end
if self.nBundleId ~= 0 then
self:ResetNewRedDot(self.nBundleId)
end
self.nSelectIndex = nIndex + 1
self.nBundleId = self.mapBundleTogList[nIndex + 1].nBundleId
local imgChoose = goGrid.transform:Find("btnGrid/AnimRoot/imgChoose")
imgChoose.gameObject:SetActive(true)
self:SelectBundle(true)
end
function StarTowerFateCardBookCtrl:OnBundleGridRefresh(goGrid, nIndex)
local goItem = goGrid.transform:Find("btnGrid/AnimRoot/goBundleItem")
local imgNormal = goItem:Find("imgNormal")
local imgBundle = imgNormal:Find("imgBundle"):GetComponent("Image")
local imgBundleS = imgNormal:Find("txtBundle/imgBundleS"):GetComponent("Image")
local txtBundle = imgNormal:Find("txtBundle"):GetComponent("TMP_Text")
local txtCount = imgNormal:Find("imgCount/txtCount"):GetComponent("TMP_Text")
local imgEmpty = goItem:Find("imgEmpty")
local txtEmpty = imgEmpty:Find("txtEmpty"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txtEmpty, ConfigTable.GetUIText("StarTower_Book_FateCard_Empty"))
local mapData = self.mapSortBundleList[nIndex + 1]
imgNormal.gameObject:SetActive(not mapData.bEmpty)
imgEmpty.gameObject:SetActive(mapData.bEmpty)
if not mapData.bEmpty then
local nBundleId = self.mapSortBundleList[nIndex + 1].nBundleId
local bundleCfg = ConfigTable.GetData("StarTowerBookFateCardBundle", nBundleId)
if bundleCfg ~= nil then
self:SetPngSprite(imgBundle, bundleCfg.Icon .. AllEnum.FateCardBundleIcon.L)
self:SetPngSprite(imgBundleS, bundleCfg.Icon)
NovaAPI.SetTMPText(txtBundle, bundleCfg.ShortName)
end
local mapCardList = self.mapBundleList[nBundleId].tbCardList
local nCount = 0
for _, v in ipairs(mapCardList) do
if v.nStatus == AllEnum.FateCardBookStatus.Collect then
nCount = nCount + 1
end
end
NovaAPI.SetTMPText(txtCount, string.format("%s/%s", nCount, #mapCardList))
local redDot = imgNormal:Find("redDotBundle")
RedDotManager.RegisterNode(RedDotDefine.StarTowerBook_FateCard_Bundle, nBundleId, redDot, nil, nil, true)
end
end
function StarTowerFateCardBookCtrl:OnBundleGridClick(goGrid, nIndex)
local mapBundle = self.mapSortBundleList[nIndex + 1]
if mapBundle ~= nil and not mapBundle.bEmpty then
self.nBundleId = mapBundle.nBundleId
self.nSelectIndex = nIndex + 1
self:SelectBundle(false, true)
end
end
function StarTowerFateCardBookCtrl:RefreshReceiveAllBtn()
self._mapNode.btnReceiveAllFateCard.gameObject:SetActive(false)
for k, v in pairs(self.mapBundleList) do
local nBundleId = k
local bBundleCanReceive = RedDotManager.GetValid(RedDotDefine.StarTowerBook_FateCard_Reward, nBundleId)
if bBundleCanReceive and not self.bFateCardList then
self._mapNode.btnReceiveAllFateCard.gameObject:SetActive(true)
break
end
end
end
function StarTowerFateCardBookCtrl:Awake()
self.animRoot = self.gameObject:GetComponent("Animator")
end
function StarTowerFateCardBookCtrl:FadeIn()
end
function StarTowerFateCardBookCtrl:FadeOut()
end
function StarTowerFateCardBookCtrl:OnEnable()
end
function StarTowerFateCardBookCtrl:OnDisable()
if self.bFateCardList then
self:ResetNewRedDot()
end
end
function StarTowerFateCardBookCtrl:OnDestroy()
end
function StarTowerFateCardBookCtrl:OnRelease()
end
function StarTowerFateCardBookCtrl:OnBtnClick_Left()
if self.nCurPage <= 1 then
return
end
self.nCurPage = self.nCurPage - 1
self._mapNode.animPage:Play("FlipBook_Right", 0, 0)
self:AddTimer(1, 0.3, function()
self:RefreshRightPage()
end, true, true, true, nil)
self:RefreshPageList()
self:RefreshLeftPage()
end
function StarTowerFateCardBookCtrl:OnBtnClick_Right()
if self.nCurPage >= self.nAllPage then
return
end
self.nCurPage = self.nCurPage + 1
self._mapNode.animPage:Play("FlipBook_Left", 0, 0)
self:AddTimer(1, 0.1, function()
self:RefreshLeftPage()
end, true, true, true, nil)
self:RefreshPageList()
self:RefreshRightPage()
end
function StarTowerFateCardBookCtrl:OnBtnClick_Reward()
EventManager.Hit("OpenStarTowerBookQuest", self.nBundleId)
end
function StarTowerFateCardBookCtrl:OnBtnClick_Bg()
self._mapNode.animCardDetail:Play("goCardDetail_out")
local nAnimLen = NovaAPI.GetAnimClipLength(self._mapNode.animCardDetail, {
"goCardDetail_out"
})
self:AddTimer(1, nAnimLen, function()
self._mapNode.goCardDetail.gameObject:SetActive(false)
self._mapNode.goBlur.gameObject:SetActive(false)
if self._mapNode.goCardItem[self.nClickIndex] ~= nil then
end
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, nAnimLen)
end
function StarTowerFateCardBookCtrl:OnBtnClick_TipBg()
self._mapNode.goCardTip.gameObject:SetActive(false)
self._mapNode.goBlur.gameObject:SetActive(false)
end
function StarTowerFateCardBookCtrl:OnBtnClick_CardItem(btn, nIdx)
local nIndex = (self.nCurPage - 1) * 8 + nIdx
local cardData = self.mapCardList[nIndex]
if cardData == nil then
return
end
self.nCurCardId = cardData.nId
local cardCfg = ConfigTable.GetData("StarTowerBookFateCard", cardData.nId)
if cardCfg == nil then
return
end
if cardData.nStatus == AllEnum.FateCardBookStatus.Lock then
NovaAPI.SetTMPText(self._mapNode.txtUnlockTip, cardCfg.UnlockTip)
self._mapNode.goCardTip.gameObject:SetActive(false)
self._mapNode.goBlur.gameObject:SetActive(true)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self._mapNode.goCardTip.gameObject:SetActive(true)
end
cs_coroutine.start(wait)
else
local animFinishFunc = function()
RedDotManager.SetValid(RedDotDefine.StarTowerBook_FateCard_New, cardData.nId, false)
self._mapNode.goCardDetail.gameObject:SetActive(false)
self._mapNode.goBlur.gameObject:SetActive(true)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self._mapNode.goCardDetail.gameObject:SetActive(true)
end
cs_coroutine.start(wait)
EventManager.Hit(EventId.TemporaryBlockInput, 0.5)
self:OnBtnClick_CardTypeSurvivor()
NovaAPI.SetTMPText(self._mapNode.txtArea, ConfigTable.GetUIText("StarTower_Event_Book_Source") .. cardCfg.Source)
end
self.nClickIndex = nIdx
if self._mapNode.goCardItem[nIdx] ~= nil then
self:AddTimer(1, 0.15, animFinishFunc, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.15)
end
end
end
function StarTowerFateCardBookCtrl:OnBtnClick_CardTypeStarTower()
self._mapNode.fateCardDetail = self:BindCtrlByNode(self._mapNode.goFateCardDetail, "Game.UI.StarTower.FateCard.FateCardItemCtrl")
if self.nCurCardId and self.nCurCardId ~= 0 then
self._mapNode.fateCardDetail:SetFateCardItem(self.nCurCardId)
end
self._mapNode.btnToggleStarTower:SetDefault(true)
self._mapNode.btnToggleSurvivor:SetDefault(false)
end
function StarTowerFateCardBookCtrl:OnBtnClick_CardTypeSurvivor()
self._mapNode.fateCardDetail = self:BindCtrlByNode(self._mapNode.goFateCardDetail, "Game.UI.VampireSurvivor.FateCardItemCtrl")
if self.nCurCardId and self.nCurCardId ~= 0 then
self._mapNode.fateCardDetail:SetFateCardItem(self.nCurCardId)
end
self._mapNode.btnToggleStarTower:SetDefault(false)
self._mapNode.btnToggleSurvivor:SetDefault(true)
end
function StarTowerFateCardBookCtrl:OnBtnClick_ReceiveAllFateCard()
PlayerData.StarTowerBook:SendReceiveFateCardAllRewardMsg()
end
function StarTowerFateCardBookCtrl:OnEvent_ReceiveFateCardBookReward()
local bCanReceive = RedDotManager.GetValid(RedDotDefine.StarTowerBook_FateCard_Reward, self.nBundleId)
self._mapNode.btnReward.gameObject:SetActive(not bCanReceive)
self._mapNode.btnReceiveReward.gameObject:SetActive(bCanReceive)
self:RefreshReceiveAllBtn()
end
return StarTowerFateCardBookCtrl