PGRData/Script/matrix/xentity/xcharactertower/XCharacterTowerRelation.lua
2024-09-01 22:49:41 +02:00

205 lines
7 KiB
Lua

---@class XCharacterTowerRelation
local XCharacterTowerRelation = XClass(nil, "XCharacterTowerRelation")
function XCharacterTowerRelation:Ctor(relationId)
self:UpdateRelationId(relationId)
end
function XCharacterTowerRelation:UpdateRelationId(relationId)
self.RelationId = relationId
self.Config = XFubenCharacterTowerConfigs.GetRelationConfig(relationId)
self.ConfigDetail = XFubenCharacterTowerConfigs.GetRelationDetailConfig(relationId)
end
---@return XCharacterTowerRelationInfo
function XCharacterTowerRelation:GetRelationInfo()
return XDataCenter.CharacterTowerManager.GetCharacterTowerRelationInfo(self.RelationId)
end
function XCharacterTowerRelation:GetRelationConditionIds()
return self.Config.Conditions or {}
end
function XCharacterTowerRelation:GetRelationFightEventIds()
return self.Config.FightEventIds or {}
end
function XCharacterTowerRelation:GetRelationStoryIdByIndex(index)
local storyIds = self.Config.StoryIds or {}
local storyId = storyIds[index] or ""
if storyId == "-1" then
storyId = ""
end
return storyId
end
function XCharacterTowerRelation:GetRelationFinishNumByIndex(index)
local num = self.Config.FinishNums or {}
return num[index] or 0
end
--region 羁绊详情配置
function XCharacterTowerRelation:GetRelationFettersPrefab()
return self.ConfigDetail.FettersPrefab or ""
end
function XCharacterTowerRelation:GetRelationFettersTitleByIndex(index)
local title = self.ConfigDetail.FettersTitles or {}
return title[index] or ""
end
function XCharacterTowerRelation:GetRelationFettersDescribeByIndex(index)
local desc = self.ConfigDetail.FettersDescribes or {}
return desc[index] or ""
end
function XCharacterTowerRelation:GetRelationConditionTitleByIndex(index)
local titles = self.ConfigDetail.ConditionTitles or {}
return titles[index] or ""
end
function XCharacterTowerRelation:GetRelationConditionSkipIdByIndex(index)
local skipIds = self.ConfigDetail.ConditionSkipId or {}
return skipIds[index] or 0
end
--endregion
-- 获取条件的标题
function XCharacterTowerRelation:GetRelationConditionTitleByConditionId(conditionId)
local conditionIds = self:GetRelationConditionIds()
local isContain, index = table.contains(conditionIds, conditionId)
if isContain then
return self:GetRelationConditionTitleByIndex(index)
end
return ""
end
-- 获取条件的跳转Id
function XCharacterTowerRelation:GetRelationConditionSkipIdByConditionId(conditionId)
local conditionIds = self:GetRelationConditionIds()
local isContain, index = table.contains(conditionIds, conditionId)
if isContain then
return self:GetRelationConditionSkipIdByIndex(index)
end
return 0
end
-- 获取羁绊进度
function XCharacterTowerRelation:GetRelationProgress()
local finishCount = 0
local totalCount = 0
local relationInfo = self:GetRelationInfo()
local fightEventIds = self:GetRelationFightEventIds()
totalCount = totalCount + #fightEventIds
for index, eventId in pairs(fightEventIds) do
if eventId > 0 then
if relationInfo:CheckRelationUnlock(eventId) then
finishCount = finishCount + 1
end
else
local storyId = self:GetRelationStoryIdByIndex(index)
if not string.IsNilOrEmpty(storyId) and relationInfo:CheckStoryPlayed(storyId) then
finishCount = finishCount + 1
end
end
end
return finishCount, totalCount
end
-- 检查是否有已完成未激活的羁绊
function XCharacterTowerRelation:CheckRelationNotActive(characterId)
local relationInfo = self:GetRelationInfo()
local fightEventIds = self:GetRelationFightEventIds()
local totalFinishNum = self:GetConditionFinishNums(characterId)
for index, eventId in ipairs(fightEventIds) do
local num = self:GetRelationFinishNumByIndex(index)
if eventId > 0 then
if not relationInfo:CheckRelationUnlock(eventId) and num <= totalFinishNum then
return true, index
end
else
local storyId = self:GetRelationStoryIdByIndex(index)
if not string.IsNilOrEmpty(storyId) and not relationInfo:CheckStoryPlayed(storyId) and num <= totalFinishNum then
return true, index
end
end
end
return false, 0
end
-- 获取条件完成的个数
function XCharacterTowerRelation:GetConditionFinishNums(characterId)
local finishCount = 0
local conditionIds = self:GetRelationConditionIds()
for _, conditionId in pairs(conditionIds) do
local result, _ = self:CheckFinishCondition(conditionId, characterId)
if result then
finishCount = finishCount + 1
end
end
return finishCount
end
-- 返回 1已播放的数目、2完成任务的数目、3完成未播放的条件
function XCharacterTowerRelation:GetPlayConditionAndFinishConditionNums(characterId)
local playCount = 0
local finishCount = 0
local unPlayConditions = {}
local conditionIds = self:GetRelationConditionIds()
for _, conditionId in pairs(conditionIds) do
local isOpen, _ = self:CheckFinishCondition(conditionId, characterId)
if isOpen then
if XDataCenter.CharacterTowerManager.CheckRelationTaskPlayAnim(conditionId) then
playCount = playCount + 1
else
table.insert(unPlayConditions, conditionId)
end
finishCount = finishCount + 1
end
end
table.sort(unPlayConditions,function(a, b)
return a < b
end)
return playCount, finishCount, unPlayConditions
end
-- 检查羁绊是否激活
function XCharacterTowerRelation:CheckRelationActive(eventId, index)
local relationInfo = self:GetRelationInfo()
local fetterActive = false
if eventId > 0 then
fetterActive = relationInfo:CheckRelationUnlock(eventId)
else
local storyId = self:GetRelationStoryIdByIndex(index)
if not string.IsNilOrEmpty(storyId) then
fetterActive = relationInfo:CheckStoryPlayed(storyId)
end
end
return fetterActive
end
-- 检查未播放的条件和已激活的羁绊是否相等
function XCharacterTowerRelation:CheckPlayAnimCondition(characterId)
local playCount, finishCount, unPlayConditions = self:GetPlayConditionAndFinishConditionNums(characterId)
local fetterActive = self:GetRelationProgress()
if playCount < fetterActive and fetterActive <= finishCount then
for i = 1, fetterActive - playCount do
local conditionId = unPlayConditions[i]
XDataCenter.CharacterTowerManager.SaveRelationTaskPlayAnim(conditionId)
end
end
end
function XCharacterTowerRelation:CheckFinishCondition(conditionId, characterId)
local relationInfo = self:GetRelationInfo()
local isFinish = relationInfo:CheckFinishCondition(conditionId)
local isOpen, desc = XConditionManager.CheckCondition(conditionId, characterId)
return isFinish or isOpen, desc
end
return XCharacterTowerRelation