472 lines
No EOL
17 KiB
Lua
472 lines
No EOL
17 KiB
Lua
local XUiBabelTowerChildSupport = XLuaUiManager.Register(XLuaUi, "UiBabelTowerChildSupport")
|
||
|
||
local XUiBabelMemberHead = require("XUi/XUiFubenBabelTower/XUiBabelMemberHead")
|
||
local XUiBabelTowerSupportChoice = require("XUi/XUiFubenBabelTower/XUiBabelTowerSupportChoice")
|
||
local XUiBabelTowerChallengeSelect = require("XUi/XUiFubenBabelTower/XUiBabelTowerChallengeSelect")
|
||
|
||
function XUiBabelTowerChildSupport:OnAwake()
|
||
self.BtnBack.CallBack = function() self:OnBtnBackClick() end
|
||
self.BtnGo.CallBack = function() self:OnBtnGoClick() end
|
||
self.BtnSupport.CallBack = function() self:OnBtnSupportClick() end
|
||
|
||
self.TeamMemberList = {}
|
||
for i = 1, XFubenBabelTowerConfigs.MAX_TEAM_MEMBER do
|
||
self.TeamMemberList[i] = XUiBabelMemberHead.New(self[string.format("TeamMember%d", i)], i)
|
||
self.TeamMemberList[i]:ClearMemberHead()
|
||
self.TeamMemberList[i]:SetMemberCallBack(function()
|
||
self:OnBtnGoClick()
|
||
end)
|
||
end
|
||
|
||
self.DynamicTableSupportChoice = XDynamicTableNormal.New(self.PanelSupportChoice.gameObject)
|
||
self.DynamicTableSupportChoice:SetProxy(XUiBabelTowerSupportChoice)
|
||
self.DynamicTableSupportChoice:SetDelegate(self)
|
||
self.DynamicTableSupportChoice:SetDynamicEventDelegate(function(event, index, grid)
|
||
self:OnSupportChoiceDynamicTableEvent(event, index, grid)
|
||
end)
|
||
|
||
self.SelectChoiceList = {}
|
||
|
||
self.ChoosedSupportList = {}
|
||
self.SupportBuffSelectGroup = {}
|
||
|
||
XEventManager.AddEventListener(XEventId.EVNET_BABEL_CHALLENGE_BUFF_CHANGED, self.CheckTeamBanCharacterList, self)
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:OnStart(uiRoot, stageId, guideId, teamId, teamList, captainPos, firstFightPos)
|
||
self.UiRoot = uiRoot
|
||
self.StageId = stageId
|
||
self.GuideId = guideId
|
||
self.TeamId = teamId
|
||
self.TeamList = teamList
|
||
self.CaptainPos = captainPos
|
||
self.FirstFightPos = firstFightPos
|
||
self.BabelTowerStageTemplate = XFubenBabelTowerConfigs.GetBabelTowerStageTemplate(self.StageId)
|
||
|
||
self:GetTotalSupportPoint()
|
||
self:SetSupportChoiceDatas()
|
||
|
||
-- 初始化检查一遍阵容
|
||
self:CheckTeamBanCharacterList()
|
||
self:InitSupportBuff()
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:OnEnable()
|
||
self:SetTeamListDatas()
|
||
self:ReportTeamList()
|
||
self:OnUpdateTeamMemberEnd()
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:OnDisable()
|
||
if self.ChoosedSupportList then
|
||
for i = 1, #self.ChoosedSupportList do
|
||
self.SelectChoiceList[i]:StopFx()
|
||
end
|
||
end
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:OnDestroy()
|
||
if self.DelayTimer then
|
||
XScheduleManager.UnSchedule(self.DelayTimer)
|
||
self.DelayTimer = nil
|
||
end
|
||
XEventManager.RemoveEventListener(XEventId.EVNET_BABEL_CHALLENGE_BUFF_CHANGED, self.CheckTeamBanCharacterList, self)
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:RefreshSelectChoiceList(index)
|
||
if self.ChoosedSupportList then
|
||
local chooseCount = #self.ChoosedSupportList
|
||
for i = 1, chooseCount do
|
||
if not self.SelectChoiceList[i] then
|
||
local ui = CS.UnityEngine.Object.Instantiate(self.GridSelectSupportChoice)
|
||
ui.transform:SetParent(self.PanelChoiceContainer, false)
|
||
ui.gameObject:SetActiveEx(true)
|
||
self.SelectChoiceList[i] = XUiBabelTowerChallengeSelect.New(ui, self)
|
||
end
|
||
self.SelectChoiceList[i].GameObject:SetActiveEx(true)
|
||
self.SelectChoiceList[i]:SetItemData(self.ChoosedSupportList[i], XFubenBabelTowerConfigs.TYPE_SUPPORT)
|
||
end
|
||
|
||
for i = chooseCount + 1, #self.SelectChoiceList do
|
||
self.SelectChoiceList[i].GameObject:SetActiveEx(false)
|
||
end
|
||
|
||
if index and index > 0 and index <= chooseCount then
|
||
self:CenterToGrid(self.SelectChoiceList[index], index)
|
||
self.SelectChoiceList[index]:PlayFx()
|
||
end
|
||
end
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:CenterToGrid(grid, index)
|
||
local normalizedPosition
|
||
local count = #self.SelectChoiceList
|
||
local itemTotalCount = #self.ChoosedSupportList
|
||
local totalHeight = 0
|
||
local curHeight = 0
|
||
for i = 1, count do
|
||
local itemHeight = self.SelectChoiceList[i]:GetBuffDescriptionHeight()
|
||
totalHeight = totalHeight + itemHeight
|
||
if i <= index then
|
||
curHeight = curHeight + itemHeight
|
||
end
|
||
end
|
||
|
||
local offset = 0
|
||
if index + 1 <= itemTotalCount then
|
||
offset = self.SelectChoiceList[index + 1]:GetBuffDescriptionHeight()
|
||
end
|
||
if curHeight > totalHeight / 2 then
|
||
normalizedPosition = (curHeight + offset) / totalHeight
|
||
else
|
||
normalizedPosition = (curHeight - offset) / totalHeight
|
||
end
|
||
|
||
self.DelayTimer = XScheduleManager.ScheduleOnce(function()
|
||
self.PanelSelectSupport.verticalNormalizedPosition = math.max(0, math.min(1, (1 - normalizedPosition)))
|
||
XScheduleManager.UnSchedule(self.DelayTimer)
|
||
end, 50)
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:CheckTeamBanCharacterList()
|
||
local banCharacters = XDataCenter.FubenBabelTowerManager.GetBanCharacterIdsByBuff(self.UiRoot.ChallengeBuffInfos)
|
||
for i = 1, XFubenBabelTowerConfigs.MAX_TEAM_MEMBER do
|
||
local curChar = self.TeamList[i]
|
||
if curChar ~= nil and curChar ~= 0 and banCharacters[curChar] then
|
||
self.TeamList[i] = 0
|
||
self.TeamMemberList[i]:SetMemberInfo(self.TeamList[i], nil, self.CaptainPos)
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 仅此一份,其他界面都以这个为准
|
||
function XUiBabelTowerChildSupport:GetTeamList()
|
||
return self.TeamList
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:OnSupportChoiceDynamicTableEvent(event, index, grid)
|
||
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_INIT then
|
||
grid:Init(self)
|
||
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
|
||
if self.SupportBuffGroup[index] then
|
||
grid:SetItemData(self.SupportBuffGroup[index])
|
||
end
|
||
end
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:OnSupportSelectDynamicTableEvent(event, index, grid)
|
||
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_INIT then
|
||
grid:Init(self)
|
||
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
|
||
if self.ChoosedSupportList[index] then
|
||
grid:SetItemData(self.ChoosedSupportList[index], XFubenBabelTowerConfigs.TYPE_SUPPORT)
|
||
end
|
||
end
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:OnBtnBackClick()
|
||
self.UiRoot:Switch2ChallengePhase()
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:OnBtnGoClick()
|
||
local babelTowerData = {
|
||
TeamId = self.TeamId,
|
||
TeamList = XDataCenter.FubenBabelTowerManager.GetCacheTeam(self.StageId, self.TeamId, self.TeamList, self.CaptainPos, self.FirstFightPos),
|
||
Cb = function(resTeam, captainPos, firstFightPos)
|
||
self.TeamList = resTeam
|
||
self.CaptainPos = captainPos
|
||
self.FirstFightPos = firstFightPos
|
||
end
|
||
}
|
||
local data = {BabelTowerData = babelTowerData}
|
||
XLuaUiManager.Open("UiNewRoomSingle", self.StageId, data)
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:OnBtnSupportClick()
|
||
-- 支援详情
|
||
XLuaUiManager.Open("UiBabelTowerDetails", XFubenBabelTowerConfigs.TIPSTYPE_SUPPORT, self.StageId)
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:RestoreSupportBuff()
|
||
self:GetTotalSupportPoint()
|
||
self:SetSupportChoiceDatas()
|
||
|
||
-- 初始化检查一遍阵容
|
||
self:CheckTeamBanCharacterList()
|
||
self:ReportTeamList()
|
||
|
||
self:InitSupportBuff()
|
||
end
|
||
|
||
-- 设置支援目标战略组
|
||
function XUiBabelTowerChildSupport:SetSupportChoiceDatas()
|
||
self:GenSupportGroupDatas()
|
||
self:GenSupportSelectDatas()
|
||
self.DynamicTableSupportChoice:SetDataSource(self.SupportBuffGroup)
|
||
self.DynamicTableSupportChoice:ReloadDataASync()
|
||
end
|
||
|
||
-- 设置队伍信息:初始化
|
||
function XUiBabelTowerChildSupport:SetTeamListDatas()
|
||
for i = 1, XFubenBabelTowerConfigs.MAX_TEAM_MEMBER do
|
||
self.TeamMemberList[i]:SetMemberInfo(self.TeamList[i], nil, self.CaptainPos)
|
||
end
|
||
end
|
||
|
||
-- 更新队伍信息:手动改变队伍
|
||
function XUiBabelTowerChildSupport:UpdateTeamMember(member_position, characterId)
|
||
if member_position <= 0 or member_position > XFubenBabelTowerConfigs.MAX_TEAM_MEMBER then return end
|
||
self.TeamList[member_position] = characterId or 0
|
||
self.TeamMemberList[member_position]:SetMemberInfo(self.TeamList[member_position], nil, self.CaptainPos)
|
||
self:ReportTeamList()
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:UpdateTeamInfo()
|
||
for i = 1, XFubenBabelTowerConfigs.MAX_TEAM_MEMBER do
|
||
local characterId = self.TeamMemberList[i].CharacterId
|
||
self.TeamMemberList[i]:SetMemberInfo(characterId, nil, self.CaptainPos)
|
||
end
|
||
end
|
||
|
||
-- 切换队伍结束:计算支援点
|
||
-- 不清除支援组
|
||
-- 红色显色
|
||
-- 支援点处理
|
||
-- 现有的基础上、增加超出处理
|
||
-- 控件刷新如何记住超出状态
|
||
-- 超出状态出现一定是按下状态、取消的时候变成不可点击状态、超出状态消失
|
||
-- 逻辑处理:
|
||
-- 判读是否超出:
|
||
-- 是:全部选项标记超出
|
||
-- 每次取消:判读是否超出,更改标记
|
||
-- 否:帮用户选上
|
||
-- 更改标记
|
||
-- 默认选中
|
||
function XUiBabelTowerChildSupport:InitSupportBuff()
|
||
local supportBuffs = XDataCenter.FubenBabelTowerManager.GetSupportBuffListCacheByStageId(self.StageId, self.TeamId)
|
||
|
||
-- 记录选中的
|
||
for _, v in pairs(self.SupportBuffSelectGroup or {}) do
|
||
if supportBuffs[v.BuffGroupId] then
|
||
v.SelectBuffId = supportBuffs[v.BuffGroupId]
|
||
end
|
||
end
|
||
self.ChoosedSupportList = {}
|
||
for i = 1, #self.SupportBuffSelectGroup do
|
||
local groupItem = self.SupportBuffSelectGroup[i]
|
||
if groupItem.SelectBuffId then
|
||
table.insert(self.ChoosedSupportList, groupItem)
|
||
end
|
||
end
|
||
local availablePoint = self:GetAvailableSupportPoint()
|
||
-- 记录全部
|
||
for _, v in pairs(self.SupportBuffGroup or {}) do
|
||
if supportBuffs[v.BuffGroupId] then
|
||
v.SelectedBuffId = supportBuffs[v.BuffGroupId]
|
||
local buffGroupTemplate = XFubenBabelTowerConfigs.GetBabelTowerBuffGroupTemplate(v.BuffGroupId)
|
||
for idx, buffId in pairs(buffGroupTemplate.BuffId) do
|
||
if buffId == supportBuffs[v.BuffGroupId] then
|
||
v.CurSelectId = idx
|
||
break
|
||
end
|
||
end
|
||
v.IsOverCount = availablePoint < 0
|
||
end
|
||
end
|
||
|
||
-- 更新界面
|
||
self:UpdateSupportChooiceState()
|
||
self:ReportSupportChoice()
|
||
-- self.DynamicTableSupportSelect:SetDataSource(self.ChoosedSupportList)
|
||
-- self.DynamicTableSupportSelect:ReloadDataASync()
|
||
self:RefreshSelectChoiceList()
|
||
self.ImgEmpty.gameObject:SetActiveEx(#self.ChoosedSupportList <= 0)
|
||
self.TxtChallengeNumber.text = availablePoint
|
||
end
|
||
|
||
-- 切换队友
|
||
function XUiBabelTowerChildSupport:OnUpdateTeamMemberEnd()
|
||
-- 计算总的支援点数
|
||
self:GetTotalSupportPoint()
|
||
|
||
-- self:CheckSupportSelectBuffs()
|
||
local availableSupportPoint = self:GetAvailableSupportPoint()
|
||
self:UpdateSupportBuffOverCountTag(availableSupportPoint)
|
||
|
||
self:UpdateSupportChooiceState()
|
||
self.TxtChallengeNumber.text = availableSupportPoint
|
||
end
|
||
|
||
-- 更改标记
|
||
function XUiBabelTowerChildSupport:UpdateSupportBuffOverCountTag(availablePoint)
|
||
for _, v in pairs(self.SupportBuffGroup or {}) do
|
||
v.IsOverCount = availablePoint < 0
|
||
end
|
||
end
|
||
|
||
-- 清理选中支援组
|
||
function XUiBabelTowerChildSupport:CheckSupportSelectBuffs()
|
||
local supportSelectBuffs = {}
|
||
local usedSupportPoints = 0
|
||
|
||
for i = 1, #self.ChoosedSupportList do
|
||
local datas = self.ChoosedSupportList[i]
|
||
local buffTemplate = XFubenBabelTowerConfigs.GetBabelTowerBuffTemplate(datas.SelectBuffId)
|
||
local curCostSupportPoints = usedSupportPoints + buffTemplate.PointSub
|
||
local isChoose = false
|
||
if curCostSupportPoints <= self.TotalSupportPoint then
|
||
usedSupportPoints = curCostSupportPoints
|
||
table.insert(supportSelectBuffs, datas)
|
||
isChoose = true
|
||
else
|
||
self:UnselectSupportChoice(datas.BuffGroupId)
|
||
end
|
||
|
||
for _, v in pairs(self.SupportBuffSelectGroup or {}) do
|
||
if v.BuffGroupId == datas.BuffGroupId then
|
||
local buffId = isChoose and datas.SelectBuffId or nil
|
||
v.SelectBuffId = buffId
|
||
break
|
||
end
|
||
end
|
||
|
||
end
|
||
self.ChoosedSupportList = supportSelectBuffs
|
||
self:ReportSupportChoice()
|
||
-- self.DynamicTableSupportSelect:SetDataSource(self.ChoosedSupportList)
|
||
-- self.DynamicTableSupportSelect:ReloadDataASync()
|
||
self:RefreshSelectChoiceList()
|
||
self.ImgEmpty.gameObject:SetActiveEx(#self.ChoosedSupportList <= 0)
|
||
end
|
||
|
||
-- 清理支援选项
|
||
function XUiBabelTowerChildSupport:UnselectSupportChoice(buffGroupId)
|
||
for _, v in pairs(self.SupportBuffGroup or {}) do
|
||
if v.BuffGroupId == buffGroupId then
|
||
v.SelectedBuffId = nil
|
||
v.CurSelectId = -1
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:UpdateSupportChooiceState()
|
||
for i = 1, #self.SupportBuffGroup do
|
||
local grid = self.DynamicTableSupportChoice:GetGridByIndex(i)
|
||
if grid then
|
||
grid:UpdateGridChoiceState(self:GetAvailableSupportPoint())
|
||
end
|
||
end
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:CalcUsedSupportPoint()
|
||
local usedSupportPoint = 0
|
||
|
||
for _, choosedItem in pairs(self.ChoosedSupportList or {}) do
|
||
local buffTemplate = XFubenBabelTowerConfigs.GetBabelTowerBuffTemplate(choosedItem.SelectBuffId)
|
||
usedSupportPoint = usedSupportPoint + (buffTemplate.PointSub or 0)
|
||
end
|
||
|
||
return usedSupportPoint
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:GetAvailableSupportPoint()
|
||
return self.TotalSupportPoint - self:CalcUsedSupportPoint()
|
||
end
|
||
|
||
-- 获取支援点数,阵容一旦确定,支援点数也可以确定
|
||
function XUiBabelTowerChildSupport:GetTotalSupportPoint()
|
||
|
||
self.TotalSupportPoint = self.BabelTowerStageTemplate.BaseSupportPoint or 0
|
||
|
||
local characterIds = {}
|
||
for i = 1, XFubenBabelTowerConfigs.MAX_TEAM_MEMBER do
|
||
local characterId = self.TeamMemberList[i].CharacterId
|
||
if characterId ~= nil and characterId ~= 0 then
|
||
table.insert(characterIds, characterId)
|
||
end
|
||
end
|
||
|
||
for i = 1, #self.BabelTowerStageTemplate.SupportConditionId do
|
||
local supportConditionId = self.BabelTowerStageTemplate.SupportConditionId[i]
|
||
local supportConditionTemplate = XFubenBabelTowerConfigs.GetBabelTowerSupportConditonTemplate(supportConditionId)
|
||
if supportConditionTemplate.Condition == nil or supportConditionTemplate.Condition == 0 then
|
||
self.TotalSupportPoint = self.TotalSupportPoint + supportConditionTemplate.PointAdd
|
||
else
|
||
local isConditionAvailable = XConditionManager.CheckCondition(supportConditionTemplate.Condition, characterIds)
|
||
if isConditionAvailable then
|
||
self.TotalSupportPoint = self.TotalSupportPoint + supportConditionTemplate.PointAdd
|
||
end
|
||
end
|
||
end
|
||
|
||
return self.TotalSupportPoint
|
||
end
|
||
|
||
-- 保存一份数据,记录玩家选中的挑战项SelectBuffList = {buffId = isSelect}
|
||
function XUiBabelTowerChildSupport:GenSupportGroupDatas()
|
||
if self.SupportBuffGroup then return self.SupportBuffGroup end
|
||
self.SupportBuffGroup = {}
|
||
for i = 1, #self.BabelTowerStageTemplate.SupportBuffGroup do
|
||
table.insert(self.SupportBuffGroup, {
|
||
StageId = self.StageId,
|
||
GuideId = self.GuideId,
|
||
BuffGroupId = self.BabelTowerStageTemplate.SupportBuffGroup[i],
|
||
SelectedBuffId = nil,
|
||
CurSelectId = -1,
|
||
IsOverCount = false,
|
||
})
|
||
end
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:GenSupportSelectDatas()
|
||
self.SupportBuffSelectGroup = {}
|
||
for i = 1, #self.BabelTowerStageTemplate.SupportBuffGroup do
|
||
table.insert(self.SupportBuffSelectGroup, {
|
||
BuffGroupId = self.BabelTowerStageTemplate.SupportBuffGroup[i],
|
||
SelectBuffId = nil
|
||
})
|
||
end
|
||
end
|
||
|
||
-- 设置已选支援组
|
||
function XUiBabelTowerChildSupport:UpdateChoosedChallengeDatas(buffGroupId, buffId)
|
||
if not self.SupportBuffSelectGroup then self:GenSupportSelectDatas() end
|
||
self.ChoosedSupportList = {}
|
||
for i = 1, #self.SupportBuffSelectGroup do
|
||
local groupItem = self.SupportBuffSelectGroup[i]
|
||
if groupItem.BuffGroupId == buffGroupId then
|
||
groupItem.SelectBuffId = buffId
|
||
end
|
||
if groupItem.SelectBuffId then
|
||
table.insert(self.ChoosedSupportList, groupItem)
|
||
end
|
||
end
|
||
local index = 0
|
||
for i = 1, #self.ChoosedSupportList do
|
||
local groupItem = self.ChoosedSupportList[i]
|
||
if groupItem.BuffGroupId == buffGroupId and groupItem.SelectBuffId and groupItem.SelectBuffId == buffId then
|
||
index = i
|
||
break
|
||
end
|
||
end
|
||
|
||
self:ReportSupportChoice()
|
||
-- self.DynamicTableSupportSelect:SetDataSource(self.ChoosedSupportList)
|
||
-- self.DynamicTableSupportSelect:ReloadDataASync()
|
||
self:RefreshSelectChoiceList(index)
|
||
self.ImgEmpty.gameObject:SetActiveEx(#self.ChoosedSupportList <= 0)
|
||
|
||
local availableSupportPoint = self:GetAvailableSupportPoint()
|
||
self:UpdateSupportBuffOverCountTag(availableSupportPoint)
|
||
self:UpdateSupportChooiceState()
|
||
self.TxtChallengeNumber.text = availableSupportPoint
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:ReportSupportChoice()
|
||
self.UiRoot:UpdateSupportBuffInfos(self.ChoosedSupportList)
|
||
end
|
||
|
||
function XUiBabelTowerChildSupport:ReportTeamList()
|
||
self.UiRoot:UpdateTeamList(self.TeamList, self.CaptainPos, self.FirstFightPos)
|
||
end |