local XExFubenSimulationChallengeManager = require("XEntity/XFuben/XExFubenSimulationChallengeManager") local XAdventureManager = require("XEntity/XBiancaTheatre/Adventure/XAdventureManager") local XTheatreTaskManager = require("XEntity/XBiancaTheatre/Task/XTheatreTaskManager") local XComboList = require("XEntity/XBiancaTheatre/Combo/XTheatreComboList") local XAdventureEnd = require("XEntity/XBiancaTheatre/Adventure/XAdventureEnd") local XAdventureDifficulty = require("XEntity/XBiancaTheatre/Adventure/XAdventureDifficulty") XBiancaTheatreManagerCreator = function() ---@class XBiancaTheatreManager local XBiancaTheatreManager = XExFubenSimulationChallengeManager.New(XFubenConfigs.ChapterType.BiancaTheatre) -- 当前冒险管理 XAdventureManager local CurrentAdventureManager = nil -- 任务管理 local TaskManager = XTheatreTaskManager.New() -- 完全经过的章节,章节ID local _PassChapterIdList = {} -- 已经完成的时间步骤 local _PassEventRecordDic = {} -- 已完成的结局数据 local _EndingIdRecords = {} -- 羁绊管理 local ComboList = XComboList.New() -- 缓存当前等级,用于判断等级是否提升 local CurLevelCache = 0 -- 缓存当前图鉴数目,用于判断图鉴是否增加 local UnlockItemCountCache = 0 -- 对局结束时新增的解锁道具ID,用于道具解锁提示 local NewUnlockItemIdDic = {} -- 正常的队伍人数 local _TeamCount = 3 -- 当前活动Id local CurActivityId = 0 -- 当前章节Id local CurChapterId = 0 -- 选择的难度ID local DifficultyId = 0 -- 当前总经验 local TotalExp = 0 -- 已经领取的奖励 local GetRewardIds = {} -- 已购买的强化 local StrengthenDbs = {} -- 已解锁物品ID,用于图鉴 local UnlockItemIdDic = {} -- 已解锁队伍ID local UnlockTeamId = {} -- 解锁难度 local UnlockDifficultyId = {} -- 当前难度数据 XAdventureDifficulty local CurrentDifficulty = nil -- 历史分队数据 local TeamRecords = {} -- 通关章节 local PassChapterIdDict = {} -- 当局灵视是否开启 local IsOpenVision = false -- 成就奖励领取记录 local GetAchievementRecords = {} -- 新的队伍人数 local TeamCountEffect = _TeamCount -- 累计获得道具总数 local HistoryTotalItemCount = 0 -- 累计通过战斗节点数 local HistoryTotalPassFightNodeCount = 0 -- 累计获得道具品质,数量 local HistoryItemObtainRecords = {} -- 当前游戏通过战斗节点数 local GamePassNodeCount = 0 -- 经历的事件Id key = eventId, value = eventSetpId[] local PassedEventRecord = {} -- 成就是否开启 local AchievementContidion = false -- 版本更新是否有旧冒险数据进行自动结算 local NewStage = false function XBiancaTheatreManager.InitWithServerData(data) CurActivityId = data.CurActivityId XDataCenter.BiancaTheatreManager.UpdateTotalExp(data.TotalExp) XDataCenter.BiancaTheatreManager.UpdateCurChapterId(data.CurChapterId) XDataCenter.BiancaTheatreManager.UpdateGetRewardIds(data.GetRewardIds) XDataCenter.BiancaTheatreManager.UpdateDifficultyId(data.DifficultyId) XDataCenter.BiancaTheatreManager.UpdateDifficulty(XAdventureDifficulty.New(data.DifficultyId)) XDataCenter.BiancaTheatreManager.UpdateStrengthenDbs(data.StrengthenDbs) XDataCenter.BiancaTheatreManager.UpdateUnlockItemId(data.UnlockItemId) XDataCenter.BiancaTheatreManager.UpdateTeamRecords(data.TeamRecords) XDataCenter.BiancaTheatreManager.UpdatePassCharacterIdDict(data.PassChapterIds) XDataCenter.BiancaTheatreManager.UpdateUnlockDifficultyId(data.UnlockDifficultyId) XDataCenter.BiancaTheatreManager.UpdateUnlockTeamId(data.UnlockTeamId) XDataCenter.BiancaTheatreManager.UpdateIsOpenVision(data.IsOpenVision) XDataCenter.BiancaTheatreManager.UpdateGetAchievementRecords(data.GetAchievementRecords) XDataCenter.BiancaTheatreManager.UpdateAchievemenetContidion(XTool.IsNumberValid(data.AchievementCondition)) XDataCenter.BiancaTheatreManager.UpdateTeamCountEffect(data.TeamCountEffect) XDataCenter.BiancaTheatreManager.UpdateHistoryTotalItemCount(data.HistoryTotalItemCount) XDataCenter.BiancaTheatreManager.UpdateHistoryTotalPassFightNodeCount(data.HistoryTotalPassFightNodeCount) XDataCenter.BiancaTheatreManager.UpdateHistoryItemObtainRecords(data.HistoryItemObtainRecords) XDataCenter.BiancaTheatreManager.UpdateGamePassNodeCount(data.GamePassNodeCount) XDataCenter.BiancaTheatreManager.UpdatePassedEventRecord(data.PassedEventRecord) XDataCenter.BiancaTheatreManager.UpdateNewStage(XTool.IsNumberValid(data.NewStage)) XDataCenter.BiancaTheatreManager.SetCurLevelCache() XDataCenter.BiancaTheatreManager.SetCacheUnlockItemCount() -- 初始化数据时清空新增的道具解锁 XDataCenter.BiancaTheatreManager.ClearNewUnlockItemDic() -- 更新当前冒险数据 if data.CurChapterDb then XDataCenter.BiancaTheatreManager.UpdateCurrentAdventureManager(XAdventureManager.New()) CurrentAdventureManager:InitWithServerData({ CurChapterDb = data.CurChapterDb, -- 章节数据 DifficultyId = data.DifficultyId, -- 难度 CurTeamId = data.CurTeamId, -- 当前分队ID CurRoleLv = data.CurRoleLv, -- 冒险等级 Characters = data.Characters, -- 已招募的角色 TheatreRoleAttr表的roleId SingleTeamData = data.SingleTeamData, -- 单队伍数据 Items = data.Items, --本局拥有道具 }) end end function XBiancaTheatreManager.UpdateTotalExp(totalExp) TotalExp = totalExp XEventManager.DispatchEvent(XEventId.EVENT_BIANCA_THEATRE_TOTAL_EXP_CHANGE) end --更新主界面外的部分背景 function XBiancaTheatreManager.UpdateChapterBg(rawImage) if XTool.UObjIsNil(rawImage) then return end local chapter = XBiancaTheatreManager.GetCurrentAdventureManager():GetCurrentChapter() local chapterId = chapter and chapter:GetCurrentChapterId() rawImage:SetRawImage(XBiancaTheatreConfigs.GetChapterOtherBg(chapterId)) end -- 检查物品数量是否满足指定数量 function XBiancaTheatreManager.CheckItemCountIsEnough(itemId, count, stepItemType) if XBiancaTheatreManager.GetItemCount(itemId, stepItemType) < count then XUiManager.TipError(XUiHelper.GetText("AssetsBuyConsumeNotEnough", XBiancaTheatreConfigs.GetEventStepItemName(itemId, stepItemType))) return false end return true end function XBiancaTheatreManager.GetItemCount(itemId, stepItemType) if stepItemType == XBiancaTheatreConfigs.XEventStepItemType.OutSideItem then return XDataCenter.ItemManager.GetCount(itemId) elseif stepItemType == XBiancaTheatreConfigs.XEventStepItemType.ItemBox or stepItemType == XBiancaTheatreConfigs.XEventStepItemType.Ticket then return 0 else return XBiancaTheatreManager.GetCurrentAdventureManager():GetTheatreItemCount(itemId) end end ------------- 背景音乐相关 begin ----------- --检查背景音乐的播放 function XBiancaTheatreManager.CheckBgmPlay() local curChapter = XBiancaTheatreManager.GetCurrentAdventureManager():GetCurrentChapter(true) local bgmCueId = XBiancaTheatreConfigs.GetChapterBgmCueId(curChapter:GetId()) XSoundManager.PlaySoundByType(bgmCueId, XSoundManager.SoundType.BGM) end function XBiancaTheatreManager.CheckEndBgmPlay(adventureEnd) if not adventureEnd or not XTool.IsNumberValid(adventureEnd:GetBgmCueId()) then return end XSoundManager.PlaySoundByType(adventureEnd:GetBgmCueId(), XSoundManager.SoundType.BGM) end ------------- 背景音乐相关 end ----------- ------------- 声效滤镜相关 end ----------- local CurAudioFilterVisionId = nil function XBiancaTheatreManager.StartAudioFilter() if CurAudioFilterVisionId then return end local visionValue = XBiancaTheatreManager.GetCurrentAdventureManager():GetVisionValue() XBiancaTheatreManager.OpenAudioFilter(XBiancaTheatreConfigs.GetVisionIdByValue(visionValue)) end -- 开启滤镜 function XBiancaTheatreManager.OpenAudioFilter(audioFilterVisionId) if not XBiancaTheatreManager.CheckVisionIsOpen() or not XTool.IsNumberValid(audioFilterVisionId) then return end XBiancaTheatreManager.ResetAudioFilter(CurAudioFilterVisionId) local cueId = XBiancaTheatreConfigs.GetVisionSoundFilterOpenCueId(audioFilterVisionId) if XTool.IsNumberValid(cueId) then XSoundManager.PlaySoundByType(cueId, XSoundManager.SoundType.Sound) CurAudioFilterVisionId = audioFilterVisionId XScheduleManager.Schedule(function () local audioInfo = XSoundManager.CheckHaveCue(cueId) if audioInfo and audioInfo.Playing then XSoundManager.ResetSystemAudioVolume() end end, 0, 60) end end -- 关闭滤镜 function XBiancaTheatreManager.ResetAudioFilter(audioFilterVisionId) local visionId = audioFilterVisionId or CurAudioFilterVisionId if XTool.IsNumberValid(visionId) then local openCueId = XBiancaTheatreConfigs.GetVisionSoundFilterOpenCueId(visionId) -- local closeCueId = XBiancaTheatreConfigs.GetVisionSoundFilterCloseCueId(visionId) -- if XTool.IsNumberValid(closeCueId) then -- XSoundManager.PlaySoundByType(closeCueId, XSoundManager.SoundType.Sound) -- XSoundManager.Stop(closeCueId) -- end if XTool.IsNumberValid(openCueId) then XSoundManager.Stop(openCueId) end XSoundManager.ResetSystemAudioVolume() end CurAudioFilterVisionId = nil end ---初始化音效滤镜 function XBiancaTheatreManager.InitAudioFilter() local configs = XBiancaTheatreConfigs.GetBiancaTheatreVision() -- local closeCueId for _, config in ipairs(configs) do -- if closeCueId ~= config.SoundFilterCloseCueId then -- closeCueId = config.SoundFilterCloseCueId -- if XTool.IsNumberValid(closeCueId) then -- XSoundManager.PlaySoundByType(closeCueId, XSoundManager.SoundType.Sound) -- XSoundManager.Stop(closeCueId) -- end -- end local openCueId = config.SoundFilterOpenCueId if XTool.IsNumberValid(openCueId) then XSoundManager.Stop(openCueId) end end XSoundManager.ResetSystemAudioVolume() end -- 返回主界面时关闭滤镜 function XBiancaTheatreManager.RunMain() XBiancaTheatreManager.ResetAudioFilter() XLuaUiManager.RunMain() end ---播放奖励音效(1:领取秘藏箱 | 2:领取秘藏品 | 3:领取邀约) ---@param nodeRewardType number XNodeRewardType ---@param index number function XBiancaTheatreManager.PlayGetRewardSound(nodeRewardType, index) local targetIndex if XTool.IsNumberValid(index) then targetIndex = index else if nodeRewardType == XBiancaTheatreConfigs.XNodeRewardType.ItemBox then targetIndex = 1 elseif nodeRewardType == XBiancaTheatreConfigs.XNodeRewardType.Ticket then targetIndex = 3 end end local cueId = XBiancaTheatreConfigs.GetCueWhenGetReward(targetIndex) if XTool.IsNumberValid(cueId) then XSoundManager.PlaySoundByType(cueId, XSoundManager.SoundType.Sound) end end ------------- 声效滤镜相关 end ----------- ------------- 难度相关 begin ----------- function XBiancaTheatreManager.GetDifficultyId() return DifficultyId end function XBiancaTheatreManager.UpdateDifficultyId(difficultyId) DifficultyId = difficultyId end function XBiancaTheatreManager.UpdateDifficulty(difficulty) CurrentDifficulty = difficulty end function XBiancaTheatreManager:GetCurrentDifficulty() return CurrentDifficulty end function XBiancaTheatreManager.UpdateUnlockDifficultyId(ids) if XTool.IsTableEmpty(ids) then return end for _, id in ipairs(ids or {}) do UnlockDifficultyId[id] = true end end function XBiancaTheatreManager.CheckDifficultyUnlock(difficultyId) return UnlockDifficultyId[difficultyId] and true or false end ------------- 难度相关 end ----------- ------------- 分队相关 begin ----------- ---//历史分队数据 -- public class XBiancaTheatreChapterTeam -- { -- //分队ID -- public int TeamId; -- //已通关结局 -- public HashSet EndRecords = new HashSet(); -- } function XBiancaTheatreManager.UpdateTeamRecords(teamRecords) for _, chapterTeam in ipairs(teamRecords or {}) do if not TeamRecords[chapterTeam.TeamId] then TeamRecords[chapterTeam.TeamId] = {} end for _, endingId in pairs(chapterTeam.EndRecords) do TeamRecords[chapterTeam.TeamId][endingId] = true end end end function XBiancaTheatreManager.GetTeamEndingIsActive(teamId, endingId) return TeamRecords[teamId] and TeamRecords[teamId][endingId] end function XBiancaTheatreManager.UpdateUnlockTeamId(ids) for _, id in ipairs(ids or {}) do UnlockTeamId[id] = true end end function XBiancaTheatreManager.CheckTeamUnlock(teamId) return UnlockTeamId[teamId] and true or false end function XBiancaTheatreManager.GetTeamIdList() local teamIdList = {} local teamIdListCfg = XBiancaTheatreConfigs.GetTeamIdList() local timeId for _, teamId in ipairs(teamIdListCfg) do timeId = XBiancaTheatreConfigs.GetTeamTimeId(teamId) if XFunctionManager.CheckInTimeByTimeId(timeId, true) then table.insert(teamIdList, teamId) end end return teamIdList end ------------- 分队相关 end ------------- ------------- 强化相关 begin ----------- function XBiancaTheatreManager.UpdateStrengthenDbs(strengthenDbs) for _, strengthenId in ipairs(strengthenDbs or {}) do StrengthenDbs[strengthenId] = true end end function XBiancaTheatreManager.IsBuyStrengthen(strengthenId) return StrengthenDbs[strengthenId] or false end --是否已购买某个组里的所有强化项目 function XBiancaTheatreManager.IsStrengthenGroupAllBuy(strengthenGroupId) local strengthenIdList = XTool.IsNumberValid(strengthenGroupId) and XBiancaTheatreConfigs.GetStrengthenIdList(strengthenGroupId) or {} for _, strengthenId in ipairs(strengthenIdList) do if not XBiancaTheatreManager.IsBuyStrengthen(strengthenId) then return false end end return true end --检查技能是否解锁 function XBiancaTheatreManager.CheckStrengthenUnlock(strengthenId) local preIds = XBiancaTheatreConfigs.GetStrengthenPreStrengthenIds(strengthenId) if XTool.IsTableEmpty(preIds) then return true end for _, id in ipairs(preIds) do local isActive = XBiancaTheatreManager.IsBuyStrengthen(id) if not isActive then return false end end return true end ------------- 强化相关 end ----------- ------------- 奖励等级 begin ----------- function XBiancaTheatreManager.UpdateGetRewardIds(getRewardIds) for _, theatreRewardId in ipairs(getRewardIds or {}) do GetRewardIds[theatreRewardId] = true end end function XBiancaTheatreManager.GetTotalExp() return TotalExp end function XBiancaTheatreManager.GetCurExpWithLv(level) local exp = TotalExp for i = 1, level do local unlockScore = XBiancaTheatreConfigs.GetLevelRewardUnlockScore(i) exp = exp - unlockScore end return math.max(0, exp) end --获得当前奖励等级(配置Id必须从1开始累加) function XBiancaTheatreManager.GetCurRewardLevel() local configs = XBiancaTheatreConfigs.GetBiancaTheatreLevelReward() local curLevel = 0 local curScore = 0 for id in pairs(configs) do curScore = curScore + XBiancaTheatreConfigs.GetLevelRewardUnlockScore(id) if TotalExp >= curScore then curLevel = id else break end end return curLevel end --判断是否提升等级 function XBiancaTheatreManager.CheckCurLevelIsUpdate() if XBiancaTheatreManager.GetCurRewardLevel() > CurLevelCache then XBiancaTheatreManager.SetCurLevelCache() return true else return false end end --设置当前等级缓存,用于判断是否提升等级 function XBiancaTheatreManager.SetCurLevelCache() CurLevelCache = XBiancaTheatreManager.GetCurRewardLevel() end --读取缓存等级用作升级显示 function XBiancaTheatreManager.GetCurLevelCache() return CurLevelCache end --是否有未领取的奖励 function XBiancaTheatreManager.IsHaveReward() local configs = XBiancaTheatreConfigs.GetBiancaTheatreLevelReward() local curLevel = XBiancaTheatreManager.GetCurRewardLevel() for id in pairs(configs) do if not GetRewardIds[id] and id <= curLevel then return true end end return false end --奖励是否已经领取 function XBiancaTheatreManager.CheckRewardReceived(lvRewardId) return GetRewardIds[lvRewardId] and true or false end --奖励是否可以领取 function XBiancaTheatreManager.CheckRewardAbleToReceive(lvRewardId) local isDraw = XDataCenter.BiancaTheatreManager.CheckRewardReceived(lvRewardId) local level = XDataCenter.BiancaTheatreManager.GetCurRewardLevel() return level >= lvRewardId and not isDraw end function XBiancaTheatreManager.GetCanReceiveLevelRewardIds() local configs = XBiancaTheatreConfigs.GetBiancaTheatreLevelReward() local list = {} for id, _ in pairs(configs) do if XBiancaTheatreManager.CheckRewardAbleToReceive(id) then table.insert(list, id) end end table.sort(list, function(a, b) return a < b end) return list end ------------- 奖励等级 end ----------- function XBiancaTheatreManager.CheckIsGlobalFinishChapter(chapterId) for _, v in pairs(_PassChapterIdList) do if v == chapterId then return true end end return false end function XBiancaTheatreManager.CheckIsGlobalFinishEvent(eventId, stepId) if not _PassEventRecordDic[eventId] then return false end if not _PassEventRecordDic[eventId][stepId] then return false end return true end function XBiancaTheatreManager.CheckIsFinishEnding(id) for _, v in pairs(_EndingIdRecords) do if v == id then return true end end return false end function XBiancaTheatreManager.UpdateCurChapterId(chapterId) CurChapterId = chapterId end --检查是否开始冒险了 function XBiancaTheatreManager.CheckHasAdventure() return XTool.IsNumberValid(CurChapterId) end function XBiancaTheatreManager.GetCurrentAdventureManager() if not CurrentAdventureManager then CurrentAdventureManager = XBiancaTheatreManager.CreateAdventureManager() end return CurrentAdventureManager end function XBiancaTheatreManager.CreateAdventureManager() return XAdventureManager.New() end function XBiancaTheatreManager.UpdateCurrentAdventureManager(value) if CurrentAdventureManager then CurrentAdventureManager:Release() CurrentAdventureManager = nil end CurrentAdventureManager = value end function XBiancaTheatreManager.UpdatePassCharacterIdDict(ids) if XTool.IsTableEmpty(ids) then return end for _, id in ipairs(ids) do PassChapterIdDict[id] = true end end function XBiancaTheatreManager.CheckChapterPassed(chapterId) return PassChapterIdDict[chapterId] and true or false end function XBiancaTheatreManager.CheckEndPassed(endId) for _, records in pairs(TeamRecords) do for endingId, value in pairs(records) do if endingId == endId and value then return true end end end return false end ------------------道具图鉴 begin--------------------- function XBiancaTheatreManager.UpdateUnlockItemId(unlockItemId) -- 清空结算后新增的解锁道具字典 XBiancaTheatreManager.ClearNewUnlockItemDic() for _, theatreItemId in ipairs(unlockItemId or {}) do -- 添加结算后新增的解锁道具 if not UnlockItemIdDic[theatreItemId] then table.insert(NewUnlockItemIdDic, theatreItemId) end UnlockItemIdDic[theatreItemId] = true end end function XBiancaTheatreManager.AddUnlockItemIds(unlockItemIds) for _, theatreItemId in ipairs(unlockItemIds or {}) do if not UnlockItemIdDic[theatreItemId.ItemId] then UnlockItemIdDic[theatreItemId.ItemId] = true end end end function XBiancaTheatreManager.IsUnlockItem(theatreItemId) -- 没有Condition默认解锁 if not XTool.IsNumberValid(XBiancaTheatreConfigs.GetItemUnlockConditionId(theatreItemId)) then return true end return UnlockItemIdDic[theatreItemId] or false end function XBiancaTheatreManager.GetUnlockItemCount() local count = 0 --遍历解锁的道具 for _, itemId in pairs(XBiancaTheatreConfigs.GetTheatreItemIdList()) do if XBiancaTheatreManager.IsUnlockItem(itemId) then count = count + 1 end end return count end -- 判断图鉴是否增加 function XBiancaTheatreManager.CheckUnlockItemUpdate() if XBiancaTheatreManager.GetUnlockItemCount() > UnlockItemCountCache then XBiancaTheatreManager.SetCacheUnlockItemCount() return true else return false end end -- 设置图鉴数量缓存,用于判断结算后图鉴是否增加 function XBiancaTheatreManager.SetCacheUnlockItemCount() UnlockItemCountCache = XBiancaTheatreManager.GetUnlockItemCount() end -- 情况结算后新增的解锁道具字典 function XBiancaTheatreManager.ClearNewUnlockItemDic() NewUnlockItemIdDic = {} end -- 获取结算后新增的解锁道具字典 function XBiancaTheatreManager.GetNewUnlockItemDic() return NewUnlockItemIdDic end ------------------道具图鉴 end----------------------- function XBiancaTheatreManager.GetHelpKey() return XBiancaTheatreConfigs.GetClientConfig("HelpKey") end function XBiancaTheatreManager.GetReopenHelpKey() return XBiancaTheatreConfigs.GetClientConfig("ReopenHelpKey") end -- 局外显示资源 function XBiancaTheatreManager.GetAssetItemIds() return {XBiancaTheatreConfigs.TheatreOutCoin} end -- 局内显示资源 function XBiancaTheatreManager.GetAdventureAssetItemIds() return {XBiancaTheatreConfigs.TheatreInnerCoin, XBiancaTheatreConfigs.TheatreActionPoint} end -- 局内资源点击方法 function XBiancaTheatreManager.AdventureAssetItemOnBtnClick(func, index) local itemId = XBiancaTheatreManager.GetAdventureAssetItemIds()[index] XLuaUiManager.Open("UiBiancaTheatreTips", itemId) end function XBiancaTheatreManager.GetAllCoinItemDatas() local result = {} local itemManager = XDataCenter.ItemManager local coinCount = itemManager:GetCount(XBiancaTheatreConfigs.TheatreInnerCoin) if coinCount > 0 then table.insert(result, { TemplateId = XBiancaTheatreConfigs.TheatreInnerCoin, Count = coinCount }) end local decorationCoinCount = itemManager:GetCount(XBiancaTheatreConfigs.TheatreOutCoin) if decorationCoinCount > 0 then table.insert(result, { TemplateId = XBiancaTheatreConfigs.TheatreOutCoin, Count = decorationCoinCount }) end local favorCoinCount = itemManager:GetCount(XBiancaTheatreConfigs.TheatreExp) if favorCoinCount > 0 then table.insert(result, { TemplateId = XBiancaTheatreConfigs.TheatreExp, Count = favorCoinCount }) end return result end function XBiancaTheatreManager.GetTaskManager() return TaskManager end ------------------ 副本相关 begin -------------------- function XBiancaTheatreManager.InitStageInfo() -- 关卡池的关卡 local configs = XBiancaTheatreConfigs.GetBiancaTheatreFightStageTemplate() local stageInfo = nil for _, config in pairs(configs) do stageInfo = XDataCenter.FubenManager.GetStageInfo(config.StageId) if stageInfo then stageInfo.Type = XDataCenter.FubenManager.StageType.BiancaTheatre else XLog.Error("肉鸽2.0找不到配置的关卡id:", config.StageId) end end end function XBiancaTheatreManager.CallFinishFight() local fubenManager = XDataCenter.FubenManager local res = fubenManager.FubenSettleResult if not res then -- 强退 local XFubenManager = XDataCenter.FubenManager XFubenManager.FubenSettling = false XFubenManager.FubenSettleResult = nil --通知战斗结束,关闭战斗设置页面 CS.XGameEventManager.Instance:Notify(XEventId.EVENT_FIGHT_FINISH) XBiancaTheatreManager.FinishFight({}) return end fubenManager.CallFinishFight() end function XBiancaTheatreManager.FinishFight(settle) XBiancaTheatreManager.SetIsAutoOpen(true) XBiancaTheatreManager.SetIsAutoOpenSettleWin(true) if settle.IsWin then XDataCenter.FubenManager.ChallengeWin(settle) else XBiancaTheatreManager.OpenBlackView() XBiancaTheatreManager.RemoveStepView() XBiancaTheatreManager.CheckOpenSettleWin() end end function XBiancaTheatreManager.ShowReward(winData, playEndStory) winData.OperationQueueType = XBiancaTheatreConfigs.OperationQueueType.BattleSettle CurrentAdventureManager:AddNextOperationData(winData, true) XBiancaTheatreManager.OpenBlackView() XBiancaTheatreManager.SetIsAutoOpen(true) if XBiancaTheatreManager.GetIsCatchAdventureEnd() then XBiancaTheatreManager.CheckOpenSettleWin() else XBiancaTheatreManager.CheckOpenView() XBiancaTheatreManager.RemoveBlackView() end end function XBiancaTheatreManager.PreFight(stage, teamId, isAssist, challengeCount) XBiancaTheatreManager.SetIsAutoOpen(false) XBiancaTheatreManager.SetIsAutoOpenSettleWin(false) local team = CurrentAdventureManager:GetSingleTeam() local cardIds, robotIds = CurrentAdventureManager:GetCardIdsAndRobotIdsFromTeam(team) local teamIndex = team and team:GetTeamIndex() or 0 return { StageId = stage.StageId, IsHasAssist = isAssist, ChallengeCount = challengeCount, CaptainPos = team:GetCaptainPos(), FirstFightPos = team:GetFirstFightPos(), CardIds = cardIds, RobotIds = robotIds, } end function XBiancaTheatreManager.OpenBlackView() XLuaUiManager.Open("UiBiancaTheatreBlack") end function XBiancaTheatreManager.RemoveBlackView() XLuaUiManager.Remove("UiBiancaTheatreBlack") end ------------------ 副本相关 end -------------------- function XBiancaTheatreManager.CheckCondition(conditionKey, isShowTip) local conditionId = XBiancaTheatreConfigs.GetTheatreConfig(conditionKey).Value conditionId = conditionId and tonumber(conditionId) local isUnLock, desc if XTool.IsNumberValid(conditionId) then isUnLock, desc = XConditionManager.CheckCondition(conditionId) else isUnLock, desc = true, "" end if not isUnLock then if isShowTip then XUiManager.TipError(desc) end return isUnLock end return isUnLock end ------------------step 步骤相关 begin------------------- local IsAutoOpen = true --是否检查自动打开界面 local IsSkipCheckLoading = false --是否跳过过渡界面的检查 --根据当前步骤打开相应界面 function XBiancaTheatreManager.CheckOpenView(isCheckNode, isShowLoading) if not IsAutoOpen then return end local adventureManager = XBiancaTheatreManager.GetCurrentAdventureManager() local curStep = adventureManager:GetCurrentChapter():GetCurStep() local stepType = curStep and curStep:GetStepType() if not stepType then return end local uiName if isShowLoading then --打开过渡界面 uiName = "UiBiancaTheatreLoading" elseif stepType == XBiancaTheatreConfigs.XStepType.Node then local nodeSlotType = isCheckNode and curStep:GetSelectNodeType() or "Default" uiName = XBiancaTheatreConfigs.StepTypeToUiName[stepType][nodeSlotType] else uiName = XBiancaTheatreConfigs.StepTypeToUiName[stepType] end if not uiName then return end XDataCenter.BiancaTheatreManager.CheckTipOpenList(function () XBiancaTheatreManager.RemoveStepView() XLuaUiManager.Open(uiName) local isVisionOpen = XBiancaTheatreManager.CheckVisionIsOpen() if isVisionOpen then XBiancaTheatreManager.StartAudioFilter() end end) end --移除所有由步骤通知打开的界面 function XBiancaTheatreManager.RemoveStepView() XLuaUiManager.Remove("UiBiancaTheatreChoice") XLuaUiManager.Remove("UiBiancaTheatreRecruit") XLuaUiManager.Remove("UiBiancaTheatrePlayMain") XLuaUiManager.Remove("UiBiancaTheatreOutpost") end function XBiancaTheatreManager.SetIsAutoOpen(isAutoOpen) IsAutoOpen = isAutoOpen end function XBiancaTheatreManager.SetIsSkipCheckLoading(isSkipCheckLoading) IsSkipCheckLoading = isSkipCheckLoading end ------------------step 步骤相关 end------------------- ------------------灵视系统相关 begin------------------- function XBiancaTheatreManager.UpdateIsOpenVision(isOpenVision) IsOpenVision = XTool.IsNumberValid(isOpenVision) end function XBiancaTheatreManager.CheckVisionIsOpen() return IsOpenVision end function XBiancaTheatreManager.OpenVision() local visionValue = XBiancaTheatreManager.GetCurrentAdventureManager():GetVisionValue() XBiancaTheatreManager.OpenAudioFilter(XBiancaTheatreConfigs.GetVisionIdByValue(visionValue)) XEventManager.DispatchEvent(XEventId.EVENT_BIANCA_THEATRE_VISION_OPEN) end function XBiancaTheatreManager.UpdateVisionSystemIsOpen() local localSavedKey = string.format("BiancaTheatreData_%s_VisionSystemIsOpen", XPlayer.Id) XSaveTool.SaveData(localSavedKey, true) end -- 灵视系统是否开启 function XBiancaTheatreManager.CheckVisionSystemIsOpen(isTips) local cacheVisionSystemIsOpen = XSaveTool.GetData(string.format("BiancaTheatreData_%s_VisionSystemIsOpen", XPlayer.Id)) if cacheVisionSystemIsOpen then return cacheVisionSystemIsOpen end local conditionId = tonumber(XBiancaTheatreConfigs.GetTheatreConfig("VisionConditionId").Value) if XTool.IsNumberValid(conditionId) then local unlock, desc = XConditionManager.CheckCondition(conditionId) if not unlock and isTips then XUiManager.TipMsg(desc) end return unlock, desc end return true end function XBiancaTheatreManager.ChangeVision(visionChangeId) if not XBiancaTheatreManager.CheckVisionIsOpen() then XBiancaTheatreManager.UpdateIsOpenVision(true) XBiancaTheatreManager.OpenVision() end -- 添加提示弹窗数据 local visionValue = XBiancaTheatreManager.GetCurrentAdventureManager():GetVisionValue() XBiancaTheatreManager.AddTipOpenData("UiBiancaTheatrePsionicVision", nil, false, visionChangeId, visionValue) end -- 灵视开启本地缓存记录 function XBiancaTheatreManager.GetVisionOpenTipCache() local key = string.format("BiancaTheatreData_%s_VisionOpenTip", XPlayer.Id) return XSaveTool.GetData(key) end function XBiancaTheatreManager.SetVisionOpenTipCache() local key = string.format("BiancaTheatreData_%s_VisionOpenTip", XPlayer.Id) return XSaveTool.SaveData(key, true) end ------------------灵视系统相关 end--------------------- ------------------队伍人数相关 begin------------------- function XBiancaTheatreManager.UpdateTeamCountEffect(teamCountEffect) if teamCountEffect then TeamCountEffect = teamCountEffect else TeamCountEffect = _TeamCount end end function XBiancaTheatreManager.GetTeamCountEffect() return TeamCountEffect end -- 冒险结束重置 function XBiancaTheatreManager.ResetTeamCountEffect() TeamCountEffect = _TeamCount end ------------------队伍人数相关 end--------------------- ------------------成就系统相关 begin------------------- -- 数据处理部分详见XEntity/XBiancaTheatre/Task/XTheatreTaskManager function XBiancaTheatreManager.UpdateGetAchievementRecords(getAchievementRecords) for _, achievementRecord in ipairs(getAchievementRecords or {}) do GetAchievementRecords[achievementRecord.NeedCountId] = true end end function XBiancaTheatreManager.UpdateAchievemenetContidion(isOpen) AchievementContidion = isOpen or false end function XBiancaTheatreManager.GetAchievemenetContidion() return AchievementContidion end -- 该成就组任务奖励 function XBiancaTheatreManager.GetAchievementRewardIds(needCountId) local config = XBiancaTheatreConfigs.GetBiancaTheatreActivity(CurActivityId) if XTool.IsNumberValid(needCountId) then if not XTool.IsTableEmpty(config.RewardIds) then return config.RewardIds[needCountId] end else return config.RewardIds end end -- 该成就组任务解锁条件 function XBiancaTheatreManager.GetAchievementNeedCounts(needCountId) local config = XBiancaTheatreConfigs.GetBiancaTheatreActivity(CurActivityId) if XTool.IsNumberValid(needCountId) then if not XTool.IsTableEmpty(config.NeedCounts) then return config.NeedCounts[needCountId] end else return config.NeedCounts end end function XBiancaTheatreManager.CheckAchievementIsOpen(isTips) local conditionId = XBiancaTheatreConfigs.GetTheatreConfig("AchievementConditionId").Value conditionId = tonumber(conditionId) if not XTool.IsNumberValid(conditionId) then return true end local unlock, desc local config = XConditionManager.GetConditionTemplate(conditionId) -- 17111是单局内有效的condition,成就开启是外部的condition判断 -- 为符合策划需求后端利用17111这个conditionType进行特殊处理,因此该类型的condition判断由服务端下发的数据进行判断 if config.Type == 17111 then unlock = AchievementContidion desc = config.Desc else unlock, desc = XConditionManager.CheckCondition(conditionId) end if not unlock and isTips then XUiManager.TipMsg(desc) end return unlock, desc end function XBiancaTheatreManager.CheckAchievementRecordIsGet(needCountId) return GetAchievementRecords[needCountId] end function XBiancaTheatreManager.SetAchievementGetRecord(needCountId) GetAchievementRecords[needCountId] = true end -- 成就开启本地缓存 function XBiancaTheatreManager.GetAchievementOpenTipCache() local key = string.format("BiancaTheatreData_%s_AchievementOpenTip", XPlayer.Id) return XSaveTool.GetData(key) end function XBiancaTheatreManager.SetAchievementOpenTipCache() local key = string.format("BiancaTheatreData_%s_AchievementOpenTip", XPlayer.Id) return XSaveTool.SaveData(key, true) end ------------------成就系统相关 end--------------------- ------------------进度数据相关 begin------------------- function XBiancaTheatreManager.UpdateHistoryTotalItemCount(historyTotalItemCount) HistoryTotalItemCount = historyTotalItemCount or 0 end function XBiancaTheatreManager.GetHistoryTotalItemCount() return HistoryTotalItemCount end function XBiancaTheatreManager.UpdateHistoryTotalPassFightNodeCount(historyTotalPassFightNodeCount) HistoryTotalPassFightNodeCount = historyTotalPassFightNodeCount or 0 end function XBiancaTheatreManager.GetHistoryTotalPassFightNodeCount() return HistoryTotalPassFightNodeCount end function XBiancaTheatreManager.UpdateHistoryItemObtainRecords(historyItemObtainRecords) if historyItemObtainRecords then HistoryItemObtainRecords = historyItemObtainRecords end end function XBiancaTheatreManager.GetHistoryItemObtainRecords(quality) return HistoryItemObtainRecords[quality] or 0 end function XBiancaTheatreManager.GetConditionProcess(conditionId) if not conditionId then return end local conditionConfig = XConditionManager.GetConditionTemplate(conditionId) if XTool.IsTableEmpty(conditionConfig) then return end local allProcess = 0 local curProcess = 0 if conditionConfig.Type == 17101 then allProcess = conditionConfig.Params[1] curProcess = XBiancaTheatreManager.GetHistoryTotalPassFightNodeCount() elseif conditionConfig.Type == 17106 then allProcess = conditionConfig.Params[1] elseif conditionConfig.Type == 17113 then local quality = conditionConfig.Params[2] allProcess = conditionConfig.Params[1] curProcess = quality == 0 and XBiancaTheatreManager.GetHistoryTotalItemCount() or XBiancaTheatreManager.GetHistoryItemObtainRecords(quality) end return curProcess, allProcess end ------------------进度数据相关 end--------------------- ------------------通过的事件步骤相关 begin------------------- function XBiancaTheatreManager.UpdatePassedEventRecord(passedEventRecord) PassedEventRecord = passedEventRecord or {} end -- 添加事件 function XBiancaTheatreManager.AddPassedEventRecord(eventId, stepId) if not PassedEventRecord[eventId] then PassedEventRecord[eventId] = {} end for _, eventStepId in ipairs(PassedEventRecord[eventId]) do if stepId == eventStepId then return end end table.insert(PassedEventRecord[eventId], stepId) end -- 检查是否存在事件 function XBiancaTheatreManager.CheckPassedEventRecord(eventStepId) for _, eventStepIds in pairs(PassedEventRecord) do for _, stepId in ipairs(eventStepIds) do if stepId == eventStepId then return true end end end return false end ------------------通过的事件步骤相关 end--------------------- ------------------冒险通过战斗节点相关 end--------------------- function XBiancaTheatreManager.UpdateGamePassNodeCount(gamePassNodeCount) GamePassNodeCount = gamePassNodeCount or 0 end function XBiancaTheatreManager.GetGamePassNodeCount() return GamePassNodeCount end ------------------冒险通过战斗节点相关 begin------------------- ------------------自动播放剧情 begin------------------- local GetLocalSavedKey = function(key) return string.format("%s%d", key, XPlayer.Id) end function XBiancaTheatreManager.CheckAutoPlayStory() local localSavedKey = GetLocalSavedKey("BiancaTheatreAutoStory") local storyId = XBiancaTheatreConfigs.GetFirstStoryId() if XSaveTool.GetData(localSavedKey) or not storyId then XLuaUiManager.OpenWithCallback("UiBiancaTheatreMain", function () XBiancaTheatreManager.CheckVersionUpdateOldPlaySettleTip() end) return end XDataCenter.MovieManager.PlayMovie(storyId, function() XLuaUiManager.OpenWithCallback("UiBiancaTheatreMain", function () XBiancaTheatreManager.CheckVersionUpdateOldPlaySettleTip() end) end, nil, nil, false) XSaveTool.SaveData(localSavedKey, true) end function XBiancaTheatreManager.UpdateNewStage(newStage) NewStage = newStage end -- 检查是否有版本更新旧冒险数据自动结算 function XBiancaTheatreManager.CheckVersionUpdateOldPlaySettleTip() if NewStage then XDataCenter.BiancaTheatreManager.RequestNewVersionAutoSettleTip(function () local tipTxt = XBiancaTheatreConfigs.GetVersionUpdateOldPlaySettleTip() if not string.IsNilOrEmpty(tipTxt) then XUiManager.TipError(tipTxt) end end) XDataCenter.BiancaTheatreManager.UpdateNewStage(false) end end ------------------自动播放剧情 end--------------------- ------------------自动弹窗 begin----------------------- local TipOpenListIndex = 1 local TipOpenList = nil local IsTipOpening = false -- 添加提示弹窗数据 --【注】弹窗Ui第一个参数需要是方法类型 function XBiancaTheatreManager.AddTipOpenData(uiTipName, closeCb, openData1, openData2, openData3, openData4, openData5) -- if IsTipOpening then -- XLog.Error("It is not allowed to add tipOpenData when tip is Opening, please check the code!") -- return -- end if string.IsNilOrEmpty(uiTipName) then XLog.Error("Error:XBiancaTheatreManager.AddTipOpenData, uiTipName is null!") return end if closeCb and type(closeCb) ~= "function" then XLog.Error("Error:XBiancaTheatreManager.AddTipOpenData, closeCb is not a function!") return end local data = { UiName = uiTipName, CloseCb = closeCb, OpenData1 = openData1, OpenData2 = openData2, OpenData3 = openData3, OpenData4 = openData4, OpenData5 = openData5, } if XTool.IsTableEmpty(TipOpenList) then TipOpenList = {} end table.insert(TipOpenList, data) -- 排序优先级(小而优先,弹窗中不进行排序) if not IsTipOpening then table.sort(TipOpenList, function(itemDataA, itemDataB) local orderA = XBiancaTheatreConfigs.TipOrder[itemDataA.UiName] local orderB = XBiancaTheatreConfigs.TipOrder[itemDataB.UiName] if not orderA then orderA = 0 end if not orderB then orderB = 0 end return orderA < orderB end) end end function XBiancaTheatreManager.GetTipOpenList() return TipOpenList end function XBiancaTheatreManager.ClearTipOpenList() TipOpenList = nil end function XBiancaTheatreManager.SetTipOpenList(tipOpenList) TipOpenList = tipOpenList TipOpenListIndex = 1 IsTipOpening = false end -- 弹窗执行 function XBiancaTheatreManager.CheckTipOpenList(cb, isCheckCb) if IsTipOpening and not isCheckCb then return end if not XTool.IsTableEmpty(TipOpenList) then local tipOpenData = TipOpenList[TipOpenListIndex] if not XTool.IsTableEmpty(tipOpenData) then IsTipOpening = true TipOpenListIndex = TipOpenListIndex + 1 XLuaUiManager.Open(tipOpenData.UiName, function () if tipOpenData.CloseCb then tipOpenData.CloseCb() end if TipOpenList and XTool.IsTableEmpty(TipOpenList[TipOpenListIndex]) then if cb then cb() end end XBiancaTheatreManager.CheckTipOpenList(cb, true) end, tipOpenData.OpenData1, tipOpenData.OpenData2, tipOpenData.OpenData3, tipOpenData.OpenData4, tipOpenData.OpenData5) else XBiancaTheatreManager.SetTipOpenList(nil) end else if cb then cb() end end end function XBiancaTheatreManager.CheckIsCookie(key, isNotSave) local localSavedKey = GetLocalSavedKey(key) if XSaveTool.GetData(localSavedKey) then return false end if not isNotSave then XSaveTool.SaveData(localSavedKey, true) end return true end local TheatreUnlockOwnRoleAutoWindowKey = "TheatreUnlockOwnRoleAutoWindow" -- 检查是否打开解锁自用角色弹窗 function XBiancaTheatreManager.CheckUnlockOwnRole() local adventureManager = XBiancaTheatreManager.GetCurrentAdventureManager() if not adventureManager then return end local useOwnCharacterFa = XBiancaTheatreConfigs.GetTheatreConfig("UseOwnCharacterFa").Value useOwnCharacterFa = useOwnCharacterFa and tonumber(useOwnCharacterFa) if not useOwnCharacterFa then return end local power = adventureManager:GeRoleAveragePower() if power >= useOwnCharacterFa and XBiancaTheatreManager.CheckIsCookie(TheatreUnlockOwnRoleAutoWindowKey) then XLuaUiManager.Open("UiTheatreUnlockTips", {ShowTipsPanel = XBiancaTheatreConfigs.UplockTipsPanel.OwnRole}) end end function XBiancaTheatreManager.RemoveOwnRoleCookie() XSaveTool.RemoveData(TheatreUnlockOwnRoleAutoWindowKey) end ------------------自动弹窗 end----------------------- ------------------红点相关 begin----------------------- --检查是否有任务奖励可领取 function XBiancaTheatreManager.CheckTaskCanReward() local theatreTask = XBiancaTheatreConfigs.GetBiancaTheatreTask() for id in pairs(theatreTask) do if XBiancaTheatreManager.CheckTaskCanRewardByTheatreTaskId(id) then return true end end return false end function XBiancaTheatreManager.CheckAchievementTaskCanAchieved() if not XDataCenter.BiancaTheatreManager.CheckAchievementIsOpen() then return false end local achievementIdList = XBiancaTheatreConfigs.GetAchievementIdList() if XTool.IsTableEmpty(achievementIdList) then return false end for _, achievementId in ipairs(achievementIdList) do for _, taskId in pairs(XBiancaTheatreConfigs.GetAchievementTaskIds(achievementId)) do if XDataCenter.TaskManager.CheckTaskAchieved(taskId) then return true end end end return false end function XBiancaTheatreManager.CheckAchievementTaskIsFinish() if not XDataCenter.BiancaTheatreManager.CheckAchievementIsOpen() then return false end local achievementIdList = XBiancaTheatreConfigs.GetAchievementIdList() if XTool.IsTableEmpty(achievementIdList) then return true end local achievementFinishCount = 0 for _, achievementId in ipairs(achievementIdList) do for _, taskId in pairs(XBiancaTheatreConfigs.GetAchievementTaskIds(achievementId)) do if XDataCenter.TaskManager.CheckTaskFinished(taskId) then achievementFinishCount = achievementFinishCount + 1 end end end local needCounts = XBiancaTheatreManager.GetAchievementNeedCounts() for _, needCount in ipairs(needCounts) do if needCount > achievementFinishCount then return false end end return true end function XBiancaTheatreManager.CheckTaskCanRewardByTheatreTaskId(theatreTaskId) local taskIdList = XBiancaTheatreConfigs.GetTaskIdList(theatreTaskId) for _, taskId in ipairs(taskIdList) do if XDataCenter.TaskManager.CheckTaskAchieved(taskId) then return true end end return false end local _TaskStartTimeOpenCookieKey = "TheatreTaskStartTimeOpen_" --检查是否有任务过了开启时间 function XBiancaTheatreManager.CheckTaskStartTimeOpen() local taskIdList = XBiancaTheatreConfigs.GetTheatreTaskHaveStartTimeIdList() for _, taskId in ipairs(taskIdList) do if XBiancaTheatreManager.CheckTaskStartTimeOpenByTaskId(taskId) then return true end end return false end function XBiancaTheatreManager.CheckTaskStartTimeOpenByTaskId(taskId) local template = XTaskConfig.GetTaskTemplate()[taskId] if not template then return false end local startTime = XTime.ParseToTimestamp(template.StartTime) local now = XTime.GetServerNowTimestamp() if startTime and startTime <= now and not XBiancaTheatreManager.CheckIsCookie(_TaskStartTimeOpenCookieKey .. taskId, true) then return true end return false end function XBiancaTheatreManager.CheckTaskStartTimeOpenByTheatreTaskId(theatreTaskId) local taskIdList = XBiancaTheatreConfigs.GetTaskIdList(theatreTaskId) for _, taskId in ipairs(taskIdList) do if XBiancaTheatreManager.CheckTaskStartTimeOpenByTaskId(taskId) then return true end end return false end function XBiancaTheatreManager.SaveTaskStartTimeOpenCookie(theatreTaskId) local taskIdList = XBiancaTheatreConfigs.GetTaskIdList(theatreTaskId) for _, taskId in ipairs(taskIdList) do if XBiancaTheatreManager.CheckTaskStartTimeOpenByTaskId(taskId) then XSaveTool.SaveData(GetLocalSavedKey(_TaskStartTimeOpenCookieKey .. taskId), true) end end end --检查是否显示图鉴红点 function XBiancaTheatreManager.CheckFieldGuideRedPoint() for itemId, _ in pairs(UnlockItemIdDic) do if XBiancaTheatreManager.CheckFieldGuideGridRedPoint(itemId) then return true end end return false end -- 图鉴单个道具红点 function XBiancaTheatreManager.CheckFieldGuideGridRedPoint(itemId) -- 默认解锁无需红点 if not XTool.IsNumberValid(XBiancaTheatreConfigs.GetItemUnlockConditionId(itemId)) then return false end if not XBiancaTheatreManager.GetFieldGuideGridRedPointIsClear(itemId) and XBiancaTheatreManager.IsUnlockItem(itemId) then return true else return false end end -- 道具红点缓存键值 function XBiancaTheatreManager.GetFieldGuideGridRedPointKey(itemId) return string.format("BiancaTheatreData_%s_%s_ItemRedDotIsClear", XPlayer.Id, itemId) end -- 缓存道具红点点击状态 function XBiancaTheatreManager.SetFieldGuideGridRedPointClear(itemId) -- 已解锁未点击、未解锁状态、默认解锁则无需点击 if XBiancaTheatreManager.GetFieldGuideGridRedPointIsClear(itemId) or not XBiancaTheatreManager.IsUnlockItem(itemId) then return end XSaveTool.SaveData(XBiancaTheatreManager.GetFieldGuideGridRedPointKey(itemId), true) end -- 读取道具红点点击状态缓存 function XBiancaTheatreManager.GetFieldGuideGridRedPointIsClear(itemId) return XSaveTool.GetData(XBiancaTheatreManager.GetFieldGuideGridRedPointKey(itemId)) end -- 外循环强化解锁缓存键值 function XBiancaTheatreManager.GetStrengthenUnlockCacheKey() return string.format("BiancaTheatreData_%s_StrengthenUnlock", XPlayer.Id) end -- 读取外循环强化解锁状态缓存 function XBiancaTheatreManager.GetStrengthenUnlockCache() return XSaveTool.GetData(XBiancaTheatreManager.GetStrengthenUnlockCacheKey()) end -- 保存外循环强化解锁状态缓存 function XBiancaTheatreManager.SetStrengthenUnlockCache() return XSaveTool.SaveData(XBiancaTheatreManager.GetStrengthenUnlockCacheKey(), true) end -- 读取外循环强化解锁提示缓存 function XBiancaTheatreManager.GetStrengthenUnlockTipsCache() local key = string.format("BiancaTheatreData_%s_StrengthenUnlockTip", XPlayer.Id) return XSaveTool.GetData(key) end -- 保存外循环强化解锁提示缓存 function XBiancaTheatreManager.SetStrengthenUnlockTipsCache() local key = string.format("BiancaTheatreData_%s_StrengthenUnlockTip", XPlayer.Id) return XSaveTool.SaveData(key, true) end -- 是否有新等级 function XBiancaTheatreManager.GetIsReadNewRewardLevel() local lastLevelKey = string.format("BiancaTheatreData_%s_LastLevelCount", XPlayer.Id) local lastLevelCount = XSaveTool.GetData(lastLevelKey) or 0 return XBiancaTheatreConfigs.GetMaxRewardLevel() > lastLevelCount end function XBiancaTheatreManager.SetIsReadNewRewardLevel() local lastLevelKey = string.format("BiancaTheatreData_%s_LastLevelCount", XPlayer.Id) return XSaveTool.SaveData(lastLevelKey, XBiancaTheatreConfigs.GetMaxRewardLevel()) end ------------------红点相关 end------------------------- ------------------羁绊相关 begin----------------------- function XBiancaTheatreManager.GetComboList() return ComboList end ------------------羁绊相关 end------------------------- ------------------结算相关 begin----------------------- ---@type XBiancaTheatreAdventureEnd local CatchAdventureEnd --缓存的结局类 local IsAutoOpenSettleWin = false --是否收到通知自动打开结算界面 local IsInMovie = false --是否在结局剧情 function XBiancaTheatreManager.SetAdventureEnd(settleData) CatchAdventureEnd = XAdventureEnd.New(settleData.EndId) CatchAdventureEnd:InitWithServerData(settleData) XBiancaTheatreManager.UpdatePassCharacterIdDict(settleData.PassChapterIds) XBiancaTheatreManager.UpdateUnlockDifficultyId(settleData.UnlockDifficultyId) -- 更新道具解锁数据 XBiancaTheatreManager.UpdateUnlockItemId(settleData.UnlockItemId) XBiancaTheatreManager.UpdateUnlockTeamId(settleData.UnlockTeamId) XBiancaTheatreManager.UpdateTeamRecords(settleData.TeamRecords) -- 更新历史数据:用以调查团进度 XBiancaTheatreManager.UpdateHistoryTotalItemCount(settleData.HistoryTotalItemCount) XBiancaTheatreManager.UpdateHistoryTotalPassFightNodeCount(settleData.HistoryTotalPassFightNodeCount) XBiancaTheatreManager.UpdateHistoryItemObtainRecords(settleData.HistoryItemObtainRecords) end function XBiancaTheatreManager.CheckOpenSettleWin() if not CatchAdventureEnd then return false end XBiancaTheatreManager.RemoveStepView() local adventureEnd = XTool.Clone(CatchAdventureEnd) local storyId = adventureEnd:GetStoryId() if XTool.IsNumberValid(storyId) then --结局剧情 XDataCenter.MovieManager.PlayMovie(storyId, function() XBiancaTheatreManager.RemoveBlackView() XLuaUiManager.Open("UiBiancaTheatreEndLoading", adventureEnd) end, nil, nil, false) XBiancaTheatreManager.SetInMovieState(true) else XBiancaTheatreManager.RemoveBlackView() XLuaUiManager.Open("UiBiancaTheatreEndLoading", adventureEnd) end CatchAdventureEnd = nil return true end -- 主界面判断是否剧情结算完用 function XBiancaTheatreManager.CheckIsInMovie() local state = IsInMovie if state then -- 能进主界面判断代表结束剧情,直接设为false XBiancaTheatreManager.SetInMovieState(false) end return state end function XBiancaTheatreManager.SetInMovieState(state) IsInMovie = state end --结算初始化数据 function XBiancaTheatreManager.SettleInitData() -- 还原滤镜 XBiancaTheatreManager.ResetAudioFilter() -- 重置队伍人数限制 XBiancaTheatreManager.UpdateTeamCountEffect(0) -- 更新灵视开启 XBiancaTheatreManager.UpdateIsOpenVision(0) -- 清空已通过的事件 XBiancaTheatreManager.UpdatePassedEventRecord() -- 清空局内通过战斗节点 XBiancaTheatreManager.UpdateGamePassNodeCount(0) -- 更新全局通过的章节和事件数据 XBiancaTheatreManager.UpdateCurChapterId(0) XBiancaTheatreManager.UpdateDifficultyId(0) -- 清除队伍数据 XBiancaTheatreManager.GetCurrentAdventureManager():ClearTeam() end function XBiancaTheatreManager.SetIsAutoOpenSettleWin(isAcitve) IsAutoOpenSettleWin = isAcitve end function XBiancaTheatreManager.GetIsAutoOpenSettleWin() return IsAutoOpenSettleWin end function XBiancaTheatreManager.GetIsCatchAdventureEnd() return CatchAdventureEnd ~= nil end ------------------结算相关 end----------------------- ------------------协议 begin-------------------- --选择分队 function XBiancaTheatreManager.RequestSelectTeam(teamId, callback) local requestBody = { TeamId = teamId, --肉鸽分队Id } XNetwork.CallWithAutoHandleErrorCode("BiancaTheatreSelectTeamRequest", requestBody, function(res) XBiancaTheatreManager.GetCurrentAdventureManager():UpdateCurTeamId(requestBody.TeamId) if callback then callback() end end) end --强化技能 function XBiancaTheatreManager.RequestStrengthen(id, callback) local requestBody = { Id = id, } XNetwork.CallWithAutoHandleErrorCode("BiancaTheatreStrengthenRequest", requestBody, function(res) StrengthenDbs[id] = true XEventManager.DispatchEvent(XEventId.EVENT_BIANCA_THEATRE_STRENGTHEN_ACTIVE, id) local groupId = XBiancaTheatreConfigs.GetStrengthenGroupId(id) if XBiancaTheatreManager.IsStrengthenGroupAllBuy(groupId) then XEventManager.DispatchEvent(XEventId.EVENT_BIANCA_THEATRE_GROUP_STRENGTHEN_ACTIVE, groupId) end if callback then callback() end end) end --单独领取 function XBiancaTheatreManager.RequestGetReward(id, callback) --local isAdventure = XDataCenter.BiancaTheatreManager.CheckHasAdventure() --if isAdventure then -- XUiManager.TipMsg(XBiancaTheatreConfigs.GetRewardTips(2)) -- return --end local requestBody = { Id = id, --领奖id } XNetwork.CallWithAutoHandleErrorCode("BiancaTheatreGetRewardRequest", requestBody, function(res) XLuaUiManager.Open("UiBiancaTheatreTipReward", nil, res.RewardGoodsList) GetRewardIds[id] = true if callback then callback() end end) end --一键领取 function XBiancaTheatreManager.RequestGetAllReward(callback) XNetwork.CallWithAutoHandleErrorCode("BiancaTheatreGetAllRewardRequest", nil, function(res) XLuaUiManager.Open("UiBiancaTheatreTipReward", nil, res.RewardGoodsList) XBiancaTheatreManager.UpdateGetRewardIds(res.GetRewardIds) if callback then callback() end end) end -- 领取成就奖励 function XBiancaTheatreManager.RequestAchievementReward(needCountId, callback) local requestBody = { NeedCountId = needCountId, --成就完成数id } XNetwork.CallWithAutoHandleErrorCode("BiancaTheatreGetAchievementRewardRequest", requestBody, function(res) if table.nums(res.RewardGoodsList) > 0 then XLuaUiManager.Open("UiBiancaTheatreTipReward", callback, res.RewardGoodsList) XBiancaTheatreManager.SetAchievementGetRecord(needCountId) else if callback then callback() end end end) end -- 检查是否有版本更新旧冒险数据自动结算 function XBiancaTheatreManager.RequestNewVersionAutoSettleTip(callback) XNetwork.CallWithAutoHandleErrorCode("BiancaTheatreNewStageRequest", nil, function(res) XDataCenter.BiancaTheatreManager.UpdateNewStage(false) if callback then callback() end end) end ------------------协议 end---------------------- ------------------副本入口扩展 start------------------------- function XBiancaTheatreManager:ExOpenMainUi() if XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.BiancaTheatre) then XBiancaTheatreManager.CheckAutoPlayStory() end end -- 检查是否展示红点 function XBiancaTheatreManager:ExCheckIsShowRedPoint() if not XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.BiancaTheatre) then return false end return XBiancaTheatreManager.IsHaveReward() or XBiancaTheatreManager.GetIsReadNewRewardLevel() end function XBiancaTheatreManager:ExGetProgressTip() local curLevel = XBiancaTheatreManager.GetCurRewardLevel() local maxLevel = curLevel local configs = XBiancaTheatreConfigs.GetBiancaTheatreLevelReward() for id, _ in pairs(configs or {}) do maxLevel = math.max(id, maxLevel) end local desc = XBiancaTheatreConfigs.GetTheatreClientConfig("BannerProgress").Values[1] return string.format(desc, curLevel, maxLevel) end function XBiancaTheatreManager:ExCheckInTime() local config = XBiancaTheatreConfigs.GetBiancaTheatreActivity() for i, v in pairs(config) do if XFunctionManager.CheckInTimeByTimeId(v.TimeId) then return true end end return false end function XBiancaTheatreManager:ExCheckIsFinished(cb) if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.BiancaTheatre, nil, true) then if cb then cb(false) end return false end local curLevel = XBiancaTheatreManager.GetCurRewardLevel() local maxLevel = XBiancaTheatreConfigs.GetMaxRewardLevel() local isGetAllLvReward = curLevel == maxLevel and XTool.IsTableEmpty(XBiancaTheatreManager.GetCanReceiveLevelRewardIds()) --等级奖励全领取 & 成就奖励全领取 if isGetAllLvReward and XBiancaTheatreManager.CheckAchievementTaskIsFinish() then self.IsClear = true if cb then cb(true) end return true end self.IsClear = false if cb then cb(false) end return false end ------------------副本入口扩展 end------------------------- XBiancaTheatreManager.InitAudioFilter() return XBiancaTheatreManager end --登陆下发 XRpc.NotifyBiancaTheatreActivityData = function(data) XDataCenter.BiancaTheatreManager.InitWithServerData(data) end -- 新的步骤 XRpc.NotifyBiancaTheatreAddStep = function(data) local adventureManager = XDataCenter.BiancaTheatreManager.GetCurrentAdventureManager() local currentChapter = adventureManager:GetCurrentChapter(false) local chapterId = data.ChapterId local isNewChapter = currentChapter and currentChapter:GetCurrentChapterId() ~= chapterId if currentChapter == nil or isNewChapter then currentChapter = adventureManager:CreatreChapterById(chapterId) end if #currentChapter:GetCurrentNodes() > 0 and not currentChapter:CheckHasMovieNode() and data.Step.StepType == XBiancaTheatreConfigs.XStepType.Node then currentChapter:AddPassNodeCount(1) end if #currentChapter:GetCurrentNodes() > 0 then for _, node in ipairs(currentChapter:GetCurrentNodes()) do -- 选中且是事件节点 if node:GetIsSelected() and node.EventConfig then XDataCenter.BiancaTheatreManager.AddPassedEventRecord(node.EventConfig.EventId, node.EventConfig.StepId) end end end currentChapter:AddStep(data.Step) --步骤是招募角色或腐化,刷新角色字典 if data.Step.StepType == XBiancaTheatreConfigs.XStepType.RecruitCharacter or data.Step.StepType == XBiancaTheatreConfigs.XStepType.DecayRecruitCharacter then currentChapter:UpdateRecruitRoleDic() end XDataCenter.BiancaTheatreManager.CheckOpenView(nil, isNewChapter) if isNewChapter then XDataCenter.BiancaTheatreManager.SetIsAutoOpen(false) end end --战斗结束,事件进行到下一步 XRpc.NotifyBiancaTheatreNodeNextStep = function(data) if data.NextStepId <= 0 then -- 事件战斗结束后没有下一步了 return end local chapter = XDataCenter.BiancaTheatreManager.GetCurrentAdventureManager():GetCurrentChapter() local curStep = chapter:GetCurStep() local eventNode = chapter:GetEventNode(data.EventId) if not eventNode then XLog.Error("NotifyBiancaTheatreNodeNextStep找不到事件节点, data:", data, curStep) return end eventNode:UpdateNextStepEvent(data.NextStepId, nil, curStep) end --获得物品,加入到已获得道具列表 XRpc.NotifyBiancaTheatreAddItem = function(data) local adventureManager = XDataCenter.BiancaTheatreManager.GetCurrentAdventureManager() if adventureManager then for _, itemData in pairs(data.BiancaTheatreItems) do adventureManager:UpdateItemData(itemData) end end end --通知结算,可能会登录下发 XRpc.NotifyBiancaTheatreAdventureSettle = function(data) local manager = XDataCenter.BiancaTheatreManager manager.SettleInitData() manager.SetAdventureEnd(data.SettleData) manager.ResetTeamCountEffect() if XDataCenter.BiancaTheatreManager.GetIsAutoOpenSettleWin() then manager.RemoveStepView() manager.CheckOpenSettleWin() end end XRpc.NotifyBiancaTheatreTotalExp = function(data) XDataCenter.BiancaTheatreManager.UpdateTotalExp(data.TotalExp) end XRpc.NotifyBiancaTheatreAbnormalExit = function() end -- 灵视系统开启 XRpc.NotifyBiancaTheatreVisionCondition = function() XDataCenter.BiancaTheatreManager.UpdateVisionSystemIsOpen() end -- 灵视变化(选择奖励、获得某些道具、腐化事件下发) XRpc.NotifyBiancaTheatreVisionChange = function(data) XDataCenter.BiancaTheatreManager.ChangeVision(data.VisionId) end -- 通知获得队伍人数改变效果(获得时效果时、登录下发)(中止冒险重置) XRpc.NotifyBiancaTheatreFightTeamEffect = function(data) XDataCenter.BiancaTheatreManager.UpdateTeamCountEffect(data.TeamCountEffect) end -- 通知成就解锁 XRpc.NotifyBiancaTheatreAchievementCondition = function() XDataCenter.BiancaTheatreManager.UpdateAchievemenetContidion(true) end -- 通知战斗节点次数改变(结算,登陆,改变时下发) XRpc.NotifyBiancaTheatreFightNodeCountChange = function(data) XDataCenter.BiancaTheatreManager.UpdateGamePassNodeCount(data.FightNodeCount) end