---@class UiBabelTowerBase : XLuaUi local XUiBabelTowerBase = XLuaUiManager.Register(XLuaUi, "UiBabelTowerBase") function XUiBabelTowerBase:OnAwake() local itemId = XDataCenter.ItemManager.ItemId self.AssetPanel = XUiPanelAsset.New(self, self.PanelAsset, itemId.FreeGem, itemId.ActionPoint, itemId.Coin) self.BtnBack.CallBack = function() self:OnBtnBackClick() end self.BtnMainUi.CallBack = function() self:OnBtnMainUiClick() end self.BtnNext.CallBack = function() self:OnBtnNextClick() end self.BtnLast.CallBack = function() self:OnBtnLastClick() end self.BtnFight.CallBack = function() self:OnBtnFightClick() end self.BtnEnvironment.CallBack = function() self:OnBtnEnvironmentClick() end self.ActivityType = nil -- XEventManager.AddEventListener(XEventId.EVENT_BABEL_ACTIVITY_STATUS_CHANGED, self.CheckActivityStatus, self) end function XUiBabelTowerBase:OnStart(stageId, teamId) local cacheTeamData = XDataCenter.FubenBabelTowerManager.GetCacheTeam(stageId, teamId) local teamList = cacheTeamData.TeamData local captainPos = cacheTeamData.CaptainPos local firstFightPos = cacheTeamData.FirstFightPos self.StageId = stageId local stageTemplate = XFubenBabelTowerConfigs.GetBabelTowerStageTemplate(stageId) self.GuideId = stageTemplate.StageGuideId[1] self.TeamId = teamId self.TeamList = teamList self.CaptainPos = captainPos self.FirstFightPos = firstFightPos self.ProtectRobotCount = stageTemplate.ProtectRobotCount or 0 self.ChallengeBuffInfos = {} self.SupportBuffInfos = {} -- 失效的词条Id self.LoseEfficacyBuffIds = {} self.IsFirstOpenChildSupport = true self.CurrentPhase = XFubenBabelTowerConfigs.ChallengePhase self.ActivityType = XDataCenter.FubenBabelTowerManager.GetActivityTypeByStageId(stageId) self:SetChallengeBuffLoseEfficacy() self:SetBabelTowerPhase() -- 显示红点 self:ShowEnvirementDot() -- 开启自动关闭检查 local endTime = XDataCenter.FubenBabelTowerManager.GetEndTime(self.ActivityType) self:SetAutoCloseInfo(endTime, function(isClose) if isClose then XDataCenter.FubenBabelTowerManager.HandleActivityEndTime(self.ActivityType) end end) end function XUiBabelTowerBase:OnDestroy() XEventManager.RemoveEventListener(XEventId.EVENT_BABEL_ACTIVITY_STATUS_CHANGED, self.CheckActivityStatus, self) end function XUiBabelTowerBase:OnEnable() XUiBabelTowerBase.Super.OnEnable(self) self:CheckActivityStatus() if not self.FirstOpenDiffcultUi then self:FindChildUiObj(XFubenBabelTowerConfigs.CHALLENGE_CHILD_UI):OnClickBtnDifficult() self.FirstOpenDiffcultUi = true end if XDataCenter.FubenBabelTowerManager.IsNeedShowUiDifficult() then XDataCenter.FubenBabelTowerManager.SetNeedShowUiDifficult(nil) self:FindChildUiObj(XFubenBabelTowerConfigs.CHALLENGE_CHILD_UI):OnClickBtnDifficult() end end function XUiBabelTowerBase:OnReleaseInst() return self.FirstOpenDiffcultUi end function XUiBabelTowerBase:OnResume(value) self.FirstOpenDiffcultUi = value end function XUiBabelTowerBase:CheckActivityStatus() if not XLuaUiManager.IsUiShow("UiBabelTowerBase") then return end XDataCenter.FubenBabelTowerManager.HandleActivityEndTime(self.ActivityType) end function XUiBabelTowerBase:OnBtnBackClick() if self.CurrentPhase and self.CurrentPhase == XFubenBabelTowerConfigs.SupportPhase then local supportBuffs = self:GetHandleSupportBuffs() XDataCenter.FubenBabelTowerManager.UpdateSupportBuffListCache(self.StageId, supportBuffs, self.TeamId) self:Switch2ChallengePhase() else self:Close() end end function XUiBabelTowerBase:OnBtnMainUiClick() XLuaUiManager.RunMain() end function XUiBabelTowerBase:OnBtnNextClick() self:Switch2SupportPhase() end function XUiBabelTowerBase:Switch2SupportPhase() self:CheckAffixLevel(function() self.CurrentPhase = XFubenBabelTowerConfigs.SupportPhase self:SetBabelTowerPhase() end) end function XUiBabelTowerBase:OnBtnLastClick() local supportBuffs = self:GetHandleSupportBuffs() XDataCenter.FubenBabelTowerManager.UpdateSupportBuffListCache(self.StageId, supportBuffs, self.TeamId) self:Switch2ChallengePhase() end function XUiBabelTowerBase:Switch2ChallengePhase() self.CurrentPhase = XFubenBabelTowerConfigs.ChallengePhase self:SetBabelTowerPhase() end function XUiBabelTowerBase:GetHandleSupportBuffs() local supportBuffs = {} for i = 1, #self.SupportBuffInfos do local buffItem = self.SupportBuffInfos[i] table.insert(supportBuffs, { GroupId = buffItem.BuffGroupId, BufferId = buffItem.SelectBuffId }) end return supportBuffs end function XUiBabelTowerBase:OnBtnFightClick() local buffStageId = -1 -- challenge_buff local challengeBuffs = {} for i = 1, #self.ChallengeBuffInfos do local buffItem = self.ChallengeBuffInfos[i] table.insert(challengeBuffs, { GroupId = buffItem.BuffGroupId, BufferId = buffItem.SelectBuffId }) local buffConfig = XFubenBabelTowerConfigs.GetBabelTowerBuffTemplate(buffItem.SelectBuffId) if buffStageId <= 0 and buffConfig and buffConfig.StageId > 0 then buffStageId = buffConfig.StageId end end if buffStageId <= 0 then buffStageId = self.StageId end -- self.StageId = buffStageId -- support_buff local supportBuffs = self:GetHandleSupportBuffs() -- 能否战斗 local isUnlock, description = XDataCenter.FubenBabelTowerManager.IsBabelStageUnlock(self.StageId) if not isUnlock then XUiManager.TipMsg(description) return end -- 是否有队长 local captainPos = self.CaptainPos local captainId = self.TeamList[captainPos] if captainId == nil or captainId <= 0 then XUiManager.TipMsg(CS.XTextManager.GetText("BabelTowerPleaseSelectALeader")) return end -- 是否有首发 local firstFightPos = self.FirstFightPos local firFightId = self.TeamList[firstFightPos] if firFightId == nil or firFightId <= 0 then XUiManager.TipMsg(CS.XTextManager.GetText("BabelTowerPleaseSelectAFirstFight")) return end local onFight = function() local selectDifficult = XDataCenter.FubenBabelTowerManager.GetTeamSelectDifficult(self.StageId, self.TeamId) XDataCenter.FubenBabelTowerManager.SelectBabelTowerStage(self.StageId, self.GuideId, self.TeamList, challengeBuffs, supportBuffs, function() XDataCenter.FubenBabelTowerManager.SaveCurStageInfo(self.StageId, self.TeamId, self.GuideId, self.TeamList, challengeBuffs, supportBuffs, captainPos, selectDifficult, firstFightPos) if XDataCenter.FubenBabelTowerManager.IsStageGuideAuto(self.GuideId) then XDataCenter.FubenBabelTowerManager.UpdateBuffListCache(self.StageId, challengeBuffs, self.TeamId) end XDataCenter.FubenBabelTowerManager.UpdateSupportBuffListCache(self.StageId, supportBuffs, self.TeamId) XDataCenter.FubenBabelTowerManager.SetTeamChace(self.StageId, self.TeamId, self.TeamList, captainPos, firstFightPos) XDataCenter.FubenManager.EnterBabelTowerFight(buffStageId, self.TeamList, captainPos, firstFightPos) end, selectDifficult, self.TeamId) end self:CheckAbility(onFight) end function XUiBabelTowerBase:UpdateTeamList(teamList, captainPos, firstFightPos) self.TeamList = teamList self.CaptainPos = captainPos self.FirstFightPos = firstFightPos self:SetChallengeBuffLoseEfficacy() self:FilterChoosedChallengeList() end function XUiBabelTowerBase:UpdateChallengeBuffInfos(choosedChallengeList) self.ChallengeBuffInfos = choosedChallengeList -- 更新当前可使用的最大成员数量 local result = 3 local limitCount for _, buffData in ipairs(choosedChallengeList) do limitCount = XFubenBabelTowerConfigs.GetBuffTeamLimitCount(buffData.SelectBuffId) result = math.min(limitCount, result) end XDataCenter.FubenBabelTowerManager.SetMaxTeamMemberCount(result) -- 通知检查当前角色是否被禁用 XEventManager.DispatchEvent(XEventId.EVNET_BABEL_CHALLENGE_BUFF_CHANGED) end function XUiBabelTowerBase:UpdateSupportBuffInfos(choosedSupportBuffList) self.SupportBuffInfos = choosedSupportBuffList end function XUiBabelTowerBase:OnBtnEnvironmentClick() local activityNo = XDataCenter.FubenBabelTowerManager.GetCurrentActivityNo() local key = string.format(XFubenBabelTowerConfigs.ENVIROMENT_DOT_KEY, tostring(XPlayer.Id), tostring(activityNo), tostring(self.StageId)) XDataCenter.FubenBabelTowerManager.UpdateBabalPrefsByKey(key, 1) self:ShowEnvirementDot() XLuaUiManager.Open("UiBabelTowerDetails", XFubenBabelTowerConfigs.TIPSTYPE_ENVIRONMENT, self.StageId) end function XUiBabelTowerBase:ShowEnvirementDot() local activityNo = XDataCenter.FubenBabelTowerManager.GetCurrentActivityNo() local key = string.format(XFubenBabelTowerConfigs.ENVIROMENT_DOT_KEY, tostring(XPlayer.Id), tostring(activityNo), tostring(self.StageId)) local envir_dot = XDataCenter.FubenBabelTowerManager.GetBabelPrefsByKey(key, 0) local hasTouch = envir_dot == 1 self.BtnEnvironment:ShowReddot(not hasTouch) end function XUiBabelTowerBase:SetBabelTowerPhase() if not self.CurrentPhase then return end if XFubenBabelTowerConfigs.ChallengePhase == self.CurrentPhase then self.BtnNext.gameObject:SetActiveEx(true) self.BtnLast.gameObject:SetActiveEx(false) self.BtnFight.gameObject:SetActiveEx(false) self:OpenOneChildUi(XFubenBabelTowerConfigs.CHALLENGE_CHILD_UI, self, self.StageId, self.GuideId, self.TeamId) self:FindChildUiObj(XFubenBabelTowerConfigs.CHALLENGE_CHILD_UI):PlayAnimation("AnimStartEnable") if XLuaUiManager.IsUiShow(XFubenBabelTowerConfigs.SUPPORT_CHILD_UI) then self:FindChildUiObj(XFubenBabelTowerConfigs.SUPPORT_CHILD_UI):Close() end end if XFubenBabelTowerConfigs.SupportPhase == self.CurrentPhase then self.BtnNext.gameObject:SetActiveEx(false) self.BtnLast.gameObject:SetActiveEx(false) self.BtnFight.gameObject:SetActiveEx(true) self:OpenOneChildUi(XFubenBabelTowerConfigs.SUPPORT_CHILD_UI, self, self.StageId, self.GuideId, self.TeamId, self.TeamList, self.CaptainPos, self.FirstFightPos) if not self.IsFirstOpenChildSupport then self:FindChildUiObj(XFubenBabelTowerConfigs.SUPPORT_CHILD_UI):RestoreSupportBuff() else self.IsFirstOpenChildSupport = false end self:FindChildUiObj(XFubenBabelTowerConfigs.SUPPORT_CHILD_UI):PlayAnimation("AnimStartEnable") if XLuaUiManager.IsUiShow(XFubenBabelTowerConfigs.CHALLENGE_CHILD_UI) then self:FindChildUiObj(XFubenBabelTowerConfigs.CHALLENGE_CHILD_UI):Close() end end self:SwitchBg() end function XUiBabelTowerBase:SwitchBg() local stageConfig = XFubenBabelTowerConfigs.GetBabelStageConfigs(self.StageId) if XFubenBabelTowerConfigs.ChallengePhase == self.CurrentPhase then --暂时先屏蔽,因为BabelTowerStageDetails表里没有配置SupportUiBg和ChallengeUiBg字段会导致显示错误 --self.BgImage:SetRawImage(stageConfig.ChallengeUiBg) end if XFubenBabelTowerConfigs.SupportPhase == self.CurrentPhase then --self.BgImage:SetRawImage(stageConfig.SupportUiBg) end end function XUiBabelTowerBase:GetCurChallengeScore(challengeList) local totalChallengeScore = 0 if self.stageTemplate then totalChallengeScore = self.stageTemplate.BaseScore end for _, v in pairs(challengeList or {}) do local buffTemplate = XFubenBabelTowerConfigs.GetBabelTowerBuffTemplate(v.SelectBuffId) totalChallengeScore = totalChallengeScore + (buffTemplate.ScoreAdd or 0) end local selectDifficult = XDataCenter.FubenBabelTowerManager.GetTeamSelectDifficult(self.StageId, self.TeamId) local ratio = XFubenBabelTowerConfigs.GetStageDifficultRatio(self.StageId, selectDifficult) return math.floor(totalChallengeScore * ratio) end function XUiBabelTowerBase:GetCurAllChallengeScore() local challengeBuffGroup = {} local stageTemplate = XFubenBabelTowerConfigs.GetBabelTowerStageTemplate(self.StageId) for i = 1, #stageTemplate.ChallengeBuffGroup do local groupId = stageTemplate.ChallengeBuffGroup[i] local buffGroupTemplate = XFubenBabelTowerConfigs.GetBabelTowerBuffGroupTemplate(groupId) local buffId = buffGroupTemplate.BuffId[#buffGroupTemplate.BuffId] --取分数最大的一个 local isLock = self:IsBuffLock(buffId) if not isLock then table.insert(challengeBuffGroup, { SelectBuffId = buffId }) end end return self:GetCurChallengeScore(challengeBuffGroup) end function XUiBabelTowerBase:IsBuffLock(buffId, lockCallback, loseCallback) local selectDifficult = XDataCenter.FubenBabelTowerManager.GetTeamSelectDifficult(self.StageId, self.TeamId) local openLevel = XFubenBabelTowerConfigs.GetStageDifficultLockBuffIdOpenLevel(self.StageId, buffId) local isLock = openLevel and openLevel ~= 0 and selectDifficult <= openLevel or false local isLoseEfficacy = self:CheckBuffIdLoseEfficacy(buffId) if isLock and lockCallback then lockCallback() end if isLoseEfficacy and loseCallback then loseCallback() end return isLock or isLoseEfficacy end -- @Desc 检查词缀等级 function XUiBabelTowerBase:CheckAffixLevel(callBack) --[[ 1.如果玩家当前选择词缀的【总词缀等级=当前所有可选词缀的总等级】,则不进行任何提示 2.如果玩家当前的已选词缀的【总词缀等级>先前最高词缀等级】 ,则不进行任何提示 3.如果玩家当前的选择词缀的【总词缀等级≤先前最高词缀等级】, 则显示提示 ]] local curSelectLevel = self:GetCurChallengeScore(self.ChallengeBuffInfos) local allLevel = self:GetCurAllChallengeScore() local maxLevel = XDataCenter.FubenBabelTowerManager.GetTeamMaxScore(self.StageId, self.TeamId) local value = XDataCenter.FubenBabelTowerManager.GetBabelTowerInfo(XFubenBabelTowerConfigs.AFFIX_LEVEL_INADEQUATE_KEY, false) if curSelectLevel == allLevel or curSelectLevel > maxLevel or value then callBack() else local warnInfo = { Title = CsXTextManagerGetText("BabelTowerAffixLevelInadequateTitle"), Content = CSXTextManagerGetText("BabelTowerAffixLevelInadequateContent"), IsWarning = false, HintInfo = { HintClickName = "BtnNoWarning", HintCb = function(isSelect) XDataCenter.FubenBabelTowerManager.SaveBabelTowerInfo(XFubenBabelTowerConfigs.AFFIX_LEVEL_INADEQUATE_KEY, isSelect) end, Status = false, }, } XLuaUiManager.Open("UiBabelTowerMainNewTips", nil, warnInfo, nil, callBack) end end -- @Desc 检查战力 function XUiBabelTowerBase:CheckAbility(callBack) -- 所选 buff 最高战力 local buffMaxAbility = 0 for _, v in pairs(self.ChallengeBuffInfos or {}) do local buffConfigs = XFubenBabelTowerConfigs.GetBabelBuffConfigs(v.SelectBuffId) local buffAbility = buffConfigs.BuffSuggestAbility or 0 if buffAbility > buffMaxAbility then buffMaxAbility = buffAbility end end --队伍里最高战力 local playerMaxAbility = 0 for _, characterId in pairs(self.TeamList or {}) do if XTool.IsNumberValid(characterId) then local playerAbility = XEntityHelper.GetCharacterAbility(characterId) or 0 if playerAbility > playerMaxAbility then playerMaxAbility = playerAbility end end end -- 当前难度推荐战力 local selectDifficult = XDataCenter.FubenBabelTowerManager.GetTeamSelectDifficult(self.StageId, self.TeamId) local recommendAbility = XFubenBabelTowerConfigs.GetStageDifficultRecommendAblity(self.StageId, selectDifficult) -- 是否不在提示 local activityNo = XDataCenter.FubenBabelTowerManager.GetCurrentActivityNo() local key = string.format(XFubenBabelTowerConfigs.ABILITY_WARNING_KEY, tostring(XPlayer.Id), tostring(activityNo), tostring(self.StageId)) local value = XDataCenter.FubenBabelTowerManager.GetBabelPrefsByKey(key, false) --[[ 1.当玩家最高战力大于等于所有所选BUFF的战力需求时,视为满足条件 2.当玩家最高战力大于等于所选难度的战力需求时,视为满足条件 3.若条件1,2同时满足条件,则不显示提示弹窗,否则显示提示弹窗 ]] if (playerMaxAbility >= buffMaxAbility and playerMaxAbility >= recommendAbility) or value then callBack() else local warnInfo = { Title = CsXTextManagerGetText("BabelTowerAbilityWarningTitle"), Content = CSXTextManagerGetText("BabelTowerAbilityWarningContent"), IsWarning = true, HintInfo = { HintClickName = "BtnNoWarning2", HintCb = function(isSelect) XDataCenter.FubenBabelTowerManager.UpdateBabalPrefsByKey(key, isSelect) end, Status = false, }, } local changeRole = function() self:FindChildUiObj(XFubenBabelTowerConfigs.SUPPORT_CHILD_UI):OnBtnGoClick() end XLuaUiManager.Open("UiBabelTowerMainNewTips", nil, warnInfo, changeRole, callBack) end end -- 设置失效的词条信息 function XUiBabelTowerBase:SetChallengeBuffLoseEfficacy() local isLoseEfficacy = self:CheckProtectChallengeBuffLoseEfficacy() if not isLoseEfficacy then self.LoseEfficacyBuffIds = {} return end if not XTool.IsTableEmpty(self.LoseEfficacyBuffIds) then return end local stageTemplate = XFubenBabelTowerConfigs.GetBabelTowerStageTemplate(self.StageId) local buffGroup = stageTemplate.ProtectChallengeBuffGroup or {} for _, groupId in pairs(buffGroup) do local buffGroupTemplate = XFubenBabelTowerConfigs.GetBabelTowerBuffGroupTemplate(groupId) local buffIds = buffGroupTemplate.BuffId self.LoseEfficacyBuffIds = XTool.MergeArray(self.LoseEfficacyBuffIds, buffIds) end end -- 过滤失效的词条 function XUiBabelTowerBase:FilterChoosedChallengeList() local isHaveLoseBuff = self:ShowBuffLoseEfficacyTip() if not isHaveLoseBuff then return end -- 刷新选择的词条 local childChallenge = self:FindChildUiObj(XFubenBabelTowerConfigs.CHALLENGE_CHILD_UI) if childChallenge then childChallenge:FilterChoosedChallengeList() end end -- 检测保护的词条组是否失效(当满足对应的机器人数量时,对应配置的保护词条组失效) function XUiBabelTowerBase:CheckProtectChallengeBuffLoseEfficacy() if XTool.IsTableEmpty(self.TeamList) then return false end local robotCount = 0 for _, entitiyId in pairs(self.TeamList) do if XEntityHelper.GetIsRobot(entitiyId) then robotCount = robotCount + 1 end end if XTool.IsNumberValid(self.ProtectRobotCount) and robotCount >= self.ProtectRobotCount then return true end return false end -- 显示buff失效弹框 function XUiBabelTowerBase:ShowBuffLoseEfficacyTip() -- 是否有选择的词条失效 local isHaveLoseBuff = false for _, info in pairs(self.ChallengeBuffInfos or {}) do local isContain = self:CheckBuffIdLoseEfficacy(info.SelectBuffId) if isContain then isHaveLoseBuff = true break end end -- 弹出提示 if isHaveLoseBuff then local babelTowerStageCfg = XFubenBabelTowerConfigs.GetBabelStageConfigs(self.StageId) local protectTipText = babelTowerStageCfg.ProtectTipText or "" if not string.IsNilOrEmpty(protectTipText) then XUiManager.TipMsg(protectTipText) end end return isHaveLoseBuff end -- 检测词条Id是否失效 function XUiBabelTowerBase:CheckBuffIdLoseEfficacy(buffId) if XTool.IsTableEmpty(self.LoseEfficacyBuffIds) then return false end return table.contains(self.LoseEfficacyBuffIds, buffId) end