PGRData/Script/matrix/xentity/xbiancatheatre/adventure/XAdventureChapter.lua
2024-09-01 22:49:41 +02:00

394 lines
No EOL
12 KiB
Lua
Raw 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 XAdventureRole = require("XEntity/XBiancaTheatre/Adventure/XAdventureRole")
local XAdventureStep = require("XEntity/XBiancaTheatre/Adventure/XAdventureStep")
local XAdventureChapter = XClass(nil, "XAdventureChapter")
--当前章节数据管理
function XAdventureChapter:Ctor(id)
self:UpdateChapterId(id)
-- 步骤
self.Step = {}
self.StepDic = {}
-- 当前招募刷新的次数
self.RefreshRoleCount = self:GetRefreshRoleMaxCount()
-- 当前可招募的角色 XAdventureRole
self.RecruitRoleDic = nil
-- 等待选择的技能PS:在选择技能期间重登会拥有部分数据
self.WaitSelectableSkillIds = nil
-- 已通关节点数
self.CurrentPassNodeCount = 0
-- 是否已准备好
self.IsReady = false
-- 完成战斗节点数
self.PassFightCount = 0
-- 当前章节是否已通关
self.PassChapter = 0
end
function XAdventureChapter:UpdateChapterId(chapterId)
if self.CurrentChapterId == chapterId then
return
end
self.CurrentChapterId = chapterId
self.Config = XBiancaTheatreConfigs.GetBiancaTheatreChapter(chapterId)
end
function XAdventureChapter:SetIsReady(value)
self.IsReady = value
end
function XAdventureChapter:GetIsReady()
return self.IsReady
end
function XAdventureChapter:GetId()
return self.Config.Id
end
function XAdventureChapter:GetCurrentNodeId()
local step = self:GetCurStep()
if not step then
return
end
return step:GetCurrentNodeId()
end
function XAdventureChapter:InitWithServerData(data)
-- 更新当前步骤数据
for _, stepData in ipairs(data.Steps) do
self:AddStep(stepData)
end
self.CurrentPassNodeCount = data.PassNodeCount
self.PassFightCount = data.PassFightCount
self.PassChapter = data.PassChapter
self:UpdateRecruitRoleDic()
end
-- 更新已刷新出来的角色
function XAdventureChapter:UpdateRecruitRoleDic()
local step = self:GetCurStep()
if not step then
return
end
-- 更新已刷新出来的角色
self.RecruitRoleDic = {}
for index, roleId in ipairs(step:GetRefreshCharacterIds()) do
if roleId > 0 then
self.RecruitRoleDic[index] = XAdventureRole.New(roleId)
end
end
end
--新的步骤
--stepDataXAdventureStep
function XAdventureChapter:AddStep(stepData)
table.insert(self.Step, XAdventureStep.New(stepData))
self.StepDic[stepData.Uid] = self.Step[#self.Step]
end
function XAdventureChapter:UpdateWaitSelectableSkillIds(value)
self.WaitSelectableSkillIds = value
end
function XAdventureChapter:GetWaitSelectableSkillIds()
return self.WaitSelectableSkillIds
end
function XAdventureChapter:AddPassNodeCount(value)
self.CurrentPassNodeCount = self.CurrentPassNodeCount + value
end
function XAdventureChapter:GetCurrentPassNodeCount()
return self.CurrentPassNodeCount
end
-- 更新下一个事件节点
function XAdventureChapter:UpdateNextEventNode(node, newData)
for _, step in ipairs(self.Step) do
if not step:IsOverdue() then
step:UpdateNextEventNode(node, newData)
return
end
end
end
-- 获得一个未完成的步骤
function XAdventureChapter:GetCurStep()
local step
for i = #self.Step, 1, -1 do
step = self.Step[i]
if not step:IsOverdue() then
return step
end
end
end
-- 根据唯一Id获得步骤
function XAdventureChapter:GetStepByUid(uid)
return self.StepDic[uid]
end
function XAdventureChapter:GetEventNode(evenId)
for _, node in ipairs(self:GetCurrentNodes()) do
if node:GetNodeType() == XBiancaTheatreConfigs.NodeType.Event
and node:GetEventId() == evenId then
return node
end
end
end
function XAdventureChapter:GetCurrentNode(step)
for _, node in ipairs(self:GetCurrentNodes(step)) do
if node:GetIsSelected() then
return node
end
end
end
function XAdventureChapter:GetIsHasNodeSelected()
for _, node in ipairs(self:GetCurrentNodes()) do
if node:GetIsSelected() then
return true
end
end
return false
end
function XAdventureChapter:GetIsOpen()
return true
end
function XAdventureChapter:GetOpenIndexIcon()
return self.Config.OpenIndexIcon
end
function XAdventureChapter:GetOpenTitleIcon()
return self.Config.OpenTitleIcon
end
function XAdventureChapter:GetOpenBg()
return self.Config.OpenBg
end
-- 开幕标题
function XAdventureChapter:GetTitle()
return self.Config.Name
end
function XAdventureChapter:GetCurrentNodes(step)
local step = step or self:GetCurStep()
return step and step:GetCurrentNodes() or {}
end
-- 获取招募剩余数量
function XAdventureChapter:GetRecruitCount()
local step = self:GetCurStep()
if not step then
return 0
end
return step:GetRecruitCount() - step:GetCurRecruitCount()
end
-- 获取是否能够进入玩法
function XAdventureChapter:GetIsCanEnterGame()
-- 招满人了,可以进了
if self:GetRecruitCount() <= 0 then
return true
end
local adventureManager = XDataCenter.BiancaTheatreManager.GetCurrentAdventureManager()
local step = self:GetCurStep()
-- 是否可以跳过招募直接进入玩法
local selectTickId = adventureManager:GetSelectTickId()
if XTool.IsNumberValid(selectTickId) and step then
local leastRecruitCount = XBiancaTheatreConfigs.GetRecruitTicketLeastRecruitCount(selectTickId)
if step:GetCurRecruitCount() >= leastRecruitCount then
return true
end
end
local hasRoleRecruit = false
for _, role in pairs(self:GetRecruitRoleDic()) do
if adventureManager:GetRole(role:GetId()) == nil then
hasRoleRecruit = true
break
end
end
-- 没招满人但刷新次数为0或没人可以招了也可以进了
if self:GetRefreshRoleCount() <= 0 or not hasRoleRecruit then
return true
end
return false
end
-- 获取招募剩余刷新数量
function XAdventureChapter:GetRefreshRoleCount()
local step = self:GetCurStep()
if not step then
return 0
end
return step:GetRefreshCount() - step:GetCurRefreshCount()
end
-- 获得招募刷新最大数量
function XAdventureChapter:GetRefreshRoleMaxCount()
local step = self:GetCurStep()
if not step then
return 0
end
return step:GetRefreshCount()
end
-- 获取当前章节可招募的角色
function XAdventureChapter:GetRecruitRoleDic()
return self.RecruitRoleDic or {}
end
function XAdventureChapter:GetBeginStoryId()
return self.Config.BeginStory
end
function XAdventureChapter:GetEndStoryId()
return self.Config.EndStory
end
function XAdventureChapter:GetCurrentChapterId()
return self.CurrentChapterId
end
function XAdventureChapter:CheckHasMovieNode()
for _, node in ipairs(self:GetCurrentNodes()) do
if node:GetNodeType() == XBiancaTheatreConfigs.NodeType.Movie then
return true
end
end
return false
end
--######################## 协议 begin ########################
-- 请求招募角色
function XAdventureChapter:RequestRecruitRole(id, callback, isDecay)
-- 检查是否满足招募数次
if self:GetRecruitCount() <= 0 then
return
end
local requestBody = {
CharacterId = id,
}
XNetwork.CallWithAutoHandleErrorCode("BiancaTheatreRecruitCharacterRequest", requestBody, function(res)
XDataCenter.BiancaTheatreManager.GetCurrentAdventureManager():AddRoleById(id, nil, true, isDecay)
local step = self:GetCurStep()
if step then
step:UpdateCurRecruitCount(step:GetCurRecruitCount() + 1)
step:UpdateRecruitCharacterId(requestBody.CharacterId)
end
if callback then callback() end
XEventManager.DispatchEvent(XEventId.EVENT_THEATRE_RECRUIT_COMPLETE)
if not isDecay then
XUiManager.TipText("TheatreRecruitComplete")
end
end)
end
-- 请求刷新角色
function XAdventureChapter:RequestRefreshRoles(calllback, showTip)
if showTip == nil then showTip = true end
XNetwork.Call("BiancaTheatreRecruitRefreshRequest", nil, function(res)
if res.Code ~= XCode.Success then
-- 完全没有招募角色的时候刷新要处理招募次数
if res.Code == 20176010 then
-- 数据处理
local step = self:GetCurStep()
if step then
-- 刷新剩余招募刷新次数
step:UpdateCurRefreshCount(step:GetCurRefreshCount() + 1)
step:InitRecruitCharacterId()
end
-- ui刷新回调
if calllback then calllback() end
end
XUiManager.TipCode(res.Code)
return
end
local step = self:GetCurStep()
local characterIds = res.CharacterIds
if step then
-- 刷新剩余招募刷新次数
step:UpdateCurRefreshCount(step:GetCurRefreshCount() + 1)
step:InitRecruitCharacterId()
end
self.RecruitRoleDic = nil
self.RecruitRoleDic = {}
for index, roleId in ipairs(characterIds) do
if roleId > 0 then
self.RecruitRoleDic[index] = XAdventureRole.New(roleId)
end
end
if calllback then calllback() end
if showTip then
XUiManager.TipText("TheatreRecruitRefreshComplete")
end
end)
end
--选择节点
function XAdventureChapter:RequestTriggerNode(id, callback)
local requestBody = {
NodeId = self:GetCurrentNodeId(),
SlotId = id
}
XNetwork.CallWithAutoHandleErrorCode("BiancaTheatreSelectNodeRequest", requestBody, function(res)
if callback then callback() end
end)
end
-- 招募券列表————选择招募券
function XAdventureChapter:RequestSelectRecruitTick(tickId, callback)
local requestBody = {
TickId = tickId, --招募券ID
}
XNetwork.CallWithAutoHandleErrorCode("BiancaTheatreSelectRecruitTickRequest", requestBody, function(res)
if callback then callback(res) end
end)
end
-- 招募角色-结束招募
function XAdventureChapter:RequestEndRecruit()
local adventureManager = XDataCenter.BiancaTheatreManager.GetCurrentAdventureManager()
local curStep = adventureManager:GetCurrentChapter():GetCurStep()
local rootUiStep = self:GetStepByUid(curStep:GetRootUid())
local stepType = rootUiStep and rootUiStep:GetStepType()
--上一个步骤(招募中重新登录)或当前步骤(从招募券选择界面进入招募界面)是招募券选择,则显示过渡界面
local isShowLoading = curStep:GetRootStepType() == XBiancaTheatreConfigs.XStepType.SelectRecruitTicket or
curStep:GetStepType() == XBiancaTheatreConfigs.XStepType.SelectRecruitTicket
local isCheckOpen = stepType == XBiancaTheatreConfigs.XStepType.FightReward or
stepType == XBiancaTheatreConfigs.XStepType.Node or
isShowLoading
curStep:SetOverdue(1)
XNetwork.Call("BiancaTheatreEndRecruitRequest", nil, function(res)
if res.Code ~= XCode.Success then
curStep:SetOverdue(0)
XUiManager.TipCode(res.Code)
return
end
-- 招募获得道具数据处理
if not (XTool.IsTableEmpty(res.BiancaTheatreItems)) then
local itemIdList = {}
for _, item in ipairs(res.BiancaTheatreItems) do
table.insert(itemIdList, item.ItemId)
end
XDataCenter.BiancaTheatreManager.AddTipOpenData("UiBiancaTheatreTipReward", nil, nil, nil, nil, nil, itemIdList)
end
if isCheckOpen then
XDataCenter.BiancaTheatreManager.CheckOpenView(true, isShowLoading)
end
end)
end
--######################## 协议 end ########################
return XAdventureChapter