PGRData/Script/matrix/xentity/xbiancatheatre/adventure/XAdventureStep.lua

301 lines
9.4 KiB
Lua
Raw Normal View History

2024-09-01 20:49:41 +00:00
local XAMovieNode = require("XEntity/XBiancaTheatre/Adventure/Node/XAMovieNode")
local XABattleNode = require("XEntity/XBiancaTheatre/Adventure/Node/XABattleNode")
local XAShopNode = require("XEntity/XBiancaTheatre/Adventure/Node/XAShopNode")
local XAEventNode = require("XEntity/XBiancaTheatre/Adventure/Node/Event/XAEventNode")
local XABattleEventNode = require("XEntity/XBiancaTheatre/Adventure/Node/Event/XABattleEventNode")
local XAGlobalRewardEventNode = require("XEntity/XBiancaTheatre/Adventure/Node/Event/XAGlobalRewardEventNode")
local XALocalRewardEventNode = require("XEntity/XBiancaTheatre/Adventure/Node/Event/XALocalRewardEventNode")
local XASelectableEventNode = require("XEntity/XBiancaTheatre/Adventure/Node/Event/XASelectableEventNode")
local XATalkEventNode = require("XEntity/XBiancaTheatre/Adventure/Node/Event/XATalkEventNode")
local XMovieEventNode = require("XEntity/XBiancaTheatre/Adventure/Node/Event/XMovieEventNode")
local XARewardNode = require("XEntity/XBiancaTheatre/Adventure/Node/XARewardNode")
--肉鸽2.0步骤
local XAdventureStep = XClass(nil, "XAdventureStep")
local NodeType2Class = {
[XBiancaTheatreConfigs.NodeType.Fight] = XABattleNode,
[XBiancaTheatreConfigs.NodeType.Event] = {
[XBiancaTheatreConfigs.EventNodeType.Talk] = XATalkEventNode,
[XBiancaTheatreConfigs.EventNodeType.Selectable] = XASelectableEventNode,
[XBiancaTheatreConfigs.EventNodeType.LocalReward] = XALocalRewardEventNode,
[XBiancaTheatreConfigs.EventNodeType.GlobalReward] = XAGlobalRewardEventNode,
[XBiancaTheatreConfigs.EventNodeType.Battle] = XABattleEventNode,
[XBiancaTheatreConfigs.EventNodeType.Movie] = XMovieEventNode,
[XBiancaTheatreConfigs.EventNodeType.FightNoSkill] = XABattleEventNode,
},
[XBiancaTheatreConfigs.NodeType.Shop] = XAShopNode,
}
local CreateNode = function(data)
local classDefine = NodeType2Class[data.SlotType]
if data.SlotType == XBiancaTheatreConfigs.NodeType.Event then
local config = XBiancaTheatreConfigs.GetEventNodeConfig(data.EventId, data.CurStepId)
if config == nil then
return
end
classDefine = classDefine[config.Type]
end
local result = classDefine.New()
result:InitWithServerData(data)
return result
end
function XAdventureStep:Ctor(data)
--唯一ID
self.Uid = data.Uid
--步骤类型, XBiancaTheatreConfigs.XStepType
self.StepType = data.StepType
--上级步骤UID例如招募角色的上级步骤是招募券选择
self.RootUid = data.RootUid
--当前步骤是否已过期,例如招募角色步骤完成后,当前步骤过期
self:SetOverdue(data.Overdue)
--====================道具箱奖励, 3选1==============
--肉鸽物品ID
self.ItemIds = data.ItemIds
--已选择道具ID
self.SelectedItemId = data.SelectedItemId
--是否是章节额外奖励
self.IsExTraReward = data.IsExtraReward
--====================招募券选择================
self.TickIds = data.TickIds
--====================招募角色==================
--招募券ID
local tickId = data.TickId
self.TickId = tickId
if XTool.IsNumberValid(tickId) then
XDataCenter.BiancaTheatreManager.GetCurrentAdventureManager():UpdateSelectTickId(tickId)
end
--已刷新的角色
self.RefreshCharacterIds = data.RefreshCharacterIds
--已招募的角色
self:InitRecruitCharacterId()
-- 触发保底的索引
self.FloorIndexes = data.FloorIndexes
for _, characterId in ipairs(data.RecruitCharacterIds) do
self:UpdateRecruitCharacterId(characterId)
end
--刷新次数
self.RefreshCount = data.RefreshCount
--已招募次数
self.RecruitCount = data.RecruitCount
--当前刷新次数
self:UpdateCurRefreshCount(data.CurRefreshCount)
--当前招募次数
self:UpdateCurRecruitCount(data.CurRecruitCount)
--=====================节点=======================
--节点数据
self:UpdateCurrentNode(data.NodeData)
--=====================战斗后奖励选择=================
--奖励界面里的选项,金币组,道具箱,招募券
self:UpdateFightRewards(data.FightRewards)
end
function XAdventureStep:InitRecruitCharacterId()
self.RecruitCharacterIdDic = {}
end
function XAdventureStep:UpdateRecruitCharacterId(characterId)
self.RecruitCharacterIdDic[characterId] = true
end
function XAdventureStep:SetOverdue(overdue)
self.Overdue = overdue
end
function XAdventureStep:UpdateCurRefreshCount(curRefreshCount)
self.CurRefreshCount = curRefreshCount
end
function XAdventureStep:UpdateCurRecruitCount(curRecruitCount)
self.CurRecruitCount = curRecruitCount
end
function XAdventureStep:UpdateFightRewards(fightRewards)
self.FightRewards = {}
for _, value in ipairs(fightRewards) do
table.insert(self.FightRewards, XARewardNode.New(value))
end
end
function XAdventureStep:UpdateCurrentNode(data)
if not data then
return
end
self.CurrentNodes = {}
self.CurrentNodeId = data.NodeId
for _, nodeSlot in ipairs(data.Slots) do
--事件节点的当前步骤Id最后一个步骤结束后会置为0
if nodeSlot.SlotType == XBiancaTheatreConfigs.NodeType.Event and not XTool.IsNumberValid(nodeSlot.CurStepId) then
goto continue
end
local newNode = CreateNode(nodeSlot)
if newNode then
table.insert(self.CurrentNodes, newNode)
else
XLog.Error("找不到对应的节点数据:", nodeSlot)
end
:: continue ::
end
end
function XAdventureStep:GetCurrentNodes()
return self.CurrentNodes or {}
end
--获得已选择的节点类型
function XAdventureStep:GetSelectNodeType()
for _, node in ipairs(self:GetCurrentNodes()) do
if node:GetIsSelected() then
return node:GetNodeType()
end
end
end
function XAdventureStep:GetCurrentNodeId()
return self.CurrentNodeId
end
-- 更新下一个事件节点
function XAdventureStep:UpdateNextEventNode(node, newData)
for index, value in ipairs(self:GetCurrentNodes()) do
if value == node then
local newNode = CreateNode(newData)
if newNode then
self.CurrentNodes[index] = newNode
return self.CurrentNodes[index]
else
table.remove(self.CurrentNodes, index)
return nil
end
end
end
end
function XAdventureStep:GetStepType()
return self.StepType
end
function XAdventureStep:GetRootUid()
return self.RootUid
end
function XAdventureStep:GetIsExTraReward()
return self.IsExTraReward
end
function XAdventureStep:GetRootStepType()
local curChapter = XDataCenter.BiancaTheatreManager.GetCurrentAdventureManager():GetCurrentChapter(false)
if not curChapter then
return
end
local rootStep = curChapter:GetStepByUid(self:GetRootUid())
return rootStep and rootStep:GetStepType()
end
--获得步骤根节点是否是选项事件
function XAdventureStep:GetRootStepIsSelectableEvent()
local curChapter = XDataCenter.BiancaTheatreManager.GetCurrentAdventureManager():GetCurrentChapter(false)
if not curChapter then
return false
end
local rootStep = curChapter:GetStepByUid(self:GetRootUid())
if not rootStep then
return false
end
if rootStep:GetStepType() ~= XBiancaTheatreConfigs.XStepType.Node then
return false
end
local curNode = curChapter:GetCurrentNode(rootStep)
return curNode and curNode:GetNodeType() == XBiancaTheatreConfigs.EventNodeType.Selectable
end
function XAdventureStep:IsOverdue()
return XTool.IsNumberValid(self.Overdue)
end
function XAdventureStep:GetItemIds()
return self.ItemIds
end
function XAdventureStep:GetSelectedItemId()
return self.SelectedItemId
end
function XAdventureStep:GetTickIds()
table.sort(self.TickIds, function(idA, idB)
local qualityA = XBiancaTheatreConfigs.GetRecruitTicketQuality(idA)
local qualityB = XBiancaTheatreConfigs.GetRecruitTicketQuality(idB)
if qualityA ~= qualityB then
return qualityA > qualityB
end
return idA < idB
end)
return self.TickIds
end
function XAdventureStep:GetTickId()
return self.TickId
end
function XAdventureStep:GetRefreshCharacterIds()
return self.RefreshCharacterIds
end
function XAdventureStep:GetFloorIndexes()
return self.FloorIndexes
end
--角色是否已招募
function XAdventureStep:IsRecruitCharacter(characterId)
return self.RecruitCharacterIdDic[characterId] or false
end
function XAdventureStep:GetRefreshCount()
return self.RefreshCount
end
function XAdventureStep:GetRecruitCount()
return self.RecruitCount
end
function XAdventureStep:GetCurRefreshCount()
return self.CurRefreshCount
end
function XAdventureStep:GetCurRecruitCount()
return self.CurRecruitCount
end
function XAdventureStep:GetNodeData()
return self.NodeData
end
function XAdventureStep:GetFightRewards()
return self.FightRewards
end
--获得未领取的战斗奖励列表
function XAdventureStep:GetNotReceivedFightRewards()
local notReceivedFightRewards = {}
local fightRewards = self:GetFightRewards()
for _, fightReward in ipairs(fightRewards) do
if not fightReward:IsReceived() then
table.insert(notReceivedFightRewards, fightReward)
end
end
return notReceivedFightRewards
end
return XAdventureStep