Files
StellaSora_DataLua/lua/game/ui/sidebanner/sidebannerctrl.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

241 lines
9.0 KiB
Lua

local SideBannerCtrl = class("SideBannerCtrl", BaseCtrl)
local Height = {
[1] = 141.5,
[2] = 181.1
}
local Spacing = 18.5
SideBannerCtrl._mapNodeConfig = {
rtContent = {sComponentName = "Transform"},
goEntry = {},
goReward = {},
goFavour = {},
goAchievement = {}
}
SideBannerCtrl._mapEventConfig = {}
function SideBannerCtrl:Popup(tbList)
self.sequence = DOTween.Sequence()
self.sequence:SetUpdate(true)
local nCount = #tbList
local tbItem = {}
for _, mapData in ipairs(tbList) do
local mapItem = self:CreateBanner(mapData)
table.insert(tbItem, mapItem)
self.sequence:AppendCallback(function()
mapItem.animator:Play("DictionaryPanel_reward_in")
end)
self.sequence:AppendInterval(0.1)
end
self.sequence:AppendInterval(0.333)
if nCount == 1 then
self.sequence:AppendInterval(1)
end
for k, _ in pairs(tbItem) do
self.sequence:AppendCallback(function()
local nHeight = self:GetMoveHeght(tbItem, k)
for i = k + 1, nCount do
tbItem[i].transform:DOLocalMoveY(nHeight, 0.2):SetEase(Ease.OutQuad):SetUpdate(true)
end
tbItem[k].animator:Play("DictionaryPanel_reward_out")
end)
self.sequence:AppendInterval(0.45)
end
self.sequence.onComplete = dotween_callback_handler(self, function()
EventManager.Hit("CloseSideBanner")
end)
end
function SideBannerCtrl:GetMoveHeght(tbItem, nIndex)
local nHeight = 0
for i = 1, nIndex do
nHeight = nHeight + tbItem[i].height + Spacing
end
return nHeight
end
function SideBannerCtrl:CreateBanner(mapData)
if mapData.nType == AllEnum.SideBaner.DictionaryEntry then
return self:CreateEntry(mapData)
elseif mapData.nType == AllEnum.SideBaner.DictionaryReward then
return self:CreateReward(mapData)
elseif mapData.nType == AllEnum.SideBaner.Favour then
return self:CreateFavour(mapData)
elseif mapData.nType == AllEnum.SideBaner.Achievement then
return self:CreateAchievement(mapData)
end
end
function SideBannerCtrl:CreateEntry(mapData)
local goItem = instantiate(self._mapNode.goEntry, self._mapNode.rtContent)
goItem:SetActive(true)
local rtItem = goItem.transform:GetComponent("RectTransform")
local trRoot = goItem.transform:Find("AnimRoot")
local rtBg = trRoot:Find("imgBg"):GetComponent("RectTransform")
local txtTitle = trRoot:Find("imgBg/txtTitle"):GetComponent("TMP_Text")
local txtDone = trRoot:Find("imgBg/txtDone"):GetComponent("TMP_Text")
local aniItem = trRoot:GetComponent("Animator")
local goOther = trRoot:Find("imgBg/Other").gameObject
local txtOther = trRoot:Find("imgBg/Other/txtOther"):GetComponent("TMP_Text")
local mapCfg = ConfigTable.GetData("DictionaryEntry", mapData.nId)
if mapCfg then
NovaAPI.SetTMPText(txtTitle, mapCfg.Title)
else
NovaAPI.SetTMPText(txtTitle, "title error")
end
NovaAPI.SetTMPText(txtDone, ConfigTable.GetUIText("SideBanner_Dictionary_Get"))
local bOther = mapData.nOtherCount ~= nil and mapData.nOtherCount > 0
local nHeight = Height[bOther and 2 or 1]
rtItem.sizeDelta = Vector2(rtItem.sizeDelta.x, nHeight)
rtBg.sizeDelta = Vector2(rtBg.sizeDelta.x, nHeight)
goOther:SetActive(bOther)
if bOther then
NovaAPI.SetTMPText(txtOther, orderedFormat(ConfigTable.GetUIText("SideBanner_Dictionary_Count"), mapData.nOtherCount))
end
local mapAfter = {
animator = aniItem,
transform = trRoot,
height = nHeight
}
return mapAfter
end
function SideBannerCtrl:CreateReward(mapData)
local goItem = instantiate(self._mapNode.goReward, self._mapNode.rtContent)
goItem:SetActive(true)
local rtItem = goItem.transform:GetComponent("RectTransform")
local trRoot = goItem.transform:Find("AnimRoot")
local rtBg = trRoot:Find("imgBg"):GetComponent("RectTransform")
local imgRewardIcon = trRoot:Find("imgBg/imgRewardIcon"):GetComponent("Image")
local txtRewardCount = trRoot:Find("imgBg/txtRewardCount"):GetComponent("TMP_Text")
local txtRewardTitle = trRoot:Find("imgBg/txtRewardTitle"):GetComponent("TMP_Text")
local aniItem = trRoot:GetComponent("Animator")
local goOther = trRoot:Find("imgBg/Other").gameObject
local txtOther = trRoot:Find("imgBg/Other/txtOther"):GetComponent("TMP_Text")
self:SetSprite_Coin(imgRewardIcon, mapData.mapReward.id)
NovaAPI.SetTMPText(txtRewardCount, mapData.mapReward.count)
NovaAPI.SetTMPText(txtRewardTitle, ConfigTable.GetUIText("SideBanner_Reward_Get"))
local bOther = mapData.nOtherCount ~= nil and mapData.nOtherCount > 0
local nHeight = Height[bOther and 2 or 1]
rtItem.sizeDelta = Vector2(rtItem.sizeDelta.x, nHeight)
rtBg.sizeDelta = Vector2(rtBg.sizeDelta.x, nHeight)
goOther:SetActive(bOther)
if bOther then
NovaAPI.SetTMPText(txtOther, orderedFormat(ConfigTable.GetUIText("SideBanner_Reward_Count"), mapData.nOtherCount))
end
local mapAfter = {
animator = aniItem,
transform = trRoot,
height = nHeight
}
return mapAfter
end
function SideBannerCtrl:CreateFavour(mapData)
local goItem = instantiate(self._mapNode.goFavour, self._mapNode.rtContent)
goItem:SetActive(true)
local rtItem = goItem.transform:GetComponent("RectTransform")
local trRoot = goItem.transform:Find("AnimRoot")
local rtBg = trRoot:Find("imgBg"):GetComponent("RectTransform")
local aniItem = trRoot:GetComponent("Animator")
local imgHead = trRoot:Find("imgBg/imgHead"):GetComponent("Image")
local txtFavourLevel = trRoot:Find("imgBg/txtFavourLevel"):GetComponent("TMP_Text")
local txtName = trRoot:Find("imgBg/txtName"):GetComponent("TMP_Text")
local txtDesc = trRoot:Find("imgBg/txtDesc"):GetComponent("TMP_Text")
local imgHeart = trRoot:Find("imgBg/imgHeart"):GetComponent("Image")
local goOther = trRoot:Find("imgBg/Other").gameObject
local txtOther = trRoot:Find("imgBg/Other/txtOther"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txtDesc, ConfigTable.GetUIText("SideBanner_Favour_Get"))
local nSkinId = PlayerData.Char:GetCharSkinId(mapData.nId)
local mapCfgData_Skin = ConfigTable.GetData_CharacterSkin(nSkinId)
if mapCfgData_Skin then
self:SetPngSprite(imgHead, mapCfgData_Skin.Icon, AllEnum.CharHeadIconSurfix.L)
end
local mapFavour = PlayerData.Char:GetCharAffinityData(mapData.nId)
local level = 0
if mapFavour ~= nil then
level = mapFavour.Level
end
NovaAPI.SetTMPText(txtFavourLevel, level)
local mapCharCfg = ConfigTable.GetData_Character(mapData.nId)
if mapCharCfg then
NovaAPI.SetTMPText(txtName, mapCharCfg.Name)
end
local mapAffinity = {}
local forEachAffinityLevel = function(mapLine)
if mapLine.AffinityLevel == level then
mapAffinity = mapLine
end
end
ForEachTableLine(DataTable.AffinityLevel, forEachAffinityLevel)
if mapAffinity.AffinityLevelIcon ~= "" then
self:SetPngSprite(imgHeart, mapAffinity.AffinityLevelIcon)
end
local bOther = mapData.nOtherCount ~= nil and 0 < mapData.nOtherCount
local nHeight = Height[bOther and 2 or 1]
rtItem.sizeDelta = Vector2(rtItem.sizeDelta.x, nHeight)
rtBg.sizeDelta = Vector2(rtBg.sizeDelta.x, nHeight)
goOther:SetActive(bOther)
if bOther then
NovaAPI.SetTMPText(txtOther, orderedFormat(ConfigTable.GetUIText("SideBanner_Favour_Count"), mapData.nOtherCount))
end
local mapAfter = {
animator = aniItem,
transform = trRoot,
height = nHeight
}
return mapAfter
end
function SideBannerCtrl:CreateAchievement(mapData)
local goItem = instantiate(self._mapNode.goAchievement, self._mapNode.rtContent)
goItem:SetActive(true)
local rtItem = goItem.transform:GetComponent("RectTransform")
local trRoot = goItem.transform:Find("AnimRoot")
local rtBg = trRoot:Find("imgBg"):GetComponent("RectTransform")
local txtTitle = trRoot:Find("imgBg/txtTitle"):GetComponent("TMP_Text")
local txtDone = trRoot:Find("imgBg/txtDone"):GetComponent("TMP_Text")
local aniItem = trRoot:GetComponent("Animator")
local goOther = trRoot:Find("imgBg/Other").gameObject
local txtOther = trRoot:Find("imgBg/Other/txtOther"):GetComponent("TMP_Text")
local imgCup = trRoot:Find("imgBg/imgCup"):GetComponent("Image")
local mapCfg = ConfigTable.GetData("Achievement", mapData.nId)
if mapCfg then
NovaAPI.SetTMPText(txtTitle, mapCfg.Title)
self:SetPngSprite(imgCup, "UI/big_sprites/zs_achievement_cup_0" .. mapCfg.Rarity)
else
NovaAPI.SetTMPText(txtTitle, "Achievement error")
end
NovaAPI.SetTMPText(txtDone, ConfigTable.GetUIText("SideBanner_Achieve_Get"))
local bOther = mapData.nOtherCount ~= nil and mapData.nOtherCount > 0
local nHeight = Height[bOther and 2 or 1]
rtItem.sizeDelta = Vector2(rtItem.sizeDelta.x, nHeight)
rtBg.sizeDelta = Vector2(rtBg.sizeDelta.x, nHeight)
goOther:SetActive(bOther)
if bOther then
NovaAPI.SetTMPText(txtOther, orderedFormat(ConfigTable.GetUIText("SideBanner_Achieve_Count"), mapData.nOtherCount))
end
local mapAfter = {
animator = aniItem,
transform = trRoot,
height = nHeight
}
return mapAfter
end
function SideBannerCtrl:ProcessList(tbList)
table.sort(tbList, function(a, b)
return a.nType < b.nType
end)
return tbList
end
function SideBannerCtrl:Awake()
end
function SideBannerCtrl:OnEnable()
local tbParam = self:GetPanelParam()
if type(tbParam) == "table" then
local tbList = self:ProcessList(tbParam)
self:Popup(tbList)
end
end
function SideBannerCtrl:OnDisable()
if self.sequence then
self.sequence:Kill()
self.sequence = nil
end
end
function SideBannerCtrl:OnDestroy()
end
return SideBannerCtrl