PGRData/Script/matrix/xmanager/XPivotCombatManager.lua

1283 lines
51 KiB
Lua
Raw Normal View History

XPivotCombatManagerCreator = function()
--region 局部变量
--数据结构
local XPivotCombatManager = {} -- 管理类
local _ActivityId = 0 --当前开放的活动Id
local _IsOpening = true --活动是否开放(能否进入活动)
local _IsReceiveAgreement = false --是否收到协议
local _SecondaryRegion = {} --次级区域配置
local _RegionId2Region = {} --次级区域Id-对应配置
local _CenterRegion = {} --中心区域配置
local _StageInfo = {} --关卡信息
local _RegionDifficult = 0 --区域难度
local _LockCharacterIdDic = {} --被锁定的角色
local _MaxRankMember = 100 --排行榜显示最大的人数
local _MaxScore = 0 --中心枢纽最高分
local _FightTimeScore = XPivotCombatConfigs.FightTimeScoreInitialValue --通关时间积分
local _HightestLevel = 0 --中心枢纽最高评级
local _LastRefreshScore = -1 --上次进入排行榜时的分数
local _HistoryScore = 0 --历史最高分数
local _HistoryHightestLevel = 0 --历史最高评级
local _TeamDict = {} --各区域队伍数据队伍
local _Robots = {} --机器人配置
local _MaxTeamMember = 3 --最大队员数量
local _LastSyncServerTimes = {} --上次请求排行榜时间
local _SyncServerTime = 20 --同步时长
local _RankData = {} --排行榜数据缓存
local _EventCache = {} --事件缓存
--请求后端函数名
local REQUEST_FUNC_NAME = {
CancelLockCharacterPivotCombatRequest = "CancelLockCharacterPivotCombatRequest",
GetRankInfoPivotCombatRequest = "GetRankInfoPivotCombatRequest",
SelectDifficultyPivotCombatRequest = "SelectDifficultyPivotCombatRequest",
}
--引用
local XPivotCombatRankItem = require("XEntity/XPivotCombat/XPivotCombatRankItem")
local XTeam = require("XEntity/XTeam/XTeam")
local XRobot = require("XEntity/XRobot/XRobot")
local XPivotCombatRegionItem = require("XEntity/XPivotCombat/XPivotCombatRegionItem")
--key相关
local _StagePrefabKey = "UiPivotCombatChapterGrid" --关卡预制体key
local _StageLockPrefabKey = "UiPivotCombatFinalChapterGrid" --锁角色关卡预制体key
local _TeamDataKey = "_TeamDataKey" --队伍数据key
local _NoLearnSkillKey = "_NoLearnSkillKey" --未学独域技能key
--endregion
--region 局部函数
--===========================================================================
---@desc 根据活动id初始化配置
--===========================================================================
local InitConfigs = function(activityId)
if not XTool.IsNumberValid(activityId) then
_ActivityId = XPivotCombatConfigs.GetDefaultActivityId()
else
_ActivityId = activityId
end
XPivotCombatConfigs.InitConfigsByActivity(_ActivityId)
end
--===========================================================================
---@desc 获取当前活动,切为当前难度下的区域配置
--===========================================================================
local InitRegionConfig = function()
----获取当期活动开放的区域配置
if not XTool.IsNumberValid(_RegionDifficult) then
return
end
2024-09-01 20:49:41 +00:00
--置空
_CenterRegion = {}
_SecondaryRegion = {}
_RegionId2Region = {}
local regions = XPivotCombatConfigs.GetCurRegionConfigs()
for regionId, config in pairs(regions[_RegionDifficult] or {}) do
local regionItem = XPivotCombatRegionItem.New(regionId)
regionItem:InitData(config)
if regionItem:IsCenterRegion() then
_CenterRegion = regionItem
else
table.insert(_SecondaryRegion, regionItem)
end
_RegionId2Region[regionId] = regionItem
end
end
--===========================================================================
---@desc 获取或新创建机器人
--===========================================================================
local GetRobot = function(robotId)
local robot = _Robots[robotId]
if not robot then
robot = XRobot.New(robotId)
_Robots[robotId] = robot
end
return robot
end
local GetRegionKey = function(regionId)
return "Region_"..regionId.."_IsOpen"
end
--检查活动开启状态
local CheckActivityState = function(activityId)
local func = function()
if CS.XFight.IsRunning or XLuaUiManager.IsUiLoad("UiLoading") or XLuaUiManager.IsUiLoad("UiSettleLose") or
XLuaUiManager.IsUiLoad("UiSettleWin") then
table.insert(_EventCache, true)
return
end
XEventManager.DispatchEvent(XEventId.EVENT_PIVOTCOMBAT_ACTIVITY_END)
CsXGameEventManager.Instance:Notify(XEventId.EVENT_ACTIVITY_ON_RESET, XDataCenter.FubenManager.StageType.PivotCombat)
end
--服务端发送了小于0的活动id
if not _IsOpening then
func()
return
end
--在线开启了新一期活动
if activityId > 0 and activityId ~= _ActivityId then
func()
return
end
end
--===========================================================================
---@desc 初始化历史评分相关
--===========================================================================
local InitHistoryScore = function()
_HistoryScore = _MaxScore
_HistoryHightestLevel = _HightestLevel
end
--endregion
--region 活动入口相关
--===========================================================================
---@desc 获取当前开放的活动信息
---@return {table} 活动信息
--===========================================================================
function XPivotCombatManager.GetActivityChapters()
--未收到协议,且不在活动开放时间内
if not ( _IsReceiveAgreement and XPivotCombatManager.IsDuringOpenTime()) then
return {}
end
local chapters = {}
table.insert(chapters, {
Id = _ActivityId,
Type = XDataCenter.FubenManager.ChapterType.PivotCombat,
BannerBg = XPivotCombatConfigs.GetActivityBanner(_ActivityId),
Name = XPivotCombatConfigs.GetActivityName(_ActivityId)
})
return chapters
end
--===========================================================================
---@desc 当前活动总体进度
---@return {string} 总体进度
--===========================================================================
function XPivotCombatManager.GetActivityProgress()
local taskList = XDataCenter.PivotCombatManager.GetTaskList()
local finished = 0
for _, task in ipairs(taskList) do
if task.State == XDataCenter.TaskManager.TaskState.Finish then
finished = finished + 1
end
end
return CSXTextManagerGetText("PivotCombatProgress", finished, #taskList)
end
--===========================================================================
---@desc 当前活动名
---@return {string} 当前活动名
--===========================================================================
function XPivotCombatManager.GetActivityName()
return XPivotCombatConfigs.GetActivityName(_ActivityId)
end
--==============================
---@desc 活动代币
---@return number 物品Id
--==============================
function XPivotCombatManager.GetActivityCoinId()
return XPivotCombatConfigs.GetCoinId(_ActivityId)
end
--==============================
---@desc 商店类型
---@return number 商店type
--==============================
function XPivotCombatManager.GetActivityShopType()
return XPivotCombatConfigs.GetShopType(_ActivityId)
end
--===========================================================================
---@desc 当前活动剩余时间23天
---@return {string} 显示规则为XUiHelper.TimeFormatType.ACTIVITY
--===========================================================================
function XPivotCombatManager.GetActivityLeftTime()
local timeOfNow = XTime.GetServerNowTimestamp()
local timeOfEnd = XPivotCombatConfigs.GetActivityEndTime(_ActivityId)
return XUiHelper.GetTime(timeOfEnd - timeOfNow, XUiHelper.TimeFormatType.PIVOT_COMBAT)
end
--===========================================================================
---@desc 检测活动是否开启
---@return [bool] 是否开启
--===========================================================================
function XPivotCombatManager.IsOpen()
if not XTool.IsNumberValid(_ActivityId) then
return false
end
if not _IsOpening then
return false
end
return XPivotCombatManager.IsDuringOpenTime()
end
--===========================================================================
---@desc 是否在活动开放时间内
--===========================================================================
function XPivotCombatManager.IsDuringOpenTime()
local timeOfNow = XTime.GetServerNowTimestamp()
local timeOfBegin = XPivotCombatConfigs.GetActivityStartTime(_ActivityId)
local timeOfEnd = XPivotCombatConfigs.GetActivityEndTime(_ActivityId)
return timeOfBegin <= timeOfNow and timeOfNow < timeOfEnd
end
--===========================================================================
---@desc 获取当前活动开放时间
---@return {int} 当前活动开放时间戳
--===========================================================================
function XPivotCombatManager.GetActivityBeginTime()
return XPivotCombatConfigs.GetActivityStartTime(_ActivityId)
end
--===========================================================================
---@desc 获取当前活动结束时间
---@return {int} 当前活动结束时间戳
--===========================================================================
function XPivotCombatManager.GetActivityEndTime()
return XPivotCombatConfigs.GetActivityEndTime(_ActivityId)
end
--===========================================================================
---@desc 跳转到活动主界面
--===========================================================================
function XPivotCombatManager.JumpTo()
if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.PivotCombat) then
return
end
if not XPivotCombatManager.IsOpen() then
XUiManager.TipText("FubenRepeatNotInActivityTime")
return
end
if XDataCenter.PivotCombatManager.IsShowSelectDifficult() then
XLuaUiManager.Open("UiPivotCombatSelectDifficult")
else
XLuaUiManager.Open("UiPivotCombatMain")
end
end
--===========================================================================
---@desc 活动结束回调
--===========================================================================
function XPivotCombatManager.OnActivityEnd()
XPivotCombatManager.ResetData()
XLuaUiManager.RunMain()
XUiManager.TipText("CommonActivityEnd")
end
--==============================
---@desc 根据事件缓存判断是否需要关闭活动
--==============================
function XPivotCombatManager.CheckNeedClose()
local isEmpty = XTool.IsTableEmpty(_EventCache)
if isEmpty then return end
XDataCenter.PivotCombatManager.OnActivityEnd()
end
--==============================
---@desc 清除本期活动的缓存
--==============================
function XPivotCombatManager.ResetData()
_SecondaryRegion = {}
_RegionId2Region = {}
_CenterRegion = {}
_LockCharacterIdDic = {}
_HistoryHightestLevel = 0
_LastRefreshScore = -1
_StageInfo = {}
_RankData = {}
_HightestLevel = 0
_HistoryScore = 0
_MaxScore = 0
_EventCache = {}
_FightTimeScore = XPivotCombatConfigs.FightTimeScoreInitialValue
end
--===========================================================================
---@desc 刷新头像通用接口
---@param {charIds} 通关角色id
---@param {headList} 头像控件列表
---@param {targetUiList} 用于初始化Ui
--===========================================================================
function XPivotCombatManager.RefreshHeadIcon(charIds, headList, targetUiList)
charIds = charIds or {}
for idx = 1, _MaxTeamMember do
local charId = charIds[idx]
local head = headList[idx]
if not head then
head = {}
XTool.InitUiObjectByUi(head, targetUiList[idx])
head.PanelWenhao.gameObject:SetActiveEx(false)
table.insert(headList, head)
end
if XTool.IsNumberValid(charId) then
head.StandIcon.gameObject:SetActiveEx(true)
head.PanelLose.gameObject:SetActiveEx(false)
local icon = XDataCenter.CharacterManager.GetCharSmallHeadIcon(charId)
head.StandIcon:SetRawImage(icon)
else
--head.StandIcon.gameObject:SetActiveEx(false)
--head.PanelLose.gameObject:SetActiveEx(true)
head.GameObject:SetActiveEx(false)
end
end
return headList
end
--===========================================================================
---@desc 所有次级区域是否全部开放
--===========================================================================
function XPivotCombatManager.IsAllSecondaryOpen()
for _, region in ipairs(_SecondaryRegion) do
local isOpen, _ = region:IsOpen()
if not isOpen then
return false
end
end
return true
end
--endregion
--region 红点检测条件
--===========================================================================
---@desc 检查任务奖励是否显示红点
---@return {bool} 是否显示红点
--===========================================================================
function XPivotCombatManager.CheckTaskRewardRedPoint()
if not XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.PivotCombat) then
return false
end
if not XPivotCombatManager.IsOpen() then
return false
end
local taskList = XDataCenter.PivotCombatManager.GetTaskList()
for _, task in ipairs(taskList) do
--有任务已经完成但是未领取
if task.State == XDataCenter.TaskManager.TaskState.Achieved then
return true
end
end
return false
end
--===========================================================================
---@desc 检查是否是新开放的区域
---@return {bool} 是否是新开放区域
--===========================================================================
function XPivotCombatManager.CheckNewAreaOpenRedPoint(regionId)
if not XTool.IsNumberValid(regionId) or regionId == 0 then
return false
end
if not XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.PivotCombat) then
return false
end
if not XPivotCombatManager.IsOpen() then
return false
end
local region = _RegionId2Region[regionId]
if not region then
return false
end
local isOpen, _ = region:IsOpen()
--有供能,可能清除了缓存数据
if not isOpen or region:GetCurSupplyEnergy() > 0 then
return false
end
local key = XPivotCombatManager.GetCookieKey(GetRegionKey(regionId))
if not XSaveTool.GetData(key) then
return true
end
return false
end
--endregion
--region 区域配置
--===========================================================================
---@desc 中心区域最高分
---@return {int} 最高分
--===========================================================================
function XPivotCombatManager.GetMaxScore()
return _MaxScore
end
--==============================
---@desc 战斗时间积分
---@return number
--==============================
function XPivotCombatManager.GetFightTimeScore()
return _FightTimeScore
end
--===========================================================================
---@desc 更新最大分数
--===========================================================================
function XPivotCombatManager.RefreshMaxScore(score, fightTimeScore)
if score < _MaxScore then return end
_MaxScore = score
_FightTimeScore = fightTimeScore
end
--===========================================================================
---@desc 获取历史最高分数,跟最大积分区分开来
--===========================================================================
function XPivotCombatManager.GetHistoryScore()
return _HistoryScore
end
--===========================================================================
---@desc 刷新历史最高积分
--===========================================================================
function XPivotCombatManager.RefreshHistoryScore(score)
if score < _HistoryScore then return end
_HistoryScore = score
end
--===========================================================================
---@desc 获取历史最高评分
--===========================================================================
function XPivotCombatManager.GetHistoryRankingLevel()
return _HistoryHightestLevel
end
--===========================================================================
---@desc 刷新历史最高评分
--===========================================================================
function XPivotCombatManager.RefreshHistoryRankingLevel(score)
if score < _HistoryHightestLevel then return end
_HistoryHightestLevel = score
end
--===========================================================================
---@desc 刷新最高评分
--===========================================================================
function XPivotCombatManager.RefreshHightestRankingLevel(score)
if score < _HightestLevel then return end
_HightestLevel = score
end
--===========================================================================
---@desc 获取当前活动的次级区域配置
---@return {XPivotCombatRegionItem}
--===========================================================================
function XPivotCombatManager.GetSecondaryRegions()
return _SecondaryRegion
end
--===========================================================================
---@desc 根据区域id获取对应的实体类
---@param {regionId} 区域Id
---@return {XPivotCombatRegionItem}
--===========================================================================
function XPivotCombatManager.GetRegion(regionId)
return _RegionId2Region[regionId]
end
--===========================================================================
---@desc 获取中心区域配置
---@return {XPivotCombatRegionItem}
--===========================================================================
function XPivotCombatManager.GetCenterRegion()
return _CenterRegion
end
--===========================================================================
---@desc 获取次级区域的区域id列表
--===========================================================================
function XPivotCombatManager.GetSecondaryRegionIds()
local regionIds = {}
for _, region in ipairs(_SecondaryRegion) do
local regionId = region:GetRegionId()
if XTool.IsNumberValid(regionId) then
table.insert(regionIds, regionId)
end
end
return regionIds
end
--===========================================================================
---@desc 获取排行榜最大显示人数
--===========================================================================
function XPivotCombatManager.GetMaxRankMember()
return _MaxRankMember
end
--===========================================================================
---@desc 获取难度
--===========================================================================
function XPivotCombatManager.GetDifficulty()
return _RegionDifficult
end
--==============================
---@desc 是否需要显示难度选择
---@return boolean
--==============================
function XPivotCombatManager.IsShowSelectDifficult()
return not XTool.IsNumberValid(_RegionDifficult)
end
--===========================================================================
---@desc 检查次级区域供能是否满足进入中枢战区
--===========================================================================
function XPivotCombatManager.IsSecondaryEnergySupplyEnough()
--次级区域的供能必须大于1才能进入中枢
for _, region in ipairs(_SecondaryRegion) do
if region:GetCurSupplyEnergy() < 1 then
return false
end
end
return true
end
--===========================================================================
---@desc 根据关卡库Id获取对应的关卡列表
---@param {stageLibId} 关卡库id
---@return {table} 对应的配置
--===========================================================================
function XPivotCombatManager.GetStageConfigs(stageLibId)
if not XTool.IsNumberValid(stageLibId) then
return {}
end
return XPivotCombatConfigs.GetStageLibConfig(stageLibId)
end
--===========================================================================
---@desc 获取普通关卡预制体
--===========================================================================
function XPivotCombatManager.GetStagePrefabPath()
return XUiConfigs.GetComponentUrl(_StagePrefabKey)
end
--===========================================================================
---@desc 获取锁角色关卡预制体
--===========================================================================
function XPivotCombatManager.GetLockRoleStagePrefabPath()
return XUiConfigs.GetComponentUrl(_StageLockPrefabKey)
end
--===========================================================================
---@desc 所有次级区域能够提供的最大能量
---@return {int} 提供的能源等级
--===========================================================================
function XPivotCombatManager.GetSecondaryRegionTotalMaxEnergy()
local totalEnergy = 0
for _, region in ipairs(_SecondaryRegion) do
totalEnergy = totalEnergy + region:GetMaxSupplyEnergy()
end
return totalEnergy
end
--===========================================================================
---@desc 所有次级区域当前提供的能量
---@return {int} 提供的能源等级
--===========================================================================
function XPivotCombatManager.GetSecondaryRegionTotalCurEnergy()
local totalEnergy = 0
for _, region in ipairs(_SecondaryRegion) do
totalEnergy = totalEnergy + region:GetCurSupplyEnergy()
end
return totalEnergy
end
--===========================================================================
---@desc 刷新区域数据
---@param {regionData} 枢纽作战区域数据具体内容查看XPivotCombatRegionItem的XPivotCombatRegionData
--===========================================================================
function XPivotCombatManager.RefreshRegionData(regionData)
if XTool.IsTableEmpty(regionData) then
return
end
for _, data in ipairs(regionData) do
local regionId = data.RegionId
local item = _RegionId2Region[regionId]
if item then
item:RefreshRegionData(data)
end
end
end
--===========================================================================
---@desc 刷新锁定角色字典
--===========================================================================
function XPivotCombatManager.RefreshLockCharacterDict(dict)
for id, tbId in pairs(dict or {}) do
if XTool.IsNumberValid(id) and XTool.IsNumberValid(tbId) then
_LockCharacterIdDic[id] = tbId
end
end
end
--===========================================================================
---@desc 移除锁定角色字典
--===========================================================================
function XPivotCombatManager.RemoveLockCharacterDict(dict)
for id, _ in pairs(dict or {}) do
_LockCharacterIdDic[id] = nil
end
end
--===========================================================================
---@desc 获取锁定角色字典
--===========================================================================
function XPivotCombatManager.GetLockCharacterDict()
return _LockCharacterIdDic
end
2024-09-01 20:49:41 +00:00
--==============================
---@desc 检查角色是否被锁定
---@stageId 关卡Id
---@characterId 角色Id
---@return boolean
--==============================
function XPivotCombatManager.CheckCharacterLocked(stageId, characterId)
if not XTool.IsNumberValid(stageId)
or not XTool.IsNumberValid(characterId) then
return false
end
local stage = XDataCenter.PivotCombatManager.GetStage(stageId)
if not stage or stage:CanUseLockedRole() then
return false
end
return _LockCharacterIdDic[characterId] and true or false
end
--===========================================================================
---@desc 界面处理通用事件
--===========================================================================
function XPivotCombatManager.OnNotify(evt, args)
if evt == XEventId.EVENT_PIVOTCOMBAT_ACTIVITY_END then
XDataCenter.PivotCombatManager.OnActivityEnd()
elseif evt == XEventId.EVENT_ACTIVITY_ON_RESET then
if args[1] ~= XDataCenter.FubenManager.StageType.PivotCombat then return end
XDataCenter.PivotCombatManager.OnActivityEnd()
end
end
--===========================================================================
---@desc 获取次级区域的积分加成(万分比)
--===========================================================================
function XPivotCombatManager.GetTotalScoreAddition()
local totalScoreAddition = 0
for _, region in ipairs(_SecondaryRegion) do
totalScoreAddition = totalScoreAddition + region:GetScoreAddition()
end
return totalScoreAddition / 10000
end
--===========================================================================
---@desc 是否是教学关
--===========================================================================
function XPivotCombatManager.CheckIsTeachStage(stageId)
return stageId == XPivotCombatConfigs.TeachStageId or stageId == XPivotCombatConfigs.DynamicScoreTeachStageId
end
--===========================================================================
---@desc 进入次级界面
--===========================================================================
function XPivotCombatManager.OnEnterRegion(region)
if not region then return end
local regionId = region:GetRegionId()
local key = XPivotCombatManager.GetCookieKey(GetRegionKey(regionId))
if not XSaveTool.GetData(key) then
XSaveTool.SaveData(key, true)
end
XLuaUiManager.Open("UiPivotCombatSecondary", region)
end
--===========================================================================
---@desc 获取当前期数的任务
--===========================================================================
function XPivotCombatManager.GetTaskList()
if XTool.IsTableEmpty(_CenterRegion) then return {} end
return XDataCenter.TaskManager.GetTaskList(TaskType.PivotCombat, _CenterRegion:GetTaskGroupId())
end
function XPivotCombatManager.ShowDialogHintTip(characterId, negativeCb, positiveCb)
if XPivotCombatManager.IsShowedDialogHintTip() then
return
end
local title = CSXTextManagerGetText("PivotCombatNoSpecialSkillTitle")
local content = CSXTextManagerGetText("PivotCombatNoSpecialSkillContent")
local status = XDataCenter.PivotCombatManager.IsShowedDialogHintTip()
local hintInfo = {
SetHintCb = XDataCenter.PivotCombatManager.SetDialogHintCookie,
Status = status,
IsNeedClose = false,
}
XUiManager.DialogHintTip(title, content, "", negativeCb, positiveCb, hintInfo)
end
--==============================
---@desc 获取战斗时间
---@fightScoreTime 通关时间积分
---@return string format 00:00
--==============================
function XPivotCombatManager.GetFightTime(fightScoreTime)
if not XTool.IsNumberValid(fightScoreTime) then return "00:00" end
-- 计算公式 时间积分 = 初始值 - 通关时间秒数
local time = XPivotCombatConfigs.FightTimeScoreInitialValue - fightScoreTime
local min = math.floor(time / 60)
local sec = math.floor(time % 60)
return string.format("%02d:%02d", min, sec)
end
--endregion
--region 队伍信息
--===========================================================================
---@desc 获取队伍信息
--===========================================================================
function XPivotCombatManager.GetTeam(regionId)
local key = regionId.._TeamDataKey
local teamId = XPivotCombatManager.GetCookieKey(key)
local team = _TeamDict[teamId]
if not team then
team = XTeam.New(teamId)
_TeamDict[teamId] = team
end
--检查服务端是否被清档本地team仍然存在这个角色的情况
local entityIds = team:GetEntityIds()
for _, id in ipairs(entityIds or {}) do
if not XTool.IsNumberValid(id) then
goto CONTINUE
end
if XRobotManager.CheckIsRobotId(id) then
goto CONTINUE
end
local isOwnerCharacter = XDataCenter.CharacterManager.IsOwnCharacter(id)
--如果这个角色在队伍中,
if not isOwnerCharacter then
team:Clear()
break
end
::CONTINUE::
end
return team
end
--===========================================================================
---@desc 清空队伍信息
--===========================================================================
function XPivotCombatManager.ClearTeam()
for _, team in pairs(_TeamDict) do
if team then
team:Clear()
end
end
end
--===========================================================================
---@desc 获取所有能够参战角色信息
---@param {characterType}角色类型
---@return {table} 角色列表
--===========================================================================
function XPivotCombatManager.GetFightEntities(characterType)
local result = {}
--玩家拥有的角色
local characters = XDataCenter.CharacterManager.GetOwnCharacterList()
for _, character in ipairs(characters or {}) do
if character:GetCharacterViewModel():GetCharacterType() == characterType then
table.insert(result, character)
end
end
--配置机器人
local robots = XPivotCombatManager.GetFightRobots()
for _, robot in ipairs(robots or {}) do
if robot:GetCharacterViewModel():GetCharacterType() == characterType then
table.insert(result, robot)
end
end
return result
end
--===========================================================================
---@desc 获取配置的机器人
--===========================================================================
function XPivotCombatManager.GetFightRobots()
local robots = {}
local allRobots = XPivotCombatConfigs.GetRobotSources()
for _, config in ipairs(allRobots) do
local robotId = config.RobotId
if XTool.IsNumberValid(robotId) and XRobotManager.CheckIsRobotId(robotId) then
local robot = GetRobot(robotId)
table.insert(robots, robot)
end
end
return robots
end
--endregion
--region 本地缓存
function XPivotCombatManager.GetCookieKey(key)
if not key then return end
if not XTool.IsNumberValid(_ActivityId) then
return
end
return string.format("XPivotCombatManager_%d_%d_%s", XPlayer.Id, _ActivityId, key)
end
--===========================================================================
---@desc 是否已经显示每日提示
--===========================================================================
function XPivotCombatManager.IsShowedDialogHintTip()
local key = XPivotCombatManager.GetCookieKey(_NoLearnSkillKey)
local updateTime = XSaveTool.GetData(key)
if not updateTime then
return false
end
return XTime.GetServerNowTimestamp() < updateTime
end
--===========================================================================
---@desc 选中今日不再提示isSelect 是否选择今日不再提示
--===========================================================================
function XPivotCombatManager.SetDialogHintCookie(isSelect)
local key = XPivotCombatManager.GetCookieKey(_NoLearnSkillKey)
if not isSelect then
XSaveTool.RemoveData(key)
else
if XPivotCombatManager.IsShowedDialogHintTip() then return end
local updateTime = XTime.GetSeverTomorrowFreshTime()
XSaveTool.SaveData(key, updateTime)
end
end
--endregion
--region 适配FubenManager内的方法
--===========================================================================
---@desc 初始化StageInfo
--===========================================================================
function XPivotCombatManager.InitStageInfo()
local stageIds = XPivotCombatConfigs.GetAllStageIds()
for _, stageId in ipairs(stageIds) do
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
if stageInfo then
stageInfo.Type = XDataCenter.FubenManager.StageType.PivotCombat
end
end
end
2024-09-01 20:49:41 +00:00
--===========================================================================
---@desc 战斗前的检查与数据准备
--===========================================================================
function XPivotCombatManager.PreFight(stage, teamId, isAssist, challengeCount, challengeId)
local preFight = {}
preFight.CardIds = {0, 0, 0}
preFight.RobotIds = {0, 0, 0}
preFight.StageId = stage.StageId
preFight.IsHasAssist = isAssist and true or false
preFight.ChallengeCount = challengeCount or 1
2024-09-01 20:49:41 +00:00
local robotIds = stage.RobotId
if robotIds and #robotIds > 0 then
for i, id in ipairs(preFight.RobotIds) do
local robotId = robotIds[i]
if robotId and robotId > 0 then
preFight.CaptainPos = i
preFight.FirstFightPos = i
preFight.RobotIds[i] = robotId
else
preFight.RobotIds[i] = 0
end
end
else
local team = _TeamDict[teamId]
if not team then
team = XTeam.New(teamId)
_TeamDict[teamId] = team
end
local teamData = team:GetEntityIds()
for teamIndex, characterId in pairs(teamData) do
if XRobotManager.CheckIsRobotId(characterId) then
preFight.RobotIds[teamIndex] = characterId
else
preFight.CardIds[teamIndex] = characterId
end
end
2024-09-01 20:49:41 +00:00
preFight.CaptainPos = team:GetCaptainPos()
preFight.FirstFightPos = team:GetFirstFightPos()
end
return preFight
end
--===========================================================================
---@desc 自定义进入战斗
--===========================================================================
function XPivotCombatManager.CustomOnEnterFight(preFight, callback)
local stageId = preFight.StageId
if XPivotCombatManager.CheckIsTeachStage(stageId) then
XPivotCombatManager.DoEnterFightWithLocal(preFight)
else
XPivotCombatManager.DoEnterFightWithNetwork(preFight, callback)
end
end
--===========================================================================
---@desc 本地构造战斗
--===========================================================================
function XPivotCombatManager.DoEnterFightWithLocal(preFight)
local stageId = preFight.StageId
local stageCfg = XDataCenter.FubenManager.GetStageCfg(stageId)
local fightData = {}
fightData.RoleData = {}
fightData.FightId = 1
fightData.Online = false
fightData.Seed = 1
fightData.StageId = stageId
local roleData = {}
roleData.NpcData = {}
table.insert(fightData.RoleData, roleData)
roleData.Id = XPlayer.Id
roleData.Name = CSXTextManagerGetText("Aha")
roleData.Camp = 1
for idx, robotId in ipairs(stageCfg.RobotId or {}) do
if XRobotManager.CheckIsRobotId(robotId) then
local robot = XRobotManager.GetRobotById(robotId)
local npcData = robot:GetNpcData()
npcData.Character.FashionId = robot:GetCharacterViewModel().FashionId
roleData.NpcData[idx - 1] = npcData
end
end
fightData.RebootId = stageCfg.RebootId
local endFightCb = function()
if stageCfg.EndStoryId then
XDataCenter.MovieManager.PlayMovie(stageCfg.EndStoryId)
end
end
local enterFightFunc = function()
XDataCenter.FubenManager.CallOpenFightLoading(stageId)
local args = CS.XFightClientArgs()
args.RoleId = XPlayer.Id
args.CloseLoadingCb = function()
XDataCenter.FubenManager.CallCloseFightLoading(stageId)
end
args.FinishCbAfterClear = function()
endFightCb()
end
args.ClientOnly = true
CS.XFight.Enter(fightData, args)
end
enterFightFunc()
end
--===========================================================================
---@desc 联网战斗
--===========================================================================
function XPivotCombatManager.DoEnterFightWithNetwork(preFight, callback)
XNetwork.Call("PreFightRequest", { PreFightData = preFight }, function(res)
if callback then callback(res) end
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
local fightData = res.FightData
local stageInfo = XDataCenter.FubenManager.GetStageInfo(fightData.StageId)
local stage = XDataCenter.FubenManager.GetStageCfg(fightData.StageId)
local isKeepPlayingStory = stage and XFubenConfigs.IsKeepPlayingStory(stage.StageId) and (stage.BeginStoryId)
local isNotPass = stage and stage.BeginStoryId and (not stageInfo or not stageInfo.Passed)
if isKeepPlayingStory or isNotPass then
-- 播放剧情,进入战斗
XDataCenter.FubenManager.EnterRealFight(preFight, fightData, stage.BeginStoryId)
else
-- 直接进入战斗
XDataCenter.FubenManager.EnterRealFight(preFight, fightData)
end
end)
end
--===========================================================================
---@desc 检查关卡是否通关
--===========================================================================
function XPivotCombatManager.CheckPassedByStageId(stageId)
local stage = _StageInfo[stageId]
if not stage then
return false
end
return stage:GetPassed()
end
--===========================================================================
---@desc 检查关卡是否解锁
--===========================================================================
function XPivotCombatManager.CheckUnlockByStageId(stageId)
--教学关卡默认开启
if XPivotCombatManager.CheckIsTeachStage(stageId) then
return true
end
local stage = _StageInfo[stageId]
if not stage then
return false
end
return stage:CheckIsUnlock()
end
--===========================================================================
---@desc 刷新关卡状态
--===========================================================================
function XPivotCombatManager.RefreshStageInfo(stageId, stage)
_StageInfo[stageId] = stage
end
--===========================================================================
---@desc 获取关卡配置
--===========================================================================
function XPivotCombatManager.GetStage(stageId)
return _StageInfo[stageId]
end
--===========================================================================
---@desc 处理战斗结束
--===========================================================================
function XPivotCombatManager.FinishFight(settle)
if settle.IsWin then
local stage = XPivotCombatManager.GetStage(settle.StageId)
if stage then
stage:SetPassed(true)
end
XDataCenter.FubenManager.ChallengeWin(settle)
else
XDataCenter.FubenManager.ChallengeLose(settle)
end
end
--===========================================================================
---@desc 处理战斗胜利界面
--===========================================================================
function XPivotCombatManager.ShowReward(winData)
local stageId = winData.StageId
local stage = _StageInfo[stageId]
if stage and stage:CheckIsScoreStage() then
XLuaUiManager.Open("UiPivotCombatCenterSettle", winData)
else
XDataCenter.FubenManager.ShowReward(winData)
end
end
2024-09-01 20:49:41 +00:00
--==============================
---@desc 新副本界面进度
---@return string
--==============================
function XPivotCombatManager.GetProgressTips()
return XPivotCombatManager.GetActivityProgress()
end
--endregion
--region 双端交互
--===========================================================================
---@desc 推送枢纽作战数据信息, 登录下发
---@param {data} 枢纽作战基础数据 (XPivotCombatBaseData)
--[[ data = {
int ActivityId; Id
int Difficulty;
int Score;
List<XPivotCombatRegionData> RegionDataList;
}
]]--
--===========================================================================
function XPivotCombatManager.NotifyPivotCombatData(data)
--收到协议,需要显示活动入口
_IsReceiveAgreement = true
local pivotData = data.PivotCombatData
local activityId = pivotData.ActivityId
_IsOpening = activityId > 0 and true or false
--检查活动是否结束,或者更换期数
CheckActivityState(activityId)
InitConfigs(activityId)
_RegionDifficult = pivotData.Difficulty
InitRegionConfig()
XPivotCombatManager.RefreshRegionData(pivotData.RegionDataList)
--刷新评分相关
InitHistoryScore()
end
--===========================================================================
---@desc 推送区域供能等级变更信息
---@param {data} {int RegionId; int SupplyEnergyLevel; 变更后供能等级}
---@return nil
--===========================================================================
function XPivotCombatManager.NotifyRegionDataChangeInfo(data)
local regionId = data.RegionId
local item = _RegionId2Region[regionId]
if item then
item:RefreshSingleStage(data)
end
end
--===========================================================================
---@desc 取消锁定角色请求
---@param {cb} 收到服务器回应成功后的回调
---@param {regionId} 区域ID
---@param {stageId} 关卡ID
--===========================================================================
function XPivotCombatManager.CancelLockCharacterPivotCombatRequest(regionId, stageId, cb)
local request = {
RegionId = regionId,
StageId = stageId,
}
XNetwork.Call(REQUEST_FUNC_NAME.CancelLockCharacterPivotCombatRequest, request, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
local rgId = res.RegionId
local item = _RegionId2Region[rgId]
if item then
item:CancelLockCharacter(res.SupplyEnergyLevel, res.StageId)
end
if cb then
cb()
end
end)
end
--===========================================================================
---@desc 获取指定难度排行信息响应
---@param {difficulty} 难度
--===========================================================================
function XPivotCombatManager.GetRankInfoPivotCombatRequest(difficulty, cb)
local timeOfNow = XTime.GetServerNowTimestamp()
local timeOfLast = _LastSyncServerTimes[difficulty]
if timeOfLast and timeOfLast + _SyncServerTime >= timeOfNow then
local data = _RankData[difficulty]
if not data then
XLog.Warning("No Rank Data, difficulty = "..difficulty)
return
end
if cb then
cb(data.RankList, data.Ranking, data.TotalCount)
end
return
end
--排行榜的难度是玩家本期活动难度,只有玩家分数突破记录才刷新
if difficulty == _RegionDifficult and _MaxScore <= _LastRefreshScore then
local data = _RankData[difficulty]
if not data then
XLog.Warning("No Rank Data, difficulty = "..difficulty)
return
end
if cb then
cb(data.RankList, data.Ranking, data.TotalCount)
end
return
end
local request = { Difficulty = difficulty }
--[[
res = {
XCode Code;
int Ranking;
long TotalCount;
List<XPivotCombatRankPlayerInfo> RankPlayerInfoList; ,
}
]]
XNetwork.Call(REQUEST_FUNC_NAME.GetRankInfoPivotCombatRequest, request, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
_LastSyncServerTimes[difficulty] = timeOfNow
local totalCount = res.TotalCount
local tmpCount = totalCount > _MaxRankMember and _MaxRankMember or totalCount
local rankList = {}
for idx, info in ipairs(res.RankPlayerInfoList or {}) do
if idx > tmpCount then break end
local item = XPivotCombatRankItem.New(info, idx, totalCount)
table.insert(rankList, item)
end
if cb then
cb(rankList, res.Ranking, totalCount)
end
--更新缓存
_RankData[difficulty] = {
RankList = rankList,
Ranking = res.Ranking,
TotalCount = totalCount
}
--刷新上次进入排行榜的分数
if difficulty == _RegionDifficult then
_LastRefreshScore = _MaxScore
end
end)
end
--==============================
---@desc 选择难度
---@difficulty 难度参数
---@cb 选择难度回调
--==============================
function XPivotCombatManager.SelectDifficultyPivotCombatRequest(difficulty, cb)
local request = { Difficulty = difficulty }
-- res = { XCode Code }
XNetwork.Call(REQUEST_FUNC_NAME.SelectDifficultyPivotCombatRequest, request, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
_RegionDifficult = difficulty
InitRegionConfig()
if cb then
cb()
end
end)
end
--endregion
return XPivotCombatManager
end
--region S2CFunction
XRpc.NotifyPivotCombatData = function(data)
XDataCenter.PivotCombatManager.NotifyPivotCombatData(data)
end
XRpc.NotifyRegionDataChangeInfo = function(data)
XDataCenter.PivotCombatManager.NotifyRegionDataChangeInfo(data)
end
--endregion