local Rogue_Controller = {} local private = {} local EventSystem = require('Event/EventSystem') function Rogue_Controller.OnStartup() EventSystem.Regist(EventID.RogueLike_GradeChange, private.GradeChange) EventSystem.Regist(EventID.UI_SubjectMonth_Rogue_UpdateInfo, private.CheckRedPoint) end function Rogue_Controller.IsOpen() return CTL.SubjectMonth.IsSubActivityOpen(MDL.SubjectMonth.SubActivityType.Rogue) end function private.CheckRedPoint() if not Rogue_Controller.IsOpen() then return false end local RedPointKey = CTL.RedPoint.RedPointKey if Rogue_Controller.CanAnySkillLevelUp() then CTL.RedPoint.AddRedPoint(RedPointKey.SubjectMonth_Rogue_Hero_SkillLevelUp) else CTL.RedPoint.RemoveRedPoint(RedPointKey.SubjectMonth_Rogue_Hero_SkillLevelUp) end if Rogue_Controller.CanReceiveAnyStarReward() then CTL.RedPoint.AddRedPoint(RedPointKey.SubjectMonth_Rogue_StarReward) else CTL.RedPoint.RemoveRedPoint(RedPointKey.SubjectMonth_Rogue_StarReward) end if Rogue_Controller.CanReceiveAnyLevelReward() then CTL.RedPoint.AddRedPoint(RedPointKey.SubjectMonth_Rogue_Hero_LevelReward) else CTL.RedPoint.RemoveRedPoint(RedPointKey.SubjectMonth_Rogue_Hero_LevelReward) end end function Rogue_Controller.GetLatestOpenLevel() local levelList = MDL.Rogue.GetOpenLevelList() for i = #levelList, 1, -1 do local state = Rogue_Controller.GetLevelState(levelList[i]) if state ~= Rogue_Controller.LevelState.Unavailable then return levelList[i] end end local modeId = CTL.SubjectMonth.GetSubActivityModeId(MDL.SubjectMonth.SubActivityType.Rogue) local cfg = DataSheetManager.VersionsRoguelikeData:GetDataByRoguelikeModeID(modeId) return cfg.RoguelikeID[1] end function Rogue_Controller.GetLatestUnlockLevel() local levelList = MDL.Rogue.GetOpenLevelList() for i = #levelList, 1, -1 do if Rogue_Controller.GetLevelState(levelList[i]) == Rogue_Controller.LevelState.Unlock then return levelList[i] end end local modeId = CTL.SubjectMonth.GetSubActivityModeId(MDL.SubjectMonth.SubActivityType.Rogue) local cfg = DataSheetManager.VersionsRoguelikeData:GetDataByRoguelikeModeID(modeId) return cfg.RoguelikeID[1] end function private.GradeChange(params) if UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIRogueSelectSkillPopupPanel) then UIManager.CloseView(Const_UI_Lua.UIEnum.UIRogueSelectSkillPopupPanel) end UIManager.OpenView(Const_UI_Lua.UIEnum.UIRogueSelectSkillPopupPanel, params) end function Rogue_Controller.ShowRogueSummaryPanel(msg) UIManager.OpenView(Const_UI_Lua.UIEnum.UIRogueBattleSummaryPanel, msg) end function Rogue_Controller.GetPointsLimit() local activityId = MDL.SubjectMonth.GetActivityId() local activityInfo = MDL.OperationActivity.GetOperationActivityInfo(MDL.OperationActivity.ActivityType.SubjectMonth, activityId) local curDay = UTL.Time.GetTimestampDay(activityInfo.startTime) -- 当前是活动第几天 local modeId = CTL.SubjectMonth.GetSubActivityModeId(MDL.SubjectMonth.SubActivityType.Rogue) local cfg = DataSheetManager.VersionsRoguelikeDayLimit:GetDataByRoguelikeModeID_DayID(modeId, curDay) return cfg.RoguelikeBattlePassExpLimit end function Rogue_Controller.GetHeroLevelLimit() local activityId = MDL.SubjectMonth.GetActivityId() local activityInfo = MDL.OperationActivity.GetOperationActivityInfo(MDL.OperationActivity.ActivityType.SubjectMonth, activityId) local curDay = UTL.Time.GetTimestampDay(activityInfo.startTime) -- 当前是活动第几天 local modeId = CTL.SubjectMonth.GetSubActivityModeId(MDL.SubjectMonth.SubActivityType.Rogue) local cfg = DataSheetManager.VersionsRoguelikeDayLimit:GetDataByRoguelikeModeID_DayID(modeId, curDay) return cfg.RoguelikeHeroLevelLimit end Rogue_Controller.LevelState = { Unavailable = 0, PreviousLevelIncomplete = 1, Unlock = 2, } function Rogue_Controller.GetLevelState(level) local modeId = CTL.SubjectMonth.GetSubActivityModeId(MDL.SubjectMonth.SubActivityType.Rogue) local cfg = DataSheetManager.VersionsRoguelikeData:GetDataByRoguelikeModeID(modeId) local index for i, v in ipairs(cfg.RoguelikeID) do if v == level then index = i end end if index == 1 then return Rogue_Controller.LevelState.Unlock else local activityId = MDL.SubjectMonth.GetActivityId() local activityInfo = MDL.OperationActivity.GetOperationActivityInfo(MDL.OperationActivity.ActivityType.SubjectMonth, activityId) local startTime = activityInfo.startTime + cfg.RoguelikeLastTime * (index - 1) * UTL.Time.TotalSecondsOneDay local curTime = UTL.Time.GetServerTimestamp() if curTime < startTime then return Rogue_Controller.LevelState.Unavailable, startTime - curTime end local preLevel = cfg.RoguelikeID[index - 1] local starNum = MDL.Rogue.GetLevelStarNum(preLevel) if starNum >= 3 then return Rogue_Controller.LevelState.Unlock else return Rogue_Controller.LevelState.PreviousLevelIncomplete end end end function Rogue_Controller.GetRankSettlementCountdown(level) local activityId = MDL.SubjectMonth.GetActivityId() local activityInfo = MDL.OperationActivity.GetOperationActivityInfo(MDL.OperationActivity.ActivityType.SubjectMonth, activityId) local modeId = CTL.SubjectMonth.GetSubActivityModeId(MDL.SubjectMonth.SubActivityType.Rogue) local cfg = DataSheetManager.VersionsRoguelikeData:GetDataByRoguelikeModeID(modeId) local timeRefreshCfg = DataSheetManager.TimeRefresh:GetDataByID(cfg.RoguelikeRankEndTime) local index = 1 for i, v in ipairs(cfg.RoguelikeID) do if level == v then index = i break end end local settlementTime = timeRefreshCfg.HMS + UTL.Time.GetServerZeroTimestampByTimestamp(activityInfo.startTime + (cfg.RoguelikeLastTime * index - 1) * UTL.Time.TotalSecondsOneDay) local isSettled, leftTime if settlementTime > UTL.Time.GetServerTimestamp() then isSettled = false leftTime = settlementTime - UTL.Time.GetServerTimestamp() else isSettled = true end return isSettled, leftTime end function Rogue_Controller.GetRankSettlementTime() local modeId = CTL.SubjectMonth.GetSubActivityModeId(MDL.SubjectMonth.SubActivityType.Rogue) local cfg = DataSheetManager.VersionsRoguelikeData:GetDataByRoguelikeModeID(modeId) local timeRefreshCfg = DataSheetManager.TimeRefresh:GetDataByID(cfg.RoguelikeRankEndTime) return UTL.Time.FormatTimeClockBySeconds(timeRefreshCfg.HMS, "%02d:%02d") end function Rogue_Controller.GetShowSettlementTipsLeftTime(level) local activityId = MDL.SubjectMonth.GetActivityId() local activityInfo = MDL.OperationActivity.GetOperationActivityInfo(MDL.OperationActivity.ActivityType.SubjectMonth, activityId) local modeId = CTL.SubjectMonth.GetSubActivityModeId(MDL.SubjectMonth.SubActivityType.Rogue) local cfg = DataSheetManager.VersionsRoguelikeData:GetDataByRoguelikeModeID(modeId) local timeRefreshCfg = DataSheetManager.TimeRefresh:GetDataByID(cfg.RoguelikeRankEndTime) local index = 1 for i, v in ipairs(cfg.RoguelikeID) do if level == v then index = i break end end local settlementTime = timeRefreshCfg.HMS + UTL.Time.GetServerZeroTimestampByTimestamp(activityInfo.startTime + (cfg.RoguelikeLastTime * index - 1) * UTL.Time.TotalSecondsOneDay) local delayTime = 5 * UTL.Time.TotalSecondsOneMinute return settlementTime + delayTime - UTL.Time.GetServerTimestamp() end function Rogue_Controller.IsDuringRankSettlement(level) local activityId = MDL.SubjectMonth.GetActivityId() local activityInfo = MDL.OperationActivity.GetOperationActivityInfo(MDL.OperationActivity.ActivityType.SubjectMonth, activityId) local modeId = CTL.SubjectMonth.GetSubActivityModeId(MDL.SubjectMonth.SubActivityType.Rogue) local cfg = DataSheetManager.VersionsRoguelikeData:GetDataByRoguelikeModeID(modeId) local timeRefreshCfg = DataSheetManager.TimeRefresh:GetDataByID(cfg.RoguelikeRankEndTime) local index = 1 for i, v in ipairs(cfg.RoguelikeID) do if level == v then index = i break end end local settlementTime = timeRefreshCfg.HMS + UTL.Time.GetServerZeroTimestampByTimestamp(activityInfo.startTime + (cfg.RoguelikeLastTime * index - 1) * UTL.Time.TotalSecondsOneDay) local delayTime = 5 * UTL.Time.TotalSecondsOneMinute local curTime = UTL.Time.GetServerTimestamp() return curTime > settlementTime and curTime < settlementTime + delayTime end function Rogue_Controller.CanReceiveAnyStarReward() if not Rogue_Controller.IsOpen() then return false end local modeId = CTL.SubjectMonth.GetSubActivityModeId(MDL.SubjectMonth.SubActivityType.Rogue) local dataCfg = DataSheetManager.VersionsRoguelikeData:GetDataByRoguelikeModeID(modeId) for _, level in ipairs(dataCfg.RoguelikeID) do if Rogue_Controller.CanReceiveAnyStarRewardByLevel(level) then return true end end return false end function Rogue_Controller.CanReceiveAnyStarRewardByLevel(level) if not Rogue_Controller.IsOpen() then return false end local levelCfg = DataSheetManager.VersionsRoguelikeLevel:GetDataByID(level) local starNum = MDL.Rogue.GetLevelStarNum(level) for i, _ in ipairs(levelCfg.Item_Table) do if starNum >= i and not MDL.Rogue.hasReceivedLevelStarReward(level, i) then return true end end return false end function Rogue_Controller.CanAnySkillLevelUp() if not Rogue_Controller.IsOpen() then return false end for i, v in DataSheetManager.RogueHeroData:GetEnumerator() do if Rogue_Controller.CanAnySkillLevelUpByHeroId(v.HeroID) then return true end end return false end function Rogue_Controller.CanAnySkillLevelUpByHeroId(heroId) if not Rogue_Controller.IsOpen() then return false end if not MDL.Rogue.IsHeroUnlock(heroId) then return false end local skillModeId = DataSheetManager.RogueHeroData:GetDataByHeroID(heroId).SkillMode local heroLevel = MDL.Rogue.GetHeroLevel(heroId) local leftSkillPoints = MDL.Rogue.GetLeftSkillPoint(heroId) for _, v in DataSheetManager.RogueHeroSkillData:GetDataBySkillMode_TalentID(skillModeId) do local skillLevel = MDL.Rogue.GetSkillLevel(heroId, v.TalentGroupID) if v.PointNum > 0 and skillLevel == v.TalentLevel and heroLevel >= v.FrontHeroLevel and leftSkillPoints >= v.PointNum then return true end end return false end function Rogue_Controller.IsHeroMaxLevel(heroId) local levelModeId = DataSheetManager.RogueHeroData:GetDataByHeroID(heroId).LevelMode local len = DataSheetManager.RogueHeroLevelData:GetDataLengthByLevelMode_HeroLevel(levelModeId) local heroLevel = MDL.Rogue.GetHeroLevel(heroId) return heroLevel >= len end function Rogue_Controller.IsHeroReachLevelLimit(heroId) local heroLevel = MDL.Rogue.GetHeroLevel(heroId) local levelLimit = Rogue_Controller.GetHeroLevelLimit() if Rogue_Controller.IsHeroMaxLevel(heroId) then return false else return heroLevel >= levelLimit end end function private.SortHero(a, b) local isAUnlock = MDL.Rogue.IsHeroUnlock(a.HeroID) local isBUnlock = MDL.Rogue.IsHeroUnlock(b.HeroID) if isAUnlock == isBUnlock then local levelA = MDL.Rogue.GetHeroLevel(a.HeroID) local levelB = MDL.Rogue.GetHeroLevel(b.HeroID) if levelA == levelB then return a.HeroID < b.HeroID else return levelA > levelB end else return isAUnlock end end function Rogue_Controller.GetSortHeroList() local list = {} for i, v in DataSheetManager.RogueHeroData:GetEnumerator() do table.insert(list, v) end table.sort(list, private.SortHero) return list end function Rogue_Controller.GetLevelLimitTips(heroId) if Rogue_Controller.IsHeroMaxLevel(heroId) then return "" end local activityId = MDL.SubjectMonth.GetActivityId() local activityInfo = MDL.OperationActivity.GetOperationActivityInfo(MDL.OperationActivity.ActivityType.SubjectMonth, activityId) local curDay = UTL.Time.GetTimestampDay(activityInfo.startTime) -- 当前是活动第几天 local modeId = CTL.SubjectMonth.GetSubActivityModeId(MDL.SubjectMonth.SubActivityType.Rogue) local heroLevel = MDL.Rogue.GetHeroLevel(heroId) local nextLevel = 99999 local day = 0 for _, v in DataSheetManager.VersionsRoguelikeDayLimit:GetDataByRoguelikeModeID_DayID(modeId) do if v.DayID > curDay and heroLevel < v.RoguelikeHeroLevelLimit and nextLevel > v.RoguelikeHeroLevelLimit then nextLevel = v.RoguelikeHeroLevelLimit day = v.DayID end end return string.FormatByIdsId(Const_IDS.IDS_VersionsActivity_LevelLimit, day - curDay, nextLevel) end function Rogue_Controller.GetHeroLevelUpExp(heroId) local levelModeId = DataSheetManager.RogueHeroData:GetDataByHeroID(heroId).LevelMode local heroLevel = MDL.Rogue.GetHeroLevel(heroId) local rogueHeroLevelData = DataSheetManager.RogueHeroLevelData:GetDataByLevelMode_HeroLevel(levelModeId, heroLevel) return rogueHeroLevelData.LevelExp end function Rogue_Controller.GetHeroLevelUpSkillPoints(heroId, beforeLevel, afterLevel) local levelModeId = DataSheetManager.RogueHeroData:GetDataByHeroID(heroId).LevelMode local points = 0 for k, v in DataSheetManager.RogueHeroLevelData:GetDataByLevelMode_HeroLevel(levelModeId) do if v.HeroLevel >= beforeLevel and v.HeroLevel < afterLevel then points = points + v.SkillPoints end end return points end function Rogue_Controller.GetRogueHeroSkillDataByTalentGroupID(heroId, skillId, level) local skillModeId = DataSheetManager.RogueHeroData:GetDataByHeroID(heroId).SkillMode for i, v in DataSheetManager.RogueHeroSkillData:GetEnumerator() do if v.SkillMode == skillModeId and v.TalentGroupID == skillId and v.TalentLevel == level then return v end end end function Rogue_Controller.GetSkillMaxLevel(heroId, skillId) local skillModeId = DataSheetManager.RogueHeroData:GetDataByHeroID(heroId).SkillMode local maxLevel = 0 for i, v in DataSheetManager.RogueHeroSkillData:GetDataBySkillMode_TalentID(skillModeId) do if v.TalentGroupID == skillId and v.TalentLevel > maxLevel then maxLevel = v.TalentLevel end end return maxLevel end function Rogue_Controller.CanReceiveAnyLevelReward() if not Rogue_Controller.IsOpen() then return false end for _, v in DataSheetManager.RogueHeroData:GetEnumerator() do if Rogue_Controller.CanReceiveAnyLevelRewardByHeroID(v.HeroID) then return true end end return false end function Rogue_Controller.CanReceiveAnyLevelRewardByHeroID(heroId) if not Rogue_Controller.IsOpen() then return false end if not MDL.Rogue.IsHeroUnlock(heroId) then return false end local levelRewardModeId = DataSheetManager.RogueHeroData:GetDataByHeroID(heroId).LevelRewardMode local level = MDL.Rogue.GetHeroLevel(heroId) for _, v in DataSheetManager.RogueHeroLevelRewardData:GetDataByLevelRewardMode_Level(levelRewardModeId) do if level >= v.Level and not MDL.Rogue.IsReceiveHeroLevelReward(heroId, v.Level) then return true end end return false end function private.SortHeroLevelRewardData(a, b) if a.taskStatus == b.taskStatus then return a.cfg.Level < b.cfg.Level else return CTL.OACommon.SortByStatus(a.taskStatus, b.taskStatus) end end function Rogue_Controller.GetSortHeroLevelRewardData(heroId) local list = {} local activityTaskState = MDL.OACommon.ActivityTaskState local levelRewardModeId = DataSheetManager.RogueHeroData:GetDataByHeroID(heroId).LevelRewardMode local level = MDL.Rogue.GetHeroLevel(heroId) for i, v in DataSheetManager.RogueHeroLevelRewardData:GetDataByLevelRewardMode_Level(levelRewardModeId) do local taskStatus if level < v.Level then taskStatus = activityTaskState.UnDone else if MDL.Rogue.IsReceiveHeroLevelReward(heroId, v.Level) then taskStatus = activityTaskState.Commit else taskStatus = activityTaskState.Done end end table.insert(list, {taskStatus = taskStatus, cfg = v}) end table.sort(list, private.SortHeroLevelRewardData) return list end function private.CalculateAddAttr(heroId, attrId) local skillModeId = DataSheetManager.RogueHeroData:GetDataByHeroID(heroId).SkillMode local lastSkillId, level local value = 0 for i, v in DataSheetManager.RogueHeroSkillData:GetDataBySkillMode_TalentID(skillModeId) do if v.TalentType == 1 and v.ParameterRule_Table[1].TalentAddParameter1 == attrId then if lastSkillId ~= v.TalentGroupID then level = MDL.Rogue.GetSkillLevel(heroId, v.TalentGroupID) lastSkillId = v.TalentGroupID end if v.TalentLevel == level then value = value + v.ParameterRule_Table[1].TalentAddParameter2 end end end return value end function Rogue_Controller.GetAtkDefHp(heroId) local data = DataSheetManager.HeroFixedAttrRogue:GetDataByID(heroId) if data then local hp = data.hplmt + private.CalculateAddAttr(heroId, LuaConst.AttrTypeId.hplmt) local atk = data.atk + private.CalculateAddAttr(heroId, LuaConst.AttrTypeId.atk) local def = data.def + private.CalculateAddAttr(heroId, LuaConst.AttrTypeId.def) return atk, def, hp end return nil end function Rogue_Controller.GetLevelRewardDataByLevelID(levelID, score) local level = Rogue_Controller.LevelIDToID(levelID) if not level then return end local rewardId for _,v in DataSheetManager.VersionsRoguelikeLevelReward:GetEnumerator() do if v.RoguelikeID == level and score >= v.ScoreMin and score <= v.ScoreMax then rewardId = v.RewardRepeat break end end if not rewardId then return end return DataSheetManager.VersionsActivityReward:GetDataByAttrRepeatID(rewardId) end local RogueNewHeroTipKey = "RogueNewHeroTipKey" function Rogue_Controller.IsShowNewHeroTip(heroId) local activityId = MDL.SubjectMonth.GetActivityId() if MDL.Rogue.IsHeroUnlock(heroId) and not PersistentData.DeviceData:Get(RogueNewHeroTipKey .. activityId .. heroId) then return true end return false end function Rogue_Controller.SaveNewHeroTipRecord(heroId) local activityId = MDL.SubjectMonth.GetActivityId() local key = RogueNewHeroTipKey .. activityId .. heroId if PersistentData.DeviceData:Get(key) then return end PersistentData.DeviceData:Set(key, true, true) end local RogueNewLevelTipKey = "RogueNewLevelTipKey_%s_%s_%s" function Rogue_Controller.IsShowNewLevelTip() local level = Rogue_Controller.GetLatestOpenLevel() if not level then return false end local activityId = MDL.SubjectMonth.GetActivityId() local key = string.format(RogueNewLevelTipKey, BattleDataGetter.GetAcID(), activityId, level) if not PersistentData.DeviceData:Get(key) then return true end return false end function Rogue_Controller.SaveNewLevelTipRecord() local level = Rogue_Controller.GetLatestOpenLevel() if not level then return end local activityId = MDL.SubjectMonth.GetActivityId() local key = string.format(RogueNewLevelTipKey, BattleDataGetter.GetAcID(), activityId, level) if PersistentData.DeviceData:Get(key) then return end PersistentData.DeviceData:Set(key, true, true) end function Rogue_Controller.OpenRogueMainView() if not Rogue_Controller.IsOpen() then return end UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UISubjectMonthRogueMain) end function Rogue_Controller.LevelIDToID(levelID) for k, v in DataSheetManager.VersionsRoguelikeLevel:GetEnumerator() do if v.LevelID == levelID then return v.ID end end end return Rogue_Controller