local tableInsert = table.insert local ipairs = ipairs local pairs = pairs XFubenSimulatedCombatManagerCreator = function() local MAX_CHAR_COUNT = 3 local MAX_STAGE_STAR_COUNT = 3 local XFubenSimulatedCombatManager = {} local ActivityInfo = nil local DefaultActivityInfo = nil local StageInterInfo = nil local ChallengeMapKey = "SIMULATED_COMBAT_CHALLENGE_MAP_" local ShopMapKey = "SIMULATED_COMBAT_SHOP_MAP_" local MemberList = {} local AdditionList = {} local LocalCurrency = {} local CurrencyNoToId = {} local CurrencyIdToNo = {} local ChallengeMap = {} local CurrentTeam = {} local CharIdToMemberId = {} local ConsumeLimitList = {} local LastShopMap = {} local DailyStageStarRewardCount = 0 --每日关卡星级奖励领取次数 local StageStarRecordDic = {} local StarRewardDic = {} --已经领取的星级奖励 local PointRewardDic = {} --已经领取的积分奖励 local ResMemberSelectCount = 0 -- 已选择成员数 local IsRegisterEditBattleProxy = false function XFubenSimulatedCombatManager.Init() DailyStageStarRewardCount = 0 local activityTemplates = XFubenSimulatedCombatConfig.GetActTemplates() local nowTime = XTime.GetServerNowTimestamp() for _, template in pairs(activityTemplates) do DefaultActivityInfo = XFubenSimulatedCombatConfig.GetActivityTemplateById(template.Id) local TimeId = template.TimeId local startTime, endTime = XFunctionManager.GetTimeByTimeId(TimeId) if nowTime > startTime and nowTime < endTime then if not ActivityInfo then ActivityInfo = XFubenSimulatedCombatConfig.GetActivityTemplateById(template.Id) end break end end if ActivityInfo then for i, v in ipairs(ActivityInfo.ConsumeIds) do XEventManager.AddEventListener(XEventId.EVENT_ITEM_COUNT_UPDATE_PREFIX .. v, XFubenSimulatedCombatManager.OnCurrencyChange) CurrencyNoToId[i] = v CurrencyIdToNo[v] = i if ActivityInfo.ConsumeCountLimit[i] > 0 then ConsumeLimitList[v] = true end end XFubenSimulatedCombatManager.OnCurrencyChange() end XFubenSimulatedCombatManager.ResetChange() XFubenSimulatedCombatManager.RegisterEditBattleProxy() end local FUBEN_SIMUCOMBAT_PROTO = { SimulatedCombatGetStageRewardRequest = "SimulatedCombatGetStageRewardRequest", SimulatedCombatPreFightRequest = "SimulatedCombatPreFightRequest", SimulatedCombatPointRewardRequest = "SimulatedCombatPointRewardRequest", SimulatedCombatGetStarRewardRequest = "SimulatedCombatGetStarRewardRequest", } function XFubenSimulatedCombatManager.GetCurrentActTemplate() return ActivityInfo end function XFubenSimulatedCombatManager.GetCurrencyIdByNo(no) return CurrencyNoToId[no] end function XFubenSimulatedCombatManager.CheckChange() return false end function XFubenSimulatedCombatManager.OnActivityEnd() XLuaUiManager.RunMain() XUiManager.TipText("ActivityMainLineEnd", XUiManager.UiTipType.Wrong, true) end function XFubenSimulatedCombatManager.ResetChange() if not ActivityInfo then return end XFubenSimulatedCombatManager.SaveShopMap() StageInterInfo = nil MemberList = {} AdditionList = {} ChallengeMap = {} CharIdToMemberId = {} ResMemberSelectCount = 0 XFubenSimulatedCombatManager.OnCurrencyChange() end function XFubenSimulatedCombatManager.GetCurrencyByItem(item) if ConsumeLimitList[item.Id] then return string.format("%d/%d", LocalCurrency[item.Id], item:GetCount()) else return LocalCurrency[item.Id] end end function XFubenSimulatedCombatManager.GetCurrencyByNo(no) if not ActivityInfo then return end return LocalCurrency[ActivityInfo.ConsumeIds[no]] end function XFubenSimulatedCombatManager.GetCurrencyIcon(no) if not no or not ActivityInfo then return end local index = tonumber(no) return XDataCenter.ItemManager.GetItemIcon(ActivityInfo.ConsumeIds[index]) end function XFubenSimulatedCombatManager.OnCurrencyChange() if not ActivityInfo then return end -- 计算本地货币数量 for _, consumeId in ipairs(ActivityInfo.ConsumeIds) do LocalCurrency[consumeId] = XDataCenter.ItemManager.GetCount(consumeId) end if StageInterInfo then local priceCount = XFubenSimulatedCombatManager.CalcBuyCount() for consumeId, price in pairs(priceCount) do LocalCurrency[consumeId] = LocalCurrency[consumeId] - price end end CsXGameEventManager.Instance:Notify(XEventId.EVENT_FUBEN_SIMUCOMBAT_UPDATE, false) end function XFubenSimulatedCombatManager.GetResCfg(data) if data.Type == XFubenSimulatedCombatConfig.ResType.Member then return XFubenSimulatedCombatConfig.GetMemberById(data.Id) elseif data.Type == XFubenSimulatedCombatConfig.ResType.Addition then return XFubenSimulatedCombatConfig.GetAdditionById(data.Id) end end function XFubenSimulatedCombatManager.CalcPriceCount(calcSelectType) if not StageInterInfo then return end local price = {} -- calcSelectType 计算特定类别选中商品的价格 for _, consumeId in ipairs(ActivityInfo.ConsumeIds) do price[consumeId] = 0 end if XFubenSimulatedCombatManager.CheckCurrencyFree() then return price end local list = XFubenSimulatedCombatManager.GetCurrentResList(calcSelectType) for _, item in ipairs(list) do if item.IsSelect then for i, v in ipairs(XFubenSimulatedCombatManager.GetResCfg(item).ConsumeCounts) do local consume = CurrencyNoToId[i] price[consume] = price[consume] + v end end end return price end function XFubenSimulatedCombatManager.CalcBuyCount() if not ActivityInfo then return end -- 计算已购买商品的价格 local price = {} for _, consumeId in ipairs(ActivityInfo.ConsumeIds) do price[consumeId] = 0 end if XFubenSimulatedCombatManager.CheckCurrencyFree() then return price end local list = XTool.MergeArray(MemberList, AdditionList) for _, item in ipairs(list) do local unitPrice = XFubenSimulatedCombatManager.GetResCfg(item).ConsumeCounts if item.BuyMethod then local consume = CurrencyNoToId[item.BuyMethod] price[consume] = price[consume] + unitPrice[item.BuyMethod] end end return price end function XFubenSimulatedCombatManager.CheckCurrencyFree() if not ActivityInfo or not StageInterInfo then return end if XDataCenter.FubenManager.CheckStageIsPass(StageInterInfo.StageId) and StageInterInfo.Type == XFubenSimulatedCombatConfig.StageType.Normal then return true else return false end end function XFubenSimulatedCombatManager.GetCurStageMember(memberId) local memberCfgList = {} -- 后续考虑根据是否已选择、已购买排序 for _,v in ipairs(MemberList) do local data = XFubenSimulatedCombatConfig.GetMemberById(v.Id) if memberId ~= v.Id then tableInsert(memberCfgList, data) else tableInsert(memberCfgList, 1, data) end end return memberCfgList end function XFubenSimulatedCombatManager.GetCurStageMemberDataByCharId(charId) -- XLog.Warning("GetCurStageMemberDataByCharId", charId, CharIdToMemberId[charId], CharIdToMemberId) local memberId = CharIdToMemberId[charId] or 0 return XFubenSimulatedCombatConfig.GetMemberById(memberId) end function XFubenSimulatedCombatManager.SelectStageInter(Id) StageInterInfo = XFubenSimulatedCombatConfig.GetStageInterData(Id) if not StageInterInfo then return end LastShopMap = XFubenSimulatedCombatManager.GetShopMapCache() MemberList = {} ResMemberSelectCount = 0 for _,v in ipairs(StageInterInfo.MemberIds) do local type = XFubenSimulatedCombatConfig.ResType.Member local data = {Id = v, Type = type} local subMap = LastShopMap[type] if subMap then data.BuyMethod = subMap[v] end if data.BuyMethod then ResMemberSelectCount = ResMemberSelectCount + 1 end tableInsert(MemberList, data) end AdditionList = {} for _,v in ipairs(StageInterInfo.Additions) do local type = XFubenSimulatedCombatConfig.ResType.Addition local data = {Id = v, Type = type} local subMap = LastShopMap[type] if subMap then data.BuyMethod = subMap[v] end tableInsert(AdditionList, data) end XFubenSimulatedCombatManager.OnCurrencyChange() end function XFubenSimulatedCombatManager.GetCurrentResList(type) if type == XFubenSimulatedCombatConfig.ResType.Member then return MemberList elseif type == XFubenSimulatedCombatConfig.ResType.Addition then return AdditionList end return {} end function XFubenSimulatedCombatManager.SelectGridRes(data) if data.Type == XFubenSimulatedCombatConfig.ResType.Member then if not data.BuyMethod then if not data.IsSelect then if ResMemberSelectCount >= MAX_CHAR_COUNT then return false, CsXTextManagerGetText("SimulatedCombatOverMaxChar") end ResMemberSelectCount = ResMemberSelectCount + 1 else ResMemberSelectCount = ResMemberSelectCount - 1 end end end data.IsSelect = not data.IsSelect CsXGameEventManager.Instance:Notify(XEventId.EVENT_FUBEN_SIMUCOMBAT_UPDATE, false) return true end function XFubenSimulatedCombatManager.GetMemberCount() local count = 0 for _, item in ipairs(MemberList) do if item.BuyMethod then count = count + 1 end end return count, MAX_CHAR_COUNT end function XFubenSimulatedCombatManager.CancelBuyGridRes(data) data.BuyMethod = false if data.Type == XFubenSimulatedCombatConfig.ResType.Member then ResMemberSelectCount = ResMemberSelectCount - 1 end XFubenSimulatedCombatManager.OnCurrencyChange() end function XFubenSimulatedCombatManager.CheckBuyRes(type) local selectCount, buyCount = 0, 0 local list = XFubenSimulatedCombatManager.GetCurrentResList(type) for _, item in ipairs(list) do if item.IsSelect then selectCount = selectCount + 1 elseif item.BuyMethod then buyCount = buyCount + 1 end end if type == XFubenSimulatedCombatConfig.ResType.Member and buyCount >= MAX_CHAR_COUNT then return false, CsXTextManagerGetText("SimulatedCombatOverMaxCharUnableBuy") elseif selectCount > 0 then return true else return false, CsXTextManagerGetText("SimulatedCombatBuyNothing") end end function XFubenSimulatedCombatManager.BuySelectedGridRes(type, payMethod) local result, desc = XFubenSimulatedCombatManager.CheckBuyRes(type) if not result then return result, desc end local bill = XFubenSimulatedCombatManager.CalcPriceCount(type) local consume = CurrencyNoToId[payMethod] if LocalCurrency[consume] < bill[consume] then return false, CsXTextManagerGetText("SimulatedCombatBuyFail") end local list = XFubenSimulatedCombatManager.GetCurrentResList(type) for _, item in ipairs(list) do if item.IsSelect then item.BuyMethod = payMethod item.IsSelect = false end end XFubenSimulatedCombatManager.OnCurrencyChange() CsXGameEventManager.Instance:Notify(XEventId.EVENT_FUBEN_SIMUCOMBAT_UPDATE, true) return true end function XFubenSimulatedCombatManager.CheckEnterRoom() if not StageInterInfo then return end local memberCount = 0 for _,v in ipairs(MemberList) do if v.BuyMethod then memberCount = memberCount + 1 end end if StageInterInfo.Type == XFubenSimulatedCombatConfig.StageType.Normal then return memberCount == MAX_CHAR_COUNT elseif StageInterInfo.Type == XFubenSimulatedCombatConfig.StageType.Challenge then return memberCount > 0 and memberCount <= MAX_CHAR_COUNT end end --获取奖励 function XFubenSimulatedCombatManager.GetStarRewardList() local ownStars = XFubenSimulatedCombatManager.GetStarProgress() local canGet = false local startIndex = 1 local leastGap = XMath.IntMax() local starReward = {} for i in ipairs(XFubenSimulatedCombatConfig.GetStarReward()) do local cfg = XFubenSimulatedCombatConfig.GetStarRewardById(i) if cfg then local data = {} data.Id = cfg.Id data.RequireStar = cfg.RequireStar data.RewardId = cfg.RewardId data.IsFinish = ownStars >= cfg.RequireStar data.IsReward = XFubenSimulatedCombatManager.CheckStarRewardGet(cfg.Id) starReward[i] = data if canGet then goto CONTINUE end if data.IsFinish and not data.IsReward then startIndex = i canGet = true elseif not data.IsFinish then local gap = cfg.RequireStar - ownStars if leastGap > gap then leastGap = gap startIndex = i end end end ::CONTINUE:: end return starReward, canGet, startIndex end function XFubenSimulatedCombatManager.GetStardRewardNeedStarNum(rewardIndex) if not rewardCfg[rewardIndex] then return nil end return rewardCfg[rewardIndex].RequireStar end --判断是否已经领奖 function XFubenSimulatedCombatManager.CheckStarRewardGet(rewardId) if not rewardId then return end return StarRewardDic and StarRewardDic[rewardId] end --返回每日领奖次数及上限 function XFubenSimulatedCombatManager.GetDailyRewardRemainCount() if not ActivityInfo then return 0 end return ActivityInfo.MaxDailyStageStarRewardCount - DailyStageStarRewardCount end --读取获得奖励的状态 function XFubenSimulatedCombatManager.CheckPointRewardGet(rewardId) if not rewardId then return end return PointRewardDic and PointRewardDic[rewardId] end -- 检测是否开启模式 function XFubenSimulatedCombatManager.CheckModeOpen(type) if XFubenSimulatedCombatManager.GetIsActivityEnd() then XUiManager.TipText("RougeLikeNotInActivityTime") return false, CS.XTextManager.GetText("RougeLikeNotInActivityTime") end if type == XFubenSimulatedCombatConfig.StageType.Challenge then local isOpen, desc = XConditionManager.CheckCondition(ActivityInfo.HardConditionId) return isOpen, desc end return true end function XFubenSimulatedCombatManager.GetPointReward(id, funCb) XNetwork.Call(FUBEN_SIMUCOMBAT_PROTO.SimulatedCombatPointRewardRequest, { Id = id }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end PointRewardDic[id] = true if funCb then funCb(res.Goods) end CsXGameEventManager.Instance:Notify(XEventId.EVENT_FUBEN_SIMUCOMBAT_REWARD) end) end function XFubenSimulatedCombatManager.GetStarReward(treasureId, cb) XNetwork.Call(FUBEN_SIMUCOMBAT_PROTO.SimulatedCombatGetStarRewardRequest, {Id = treasureId},function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end -- 设置已领取 StarRewardDic[treasureId] = true if cb then cb(res.Goods) end CsXGameEventManager.Instance:Notify(XEventId.EVENT_FUBEN_SIMUCOMBAT_UPDATE) XEventManager.DispatchEvent(XEventId.EVENT_FUBEN_SIMUCOMBAT_UPDATE) end) end -- [初始化数据] function XFubenSimulatedCombatManager.InitStageInfo() for _, stageType in pairs(XFubenSimulatedCombatConfig.StageType or {}) do local stages = XFubenSimulatedCombatConfig.GetStageInterDataByType(stageType) for _, v in ipairs(stages) do local stageInfo = XDataCenter.FubenManager.GetStageInfo(v.StageId) if stageInfo then stageInfo.Type = XDataCenter.FubenManager.StageType.SimulatedCombat end end end -- 通关后需要会执行InitStage 所以需要刷新 XFubenSimulatedCombatManager.RefreshStagePassed() end function XFubenSimulatedCombatManager.RefreshStagePassed() local mapStages = XFubenSimulatedCombatConfig.GetStageInterDataByType(XFubenSimulatedCombatConfig.StageType.Normal) local stages = XFubenSimulatedCombatConfig.GetStageInterDataByType(XFubenSimulatedCombatConfig.StageType.Challenge) for i, v in ipairs(stages) do local stageInfo = XDataCenter.FubenManager.GetStageInfo(v.StageId) local mapStageInfo = XDataCenter.FubenManager.GetStageInfo(mapStages[i].StageId) local stageCfg = XDataCenter.FubenManager.GetStageCfg(v.StageId) if stageInfo then stageInfo.Unlock = mapStageInfo.Passed stageInfo.IsOpen = mapStageInfo.Passed for _, preStageId in pairs(stageCfg.PreStageId or {}) do if preStageId > 0 then if not XDataCenter.FubenManager.CheckStageIsPass(preStageId) then stageInfo.Unlock = false break end end end end end end function XFubenSimulatedCombatManager.GetCharacterAndRobotId(memberId) local data = XFubenSimulatedCombatConfig.GetMemberById(memberId) return XRobotManager.GetCharacterId(data.RobotId), data.RobotId end function XFubenSimulatedCombatManager.SendPreFightRequest(cb) if not StageInterInfo then return end local members = {} local additions = {} CurrentTeam = XTool.Clone(XFubenSimulatedCombatConfig.TeamTemplate) CurrentTeam.TeamId = XDataCenter.TeamManager.GetTeamId(CS.XGame.Config:GetInt("TypeIdSimulatedCombat")) for _, item in ipairs(MemberList) do if item.BuyMethod then tableInsert(members, {Id = item.Id, ConsumeType = item.BuyMethod}) local charId = XFubenSimulatedCombatManager.GetCharacterAndRobotId(item.Id) --XLog.Warning("name", XCharacterConfigs.GetCharacterFullNameStr(charId)) tableInsert(CurrentTeam.TeamData, charId) CharIdToMemberId[charId] = item.Id end end for _, item in ipairs(AdditionList) do if item.BuyMethod then tableInsert(additions, {Id = item.Id, ConsumeType = item.BuyMethod}) end end for i = #CurrentTeam.TeamData + 1, MAX_CHAR_COUNT do CurrentTeam.TeamData[i] = 0 end local challengeIds = {} for i, v in ipairs(ChallengeMap) do if v then tableInsert(challengeIds, StageInterInfo.ChallengeIds[i]) end end XNetwork.Call(FUBEN_SIMUCOMBAT_PROTO.SimulatedCombatPreFightRequest, { StageId = StageInterInfo.StageId, Members = members, Additions = additions, ChallengeIds = challengeIds}, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end function XFubenSimulatedCombatManager.GetTeam() if not StageInterInfo then return end local curMapStr = XSaveTool.Stringify(XFubenSimulatedCombatManager.GetShopMap()) local preMapStr = XSaveTool.Stringify(LastShopMap) if curMapStr == preMapStr then local team = XDataCenter.TeamManager.LoadTeamLocal(StageInterInfo.StageId) if team then --CurrentTeam = team --XLog.Warning("curMapStr == preMapStr", XFubenSimulatedCombatManager.GetShopMap(), LastShopMap) return team end end --XLog.Warning("curMapStr != preMapStr", XFubenSimulatedCombatManager.GetShopMap(), LastShopMap) return XTool.Clone(CurrentTeam) end function XFubenSimulatedCombatManager.GetRoomMemberList() local memberList = {} for _, v in ipairs(CurrentTeam.TeamData) do if v and v ~= 0 then tableInsert(memberList, v) end end return memberList end function XFubenSimulatedCombatManager.FinishFight(settleData) XLuaUiManager.Remove("UiSimulatedCombatResAllo") if settleData.IsWin then local beginData = XDataCenter.FubenManager.GetFightBeginData() local winData = { SettleData = settleData, StageId = settleData.StageId, RewardGoodsList = settleData.RewardGoodsList, UrgentId = settleData.UrgentEnventId, NpcInfo = settleData.NpcHpInfo, CharExp = beginData.CharExp, RoleExp = beginData.RoleExp, RoleLevel = beginData.RoleLevel, RoleCoins = beginData.RoleCoins, PlayerList = beginData.PlayerList, } if StageInterInfo.Type == XFubenSimulatedCombatConfig.StageType.Challenge then local count = 0 for _, v in ipairs(ChallengeMap) do if v then count = count + 1 end end local rewardId = StageInterInfo.StarRewardIds[count] if rewardId and rewardId ~= 0 then winData.RewardGoodsList = XRewardManager.GetRewardList(rewardId) or XRewardManager.GetRewardListNotCount(rewardId) end winData.StarsMap = ChallengeMap end XFubenSimulatedCombatManager.ShowReward(winData) else XUiManager.TipText("SimulatedCombatFailTips", XUiManager.UiTipType.Tip, true) XDataCenter.FubenManager.ChallengeLose(settleData) end end -- [胜利] function XFubenSimulatedCombatManager.ShowReward(winData) if not winData or not StageInterInfo then return end XFubenSimulatedCombatManager.RefreshStagePassed() XLuaUiManager.Open("UiSimulatedCombatSettleWin", winData, StageInterInfo) end function XFubenSimulatedCombatManager.GetStageReward(cb) XNetwork.Call(FUBEN_SIMUCOMBAT_PROTO.SimulatedCombatGetStageRewardRequest, {},function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end DailyStageStarRewardCount = DailyStageStarRewardCount + 1 if cb then cb() end CsXGameEventManager.Instance:Notify(XEventId.EVENT_FUBEN_SIMUCOMBAT_UPDATE, false) end) end function XFubenSimulatedCombatManager.GetStageStar(stageId) return StageStarRecordDic[stageId] end function XFubenSimulatedCombatManager.CheckStageIsSimulatedCombat(stageId) local info = XDataCenter.FubenManager.GetStageInfo(stageId) return info and info.Type == XDataCenter.FubenManager.StageType.SimulatedCombat end -- 获取所有关卡进度 function XFubenSimulatedCombatManager.GetStageSchedule(stageType) local templates = {} if stageType == XFubenSimulatedCombatConfig.StageType.Challenge then templates = XFubenSimulatedCombatConfig.GetStageInterDataByType(stageType) else templates = XFubenSimulatedCombatConfig.GetStageInterDataByType(XFubenSimulatedCombatConfig.StageType.Normal) end local passCount = 0 local allCount = #templates for _, v in ipairs(templates) do if XDataCenter.FubenManager.CheckStageIsPass(v.StageId) then passCount = passCount + 1 end end return passCount, allCount end -- 主题活动页面是否可挑战接口 function XFubenSimulatedCombatManager.IsChallengeable() if not ActivityInfo then return false end local passCount, allCount = XFubenSimulatedCombatManager.GetStageSchedule(XFubenSimulatedCombatConfig.StageType.Normal) if passCount < allCount then return true end passCount, allCount = XFubenSimulatedCombatManager.GetStageSchedule(XFubenSimulatedCombatConfig.StageType.Challenge) if passCount < allCount then return true end return false end -- 获取篇章星数 function XFubenSimulatedCombatManager.GetStarProgress() local templates = XFubenSimulatedCombatConfig.GetStageInterDataByType(XFubenSimulatedCombatConfig.StageType.Challenge) local totalStars = #templates * MAX_STAGE_STAR_COUNT local ownStars = 0 for _,v in ipairs(templates) do local starCount = StageStarRecordDic[v.StageId] or 0 ownStars = ownStars + starCount end return ownStars, totalStars end function XFubenSimulatedCombatManager.GetAvailableActs() local act = XFubenSimulatedCombatManager.GetCurrentActTemplate() local activityList = {} if act and not XFubenSimulatedCombatManager.GetIsActivityEnd() and not XFunctionManager.CheckFunctionFitter(XFunctionManager.FunctionName.FubenSimulatedCombat) then tableInsert(activityList, { Id = act.Id, Type = XDataCenter.FubenManager.ChapterType.SimulatedCombat, Name = act.Name, Icon = act.BannerBg, }) end return activityList end --判断活动是否开启 function XFubenSimulatedCombatManager.GetIsActivityEnd() if not ActivityInfo then return true end local timeNow = XTime.GetServerNowTimestamp() local isEnd = timeNow >= XFubenSimulatedCombatManager.GetEndTime() local isStart = timeNow >= XFubenSimulatedCombatManager.GetStartTime() local inActivity = (not isEnd) and (isStart) return not inActivity, timeNow < XFubenSimulatedCombatManager.GetStartTime() end --获取本轮开始时间 function XFubenSimulatedCombatManager.GetStartTime() if DefaultActivityInfo then return XFunctionManager.GetStartTimeByTimeId(DefaultActivityInfo.TimeId) or 0 end return 0 end --获取本轮结束时间 function XFubenSimulatedCombatManager.GetEndTime() if DefaultActivityInfo then return XFunctionManager.GetEndTimeByTimeId(DefaultActivityInfo.TimeId) or 0 end return 0 end function XFubenSimulatedCombatManager.GetPlainStarMap(stageId) local starsCount = StageStarRecordDic[stageId] or 0 local starMap = {starsCount >= 1, starsCount >= 2, starsCount >= 3} return starMap, starsCount end local function GetShopMapKey() return string.format("%s%s_%d_%s", ShopMapKey, tostring(XPlayer.Id), ActivityInfo.Id, StageInterInfo.StageId) end function XFubenSimulatedCombatManager.GetShopMapCache() if not StageInterInfo then return {} end return XSaveTool.GetData(GetShopMapKey()) or {} end function XFubenSimulatedCombatManager.GetShopMap() if not StageInterInfo then return end local shopMap = {} local list = XTool.MergeArray(MemberList, AdditionList) for _, item in ipairs(list) do if not shopMap[item.Type] then shopMap[item.Type] = {} end shopMap[item.Type][item.Id] = item.BuyMethod end return shopMap end function XFubenSimulatedCombatManager.SaveShopMap() if not StageInterInfo then return end --XLog.Warning("SaveShopMap", XFubenSimulatedCombatManager.GetShopMap()) XSaveTool.SaveData(GetShopMapKey(), XFubenSimulatedCombatManager.GetShopMap()) end function XFubenSimulatedCombatManager.UpdateShopMapCache() if not StageInterInfo then return end LastShopMap = XFubenSimulatedCombatManager.GetShopMapCache() end local function GetClgMapKey(stageId) return string.format("%s%s_%d_%s", ChallengeMapKey, tostring(XPlayer.Id), ActivityInfo.Id, stageId) end function XFubenSimulatedCombatManager.GetClgMap(stageId) local clgMap = XSaveTool.GetData(GetClgMapKey(stageId)) or {false, false, false} local count = 0 for _, v in ipairs(clgMap) do if v then count = count + 1 end end return clgMap, count end function XFubenSimulatedCombatManager.SaveClgMap(stageId, clgMap) ChallengeMap = clgMap or {false, false, false} XSaveTool.SaveData(GetClgMapKey(stageId), clgMap) end -- 注册出战界面代理 function XFubenSimulatedCombatManager.RegisterEditBattleProxy() if IsRegisterEditBattleProxy then return end IsRegisterEditBattleProxy = true XUiNewRoomSingleProxy.RegisterProxy(XDataCenter.FubenManager.StageType.SimulatedCombat, require("XUi/XUiFubenSimulatedCombat/XUiSimulatedCombatNewRoomSingle")) end --活动登录下发 function XFubenSimulatedCombatManager.NotifyData(data) if data.ActivityId == 0 then if CS.XFight.Instance ~= nil then XLuaUiManager.Remove("UiSimulatedCombatMain") XLuaUiManager.Remove("UiSimulatedCombatResAllo") else CsXGameEventManager.Instance:Notify(XEventId.EVENT_ACTIVITY_ON_RESET, XDataCenter.FubenManager.StageType.SimulatedCombat) end ActivityInfo = nil return end if not ActivityInfo or ActivityInfo.Id ~= data.ActivityId then ActivityInfo = XFubenSimulatedCombatConfig.GetActivityTemplateById(data.ActivityId) XFubenSimulatedCombatManager.Init() end DailyStageStarRewardCount = data.DailyStageStarRewardCount for _, starRewardId in ipairs(data.StarRewards) do StarRewardDic[starRewardId] = true end for _, pointRewardId in ipairs(data.PointRewards) do PointRewardDic[pointRewardId] = true end for _, stageData in ipairs(data.StageDataList) do StageStarRecordDic[stageData.StageId] = stageData.FinishStar end end -- 下发奖励领取次数 function XFubenSimulatedCombatManager.NotifyDailyReset(data) DailyStageStarRewardCount = data.DailyStageStarRewardCount CsXGameEventManager.Instance:Notify(XEventId.EVENT_FUBEN_SIMUCOMBAT_UPDATE, false) end -- 下发关卡数据(通关星数) function XFubenSimulatedCombatManager.NotifyStageData(stageData) StageStarRecordDic[stageData.StageId] = stageData.FinishStar end XEventManager.AddEventListener(XEventId.EVENT_LOGIN_DATA_LOAD_COMPLETE, function() XFubenSimulatedCombatManager.Init() end) return XFubenSimulatedCombatManager end XRpc.NotifySimulatedCombatData = function(data) XDataCenter.FubenSimulatedCombatManager.NotifyData(data.Data) end XRpc.NotifySimulatedCombatDailyReset = function(data) XDataCenter.FubenSimulatedCombatManager.NotifyDailyReset(data) end XRpc.NotifySimulatedCombatStageData = function(data) XDataCenter.FubenSimulatedCombatManager.NotifyStageData(data.SimulatedCombatStageData) end