local ClimbTower_Controller = {} local private = {} local EventSystem = require('Event/EventSystem') local _isShowGSNotice = true --是否显示战力提示 ---开启时间常量按照地区配置,如果配置为[0,0]则为无时间限制 local ClimbTowerOpenTimeIdList = DataSheetManager.ConstData:GetDataByID("ClimbTower_OpenTime").IntListValue local ClimbTowerOpenTimeId = ClimbTowerOpenTimeIdList[1] local ClimbTowerEndTimeId = ClimbTowerOpenTimeIdList[2] function ClimbTower_Controller.OnStartup() EventSystem.Regist(EventID.UI_UpdateClimbTowerInfo, private.RefreshClimbTowerEntryRed) EventSystem.Regist(CTL.RedPoint.RedPointKey.ClimbTowerEntry, private.RefreshRedPoint) EventSystem.Regist(EventID.TownLevelBegin,private.OpenEarningsUp) private.sortedClimbTowerLevel = DataSheetUtil.CreateSortedDataSheet("ClimbTowerLevel") end --打开爬塔主界面 function ClimbTower_Controller.OpenMainPanel() if not UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIClimbTowerEntry) then UIManager.OpenView(Const_UI_Lua.UIEnum.UIClimbTowerEntry) if not MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.FourNationClimbTower) and ClimbTower_Controller.IsDuringOpenTime() then UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UIClimbTowerMainPanel) elseif not ClimbTower_Controller.IsDuringOpenTime() then CTL.Tips.AddTipsMsg(CTL.ClimbTower.GetOpenTimeDesc()) end end end function ClimbTower_Controller.OpenNormalClimbTower() if not ClimbTower_Controller.IsDuringOpenTime() then CTL.Tips.AddTipsMsg(ClimbTower_Controller.GetOpenTimeDesc()) return end UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UIClimbTowerMainPanel) end --港澳台普通爬塔无限制,四国爬塔时间有限制 --其他地区的四国爬塔限制时间与普通爬塔一致 function ClimbTower_Controller.IsDuringOpenTime() if ClimbTowerOpenTimeId == 0 and ClimbTowerEndTimeId == 0 then return true end return UTL.Time.IsServerInOpeningTime(ClimbTowerOpenTimeId, ClimbTowerEndTimeId) end function ClimbTower_Controller.GetOpenTimeDesc() if ClimbTowerOpenTimeId == 0 and ClimbTowerEndTimeId == 0 then return "" end local openTypeDesc, openTimeConfig = UTL.Time.GetDateDescAndTimeById(ClimbTowerOpenTimeId, ClimbTowerEndTimeId) return string.FormatByIdsId(Const_IDS["IDS_NationClimbTower_OpenTime_2"], openTypeDesc, openTimeConfig) end function private.OnTimeUpOKBtnFunc() MDL.Purchase.PurchaseNumsReq(LuaConst.ActivityType.ClimbTower,1) end --打开加速界面 function ClimbTower_Controller.OpenTimeUpView() if MDL.ClimbTower.GetIsCloseSpeedUp() then return end if MDL.ClimbTower.GetPassFarthestId() > 0 then local title = Const_IDS.IDS_ClimbTower_SpeedTitle local climbTowerSpeedReward = DataSheetManager.ConstData:GetDataByID("ClimbTowerSpeedReward").IntValue local content1 = string.FormatByIdsId(Const_IDS.IDS_ClimbTower_SpeedInfo, climbTowerSpeedReward / UTL.Time.TotalSecondsOneHour) local activityData = DataSheetManager.ActivityData:GetDataByID(LuaConst.ActivityType.ClimbTower) local freeTimes = activityData.DailyRefreshTimes local payTimes = #activityData.PayNum local totalTimes = payTimes + freeTimes local leftTimes = totalTimes - MDL.ClimbTower.GetFreeNums() - MDL.ClimbTower.GetPayNums() local content2 = UTL.Color.GetContentWithColor(101,UIUtils.GetLocalizedTxt(Const_IDS.IDS_ClimbTower_SpeedLastTime)) local unClickContent = nil local isHideCoin = false if leftTimes > 0 then content2 = content2 ..UTL.Color.GetContentWithColor(103,string.format("%d/%d", leftTimes, totalTimes)) else content2 = content2 ..UTL.Color.GetContentWithColor(105,string.format("%d/%d", leftTimes, totalTimes)) unClickContent = Const_IDS["IDS_ClimbTower_NoSpeedTimes"] isHideCoin = true end local isFree = (freeTimes - MDL.ClimbTower.GetFreeNums()) > 0 and true or false local freeContent = isFree and Const_IDS.IDS_ClimbTower_SpeedFree or nil local index = math.min(MDL.ClimbTower.GetPayNums() + 1, payTimes) UTL.MessageBox.ShowPurchaseView(title, content1, content2, private.OnTimeUpOKBtnFunc, nil, nil, nil, unClickContent, freeContent, activityData.PayItem, activityData.PayNum[index], isHideCoin) else CTL.Tips.AddTipsMsg(Const_IDS["IDS_ClimbTower_CannotSpeed"]) end end --结算界面 function ClimbTower_Controller.ShowBattleSummary(msg) CTL.HomeMain.CloseOpenView() MDL.ClimbTower.SaveTotalRewards(msg.Resp.Rewards) --失败了显示结算,胜利了显示奖励提示 if msg.isWin then if ClimbTower_Controller.IsPassedAllLevel() or ClimbTower_Controller.IsReachMaxChallengeLevelCountOfEveryDay() or ClimbTower_Controller.IsPassedLastLevelOfChapter() then UIManager.OpenView(Const_UI_Lua.UIEnum.UIClimbTowerSummary, {Win = true}) else UIManager.OpenView(Const_UI_Lua.UIEnum.UIClimbTowerLevelClear) end else UIManager.OpenView(Const_UI_Lua.UIEnum.UIClimbTowerSummary, {Win = false}) end private.SetNoticeEarningsUpData() end --设置挂机奖励 function private.SetNoticeEarningsUpData() MDL.ClimbTower.NoticeEarningsUpData = nil local levelData = DataSheetManager.ClimbTowerLevel:GetDataByID(MDL.ClimbTower.GetPassFarthestId()) if levelData and levelData.HangUpShowNewReward > 0 then MDL.ClimbTower.NoticeEarningsUpData = levelData end end --手动退出时的结算 function ClimbTower_Controller.ShowQuitSummary() LuaInputManager.SetSpecialCommand(LuaConst.SpecialCommandType.QuitRoom) private.SetNoticeEarningsUpData() NotSyncBattleSetter.PauseLevel(false) end --离开副本打开收益提升界面 function private.OpenEarningsUp() if MDL.ClimbTower.NoticeEarningsUpData then UIManager.OpenView(Const_UI_Lua.UIEnum.UIClimbTowerEarningsUp) MDL.ClimbTower.NoticeEarningsUpData = nil end end --领取奖励界面 function ClimbTower_Controller.OpenEarningsInfo() if MDL.ClimbTower.GetPassFarthestId() > 0 then UIManager.OpenView(Const_UI_Lua.UIEnum.UIClimbTowerEarningsInfo) else CTL.Tips.AddTipsMsg(Const_IDS["IDS_ClimbTower_NoRewardTip"]) end end --是否满足挑战下一关 function ClimbTower_Controller.CanChallengeNextLevel() --爬塔未在活开启时间内 if not ClimbTower_Controller.IsDuringOpenTime() then return false, nil, ClimbTower_Controller.GetOpenTimeDesc() end local nextConfig = ClimbTower_Controller.GetNextLevelConfig() if nextConfig then local ifSatisfied, unlockText = CTL.Unlock.JudgeIfSatisfiedUnlockTable(nextConfig.Unlock_Table) if ifSatisfied then return true, nextConfig, nil else return false, nextConfig, unlockText end end --没有下一关 return false, nil, Const_IDS["IDS_ClimbTower_MaxLevel"] end --获取下一个关卡(不一定满足条件) function ClimbTower_Controller.GetNextLevelConfig() local passedFarthestId = MDL.ClimbTower.GetPassFarthestId() if passedFarthestId > 0 then local dataIndex = 1 for i, v in ipairs(private.sortedClimbTowerLevel) do if v.ID == passedFarthestId then dataIndex = i break end end local nextConfig = private.sortedClimbTowerLevel[dataIndex + 1] if nextConfig then return nextConfig end else return private.sortedClimbTowerLevel[1] end return nil end function ClimbTower_Controller.IsHasNoNeedFightClimberLevel(climbLevelChapter) local targetMaxTowerLevelCfg = ClimbTower_Controller.GetTargetMaxTowerLevelCfg(climbLevelChapter) local passedFarthestId = MDL.ClimbTower.GetPassFarthestId() if targetMaxTowerLevelCfg and targetMaxTowerLevelCfg.ID ~= passedFarthestId then return true end return false end function ClimbTower_Controller.GetClimbTowerLevelCfgByIndex(dataIndex) return private.sortedClimbTowerLevel[dataIndex] end function ClimbTower_Controller.GetTowerDataIndexByLevelId(towerLevelId) local dataIndex = 1 for i, v in ipairs(private.sortedClimbTowerLevel) do if v.ID == towerLevelId then dataIndex = i break end end return dataIndex end --获取可以免战直通的最大id function ClimbTower_Controller.GetTargetMaxTowerLevelCfg(climbLevelChapter) local currentGS=MDL.Player.GetLineUpGs() local curPlayerLv = MDL.Player.GetRoleInfo() local passedFarthestId = MDL.ClimbTower.GetPassFarthestId() local dataIndex = 0 if passedFarthestId>0 then for i, v in ipairs(private.sortedClimbTowerLevel) do if v.ID == passedFarthestId then dataIndex = i break end end end if dataIndex == #private.sortedClimbTowerLevel then return nil end for i=dataIndex + 1, #private.sortedClimbTowerLevel do local unlockLevel = CTL.Unlock.GetUnlockLevelByParameterTable(private.sortedClimbTowerLevel[i].Unlock_Table) if climbLevelChapter and private.sortedClimbTowerLevel[i].BelongToChapter ~= climbLevelChapter then return private.sortedClimbTowerLevel[i-1] end if curPlayerLv levelId then target = v break end end if target then local cfg = DataSheetManager.RewardClientShow:GetDataByClientShowID(target.SpecialRewardShow) local reward = DataSheetUtil.GetRewardClientShowItemTable(cfg) local climbLevelData = DataSheetManager.ClimbTowerLevel:GetDataByID(target.ID) return string.FormatByIdsId(Const_IDS.IDS_JP_ClimbTower_FirstPassRewardTip, UIUtils.GetLocalizedTxt(Const_IDS[climbLevelData.LevelName])), reward end return nil end function ClimbTower_Controller.GetClimbTowerLevelId(id) local climbTowerConfig = DataSheetManager.ClimbTowerLevel:GetDataByID(id) local data = DataSheetManager.CombinationLevel:GetDataByID(climbTowerConfig.CombinationLevelID) return data.LevelID end function ClimbTower_Controller.GetClimbTowerLevelByChapterAndNumber(chapter, number) for i, v in DataSheetManager.ClimbTowerLevel:GetEnumerator() do if v.BelongToChapter == chapter and v.Number == number then return v.ID end end end --爬塔红点 function private.RefreshRedPoint() EventSystem.Dispatch( EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.ClimbTower, CTL.RedPoint.GetRedPointActive(CTL.RedPoint.RedPointKey.ClimbTowerEntry) ) end function private.RefreshClimbTowerEntryRed() if private.CheckClimbTowerRed() then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.ClimbTowerEntry_ClimbMain) else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.ClimbTowerEntry_ClimbMain) end CTL.PayMall.CheckIfBaizhanAddNew() end function private.CheckClimbTowerRed() if not ClimbTower_Controller.IsDuringOpenTime() then return false end --关卡可挑战 if ClimbTower_Controller.CheckChallengeRed() then return true end --存在免费的加速次数 if ClimbTower_Controller.IsFreeTimesLeft()then return true end return false end --关卡可挑战 function ClimbTower_Controller.CheckChallengeRed() if ClimbTower_Controller.IsReachMaxChallengeLevelCountOfEveryDay() then return false end local nextConfig = ClimbTower_Controller.GetNextLevelConfig() if nextConfig then local ifSatisfied, unlockText = CTL.Unlock.JudgeIfSatisfiedUnlockTable(nextConfig.Unlock_Table) if ifSatisfied then local recommendFight = nextConfig.Battle local curFight = MDL.Player.GetLineUpGs() if curFight >= recommendFight then return true end end end return false end --是否可领取 function ClimbTower_Controller.IsCanGetAward() local awardGoods = MDL.ClimbTower.GetAwardGoods() return MDL.ClimbTower.GetAwardStone() > 0 or MDL.ClimbTower.GetAwardSilverCoin() > 0 or (awardGoods and #awardGoods > 0) end function ClimbTower_Controller.IsPassLevel(levelID) local passedFarthestId = MDL.ClimbTower.GetPassFarthestId() if passedFarthestId > 0 then local levelConfig = DataSheetManager.ClimbTowerLevel:GetDataByID(levelID) if levelConfig then local curConfig = DataSheetManager.ClimbTowerLevel:GetDataByID(passedFarthestId) return curConfig.AdaptiveDifficultyNumber >= levelConfig.AdaptiveDifficultyNumber end end return false end --存在免费的加速次数 function ClimbTower_Controller.IsFreeTimesLeft() if MDL.ClimbTower.GetIsCloseSpeedUp() then return false end if MDL.ClimbTower.GetPassFarthestId() > 0 then local activityData = DataSheetManager.ActivityData:GetDataByID(LuaConst.ActivityType.ClimbTower) local freeTimes = activityData.DailyRefreshTimes if freeTimes > MDL.ClimbTower.GetFreeNums() then return true end end return false end --领取奖励红点 function ClimbTower_Controller.CheckAwardRed() if ClimbTower_Controller.IsCanGetAward() then --挂机时长达到上限 local totalTime = DataSheetManager.ConstData:GetDataByID("ClimbTowerRewardTimeMax").IntValue if MDL.ClimbTower.GetDurationVal() >= totalTime then return true end --一次性提醒红点,点击后消失 if ClimbTower_Controller.ShowHomeGetAwardBtn() and MDL.ClimbTower.GetHasNoticeAward() == false then return true end end return false end --主界面是否显示获取奖励按钮 function ClimbTower_Controller.ShowHomeGetAwardBtn() if MDL.ClimbTower.GetPassFarthestId() == 0 then return false end local noticeTime = DataSheetManager.ConstData:GetDataByID("ClimbTowerRemindTime").IntValue if MDL.ClimbTower.GetDurationVal() >= noticeTime then return true end return false end function ClimbTower_Controller.GetClimbTowerProgressName(levelId) local climbTowerLevelData = DataSheetManager.ClimbTowerLevel:GetDataByID(levelId) local progressName = UIUtils.GetLocalizedTxt(Const_IDS[climbTowerLevelData.LevelName]) return progressName end --获取关卡状态,已获得、可挑战(当前关的下一关可挑战,后面已开启的置灰不可挑战)、未开启 function ClimbTower_Controller.GetLevelState(levelId) local state = 0 local passedFarthestId = MDL.ClimbTower.GetPassFarthestId() if passedFarthestId < 1 then if private.sortedClimbTowerLevel[1].ID == levelId then state = 1 else state = 2 end else local battleID = 0 local chapterLevelList = MDL.ClimbTower.SplitConfigByChapter() local passData = DataSheetManager.ClimbTowerLevel:GetDataByID(passedFarthestId) -- 判断当前打通的关卡ID是不是当前章节的最后一关,如果是最后一关就把状态判断的ID换成下一章的第一关 if chapterLevelList[passData.BelongToChapter][#chapterLevelList[passData.BelongToChapter]].ID == passedFarthestId and passData.BelongToChapter + 1 <= #chapterLevelList then battleID = chapterLevelList[passData.BelongToChapter + 1][1].ID else battleID = passedFarthestId + 1 end if levelId <= battleID - 1 then state = 0 -- 已获得 elseif levelId == battleID then state = 1 -- 包含可挑战、已开启不可挑战 elseif levelId > battleID then state = 2 -- 未开启 end end return state end --挑战时不显示战力提示 function ClimbTower_Controller.SetNotShowGSNotice() _isShowGSNotice=false end --挑战时是否显示战力提示 function ClimbTower_Controller.IsShowGSNotice() return _isShowGSNotice end --获取每日可挑战层数 function private.GetCanChallengeLevelCountOfEveryDay() local __, data = DataSheetManager.ClimbTowerLevelNum:TryGetDataByDay(MDL.Player.GetServerDayCount()) if data == nil then local maxConfig for i,v in DataSheetManager.ClimbTowerLevelNum:GetEnumerator() do if maxConfig == nil or v.Day > maxConfig.Day then maxConfig = v end end data = maxConfig end return data.LevelNum end --判断是否达到每日可挑战的最高关卡 function ClimbTower_Controller.IsReachMaxChallengeLevelCountOfEveryDay() local nextConfig= ClimbTower_Controller.GetNextLevelConfig() if not nextConfig then return true end --当前已挑战数量 local currentChallengeCount=nextConfig.LevelNumLogo-1 local maxChallengeCount= private.GetCanChallengeLevelCountOfEveryDay() --判断是否达到最高关卡 return currentChallengeCount >= maxChallengeCount end --获取进入的上一关 function ClimbTower_Controller.GetLastLevelId() local currentLevelId=MDL.ClimbTower.GetPassFarthestId() if currentLevelId >0 then local data= DataSheetManager.ClimbTowerLevel:GetDataByID(currentLevelId) local lastLevelNum=data.LevelNumLogo-1 if lastLevelNum> 0 then for _,v in DataSheetManager.ClimbTowerLevel:GetEnumerator() do if v.LevelNumLogo == lastLevelNum then return v.ID end end else return currentLevelId end else local firstLevelConfig = private.sortedClimbTowerLevel[1] return firstLevelConfig.ID --取不到时,返回第一关 end end --通关章节最后一关 function ClimbTower_Controller.IsPassedLastLevelOfChapter() local nextConfig= ClimbTower_Controller.GetNextLevelConfig() if not nextConfig then return true end local currentLevelId=MDL.ClimbTower.GetPassFarthestId() local currentData= DataSheetManager.ClimbTowerLevel:GetDataByID(currentLevelId) return nextConfig.BelongToChapter > currentData.BelongToChapter end --爬塔战斗UI function ClimbTower_Controller.ShowClimbTowerBattleUI() EventSystem.Regist(EventID.UI_UIBattleCountDownPanel_CloseEvent,private.RunLevel) UIManager.OpenView(Const_UI_Lua.UIEnum.UIBattleCountDownFormalPanel, {3}) CTL.HomeMain.OpenBattleSceneUI() NotSyncBattleSetter.PauseLevel(true) --进关时设定是否可以显示胜利pose local isCanShow = ClimbTower_Controller.GetCanShowVictoryPose() --new↓ if isCanShow then LuaInputManager.EnqueueSpecialCommand(LuaConst.SpecialCommandType.SetCanShowVictoryPose) end --new↑ -- NotSyncBattleSetter.SetCanShowVictoryPose(isCanShow) --old end function private.RunLevel() NotSyncBattleSetter.PauseLevel(false) EventSystem.UnRegist(EventID.UI_UIBattleCountDownPanel_CloseEvent,private.RunLevel) end --是否可以显示胜利pose function ClimbTower_Controller.GetCanShowVictoryPose() --最后一关 local nextConfig= ClimbTower_Controller.GetNextLevelConfig() if not nextConfig then return true end --要打的是最后一关,可以显示胜利pose local finalLevelConfig = private.sortedClimbTowerLevel[#private.sortedClimbTowerLevel] if nextConfig.ID == finalLevelConfig.ID then return true end --当天的最大关卡 local currentChallengeCount=nextConfig.LevelNumLogo local maxChallengeCount= private.GetCanChallengeLevelCountOfEveryDay() --判断是否达到最高关卡 if currentChallengeCount >= maxChallengeCount then return true end --到达了本章的最后一关 local levelNum = nextConfig.LevelNumLogo+1 for _,v in DataSheetManager.ClimbTowerLevel:GetEnumerator() do if v.LevelNumLogo == levelNum then if v.BelongToChapter > nextConfig.BelongToChapter then return true end break end end return false end --是否全部通关 function ClimbTower_Controller.IsPassedAllLevel() local currentLevelId = MDL.ClimbTower.GetPassFarthestId() local finalLevelConfig = private.sortedClimbTowerLevel[#private.sortedClimbTowerLevel] local lastLevelId = finalLevelConfig.ID return currentLevelId == lastLevelId end --退出副本 function ClimbTower_Controller.LeaveFuben() MDL.ClimbTower.SetFirstEnterLevelId(nil) MDL.ClimbTower.ClearTotalRewards() MDL.Level.SendRoleLeaveFuben() end -- 战斗结束返回打开到爬塔选关界面 function ClimbTower_Controller.OpenClimbTowerMainView() UIManager.OpenAndPush(Const_UI_Lua.UIEnum.UIActivitiesMain, nil, nil, Const_UI_Lua.UIEnum.UIHomeMain) if MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.ClimbTower) then UIManager.OpenView(Const_UI_Lua.UIEnum.UIClimbTowerEntry) ClimbTower_Controller.OpenNormalClimbTower() end end function ClimbTower_Controller.OnFubenQuickPass(passInfo) EventSystem.Dispatch(EventID.UI_FubenQuickPass, passInfo.mapType) UIManager.OpenView(Const_UI_Lua.UIEnum.UIThroughSweep, {levelType=passInfo.mapType, srcTowerLevelId=passInfo.currId, targetTowerLevelId=passInfo.targetId}) end --每个章节60关 章节-1*60+关卡数 = 显示id function ClimbTower_Controller.GetClimbTowerLevelCoundId(climbTowerLevelData) local chapterId = climbTowerLevelData.BelongToChapter local levelCount = 0 for i=1, chapterId - 1 do local data = DataSheetManager.ClimbTowerData:GetDataByID(i) levelCount = levelCount + data.LevelNum end return levelCount + climbTowerLevelData.Number end function ClimbTower_Controller.GetClimbTowerLevelCoundText(climbTowerLevelData) local levelCound = ClimbTower_Controller.GetClimbTowerLevelCoundId(climbTowerLevelData) return string.FormatByIdsId(Const_IDS.IDS_NationClimbTower_HistoryLevel, levelCound) end function ClimbTower_Controller.GetClimbTowerProgressCountTextById(id) local climbTowerLevelData = DataSheetManager.ClimbTowerLevel:GetDataByID(id) return ClimbTower_Controller.GetClimbTowerLevelCoundText(climbTowerLevelData) end return ClimbTower_Controller