PGRData/Script/matrix/xmanager/XTransfiniteManager.lua
2024-09-01 22:49:41 +02:00

722 lines
No EOL
24 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local XExFubenSimulationChallengeManager = require("XEntity/XFuben/XExFubenSimulationChallengeManager")
local Pairs = pairs
XTransfiniteManagerCreator = function()
local _Debug = true
local config = XFubenConfigs.GetChapterBannerByType(XFubenConfigs.ChapterType.Transfinite)
---@class XTransfiniteManager
local XTransfiniteManager = XExFubenSimulationChallengeManager.New(XFubenConfigs.ChapterType.Transfinite, config)
local RequestProto = {
SetTeam = "TransfiniteSetTeamRequest",
Confirm = "TransfiniteConfirmBattleResultRequest",
Reset = "TransfiniteResetStageGroupRequest",
ReceiveReward = "TransfiniteGetScoreRewardRequest",
}
---@type XTransfiniteData
local _Data = require("XEntity/XTransfinite/XTransfiniteData").New()
function XTransfiniteManager.Debug()
--if not _Data:GetActivityId() then
-- _Data:UseDebugData()
--end
end
function XTransfiniteManager.InitStageInfo()
local allStageConfig = XTransfiniteConfigs.GetAllStageConfig()
for stageId, _ in pairs(allStageConfig) do
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
stageInfo.Type = XDataCenter.FubenManager.StageType.Transfinite
end
end
function XTransfiniteManager.InitFromServerData(res)
_Data:InitFromServerData(res)
XTransfiniteManager.CheckForceExit()
end
function XTransfiniteManager.IsPassed(stageId)
return _Data:IsPassed(stageId)
end
function XTransfiniteManager.GetEndTime()
return _Data:GetEndTime(XTransfiniteConfigs.PeriodType.Fight)
end
function XTransfiniteManager.IsRewardCanReceive()
--local taskGroupId = XTransfiniteConfigs.GetRegionScoreTaskGroupId(XTransfiniteConfigs.RegionType.Normal)
--if XTransfiniteManager.GetTaskIsAchievedByTaksGroupId(taskGroupId) then
-- return true
--end
--
--taskGroupId = XTransfiniteConfigs.GetRegionChallengeTaskGroupId(XTransfiniteConfigs.RegionType.Normal)
--if XTransfiniteManager.GetTaskIsAchievedByTaksGroupId(taskGroupId) then
-- return true
--end
--
--taskGroupId = XTransfiniteConfigs.GetRegionScoreTaskGroupId(XTransfiniteConfigs.RegionType.Senior)
--if XTransfiniteManager.GetTaskIsAchievedByTaksGroupId(taskGroupId) then
-- return true
--end
--
--taskGroupId = XTransfiniteConfigs.GetRegionChallengeTaskGroupId(XTransfiniteConfigs.RegionType.Senior)
--if XTransfiniteManager.GetTaskIsAchievedByTaksGroupId(taskGroupId) then
-- return true
--end
if XDataCenter.TransfiniteManager.IsRewardScoreAchieved() then
return true
end
if XDataCenter.TransfiniteManager.IsRewardChallengeAchieved() then
return true
end
if XDataCenter.TransfiniteManager.IsRewardAchievementAchieved() then
return true
end
return false
end
function XTransfiniteManager.IsTaskFinishedByTaksGroupId(taskGroupId)
local taskIdList = XTransfiniteConfigs.GetTaskTaskIds(taskGroupId)
local taskDataList = XDataCenter.TaskManager.GetTaskIdListData(taskIdList, false)
if not taskDataList then
return true
end
for i = 1, #taskDataList do
if taskDataList[i].State ~= XDataCenter.TaskManager.TaskState.Finish then
return false
end
end
return true
end
function XTransfiniteManager.GetTaskIsAchievedByTaksGroupId(taskGroupId)
local taskIdList = XTransfiniteConfigs.GetTaskTaskIds(taskGroupId)
local taskDataList = XDataCenter.TaskManager.GetTaskIdListData(taskIdList, false)
if not taskDataList then
return false
end
for i = 1, #taskDataList do
if taskDataList[i].State == XDataCenter.TaskManager.TaskState.Achieved then
return true
end
end
return false
end
---@return XTransfiniteRegion
function XTransfiniteManager.GetRegion()
return _Data:GetRegion()
end
function XTransfiniteManager.GetCircleId()
return _Data:GetCircleId()
end
---@return XTransfiniteRegion[]
function XTransfiniteManager.GetAllRegion()
local allRegion = {}
local allRegionId = XTransfiniteConfigs.GetAllRegion()
local regionCurrent = XTransfiniteManager.GetRegion()
for i = 1, #allRegionId do
local regionId = allRegionId[i]
local region
if regionCurrent and regionCurrent:GetId() == regionId then
region = regionCurrent
else
local XTransfiniteRegion = require("XEntity/XTransfinite/XTransfiniteRegion")
region = XTransfiniteRegion.New(regionId)
end
allRegion[#allRegion + 1] = region
end
return allRegion
end
---@return XTransfiniteStageGroup
function XTransfiniteManager.GetStageGroup(stageGroupId)
if stageGroupId then
return _Data:GetStageGroupById(stageGroupId)
end
return _Data:GetStageGroupInCycle()
end
function XTransfiniteManager.OpenMain()
if not _Data:IsOpen() then
local text = XTransfiniteManager:ExGetLockTip()
if text then
XUiManager.TipMsg(text)
return false
end
XUiManager.TipText("ActivityBranchNotOpen")
return false
end
XLuaUiManager.Open("UiTransfiniteMain")
return true
end
---@return XTeam
function XTransfiniteManager.GetTeam()
---@type XTeam
local team = XDataCenter.TeamManager.GetXTeam(XTransfiniteConfigs.TeamId)
if not team then
team = XDataCenter.TeamManager.GetXTeamByTypeId(XTransfiniteConfigs.TeamTypeId)
team:UpdateAutoSave(false)
team:UpdateSaveCallback(false)
end
return team
end
---@param stageGroup XTransfiniteStageGroup
function XTransfiniteManager.RequestSetTeam(stageGroup, callback)
local stageGroupId = stageGroup:GetId()
local team = stageGroup:GetTeam()
XNetwork.Call(RequestProto.SetTeam, {
StageGroupId = stageGroupId,
TeamInfo = {
CharacterIdList = team:GetEntityIds(),
CaptainPos = team:GetCaptainPos(),
FirstFightPos = team:GetFirstPos(),
}
}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
if callback then
callback()
end
end)
end
-- 手动releaseUi, 在进入战斗时关闭界面, 会导致releaseAll失败, 暂时未解决
local function ReleaseAll()
local CsXUiManager = CsXUiManager
CsXUiManager.Instance:SetRevertAllLock(true)
CsXUiManager.Instance:ReleaseAll(CsXUiType.Normal)
CsXUiManager.Instance:SetReleaseAllLock(true)
end
---@param result XTransfiniteResult
function XTransfiniteManager.RequestRechallenge(result)
local stageId = result:GetStageId()
local team = XTransfiniteManager.GetTeam()
local stageCfg = XDataCenter.FubenManager.GetStageCfg(stageId)
XDataCenter.FubenManager.EnterFight(stageCfg, team:GetId(), nil, nil, nil, function()
ReleaseAll()
XTransfiniteManager.CloseUiSettle()
end)
end
---@param result XTransfiniteResult
function XTransfiniteManager.RequestChallengeNextStage(result)
if result:IsFinalStage() then
XDataCenter.TransfiniteManager.ExitFight()
XDataCenter.TransfiniteManager.RequestConfirmResult(result)
return
end
XDataCenter.TransfiniteManager.RequestConfirmResult(result, function()
local stage = result:GetStage()
local stageGroup = result:GetStageGroup()
local nextStage = stageGroup:GetNextStage(stage)
if not nextStage then
return
end
XDataCenter.TransfiniteManager.ExitFight()
-- 相同词缀的不显示环境说明界面
local noEnvironmentDetail = stage:IsFightEventSimilar(nextStage)
XTransfiniteManager.RequestFight(nextStage, stageGroup, noEnvironmentDetail)
end)
end
---@param stage XTransfiniteStage
---@param stageGroup XTransfiniteStageGroup
---@param noEnvironmentDetail boolean@不显示
function XTransfiniteManager.RequestFight(stage, stageGroup, noEnvironmentDetail)
local stageId = stage:GetId()
local stageConfig = XDataCenter.FubenManager.GetStageCfg(stageId)
local team = XTransfiniteManager.GetTeam()
local teamId = team:GetId()
local isAssist = false
local challengeCount = 1
local stageGroupTeam = stageGroup:GetTeam()
stageGroupTeam:UpdateXTeam(team)
local enterFightCallback = function(res)
if res.Code ~= XCode.Success then
XLuaUiManager.SafeClose("UiTransfiniteAnimation")
return
end
if not stageGroup:IsBegin() then
stageGroup:SetIsBegin(true)
end
ReleaseAll()
XLuaUiManager.SafeClose("UiTransfiniteAnimation")
XTransfiniteManager.CloseUiSettle()
end
if noEnvironmentDetail then
XDataCenter.FubenManager.EnterFight(stageConfig, teamId, isAssist, challengeCount, nil, enterFightCallback)
return
end
XLuaUiManager.Open("UiTransfiniteAnimation", stage, function()
XDataCenter.FubenManager.EnterFight(stageConfig, teamId, isAssist, challengeCount, nil, enterFightCallback)
end)
end
---@type XTransfiniteResult
local _Result = false
if _Debug then
function XTransfiniteManager.GetResult()
return _Result
end
end
local function HandleConfirm(res)
local battleInfo = res.BattleInfo
local stageGroupId
if battleInfo then
stageGroupId = battleInfo.StageGroupId
elseif _Result then
stageGroupId = _Result:GetStageGroupId()
end
if not stageGroupId then
XLog.Error("[XTransfiniteManager] Can't get stage group id")
return
end
local stageGroup = XDataCenter.TransfiniteManager.GetStageGroup(stageGroupId)
if _Result:IsFinalStage() then
local totalClearTime = _Result:GetStageGroupClearTime()--stageGroup:GetTotalClearTime()
local bestTotalClearTime = stageGroup:GetBestClearTime()
if totalClearTime < bestTotalClearTime or bestTotalClearTime == 0 then
stageGroup:SetBestClearTime(totalClearTime)
end
stageGroup:GetTeam():Reset()
end
stageGroup:SetDataFromServer(battleInfo)
XEventManager.DispatchEvent(XEventId.EVENT_TRANSFINITE_UPDATE_ROOM, true)
if _Result and (_Result:IsFinalStage() or _Result:IsSettle()) then
_Result:SetRewardGoodList(res.RewardGoodsList)
XLuaUiManager.Open("UiTransfinitePassageSettlement", _Result)
end
--XTransfiniteManager.CloseUiSettle()
end
function XTransfiniteManager.RequestConfirmLastResult(stageGroup)
---@type XTransfiniteResult
local result = require("XEntity/XTransfinite/XTransfiniteResult").New()
_Result = result
result:SetDataFromLastResult(stageGroup)
XTransfiniteManager.RequestConfirmResult(result)
end
---@param result XTransfiniteResult
function XTransfiniteManager.RequestConfirmResult(result, callback)
if result:IsConfirm() then
if callback then
callback()
end
return
end
local stageGroupId = result:GetStageGroupId()
result:Confirm()
-- 最后一关,请求结算
if result:IsFinalStage() then
-- 因为没有confirm所以由客户端修改通关时间供结算界面使用
local stageId = result:GetStageId()
local stageGroup = result:GetStageGroup()
local stage = stageGroup:GetStage(stageId)
stage:SetPassedTime(result:GetClearTime())
XTransfiniteManager.RequestResult(stageGroupId)
return
end
--XTransfiniteManager.CloseUiSettle()
XNetwork.Call(RequestProto.Confirm, {
StageGroupId = stageGroupId,
}, function(res)
HandleConfirm(res)
if callback then
callback()
end
end)
end
function XTransfiniteManager.RequestResult(stageGroupId)
XNetwork.Call(RequestProto.Confirm, {
StageGroupId = stageGroupId,
}, HandleConfirm)
end
---@param stageGroup XTransfiniteStageGroup
function XTransfiniteManager.RequestGiveUpLastResult(stageGroup)
---@type XTransfiniteResult
local result = require("XEntity/XTransfinite/XTransfiniteResult").New()
_Result = result
result:SetDataFromLastResult(stageGroup)
XNetwork.Call(RequestProto.Confirm, {
StageGroupId = stageGroup:GetId(),
IsGiveUp = true
}, HandleConfirm)
end
function XTransfiniteManager.RequestFinishTask(id, cb)
if id then
XDataCenter.TaskManager.FinishTask(id, cb)
end
end
function XTransfiniteManager.RequestFinishMultiTask(taskIdList, cb)
if taskIdList and #taskIdList ~= 0 then
XDataCenter.TaskManager.FinishMultiTaskRequest(taskIdList, cb)
else
XUiManager.TipMsg(XUiHelper.GetText("TransfiniteNotRewardCanReceive"))
end
end
function XTransfiniteManager.GetRewardByTaskId(id, index)
local taskConfig = XTaskConfig.GetTaskCfgById(id)
local rewardId = taskConfig.RewardId
local rewardList = XRewardManager.GetRewardList(rewardId)
if rewardList then
if index then
local reward = rewardList[index]
if not reward then
XLog.Error(StringFormat("获取奖励物品失败! 奖励Id:%d, 奖励索引:%d", rewardId, index))
end
return reward
end
return rewardList
else
XLog.Error(StringFormat("获取奖励列表失败! 奖励Id:%d", rewardId))
end
end
---@param stageGroup XTransfiniteStageGroup
function XTransfiniteManager.RequestReset(stageGroup)
if not stageGroup then
return
end
local stage = stageGroup:GetCurrentStage()
if not stage then
XLog.Error("[XTransfiniteManager] current stage not found")
return
end
local stageGroupId = stageGroup:GetId()
---@type XTransfiniteResult
local result = require("XEntity/XTransfinite/XTransfiniteResult").New()
result:SetDataFromClient({
StageGroupId = stageGroupId,
})
result:SetIsSettle(true)
_Result = result
XNetwork.Call(RequestProto.Reset, {
StageGroupId = stageGroupId,
}, function(res)
HandleConfirm(res)
local team = stageGroup:GetTeam()
team:Reset()
end)
end
function XTransfiniteManager._ShowReward(winData)
local data = winData.SettleData
---@type XTransfiniteResult
local result = require("XEntity/XTransfinite/XTransfiniteResult").New()
result:SetDataFromServer(data)
_Result = result
XTransfiniteManager.ShowResult()
end
function XTransfiniteManager.ShowResult()
if _Data:IsForceExit() then
XTransfiniteManager.CheckForceExit(true)
return
end
if _Result then
XLuaUiManager.Open("UiTransfiniteBattleSettlement", _Result)
end
end
---@param result XTransfiniteResult
function XTransfiniteManager.ConfirmResult(result)
local stageGroupId = result:GetStageGroupId()
local stageGroup = _Data:GetStageGroupById(stageGroupId)
local team = stageGroup:GetTeam()
local stageId = result:GetStageId()
local stage = stageGroup:GetStage(stageId)
stage:SetPassed(result:IsWin())
stage:SetPassedTime(result:GetClearTime())
--stage:SetScore()
local index = stageGroup:GetStageIndex(stage)
stageGroup:SetCurrentIndex(index + 1)
team:SetCharacterData(result:GetCharacterData())
end
---@return XTransfiniteStageGroup
function XTransfiniteManager.GetStageGroupByStageId(stageId)
return _Data:GetStageGroupByStageId(stageId)
end
function XTransfiniteManager.Clear()
if _Debug then
return
end
_Result = nil
end
function XTransfiniteManager.CloseUiSettle()
XLuaUiManager.SafeClose("UiTransfiniteBattleSettlement")
end
function XTransfiniteManager.FinishFight(settleData)
if not settleData then
return
end
if not settleData.IsWin then
XDataCenter.FubenManager.ChallengeLose(settleData)
end
end
function XTransfiniteManager.CheckAutoExitFight(stageId)
return false
end
function XTransfiniteManager.CloseUi()
XUiManager.TipText("ActivityMainLineEnd")
XLuaUiManager.RunMain()
end
function XTransfiniteManager:ExGetIsLocked()
return not _Data:IsOpen()
end
function XTransfiniteManager:ExGetLockTip()
local functionNameType = self:ExGetFunctionNameType()
if functionNameType == nil then
return XUiHelper.GetText("CommonLockedTip")
end
if not XFunctionManager.JudgeCanOpen(functionNameType) then
return XFunctionManager.GetFunctionOpenCondition(functionNameType)
end
if _Data:IsLock4ActivityClose() then
return XUiHelper.GetText("ActivityBranchNotOpen")
end
end
function XTransfiniteManager:ExGetProgressTip()
local itemId = XDataCenter.ItemManager.ItemId.TransfiniteScore
local amount = XDataCenter.ItemManager.GetCount(itemId)
local limit = XDataCenter.ItemManager.GetMaxCount(itemId)
local itemName = XDataCenter.ItemManager.GetItemName(itemId)
return itemName .. ": " .. amount .. "/" .. limit
end
local function IsClear()
if not _Data:IsOpen() then
return false
end
-- 积分奖励
local region = XTransfiniteManager.GetRegion()
if not region:IsAllScoreRewardReceived() then
return false
end
-- 挑战奖励
if not region:IsAllChallengeRewardReceived() then
return false
end
-- 成就奖励
--local stageGroup = XTransfiniteManager.GetStageGroup()
--if not stageGroup:IsAchievementFinished() then
-- return false
--end
return true
end
-- 有积分奖励
function XTransfiniteManager.IsRewardScoreAchieved()
if not _Data:IsOpen() then
return false
end
local region = XTransfiniteManager.GetRegion()
if region:IsScoreRewardCanReceive() then
return true
end
return false
end
-- 有挑战奖励
function XTransfiniteManager.IsRewardChallengeAchieved()
if not _Data:IsOpen() then
return false
end
local region = XTransfiniteManager.GetRegion()
local taskGroupId = region:GetChallengeTaskGroupId()
if XTransfiniteManager.GetTaskIsAchievedByTaksGroupId(taskGroupId) then
return true
end
return false
end
-- 有成就奖励
function XTransfiniteManager.IsRewardAchievementAchieved()
if not _Data:IsOpen() then
return false
end
local stageGroup = XTransfiniteManager.GetStageGroup()
if stageGroup:IsAchievementAchieved() then
return true
end
return false
end
function XTransfiniteManager:ExCheckIsFinished(cb)
local value = IsClear()
-- 下面这段代码是为了FubenManagerEx使用
self.IsClear = value
if cb then
cb(self.IsClear)
end
return self.IsClear
end
-- 获取倒计时
function XTransfiniteManager:ExGetRunningTimeStr()
if not _Data:IsOpen() then
return false
end
local remainTime = _Data:GetEndTime() - XTime.GetServerNowTimestamp()
remainTime = math.max(remainTime, 0)
local timeText = XUiHelper.GetTime(remainTime, XUiHelper.TimeFormatType.CHALLENGE)
return CS.XTextManager.GetText("BossSingleLeftTimeIcon", timeText)
end
function XTransfiniteManager.ExitFight()
CS.XFight.ExitForClient(true)
XEventManager.DispatchEvent(XEventId.EVENT_TRANSFINITE_HIDE_SETTLE)
end
function XTransfiniteManager.CheckForceExit(isResult)
if _Data:IsForceExit() then
if XFightUtil.IsFighting() then
-- 因为结算时, 使用了战斗结算动作, 作为背景, 所以战斗仍未退出
if isResult or XLuaUiManager.IsUiShow("UiTransfiniteBattleSettlement") then
XTransfiniteManager.ExitFight()
else
return
end
end
_Data:ClearForceExit()
if XTransfiniteManager.IsUiShowed() then
XLuaUiManager.RunMain()
XUiManager.TipText("ActivityMainLineEnd")
end
end
end
function XTransfiniteManager.GetScore()
local itemId = XDataCenter.ItemManager.ItemId.TransfiniteScore
return XDataCenter.ItemManager.GetCount(itemId)
end
function XTransfiniteManager.GetScoreLimit()
local itemId = XDataCenter.ItemManager.ItemId.TransfiniteScore
return XDataCenter.ItemManager.GetMaxCount(itemId)
end
local function OnReceiveReward(res)
if res.Code ~= XCode.Success then
return
end
local region = XTransfiniteManager.GetRegion()
region:SetRewardReceivedFromServer(res.GotScoreRewardIndex)
if res.RewardGoodsList then
XUiManager.OpenUiObtain(res.RewardGoodsList)
end
XEventManager.DispatchEvent(XEventId.EVENT_TRANSFINITE_SCORE_REWARD)
end
function XTransfiniteManager.RequestReceiveAllScoreReward()
local region = XTransfiniteManager.GetRegion()
local list = region:GetScoreRewardIndexCanReceive()
XNetwork.Call(RequestProto.ReceiveReward, {
ScoreRewardIndex = list,
}, OnReceiveReward)
end
function XTransfiniteManager.RequestReceiveScoreReward(rewardIndex)
XNetwork.Call(RequestProto.ReceiveReward, {
ScoreRewardIndex = {
rewardIndex - 1
},
}, OnReceiveReward)
end
local _IsUiShow = false
function XTransfiniteManager.SetUiShowed(value)
_IsUiShow = value
end
function XTransfiniteManager.IsUiShowed()
return _IsUiShow
end
function XTransfiniteManager.CallFinishFight()
if _Data:IsForceExit() then
XDataCenter.FubenManager.HandleBeforeFinishFight()
_Data:ClearForceExit()
XLuaUiManager.SafeClose("UiTransfiniteBattlePrepare")
XLuaUiManager.SafeClose("UiTransfiniteMain")
XUiManager.TipText("ActivityMainLineEnd")
return
end
XDataCenter.FubenManager.CallFinishFight()
end
XEventManager.AddEventListener(XEventId.EVENT_FUBEN_SETTLE_REWARD, function(settleData)
if not settleData then
XDataCenter.TransfiniteManager.ExitFight()
return
end
local stageId = settleData.StageId
if XTransfiniteConfigs.IsStageExist(stageId) then
if settleData.IsWin then
XTransfiniteManager._ShowReward({
SettleData = settleData
})
else
XDataCenter.TransfiniteManager.ExitFight()
end
end
end)
return XTransfiniteManager
end
XRpc.NotifyTransfiniteData = function(res)
XDataCenter.TransfiniteManager.InitFromServerData(res)
end