Files
StellaSora_DataLua/lua/game/ui/formationex/formationctrl.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

976 lines
33 KiB
Lua

local FormationCtrl = class("FormationCtrl", BaseCtrl)
local Animator = CS.UnityEngine.Animator
local CustomModelMaterialVariantComponent = CS.CustomModelMaterialVariantComponent
local GameCameraStackManager = CS.GameCameraStackManager
local GameResourceLoader = require("Game.Common.Resource.GameResourceLoader")
local ResType = GameResourceLoader.ResType
local typeof = typeof
FormationCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
goChar = {
nCount = 3,
sCtrlName = "Game.UI.FormationEx.FormationCharCtrl"
},
btnLeft = {
sComponentName = "UIButton",
callback = "OnBtnClick_Left"
},
btnRight = {
sComponentName = "UIButton",
callback = "OnBtnClick_Right"
},
txtTeamNane = {sComponentName = "TMP_Text"},
btnRename = {
sComponentName = "UIButton",
callback = "OnBtnClick_Rename"
},
goPoint = {nCount = 6},
Mask = {},
btnStartBattle = {
sComponentName = "UIButton",
callback = "OnBtnClick_Start"
},
txtStartBattle = {
sComponentName = "TMP_Text",
sLanguageId = "Mainline_Formation_Go"
},
TMPHintTrial = {
sComponentName = "TMP_Text",
sLanguageId = "Formation_Trial_Hint"
},
UIParallax3DStage = {
sComponentName = "UIParallaxStageCameraController"
},
BGbackup = {
sNodeName = "----BGbackup----"
},
CharList = {
sNodeName = "--CharList--",
sCtrlName = "Game.UI.FormationEx.FormationCharListCtrl"
},
btnFastFormation = {
sComponentName = "UIButton",
callback = "OnBtnClick_FastFormation"
},
rt_TeamName = {},
rt_TeamNameAlpha = {
sNodeName = "rt_TeamName",
sComponentName = "CanvasGroup"
},
t_arrow_01 = {},
SwapCharPanel = {
sCtrlName = "Game.UI.FormationEx.SwapCharCtrl"
},
charCanvasGroup = {
sNodeName = "----Char----",
sComponentName = "CanvasGroup"
},
txtBtnFastFormation = {
sComponentName = "TMP_Text",
sLanguageId = "Auto_Formation"
},
goLoadMask = {},
SwapBlock = {},
rtThemePrevRoot = {},
rtSlectedChar = {
sComponentName = "RectTransform"
},
goPreselection = {},
btnPreselection = {
sComponentName = "UIButton",
callback = "OnBtnClick_Preselection"
},
txtBtnPreselection = {
sComponentName = "TMP_Text",
sLanguageId = "Build_Preselection_Btn"
},
imgPreSelected = {sComponentName = "Button"},
txtPreSelect = {sComponentName = "TMP_Text"},
btnPreDetail = {
sComponentName = "UIButton",
callback = "OnBtnClick_PreDetail"
},
imgBgDetail = {}
}
FormationCtrl._mapEventConfig = {
[EventId.FormationLoadModel] = "OnEvent_LoadModel",
OnEvent_SelectRefresh = "Refresh",
OnEvent_OpenSelectTeamMemberList = "OnEvent_OpenSelectTeamMemberList",
OnEvent_OpenSwapTeamMember = "OnEvent_OpenSwapChar",
[EventId.UIBackConfirm] = "OnEvent_Back",
[EventId.UIHomeConfirm] = "OnEvent_BackHome",
OnEvent_CloseTeamList = "OnEvent_CloseList",
OnEvent_ChangeTeamModel = "OnEvent_ChangeTeamModel"
}
function FormationCtrl:Refresh(nDirection)
NovaAPI.SetTMPText(self._mapNode.txtTeamNane, orderedFormat(ConfigTable.GetUIText("Formation_DefaultName"), self._panel.nTeamIndex))
local _, tbTeamMemberId
if not self.bTrialLevel then
_, tbTeamMemberId = PlayerData.Team:GetTeamData(self._panel.nTeamIndex)
self.nPreselectionId = PlayerData.Team:GetTeamPreselectionId(self._panel.nTeamIndex)
self.curTeam = {}
for _, value in ipairs(tbTeamMemberId) do
table.insert(self.curTeam, value)
end
self:RefreshPoint(self._panel.nTeamIndex)
else
local mapSelectedMainlineId = PlayerData.Mainline._nSelectId
local mapMainline = ConfigTable.GetData_Mainline(mapSelectedMainlineId)
self.curTeam = mapMainline.TrialCharacter
end
self:RefreshChar(nDirection)
self:RefreshPreselection()
end
function FormationCtrl:RefreshPoint(nIndex)
for i = 1, 6 do
self._mapNode.goPoint[i].transform:Find("imgOn").gameObject:SetActive(i == nIndex)
self._mapNode.goPoint[i].transform:Find("imgOff").gameObject:SetActive(i ~= nIndex)
end
end
function FormationCtrl:RefreshChar(nDirection)
for i = 1, 3 do
if self.curTeam[i] == nil then
self.curTeam[i] = 0
end
self._mapNode.goChar[i]:OnRender(self.curTeam, i, self.bTrialLevel, nDirection)
if self.curTeam[i] ~= 0 then
if self.mapCurModel[i] == nil or self.mapCurModel[i].nCharId ~= self.curTeam[i] then
self:LoadCharacter(self.curTeam[i], self.bOpen or nDirection ~= nil)
end
elseif self.mapCurModel[i] ~= nil then
NovaAPI.UnbindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, i - 1)
destroy(self.mapCurModel[i].model)
self.mapCurModel[i] = nil
end
end
end
function FormationCtrl:CheckBannedChar(bIsAwake)
local bHasBannedChar = false
local tbBannedChar = PlayerData.Mainline:GetBanedCharId()
local _, tbTeamMemberId = PlayerData.Team:GetTeamData(self._panel.nTeamIndex)
local sBannedChar = ""
if tbBannedChar ~= nil then
for _, nCharID in ipairs(tbTeamMemberId) do
if table.indexof(tbBannedChar, nCharID) > 0 then
bHasBannedChar = true
local mapChar = ConfigTable.GetData_Character(nCharID)
local sCharName = mapChar.Name
sBannedChar = sBannedChar .. string.format(" %s", sCharName)
end
end
end
if bHasBannedChar then
local sHint = orderedFormat(ConfigTable.GetUIText("SelectTeam_HasBannedChar"), sBannedChar)
if bIsAwake then
local callBack = function()
EventManager.Hit("OnEvent_OpenSelectTeamMemberNode")
end
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Alert,
sContent = sHint,
callbackConfirm = callBack
})
else
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Alert,
sContent = sHint
})
end
end
return bHasBannedChar
end
function FormationCtrl:EnterMainline()
PlayerData.Mainline.nCurTeamIndex = self._panel.nTeamIndex
if self:CheckBannedChar(false) then
self._mapNode.btnStartBattle.enabled = true
return
end
if not self.bTrialLevel and PlayerData.Team:CheckTeamValid(self._panel.nTeamIndex) == false then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("FRFORMATION_02"))
self._mapNode.btnStartBattle.enabled = true
return
end
local CheckItemCountExceededLimitCb = function(isExceeded)
if not isExceeded then
EventManager.Hit(EventId.SendMsgEnterBattle, self._panel.nTeamIndex)
end
end
PlayerData.Item:CheckItemCountExceededLimit(CheckItemCountExceededLimitCb)
end
function FormationCtrl:EnterStarTower()
local nTeamIdx = self._panel.nTeamIndex
local EnterDiscSelect = function()
local teamIDs = {}
local _, tbTeamMemberId = PlayerData.Team:GetTeamData(nTeamIdx)
for i = 1, #tbTeamMemberId do
if tbTeamMemberId[i] ~= nil and 0 < tbTeamMemberId[i] then
table.insert(teamIDs, tbTeamMemberId[i])
end
end
if #teamIDs == 3 then
EventManager.Hit(EventId.OpenPanel, PanelId.MainlineFormationDisc, self.curRoguelikeId, self._panel.nTeamIndex, self.bSweep, self.nPreselectionId)
self:SetLocalData()
else
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("FRFORMATION_01"))
self._mapNode.btnStartBattle.enabled = true
end
end
local CheckBuildCountCallBack = function(nBuildCount)
local nMaxBuildCount = ConfigTable.GetConfigNumber("StarTowerBuildNumberMax")
if nBuildCount >= nMaxBuildCount then
local confirmCallback = function()
EventManager.Hit(EventId.OpenPanel, PanelId.StarTowerBuildBriefList)
self._mapNode.btnStartBattle.enabled = true
end
local cancelCallback = function()
EnterDiscSelect()
end
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = ConfigTable.GetUIText("BUILD_04"),
sConfirm = ConfigTable.GetUIText("RoguelikeBuild_BuildCount_BtnManage"),
sCancel = ConfigTable.GetUIText("RoguelikeBuild_BuildCount_BtnCancle"),
callbackConfirm = confirmCallback,
callbackCancel = cancelCallback
}
EventManager.Hit(EventId.OpenMessageBox, msg)
return
else
EnterDiscSelect()
end
end
PlayerData.Build:GetBuildCount(CheckBuildCountCallBack)
end
function FormationCtrl:RefreshPreselection()
local callback = function()
if self.nPreselectionId == 0 then
NovaAPI.SetTMPText(self._mapNode.txtPreSelect, ConfigTable.GetUIText("Build_Preselection_Empty"))
self._mapNode.imgPreSelected.interactable = true
self._mapNode.imgBgDetail.gameObject:SetActive(false)
else
self._mapNode.imgBgDetail.gameObject:SetActive(true)
local bDiff = false
local mapPreselection = PlayerData.PotentialPreselection:GetPreselectionById(self.nPreselectionId)
if mapPreselection ~= nil then
for k, v in ipairs(mapPreselection.tbCharPotential) do
if k == 1 then
if v.nCharId ~= self.curTeam[1] then
bDiff = true
break
end
elseif table.indexof(self.curTeam, v.nCharId) == 0 then
bDiff = true
break
end
end
end
if bDiff then
NovaAPI.SetTMPText(self._mapNode.txtPreSelect, ConfigTable.GetUIText("Build_Preselection_CharDiff"))
self._mapNode.imgPreSelected.interactable = false
else
NovaAPI.SetTMPText(self._mapNode.txtPreSelect, ConfigTable.GetUIText("Build_Preselection_Selected"))
self._mapNode.imgPreSelected.interactable = true
end
end
end
PlayerData.PotentialPreselection:SendGetPreselectionList(callback)
end
function FormationCtrl:Awake()
self.isOpenTeamMember = false
self:CheckBannedChar(true)
self._panel.nLoadProcess = 0
end
function FormationCtrl:OnEnable()
self.nPreselectionId = 0
local mapSelectedMainlineId = PlayerData.Mainline._nSelectId
self._mapNode.goLoadMask:SetActive(true)
self._Animator = self.gameObject:GetComponent("Animator")
self.bTrialLevel = false
local tbParam = self:GetPanelParam()
self.nFRType = tbParam[1] or AllEnum.FormationEnterType.MainLine
self.curRoguelikeId = tbParam[2]
self.bSweep = tbParam[4]
self._mapNode.btnStartBattle.enabled = true
if self.nFRType == AllEnum.FormationEnterType.MainLine then
local mapMainline = ConfigTable.GetData_Mainline(mapSelectedMainlineId)
local tbTeamMemberId, nCaptain
if mapMainline.TrialCharacter ~= nil and 0 < #mapMainline.TrialCharacter then
tbTeamMemberId = mapMainline.TrialCharacter
self.mapTrialChar = PlayerData.Char:CreateTrialChar(tbTeamMemberId)
self.bTrialLevel = true
end
elseif self.nFRType == AllEnum.FormationEnterType.StarTower then
local mapStartowerCfg = ConfigTable.GetData("StarTower", self.curRoguelikeId)
if mapStartowerCfg ~= nil then
local nCachedIdx = PlayerData.StarTower:GetGroupFormation(mapStartowerCfg.GroupId)
if 0 < nCachedIdx and self._panel.nTeamIndex == nil then
self._panel.nTeamIndex = nCachedIdx
end
end
end
local LocalData = require("GameCore.Data.LocalData")
if self._panel.nTeamIndex == nil then
local nIdx = tonumber(LocalData.GetPlayerLocalData("SavedTeamIdx"))
if nIdx == nil then
nIdx = 1
end
self._panel.nTeamIndex = nIdx
end
self._mapNode.btnLeft.gameObject:SetActive(not self.bTrialLevel)
self._mapNode.btnRight.gameObject:SetActive(not self.bTrialLevel)
self._mapNode.btnFastFormation.gameObject:SetActive(not self.bTrialLevel)
self._mapNode.rt_TeamName.gameObject:SetActive(not self.bTrialLevel)
self._mapNode.TMPHintTrial.gameObject:SetActive(self.bTrialLevel)
self._mapNode.goPreselection.gameObject:SetActive(not self.bTrialLevel)
self._mapNode.t_arrow_01:SetActive(not self.bTrialLevel)
local sSceneName = self.nFRType ~= AllEnum.FormationEnterType.MainLine and ConfigTable.GetConfigValue("SelectRole_Rogue") or ConfigTable.GetConfigValue("SelectRole_Main")
self.mapCurModel = {}
local callbak = function(bSuccess)
self.bOpen = true
if bSuccess == true then
local sceneRoot = CS.MainMenuModuleHelper.GetMainMenuSceneRoot(sSceneName)
self.rtSceneOriginPos = sceneRoot.transform:Find("==== Scene ====")
self.goSelectRolePrefab = self:CreatePrefabInstance("UI/MainlineFormationEx/SelectRolePrefab.prefab", self.rtSceneOriginPos)
local goSelectRoleCam = self.goSelectRolePrefab.transform:Find("Camera"):GetComponent("Camera")
NovaAPI.SetupUIParallaxStageCameraControllerForModelView(self._mapNode.UIParallax3DStage, goSelectRoleCam)
self:Refresh()
if self.curTeam[1] ~= 0 then
PlayerData.Voice:PlayCharVoice("swap", self.curTeam[1])
end
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self._mapNode.goLoadMask:SetActive(false)
if PlayerData.Guide:GetGuideState() then
EventManager.Hit("Guide_LoadFormationSuccess")
end
end
cs_coroutine.start(wait)
else
self._mapNode.goLoadMask:SetActive(false)
self._mapNode.UIParallax3DStage.gameObject:SetActive(false)
self._mapNode.BGbackup:SetActive(true)
end
if tbParam[3] and self.nFRType ~= AllEnum.FormationEnterType.MainLine then
self._mapNode.goLoadMask:SetActive(false)
else
EventManager.Hit(EventId.SetTransition)
end
for i = 1, 3 do
self._mapNode.goChar[i]:OpenList(false)
self._mapNode.goChar[i]:SetSelectedChar(self._mapNode.rtSlectedChar)
end
self._mapNode.btnStartBattle.transform.localScale = Vector3.one
self.bOpen = false
if self._panel.bList then
self:OnEvent_OpenSelectTeamMemberList()
end
end
CS.MainMenuModuleHelper.GetActiveScene(sSceneName, callbak)
self.bOpenTransition = false
end
function FormationCtrl:OnDisable()
if self._panel.bList then
self._mapNode.CharList:SyncFormation()
end
local sSceneName = self.nFRType ~= AllEnum.FormationEnterType.MainLine and ConfigTable.GetConfigValue("SelectRole_Rogue") or ConfigTable.GetConfigValue("SelectRole_Main")
local callback1 = function()
EventManager.Hit(EventId.SetTransition)
end
local callback2 = function()
end
CS.MainMenuModuleHelper.DeActiveScene(sSceneName, self.bOpenTransition == true and callback1 or callback2)
for i, mapModel in pairs(self.mapCurModel) do
if mapModel.model ~= nil then
NovaAPI.UnbindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, i - 1)
destroy(mapModel.model)
end
end
for i = 1, 3 do
self._mapNode.goChar[i].nCharId = nil
end
if self.goSelectRolePrefab ~= nil then
destroy(self.goSelectRolePrefab)
end
self.mapCurModel = {}
end
function FormationCtrl:OnDestroy()
end
function FormationCtrl:LoadCharacter(nCharId, bOpen)
local mapSkin
if self.bTrialLevel and self.mapTrialChar ~= nil then
local nSkinId = self.mapTrialChar[nCharId].nSkinId
mapSkin = ConfigTable.GetData_CharacterSkin(nSkinId)
else
mapSkin = ConfigTable.GetData_CharacterSkin(PlayerData.Char:GetCharSkinId(nCharId))
end
if not mapSkin then
printLog("没有找到皮肤配置" .. nCharId)
return
end
local sFullPath = string.format("%s.prefab", mapSkin.Model_Show)
local LoadModelCallback = function(obj)
if self._mapNode == nil then
return
end
self._panel.nLoadProcess = self._panel.nLoadProcess - 1
local idx = table.indexof(self.curTeam, nCharId)
if 0 < idx then
if self.mapCurModel[idx] ~= nil then
NovaAPI.UnbindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, idx - 1)
destroy(self.mapCurModel[idx].model)
self.mapCurModel[idx] = nil
end
local go = instantiate(obj, self.rtSceneOriginPos)
NovaAPI.ChangeAnimatorDefaultState(go.transform)
self.mapCurModel[idx] = {nCharId = nCharId, model = go}
NovaAPI.BindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, idx - 1, go)
if self.rtSceneOriginPos ~= nil then
go.transform.position = self.rtSceneOriginPos.position
go.transform.localEulerAngles = Vector3(0, 180, 0)
go.transform.localScale = Vector3.one * (mapSkin.ModelShowScale / 10000)
local animator = go:GetComponent(typeof(Animator))
if animator ~= nil and animator:IsNull() == false then
animator:SetBool("standby", true)
end
GameUIUtils.SetCustomModelMaterialVariant(go, CS.CustomModelMaterialVariantComponent.VariantNames.FormationView)
end
if not bOpen then
self._mapNode.goChar[idx]:PlayChangeFx()
end
if PlayerData.Guide:GetGuideState() then
EventManager.Hit("Guide_LoadCharacterSuccess")
end
end
end
self._panel.nLoadProcess = self._panel.nLoadProcess + 1
self:LoadAssetAsync(sFullPath, typeof(GameObject), LoadModelCallback)
end
function FormationCtrl:SetModelPos(nCharId, objModel, nPos)
local mapSkin = ConfigTable.GetData_CharacterSkin(PlayerData.Char:GetCharSkinId(nCharId))
if not mapSkin then
printLog("没有找到皮肤配置" .. nCharId)
return
end
if self.mapCurModel[nPos] ~= nil then
NovaAPI.UnbindUIParallaxStageCameraControllerModel(self._mapNode.UIParallax3DStage, nPos - 1)
destroy(self.mapCurModel[nPos].model)
self.mapCurModel[nPos] = nil
end
self.mapCurModel[nPos] = {nCharId = nCharId, model = objModel}
if self.rtSceneOriginPos ~= nil then
objModel.transform.position = self.rtSceneOriginPos.position
objModel.transform.localScale = Vector3.one * (mapSkin.ModelShowScale / 10000)
local animator = objModel:GetComponent(typeof(Animator))
if animator ~= nil then
animator:SetBool("standby", true)
end
local matVariantComp = objModel:GetComponent(typeof(CustomModelMaterialVariantComponent))
if matVariantComp ~= nil then
matVariantComp:SetVariant(CS.CustomModelMaterialVariantComponent.VariantNames.FormationView)
end
end
end
function FormationCtrl:CheckFormationChanged()
local bChange = false
local nTeamIndex = self._panel.nTeamIndex
local _, teamMemberid = PlayerData.Team:GetTeamData(nTeamIndex)
for i = 1, #teamMemberid do
if teamMemberid[i] ~= self.curTeam[i] then
return true
end
end
return bChange
end
function FormationCtrl.filterUnfinish(tbAllChar)
local tbAvailable = {}
for _, mapChar in ipairs(tbAllChar) do
local mapCharCfgData = ConfigTable.GetData_Character(mapChar.nId)
if mapCharCfgData.Available then
table.insert(tbAvailable, mapChar)
end
end
return tbAvailable
end
function FormationCtrl.filterLevel(tbAllChar, tbSelectedChar, nLevel)
local retLevel = {}
for _, mapChar in ipairs(tbAllChar) do
if nLevel <= mapChar.nLevel and table.indexof(tbSelectedChar, mapChar.nId) < 1 then
table.insert(retLevel, mapChar)
end
end
return retLevel
end
function FormationCtrl.filterEET(tbAllChar, tbSelectedChar, tbEET)
local retEET = {}
for _, mapChar in ipairs(tbAllChar) do
local mapCharCfgData = ConfigTable.GetData_Character(mapChar.nId)
if table.indexof(tbEET, mapCharCfgData.EET) >= 1 and table.indexof(tbSelectedChar, mapChar.nId) < 1 then
table.insert(retEET, mapChar)
end
end
return retEET
end
function FormationCtrl.filterEETNotrecommend(tbAllChar, tbSelectedChar, tbEET)
local retEET = {}
for _, mapChar in ipairs(tbAllChar) do
local mapCharCfgData = ConfigTable.GetData_Character(mapChar.nId)
if table.indexof(tbEET, mapCharCfgData.EET) < 1 and table.indexof(tbSelectedChar, mapChar.nId) < 1 then
table.insert(retEET, mapChar)
end
end
return retEET
end
function FormationCtrl.filterMain(tbAllChar, tbSelectedChar)
local tbMain = {}
for _, mapChar in ipairs(tbAllChar) do
local mapCharCfgData = ConfigTable.GetData_Character(mapChar.nId)
if mapCharCfgData ~= nil and mapCharCfgData.Class == GameEnum.characterJobClass.Vanguard and table.indexof(tbSelectedChar, mapChar.nId) < 1 then
table.insert(tbMain, mapChar)
end
end
if #tbMain == 0 then
for _, mapChar in ipairs(tbAllChar) do
local mapCharCfgData = ConfigTable.GetData_Character(mapChar.nId)
if mapCharCfgData ~= nil and mapCharCfgData.Class == GameEnum.characterJobClass.Balance and table.indexof(tbSelectedChar, mapChar.nId) < 1 then
table.insert(tbMain, mapChar)
end
end
end
return tbMain
end
function FormationCtrl.filterSub(tbAllChar, tbSelectedChar)
local tbRet = {}
for _, mapChar in ipairs(tbAllChar) do
local mapCharCfgData = ConfigTable.GetData_Character(mapChar.nId)
if mapCharCfgData ~= nil and mapCharCfgData.Class == GameEnum.characterJobClass.Support and table.indexof(tbSelectedChar, mapChar.nId) < 1 then
table.insert(tbRet, mapChar)
end
end
if #tbRet == 0 then
for _, mapChar in ipairs(tbAllChar) do
local mapCharCfgData = ConfigTable.GetData_Character(mapChar.nId)
if mapCharCfgData ~= nil and mapCharCfgData.Class == GameEnum.characterJobClass.Balance and table.indexof(tbSelectedChar, mapChar.nId) < 1 then
table.insert(tbRet, mapChar)
end
end
end
return tbRet
end
function FormationCtrl.filterBalance(tbAllChar, tbSelectedChar)
local tbRet = {}
for _, mapChar in ipairs(tbAllChar) do
local mapCharCfgData = ConfigTable.GetData_Character(mapChar.nId)
if mapCharCfgData ~= nil and mapCharCfgData.Class == GameEnum.characterJobClass.Balance and table.indexof(tbSelectedChar, mapChar.nId) < 1 then
table.insert(tbRet, mapChar)
end
end
if #tbRet == 0 then
for _, mapChar in ipairs(tbAllChar) do
local mapCharCfgData = ConfigTable.GetData_Character(mapChar.nId)
if mapCharCfgData ~= nil and mapCharCfgData.Class == GameEnum.characterJobClass.Support and table.indexof(tbSelectedChar, mapChar.nId) < 1 then
table.insert(tbRet, mapChar)
end
end
end
return tbRet
end
function FormationCtrl.selectAtk(tbAllChar, tbSelectedChar)
local CharacterAttrData = require("GameCore.Data.DataClass.CharacterAttrData")
local charAttrData = CharacterAttrData.new()
local maxAtk = 0
local selCharId = 0
for _, mapChar in ipairs(tbAllChar) do
charAttrData:SetCharacter(mapChar.nId)
local attrList = charAttrData:GetAttrList()
if maxAtk < attrList[2].totalValue and table.indexof(tbSelectedChar, mapChar.nId) < 1 then
maxAtk = attrList[2].totalValue
selCharId = mapChar.nId
end
end
return selCharId
end
function FormationCtrl:AutoSelectMainline()
local ret = {}
local mapSelectedMainlineId = PlayerData.Mainline._nSelectId
local mapMainline = ConfigTable.GetData_Mainline(mapSelectedMainlineId)
local nLevelOffset = ConfigTable.GetConfigNumber("AutoFormationLevel")
local nRecommendLevel = mapMainline.Recommend - nLevelOffset
local tbChar = self.filterUnfinish(PlayerData.Char:GetCharIdList())
if #tbChar < 3 then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Formation_NeedMoreChar"))
return ret
end
local retLevel = self.filterLevel(tbChar, ret, nRecommendLevel)
if #retLevel == 0 then
retLevel = tbChar
end
local retMain = self.filterMain(retLevel, ret)
if #retMain == 0 then
retMain = tbChar
end
local nCharId = self.selectAtk(retMain, ret)
if nCharId == 0 then
nCharId = tbChar[1].nId
end
table.insert(ret, nCharId)
local cfgDataMain = DataTable.Character[ret[1]]
local mainEET = {
cfgDataMain.EET
}
local retEET
retLevel = self.filterLevel(tbChar, ret, nRecommendLevel)
if #retLevel == 0 then
retLevel = tbChar
end
retEET = self.filterEET(retLevel, ret, mainEET)
if #retEET == 0 then
retEET = retLevel
end
nCharId = self.selectAtk(retEET, ret)
if nCharId == 0 then
nCharId = tbChar[2].nId
end
table.insert(ret, nCharId)
retLevel = self.filterLevel(tbChar, ret, nRecommendLevel)
if #retLevel == 0 then
retLevel = tbChar
end
retEET = self.filterEET(retLevel, ret, mainEET)
if #retEET == 0 then
retEET = retLevel
end
nCharId = self.selectAtk(retEET, ret)
if nCharId == 0 then
nCharId = tbChar[3].nId
end
table.insert(ret, nCharId)
return ret
end
function FormationCtrl:AutoSelectStarTower()
local ret = {}
local mapFR = ConfigTable.GetData("StarTower", self.curRoguelikeId)
local nLevelOffset = ConfigTable.GetConfigNumber("AutoFormationLevel")
local nRecommendLevel = mapFR.Recommend - nLevelOffset
local tbEET = mapFR.EET
local tbEETNotrecommend = mapFR.NotEET
local retEET
local tbChar = self.filterUnfinish(PlayerData.Char:GetCharIdList())
if #tbChar < 3 then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Formation_NeedMoreChar"))
return ret
end
local retLevel = self.filterLevel(tbChar, ret, nRecommendLevel)
if #retLevel == 0 then
retLevel = tbChar
end
retEET = self.filterEET(retLevel, ret, tbEET)
if #retEET == 0 then
retEET = self.filterEETNotrecommend(retLevel, ret, tbEETNotrecommend)
if #retEET == 0 then
retEET = retLevel
end
end
local retMain = self.filterMain(retEET, ret)
if #retMain < 1 then
retMain = retEET
end
local nCharId = self.selectAtk(retMain, ret)
if nCharId == 0 then
nCharId = tbChar[1].nId
end
table.insert(ret, nCharId)
local cfgDataMain = DataTable.Character[ret[1]]
local tbEETMain = {
cfgDataMain.EET
}
retLevel = self.filterLevel(tbChar, ret, nRecommendLevel)
if #retLevel == 0 then
retLevel = tbChar
end
retEET = self.filterEET(retLevel, ret, tbEETMain)
if #retEET == 0 then
retEET = self.filterEET(retLevel, ret, tbEET)
if #retEET == 0 then
retEET = self.filterEETNotrecommend(retLevel, ret, tbEETNotrecommend)
if #retEET == 0 then
retEET = retLevel
end
end
end
local retSub1 = self.filterSub(retEET, ret)
if #retSub1 < 1 then
retSub1 = retEET
end
nCharId = self.selectAtk(retSub1, ret)
if nCharId == 0 then
nCharId = tbChar[2].nId
end
table.insert(ret, nCharId)
retLevel = self.filterLevel(tbChar, ret, nRecommendLevel)
if #retLevel == 0 then
retLevel = tbChar
end
retEET = self.filterEET(retLevel, ret, tbEETMain)
if #retEET == 0 then
retEET = self.filterEET(retLevel, ret, tbEET)
if #retEET == 0 then
retEET = self.filterEETNotrecommend(retLevel, ret, tbEETNotrecommend)
if #retEET == 0 then
retEET = retLevel
end
end
end
local retBalance = self.filterBalance(retEET, ret)
if #retBalance < 1 then
retBalance = retEET
end
nCharId = self.selectAtk(retBalance, ret)
if nCharId == 0 then
nCharId = tbChar[3].nId
end
table.insert(ret, nCharId)
return ret
end
function FormationCtrl:OnBtnClick_Left(btn)
if self._panel.bList then
return
end
if self._panel.nTeamIndex == 1 then
self._panel.nTeamIndex = 6
else
self._panel.nTeamIndex = self._panel.nTeamIndex - 1
end
self:Refresh(2)
if self.curTeam[1] ~= 0 then
PlayerData.Voice:PlayCharVoice("swap", self.curTeam[1])
end
end
function FormationCtrl:OnBtnClick_Right(btn)
if self._panel.bList then
return
end
if self._panel.nTeamIndex == 6 then
self._panel.nTeamIndex = 1
else
self._panel.nTeamIndex = self._panel.nTeamIndex + 1
end
self:Refresh(1)
if self.curTeam[1] ~= 0 then
PlayerData.Voice:PlayCharVoice("swap", self.curTeam[1])
end
end
function FormationCtrl:OnBtnClick_Rename(btn)
end
function FormationCtrl:OnBtnClick_FastFormation(btn)
local confirmCallback = function()
local retTeam
if self.nFRType == AllEnum.FormationEnterType.MainLine then
retTeam = self:AutoSelectMainline()
elseif self.nFRType == AllEnum.FormationEnterType.StarTower then
retTeam = self:AutoSelectStarTower()
else
printError("不再支持老遗迹跳转")
end
self.curTeam = retTeam
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
bPositive = true,
sContent = ConfigTable.GetUIText("Auto_FormationTips")
})
if self:CheckFormationChanged() then
local Callback = function()
self:Refresh()
if self.curTeam[1] ~= 0 then
PlayerData.Voice:PlayCharVoice("swap", self.curTeam[1])
end
end
local tmpDisc = PlayerData.Team:GetTeamDiscData(self._panel.nTeamIndex)
local nPreselectionId = PlayerData.Team:GetTeamPreselectionId(self._panel.nTeamIndex)
PlayerData.Team:UpdateFormationInfo(self._panel.nTeamIndex, self.curTeam, tmpDisc, nPreselectionId, Callback)
end
end
local cancelCallback = function()
end
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = ConfigTable.GetUIText("Auto_FormationNotice"),
callbackConfirm = confirmCallback,
callbackCancel = cancelCallback
}
for _, nId in ipairs(self.curTeam) do
if 0 < nId then
if not PlayerData.Guide:CheckInGuideGroup(12) then
EventManager.Hit(EventId.OpenMessageBox, msg)
else
confirmCallback()
end
return
end
end
confirmCallback()
end
function FormationCtrl:SetLocalData()
local LocalData = require("GameCore.Data.LocalData")
LocalData.SetPlayerLocalData("SavedTeamIdx", self._panel.nTeamIndex)
end
function FormationCtrl:OnBtnClick_Start(btn)
if self._panel.nLoadProcess ~= nil and self._panel.nLoadProcess > 1 then
return
end
self._mapNode.btnStartBattle.enabled = false
if self.nFRType == AllEnum.FormationEnterType.MainLine then
self:EnterMainline()
elseif self.nFRType == AllEnum.FormationEnterType.FixedRoguelike then
printError("不再支持进入老遗迹")
elseif self.nFRType == AllEnum.FormationEnterType.StarTower then
self:EnterStarTower()
end
NovaAPI.SetEntryLevelFade(true)
end
function FormationCtrl:OnBtnClick_Preselection()
PlayerData.PotentialPreselection:SendGetPreselectionList(function()
EventManager.Hit(EventId.OpenPanel, PanelId.PotentialPreselectionList, self.curTeam, self._panel.nTeamIndex)
end)
end
function FormationCtrl:OnBtnClick_PreDetail()
if self.nPreselectionId == 0 then
return
end
PlayerData.PotentialPreselection:SendGetPreselectionList(function()
local mapData = PlayerData.PotentialPreselection:GetPreselectionById(self.nPreselectionId)
EventManager.Hit(EventId.OpenPanel, PanelId.PotentialPreselectionEdit, AllEnum.PreselectionPanelType.Preview, mapData, self.curTeam, self._panel.nTeamIndex)
end)
end
function FormationCtrl:OnEvent_LoadModel(bLoadFinish)
self._mapNode.Mask:SetActive(not bLoadFinish)
end
function FormationCtrl:OnEvent_Back(nPanelId)
if self._panel.nLoadProcess ~= nil and self._panel.nLoadProcess > 1 then
return
end
if self._panel._nPanelId ~= nPanelId then
return
end
if self._panel.bList == true then
self._mapNode.CharList:OnBtnClick_Close()
else
CS.AdventureModuleHelper.ExitSelectTeam()
PlayerData.Char:DeleteTrialChar()
local OpenCallback = function()
EventManager.Hit(EventId.CloesCurPanel)
end
EventManager.Hit(EventId.SetTransition, 5, OpenCallback)
self.bOpenTransition = true
end
end
function FormationCtrl:OnEvent_BackHome(nPanelId)
if self._panel.nLoadProcess ~= nil and self._panel.nLoadProcess > 1 then
print(self._panel.nLoadProcess)
return
end
if self._panel._nPanelId ~= nPanelId then
return
end
CS.AdventureModuleHelper.ExitSelectTeam()
PlayerData.Char:DeleteTrialChar()
local OpenCallback = function()
PanelManager.Home()
end
EventManager.Hit(EventId.SetTransition, 5, OpenCallback)
self.bOpenTransition = true
end
function FormationCtrl:OnEvent_OpenSelectTeamMemberList(nIdx)
self._mapNode.btnFastFormation.gameObject:SetActive(false)
self._mapNode.btnStartBattle.transform.localScale = Vector3.zero
self._mapNode.t_arrow_01.gameObject:SetActive(false)
self._mapNode.goPreselection.gameObject:SetActive(false)
NovaAPI.SetCanvasGroupAlpha(self._mapNode.rt_TeamNameAlpha, 0)
self._mapNode.CharList:ShowList(self.curTeam, true)
self._panel.bList = true
self._Animator:Play("CharList_in")
self._mapNode.goChar[1]:OpenList(true)
self._mapNode.goChar[2]:OpenList(true)
self._mapNode.goChar[3]:OpenList(true)
end
function FormationCtrl:OnEvent_CloseList(bConfirm, tbList)
if bConfirm then
local Callback = function()
self:Refresh()
end
self.curTeam = tbList
if self:CheckFormationChanged() then
local tmpDisc = PlayerData.Team:GetTeamDiscData(self._panel.nTeamIndex)
local nPreselectionId = PlayerData.Team:GetTeamPreselectionId(self._panel.nTeamIndex)
PlayerData.Team:UpdateFormationInfo(self._panel.nTeamIndex, self.curTeam, tmpDisc, nPreselectionId, Callback)
end
else
self:Refresh()
end
local callback = function()
self._mapNode.btnFastFormation.gameObject:SetActive(true)
self._mapNode.btnStartBattle.transform.localScale = Vector3.one
self._mapNode.t_arrow_01.gameObject:SetActive(true)
self._mapNode.goPreselection.gameObject:SetActive(true)
NovaAPI.SetCanvasGroupAlpha(self._mapNode.rt_TeamNameAlpha, 1)
self._mapNode.CharList:CloseList()
end
self._Animator:Play("CharList_out")
self:AddTimer(1, 0.34, callback, true, true)
for i = 1, 3 do
self._mapNode.goChar[i]:SetArrowShow(false)
end
self._panel.bList = false
self._mapNode.goChar[1]:OpenList(false)
self._mapNode.goChar[2]:OpenList(false)
self._mapNode.goChar[3]:OpenList(false)
end
function FormationCtrl:OnEvent_ChangeTeamModel(tbList)
self.curTeam = tbList
self:RefreshChar()
self:RefreshPreselection()
end
function FormationCtrl:OnEvent_OpenSwapChar(nIdx)
local callback = function(nSwapIdx)
if nSwapIdx ~= 0 then
local ntemp = self.curTeam[nIdx]
self.curTeam[nIdx] = self.curTeam[nSwapIdx]
self.curTeam[nSwapIdx] = ntemp
end
local Callback = function()
self:Refresh()
if nSwapIdx == 1 or nIdx == 1 then
local nCharId = self.curTeam[1]
PlayerData.Voice:PlayCharVoice("swap", nCharId)
end
end
NovaAPI.SetCanvasGroupAlpha(self._mapNode.charCanvasGroup, 1)
self._mapNode.SwapBlock:SetActive(false)
for i = 1, 3 do
if self.mapCurModel[i] ~= nil then
self.mapCurModel[i].model:SetActive(true)
end
end
if self:CheckFormationChanged() then
local tmpDisc = PlayerData.Team:GetTeamDiscData(self._panel.nTeamIndex)
local nPreselectionId = PlayerData.Team:GetTeamPreselectionId(self._panel.nTeamIndex)
PlayerData.Team:UpdateFormationInfo(self._panel.nTeamIndex, self.curTeam, tmpDisc, nPreselectionId, Callback)
end
end
local nCurSelectChar = self.curTeam[nIdx]
if nCurSelectChar == 0 then
return
end
for i = 1, 3 do
if self.mapCurModel[i] ~= nil then
self.mapCurModel[i].model:SetActive(false)
end
end
NovaAPI.SetCanvasGroupAlpha(self._mapNode.charCanvasGroup, 0)
self._mapNode.SwapCharPanel:ShowSwapChar(self.curTeam, nCurSelectChar, callback)
self._mapNode.SwapBlock:SetActive(true)
end
return FormationCtrl