408 lines
15 KiB
Lua
408 lines
15 KiB
Lua
|
local tableInsert = table.insert
|
||
|
local ipairs = ipairs
|
||
|
local pairs = pairs
|
||
|
local KEY_STAGE = "NewStage"
|
||
|
|
||
|
XFubenCoupleCombatManagerCreator = function()
|
||
|
local XFubenCoupleCombatManager = {}
|
||
|
local ActivityInfo = nil
|
||
|
local ActivityDay = 0
|
||
|
local DefaultActivityInfo = nil
|
||
|
|
||
|
local StageRecordDic = {}
|
||
|
local RobotRecordDic = {}
|
||
|
local StageChapterDic = {}
|
||
|
local NewStageReadDic = {}
|
||
|
local IsRegisterEditBattleProxy = false
|
||
|
|
||
|
-------- local function begin ----------
|
||
|
local function Init()
|
||
|
if ActivityInfo then
|
||
|
DefaultActivityInfo = ActivityInfo
|
||
|
else
|
||
|
local activityTemplates = XFubenCoupleCombatConfig.GetActTemplates()
|
||
|
for _, template in pairs(activityTemplates) do
|
||
|
DefaultActivityInfo = XFubenCoupleCombatConfig.GetActivityTemplateById(template.Id)
|
||
|
if XFunctionManager.CheckInTimeByTimeId(DefaultActivityInfo.TimeId) then
|
||
|
ActivityInfo = DefaultActivityInfo
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
XFubenCoupleCombatManager.RegisterEditBattleProxy()
|
||
|
end
|
||
|
|
||
|
local function GetKey(key)
|
||
|
return string.format("%s_FubenCoupleCombat_%d_%s", tostring(XPlayer.Id), ActivityInfo.Id, key)
|
||
|
end
|
||
|
|
||
|
-------- local function end ----------
|
||
|
local FUBEN_COUPLE_COMBAT_PROTO = {
|
||
|
ResetStageMemberRequest = "CoupleCombatResetStageMemberRequest",
|
||
|
}
|
||
|
|
||
|
function XFubenCoupleCombatManager.GetCurrentActTemplate()
|
||
|
return ActivityInfo
|
||
|
end
|
||
|
|
||
|
function XFubenCoupleCombatManager.GetChapterTemplate(type)
|
||
|
if not ActivityInfo then return {} end
|
||
|
local id = ActivityInfo.ChapterIds[type]
|
||
|
return XFubenCoupleCombatConfig.GetChapterTemplate(id) or {}
|
||
|
end
|
||
|
|
||
|
function XFubenCoupleCombatManager.OnActivityEnd()
|
||
|
XLuaUiManager.RunMain()
|
||
|
if XFubenCoupleCombatManager.GetIsActivityEnd() then
|
||
|
XUiManager.TipText("ActivityMainLineEnd", XUiManager.UiTipType.Wrong)
|
||
|
else
|
||
|
XUiManager.TipText("ArenaOnlineTimeOut", XUiManager.UiTipType.Wrong, true)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- 检测是否开启模式
|
||
|
function XFubenCoupleCombatManager.CheckModeOpen(type)
|
||
|
if not type then return end
|
||
|
if XFubenCoupleCombatManager.GetIsActivityEnd() then
|
||
|
XUiManager.TipText("RougeLikeNotInActivityTime")
|
||
|
return false, CS.XTextManager.GetText("RougeLikeNotInActivityTime")
|
||
|
end
|
||
|
|
||
|
local chapter = XFubenCoupleCombatManager.GetChapterTemplate(type)
|
||
|
if not chapter then return true end
|
||
|
if not XFubenCoupleCombatManager.CheckStageOpen(chapter.StageIds[1]) then
|
||
|
return XFubenCoupleCombatManager.CheckStageOpen(chapter.StageIds[1], true)
|
||
|
end
|
||
|
|
||
|
if type == XFubenCoupleCombatConfig.StageType.Hard then
|
||
|
chapter = XFubenCoupleCombatManager.GetChapterTemplate(XFubenCoupleCombatConfig.StageType.Normal)
|
||
|
local stageId = chapter.StageIds[#chapter.StageIds]
|
||
|
if not StageRecordDic[stageId] then
|
||
|
return false, CS.XTextManager.GetText("CoupleCombatHardModeNotOpen")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
-- 检测关卡是否处于开放状态
|
||
|
function XFubenCoupleCombatManager.CheckStageOpen(stageId, isGetTime)
|
||
|
local stageInterInfo = XFubenCoupleCombatConfig.GetStageInfo(stageId)
|
||
|
if not stageInterInfo then return end
|
||
|
if ActivityDay >= stageInterInfo.OpenDay then
|
||
|
return true
|
||
|
elseif isGetTime then
|
||
|
local nowTime = XTime.GetServerNowTimestamp()
|
||
|
local refreshTime = XTime.GetSeverNextRefreshTime()
|
||
|
local remainTime = XUiHelper.GetTime((stageInterInfo.OpenDay - ActivityDay - 1) * 60 * 60 * 24 + refreshTime - nowTime, XUiHelper.TimeFormatType.MOE_WAR)
|
||
|
return false, CS.XTextManager.GetText("ScheOpenCountdown", remainTime)
|
||
|
else
|
||
|
return false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- 红点逻辑:有新关卡时重置
|
||
|
function XFubenCoupleCombatManager.CheckNewStage(type)
|
||
|
if not XFubenCoupleCombatManager.CheckModeOpen(type) then return false end
|
||
|
|
||
|
local chapter = XFubenCoupleCombatManager.GetChapterTemplate(type)
|
||
|
for _, v in ipairs(chapter.StageIds) do
|
||
|
if XFubenCoupleCombatManager.CheckStageOpen(v) and not NewStageReadDic[v] then
|
||
|
return true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
function XFubenCoupleCombatManager.SetReadNewStageMark(type)
|
||
|
if not XFubenCoupleCombatManager.CheckModeOpen(type) then return end
|
||
|
local needSave = false
|
||
|
local chapter = XFubenCoupleCombatManager.GetChapterTemplate(type)
|
||
|
for _, v in ipairs(chapter.StageIds) do
|
||
|
if XFubenCoupleCombatManager.CheckStageOpen(v) and not NewStageReadDic[v] then
|
||
|
NewStageReadDic[v] = true
|
||
|
needSave = true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if needSave then
|
||
|
XSaveTool.SaveData(GetKey(KEY_STAGE), NewStageReadDic)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- 获取所有关卡进度
|
||
|
function XFubenCoupleCombatManager.GetStageSchedule(stageType)
|
||
|
local passCount = 0
|
||
|
local allCount = 0
|
||
|
for _, type in pairs(XFubenCoupleCombatConfig.StageType) do
|
||
|
if stageType and type ~= stageType then
|
||
|
goto CONTINUE
|
||
|
end
|
||
|
local chapter = XFubenCoupleCombatManager.GetChapterTemplate(type)
|
||
|
if XFubenCoupleCombatManager.CheckStageOpen(chapter.StageIds[1]) then
|
||
|
allCount = allCount + #chapter.StageIds
|
||
|
for _, stageId in ipairs(chapter.StageIds) do
|
||
|
if StageRecordDic[stageId] and next(StageRecordDic[stageId]) then
|
||
|
passCount = passCount + 1
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
::CONTINUE::
|
||
|
end
|
||
|
|
||
|
return passCount, allCount
|
||
|
end
|
||
|
|
||
|
function XFubenCoupleCombatManager.GetFeatureMatch(stageId, teamData)
|
||
|
local matchDic = {}
|
||
|
local featureList = {}
|
||
|
local stageInterInfo = XFubenCoupleCombatConfig.GetStageInfo(stageId)
|
||
|
if not stageInterInfo then return matchDic end
|
||
|
featureList[0] = stageInterInfo.Feature
|
||
|
for _, v in ipairs(stageInterInfo.Feature) do
|
||
|
matchDic[v] = 0
|
||
|
end
|
||
|
for i, id in ipairs(teamData) do
|
||
|
local memberInfo = XFubenCoupleCombatConfig.GetRobotInfo(id)
|
||
|
if memberInfo then
|
||
|
featureList[i] = memberInfo.Feature
|
||
|
for _, v in ipairs(memberInfo.Feature) do
|
||
|
if matchDic[v] then
|
||
|
matchDic[v] = matchDic[v] + 1
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
return matchDic, featureList
|
||
|
end
|
||
|
|
||
|
-- 检测机器人是否已使用状态
|
||
|
function XFubenCoupleCombatManager.CheckRobotUsed(stageId, robotId)
|
||
|
if not StageChapterDic[stageId] then return end
|
||
|
local chapterId = StageChapterDic[stageId].Id
|
||
|
if not RobotRecordDic[chapterId] then
|
||
|
return
|
||
|
end
|
||
|
return RobotRecordDic[chapterId][robotId]
|
||
|
end
|
||
|
|
||
|
function XFubenCoupleCombatManager.GetStageUsedRobot(stageId)
|
||
|
return StageRecordDic[stageId] or {}
|
||
|
end
|
||
|
|
||
|
function XFubenCoupleCombatManager.GetRobotByStage(stageId)
|
||
|
return StageChapterDic[stageId] and StageChapterDic[stageId].RobotIds
|
||
|
end
|
||
|
|
||
|
-- [初始化数据]
|
||
|
function XFubenCoupleCombatManager.InitStageInfo()
|
||
|
for _, chapter in pairs(XFubenCoupleCombatConfig.GetChapterTemplates()) do
|
||
|
for _, stageId in ipairs(chapter.StageIds) do
|
||
|
StageChapterDic[stageId] = chapter
|
||
|
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
|
||
|
if stageInfo then
|
||
|
stageInfo.Type = XDataCenter.FubenManager.StageType.CoupleCombat
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- 通关后会执行InitStage 所以需要刷新
|
||
|
XFubenCoupleCombatManager.RefreshStagePassed()
|
||
|
end
|
||
|
|
||
|
function XFubenCoupleCombatManager.RefreshStagePassed()
|
||
|
for _, chapter in pairs(XFubenCoupleCombatConfig.GetChapterTemplates()) do
|
||
|
for _, stageId in ipairs(chapter.StageIds) do
|
||
|
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
|
||
|
local stageCfg = XDataCenter.FubenManager.GetStageCfg(stageId)
|
||
|
if stageInfo then
|
||
|
stageInfo.Passed = StageRecordDic[stageId] or false
|
||
|
--stageInfo.StarsMap = XFubenCoupleCombatManager.GetStarMap(stageId)
|
||
|
stageInfo.Unlock = XFubenCoupleCombatManager.CheckStageOpen(stageId)
|
||
|
stageInfo.IsOpen = true
|
||
|
|
||
|
if stageCfg.RequireLevel > 0 and XPlayer.Level < stageCfg.RequireLevel then
|
||
|
stageInfo.Unlock = false
|
||
|
end
|
||
|
|
||
|
for _, preStageId in pairs(stageCfg.PreStageId or {}) do
|
||
|
if preStageId > 0 then
|
||
|
if not StageRecordDic[preStageId] then
|
||
|
stageInfo.Unlock = false
|
||
|
stageInfo.IsOpen = false
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function XFubenCoupleCombatManager.PreFight(stage, teamId)
|
||
|
local preFight = {}
|
||
|
--preFight.CardIds = {}
|
||
|
preFight.RobotIds = {}
|
||
|
preFight.StageId = stage.StageId
|
||
|
local teamData = XDataCenter.TeamManager.GetTeamData(teamId)
|
||
|
for i, v in pairs(teamData) do
|
||
|
local isRobot = XRobotManager.CheckIsRobotId(v)
|
||
|
preFight.RobotIds[i] = isRobot and v or 0
|
||
|
end
|
||
|
|
||
|
preFight.CaptainPos = XDataCenter.TeamManager.GetTeamCaptainPos(teamId)
|
||
|
preFight.FirstFightPos = XDataCenter.TeamManager.GetTeamFirstFightPos(teamId)
|
||
|
|
||
|
return preFight
|
||
|
end
|
||
|
|
||
|
function XFubenCoupleCombatManager.GetAvailableActs()
|
||
|
local act = ActivityInfo or DefaultActivityInfo
|
||
|
local activityList = {}
|
||
|
if act and
|
||
|
not XFubenCoupleCombatManager.GetIsActivityEnd() and
|
||
|
not XFunctionManager.CheckFunctionFitter(XFunctionManager.FunctionName.FubenCoupleCombat) then
|
||
|
tableInsert(activityList, {
|
||
|
Id = act.Id,
|
||
|
Type = XDataCenter.FubenManager.ChapterType.CoupleCombat,
|
||
|
Name = act.Name,
|
||
|
Icon = act.BannerBg,
|
||
|
})
|
||
|
end
|
||
|
return activityList
|
||
|
end
|
||
|
|
||
|
--判断活动是否开启
|
||
|
function XFubenCoupleCombatManager.GetIsActivityEnd()
|
||
|
local timeNow = XTime.GetServerNowTimestamp()
|
||
|
local isEnd = timeNow >= XFubenCoupleCombatManager.GetEndTime()
|
||
|
local isStart = timeNow >= XFubenCoupleCombatManager.GetStartTime()
|
||
|
local inActivity = (not isEnd) and (isStart)
|
||
|
return not inActivity, timeNow < XFubenCoupleCombatManager.GetStartTime()
|
||
|
end
|
||
|
|
||
|
--获取活动开始时间
|
||
|
function XFubenCoupleCombatManager.GetStartTime()
|
||
|
if DefaultActivityInfo then
|
||
|
return XFunctionManager.GetStartTimeByTimeId(DefaultActivityInfo.TimeId) or 0
|
||
|
end
|
||
|
return 0
|
||
|
end
|
||
|
|
||
|
--获取活动结束时间
|
||
|
function XFubenCoupleCombatManager.GetEndTime()
|
||
|
if DefaultActivityInfo then
|
||
|
return XFunctionManager.GetEndTimeByTimeId(DefaultActivityInfo.TimeId) or 0
|
||
|
end
|
||
|
return 0
|
||
|
end
|
||
|
|
||
|
-- 主题活动页面是否可挑战接口
|
||
|
function XFubenCoupleCombatManager.IsChallengeable()
|
||
|
if not ActivityInfo then return false end
|
||
|
for _, type in pairs(XFubenCoupleCombatConfig.StageType) do
|
||
|
if XFubenCoupleCombatManager.CheckNewStage(type) then
|
||
|
return true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
-- 注册出战界面代理
|
||
|
function XFubenCoupleCombatManager.RegisterEditBattleProxy()
|
||
|
if IsRegisterEditBattleProxy then return end
|
||
|
IsRegisterEditBattleProxy = true
|
||
|
XUiNewRoomSingleProxy.RegisterProxy(XDataCenter.FubenManager.StageType.CoupleCombat,
|
||
|
require("XUi/XUiFubenCoupleCombat/Proxy/XUiCoupleCombatNewRoomSingle"))
|
||
|
XUiRoomCharacterProxy.RegisterProxy(XDataCenter.FubenManager.StageType.CoupleCombat,
|
||
|
require("XUi/XUiFubenCoupleCombat/Proxy/XUiCoupleCombatRoomCharacter"))
|
||
|
end
|
||
|
|
||
|
function XFubenCoupleCombatManager.ResetStage(stageId, cb)
|
||
|
if not StageRecordDic[stageId] then return end
|
||
|
XNetwork.Call(FUBEN_COUPLE_COMBAT_PROTO.ResetStageMemberRequest, { StageId = stageId }, function(res)
|
||
|
if res.Code ~= XCode.Success then
|
||
|
XUiManager.TipCode(res.Code)
|
||
|
return
|
||
|
end
|
||
|
|
||
|
for _, robotId in pairs(StageRecordDic[stageId]) do
|
||
|
local chapterId = StageChapterDic[stageId].Id
|
||
|
RobotRecordDic[chapterId][robotId] = nil
|
||
|
end
|
||
|
|
||
|
StageRecordDic[stageId] = {}
|
||
|
if cb then cb() end
|
||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_FUBEN_COUPLECOMBAT_UPDATE)
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
--登录/活动开始/跨周时下发
|
||
|
function XFubenCoupleCombatManager.NotifyData(data)
|
||
|
ActivityInfo = XFubenCoupleCombatConfig.GetActivityTemplateById(data.Data.ActivityId)
|
||
|
if not ActivityInfo then
|
||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_ACTIVITY_ON_RESET, XDataCenter.FubenManager.StageType.CoupleCombat)
|
||
|
return
|
||
|
end
|
||
|
ActivityDay = data.ActivityDay
|
||
|
Init()
|
||
|
StageRecordDic = {}
|
||
|
RobotRecordDic = {}
|
||
|
for _, v in ipairs(data.Data.Stages) do
|
||
|
StageRecordDic[v.StageId] = v.RobotIds
|
||
|
local chapterId = StageChapterDic[v.StageId].Id
|
||
|
if not RobotRecordDic[chapterId] then
|
||
|
RobotRecordDic[chapterId] = {}
|
||
|
end
|
||
|
for _, robotId in pairs(v.RobotIds) do
|
||
|
RobotRecordDic[chapterId][robotId] = true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
XFubenCoupleCombatManager.RefreshStagePassed()
|
||
|
|
||
|
NewStageReadDic = XSaveTool.GetData(GetKey(KEY_STAGE)) or {}
|
||
|
end
|
||
|
|
||
|
-- 下发关卡数据(通关星数)
|
||
|
function XFubenCoupleCombatManager.NotifyStageData(stageInfo)
|
||
|
StageRecordDic[stageInfo.StageId] = stageInfo.RobotIds
|
||
|
|
||
|
local chapterId = StageChapterDic[stageInfo.StageId].Id
|
||
|
if not RobotRecordDic[chapterId] then
|
||
|
RobotRecordDic[chapterId] = {}
|
||
|
end
|
||
|
for _, robotId in pairs(stageInfo.RobotIds) do
|
||
|
RobotRecordDic[chapterId][robotId] = true
|
||
|
end
|
||
|
|
||
|
XFubenCoupleCombatManager.RefreshStagePassed()
|
||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_FUBEN_COUPLECOMBAT_UPDATE)
|
||
|
end
|
||
|
|
||
|
-- 下发活动天数
|
||
|
function XFubenCoupleCombatManager.NotifyDailyData(data)
|
||
|
ActivityDay = data.ActivityDay
|
||
|
XFubenCoupleCombatManager.RefreshStagePassed()
|
||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_FUBEN_COUPLECOMBAT_UPDATE)
|
||
|
end
|
||
|
|
||
|
XEventManager.AddEventListener(XEventId.EVENT_LOGIN_DATA_LOAD_COMPLETE, function()
|
||
|
Init()
|
||
|
end)
|
||
|
return XFubenCoupleCombatManager
|
||
|
end
|
||
|
|
||
|
XRpc.NotifyCoupleCombatData = function(data)
|
||
|
XDataCenter.FubenCoupleCombatManager.NotifyData(data)
|
||
|
end
|
||
|
|
||
|
XRpc.NotifyCoupleCombatStageData = function(data)
|
||
|
XDataCenter.FubenCoupleCombatManager.NotifyStageData(data.StageData)
|
||
|
end
|
||
|
|
||
|
XRpc.NotifyCoupleCombatDailyData = function(data)
|
||
|
XDataCenter.FubenCoupleCombatManager.NotifyDailyData(data)
|
||
|
end
|