local Storm_Model = {} local storm_pb = require "Proto.storm_pb" local fuben_pb = require 'Proto/fuben_pb' local EventSystem = require('Event/EventSystem') local OPEN_LEVEL_ID = 610011 local STORM_LAST_SELECT_DIFFICULT_KEY = "stormlastselectdiffkey" local private = {} function Storm_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageGetStormMainPanelInfo, private.GetStormMainPanelInfoResp) EventSystem.Regist(EventID.AcquireSystemRedAfterUnlock, private.UpgradeData) EventSystem.Regist(EventID.New_Day_Refresh, private.UpgradeData) private.StormInfo = {} end -- JWS2-41277 暴风界面优化任务修改了玩家数据,所以这里需要进行一次升级 function private.UpgradeData() local selectData = PersistentData.PlayerData:Get(STORM_LAST_SELECT_DIFFICULT_KEY, nil) or {} if selectData.levelType then -- 说明此时玩家的数据仍然是旧数据 local newData = {} table.insert(newData, selectData) table.insert(newData, {}) table.insert(newData, {}) PersistentData.PlayerData:Set(STORM_LAST_SELECT_DIFFICULT_KEY, newData) end end function Storm_Model.IsOpen() return MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Storm) and CTL.Activities.IsActivityInOpeningTime(LuaConst.ActivityType.Storm) end function Storm_Model.GetOpenCountryID() return private.StormInfo.countryId end function Storm_Model.GetStormOpenLevelData() return DataSheetManager.StormLevel:GetDataByID(private.StormInfo.levelType) end function Storm_Model.GetOpenTimeByLevelType(levelType) for i, v in ipairs(private.StormInfo.stormLevelInfoList) do if v.levelType == levelType then return v.startTime end end end function Storm_Model.GetStormInfo() return private.StormInfo end --- 当前关卡我的积分 function Storm_Model.GetMyScore() return private.StormInfo.myScore or 0 end --- 获取指定阵容最高记录 function Storm_Model.GetMaxScore() return private.StormInfo.simpleLineUp[private.enterBattleLineupID].score or 0 end function Storm_Model.GetEnterBattleLine() return private.enterBattleLineupID end --- 今日最高分记录 function Storm_Model.GetTodayMaxScore() return private.StormInfo.myToadyMaxScore end function Storm_Model.GetMyRankIndex() return private.StormInfo.myRank or 0 end function Storm_Model.GetLineupGS_LineNum(lineNum) if lineNum then local lineInfo = private.StormInfo.simpleLineUp[lineNum] return lineInfo ~= nil and lineInfo.gs or 0 else local totalGS = 0 for _, v in ipairs(private.StormInfo.simpleLineUp) do totalGS = totalGS + v.gs end return totalGS end end function Storm_Model.GetMaxPassedLevels() return private.StormInfo.maxReachLevel end --- 获取指定level的推荐难度ID --- @param lineNum int 第几军 --- @param levelID int StormLevelBR levelID字段 --- @return data BRLevel数据 function Storm_Model.GetRecommendBR(lineNum, levelID) if not levelID then levelID = OPEN_LEVEL_ID end local myGS = Storm_Model.GetLineupGS_LineNum(lineNum or 1) local defaultData, maxData for index, v in DataSheetManager.StormLevelBR:GetEnumerator() do if defaultData == nil and levelID == v.LevelID then defaultData = v end local colorType = CTL.LevelSelect.GetSubjugateColorTypeByGS(v.SubjugateDataPVE, myGS * 3) if colorType >= 5 and levelID == v.LevelID then maxData = v end end return maxData or defaultData end function Storm_Model.GetLastSelectDifficultID(lineNum) if not private.StormInfo.lastSelectDifficult then private.StormInfo.lastSelectDifficult = PersistentData.PlayerData:Get(STORM_LAST_SELECT_DIFFICULT_KEY, nil) or {} end local lastDifficult = nil if next(private.StormInfo.lastSelectDifficult) then lastDifficult = private.StormInfo.lastSelectDifficult[lineNum] end local isTimestampDirty = true if lastDifficult and lastDifficult.levelType == private.StormInfo.levelType then isTimestampDirty = UTL.Time.GetServerTimestamp() >= lastDifficult.time end return isTimestampDirty and Storm_Model.GetRecommendBR().ID or lastDifficult.ID end function Storm_Model.SetLastSelectDifficultID(lineNum, difficultID) private.StormInfo.lastSelectDifficult[lineNum] = { levelType = private.StormInfo.levelType, ID = difficultID, time = UTL.Time.GetServerZeroTimestamp() + UTL.Time.TotalSecondsOneDay } PersistentData.PlayerData:Set(STORM_LAST_SELECT_DIFFICULT_KEY, private.StormInfo.lastSelectDifficult) end -- 获取排名奖励奖品数据 function Storm_Model.GetRankRewardData(rankIndex) local rewardArr if CTL.WarZone.IsWarZoneOpen() then for i, data in DataSheetManager.StormRankRewardCross:GetEnumerator() do if (rankIndex >= data.RankBegin and rankIndex <= data.RankEnd) or (data.RankEnd == 0 and rankIndex >= data.RankBegin) then rewardArr = DataSheetManager.StormRankRewardRepeat:GetDataByAttrRepeatID(data.RewardRepeatID).Item_Table break end end else for i, data in DataSheetManager.StormRankReward:GetEnumerator() do if (rankIndex >= data.RankBegin and rankIndex <= data.RankEnd) or (data.RankEnd == 0 and rankIndex >= data.RankBegin) then rewardArr = DataSheetManager.StormRankRewardRepeat:GetDataByAttrRepeatID(data.RewardRepeatID).Item_Table break end end end return rewardArr end -- 获取当前开启的玩法,距离结算的时间 function Storm_Model.GetCurActivityLeftTime() return private.StormInfo.CycleFinishTimeStamp - UTL.Time.GetServerTimestamp() end -- 获取布阵军队解锁数量 function Storm_Model.GetUnlockTeamNum() local unlockTeamNum = 0 for i = 1, 3 do if not MDL.FreeLineUp.IsTeamSlotLocked(i) then unlockTeamNum = unlockTeamNum + 1 end end return unlockTeamNum end --- 更新主要信息方法 function private.UpdateStormMainInfo(info) private.StormInfo.countryId = info.countryId private.StormInfo.levelType = info.levelType private.StormInfo.myScore = info.myScore private.StormInfo.topPlayer = (IsProtoDataNotNil(info.topPlayer) and #info.topPlayer > 0) and info.topPlayer or {} private.StormInfo.simpleLineUp = info.simpleLineUp -- 我的阵容 private.StormInfo.myToadyMaxScore = info.myToadyMaxScore -- 今日最高积分 private.StormInfo.myRank = info.myRank -- 今日最高积分 -- 四国最大通关ID private.StormInfo.maxReachLevel = info.maxReachLevel EventSystem.Dispatch(EventID.UI_Storm_RefreshMain) end --- EnterWorld和playerchange更新的信息 function private.UpdateEnterInfo(info) logging.log(LTAG.LOG," UpdateEnterInfo ",info) private.StormInfo.countryId = info.countryId private.StormInfo.levelType = info.levelType private.StormInfo.myToadyMaxScore = info.myToadyMaxScore private.StormInfo.stormLevelInfoList = info.StormLevelInfoList private.StormInfo.CycleFinishTimeStamp = info.CycleFinishTimeStamp EventSystem.Dispatch(EventID.UI_Storm_RefreshMain) OPEN_LEVEL_ID = DataSheetManager.StormLevel:GetDataByID(private.StormInfo.levelType).LevelID end --region 网络协议 function Storm_Model.SyncStormInfo(msg) private.UpdateEnterInfo(msg) -- 今日最高积分 CTL.Storm.RefreshNotification() end --- 进入关卡选将界面拉取信息 function Storm_Model.GetStormMainPanelInfoReq() local msg = storm_pb.GetStormMainPanelInfoReq() msg.lineUpNum = MDL.FreeLineUp.GetFreeLineUpLineNumber(MDL.FreeLineUp.FuncType.Storm) NetManager.SendMessage(MessageEnums.MessageGetStormMainPanelInfo, msg) end function private.GetStormMainPanelInfoResp(msg) if msg.Resp.Code == 0 then private.UpdateStormMainInfo(msg) end end --- 进入暴风战斗 --- @param id StormLevelBR表ID --- @param lineupID 上阵阵容号 --- @param buffID 携带的技能ID function Storm_Model.EnterStormChallenge(id, lineupID, buffID) local msg = fuben_pb.EnterFubenReq() msg.id = id msg.mapType = LuaConst.LevelType.StormChallenge msg.lineUpIdx = lineupID msg.freeLineUpNum = MDL.FreeLineUp.GetFreeLineUpLineNumber(MDL.FreeLineUp.FuncType.Storm) private.enterBattleLineupID = lineupID msg.enterBuff:append(buffID) NetManager.SendMessage(MessageEnums.MessageEnterFuben, msg) end --endregion return Storm_Model