local XExFubenCollegeStudyManager = require("XEntity/XFuben/XExFubenCollegeStudyManager") local CSXTextManagerGetText = CS.XTextManager.GetText local tableInsert = table.insert local tableSort = table.sort local CSGameEventManager = CS.XGameEventManager.Instance XFubenExperimentManagerCreator = function() local XFubenExperimentManager = XExFubenCollegeStudyManager.New(XFubenConfigs.ChapterType.Experiment) local TrialGroup = {} local TrialLevel = {} local TrialLevelDic = {} local ShowTrialGroup = {} -- local BattleTrial = {} local FinishExperimentIds = {} local ExperimentInfos = {} -- 关卡完成信息字典(k:关卡Id,v:信息) local ModeRecordDic = {} --服务器获取的副本结束时间信息 local CurStageId XFubenExperimentManager.TrialLevelType = { Signle = 1, Mult = 2, Switch = 3, SkinTrial = 5, } XFubenExperimentManager.TabGroupId = { SkinTrial = 18 --涂装试玩 } local FUBEN_EXPERIMENT_PROTO = { ExperimentStarRewardRequest = "ExperimentStarRewardRequest", } local function InitLevelDic() for i, v in ipairs(TrialLevel) do if not TrialLevelDic[v.GroupID] then TrialLevelDic[v.GroupID] = {v} else tableInsert(TrialLevelDic[v.GroupID],v) end end end function XFubenExperimentManager.Init() TrialGroup = XFubenExperimentConfigs.GetTrialGroupCfg() TrialLevel = XFubenExperimentConfigs.GetTrialLevelCfg() InitLevelDic() -- BattleTrial = XFubenExperimentConfigs.GetBattleTrialCfg() end function XFubenExperimentManager.RecordMode(stageId,mode) ModeRecordDic[stageId] = mode end function XFubenExperimentManager.GetRecordMode(stageId) if not ModeRecordDic[stageId] then ModeRecordDic[stageId] = XFubenExperimentManager.TrialLevelType.Signle end return ModeRecordDic[stageId] end local GetStarsCount = function(starsMark) local count = (starsMark & 1) + (starsMark & 2 > 0 and 1 or 0) + (starsMark & 4 > 0 and 1 or 0) local map = {(starsMark & 1) > 0, (starsMark & 2) > 0, (starsMark & 4) > 0 } return count, map end function XFubenExperimentManager.GetTrialGroup() return TrialGroup end function XFubenExperimentManager.GetSkinTrialTime() local levels = TrialLevelDic[XFubenExperimentManager.TabGroupId.SkinTrial] if #levels == 0 then return end local startTime = math.huge local endTime = 0 for i = 1, #levels do local timeId = levels[i].TimeId if timeId and timeId ~= 0 and XFunctionManager.IsEffectiveTimeId(timeId) then local levelStartTime,levelEndTime = XFunctionManager.GetTimeByTimeId(timeId) if startTime > levelStartTime then startTime = levelStartTime end if endTime < levelEndTime then endTime = levelEndTime end end end return startTime,endTime end function XFubenExperimentManager.GetCurrActivtySkin() local levels = TrialLevelDic[XFubenExperimentManager.TabGroupId.SkinTrial] if #levels == 0 then return end local levelConfig -- 记录是哪个皮肤关卡开放 for i = 1, #levels do local timeId = levels[i].TimeId if timeId and timeId ~= 0 and XFunctionManager.CheckInTimeByTimeId(timeId) then levelConfig = levels[i] end end return levelConfig end function XFubenExperimentManager.GetTrialLevelByGroupID(groupID) local levels = TrialLevelDic[groupID] or {} local temps = {} for _, v in ipairs(levels) do if v.TimeId and v.TimeId ~= 0 then if XFunctionManager.CheckInTimeByTimeId(v.TimeId) then tableInsert(temps,v) end else tableInsert(temps,v) end end return temps end function XFubenExperimentManager.CheckGroupHasInTimeTask(groupId) local levels = XFubenExperimentManager.GetTrialLevelByGroupID(groupId) return #levels > 0 end function XFubenExperimentManager.GetShowTrialGroup(func) ShowTrialGroup = {} for k, v in pairs(TrialGroup) do if v.SubIndex == 0 and v.TimeId == 0 then tableInsert(ShowTrialGroup,v) elseif XFubenExperimentManager.CheckGroupHasInTimeTask(v.Id) then tableInsert(ShowTrialGroup,v) end end if func then tableSort(ShowTrialGroup,func) end return ShowTrialGroup end function XFubenExperimentManager.GetEndTime(id) if ShowTrialGroup[id] then local timeId = ShowTrialGroup[id].TimeId return XFunctionManager.GetEndTimeByTimeId(timeId) end return nil end function XFubenExperimentManager.GetStartTime(id) if ShowTrialGroup[id] then local timeId = ShowTrialGroup[id].TimeId return XFunctionManager.GetStartTimeByTimeId(timeId) end return nil end function XFubenExperimentManager.GetStageCondition(id) return TrialLevel[id].ConditionId end function XFubenExperimentManager.GetStageShowPass(id) return TrialLevel[id].ShowPass end function XFubenExperimentManager.GetCurExperimentLevelId() return CurStageId end function XFubenExperimentManager.SetCurExperimentLevelId(id) CurStageId = id end function XFubenExperimentManager.GetCurExperiment() return XFubenExperimentConfigs.GetTrialLevelCfgById(CurStageId) end function XFubenExperimentManager.GetFinishExperimentIds() return FinishExperimentIds end function XFubenExperimentManager.SetFinishExperimentIds(list) FinishExperimentIds = list end function XFubenExperimentManager.UpdateFinishExperimentId(id) table.insert(FinishExperimentIds, id) end function XFubenExperimentManager.CheckExperimentIsFinish(Id) for _, v in pairs(FinishExperimentIds) do if v == Id then return true end end return false end function XFubenExperimentManager.SetExperimentInfo(experimentInfo) ExperimentInfos[experimentInfo.Id] = experimentInfo end function XFubenExperimentManager.GetExperimentInfo(id) if not ExperimentInfos[id] then return nil end return ExperimentInfos[id] end function XFubenExperimentManager.HandleExperimentData(data) XFubenExperimentManager.SetFinishExperimentIds(data.FinishIds) if data.ExperimentInfos then for _, experimentInfo in ipairs(data.ExperimentInfos) do XFubenExperimentManager.SetExperimentInfo(experimentInfo) end end end function XFubenExperimentManager.SetStarReward(id, starNum) if not ExperimentInfos[id] then return end if not ExperimentInfos[id].StarList then ExperimentInfos[id].StarList = {} end tableInsert(ExperimentInfos[id].StarList, starNum) end function XFubenExperimentManager.GetStarReward(levelId, rewardIndex) -- TODO 本地校验 if XFubenExperimentManager.CheckExperimentRewardIsTaked(levelId, rewardIndex) then XUiManager.TipError(CSXTextManagerGetText("FuBenExperimentRewardIsTaked")) return end if not XFubenExperimentManager.CheckExperimentRewardIsCanTake(levelId, rewardIndex) then XUiManager.TipError(CSXTextManagerGetText("FuBenExperimentTakeRewardFaild")) return end local starNum = XFubenExperimentManager.GetStardRewardNeedStarNum(levelId, rewardIndex) XNetwork.Call(FUBEN_EXPERIMENT_PROTO.ExperimentStarRewardRequest, {Id = levelId, StarNum = starNum},function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XFubenExperimentManager.SetStarReward(levelId, starNum) XUiManager.OpenUiObtain(res.RewardList) CSGameEventManager:Notify(XEventId.EVENT_EXPERIMENT_GET_STAR_REWARD) XEventManager.DispatchEvent(XEventId.EVENT_EXPERIMENT_GET_STAR_REWARD) end) end function XFubenExperimentManager.GetExperimentStarProgressById(id) local levelCfg = XFubenExperimentConfigs.GetTrialLevelCfgById(id) if not levelCfg then return end local starRewardCfg = XFubenExperimentConfigs.GetTrialStarRewardCfgById(levelCfg.StarReward) if not starRewardCfg then return end local curStarNum = 0 local experimentInfo = XFubenExperimentManager.GetExperimentInfo(id) if experimentInfo then if experimentInfo.StarsMark then curStarNum = GetStarsCount(experimentInfo.StarsMark) end end local maxStarNum = 0 for _, starNum in pairs(starRewardCfg.StarNum) do if starNum > maxStarNum then maxStarNum = starNum end end return curStarNum, maxStarNum end function XFubenExperimentManager.CheckTargetComplete(id, targetIndex) local experimentInfo = ExperimentInfos[id] if not experimentInfo then return false end local starsMark = experimentInfo.StarsMark local starCount, starMap = GetStarsCount(experimentInfo.StarsMark) if starMap[targetIndex] then return true end return false end function XFubenExperimentManager.CheckExperimentRewardIsTaked(id, rewardIndex) local experimentInfo = XFubenExperimentManager.GetExperimentInfo(id) if not experimentInfo then return false end local starNum = XFubenExperimentManager.GetStardRewardNeedStarNum(id, rewardIndex) if not starNum then return false end if not experimentInfo.StarList then return false end for _, isTakedStarNum in pairs(experimentInfo.StarList) do if starNum == isTakedStarNum then return true end end return false end -- 判断可领取该星级奖励(不判断是否已经领取,已经领取用CheckExperimentRewardIsTaked判断) function XFubenExperimentManager.CheckExperimentRewardIsCanTake(id, rewardIndex) local experimentInfo = ExperimentInfos[id] if not experimentInfo then return false end local starCount = GetStarsCount(experimentInfo.StarsMark) local starNum = XFubenExperimentManager.GetStardRewardNeedStarNum(id, rewardIndex) if not starNum then return false end if starCount < starNum then return false end return true end function XFubenExperimentManager.GetStardRewardNeedStarNum(id, rewardIndex) local trainedLevelCfg = XFubenExperimentConfigs.GetTrialLevelCfgById(id) local trialRewardCfg = XFubenExperimentConfigs.GetTrialStarRewardCfgById(trainedLevelCfg.StarReward) local starNumList = trialRewardCfg.StarNum if not starNumList[rewardIndex] then return nil end return starNumList[rewardIndex] end function XFubenExperimentManager.CheckBannerRedPoint(trialLevelInfo) -- 检查红点 local isShowRed = false if trialLevelInfo.StarReward and trialLevelInfo.StarReward > 0 then -- 带有奖励的试玩关 local starRewardId = trialLevelInfo.StarReward local rewardList = XFubenExperimentConfigs.GetTrialStarRewardCfgById(starRewardId).StarNum if not rewardList then return false end for index, _ in ipairs(rewardList) do if XFubenExperimentManager.CheckExperimentRewardIsCanTake(trialLevelInfo.Id, index) and not XFubenExperimentManager.CheckExperimentRewardIsTaked(trialLevelInfo.Id, index) then isShowRed = true break end end elseif trialLevelInfo.Type == XFubenExperimentManager.TrialLevelType.SkinTrial then if not XFubenExperimentManager.CheckExperimentIsFinish(trialLevelInfo.Id) then isShowRed = true end end return isShowRed end function XFubenExperimentManager.CheckExperimentGroupHaveRedPoint(groupId) local levelTamplates = XFubenExperimentManager.GetTrialLevelByGroupID(groupId) for _, trialLevelInfo in ipairs(levelTamplates) do if XFubenExperimentManager.CheckBannerRedPoint(trialLevelInfo) then return true end end end function XFubenExperimentManager.CheckSkinTrialRedPoint() return XFubenExperimentManager.CheckExperimentGroupHaveRedPoint(XFubenExperimentManager.TabGroupId.SkinTrial) end function XFubenExperimentManager.InitStageInfo() for k, v in ipairs(TrialLevel) do if v.SingStageId and v.SingStageId ~= 0 then local stageInfo = XDataCenter.FubenManager.GetStageInfo(v.SingStageId) stageInfo.Type = XDataCenter.FubenManager.StageType.Experiment if v.StarReward and v.StarReward ~= 0 then stageInfo.HasReward = true end end if v.MultStageId and v.MultStageId ~= 0 then local stageInfo = XDataCenter.FubenManager.GetStageInfo(v.MultStageId) stageInfo.Type = XDataCenter.FubenManager.StageType.Experiment if v.StarReward and v.StarReward ~= 0 then stageInfo.HasReward = true end end end end function XFubenExperimentManager.ShowReward(winData) local stageId = winData.StageId local stageCfg = XDataCenter.FubenManager.GetStageCfg(stageId) if next(stageCfg.StarDesc) then XLuaUiManager.Open("UiSettleWinMainLine", winData) else XLuaUiManager.Open("UiSettleWin", winData) end end function XFubenExperimentManager.CheckExperimentRedPoint() local experimentGroups = XFubenExperimentManager.GetShowTrialGroup() for _, groupTemplate in ipairs(experimentGroups) do if XFubenExperimentManager.CheckExperimentGroupHaveRedPoint(groupTemplate.Id) then return true end end return false end ------------------副本入口扩展 start------------------------- function XFubenExperimentManager:ExGetIcon() local skinLevelConfig = XFubenExperimentManager.GetCurrActivtySkin() if skinLevelConfig then return skinLevelConfig.ChapterIcon end return self:ExGetConfig().Icon end function XFubenExperimentManager:ExCheckIsShowRedPoint() return XFubenExperimentManager.CheckExperimentRedPoint() end function XFubenExperimentManager:ExGetTagInfo() local skinLevelConfig = XFubenExperimentManager.GetCurrActivtySkin() if skinLevelConfig then return true, CS.XTextManager.GetText("FuBenExperimentSkinTag") end return false end function XFubenExperimentManager:ExOpenMainUi() if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.FubenActivityTrial) then return end XLuaUiManager.Open("UiFubenExperiment") end ------------------副本入口扩展 end------------------------- XFubenExperimentManager.Init() return XFubenExperimentManager end XRpc.NotifyUpdateExperimentId = function(data) XDataCenter.FubenExperimentManager.UpdateFinishExperimentId(data.Id) if data.Info then XDataCenter.FubenExperimentManager.SetExperimentInfo(data.Info) end XEventManager.DispatchEvent(XEventId.EVENT_UPDATE_EXPERIMENT) end XRpc.NotifyExperimentData = function(data) XDataCenter.FubenExperimentManager.HandleExperimentData(data) end