local NationClimbTower_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local climb_tower_pb = require('Proto/climb_tower_pb') function NationClimbTower_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageNationTowerGetAllPassAward, private.NationTowerGetAllPassAwardResp) NetManager.RegisterMsgCB(MessageEnums.MessageNationTowerGetServerAward, private.NationTowerGetServerAwardResp) NetManager.RegisterMsgCB(MessageEnums.MessageG2CPushNationTowerRankReward, private.G2CPushNationTowerRankReward) -- 历程新上榜主动推送 NetManager.RegisterMsgCB(MessageEnums.MessageNationTowerGetRankInfos, private.NationTowerGetRankInfosResp) -- 榜单请求 NationClimbTower_Model.NormalClimbTowerType = 0 NationClimbTower_Model.nationCount = DataSheetManager.HeroCountry:GetDataCount() private.InitFourNationInfoDic() private.firstLevelNum = nil --每次爬塔进入的第一关 private.totalRewards = {} --总的通关奖励 private.sortedNationClimbTowerData = DataSheetUtil.CreateSortedDataSheet("NationClimbTowerData") end -- 初始化四国爬塔数据结构 function private.InitFourNationInfoDic() private.towerPassedLevelArr = {} -- 四国进度进度 private.rewardsData = {} -- 全服速通全量领奖信息 if not GameAppInfo.IsOverseaPackage() then private.towerPassedLevelArr[NationClimbTower_Model.NormalClimbTowerType] = 0 local tmp = { getRewardDic = {}, availableRewardDic = {} } for i, v in DataSheetManager.ClimbTowerAllReward:GetEnumerator() do local key = NationClimbTower_Model.CombineNormalTypeKey(v.ClimbTowerChapter, v.ClimbTowerLevel) tmp.getRewardDic[key] = false tmp.availableRewardDic[key] = false end private.rewardsData[NationClimbTower_Model.NormalClimbTowerType] = tmp end for i, v in DataSheetManager.HeroCountry:GetEnumerator() do private.towerPassedLevelArr[v.ID] = 0 local tmp = { getRewardDic = {}, availableRewardDic = {} } for _, rewardConfig in DataSheetManager.NationClimbTowerAllReward:GetEnumerator() do tmp.getRewardDic[rewardConfig.NationClimbTowerLevel] = false -- 本服已领取的通关X人列表 tmp.availableRewardDic[rewardConfig.NationClimbTowerLevel] = false -- 本服X人达成的奖励 end table.insert(private.rewardsData, tmp) end -- rewardsData --{ -- [1] = { -- getRewardDic = {[100] = false, [200] = false, [300] = false}, -- availableRewardDic = {[100] = false, [200] = false, [300] = false} -- }, -- [2] = { -- getRewardDic = {[100] = false, [200] = false, [300] = false}, -- availableRewardDic = {[100] = false, [200] = false, [300] = false} -- } --} private.towerOpenType = 0 private.towerOpenLevel = 0 private.newOnRankData = { mainTabIndex = -1, subTabIndex = -1 } -- 有最新人上榜榜单 private.allPassRewards = nil --全通奖励 private.curSelectTower = 0 -- 设置当前进入的塔,跨天时进行判断 ----------------------------------------------------------------------------------------------- end function NationClimbTower_Model.CombineNormalTypeKey(chapterId, towerLevel) return chapterId .. ":" .. towerLevel end --region ----------------- 网络协议------------------------------------------------- function NationClimbTower_Model.SyncFourNationClimbTowerInfo(info, isEnterWorld) if IsServerDataNotNil(info) then private.towerOpenType = info.openTowerType --当日开放类型 (魏蜀吴群 1234) private.towerOpenLevel = info.openTowerLv --当日开放层数 logging.log(LTAG.LOG, "[NationClimbTower] SyncData :", info) for i, nationInfo in ipairs(info.towerInfos) do if nationInfo.towerType == NationClimbTower_Model.NormalClimbTowerType then private.towerPassedLevelArr[nationInfo.towerType] = nationInfo.passMaxTowerLv if IsServerDataNotNil(nationInfo.normalTowerServerRewards) then -- 同步已领取的全服速通奖励 for _, towerString in ipairs(nationInfo.normalTowerServerRewards) do private.rewardsData[nationInfo.towerType].getRewardDic[towerString] = true end end if IsServerDataNotNil(nationInfo.normalTowerAllPassDone) then -- 同步可领取的全服速通奖励 for _, towerString in ipairs(nationInfo.normalTowerAllPassDone) do private.rewardsData[nationInfo.towerType].availableRewardDic[towerString] = true end end else private.towerPassedLevelArr[nationInfo.towerType] = nationInfo.passMaxTowerLv if IsServerDataNotNil(nationInfo.serverRewards) then -- 同步已领取的全服速通奖励 for _, towerLevel in ipairs(nationInfo.serverRewards) do private.rewardsData[nationInfo.towerType].getRewardDic[towerLevel] = true end end if IsServerDataNotNil(nationInfo.allPassDone) then -- 同步可领取的全服速通奖励 for _, towerLevel in ipairs(nationInfo.allPassDone) do private.rewardsData[nationInfo.towerType].availableRewardDic[towerLevel] = true end end end end private.allPassRewards = info.allPassRewards --全通奖励 private.maxRankLv = info.maxRankLv -- 四国最高的排行榜层数 private.normalTowerMaxRankLv = info.normalTowerMaxRankLv --普通爬塔最高的排行榜层数 if isEnterWorld then --只有enterworld才会执行,playchange不用执行 private.RefreshDayID = TimerUtil.Interval(private.UpdateCrossDayTowerType, UTL.Time.GetServerIntervalTimeToRefresh(1), 1) CTL.NationClimbTower.StartOpeningTimerChecker() MDL.FreeLineUp.FreeLineUpGetInfoRequest(MDL.FreeLineUp.FuncType.NationClimbTower) -- EnterWorld时拉取玩法阵容信息提前缓存 end end EventSystem.Dispatch(EventID.UI_UpdateNationClimbTowerInfo) end -- 领取武道场全部通关X层的奖励 function NationClimbTower_Model.NationTowerGetAllPassAwardReq() local msg = climb_tower_pb.NationTowerGetAllPassAwardReq() msg.rewardId = NationClimbTower_Model.GetCurAllPassNationRewardsData().ID NetManager.SendMessage(MessageEnums.MessageNationTowerGetAllPassAward, msg) end function private.NationTowerGetAllPassAwardResp(msg) if msg.Resp.Code == 0 then end end -- 领取本服任意X人通关奖励 function NationClimbTower_Model.NationTowerGetServerAwardReq(towerType, towerLevel, towerChapter) local msg = climb_tower_pb.NationTowerGetServerAwardReq() msg.towerLv = towerLevel msg.towerType = towerType msg.chapterId = towerChapter or 0 NetManager.SendMessage(MessageEnums.MessageNationTowerGetServerAward, msg) end function private.NationTowerGetServerAwardResp(msg) if msg.Resp.Code == 0 then EventSystem.Dispatch(EventID.UI_UpdateFastLevelPassRewards) end end -- 请求历程榜单 function NationClimbTower_Model.NationTowerGetRankInfosReq(towerType, towerLv, towerChapter) local msg = climb_tower_pb.NationTowerGetRankInfosReq() msg.towerType = towerType msg.towerLv = towerLv msg.chapterId = towerChapter or 0 NetManager.SendMessage(MessageEnums.MessageNationTowerGetRankInfos, msg) end function private.NationTowerGetRankInfosResp(msg) if msg.Resp.Code == 0 then EventSystem.Dispatch(EventID.UI_UpdateNationProgressRankInfo, msg.perRankInfo) end end -- 四国爬塔-全服奖励达成通知 G->C function private.G2CPushNationTowerRankReward(msg) logging.log(LTAG.LOG, "G2CPushNationTowerRankReward ", msg.towerType, msg.towerLv, msg.isReward) if msg.isReward then if msg.towerType == NationClimbTower_Model.NormalClimbTowerType then private.rewardsData[msg.towerType].availableRewardDic[NationClimbTower_Model.CombineNormalTypeKey(msg.chapterId, msg.towerLv)] = true else private.rewardsData[msg.towerType].availableRewardDic[msg.towerLv] = true end else private.newOnRankData.mainTabIndex = msg.towerType if msg.towerType == NationClimbTower_Model.NormalClimbTowerType then private.newOnRankData.subMainIndex = DataSheetManager.ClimbTowerAllReward:GetDataByClimbTowerChapter_ClimbTowerLevel(msg.chapterId, msg.towerLv).Index else private.newOnRankData.subMainIndex = DataSheetManager.NationClimbTowerAllReward:GetDataByNationClimbTowerLevel(msg.towerLv).Index end end EventSystem.Dispatch(EventID.UI_UpdateFastLevelPassRewards) end --endregion --region-------------------- 四国爬塔 -------------------------------------- function NationClimbTower_Model.SetCurSelectTower() private.curSelectTower = private.towerOpenType end function NationClimbTower_Model.GetCurSelectTower() return private.curSelectTower ~= 0 and private.curSelectTower or private.towerOpenType end -- 跨5点刷新,客户端更新开放类型 function private.UpdateCrossDayTowerType() if private.curSelectTower ~= 0 and private.curSelectTower ~= private.towerOpenType then private.RefreshDayID = TimerUtil.Interval(private.UpdateCrossDayTowerType, UTL.Time.GetServerIntervalTimeToRefresh(1), 1) return end private.towerOpenType = private.towerOpenType == 4 and 1 or private.towerOpenType + 1 end -- 最新有人上榜页签信息 function NationClimbTower_Model.GetLatestRankIndex() if private.newOnRankData.mainTabIndex < 0 or private.newOnRankData.subTabIndex < 0 then return CTL.NationClimbTower.GetProgressOfflineDefaultIndex() else return private.newOnRankData.mainTabIndex, private.newOnRankData.subTabIndex end end function NationClimbTower_Model.GetFastPassAvailableDic(towerType) return private.rewardsData[towerType].availableRewardDic end function NationClimbTower_Model.GetFastPassReceivedDic(towerType) return private.rewardsData[towerType].getRewardDic end function NationClimbTower_Model.GetTowerOpenInfo() return private.towerOpenType, private.towerOpenLevel end -- 指定塔完成层数 function NationClimbTower_Model.GetTowerPassedLvInfo(towerType) return private.towerPassedLevelArr[towerType] end function NationClimbTower_Model.GetTowerConfigData(towerType) return private.sortedNationClimbTowerData[towerType] end function NationClimbTower_Model.GetLevelConfigByTowerType(towerType, lv) local chapterID = NationClimbTower_Model.GetTowerConfigData(towerType).ID --与策划沟通主键id 可通过chapterID、lv计算(chapterID对应表中BelongToChapter,lv对应表中Number) local id if lv <= 9999 then id = chapterID + lv else id = chapterID*10 + lv end local succ, config = DataSheetManager.NationClimbTowerLevel:TryGetDataByID(id) if succ then return config end end function NationClimbTower_Model.GetPassedMaxLevelConfig(towerType) local passedLV = private.towerPassedLevelArr[towerType] or 0 if not passedLV or passedLV == 0 then logging.error(LTAG.ERROR, "当前挑战层数为0 ", towerType) return nil end return NationClimbTower_Model.GetLevelConfigByTowerType(towerType, passedLV) end function NationClimbTower_Model.GetNextLevelNumberShow(towerType) local passedLv = private.towerPassedLevelArr[towerType] if not passedLv or passedLv == 0 then return 1 end local towerConfigData = NationClimbTower_Model.GetTowerConfigData(towerType) if passedLv < towerConfigData.BattleLevelNum then return passedLv + 1 else return towerConfigData.BattleLevelNum end end -- 空则为最后一关 function NationClimbTower_Model.GetNextLevelConfigByTowerType(towerType) local chapterID = NationClimbTower_Model.GetTowerConfigData(towerType).ID local passedLv = private.towerPassedLevelArr[towerType] or 0 if not passedLv or passedLv == 0 then -- 未通关,默认返回当天开启的第一天 local curLevelConfig = NationClimbTower_Model.GetLevelConfigByTowerType(towerType, 1) return curLevelConfig end local nextLv = passedLv + 1 local nextLevelConfig = NationClimbTower_Model.GetLevelConfigByTowerType(towerType, nextLv) if nextLevelConfig and nextLevelConfig.BelongToChapter == chapterID and nextLevelConfig.Number == nextLv then return nextLevelConfig end return nil end -- 无需参数,默认查找当日开启的对应塔 function NationClimbTower_Model.GetNextLevelConfig() local openType = NationClimbTower_Model.GetTowerOpenInfo() return NationClimbTower_Model.GetNextLevelConfigByTowerType(openType) end function NationClimbTower_Model.IsHasNoNeedFightClimberLevel() local targetMaxTowerLevelCfg = NationClimbTower_Model.GetTargetMaxTowerLevelCfg() local openType, openLv = MDL.NationClimbTower.GetTowerOpenInfo() local passedLv = private.towerPassedLevelArr[openType] or 0 if targetMaxTowerLevelCfg and targetMaxTowerLevelCfg.Number ~= passedLv then return true end return false end --获取可以免战直通的最大id function NationClimbTower_Model.GetTargetMaxTowerLevelCfg() local openType, openLv = MDL.NationClimbTower.GetTowerOpenInfo() local passedLv = private.towerPassedLevelArr[openType] or 0 if passedLv == private.sortedNationClimbTowerData[openType].BattleLevelNum then return NationClimbTower_Model.GetLevelConfigByTowerType(openType, passedLv) end local myGS = MDL.NationClimbTower.GetLineUpGSTotal(openType) for i=passedLv + 1, private.sortedNationClimbTowerData[openType].BattleLevelNum do local climbTowerConfig = NationClimbTower_Model.GetLevelConfigByTowerType(openType, i) if climbTowerConfig.Number>openLv or myGS= a.Config.Number local isFinishB = b.MaxLv >= b.Config.Number if isFinishA ~= isFinishB then -- 都完成或都未完成 return isFinishA and not isFinishA or isFinishB else return a.Config.Number < b.Config.Number end end function NationClimbTower_Model.GetLevelDataPreview(towerType) local result = {} local towerConfig = NationClimbTower_Model.GetTowerConfigData(towerType) local chapterID = towerConfig.ID local maxLv = NationClimbTower_Model.GetTowerPassedLvInfo(towerType) local index = math.ceil(maxLv / towerConfig.LevelNum) local endNum if index == 0 then endNum = towerConfig.LevelNum else endNum = towerConfig.LevelNum * index end local startNum = endNum - towerConfig.LevelNum + 1 for i, v in DataSheetManager.NationClimbTowerLevel:GetEnumerator() do if v.BelongToChapter == chapterID and v.Number >= startNum and v.Number <= endNum then table.insert(result, { Config = v, MaxLv = maxLv }) end end table.sort(result, SortLevelConfigByPassCondition) return result end --endregion --region ----------------------------- 历程榜单 ------------------------------- function NationClimbTower_Model.GetRankTabData() return private.InitProgressTabData() end function private.InitProgressTabData() local mainData = {} if not GameAppInfo.IsOverseaPackage() then local tb = { isParent = true, mainType = NationClimbTower_Model.NormalClimbTowerType, title = UIUtils.GetLocalizedTxt(Const_IDS.IDS_ActivityName_ClimbTower), subData = {} } local maxLvStr = string.split(private.normalTowerMaxRankLv, ":") local maxChapter, maxLv if not string.isNilOrEmpty(maxLvStr[1]) then maxChapter, maxLv = tonumber(maxLvStr[1]), tonumber(maxLvStr[2]) end local targetIndex = DataSheetManager.ClimbTowerAllReward:GetDataCount() for i, v in DataSheetManager.ClimbTowerAllReward:GetEnumerator() do if not maxChapter or not maxLv then targetIndex = 2 else if v.ClimbTowerChapter == maxChapter and v.ClimbTowerLevel == maxLv then targetIndex = i + 1 end end if i > targetIndex then break end table.insert(tb.subData, { parentType = tb.mainType, climbTowerChapter = v.ClimbTowerChapter, climbTowerLevel = v.ClimbTowerLevel, -- 排行关卡 RankReward = v.AllTowerRankReward, -- 排行奖励ID subTabIndex = i, -- 全服奖励ID }) end table.insert(mainData, tb) end for towerType, chapterData in DataSheetManager.NationClimbTowerData:GetEnumerator() do local tb = { isParent = true, isExpand = false, mainType = towerType, title = UIUtils.GetLocalizedTxt(Const_IDS[chapterData.ClimbTower]), subData = {} } local maxLv = private.maxRankLv[towerType] local targetIndex = DataSheetManager.NationClimbTowerAllReward:GetDataCount() for index, data in DataSheetManager.NationClimbTowerAllReward:GetEnumerator() do if maxLv == 0 then targetIndex = 2 end if data.NationClimbTowerLevel == maxLv then targetIndex = index + 1 end if index > targetIndex then break end table.insert(tb.subData, { parentType = towerType, NationClimbTowerLevel = data.NationClimbTowerLevel, -- 排行关卡 RankReward = data.AllTowerRankReward[towerType], -- 排行奖励ID subTabIndex = index, -- 全服奖励ID }) end table.insert(mainData, tb) end return mainData end function NationClimbTower_Model.GetNormalClimbProgressTabIndex() local maxLvStr = string.split(private.normalTowerMaxRankLv, ":") local subIndex if not string.isNilOrEmpty(maxLvStr[1]) then local maxChapter, maxLv = tonumber(maxLvStr[1]), tonumber(maxLvStr[2]) subIndex = DataSheetManager.ClimbTowerAllReward:GetDataByClimbTowerChapter_ClimbTowerLevel(maxChapter, maxLv).Index end return subIndex or 1 end --endregion --region -------------------- 布阵相关 ------------------------------- -- 获取上阵武将战力 function NationClimbTower_Model.GetLineUpGSByTeamID(towerType, teamID) local heroInfos = NationClimbTower_Model.GetLineUpInfo(towerType) local posNum1, posNum2 = CTL.NationClimbTower.GetLineUpPosNumByTeamID(teamID) local totalGS = 0 if heroInfos and #heroInfos > 0 then for index, heroInfo in ipairs(heroInfos) do if posNum1 == heroInfo.posNumber or posNum2 == heroInfo.posNumber then local baseGS = heroInfo.heroBaseGs or 0 local lineUpGS = heroInfo.lineUpGs or 0 totalGS = totalGS + baseGS + lineUpGS end end end return totalGS end function NationClimbTower_Model.GetLineUpGSTotal(towerType) return NationClimbTower_Model.GetLineUpGSByTeamID(towerType, 1) + NationClimbTower_Model.GetLineUpGSByTeamID(towerType, 2) + NationClimbTower_Model.GetLineUpGSByTeamID(towerType, 3) end -- 获取开启国别的上阵武将阵容 function NationClimbTower_Model.GetLineUpInfo(towerType) local lineNumber = towerType and towerType or private.towerOpenType local lineUpInfo = MDL.FreeLineUp.GetLineUpInfoByFunctionType(MDL.FreeLineUp.FuncType.NationClimbTower) if lineUpInfo and #lineUpInfo > 0 then for i, v in ipairs(lineUpInfo) do if lineNumber == v.lineNumber then return v.heroInfos end end end return nil end --endregion --region ********************* 存储连续通关奖励和ID ------------------------------- --每次进爬塔前的已挑战的关卡 function NationClimbTower_Model.GetFirstEnterLevelNum() return private.firstLevelNum end function NationClimbTower_Model.SetFirstEnterLevelNum(levelNum) private.firstLevelNum = levelNum end --是否有通关奖励 function NationClimbTower_Model.IsHasRewards() return private.totalRewards and #private.totalRewards > 0 end --获取通关总奖励 function NationClimbTower_Model.GetTotalRewards() return private.totalRewards end --清空奖励 function NationClimbTower_Model.ClearTotalRewards() table.clearArray(private.totalRewards) end --保存通关奖励,合并同类奖励 function NationClimbTower_Model.SaveTotalRewards(reward) for k, v in pairs(reward) do if v.ItemId ~= nil then local isContain = false for k2, v2 in pairs(private.totalRewards) do if v2.ItemId == v.ItemId then isContain = true v2.ItemCount = v2.ItemCount + v.ItemCount end end if not isContain then table.insert(private.totalRewards, v) end end end end --endregion return NationClimbTower_Model