forked from endernon/PGRData
495 lines
15 KiB
Lua
495 lines
15 KiB
Lua
|
-- 虚像地平线组合对象
|
|||
|
local XExpeditionCombo = XClass(nil, "XExpeditionCombo")
|
|||
|
local FunctionName = {
|
|||
|
[1] = "MemberNum", -- 检查合计数量
|
|||
|
[2] = "TotalRank", -- 检查合计等级
|
|||
|
[3] = "TargetRank", -- 高于指定等级
|
|||
|
[4] = "MemberNumAndTotalRank", -- 检查合计数量且检查合计等级
|
|||
|
}
|
|||
|
local ComboLevel = {
|
|||
|
[1] = "Ⅰ",
|
|||
|
[2] = "Ⅱ",
|
|||
|
[3] = "Ⅲ",
|
|||
|
[4] = "Ⅳ",
|
|||
|
}
|
|||
|
|
|||
|
local SortByIdFunc = function(a, b)
|
|||
|
return a.Id < b.Id
|
|||
|
end
|
|||
|
|
|||
|
local SortByBaseIdFunc = function(a, b)
|
|||
|
return a.EChara:GetBaseId() <= b.EChara:GetBaseId()
|
|||
|
end
|
|||
|
|
|||
|
local SortByLevelFunc = function(a, b)
|
|||
|
return a.EChara:GetRank() < b.EChara:GetRank()
|
|||
|
end
|
|||
|
|
|||
|
local SortByLevelAndBaseIdFunc = function(a, b)
|
|||
|
if a.IsBlank then return false end
|
|||
|
if b.IsBlank then return true end
|
|||
|
if not a.IsActive and b.IsActive then return false end
|
|||
|
if not b.IsActive and a.IsActive then return true end
|
|||
|
local rankA = a.EChara:GetRank()
|
|||
|
local rankB = b.EChara:GetRank()
|
|||
|
if rankA ~= rankB then
|
|||
|
return rankA < rankB
|
|||
|
else
|
|||
|
return a.EChara:GetBaseId() < b.EChara:GetBaseId()
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local SortByBaseIdAndActiveFunc = function(a, b)
|
|||
|
if not a.IsActive and b.IsActive then return true end
|
|||
|
return a.EChara:GetBaseId() < b.EChara:GetBaseId()
|
|||
|
end
|
|||
|
--================
|
|||
|
--构造函数
|
|||
|
--================
|
|||
|
function XExpeditionCombo:Ctor(comboCfg, team)
|
|||
|
self.Team = team
|
|||
|
self:InitCombo(comboCfg)
|
|||
|
self.Phase = 1
|
|||
|
self.IsActive = false
|
|||
|
end
|
|||
|
--================
|
|||
|
--初始化羁绊
|
|||
|
--================
|
|||
|
function XExpeditionCombo:InitCombo(comboCfg)
|
|||
|
self.ComboCfg = comboCfg
|
|||
|
local phaseCombo = XExpeditionConfig.GetComboByChildComboId(comboCfg.Id)
|
|||
|
self.PhaseCombo = {}
|
|||
|
for _, phaseCfg in pairs(phaseCombo) do
|
|||
|
table.insert(self.PhaseCombo, phaseCfg)
|
|||
|
end
|
|||
|
table.sort(self.PhaseCombo, SortByIdFunc)
|
|||
|
self.PhaseNum = #self.PhaseCombo
|
|||
|
self.CheckList = {}
|
|||
|
self.CheckListLength = 0
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取羁绊Id
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetComboId()
|
|||
|
return self.ComboCfg and self.ComboCfg.Id
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取羁绊名称
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetName()
|
|||
|
return self.ComboCfg and self.ComboCfg.Name or "UnNamed"
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取是否预设队伍羁绊
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetDefaultTeamId()
|
|||
|
return self.ComboCfg and self.ComboCfg.DefaultTeamId or 0
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取羁绊有效层数
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetPhase()
|
|||
|
return self.Phase
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取羁绊阶段详细
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetPhaseCombo()
|
|||
|
return self.PhaseCombo
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取预览羁绊是否提升
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetPreviewUp()
|
|||
|
return ((not self:GetComboActive()) and self:GetPreviewActive()) or (self.PreviewPhase > self:GetPhase())
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取预览羁绊是否有效
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetPreviewActive()
|
|||
|
return self.PreviewActive
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取羁绊是否有效
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetComboActive()
|
|||
|
return self.IsActive
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取羁绊总层数
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetPhaseNum()
|
|||
|
return self.PhaseNum
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取羁绊分类
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetComboTypeId()
|
|||
|
return self.ComboCfg and self.ComboCfg.ComboTypeId or 1
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取羁绊现层数展示字符串(格式例子:"1/4") 当满级时显示MAX
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetCurrentPhaseStr()
|
|||
|
if self.Phase >= self.PhaseNum then
|
|||
|
return "MAX"
|
|||
|
else
|
|||
|
-- 当前等级的星级
|
|||
|
local totalRank = self:GetTotalRank()
|
|||
|
-- 达到下一等级需要的星级
|
|||
|
local targetRank = self:GetConditionLevel(self.Phase + 1)
|
|||
|
return string.format("%d/%d", totalRank, targetRank)
|
|||
|
end
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取当前等级的星级
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetTotalRank()
|
|||
|
local totalRank = 0
|
|||
|
for _, eChara in pairs(self.CheckList) do
|
|||
|
totalRank = totalRank + eChara:GetRank()
|
|||
|
end
|
|||
|
return totalRank
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取羁绊等级
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetCurrentPhaseLevelStr()
|
|||
|
return ComboLevel[self.Phase]
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取羁绊图标路径
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetIconPath()
|
|||
|
return self.ComboCfg and self.ComboCfg.IconPath
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取组合需求条件数量
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetConditionCharaNum()
|
|||
|
return self:GetConditionNum(self:GetPhase())
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取达成的条件数
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetReachConditionNum()
|
|||
|
return self.ReachConditionNum or 0
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取达成的条件数展示字符串(格式例子:"1/4")
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetReachConditionNumStr()
|
|||
|
return string.format("%d/%d", self:GetReachConditionNum(), self:GetConditionCharaNum())
|
|||
|
end
|
|||
|
--================
|
|||
|
--根据阶段获取组合的要求人数
|
|||
|
--@param phaseIndex:阶段
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetConditionNum(phaseIndex)
|
|||
|
if not self.PhaseCombo[phaseIndex] then return 0 end
|
|||
|
return self.PhaseCombo[phaseIndex].ConditionNum
|
|||
|
end
|
|||
|
--================
|
|||
|
--根据阶段获取组合的要求等级
|
|||
|
--@param phaseIndex:阶段
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetConditionLevel(phaseIndex)
|
|||
|
if not self.PhaseCombo[phaseIndex] then return 0 end
|
|||
|
return self.PhaseCombo[phaseIndex].ConditionLevel
|
|||
|
end
|
|||
|
--================
|
|||
|
--根据阶段获取阶段效果描述
|
|||
|
--@param phaseIndex:阶段
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetPhaseComboEffectDes(phaseIndex)
|
|||
|
local des = self.PhaseCombo[phaseIndex] and self.PhaseCombo[phaseIndex].EffectDescription or ""
|
|||
|
des = string.gsub(des, "\\n", "\n")
|
|||
|
return des
|
|||
|
end
|
|||
|
--================
|
|||
|
--根据阶段获取阶段条件描述
|
|||
|
--@param phaseIndex:阶段
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetPhaseComboConditionDes(phaseIndex)
|
|||
|
return self.PhaseCombo[phaseIndex] and self.PhaseCombo[phaseIndex].ConditionDesc or ""
|
|||
|
end
|
|||
|
--================
|
|||
|
--设置固有成员列表(暂仅对条件3类型)
|
|||
|
--@param eBaseId:玩法基础角色ID
|
|||
|
--================
|
|||
|
function XExpeditionCombo:SetDefaultReferenceCharaList(eBaseId)
|
|||
|
if not self.DefaultReferenceList then self.DefaultReferenceList = {} end
|
|||
|
if not self.DefaultReferenceList[eBaseId] then self.DefaultReferenceList[eBaseId] = true end
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取固有成员列表(暂仅对条件3类型)
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetDefaultReferenceCharaList()
|
|||
|
if not self.DefaultReferenceList then return nil end
|
|||
|
self.DefaultReferenceECharList = {}
|
|||
|
local XChara = require("XEntity/XExpedition/XExpeditionCharacter")
|
|||
|
for charaId, _ in pairs(self.DefaultReferenceList) do
|
|||
|
local eChara = self.Team and self.Team:GetCharaByEBaseId(charaId)
|
|||
|
local displayData = {
|
|||
|
EChara = eChara or XChara.New(charaId),
|
|||
|
IsActive = eChara ~= nil,
|
|||
|
IsBlank = false
|
|||
|
}
|
|||
|
table.insert(self.DefaultReferenceECharList, displayData)
|
|||
|
end
|
|||
|
table.sort(self.DefaultReferenceECharList, SortByBaseIdAndActiveFunc)
|
|||
|
return self.DefaultReferenceECharList
|
|||
|
end
|
|||
|
--================
|
|||
|
--新增关联成员
|
|||
|
--@param eChara:新增成员
|
|||
|
--================
|
|||
|
function XExpeditionCombo:AddCheckList(eChara)
|
|||
|
if not self.CheckList[eChara:GetBaseId()] then
|
|||
|
self.CheckListLength = self.CheckListLength + 1
|
|||
|
end
|
|||
|
self.CheckList[eChara:GetBaseId()] = eChara
|
|||
|
end
|
|||
|
--================
|
|||
|
--清空关联成员
|
|||
|
--================
|
|||
|
function XExpeditionCombo:ResetCheckList()
|
|||
|
self.CheckList = {}
|
|||
|
self.CheckListLength = 0
|
|||
|
self.IsActive = false
|
|||
|
self.Phase = 1
|
|||
|
self.ReachConditionNum = 0
|
|||
|
end
|
|||
|
--================
|
|||
|
--检查组合状态
|
|||
|
--================
|
|||
|
function XExpeditionCombo:Check()
|
|||
|
self.Phase, self.ReachConditionNum, self.IsActive = self:CheckActiveStatus()
|
|||
|
end
|
|||
|
--================
|
|||
|
--预览组合有效状态,返回状态结果
|
|||
|
--@param eChara:玩法角色
|
|||
|
--================
|
|||
|
function XExpeditionCombo:PreviewCheckNew(eChara)
|
|||
|
local preList = XTool.Clone(self.CheckList)
|
|||
|
if preList[eChara:GetBaseId()] then
|
|||
|
preList[eChara:GetBaseId()]:RankUp(eChara:GetRank())
|
|||
|
else
|
|||
|
preList[eChara:GetBaseId()] = eChara
|
|||
|
end
|
|||
|
local phase, num, result = self:CheckActiveStatus(preList)
|
|||
|
self.PrePhaseUp = phase > self:GetPhase() -- 是否升级
|
|||
|
self.PreActive = result -- 是否激活
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取预览组合是否升级
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetPrePhaseUp()
|
|||
|
return self.PrePhaseUp
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取预览组合的激活状态
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetPreActive()
|
|||
|
return self.PreActive
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取预览组合是否变成激活
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetIsWillActive()
|
|||
|
return (not self:GetComboActive()) and self:GetPreActive()
|
|||
|
end
|
|||
|
--================
|
|||
|
--检查组合有效状态,返回状态结果
|
|||
|
--@return phase:有效层数
|
|||
|
--@return reachConditionNum:达到下一层有效的关联角色数
|
|||
|
--================
|
|||
|
function XExpeditionCombo:CheckActiveStatus(tempList)
|
|||
|
local phase = 1
|
|||
|
local reachConditionNum = 0
|
|||
|
local isActive = false
|
|||
|
local defaultActive = self:CheckDefaultTeamCombo()
|
|||
|
local conditionPass
|
|||
|
for index = 1, self:GetPhaseNum() do
|
|||
|
local functionName = FunctionName[self.ComboCfg.Condition]
|
|||
|
conditionPass, reachConditionNum = self["Condition" .. functionName](self, index, tempList)
|
|||
|
if conditionPass and defaultActive then
|
|||
|
isActive = true
|
|||
|
phase = index
|
|||
|
else
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
return phase, reachConditionNum, isActive
|
|||
|
end
|
|||
|
--================
|
|||
|
--检查是否通过预设技能条件(不是预设技能返回true,预设技能则比对当前预设队伍是否匹配)
|
|||
|
--若队伍是非玩家队伍,则检查队伍本身的预设队伍ID
|
|||
|
--================
|
|||
|
function XExpeditionCombo:CheckDefaultTeamCombo()
|
|||
|
local defaultId = self:GetDefaultTeamId()
|
|||
|
if defaultId == 0 then return true end
|
|||
|
if self.Team:CheckIsPlayer() then
|
|||
|
return self.Team:CheckOtherPlayerDefaultTeam(self:GetDefaultTeamId())
|
|||
|
end
|
|||
|
return XDataCenter.ExpeditionManager.CheckDefaultTeam(defaultId)
|
|||
|
end
|
|||
|
--================
|
|||
|
--检查是否是预设技能
|
|||
|
--================
|
|||
|
function XExpeditionCombo:CheckIsDefaultCombo()
|
|||
|
return self:GetDefaultTeamId() > 0
|
|||
|
end
|
|||
|
--================
|
|||
|
--检查列表角色的个数
|
|||
|
--@param index:层数
|
|||
|
--@param tempList:临时检查列表,省略则表示检查玩家现有队伍
|
|||
|
--================
|
|||
|
function XExpeditionCombo:ConditionMemberNum(index, tempList)
|
|||
|
return self.CheckListLength >= self:GetConditionNum(index), self.CheckListLength
|
|||
|
end
|
|||
|
--================
|
|||
|
--检查列表角色的总等级
|
|||
|
--@param index:层数
|
|||
|
--@param tempList:临时检查列表,省略则表示检查玩家现有队伍
|
|||
|
--================
|
|||
|
function XExpeditionCombo:ConditionTotalRank(index, tempList)
|
|||
|
local checkList = tempList or self.CheckList
|
|||
|
local totalRank = 0
|
|||
|
for _, eChara in pairs(checkList) do
|
|||
|
totalRank = totalRank + eChara:GetRank()
|
|||
|
end
|
|||
|
return totalRank >= self:GetConditionLevel(index), self.CheckListLength
|
|||
|
end
|
|||
|
--================
|
|||
|
--检查列表角色各自的级数
|
|||
|
--@param index:层数
|
|||
|
--@param tempList:临时检查列表,省略则表示检查玩家现有队伍
|
|||
|
--================
|
|||
|
function XExpeditionCombo:ConditionTargetRank(index, tempList)
|
|||
|
local checkList = tempList or self.CheckList
|
|||
|
local count = 0
|
|||
|
for _, eChara in pairs(checkList) do
|
|||
|
if eChara:GetRank() >= self:GetConditionLevel(index) then
|
|||
|
count = count + 1
|
|||
|
end
|
|||
|
end
|
|||
|
return count >= self:GetConditionNum(index), count
|
|||
|
end
|
|||
|
--================
|
|||
|
--检查列表角色的个数和列表角色的总等级
|
|||
|
--@param index:层数
|
|||
|
--@param tempList:临时检查列表,省略则表示检查玩家现有队伍
|
|||
|
--================
|
|||
|
function XExpeditionCombo:ConditionMemberNumAndTotalRank(index, tempList)
|
|||
|
local isMemberNum = self:ConditionMemberNum(index, tempList)
|
|||
|
if not isMemberNum then
|
|||
|
return false, self.CheckListLength
|
|||
|
end
|
|||
|
return self:ConditionTotalRank(index, tempList)
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取成员展示界面
|
|||
|
--================
|
|||
|
function XExpeditionCombo:GetDisplayReferenceList()
|
|||
|
if self.DefaultReferenceList then return self:GetDefaultReferenceCharaList() end
|
|||
|
local functionName = FunctionName[self.ComboCfg.Condition]
|
|||
|
local list = self["DisplayReference" .. functionName](self, self:GetPhase())
|
|||
|
return list
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取成员组合页面成员展示列表
|
|||
|
--================
|
|||
|
function XExpeditionCombo:DisplayReferenceMemberNum()
|
|||
|
local tempList = {}
|
|||
|
local count = 0
|
|||
|
for _, v in pairs(self.CheckList) do
|
|||
|
if count > self:GetConditionNum(self:GetPhase()) then break end
|
|||
|
local displayData = {
|
|||
|
EChara = v,
|
|||
|
IsActive = true,
|
|||
|
IsBlank = false
|
|||
|
}
|
|||
|
table.insert(tempList, displayData)
|
|||
|
count = count + 1
|
|||
|
end
|
|||
|
table.sort(tempList, SortByBaseIdFunc)
|
|||
|
return tempList
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取成员展示界面
|
|||
|
--================
|
|||
|
function XExpeditionCombo:DisplayReferenceTotalRank()
|
|||
|
local tempList = {}
|
|||
|
local tempRank = 0
|
|||
|
local targetRank = self:GetConditionLevel(self:GetPhase())
|
|||
|
for _, v in pairs(self.CheckList) do
|
|||
|
tempRank = tempRank + v:GetRank()
|
|||
|
local displayData = {
|
|||
|
EChara = v,
|
|||
|
IsActive = true,
|
|||
|
IsBlank = false
|
|||
|
}
|
|||
|
table.insert(tempList, displayData)
|
|||
|
if tempRank >= targetRank then break end
|
|||
|
end
|
|||
|
table.sort(tempList, SortByLevelFunc)
|
|||
|
return tempList
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取成员展示界面
|
|||
|
--================
|
|||
|
function XExpeditionCombo:DisplayReferenceTargetRank()
|
|||
|
local tempList = {}
|
|||
|
local targetRank = self:GetConditionLevel(self:GetPhase())
|
|||
|
for _, v in pairs(self.CheckList) do
|
|||
|
if v:GetRank() >= targetRank then
|
|||
|
local displayData = {
|
|||
|
EChara = v,
|
|||
|
IsActive = true,
|
|||
|
IsBlank = false
|
|||
|
}
|
|||
|
table.insert(tempList, displayData)
|
|||
|
else
|
|||
|
local displayData = {
|
|||
|
EChara = v,
|
|||
|
IsActive = false,
|
|||
|
IsBlank = false
|
|||
|
}
|
|||
|
table.insert(tempList, displayData)
|
|||
|
end
|
|||
|
end
|
|||
|
for i = #tempList + 1, self:GetConditionCharaNum() do
|
|||
|
local displayData = {
|
|||
|
IsActive = false,
|
|||
|
IsBlank = true
|
|||
|
}
|
|||
|
table.insert(tempList, displayData)
|
|||
|
end
|
|||
|
table.sort(tempList, SortByLevelAndBaseIdFunc)
|
|||
|
return tempList
|
|||
|
end
|
|||
|
--================
|
|||
|
--获取成员展示界面
|
|||
|
--================
|
|||
|
function XExpeditionCombo:DisplayReferenceMemberNumAndTotalRank()
|
|||
|
local tempList = {}
|
|||
|
for _, v in pairs(self.CheckList) do
|
|||
|
local displayData = {
|
|||
|
EChara = v,
|
|||
|
IsActive = true,
|
|||
|
IsBlank = false
|
|||
|
}
|
|||
|
table.insert(tempList, displayData)
|
|||
|
end
|
|||
|
for i = #tempList + 1, self:GetConditionCharaNum() do
|
|||
|
local displayData = {
|
|||
|
IsActive = false,
|
|||
|
IsBlank = true
|
|||
|
}
|
|||
|
table.insert(tempList, displayData)
|
|||
|
end
|
|||
|
table.sort(tempList, SortByLevelAndBaseIdFunc)
|
|||
|
return tempList
|
|||
|
end
|
|||
|
return XExpeditionCombo
|