Files
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

214 lines
6.3 KiB
Lua

local BuildPerkCtrl = class("BuildPerkCtrl", BaseCtrl)
local _, Gray = ColorUtility.TryParseHtmlString("#A0A9B2")
BuildPerkCtrl._mapNodeConfig = {
btnPerk = {
nCount = 2,
sComponentName = "UIButton",
callback = "OnBtnClick_Tab"
},
txtTheme = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Perk_Theme"
},
txtExclusive = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Perk_Exclusive"
},
imgOn = {nCount = 2},
imgOff = {nCount = 2},
svExclusive = {},
svTheme = {},
scExclusive = {
sNodeName = "svExclusive",
sComponentName = "UIScrollToClick"
},
scTheme = {
sNodeName = "svTheme",
sComponentName = "UIScrollToClick"
},
ExclusiveList = {
nCount = 3,
sCtrlName = "Game.UI.BuildPanelEx.BuildExclusiveCtrl"
},
ThemeList = {
nCount = 4,
sCtrlName = "Game.UI.BuildPanelEx.BuildThemeCtrl"
},
goSlot = {
nCount = 4,
sCtrlName = "Game.UI.TemplateEx.TemplatePerkItemCtrl"
},
btnSlot = {
nCount = 4,
sComponentName = "UIButton",
callback = "OnBtnClick_Select"
},
imgSlotIcon = {nCount = 4, sComponentName = "Image"},
txtSlotName = {nCount = 4, sComponentName = "TMP_Text"},
imgSlotBg = {nCount = 4, sComponentName = "Image"}
}
BuildPerkCtrl._mapEventConfig = {
BuildThemeSelect = "OnEvent_ThemeSelect",
BuildExclusiveSelect = "OnEvent_ExclusiveSelect"
}
function BuildPerkCtrl:Refresh(mapBuild)
self:RefreshData(mapBuild)
self:RefreshExclusive()
self:RefreshSlot()
self:RefreshTheme()
self:SetDefaultTab()
end
function BuildPerkCtrl:RefreshData(mapBuild)
self.tbChar = mapBuild.tbChar
self.tbTheme = mapBuild.tbTheme
self.tbExclusivePerk = {}
self.tbThemePerk = {}
self.tbSlot = {}
for _, mapPerk in ipairs(mapBuild.tbPerk) do
local mapCfg = ConfigTable.GetData_Perk(mapPerk.Id)
local mapAfter = {
nTid = mapPerk.Id,
nCount = mapPerk.Qty,
nMaxLevel = mapPerk.MaxQty
}
if mapCfg.Slot and mapCfg.Slot > 0 then
self.tbSlot[mapCfg.Slot] = mapAfter
elseif mapCfg.CharId and 0 < mapCfg.CharId then
if not self.tbExclusivePerk[mapCfg.CharId] then
self.tbExclusivePerk[mapCfg.CharId] = {}
end
table.insert(self.tbExclusivePerk[mapCfg.CharId], mapAfter)
elseif mapCfg.Theme and 0 < mapCfg.Theme then
if not self.tbThemePerk[mapCfg.Theme] then
self.tbThemePerk[mapCfg.Theme] = {}
end
table.insert(self.tbThemePerk[mapCfg.Theme], mapAfter)
end
end
end
local sort = function(a, b)
local cfgDataA = ConfigTable.GetData_Item(a.nTid)
local cfgDataB = ConfigTable.GetData_Item(b.nTid)
if cfgDataA.Rarity ~= cfgDataB.Rarity then
return cfgDataA.Rarity < cfgDataB.Rarity
end
if a.nTid ~= b.nTid then
return a.nTid < b.nTid
end
return a.nCount > b.nCount
end
function BuildPerkCtrl:RefreshExclusive()
for i = 1, 3 do
local nCharId = self.tbChar[i].nTid
local tbPerk = self.tbExclusivePerk[nCharId]
if tbPerk and 0 < #tbPerk then
table.sort(tbPerk, sort)
self._mapNode.ExclusiveList[i].gameObject:SetActive(true)
self._mapNode.ExclusiveList[i]:Refresh(nCharId, tbPerk)
else
self._mapNode.ExclusiveList[i].gameObject:SetActive(false)
end
end
end
function BuildPerkCtrl:RefreshSlot()
for i = 1, 4 do
local bHas = self.tbSlot[i] ~= nil
NovaAPI.SetImageColor(self._mapNode.imgSlotBg[i], bHas and White_Dark or Gray_Dark)
NovaAPI.SetImageColor(self._mapNode.imgSlotIcon[i], bHas and White_Normal or Gray)
NovaAPI.SetTMPColor(self._mapNode.txtSlotName[i], bHas and White_Normal or Gray)
self._mapNode.btnSlot[i].gameObject:SetActive(bHas)
if bHas then
self._mapNode.goSlot[i]:SetPerk(self.tbSlot[i].nTid, self.tbSlot[i].nCount - 1, self.tbSlot[i].nMaxLevel - 1)
self._mapNode.goSlot[i]:SetSelect(self.nSlotSelect == i)
end
self:SetAtlasSprite(self._mapNode.imgSlotIcon[i], "10_ico", "zs_vestige_icon_" .. i)
NovaAPI.SetImageNativeSize(self._mapNode.imgSlotIcon[i])
NovaAPI.SetTMPText(self._mapNode.txtSlotName[i], ConfigTable.GetUIText("Slot_Title_" .. i))
end
end
function BuildPerkCtrl:RefreshTheme()
local tbDefaultPresents = ConfigTable.GetConfigNumberArray("RglCommonPresentsThemeList")
local tbDefaultTheme = {}
for _, v in ipairs(tbDefaultPresents) do
local mapCfg = ConfigTable.GetData("Presents", v)
table.insert(tbDefaultTheme, mapCfg.Theme)
end
local mapThemePerk = {}
for i = 1, 4 do
local nTheme = self.tbTheme[i].Theme
local tbPerk = self.tbThemePerk[nTheme]
if tbPerk and 0 < #tbPerk then
table.insert(mapThemePerk, {
nTheme = nTheme,
nCount = #tbPerk,
bBase = table.indexof(tbDefaultTheme, 0 < nTheme)
})
end
end
table.sort(mapThemePerk, function(a, b)
if a.nCount ~= b.nCount then
return a.nCount > b.nCount
elseif a.bBase ~= b.bBase then
return not a.bBase and b.bBase
else
return a.nTheme < b.nTheme
end
end)
for i = 1, 4 do
if mapThemePerk[i] then
local nTheme = mapThemePerk[i].nTheme
local tbPerk = self.tbThemePerk[nTheme]
table.sort(tbPerk, sort)
self._mapNode.ThemeList[i].gameObject:SetActive(true)
self._mapNode.ThemeList[i]:Refresh(nTheme, tbPerk)
else
self._mapNode.ThemeList[i].gameObject:SetActive(false)
end
end
end
function BuildPerkCtrl:SetDefaultTab()
self.nCurTab = 1
self._mapNode.svExclusive:SetActive(self.nCurTab == 2)
self._mapNode.svTheme:SetActive(self.nCurTab == 1)
end
function BuildPerkCtrl:Awake()
end
function BuildPerkCtrl:OnEnable()
end
function BuildPerkCtrl:OnDisable()
end
function BuildPerkCtrl:OnDestroy()
end
function BuildPerkCtrl:OnBtnClick_Tab(btn, nIndex)
if nIndex == self.nCurTab then
return
end
for i = 1, 2 do
self._mapNode.imgOn[i]:SetActive(i == nIndex)
self._mapNode.imgOff[i]:SetActive(i ~= nIndex)
end
self.nCurTab = nIndex
self._mapNode.svExclusive:SetActive(self.nCurTab == 2)
self._mapNode.svTheme:SetActive(self.nCurTab == 1)
end
function BuildPerkCtrl:OnBtnClick_Select(btn, nIndex)
local tip = function()
local mapPanelData = {
nPerkId = self.tbSlot[nIndex].nTid,
nCount = self.tbSlot[nIndex].nCount
}
EventManager.Hit(EventId.OpenPanel, PanelId.PerkTips, btn.transform, mapPanelData)
end
EventManager.Hit("BuildThemeSelect", btn.gameObject, 0.1)
self:AddTimer(1, 0.1, tip, true, true, true)
end
function BuildPerkCtrl:OnEvent_ThemeSelect(go, nTime)
self._mapNode.scTheme:ScrollToClick(go, nTime)
end
function BuildPerkCtrl:OnEvent_ExclusiveSelect(go, nTime)
self._mapNode.scExclusive:ScrollToClick(go, nTime)
end
return BuildPerkCtrl