Files
SL1900 eafd8f4088 Update - 1.9.0.107
EN: 1.9.0.107
CN: 1.9.0.108
JP: 1.9.0.112
KR: 1.9.0.112
2026-05-14 16:00:00 +09:00

527 lines
18 KiB
Lua

local MainlineFormationDiscCtrl = class("MainlineFormationDiscCtrl", BaseCtrl)
MainlineFormationDiscCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
rtMainDisc = {
sCtrlName = "Game.UI.MainlineFormationDiscEx.FormationMainDiscCtrl"
},
rtSubDiscSelect = {
sCtrlName = "Game.UI.MainlineFormationDiscEx.FormationSubDiscCtrl"
},
rtSubDisc = {
sCtrlName = "Game.UI.MainlineFormationDiscEx.FormationSubDiscCtrl"
},
discListRoot = {
sCtrlName = "Game.UI.MainlineFormationDiscEx.FormationDisc_ListCtrl"
},
btnOpenList = {
nCount = 2,
sComponentName = "UIButton",
callback = "OnBtnClick_OpenList"
},
rtCur = {},
rtBack = {},
imgMaskSub = {},
imgMaskMain = {},
btnPreviewEffectSub = {
sComponentName = "UIButton",
callback = "OnBtnClick_Preview"
},
texPreviewEffectSub = {
sComponentName = "TMP_Text",
sLanguageId = "MainlineFormationDisc_PreviewEffect"
},
btnFastSwitchSub = {
sComponentName = "UIButton",
callback = "OnBtnClick_SwitchSub"
},
btnFastSwitchMain = {
sComponentName = "UIButton",
callback = "OnBtnClick_SwitchMain"
},
bottomBtnList = {sComponentName = "GameObject"},
btnFastFormation = {
sComponentName = "UIButton",
callback = "OnBtnClick_FastFormation"
},
txtBtnFastFormation = {
sComponentName = "TMP_Text",
sLanguageId = "Auto_Formation"
},
btnStartBattle = {
sComponentName = "UIButton",
callback = "OnBtnClick_Start"
},
txtStartBattle = {
sComponentName = "TMP_Text",
sLanguageId = "Raid_Btn_Raid"
},
btnPreviewEffect = {
sComponentName = "UIButton",
callback = "OnBtnClick_Preview"
},
texPreviewEffect = {
sComponentName = "TMP_Text",
sLanguageId = "MainlineFormationDisc_PreviewEffect"
},
animator = {
sComponentName = "Animator",
sNodeName = "----SafeAreaRoot----"
}
}
MainlineFormationDiscCtrl._mapEventConfig = {
[EventId.UIBackConfirm] = "OnEvent_Back",
[EventId.UIHomeConfirm] = "OnEvent_BackHome",
DiscFormation_GridClick = "OnEvent_DiscFormationGridClick",
ConfirmDiscFormationChoose = "OnEvent_ConfirmDiscFormationChoose",
DiscFormationSwitchCur = "OnEvent_DiscFormationSwitchCur",
DiscFormation_OpenList = "OnEvent_OpenList",
DiscFormation_Detail = "OnEvent_Detail",
Guide_RefreshDiscFormation = "OnEvent_Guide_RefreshDiscFormation",
UploadDiscFormation = "OnEvent_UploadFormation",
[EventId.OpenMessageBox] = "OnEvent_OpenMessageBox"
}
MainlineFormationDiscCtrl._mapRedDotConfig = {}
function MainlineFormationDiscCtrl:Awake()
self._panel._panelType = 1
end
function MainlineFormationDiscCtrl:FadeIn()
end
function MainlineFormationDiscCtrl:FadeOut()
end
function MainlineFormationDiscCtrl:OnEnable()
self.bStartClick = false
self:Refresh()
if self._panel._panelType == 2 then
self:OpenList(self._panel.nListType)
else
self._panel.nListType = 1
self._mapNode.rtMainDisc:SetDiscBtnEnable(true)
end
end
function MainlineFormationDiscCtrl:OnDisable()
if self._panel._panelType == 2 then
self._mapNode.discListRoot:SyncFormation()
end
end
function MainlineFormationDiscCtrl:OnDestroy()
end
function MainlineFormationDiscCtrl:OnRelease()
end
function MainlineFormationDiscCtrl:OnBtnClick_OpenList(btn, nIdx)
if self._panel._panelType == 2 then
return
end
self:OpenList(nIdx)
end
function MainlineFormationDiscCtrl:OnBtnClick_FastFormation()
local isTips = false
for i = 1, 3 do
if self.tbMainDisc[i] ~= 0 or self.tbSubDisc[i] ~= 0 then
isTips = true
end
end
self.tbSortCfg = {
nSortType = AllEnum.SortType.Level,
bOrder = true
}
local auto = function()
local _, tbTeamMemberId = PlayerData.Team:GetTeamData(self._panel.nTeamIndex)
local nCharId = tbTeamMemberId[1]
local charCfgData = DataTable.Character[nCharId]
local eet = charCfgData.EET
local tbSortedDisc = {}
for _, data in pairs(self._mapNode.discListRoot.tbAllDisc) do
local mapCfg = ConfigTable.GetData("Disc", data.nId)
if mapCfg.Available then
data.isEtt = mapCfg.EET == eet
table.insert(tbSortedDisc, data)
end
end
table.sort(tbSortedDisc, function(a, b)
return a.isEtt and not b.isEtt or a.isEtt == b.isEtt and a.nRarity < b.nRarity or a.isEtt == b.isEtt and a.nRarity == b.nRarity and a.nLevel > b.nLevel or a.isEtt == b.isEtt and a.nRarity == b.nRarity and a.nLevel == b.nLevel and a.nId < b.nId
end)
for i = 1, 6 do
if i < 4 then
if tbSortedDisc[i] ~= nil then
self.tbMainDisc[i] = tbSortedDisc[i].nId
end
elseif tbSortedDisc[i] ~= nil and i - 3 <= self.nSubCount then
self.tbSubDisc[i - 3] = tbSortedDisc[i].nId
end
end
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
bPositive = true,
sContent = ConfigTable.GetUIText("Auto_FormationTips")
})
self.mapNoteNeed = {}
for _, nMainDiscId in ipairs(self.tbMainDisc) do
local mapDiscData = PlayerData.Disc:GetDiscById(nMainDiscId)
if mapDiscData ~= nil then
local tbNeedNote = mapDiscData.tbSkillNeedNote
for _, mapNeedNote in ipairs(tbNeedNote) do
if self.mapNoteNeed[mapNeedNote.nId] == nil then
self.mapNoteNeed[mapNeedNote.nId] = 0
end
self.mapNoteNeed[mapNeedNote.nId] = self.mapNoteNeed[mapNeedNote.nId] + mapNeedNote.nCount
end
end
end
self.mapNoteSub = {}
for _, nSubDiscId in ipairs(self.tbSubDisc) do
local mapDiscData = PlayerData.Disc:GetDiscById(nSubDiscId)
if mapDiscData ~= nil then
local tbNeedNote = mapDiscData.tbSubNoteSkills
for _, mapNeedNote in ipairs(tbNeedNote) do
if self.mapNoteSub[mapNeedNote.nId] == nil then
self.mapNoteSub[mapNeedNote.nId] = 0
end
self.mapNoteSub[mapNeedNote.nId] = self.mapNoteSub[mapNeedNote.nId] + mapNeedNote.nCount
end
end
end
self._mapNode.rtMainDisc:Refresh(self.tbMainDisc, self.mapNoteSub)
self._mapNode.rtSubDisc:Refresh(self.tbSubDisc, self.mapNoteNeed, self.nSubCount)
end
if PlayerData.Guide:CheckInGuideGroup(27) then
isTips = false
end
if not isTips then
auto()
self:UploadFormation(self.tbMainDisc, self.tbSubDisc)
else
local confirmCallback = function()
auto()
self:UploadFormation(self.tbMainDisc, self.tbSubDisc)
end
local cancelCallback = function()
end
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = ConfigTable.GetUIText("MainlineFormationDisc_Auto_FormationNotice"),
callbackConfirm = confirmCallback,
callbackCancel = cancelCallback
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
end
function MainlineFormationDiscCtrl:OnBtnClick_Preview()
local tbMain = self.tbTmpMain == nil and self.tbMainDisc or self.tbTmpMain
local tbSub = self.tbTmpSub == nil and self.tbSubDisc or self.tbTmpSub
local tbDisc = {}
for _, v in ipairs(tbMain) do
table.insert(tbDisc, v)
end
for _, v in ipairs(tbSub) do
table.insert(tbDisc, v)
end
local mapDiscData = {}
for _, nDiscId in pairs(tbDisc) do
mapDiscData[nDiscId] = PlayerData.Disc:GetDiscById(nDiscId)
end
if nil == next(mapDiscData) then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("MainlineFormationDisc_None"))
else
EventManager.Hit(EventId.OpenPanel, PanelId.DiscSkill, tbDisc, self.mapNoteNeed, mapDiscData)
end
end
function MainlineFormationDiscCtrl:OnBtnClick_Start()
if self.bStartClick == true then
return
end
for i = 1, 3 do
if self.tbMainDisc[i] and self.tbMainDisc[i] == 0 then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("MainlineFormationDisc_NotEnough"))
return
end
end
self.bStartClick = true
if self._panel.bSweep then
PlayerData.StarTower:EnterTowerFastBattle(self._panel.curRoguelikeId, self._panel.nTeamIndex)
else
PlayerData.StarTower:EnterTower(self._panel.curRoguelikeId, self._panel.nTeamIndex, self.selectDiscIdList)
end
end
function MainlineFormationDiscCtrl:Refresh()
self.nSubCount = PlayerData.StarTower:GetDiscFormationSubSlot()
local tmpDisc = PlayerData.Team:GetTeamDiscData(self._panel.nTeamIndex)
self.tbMainDisc = {
tmpDisc[1] == nil and 0 or tmpDisc[1],
tmpDisc[2] == nil and 0 or tmpDisc[2],
tmpDisc[3] == nil and 0 or tmpDisc[3]
}
self.tbSubDisc = {
tmpDisc[4] == nil and 0 or tmpDisc[4],
tmpDisc[5] == nil and 0 or tmpDisc[5],
tmpDisc[6] == nil and 0 or tmpDisc[6]
}
self.mapNoteNeed = {}
for _, nMainDiscId in ipairs(self.tbMainDisc) do
local mapDiscData = PlayerData.Disc:GetDiscById(nMainDiscId)
if mapDiscData ~= nil then
local tbNeedNote = mapDiscData.tbSkillNeedNote
for _, mapNeedNote in ipairs(tbNeedNote) do
if self.mapNoteNeed[mapNeedNote.nId] == nil then
self.mapNoteNeed[mapNeedNote.nId] = 0
end
self.mapNoteNeed[mapNeedNote.nId] = self.mapNoteNeed[mapNeedNote.nId] + mapNeedNote.nCount
end
end
end
self.mapNoteSub = {}
for _, nSubDiscId in ipairs(self.tbSubDisc) do
local mapDiscData = PlayerData.Disc:GetDiscById(nSubDiscId)
if mapDiscData ~= nil then
local tbNeedNote = mapDiscData.tbSubNoteSkills
for _, mapNeedNote in ipairs(tbNeedNote) do
if self.mapNoteSub[mapNeedNote.nId] == nil then
self.mapNoteSub[mapNeedNote.nId] = 0
end
self.mapNoteSub[mapNeedNote.nId] = self.mapNoteSub[mapNeedNote.nId] + mapNeedNote.nCount
end
end
end
self._mapNode.rtMainDisc:Refresh(self.tbMainDisc, self.mapNoteSub)
self._mapNode.rtSubDisc:Refresh(self.tbSubDisc, self.mapNoteNeed, self.nSubCount)
self._mapNode.rtMainDisc:SetTitle(false)
self._mapNode.rtSubDisc:SetTitle(false)
self._mapNode.rtSubDiscSelect.gameObject:SetActive(false)
self._mapNode.btnFastSwitchMain.gameObject:SetActive(false)
self._mapNode.btnFastSwitchSub.gameObject:SetActive(false)
self._mapNode.imgMaskMain:SetActive(false)
self._mapNode.imgMaskSub:SetActive(true)
self._mapNode.rtMainDisc.gameObject.transform:SetParent(self._mapNode.rtCur.transform)
self._mapNode.rtSubDiscSelect.gameObject.transform:SetParent(self._mapNode.rtBack.transform)
end
function MainlineFormationDiscCtrl:OpenList(nType)
self._mapNode.rtSubDiscSelect.gameObject:SetActive(true)
self._mapNode.discListRoot:OpenList(nType, self.tbMainDisc, self.tbSubDisc, self.nSubCount)
self._mapNode.rtSubDiscSelect:Refresh(self.tbSubDisc, self.mapNoteNeed, self.nSubCount)
if nType == 1 then
self._mapNode.imgMaskMain:SetActive(false)
self._mapNode.imgMaskSub:SetActive(true)
self._mapNode.rtMainDisc.gameObject.transform:SetParent(self._mapNode.rtCur.transform)
self._mapNode.rtSubDiscSelect.gameObject.transform:SetParent(self._mapNode.rtBack.transform)
self._mapNode.rtMainDisc:SetTitle(true)
self._mapNode.rtSubDiscSelect:SetTitle(false)
self._mapNode.btnFastSwitchMain.gameObject:SetActive(false)
self._mapNode.btnFastSwitchSub.gameObject:SetActive(true)
else
self._mapNode.imgMaskMain:SetActive(true)
self._mapNode.imgMaskSub:SetActive(false)
self._mapNode.rtSubDiscSelect.gameObject.transform:SetParent(self._mapNode.rtCur.transform)
self._mapNode.rtMainDisc.gameObject.transform:SetParent(self._mapNode.rtBack.transform)
self._mapNode.rtMainDisc:SetTitle(false)
self._mapNode.rtSubDiscSelect:SetTitle(true)
self._mapNode.btnFastSwitchMain.gameObject:SetActive(true)
self._mapNode.btnFastSwitchSub.gameObject:SetActive(false)
end
self._panel._panelType = 2
self._mapNode.animator:Play("distItem_in")
self._mapNode.rtMainDisc:PlayAnim(true)
self._mapNode.rtMainDisc:SetDiscBtnEnable(false)
self._mapNode.rtSubDiscSelect:PlayAnim(true)
end
function MainlineFormationDiscCtrl:CloseList()
self.mapNoteNeed = {}
for _, nMainDiscId in ipairs(self.tbMainDisc) do
local mapDiscData = PlayerData.Disc:GetDiscById(nMainDiscId)
if mapDiscData ~= nil then
local tbNeedNote = mapDiscData.tbSkillNeedNote
for _, mapNeedNote in ipairs(tbNeedNote) do
if self.mapNoteNeed[mapNeedNote.nId] == nil then
self.mapNoteNeed[mapNeedNote.nId] = 0
end
self.mapNoteNeed[mapNeedNote.nId] = self.mapNoteNeed[mapNeedNote.nId] + mapNeedNote.nCount
end
end
end
self.mapNoteSub = {}
for _, nSubDiscId in ipairs(self.tbSubDisc) do
local mapDiscData = PlayerData.Disc:GetDiscById(nSubDiscId)
if mapDiscData ~= nil then
local tbNeedNote = mapDiscData.tbSubNoteSkills
for _, mapNeedNote in ipairs(tbNeedNote) do
if self.mapNoteSub[mapNeedNote.nId] == nil then
self.mapNoteSub[mapNeedNote.nId] = 0
end
self.mapNoteSub[mapNeedNote.nId] = self.mapNoteSub[mapNeedNote.nId] + mapNeedNote.nCount
end
end
end
self._mapNode.rtMainDisc:Refresh(self.tbMainDisc, self.mapNoteSub)
self._mapNode.rtSubDisc:Refresh(self.tbSubDisc, self.mapNoteNeed, self.nSubCount)
self._mapNode.rtMainDisc:SetTitle(false)
self._mapNode.rtSubDisc:SetTitle(false)
self._mapNode.imgMaskMain:SetActive(false)
self._mapNode.imgMaskSub:SetActive(true)
self._mapNode.rtMainDisc.gameObject.transform:SetParent(self._mapNode.rtCur.transform)
self._mapNode.rtSubDiscSelect.gameObject.transform:SetParent(self._mapNode.rtBack.transform)
self._panel._panelType = 1
self._mapNode.animator:Play("distItem_out")
self._mapNode.rtMainDisc:PlayAnim(false)
self._mapNode.rtSubDiscSelect:PlayAnim(false)
self._mapNode.rtMainDisc:SetDiscBtnEnable(true)
self._mapNode.btnFastSwitchMain.gameObject:SetActive(false)
self._mapNode.btnFastSwitchSub.gameObject:SetActive(false)
self.tbTmpMain = nil
self.tbTmpSub = nil
end
function MainlineFormationDiscCtrl:UploadFormation(tbMainDisc, tbSubDisc, callback)
local tbTeamMemberId = PlayerData.Team:GetTeamCharId(self._panel.nTeamIndex)
local tbBeforeDiscId = PlayerData.Team:GetTeamDiscData(self._panel.nTeamIndex)
local tbDisc = {}
for i = 1, 3 do
table.insert(tbDisc, tbMainDisc[i] == nil and 0 or tbMainDisc[i])
end
for i = 1, 3 do
table.insert(tbDisc, tbSubDisc[i] == nil and 0 or tbSubDisc[i])
end
local bChange = false
for i = 1, 6 do
if tbBeforeDiscId[i] ~= tbDisc[i] then
bChange = true
break
end
end
if not bChange then
return
end
local Callback = function()
if callback ~= nil then
callback()
end
self.tbMainDisc = clone(tbMainDisc)
self.tbSubDisc = clone(tbSubDisc)
end
local nPreselectionId = PlayerData.Team:GetTeamPreselectionId(self._panel.nTeamIndex)
PlayerData.Team:UpdateFormationInfo(self._panel.nTeamIndex, tbTeamMemberId, tbDisc, nPreselectionId, Callback)
end
function MainlineFormationDiscCtrl:OnBtnClick_SwitchMain()
self._mapNode.discListRoot:OnBtnClick_Switch1()
self._mapNode.btnFastSwitchMain.gameObject:SetActive(false)
self._mapNode.btnFastSwitchSub.gameObject:SetActive(true)
end
function MainlineFormationDiscCtrl:OnBtnClick_SwitchSub()
self._mapNode.discListRoot:OnBtnClick_Switch2()
self._mapNode.btnFastSwitchMain.gameObject:SetActive(true)
self._mapNode.btnFastSwitchSub.gameObject:SetActive(false)
end
function MainlineFormationDiscCtrl:OnEvent_Back(nPanelId)
if self._panel._nPanelId ~= nPanelId then
return
end
if self._panel._panelType == 1 then
EventManager.Hit(EventId.CloesCurPanel)
elseif self._panel._panelType == 2 then
self._mapNode.discListRoot:CloseList()
end
end
function MainlineFormationDiscCtrl:OnEvent_BackHome(nPanelId)
if self._panel._nPanelId ~= nPanelId then
return
end
PanelManager.Home()
end
function MainlineFormationDiscCtrl:OnEvent_DiscFormationGridClick(tbMainDisc, tbSubDisc)
local mapNoteNeed = {}
for _, nMainDiscId in ipairs(tbMainDisc) do
local mapDiscData = PlayerData.Disc:GetDiscById(nMainDiscId)
if mapDiscData ~= nil then
local tbNeedNote = mapDiscData.tbSkillNeedNote
for _, mapNeedNote in ipairs(tbNeedNote) do
if mapNoteNeed[mapNeedNote.nId] == nil then
mapNoteNeed[mapNeedNote.nId] = 0
end
mapNoteNeed[mapNeedNote.nId] = mapNoteNeed[mapNeedNote.nId] + mapNeedNote.nCount
end
end
end
local mapNoteSub = {}
for _, nSubDiscId in ipairs(tbSubDisc) do
local mapDiscData = PlayerData.Disc:GetDiscById(nSubDiscId)
if mapDiscData ~= nil then
local tbNeedNote = mapDiscData.tbSubNoteSkills
for _, mapNeedNote in ipairs(tbNeedNote) do
if mapNoteSub[mapNeedNote.nId] == nil then
mapNoteSub[mapNeedNote.nId] = 0
end
mapNoteSub[mapNeedNote.nId] = mapNoteSub[mapNeedNote.nId] + mapNeedNote.nCount
end
end
end
self.tbTmpMain = tbMainDisc
self.tbTmpSub = tbSubDisc
self._mapNode.rtMainDisc:Refresh(tbMainDisc, mapNoteSub)
self._mapNode.rtSubDiscSelect:Refresh(tbSubDisc, mapNoteNeed, self.nSubCount)
end
function MainlineFormationDiscCtrl:OnEvent_ConfirmDiscFormationChoose(bChange, tbMainDisc, tbSubDisc)
if bChange then
local Callback = function()
self.tbMainDisc = tbMainDisc
self.tbSubDisc = tbSubDisc
self:CloseList()
end
self:UploadFormation(tbMainDisc, tbSubDisc, Callback)
else
self:CloseList()
end
end
function MainlineFormationDiscCtrl:OnEvent_DiscFormationSwitchCur(nType)
if nType == 1 then
self._mapNode.imgMaskMain:SetActive(false)
self._mapNode.imgMaskSub:SetActive(true)
self._mapNode.rtMainDisc.gameObject.transform:SetParent(self._mapNode.rtCur.transform)
self._mapNode.rtSubDiscSelect.gameObject.transform:SetParent(self._mapNode.rtBack.transform)
self._mapNode.rtMainDisc:SetTitle(true)
self._mapNode.rtSubDiscSelect:SetTitle(false)
self._mapNode.btnFastSwitchMain.gameObject:SetActive(false)
self._mapNode.btnFastSwitchSub.gameObject:SetActive(true)
else
self._mapNode.imgMaskMain:SetActive(true)
self._mapNode.imgMaskSub:SetActive(false)
self._mapNode.rtSubDiscSelect.gameObject.transform:SetParent(self._mapNode.rtCur.transform)
self._mapNode.rtMainDisc.gameObject.transform:SetParent(self._mapNode.rtBack.transform)
self._mapNode.rtMainDisc:SetTitle(false)
self._mapNode.rtSubDiscSelect:SetTitle(true)
self._mapNode.btnFastSwitchMain.gameObject:SetActive(true)
self._mapNode.btnFastSwitchSub.gameObject:SetActive(false)
end
end
function MainlineFormationDiscCtrl:OnEvent_OpenList(nType)
if self._panel._panelType == 2 then
return
end
self:OpenList(nType)
end
function MainlineFormationDiscCtrl:OnEvent_Detail(nSelectId)
local tbAllDisc = {}
for _, nId in ipairs(self.tbMainDisc) do
if 0 < nId then
table.insert(tbAllDisc, nId)
end
end
for _, nId in ipairs(self.tbSubDisc) do
if 0 < nId then
table.insert(tbAllDisc, nId)
end
end
if table.indexof(tbAllDisc, nSelectId) < 1 then
table.insert(tbAllDisc, nSelectId)
end
EventManager.Hit(EventId.OpenPanel, PanelId.Disc, nSelectId, tbAllDisc)
end
function MainlineFormationDiscCtrl:OnEvent_Guide_RefreshDiscFormation()
self:Refresh()
end
function MainlineFormationDiscCtrl:OnEvent_UploadFormation(tbMainDisc, tbSubDisc)
self:UploadFormation(tbMainDisc, tbSubDisc, nil)
end
function MainlineFormationDiscCtrl:OnEvent_OpenMessageBox()
self.bStartClick = false
end
return MainlineFormationDiscCtrl