482 lines
No EOL
15 KiB
Lua
482 lines
No EOL
15 KiB
Lua
-- 虚像地平线队伍对象
|
||
local XExpeditionTeam = XClass(nil, "XExpeditionTeam")
|
||
local XTeamPos = require("XEntity/XExpedition/XExpeditionTeamPos")
|
||
local XComboList = require("XEntity/XExpedition/XExpeditionComboList")
|
||
local XEChara = require("XEntity/XExpedition/XExpeditionCharacter")
|
||
--================
|
||
--加入队员失败
|
||
--================
|
||
local AddMemberFailed = function()
|
||
XLog.Debug("加入成员失败!")
|
||
end
|
||
--================
|
||
--展示队伍排序
|
||
--================
|
||
local SortDisplayTeamFunc = function(a, b)
|
||
if a:GetIsDefaultTeamMember() and not b:GetIsDefaultTeamMember() then
|
||
return true
|
||
elseif not a:GetIsDefaultTeamMember() and b:GetIsDefaultTeamMember() then
|
||
return false
|
||
end
|
||
return a:GetBaseId() > b:GetBaseId()
|
||
end
|
||
--================
|
||
--按战力排序(大的在前面)
|
||
--================
|
||
local SortByAbility = function(a, b)
|
||
return a:GetAbility() > b:GetAbility()
|
||
end
|
||
--================
|
||
--按大小排序,大的往前
|
||
--================
|
||
local SortByBigger = function(a, b)
|
||
return a > b
|
||
end
|
||
--================
|
||
--展示组合排序
|
||
--================
|
||
local SortByComboId = function(a, b)
|
||
return a:GetComboId() > b:GetComboId()
|
||
end
|
||
--================
|
||
--展示组合排序 核心羁绊>当前羁绊星级>人数 (激活状态按照星级排序,未激活状态按照人数排序)
|
||
--================
|
||
local SortDisplayComboFunc = function(a, b)
|
||
local aActive = a:GetComboActive()
|
||
local aDefaultTeamId = a:GetDefaultTeamId()
|
||
local aRank = a:GetTotalRank()
|
||
local aReachNum = a:GetReachConditionNum()
|
||
local bActive = b:GetComboActive()
|
||
local bDefaultTeamId = b:GetDefaultTeamId()
|
||
local bRank = b:GetTotalRank()
|
||
local bReachNum = b:GetReachConditionNum()
|
||
if aActive ~= bActive then
|
||
return aActive and not bActive
|
||
end
|
||
if aDefaultTeamId ~= bDefaultTeamId then
|
||
return aDefaultTeamId > bDefaultTeamId
|
||
end
|
||
if aActive and bActive and aRank ~= bRank then
|
||
return aRank > bRank
|
||
end
|
||
if not aActive and not bActive and aReachNum ~= bReachNum then
|
||
return aReachNum > bReachNum
|
||
end
|
||
return a:GetComboId() > b:GetComboId()
|
||
end
|
||
--================
|
||
--当队员变化时
|
||
--@param isPlayEffect:是否播放特效
|
||
--================
|
||
local OnMemberChange = function(isPlayEffect)
|
||
CsXGameEventManager.Instance:Notify(XEventId.EVENT_EXPEDITION_MEMBERLIST_CHANGE, isPlayEffect)
|
||
end
|
||
--================
|
||
--构造函数
|
||
--================
|
||
function XExpeditionTeam:Ctor(teamId)
|
||
if teamId and teamId > 0 then
|
||
self.IsPlayer = true
|
||
self:SetOtherPlayerDefaultTeamId(teamId)
|
||
end
|
||
self:InitBaseMembers()
|
||
self:InitTeamChara()
|
||
self:InitComboList()
|
||
end
|
||
--================
|
||
--初始化所有基础成员
|
||
--================
|
||
function XExpeditionTeam:InitBaseMembers()
|
||
local allMembers = XExpeditionConfig.GetBaseCharacterCfg()
|
||
self.BaseMembers = {}
|
||
for eBaseId, member in pairs(allMembers) do
|
||
self.BaseMembers[eBaseId] = XEChara.New(eBaseId)
|
||
end
|
||
end
|
||
--================
|
||
--初始化队伍位置
|
||
--@param chapterId:当前章节ID
|
||
--================
|
||
function XExpeditionTeam:InitTeamPos(recruitRobotMaxNum)
|
||
self.TeamPos = {}
|
||
for i = 1, recruitRobotMaxNum do
|
||
table.insert(self.TeamPos, XTeamPos.New(i))
|
||
end
|
||
end
|
||
--================
|
||
--初始化队伍角色
|
||
--================
|
||
function XExpeditionTeam:InitTeamChara()
|
||
self.TeamChara = {}
|
||
end
|
||
--================
|
||
--初始化队伍角色
|
||
--================
|
||
function XExpeditionTeam:InitComboList()
|
||
self.ComboList = XComboList.New(self)
|
||
end
|
||
--================
|
||
--重置队伍
|
||
--================
|
||
function XExpeditionTeam:Reset(notResetDefaultTeam)
|
||
self.TeamChara = {}
|
||
for _, chara in pairs(self.BaseMembers) do
|
||
chara:Fired(notResetDefaultTeam)
|
||
end
|
||
self:ResetDisplayTeam()
|
||
end
|
||
--================
|
||
--使用角色对象检查角色是否在队伍中
|
||
--@param eChara:玩法角色对象
|
||
--================
|
||
function XExpeditionTeam:CheckInTeamByEChara(eChara)
|
||
return eChara:GetIsInTeam()
|
||
end
|
||
--================
|
||
--使用玩法角色ID检查角色是否在队伍中
|
||
--@param eBaseId:玩法角色基础Id
|
||
--================
|
||
function XExpeditionTeam:CheckInTeamByEBaseId(eBaseId)
|
||
local eChara = self.BaseMembers[eBaseId]
|
||
return eChara:GetIsInTeam()
|
||
end
|
||
--================
|
||
--检查有没空格子
|
||
--================
|
||
function XExpeditionTeam:CheckHaveNewPos()
|
||
local unLockPosNum = 0
|
||
for _, pos in pairs(self.TeamPos) do
|
||
if pos:GetIsUnLock() then
|
||
unLockPosNum = unLockPosNum + 1
|
||
end
|
||
end
|
||
return unLockPosNum > (self:GetTeamNum() - 2)
|
||
end
|
||
--================
|
||
--使用ECharaId列表批量加入成员并更新
|
||
--@param eCharaIds:ECharacterId列表
|
||
--================
|
||
function XExpeditionTeam:AddMemberListByECharaIds(eCharaIds)
|
||
if not eCharaIds then return end
|
||
for _, eCharaId in pairs(eCharaIds) do
|
||
if eCharaId > 0 then
|
||
local eCharaCfg = XExpeditionConfig.GetCharacterCfgById(eCharaId)
|
||
self:AddMemberByEBaseIdAndRank(eCharaCfg.BaseId, eCharaCfg.Rank, false)
|
||
end
|
||
end
|
||
self:CheckCombos()
|
||
end
|
||
--================
|
||
--刷新Combo状态
|
||
--================
|
||
function XExpeditionTeam:CheckCombos()
|
||
self.ComboList:CheckCombos(self.TeamChara)
|
||
self:ResetDisplayTeam()
|
||
end
|
||
--================
|
||
--用玩法角色ID和初始等级把角色加入队伍
|
||
--@param eBaseId:加入队伍的玩法角色ID
|
||
--@param rank:初始等级
|
||
--================
|
||
function XExpeditionTeam:AddMemberByEBaseIdAndRank(eBaseId, rank, needCheck)
|
||
local canAdd, isExist = self:GetCanAddMember(eBaseId)
|
||
if not canAdd then AddMemberFailed() return end
|
||
if isExist then
|
||
self.TeamChara[eBaseId]:RankUp(rank)
|
||
else
|
||
local eChara = self.BaseMembers[eBaseId]
|
||
self.TeamChara[eBaseId] = eChara
|
||
eChara:SetRank(rank)
|
||
eChara:SetIsInTeam(true)
|
||
end
|
||
if needCheck then
|
||
self.ComboList:CheckCombos(self.TeamChara)
|
||
self:ResetDisplayTeam()
|
||
end
|
||
end
|
||
--================
|
||
--用EChara对象把角色加入队伍(用于招募角色时)
|
||
--@param eChara:加入队伍的角色对象
|
||
--================
|
||
function XExpeditionTeam:AddMemberByEChara(eChara)
|
||
if not eChara then return end
|
||
local eBaseId = eChara:GetBaseId()
|
||
self:AddMemberByEBaseIdAndRank(eBaseId, eChara:GetRank(), true)
|
||
self.TeamChara[eBaseId]:SetIsNew()
|
||
self.ComboList:CheckCombos(self.TeamChara)
|
||
self:OnTeamMemberChange()
|
||
end
|
||
--================
|
||
--检查能不能加入新成员
|
||
--@param eBaseId:要加入队伍的玩法角色ID
|
||
--================
|
||
function XExpeditionTeam:GetCanAddMember(eBaseId)
|
||
if self.TeamChara[eBaseId] then
|
||
return not self.TeamChara[eBaseId]:GetIsMaxLevel(), true
|
||
else
|
||
return self:CheckHaveNewPos(), false
|
||
end
|
||
end
|
||
--================
|
||
--从队伍移除角色
|
||
--@param pos:要移除的角色位置
|
||
--================
|
||
function XExpeditionTeam:RemoveMember(eBaseId)
|
||
if (not eBaseId) or (not self.TeamChara[eBaseId]) then return end
|
||
self.TeamChara[eBaseId]:Fired()
|
||
self.TeamChara[eBaseId] = nil
|
||
self:OnTeamMemberChange()
|
||
end
|
||
|
||
--================
|
||
--获取队伍位置
|
||
--================
|
||
function XExpeditionTeam:GetTeamPos()
|
||
return self.TeamPos
|
||
end
|
||
--================
|
||
--获取队伍队员对象列表
|
||
--================
|
||
function XExpeditionTeam:GetTeam()
|
||
return self.TeamChara
|
||
end
|
||
--================
|
||
--获取队伍队员数量
|
||
--================
|
||
function XExpeditionTeam:GetTeamNum()
|
||
local count = 0
|
||
for i in pairs(self:GetTeam()) do
|
||
count = count + 1
|
||
end
|
||
return count
|
||
end
|
||
--================
|
||
--获取所有羁绊对象列表(包括没激活的)
|
||
--================
|
||
function XExpeditionTeam:GetAllCombos()
|
||
return self.ComboList:GetAllCombos()
|
||
end
|
||
--================
|
||
--获取所有队员组合对象列表
|
||
--================
|
||
function XExpeditionTeam:GetTeamComboList()
|
||
local team = self:GetTeam()
|
||
local comboList = self.ComboList:GetCurrentCombos(team)
|
||
table.sort(comboList, SortDisplayComboFunc)
|
||
return comboList
|
||
end
|
||
--================
|
||
--获取所有有效的队员组合对象列表
|
||
--================
|
||
function XExpeditionTeam:GetActiveTeamComboList()
|
||
local team = self:GetTeam()
|
||
local comboList = self.ComboList:GetCurrentCombos(team)
|
||
local activeList = {}
|
||
for _, combo in pairs(comboList) do
|
||
if combo:GetComboActive() then
|
||
table.insert(activeList, combo)
|
||
end
|
||
end
|
||
table.sort(activeList, SortByComboId)
|
||
return activeList
|
||
end
|
||
--================
|
||
--获取所有羁绊列表对象
|
||
--================
|
||
function XExpeditionTeam:GetComboList()
|
||
return self.ComboList
|
||
end
|
||
--================
|
||
--队伍成员变动时调用方法
|
||
--================
|
||
function XExpeditionTeam:OnTeamMemberChange()
|
||
self:ResetDisplayTeam()
|
||
self.AverageLevel = nil
|
||
OnMemberChange()
|
||
end
|
||
--================
|
||
--重置队伍展示列表状态
|
||
--================
|
||
function XExpeditionTeam:ResetDisplayTeam()
|
||
self.DisplayTeamList = nil
|
||
self.CoreDisplayTeamList = nil
|
||
self.FetterDisplayTeamList = nil
|
||
end
|
||
--================
|
||
--获取招募界面队伍显示列表
|
||
--================
|
||
function XExpeditionTeam:GetTeamPosDisplayList()
|
||
local displayTeamPosList = {}
|
||
local unLockPosList = {}
|
||
local lockPosList = {}
|
||
for _, teamPos in pairs(self.TeamPos) do
|
||
if teamPos:GetIsUnLock() then
|
||
table.insert(unLockPosList, teamPos)
|
||
else
|
||
table.insert(lockPosList, teamPos)
|
||
end
|
||
end
|
||
for i in pairs(unLockPosList) do
|
||
table.insert(displayTeamPosList, unLockPosList[i])
|
||
end
|
||
for i in pairs(lockPosList) do
|
||
table.insert(displayTeamPosList, lockPosList[i])
|
||
end
|
||
return displayTeamPosList
|
||
end
|
||
--================
|
||
--获取展示用队伍成员显示列表
|
||
--================
|
||
function XExpeditionTeam:GetDisplayTeamList()
|
||
if not self.DisplayTeamList then
|
||
self.DisplayTeamList = {}
|
||
self.CoreDisplayTeamList = {}
|
||
self.FetterDisplayTeamList = {}
|
||
|
||
for _, chara in pairs(self.TeamChara) do
|
||
table.insert(self.DisplayTeamList, chara)
|
||
|
||
if chara:GetIsDefaultTeamMember() then
|
||
table.insert(self.CoreDisplayTeamList, chara)
|
||
else
|
||
table.insert(self.FetterDisplayTeamList, chara)
|
||
end
|
||
end
|
||
table.sort(self.DisplayTeamList, SortDisplayTeamFunc)
|
||
table.sort(self.CoreDisplayTeamList, SortDisplayTeamFunc)
|
||
table.sort(self.FetterDisplayTeamList, SortDisplayTeamFunc)
|
||
end
|
||
return self.DisplayTeamList
|
||
end
|
||
--================
|
||
--根据位置获取展示用队伍成员显示列表中的成员
|
||
--================
|
||
function XExpeditionTeam:GetCharaByDisplayPos(pos)
|
||
if not self.DisplayTeamList then
|
||
return self:GetDisplayTeamList() and self.DisplayTeamList[pos]
|
||
end
|
||
return self.DisplayTeamList and self.DisplayTeamList[pos]
|
||
end
|
||
|
||
function XExpeditionTeam:GetFetterCharaByPos(pos)
|
||
if not self.DisplayTeamList then
|
||
self:GetDisplayTeamList()
|
||
end
|
||
return self.FetterDisplayTeamList and self.FetterDisplayTeamList[pos]
|
||
end
|
||
|
||
function XExpeditionTeam:GetCoreChara()
|
||
if not self.DisplayTeamList then
|
||
self:GetDisplayTeamList()
|
||
end
|
||
return self.CoreDisplayTeamList or {}
|
||
end
|
||
|
||
--================
|
||
--检查成员展示列表中是否含有指定序号的成员
|
||
--================
|
||
function XExpeditionTeam:CheckCharaInDisplayListByPos(pos)
|
||
return self.FetterDisplayTeamList and self.FetterDisplayTeamList[pos] ~= nil
|
||
end
|
||
--================
|
||
--根据玩法角色Id获取成员展示列表中指定角色的序号
|
||
--================
|
||
function XExpeditionTeam:GetCharaDisplayIndexByBaseId(eBaseId)
|
||
if not self.DisplayTeamList then
|
||
self:GetDisplayTeamList()
|
||
end
|
||
for index, v in pairs(self.DisplayTeamList) do
|
||
if v:GetBaseId() == eBaseId then return index end
|
||
end
|
||
return -1
|
||
end
|
||
--================
|
||
--根据成员展示列表中指定角色的序号获取角色对象
|
||
--================
|
||
function XExpeditionTeam:GetECharaByDisplayIndex(displayIndex)
|
||
for index, v in pairs(self.DisplayTeamList) do
|
||
if index == displayIndex then return v end
|
||
end
|
||
end
|
||
--================
|
||
--根据玩法角色Id获取成员对象
|
||
--================
|
||
function XExpeditionTeam:GetCharaByEBaseId(eBaseId)
|
||
return self.TeamChara[eBaseId]
|
||
end
|
||
--================
|
||
--获取出战队伍平均星级
|
||
--================
|
||
function XExpeditionTeam:GetAverageStar()
|
||
local list = {}
|
||
for _, eChara in pairs(self.TeamChara) do
|
||
table.insert(list, eChara:GetRank())
|
||
end
|
||
table.sort(list, SortByBigger)
|
||
local totalLevel = 0
|
||
for i = 1, 3 do
|
||
totalLevel = totalLevel + (list and list[i] ~= nil and list[i] or 0)
|
||
end
|
||
return math.floor(totalLevel / (#list > 0 and #list <= 3 and #list or 3))
|
||
end
|
||
--================
|
||
--获取出战队伍对象
|
||
--================
|
||
function XExpeditionTeam:GetBattleTeam()
|
||
local team = XDataCenter.ExpeditionManager.GetExpeditionTeam()
|
||
local teamData = team.TeamData
|
||
local eCharaList = {}
|
||
for _, eBaseId in pairs(teamData) do
|
||
if eBaseId > 0 then
|
||
local eChara = self.TeamChara[eBaseId]
|
||
if eChara then table.insert(eCharaList, eChara) end
|
||
end
|
||
end
|
||
table.sort(eCharaList, SortDisplayTeamFunc)
|
||
return eCharaList
|
||
end
|
||
--================
|
||
--重置预设队伍
|
||
--================
|
||
function XExpeditionTeam:ResetDefaultTeamMember()
|
||
for _, chara in pairs(self.BaseMembers) do
|
||
chara:SetDefaultTeamMember(false)
|
||
end
|
||
end
|
||
--================
|
||
--获取是否玩家自身队伍(用于判断是否排位里面其他玩家的队伍数据)
|
||
--================
|
||
function XExpeditionTeam:CheckIsPlayer()
|
||
return self.IsPlayer
|
||
end
|
||
--================
|
||
--设置非玩家队伍预设队伍ID
|
||
--================
|
||
function XExpeditionTeam:SetOtherPlayerDefaultTeamId(teamId)
|
||
self.OtherDefaultTeamId = teamId
|
||
end
|
||
--================
|
||
--检查给定ID是否跟非玩家队伍预设队伍ID相同
|
||
--================
|
||
function XExpeditionTeam:CheckOtherPlayerDefaultTeam(checkId)
|
||
return self.OtherDefaultTeamId == checkId
|
||
end
|
||
--================
|
||
--自动上阵成员
|
||
--@param banDic:筛选ID字典
|
||
--使用的是BaseId,改列表指定的BaseId角色将会被筛掉不参与最后选择
|
||
--@param getIndex:获取最后排序列表角色的索引位置
|
||
--================
|
||
function XExpeditionTeam:GetAutoNextMember(banDic, getIndex)
|
||
--构建临时用的筛选成员列表
|
||
local tempList = {}
|
||
for baseId, chara in pairs(self.TeamChara) do
|
||
if not banDic[baseId] then --筛选掉队伍中的和筛选ID列表相同BaseId的成员
|
||
table.insert(tempList, chara)
|
||
end
|
||
end
|
||
--按给定规则(现在是按战力)排序
|
||
table.sort(tempList, SortByAbility)
|
||
return tempList[getIndex]
|
||
end
|
||
return XExpeditionTeam |