400 lines
No EOL
12 KiB
Lua
400 lines
No EOL
12 KiB
Lua
-- 虚像地平线组合对象
|
|
local XExpeditionCombo = XClass(nil, "XExpeditionCombo")
|
|
local FunctionName = {
|
|
[1] = "MemberNum", -- 检查合计数量
|
|
[2] = "TotalRank", -- 检查合计等级
|
|
[3] = "TargetRank", -- 高于指定等级
|
|
}
|
|
|
|
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: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")
|
|
--================
|
|
function XExpeditionCombo:GetCurrentPhaseStr()
|
|
return string.format("%d/%d", self:GetComboActive() and self:GetPhase() or 0, self:GetPhaseNum())
|
|
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
|
|
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 activeReferenceNum:达到下一层有效的关联角色数
|
|
--================
|
|
function XExpeditionCombo:CheckActiveStatus(tempList)
|
|
local phase = 1
|
|
local reachConditionNum = 0
|
|
local isActive = false
|
|
local conditionPass
|
|
for index = 1, self:GetPhaseNum() do
|
|
local functionName = FunctionName[self.ComboCfg.Condition]
|
|
conditionPass, reachConditionNum = self["Condition" .. functionName](self, index, tempList)
|
|
if conditionPass then
|
|
isActive = true
|
|
phase = index
|
|
else
|
|
break
|
|
end
|
|
end
|
|
return phase, reachConditionNum, isActive
|
|
end
|
|
--================
|
|
--检查列表角色的个数
|
|
--@param index:层数
|
|
--@param tempList:临时检查列表,省略则表示检查玩家现有队伍
|
|
--================
|
|
function XExpeditionCombo:ConditionMemberNum(index, tempList)
|
|
local checkList = tempList or self.CheckList
|
|
local targetNum = 0
|
|
return self.CheckListLength >= self:GetConditionNum(), 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
|
|
--================
|
|
--获取成员展示界面
|
|
--================
|
|
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
|
|
return XExpeditionCombo |