PGRData/Script/matrix/xui/xuilivwarmactivity/XUiLivWarmActivityPop.lua

746 lines
No EOL
27 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local XUiLivWarmActivityPopGrid = require("XUi/XUiLivWarmActivity/XUiLivWarmActivityPopGrid")
local XUiLivWarmActivityRewardGrid = require("XUi/XUiLivWarmActivity/XUiLivWarmActivityRewardGrid")
local XUiLivWarmActivityPop = XLuaUiManager.Register(XLuaUi, "UiLivWarmActivityPop")
local CSXTextManagerGetText = CS.XTextManager.GetText
local CSUnityEngineObjectInstantiate = CS.UnityEngine.Object.Instantiate
local Disable = CS.UiButtonState.Disable
local tableInsert = table.insert
local CanClearHeadMinCount = 3 --同一行或同一列中,相同颜色的格子消除的最小数量
local HelpKey = "LivWarmActivityHelp"
--超丽芙预热主界面(消消乐)
function XUiLivWarmActivityPop:OnAwake()
self:RegisterButtonEvent()
self.CurSelectTabIndex = 0
self.MaxRewardProgress = 0 --当前选择的关卡最大消除进度奖励
self.PhasesRewardGrids = {}
self.PhasesRewardGridRects = {}
self.GridMine.gameObject:SetActiveEx(false)
self.RewardTmp.gameObject:SetActiveEx(false)
self.TxtClearLevel.gameObject:SetActiveEx(false)
self:InitLoseIcon()
self:InitPanelSpecialTool()
end
function XUiLivWarmActivityPop:OnStart()
self.GridTemplates = {}
self.CanSwapGrids = {} --可以和已选择的格子交换的格子位置
self:InitChapterGroup()
self:CheckAutoOpenHelp()
end
function XUiLivWarmActivityPop:OnEnable()
self:StartActivityTimer()
self:Refresh()
self:UpdatePhasesRewardGrid()
end
function XUiLivWarmActivityPop:OnDisable()
self:StopActivityTimer()
self:StopPlayMoveActionTimer()
self:StopRewardProgressTimer()
end
function XUiLivWarmActivityPop:CheckAutoOpenHelp()
local isFirstOpenView = XDataCenter.LivWarmActivityManager.IsFirstOpenView()
if isFirstOpenView then
XUiManager.ShowHelpTip(HelpKey)
XDataCenter.LivWarmActivityManager.SetFirstOpenViewCookie()
end
end
function XUiLivWarmActivityPop:InitChapterGroup()
self.StageIdList = XLivWarmActivityConfigs.GetLivWarmStageIdList()
self.TabGroup = {}
local defaultIndex = 1
local btnName
local btnEnName
for i, stageId in ipairs(self.StageIdList) do
local btn = i == 1 and self.BtnTog or CSUnityEngineObjectInstantiate(self.BtnTog, self.ChapterGroup.transform)
btnName = XLivWarmActivityConfigs.GetLivWarmActivityStageClientStageName(stageId)
btnEnName = XLivWarmActivityConfigs.GetLivWarmActivityStageClientStageEnName(stageId)
btn:SetNameByGroup(0, btnName)
btn:SetNameByGroup(1, btnEnName)
tableInsert(self.TabGroup, btn)
if XDataCenter.LivWarmActivityManager.IsUnlockStage(stageId) then
defaultIndex = i
end
end
self.ChapterGroup:Init(self.TabGroup, function(tabIndex) self:OnClickTabCallBack(tabIndex) end)
self.ChapterGroup:SelectIndex(defaultIndex)
end
function XUiLivWarmActivityPop:InitPanelSpecialTool()
local itemId = XLivWarmActivityConfigs.GetLivWarmActivityItemId()
self.AssetActivityPanel = XUiPanelActivityAsset.New(self.PanelSpecialTool)
self.AssetActivityPanel:Refresh({itemId})
XDataCenter.ItemManager.AddCountUpdateListener({itemId}, function()
self:UpdateLoseText()
self.AssetActivityPanel:Refresh({itemId})
end, self.AssetActivityPanel)
end
function XUiLivWarmActivityPop:InitLoseIcon()
local itemId = XLivWarmActivityConfigs.GetLivWarmActivityItemId()
local icon = XItemConfigs.GetItemIconById(itemId)
self.LoseIcon:SetRawImage(icon)
end
function XUiLivWarmActivityPop:UpdateLoseText()
if self.StageDb:IsWin() then
self.PanelCondition.gameObject:SetActiveEx(false)
return
end
local itemId = XLivWarmActivityConfigs.GetLivWarmActivityItemId()
local useItemCount = XLivWarmActivityConfigs.GetLivWarmActivityUseItemCount()
local itemCount = XDataCenter.ItemManager.GetCount(itemId)
local color = itemCount < useItemCount and "#fb0000" or "#34aff8"
local isMaxItemUseCount = self:GetCurUseItemData()
useItemCount = isMaxItemUseCount and 0 or useItemCount --达到消耗上限显示0
self.LoseText.text = CSXTextManagerGetText("LivWarmActivityUseItemCountText", color, useItemCount)
self.PanelCondition.gameObject:SetActiveEx(true)
end
function XUiLivWarmActivityPop:Refresh()
self:UpdateGridTemplates()
self:UpdateReminderLoseText()
self:UpdateChapterGroupState()
self:UpdateLoseText()
self:UpdateRedPoint()
self:RefreshPanelEntranceRedPoint()
self:UpdatePanelClearance()
end
function XUiLivWarmActivityPop:UpdatePanelClearance()
if not self.StageDb:IsWin() then
self.PanelClearance.gameObject:SetActiveEx(false)
return
end
self.PanelClearance.gameObject:SetActiveEx(true)
end
function XUiLivWarmActivityPop:UpdateChapterGroupState()
local btn
local isUnLock
for i, stageId in ipairs(self.StageIdList) do
isUnLock = XDataCenter.LivWarmActivityManager.IsUnlockStage(stageId)
btn = self.TabGroup[i]
if btn then
if btn.ButtonState == Disable and isUnLock then
btn:SetDisable(false)
elseif btn.ButtonState ~= Disable and not isUnLock then
btn:SetDisable(true)
end
end
end
end
function XUiLivWarmActivityPop:UpdatePhasesRewardGrid(isPlayPercentAnima)
local stageId = self:GetStageId()
local rewardProgressList = XLivWarmActivityConfigs.GetLivWarmActivityStageRewardProgress(stageId)
local rewardIdList = XLivWarmActivityConfigs.GetLivWarmActivityStageRewardId(stageId)
local dismisTotalProgres = self:GetDismisTotalProgress()
local takeRewardProgressIndex = self.StageDb:GetTakeRewardProgressIndex()
local activeProgressRectSize = self.RewardContent.rect.size
local isReward = false
self.MaxRewardProgress = rewardProgressList[#rewardProgressList]
for i, rewardProgress in ipairs(rewardProgressList) do
local grid = self.PhasesRewardGrids[i]
if not grid then
local obj = CSUnityEngineObjectInstantiate(self.RewardTmp, self.RewardContent)
obj.gameObject:SetActiveEx(true)
grid = XUiLivWarmActivityRewardGrid.New(self, obj, handler(self, self.ReceiveCallBack))
self.PhasesRewardGrids[i] = grid
end
if not isReward and i > takeRewardProgressIndex and dismisTotalProgres >= rewardProgress then
isReward = true
end
grid:SetData({StageId = stageId, RewardId = rewardIdList[i], RewardProgress = rewardProgress, RewardProgressIndex = i, IsReward = isReward})
-- 自适应
local rewardPercent = rewardProgress / self.MaxRewardProgress
local adjustPosition = CS.UnityEngine.Vector3(activeProgressRectSize.x * rewardPercent, 44, 0)
grid:SetRewardGridRectAnchoredPosition3D(adjustPosition)
end
for i = #rewardProgressList + 1, #self.PhasesRewardGrids do
self.PhasesRewardGrids[i].GameObject:SetActiveEx(false)
end
self:UpdatePanelPhasesReward(isPlayPercentAnima)
end
function XUiLivWarmActivityPop:UpdatePanelPhasesReward(isPlayAnima)
self:StopRewardProgressTimer()
for _, grid in ipairs(self.PhasesRewardGrids) do
grid:Refresh()
end
local dismisTotalprogress = self:GetDismisTotalProgress()
local percent = self.MaxRewardProgress ~= 0 and dismisTotalprogress / self.MaxRewardProgress or 0
if not isPlayAnima then
self.ImgProgress.fillAmount = percent
return
end
local currFillAmount = self.ImgProgress.fillAmount
local fillAmountDifference = percent - currFillAmount
self.RewardProgressTimer = XUiHelper.Tween(1, function(f)
if XTool.UObjIsNil(self.Transform) then
return
end
self.ImgProgress.fillAmount = currFillAmount + f * fillAmountDifference
end)
end
function XUiLivWarmActivityPop:StopRewardProgressTimer()
if self.RewardProgressTimer then
XScheduleManager.UnSchedule(self.RewardProgressTimer)
self.RewardProgressTimer = nil
end
end
function XUiLivWarmActivityPop:UpdateReminderLoseText()
if self.StageDb:IsWin() then
self.PanelReminder.gameObject:SetActiveEx(false)
return
end
local _, curUseItemCount, maxItemCount = self:GetCurUseItemData()
curUseItemCount = math.min(curUseItemCount, maxItemCount)
self.ReminderLoseText.text = CSXTextManagerGetText("LivWarmActivityReminderLoseText", maxItemCount, curUseItemCount, maxItemCount)
self.PanelReminder.gameObject:SetActiveEx(true)
end
function XUiLivWarmActivityPop:GetCurUseItemData()
local stageId = self:GetStageId()
local maxItemCount = XLivWarmActivityConfigs.GetLivWarmActivityStageMaxItemCount(stageId)
local stageDb = XDataCenter.LivWarmActivityManager.GetStageDb(stageId)
local curUseItemCount = stageDb:GetChangeCount()
local isMaxItemUseCount = curUseItemCount >= maxItemCount
return isMaxItemUseCount, curUseItemCount, maxItemCount
end
function XUiLivWarmActivityPop:UpdateGridTemplates()
self:ClearCurSelectGrid()
local isWin = self.StageDb:IsWin()
local stageId = self:GetStageId()
local gridData = XDataCenter.LivWarmActivityManager.GetGridData(stageId)
for row, headTypeList in ipairs(gridData) do
if not self.GridTemplates[row] then
self.GridTemplates[row] = {}
end
for col, headType in ipairs(headTypeList) do
local grid = self:GetGridTemplate(row, col)
if not grid then
local gridMine = CSUnityEngineObjectInstantiate(self.GridMine, self.PanelCase)
gridMine.gameObject:SetActiveEx(true)
grid = XUiLivWarmActivityPopGrid.New(gridMine, row, col, handler(self, self.ClickGrid))
self.GridTemplates[row][col] = grid
end
if isWin then
grid:Win()
else
grid:SetHeadType(headType, stageId)
end
grid:Reset()
end
end
self.WinEffect.gameObject:SetActiveEx(isWin)
end
function XUiLivWarmActivityPop:StartActivityTimer()
self:StopActivityTimer()
if not XDataCenter.LivWarmActivityManager.CheckActivityIsOpen() then
return
end
self:RefreshActivityTime()
self.ActivityTimer = XScheduleManager.ScheduleForever(function()
if not XDataCenter.LivWarmActivityManager.CheckActivityIsOpen() then
return
end
self:RefreshActivityTime()
end, XScheduleManager.SECOND)
end
function XUiLivWarmActivityPop:StopActivityTimer()
if self.ActivityTimer then
XScheduleManager.UnSchedule(self.ActivityTimer)
self.ActivityTimer = nil
end
end
function XUiLivWarmActivityPop:RefreshActivityTime()
local timeId = XLivWarmActivityConfigs.GetLivWarmActivityTimeId()
local endTime = XFunctionManager.GetEndTimeByTimeId(timeId)
local now = XTime.GetServerNowTimestamp()
local offset = endTime - now
if self.TxtTime then
self.TxtTime.text = XUiHelper.GetTime(offset, XUiHelper.TimeFormatType.ACTIVITY)
end
end
function XUiLivWarmActivityPop:SetStageId(stageId)
self.StageId = stageId
self.StageDb = XDataCenter.LivWarmActivityManager.GetStageDb(stageId)
end
function XUiLivWarmActivityPop:RegisterButtonEvent()
self:RegisterClickEvent(self.BtnBack, self.Close)
self:RegisterClickEvent(self.BtnMainUi, self.OnBtnMainUiClick)
self:BindHelpBtn(self.BtnHelp, HelpKey)
self:RegisterClickEvent(self.PanelEntrance, self.OnPanelEntranceClick)
end
function XUiLivWarmActivityPop:OnClickTabCallBack(tabIndex)
if self.CurSelectTabIndex == tabIndex then
return
end
local stageId = self.StageIdList[tabIndex]
if not XDataCenter.LivWarmActivityManager.IsUnlockStage(stageId) then
local requireStageId = XLivWarmActivityConfigs.GetLivWarmActivityStageRequireStageId(stageId)
local stageName = XLivWarmActivityConfigs.GetLivWarmActivityStageClientStageName(requireStageId)
local tipDesc = CSXTextManagerGetText("LivWarmActivityStageLockTips", stageName)
XUiManager.TipMsg(tipDesc)
return
end
self:PlayAnimation("QieHuan")
self.CurSelectTabIndex = tabIndex
self:SetStageId(stageId)
self:StopPlayMoveActionTimer()
self:Refresh()
self:UpdatePhasesRewardGrid()
end
--跳转至音频解谜
function XUiLivWarmActivityPop:OnPanelEntranceClick()
local isPass,desc = XDataCenter.LivWarmSoundsActivityManager.GetIsActCanOpen()
if isPass then
XLuaUiManager.Open("UiLivWarmSoundsActivity")
else
XUiManager.TipMsg(desc)
end
end
function XUiLivWarmActivityPop:OnBtnMainUiClick()
XLuaUiManager.RunMain()
end
function XUiLivWarmActivityPop:ClickGrid(grid)
if self.PlayMoveActionTimer then
grid:CanelSelectButton()
return
end
local newHeadType = grid:GetHeadType()
if not self.CurSelectGrid and (newHeadType == XLivWarmActivityConfigs.HeadType.NotClict or newHeadType == XLivWarmActivityConfigs.HeadType.Blank) then
grid:CanelSelectButton()
return
end
local stageId = self:GetStageId()
local isFillUseMaxItemCount = XDataCenter.LivWarmActivityManager.IsFillUseMaxItemCount(stageId)
if not isFillUseMaxItemCount and not XDataCenter.LivWarmActivityManager.IsItemFillCount() then
XUiManager.TipText("LivWarmActivityItemNoEnough")
grid:CanelSelectButton()
self:UpdateLoseText()
return
end
local newRow = grid:GetRow()
local newColIndex = grid:GetColIndex()
if self.CurSelectGrid then
--前后两次选中的是同一个格子,取消选中
local oldRow = self.CurSelectGrid:GetRow()
local oldColIndex = self.CurSelectGrid:GetColIndex()
if newRow == oldRow and newColIndex == oldColIndex then
self:ClearCurSelectGrid()
return
end
--新选择的格子没有和上一次选择的格子相邻
if not self.CanSwapGrids[newRow] or not self.CanSwapGrids[newRow][newColIndex] then
if newHeadType == XLivWarmActivityConfigs.HeadType.Blank or newHeadType == XLivWarmActivityConfigs.HeadType.NotClict then
self:ClearCurSelectGrid()
else
self:SetCurSelectGrid(newRow, newColIndex, grid)
end
return
end
--新选择的格子和上一次选择的格子相邻且不可点击
if newHeadType == XLivWarmActivityConfigs.HeadType.NotClict then
return
end
--交换位置,检查是否消除,发给服务端
self:CheckClearGridAndReq(newRow, oldRow, newColIndex, oldColIndex)
return
end
self:SetCurSelectGrid(newRow, newColIndex, grid)
end
--播放选中的两个格子交换的动画
function XUiLivWarmActivityPop:StartPlayMoveActionTimer(stageId, newRow, oldRow, newColIndex, oldColIndex, clearGrids)
if self:GetStageId() ~= stageId then
return
end
local oldGrid = self:GetGridTemplate(oldRow, oldColIndex)
local newGrid = self:GetGridTemplate(newRow, newColIndex)
if not oldGrid or not newGrid then
return
end
local oldGridBtn = oldGrid:GetBtnClickTransform()
local newGridBtn = newGrid:GetBtnClickTransform()
local oldGridPos = oldGridBtn.position
local newGridPos = newGridBtn.position
local direction = oldGridPos - newGridPos
local isWin = self.StageDb:IsWin()
self.PlayMoveActionTimer = XUiHelper.Tween(0.2, function(f)
if XTool.UObjIsNil(self.Transform) then
return
end
oldGridBtn.position = oldGridPos - f * direction
newGridBtn.position = newGridPos + f * direction
end, function()
oldGrid:CanelSelectButton()
newGrid:CanelSelectButton()
local clearGridCount = 0
for _, clearGrid in pairs(clearGrids) do
for _ in pairs(clearGrid) do
clearGridCount = clearGridCount + 1
end
end
local totalClearGridCount = clearGridCount
local playAnimaCb = function()
clearGridCount = clearGridCount - 1
if clearGridCount <= 0 then
self:StopPlayMoveActionTimer()
XDataCenter.LivWarmSoundsActivityManager.UpdateNewStage() --更新新关卡开启情况
self:Refresh()
self:UpdatePhasesRewardGrid(true)
--没发生消除选中交换后的格子
if totalClearGridCount == 0 then
local grid = self:GetGridTemplate(newRow, newColIndex)
self:SetCurSelectGrid(newRow, newColIndex, grid)
end
if isWin then
XUiManager.TipText("LivWarmActivityClearStage")
self:PlayAnimation("WinEnable")
end
end
end
--动画播完后位置设置回去,然后设置交换后的头像,以及播放格子的消除动画
local isPlayAnimaCb = false
local oldHeadType = oldGrid:GetHeadType()
local newHeadType = newGrid:GetHeadType()
local stageId = self:GetStageId()
oldGridBtn.position = oldGridPos
newGridBtn.position = newGridPos
oldGrid:SetHeadType(newHeadType, stageId)
newGrid:SetHeadType(oldHeadType, stageId)
for row, gridTemplates in ipairs(self.GridTemplates) do
for col, gridTemplate in ipairs(gridTemplates) do
if clearGrids[row] and clearGrids[row][col] then
isPlayAnimaCb = true
gridTemplate:PlayClearAnima(function()
gridTemplate:SetHeadType(XLivWarmActivityConfigs.HeadType.Blank, stageId)
playAnimaCb()
end)
end
end
end
if not isPlayAnimaCb then
playAnimaCb()
end
end)
end
function XUiLivWarmActivityPop:StopPlayMoveActionTimer()
if self.PlayMoveActionTimer then
CS.XScheduleManager.UnSchedule(self.PlayMoveActionTimer)
self.PlayMoveActionTimer = nil
end
end
function XUiLivWarmActivityPop:SetCurSelectGrid(row, col, grid)
if not grid then
return
end
self:ClearCurSelectGrid()
self:AddCanSwapGrid(row, col)
grid:ClickButton()
self.CurSelectGrid = grid
end
function XUiLivWarmActivityPop:ClearCurSelectGrid()
if self.CurSelectGrid then
self.CurSelectGrid:CanelSelectButton()
end
self.CurSelectGrid = nil
self.CanSwapGrids = {}
end
--增加可以和当前选择的格子相邻的格子位置
function XUiLivWarmActivityPop:AddCanSwapGrid(curSelectGridRow, curSelectGridCol)
--左上角为第一行第一列
local upGridRow = curSelectGridRow - 1
local downGridRow = curSelectGridRow + 1
local leftGridCol = curSelectGridCol - 1
local rightGridCol = curSelectGridCol + 1
local gridTemplate = self:GetGridTemplate(upGridRow, curSelectGridCol)
if gridTemplate then
self:SetCanSwapGrids(upGridRow, curSelectGridCol)
end
gridTemplate = self:GetGridTemplate(downGridRow, curSelectGridCol)
if gridTemplate then
self:SetCanSwapGrids(downGridRow, curSelectGridCol)
end
gridTemplate = self:GetGridTemplate(curSelectGridRow, leftGridCol)
if gridTemplate then
self:SetCanSwapGrids(curSelectGridRow, leftGridCol)
end
gridTemplate = self:GetGridTemplate(curSelectGridRow, rightGridCol)
if gridTemplate then
self:SetCanSwapGrids(curSelectGridRow, rightGridCol)
end
end
function XUiLivWarmActivityPop:SetCanSwapGrids(row, col)
if not self.CanSwapGrids[row] then
self.CanSwapGrids[row] = {}
end
self.CanSwapGrids[row][col] = true
end
function XUiLivWarmActivityPop:CheckClearGridAndReq(newRow, oldRow, newColIndex, oldColIndex)
if (newRow == oldRow and newColIndex == oldColIndex) or (newRow ~= oldRow and newColIndex ~= oldColIndex) then
return
end
local gridData = {}
for row, gridTemplate in pairs(self.GridTemplates) do
if not gridData[row] then
gridData[row] = {}
end
for col, grid in pairs(gridTemplate) do
gridData[row][col] = grid:GetHeadType()
end
end
local clearGrids = {} --确定要消除的格子的行列数据
local waitClearGrids = {} --缓存可能要消除的格子的行列数据
local clearHeadTypes = {} --消除的格子类型和数量
local curWaitClearHeadType --当前待消除的格子类型
local gridTemp --当前行列的格子对象
local oldHeadType = gridData[oldRow] and gridData[oldRow][oldColIndex]
local newHeadType = gridData[newRow] and gridData[newRow][newColIndex]
if not oldHeadType or not newHeadType then
return
end
gridData[oldRow][oldColIndex] = newHeadType
gridData[newRow][newColIndex] = oldHeadType
local CheckSetClearGrids = function(clearHeadCount)
if clearHeadCount >= CanClearHeadMinCount then
for row, grids in pairs(waitClearGrids) do
if not clearGrids[row] then
clearGrids[row] = {}
end
for col, headType in pairs(grids) do
clearGrids[row][col] = headType
if not clearHeadTypes[headType] then
clearHeadTypes[headType] = 0
end
clearHeadTypes[headType] = clearHeadTypes[headType] + 1
end
end
end
waitClearGrids = {}
end
local SetWaitClearGrids = function(row, col, headType)
if not waitClearGrids[row] then
waitClearGrids[row] = {}
end
waitClearGrids[row][col] = headType
end
local CheckSetWaitClearGrids = function(row, col, headType)
return gridData[row] and gridData[row][col] == headType
end
--在同一行或同一列中,遍历相同类型且相邻的格子
--isChangeRowtrue的情况下遍历一列的格子其他情况遍历一行的格子
local Traverse = function(row, col, isChangeRow, headType)
local isTraverseUpper = true --是否继续往前遍历
local isTraverseNext = true --是否继续往后遍历
local traverseCount = 0 --循环遍历次数
local headCount = 1 --相邻且相同类型的格子数量(包括自身)
SetWaitClearGrids(row, col, headType)
while isTraverseUpper or isTraverseNext do
traverseCount = traverseCount + 1
local upper = isChangeRow and row - traverseCount or col - traverseCount
local next = isChangeRow and row + traverseCount or col + traverseCount
local constant = isChangeRow and col or row
if isChangeRow then
if not gridData[upper] and not gridData[next] then
break
end
else
if (not gridData[constant]) or (not gridData[constant][upper] and not gridData[constant][next]) then
break
end
end
--往前遍历和当前格子类型相同的数量
if isTraverseUpper then
local rowTemp = isChangeRow and upper or constant
local colTemp = isChangeRow and constant or upper
if CheckSetWaitClearGrids(rowTemp, colTemp, headType) then
SetWaitClearGrids(rowTemp, colTemp, headType)
headCount = headCount + 1
else
isTraverseUpper = false
end
end
--往后遍历和当前格子类型相同的数量
if isTraverseNext then
local rowTemp = isChangeRow and next or constant
local colTemp = isChangeRow and constant or next
if CheckSetWaitClearGrids(rowTemp, colTemp, headType) then
SetWaitClearGrids(rowTemp, colTemp, headType)
headCount = headCount + 1
else
isTraverseNext = false
end
end
end
CheckSetClearGrids(headCount)
end
if oldHeadType ~= XLivWarmActivityConfigs.HeadType.Blank and oldHeadType ~= XLivWarmActivityConfigs.HeadType.NotClict then
Traverse(newRow, newColIndex, true, oldHeadType) --遍历第二次选择的格子所在的列可消除的格子
Traverse(newRow, newColIndex, false, oldHeadType) --遍历第二次选择的格子所在的行可消除的格子
end
if newHeadType ~= XLivWarmActivityConfigs.HeadType.Blank and newHeadType ~= XLivWarmActivityConfigs.HeadType.NotClict then
Traverse(oldRow, oldColIndex, true, newHeadType) --遍历首次选择的格子所在的列可消除的格子
Traverse(oldRow, oldColIndex, false, newHeadType) --遍历首次选择的格子所在的行可消除的格子
end
--消除(如果有)并构建发给服务端的数据
local dismisProgressCount = 0 --单次消除进度总和
local stageId = self:GetStageId()
local successCb = function()
self:StartPlayMoveActionTimer(stageId, newRow, oldRow, newColIndex, oldColIndex, clearGrids)
end
for headType, dismisCount in pairs(clearHeadTypes) do
dismisProgressCount = dismisProgressCount + math.ceil(dismisCount / CanClearHeadMinCount) --同种颜色的头像一次性消除3个以上时根据【消球数目/3】增加关卡进度并且向上取整
end
for row, headTypes in pairs(gridData) do
for col in pairs(headTypes) do
if clearGrids[row] and clearGrids[row][col] then
gridData[row][col] = XLivWarmActivityConfigs.HeadType.Blank
end
end
end
self:RequestLivWarmActivityChangeStage(gridData, dismisProgressCount, successCb)
end
function XUiLivWarmActivityPop:RequestLivWarmActivityChangeStage(gridData, dismisCount, successCb)
self:ClearCurSelectGrid()
local stageId = self:GetStageId()
local dismisMaxCount = XLivWarmActivityConfigs.GetLivWarmActivityStageDismisMaxCount(stageId)
local dismisTotalCount = self:GetDismisTotalProgress()
local isWin = dismisTotalCount + dismisCount >= dismisMaxCount
XDataCenter.LivWarmActivityManager.RequestLivWarmActivityChangeStage(stageId, dismisCount, isWin, gridData, successCb)
end
function XUiLivWarmActivityPop:ReceiveCallBack()
local stageId = self:GetStageId()
XDataCenter.LivWarmActivityManager.RequestLivWarmActivityTakeReward(stageId, function()
self:UpdateRedPoint()
self:UpdatePhasesRewardGrid()
end)
end
function XUiLivWarmActivityPop:UpdateRedPoint()
local btn
local isShowReddot
for i, stageId in ipairs(self.StageIdList) do
btn = self.TabGroup[i]
if btn then
isShowReddot = XDataCenter.LivWarmActivityManager.CheckRewardRedPointByStageId(stageId)
btn:ShowReddot(isShowReddot)
end
end
end
function XUiLivWarmActivityPop:GetStageId()
return self.StageId
end
function XUiLivWarmActivityPop:GetDismisTotalProgress()
local stageDb = self.StageDb
return stageDb and stageDb:GetDismisCount()
end
function XUiLivWarmActivityPop:GetGridTemplate(row, col)
return self.GridTemplates[row] and self.GridTemplates[row][col]
end
function XUiLivWarmActivityPop:RefreshPanelEntranceRedPoint()
local result = XDataCenter.LivWarmSoundsActivityManager.CheckRedPoint()
self.PanelEntrance:ShowReddot(result)
end