881 lines
33 KiB
Lua
881 lines
33 KiB
Lua
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
|