Files
StellaSora_DataLua/lua/game/ui/potentialpreselection/potentialpreselectioncharlistctrl.lua
T
SL1900 e0549005e1 Update - 1.9.0.103
EN: 1.9.0.103
CN: 1.9.0.104
JP: 1.9.0.106
KR: 1.9.0.108
2026-04-18 00:15:00 +09:00

301 lines
10 KiB
Lua

local PotentialPreselectionCharListCtrl = class("PotentialPreselectionCharListCtrl", BaseCtrl)
PotentialPreselectionCharListCtrl._mapNodeConfig = {
sv = {
sComponentName = "LoopScrollView"
},
labEmpty = {
sComponentName = "TMP_Text",
sLanguageId = "Filter_NoAim"
},
btnCloseList = {
sComponentName = "UIButton",
callback = "OnBtnClick_Clear"
},
btnConfirm = {
sComponentName = "UIButton",
callback = "OnBtnClick_Confirm"
},
rtCharListContent = {sComponentName = "Transform"},
btnFilter = {
sComponentName = "UIButton",
callback = "OnBtnClick_Filter"
},
imgFilterChoose = {},
txtBtnListConifrm = {
sComponentName = "TMP_Text",
sLanguageId = "MainLine_Select_Btn_Confirm"
},
txtBtnListClose = {
sComponentName = "TMP_Text",
sLanguageId = "ClearFormation"
},
btnOrder = {
sComponentName = "UIButton",
callback = "OnBtnClick_Order"
},
goSortDropdown = {
sCtrlName = "Game.UI.TemplateEx.TemplateDropdownCtrl"
},
imgArrowUpEnable = {},
imgArrowUpDisable = {},
imgArrowDownEnable = {},
imgArrowDownDisable = {}
}
PotentialPreselectionCharListCtrl._mapEventConfig = {
[EventId.FilterConfirm] = "RefreshByFilter",
ForamtionDown = "OnEvent_ForamtionDown",
SelectTemplateDD = "OnEvent_SortRuleChange"
}
PotentialPreselectionCharListCtrl._mapRedDotConfig = {}
function PotentialPreselectionCharListCtrl:ShowList(tbCurSelectChar)
local isDirty = PlayerData.Filter:IsDirty(AllEnum.OptionType.Char)
self._mapNode.imgFilterChoose:SetActive(isDirty)
self.tbOriginChar = clone(tbCurSelectChar)
self.gameObject:SetActive(true)
if self.tbAllChar == nil then
self.tbAllChar = {}
local func_EachChar = function(mapLineData)
if mapLineData.Visible == true and mapLineData.Available == true then
local mapChar = {}
local nCharId = mapLineData.Id
local mapCharData = PlayerData.Char:GetCharDataByTid(nCharId)
local nCharLv = 0
local nCreateTime = 0
local nCharAdvance = 0
local nAffinityLevel = 0
if mapCharData ~= nil then
nCharLv = PlayerData.Char:GetCharLv(nCharId)
nCreateTime = PlayerData.Char:GetCreateTime(nCharId)
nCharAdvance = PlayerData.Char:GetCharAdvance(nCharId)
local mapData = PlayerData.Char:GetCharAffinityData(nCharId)
nAffinityLevel = mapData ~= nil and mapData.Level or 0
end
mapChar.nId = nCharId
mapChar.Name = mapLineData.Name
mapChar.Rare = mapLineData.Grade
mapChar.Class = mapLineData.Class
mapChar.EET = mapLineData.EET
mapChar.Level = nCharLv
mapChar.CreateTime = nCreateTime
mapChar.Advance = nCharAdvance
mapChar.Favorability = nAffinityLevel
table.insert(self.tbAllChar, mapChar)
end
end
ForEachTableLine(DataTable.Character, func_EachChar)
end
self.curChar = tbCurSelectChar
self.tbSortCfg = {
nSortType = PlayerData.Filter.nFormationCharSrotType,
bOrder = PlayerData.Filter.bFormationCharOrder
}
local curSortIdx = 1
local tbSortType = PlayerData.Char:GetCharSortType()
for nIdx, nSortType in ipairs(tbSortType) do
if self.tbSortCfg.nSortType == nSortType then
curSortIdx = nIdx
end
end
self._mapNode.goSortDropdown:SetList(PlayerData.Char:GetCharSortNameTextCfg(), curSortIdx - 1)
self.tbFilterCfg = {}
self:RefreshOrderState()
self:FilterChar()
self:SortChar()
for nInstanceId, mapCtrl in pairs(self.mapGridCtrl) do
self:UnbindCtrlByNode(mapCtrl)
self.mapGridCtrl[nInstanceId] = nil
end
self._mapNode.sv:Init(#self.tbSortedChar, self, self.OnGridRefresh, self.OnGridBtnClick)
self._mapNode.btnConfirm.gameObject:SetActive(true)
self._mapNode.btnCloseList.gameObject:SetActive(true)
end
function PotentialPreselectionCharListCtrl:Refresh()
local isDirty = PlayerData.Filter:IsDirty(AllEnum.OptionType.Char)
self._mapNode.imgFilterChoose:SetActive(isDirty)
self:FilterChar()
self:SortChar()
self:RefreshOrderState()
local nCurCount = #self.tbSortedChar
if 0 < nCurCount then
self._mapNode.labEmpty.gameObject:SetActive(false)
self._mapNode.sv.gameObject:SetActive(true)
self._mapNode.sv:Init(#self.tbSortedChar, self, self.OnGridRefresh, self.OnGridBtnClick)
else
self._mapNode.sv.gameObject:SetActive(false)
self._mapNode.labEmpty.gameObject:SetActive(true)
end
end
function PotentialPreselectionCharListCtrl:CloseList()
self.tbFilterCfg = {}
for nInstanceId, mapCtrl in pairs(self.mapGridCtrl) do
self:UnbindCtrlByNode(mapCtrl)
self.mapGridCtrl[nInstanceId] = nil
end
self.mapGridCtrl = {}
self.gameObject:SetActive(false)
end
function PotentialPreselectionCharListCtrl:OnGridRefresh(goGrid, gridIndex)
local nInstanceId = goGrid:GetInstanceID()
if not self.mapGridCtrl[nInstanceId] then
self.mapGridCtrl[nInstanceId] = self:BindCtrlByNode(goGrid, "Game.UI.PotentialPreselection.PotentialPreselectionCharItemCtrl")
end
local nIndex = gridIndex + 1
local nCharId = self.tbSortedChar[nIndex]
local selectIdx = table.indexof(self.curChar, nCharId)
self.mapGridCtrl[nInstanceId]:RefreshItem(selectIdx, nCharId, self.tbSortCfg.nSortType)
end
function PotentialPreselectionCharListCtrl:OnGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
local nCharId = self.tbSortedChar[nIndex]
local nTeamIdx = table.indexof(self.curChar, nCharId)
if 0 < nTeamIdx then
self.curChar[nTeamIdx] = 0
self:SetGridIndex(nCharId, 0)
for idx, CharId in ipairs(self.curChar) do
self:SetGridIndex(CharId, idx)
end
else
local nPos = table.indexof(self.curChar, 0)
if 0 < nPos then
self.curChar[nPos] = nCharId
for idx, CharId in ipairs(self.curChar) do
self:SetGridIndex(CharId, idx)
end
else
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Formation_FullTeam") or "")
end
end
end
function PotentialPreselectionCharListCtrl:SetGridIndex(nCharId, nIdx)
local nGirdIdx = table.indexof(self.tbSortedChar, nCharId)
local trGrid = self._mapNode.rtCharListContent:Find(tostring(nGirdIdx - 1))
if trGrid ~= nil then
local nInstanceId = trGrid.gameObject:GetInstanceID()
self.mapGridCtrl[nInstanceId]:SetSelect(0 < nIdx, nIdx)
end
end
function PotentialPreselectionCharListCtrl:FilterChar()
self.tbSortedChar = {}
for nId, data in pairs(self.tbAllChar) do
local isFilter = PlayerData.Filter:CheckFilterByChar(data.nId)
local bCur = table.indexof(self.curChar, data.nId) > 0
if isFilter or bCur then
local mapSkill = PlayerData.Char:GetCharSkillUpgradeData(data.nId)
local nSkillLevelSum = 0
for k, v in pairs(mapSkill) do
nSkillLevelSum = nSkillLevelSum + v.nLv
end
data.SkillLevel = nSkillLevelSum
table.insert(self.tbSortedChar, data)
end
end
end
function PotentialPreselectionCharListCtrl:SortChar()
local tbCharId = {}
UTILS.SortByPriority(self.tbSortedChar, {
AllEnum.CharSortField[self.tbSortCfg.nSortType]
}, PlayerData.Char:GetCharSortField(), self.tbSortCfg.bOrder)
self.tbSortedChar = self:MoveElementsToFront(self.tbSortedChar, self.curChar)
for _, mapCharId in ipairs(self.tbSortedChar) do
table.insert(tbCharId, mapCharId.nId)
end
self.tbSortedChar = tbCharId
end
function PotentialPreselectionCharListCtrl:MoveElementsToFront(sortedList, elementsToMove)
local lookup = {}
for _, v in ipairs(elementsToMove) do
lookup[v] = true
end
local moved, rest = {}, {}
for _, v in ipairs(sortedList) do
if lookup[v.nId] then
table.insert(moved, v)
else
table.insert(rest, v)
end
end
for _, v in ipairs(rest) do
table.insert(moved, v)
end
return moved
end
function PotentialPreselectionCharListCtrl:RefreshOrderState()
self._mapNode.imgArrowUpEnable:SetActive(self.tbSortCfg.bOrder)
self._mapNode.imgArrowUpDisable:SetActive(not self.tbSortCfg.bOrder)
self._mapNode.imgArrowDownEnable:SetActive(not self.tbSortCfg.bOrder)
self._mapNode.imgArrowDownDisable:SetActive(self.tbSortCfg.bOrder)
end
function PotentialPreselectionCharListCtrl:RefreshByFilter()
self:Refresh()
end
function PotentialPreselectionCharListCtrl:Awake()
self.mapGridCtrl = {}
local isDirty = PlayerData.Filter:IsDirty(AllEnum.OptionType.Char)
self._mapNode.imgFilterChoose:SetActive(isDirty)
end
function PotentialPreselectionCharListCtrl:OnEnable()
end
function PotentialPreselectionCharListCtrl:OnDisable()
self:CloseList()
end
function PotentialPreselectionCharListCtrl:OnDestroy()
end
function PotentialPreselectionCharListCtrl:OnRelease()
end
function PotentialPreselectionCharListCtrl:OnEvent_ForamtionDown(nIdx)
local nCurCharId = self.curChar[nIdx]
self.curChar[nIdx] = 0
local nGridIdx = table.indexof(self.tbSortedChar, nCurCharId)
local trGrid = self._mapNode.rtCharListContent:Find(tostring(nGridIdx - 1))
if trGrid ~= nil then
local nInstanceId = trGrid.gameObject:GetInstanceID()
self.mapGridCtrl[nInstanceId]:SetSelect(false, nIdx)
end
EventManager.Hit("OnEvent_ChangeTeamModel", self.curChar)
end
function PotentialPreselectionCharListCtrl:OnEvent_SortRuleChange(nValue)
local nV = nValue + 1
self.tbSortCfg.nSortType = PlayerData.Char:GetCharSortType()[nV]
self.tbSortCfg.bOrder = false
PlayerData.Filter:CacheCharSort(self.tbSortCfg.nSortType, self.tbSortCfg.bOrder)
self:Refresh()
end
function PotentialPreselectionCharListCtrl:OnBtnClick_Order(btn)
self.tbSortCfg.bOrder = not self.tbSortCfg.bOrder
PlayerData.Filter:CacheCharSort(self.tbSortCfg.nSortType, self.tbSortCfg.bOrder)
self:Refresh()
end
function PotentialPreselectionCharListCtrl:OnBtnClick_Clear()
for i = 1, 3 do
if self.curChar[i] ~= 0 then
self:SetGridIndex(self.curChar[i], 0)
self.curChar[i] = 0
end
end
end
function PotentialPreselectionCharListCtrl:OnBtnClick_Confirm()
local bFull = true
for _, v in ipairs(self.curChar) do
if v == 0 then
bFull = false
break
end
end
if not bFull then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Potential_Preselection_Char_Not_Full"))
return
end
EventManager.Hit("ClosePreselectionCharList", self.curChar)
end
function PotentialPreselectionCharListCtrl:OnBtnClick_Filter()
local tbOption = {
AllEnum.ChooseOption.Char_Element,
AllEnum.ChooseOption.Char_Rarity,
AllEnum.ChooseOption.Char_PowerStyle,
AllEnum.ChooseOption.Char_TacticalStyle,
AllEnum.ChooseOption.Char_AffiliatedForces
}
EventManager.Hit(EventId.OpenPanel, PanelId.FilterPopupPanel, tbOption)
end
return PotentialPreselectionCharListCtrl